diff --git a/.changeset/rotten-rivers-sort.md b/.changeset/rotten-rivers-sort.md index 95664a1f2fb..d7606fe32bb 100644 --- a/.changeset/rotten-rivers-sort.md +++ b/.changeset/rotten-rivers-sort.md @@ -2,4 +2,4 @@ '@finos/legend-extension-dsl-serializer': minor --- -Add form support for `binding` and `ExternalFormatConnection` +Add form support for `Binding` store and `ExternalFormat` connection. diff --git a/packages/legend-extension-dsl-serializer/src/components/studio/BindingElementEditor.tsx b/packages/legend-extension-dsl-serializer/src/components/studio/BindingElementEditor.tsx index 1c6a5cd144a..b0c14d082b7 100644 --- a/packages/legend-extension-dsl-serializer/src/components/studio/BindingElementEditor.tsx +++ b/packages/legend-extension-dsl-serializer/src/components/studio/BindingElementEditor.tsx @@ -16,6 +16,7 @@ import { observer } from 'mobx-react-lite'; import type { SelectComponent } from '@finos/legend-art'; +import { TimesIcon } from '@finos/legend-art'; import { clsx, CustomSelectorInput, @@ -24,7 +25,7 @@ import { ResizablePanelSplitter, ResizablePanelSplitterLine, } from '@finos/legend-art'; -import { prettyCONSTName } from '@finos/legend-shared'; +import { guaranteeNonNullable, prettyCONSTName } from '@finos/legend-shared'; import type { ElementDragSource, UMLEditorElementDropTarget, @@ -38,60 +39,60 @@ import { BINDING_TAB_TYPE, BindingEditorState, } from '../../stores/studio/BindingEditorState'; -import { FaLock, FaTimes } from 'react-icons/fa'; +import { FaLock } from 'react-icons/fa'; import { SchemaSet } from '../../models/metamodels/pure/model/packageableElements/schemaSet/SchemaSet'; import type { + OptionalPackageableElementReference, PackageableElement, PackageableElementReference, } from '@finos/legend-graph'; import { PackageableElementExplicitReference } from '@finos/legend-graph'; import { useCallback, useRef } from 'react'; -import { CONTENT_TYPE } from '../../models/metamodels/pure/model/packageableElements/store/Binding'; +import { BINDING_CONTENT_TYPE } from '../../models/metamodels/pure/model/packageableElements/store/Binding'; import { useDrop } from 'react-dnd'; import type { ModelUnit } from '../../models/metamodels/pure/model/packageableElements/store/ModelUnit'; -const ElementEditor = observer( +enum BINDING_MODEL_UNIT { + ELEMENT_INCLUDE = 'ELEMENT_INCLUDE', + ELEMENT_EXCLUDE = 'ELEMENT_EXCLUDE', +} + +const BindingScopeEntryEditor = observer( (props: { - modelUnitState: ModelUnit; elementRef: PackageableElementReference; - modelInclude: boolean; + removeElement: ( + val: PackageableElementReference, + label: BINDING_MODEL_UNIT, + ) => void; + label: BINDING_MODEL_UNIT; isReadOnly: boolean; }) => { - const { modelUnitState, elementRef, modelInclude, isReadOnly } = props; + const { elementRef, removeElement, label, isReadOnly } = props; const editorStore = useEditorStore(); - const deleteElement = (): void => { - if (modelInclude) { - return modelUnitState.deletePackageableElementIncludes(elementRef); - } - return modelUnitState.deletePackageableElementExcludes(elementRef); - }; - const elementPath = ( - element: PackageableElementReference, - ): string => element.value.path; return (
<> -
+
{ -
+
{getElementIcon(editorStore, elementRef.value)}
} -
- {elementPath(elementRef)} +
+ {elementRef.value.path}
@@ -100,53 +101,32 @@ const ElementEditor = observer( }, ); -const BindingModelEditor = observer( +const BindingScopeEditor = observer( (props: { modelUnitState: ModelUnit; - modelInclude: boolean; + addElement: (label: BINDING_MODEL_UNIT) => void; + removeElement: ( + val: PackageableElementReference, + label: BINDING_MODEL_UNIT, + ) => void; + label: BINDING_MODEL_UNIT; + allowAddingElement: boolean; isReadOnly: boolean; }) => { - const { modelUnitState, modelInclude, isReadOnly } = props; - const editorStore = useEditorStore(); - const graph = editorStore.graphManagerState.graph; - const allowedElements = [ - ...graph.ownProfiles, - ...graph.ownEnumerations, - ...graph.ownClasses, - ...graph.ownAssociations, - ...graph.ownFunctions, - ]; - const elements = allowedElements.filter((element) => { - if (modelInclude) { - return !modelUnitState.packageableElementIncludes - .map((element) => element.value) - .includes(element); - } else { - return !modelUnitState.packageableElementExcludes - .map((element) => element.value) - .includes(element); - } - }); - const allowAddingElement = !isReadOnly && Boolean(elements.length); - const addElement = (): void => { - if (allowAddingElement) { - if (modelInclude) { - modelUnitState.addPackageableElementIncludes( - PackageableElementExplicitReference.create(elements[0]), - ); - } else { - modelUnitState.addPackageableElementExcludes( - PackageableElementExplicitReference.create(elements[0]), - ); - } - } - }; + const { + modelUnitState, + addElement, + removeElement, + label, + allowAddingElement, + isReadOnly, + } = props; const handleDropElement = useCallback( (item: UMLEditorElementDropTarget): void => { const element = item.data.packageableElement; if ( !isReadOnly && - modelInclude && + label === BINDING_MODEL_UNIT.ELEMENT_INCLUDE && !modelUnitState.packageableElementIncludes .map((element) => element.value) .includes(element) @@ -156,7 +136,7 @@ const BindingModelEditor = observer( ); } else if ( !isReadOnly && - !modelInclude && + label === BINDING_MODEL_UNIT.ELEMENT_EXCLUDE && !modelUnitState.packageableElementExcludes .map((element) => element.value) .includes(element) @@ -166,7 +146,7 @@ const BindingModelEditor = observer( ); } }, - [isReadOnly, modelUnitState, modelInclude], + [isReadOnly, modelUnitState, label], ); const [{ isElementDragOver }, dropElementRef] = useDrop( () => ({ @@ -187,60 +167,62 @@ const BindingModelEditor = observer( ); return ( -
-
-
-
- {modelInclude ? `Model Includes` : `Model Excludes`} +
+
+
+
+ {label === BINDING_MODEL_UNIT.ELEMENT_INCLUDE + ? `Model Includes` + : `Model Excludes`}
-
-
-
- {modelInclude +
+
+
+ {label === BINDING_MODEL_UNIT.ELEMENT_INCLUDE ? `Specifies the list of models included` : `Specifies the list of models excluded`}
-
- {modelInclude && +
+ {label === BINDING_MODEL_UNIT.ELEMENT_INCLUDE && modelUnitState.packageableElementIncludes.map( (elementRef) => ( - ), )} - {!modelInclude && + {label === BINDING_MODEL_UNIT.ELEMENT_EXCLUDE && modelUnitState.packageableElementExcludes.map( (elementRef) => ( - ), )} -
+