From 71f4d4091e435b1faabdc7a6a313b860608cdecc Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 27 Aug 2020 00:08:00 +0200 Subject: [PATCH] Small fixes for the GRB theme and value substitution --- Customizations/Layers/GrbToFix.ts | 48 +- Customizations/Layout.ts | 1 + Customizations/TagRendering.ts | 50 ++- LICENSE | 674 +++++++++++++++++++++++++++++ Logic/Osm/Changes.ts | 4 +- Logic/Osm/ChangesetHandler.ts | 8 +- Logic/Osm/OsmConnection.ts | 14 +- Logic/TagsFilter.ts | 1 - State.ts | 4 +- UI/CustomThemeGenerator/Preview.ts | 2 + UI/SimpleAddUI.ts | 5 +- Utils.ts | 11 + assets/nature/birdhide.png | Bin 14784 -> 0 bytes assets/nature/birdhide.svg | 32 +- customGenerator.ts | 3 +- index.css | 1 + test.ts | 14 + 17 files changed, 798 insertions(+), 74 deletions(-) create mode 100644 LICENSE delete mode 100644 assets/nature/birdhide.png diff --git a/Customizations/Layers/GrbToFix.ts b/Customizations/Layers/GrbToFix.ts index ccbf2fd..de444aa 100644 --- a/Customizations/Layers/GrbToFix.ts +++ b/Customizations/Layers/GrbToFix.ts @@ -28,10 +28,16 @@ export class GrbToFix extends LayerDefinition { this.title = new TagRenderingOptions({ freeform: { - key: "fixme", - renderTemplate: "{fixme}", + key: "addr:street", + renderTemplate: "{addr:street} {addr:housenumber}", template: "Fixme $$$" - } + }, + mappings: [ + { + k: new Tag("fixme","*"), + txt: "{fixme}" + } + ] }) this.elementsToShow = [ @@ -39,12 +45,13 @@ export class GrbToFix extends LayerDefinition { new TagRenderingOptions( { freeform: { - key: "addr:street", + key: "addr:housenumber", renderTemplate: "Het adres is {addr:street} {addr:housenumber}", - template: "Straat? $$$" - } + template: "Straat? $$$", + }, + question: "Wat is het huisnummer?" } - ), + ).OnlyShowIf(new Tag("fixme","*","")), new TagRenderingOptions({ @@ -61,22 +68,37 @@ export class GrbToFix extends LayerDefinition { freeform: { key: "addr:housenumber", template: "Het huisnummer is $$$", - renderTemplate: "Het huisnummer is {addr:housenumber}, GRB denkt {grb:housenumber:human}", - extraTags: new Tag("fixme", "") + renderTemplate: "Het adres is {addr:street} {addr:housenumber}, GRB denkt {grb:housenumber:human}", + extraTags: new And([new Tag("fixme", ""), new Tag("not:addr:housenumber", "")]) }, mappings: [ { - k: new And([new Tag("addr:housenumber", "{grb:housenumber}"), new Tag("fixme", "")]), + k: new And([new Tag("addr:housenumber", "{grb:housenumber}"), new Tag("fixme", ""), new Tag("not:addr:housenumber", "")]), txt: "Volg GRB: {grb:housenumber:human}", substitute: true }, { - k: new And([new Tag("addr:housenumber", "{addr:housenumber}"), new Tag("fixme", "")]), + k: new And([new Tag("addr:housenumber", "{addr:housenumber}"), new Tag("fixme", ""), new Tag("not:addr:housenumber", "")]), txt: "Volg OSM: {addr:housenumber}", substitute: true - } + }, + { + k: new And([new Tag("building", "garage"), + new Tag("not:addr:housenumber", "yes"), + new Tag("addr:housenumber", ""), new Tag("fixme", "")]), + txt: "Dit is een garage(poort) zonder nummer", + substitute: true + }, + { + k: new And([ + new Tag("not:addr:housenumber", "yes"), + new Tag("addr:housenumber", ""), new Tag("fixme", "")]), + txt: "Gewoon een huis zonder nummer", + substitute: true + }, + ] - }) + }).OnlyShowIf(new Tag("fixme", "*")) ]; diff --git a/Customizations/Layout.ts b/Customizations/Layout.ts index 870c547..555cb8a 100644 --- a/Customizations/Layout.ts +++ b/Customizations/Layout.ts @@ -16,6 +16,7 @@ export class Layout { public maintainer: string; public version: string; public description: string | UIElement; + public changesetMessage: string; public socialImage: string = ""; public layers: LayerDefinition[]; diff --git a/Customizations/TagRendering.ts b/Customizations/TagRendering.ts index 6f31dcb..9c4522b 100644 --- a/Customizations/TagRendering.ts +++ b/Customizations/TagRendering.ts @@ -28,7 +28,9 @@ export class TagRendering extends UIElement implements TagDependantUIElement { private _question: string | Translation; private _mapping: { k: TagsFilter, txt: string | UIElement, priority?: number }[]; - private _tagsPreprocessor?: ((tags: any) => any); + private currentTags : UIEventSource ; + + private _freeform: { key: string, template: string | UIElement, @@ -85,17 +87,23 @@ export class TagRendering extends UIElement implements TagDependantUIElement { const self = this; this._priority = options.priority ?? 0; - this._tagsPreprocessor = function (properties) { - if (options.tagsPreprocessor === undefined) { - return properties; + + this.currentTags = this._source.map(tags => + { + + if (options.tagsPreprocessor === undefined) { + return tags; + } + // we clone the tags... + let newTags = {}; + for (const k in tags) { + newTags[k] = tags[k]; + } + // ... in order to safely edit them here + options.tagsPreprocessor(newTags); + return newTags; } - const newTags = {}; - for (const k in properties) { - newTags[k] = properties[k]; - } - options.tagsPreprocessor(newTags); - return newTags; - }; + ); if (options.question !== undefined) { this._question = options.question; @@ -106,19 +114,12 @@ export class TagRendering extends UIElement implements TagDependantUIElement { for (const choice of options.mappings ?? []) { + + let choiceSubbed = { - k: choice.k, + k: choice.k.substituteValues(this.currentTags.data), txt: choice.txt, priority: choice.priority - }; - - if (choice.substitute) { - const newTags = this._tagsPreprocessor(this._source.data); - choiceSubbed = { - k: choice.k.substituteValues(newTags), - txt: choice.txt, - priority: choice.priority - } } @@ -242,7 +243,9 @@ export class TagRendering extends UIElement implements TagDependantUIElement { private InputElementForMapping(mapping: { k: TagsFilter, txt: string | Translation }) { - return new FixedInputElement(this.ApplyTemplate(mapping.txt), mapping.k); + return new FixedInputElement(this.ApplyTemplate(mapping.txt), + mapping.k.substituteValues(this.currentTags.data) + ); } @@ -455,8 +458,7 @@ export class TagRendering extends UIElement implements TagDependantUIElement { throw "Trying to apply a template, but the template is null/undefined" } const self = this; - const tags = this._source.map(tags => self._tagsPreprocessor(self._source.data)); - return new VariableUiElement(tags.map(tags => { + return new VariableUiElement(this.currentTags.map(tags => { const tr = Translations.WT(template); if (tr.Subs === undefined) { // This is a weird edge case diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Logic/Osm/Changes.ts b/Logic/Osm/Changes.ts index a9dc05b..0815cc2 100644 --- a/Logic/Osm/Changes.ts +++ b/Logic/Osm/Changes.ts @@ -74,9 +74,7 @@ export class Changes { const eventSource = State.state.allElements.getElement(elementId); eventSource.data[key] = value; - if(value === undefined || value === ""){ - delete eventSource.data[key]; - } + eventSource.ping(); // We get the id from the event source, as that ID might be rewritten this._pendingChanges.push({elementId: eventSource.data.id, key: key, value: value}); diff --git a/Logic/Osm/ChangesetHandler.ts b/Logic/Osm/ChangesetHandler.ts index 2bf24af..4f544ab 100644 --- a/Logic/Osm/ChangesetHandler.ts +++ b/Logic/Osm/ChangesetHandler.ts @@ -53,14 +53,14 @@ export class ChangesetHandler { private OpenChangeset(continuation: (changesetId: string) => void) { const layout = State.state.layoutToUse.data; - + const commentExtra = layout.changesetMessage !== undefined? " - "+layout.changesetMessage : ""; this.auth.xhr({ method: 'PUT', path: '/api/0.6/changeset/create', options: {header: {'Content-Type': 'text/xml'}}, content: [``, ``, - ``, + ``, ``, layout.maintainer !== undefined ? `` : "", ``].join("") @@ -94,7 +94,7 @@ export class ChangesetHandler { }); } - private CloseChangeset(changesetId: string, continuation: (() => void)) { + public CloseChangeset(changesetId: string, continuation: (() => void)) { console.log("closing"); this.auth.xhr({ method: 'PUT', @@ -112,7 +112,7 @@ export class ChangesetHandler { }); } - private static parseUploadChangesetResponse(response: XMLDocument) { + public static parseUploadChangesetResponse(response: XMLDocument) { const nodes = response.getElementsByTagName("node"); const mapping = {}; // @ts-ignore diff --git a/Logic/Osm/OsmConnection.ts b/Logic/Osm/OsmConnection.ts index d8a6d92..918d4ab 100644 --- a/Logic/Osm/OsmConnection.ts +++ b/Logic/Osm/OsmConnection.ts @@ -24,8 +24,8 @@ export class OsmConnection { public userDetails: UIEventSource; private _dryRun: boolean; - public _preferencesHandler: OsmPreferences; - private _changesetHandler: ChangesetHandler; + public preferencesHandler: OsmPreferences; + public changesetHandler: ChangesetHandler; private _onLoggedIn : ((userDetails: UserDetails) => void)[] = []; @@ -68,9 +68,9 @@ export class OsmConnection { this.userDetails.data.dryRun = dryRun; this._dryRun = dryRun; - this._preferencesHandler = new OsmPreferences(this.auth, this); + this.preferencesHandler = new OsmPreferences(this.auth, this); - this._changesetHandler = new ChangesetHandler(dryRun, this.userDetails, this.auth); + this.changesetHandler = new ChangesetHandler(dryRun, this.userDetails, this.auth); if (oauth_token.data !== undefined) { console.log(oauth_token.data) const self = this; @@ -94,15 +94,15 @@ export class OsmConnection { public UploadChangeset(generateChangeXML: (csid: string) => string, handleMapping: (idMapping: any) => void, continuation: () => void) { - this._changesetHandler.UploadChangeset(generateChangeXML, handleMapping, continuation); + this.changesetHandler.UploadChangeset(generateChangeXML, handleMapping, continuation); } public GetPreference(key: string, prefix: string = "mapcomplete-"): UIEventSource { - return this._preferencesHandler.GetPreference(key, prefix); + return this.preferencesHandler.GetPreference(key, prefix); } public GetLongPreference(key: string, prefix: string = "mapcomplete-"): UIEventSource { - return this._preferencesHandler.GetLongPreference(key, prefix); + return this.preferencesHandler.GetLongPreference(key, prefix); } public OnLoggedIn(action: (userDetails: UserDetails) => void){ diff --git a/Logic/TagsFilter.ts b/Logic/TagsFilter.ts index a97f0af..57da3b5 100644 --- a/Logic/TagsFilter.ts +++ b/Logic/TagsFilter.ts @@ -147,7 +147,6 @@ export class Tag extends TagsFilter { if (typeof this.value !== 'string') { throw new Error("substituteValues() only possible with tag value of type string") } - return new Tag(this.key, TagUtils.ApplyTemplate(this.value as string, tags)); } diff --git a/State.ts b/State.ts index cbc20a3..6eb66a2 100644 --- a/State.ts +++ b/State.ts @@ -24,7 +24,7 @@ export class State { // The singleton of the global state public static state: State; - public static vNumber = "0.0.6f"; + public static vNumber = "0.0.7"; // The user journey states thresholds when a new feature gets unlocked public static userJourney = { @@ -182,7 +182,7 @@ export class State { [], layers => Utils.Dedup(layers)?.join(";") ); - this.installedThemes = this.osmConnection._preferencesHandler.preferences.map<{ layout: Layout, definition: string }[]>(allPreferences => { + this.installedThemes = this.osmConnection.preferencesHandler.preferences.map<{ layout: Layout, definition: string }[]>(allPreferences => { const installedThemes: { layout: Layout, definition: string }[] = []; if (allPreferences === undefined) { return installedThemes; diff --git a/UI/CustomThemeGenerator/Preview.ts b/UI/CustomThemeGenerator/Preview.ts index 5ece0e8..2643ab8 100644 --- a/UI/CustomThemeGenerator/Preview.ts +++ b/UI/CustomThemeGenerator/Preview.ts @@ -48,6 +48,8 @@ export class Preview extends UIElement { return new Combine([ new VariableUiElement(this.currentPreview), this.reloadButton, + "

Statistics

", + "We track statistics with goatcounter. The statistics can be seen by anyone, so if you want to see where your theme ends up, click here", this.otherPreviews ]).Render(); } diff --git a/UI/SimpleAddUI.ts b/UI/SimpleAddUI.ts index b15ca9d..d095f90 100644 --- a/UI/SimpleAddUI.ts +++ b/UI/SimpleAddUI.ts @@ -10,6 +10,7 @@ import {State} from "../State"; import {UIEventSource} from "../Logic/UIEventSource"; import {UserDetails} from "../Logic/Osm/OsmConnection"; import {FixedUiElement} from "./Base/FixedUiElement"; +import {Utils} from "../Utils"; /** * Asks to add a feature at the last clicked location, at least if zoom is sufficient @@ -54,8 +55,8 @@ export class SimpleAddUI extends UIElement { if (preset.icon !== undefined) { if (typeof (preset.icon) !== "string") { - console.log("Preset icon is:", preset.icon); - icon = preset.icon.GetContent(TagUtils.KVtoProperties(preset.tags)); + icon = preset.icon.GetContent(Utils.MergeTags(preset.tags, {id:"node/-1"})); + console.log("Preset icon is:", preset.icon, "--> ",icon); } else { icon = preset.icon; } diff --git a/Utils.ts b/Utils.ts index 2767d13..d7830ee 100644 --- a/Utils.ts +++ b/Utils.ts @@ -85,5 +85,16 @@ export class Utils { } return newArr; } + + public static MergeTags(a :any, b: any){ + const t = {}; + for (const k in a) { + t[k] = a[k]; + } + for (const k in b) { + t[k] = b[k]; + } + return t; + } } diff --git a/assets/nature/birdhide.png b/assets/nature/birdhide.png deleted file mode 100644 index d1d5513e8b23e30c8b17f95225d572f209d09351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14784 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 @@ -27,14 +27,14 @@ inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1920" - inkscape:window-height="1053" + inkscape:window-height="1001" id="namedview6" showgrid="false" - inkscape:zoom="33.714286" - inkscape:cx="4.9428996" - inkscape:cy="9.0125471" + inkscape:zoom="0.74498751" + inkscape:cx="-248.78385" + inkscape:cy="85.700327" inkscape:window-x="0" - inkscape:window-y="27" + inkscape:window-y="1050" inkscape:window-maximized="1" inkscape:current-layer="svg3800" /> image/svg+xml - + + cx="249.3156" + cy="250.6844" + r="248.93001" /> diff --git a/customGenerator.ts b/customGenerator.ts index df8ba98..2ab840f 100644 --- a/customGenerator.ts +++ b/customGenerator.ts @@ -68,11 +68,10 @@ const loadFromTextField = new Button("Load", () => { new Combine([ new Preview(themeGenerator.url, themeGenerator.themeObject), - "

Danger zone

", loadFrom, loadFromTextField, "Loading from the text field will erase the current theme", - + "

Danger zone

", "
", new Button("Clear theme", setDefault), "
", diff --git a/index.css b/index.css index 1d2ad4b..d928eb7 100644 --- a/index.css +++ b/index.css @@ -1291,6 +1291,7 @@ form { max-height: 50vh; display: inline-block; overflow-y: auto; + width: 100%; } .custom-layer-panel { diff --git a/test.ts b/test.ts index e69de29..d91c455 100644 --- a/test.ts +++ b/test.ts @@ -0,0 +1,14 @@ +import {OsmConnection} from "./Logic/Osm/OsmConnection"; +import {UIEventSource} from "./Logic/UIEventSource"; + + +const conn = new OsmConnection(false, new UIEventSource(""), false); +conn.AttemptLogin(); + + +const csHandler = conn.changesetHandler; + +conn.OnLoggedIn((ud) => { + + +}); \ No newline at end of file