Feature: add button to download mangrove identity

This commit is contained in:
Pieter Vander Vennet 2023-07-17 01:07:01 +02:00
parent e48571a80a
commit 02203dd05b
5 changed files with 87 additions and 56 deletions

View file

@ -24,6 +24,7 @@ export default class UserRelatedState {
public static readonly usersettingsConfig = UserRelatedState.initUserRelatedState() public static readonly usersettingsConfig = UserRelatedState.initUserRelatedState()
public static readonly availableUserSettingsIds: string[] = public static readonly availableUserSettingsIds: string[] =
UserRelatedState.usersettingsConfig?.tagRenderings?.map((tr) => tr.id) ?? [] UserRelatedState.usersettingsConfig?.tagRenderings?.map((tr) => tr.id) ?? []
public static readonly SHOW_TAGS_VALUES = ["always", "yes", "full"] as const
/** /**
The user credentials The user credentials
*/ */
@ -34,7 +35,6 @@ export default class UserRelatedState {
public readonly mangroveIdentity: MangroveIdentity public readonly mangroveIdentity: MangroveIdentity
public readonly installedUserThemes: Store<string[]> public readonly installedUserThemes: Store<string[]>
public readonly showAllQuestionsAtOnce: UIEventSource<boolean> public readonly showAllQuestionsAtOnce: UIEventSource<boolean>
public static readonly SHOW_TAGS_VALUES = ["always", "yes", "full"] as const
public readonly showTags: UIEventSource<"no" | undefined | "always" | "yes" | "full"> public readonly showTags: UIEventSource<"no" | undefined | "always" | "yes" | "full">
public readonly homeLocation: FeatureSource public readonly homeLocation: FeatureSource
public readonly language: UIEventSource<string> public readonly language: UIEventSource<string>
@ -178,6 +178,7 @@ export default class UserRelatedState {
) )
} }
} }
private InitInstalledUserThemes(): Store<string[]> { private InitInstalledUserThemes(): Store<string[]> {
const prefix = "mapcomplete-unofficial-theme-" const prefix = "mapcomplete-unofficial-theme-"
const postfix = "-combined-length" const postfix = "-combined-length"
@ -247,9 +248,23 @@ export default class UserRelatedState {
const osmConnection = this.osmConnection const osmConnection = this.osmConnection
osmConnection.preferencesHandler.preferences.addCallback((newPrefs) => { osmConnection.preferencesHandler.preferences.addCallback((newPrefs) => {
for (const k in newPrefs) { for (const k in newPrefs) {
const v = newPrefs[k]
if (k.endsWith("-combined-length")) {
const l = Number(v)
const key = k.substring(0, k.length - "length".length)
let combined = ""
for (let i = 0; i < l; i++) {
combined += newPrefs[key + i]
}
amendedPrefs.data[key.substring(0, key.length - "-combined-".length)] = combined
} else {
amendedPrefs.data[k] = newPrefs[k] amendedPrefs.data[k] = newPrefs[k]
} }
}
amendedPrefs.ping() amendedPrefs.ping()
console.log("Amended prefs are:", amendedPrefs.data)
}) })
const usersettingsConfig = UserRelatedState.usersettingsConfig const usersettingsConfig = UserRelatedState.usersettingsConfig
const translationMode = osmConnection.GetPreference("translation-mode") const translationMode = osmConnection.GetPreference("translation-mode")

View file

@ -2,7 +2,6 @@ import { UIEventSource } from "../Logic/UIEventSource"
import { Translation } from "./i18n/Translation" import { Translation } from "./i18n/Translation"
import Locale from "./i18n/Locale" import Locale from "./i18n/Locale"
import { FixedUiElement } from "./Base/FixedUiElement" import { FixedUiElement } from "./Base/FixedUiElement"
// import SpecialVisualizations from "./SpecialVisualizations"
import { Utils } from "../Utils" import { Utils } from "../Utils"
import { VariableUiElement } from "./Base/VariableUIElement" import { VariableUiElement } from "./Base/VariableUIElement"
import Combine from "./Base/Combine" import Combine from "./Base/Combine"

View file

@ -437,6 +437,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
/** /**
* Given a piece of text, will replace any key occuring in 'tags' by the corresponding value * Given a piece of text, will replace any key occuring in 'tags' by the corresponding value
*
* Utils.SubstituteKeys("abc{def}ghi", {def: 'XYZ'}) // => "abcXYZghi"
* Utils.SubstituteKeys("abc{def}{def}ghi", {def: 'XYZ'}) // => "abcXYZXYZghi"
* Utils.SubstituteKeys("abc{def}ghi", {def: '{XYZ}'}) // => "abc{XYZ}ghi"
*
* @param txt * @param txt
* @param tags * @param tags
* @param useLang * @param useLang
@ -450,12 +455,16 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (txt === undefined) { if (txt === undefined) {
return undefined return undefined
} }
const regex = /.*{([^}]*)}.*/ const regex = /(.*?){([^}]*)}(.*)/
let match = txt.match(regex) let match = txt.match(regex)
if(!match){
return txt
}
let result = ""
while (match) { while (match) {
const key = match[1] const [_, normal, key, leftover] = match
let v = tags === undefined ? undefined : tags[key] let v = tags === undefined ? undefined : tags[key]
if (v !== undefined && v !== null) { if (v !== undefined && v !== null) {
if (v["toISOString"] != undefined) { if (v["toISOString"] != undefined) {
@ -490,11 +499,14 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
// v === undefined // v === undefined
v = "" v = ""
} }
txt = txt.replace("{" + key + "}", v)
match = txt.match(regex)
}
return txt result += normal + v
match = leftover.match(regex)
if(!match){
result += leftover
}
}
return result
} }
public static LoadCustomCss(location: string) { public static LoadCustomCss(location: string) {
@ -1443,13 +1455,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
return false return false
} }
private static colorDiff(
c0: { r: number; g: number; b: number },
c1: { r: number; g: number; b: number }
) {
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b)
}
/** /**
* *
* Utils.splitIntoSubstitutionParts("abc") // => [{message: "abc"}] * Utils.splitIntoSubstitutionParts("abc") // => [{message: "abc"}]
@ -1476,4 +1481,11 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
} }
return spec return spec
} }
private static colorDiff(
c0: { r: number; g: number; b: number },
c1: { r: number; g: number; b: number }
) {
return Math.abs(c0.r - c1.r) + Math.abs(c0.g - c1.g) + Math.abs(c0.b - c1.b)
}
} }

View file

@ -221,6 +221,11 @@
} }
] ]
}, },
{"id": "mangrove-keys",
"render": {
"en": "<a href='data:application/json,{mangroveidentity}' download='mangrove_private_key_{_name}'>Download the private key for your Mangrove Account</a> <p>Anyone possessing this file can make reviews with your identity</p>"
}
},
{ {
"id": "translations-title", "id": "translations-title",
"label": [ "label": [

View file

@ -1,6 +1,6 @@
{ {
"name": "mapcomplete", "name": "mapcomplete",
"version": "0.30.9", "version": "0.31.0",
"repository": "https://github.com/pietervdvn/MapComplete", "repository": "https://github.com/pietervdvn/MapComplete",
"description": "A small website to edit OSM easily", "description": "A small website to edit OSM easily",
"bugs": "https://github.com/pietervdvn/MapComplete/issues", "bugs": "https://github.com/pietervdvn/MapComplete/issues",