forked from MapComplete/MapComplete
Refactoring: split AndOrTagConfigJson into an AndTagConfig and an OrTagConfig
This commit is contained in:
parent
e225b8e45b
commit
9ae40d8af2
10 changed files with 41 additions and 32 deletions
|
@ -6,12 +6,11 @@ import ComparingTag from "./ComparingTag";
|
||||||
import {RegexTag} from "./RegexTag";
|
import {RegexTag} from "./RegexTag";
|
||||||
import SubstitutingTag from "./SubstitutingTag";
|
import SubstitutingTag from "./SubstitutingTag";
|
||||||
import {Or} from "./Or";
|
import {Or} from "./Or";
|
||||||
import {AndOrTagConfigJson} from "../../Models/ThemeConfig/Json/TagConfigJson";
|
import {TagConfigJson} from "../../Models/ThemeConfig/Json/TagConfigJson";
|
||||||
import {isRegExp} from "util";
|
import {isRegExp} from "util";
|
||||||
import * as key_counts from "../../assets/key_totals.json"
|
import * as key_counts from "../../assets/key_totals.json"
|
||||||
|
|
||||||
type Tags = Record<string, string>
|
type Tags = Record<string, string>
|
||||||
type OsmTags = Tags & {id: string}
|
|
||||||
|
|
||||||
export class TagUtils {
|
export class TagUtils {
|
||||||
private static keyCounts: { keys: any, tags: any } = key_counts["default"] ?? key_counts
|
private static keyCounts: { keys: any, tags: any } = key_counts["default"] ?? key_counts
|
||||||
|
@ -249,7 +248,7 @@ export class TagUtils {
|
||||||
* // Must match case insensitive
|
* // Must match case insensitive
|
||||||
* TagUtils.Tag("name~i~somename").matchesProperties({name: "SoMeName"}) // => true
|
* TagUtils.Tag("name~i~somename").matchesProperties({name: "SoMeName"}) // => true
|
||||||
*/
|
*/
|
||||||
public static Tag(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
|
public static Tag(json: TagConfigJson, context: string = ""): TagsFilter {
|
||||||
try {
|
try {
|
||||||
return this.TagUnsafe(json, context);
|
return this.TagUnsafe(json, context);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -308,20 +307,20 @@ export class TagUtils {
|
||||||
return {key, value, invert: invert == "!", modifier: (modifier == "i~" ? "i" : "")};
|
return {key, value, invert: invert == "!", modifier: (modifier == "i~" ? "i" : "")};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TagUnsafe(json: AndOrTagConfigJson | string, context: string = ""): TagsFilter {
|
private static TagUnsafe(json: TagConfigJson, context: string = ""): TagsFilter {
|
||||||
|
|
||||||
if (json === undefined) {
|
if (json === undefined) {
|
||||||
throw new Error(`Error while parsing a tag: 'json' is undefined in ${context}. Make sure all the tags are defined and at least one tag is present in a complex expression`)
|
throw new Error(`Error while parsing a tag: 'json' is undefined in ${context}. Make sure all the tags are defined and at least one tag is present in a complex expression`)
|
||||||
}
|
}
|
||||||
if (typeof (json) != "string") {
|
if (typeof (json) != "string") {
|
||||||
if (json.and !== undefined && json.or !== undefined) {
|
if (json["and"] !== undefined && json["or"] !== undefined) {
|
||||||
throw `Error while parsing a TagConfig: got an object where both 'and' and 'or' are defined`
|
throw `Error while parsing a TagConfig: got an object where both 'and' and 'or' are defined`
|
||||||
}
|
}
|
||||||
if (json.and !== undefined) {
|
if (json["and"] !== undefined) {
|
||||||
return new And(json.and.map(t => TagUtils.Tag(t, context)));
|
return new And(json["and"].map(t => TagUtils.Tag(t, context)));
|
||||||
}
|
}
|
||||||
if (json.or !== undefined) {
|
if (json["or"] !== undefined) {
|
||||||
return new Or(json.or.map(t => TagUtils.Tag(t, context)));
|
return new Or(json["or"].map(t => TagUtils.Tag(t, context)));
|
||||||
}
|
}
|
||||||
throw "At " + context + ": unrecognized tag"
|
throw "At " + context + ": unrecognized tag"
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import FilterConfigJson from "./Json/FilterConfigJson";
|
||||||
import Translations from "../../UI/i18n/Translations";
|
import Translations from "../../UI/i18n/Translations";
|
||||||
import {TagUtils} from "../../Logic/Tags/TagUtils";
|
import {TagUtils} from "../../Logic/Tags/TagUtils";
|
||||||
import ValidatedTextField from "../../UI/Input/ValidatedTextField";
|
import ValidatedTextField from "../../UI/Input/ValidatedTextField";
|
||||||
import {AndOrTagConfigJson} from "./Json/TagConfigJson";
|
import {TagConfigJson} from "./Json/TagConfigJson";
|
||||||
import {UIEventSource} from "../../Logic/UIEventSource";
|
import {UIEventSource} from "../../Logic/UIEventSource";
|
||||||
import {FilterState} from "../FilteredLayer";
|
import {FilterState} from "../FilteredLayer";
|
||||||
import {QueryParameters} from "../../Logic/Web/QueryParameters";
|
import {QueryParameters} from "../../Logic/Web/QueryParameters";
|
||||||
|
@ -16,7 +16,7 @@ export default class FilterConfig {
|
||||||
public readonly options: {
|
public readonly options: {
|
||||||
question: Translation;
|
question: Translation;
|
||||||
osmTags: TagsFilter | undefined;
|
osmTags: TagsFilter | undefined;
|
||||||
originalTagsSpec: string | AndOrTagConfigJson
|
originalTagsSpec: TagConfigJson
|
||||||
fields: { name: string, type: string }[]
|
fields: { name: string, type: string }[]
|
||||||
}[];
|
}[];
|
||||||
public readonly defaultSelection? : number
|
public readonly defaultSelection? : number
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {AndOrTagConfigJson} from "./TagConfigJson";
|
import {TagConfigJson} from "./TagConfigJson";
|
||||||
|
|
||||||
export default interface FilterConfigJson {
|
export default interface FilterConfigJson {
|
||||||
/**
|
/**
|
||||||
|
@ -13,7 +13,7 @@ export default interface FilterConfigJson {
|
||||||
*/
|
*/
|
||||||
options: {
|
options: {
|
||||||
question: string | any;
|
question: string | any;
|
||||||
osmTags?: AndOrTagConfigJson | string,
|
osmTags?: TagConfigJson,
|
||||||
default?: boolean,
|
default?: boolean,
|
||||||
fields?: {
|
fields?: {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
|
import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
|
||||||
import {AndOrTagConfigJson} from "./TagConfigJson";
|
import {TagConfigJson} from "./TagConfigJson";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The PointRenderingConfig gives all details onto how to render a single point of a feature.
|
* The PointRenderingConfig gives all details onto how to render a single point of a feature.
|
||||||
|
@ -39,7 +39,7 @@ export default interface PointRenderingConfigJson {
|
||||||
* Note: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle
|
* Note: strings are interpreted as icons, so layering and substituting is supported. You can use `circle:white;./my_icon.svg` to add a background circle
|
||||||
*/
|
*/
|
||||||
iconBadges?: {
|
iconBadges?: {
|
||||||
if: string | AndOrTagConfigJson,
|
if: TagConfigJson,
|
||||||
/**
|
/**
|
||||||
* Badge to show
|
* Badge to show
|
||||||
* Type: icon
|
* Type: icon
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {AndOrTagConfigJson} from "./TagConfigJson";
|
import {TagConfigJson} from "./TagConfigJson";
|
||||||
import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
|
import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ export interface MappingConfigJson {
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
*/
|
*/
|
||||||
if: AndOrTagConfigJson | string,
|
if: TagConfigJson,
|
||||||
/**
|
/**
|
||||||
* Shown if the 'if is fulfilled
|
* Shown if the 'if is fulfilled
|
||||||
* Type: rendered
|
* Type: rendered
|
||||||
|
@ -89,7 +89,7 @@ export interface MappingConfigJson {
|
||||||
* hideInAnswer: "_country!=be"
|
* hideInAnswer: "_country!=be"
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
hideInAnswer?: boolean | string | AndOrTagConfigJson,
|
hideInAnswer?: boolean | TagConfigJson,
|
||||||
/**
|
/**
|
||||||
* Only applicable if 'multiAnswer' is set.
|
* Only applicable if 'multiAnswer' is set.
|
||||||
* This is for situations such as:
|
* This is for situations such as:
|
||||||
|
@ -98,7 +98,7 @@ export interface MappingConfigJson {
|
||||||
* Note that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.
|
* Note that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.
|
||||||
* If this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`
|
* If this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`
|
||||||
*/
|
*/
|
||||||
ifnot?: AndOrTagConfigJson | string
|
ifnot?: TagConfigJson
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If chosen as answer, these tags will be applied as well onto the object.
|
* If chosen as answer, these tags will be applied as well onto the object.
|
||||||
|
@ -117,7 +117,7 @@ export interface MappingConfigJson {
|
||||||
* If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden
|
* If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden
|
||||||
* Use this sparingly
|
* Use this sparingly
|
||||||
*/
|
*/
|
||||||
priorityIf?: string | AndOrTagConfigJson
|
priorityIf?: TagConfigJson
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,22 @@
|
||||||
/**
|
/**
|
||||||
* A small interface to combine tags and tagsfilters.
|
* The main representation of Tags.
|
||||||
*
|
* See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation
|
||||||
|
*/
|
||||||
|
export type TagConfigJson = string | AndTagConfigJson | OrTagConfigJson
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chain many tags, to match, all of these should be true
|
||||||
* See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation
|
* See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation
|
||||||
*/
|
*/
|
||||||
export interface AndOrTagConfigJson {
|
export type OrTagConfigJson = {
|
||||||
and?: (string | AndOrTagConfigJson)[]
|
or: TagConfigJson[]
|
||||||
or?: (string | AndOrTagConfigJson)[]
|
}
|
||||||
}
|
/**
|
||||||
|
* Chain many tags, to match, a single of these should be true
|
||||||
|
* See https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for documentation
|
||||||
|
*/
|
||||||
|
export type AndTagConfigJson = {
|
||||||
|
and: TagConfigJson[]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {AndOrTagConfigJson} from "./TagConfigJson";
|
import {TagConfigJson} from "./TagConfigJson";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.
|
* A TagRenderingConfigJson is a single piece of code which converts one ore more tags into a HTML-snippet.
|
||||||
|
@ -39,7 +39,7 @@ export interface TagRenderingConfigJson {
|
||||||
*
|
*
|
||||||
* This is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...
|
* This is useful to ask a follow-up question. E.g. if there is a diaper table, then ask a follow-up question on diaper tables...
|
||||||
* */
|
* */
|
||||||
condition?: AndOrTagConfigJson | string;
|
condition?: TagConfigJson;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow freeform text input from the user
|
* Allow freeform text input from the user
|
||||||
|
@ -66,7 +66,7 @@ export interface TagRenderingConfigJson {
|
||||||
*
|
*
|
||||||
* This can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}
|
* This can be an substituting-tag as well, e.g. {'if': 'addr:street:={_calculated_nearby_streetname}', 'then': '{_calculated_nearby_streetname}'}
|
||||||
*/
|
*/
|
||||||
if: AndOrTagConfigJson | string,
|
if: TagConfigJson,
|
||||||
/**
|
/**
|
||||||
* If the condition `if` is met, the text `then` will be rendered.
|
* If the condition `if` is met, the text `then` will be rendered.
|
||||||
* If not known yet, the user will be presented with `then` as an option
|
* If not known yet, the user will be presented with `then` as an option
|
||||||
|
|
|
@ -71,7 +71,6 @@ export default class LineRenderingConfig extends WithContextLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
const fillStr = render(this.fill, undefined)
|
const fillStr = render(this.fill, undefined)
|
||||||
let fill: boolean = undefined;
|
|
||||||
if (fillStr !== undefined && fillStr !== "") {
|
if (fillStr !== undefined && fillStr !== "") {
|
||||||
style["fill"] = fillStr === "yes" || fillStr === "true"
|
style["fill"] = fillStr === "yes" || fillStr === "true"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import {TagsFilter} from "../../Logic/Tags/TagsFilter";
|
import {TagsFilter} from "../../Logic/Tags/TagsFilter";
|
||||||
import {RegexTag} from "../../Logic/Tags/RegexTag";
|
import {RegexTag} from "../../Logic/Tags/RegexTag";
|
||||||
import {param} from "jquery";
|
|
||||||
|
|
||||||
export default class SourceConfig {
|
export default class SourceConfig {
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ import List from "../../UI/Base/List";
|
||||||
import {MappingConfigJson, QuestionableTagRenderingConfigJson} from "./Json/QuestionableTagRenderingConfigJson";
|
import {MappingConfigJson, QuestionableTagRenderingConfigJson} from "./Json/QuestionableTagRenderingConfigJson";
|
||||||
import {FixedUiElement} from "../../UI/Base/FixedUiElement";
|
import {FixedUiElement} from "../../UI/Base/FixedUiElement";
|
||||||
import {Paragraph} from "../../UI/Base/Paragraph";
|
import {Paragraph} from "../../UI/Base/Paragraph";
|
||||||
import UserDetails from "../../Logic/Osm/OsmConnection";
|
|
||||||
|
|
||||||
export interface Mapping {
|
export interface Mapping {
|
||||||
readonly if: TagsFilter,
|
readonly if: TagsFilter,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue