forked from MapComplete/MapComplete
Further translations of the import helper
This commit is contained in:
parent
8e2e227563
commit
0d81decdc7
6 changed files with 105 additions and 22 deletions
|
@ -39,6 +39,39 @@ export class AddContextToTranslations<T> extends DesugaringStep<T> {
|
||||||
* }
|
* }
|
||||||
* rewritten // => expected
|
* rewritten // => expected
|
||||||
*
|
*
|
||||||
|
* // should use the ID if one is present instead of the index
|
||||||
|
* const theme = {
|
||||||
|
* layers: [
|
||||||
|
* {
|
||||||
|
* tagRenderings:[
|
||||||
|
*
|
||||||
|
* {id: "some-tr",
|
||||||
|
* question:{
|
||||||
|
* en:"Question?"
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* const rewritten = new AddContextToTranslations<any>("prefix:").convert(theme, "context").result
|
||||||
|
* const expected = {
|
||||||
|
* layers: [
|
||||||
|
* {
|
||||||
|
* tagRenderings:[
|
||||||
|
*
|
||||||
|
* {id: "some-tr",
|
||||||
|
* question:{
|
||||||
|
* _context: "prefix:context.layers.0.tagRenderings.some-tr.question"
|
||||||
|
* en:"Question?"
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* rewritten // => expected
|
||||||
|
*
|
||||||
* // should preserve nulls
|
* // should preserve nulls
|
||||||
* const theme = {
|
* const theme = {
|
||||||
* layers: [
|
* layers: [
|
||||||
|
@ -70,6 +103,17 @@ export class AddContextToTranslations<T> extends DesugaringStep<T> {
|
||||||
return leaf
|
return leaf
|
||||||
}
|
}
|
||||||
if (typeof leaf === "object") {
|
if (typeof leaf === "object") {
|
||||||
|
|
||||||
|
// follow the path. If we encounter a number, check that there is no ID we can use instead
|
||||||
|
let breadcrumb = json;
|
||||||
|
for (let i = 0; i < path.length; i++) {
|
||||||
|
const pointer = path[i]
|
||||||
|
breadcrumb = breadcrumb[pointer]
|
||||||
|
if(pointer.match("[0-9]+") && breadcrumb["id"] !== undefined){
|
||||||
|
path[i] = breadcrumb["id"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return {...leaf, _context: this._prefix + context + "." + path.join(".")}
|
return {...leaf, _context: this._prefix + context + "." + path.join(".")}
|
||||||
} else {
|
} else {
|
||||||
return leaf
|
return leaf
|
||||||
|
|
|
@ -7,7 +7,6 @@ import {UIEventSource} from "../../Logic/UIEventSource";
|
||||||
import Constants from "../../Models/Constants";
|
import Constants from "../../Models/Constants";
|
||||||
import RelationsTracker from "../../Logic/Osm/RelationsTracker";
|
import RelationsTracker from "../../Logic/Osm/RelationsTracker";
|
||||||
import {VariableUiElement} from "../Base/VariableUIElement";
|
import {VariableUiElement} from "../Base/VariableUIElement";
|
||||||
import {FixedUiElement} from "../Base/FixedUiElement";
|
|
||||||
import {FlowStep} from "./FlowStep";
|
import {FlowStep} from "./FlowStep";
|
||||||
import Loading from "../Base/Loading";
|
import Loading from "../Base/Loading";
|
||||||
import {SubtleButton} from "../Base/SubtleButton";
|
import {SubtleButton} from "../Base/SubtleButton";
|
||||||
|
@ -28,6 +27,7 @@ import * as import_candidate from "../../assets/layers/import_candidate/import_c
|
||||||
import {GeoOperations} from "../../Logic/GeoOperations";
|
import {GeoOperations} from "../../Logic/GeoOperations";
|
||||||
import FeatureInfoBox from "../Popup/FeatureInfoBox";
|
import FeatureInfoBox from "../Popup/FeatureInfoBox";
|
||||||
import {ImportUtils} from "./ImportUtils";
|
import {ImportUtils} from "./ImportUtils";
|
||||||
|
import Translations from "../i18n/Translations";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given the data to import, the bbox and the layer, will query overpass for similar items
|
* Given the data to import, the bbox and the layer, will query overpass for similar items
|
||||||
|
@ -190,6 +190,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
|
||||||
features: toImportWithNearby
|
features: toImportWithNearby
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const t = Translations.t.importHelper.conflationChecker
|
||||||
|
|
||||||
const conflationMaps = new Combine([
|
const conflationMaps = new Combine([
|
||||||
new VariableUiElement(
|
new VariableUiElement(
|
||||||
|
@ -197,7 +198,7 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
|
||||||
if (geojson === undefined) {
|
if (geojson === undefined) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
return new SubtleButton(Svg.download_svg(), "Download the loaded geojson from overpass").onClick(() => {
|
return new SubtleButton(Svg.download_svg(), t.downloadOverpassData).onClick(() => {
|
||||||
Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson, null, " "), "mapcomplete-" + layer.id + ".geojson", {
|
Utils.offerContentsAsDownloadableFile(JSON.stringify(geojson, null, " "), "mapcomplete-" + layer.id + ".geojson", {
|
||||||
mimetype: "application/json+geo"
|
mimetype: "application/json+geo"
|
||||||
})
|
})
|
||||||
|
@ -208,43 +209,53 @@ export default class ConflationChecker extends Combine implements FlowStep<{ fea
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
if (age < 0) {
|
if (age < 0) {
|
||||||
return new FixedUiElement("Cache was expired")
|
return t.cacheExpired
|
||||||
}
|
}
|
||||||
return new FixedUiElement("Loaded data is from the cache and is " + Utils.toHumanTime(age) + " old")
|
return t.loadedDataAge.Subs({age: Utils.toHumanTime(age)})
|
||||||
})),
|
})),
|
||||||
|
|
||||||
new Title("Live data on OSM"),
|
new Title(t.titleLive),
|
||||||
"The "+toImport.features.length+" red elements on the following map are all your import candidates.",
|
t.importCandidatesCount.Subs({count:toImport.features.length }),
|
||||||
new VariableUiElement(geojson.map(geojson => new FixedUiElement((geojson?.features?.length ?? "No") + " elements are loaded from OpenStreetMap which match the layer "+layer.id+". Zooming in might be needed to show them"))),
|
new VariableUiElement(geojson.map(geojson => {
|
||||||
osmLiveData,
|
if(geojson?.features?.length === undefined && geojson?.features?.length === 0){
|
||||||
new Combine(["The live data is shown if the zoomlevel is at least ", zoomLevel, ". The current zoom level is ", new VariableUiElement(osmLiveData.location.map(l => "" + l.zoom))]).SetClass("flex"),
|
return t.nothingLoaded.Subs(layer).SetClass("alert")
|
||||||
|
}
|
||||||
|
return new Combine([
|
||||||
|
t.osmLoaded.Subs({count: geojson.features.length, name: layer.name}),
|
||||||
|
|
||||||
new Title("Nearby features"),
|
])
|
||||||
new Combine(["The following map shows features to import which have an OSM-feature within ", nearbyCutoff, "meter"]).SetClass("flex"),
|
})),
|
||||||
|
osmLiveData,
|
||||||
|
new VariableUiElement(osmLiveData.location.map(location => {
|
||||||
|
return t.zoomIn.Subs({needed:zoomLevel, current: location.zoom })
|
||||||
|
} )),
|
||||||
|
new Title(t.titleNearby),
|
||||||
|
new Combine([t.mapShowingNearbyIntro, nearbyCutoff]).SetClass("flex"),
|
||||||
new VariableUiElement(toImportWithNearby.features.map(feats =>
|
new VariableUiElement(toImportWithNearby.features.map(feats =>
|
||||||
new FixedUiElement("The "+ feats.length +" red elements on the following map will <b>not</b> be imported!").SetClass("alert"))),
|
t.nearbyWarn.Subs({count: feats.length}).SetClass("alert"))),
|
||||||
"Set the range to 0 or 1 if you want to import them all",
|
,t.setRangeToZero,
|
||||||
matchedFeaturesMap]).SetClass("flex flex-col")
|
matchedFeaturesMap]).SetClass("flex flex-col")
|
||||||
|
|
||||||
super([
|
super([
|
||||||
new Title("Comparison with existing data"),
|
new Title(t.title),
|
||||||
new VariableUiElement(overpassStatus.map(d => {
|
new VariableUiElement(overpassStatus.map(d => {
|
||||||
if (d === "idle") {
|
if (d === "idle") {
|
||||||
return new Loading("Checking local storage...")
|
return new Loading(t.states.idle)
|
||||||
}
|
|
||||||
if (d["error"] !== undefined) {
|
|
||||||
return new FixedUiElement("Could not load latest data from overpass: " + d["error"]).SetClass("alert")
|
|
||||||
}
|
}
|
||||||
if (d === "running") {
|
if (d === "running") {
|
||||||
return new Loading("Querying overpass...")
|
return new Loading(t.states.running)
|
||||||
}
|
}
|
||||||
|
if (d["error"] !== undefined) {
|
||||||
|
return t.states.error.Subs(d).SetClass("alert")
|
||||||
|
}
|
||||||
|
|
||||||
if (d === "cached") {
|
if (d === "cached") {
|
||||||
return conflationMaps
|
return conflationMaps
|
||||||
}
|
}
|
||||||
if (d === "success") {
|
if (d === "success") {
|
||||||
return conflationMaps
|
return conflationMaps
|
||||||
}
|
}
|
||||||
return new FixedUiElement("Unexpected state " + d).SetClass("alert")
|
return t.states.unexpected.Subs({state: d}).SetClass("alert")
|
||||||
}))
|
}))
|
||||||
|
|
||||||
])
|
])
|
||||||
|
|
|
@ -36,7 +36,7 @@ export default class ImportHelperGui extends LeftIndex {
|
||||||
.then(t.mapPreview, geojson => new MapPreview(state, geojson))
|
.then(t.mapPreview, geojson => new MapPreview(state, geojson))
|
||||||
.then(t.selectTheme, v => new SelectTheme(v))
|
.then(t.selectTheme, v => new SelectTheme(v))
|
||||||
.then(t.compareToAlreadyExistingNotes, v => new CompareToAlreadyExistingNotes(state, v))
|
.then(t.compareToAlreadyExistingNotes, v => new CompareToAlreadyExistingNotes(state, v))
|
||||||
.then("Compare with existing data", v => new ConflationChecker(state, v))
|
.then(t.conflationChecker, v => new ConflationChecker(state, v))
|
||||||
.then(t.confirmProcess, v => new ConfirmProcess(v))
|
.then(t.confirmProcess, v => new ConfirmProcess(v))
|
||||||
.then(t.askMetadata, (v) => new AskMetadata(v))
|
.then(t.askMetadata, (v) => new AskMetadata(v))
|
||||||
.finish(t.createNotes.title, v => new CreateNotes(state, v));
|
.finish(t.createNotes.title, v => new CreateNotes(state, v));
|
||||||
|
|
|
@ -9,7 +9,8 @@ export default class InputElementWrapper<T> extends InputElement<T> {
|
||||||
private readonly _inputElement: InputElement<T>;
|
private readonly _inputElement: InputElement<T>;
|
||||||
private readonly _renderElement: BaseUIElement
|
private readonly _renderElement: BaseUIElement
|
||||||
|
|
||||||
constructor(inputElement: InputElement<T>, translation: Translation, key: string, tags: UIEventSource<any>, state: FeaturePipelineState) {
|
constructor(inputElement: InputElement<T>, translation: Translation, key: string,
|
||||||
|
tags: UIEventSource<any>, state: FeaturePipelineState) {
|
||||||
super()
|
super()
|
||||||
this._inputElement = inputElement;
|
this._inputElement = inputElement;
|
||||||
const mapping = new Map<string, BaseUIElement>()
|
const mapping = new Map<string, BaseUIElement>()
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
[
|
[
|
||||||
|
{
|
||||||
|
"start_date": "2022-05-30",
|
||||||
|
"end_date":"2022-06-05",
|
||||||
|
"message": "The 3rd of June is <b><a href='https://en.wikipedia.org/wiki/World_Bicycle_Day'>World Bicycle Day</a></b>. Go find a bike shop or bike pump nearby",
|
||||||
|
"featured_theme": "cyclofix"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"start_date": "2022-04-18",
|
"start_date": "2022-04-18",
|
||||||
"end_date": "2022-04-24",
|
"end_date": "2022-04-24",
|
||||||
|
|
|
@ -310,6 +310,27 @@
|
||||||
"titleLong": "Did you go through the import process?",
|
"titleLong": "Did you go through the import process?",
|
||||||
"wikipageIsMade": "The process is documented on the OSM-wiki (you'll need this link later)"
|
"wikipageIsMade": "The process is documented on the OSM-wiki (you'll need this link later)"
|
||||||
},
|
},
|
||||||
|
"conflationChecker": {
|
||||||
|
"cacheExpired": "Cache was expired",
|
||||||
|
"downloadOverpassData": "Download the loaded geojson from overpass",
|
||||||
|
"importCandidatesCount": "The {count} red elements on the following map are all your import candidates.",
|
||||||
|
"loadedDataAge": "Loaded data is from the cache and is {age} old",
|
||||||
|
"mapShowingNearbyIntro": "The following map shows features to import which have an OSM-feature within ",
|
||||||
|
"nearbyWarn": "The {count} red elements on the following map will <b>not</b> be imported!",
|
||||||
|
"nothingLoaded": "No elements are loaded from OpenStreetMap which match the current layer {name}",
|
||||||
|
"osmLoaded": "{count} elements are loaded from OpenStreetMap which match the layer <b>{name}</b>.",
|
||||||
|
"setRangeToZero": "Set the range to 0 or 1 if you want to import them all",
|
||||||
|
"states": {
|
||||||
|
"error": "Could not load latest data from overpass due to {error}",
|
||||||
|
"idle": "Checking local storage...",
|
||||||
|
"running": "Querying overpass...",
|
||||||
|
"unexpected": "Unexpected state {state}"
|
||||||
|
},
|
||||||
|
"title": "Compare with existing data",
|
||||||
|
"titleLive": "Live data on OSM",
|
||||||
|
"titleNearby": "Nearby features",
|
||||||
|
"zoomIn": "The live data is shown if the zoomlevel is at least {needed}. The current zoom level is {current}"
|
||||||
|
},
|
||||||
"createNotes": {
|
"createNotes": {
|
||||||
"creating": "Created <b>{count}</b> notes out of {total}",
|
"creating": "Created <b>{count}</b> notes out of {total}",
|
||||||
"done": "All {count} notes have been created!",
|
"done": "All {count} notes have been created!",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue