Add theme for 'notes'

This commit is contained in:
Pieter Vander Vennet 2022-01-08 04:22:50 +01:00
parent 677a07e3d2
commit a58ce564c2
20 changed files with 678 additions and 314 deletions

View file

@ -4,6 +4,7 @@ import {FeatureSourceForLayer, Tiled} from "../FeatureSource";
import Hash from "../../Web/Hash";
import {BBox} from "../../BBox";
import {ElementStorage} from "../../ElementStorage";
import {TagsFilter} from "../../Tags/TagsFilter";
export default class FilteringFeatureSource implements FeatureSourceForLayer, Tiled {
public features: UIEventSource<{ feature: any; freshness: Date }[]> =
@ -87,10 +88,10 @@ export default class FilteringFeatureSource implements FeatureSourceForLayer, Ti
}
}
const tagsFilter = layer.appliedFilters.data;
const tagsFilter = Array.from(layer.appliedFilters.data.values());
for (const filter of tagsFilter ?? []) {
const neededTags = filter.filter.options[filter.selected].osmTags
if (!neededTags.matchesProperties(f.feature.properties)) {
const neededTags : TagsFilter = filter?.currentFilter
if (neededTags !== undefined && !neededTags.matchesProperties(f.feature.properties)) {
// Hidden by the filter on the layer itself - we want to hide it no matter wat
return false;
}

View file

@ -218,13 +218,58 @@ export class OsmConnection {
});
}
public closeNote(id: number | string): Promise<any> {
public closeNote(id: number | string, text?: string): Promise<any> {
let textSuffix = ""
if((text ?? "") !== "" ){
textSuffix = "?text="+encodeURIComponent(text)
}
return new Promise((ok, error) => {
this.auth.xhr({
method: 'POST',
path: `/api/0.6/notes/${id}/close`
path: `/api/0.6/notes/${id}/close${textSuffix}`
}, function (err, response) {
if (err !== null) {
error(err)
} else {
ok()
}
})
})
}
public reopenNote(id: number | string, text?: string): Promise<any> {
let textSuffix = ""
if((text ?? "") !== "" ){
textSuffix = "?text="+encodeURIComponent(text)
}
return new Promise((ok, error) => {
this.auth.xhr({
method: 'POST',
path: `/api/0.6/notes/${id}/reopen${textSuffix}`
}, function (err, response) {
if (err !== null) {
error(err)
} else {
ok()
}
})
})
}
public addCommentToNode(id: number | string, text: string): Promise<any> {
if ((text ?? "") === "") {
throw "Invalid text!"
}
return new Promise((ok, error) => {
this.auth.xhr({
method: 'POST',
path: `/api/0.6/notes/${id}/comment?text=${encodeURIComponent(text)}`
}, function (err, response) {
console.log("Closing note gave:", err, response)
if (err !== null) {
error(err)
} else {

View file

@ -7,11 +7,10 @@ import Attribution from "../../UI/BigComponents/Attribution";
import Minimap, {MinimapObj} from "../../UI/Base/Minimap";
import {Tiles} from "../../Models/TileRange";
import BaseUIElement from "../../UI/BaseUIElement";
import FilteredLayer from "../../Models/FilteredLayer";
import FilteredLayer, {FilterState} from "../../Models/FilteredLayer";
import TilesourceConfig from "../../Models/ThemeConfig/TilesourceConfig";
import {QueryParameters} from "../Web/QueryParameters";
import * as personal from "../../assets/themes/personal/personal.json";
import FilterConfig from "../../Models/ThemeConfig/FilterConfig";
import ShowOverlayLayer from "../../UI/ShowDataLayer/ShowOverlayLayer";
import {FeatureSourceForLayer, Tiled} from "../FeatureSource/FeatureSource";
import SimpleFeatureSource from "../FeatureSource/Sources/SimpleFeatureSource";
@ -339,7 +338,6 @@ export default class MapState extends UserRelatedState {
private InitializeFilteredLayers() {
const layoutToUse = this.layoutToUse;
const empty = []
const flayers: FilteredLayer[] = [];
for (const layer of layoutToUse.layers) {
let isDisplayed: UIEventSource<boolean>
@ -355,26 +353,18 @@ export default class MapState extends UserRelatedState {
"Wether or not layer " + layer.id + " is shown"
)
}
const flayer = {
const flayer : FilteredLayer = {
isDisplayed: isDisplayed,
layerDef: layer,
appliedFilters: new UIEventSource<{ filter: FilterConfig, selected: number }[]>([]),
appliedFilters: new UIEventSource<Map<string, FilterState>>(new Map<string, FilterState>())
};
if (layer.filters.length > 0) {
const filtersPerName = new Map<string, FilterConfig>()
layer.filters.forEach(f => filtersPerName.set(f.id, f))
const qp = QueryParameters.GetQueryParameter("filter-" + layer.id, "", "Filtering state for a layer")
flayer.appliedFilters.map(filters => (filters ?? []).map(f => f.filter.id + "." + f.selected).join(","), [], textual => {
if (textual.length === 0) {
return empty
}
return textual.split(",").map(part => {
const [filterId, selected] = part.split(".");
return {filter: filtersPerName.get(filterId), selected: Number(selected)}
}).filter(f => f.filter !== undefined && !isNaN(f.selected))
}).syncWith(qp, true)
}
layer.filters.forEach(filterConfig => {
const stateSrc = filterConfig.initState()
stateSrc .addCallbackAndRun(state => flayer.appliedFilters.data.set(filterConfig.id, state))
flayer.appliedFilters.map(dict => dict.get(filterConfig.id))
.addCallback(state => stateSrc.setData(state))
})
flayers.push(flayer);
}