Merge branch 'master' into develop
This commit is contained in:
commit
e797e1dcbc
12 changed files with 170 additions and 254 deletions
|
@ -392,7 +392,7 @@ export class ChangesetHandler {
|
|||
return [
|
||||
["created_by", `MapComplete ${Constants.vNumber}`],
|
||||
["locale", Locale.language.data],
|
||||
["host", `${window.location.origin}${window.location.pathname}`],
|
||||
["host", `${window.location.origin}${window.location.pathname}`], // Note: deferred changes might give a different hostpath then the theme with which the changes were made
|
||||
["source", setSourceAsSurvey ? "survey" : undefined],
|
||||
["imagery", this.changes.state["backgroundLayer"]?.data?.id],
|
||||
].map(([key, value]) => ({
|
||||
|
|
|
@ -36,7 +36,7 @@ export default class FilteredLayer {
|
|||
constructor(
|
||||
layer: LayerConfig,
|
||||
appliedFilters?: ReadonlyMap<string, UIEventSource<undefined | number | string>>,
|
||||
isDisplayed?: UIEventSource<boolean>
|
||||
isDisplayed?: UIEventSource<boolean>,
|
||||
) {
|
||||
this.layerDef = layer
|
||||
this.isDisplayed = isDisplayed ?? new UIEventSource(true)
|
||||
|
@ -82,25 +82,25 @@ export default class FilteredLayer {
|
|||
layer: LayerConfig,
|
||||
context: string,
|
||||
osmConnection: OsmConnection,
|
||||
enabledByDefault?: Store<boolean>
|
||||
enabledByDefault?: Store<boolean>,
|
||||
) {
|
||||
let isDisplayed: UIEventSource<boolean>
|
||||
if (layer.syncSelection === "local") {
|
||||
isDisplayed = LocalStorageSource.GetParsed(
|
||||
context + "-layer-" + layer.id + "-enabled",
|
||||
layer.shownByDefault
|
||||
layer.shownByDefault,
|
||||
)
|
||||
} else if (layer.syncSelection === "theme-only") {
|
||||
isDisplayed = FilteredLayer.getPref(
|
||||
osmConnection,
|
||||
context + "-layer-" + layer.id + "-enabled",
|
||||
layer
|
||||
layer,
|
||||
)
|
||||
} else if (layer.syncSelection === "global") {
|
||||
isDisplayed = FilteredLayer.getPref(
|
||||
osmConnection,
|
||||
"layer-" + layer.id + "-enabled",
|
||||
layer
|
||||
layer,
|
||||
)
|
||||
} else {
|
||||
let isShown = layer.shownByDefault
|
||||
|
@ -110,7 +110,7 @@ export default class FilteredLayer {
|
|||
isDisplayed = QueryParameters.GetBooleanQueryParameter(
|
||||
FilteredLayer.queryParameterKey(layer),
|
||||
isShown,
|
||||
"Whether or not layer " + layer.id + " is shown"
|
||||
"Whether or not layer " + layer.id + " is shown",
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -134,13 +134,18 @@ export default class FilteredLayer {
|
|||
/**
|
||||
* import Translations from "../UI/i18n/Translations"
|
||||
* import { RegexTag } from "../Logic/Tags/RegexTag"
|
||||
* import { ComparingTag } from "../Logic/Tags/ComparingTag"
|
||||
*
|
||||
* const option: FilterConfigOption = {question: Translations.T("question"), osmTags: undefined, originalTagsSpec: "key~.*{search}.*", fields: [{name: "search", type: "string"}] }
|
||||
* FilteredLayer.fieldsToTags(option, {search: "value_regex"}) // => new RegexTag("key", /^(.*(value_regex).*)$/s)
|
||||
*
|
||||
* const option: FilterConfigOption = {question: Translations.T("question"), searchTerms: undefined, osmTags: undefined, originalTagsSpec: "edit_time>{search}", fields: [{name: "search", type: "date"}] }
|
||||
* const comparingTag = FilteredLayer.fieldsToTags(option, {search: "2024-09-20"})
|
||||
* comparingTag.asJson() // => "edit_time>1726790400000"
|
||||
*/
|
||||
private static fieldsToTags(
|
||||
option: FilterConfigOption,
|
||||
fieldstate: string | Record<string, string>
|
||||
fieldstate: string | Record<string, string>,
|
||||
): TagsFilter | undefined {
|
||||
let properties: Record<string, string>
|
||||
if (typeof fieldstate === "string") {
|
||||
|
@ -160,7 +165,12 @@ export default class FilteredLayer {
|
|||
}
|
||||
|
||||
for (const key in properties) {
|
||||
v = (<string>v).replace("{" + key + "}", "(" + properties[key] + ")")
|
||||
const needsParentheses = v.match(/[a-zA-Z0-9_:]+~/)
|
||||
if (needsParentheses) {
|
||||
v = (<string>v).replace("{" + key + "}", "(" + properties[key] + ")")
|
||||
} else {
|
||||
v = (<string>v).replace("{" + key + "}", properties[key])
|
||||
}
|
||||
}
|
||||
|
||||
return v
|
||||
|
@ -171,7 +181,7 @@ export default class FilteredLayer {
|
|||
private static getPref(
|
||||
osmConnection: OsmConnection,
|
||||
key: string,
|
||||
layer: LayerConfig
|
||||
layer: LayerConfig,
|
||||
): UIEventSource<boolean> {
|
||||
return osmConnection.GetPreference(key, layer.shownByDefault + "").sync(
|
||||
(v) => {
|
||||
|
@ -186,7 +196,7 @@ export default class FilteredLayer {
|
|||
return undefined
|
||||
}
|
||||
return "" + b
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ export abstract class Validator {
|
|||
}
|
||||
|
||||
public getPlaceholder() {
|
||||
return Translations.t.validation[this.name].description
|
||||
return Translations.t.validation[this.name]?.description
|
||||
}
|
||||
|
||||
public isValid(_: string, getCountry?: () => string): boolean {
|
||||
|
|
|
@ -18,7 +18,7 @@ import Filterview from "./BigComponents/Filterview.svelte"
|
|||
import FilteredLayer from "../Models/FilteredLayer"
|
||||
import { SubtleButton } from "./Base/SubtleButton"
|
||||
import { GeoOperations } from "../Logic/GeoOperations"
|
||||
import { Polygon } from "geojson"
|
||||
import { FeatureCollection, Polygon } from "geojson"
|
||||
import { Feature } from "geojson"
|
||||
|
||||
class StatsticsForOverviewFile extends Combine {
|
||||
|
@ -30,7 +30,9 @@ class StatsticsForOverviewFile extends Combine {
|
|||
new Title("Filters"),
|
||||
new SvelteUIElement(Filterview, { filteredLayer }),
|
||||
])
|
||||
|
||||
filteredLayer.currentFilter.addCallbackAndRun(tf => {
|
||||
console.log("Filters are", tf)
|
||||
})
|
||||
const downloaded = new UIEventSource<{ features: ChangeSetData[] }[]>([])
|
||||
|
||||
for (const filepath of paths) {
|
||||
|
|
|
@ -39,16 +39,20 @@
|
|||
}
|
||||
|
||||
function fusePath(subpartPath: string[]): (string | number)[] {
|
||||
const newPath = [...path]
|
||||
const toAdd = [...subpartPath]
|
||||
for (const part of path) {
|
||||
if (toAdd[0] === part) {
|
||||
toAdd.splice(0, 1)
|
||||
} else {
|
||||
break
|
||||
const newPath = [...path] // has indices, e.g. ["A", 1, "B", "C", 2]
|
||||
const toAdd = [...subpartPath] // doesn't have indices, e.g. ["A", "B", "C", "D"]
|
||||
|
||||
let indexInToAdd = 0
|
||||
for (let i = 0; i < newPath.length; i++) {
|
||||
if(newPath[i] === toAdd[indexInToAdd]){
|
||||
indexInToAdd ++
|
||||
}
|
||||
}
|
||||
newPath.push(...toAdd)
|
||||
|
||||
// indexToAdd should now point to the last common index, '2' in the example
|
||||
const resting = toAdd.slice(indexInToAdd)
|
||||
|
||||
newPath.push(...resting)
|
||||
return newPath
|
||||
}
|
||||
|
||||
|
|
|
@ -204,7 +204,7 @@ export abstract class EditJsonState<T> {
|
|||
|
||||
for (let i = 0; i < path.length - 1; i++) {
|
||||
const breadcrumb = path[i]
|
||||
if (entry[breadcrumb] === undefined) {
|
||||
if (entry[breadcrumb] === undefined || entry[breadcrumb] === null) {
|
||||
if (isUndefined) {
|
||||
// we have a dead end _and_ we do not need to set a value - we do an early return
|
||||
return
|
||||
|
|
|
@ -105,7 +105,7 @@
|
|||
</div>
|
||||
{/each}
|
||||
{:else}
|
||||
<Accordion>
|
||||
<Accordion> <!-- The CollapsedTagRenderingPreview contains the accordeon items -->
|
||||
{#each $currentValue as value, i}
|
||||
<CollapsedTagRenderingPreview
|
||||
{state}
|
||||
|
|
|
@ -107,6 +107,7 @@
|
|||
placeholder="The key of the tag"
|
||||
type="key"
|
||||
value={keyValue}
|
||||
autofocus
|
||||
on:submit
|
||||
/>
|
||||
<select
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue