Add license info, fix non-updating values after reopening popups

This commit is contained in:
pietervdvn 2021-04-17 23:36:46 +02:00
parent 576fd8ff40
commit 7b47af8978
11 changed files with 71 additions and 42 deletions

View file

@ -42,10 +42,11 @@ class TitleElement extends UIElement {
continue; continue;
} }
if (layer.source.osmTags.matchesProperties(properties)) { if (layer.source.osmTags.matchesProperties(properties)) {
const title = new TagRenderingAnswer( const tags = this._allElementsStorage.getEventSourceById(feature.properties.id);
this._allElementsStorage.addOrGetElement(feature), if (tags == undefined) {
layer.title return defaultTitle;
) }
const title = new TagRenderingAnswer(tags, layer.title)
return new Combine([defaultTitle, " | ", title]).Render(); return new Combine([defaultTitle, " | ", title]).Render();
} }
} }

View file

@ -5,14 +5,14 @@ import {UIEventSource} from "./UIEventSource";
export class ElementStorage { export class ElementStorage {
private _elements = []; private _elements = new Map<string, UIEventSource<any>>();
constructor() { constructor() {
} }
addElementById(id: string, eventSource: UIEventSource<any>) { addElementById(id: string, eventSource: UIEventSource<any>) {
this._elements[id] = eventSource; this._elements.set(id, eventSource);
} }
/** /**
@ -23,14 +23,13 @@ export class ElementStorage {
*/ */
addOrGetElement(feature: any): UIEventSource<any> { addOrGetElement(feature: any): UIEventSource<any> {
const elementId = feature.properties.id; const elementId = feature.properties.id;
if (elementId in this._elements) { if (this._elements.has(elementId)) {
const es = this._elements[elementId]; const es = this._elements.get(elementId);
if (es.data == feature.properties) { if (es.data == feature.properties) {
// Reference comparison gives the same object! we can just return the event source // Reference comparison gives the same object! we can just return the event source
return es; return es;
} }
const keptKeys = es.data; const keptKeys = es.data;
// The element already exists // The element already exists
// We add all the new keys to the old keys // We add all the new keys to the old keys
@ -49,15 +48,20 @@ export class ElementStorage {
return es; return es;
} else { } else {
const eventSource = new UIEventSource<any>(feature.properties, "tags of " + feature.properties.id); const eventSource = new UIEventSource<any>(feature.properties, "tags of " + feature.properties.id);
this._elements[feature.properties.id] = eventSource; this._elements.set(feature.properties.id, eventSource);
return eventSource; return eventSource;
} }
} }
getEventSourceById(elementId): UIEventSource<any> { getEventSourceById(elementId): UIEventSource<any> {
if (elementId in this._elements) { if (this._elements.has(elementId)) {
return this._elements[elementId]; return this._elements.get(elementId);
} }
console.error("Can not find eventsource with id ", elementId); console.error("Can not find eventsource with id ", elementId);
return undefined;
}
has(id) {
return this._elements.has(id);
} }
} }

View file

@ -15,13 +15,14 @@ export default class LocalStorageSaver implements FeatureSource {
this.features = source.features; this.features = source.features;
this.features.addCallbackAndRun(features => { this.features.addCallbackAndRun(features => {
if (features === undefined) {
return;
}
const now = new Date().getTime() const now = new Date().getTime()
features = features.filter(f => layout.data.cacheTimeout > Math.abs(now - f.freshness.getTime())/1000) features = features.filter(f => layout.data.cacheTimeout > Math.abs(now - f.freshness.getTime())/1000)
if (features === undefined) {
return;
}
if(features.length == 0){ if(features.length == 0){
return; return;
} }

View file

@ -15,8 +15,11 @@ export default class MetaTaggingFeatureSource implements FeatureSource {
} }
featuresFreshness.forEach(featureFresh => { featuresFreshness.forEach(featureFresh => {
const feature = featureFresh.feature; const feature = featureFresh.feature;
State.state.allElements.addOrGetElement(feature);
if(!State.state.allElements.has(feature.properties.id)){
State.state.allElements.addOrGetElement(feature)
}
if (Hash.hash.data === feature.properties.id) { if (Hash.hash.data === feature.properties.id) {
State.state.selectedElement.setData(feature); State.state.selectedElement.setData(feature);
} }

View file

@ -57,9 +57,11 @@ export class Changes implements FeatureSource{
if (changes.length == 0) { if (changes.length == 0) {
return; return;
} }
for (const change of changes) { for (const change of changes) {
if (elementTags[change.k] !== change.v) { if (elementTags[change.k] !== change.v) {
elementTags[change.k] = change.v; elementTags[change.k] = change.v;
console.log("Applied ", change.k, "=", change.v)
this.pending.data.push({elementId: elementTags.id, key: change.k, value: change.v}); this.pending.data.push({elementId: elementTags.id, key: change.k, value: change.v});
} }
} }

View file

@ -64,7 +64,7 @@ export default class SimpleMetaTagger {
SimpleMetaTagger.GetCountryCodeFor(lon, lat, (countries) => { SimpleMetaTagger.GetCountryCodeFor(lon, lat, (countries) => {
try { try {
feature.properties["_country"] = countries[0].trim().toLowerCase(); feature.properties["_country"] = countries[0].trim().toLowerCase();
const tagsSource = State.state.allElements.addOrGetElement(feature); const tagsSource = State.state.allElements.getEventSourceById(feature.properties.id);
tagsSource.ping(); tagsSource.ping();
} catch (e) { } catch (e) {
console.warn(e) console.warn(e)
@ -77,7 +77,7 @@ export default class SimpleMetaTagger {
"If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no')", "If 'opening_hours' is present, it will add the current state of the feature (being 'yes' or 'no')",
(feature => { (feature => {
const tagsSource = State.state.allElements.addOrGetElement(feature); const tagsSource = State.state.allElements.getEventSourceById(feature.properties.id);
tagsSource.addCallbackAndRun(tags => { tagsSource.addCallbackAndRun(tags => {
if (tags.opening_hours === undefined || tags._country === undefined) { if (tags.opening_hours === undefined || tags._country === undefined) {
return; return;

View file

@ -14,7 +14,9 @@ export abstract class TagsFilter {
/** /**
* Converts the tagsFilter into a list of key-values that should be uploaded to OSM. * Converts the tagsFilter into a list of key-values that should be uploaded to OSM.
* Throws an error if not applicable * Throws an error if not applicable.
*
* Note: properties are the already existing tags-object. It is only used in the substituting tag
*/ */
abstract asChange(properties:any): {k: string, v:string}[] abstract asChange(properties:any): {k: string, v:string}[]

View file

@ -21,6 +21,7 @@ export class UIEventSource<T> {
for (let i = 0; i < 10; i++) { for (let i = 0; i < 10; i++) {
console.log(copy[i].tag, copy[i]); console.log(copy[i].tag, copy[i]);
} }
return UIEventSource.allSources;
} }
return []; return [];
} }

View file

@ -19,7 +19,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig), super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig),
() => FeatureInfoBox.GenerateContent(tags, layerConfig), () => FeatureInfoBox.GenerateContent(tags, layerConfig),
tags.data.id); tags.data.id);
if (layerConfig === undefined) { if (layerConfig === undefined) {
throw "Undefined layerconfig"; throw "Undefined layerconfig";
} }
@ -49,6 +49,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
private static GenerateContent(tags: UIEventSource<any>, private static GenerateContent(tags: UIEventSource<any>,
layerConfig: LayerConfig): UIElement { layerConfig: LayerConfig): UIElement {
let questionBox: UIElement = undefined; let questionBox: UIElement = undefined;
if (State.state.featureSwitchUserbadge.data) { if (State.state.featureSwitchUserbadge.data) {
questionBox = new QuestionBox(tags, layerConfig.tagRenderings); questionBox = new QuestionBox(tags, layerConfig.tagRenderings);
} }
@ -60,15 +61,15 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
questionBoxIsUsed = true; questionBoxIsUsed = true;
return questionBox; return questionBox;
} }
return new EditableTagRendering(tags, tr); return new EditableTagRendering(tags, tr);
}); });
if (!questionBoxIsUsed) { if (!questionBoxIsUsed) {
renderings.push(questionBox); renderings.push(questionBox);
} }
if(State.state.featureSwitchIsDebugging.data){ if (State.state.featureSwitchIsDebugging.data) {
const config: TagRenderingConfig = new TagRenderingConfig({render:"{all_tags()}"}, new Tag("id",""), ""); const config: TagRenderingConfig = new TagRenderingConfig({render: "{all_tags()}"}, new Tag("id", ""), "");
renderings.push(new TagRenderingAnswer(tags,config )) renderings.push(new TagRenderingAnswer(tags, config))
} }
return new Combine(renderings).SetClass("block") return new Combine(renderings).SetClass("block")

View file

@ -88,7 +88,7 @@ export default class ShowDataLayer {
marker.openPopup(); marker.openPopup();
const popup = marker.getPopup(); const popup = marker.getPopup();
const tags = State.state.allElements.addOrGetElement(selected); const tags = State.state.allElements.getEventSourceById(selected.properties.id);
const layer: LayerConfig = this._layerDict[selected._matching_layer_id]; const layer: LayerConfig = this._layerDict[selected._matching_layer_id];
const infoBox = FeatureInfoBox.construct(tags, layer); const infoBox = FeatureInfoBox.construct(tags, layer);
@ -118,7 +118,7 @@ export default class ShowDataLayer {
// We have to convert them to the appropriate icon // We have to convert them to the appropriate icon
// Click handling is done in the next step // Click handling is done in the next step
const tagSource = State.state.allElements.addOrGetElement(feature) const tagSource = State.state.allElements.getEventSourceById(feature.properties.id)
const layer: LayerConfig = this._layerDict[feature._matching_layer_id]; const layer: LayerConfig = this._layerDict[feature._matching_layer_id];
if (layer === undefined) { if (layer === undefined) {

View file

@ -1,78 +1,92 @@
[ [
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "climbing_gym.svg", "path": "climbing_gym.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
}, },
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "climbing_icon.svg", "path": "climbing_icon.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
}, },
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "climbing_no_rope.svg", "path": "climbing_no_rope.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
}, },
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "climbing_rope.svg", "path": "climbing_rope.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
}, },
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "climbing_route.svg", "path": "climbing_route.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
}, },
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "climbing_unknown.svg", "path": "climbing_unknown.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
}, },
{ {
"authors": [ "authors": [
"Polarbear w", "Christian Neumann" "Polarbear w",
"Christian Neumann"
], ],
"path": "club.svg", "path": "club.svg",
"license": "CC0", "license": "CC0",
"sources": [ "sources": [
"https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg", "https://utopicode.de/", "https://wiki.openstreetmap.org/wiki/File:Climbing_icon_no_rope.svg",
"https://utopicode.de/",
"https://github.com/chrneumann/MapComplete" "https://github.com/chrneumann/MapComplete"
] ]
} }