@pega/cosmos-react-condition-builder 8.21.9 → 8.21.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,7 +12,7 @@ import type { LeafCondition, Field, DateFunctionsByType } from '../ConditionBuil
12
12
  export declare function isValidRhs(rhs: LeafCondition['rhs'], lhs: LeafCondition['lhs'], fields: Field[], fieldType?: FieldType, trimValues?: boolean): boolean;
13
13
  /** For a condition with the given comparator and lhs-field-type, determines an appropriate default value for the Rhs */
14
14
  export declare function getDefaultRhs(fieldType: FieldType, comparator: Comparator, validRhsTypes: Set<RHSType>, dateFunctions?: DateFunctionsByType): LeafCondition['rhs'];
15
- export declare function truncateISODateString(dateString: string, fieldType: FieldType): string;
15
+ export declare function truncateISODateString(dateString: string, fieldType: FieldType, withSeconds?: boolean): string;
16
16
  /** Type definition for the input props of RhsControls */
17
17
  interface RhsControlProps extends BaseProps {
18
18
  /** Lhs for the condition */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,OAAO,CAAC;AAa5D,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AA2C3F;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,GAAE,OAAe,GAC1B,OAAO,CAwGT;AAED,wHAAwH;AACxH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,EAC3B,aAAa,CAAC,EAAE,mBAAmB,GAClC,aAAa,CAAC,KAAK,CAAC,CAgDtB;AAID,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAkBtF;AAED,yDAAyD;AACzD,UAAU,eAAgB,SAAQ,SAAS;IACzC,4BAA4B;IAC5B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1B,mCAAmC;IACnC,UAAU,EAAE,UAAU,CAAC;IAEvB,4BAA4B;IAC5B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1B,4EAA4E;IAC5E,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAEhE,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAC;IAExB,0BAA0B;IAC1B,aAAa,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEhC,uDAAuD;IACvD,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5B,oHAAoH;IACpH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,eAAe,GAAG,YAAY,CAualE,CAAC;AACF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,OAAO,CAAC;AAa5D,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AA2C3F;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,GAAE,OAAe,GAC1B,OAAO,CA2GT;AAED,wHAAwH;AACxH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,EAC3B,aAAa,CAAC,EAAE,mBAAmB,GAClC,aAAa,CAAC,KAAK,CAAC,CAgDtB;AAID,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,UAAQ,GAClB,MAAM,CAkBR;AAED,yDAAyD;AACzD,UAAU,eAAgB,SAAQ,SAAS;IACzC,4BAA4B;IAC5B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1B,mCAAmC;IACnC,UAAU,EAAE,UAAU,CAAC;IAEvB,4BAA4B;IAC5B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1B,4EAA4E;IAC5E,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAEhE,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAC;IAExB,0BAA0B;IAC1B,aAAa,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEhC,uDAAuD;IACvD,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5B,oHAAoH;IACpH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,eAAe,GAAG,YAAY,CA2alE,CAAC;AACF,eAAe,WAAW,CAAC"}
@@ -110,10 +110,13 @@ export function isValidRhs(rhs, lhs, fields, fieldType, trimValues = false) {
110
110
  Number(rhs.start) < Number(rhs.end));
111
111
  }
112
112
  if (fieldType === 'TIME_ONLY') {
113
+ // Equal range endpoints are valid because the transformer expands them
114
+ // to cover the unit implied by the input precision (HH:mm → whole minute,
115
+ // HH:mm:ss → whole second).
113
116
  if (typeof rhs.start === 'number' && typeof rhs.end === 'number')
114
- return rhs.start < rhs.end;
117
+ return rhs.start <= rhs.end;
115
118
  if (typeof rhs.start === 'string' && typeof rhs.end === 'string')
116
- return convertTimeValueToMs(rhs.start) < convertTimeValueToMs(rhs.end);
119
+ return convertTimeValueToMs(rhs.start) <= convertTimeValueToMs(rhs.end);
117
120
  }
118
121
  const startDate = new Date(rhs.start);
119
122
  const endDate = new Date(rhs.end);
@@ -163,7 +166,7 @@ export function getDefaultRhs(fieldType, comparator, validRhsTypes, dateFunction
163
166
  }
164
167
  // Truncates output values from DateInput/DateTimeInput to return a wall time on the RHS
165
168
  // NOTE: This assumes that the input date is set up on the UTC timezone
166
- export function truncateISODateString(dateString, fieldType) {
169
+ export function truncateISODateString(dateString, fieldType, withSeconds = false) {
167
170
  const date = new Date(dateString);
168
171
  const YYYY = date.getUTCFullYear().toString().padStart(4, '0');
169
172
  const MM = (date.getUTCMonth() + 1).toString().padStart(2, '0');
@@ -175,7 +178,7 @@ export function truncateISODateString(dateString, fieldType) {
175
178
  const mm = date.getUTCMinutes().toString().padStart(2, '0');
176
179
  const ss = date.getUTCSeconds().toString().padStart(2, '0');
177
180
  if (fieldType === 'TIME_ONLY')
178
- return `${hh}:${mm}:${ss}`;
181
+ return withSeconds ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;
179
182
  // cspell:disable-next-line
180
183
  // For DATE_TIME fields, returning a YYYY-MM-DDTHH:mm format and discarding the time-zone etc. to be consistent with the previous spec which was returning a wall time
181
184
  return `${YYYY}-${MM}-${DD}T${hh}:${mm}`;
@@ -264,7 +267,7 @@ const RhsControls = (props) => {
264
267
  onChange({ value: valueAsTimestamp ?? '' }, 'error');
265
268
  return;
266
269
  }
267
- const truncatedValue = truncateISODateString(valueAsISOString, fieldType); // Truncate to return a wall time as per spec
270
+ const truncatedValue = truncateISODateString(valueAsISOString, fieldType, fieldType === 'TIME_ONLY');
268
271
  onChange({ value: truncatedValue });
269
272
  };
270
273
  const handleDateRangeValueChange = ({ start, end }) => {
@@ -281,8 +284,8 @@ const RhsControls = (props) => {
281
284
  return;
282
285
  }
283
286
  const [truncatedStartValue, truncatedEndValue] = [
284
- truncateISODateString(start.valueAsISOString, fieldType),
285
- truncateISODateString(end.valueAsISOString, fieldType)
287
+ truncateISODateString(start.valueAsISOString, fieldType, fieldType === 'TIME_ONLY'),
288
+ truncateISODateString(end.valueAsISOString, fieldType, fieldType === 'TIME_ONLY')
286
289
  ];
287
290
  const onChangeParam = {
288
291
  start: truncatedStartValue ?? '',
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useMemo } from 'react';\nimport type { FunctionComponent, ChangeEvent } from 'react';\n\nimport {\n DateInput,\n DateTimeInput,\n Flex,\n Input,\n hasProp,\n TimeInput,\n useI18n,\n DateRangeInput,\n TimeRangeInput\n} from '@pega/cosmos-react-core';\nimport type { BaseProps, ForwardProps } from '@pega/cosmos-react-core';\nimport type {\n DateTimeCallbackParameter,\n DateRangeCallbackParameter\n} from '@pega/cosmos-react-core/lib/components/DateTime/DateTime.types';\n\nimport type { FieldType, Comparator, RHSType } from '../core/types';\nimport type { LeafCondition, Field, DateFunctionsByType } from '../ConditionBuilder.types';\nimport { convertTimeValueToMs } from '../core/time-utils';\nimport { getItem } from '../core/utils';\n\nimport ValueSelector from './ValueSelector';\nimport FieldSelector from './FieldSelector';\nimport RhsModeSwitch from './RhsModeSwitch';\nimport TimePeriodInput from './TimePeriodInput';\nimport TimePeriodMenu from './TimePeriodMenu';\nimport NumericInput from './NumericInput';\nimport { NumericRangeInput } from './NumericRangeInput';\nimport { CSVInput } from './CSVInput';\n\nfunction isValidLiteralValue(\n value: string | number,\n fieldType?: FieldType,\n trimValues: boolean = false\n): boolean {\n // Identify any invalid numbers (e.g. when `-` is entered)\n if (typeof value === 'number') {\n return !Number.isNaN(value);\n }\n\n // NOTE: Not trimming the value in the change-handler so that users can freely type spaces between words\n if (trimValues) {\n value = value.trim();\n }\n\n // Can be empty on init and on clearing the value\n if (value.trim() === '') {\n return false;\n }\n\n // This check is needed to eliminate invalid dates like `Feb 31` (02/31/2020), which the input allows\n // eslint-disable-next-line sonarjs/prefer-single-boolean-return\n if (\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY') &&\n Number.isNaN(new Date(value).getTime())\n ) {\n return false;\n }\n return true;\n}\n/**\n * Verifies if the condition has all valid values.\n * NOTES:\n * - This is intended to be used only on conditions emitted by the components in this package.\n * - If a condition is manually constructed outside these components, this utility could miss some malformed conditions.\n * - Also, this does not try to validate if the given `rhs` matches the `lhs`/`comparator`/`validRhsTypes`. Instead, it assumes that the appropriate LHS/Comparator/validRhsTypes must have been already in place for this rhs to be generated.\n */\nexport function isValidRhs(\n rhs: LeafCondition['rhs'],\n lhs: LeafCondition['lhs'],\n fields: Field[],\n fieldType?: FieldType,\n trimValues: boolean = false\n): boolean {\n // Find the field corresponding to the LHS\n const matchingField = getItem(fields, lhs.field);\n\n if (matchingField === undefined || !hasProp(matchingField, 'type')) {\n // Check if the RHS has no defined values to select\n return false;\n }\n\n // A ValueSelector in single/multiple mode is possible when these criteria are met\n const isValueSelectorPossible =\n fieldType === 'TEXT' && matchingField.possibleValues !== undefined;\n\n // RHS would be `undefined` when no RHS is needed. Treat it as a valid value\n if (rhs === undefined) {\n return true;\n }\n\n // Field-selector on the RHS\n if (hasProp(rhs, 'field')) {\n // RHS is invalid if no field is selected\n return rhs.field !== '';\n }\n\n // rhs of Parameter type\n if (hasProp(rhs, 'parameterId')) {\n // RHS is invalid if no id is returned\n return !!rhs.parameterId;\n }\n\n // List-input cases\n if (hasProp(rhs, 'values')) {\n // RHS is invalid if the list is empty\n if (rhs.values.length === 0) {\n return false;\n }\n // For numeric fields, RHS is invalid if any NaN values are present in the list\n if (\n (fieldType === 'DECIMAL' || fieldType === 'INTEGER') &&\n (rhs.values as number[]).some(v => Number.isNaN(v))\n ) {\n return false;\n }\n }\n\n if (hasProp(rhs, 'value')) {\n // Identify any invalid numbers (e.g. when `-` is entered)\n if (typeof rhs.value === 'number') {\n return !Number.isNaN(rhs.value);\n }\n\n // NOTE: Not trimming the value in the change-handler so that users can freely type spaces between words\n if (trimValues && !isValueSelectorPossible) {\n rhs.value = rhs.value.trim();\n }\n\n // Can be empty on init and on clearing the value\n if (rhs.value.trim() === '') {\n return false;\n }\n\n // This check is needed to eliminate invalid dates like `Feb 31` (02/31/2020), which the input allows\n if (\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY') &&\n Number.isNaN(new Date(rhs.value).getTime())\n ) {\n return false;\n }\n }\n\n if (\n hasProp(rhs, 'relativeDate') &&\n ((rhs.relativeDate.timePeriod === 'CURRENT' && rhs.relativeDate.interval) ||\n (rhs.relativeDate.timePeriod !== 'CURRENT' &&\n (!rhs.relativeDate.interval || rhs.relativeDate.interval <= 0)))\n ) {\n return false;\n }\n\n if (hasProp(rhs, 'start')) {\n if (\n !isValidLiteralValue(rhs.start, fieldType, trimValues) ||\n !isValidLiteralValue(rhs.end, fieldType, trimValues)\n ) {\n return false;\n }\n if (fieldType === 'DECIMAL' || fieldType === 'INTEGER') {\n return (\n !Number.isNaN(Number(rhs.start)) &&\n !Number.isNaN(Number(rhs.end)) &&\n Number(rhs.start) < Number(rhs.end)\n );\n }\n if (fieldType === 'TIME_ONLY') {\n if (typeof rhs.start === 'number' && typeof rhs.end === 'number') return rhs.start < rhs.end;\n if (typeof rhs.start === 'string' && typeof rhs.end === 'string')\n return convertTimeValueToMs(rhs.start) < convertTimeValueToMs(rhs.end);\n }\n const startDate = new Date(rhs.start);\n const endDate = new Date(rhs.end);\n return !Number.isNaN(startDate) && !Number.isNaN(endDate) && startDate < endDate;\n }\n\n return true;\n}\n\n/** For a condition with the given comparator and lhs-field-type, determines an appropriate default value for the Rhs */\nexport function getDefaultRhs(\n fieldType: FieldType,\n comparator: Comparator,\n validRhsTypes: Set<RHSType>,\n dateFunctions?: DateFunctionsByType\n): LeafCondition['rhs'] {\n switch (comparator) {\n case 'IS_TRUE':\n case 'IS_FALSE':\n case 'IS_NULL':\n case 'IS_NOT_NULL':\n return undefined; // These comparators do not have an Rhs\n\n case 'IN':\n case 'NOT_IN':\n return { values: [] };\n\n case 'BTW':\n case 'NOT_BTW':\n return { start: '', end: '' };\n\n default: {\n if (fieldType === 'BOOLEAN' && (comparator === 'EQ' || comparator === 'NEQ')) {\n // For booleans, these comparators can only be used for comparing with other fields\n return { field: '' };\n }\n\n if (validRhsTypes.has('LITERAL')) return { value: '' };\n\n if (validRhsTypes.has('PARAMETER')) return { parameterId: '' };\n\n if (\n validRhsTypes.has('DATE_FUNCTION') &&\n dateFunctions &&\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY')\n )\n return { value: '', dateFunction: dateFunctions[fieldType][0] };\n\n if (\n validRhsTypes.has('RELATIVE_DATE') &&\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY')\n ) {\n return {\n relativeDate: {\n timePeriod: 'CURRENT',\n datePart: 'DAYS'\n }\n };\n }\n\n return { field: '' };\n }\n }\n}\n\n// Truncates output values from DateInput/DateTimeInput to return a wall time on the RHS\n// NOTE: This assumes that the input date is set up on the UTC timezone\nexport function truncateISODateString(dateString: string, fieldType: FieldType): string {\n const date = new Date(dateString);\n const YYYY = date.getUTCFullYear().toString().padStart(4, '0');\n const MM = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const DD = date.getUTCDate().toString().padStart(2, '0');\n\n // For DATE_ONLY fields, returning a YYYY-MM-DD format as per spec\n if (fieldType === 'DATE_ONLY') return `${YYYY}-${MM}-${DD}`;\n\n const hh = date.getUTCHours().toString().padStart(2, '0');\n const mm = date.getUTCMinutes().toString().padStart(2, '0');\n const ss = date.getUTCSeconds().toString().padStart(2, '0');\n\n if (fieldType === 'TIME_ONLY') return `${hh}:${mm}:${ss}`;\n\n // cspell:disable-next-line\n // For DATE_TIME fields, returning a YYYY-MM-DDTHH:mm format and discarding the time-zone etc. to be consistent with the previous spec which was returning a wall time\n return `${YYYY}-${MM}-${DD}T${hh}:${mm}`;\n}\n\n/** Type definition for the input props of RhsControls */\ninterface RhsControlProps extends BaseProps {\n /** Lhs for the condition */\n lhs: LeafCondition['lhs'];\n\n /** Comparator for the condition */\n comparator: Comparator;\n\n /** Rhs for the condition */\n rhs: LeafCondition['rhs'];\n\n /** Metadata (data-model) for the Fields to use in the RHS field-selector */\n fields: Field[];\n\n /** Callback for any modifications to the Rhs */\n onChange: (rhs: LeafCondition['rhs'], status?: 'error') => void;\n\n /** Used to enable inline error indicators on invalid inputs */\n indicateErrors: boolean;\n\n /** Item flow direction */\n itemDirection: 'row' | 'column';\n\n /** Restricts RHS values to only specified RHS types */\n validRhsTypes: Set<RHSType>;\n\n /** Passed to enable additional date controls on the RHS, when a DATE_TIME/DATE_ONLY field is selected on the LHS */\n dateFunctions?: DateFunctionsByType;\n\n /** IANA timezone string used to initialize date/time pickers with the operator's timezone */\n timeZone?: string;\n}\n\n/** A controlled component for controls on a Condition's RHS */\nconst RhsControls: FunctionComponent<RhsControlProps & ForwardProps> = (props: RhsControlProps) => {\n const {\n lhs,\n comparator,\n rhs,\n fields,\n onChange,\n indicateErrors,\n itemDirection,\n validRhsTypes,\n dateFunctions,\n timeZone\n } = props;\n\n const t = useI18n();\n\n const [apiError, setApiError] = useState<string | null>(null);\n\n // Find the field corresponding to the LHS\n const matchingField = getItem(fields, lhs.field);\n\n // Options for the Field-selector (if applicable)\n const fieldOptions = useMemo(() => {\n if (!matchingField || !hasProp(matchingField, 'type')) return [];\n // Show all other fields of the same data type as the LHS\n\n const findMatchingObjectType = (items: Field[], type: FieldType) => {\n return items.reduce((result: Field[], item) => {\n // Check if the current item matches the condition\n if (item.id !== lhs.field && hasProp(item, 'type') && item.type === type) {\n result.push({ ...item });\n } else if (hasProp(item, 'items') && item.items.length > 0) {\n // If the item has children, recursively search them\n const filteredChildren = findMatchingObjectType(item.items, type);\n if (filteredChildren.length > 0) {\n result.push({ ...item, items: filteredChildren });\n }\n }\n return result;\n }, []);\n };\n\n return findMatchingObjectType(fields, matchingField.type);\n }, [fields, lhs]);\n\n // If a field is not selected or if the comparator doesn't need any RHS, don't render anything\n if (rhs === undefined) {\n return <div />; // Rendering a placeholder div to keep the layout consistent\n }\n\n if (matchingField === undefined || !hasProp(matchingField, 'type')) {\n // For safety against any rare cases where the LHS from an input condition is not present in the input fields to the ConditionBuilder\n // In those cases, don't render an RHS and wait for a valid value to be picked on LHS\n return <div />; // Rendering a placeholder div to keep the layout consistent\n }\n\n const fieldType = matchingField.type;\n\n const fieldUnit = matchingField.unit;\n\n const parameters = matchingField.parameters !== undefined ? matchingField.parameters : [];\n\n // If errors should be indicated inline, validate the current rhs\n let showError = false;\n if (indicateErrors) {\n showError = !isValidRhs(rhs, lhs, fields, fieldType, false);\n }\n\n const isValueSelectorPossible =\n fieldType === 'TEXT' &&\n matchingField.possibleValues !== undefined &&\n ['EQ', 'NEQ', 'IN', 'NOT_IN'].includes(comparator); // A ValueSelector in single/multiple mode is possible when these criteria are met\n const useValueSelector = isValueSelectorPossible && !hasProp(rhs, 'field'); // Use the ValueSelector component if it is applicable and if not in ANOTHER_FIELD mode and if RHS is not PARAMETER type\n // Handle changes from the Value-selector\n\n const handleValueSelection = (selection: string | string[]) => {\n if (typeof selection === 'string') {\n if (hasProp(rhs, 'parameterId')) onChange({ parameterId: selection });\n else onChange({ value: selection }); // Submit a new RHS\n } else {\n onChange({ values: selection }); // Submit a new RHS\n }\n };\n\n // Handle changes from the Field-selector\n const handleFieldChange = (id: string) => {\n onChange({ field: id }); // Submit a new RHS\n };\n\n // Handle changes from a Value-input\n const handleValueChange = (e: ChangeEvent<HTMLInputElement>) => {\n // NOTE: Not trimming the value here so that users can freely type spaces between words. Trimming is done on Submit, via the isValidRhs call\n onChange({ value: e.target.value }); // Submit a new RHS\n };\n\n // Handle changes from a DateInput\n const handleDateValueChange = ({\n valueAsISOString,\n valueAsTimestamp,\n state\n }: DateTimeCallbackParameter) => {\n // NOTE: Not relying fully on `state` since in some cases state and valueAsTimestamp as both undefined\n if (valueAsISOString === undefined) {\n onChange({ value: '' });\n return;\n }\n\n if (state) {\n // sending empty value marked as 'error' to allow clearing condition\n onChange({ value: valueAsTimestamp ?? '' }, 'error');\n return;\n }\n\n const truncatedValue = truncateISODateString(valueAsISOString, fieldType); // Truncate to return a wall time as per spec\n onChange({ value: truncatedValue });\n };\n\n const handleDateRangeValueChange = ({ start, end }: DateRangeCallbackParameter) => {\n if (start.valueAsTimestamp === undefined && end.valueAsTimestamp === undefined) {\n onChange({ start: '', end: '' });\n return;\n }\n\n if (\n start.valueAsISOString === undefined ||\n end.valueAsISOString === undefined ||\n start.state ||\n end.state\n ) {\n // sending empty value marked as 'error' to allow clearing condition\n onChange({ start: start.valueAsTimestamp ?? '', end: end.valueAsTimestamp ?? '' }, 'error');\n return;\n }\n\n const [truncatedStartValue, truncatedEndValue] = [\n truncateISODateString(start.valueAsISOString, fieldType),\n truncateISODateString(end.valueAsISOString, fieldType)\n ];\n\n const onChangeParam = {\n start: truncatedStartValue ?? '',\n end: truncatedEndValue ?? ''\n };\n\n if (\n start.valueAsTimestamp &&\n end.valueAsTimestamp &&\n start.valueAsTimestamp > end.valueAsTimestamp\n ) {\n onChange(onChangeParam, 'error');\n return;\n }\n\n onChange(onChangeParam);\n };\n\n const handleNumberRangeValueChange = ({\n start,\n end\n }: {\n start: number | undefined;\n end: number | undefined;\n }) => {\n const startValue = start;\n const endValue = end;\n const hasStartValue = startValue !== undefined;\n const hasEndValue = endValue !== undefined;\n\n onChange(\n {\n start: hasStartValue ? Number(start) : '',\n end: hasEndValue ? Number(end) : ''\n },\n // checking one of values is empty, but not both\n ((!hasStartValue || !hasEndValue) && (hasStartValue || hasEndValue)) ||\n (hasStartValue && hasEndValue && startValue > endValue)\n ? 'error'\n : undefined\n );\n };\n\n // Render the menu directly if in a vertical layout\n const TimePeriodComp = itemDirection === 'column' ? TimePeriodMenu : TimePeriodInput;\n const alignItems = showError ? 'center' : 'end';\n return (\n <Flex\n container={{\n direction: itemDirection,\n alignItems: itemDirection === 'column' ? 'stretch' : alignItems,\n justify: 'between',\n gap: 0.5\n }}\n >\n {/* Gear MenuButton */}\n <RhsModeSwitch\n parameters={parameters}\n fieldType={fieldType}\n comparator={comparator}\n rhs={rhs}\n onChange={onChange}\n mode={itemDirection === 'column' ? 'combo-box' : 'menu-button'}\n validRhsTypes={validRhsTypes}\n dateFunctions={dateFunctions}\n />\n {/* Field-selector */}\n {hasProp(rhs, 'field') && (\n <Flex item={{ grow: 1 }}>\n <FieldSelector\n value={rhs.field}\n onChange={handleFieldChange}\n fields={fieldOptions}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_no_selection') : undefined}\n label={t('condition_builder_compare_with_another_field')}\n />\n </Flex>\n )}\n\n {/* Parameter input */}\n {hasProp(rhs, 'parameterId') && (\n <Flex item={{ grow: 1 }}>\n {parameters.length === 1 && (\n <Input\n value={parameters[0].primary.toString()}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_empty_value_text') : undefined}\n name='rhs-text-parameter-input'\n label={t('condition_builder_value_label')}\n readOnly\n />\n )}\n\n {parameters.length > 1 && (\n <ValueSelector\n parameters={parameters}\n mode='single-select'\n values={rhs.parameterId.toString()}\n selectedField={matchingField}\n rhs={rhs}\n comparator={comparator}\n onChange={handleValueSelection}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_empty_selection_error_text') : undefined}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_single_selection_placeholder')}\n />\n )}\n </Flex>\n )}\n\n {/* Value input */}\n {hasProp(rhs, 'value') && !hasProp(rhs, 'dateFunction') && (\n <Flex item={{ grow: 1 }}>\n {fieldType === 'TEXT' && useValueSelector && (\n <ValueSelector\n parameters={parameters}\n mode='single-select'\n values={rhs.value.toString()}\n selectedField={matchingField}\n comparator={comparator}\n rhs={rhs}\n onChange={handleValueSelection}\n status={showError || apiError ? 'error' : undefined}\n info={showError ? t('condition_builder_no_selection') : apiError}\n setApiError={setApiError}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_single_selection_placeholder')}\n />\n )}\n\n {fieldType === 'TEXT' && !useValueSelector && (\n <Input\n value={rhs.value.toString()}\n onChange={handleValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('empty_value') : undefined}\n name='rhs-text-literal-input'\n label={t('condition_builder_value_label')}\n />\n )}\n\n {(fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (\n <NumericInput\n rhs={rhs}\n onChange={onChange}\n allowDecimal={fieldType !== 'INTEGER'}\n status={showError ? 'error' : undefined}\n unit={fieldUnit}\n />\n )}\n {fieldType === 'TIME_ONLY' && (\n <TimeInput\n value={rhs.value === '' ? undefined : rhs.value}\n withSeconds\n onChange={handleDateValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_time') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n label={t('condition_builder_value_label')}\n />\n )}\n {fieldType === 'DATE_ONLY' && (\n <DateInput\n value={rhs.value}\n onChange={handleDateValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date') : ''}\n label={t('condition_builder_value_label')}\n timeZone={timeZone}\n />\n )}\n {fieldType === 'DATE_TIME' && (\n <DateTimeInput\n value={rhs.value !== '' ? rhs.value : undefined}\n onChange={handleDateValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date') : ''}\n label={t('condition_builder_value_label')}\n timeZone={timeZone}\n />\n )}\n </Flex>\n )}\n\n {(fieldType === 'DATE_ONLY' || fieldType === 'DATE_TIME') &&\n (hasProp(rhs, 'relativeDate') || hasProp(rhs, 'dateFunction')) && (\n <Flex item={{ grow: 1 }}>\n <TimePeriodComp\n rhs={rhs}\n fieldType={fieldType}\n onChange={onChange}\n dateFunctionsList={dateFunctions ? dateFunctions[fieldType] : []}\n status={showError ? 'error' : undefined}\n />\n </Flex>\n )}\n\n {/* Multiple-values input */}\n {hasProp(rhs, 'values') && (\n <Flex item={{ grow: 1 }}>\n {useValueSelector && (\n <ValueSelector\n parameters={parameters}\n mode='multi-select'\n values={rhs.values.map(String)}\n selectedField={matchingField}\n comparator={comparator}\n rhs={rhs}\n onChange={handleValueSelection}\n status={showError || apiError ? 'error' : undefined}\n info={showError ? t('condition_builder_no_selection') : apiError}\n setApiError={setApiError}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_multi_selection_placeholder')}\n />\n )}\n {!useValueSelector && (\n <CSVInput\n rhs={rhs}\n field={matchingField}\n onChange={onChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_values') : undefined}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_enter_csv_placeholder')}\n />\n )}\n </Flex>\n )}\n\n {hasProp(rhs, 'start') && (\n <Flex item={{ grow: 1 }}>\n {(fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (\n <NumericRangeInput\n label={t('condition_builder_value_label')}\n rhs={{ start: rhs.start.toString(), end: rhs.end.toString() }}\n onChange={handleNumberRangeValueChange}\n status={showError ? 'error' : undefined}\n allowDecimal={fieldType !== 'INTEGER'}\n unit={fieldUnit}\n />\n )}\n\n {fieldType === 'DATE_ONLY' && (\n <DateRangeInput\n value={{ start: rhs.start, end: rhs.end }}\n onChange={handleDateRangeValueChange}\n label={t('condition_builder_value_label')}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date_range') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n timeZone={timeZone}\n />\n )}\n\n {fieldType === 'TIME_ONLY' && (\n <TimeRangeInput\n mode='time'\n value={{\n start: rhs.start === '' ? undefined : rhs.start,\n end: rhs.end === '' ? undefined : rhs.end\n }}\n withSeconds\n onChange={handleDateRangeValueChange}\n label={t('condition_builder_value_label')}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_time_range') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n />\n )}\n\n {fieldType === 'DATE_TIME' && (\n <TimeRangeInput\n mode='datetime'\n value={{ start: rhs.start, end: rhs.end }}\n onChange={handleDateRangeValueChange}\n label={t('condition_builder_value_label')}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date_range') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n timeZone={timeZone}\n />\n )}\n </Flex>\n )}\n </Flex>\n );\n};\nexport default RhsControls;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useMemo } from 'react';\nimport type { FunctionComponent, ChangeEvent } from 'react';\n\nimport {\n DateInput,\n DateTimeInput,\n Flex,\n Input,\n hasProp,\n TimeInput,\n useI18n,\n DateRangeInput,\n TimeRangeInput\n} from '@pega/cosmos-react-core';\nimport type { BaseProps, ForwardProps } from '@pega/cosmos-react-core';\nimport type {\n DateTimeCallbackParameter,\n DateRangeCallbackParameter\n} from '@pega/cosmos-react-core/lib/components/DateTime/DateTime.types';\n\nimport type { FieldType, Comparator, RHSType } from '../core/types';\nimport type { LeafCondition, Field, DateFunctionsByType } from '../ConditionBuilder.types';\nimport { convertTimeValueToMs } from '../core/time-utils';\nimport { getItem } from '../core/utils';\n\nimport ValueSelector from './ValueSelector';\nimport FieldSelector from './FieldSelector';\nimport RhsModeSwitch from './RhsModeSwitch';\nimport TimePeriodInput from './TimePeriodInput';\nimport TimePeriodMenu from './TimePeriodMenu';\nimport NumericInput from './NumericInput';\nimport { NumericRangeInput } from './NumericRangeInput';\nimport { CSVInput } from './CSVInput';\n\nfunction isValidLiteralValue(\n value: string | number,\n fieldType?: FieldType,\n trimValues: boolean = false\n): boolean {\n // Identify any invalid numbers (e.g. when `-` is entered)\n if (typeof value === 'number') {\n return !Number.isNaN(value);\n }\n\n // NOTE: Not trimming the value in the change-handler so that users can freely type spaces between words\n if (trimValues) {\n value = value.trim();\n }\n\n // Can be empty on init and on clearing the value\n if (value.trim() === '') {\n return false;\n }\n\n // This check is needed to eliminate invalid dates like `Feb 31` (02/31/2020), which the input allows\n // eslint-disable-next-line sonarjs/prefer-single-boolean-return\n if (\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY') &&\n Number.isNaN(new Date(value).getTime())\n ) {\n return false;\n }\n return true;\n}\n/**\n * Verifies if the condition has all valid values.\n * NOTES:\n * - This is intended to be used only on conditions emitted by the components in this package.\n * - If a condition is manually constructed outside these components, this utility could miss some malformed conditions.\n * - Also, this does not try to validate if the given `rhs` matches the `lhs`/`comparator`/`validRhsTypes`. Instead, it assumes that the appropriate LHS/Comparator/validRhsTypes must have been already in place for this rhs to be generated.\n */\nexport function isValidRhs(\n rhs: LeafCondition['rhs'],\n lhs: LeafCondition['lhs'],\n fields: Field[],\n fieldType?: FieldType,\n trimValues: boolean = false\n): boolean {\n // Find the field corresponding to the LHS\n const matchingField = getItem(fields, lhs.field);\n\n if (matchingField === undefined || !hasProp(matchingField, 'type')) {\n // Check if the RHS has no defined values to select\n return false;\n }\n\n // A ValueSelector in single/multiple mode is possible when these criteria are met\n const isValueSelectorPossible =\n fieldType === 'TEXT' && matchingField.possibleValues !== undefined;\n\n // RHS would be `undefined` when no RHS is needed. Treat it as a valid value\n if (rhs === undefined) {\n return true;\n }\n\n // Field-selector on the RHS\n if (hasProp(rhs, 'field')) {\n // RHS is invalid if no field is selected\n return rhs.field !== '';\n }\n\n // rhs of Parameter type\n if (hasProp(rhs, 'parameterId')) {\n // RHS is invalid if no id is returned\n return !!rhs.parameterId;\n }\n\n // List-input cases\n if (hasProp(rhs, 'values')) {\n // RHS is invalid if the list is empty\n if (rhs.values.length === 0) {\n return false;\n }\n // For numeric fields, RHS is invalid if any NaN values are present in the list\n if (\n (fieldType === 'DECIMAL' || fieldType === 'INTEGER') &&\n (rhs.values as number[]).some(v => Number.isNaN(v))\n ) {\n return false;\n }\n }\n\n if (hasProp(rhs, 'value')) {\n // Identify any invalid numbers (e.g. when `-` is entered)\n if (typeof rhs.value === 'number') {\n return !Number.isNaN(rhs.value);\n }\n\n // NOTE: Not trimming the value in the change-handler so that users can freely type spaces between words\n if (trimValues && !isValueSelectorPossible) {\n rhs.value = rhs.value.trim();\n }\n\n // Can be empty on init and on clearing the value\n if (rhs.value.trim() === '') {\n return false;\n }\n\n // This check is needed to eliminate invalid dates like `Feb 31` (02/31/2020), which the input allows\n if (\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY') &&\n Number.isNaN(new Date(rhs.value).getTime())\n ) {\n return false;\n }\n }\n\n if (\n hasProp(rhs, 'relativeDate') &&\n ((rhs.relativeDate.timePeriod === 'CURRENT' && rhs.relativeDate.interval) ||\n (rhs.relativeDate.timePeriod !== 'CURRENT' &&\n (!rhs.relativeDate.interval || rhs.relativeDate.interval <= 0)))\n ) {\n return false;\n }\n\n if (hasProp(rhs, 'start')) {\n if (\n !isValidLiteralValue(rhs.start, fieldType, trimValues) ||\n !isValidLiteralValue(rhs.end, fieldType, trimValues)\n ) {\n return false;\n }\n if (fieldType === 'DECIMAL' || fieldType === 'INTEGER') {\n return (\n !Number.isNaN(Number(rhs.start)) &&\n !Number.isNaN(Number(rhs.end)) &&\n Number(rhs.start) < Number(rhs.end)\n );\n }\n if (fieldType === 'TIME_ONLY') {\n // Equal range endpoints are valid because the transformer expands them\n // to cover the unit implied by the input precision (HH:mm → whole minute,\n // HH:mm:ss → whole second).\n if (typeof rhs.start === 'number' && typeof rhs.end === 'number') return rhs.start <= rhs.end;\n if (typeof rhs.start === 'string' && typeof rhs.end === 'string')\n return convertTimeValueToMs(rhs.start) <= convertTimeValueToMs(rhs.end);\n }\n const startDate = new Date(rhs.start);\n const endDate = new Date(rhs.end);\n return !Number.isNaN(startDate) && !Number.isNaN(endDate) && startDate < endDate;\n }\n\n return true;\n}\n\n/** For a condition with the given comparator and lhs-field-type, determines an appropriate default value for the Rhs */\nexport function getDefaultRhs(\n fieldType: FieldType,\n comparator: Comparator,\n validRhsTypes: Set<RHSType>,\n dateFunctions?: DateFunctionsByType\n): LeafCondition['rhs'] {\n switch (comparator) {\n case 'IS_TRUE':\n case 'IS_FALSE':\n case 'IS_NULL':\n case 'IS_NOT_NULL':\n return undefined; // These comparators do not have an Rhs\n\n case 'IN':\n case 'NOT_IN':\n return { values: [] };\n\n case 'BTW':\n case 'NOT_BTW':\n return { start: '', end: '' };\n\n default: {\n if (fieldType === 'BOOLEAN' && (comparator === 'EQ' || comparator === 'NEQ')) {\n // For booleans, these comparators can only be used for comparing with other fields\n return { field: '' };\n }\n\n if (validRhsTypes.has('LITERAL')) return { value: '' };\n\n if (validRhsTypes.has('PARAMETER')) return { parameterId: '' };\n\n if (\n validRhsTypes.has('DATE_FUNCTION') &&\n dateFunctions &&\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY')\n )\n return { value: '', dateFunction: dateFunctions[fieldType][0] };\n\n if (\n validRhsTypes.has('RELATIVE_DATE') &&\n (fieldType === 'DATE_TIME' || fieldType === 'DATE_ONLY')\n ) {\n return {\n relativeDate: {\n timePeriod: 'CURRENT',\n datePart: 'DAYS'\n }\n };\n }\n\n return { field: '' };\n }\n }\n}\n\n// Truncates output values from DateInput/DateTimeInput to return a wall time on the RHS\n// NOTE: This assumes that the input date is set up on the UTC timezone\nexport function truncateISODateString(\n dateString: string,\n fieldType: FieldType,\n withSeconds = false\n): string {\n const date = new Date(dateString);\n const YYYY = date.getUTCFullYear().toString().padStart(4, '0');\n const MM = (date.getUTCMonth() + 1).toString().padStart(2, '0');\n const DD = date.getUTCDate().toString().padStart(2, '0');\n\n // For DATE_ONLY fields, returning a YYYY-MM-DD format as per spec\n if (fieldType === 'DATE_ONLY') return `${YYYY}-${MM}-${DD}`;\n\n const hh = date.getUTCHours().toString().padStart(2, '0');\n const mm = date.getUTCMinutes().toString().padStart(2, '0');\n const ss = date.getUTCSeconds().toString().padStart(2, '0');\n\n if (fieldType === 'TIME_ONLY') return withSeconds ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\n\n // cspell:disable-next-line\n // For DATE_TIME fields, returning a YYYY-MM-DDTHH:mm format and discarding the time-zone etc. to be consistent with the previous spec which was returning a wall time\n return `${YYYY}-${MM}-${DD}T${hh}:${mm}`;\n}\n\n/** Type definition for the input props of RhsControls */\ninterface RhsControlProps extends BaseProps {\n /** Lhs for the condition */\n lhs: LeafCondition['lhs'];\n\n /** Comparator for the condition */\n comparator: Comparator;\n\n /** Rhs for the condition */\n rhs: LeafCondition['rhs'];\n\n /** Metadata (data-model) for the Fields to use in the RHS field-selector */\n fields: Field[];\n\n /** Callback for any modifications to the Rhs */\n onChange: (rhs: LeafCondition['rhs'], status?: 'error') => void;\n\n /** Used to enable inline error indicators on invalid inputs */\n indicateErrors: boolean;\n\n /** Item flow direction */\n itemDirection: 'row' | 'column';\n\n /** Restricts RHS values to only specified RHS types */\n validRhsTypes: Set<RHSType>;\n\n /** Passed to enable additional date controls on the RHS, when a DATE_TIME/DATE_ONLY field is selected on the LHS */\n dateFunctions?: DateFunctionsByType;\n\n /** IANA timezone string used to initialize date/time pickers with the operator's timezone */\n timeZone?: string;\n}\n\n/** A controlled component for controls on a Condition's RHS */\nconst RhsControls: FunctionComponent<RhsControlProps & ForwardProps> = (props: RhsControlProps) => {\n const {\n lhs,\n comparator,\n rhs,\n fields,\n onChange,\n indicateErrors,\n itemDirection,\n validRhsTypes,\n dateFunctions,\n timeZone\n } = props;\n\n const t = useI18n();\n\n const [apiError, setApiError] = useState<string | null>(null);\n\n // Find the field corresponding to the LHS\n const matchingField = getItem(fields, lhs.field);\n\n // Options for the Field-selector (if applicable)\n const fieldOptions = useMemo(() => {\n if (!matchingField || !hasProp(matchingField, 'type')) return [];\n // Show all other fields of the same data type as the LHS\n\n const findMatchingObjectType = (items: Field[], type: FieldType) => {\n return items.reduce((result: Field[], item) => {\n // Check if the current item matches the condition\n if (item.id !== lhs.field && hasProp(item, 'type') && item.type === type) {\n result.push({ ...item });\n } else if (hasProp(item, 'items') && item.items.length > 0) {\n // If the item has children, recursively search them\n const filteredChildren = findMatchingObjectType(item.items, type);\n if (filteredChildren.length > 0) {\n result.push({ ...item, items: filteredChildren });\n }\n }\n return result;\n }, []);\n };\n\n return findMatchingObjectType(fields, matchingField.type);\n }, [fields, lhs]);\n\n // If a field is not selected or if the comparator doesn't need any RHS, don't render anything\n if (rhs === undefined) {\n return <div />; // Rendering a placeholder div to keep the layout consistent\n }\n\n if (matchingField === undefined || !hasProp(matchingField, 'type')) {\n // For safety against any rare cases where the LHS from an input condition is not present in the input fields to the ConditionBuilder\n // In those cases, don't render an RHS and wait for a valid value to be picked on LHS\n return <div />; // Rendering a placeholder div to keep the layout consistent\n }\n\n const fieldType = matchingField.type;\n\n const fieldUnit = matchingField.unit;\n\n const parameters = matchingField.parameters !== undefined ? matchingField.parameters : [];\n\n // If errors should be indicated inline, validate the current rhs\n let showError = false;\n if (indicateErrors) {\n showError = !isValidRhs(rhs, lhs, fields, fieldType, false);\n }\n\n const isValueSelectorPossible =\n fieldType === 'TEXT' &&\n matchingField.possibleValues !== undefined &&\n ['EQ', 'NEQ', 'IN', 'NOT_IN'].includes(comparator); // A ValueSelector in single/multiple mode is possible when these criteria are met\n const useValueSelector = isValueSelectorPossible && !hasProp(rhs, 'field'); // Use the ValueSelector component if it is applicable and if not in ANOTHER_FIELD mode and if RHS is not PARAMETER type\n // Handle changes from the Value-selector\n\n const handleValueSelection = (selection: string | string[]) => {\n if (typeof selection === 'string') {\n if (hasProp(rhs, 'parameterId')) onChange({ parameterId: selection });\n else onChange({ value: selection }); // Submit a new RHS\n } else {\n onChange({ values: selection }); // Submit a new RHS\n }\n };\n\n // Handle changes from the Field-selector\n const handleFieldChange = (id: string) => {\n onChange({ field: id }); // Submit a new RHS\n };\n\n // Handle changes from a Value-input\n const handleValueChange = (e: ChangeEvent<HTMLInputElement>) => {\n // NOTE: Not trimming the value here so that users can freely type spaces between words. Trimming is done on Submit, via the isValidRhs call\n onChange({ value: e.target.value }); // Submit a new RHS\n };\n\n // Handle changes from a DateInput\n const handleDateValueChange = ({\n valueAsISOString,\n valueAsTimestamp,\n state\n }: DateTimeCallbackParameter) => {\n // NOTE: Not relying fully on `state` since in some cases state and valueAsTimestamp as both undefined\n if (valueAsISOString === undefined) {\n onChange({ value: '' });\n return;\n }\n\n if (state) {\n // sending empty value marked as 'error' to allow clearing condition\n onChange({ value: valueAsTimestamp ?? '' }, 'error');\n return;\n }\n\n const truncatedValue = truncateISODateString(\n valueAsISOString,\n fieldType,\n fieldType === 'TIME_ONLY'\n );\n onChange({ value: truncatedValue });\n };\n\n const handleDateRangeValueChange = ({ start, end }: DateRangeCallbackParameter) => {\n if (start.valueAsTimestamp === undefined && end.valueAsTimestamp === undefined) {\n onChange({ start: '', end: '' });\n return;\n }\n\n if (\n start.valueAsISOString === undefined ||\n end.valueAsISOString === undefined ||\n start.state ||\n end.state\n ) {\n // sending empty value marked as 'error' to allow clearing condition\n onChange({ start: start.valueAsTimestamp ?? '', end: end.valueAsTimestamp ?? '' }, 'error');\n return;\n }\n\n const [truncatedStartValue, truncatedEndValue] = [\n truncateISODateString(start.valueAsISOString, fieldType, fieldType === 'TIME_ONLY'),\n truncateISODateString(end.valueAsISOString, fieldType, fieldType === 'TIME_ONLY')\n ];\n\n const onChangeParam = {\n start: truncatedStartValue ?? '',\n end: truncatedEndValue ?? ''\n };\n\n if (\n start.valueAsTimestamp &&\n end.valueAsTimestamp &&\n start.valueAsTimestamp > end.valueAsTimestamp\n ) {\n onChange(onChangeParam, 'error');\n return;\n }\n\n onChange(onChangeParam);\n };\n\n const handleNumberRangeValueChange = ({\n start,\n end\n }: {\n start: number | undefined;\n end: number | undefined;\n }) => {\n const startValue = start;\n const endValue = end;\n const hasStartValue = startValue !== undefined;\n const hasEndValue = endValue !== undefined;\n\n onChange(\n {\n start: hasStartValue ? Number(start) : '',\n end: hasEndValue ? Number(end) : ''\n },\n // checking one of values is empty, but not both\n ((!hasStartValue || !hasEndValue) && (hasStartValue || hasEndValue)) ||\n (hasStartValue && hasEndValue && startValue > endValue)\n ? 'error'\n : undefined\n );\n };\n\n // Render the menu directly if in a vertical layout\n const TimePeriodComp = itemDirection === 'column' ? TimePeriodMenu : TimePeriodInput;\n const alignItems = showError ? 'center' : 'end';\n return (\n <Flex\n container={{\n direction: itemDirection,\n alignItems: itemDirection === 'column' ? 'stretch' : alignItems,\n justify: 'between',\n gap: 0.5\n }}\n >\n {/* Gear MenuButton */}\n <RhsModeSwitch\n parameters={parameters}\n fieldType={fieldType}\n comparator={comparator}\n rhs={rhs}\n onChange={onChange}\n mode={itemDirection === 'column' ? 'combo-box' : 'menu-button'}\n validRhsTypes={validRhsTypes}\n dateFunctions={dateFunctions}\n />\n {/* Field-selector */}\n {hasProp(rhs, 'field') && (\n <Flex item={{ grow: 1 }}>\n <FieldSelector\n value={rhs.field}\n onChange={handleFieldChange}\n fields={fieldOptions}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_no_selection') : undefined}\n label={t('condition_builder_compare_with_another_field')}\n />\n </Flex>\n )}\n\n {/* Parameter input */}\n {hasProp(rhs, 'parameterId') && (\n <Flex item={{ grow: 1 }}>\n {parameters.length === 1 && (\n <Input\n value={parameters[0].primary.toString()}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_empty_value_text') : undefined}\n name='rhs-text-parameter-input'\n label={t('condition_builder_value_label')}\n readOnly\n />\n )}\n\n {parameters.length > 1 && (\n <ValueSelector\n parameters={parameters}\n mode='single-select'\n values={rhs.parameterId.toString()}\n selectedField={matchingField}\n rhs={rhs}\n comparator={comparator}\n onChange={handleValueSelection}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_empty_selection_error_text') : undefined}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_single_selection_placeholder')}\n />\n )}\n </Flex>\n )}\n\n {/* Value input */}\n {hasProp(rhs, 'value') && !hasProp(rhs, 'dateFunction') && (\n <Flex item={{ grow: 1 }}>\n {fieldType === 'TEXT' && useValueSelector && (\n <ValueSelector\n parameters={parameters}\n mode='single-select'\n values={rhs.value.toString()}\n selectedField={matchingField}\n comparator={comparator}\n rhs={rhs}\n onChange={handleValueSelection}\n status={showError || apiError ? 'error' : undefined}\n info={showError ? t('condition_builder_no_selection') : apiError}\n setApiError={setApiError}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_single_selection_placeholder')}\n />\n )}\n\n {fieldType === 'TEXT' && !useValueSelector && (\n <Input\n value={rhs.value.toString()}\n onChange={handleValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('empty_value') : undefined}\n name='rhs-text-literal-input'\n label={t('condition_builder_value_label')}\n />\n )}\n\n {(fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (\n <NumericInput\n rhs={rhs}\n onChange={onChange}\n allowDecimal={fieldType !== 'INTEGER'}\n status={showError ? 'error' : undefined}\n unit={fieldUnit}\n />\n )}\n {fieldType === 'TIME_ONLY' && (\n <TimeInput\n value={rhs.value === '' ? undefined : rhs.value}\n withSeconds\n onChange={handleDateValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_time') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n label={t('condition_builder_value_label')}\n />\n )}\n {fieldType === 'DATE_ONLY' && (\n <DateInput\n value={rhs.value}\n onChange={handleDateValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date') : ''}\n label={t('condition_builder_value_label')}\n timeZone={timeZone}\n />\n )}\n {fieldType === 'DATE_TIME' && (\n <DateTimeInput\n value={rhs.value !== '' ? rhs.value : undefined}\n onChange={handleDateValueChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date') : ''}\n label={t('condition_builder_value_label')}\n timeZone={timeZone}\n />\n )}\n </Flex>\n )}\n\n {(fieldType === 'DATE_ONLY' || fieldType === 'DATE_TIME') &&\n (hasProp(rhs, 'relativeDate') || hasProp(rhs, 'dateFunction')) && (\n <Flex item={{ grow: 1 }}>\n <TimePeriodComp\n rhs={rhs}\n fieldType={fieldType}\n onChange={onChange}\n dateFunctionsList={dateFunctions ? dateFunctions[fieldType] : []}\n status={showError ? 'error' : undefined}\n />\n </Flex>\n )}\n\n {/* Multiple-values input */}\n {hasProp(rhs, 'values') && (\n <Flex item={{ grow: 1 }}>\n {useValueSelector && (\n <ValueSelector\n parameters={parameters}\n mode='multi-select'\n values={rhs.values.map(String)}\n selectedField={matchingField}\n comparator={comparator}\n rhs={rhs}\n onChange={handleValueSelection}\n status={showError || apiError ? 'error' : undefined}\n info={showError ? t('condition_builder_no_selection') : apiError}\n setApiError={setApiError}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_multi_selection_placeholder')}\n />\n )}\n {!useValueSelector && (\n <CSVInput\n rhs={rhs}\n field={matchingField}\n onChange={onChange}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_values') : undefined}\n label={t('condition_builder_value_label')}\n placeholder={t('condition_builder_enter_csv_placeholder')}\n />\n )}\n </Flex>\n )}\n\n {hasProp(rhs, 'start') && (\n <Flex item={{ grow: 1 }}>\n {(fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (\n <NumericRangeInput\n label={t('condition_builder_value_label')}\n rhs={{ start: rhs.start.toString(), end: rhs.end.toString() }}\n onChange={handleNumberRangeValueChange}\n status={showError ? 'error' : undefined}\n allowDecimal={fieldType !== 'INTEGER'}\n unit={fieldUnit}\n />\n )}\n\n {fieldType === 'DATE_ONLY' && (\n <DateRangeInput\n value={{ start: rhs.start, end: rhs.end }}\n onChange={handleDateRangeValueChange}\n label={t('condition_builder_value_label')}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date_range') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n timeZone={timeZone}\n />\n )}\n\n {fieldType === 'TIME_ONLY' && (\n <TimeRangeInput\n mode='time'\n value={{\n start: rhs.start === '' ? undefined : rhs.start,\n end: rhs.end === '' ? undefined : rhs.end\n }}\n withSeconds\n onChange={handleDateRangeValueChange}\n label={t('condition_builder_value_label')}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_time_range') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n />\n )}\n\n {fieldType === 'DATE_TIME' && (\n <TimeRangeInput\n mode='datetime'\n value={{ start: rhs.start, end: rhs.end }}\n onChange={handleDateRangeValueChange}\n label={t('condition_builder_value_label')}\n status={showError ? 'error' : undefined}\n info={showError ? t('condition_builder_invalid_date_range') : ''} // NOTE: Using empty quotes to disable the default info which indicates the format\n timeZone={timeZone}\n />\n )}\n </Flex>\n )}\n </Flex>\n );\n};\nexport default RhsControls;\n"]}
@@ -1,4 +1,4 @@
1
- /** Converts an `hh:mm:ss` value into the number of milliseconds since 00:00:00 */
1
+ /** Converts an `hh:mm:ss` or `hh:mm:ss.SSS` value into the number of milliseconds since 00:00:00 */
2
2
  export declare function convertTimeValueToMs(value: string): number;
3
3
  /** Converts a milliseconds value into an `hh:mm:ss` format */
4
4
  export declare function convertMsToTimeValue(value: number): string;
@@ -1 +1 @@
1
- {"version":3,"file":"time-utils.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/time-utils.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa1D"}
1
+ {"version":3,"file":"time-utils.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/time-utils.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa1D"}
@@ -1,11 +1,12 @@
1
- /** Converts an `hh:mm:ss` value into the number of milliseconds since 00:00:00 */
1
+ /** Converts an `hh:mm:ss` or `hh:mm:ss.SSS` value into the number of milliseconds since 00:00:00 */
2
2
  export function convertTimeValueToMs(value) {
3
3
  // Determine the different time components
4
4
  const hh = Number(value.slice(0, 2));
5
5
  const mm = Number(value.slice(3, 5));
6
6
  const ss = Number(value.slice(6, 8));
7
- // Return the number of seconds since 00:00:00
8
- return hh * 60 * 60 * 1000 + mm * 60 * 1000 + ss * 1000;
7
+ const ms = value.length >= 12 && value[8] === '.' ? Number(value.slice(9, 12)) : 0;
8
+ // Return the number of milliseconds since 00:00:00
9
+ return hh * 60 * 60 * 1000 + mm * 60 * 1000 + ss * 1000 + ms;
9
10
  }
10
11
  /** Converts a milliseconds value into an `hh:mm:ss` format */
11
12
  export function convertMsToTimeValue(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"time-utils.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/time-utils.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,0CAA0C;IAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErC,8CAA8C;IAC9C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACnD,KAAK,IAAI,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC","sourcesContent":["/** Converts an `hh:mm:ss` value into the number of milliseconds since 00:00:00 */\nexport function convertTimeValueToMs(value: string): number {\n // Determine the different time components\n const hh = Number(value.slice(0, 2));\n const mm = Number(value.slice(3, 5));\n const ss = Number(value.slice(6, 8));\n\n // Return the number of seconds since 00:00:00\n return hh * 60 * 60 * 1000 + mm * 60 * 1000 + ss * 1000;\n}\n\n/** Converts a milliseconds value into an `hh:mm:ss` format */\nexport function convertMsToTimeValue(value: number): string {\n // Determine the different time components\n const hours = Math.floor(value / (60 * 60 * 1000));\n value -= hours * 60 * 60 * 1000;\n const minutes = Math.floor(value / (60 * 1000));\n value -= minutes * 60 * 1000;\n const seconds = Math.floor(value / 1000);\n\n const hh = hours.toString().padStart(2, '0');\n const mm = minutes.toString().padStart(2, '0');\n const ss = seconds.toString().padStart(2, '0');\n\n return `${hh}:${mm}:${ss}`;\n}\n"]}
1
+ {"version":3,"file":"time-utils.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/time-utils.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,0CAA0C;IAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,mDAAmD;IACnD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;AAC/D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACnD,KAAK,IAAI,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC","sourcesContent":["/** Converts an `hh:mm:ss` or `hh:mm:ss.SSS` value into the number of milliseconds since 00:00:00 */\nexport function convertTimeValueToMs(value: string): number {\n // Determine the different time components\n const hh = Number(value.slice(0, 2));\n const mm = Number(value.slice(3, 5));\n const ss = Number(value.slice(6, 8));\n const ms = value.length >= 12 && value[8] === '.' ? Number(value.slice(9, 12)) : 0;\n\n // Return the number of milliseconds since 00:00:00\n return hh * 60 * 60 * 1000 + mm * 60 * 1000 + ss * 1000 + ms;\n}\n\n/** Converts a milliseconds value into an `hh:mm:ss` format */\nexport function convertMsToTimeValue(value: number): string {\n // Determine the different time components\n const hours = Math.floor(value / (60 * 60 * 1000));\n value -= hours * 60 * 60 * 1000;\n const minutes = Math.floor(value / (60 * 1000));\n value -= minutes * 60 * 1000;\n const seconds = Math.floor(value / 1000);\n\n const hh = hours.toString().padStart(2, '0');\n const mm = minutes.toString().padStart(2, '0');\n const ss = seconds.toString().padStart(2, '0');\n\n return `${hh}:${mm}:${ss}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,SAAS,EAAiB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAsTjF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,qBAAqB,UAAO,EAC5B,eAAe,CAAC,EAAE,MAAM,EACxB,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,CAsCX"}
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,SAAS,EAAiB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AA6VjF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,qBAAqB,UAAO,EAC5B,eAAe,CAAC,EAAE,MAAM,EACxB,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,CAsCX"}
@@ -2,9 +2,34 @@
2
2
  import dayjs from 'dayjs';
3
3
  import './extendDayJs';
4
4
  import { hasProp } from '@pega/cosmos-react-core';
5
- import { truncateISODateString } from '../RhsControls';
6
5
  import { getItem, isAbsoluteDateString } from './utils';
7
6
  import { convertTimeValueToMs } from './time-utils';
7
+ /** Expand a date's precision to the floor (start) or ceil (end) boundary.
8
+ * `timePartsCount` is the number of colon-separated segments in the time string
9
+ * (2 = HH:MM, 3 = HH:MM:SS, 4+ = already has ms). */
10
+ function expandPrecision(date, timePartsCount, boundary) {
11
+ if (boundary === 'start') {
12
+ if (timePartsCount <= 2)
13
+ return date.second(0).millisecond(0);
14
+ if (timePartsCount === 3)
15
+ return date.millisecond(0);
16
+ return date;
17
+ }
18
+ // boundary === 'end'
19
+ if (timePartsCount <= 2)
20
+ return date.second(59).millisecond(999);
21
+ if (timePartsCount === 3)
22
+ return date.millisecond(999);
23
+ return date;
24
+ }
25
+ function formatTimeOnlyComparisonValue(date) {
26
+ const utcDate = date.utc();
27
+ const hh = utcDate.hour().toString().padStart(2, '0');
28
+ const mm = utcDate.minute().toString().padStart(2, '0');
29
+ const ss = utcDate.second().toString().padStart(2, '0');
30
+ const ms = utcDate.millisecond().toString().padStart(3, '0');
31
+ return `${hh}:${mm}:${ss}.${ms}`;
32
+ }
8
33
  const dayjsDateParts = {
9
34
  SECONDS: 'second',
10
35
  MINUTES: 'minute',
@@ -20,62 +45,44 @@ function getConditionForBetweenComparator(start, end, node) {
20
45
  return node.comparator === 'BTW'
21
46
  ? {
22
47
  AND: [
23
- {
24
- condition: {
25
- lhs: node.lhs,
26
- comparator: 'GTE',
27
- rhs: { value: start }
28
- }
29
- },
30
- {
31
- condition: {
32
- lhs: node.lhs,
33
- comparator: 'LTE',
34
- rhs: { value: end }
35
- }
36
- }
48
+ { condition: { lhs: node.lhs, comparator: 'GTE', rhs: { value: start } } },
49
+ { condition: { lhs: node.lhs, comparator: 'LTE', rhs: { value: end } } }
37
50
  ]
38
51
  }
39
52
  : {
40
53
  OR: [
41
- {
42
- condition: {
43
- lhs: node.lhs,
44
- comparator: 'LT',
45
- rhs: { value: start }
46
- }
47
- },
48
- {
49
- condition: {
50
- lhs: node.lhs,
51
- comparator: 'GT',
52
- rhs: { value: end }
53
- }
54
- }
54
+ { condition: { lhs: node.lhs, comparator: 'LT', rhs: { value: start } } },
55
+ { condition: { lhs: node.lhs, comparator: 'GT', rhs: { value: end } } }
55
56
  ]
56
57
  };
57
58
  }
58
59
  function getDateStringInTimezone(d, tz) {
59
60
  return d.tz(tz).format('YYYY-MM-DDTHH:mm:ss.SSS');
60
61
  }
62
+ /** Format an expanded Dayjs value for a given field type, applying timezone for DATE_TIME. */
63
+ function formatBoundaryValue(d, lhsFieldType, tz, outputUTC) {
64
+ if (lhsFieldType === 'TIME_ONLY') {
65
+ return formatTimeOnlyComparisonValue(d);
66
+ }
67
+ let isoString;
68
+ if (tz) {
69
+ isoString = getDateStringInTimezone(d, tz);
70
+ }
71
+ else if (outputUTC) {
72
+ isoString = d.toISOString();
73
+ }
74
+ else {
75
+ const time = d.toDate().getTime();
76
+ const timezoneOffset = new Date(time).getTimezoneOffset() * 60000;
77
+ isoString = new Date(time - timezoneOffset).toISOString().slice(0, -1);
78
+ }
79
+ if (lhsFieldType === 'DATE_ONLY')
80
+ return isoString.substring(0, isoString.indexOf('T'));
81
+ return isoString;
82
+ }
61
83
  /** Construct a date-range filter based on the given date bounds and the comparator */
62
- function getConditionFromRange(startDate, endDate, node, lhsFieldType, timezone) {
63
- const formatDate = (d, tz) => {
64
- let isoString;
65
- if (tz) {
66
- isoString = getDateStringInTimezone(d, tz);
67
- }
68
- else {
69
- const time = d.toDate().getTime();
70
- const timezoneOffset = new Date(time).getTimezoneOffset() * 60000;
71
- isoString = new Date(time - timezoneOffset).toISOString().slice(0, -1);
72
- }
73
- if (lhsFieldType === 'TIME_ONLY')
74
- return truncateISODateString(isoString, lhsFieldType);
75
- if (lhsFieldType === 'DATE_ONLY')
76
- return isoString.substring(0, isoString.indexOf('T'));
77
- return isoString;
78
- };
84
+ function getConditionFromRange(startDate, endDate, node, lhsFieldType, timezone, outputUTC) {
85
+ const formatDate = (d, tz) => formatBoundaryValue(d, lhsFieldType, tz, outputUTC);
79
86
  switch (node.comparator) {
80
87
  case 'EQ':
81
88
  return {
@@ -116,6 +123,7 @@ function getConditionFromRange(startDate, endDate, node, lhsFieldType, timezone)
116
123
  ]
117
124
  };
118
125
  case 'GT':
126
+ // Strict comparisons skip the whole selected precision unit.
119
127
  return {
120
128
  condition: {
121
129
  lhs: node.lhs,
@@ -124,6 +132,7 @@ function getConditionFromRange(startDate, endDate, node, lhsFieldType, timezone)
124
132
  }
125
133
  };
126
134
  case 'GTE':
135
+ // Inclusive comparisons include the whole selected precision unit.
127
136
  return {
128
137
  condition: {
129
138
  lhs: node.lhs,
@@ -132,6 +141,7 @@ function getConditionFromRange(startDate, endDate, node, lhsFieldType, timezone)
132
141
  }
133
142
  };
134
143
  case 'LT':
144
+ // Strict comparisons skip the whole selected precision unit.
135
145
  return {
136
146
  condition: {
137
147
  lhs: node.lhs,
@@ -140,6 +150,7 @@ function getConditionFromRange(startDate, endDate, node, lhsFieldType, timezone)
140
150
  }
141
151
  };
142
152
  case 'LTE':
153
+ // Inclusive comparisons include the whole selected precision unit.
143
154
  return {
144
155
  condition: {
145
156
  lhs: node.lhs,
@@ -159,7 +170,15 @@ function transformLeafCondition(node, fields, transformRelativeDate = true, curr
159
170
  if (!field || !hasProp(field, 'type')) {
160
171
  return { condition: node }; // Safety check
161
172
  }
162
- if ((node.comparator === 'EQ' || node.comparator === 'NEQ') &&
173
+ // Expand precision for single-value comparators on DATE_TIME and TIME_ONLY fields.
174
+ // For values with less precision than the storage format (e.g. HH:MM without seconds),
175
+ // expand the hidden precision to create correct boundary values for comparison.
176
+ if ((node.comparator === 'EQ' ||
177
+ node.comparator === 'NEQ' ||
178
+ node.comparator === 'GT' ||
179
+ node.comparator === 'GTE' ||
180
+ node.comparator === 'LT' ||
181
+ node.comparator === 'LTE') &&
163
182
  node.rhs &&
164
183
  hasProp(node.rhs, 'value') &&
165
184
  Object.keys(node.rhs).length === 1 &&
@@ -168,30 +187,20 @@ function transformLeafCondition(node, fields, transformRelativeDate = true, curr
168
187
  const timePartsCount = dateTime.split(':').length;
169
188
  if (field.type === 'DATE_TIME') {
170
189
  const date = isAbsoluteDateString(dateTime)
171
- ? dayjs(dateTime).tz(timezone)
190
+ ? dayjs.utc(dateTime)
172
191
  : dayjs.tz(dateTime, timezone);
173
- let startDate = date;
174
- let endDate = date;
175
- // For HH:MM:SS expand milliseconds to 0-999
176
- if (timePartsCount === 3) {
177
- startDate = startDate.millisecond(0);
178
- endDate = endDate.millisecond(999);
179
- return getConditionFromRange(startDate, endDate, node, field.type, timezone);
180
- }
181
- // HH:MM expand seconds to 0-59
182
- if (timePartsCount === 2) {
183
- startDate = startDate.second(0).millisecond(0);
184
- endDate = endDate.second(59).millisecond(999);
185
- return getConditionFromRange(startDate, endDate, node, field.type, timezone);
192
+ const startDate = expandPrecision(date, timePartsCount, 'start');
193
+ const endDate = expandPrecision(date, timePartsCount, 'end');
194
+ if (timePartsCount <= 3) {
195
+ return getConditionFromRange(startDate, endDate, node, field.type, timezone, isAbsoluteDateString(dateTime));
186
196
  }
187
197
  }
188
198
  else if (field.type === 'TIME_ONLY') {
189
199
  const dateTimeMs = convertTimeValueToMs(node.rhs.value);
190
- // HH:MM expand seconds to 0-59
191
- if (timePartsCount === 2) {
192
- const startDate = dayjs(dateTimeMs).tz(timezone).second(0).millisecond(0);
193
- const endDate = dayjs(dateTimeMs).tz(timezone).second(59).millisecond(0);
194
- return getConditionFromRange(startDate, endDate, node, field.type, timezone);
200
+ if (timePartsCount <= 3) {
201
+ const startDate = expandPrecision(dayjs.utc(dateTimeMs), timePartsCount, 'start');
202
+ const endDate = expandPrecision(dayjs.utc(dateTimeMs), timePartsCount, 'end');
203
+ return getConditionFromRange(startDate, endDate, node, field.type);
195
204
  }
196
205
  }
197
206
  }
@@ -232,16 +241,23 @@ function transformLeafCondition(node, fields, transformRelativeDate = true, curr
232
241
  }
233
242
  // Transform double range comparators (BTW, NOT_BTW) into equivalent pair of single range comparators
234
243
  if (node.rhs && hasProp(node.rhs, 'start')) {
235
- if (field.type === 'DECIMAL' || field.type === 'INTEGER' || field.type === 'TIME_ONLY') {
244
+ if (field.type === 'DECIMAL' || field.type === 'INTEGER') {
236
245
  return getConditionForBetweenComparator(node.rhs.start, node.rhs.end, node);
237
246
  }
238
- const startDate = typeof node.rhs.start === 'number' || isAbsoluteDateString(node.rhs.start)
239
- ? dayjs(node.rhs.start).tz(timezone)
240
- : dayjs.tz(node.rhs.start, timezone);
241
- const endDate = typeof node.rhs.end === 'number' || isAbsoluteDateString(node.rhs.end)
242
- ? dayjs(node.rhs.end).tz(timezone)
243
- : dayjs.tz(node.rhs.end, timezone);
244
- return getConditionFromRange(startDate, endDate, node, field.type, timezone);
247
+ const expandBound = (value, boundary) => {
248
+ if (field.type === 'TIME_ONLY') {
249
+ const parts = typeof value === 'string' ? value.split(':').length : 3;
250
+ const ms = typeof value === 'number' ? value : convertTimeValueToMs(value);
251
+ return expandPrecision(dayjs.utc(ms), parts, boundary).valueOf();
252
+ }
253
+ const isAbsolute = typeof value === 'number' || isAbsoluteDateString(value);
254
+ const date = isAbsolute ? dayjs.utc(value) : dayjs.tz(value, timezone);
255
+ if (field.type !== 'DATE_TIME')
256
+ return formatBoundaryValue(date, field.type, timezone, isAbsolute);
257
+ const parts = typeof value === 'string' ? value.split(':').length : 4;
258
+ return formatBoundaryValue(expandPrecision(date, parts, boundary), 'DATE_TIME', timezone, isAbsolute);
259
+ };
260
+ return getConditionForBetweenComparator(expandBound(node.rhs.start, 'start'), expandBound(node.rhs.end, 'end'), node);
245
261
  }
246
262
  // apply timezone to date-time fields
247
263
  if (timezone && field.type === 'DATE_TIME' && node.rhs && !hasProp(node.rhs, 'dateFunction')) {
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,cAAc,GAAgC;IAClD,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,MAAmB;IAC1B,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,+EAA+E;AAC/E,SAAS,gCAAgC,CACvC,KAAsB,EACtB,GAAoB,EACpB,IAAmB;IAEnB,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK;QAC9B,CAAC,CAAC;YACE,GAAG,EAAE;gBACH;oBACE,SAAS,EAAE;wBACT,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,UAAU,EAAE,KAAK;wBACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;qBACtB;iBACF;gBACD;oBACE,SAAS,EAAE;wBACT,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,UAAU,EAAE,KAAK;wBACjB,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;qBACpB;iBACF;aACF;SACF;QACH,CAAC,CAAC;YACE,EAAE,EAAE;gBACF;oBACE,SAAS,EAAE;wBACT,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,UAAU,EAAE,IAAI;wBAChB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;qBACtB;iBACF;gBACD;oBACE,SAAS,EAAE;wBACT,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,UAAU,EAAE,IAAI;wBAChB,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;qBACpB;iBACF;aACF;SACF,CAAC;AACR,CAAC;AAED,SAAS,uBAAuB,CAAC,CAAQ,EAAE,EAAW;IACpD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;AACpD,CAAC;AAED,sFAAsF;AACtF,SAAS,qBAAqB,CAC5B,SAAgB,EAChB,OAAc,EACd,IAAmB,EACnB,YAAuB,EACvB,QAAiB;IAEjB,MAAM,UAAU,GAAG,CAAC,CAAQ,EAAE,EAAW,EAAU,EAAE;QACnD,IAAI,SAAiB,CAAC;QACtB,IAAI,EAAE,EAAE,CAAC;YACP,SAAS,GAAG,uBAAuB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC;YAClE,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,YAAY,KAAK,WAAW;YAAE,OAAO,qBAAqB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACxF,IAAI,YAAY,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACxF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,IAAI;YACP,OAAO;gBACL,GAAG,EAAE;oBACH;wBACE,SAAS,EAAE;4BACT,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,UAAU,EAAE,KAAK;4BACjB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;yBAC9C;qBACF;oBACD;wBACE,SAAS,EAAE;4BACT,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,UAAU,EAAE,KAAK;4BACjB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;yBAChD;qBACF;iBACF;aACF,CAAC;QACJ,KAAK,KAAK;YACR,OAAO;gBACL,EAAE,EAAE;oBACF;wBACE,SAAS,EAAE;4BACT,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,UAAU,EAAE,IAAI;4BAChB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;yBAC9C;qBACF;oBACD;wBACE,SAAS,EAAE;4BACT,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,UAAU,EAAE,IAAI;4BAChB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;yBAChD;qBACF;iBACF;aACF,CAAC;QACJ,KAAK,IAAI;YACP,OAAO;gBACL,SAAS,EAAE;oBACT,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,UAAU,EAAE,IAAI;oBAChB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;iBAC9C;aACF,CAAC;QACJ,KAAK,KAAK;YACR,OAAO;gBACL,SAAS,EAAE;oBACT,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,UAAU,EAAE,KAAK;oBACjB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;iBAChD;aACF,CAAC;QACJ,KAAK,IAAI;YACP,OAAO;gBACL,SAAS,EAAE;oBACT,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,UAAU,EAAE,IAAI;oBAChB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;iBAChD;aACF,CAAC;QACJ,KAAK,KAAK;YACR,OAAO;gBACL,SAAS,EAAE;oBACT,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,UAAU,EAAE,KAAK;oBACjB,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;iBAC9C;aACF,CAAC;QACJ,KAAK,KAAK,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,gCAAgC,CACrC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC/B,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC7B,IAAI,CACL,CAAC;QACJ;YACE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAmB,EACnB,MAAe,EACf,qBAAqB,GAAG,IAAI,EAC5B,eAAwB,EACxB,QAAiB;IAEjB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,eAAe;IAC7C,CAAC;IAED,IACE,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC;QACvD,IAAI,CAAC,GAAG;QACR,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,EAClC,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAEhC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAClD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC;gBACzC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;gBAC9B,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjC,IAAI,SAAS,GAAG,IAAI,CAAC;YACrB,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,4CAA4C;YAC5C,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;gBACzB,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACrC,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAEnC,OAAO,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/E,CAAC;YACD,+BAA+B;YAC/B,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;gBACzB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC9C,OAAO,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAExD,+BAA+B;YAC/B,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACzE,OAAO,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,IAAI,IAAI,CAAC,GAAG,IAAI,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC;QAC3E,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;QACjE,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,GAAG,GACP,CAAC,eAAe,IAAI,oBAAoB,CAAC,eAAe,CAAC;YACvD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;YAChD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAE1C,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACvC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,UAAU,KAAK,MAAM,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAC9D,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,UAAU,KAAK,UAAU,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClE,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACzE,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,UAAU,KAAK,MAAM,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAC9D,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC7D,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,6DAA6D;IAC7D,8EAA8E;IAC9E,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;QACvF,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACxE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;YAC3E,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,iEAAiE;QAE1H,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,iDAAiD;QACrH,OAAO,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,qGAAqG;IACrG,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACvF,OAAO,gCAAgC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACxE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;YACpC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzC,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACpE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;YAClC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEvC,OAAO,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,qCAAqC;IACrC,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC;QAC7F,MAAM,OAAO,GAAkB,EAAE,GAAG,IAAI,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,uBAAuB,CACzC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC9E,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC1B,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EACzC,QAAQ,CACT,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;YAClD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACpD,uBAAuB,CACrB,OAAO,CAAC,KAAK,QAAQ,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EACnF,QAAQ,CACT,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,sBAAsB;IACtB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,SAAoB,EACpB,MAAe,EACf,qBAAqB,GAAG,IAAI,EAC5B,eAAwB,EACxB,QAAiB;IAEjB,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAgB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACpD,yBAAyB,CAAC,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,eAAe,EAAE,QAAQ,CAAC,CACvF,CAAC;QACF,OAAO;YACL,GAAG,EAAE,UAAU;SAChB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAgB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACnD,yBAAyB,CAAC,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,eAAe,EAAE,QAAQ,CAAC,CACvF,CAAC;QACF,OAAO;YACL,EAAE,EAAE,UAAU;SACf,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,GAAG,EAAE,yBAAyB,CAC5B,SAAS,CAAC,GAAG,EACb,MAAM,EACN,qBAAqB,EACrB,eAAe,EACf,QAAQ,CACT;SACF,CAAC;IACJ,CAAC;IAED,OAAO,sBAAsB,CAC3B,SAAS,CAAC,SAAS,EACnB,MAAM,EACN,qBAAqB,EACrB,eAAe,EACf,QAAQ,CACT,CAAC;AACJ,CAAC","sourcesContent":["// cspell:words DDTHH\nimport dayjs from 'dayjs';\nimport type { Dayjs, QUnitType } from 'dayjs';\nimport './extendDayJs';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport type { Condition, LeafCondition, Field } from '../ConditionBuilder.types';\nimport { truncateISODateString } from '../RhsControls';\n\nimport { getItem, isAbsoluteDateString } from './utils';\nimport type { DatePart, FieldType } from './types';\nimport { convertTimeValueToMs } from './time-utils';\n\nconst dayjsDateParts: Record<DatePart, QUnitType> = {\n SECONDS: 'second',\n MINUTES: 'minute',\n HOURS: 'hour',\n DAYS: 'day',\n WEEKS: 'week' as QUnitType,\n QUARTERS: 'quarter',\n MONTHS: 'month',\n YEARS: 'year'\n};\n\n/** Construct Condition with two range comparators based on the given bounds */\nfunction getConditionForBetweenComparator(\n start: string | number,\n end: string | number,\n node: LeafCondition\n): Condition {\n return node.comparator === 'BTW'\n ? {\n AND: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: start }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: end }\n }\n }\n ]\n }\n : {\n OR: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: start }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: end }\n }\n }\n ]\n };\n}\n\nfunction getDateStringInTimezone(d: Dayjs, tz?: string): string {\n return d.tz(tz).format('YYYY-MM-DDTHH:mm:ss.SSS');\n}\n\n/** Construct a date-range filter based on the given date bounds and the comparator */\nfunction getConditionFromRange(\n startDate: Dayjs,\n endDate: Dayjs,\n node: LeafCondition,\n lhsFieldType: FieldType,\n timezone?: string\n): Condition {\n const formatDate = (d: Dayjs, tz?: string): string => {\n let isoString: string;\n if (tz) {\n isoString = getDateStringInTimezone(d, tz);\n } else {\n const time = d.toDate().getTime();\n const timezoneOffset = new Date(time).getTimezoneOffset() * 60000;\n isoString = new Date(time - timezoneOffset).toISOString().slice(0, -1);\n }\n if (lhsFieldType === 'TIME_ONLY') return truncateISODateString(isoString, lhsFieldType);\n if (lhsFieldType === 'DATE_ONLY') return isoString.substring(0, isoString.indexOf('T'));\n return isoString;\n };\n\n switch (node.comparator) {\n case 'EQ':\n return {\n AND: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: formatDate(endDate, timezone) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: formatDate(startDate, timezone) }\n }\n }\n ]\n };\n case 'NEQ':\n return {\n OR: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: formatDate(endDate, timezone) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: formatDate(startDate, timezone) }\n }\n }\n ]\n };\n case 'GT':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: formatDate(endDate, timezone) }\n }\n };\n case 'GTE':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: formatDate(startDate, timezone) }\n }\n };\n case 'LT':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: formatDate(startDate, timezone) }\n }\n };\n case 'LTE':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: formatDate(endDate, timezone) }\n }\n };\n case 'BTW':\n case 'NOT_BTW':\n return getConditionForBetweenComparator(\n formatDate(startDate, timezone),\n formatDate(endDate, timezone),\n node\n );\n default:\n return { condition: node };\n }\n}\n\nfunction transformLeafCondition(\n node: LeafCondition,\n fields: Field[],\n transformRelativeDate = true,\n currentDateTime?: string,\n timezone?: string\n): Condition {\n const field = getItem(fields, node.lhs.field);\n\n if (!field || !hasProp(field, 'type')) {\n return { condition: node }; // Safety check\n }\n\n if (\n (node.comparator === 'EQ' || node.comparator === 'NEQ') &&\n node.rhs &&\n hasProp(node.rhs, 'value') &&\n Object.keys(node.rhs).length === 1 &&\n typeof node.rhs.value === 'string'\n ) {\n const dateTime = node.rhs.value;\n\n const timePartsCount = dateTime.split(':').length;\n if (field.type === 'DATE_TIME') {\n const date = isAbsoluteDateString(dateTime)\n ? dayjs(dateTime).tz(timezone)\n : dayjs.tz(dateTime, timezone);\n let startDate = date;\n let endDate = date;\n // For HH:MM:SS expand milliseconds to 0-999\n if (timePartsCount === 3) {\n startDate = startDate.millisecond(0);\n endDate = endDate.millisecond(999);\n\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n // HH:MM expand seconds to 0-59\n if (timePartsCount === 2) {\n startDate = startDate.second(0).millisecond(0);\n endDate = endDate.second(59).millisecond(999);\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n } else if (field.type === 'TIME_ONLY') {\n const dateTimeMs = convertTimeValueToMs(node.rhs.value);\n\n // HH:MM expand seconds to 0-59\n if (timePartsCount === 2) {\n const startDate = dayjs(dateTimeMs).tz(timezone).second(0).millisecond(0);\n const endDate = dayjs(dateTimeMs).tz(timezone).second(59).millisecond(0);\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n }\n }\n\n // Transform Relative date filters into equivalent date range filters\n if (node.rhs && transformRelativeDate && hasProp(node.rhs, 'relativeDate')) {\n const { timePeriod, interval, datePart } = node.rhs.relativeDate;\n const dayjsDatePart = dayjsDateParts[datePart];\n const now =\n !currentDateTime || isAbsoluteDateString(currentDateTime)\n ? dayjs.utc(dayjs(currentDateTime)).tz(timezone)\n : dayjs.tz(currentDateTime, timezone);\n\n let startDate = now;\n let endDate = now;\n if (timePeriod === 'CURRENT') {\n startDate = now.startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart);\n } else if (timePeriod === 'LAST' && interval && interval >= 1) {\n startDate = now.subtract(interval, dayjsDatePart);\n } else if (timePeriod === 'PREVIOUS' && interval && interval >= 1) {\n startDate = now.startOf(dayjsDatePart).subtract(interval, dayjsDatePart);\n endDate = now.subtract(1, dayjsDatePart).endOf(dayjsDatePart);\n } else if (timePeriod === 'NEXT' && interval && interval >= 1) {\n startDate = now.add(1, dayjsDatePart).startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart).add(interval, dayjsDatePart);\n }\n\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n\n // Transform WEEKS-filters into equivalent date-range filters\n // NOTE: This is a work-around until we make startOfDay customizable for Weeks\n if (node.rhs && hasProp(node.rhs, 'dateFunction') && node.rhs.dateFunction === 'WEEKS') {\n const startDate =\n typeof node.rhs.value === 'number' || isAbsoluteDateString(node.rhs.value)\n ? dayjs.utc(dayjs(node.rhs.value).tz(timezone)).startOf('day').tz(timezone)\n : dayjs.tz(node.rhs.value, timezone).startOf('day'); // Since we store it as YYYY-MM-DD, it's already the start of day\n\n const endDate = startDate.add(7, 'day').subtract(1, 'millisecond'); // Last millisecond on the 7th day from startDate\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n\n // Transform double range comparators (BTW, NOT_BTW) into equivalent pair of single range comparators\n if (node.rhs && hasProp(node.rhs, 'start')) {\n if (field.type === 'DECIMAL' || field.type === 'INTEGER' || field.type === 'TIME_ONLY') {\n return getConditionForBetweenComparator(node.rhs.start, node.rhs.end, node);\n }\n\n const startDate =\n typeof node.rhs.start === 'number' || isAbsoluteDateString(node.rhs.start)\n ? dayjs(node.rhs.start).tz(timezone)\n : dayjs.tz(node.rhs.start, timezone);\n const endDate =\n typeof node.rhs.end === 'number' || isAbsoluteDateString(node.rhs.end)\n ? dayjs(node.rhs.end).tz(timezone)\n : dayjs.tz(node.rhs.end, timezone);\n\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n\n // apply timezone to date-time fields\n if (timezone && field.type === 'DATE_TIME' && node.rhs && !hasProp(node.rhs, 'dateFunction')) {\n const newNode: LeafCondition = { ...node };\n if (newNode.rhs && hasProp(newNode.rhs, 'value')) {\n newNode.rhs.value = getDateStringInTimezone(\n typeof newNode.rhs.value === 'number' || isAbsoluteDateString(newNode.rhs.value)\n ? dayjs(newNode.rhs.value)\n : dayjs.tz(newNode.rhs.value, timezone),\n timezone\n );\n }\n if (newNode.rhs && hasProp(newNode.rhs, 'values')) {\n const valuesWithTimezone = newNode.rhs.values.map(v =>\n getDateStringInTimezone(\n typeof v === 'number' || isAbsoluteDateString(v) ? dayjs(v) : dayjs.tz(v, timezone),\n timezone\n )\n );\n newNode.rhs.values = valuesWithTimezone;\n }\n return { condition: newNode };\n }\n\n // For all other cases\n return { condition: node };\n}\n\n/** This function transforms Conditions with Relative Dates into Conditions with Date Ranges.\n * Do not use this function unless you need to convert Relative Dates into Date Ranges.\n *\n * If `currentDateTime` is not provided, the current system time will be used.\n * If `timezone` is not provided, the system's timezone will be used for conversion.\n *\n * The `timezone` prop is applied to the date-time values within the condition when the transformation occurs.\n * If `timezone` is specified, the date-time will be converted from UTC (or the provided reference time) to the specified timezone.\n * Then, the transformed date will be used to generate a range.\n * This transformation ensures that the start and end times account for timezone differences when considering the condition's range.\n *\n * For example:\n * - A UTC date-time `2025-05-12T11:24:45.946Z` will be transformed to `2025-05-12T07:24:45.946-04:00` (in the `-04:00` timezone).\n * The date-time will then be converted into a range:\n * `[\"2025-05-12T07:24:45.000\", \"2025-05-12T07:24:45.999\"]`.\n * - A date-time without a timezone (`2025-05-12T11:24:45.946`) will be parsed in the timezone (e.g., `-04:00`).\n * The parsed time will then be transformed into a range like:\n * `[\"2025-05-12T11:24:45.000\", \"2025-05-12T11:24:45.999\"]`.\n *\n */\nexport default function transformComplexCondition(\n condition: Condition,\n fields: Field[],\n transformRelativeDate = true,\n currentDateTime?: string,\n timezone?: string\n): Condition {\n if (hasProp(condition, 'AND')) {\n const childNodes: Condition[] = condition.AND.map(n =>\n transformComplexCondition(n, fields, transformRelativeDate, currentDateTime, timezone)\n );\n return {\n AND: childNodes\n };\n }\n\n if (hasProp(condition, 'OR')) {\n const childNodes: Condition[] = condition.OR.map(n =>\n transformComplexCondition(n, fields, transformRelativeDate, currentDateTime, timezone)\n );\n return {\n OR: childNodes\n };\n }\n\n if (hasProp(condition, 'NOT')) {\n return {\n NOT: transformComplexCondition(\n condition.NOT,\n fields,\n transformRelativeDate,\n currentDateTime,\n timezone\n )\n };\n }\n\n return transformLeafCondition(\n condition.condition,\n fields,\n transformRelativeDate,\n currentDateTime,\n timezone\n );\n}\n"]}
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:words DDTHH\nimport dayjs from 'dayjs';\nimport type { Dayjs, QUnitType } from 'dayjs';\nimport './extendDayJs';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport type { Condition, LeafCondition, Field } from '../ConditionBuilder.types';\n\nimport { getItem, isAbsoluteDateString } from './utils';\nimport type { DatePart, FieldType } from './types';\nimport { convertTimeValueToMs } from './time-utils';\n\n/** Expand a date's precision to the floor (start) or ceil (end) boundary.\n * `timePartsCount` is the number of colon-separated segments in the time string\n * (2 = HH:MM, 3 = HH:MM:SS, 4+ = already has ms). */\nfunction expandPrecision(date: Dayjs, timePartsCount: number, boundary: 'start' | 'end'): Dayjs {\n if (boundary === 'start') {\n if (timePartsCount <= 2) return date.second(0).millisecond(0);\n if (timePartsCount === 3) return date.millisecond(0);\n return date;\n }\n // boundary === 'end'\n if (timePartsCount <= 2) return date.second(59).millisecond(999);\n if (timePartsCount === 3) return date.millisecond(999);\n return date;\n}\n\nfunction formatTimeOnlyComparisonValue(date: Dayjs): string {\n const utcDate = date.utc();\n const hh = utcDate.hour().toString().padStart(2, '0');\n const mm = utcDate.minute().toString().padStart(2, '0');\n const ss = utcDate.second().toString().padStart(2, '0');\n const ms = utcDate.millisecond().toString().padStart(3, '0');\n return `${hh}:${mm}:${ss}.${ms}`;\n}\n\nconst dayjsDateParts: Record<DatePart, QUnitType> = {\n SECONDS: 'second',\n MINUTES: 'minute',\n HOURS: 'hour',\n DAYS: 'day',\n WEEKS: 'week' as QUnitType,\n QUARTERS: 'quarter',\n MONTHS: 'month',\n YEARS: 'year'\n};\n\n/** Construct Condition with two range comparators based on the given bounds */\nfunction getConditionForBetweenComparator(\n start: string | number,\n end: string | number,\n node: LeafCondition\n): Condition {\n return node.comparator === 'BTW'\n ? {\n AND: [\n { condition: { lhs: node.lhs, comparator: 'GTE', rhs: { value: start } } },\n { condition: { lhs: node.lhs, comparator: 'LTE', rhs: { value: end } } }\n ]\n }\n : {\n OR: [\n { condition: { lhs: node.lhs, comparator: 'LT', rhs: { value: start } } },\n { condition: { lhs: node.lhs, comparator: 'GT', rhs: { value: end } } }\n ]\n };\n}\n\nfunction getDateStringInTimezone(d: Dayjs, tz?: string): string {\n return d.tz(tz).format('YYYY-MM-DDTHH:mm:ss.SSS');\n}\n\n/** Format an expanded Dayjs value for a given field type, applying timezone for DATE_TIME. */\nfunction formatBoundaryValue(\n d: Dayjs,\n lhsFieldType: FieldType,\n tz?: string,\n outputUTC?: boolean\n): string {\n if (lhsFieldType === 'TIME_ONLY') {\n return formatTimeOnlyComparisonValue(d);\n }\n let isoString: string;\n if (tz) {\n isoString = getDateStringInTimezone(d, tz);\n } else if (outputUTC) {\n isoString = d.toISOString();\n } else {\n const time = d.toDate().getTime();\n const timezoneOffset = new Date(time).getTimezoneOffset() * 60000;\n isoString = new Date(time - timezoneOffset).toISOString().slice(0, -1);\n }\n if (lhsFieldType === 'DATE_ONLY') return isoString.substring(0, isoString.indexOf('T'));\n return isoString;\n}\n\n/** Construct a date-range filter based on the given date bounds and the comparator */\nfunction getConditionFromRange(\n startDate: Dayjs,\n endDate: Dayjs,\n node: LeafCondition,\n lhsFieldType: FieldType,\n timezone?: string,\n outputUTC?: boolean\n): Condition {\n const formatDate = (d: Dayjs, tz?: string): string =>\n formatBoundaryValue(d, lhsFieldType, tz, outputUTC);\n\n switch (node.comparator) {\n case 'EQ':\n return {\n AND: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: formatDate(endDate, timezone) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: formatDate(startDate, timezone) }\n }\n }\n ]\n };\n case 'NEQ':\n return {\n OR: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: formatDate(endDate, timezone) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: formatDate(startDate, timezone) }\n }\n }\n ]\n };\n case 'GT':\n // Strict comparisons skip the whole selected precision unit.\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: formatDate(endDate, timezone) }\n }\n };\n case 'GTE':\n // Inclusive comparisons include the whole selected precision unit.\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: formatDate(startDate, timezone) }\n }\n };\n case 'LT':\n // Strict comparisons skip the whole selected precision unit.\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: formatDate(startDate, timezone) }\n }\n };\n case 'LTE':\n // Inclusive comparisons include the whole selected precision unit.\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: formatDate(endDate, timezone) }\n }\n };\n case 'BTW':\n case 'NOT_BTW':\n return getConditionForBetweenComparator(\n formatDate(startDate, timezone),\n formatDate(endDate, timezone),\n node\n );\n default:\n return { condition: node };\n }\n}\n\nfunction transformLeafCondition(\n node: LeafCondition,\n fields: Field[],\n transformRelativeDate = true,\n currentDateTime?: string,\n timezone?: string\n): Condition {\n const field = getItem(fields, node.lhs.field);\n\n if (!field || !hasProp(field, 'type')) {\n return { condition: node }; // Safety check\n }\n\n // Expand precision for single-value comparators on DATE_TIME and TIME_ONLY fields.\n // For values with less precision than the storage format (e.g. HH:MM without seconds),\n // expand the hidden precision to create correct boundary values for comparison.\n if (\n (node.comparator === 'EQ' ||\n node.comparator === 'NEQ' ||\n node.comparator === 'GT' ||\n node.comparator === 'GTE' ||\n node.comparator === 'LT' ||\n node.comparator === 'LTE') &&\n node.rhs &&\n hasProp(node.rhs, 'value') &&\n Object.keys(node.rhs).length === 1 &&\n typeof node.rhs.value === 'string'\n ) {\n const dateTime = node.rhs.value;\n\n const timePartsCount = dateTime.split(':').length;\n if (field.type === 'DATE_TIME') {\n const date = isAbsoluteDateString(dateTime)\n ? dayjs.utc(dateTime)\n : dayjs.tz(dateTime, timezone);\n const startDate = expandPrecision(date, timePartsCount, 'start');\n const endDate = expandPrecision(date, timePartsCount, 'end');\n\n if (timePartsCount <= 3) {\n return getConditionFromRange(\n startDate,\n endDate,\n node,\n field.type,\n timezone,\n isAbsoluteDateString(dateTime)\n );\n }\n } else if (field.type === 'TIME_ONLY') {\n const dateTimeMs = convertTimeValueToMs(node.rhs.value);\n\n if (timePartsCount <= 3) {\n const startDate = expandPrecision(dayjs.utc(dateTimeMs), timePartsCount, 'start');\n const endDate = expandPrecision(dayjs.utc(dateTimeMs), timePartsCount, 'end');\n return getConditionFromRange(startDate, endDate, node, field.type);\n }\n }\n }\n\n // Transform Relative date filters into equivalent date range filters\n if (node.rhs && transformRelativeDate && hasProp(node.rhs, 'relativeDate')) {\n const { timePeriod, interval, datePart } = node.rhs.relativeDate;\n const dayjsDatePart = dayjsDateParts[datePart];\n const now =\n !currentDateTime || isAbsoluteDateString(currentDateTime)\n ? dayjs.utc(dayjs(currentDateTime)).tz(timezone)\n : dayjs.tz(currentDateTime, timezone);\n\n let startDate = now;\n let endDate = now;\n if (timePeriod === 'CURRENT') {\n startDate = now.startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart);\n } else if (timePeriod === 'LAST' && interval && interval >= 1) {\n startDate = now.subtract(interval, dayjsDatePart);\n } else if (timePeriod === 'PREVIOUS' && interval && interval >= 1) {\n startDate = now.startOf(dayjsDatePart).subtract(interval, dayjsDatePart);\n endDate = now.subtract(1, dayjsDatePart).endOf(dayjsDatePart);\n } else if (timePeriod === 'NEXT' && interval && interval >= 1) {\n startDate = now.add(1, dayjsDatePart).startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart).add(interval, dayjsDatePart);\n }\n\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n\n // Transform WEEKS-filters into equivalent date-range filters\n // NOTE: This is a work-around until we make startOfDay customizable for Weeks\n if (node.rhs && hasProp(node.rhs, 'dateFunction') && node.rhs.dateFunction === 'WEEKS') {\n const startDate =\n typeof node.rhs.value === 'number' || isAbsoluteDateString(node.rhs.value)\n ? dayjs.utc(dayjs(node.rhs.value).tz(timezone)).startOf('day').tz(timezone)\n : dayjs.tz(node.rhs.value, timezone).startOf('day'); // Since we store it as YYYY-MM-DD, it's already the start of day\n\n const endDate = startDate.add(7, 'day').subtract(1, 'millisecond'); // Last millisecond on the 7th day from startDate\n return getConditionFromRange(startDate, endDate, node, field.type, timezone);\n }\n\n // Transform double range comparators (BTW, NOT_BTW) into equivalent pair of single range comparators\n if (node.rhs && hasProp(node.rhs, 'start')) {\n if (field.type === 'DECIMAL' || field.type === 'INTEGER') {\n return getConditionForBetweenComparator(node.rhs.start, node.rhs.end, node);\n }\n\n const expandBound = (value: string | number, boundary: 'start' | 'end'): string | number => {\n if (field.type === 'TIME_ONLY') {\n const parts = typeof value === 'string' ? value.split(':').length : 3;\n const ms = typeof value === 'number' ? value : convertTimeValueToMs(value);\n return expandPrecision(dayjs.utc(ms), parts, boundary).valueOf();\n }\n\n const isAbsolute = typeof value === 'number' || isAbsoluteDateString(value);\n const date = isAbsolute ? dayjs.utc(value) : dayjs.tz(value, timezone);\n\n if (field.type !== 'DATE_TIME')\n return formatBoundaryValue(date, field.type, timezone, isAbsolute);\n\n const parts = typeof value === 'string' ? value.split(':').length : 4;\n return formatBoundaryValue(\n expandPrecision(date, parts, boundary),\n 'DATE_TIME',\n timezone,\n isAbsolute\n );\n };\n\n return getConditionForBetweenComparator(\n expandBound(node.rhs.start, 'start'),\n expandBound(node.rhs.end, 'end'),\n node\n );\n }\n\n // apply timezone to date-time fields\n if (timezone && field.type === 'DATE_TIME' && node.rhs && !hasProp(node.rhs, 'dateFunction')) {\n const newNode: LeafCondition = { ...node };\n if (newNode.rhs && hasProp(newNode.rhs, 'value')) {\n newNode.rhs.value = getDateStringInTimezone(\n typeof newNode.rhs.value === 'number' || isAbsoluteDateString(newNode.rhs.value)\n ? dayjs(newNode.rhs.value)\n : dayjs.tz(newNode.rhs.value, timezone),\n timezone\n );\n }\n if (newNode.rhs && hasProp(newNode.rhs, 'values')) {\n const valuesWithTimezone = newNode.rhs.values.map(v =>\n getDateStringInTimezone(\n typeof v === 'number' || isAbsoluteDateString(v) ? dayjs(v) : dayjs.tz(v, timezone),\n timezone\n )\n );\n newNode.rhs.values = valuesWithTimezone;\n }\n return { condition: newNode };\n }\n\n // For all other cases\n return { condition: node };\n}\n\n/** This function transforms Conditions with Relative Dates into Conditions with Date Ranges.\n * Do not use this function unless you need to convert Relative Dates into Date Ranges.\n *\n * If `currentDateTime` is not provided, the current system time will be used.\n * If `timezone` is not provided, the system's timezone will be used for conversion.\n *\n * The `timezone` prop is applied to the date-time values within the condition when the transformation occurs.\n * If `timezone` is specified, the date-time will be converted from UTC (or the provided reference time) to the specified timezone.\n * Then, the transformed date will be used to generate a range.\n * This transformation ensures that the start and end times account for timezone differences when considering the condition's range.\n *\n * For example:\n * - A UTC date-time `2025-05-12T11:24:45.946Z` will be transformed to `2025-05-12T07:24:45.946-04:00` (in the `-04:00` timezone).\n * The date-time will then be converted into a range:\n * `[\"2025-05-12T07:24:45.000\", \"2025-05-12T07:24:45.999\"]`.\n * - A date-time without a timezone (`2025-05-12T11:24:45.946`) will be parsed in the timezone (e.g., `-04:00`).\n * The parsed time will then be transformed into a range like:\n * `[\"2025-05-12T11:24:45.000\", \"2025-05-12T11:24:45.999\"]`.\n *\n */\nexport default function transformComplexCondition(\n condition: Condition,\n fields: Field[],\n transformRelativeDate = true,\n currentDateTime?: string,\n timezone?: string\n): Condition {\n if (hasProp(condition, 'AND')) {\n const childNodes: Condition[] = condition.AND.map(n =>\n transformComplexCondition(n, fields, transformRelativeDate, currentDateTime, timezone)\n );\n return {\n AND: childNodes\n };\n }\n\n if (hasProp(condition, 'OR')) {\n const childNodes: Condition[] = condition.OR.map(n =>\n transformComplexCondition(n, fields, transformRelativeDate, currentDateTime, timezone)\n );\n return {\n OR: childNodes\n };\n }\n\n if (hasProp(condition, 'NOT')) {\n return {\n NOT: transformComplexCondition(\n condition.NOT,\n fields,\n transformRelativeDate,\n currentDateTime,\n timezone\n )\n };\n }\n\n return transformLeafCondition(\n condition.condition,\n fields,\n transformRelativeDate,\n currentDateTime,\n timezone\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pega/cosmos-react-condition-builder",
3
- "version": "8.21.9",
3
+ "version": "8.21.10",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "author": "Pegasystems",
6
6
  "sideEffects": [
@@ -17,7 +17,7 @@
17
17
  "build": "tsc -b tsconfig.build.json"
18
18
  },
19
19
  "dependencies": {
20
- "@pega/cosmos-react-core": "8.21.9",
20
+ "@pega/cosmos-react-core": "8.21.10",
21
21
  "@types/react": "^17.0.62 || ^18.3.3",
22
22
  "@types/react-dom": "^17.0.20 || ^18.3.0",
23
23
  "@types/styled-components": "^5.1.26",