From 7a46729a4698cd2eee041610b529df472fce0b6b Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Sat, 12 Nov 2022 18:11:24 +0100 Subject: [PATCH] #362 - additional operators --- src/models/PanelSettings.ts | 5 +- .../components/Fields/WrapperField.tsx | 19 ++--- src/utils/fieldWhenClause.ts | 69 +++++++++++++++++++ src/utils/index.ts | 1 + 4 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 src/utils/fieldWhenClause.ts diff --git a/src/models/PanelSettings.ts b/src/models/PanelSettings.ts index 4df583a3..b438fcff 100644 --- a/src/models/PanelSettings.ts +++ b/src/models/PanelSettings.ts @@ -92,18 +92,19 @@ export enum WhenOperator { notEquals = "neq", contains = "contains", notContains = "notContains", + startsWith = "startsWith", + endsWith = "endsWith", greaterThan = "gt", greaterThanOrEqual = "gte", lessThan = "lt", lessThanOrEqual = "lte", - startsWith = "startsWith", - endsWith = "endsWith", } export interface WhenClause { fieldRef: string; operator: WhenOperator; value: any; + caseSensitive?: boolean; } export interface DateInfo { diff --git a/src/panelWebView/components/Fields/WrapperField.tsx b/src/panelWebView/components/Fields/WrapperField.tsx index 1e345444..292e35bf 100644 --- a/src/panelWebView/components/Fields/WrapperField.tsx +++ b/src/panelWebView/components/Fields/WrapperField.tsx @@ -14,6 +14,7 @@ import { JsonField } from '../JsonField'; import { IMetadata } from '../Metadata'; import { TagPicker } from '../TagPicker'; import { ChoiceField, DataFileField, DateTimeField, DraftField, FieldTitle, FileField, ListField, Toggle, TextField, SlugField, PreviewImageField, PreviewImageValue, NumberField } from '.'; +import { fieldWhenClause } from '../../../utils/fieldWhenClause'; export interface IWrapperFieldProps { field: Field; @@ -111,22 +112,10 @@ export const WrapperField: React.FunctionComponent = ({ // Conditional fields if (typeof field.when !== "undefined") { - debugger - const when = field.when; - const whenValue = parent[when.fieldRef]; + const shouldRender = fieldWhenClause(field, parent); - if (field.when.operator === WhenOperator.equals) { - if (whenValue !== when.value) { - return null; - } - } else if (field.when.operator === WhenOperator.notEquals) { - if (whenValue === when.value) { - return null; - } - } else if (field.when.operator === WhenOperator.contains) { - if ((typeof whenValue === "string" || whenValue instanceof Array) && !whenValue.includes(when.value)) { - return null; - } + if (!shouldRender) { + return null; } } diff --git a/src/utils/fieldWhenClause.ts b/src/utils/fieldWhenClause.ts new file mode 100644 index 00000000..7e84c82a --- /dev/null +++ b/src/utils/fieldWhenClause.ts @@ -0,0 +1,69 @@ +import { Field, WhenOperator } from "../models"; +import { IMetadata } from "../panelWebView/components/Metadata"; + + +export const fieldWhenClause = (field: Field, parent: IMetadata): boolean => { + const when = field.when; + if (!when) { + return true; + } + + const whenValue = parent[when.fieldRef]; + + switch (when.operator) { + case WhenOperator.equals: + if (whenValue !== when.value) { + return false; + } + break; + case WhenOperator.notEquals: + if (whenValue === when.value) { + return false; + } + break; + case WhenOperator.contains: + if ((typeof whenValue === "string" || whenValue instanceof Array) && !whenValue.includes(when.value)) { + return false; + } + break; + case WhenOperator.notContains: + if ((typeof whenValue === "string" || whenValue instanceof Array) && whenValue.includes(when.value)) { + return false; + } + break; + case WhenOperator.startsWith: + if (typeof whenValue === "string" && !whenValue.startsWith(when.value)) { + return false; + } + break; + case WhenOperator.endsWith: + if (typeof whenValue === "string" && !whenValue.endsWith(when.value)) { + return false; + } + break; + case WhenOperator.greaterThan: + if (typeof whenValue === "number" && whenValue <= when.value) { + return false; + } + break; + case WhenOperator.greaterThanOrEqual: + if (typeof whenValue === "number" && whenValue < when.value) { + return false; + } + break; + case WhenOperator.lessThan: + if (typeof whenValue === "number" && whenValue >= when.value) { + return false; + } + break; + case WhenOperator.lessThanOrEqual: + if (typeof whenValue === "number" && whenValue > when.value) { + return false; + } + break; + default: + break; + } + + return true; +} \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts index c23da193..9b5f7e53 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,6 @@ export * from './copyFileAsync'; export * from './existsAsync'; +export * from './fieldWhenClause'; export * from './mkdirAsync'; export * from './readFileAsync'; export * from './readdirAsync';