diff --git a/Models/Constants.ts b/Models/Constants.ts index e7ec48ba9..71625ac88 100644 --- a/Models/Constants.ts +++ b/Models/Constants.ts @@ -2,7 +2,7 @@ import { Utils } from "../Utils"; export default class Constants { - public static vNumber = "0.7.5b"; + public static vNumber = "0.8.0"; // The user journey states thresholds when a new feature gets unlocked public static userJourney = { diff --git a/State.ts b/State.ts index 18fc3f972..8e4322d65 100644 --- a/State.ts +++ b/State.ts @@ -221,7 +221,7 @@ export default class State { this.backgroundLayerId = QueryParameters.GetQueryParameter("background", - layoutToUse.defaultBackgroundId ?? "osm", + layoutToUse?.defaultBackgroundId ?? "osm", "The id of the background layer to start with") } diff --git a/UI/Base/Button.ts b/UI/Base/Button.ts index 89364807b..e671e0979 100644 --- a/UI/Base/Button.ts +++ b/UI/Base/Button.ts @@ -1,39 +1,29 @@ import {UIElement} from "../UIElement"; -import Locale from "../i18n/Locale"; import Translations from "../i18n/Translations"; import BaseUIElement from "../BaseUIElement"; -export class Button extends UIElement { +export class Button extends BaseUIElement { private _text: BaseUIElement; private _onclick: () => void; - private _clss: string; - constructor(text: string | UIElement, onclick: (() => void), clss: string = "") { - super(Locale.language); + constructor(text: string | UIElement, onclick: (() => void)) { + super(); this._text = Translations.W(text); this._onclick = onclick; - if (clss !== "") { - - this._clss = "class='" + clss + "'"; - }else{ - this._clss = ""; - } } - - InnerRender(): string { - - return "
" + - "" + - "
"; - } - - InnerUpdate(htmlElement: HTMLElement) { - super.InnerUpdate(htmlElement); - const self = this; - document.getElementById("button-"+this.id).onclick = function(){ - self._onclick(); + protected InnerConstructElement(): HTMLElement { + const el = this._text.ConstructElement(); + if(el === undefined){ + return undefined; } + const form = document.createElement("form") + const button = document.createElement("button") + button.type = "button" + button.appendChild(el) + button.onclick = this._onclick + form.appendChild(button) + return form; } } \ No newline at end of file diff --git a/UI/Base/Table.ts b/UI/Base/Table.ts new file mode 100644 index 000000000..f02f8c49d --- /dev/null +++ b/UI/Base/Table.ts @@ -0,0 +1,59 @@ +import BaseUIElement from "../BaseUIElement"; +import {Utils} from "../../Utils"; +import Translations from "../i18n/Translations"; + +export default class Table extends BaseUIElement { + + private readonly _header: BaseUIElement[]; + private readonly _contents: BaseUIElement[][]; + + constructor(header: (BaseUIElement | string)[], contents: (BaseUIElement | string)[][]) { + super(); + this._header = header.map(Translations.W); + this._contents = contents.map(row => row.map(Translations.W)); + } + + protected InnerConstructElement(): HTMLElement { + const table = document.createElement("table") + + const headerElems = Utils.NoNull((this._header ?? []).map(elems => elems.ConstructElement())) + if (headerElems.length > 0) { + + const tr = document.createElement("tr"); + headerElems.forEach(headerElem => { + const td = document.createElement("th") + td.appendChild(headerElem) + tr.appendChild(td) + }) + table.appendChild(tr) + } + + for (const row of this._contents) { + const tr = document.createElement("tr") + for (const elem of row) { + const htmlElem = elem.ConstructElement() + if (htmlElem === undefined) { + continue; + } + + const td = document.createElement("td") + td.appendChild(htmlElem) + tr.appendChild(td) + } + table.appendChild(tr) + } + + return table; + } + + AsMarkdown(): string { + + const headerMarkdownParts = this._header.map(hel => hel?.AsMarkdown() ?? " ") + const header =headerMarkdownParts.join(" | "); + const headerSep = headerMarkdownParts.map(part => '-'.repeat(part.length + 2)).join("|") + const table = this._contents.map(row => row.map(el => el.AsMarkdown()?? " ").join("|")).join("\n") + + return [header, headerSep, table, ""].join("\n") + } + +} \ No newline at end of file diff --git a/UI/BigComponents/LicensePicker.ts b/UI/BigComponents/LicensePicker.ts index f87d8c775..efdd6aafd 100644 --- a/UI/BigComponents/LicensePicker.ts +++ b/UI/BigComponents/LicensePicker.ts @@ -6,11 +6,11 @@ import {UIEventSource} from "../../Logic/UIEventSource"; export default class LicensePicker extends DropDown{ constructor() { - super(Translations.t.image.willBePublished, + super(Translations.t.image.willBePublished.Clone(), [ - {value: "CC0", shown: Translations.t.image.cco}, - {value: "CC-BY-SA 4.0", shown: Translations.t.image.ccbs}, - {value: "CC-BY 4.0", shown: Translations.t.image.ccb} + {value: "CC0", shown: Translations.t.image.cco.Clone()}, + {value: "CC-BY-SA 4.0", shown: Translations.t.image.ccbs.Clone()}, + {value: "CC-BY 4.0", shown: Translations.t.image.ccb.Clone()} ], State.state?.osmConnection?.GetPreference("pictures-license") ?? new UIEventSource("CC0") ) diff --git a/preferences.ts b/preferences.ts index 7f390c797..4b1dce30a 100644 --- a/preferences.ts +++ b/preferences.ts @@ -9,6 +9,8 @@ import {Utils} from "./Utils"; import {SubtleButton} from "./UI/Base/SubtleButton"; import LZString from "lz-string"; import {LayoutConfigJson} from "./Customizations/JSON/LayoutConfigJson"; +import BaseUIElement from "./UI/BaseUIElement"; +import Table from "./UI/Base/Table"; const connection = new OsmConnection(false, new UIEventSource(undefined), ""); @@ -99,11 +101,14 @@ function createTable(preferences: any) { return; } rendered = true; - const prefs = []; + const prefs: (BaseUIElement|string)[][] = []; for (const key in preferences) { + if(!preferences.hasOwnProperty(key)){ + continue; + } const pref = connection.GetPreference(key, ""); - let value: UIElement = new FixedUiElement(pref.data); + let value: BaseUIElement = new FixedUiElement(pref.data); if (connection.userDetails.data.csCount > 500 && (key.startsWith("mapcomplete") || connection.userDetails.data.csCount > 2500)) { value = new TextField({ @@ -111,24 +116,22 @@ function createTable(preferences: any) { }); } - const c = [ - "", + const row = [ key, - "", - new Button("delete", () => pref.setData("")), - "", - value, - "" + new Button("delete", () => pref.setData(null)), + value ]; - prefs.push(...c); + prefs.push(row); } new Combine( [ ...salvageThemes(preferences).map(theme => SalvageButton(theme)), - "", - ...prefs, - "
", + new Table( + ["Key","","Value"], + prefs + + ), new SubtleButton("./assets/svg/delete_icon.svg", "Delete all mapcomplete preferences (mangrove identies are preserved)").onClick(() => clearAll(preferences))] ).AttachTo("maindiv"); }