From 9a43da6f8a46346df8308200a71ca56b585ba859 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Tue, 23 Apr 2024 21:31:58 +0200 Subject: [PATCH] Studio: fix #1901, #1902 --- package.json | 2 +- src/Logic/DetermineLayout.ts | 4 ++++ src/UI/Studio/DeleteButton.svelte | 39 +++++++++++++++++++++++++++++++ src/UI/Studio/EditLayer.svelte | 15 ++++-------- src/UI/Studio/EditTheme.svelte | 6 ++++- src/UI/Studio/StudioServer.ts | 32 ++++++++++++++++++++----- src/UI/StudioGUI.svelte | 6 +++-- 7 files changed, 84 insertions(+), 20 deletions(-) create mode 100644 src/UI/Studio/DeleteButton.svelte diff --git a/package.json b/package.json index 6e8e5dbe41..46841a498b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.42.1", + "version": "0.42.2", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", diff --git a/src/Logic/DetermineLayout.ts b/src/Logic/DetermineLayout.ts index a8cf4dff6b..f8fac7ec8b 100644 --- a/src/Logic/DetermineLayout.ts +++ b/src/Logic/DetermineLayout.ts @@ -56,6 +56,10 @@ export default class DetermineLayout { } private static async expandRemoteLayers(layoutConfig: LayoutConfigJson): Promise { + if(!layoutConfig.layers){ + // This is probably a layer in 'layer-only-mode' + return layoutConfig + } for (let i = 0; i < layoutConfig.layers.length; i++) { const l = layoutConfig.layers[i] if (typeof l !== "string") { diff --git a/src/UI/Studio/DeleteButton.svelte b/src/UI/Studio/DeleteButton.svelte new file mode 100644 index 0000000000..663232df4b --- /dev/null +++ b/src/UI/Studio/DeleteButton.svelte @@ -0,0 +1,39 @@ + + +
+ {#if deleteState === "init"} + + {:else if deleteState === "confirm"} +
+ {deleteState = "init"}}> + Don't delete + + deleteLayer()}> +
+ + + Do delete this {objectType} +
+
+
+ {/if} +
diff --git a/src/UI/Studio/EditLayer.svelte b/src/UI/Studio/EditLayer.svelte index 41c309e16f..6eabed3227 100644 --- a/src/UI/Studio/EditLayer.svelte +++ b/src/UI/Studio/EditLayer.svelte @@ -17,6 +17,9 @@ import QuestionPreview from "./QuestionPreview.svelte" import ShowConversionMessages from "./ShowConversionMessages.svelte" import RawEditor from "./RawEditor.svelte" + import NextButton from "../Base/NextButton.svelte" + import BackButton from "../Base/BackButton.svelte" + import DeleteButton from "./DeleteButton.svelte" const layerSchema: ConfigMeta[] = layerSchemaRaw @@ -75,10 +78,7 @@ let highlightedItem: UIEventSource = state.highlightedItem - function deleteLayer() { - state.delete() - backToStudio() - } +
@@ -134,12 +134,7 @@
-
- -
+
diff --git a/src/UI/Studio/EditTheme.svelte b/src/UI/Studio/EditTheme.svelte index becea2ed61..91f4fe5d64 100644 --- a/src/UI/Studio/EditTheme.svelte +++ b/src/UI/Studio/EditTheme.svelte @@ -7,11 +7,13 @@ import ShowConversionMessages from "./ShowConversionMessages.svelte" import Region from "./Region.svelte" import RawEditor from "./RawEditor.svelte" - import { Store, UIEventSource } from "../../Logic/UIEventSource" import { OsmConnection } from "../../Logic/Osm/OsmConnection" + import DeleteButton from "./DeleteButton.svelte" export let state: EditThemeState export let osmConnection: OsmConnection + export let backToStudio: () => void + let schema: ConfigMeta[] = state.schema.filter((schema) => schema.path.length > 0) export let selfLayers: { owner: number; id: string }[] @@ -97,6 +99,8 @@
+ +
Layers
diff --git a/src/UI/Studio/StudioServer.ts b/src/UI/Studio/StudioServer.ts index 0033df071f..9b003962e0 100644 --- a/src/UI/Studio/StudioServer.ts +++ b/src/UI/Studio/StudioServer.ts @@ -1,7 +1,7 @@ import { Utils } from "../../Utils" import Constants from "../../Models/Constants" import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" -import { Store } from "../../Logic/UIEventSource" +import { Store, UIEventSource } from "../../Logic/UIEventSource" import { LayoutConfigJson } from "../../Models/ThemeConfig/Json/LayoutConfigJson" /** @@ -11,13 +11,23 @@ import { LayoutConfigJson } from "../../Models/ThemeConfig/Json/LayoutConfigJson export default class StudioServer { private readonly url: string private readonly _userId: Store + private readonly overview: UIEventSource<{ + success: { id: string; owner: number; category: "layers" | "themes" }[] + } | { error: any } | undefined> constructor(url: string, userId: Store) { this.url = url this._userId = userId + this.overview = UIEventSource.FromPromiseWithErr(this.fetchOverviewRaw()) } - public async fetchOverview(): Promise< + public fetchOverview(): Store<{ + success: { id: string; owner: number; category: "layers" | "themes" }[] + } | { error } | undefined> { + return this.overview + } + + private async fetchOverviewRaw(): Promise< { id: string owner: number @@ -59,19 +69,29 @@ export default class StudioServer { uid?: number ): Promise { try { - return await Utils.downloadJson(this.urlFor(layerId, category, uid)) + return await Utils.downloadJson(this.urlFor(layerId, category, uid)) } catch (e) { return undefined } } + async delete(id: string, category: "layers" | "themes") { if (id === undefined || id === "") { return } await fetch(this.urlFor(id, category), { - method: "DELETE", + method: "DELETE" }) + const overview: { id: string; owner: number; category: "layers" | "themes" }[] = this.overview.data?.["success"] + if (overview) { + const index = overview.findIndex(obj => obj.id === id && obj.category === category && obj.owner === this._userId.data) + if (index >= 0) { + overview.splice(index, 1) + this.overview.ping() + } + } } + async update(id: string, config: string, category: "layers" | "themes") { if (id === undefined || id === "") { return @@ -79,9 +99,9 @@ export default class StudioServer { await fetch(this.urlFor(id, category), { method: "POST", headers: { - "Content-Type": "application/json;charset=utf-8", + "Content-Type": "application/json;charset=utf-8" }, - body: config, + body: config }) } diff --git a/src/UI/StudioGUI.svelte b/src/UI/StudioGUI.svelte index bdaa84c97d..9bc19ea725 100644 --- a/src/UI/StudioGUI.svelte +++ b/src/UI/StudioGUI.svelte @@ -54,7 +54,7 @@ const uid = osmConnection.userDetails.map((ud) => ud?.uid) const studio = new StudioServer(studioUrl, uid) - let layersWithErr = UIEventSource.FromPromiseWithErr(studio.fetchOverview()) + let layersWithErr = studio.fetchOverview() let layers: Store<{ owner: number; id: string }[]> = layersWithErr.mapD((l) => l["success"]?.filter((l) => l.category === "layers") ) @@ -291,7 +291,9 @@ {:else if state === "editing_theme"} - + { + state = undefined + }}>