@finos/legend-query-builder 4.14.35 → 4.14.37
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.
- package/lib/__lib__/QueryBuilderDocumentation.d.ts +2 -1
- package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderDocumentation.js +1 -0
- package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
- package/lib/__lib__/QueryBuilderTesting.d.ts +1 -0
- package/lib/__lib__/QueryBuilderTesting.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderTesting.js +1 -0
- package/lib/__lib__/QueryBuilderTesting.js.map +1 -1
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +55 -19
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.js +30 -13
- package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.js +2 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts +0 -16
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +32 -104
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +2 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +50 -5
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +2 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js +2 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +18 -6
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/shared/BasicValueSpecificationEditor.d.ts.map +1 -1
- package/lib/components/shared/BasicValueSpecificationEditor.js +62 -28
- package/lib/components/shared/BasicValueSpecificationEditor.js.map +1 -1
- package/lib/components/shared/CustomDatePicker.d.ts +1 -0
- package/lib/components/shared/CustomDatePicker.d.ts.map +1 -1
- package/lib/components/shared/CustomDatePicker.js +13 -9
- package/lib/components/shared/CustomDatePicker.js.map +1 -1
- package/lib/components/shared/QueryBuilderVariableSelector.d.ts +1 -0
- package/lib/components/shared/QueryBuilderVariableSelector.d.ts.map +1 -1
- package/lib/components/shared/QueryBuilderVariableSelector.js +2 -2
- package/lib/components/shared/QueryBuilderVariableSelector.js.map +1 -1
- package/lib/components/workflows/ClassQueryBuilder.d.ts.map +1 -1
- package/lib/components/workflows/ClassQueryBuilder.js +19 -16
- package/lib/components/workflows/ClassQueryBuilder.js.map +1 -1
- package/lib/components/workflows/MappingQueryBuilder.d.ts.map +1 -1
- package/lib/components/workflows/MappingQueryBuilder.js +18 -15
- package/lib/components/workflows/MappingQueryBuilder.js.map +1 -1
- package/lib/components/workflows/ServiceQueryBuilder.d.ts.map +1 -1
- package/lib/components/workflows/ServiceQueryBuilder.js +13 -10
- package/lib/components/workflows/ServiceQueryBuilder.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConstantsState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConstantsState.js +2 -1
- package/lib/stores/QueryBuilderConstantsState.js.map +1 -1
- package/lib/stores/QueryBuilderPropertyEditorState.d.ts +1 -1
- package/lib/stores/QueryBuilderPropertyEditorState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderPropertyEditorState.js +12 -34
- package/lib/stores/QueryBuilderPropertyEditorState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +3 -0
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +15 -1
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts +2 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.js +23 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.js.map +1 -1
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +29 -0
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +2 -0
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js +2 -0
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +2 -0
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +6 -0
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +2 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +15 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +3 -0
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +42 -3
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.js +6 -5
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.js +6 -5
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.js +8 -37
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.js +7 -10
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.js +7 -10
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js +6 -5
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.d.ts +3 -0
- package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.js +30 -2
- package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js +5 -4
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js +5 -4
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js +7 -35
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js +6 -8
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js +6 -8
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js +6 -8
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js +6 -8
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.d.ts.map +1 -1
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js +5 -4
- package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js.map +1 -1
- package/lib/stores/query-workflow/QueryBuilderWorkFlowState.d.ts +5 -0
- package/lib/stores/query-workflow/QueryBuilderWorkFlowState.d.ts.map +1 -1
- package/lib/stores/query-workflow/QueryBuilderWorkFlowState.js +7 -0
- package/lib/stores/query-workflow/QueryBuilderWorkFlowState.js.map +1 -1
- package/lib/stores/shared/ValueSpecificationEditorHelper.d.ts +1 -1
- package/lib/stores/shared/ValueSpecificationEditorHelper.d.ts.map +1 -1
- package/lib/stores/shared/ValueSpecificationEditorHelper.js +20 -10
- package/lib/stores/shared/ValueSpecificationEditorHelper.js.map +1 -1
- package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts +0 -2
- package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts.map +1 -1
- package/lib/stores/watermark/QueryBuilderWatermarkState.js +0 -6
- package/lib/stores/watermark/QueryBuilderWatermarkState.js.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.d.ts +2 -2
- package/lib/stores/workflows/MappingQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.js +2 -1
- package/lib/stores/workflows/MappingQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.d.ts +2 -2
- package/lib/stores/workflows/ServiceQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.js +2 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
- package/package.json +4 -4
- package/src/__lib__/QueryBuilderDocumentation.ts +1 -0
- package/src/__lib__/QueryBuilderTesting.ts +1 -0
- package/src/components/QueryBuilder.tsx +179 -54
- package/src/components/QueryBuilderConstantExpressionPanel.tsx +36 -14
- package/src/components/QueryBuilderPropertyExpressionEditor.tsx +2 -0
- package/src/components/QueryBuilderSideBar.tsx +138 -339
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +6 -1
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +139 -1
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +17 -0
- package/src/components/filter/QueryBuilderFilterPanel.tsx +6 -0
- package/src/components/result/QueryBuilderResultPanel.tsx +63 -6
- package/src/components/shared/BasicValueSpecificationEditor.tsx +96 -34
- package/src/components/shared/CustomDatePicker.tsx +18 -11
- package/src/components/shared/QueryBuilderVariableSelector.tsx +2 -2
- package/src/components/workflows/ClassQueryBuilder.tsx +79 -77
- package/src/components/workflows/MappingQueryBuilder.tsx +75 -76
- package/src/components/workflows/ServiceQueryBuilder.tsx +71 -70
- package/src/index.ts +2 -1
- package/src/stores/QueryBuilderConstantsState.ts +2 -0
- package/src/stores/QueryBuilderPropertyEditorState.ts +15 -53
- package/src/stores/QueryBuilderState.ts +23 -1
- package/src/stores/QueryBuilderValueSpecificationHelper.ts +32 -0
- package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +39 -0
- package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +4 -0
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +8 -0
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +32 -0
- package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +59 -0
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.ts +5 -5
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.ts +5 -5
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.ts +10 -69
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.ts +7 -18
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.ts +7 -18
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.ts +5 -5
- package/src/stores/filter/QueryBuilderFilterState.ts +48 -2
- package/src/stores/filter/operators/QueryBuilderFilterOperator_Contain.ts +5 -5
- package/src/stores/filter/operators/QueryBuilderFilterOperator_EndWith.ts +5 -5
- package/src/stores/filter/operators/QueryBuilderFilterOperator_Equal.ts +10 -71
- package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.ts +6 -14
- package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.ts +6 -14
- package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThan.ts +6 -14
- package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.ts +6 -14
- package/src/stores/filter/operators/QueryBuilderFilterOperator_StartWith.ts +5 -5
- package/src/stores/query-workflow/QueryBuilderWorkFlowState.ts +10 -0
- package/src/stores/shared/ValueSpecificationEditorHelper.ts +32 -16
- package/src/stores/watermark/QueryBuilderWatermarkState.ts +0 -7
- package/src/stores/workflows/MappingQueryBuilderState.ts +7 -1
- package/src/stores/workflows/ServiceQueryBuilderState.ts +6 -1
- package/tsconfig.json +0 -1
- package/lib/components/watermark/QueryBuilderWatermark.d.ts +0 -22
- package/lib/components/watermark/QueryBuilderWatermark.d.ts.map +0 -1
- package/lib/components/watermark/QueryBuilderWatermark.js +0 -83
- package/lib/components/watermark/QueryBuilderWatermark.js.map +0 -1
- package/src/components/watermark/QueryBuilderWatermark.tsx +0 -218
|
@@ -32,10 +32,15 @@ import {
|
|
|
32
32
|
MenuContentItem,
|
|
33
33
|
ModalFooterButton,
|
|
34
34
|
InputWithInlineValidation,
|
|
35
|
+
PanelDivider,
|
|
36
|
+
PanelDropZone,
|
|
37
|
+
PanelFormSection,
|
|
35
38
|
} from '@finos/legend-art';
|
|
36
39
|
import { SortColumnState } from '../../stores/fetch-structure/tds/QueryResultSetModifierState.js';
|
|
37
40
|
import {
|
|
38
41
|
addUniqueEntry,
|
|
42
|
+
clone,
|
|
43
|
+
deepClone,
|
|
39
44
|
deleteEntry,
|
|
40
45
|
guaranteeNonNullable,
|
|
41
46
|
} from '@finos/legend-shared';
|
|
@@ -43,9 +48,23 @@ import { useApplicationStore } from '@finos/legend-application';
|
|
|
43
48
|
import type { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
|
|
44
49
|
import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
|
|
45
50
|
import { COLUMN_SORT_TYPE } from '../../graph/QueryBuilderMetaModelConst.js';
|
|
46
|
-
import { useEffect, useState } from 'react';
|
|
51
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
47
52
|
import type { QueryBuilderProjectionColumnState } from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
|
|
48
53
|
import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
|
|
54
|
+
import { VariableSelector } from '../shared/QueryBuilderVariableSelector.js';
|
|
55
|
+
import {
|
|
56
|
+
type ValueSpecification,
|
|
57
|
+
type VariableExpression,
|
|
58
|
+
PrimitiveType,
|
|
59
|
+
Multiplicity,
|
|
60
|
+
areMultiplicitiesEqual,
|
|
61
|
+
} from '@finos/legend-graph';
|
|
62
|
+
import {
|
|
63
|
+
BasicValueSpecificationEditor,
|
|
64
|
+
QUERY_BUILDER_VARIABLE_DND_TYPE,
|
|
65
|
+
type QueryBuilderVariableDragSource,
|
|
66
|
+
} from '../shared/BasicValueSpecificationEditor.js';
|
|
67
|
+
import { useDrop } from 'react-dnd';
|
|
49
68
|
|
|
50
69
|
const ColumnSortEditor = observer(
|
|
51
70
|
(props: {
|
|
@@ -246,6 +265,10 @@ export const QueryResultModifierModal = observer(
|
|
|
246
265
|
const [slice, setSlice] = useState<
|
|
247
266
|
[number | undefined, number | undefined]
|
|
248
267
|
>(stateSlice ?? [undefined, undefined]);
|
|
268
|
+
const watermarkState = tdsState.queryBuilderState.watermarkState;
|
|
269
|
+
const [watermarkValue, setWatermarkValue] = useState(
|
|
270
|
+
deepClone(watermarkState.value),
|
|
271
|
+
);
|
|
249
272
|
|
|
250
273
|
// Sync temp state with tdsState when modal is opened/closed
|
|
251
274
|
useEffect(() => {
|
|
@@ -253,8 +276,10 @@ export const QueryResultModifierModal = observer(
|
|
|
253
276
|
setDistinct(stateDistinct);
|
|
254
277
|
setLimitResults(stateLimitResults);
|
|
255
278
|
setSlice(stateSlice ?? [undefined, undefined]);
|
|
279
|
+
setWatermarkValue(deepClone(watermarkState.value));
|
|
256
280
|
}, [
|
|
257
281
|
resultSetModifierState.showModal,
|
|
282
|
+
watermarkState.value,
|
|
258
283
|
stateSortColumns,
|
|
259
284
|
stateDistinct,
|
|
260
285
|
stateLimitResults,
|
|
@@ -273,6 +298,7 @@ export const QueryResultModifierModal = observer(
|
|
|
273
298
|
resultSetModifierState.setSlice(undefined);
|
|
274
299
|
}
|
|
275
300
|
resultSetModifierState.setShowModal(false);
|
|
301
|
+
watermarkState.setValue(watermarkValue);
|
|
276
302
|
};
|
|
277
303
|
|
|
278
304
|
const handleLimitResultsChange: React.ChangeEventHandler<
|
|
@@ -321,6 +347,50 @@ export const QueryResultModifierModal = observer(
|
|
|
321
347
|
slice[1] !== undefined &&
|
|
322
348
|
slice[0] >= slice[1]);
|
|
323
349
|
|
|
350
|
+
// watermark
|
|
351
|
+
const isParamaterCompatibleWithWaterMark = (
|
|
352
|
+
parameter: VariableExpression,
|
|
353
|
+
): boolean =>
|
|
354
|
+
PrimitiveType.STRING === parameter.genericType?.value.rawType &&
|
|
355
|
+
areMultiplicitiesEqual(parameter.multiplicity, Multiplicity.ONE);
|
|
356
|
+
const handleDrop = useCallback(
|
|
357
|
+
(item: QueryBuilderVariableDragSource): void => {
|
|
358
|
+
setWatermarkValue(item.variable);
|
|
359
|
+
},
|
|
360
|
+
[setWatermarkValue],
|
|
361
|
+
);
|
|
362
|
+
const toggleWatermark = (): void => {
|
|
363
|
+
if (watermarkValue) {
|
|
364
|
+
setWatermarkValue(undefined);
|
|
365
|
+
} else {
|
|
366
|
+
setWatermarkValue(watermarkState.getDefaultValue());
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
const [{ isParameterValueDragOver }, dropTargetConnector] = useDrop<
|
|
370
|
+
QueryBuilderVariableDragSource,
|
|
371
|
+
void,
|
|
372
|
+
{ isParameterValueDragOver: boolean }
|
|
373
|
+
>(
|
|
374
|
+
() => ({
|
|
375
|
+
accept: [QUERY_BUILDER_VARIABLE_DND_TYPE],
|
|
376
|
+
drop: (item, monitor): void => {
|
|
377
|
+
if (
|
|
378
|
+
!monitor.didDrop() &&
|
|
379
|
+
// Only allows parameters with muliplicity 1 and type string
|
|
380
|
+
isParamaterCompatibleWithWaterMark(item.variable)
|
|
381
|
+
) {
|
|
382
|
+
handleDrop(item);
|
|
383
|
+
} // prevent drop event propagation to accomondate for nested DnD
|
|
384
|
+
},
|
|
385
|
+
collect: (monitor) => ({
|
|
386
|
+
isParameterValueDragOver: monitor.isOver({
|
|
387
|
+
shallow: true,
|
|
388
|
+
}),
|
|
389
|
+
}),
|
|
390
|
+
}),
|
|
391
|
+
[handleDrop],
|
|
392
|
+
);
|
|
393
|
+
|
|
324
394
|
return (
|
|
325
395
|
<Dialog
|
|
326
396
|
open={Boolean(resultSetModifierState.showModal)}
|
|
@@ -428,6 +498,74 @@ export const QueryResultModifierModal = observer(
|
|
|
428
498
|
</div>
|
|
429
499
|
</div>
|
|
430
500
|
</div>
|
|
501
|
+
<>
|
|
502
|
+
<PanelFormSection>
|
|
503
|
+
<label className="panel__content__form__section__header__label">
|
|
504
|
+
Watermark
|
|
505
|
+
</label>
|
|
506
|
+
<button
|
|
507
|
+
className={clsx(
|
|
508
|
+
'panel__content__form__section__toggler',
|
|
509
|
+
'panel__content__form__section__toggler__btn',
|
|
510
|
+
{
|
|
511
|
+
'panel__content__form__section__toggler__btn--toggled':
|
|
512
|
+
watermarkValue,
|
|
513
|
+
},
|
|
514
|
+
)}
|
|
515
|
+
onClick={toggleWatermark}
|
|
516
|
+
tabIndex={-1}
|
|
517
|
+
>
|
|
518
|
+
{watermarkValue ? <CheckSquareIcon /> : <SquareIcon />}
|
|
519
|
+
<div className="panel__content__form__section__toggler__prompt">
|
|
520
|
+
Enable Watermark
|
|
521
|
+
</div>
|
|
522
|
+
</button>
|
|
523
|
+
</PanelFormSection>
|
|
524
|
+
{watermarkValue && (
|
|
525
|
+
<>
|
|
526
|
+
<PanelFormSection>
|
|
527
|
+
<div className="query-builder__variable-editor">
|
|
528
|
+
<PanelDropZone
|
|
529
|
+
isDragOver={isParameterValueDragOver}
|
|
530
|
+
dropTargetConnector={dropTargetConnector}
|
|
531
|
+
>
|
|
532
|
+
<BasicValueSpecificationEditor
|
|
533
|
+
valueSpecification={watermarkValue}
|
|
534
|
+
setValueSpecification={(
|
|
535
|
+
val: ValueSpecification,
|
|
536
|
+
): void => {
|
|
537
|
+
setWatermarkValue(clone(val));
|
|
538
|
+
}}
|
|
539
|
+
graph={
|
|
540
|
+
watermarkState.queryBuilderState.graphManagerState
|
|
541
|
+
.graph
|
|
542
|
+
}
|
|
543
|
+
obseverContext={
|
|
544
|
+
watermarkState.queryBuilderState.observerContext
|
|
545
|
+
}
|
|
546
|
+
typeCheckOption={{
|
|
547
|
+
expectedType: PrimitiveType.STRING,
|
|
548
|
+
}}
|
|
549
|
+
resetValue={() =>
|
|
550
|
+
setWatermarkValue(
|
|
551
|
+
watermarkState.getDefaultValue(),
|
|
552
|
+
)
|
|
553
|
+
}
|
|
554
|
+
isConstant={watermarkState.queryBuilderState.constantState.isValueSpecConstant(
|
|
555
|
+
watermarkValue,
|
|
556
|
+
)}
|
|
557
|
+
/>
|
|
558
|
+
</PanelDropZone>
|
|
559
|
+
</div>
|
|
560
|
+
</PanelFormSection>
|
|
561
|
+
<PanelDivider />
|
|
562
|
+
<VariableSelector
|
|
563
|
+
filterBy={isParamaterCompatibleWithWaterMark}
|
|
564
|
+
queryBuilderState={tdsState.queryBuilderState}
|
|
565
|
+
/>
|
|
566
|
+
</>
|
|
567
|
+
)}
|
|
568
|
+
</>
|
|
431
569
|
</div>
|
|
432
570
|
</ModalBody>
|
|
433
571
|
<ModalFooter>
|
|
@@ -116,6 +116,7 @@ import {
|
|
|
116
116
|
QueryBuilderDerivationInfoTooltip,
|
|
117
117
|
QueryBuilderPropertyInfoTooltip,
|
|
118
118
|
} from '../shared/QueryBuilderPropertyInfoTooltip.js';
|
|
119
|
+
import { getNameOfValueSpecification } from '../shared/QueryBuilderVariableSelector.js';
|
|
119
120
|
|
|
120
121
|
const QueryBuilderProjectionColumnContextMenu = observer(
|
|
121
122
|
forwardRef<
|
|
@@ -1214,6 +1215,22 @@ export const QueryBuilderTDSPanel = observer(
|
|
|
1214
1215
|
</div>
|
|
1215
1216
|
</div>
|
|
1216
1217
|
)}
|
|
1218
|
+
{tdsState.queryBuilderState.watermarkState.value && (
|
|
1219
|
+
<div className="query-builder__projection__result-modifier-prompt__group">
|
|
1220
|
+
<div className="query-builder__projection__result-modifier-prompt__group__label">
|
|
1221
|
+
Watermark
|
|
1222
|
+
</div>
|
|
1223
|
+
<div
|
|
1224
|
+
className="query-builder__projection__result-modifier-prompt__group__content"
|
|
1225
|
+
onClick={openResultSetModifierEditor}
|
|
1226
|
+
>
|
|
1227
|
+
{getNameOfValueSpecification(
|
|
1228
|
+
tdsState.queryBuilderState.watermarkState.value,
|
|
1229
|
+
tdsState.queryBuilderState,
|
|
1230
|
+
)}
|
|
1231
|
+
</div>
|
|
1232
|
+
</div>
|
|
1233
|
+
)}
|
|
1217
1234
|
</div>
|
|
1218
1235
|
<div className="query-builder__projection__toolbar__actions">
|
|
1219
1236
|
<button
|
|
@@ -111,6 +111,7 @@ import { QueryBuilderTelemetryHelper } from '../../__lib__/QueryBuilderTelemetry
|
|
|
111
111
|
import { getPropertyChainName } from '../../stores/QueryBuilderPropertyEditorState.js';
|
|
112
112
|
import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../graph/QueryBuilderMetaModelConst.js';
|
|
113
113
|
import { buildPropertyExpressionChain } from '../../stores/QueryBuilderValueSpecificationBuilderHelper.js';
|
|
114
|
+
import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
|
|
114
115
|
|
|
115
116
|
const isCollectionProperty = (
|
|
116
117
|
propertyExpression: AbstractPropertyExpression,
|
|
@@ -1479,6 +1480,11 @@ export const QueryBuilderFilterPanel = observer(
|
|
|
1479
1480
|
<div className="panel__header">
|
|
1480
1481
|
<div className="panel__header__title">
|
|
1481
1482
|
<div className="panel__header__title__label">filter</div>
|
|
1483
|
+
{filterState.allValidationIssues.length !== 0 && (
|
|
1484
|
+
<QueryBuilderPanelIssueCountBadge
|
|
1485
|
+
issues={filterState.allValidationIssues}
|
|
1486
|
+
/>
|
|
1487
|
+
)}
|
|
1482
1488
|
</div>
|
|
1483
1489
|
|
|
1484
1490
|
<div className="panel__header__actions">
|
|
@@ -37,6 +37,12 @@ import {
|
|
|
37
37
|
PanelDivider,
|
|
38
38
|
SquareIcon,
|
|
39
39
|
CheckSquareIcon,
|
|
40
|
+
MenuContentItemIcon,
|
|
41
|
+
MenuContentItemLabel,
|
|
42
|
+
ChartIcon,
|
|
43
|
+
CsvIcon,
|
|
44
|
+
DebugIcon,
|
|
45
|
+
ReportIcon,
|
|
40
46
|
} from '@finos/legend-art';
|
|
41
47
|
import { observer } from 'mobx-react-lite';
|
|
42
48
|
import { flowResult } from 'mobx';
|
|
@@ -306,6 +312,28 @@ export const QueryBuilderResultPanel = observer(
|
|
|
306
312
|
!queryBuilderState.isLocalModeEnabled,
|
|
307
313
|
);
|
|
308
314
|
};
|
|
315
|
+
|
|
316
|
+
const extraExportMenuContentItems = applicationStore.pluginManager
|
|
317
|
+
.getApplicationPlugins()
|
|
318
|
+
.flatMap(
|
|
319
|
+
(plugin) =>
|
|
320
|
+
(
|
|
321
|
+
plugin as QueryBuilder_LegendApplicationPlugin_Extension
|
|
322
|
+
).getExtraQueryBuilderExportMenuActionConfigurations?.() ?? [],
|
|
323
|
+
)
|
|
324
|
+
.map((item) => (
|
|
325
|
+
<MenuContentItem
|
|
326
|
+
key={item.key}
|
|
327
|
+
title={item.title ?? ''}
|
|
328
|
+
onClick={() => {
|
|
329
|
+
item.onClick(queryBuilderState);
|
|
330
|
+
}}
|
|
331
|
+
>
|
|
332
|
+
{item.icon && <MenuContentItemIcon>{item.icon}</MenuContentItemIcon>}
|
|
333
|
+
<MenuContentItemLabel>{item.label}</MenuContentItemLabel>
|
|
334
|
+
</MenuContentItem>
|
|
335
|
+
));
|
|
336
|
+
|
|
309
337
|
return (
|
|
310
338
|
<div
|
|
311
339
|
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_RESULT_PANEL}
|
|
@@ -490,14 +518,22 @@ export const QueryBuilderResultPanel = observer(
|
|
|
490
518
|
onClick={generatePlan}
|
|
491
519
|
disabled={isRunQueryDisabled}
|
|
492
520
|
>
|
|
493
|
-
|
|
521
|
+
<MenuContentItemIcon>
|
|
522
|
+
<ReportIcon />
|
|
523
|
+
</MenuContentItemIcon>
|
|
524
|
+
<MenuContentItemLabel>
|
|
525
|
+
Generate Plan
|
|
526
|
+
</MenuContentItemLabel>
|
|
494
527
|
</MenuContentItem>
|
|
495
528
|
<MenuContentItem
|
|
496
529
|
className="btn__dropdown-combo__option"
|
|
497
530
|
onClick={debugPlanGeneration}
|
|
498
531
|
disabled={isRunQueryDisabled}
|
|
499
532
|
>
|
|
500
|
-
|
|
533
|
+
<MenuContentItemIcon>
|
|
534
|
+
<DebugIcon />
|
|
535
|
+
</MenuContentItemIcon>
|
|
536
|
+
<MenuContentItemLabel>Debug</MenuContentItemLabel>
|
|
501
537
|
</MenuContentItem>
|
|
502
538
|
</MenuContent>
|
|
503
539
|
}
|
|
@@ -522,14 +558,15 @@ export const QueryBuilderResultPanel = observer(
|
|
|
522
558
|
).map((format) => (
|
|
523
559
|
<MenuContentItem
|
|
524
560
|
key={format}
|
|
525
|
-
className="query-builder__result__export__dropdown__menu__item"
|
|
526
561
|
onClick={(): void => confirmExport(format)}
|
|
527
562
|
>
|
|
528
|
-
|
|
563
|
+
<MenuContentItemIcon>
|
|
564
|
+
<CsvIcon />
|
|
565
|
+
</MenuContentItemIcon>
|
|
566
|
+
<MenuContentItemLabel>{format}</MenuContentItemLabel>
|
|
529
567
|
</MenuContentItem>
|
|
530
568
|
))}
|
|
531
569
|
<MenuContentItem
|
|
532
|
-
className="query-builder__result__export__dropdown__menu__item"
|
|
533
570
|
onClick={(): void =>
|
|
534
571
|
resultState.setIsQueryUsageViewerOpened(true)
|
|
535
572
|
}
|
|
@@ -538,8 +575,12 @@ export const QueryBuilderResultPanel = observer(
|
|
|
538
575
|
!isExtraQueryUsageOptionsConfigured
|
|
539
576
|
}
|
|
540
577
|
>
|
|
541
|
-
|
|
578
|
+
<MenuContentItemIcon>
|
|
579
|
+
<ChartIcon />
|
|
580
|
+
</MenuContentItemIcon>
|
|
581
|
+
<MenuContentItemLabel>Others...</MenuContentItemLabel>
|
|
542
582
|
</MenuContentItem>
|
|
583
|
+
{extraExportMenuContentItems}
|
|
543
584
|
</MenuContent>
|
|
544
585
|
}
|
|
545
586
|
menuProps={{
|
|
@@ -558,6 +599,22 @@ export const QueryBuilderResultPanel = observer(
|
|
|
558
599
|
{resultState.isQueryUsageViewerOpened && (
|
|
559
600
|
<QueryUsageViewer resultState={resultState} />
|
|
560
601
|
)}
|
|
602
|
+
{applicationStore.pluginManager
|
|
603
|
+
.getApplicationPlugins()
|
|
604
|
+
.flatMap(
|
|
605
|
+
(plugin) =>
|
|
606
|
+
(
|
|
607
|
+
plugin as QueryBuilder_LegendApplicationPlugin_Extension
|
|
608
|
+
).getExtraQueryBuilderExportMenuActionConfigurations?.() ??
|
|
609
|
+
[],
|
|
610
|
+
)
|
|
611
|
+
.map((item) => (
|
|
612
|
+
<div key={item.key}>
|
|
613
|
+
{item.renderExtraComponent
|
|
614
|
+
? item.renderExtraComponent(queryBuilderState)
|
|
615
|
+
: undefined}
|
|
616
|
+
</div>
|
|
617
|
+
))}
|
|
561
618
|
</div>
|
|
562
619
|
</div>
|
|
563
620
|
<PanelContent>
|
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
BasePopover,
|
|
34
34
|
PanelFormSection,
|
|
35
35
|
CalculateIcon,
|
|
36
|
+
InputWithInlineValidation,
|
|
36
37
|
} from '@finos/legend-art';
|
|
37
38
|
import {
|
|
38
39
|
type Enum,
|
|
@@ -67,6 +68,7 @@ import {
|
|
|
67
68
|
parseCSVString,
|
|
68
69
|
guaranteeIsNumber,
|
|
69
70
|
csvStringify,
|
|
71
|
+
guaranteeType,
|
|
70
72
|
} from '@finos/legend-shared';
|
|
71
73
|
import { flowResult } from 'mobx';
|
|
72
74
|
import { observer } from 'mobx-react-lite';
|
|
@@ -83,7 +85,10 @@ import {
|
|
|
83
85
|
} from '../../stores/shared/ValueSpecificationModifierHelper.js';
|
|
84
86
|
import { CustomDatePicker } from './CustomDatePicker.js';
|
|
85
87
|
import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../graph/QueryBuilderMetaModelConst.js';
|
|
86
|
-
import {
|
|
88
|
+
import {
|
|
89
|
+
isValidInstanceValue,
|
|
90
|
+
simplifyValueExpression,
|
|
91
|
+
} from '../../stores/QueryBuilderValueSpecificationHelper.js';
|
|
87
92
|
import { evaluate } from 'mathjs';
|
|
88
93
|
import { isUsedDateFunctionSupportedInFormMode } from '../../stores/QueryBuilderStateBuilder.js';
|
|
89
94
|
|
|
@@ -240,7 +245,7 @@ const StringPrimitiveInstanceValueEditor = observer(
|
|
|
240
245
|
} = props;
|
|
241
246
|
const useSelector = Boolean(selectorConfig);
|
|
242
247
|
const applicationStore = useApplicationStore();
|
|
243
|
-
const value = valueSpecification.values[0] as string;
|
|
248
|
+
const value = valueSpecification.values[0] as string | null;
|
|
244
249
|
const updateValueSpec = (val: string): void => {
|
|
245
250
|
instanceValue_setValue(valueSpecification, val, 0, obseverContext);
|
|
246
251
|
setValueSpecification(valueSpecification);
|
|
@@ -295,8 +300,8 @@ const StringPrimitiveInstanceValueEditor = observer(
|
|
|
295
300
|
className="value-spec-editor__enum-selector"
|
|
296
301
|
options={queryOptions}
|
|
297
302
|
onChange={changeValue}
|
|
298
|
-
value={selectedValue}
|
|
299
|
-
inputValue={value}
|
|
303
|
+
value={selectedValue.label === '' ? '' : selectedValue}
|
|
304
|
+
inputValue={value ?? ''}
|
|
300
305
|
onInputChange={handleInputChange}
|
|
301
306
|
darkMode={
|
|
302
307
|
!applicationStore.layoutService
|
|
@@ -308,15 +313,22 @@ const StringPrimitiveInstanceValueEditor = observer(
|
|
|
308
313
|
components={{
|
|
309
314
|
DropdownIndicator: null,
|
|
310
315
|
}}
|
|
316
|
+
hasError={!isValidInstanceValue(valueSpecification)}
|
|
317
|
+
placeholder={value === '' ? '(empty)' : undefined}
|
|
311
318
|
/>
|
|
312
319
|
) : (
|
|
313
|
-
<
|
|
320
|
+
<InputWithInlineValidation
|
|
314
321
|
className="panel__content__form__section__input value-spec-editor__input"
|
|
315
322
|
spellCheck={false}
|
|
316
|
-
value={value}
|
|
323
|
+
value={value ?? ''}
|
|
317
324
|
placeholder={value === '' ? '(empty)' : undefined}
|
|
318
325
|
onChange={changeInputValue}
|
|
319
326
|
ref={ref}
|
|
327
|
+
error={
|
|
328
|
+
!isValidInstanceValue(valueSpecification)
|
|
329
|
+
? 'Invalid String value'
|
|
330
|
+
: undefined
|
|
331
|
+
}
|
|
320
332
|
/>
|
|
321
333
|
)}
|
|
322
334
|
<button
|
|
@@ -397,26 +409,37 @@ const NumberPrimitiveInstanceValueEditor = observer(
|
|
|
397
409
|
obseverContext,
|
|
398
410
|
} = props;
|
|
399
411
|
const [value, setValue] = useState(
|
|
400
|
-
|
|
412
|
+
valueSpecification.values[0] === null
|
|
413
|
+
? ''
|
|
414
|
+
: (valueSpecification.values[0] as number).toString(),
|
|
401
415
|
);
|
|
402
416
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
403
417
|
useImperativeHandle(ref, () => inputRef.current as HTMLInputElement, []);
|
|
404
|
-
const numericValue =
|
|
405
|
-
?
|
|
406
|
-
|
|
418
|
+
const numericValue = value
|
|
419
|
+
? isInteger
|
|
420
|
+
? Number.parseInt(Number(value).toString(), 10)
|
|
421
|
+
: Number(value)
|
|
422
|
+
: null;
|
|
407
423
|
|
|
408
424
|
const updateValueSpecIfValid = (val: string): void => {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
parsedValue
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
425
|
+
if (val) {
|
|
426
|
+
const parsedValue = isInteger
|
|
427
|
+
? Number.parseInt(Number(val).toString(), 10)
|
|
428
|
+
: Number(val);
|
|
429
|
+
if (
|
|
430
|
+
!isNaN(parsedValue) &&
|
|
431
|
+
parsedValue !== valueSpecification.values[0]
|
|
432
|
+
) {
|
|
433
|
+
instanceValue_setValue(
|
|
434
|
+
valueSpecification,
|
|
435
|
+
parsedValue,
|
|
436
|
+
0,
|
|
437
|
+
obseverContext,
|
|
438
|
+
);
|
|
439
|
+
setValueSpecification(valueSpecification);
|
|
440
|
+
}
|
|
441
|
+
} else {
|
|
442
|
+
resetValue();
|
|
420
443
|
}
|
|
421
444
|
};
|
|
422
445
|
|
|
@@ -429,20 +452,29 @@ const NumberPrimitiveInstanceValueEditor = observer(
|
|
|
429
452
|
|
|
430
453
|
// Support expression evaluation
|
|
431
454
|
const calculateExpression = (): void => {
|
|
432
|
-
if (isNaN(numericValue)) {
|
|
455
|
+
if (numericValue !== null && isNaN(numericValue)) {
|
|
456
|
+
// If the value is not a number, try to evaluate it as an expression
|
|
433
457
|
try {
|
|
434
458
|
const calculatedValue = guaranteeIsNumber(evaluate(value));
|
|
435
459
|
updateValueSpecIfValid(calculatedValue.toString());
|
|
436
460
|
setValue(calculatedValue.toString());
|
|
437
461
|
} catch {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
462
|
+
// If we fail to evaluate the expression, we just keep the previous value
|
|
463
|
+
const prevValue =
|
|
464
|
+
valueSpecification.values[0] !== null &&
|
|
465
|
+
valueSpecification.values[0] !== undefined
|
|
466
|
+
? valueSpecification.values[0].toString()
|
|
467
|
+
: '';
|
|
468
|
+
updateValueSpecIfValid(prevValue);
|
|
469
|
+
setValue(prevValue);
|
|
442
470
|
}
|
|
443
|
-
} else {
|
|
471
|
+
} else if (numericValue !== null) {
|
|
472
|
+
// If numericValue is a number, update the value spec
|
|
444
473
|
updateValueSpecIfValid(numericValue.toString());
|
|
445
474
|
setValue(numericValue.toString());
|
|
475
|
+
} else {
|
|
476
|
+
// If numericValue is null, reset the value spec
|
|
477
|
+
resetValue();
|
|
446
478
|
}
|
|
447
479
|
};
|
|
448
480
|
|
|
@@ -457,10 +489,15 @@ const NumberPrimitiveInstanceValueEditor = observer(
|
|
|
457
489
|
|
|
458
490
|
useEffect(() => {
|
|
459
491
|
if (
|
|
492
|
+
numericValue !== null &&
|
|
460
493
|
!isNaN(numericValue) &&
|
|
461
494
|
numericValue !== valueSpecification.values[0]
|
|
462
495
|
) {
|
|
463
|
-
|
|
496
|
+
const valueFromValueSpec =
|
|
497
|
+
valueSpecification.values[0] !== null
|
|
498
|
+
? (valueSpecification.values[0] as number).toString()
|
|
499
|
+
: '';
|
|
500
|
+
setValue(valueFromValueSpec);
|
|
464
501
|
}
|
|
465
502
|
}, [numericValue, valueSpecification]);
|
|
466
503
|
|
|
@@ -469,7 +506,15 @@ const NumberPrimitiveInstanceValueEditor = observer(
|
|
|
469
506
|
<div className="value-spec-editor__number__input-container">
|
|
470
507
|
<input
|
|
471
508
|
ref={inputRef}
|
|
472
|
-
className=
|
|
509
|
+
className={clsx(
|
|
510
|
+
'panel__content__form__section__input',
|
|
511
|
+
'value-spec-editor__input',
|
|
512
|
+
'value-spec-editor__number__input',
|
|
513
|
+
{
|
|
514
|
+
'value-spec-editor__number__input--error':
|
|
515
|
+
!isValidInstanceValue(valueSpecification),
|
|
516
|
+
},
|
|
517
|
+
)}
|
|
473
518
|
spellCheck={false}
|
|
474
519
|
type="text" // NOTE: we leave this as text so that we can support expression evaluation
|
|
475
520
|
inputMode="numeric"
|
|
@@ -517,9 +562,15 @@ const EnumValueInstanceValueEditor = observer(
|
|
|
517
562
|
obseverContext,
|
|
518
563
|
} = props;
|
|
519
564
|
const applicationStore = useApplicationStore();
|
|
520
|
-
const
|
|
521
|
-
|
|
522
|
-
|
|
565
|
+
const enumType = guaranteeType(
|
|
566
|
+
valueSpecification.genericType?.value.rawType,
|
|
567
|
+
Enumeration,
|
|
568
|
+
);
|
|
569
|
+
const enumValue =
|
|
570
|
+
valueSpecification.values[0] === undefined
|
|
571
|
+
? null
|
|
572
|
+
: valueSpecification.values[0].value;
|
|
573
|
+
const options = enumType.values.map((value) => ({
|
|
523
574
|
label: value.name,
|
|
524
575
|
value: value,
|
|
525
576
|
}));
|
|
@@ -539,10 +590,12 @@ const EnumValueInstanceValueEditor = observer(
|
|
|
539
590
|
className="value-spec-editor__enum-selector"
|
|
540
591
|
options={options}
|
|
541
592
|
onChange={changeValue}
|
|
542
|
-
value={{ value: enumValue, label: enumValue.name }}
|
|
593
|
+
value={enumValue ? { value: enumValue, label: enumValue.name } : null}
|
|
543
594
|
darkMode={
|
|
544
595
|
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
|
545
596
|
}
|
|
597
|
+
hasError={!isValidInstanceValue(valueSpecification)}
|
|
598
|
+
placeholder="Select value"
|
|
546
599
|
/>
|
|
547
600
|
<button
|
|
548
601
|
className="value-spec-editor__reset-btn"
|
|
@@ -899,7 +952,12 @@ const CollectionValueInstanceValueEditor = observer(
|
|
|
899
952
|
onClick={enableEdit}
|
|
900
953
|
title="Click to edit"
|
|
901
954
|
>
|
|
902
|
-
<div
|
|
955
|
+
<div
|
|
956
|
+
className={clsx('value-spec-editor__list-editor__preview', {
|
|
957
|
+
'value-spec-editor__list-editor__preview--error':
|
|
958
|
+
!isValidInstanceValue(valueSpecification),
|
|
959
|
+
})}
|
|
960
|
+
>
|
|
903
961
|
{previewText}
|
|
904
962
|
</div>
|
|
905
963
|
<button className="value-spec-editor__list-editor__edit-icon">
|
|
@@ -941,6 +999,10 @@ const DateInstanceValueEditor = observer(
|
|
|
941
999
|
observerContext={obseverContext}
|
|
942
1000
|
typeCheckOption={typeCheckOption}
|
|
943
1001
|
setValueSpecification={setValueSpecification}
|
|
1002
|
+
hasError={
|
|
1003
|
+
valueSpecification instanceof PrimitiveInstanceValue &&
|
|
1004
|
+
!isValidInstanceValue(valueSpecification)
|
|
1005
|
+
}
|
|
944
1006
|
/>
|
|
945
1007
|
<button
|
|
946
1008
|
className="value-spec-editor__reset-btn"
|