@finos/legend-query-builder 4.14.38 → 4.14.39

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.
Files changed (37) hide show
  1. package/lib/__lib__/QueryBuilderTesting.d.ts +2 -1
  2. package/lib/__lib__/QueryBuilderTesting.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderTesting.js +1 -0
  4. package/lib/__lib__/QueryBuilderTesting.js.map +1 -1
  5. package/lib/components/QueryBuilderParametersPanel.js +2 -2
  6. package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
  7. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts +0 -2
  8. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  9. package/lib/components/QueryBuilderPropertyExpressionEditor.js +10 -26
  10. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  11. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  12. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +10 -9
  13. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  14. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  15. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +3 -5
  16. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  17. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  18. package/lib/components/filter/QueryBuilderFilterPanel.js +1 -2
  19. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  20. package/lib/components/shared/BasicValueSpecificationEditor.d.ts.map +1 -1
  21. package/lib/components/shared/BasicValueSpecificationEditor.js +49 -8
  22. package/lib/components/shared/BasicValueSpecificationEditor.js.map +1 -1
  23. package/lib/index.css +2 -2
  24. package/lib/index.css.map +1 -1
  25. package/lib/package.json +1 -1
  26. package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts.map +1 -1
  27. package/lib/stores/watermark/QueryBuilderWatermarkState.js +0 -1
  28. package/lib/stores/watermark/QueryBuilderWatermarkState.js.map +1 -1
  29. package/package.json +8 -8
  30. package/src/__lib__/QueryBuilderTesting.ts +1 -0
  31. package/src/components/QueryBuilderParametersPanel.tsx +2 -2
  32. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +40 -92
  33. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +25 -31
  34. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +5 -15
  35. package/src/components/filter/QueryBuilderFilterPanel.tsx +0 -11
  36. package/src/components/shared/BasicValueSpecificationEditor.tsx +141 -34
  37. package/src/stores/watermark/QueryBuilderWatermarkState.ts +0 -1
@@ -776,6 +776,98 @@ const setCollectionValue = (
776
776
  instanceValue_setValues(valueSpecification, result, obseverContext);
777
777
  };
778
778
 
779
+ const EnumCollectionInstanceValueEditor = observer(
780
+ (props: {
781
+ valueSpecification: CollectionInstanceValue;
782
+ observerContext: ObserverContext;
783
+ saveEdit: () => void;
784
+ }) => {
785
+ const { valueSpecification, observerContext, saveEdit } = props;
786
+ const applicationStore = useApplicationStore();
787
+ const enumType = guaranteeType(
788
+ valueSpecification.genericType?.value.rawType,
789
+ Enumeration,
790
+ );
791
+
792
+ const [selectedOptions, setSelectedOptions] = useState<
793
+ { label: string; value: Enum }[]
794
+ >(
795
+ (valueSpecification.values as EnumValueInstanceValue[])
796
+ .filter((valueSpec) => valueSpec.values[0]?.value !== undefined)
797
+ .map((valueSpec) => ({
798
+ label: valueSpec.values[0]!.value.name,
799
+ value: valueSpec.values[0]!.value,
800
+ })),
801
+ );
802
+
803
+ const availableOptions = enumType.values
804
+ .filter(
805
+ (value) =>
806
+ !selectedOptions.some(
807
+ (selectedValue) => selectedValue.value.name === value.name,
808
+ ),
809
+ )
810
+ .map((value) => ({
811
+ label: value.name,
812
+ value: value,
813
+ }));
814
+
815
+ const changeValue = (
816
+ newSelectedOptions: { value: Enum; label: string }[],
817
+ ): void => {
818
+ setSelectedOptions(newSelectedOptions);
819
+ };
820
+
821
+ const updateValueSpecAndSaveEdit = (): void => {
822
+ const result = selectedOptions
823
+ .map((value) => {
824
+ const enumValueInstanceValue = new EnumValueInstanceValue(
825
+ GenericTypeExplicitReference.create(new GenericType(enumType)),
826
+ );
827
+ instanceValue_setValues(
828
+ enumValueInstanceValue,
829
+ [EnumValueExplicitReference.create(value.value)],
830
+ observerContext,
831
+ );
832
+ return enumValueInstanceValue;
833
+ })
834
+ .filter(isNonNullable);
835
+ instanceValue_setValues(valueSpecification, result, observerContext);
836
+ saveEdit();
837
+ };
838
+
839
+ return (
840
+ <>
841
+ <CustomSelectorInput
842
+ className="value-spec-editor__enum-collection-selector"
843
+ options={availableOptions}
844
+ isMulti={true}
845
+ onChange={changeValue}
846
+ onBlur={updateValueSpecAndSaveEdit}
847
+ onKeyDown={(event: KeyboardEvent): void => {
848
+ if (event.key === 'Enter' && !event.shiftKey) {
849
+ updateValueSpecAndSaveEdit();
850
+ }
851
+ }}
852
+ value={selectedOptions}
853
+ darkMode={
854
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
855
+ }
856
+ placeholder="Select value"
857
+ autoFocus={true}
858
+ menuIsOpen={true}
859
+ />
860
+ <button
861
+ className="value-spec-editor__list-editor__save-button btn--dark"
862
+ onClick={updateValueSpecAndSaveEdit}
863
+ >
864
+ <SaveIcon />
865
+ </button>
866
+ </>
867
+ );
868
+ },
869
+ );
870
+
779
871
  const COLLECTION_PREVIEW_CHAR_LIMIT = 50;
780
872
 
781
873
  const getPlaceHolder = (expectedType: Type): string => {
@@ -836,6 +928,11 @@ const CollectionValueInstanceValueEditor = observer(
836
928
  if (editable) {
837
929
  setEditable(false);
838
930
  setShowAdvancedEditorPopover(false);
931
+ setValueSpecification(valueSpecification);
932
+ }
933
+ };
934
+ const updateValueSpecAndSaveEdit = (): void => {
935
+ if (editable) {
839
936
  setCollectionValue(
840
937
  valueSpecification,
841
938
  expectedType,
@@ -843,7 +940,7 @@ const CollectionValueInstanceValueEditor = observer(
843
940
  obseverContext,
844
941
  );
845
942
  setText(stringifyValue(valueSpecification.values));
846
- setValueSpecification(valueSpecification);
943
+ saveEdit();
847
944
  }
848
945
  };
849
946
 
@@ -861,7 +958,7 @@ const CollectionValueInstanceValueEditor = observer(
861
958
  (event.relatedTarget as HTMLButtonElement | undefined)?.name !==
862
959
  expandButtonName
863
960
  ) {
864
- saveEdit();
961
+ updateValueSpecAndSaveEdit();
865
962
  }
866
963
  };
867
964
 
@@ -891,7 +988,7 @@ const CollectionValueInstanceValueEditor = observer(
891
988
  onChange={changeValueTextArea}
892
989
  onKeyDown={(event): void => {
893
990
  if (event.key === 'Enter' && !event.shiftKey) {
894
- saveEdit();
991
+ updateValueSpecAndSaveEdit();
895
992
  }
896
993
  }}
897
994
  />
@@ -903,37 +1000,47 @@ const CollectionValueInstanceValueEditor = observer(
903
1000
  </BasePopover>
904
1001
  )}
905
1002
  <div className={clsx('value-spec-editor', className)}>
906
- <textarea
907
- ref={inputRef}
908
- className={clsx(
909
- 'panel__content__form__section__input value-spec-editor__input value-spec-editor__textarea ',
910
- )}
911
- spellCheck={false}
912
- value={text}
913
- placeholder={placeholder}
914
- onChange={changeValueTextArea}
915
- onKeyDown={(event): void => {
916
- if (event.key === 'Enter' && !event.shiftKey) {
917
- saveEdit();
918
- }
919
- }}
920
- onBlur={handleOnBlur}
921
- />
922
- <button
923
- className="value-spec-editor__list-editor__expand-button btn--dark"
924
- onClick={() => setShowAdvancedEditorPopover(true)}
925
- tabIndex={-1}
926
- name={expandButtonName}
927
- title="Expand window..."
928
- >
929
- <FilledWindowMaximizeIcon />
930
- </button>
931
- <button
932
- className="value-spec-editor__list-editor__save-button btn--dark"
933
- onClick={saveEdit}
934
- >
935
- <SaveIcon />
936
- </button>
1003
+ {expectedType instanceof Enumeration ? (
1004
+ <EnumCollectionInstanceValueEditor
1005
+ valueSpecification={valueSpecification}
1006
+ observerContext={obseverContext}
1007
+ saveEdit={saveEdit}
1008
+ />
1009
+ ) : (
1010
+ <>
1011
+ <textarea
1012
+ ref={inputRef}
1013
+ className={clsx(
1014
+ 'panel__content__form__section__input value-spec-editor__input value-spec-editor__textarea ',
1015
+ )}
1016
+ spellCheck={false}
1017
+ value={text}
1018
+ placeholder={placeholder}
1019
+ onChange={changeValueTextArea}
1020
+ onKeyDown={(event): void => {
1021
+ if (event.key === 'Enter' && !event.shiftKey) {
1022
+ updateValueSpecAndSaveEdit();
1023
+ }
1024
+ }}
1025
+ onBlur={handleOnBlur}
1026
+ />
1027
+ <button
1028
+ className="value-spec-editor__list-editor__expand-button btn--dark"
1029
+ onClick={() => setShowAdvancedEditorPopover(true)}
1030
+ tabIndex={-1}
1031
+ name={expandButtonName}
1032
+ title="Expand window..."
1033
+ >
1034
+ <FilledWindowMaximizeIcon />
1035
+ </button>
1036
+ <button
1037
+ className="value-spec-editor__list-editor__save-button btn--dark"
1038
+ onClick={saveEdit}
1039
+ >
1040
+ <SaveIcon />
1041
+ </button>
1042
+ </>
1043
+ )}
937
1044
  <button
938
1045
  className="value-spec-editor__reset-btn"
939
1046
  name="Reset"
@@ -50,7 +50,6 @@ export class QueryBuilderWatermarkState implements Hashable {
50
50
  ),
51
51
  );
52
52
 
53
- watermarkConstant.values = ['watermarkValue'];
54
53
  return watermarkConstant;
55
54
  }
56
55