diff --git a/Logic/DetermineLayout.ts b/Logic/DetermineLayout.ts index c58012c69..734988583 100644 --- a/Logic/DetermineLayout.ts +++ b/Logic/DetermineLayout.ts @@ -72,7 +72,7 @@ export default class DetermineLayout { public static LoadLayoutFromHash( userLayoutParam: UIEventSource - ): LayoutConfig | null { + ): (LayoutConfig & {definition: LayoutConfigJson}) | null { let hash = location.hash.substr(1); let json: any; @@ -113,7 +113,9 @@ export default class DetermineLayout { const layoutToUse = DetermineLayout.prepCustomTheme(json) userLayoutParam.setData(layoutToUse.id); - return new LayoutConfig(layoutToUse, false); + const config = new LayoutConfig(layoutToUse, false); + config["definition"] = json + return config } catch (e) { console.error(e) if (hash === undefined || hash.length < 10) { diff --git a/Logic/State/UserRelatedState.ts b/Logic/State/UserRelatedState.ts index 03cc274c6..ceee5c9d6 100644 --- a/Logic/State/UserRelatedState.ts +++ b/Logic/State/UserRelatedState.ts @@ -68,7 +68,8 @@ export default class UserRelatedState extends ElementsState { id: this.layoutToUse.id, icon: this.layoutToUse.icon, title: this.layoutToUse.title.translations, - shortDescription: this.layoutToUse.shortDescription.translations + shortDescription: this.layoutToUse.shortDescription.translations, + definition: this.layoutToUse["definition"] })) } diff --git a/Models/ThemeConfig/Conversion/PrepareTheme.ts b/Models/ThemeConfig/Conversion/PrepareTheme.ts index 17e04ac5a..57831d6ab 100644 --- a/Models/ThemeConfig/Conversion/PrepareTheme.ts +++ b/Models/ThemeConfig/Conversion/PrepareTheme.ts @@ -406,12 +406,31 @@ class AddDependencyLayersToTheme extends DesugaringStep { } } +class PreparePersonalTheme extends DesugaringStep { + private readonly _state: DesugaringContext; + constructor(state: DesugaringContext) { + super("Adds every public layer to the personal theme",["layers"],"PreparePersonalTheme"); + this._state = state; + } + + convert(json: LayoutConfigJson, context: string): { result: LayoutConfigJson; errors?: string[]; warnings?: string[]; information?: string[] } { + if(json.id !== "personal"){ + return {result: json} + } + + json.layers = Array.from(this._state.sharedLayers.keys()) + + + return {result: json}; + } + +} export class PrepareTheme extends Fuse { constructor(state: DesugaringContext) { super( "Fully prepares and expands a theme", - + new PreparePersonalTheme(state), new OnEveryConcat("layers", new SubstituteLayer(state)), new SetDefault("socialImage", "assets/SocialImage.png", true), new OnEvery("layers", new PrepareLayer(state)), diff --git a/Models/ThemeConfig/FilterConfig.ts b/Models/ThemeConfig/FilterConfig.ts index cc7c0918c..e38b645ca 100644 --- a/Models/ThemeConfig/FilterConfig.ts +++ b/Models/ThemeConfig/FilterConfig.ts @@ -105,8 +105,9 @@ export default class FilterConfig { if(this.options.length > 1){ defaultValue = ""+this.defaultSelection }else{ + // Only a single option if(this.defaultSelection > 0){ - defaultValue = ""+this.defaultSelection + defaultValue = "true" } } const qp = QueryParameters.GetQueryParameter("filter-" + this.id, defaultValue, "State of filter " + this.id) diff --git a/UI/BigComponents/CopyrightPanel.ts b/UI/BigComponents/CopyrightPanel.ts index fd8bf6b50..f717f13dd 100644 --- a/UI/BigComponents/CopyrightPanel.ts +++ b/UI/BigComponents/CopyrightPanel.ts @@ -20,7 +20,6 @@ import Toggle from "../Input/Toggle"; import {OsmConnection} from "../../Logic/Osm/OsmConnection"; import Constants from "../../Models/Constants"; import ContributorCount from "../../Logic/ContributorCount"; -import {icon} from "leaflet"; import Img from "../Base/Img"; export class OpenIdEditor extends VariableUiElement { @@ -211,7 +210,11 @@ export default class CopyrightPanel extends Combine { private static IconAttribution(iconPath: string): BaseUIElement { if (iconPath.startsWith("http")) { + try{ iconPath = "." + new URL(iconPath).pathname; + }catch(e){ + console.error(e) + } } const license: SmallLicense = CopyrightPanel.LicenseObject[iconPath] diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts index 22674db52..1d3820cbe 100644 --- a/UI/BigComponents/MoreScreen.ts +++ b/UI/BigComponents/MoreScreen.ts @@ -9,7 +9,7 @@ import BaseUIElement from "../BaseUIElement"; import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; import {UIEventSource} from "../../Logic/UIEventSource"; import Loc from "../../Models/Loc"; -import {OsmConnection} from "../../Logic/Osm/OsmConnection"; +import UserDetails, {OsmConnection} from "../../Logic/Osm/OsmConnection"; import UserRelatedState from "../../Logic/State/UserRelatedState"; import Toggle from "../Input/Toggle"; import {Utils} from "../../Utils"; @@ -52,7 +52,8 @@ export default class MoreScreen extends Combine { id: string, icon: string, title: any, - shortDescription: any + shortDescription: any, + definition?: any }, isCustom: boolean = false ): BaseUIElement { @@ -87,6 +88,11 @@ export default class MoreScreen extends Combine { linkPrefix = `${path}/theme.html?userlayout=${layout.id}&` } + let hash = "" + if(layout.definition !== undefined){ + hash = "#"+btoa(JSON.stringify(layout.definition)) + } + const linkText = currentLocation?.map(currentLocation => { const params = [ ["z", currentLocation?.zoom], @@ -95,10 +101,11 @@ export default class MoreScreen extends Combine { ].filter(part => part[1] !== undefined) .map(part => part[0] + "=" + part[1]) .join("&") - return `${linkPrefix}${params}`; + return `${linkPrefix}${params}${hash}`; }) ?? new UIEventSource(`${linkPrefix}`) + return new SubtleButton(layout.icon, new Combine([ `
`, @@ -134,7 +141,8 @@ export default class MoreScreen extends Combine { id: string icon: string, title: any, - shortDescription: any + shortDescription: any, + definition?: any } = JSON.parse(str) return MoreScreen.createLinkButton(state, value, true)