diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index e1cba1fc51..76852726be 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -157,19 +157,10 @@ export default class DetermineLayout { try { let parsed = await Utils.downloadJson(link) - console.log("Got ", parsed) - parsed = new FixLegacyTheme().convertStrict({ - tagRenderings: SharedTagRenderings.SharedTagRenderingJson, - sharedLayers: new Map() // FIXME: actually add the layers - }, parsed, "While loading a dynamic theme") - - - parsed.id = link; - - try { + parsed.id = link; const layoutToUse = DetermineLayout.prepCustomTheme(parsed) - return new LayoutConfig(layoutToUse,false).patchImages(link, JSON.stringify(layoutToUse)); + return new LayoutConfig(layoutToUse,false) } catch (e) { console.error(e) DetermineLayout.ShowErrorOnCustomTheme( diff --git a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts index 1300d42d7c..8671517aa8 100644 --- a/Logic/FeatureSource/Sources/FilteringFeatureSource.ts +++ b/Logic/FeatureSource/Sources/FilteringFeatureSource.ts @@ -82,15 +82,12 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti } } - const appliedFilters = layer.appliedFilters?.data - if(appliedFilters !== undefined){ - const tagsFilter = Array.from(appliedFilters.values()); - for (const filter of tagsFilter ?? []) { - const neededTags : TagsFilter = filter?.currentFilter - if (neededTags !== undefined && !neededTags.matchesProperties(f.feature.properties)) { - // Hidden by the filter on the layer itself - we want to hide it no matter wat - return false; - } + const tagsFilter = Array.from(layer.appliedFilters?.data?.values() ?? []) + for (const filter of tagsFilter) { + const neededTags: TagsFilter = filter?.currentFilter + if (neededTags !== undefined && !neededTags.matchesProperties(f.feature.properties)) { + // Hidden by the filter on the layer itself - we want to hide it no matter wat + return false; } } diff --git a/Logic/Osm/OsmPreferences.ts b/Logic/Osm/OsmPreferences.ts index fadd9c1059..356615fe72 100644 --- a/Logic/Osm/OsmPreferences.ts +++ b/Logic/Osm/OsmPreferences.ts @@ -178,12 +178,40 @@ export class OsmPreferences { content: v }, function (error) { if (error) { - console.log(`Could not set preference "${k}"'`, error); + console.warn(`Could not set preference "${k}"'`, error); return; } - console.log(`Preference ${k} written!`); + console.debug(`Preference ${k} written!`); }); } + + public ClearPreferences(){ + let isRunning = false; + const self = this; + this.preferences.addCallbackAndRun(prefs => { + if(Object.keys(prefs).length == 0){ + return; + } + if (isRunning) { + return + } + isRunning = true + const prefixes = ["mapcomplete-installed-theme","mapcomplete-installed-themes-","mapcomplete-current-open-changeset","mapcomplete-personal-theme-layer"] + for (const key in prefs) { + for (const prefix of prefixes) { + // console.log(key) + if (key.startsWith(prefix)) { + console.log("Clearing ", key) + self.GetPreference(key, "").setData("") + + } + } + } + isRunning = false; + return true; + + }) + } } \ No newline at end of file diff --git a/Logic/State/UserRelatedState.ts b/Logic/State/UserRelatedState.ts index 7895bb2eeb..8e0e2ce3a7 100644 --- a/Logic/State/UserRelatedState.ts +++ b/Logic/State/UserRelatedState.ts @@ -32,13 +32,15 @@ export default class UserRelatedState extends ElementsState { /** * WHich other themes the user previously visited */ - public installedThemes: UIEventSource<{ id: string, // The id doubles as the URL + public installedThemes: UIEventSource<{ + id: string, // The id doubles as the URL icon: string, title: any, - shortDescription: any}[]>; + shortDescription: any + }[]>; - constructor(layoutToUse: LayoutConfig, options?:{attemptLogin : true | boolean}) { + constructor(layoutToUse: LayoutConfig, options?: { attemptLogin: true | boolean }) { super(layoutToUse); this.osmConnection = new OsmConnection({ @@ -73,46 +75,53 @@ export default class UserRelatedState extends ElementsState { this.installedThemes = this.osmConnection.GetLongPreference("installed-themes").map( str => { - if(str === undefined || str === ""){ + if (str === undefined || str === "") { return [] } - try{ - return JSON.parse(str) - }catch(e){ - console.warn("Could not parse preference with installed themes due to ", e,"\nThe offending string is",str) + try { + return JSON.parse(str); + } catch (e) { + console.warn("Could not parse preference with installed themes due to ", e, "\nThe offending string is", str) return [] } - }, [],(installed => JSON.stringify(installed)) + }, [], (installed) => JSON.stringify(installed) ) - - + + const self = this; - this.osmConnection.isLoggedIn.addCallbackAndRunD(loggedIn => { - if(!loggedIn){ - return - } - if(this.layoutToUse?.id?.startsWith("http")){ - if(!this.installedThemes.data.some(installed => installed.id === this.layoutToUse.id)){ - - this.installedThemes.data.push({ - id: this.layoutToUse.id, - icon: this.layoutToUse.icon, - title: this.layoutToUse.title.translations, - shortDescription: this.layoutToUse.shortDescription.translations - }) + if (this.layoutToUse?.id?.startsWith("http")) { + this.installedThemes.addCallbackAndRun(currentThemes => { + if (currentThemes === undefined) { + // We wait till we are logged in + return } - this.installedThemes.ping() - console.log("Registered "+this.layoutToUse.id+" as installed themes") - } + + if(self.osmConnection.isLoggedIn.data == false){ + return; + } + + if (currentThemes.some(installed => installed.id === this.layoutToUse.id)) { + // Already added to the 'installed theme' list + return; + } + + console.log("Current installed themes are", this.installedThemes.data) + currentThemes.push({ + id: self.layoutToUse.id, + icon: self.layoutToUse.icon, + title: self.layoutToUse.title.translations, + shortDescription: self.layoutToUse.shortDescription.translations + }) + self.installedThemes.ping() + console.log("Registered " + self.layoutToUse.id + " as installed themes") + + }) + } - return true; - }) - - // Important: the favourite layers are initialized _after_ the installed themes, as these might contain an installedTheme this.favouriteLayers = LocalStorageSource.Get("favouriteLayers") .syncWith(this.osmConnection.GetLongPreference("favouriteLayers")) @@ -121,7 +130,7 @@ export default class UserRelatedState extends ElementsState { [], (layers) => Utils.Dedup(layers)?.join(";") ); - + this.InitializeLanguage(); new SelectedElementTagsUpdater(this) diff --git a/Models/Constants.ts b/Models/Constants.ts index e5777f8d78..6feb4f669b 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,8 @@ import {Utils} from "../Utils"; export default class Constants { - public static vNumber = "0.15.0-alpha-2"; + public static vNumber = "0.15.0-rc-1"; + public static ImgurApiKey = '7070e7167f0a25a' public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" diff --git a/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts b/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts index ebc4363f3e..c03b1b4d7f 100644 --- a/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts +++ b/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts @@ -8,7 +8,6 @@ import {LayerConfigJson} from "../Json/LayerConfigJson"; import Constants from "../../Constants"; import {DesugaringContext, DesugaringStep, Fuse, OnEvery} from "./Conversion"; - export class UpdateLegacyLayer extends DesugaringStep { constructor() { @@ -21,9 +20,13 @@ export class UpdateLegacyLayer extends DesugaringStep { } } } + + oldThemeConfig.layers = Utils.NoNull(oldThemeConfig.layers) + return { errors: [], warnings: [], @@ -393,4 +399,4 @@ export class ValidateThemeAndLayers extends Fuse { new OnEvery("layers", new ValidateLayer(knownImagePaths, undefined, false)) ); } -} +} \ No newline at end of file diff --git a/Models/ThemeConfig/Conversion/PrepareTheme.ts b/Models/ThemeConfig/Conversion/PrepareTheme.ts index 98ff123d54..617c9de211 100644 --- a/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -11,7 +11,6 @@ import {TagRenderingConfigJson} from "../Json/TagRenderingConfigJson"; import {Translation} from "../../../UI/i18n/Translation"; import {SubstitutedTranslation} from "../../../UI/SubstitutedTranslation"; import DependencyCalculator from "../DependencyCalculator"; -import Translations from "../../../UI/i18n/Translations"; class SubstituteLayer extends Conversion<(string | LayerConfigJson), LayerConfigJson[]> { constructor() { @@ -179,7 +178,8 @@ class AddImportLayers extends DesugaringStep { } } -export class AddMiniMap extends DesugaringStep { + +class AddMiniMap extends DesugaringStep { constructor() { super("Adds a default 'minimap'-element to the tagrenderings if none of the elements define such a minimap", ["tagRenderings"]); } @@ -188,9 +188,8 @@ export class AddMiniMap extends DesugaringStep { * Returns true if this tag rendering has a minimap in some language. * Note: this minimap can be hidden by conditions */ - public static hasMinimap(renderingConfig: TagRenderingConfigJson): boolean { - const translations: Translation[] = Utils.NoNull([renderingConfig.render, ...(renderingConfig.mappings ?? []).map(m => m.then)]) - .map(Translations.T); + private static hasMinimap(renderingConfig: TagRenderingConfigJson): boolean { + const translations: Translation[] = Utils.NoNull([renderingConfig.render, ...(renderingConfig.mappings ?? []).map(m => m.then)]); for (const translation of translations) { for (const key in translation.translations) { if (!translation.translations.hasOwnProperty(key)) { diff --git a/Utils.ts b/Utils.ts index 64a9c66e9f..2d528e7348 100644 --- a/Utils.ts +++ b/Utils.ts @@ -495,7 +495,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be } const data = await Utils.download(url, Utils.Merge({"accept": "application/json"}, headers ?? {})) try { - return JSON.parse(data) + if(typeof data === "string"){ + return JSON.parse(data) + } + return data } catch (e) { console.error("Could not parse ", data, "due to", e, "\n", e.stack) throw e; diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json index 72e9452136..84416e15f0 100644 --- a/assets/layers/trail/trail.json +++ b/assets/layers/trail/trail.json @@ -13,9 +13,10 @@ "and": [ { "or": [ - "route=hiking", - "route=bycicle", - "route=horse" + "route~.*foot.*", + "route~.*hiking.*", + "route~.*bycicle.*", + "route~.*horse.*" ] } ] diff --git a/package.json b/package.json index 2f843f0348..acad635472 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "generate:cache:speelplekken:mini": "ts-node scripts/generateCache.ts speelplekken 14 ../MapComplete-data/speelplekken_cache_mini/ 51.181710380278176 4.423413276672363 51.193007664772495 4.444141387939452", "generate:cache:speelplekken": "npm run generate:layeroverview && ts-node scripts/generateCache.ts speelplekken 14 ../MapComplete-data/speelplekken_cache/ 51.20 4.35 51.09 4.56", "generate:cache:natuurpunt": "npm run generate:layeroverview && ts-node scripts/generateCache.ts natuurpunt 12 ../MapComplete-data/natuurpunt_cache/ 50.40 2.1 51.54 6.4 --generate-point-overview nature_reserve,visitor_information_centre", + "generate:cache:natuurpunt:mini": "ts-node scripts/generateCache.ts natuurpunt 12 ../../git/MapComplete-data/natuurpunt_cache_mini/ 51.00792239979105 4.497699737548828 51.0353492224462554 4.539070129394531 --generate-point-overview nature_reserve,visitor_information_centre", "generate:layeroverview": "ts-node scripts/generateLayerOverview.ts --no-fail", "generate:licenses": "ts-node scripts/generateLicenseInfo.ts --no-fail", "query:licenses": "ts-node scripts/generateLicenseInfo.ts --query", diff --git a/scripts/generateCache.ts b/scripts/generateCache.ts index 9980c1959a..029e014d79 100644 --- a/scripts/generateCache.ts +++ b/scripts/generateCache.ts @@ -376,9 +376,29 @@ async function main(args: string[]) { const lat1 = Number(args[5]) const lon1 = Number(args[6]) + if(isNaN(lat0)){ + throw "The first number (a latitude) is not a valid number" + } + + if(isNaN(lon0)){ + throw "The second number (a longitude) is not a valid number" + } + if(isNaN(lat1)){ + throw "The third number (a latitude) is not a valid number" + } + + if(isNaN(lon1)){ + throw "The first number (a longitude) is not a valid number" + } + + const tileRange = Tiles.TileRangeBetween(zoomlevel, lat0, lon0, lat1, lon1) + if(isNaN(tileRange.total)){ + throw "Something has gone wrong: tilerange is NAN" + } + if (tileRange.total === 0) { console.log("Tilerange has zero tiles - this is probably an error") return @@ -440,8 +460,9 @@ async function main(args: string[]) { let args = [...process.argv] args.splice(0, 2) try { - main(args).catch(e => console.error("Error building cache:", e)); + main(args) + .then(() => console.log("All done!")) + .catch(e => console.error("Error building cache:", e)); } catch (e) { console.error("Error building cache:", e) -} -console.log("All done!") \ No newline at end of file +} \ No newline at end of file diff --git a/test.ts b/test.ts index f213a0fda4..92a6a8f651 100644 --- a/test.ts +++ b/test.ts @@ -4,4 +4,4 @@ import Link from "./UI/Base/Link"; import {FixedUiElement} from "./UI/Base/FixedUiElement"; const allHidden = AllKnownLayouts.layoutsList.filter(l => l.hideFromOverview) -new List(allHidden.map(th => new Link(new FixedUiElement(th.id), "theme.html?layout="+th.id))).AttachTo("maindiv") \ No newline at end of file +new List(allHidden.map(th => new Link(new FixedUiElement(th.id), "theme.html?layout="+th.id))).AttachTo("maindiv")