Tweaks to import flow

This commit is contained in:
pietervdvn 2022-03-10 23:20:50 +01:00
parent 3fb7cc90fc
commit ce017e0341
6 changed files with 8970 additions and 71 deletions

View file

@ -46,15 +46,7 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
if(firstRender === undefined){ if(firstRender === undefined){
throw `Layer ${layerJson.id} does not have a pointRendering: `+context throw `Layer ${layerJson.id} does not have a pointRendering: `+context
} }
const icon = firstRender.icon
const iconBadges = []
const title = layer.presets[0].title const title = layer.presets[0].title
if (icon !== undefined) {
iconBadges.push({
if: {and: []},
then: icon
})
}
const importButton = {} const importButton = {}
{ {
@ -123,7 +115,7 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
"tagRenderings": [ "tagRenderings": [
{ {
"id": "Intro", "id": "Intro",
"render": "{_intro}" render: "{_intro}"
}, },
{ {
"id": "conversation", "id": "conversation",
@ -138,12 +130,12 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
{ {
"id": "close_note_", "id": "close_note_",
"render": embed( "render": embed(
"{close_note(", t.notFound.Subs({title}), ", ./assets/svg/close.svg, id, This feature does not exist)}"), "{close_note(", t.notFound.Subs({title}), ", ./assets/svg/close.svg, id, This feature does not exist, 18)}"),
condition: "closed_at=" condition: "closed_at="
}, },
{ {
"id": "close_note_mapped", "id": "close_note_mapped",
"render": embed("{close_note(", t.alreadyMapped.Subs({title}), ", ./assets/svg/checkmark.svg, id, Already mapped)}"), "render": embed("{close_note(", t.alreadyMapped.Subs({title}), ", ./assets/svg/duplicate.svg, id, Already mapped, 18)}"),
condition: "closed_at=" condition: "closed_at="
}, },
{ {
@ -172,7 +164,6 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
then: "circle:white;checkmark:black" then: "circle:white;checkmark:black"
}] }]
}, },
iconBadges,
"iconSize": "40,40,center" "iconSize": "40,40,center"
} }
] ]

View file

@ -191,7 +191,7 @@ ${Utils.special_visualizations_importRequirementDocs}
importFlow, importFlow,
isImported isImported
), ),
t.zoomInMore, t.zoomInMore.SetClass("alert"),
state.locationControl.map(l => l.zoom >= 18) state.locationControl.map(l => l.zoom >= 18)
), ),
pleaseLoginButton, pleaseLoginButton,

View file

@ -71,7 +71,7 @@ export default class NewNoteUi extends Toggle {
new Combine([new Toggle(undefined, t.warnAnonymous.SetClass("alert"), state?.osmConnection?.isLoggedIn), new Combine([new Toggle(undefined, t.warnAnonymous.SetClass("alert"), state?.osmConnection?.isLoggedIn),
new Toggle(postNote, new Toggle(postNote,
t.textNeeded.SetClass("alert"), t.textNeeded.SetClass("alert"),
text.GetValue().map(txt => txt.length > 3) text.GetValue().map(txt => txt?.length > 3)
) )
]).SetClass("flex justify-end items-center") ]).SetClass("flex justify-end items-center")

View file

@ -46,6 +46,7 @@ import FileSelectorButton from "./Input/FileSelectorButton";
import {LoginToggle} from "./Popup/LoginButton"; import {LoginToggle} from "./Popup/LoginButton";
import {start} from "repl"; import {start} from "repl";
import {SubstitutedTranslation} from "./SubstitutedTranslation"; import {SubstitutedTranslation} from "./SubstitutedTranslation";
import {Feature} from "@turf/turf";
export interface SpecialVisualization { export interface SpecialVisualization {
funcName: string, funcName: string,
@ -95,6 +96,88 @@ export class AllTagsPanel extends VariableUiElement {
} }
} }
class CloseNoteButton implements SpecialVisualization {
public readonly funcName = "close_note"
public readonly docs = "Button to close a note. A predifined text can be defined to close the note with. If the note is already closed, will show a small text."
public readonly args = [
{
name: "text",
doc: "Text to show on this button",
},
{
name: "icon",
doc: "Icon to show",
defaultValue: "checkmark.svg"
},
{
name: "idkey",
doc: "The property name where the ID of the note to close can be found",
defaultValue: "id"
},
{
name: "comment",
doc: "Text to add onto the note when closing",
},
{
name: "minZoom",
doc: "If set, only show the closenote button if zoomed in enough"
},
{
name: "zoomButton",
doc: "Text to show if not zoomed in enough"
}
]
public constr(state: FeaturePipelineState, tags, args): BaseUIElement {
const t = Translations.t.notes;
const params: {
text: string,
icon: string,
idkey: string,
comment: string,
minZoom: string,
zoomButton: string
} = Utils.ParseVisArgs(this.args, args)
let icon = Svg.checkmark_svg()
if (params.icon !== "checkmark.svg" && (args[2] ?? "") !== "") {
icon = new Img(args[1])
}
let textToShow = t.closeNote;
if ((params.text ?? "") !== "") {
textToShow = Translations.T(args[0])
}
let closeButton: BaseUIElement = new SubtleButton(icon, textToShow)
const isClosed = tags.map(tags => (tags["closed_at"] ?? "") !== "");
closeButton.onClick(() => {
const id = tags.data[args[2] ?? "id"]
state.osmConnection.closeNote(id, args[3])
?.then(_ => {
tags.data["closed_at"] = new Date().toISOString();
tags.ping()
})
})
if((params.minZoom??"") !== "" && !isNaN(Number(params.minZoom))){
closeButton = new Toggle(
closeButton,
params.zoomButton ?? "",
state. locationControl.map(l => l.zoom >= Number(params.minZoom))
)
}
return new LoginToggle(new Toggle(
t.isClosed.SetClass("thanks"),
closeButton,
isClosed
), t.loginToClose, state)
}
}
export default class SpecialVisualizations { export default class SpecialVisualizations {
public static specialVisualizations = SpecialVisualizations.init() public static specialVisualizations = SpecialVisualizations.init()
@ -655,58 +738,7 @@ export default class SpecialVisualizations {
}) })
} }
}, },
{ new CloseNoteButton(),
funcName: "close_note",
docs: "Button to close a note. A predifined text can be defined to close the note with. If the note is already closed, will show a small text.",
args: [
{
name: "text",
doc: "Text to show on this button",
},
{
name: "icon",
doc: "Icon to show",
defaultValue: "checkmark.svg"
},
{
name: "Id-key",
doc: "The property name where the ID of the note to close can be found",
defaultValue: "id"
},
{
name: "comment",
doc: "Text to add onto the note when closing",
}
],
constr: (state, tags, args) => {
const t = Translations.t.notes;
let icon = Svg.checkmark_svg()
if (args[1] !== "checkmark.svg" && (args[2] ?? "") !== "") {
icon = new Img(args[1])
}
let textToShow = t.closeNote;
if ((args[0] ?? "") !== "") {
textToShow = Translations.T(args[0])
}
const closeButton = new SubtleButton(icon, textToShow)
const isClosed = tags.map(tags => (tags["closed_at"] ?? "") !== "");
closeButton.onClick(() => {
const id = tags.data[args[2] ?? "id"]
state.osmConnection.closeNote(id, args[3])
?.then(_ => {
tags.data["closed_at"] = new Date().toISOString();
tags.ping()
})
})
return new LoginToggle(new Toggle(
t.isClosed.SetClass("thanks"),
closeButton,
isClosed
), t.loginToClose, state)
}
},
{ {
funcName: "add_note_comment", funcName: "add_note_comment",
docs: "A textfield to add a comment to a node (with the option to close the note).", docs: "A textfield to add a comment to a node (with the option to close the note).",
@ -778,7 +810,7 @@ export default class SpecialVisualizations {
new Title("Add a comment"), new Title("Add a comment"),
textField, textField,
new Combine([ new Combine([
new Toggle(addCommentButton, undefined, textField.GetValue().map(t => t !==undefined && t.length > 1)).SetClass("mr-2") new Toggle(addCommentButton, undefined, textField.GetValue().map(t => t !== undefined && t.length > 1)).SetClass("mr-2")
, stateButtons]).SetClass("flex justify-end") , stateButtons]).SetClass("flex justify-end")
]).SetClass("border-2 border-black rounded-xl p-4 block"), ]).SetClass("border-2 border-black rounded-xl p-4 block"),
t.loginToAddComment, state) t.loginToAddComment, state)
@ -860,15 +892,15 @@ export default class SpecialVisualizations {
}, },
{ {
funcName:"title", funcName: "title",
args: [], args: [],
docs:"Shows the title of the popup. Useful for some cases, e.g. 'What is phone number of {title()}?'", docs: "Shows the title of the popup. Useful for some cases, e.g. 'What is phone number of {title()}?'",
example:"`What is the phone number of {title()}`, which might automatically become `What is the phone number of XYZ`.", example: "`What is the phone number of {title()}`, which might automatically become `What is the phone number of XYZ`.",
constr: (state, tagsSource, args, guistate) => constr: (state, tagsSource, args, guistate) =>
new VariableUiElement(tagsSource.map(tags => { new VariableUiElement(tagsSource.map(tags => {
const layer = state.layoutToUse.getMatchingLayer(tags) const layer = state.layoutToUse.getMatchingLayer(tags)
const title = layer?.title?.GetRenderValue(tags) const title = layer?.title?.GetRenderValue(tags)
if(title === undefined){ if (title === undefined) {
return undefined return undefined
} }
return new SubstitutedTranslation(title, tagsSource, state) return new SubstitutedTranslation(title, tagsSource, state)

8868
assets/svg/duplicate.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 273 KiB

View file

@ -381,6 +381,14 @@
"https://commons.wikimedia.org/wiki/File:Download-icon.svg" "https://commons.wikimedia.org/wiki/File:Download-icon.svg"
] ]
}, },
{
"path": "duplicate.svg",
"license": "CC0",
"authors": [
"Pieter Vander Vennet"
],
"sources": []
},
{ {
"path": "envelope.svg", "path": "envelope.svg",
"license": "CC0; trivial", "license": "CC0; trivial",