@finos/legend-query-builder 4.14.18 → 4.14.19
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/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +5 -3
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.js +71 -45
- package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
- package/lib/components/QueryBuilderDiffPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderDiffPanel.js +2 -1
- package/lib/components/QueryBuilderDiffPanel.js.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.js +25 -26
- package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts +11 -2
- package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderPropertyExpressionEditor.js +35 -10
- package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +6 -1
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
- package/lib/components/QueryBuilderTextEditor.js +3 -3
- package/lib/components/QueryBuilderTextEditor.js.map +1 -1
- package/lib/components/QueryLoader.d.ts.map +1 -1
- package/lib/components/QueryLoader.js +5 -3
- package/lib/components/QueryLoader.js.map +1 -1
- package/lib/components/QueryUsageViewer.d.ts.map +1 -1
- package/lib/components/QueryUsageViewer.js +2 -2
- package/lib/components/QueryUsageViewer.js.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts +2 -0
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +19 -2
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
- package/lib/components/data-access/DataAccessOverview.d.ts.map +1 -1
- package/lib/components/data-access/DataAccessOverview.js +6 -1
- package/lib/components/data-access/DataAccessOverview.js.map +1 -1
- package/lib/components/execution-plan/ExecutionPlanViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/ExecutionPlanViewer.js +6 -6
- package/lib/components/execution-plan/ExecutionPlanViewer.js.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.js +3 -2
- package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderMilestoningEditor.js +3 -2
- package/lib/components/explorer/QueryBuilderMilestoningEditor.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +6 -3
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +4 -3
- 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 +11 -22
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +2 -2
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +2 -1
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js +5 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +11 -2
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
- package/lib/components/shared/BasicValueSpecificationEditor.d.ts.map +1 -1
- package/lib/components/shared/BasicValueSpecificationEditor.js +25 -22
- package/lib/components/shared/BasicValueSpecificationEditor.js.map +1 -1
- package/lib/components/shared/CustomDatePicker.d.ts.map +1 -1
- package/lib/components/shared/CustomDatePicker.js +8 -5
- package/lib/components/shared/CustomDatePicker.js.map +1 -1
- package/lib/components/shared/LambdaEditor.d.ts.map +1 -1
- package/lib/components/shared/LambdaEditor.js +17 -3
- package/lib/components/shared/LambdaEditor.js.map +1 -1
- package/lib/components/shared/LambdaParameterValuesEditor.d.ts.map +1 -1
- package/lib/components/shared/LambdaParameterValuesEditor.js +2 -2
- package/lib/components/shared/LambdaParameterValuesEditor.js.map +1 -1
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts +6 -0
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts.map +1 -1
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.js +40 -3
- package/lib/components/shared/QueryBuilderPropertyInfoTooltip.js.map +1 -1
- package/lib/components/watermark/QueryBuilderWatermark.d.ts.map +1 -1
- package/lib/components/watermark/QueryBuilderWatermark.js +28 -12
- package/lib/components/watermark/QueryBuilderWatermark.js.map +1 -1
- package/lib/index.css +17 -1
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConstantsState.d.ts +1 -0
- package/lib/stores/QueryBuilderConstantsState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConstantsState.js +7 -1
- package/lib/stores/QueryBuilderConstantsState.js.map +1 -1
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +5 -0
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts +1 -2
- package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts.map +1 -1
- package/lib/stores/watermark/QueryBuilderWatermarkState.js +2 -12
- package/lib/stores/watermark/QueryBuilderWatermarkState.js.map +1 -1
- package/package.json +8 -8
- package/src/components/QueryBuilder.tsx +14 -2
- package/src/components/QueryBuilderConstantExpressionPanel.tsx +145 -69
- package/src/components/QueryBuilderDiffPanel.tsx +10 -2
- package/src/components/QueryBuilderParametersPanel.tsx +42 -37
- package/src/components/QueryBuilderPropertyExpressionEditor.tsx +87 -24
- package/src/components/QueryBuilderSideBar.tsx +20 -0
- package/src/components/QueryBuilderTextEditor.tsx +6 -4
- package/src/components/QueryLoader.tsx +12 -3
- package/src/components/QueryUsageViewer.tsx +7 -1
- package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +40 -4
- package/src/components/data-access/DataAccessOverview.tsx +9 -1
- package/src/components/execution-plan/ExecutionPlanViewer.tsx +11 -8
- package/src/components/explorer/QueryBuilderExplorerPanel.tsx +5 -2
- package/src/components/explorer/QueryBuilderMilestoningEditor.tsx +5 -2
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +12 -5
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +8 -4
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +56 -72
- package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +8 -2
- package/src/components/result/QueryBuilderResultPanel.tsx +8 -1
- package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +6 -3
- package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +14 -4
- package/src/components/shared/BasicValueSpecificationEditor.tsx +39 -25
- package/src/components/shared/CustomDatePicker.tsx +18 -5
- package/src/components/shared/LambdaEditor.tsx +27 -11
- package/src/components/shared/LambdaParameterValuesEditor.tsx +4 -1
- package/src/components/shared/QueryBuilderPropertyInfoTooltip.tsx +115 -64
- package/src/components/watermark/QueryBuilderWatermark.tsx +60 -19
- package/src/stores/QueryBuilderConstantsState.ts +12 -0
- package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +9 -0
- package/src/stores/watermark/QueryBuilderWatermarkState.ts +2 -12
|
@@ -25,7 +25,6 @@ import {
|
|
|
25
25
|
CustomSelectorInput,
|
|
26
26
|
Dialog,
|
|
27
27
|
InfoCircleIcon,
|
|
28
|
-
InputWithInlineValidation,
|
|
29
28
|
Modal,
|
|
30
29
|
ModalBody,
|
|
31
30
|
ModalFooter,
|
|
@@ -43,7 +42,10 @@ import {
|
|
|
43
42
|
Multiplicity,
|
|
44
43
|
isValidIdentifier,
|
|
45
44
|
} from '@finos/legend-graph';
|
|
46
|
-
import {
|
|
45
|
+
import {
|
|
46
|
+
deepClone,
|
|
47
|
+
generateEnumerableNameFromToken,
|
|
48
|
+
} from '@finos/legend-shared';
|
|
47
49
|
import { observer } from 'mobx-react-lite';
|
|
48
50
|
import { DEFAULT_CONSTANT_VARIABLE_NAME } from '../stores/QueryBuilderConfig.js';
|
|
49
51
|
import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
|
|
@@ -51,37 +53,69 @@ import {
|
|
|
51
53
|
type QueryBuilderConstantExpressionState,
|
|
52
54
|
QueryBuilderSimpleConstantExpressionState,
|
|
53
55
|
QueryBuilderCalculatedConstantExpressionState,
|
|
56
|
+
cloneQueryBuilderConstantLambdaEditorState,
|
|
54
57
|
} from '../stores/QueryBuilderConstantsState.js';
|
|
55
58
|
import { buildDefaultInstanceValue } from '../stores/shared/ValueSpecificationEditorHelper.js';
|
|
56
59
|
import { BasicValueSpecificationEditor } from './shared/BasicValueSpecificationEditor.js';
|
|
57
60
|
import { QUERY_BUILDER_TEST_ID } from '../__lib__/QueryBuilderTesting.js';
|
|
58
61
|
import { QUERY_BUILDER_DOCUMENTATION_KEY } from '../__lib__/QueryBuilderDocumentation.js';
|
|
59
|
-
import React, { useEffect, useState } from 'react';
|
|
62
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
60
63
|
import { variableExpression_setName } from '../stores/shared/ValueSpecificationModifierHelper.js';
|
|
61
64
|
import { LambdaEditor } from './shared/LambdaEditor.js';
|
|
62
65
|
import { VariableViewer } from './shared/QueryBuilderVariableSelector.js';
|
|
63
66
|
import { flowResult } from 'mobx';
|
|
64
67
|
|
|
68
|
+
const getConstantNameValidationMessage = (
|
|
69
|
+
constantInput: string,
|
|
70
|
+
allVariableNames: string[],
|
|
71
|
+
currentConstantName: string,
|
|
72
|
+
): string | undefined =>
|
|
73
|
+
!constantInput
|
|
74
|
+
? `Constant name can't be empty`
|
|
75
|
+
: isValidIdentifier(constantInput) === false
|
|
76
|
+
? 'Constant name must be text with no spaces and not start with an uppercase letter or number'
|
|
77
|
+
: allVariableNames.filter((e) => e === constantInput).length > 0 &&
|
|
78
|
+
constantInput !== currentConstantName
|
|
79
|
+
? 'Constant name already exists'
|
|
80
|
+
: undefined;
|
|
81
|
+
|
|
65
82
|
// NOTE: We currently only allow constant variables for primitive types of multiplicity ONE.
|
|
66
83
|
// This is why we don't show multiplicity in the editor.
|
|
67
84
|
const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
68
85
|
(props: { constantState: QueryBuilderSimpleConstantExpressionState }) => {
|
|
86
|
+
// Read current state
|
|
69
87
|
const { constantState } = props;
|
|
88
|
+
const varExpression = constantState.variable;
|
|
70
89
|
const queryBuilderState = constantState.queryBuilderState;
|
|
71
90
|
const applicationStore = queryBuilderState.applicationStore;
|
|
72
91
|
const variableState = queryBuilderState.constantState;
|
|
73
|
-
const varExpression = constantState.variable;
|
|
74
|
-
const variableName = varExpression.name;
|
|
75
92
|
const allVariableNames = queryBuilderState.allVariableNames;
|
|
76
93
|
const isCreating = !variableState.constants.includes(constantState);
|
|
77
|
-
const valueSpec = constantState.value;
|
|
78
|
-
const variableType =
|
|
79
|
-
constantState.value.genericType?.value.rawType ?? PrimitiveType.STRING;
|
|
80
|
-
const selectedType = buildElementOption(variableType);
|
|
81
94
|
|
|
95
|
+
// Name
|
|
96
|
+
const stateName = varExpression.name;
|
|
97
|
+
const [selectedName, setSelectedName] = useState(stateName);
|
|
98
|
+
const [isNameValid, setIsNameValid] = useState<boolean>(true);
|
|
99
|
+
|
|
100
|
+
// Value
|
|
101
|
+
const stateValue = constantState.value;
|
|
102
|
+
const [selectedValue, setSelectedValue] = useState(deepClone(stateValue));
|
|
103
|
+
|
|
104
|
+
// Type
|
|
105
|
+
const stateType =
|
|
106
|
+
constantState.value.genericType?.value.rawType ?? PrimitiveType.STRING;
|
|
107
|
+
const [selectedType, setSelectedType] = useState(
|
|
108
|
+
buildElementOption(stateType),
|
|
109
|
+
);
|
|
82
110
|
const changeType = (val: PackageableElementOption<Type>): void => {
|
|
83
|
-
if (
|
|
84
|
-
|
|
111
|
+
if (val.value !== selectedType.value) {
|
|
112
|
+
setSelectedType(val);
|
|
113
|
+
const newValSpec = buildDefaultInstanceValue(
|
|
114
|
+
queryBuilderState.graphManagerState.graph,
|
|
115
|
+
val.value,
|
|
116
|
+
queryBuilderState.observerContext,
|
|
117
|
+
);
|
|
118
|
+
setSelectedValue(newValSpec);
|
|
85
119
|
}
|
|
86
120
|
};
|
|
87
121
|
const typeOptions: PackageableElementOption<Type>[] =
|
|
@@ -93,41 +127,34 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
93
127
|
),
|
|
94
128
|
);
|
|
95
129
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const getValidationMessage = (constantInput: string): string | undefined =>
|
|
99
|
-
!constantInput
|
|
100
|
-
? `Constant name can't be empty`
|
|
101
|
-
: isValidIdentifier(constantInput) === false
|
|
102
|
-
? 'Constant name must be text with no spaces and not start with an uppercase letter or number'
|
|
103
|
-
: allVariableNames.filter((e) => e === constantInput).length >
|
|
104
|
-
(isCreating ? 0 : 1)
|
|
105
|
-
? 'Constant name already exists'
|
|
106
|
-
: undefined;
|
|
107
|
-
|
|
108
|
-
const close = (): void => {
|
|
130
|
+
// Modal lifecycle actions
|
|
131
|
+
const handleCancel = (): void => {
|
|
109
132
|
variableState.setSelectedConstant(undefined);
|
|
110
133
|
};
|
|
111
134
|
|
|
112
|
-
const
|
|
135
|
+
const handleApply = (): void => {
|
|
136
|
+
variableExpression_setName(varExpression, selectedName);
|
|
137
|
+
constantState.changeValSpecType(selectedType.value);
|
|
138
|
+
constantState.setValueSpec(selectedValue);
|
|
113
139
|
if (isCreating) {
|
|
114
140
|
variableState.addConstant(constantState);
|
|
115
141
|
}
|
|
116
|
-
|
|
142
|
+
handleCancel();
|
|
117
143
|
};
|
|
144
|
+
|
|
118
145
|
const resetConstantValue = (): void => {
|
|
119
146
|
const valSpec = buildDefaultInstanceValue(
|
|
120
147
|
queryBuilderState.graphManagerState.graph,
|
|
121
|
-
|
|
148
|
+
selectedType.value,
|
|
122
149
|
queryBuilderState.observerContext,
|
|
123
150
|
);
|
|
124
|
-
|
|
151
|
+
setSelectedValue(valSpec);
|
|
125
152
|
};
|
|
126
153
|
|
|
127
154
|
return (
|
|
128
155
|
<Dialog
|
|
129
156
|
open={Boolean(constantState)}
|
|
130
|
-
onClose={
|
|
157
|
+
onClose={handleCancel}
|
|
131
158
|
classes={{
|
|
132
159
|
root: 'editor-modal__root-container',
|
|
133
160
|
container: 'editor-modal__container',
|
|
@@ -135,7 +162,9 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
135
162
|
}}
|
|
136
163
|
>
|
|
137
164
|
<Modal
|
|
138
|
-
darkMode={
|
|
165
|
+
darkMode={
|
|
166
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
|
167
|
+
}
|
|
139
168
|
className="editor-modal query-builder__variables__modal"
|
|
140
169
|
>
|
|
141
170
|
<ModalHeader
|
|
@@ -146,11 +175,17 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
146
175
|
name="Constant Name"
|
|
147
176
|
prompt="Name of constant. Should be descriptive of its purpose."
|
|
148
177
|
update={(value: string | undefined): void => {
|
|
149
|
-
|
|
178
|
+
setSelectedName(value ?? '');
|
|
150
179
|
}}
|
|
151
|
-
validate={
|
|
180
|
+
validate={(constantInput: string) =>
|
|
181
|
+
getConstantNameValidationMessage(
|
|
182
|
+
constantInput,
|
|
183
|
+
allVariableNames,
|
|
184
|
+
stateName,
|
|
185
|
+
)
|
|
186
|
+
}
|
|
152
187
|
onValidate={(issue: string | undefined) => setIsNameValid(!issue)}
|
|
153
|
-
value={
|
|
188
|
+
value={selectedName}
|
|
154
189
|
isReadOnly={false}
|
|
155
190
|
/>
|
|
156
191
|
<PanelFormSection>
|
|
@@ -182,15 +217,15 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
182
217
|
</div>
|
|
183
218
|
<div className="query-builder__variable-editor">
|
|
184
219
|
<BasicValueSpecificationEditor
|
|
185
|
-
valueSpecification={
|
|
220
|
+
valueSpecification={selectedValue}
|
|
186
221
|
setValueSpecification={(val: ValueSpecification): void => {
|
|
187
|
-
|
|
222
|
+
setSelectedValue(deepClone(val));
|
|
188
223
|
}}
|
|
189
224
|
graph={queryBuilderState.graphManagerState.graph}
|
|
190
225
|
obseverContext={queryBuilderState.observerContext}
|
|
191
226
|
typeCheckOption={{
|
|
192
|
-
expectedType:
|
|
193
|
-
match:
|
|
227
|
+
expectedType: selectedType.value,
|
|
228
|
+
match: selectedType.value === PrimitiveType.DATETIME,
|
|
194
229
|
}}
|
|
195
230
|
resetValue={resetConstantValue}
|
|
196
231
|
/>
|
|
@@ -198,14 +233,16 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
198
233
|
</PanelFormSection>
|
|
199
234
|
</ModalBody>
|
|
200
235
|
<ModalFooter>
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
236
|
+
<ModalFooterButton
|
|
237
|
+
text={isCreating ? 'Create' : 'Apply'}
|
|
238
|
+
disabled={!isNameValid}
|
|
239
|
+
onClick={handleApply}
|
|
240
|
+
/>
|
|
241
|
+
<ModalFooterButton
|
|
242
|
+
text="Cancel"
|
|
243
|
+
onClick={handleCancel}
|
|
244
|
+
type="secondary"
|
|
245
|
+
/>
|
|
209
246
|
</ModalFooter>
|
|
210
247
|
</Modal>
|
|
211
248
|
</Dialog>
|
|
@@ -215,28 +252,45 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
215
252
|
|
|
216
253
|
const QuerryBuilderCalculatedConstantExpressionEditor = observer(
|
|
217
254
|
(props: { constantState: QueryBuilderCalculatedConstantExpressionState }) => {
|
|
255
|
+
// Read current state
|
|
218
256
|
const { constantState } = props;
|
|
219
257
|
const queryBuilderState = constantState.queryBuilderState;
|
|
220
258
|
const lambdaState = constantState.lambdaState;
|
|
221
|
-
const close = (): void =>
|
|
222
|
-
queryBuilderState.constantState.setSelectedConstant(undefined);
|
|
223
259
|
const applicationStore = queryBuilderState.applicationStore;
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
260
|
+
const allVariableNames = queryBuilderState.allVariableNames;
|
|
261
|
+
const stateName = constantState.variable.name;
|
|
262
|
+
|
|
263
|
+
// Set up temporary state for modal lifecycle
|
|
264
|
+
const [name, setName] = useState(stateName);
|
|
265
|
+
const [isNameValid, setIsNameValid] = useState<boolean>(true);
|
|
266
|
+
const lambdaStateCopy = useMemo(
|
|
267
|
+
() => cloneQueryBuilderConstantLambdaEditorState(lambdaState),
|
|
268
|
+
[lambdaState],
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
// Modal lifecycle actions
|
|
272
|
+
const handleCancel = (): void => {
|
|
273
|
+
queryBuilderState.constantState.setSelectedConstant(undefined);
|
|
228
274
|
};
|
|
275
|
+
|
|
276
|
+
const handleApply = (): void => {
|
|
277
|
+
variableExpression_setName(constantState.variable, name);
|
|
278
|
+
constantState.lambdaState = lambdaStateCopy;
|
|
279
|
+
handleCancel();
|
|
280
|
+
};
|
|
281
|
+
|
|
229
282
|
useEffect(() => {
|
|
230
283
|
flowResult(
|
|
231
|
-
|
|
284
|
+
lambdaStateCopy.convertLambdaObjectToGrammarString({
|
|
232
285
|
pretty: true,
|
|
233
286
|
}),
|
|
234
287
|
).catch(applicationStore.alertUnhandledError);
|
|
235
|
-
}, [applicationStore,
|
|
288
|
+
}, [applicationStore, lambdaStateCopy]);
|
|
289
|
+
|
|
236
290
|
return (
|
|
237
291
|
<Dialog
|
|
238
292
|
open={true}
|
|
239
|
-
onClose={
|
|
293
|
+
onClose={handleCancel}
|
|
240
294
|
classes={{
|
|
241
295
|
root: 'editor-modal__root-container',
|
|
242
296
|
container: 'editor-modal__container',
|
|
@@ -244,16 +298,18 @@ const QuerryBuilderCalculatedConstantExpressionEditor = observer(
|
|
|
244
298
|
}}
|
|
245
299
|
>
|
|
246
300
|
<Modal
|
|
247
|
-
darkMode={
|
|
301
|
+
darkMode={
|
|
302
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
|
303
|
+
}
|
|
248
304
|
className={clsx('editor-modal query-builder__constants__modal', {
|
|
249
305
|
'query-builder__constants__modal--has-error': Boolean(
|
|
250
|
-
|
|
306
|
+
lambdaStateCopy.parserError,
|
|
251
307
|
),
|
|
252
308
|
})}
|
|
253
309
|
>
|
|
254
310
|
<ModalHeader>
|
|
255
311
|
<div className="modal__title">Update Calculated Constants</div>
|
|
256
|
-
{
|
|
312
|
+
{lambdaStateCopy.parserError && (
|
|
257
313
|
<div className="modal__title__error-badge">
|
|
258
314
|
Failed to parse query
|
|
259
315
|
</div>
|
|
@@ -262,37 +318,56 @@ const QuerryBuilderCalculatedConstantExpressionEditor = observer(
|
|
|
262
318
|
<ModalBody>
|
|
263
319
|
<div
|
|
264
320
|
className={clsx('query-builder__constants__modal__content', {
|
|
265
|
-
backdrop__element: Boolean(
|
|
321
|
+
backdrop__element: Boolean(lambdaStateCopy.parserError),
|
|
266
322
|
})}
|
|
267
323
|
>
|
|
268
324
|
<div className="query-builder__constants__modal__name">
|
|
269
|
-
<
|
|
325
|
+
<PanelFormValidatedTextField
|
|
326
|
+
value={name}
|
|
327
|
+
isReadOnly={false}
|
|
270
328
|
className="query-builder__constants__modal__name__input input--dark"
|
|
271
|
-
spellCheck={false}
|
|
272
|
-
value={constantState.variable.name}
|
|
273
|
-
onChange={changeConstantName}
|
|
274
329
|
placeholder="Constant Name"
|
|
330
|
+
update={(value: string | undefined): void => {
|
|
331
|
+
setName(value ?? '');
|
|
332
|
+
}}
|
|
333
|
+
validate={(constantInput: string) =>
|
|
334
|
+
getConstantNameValidationMessage(
|
|
335
|
+
constantInput,
|
|
336
|
+
allVariableNames,
|
|
337
|
+
stateName,
|
|
338
|
+
)
|
|
339
|
+
}
|
|
340
|
+
onValidate={(issue: string | undefined) =>
|
|
341
|
+
setIsNameValid(!issue)
|
|
342
|
+
}
|
|
275
343
|
/>
|
|
276
344
|
</div>
|
|
277
345
|
<LambdaEditor
|
|
278
346
|
className="query-builder__constants__lambda-editor"
|
|
279
347
|
disabled={
|
|
280
|
-
|
|
348
|
+
lambdaStateCopy.convertingLambdaToStringState.isInProgress
|
|
281
349
|
}
|
|
282
|
-
lambdaEditorState={
|
|
350
|
+
lambdaEditorState={lambdaStateCopy}
|
|
283
351
|
forceBackdrop={false}
|
|
284
352
|
autoFocus={true}
|
|
285
353
|
/>
|
|
286
354
|
</div>
|
|
287
355
|
</ModalBody>
|
|
288
356
|
<ModalFooter>
|
|
289
|
-
<
|
|
357
|
+
<ModalFooterButton
|
|
358
|
+
className="btn btn--dark"
|
|
359
|
+
onClick={handleApply}
|
|
360
|
+
disabled={Boolean(lambdaStateCopy.parserError) || !isNameValid}
|
|
361
|
+
>
|
|
362
|
+
Apply
|
|
363
|
+
</ModalFooterButton>
|
|
364
|
+
<ModalFooterButton
|
|
290
365
|
className="btn btn--dark"
|
|
291
|
-
onClick={
|
|
292
|
-
|
|
366
|
+
onClick={handleCancel}
|
|
367
|
+
type="secondary"
|
|
293
368
|
>
|
|
294
|
-
|
|
295
|
-
</
|
|
369
|
+
Cancel
|
|
370
|
+
</ModalFooterButton>
|
|
296
371
|
</ModalFooter>
|
|
297
372
|
</Modal>
|
|
298
373
|
</Dialog>
|
|
@@ -352,6 +427,7 @@ export const QueryBuilderConstantExpressionPanel = observer(
|
|
|
352
427
|
}
|
|
353
428
|
return null;
|
|
354
429
|
};
|
|
430
|
+
|
|
355
431
|
const getExtraContextMenu = (
|
|
356
432
|
val: QueryBuilderConstantExpressionState,
|
|
357
433
|
):
|
|
@@ -121,6 +121,8 @@ export const QueryBuilderDiffViewPanel = observer(
|
|
|
121
121
|
export const QueryBuilderDiffViewPanelDiaglog = observer(
|
|
122
122
|
(props: { diffViewState: QueryBuilderDiffViewState }) => {
|
|
123
123
|
const { diffViewState } = props;
|
|
124
|
+
const applicationStore =
|
|
125
|
+
diffViewState.changeDetectionState.querybuilderState.applicationStore;
|
|
124
126
|
const close = (): void =>
|
|
125
127
|
diffViewState.changeDetectionState.hideDiffViewPanel();
|
|
126
128
|
return (
|
|
@@ -134,7 +136,9 @@ export const QueryBuilderDiffViewPanelDiaglog = observer(
|
|
|
134
136
|
}}
|
|
135
137
|
>
|
|
136
138
|
<Modal
|
|
137
|
-
darkMode={
|
|
139
|
+
darkMode={
|
|
140
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
|
141
|
+
}
|
|
138
142
|
className={clsx('editor-modal query-builder-text-mode__modal')}
|
|
139
143
|
>
|
|
140
144
|
<ModalHeader>
|
|
@@ -153,7 +157,11 @@ export const QueryBuilderDiffViewPanelDiaglog = observer(
|
|
|
153
157
|
<QueryBuilderDiffViewPanel diffViewState={diffViewState} />
|
|
154
158
|
</ModalBody>
|
|
155
159
|
<ModalFooter className="query-builder__diff-panel__actions">
|
|
156
|
-
<ModalFooterButton
|
|
160
|
+
<ModalFooterButton
|
|
161
|
+
title="Close Modal"
|
|
162
|
+
onClick={close}
|
|
163
|
+
type="secondary"
|
|
164
|
+
>
|
|
157
165
|
Close
|
|
158
166
|
</ModalFooterButton>
|
|
159
167
|
</ModalFooter>
|
|
@@ -78,13 +78,12 @@ const VariableExpressionEditor = observer(
|
|
|
78
78
|
const isCreating =
|
|
79
79
|
!queryParametersState.parameterStates.includes(lambdaParameterState);
|
|
80
80
|
const varState = lambdaParameterState.parameter;
|
|
81
|
-
const multiplity = varState.multiplicity;
|
|
82
81
|
|
|
83
82
|
// type
|
|
84
|
-
const variableType
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
const stateType = lambdaParameterState.variableType ?? PrimitiveType.STRING;
|
|
84
|
+
const [selectedType, setSelectedType] = useState(
|
|
85
|
+
buildElementOption(stateType),
|
|
86
|
+
);
|
|
88
87
|
const typeOptions: PackageableElementOption<Type>[] =
|
|
89
88
|
queryBuilderState.graphManagerState.graph.primitiveTypes
|
|
90
89
|
.map(buildElementOption)
|
|
@@ -94,12 +93,14 @@ const VariableExpressionEditor = observer(
|
|
|
94
93
|
),
|
|
95
94
|
);
|
|
96
95
|
const changeType = (val: PackageableElementOption<Type>): void => {
|
|
97
|
-
|
|
98
|
-
lambdaParameterState.changeVariableType(val.value);
|
|
99
|
-
}
|
|
96
|
+
setSelectedType(val);
|
|
100
97
|
};
|
|
101
98
|
|
|
102
99
|
// multiplicity
|
|
100
|
+
const stateMultiplicity = varState.multiplicity;
|
|
101
|
+
const [selectedMultiplicity, setSelectedMultiplicity] = useState(
|
|
102
|
+
buildMultiplicityOption(stateMultiplicity),
|
|
103
|
+
);
|
|
103
104
|
const validParamMultiplicityList = [
|
|
104
105
|
Multiplicity.ONE,
|
|
105
106
|
Multiplicity.ZERO_ONE,
|
|
@@ -108,46 +109,46 @@ const VariableExpressionEditor = observer(
|
|
|
108
109
|
const multilicityOptions: MultiplicityOption[] =
|
|
109
110
|
validParamMultiplicityList.map(buildMultiplicityOption);
|
|
110
111
|
const changeMultiplicity = (val: MultiplicityOption): void => {
|
|
111
|
-
|
|
112
|
+
setSelectedMultiplicity(val);
|
|
112
113
|
};
|
|
113
114
|
|
|
114
|
-
|
|
115
|
-
|
|
115
|
+
// name
|
|
116
|
+
const stateName = varState.name;
|
|
117
|
+
const [selectedName, setSelectedName] = useState(stateName);
|
|
116
118
|
const [isNameValid, setIsNameValid] = useState<boolean>(true);
|
|
117
119
|
|
|
118
120
|
const getValidationMessage = (input: string): string | undefined =>
|
|
119
121
|
!input
|
|
120
122
|
? `Parameter name can't be empty`
|
|
121
|
-
: allVariableNames.filter((e) => e === input).length >
|
|
122
|
-
|
|
123
|
-
? 'Parameter name already exists'
|
|
124
|
-
: (isCreating &&
|
|
125
|
-
queryParametersState.parameterStates.find(
|
|
126
|
-
(p) => p.parameter.name === input,
|
|
127
|
-
)) ||
|
|
128
|
-
(!isCreating &&
|
|
129
|
-
queryParametersState.parameterStates.filter(
|
|
130
|
-
(p) => p.parameter.name === input,
|
|
131
|
-
).length > 1)
|
|
123
|
+
: allVariableNames.filter((e) => e === input).length > 0 &&
|
|
124
|
+
input !== stateName
|
|
132
125
|
? 'Parameter name already exists'
|
|
133
126
|
: isValidIdentifier(input, true) === false
|
|
134
127
|
? 'Parameter name must be text with no spaces and not start with an uppercase letter or number'
|
|
135
128
|
: undefined;
|
|
136
129
|
|
|
137
|
-
|
|
130
|
+
// modal lifecycle actions
|
|
131
|
+
const handleCancel = (): void => {
|
|
138
132
|
queryParametersState.setSelectedParameter(undefined);
|
|
139
133
|
};
|
|
140
|
-
|
|
134
|
+
|
|
135
|
+
const handleApply = (): void => {
|
|
136
|
+
lambdaParameterState.changeVariableType(selectedType.value);
|
|
137
|
+
lambdaParameterState.changeMultiplicity(
|
|
138
|
+
varState,
|
|
139
|
+
selectedMultiplicity.value,
|
|
140
|
+
);
|
|
141
|
+
variableExpression_setName(varState, selectedName);
|
|
141
142
|
if (isCreating) {
|
|
142
143
|
queryParametersState.addParameter(lambdaParameterState);
|
|
143
144
|
}
|
|
144
|
-
|
|
145
|
+
handleCancel();
|
|
145
146
|
};
|
|
146
147
|
|
|
147
148
|
return (
|
|
148
149
|
<Dialog
|
|
149
150
|
open={Boolean(lambdaParameterState)}
|
|
150
|
-
onClose={
|
|
151
|
+
onClose={handleCancel}
|
|
151
152
|
classes={{
|
|
152
153
|
root: 'editor-modal__root-container',
|
|
153
154
|
container: 'editor-modal__container',
|
|
@@ -155,7 +156,9 @@ const VariableExpressionEditor = observer(
|
|
|
155
156
|
}}
|
|
156
157
|
>
|
|
157
158
|
<Modal
|
|
158
|
-
darkMode={
|
|
159
|
+
darkMode={
|
|
160
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
|
161
|
+
}
|
|
159
162
|
className="editor-modal query-builder__variables__modal"
|
|
160
163
|
>
|
|
161
164
|
<ModalHeader
|
|
@@ -165,9 +168,9 @@ const VariableExpressionEditor = observer(
|
|
|
165
168
|
<PanelFormValidatedTextField
|
|
166
169
|
name="Parameter Name"
|
|
167
170
|
prompt="Name of the parameter. Should be descriptive of its purpose."
|
|
168
|
-
value={
|
|
171
|
+
value={selectedName}
|
|
169
172
|
update={(value: string | undefined): void => {
|
|
170
|
-
|
|
173
|
+
setSelectedName(value ?? '');
|
|
171
174
|
}}
|
|
172
175
|
validate={getValidationMessage}
|
|
173
176
|
onValidate={(issue: string | undefined) => setIsNameValid(!issue)}
|
|
@@ -222,14 +225,16 @@ const VariableExpressionEditor = observer(
|
|
|
222
225
|
</div>
|
|
223
226
|
</ModalBody>
|
|
224
227
|
<ModalFooter>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
228
|
+
<ModalFooterButton
|
|
229
|
+
text={isCreating ? 'Create' : 'Update'}
|
|
230
|
+
disabled={!isNameValid}
|
|
231
|
+
onClick={handleApply}
|
|
232
|
+
/>
|
|
233
|
+
<ModalFooterButton
|
|
234
|
+
onClick={handleCancel}
|
|
235
|
+
text="Cancel"
|
|
236
|
+
type="secondary"
|
|
237
|
+
/>
|
|
233
238
|
</ModalFooter>
|
|
234
239
|
</Modal>
|
|
235
240
|
</Dialog>
|