@finos/legend-application-studio 13.0.2 → 13.1.1

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 (177) hide show
  1. package/lib/components/LegendStudioApplication.js +1 -1
  2. package/lib/components/LegendStudioApplication.js.map +1 -1
  3. package/lib/components/editor/command/project-search.css +1 -1
  4. package/lib/components/editor/command/project-search.css.map +1 -1
  5. package/lib/components/editor/command-center/ProjectSearchCommand.d.ts.map +1 -1
  6. package/lib/components/editor/command-center/ProjectSearchCommand.js +11 -3
  7. package/lib/components/editor/command-center/ProjectSearchCommand.js.map +1 -1
  8. package/lib/components/editor/edit-panel/FunctionEditor.d.ts.map +1 -1
  9. package/lib/components/editor/edit-panel/FunctionEditor.js +41 -34
  10. package/lib/components/editor/edit-panel/FunctionEditor.js.map +1 -1
  11. package/lib/components/editor/edit-panel/GenerationSpecificationEditor.d.ts.map +1 -1
  12. package/lib/components/editor/edit-panel/GenerationSpecificationEditor.js +35 -54
  13. package/lib/components/editor/edit-panel/GenerationSpecificationEditor.js.map +1 -1
  14. package/lib/components/editor/edit-panel/GrammarTextEditor.d.ts.map +1 -1
  15. package/lib/components/editor/edit-panel/GrammarTextEditor.js +2 -2
  16. package/lib/components/editor/edit-panel/GrammarTextEditor.js.map +1 -1
  17. package/lib/components/editor/edit-panel/RuntimeEditor.d.ts.map +1 -1
  18. package/lib/components/editor/edit-panel/RuntimeEditor.js +11 -20
  19. package/lib/components/editor/edit-panel/RuntimeEditor.js.map +1 -1
  20. package/lib/components/editor/edit-panel/data-editor/DataElementEditor.d.ts.map +1 -1
  21. package/lib/components/editor/edit-panel/data-editor/DataElementEditor.js +4 -8
  22. package/lib/components/editor/edit-panel/data-editor/DataElementEditor.js.map +1 -1
  23. package/lib/components/editor/edit-panel/data-editor/RelationalCSVDataEditor.js +1 -1
  24. package/lib/components/editor/edit-panel/data-editor/RelationalCSVDataEditor.js.map +1 -1
  25. package/lib/components/editor/edit-panel/element-generation-editor/FileGenerationEditor.d.ts.map +1 -1
  26. package/lib/components/editor/edit-panel/element-generation-editor/FileGenerationEditor.js +3 -7
  27. package/lib/components/editor/edit-panel/element-generation-editor/FileGenerationEditor.js.map +1 -1
  28. package/lib/components/editor/edit-panel/external-format-editor/BindingElementEditor.d.ts.map +1 -1
  29. package/lib/components/editor/edit-panel/external-format-editor/BindingElementEditor.js +2 -2
  30. package/lib/components/editor/edit-panel/external-format-editor/BindingElementEditor.js.map +1 -1
  31. package/lib/components/editor/edit-panel/external-format-editor/SchemaSetElementEditor.js +1 -1
  32. package/lib/components/editor/edit-panel/external-format-editor/SchemaSetElementEditor.js.map +1 -1
  33. package/lib/components/editor/edit-panel/mapping-editor/EnumerationMappingEditor.d.ts.map +1 -1
  34. package/lib/components/editor/edit-panel/mapping-editor/EnumerationMappingEditor.js +2 -9
  35. package/lib/components/editor/edit-panel/mapping-editor/EnumerationMappingEditor.js.map +1 -1
  36. package/lib/components/editor/edit-panel/mapping-editor/FlatDataPropertyMappingEditor.d.ts.map +1 -1
  37. package/lib/components/editor/edit-panel/mapping-editor/FlatDataPropertyMappingEditor.js +3 -4
  38. package/lib/components/editor/edit-panel/mapping-editor/FlatDataPropertyMappingEditor.js.map +1 -1
  39. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationEditor.d.ts.map +1 -1
  40. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationEditor.js +3 -10
  41. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationEditor.js.map +1 -1
  42. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.d.ts.map +1 -1
  43. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.js +4 -10
  44. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.js.map +1 -1
  45. package/lib/components/editor/edit-panel/mapping-editor/MappingExplorer.js +7 -9
  46. package/lib/components/editor/edit-panel/mapping-editor/MappingExplorer.js.map +1 -1
  47. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.d.ts.map +1 -1
  48. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.js +3 -6
  49. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.js.map +1 -1
  50. package/lib/components/editor/edit-panel/mapping-editor/MappingTestsExplorer.d.ts.map +1 -1
  51. package/lib/components/editor/edit-panel/mapping-editor/MappingTestsExplorer.js +7 -8
  52. package/lib/components/editor/edit-panel/mapping-editor/MappingTestsExplorer.js.map +1 -1
  53. package/lib/components/editor/edit-panel/mapping-editor/NewMappingElementModal.js +2 -2
  54. package/lib/components/editor/edit-panel/mapping-editor/NewMappingElementModal.js.map +1 -1
  55. package/lib/components/editor/edit-panel/mapping-editor/OperationSetImplementationEditor.d.ts.map +1 -1
  56. package/lib/components/editor/edit-panel/mapping-editor/OperationSetImplementationEditor.js +5 -7
  57. package/lib/components/editor/edit-panel/mapping-editor/OperationSetImplementationEditor.js.map +1 -1
  58. package/lib/components/editor/edit-panel/mapping-editor/PurePropertyMappingEditor.d.ts.map +1 -1
  59. package/lib/components/editor/edit-panel/mapping-editor/PurePropertyMappingEditor.js +3 -4
  60. package/lib/components/editor/edit-panel/mapping-editor/PurePropertyMappingEditor.js.map +1 -1
  61. package/lib/components/editor/edit-panel/mapping-editor/relational/RelationalPropertyMappingEditor.d.ts.map +1 -1
  62. package/lib/components/editor/edit-panel/mapping-editor/relational/RelationalPropertyMappingEditor.js +1 -1
  63. package/lib/components/editor/edit-panel/mapping-editor/relational/RelationalPropertyMappingEditor.js.map +1 -1
  64. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionEditor.d.ts.map +1 -1
  65. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionEditor.js +3 -5
  66. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionEditor.js.map +1 -1
  67. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestableEditor.js +1 -1
  68. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestableEditor.js.map +1 -1
  69. package/lib/components/editor/edit-panel/uml-editor/AssociationEditor.d.ts.map +1 -1
  70. package/lib/components/editor/edit-panel/uml-editor/AssociationEditor.js +4 -8
  71. package/lib/components/editor/edit-panel/uml-editor/AssociationEditor.js.map +1 -1
  72. package/lib/components/editor/edit-panel/uml-editor/ClassEditor.d.ts.map +1 -1
  73. package/lib/components/editor/edit-panel/uml-editor/ClassEditor.js +157 -57
  74. package/lib/components/editor/edit-panel/uml-editor/ClassEditor.js.map +1 -1
  75. package/lib/components/editor/edit-panel/uml-editor/EnumerationEditor.d.ts.map +1 -1
  76. package/lib/components/editor/edit-panel/uml-editor/EnumerationEditor.js +39 -21
  77. package/lib/components/editor/edit-panel/uml-editor/EnumerationEditor.js.map +1 -1
  78. package/lib/components/editor/edit-panel/uml-editor/ProfileEditor.d.ts.map +1 -1
  79. package/lib/components/editor/edit-panel/uml-editor/ProfileEditor.js +62 -9
  80. package/lib/components/editor/edit-panel/uml-editor/ProfileEditor.js.map +1 -1
  81. package/lib/components/editor/edit-panel/uml-editor/PropertyEditor.d.ts.map +1 -1
  82. package/lib/components/editor/edit-panel/uml-editor/PropertyEditor.js +4 -8
  83. package/lib/components/editor/edit-panel/uml-editor/PropertyEditor.js.map +1 -1
  84. package/lib/components/editor/edit-panel/uml-editor/StereotypeSelector.d.ts +7 -1
  85. package/lib/components/editor/edit-panel/uml-editor/StereotypeSelector.d.ts.map +1 -1
  86. package/lib/components/editor/edit-panel/uml-editor/StereotypeSelector.js +33 -5
  87. package/lib/components/editor/edit-panel/uml-editor/StereotypeSelector.js.map +1 -1
  88. package/lib/components/editor/edit-panel/uml-editor/TaggedValueEditor.d.ts +7 -1
  89. package/lib/components/editor/edit-panel/uml-editor/TaggedValueEditor.d.ts.map +1 -1
  90. package/lib/components/editor/edit-panel/uml-editor/TaggedValueEditor.js +35 -7
  91. package/lib/components/editor/edit-panel/uml-editor/TaggedValueEditor.js.map +1 -1
  92. package/lib/components/editor/side-bar/CreateNewElementModal.d.ts.map +1 -1
  93. package/lib/components/editor/side-bar/CreateNewElementModal.js +4 -4
  94. package/lib/components/editor/side-bar/CreateNewElementModal.js.map +1 -1
  95. package/lib/components/editor/side-bar/Explorer.d.ts.map +1 -1
  96. package/lib/components/editor/side-bar/Explorer.js +8 -15
  97. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  98. package/lib/components/shared/StudioLambdaEditor.d.ts +1 -0
  99. package/lib/components/shared/StudioLambdaEditor.d.ts.map +1 -1
  100. package/lib/components/shared/StudioLambdaEditor.js +2 -2
  101. package/lib/components/shared/StudioLambdaEditor.js.map +1 -1
  102. package/lib/index.css +2 -2
  103. package/lib/index.css.map +1 -1
  104. package/lib/package.json +5 -5
  105. package/lib/stores/EditorStore.d.ts.map +1 -1
  106. package/lib/stores/EditorStore.js +7 -7
  107. package/lib/stores/EditorStore.js.map +1 -1
  108. package/lib/stores/LegendStudioBaseStore.d.ts +3 -8
  109. package/lib/stores/LegendStudioBaseStore.d.ts.map +1 -1
  110. package/lib/stores/LegendStudioBaseStore.js +9 -105
  111. package/lib/stores/LegendStudioBaseStore.js.map +1 -1
  112. package/lib/stores/editor/NewElementState.d.ts.map +1 -1
  113. package/lib/stores/editor/NewElementState.js +8 -2
  114. package/lib/stores/editor/NewElementState.js.map +1 -1
  115. package/lib/stores/editor-state/GenerationSpecificationEditorState.d.ts +0 -2
  116. package/lib/stores/editor-state/GenerationSpecificationEditorState.d.ts.map +1 -1
  117. package/lib/stores/editor-state/GenerationSpecificationEditorState.js +1 -8
  118. package/lib/stores/editor-state/GenerationSpecificationEditorState.js.map +1 -1
  119. package/lib/stores/editor-state/element-editor-state/ElementEditorState.d.ts.map +1 -1
  120. package/lib/stores/editor-state/element-editor-state/ElementEditorState.js +2 -4
  121. package/lib/stores/editor-state/element-editor-state/ElementEditorState.js.map +1 -1
  122. package/lib/stores/editor-state/element-editor-state/mapping/MappingEditorState.js +1 -1
  123. package/lib/stores/editor-state/element-editor-state/mapping/MappingEditorState.js.map +1 -1
  124. package/lib/stores/editor-state/element-editor-state/mapping/MappingExecutionState.js +1 -1
  125. package/lib/stores/editor-state/element-editor-state/mapping/MappingExecutionState.js.map +1 -1
  126. package/lib/stores/graphModifier/DomainGraphModifierHelper.d.ts +10 -0
  127. package/lib/stores/graphModifier/DomainGraphModifierHelper.d.ts.map +1 -1
  128. package/lib/stores/graphModifier/DomainGraphModifierHelper.js +31 -1
  129. package/lib/stores/graphModifier/DomainGraphModifierHelper.js.map +1 -1
  130. package/lib/stores/shared/DnDUtil.d.ts +1 -2
  131. package/lib/stores/shared/DnDUtil.d.ts.map +1 -1
  132. package/lib/stores/shared/DnDUtil.js +0 -2
  133. package/lib/stores/shared/DnDUtil.js.map +1 -1
  134. package/package.json +13 -13
  135. package/src/components/LegendStudioApplication.tsx +2 -2
  136. package/src/components/editor/command-center/ProjectSearchCommand.tsx +13 -2
  137. package/src/components/editor/edit-panel/FunctionEditor.tsx +220 -152
  138. package/src/components/editor/edit-panel/GenerationSpecificationEditor.tsx +154 -184
  139. package/src/components/editor/edit-panel/GrammarTextEditor.tsx +4 -5
  140. package/src/components/editor/edit-panel/RuntimeEditor.tsx +89 -90
  141. package/src/components/editor/edit-panel/data-editor/DataElementEditor.tsx +57 -40
  142. package/src/components/editor/edit-panel/data-editor/RelationalCSVDataEditor.tsx +1 -1
  143. package/src/components/editor/edit-panel/element-generation-editor/FileGenerationEditor.tsx +50 -45
  144. package/src/components/editor/edit-panel/external-format-editor/BindingElementEditor.tsx +36 -32
  145. package/src/components/editor/edit-panel/external-format-editor/SchemaSetElementEditor.tsx +1 -1
  146. package/src/components/editor/edit-panel/mapping-editor/EnumerationMappingEditor.tsx +46 -41
  147. package/src/components/editor/edit-panel/mapping-editor/FlatDataPropertyMappingEditor.tsx +9 -7
  148. package/src/components/editor/edit-panel/mapping-editor/InstanceSetImplementationEditor.tsx +18 -21
  149. package/src/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.tsx +39 -29
  150. package/src/components/editor/edit-panel/mapping-editor/MappingExplorer.tsx +39 -39
  151. package/src/components/editor/edit-panel/mapping-editor/MappingTestEditor.tsx +23 -15
  152. package/src/components/editor/edit-panel/mapping-editor/MappingTestsExplorer.tsx +40 -38
  153. package/src/components/editor/edit-panel/mapping-editor/NewMappingElementModal.tsx +2 -2
  154. package/src/components/editor/edit-panel/mapping-editor/OperationSetImplementationEditor.tsx +48 -45
  155. package/src/components/editor/edit-panel/mapping-editor/PurePropertyMappingEditor.tsx +12 -8
  156. package/src/components/editor/edit-panel/mapping-editor/relational/RelationalPropertyMappingEditor.tsx +2 -3
  157. package/src/components/editor/edit-panel/service-editor/ServiceExecutionEditor.tsx +75 -72
  158. package/src/components/editor/edit-panel/service-editor/testable/ServiceTestableEditor.tsx +1 -1
  159. package/src/components/editor/edit-panel/uml-editor/AssociationEditor.tsx +55 -38
  160. package/src/components/editor/edit-panel/uml-editor/ClassEditor.tsx +813 -499
  161. package/src/components/editor/edit-panel/uml-editor/EnumerationEditor.tsx +209 -113
  162. package/src/components/editor/edit-panel/uml-editor/ProfileEditor.tsx +184 -52
  163. package/src/components/editor/edit-panel/uml-editor/PropertyEditor.tsx +62 -39
  164. package/src/components/editor/edit-panel/uml-editor/StereotypeSelector.tsx +137 -52
  165. package/src/components/editor/edit-panel/uml-editor/TaggedValueEditor.tsx +171 -88
  166. package/src/components/editor/side-bar/CreateNewElementModal.tsx +4 -2
  167. package/src/components/editor/side-bar/Explorer.tsx +13 -20
  168. package/src/components/shared/StudioLambdaEditor.tsx +3 -0
  169. package/src/stores/EditorStore.ts +7 -6
  170. package/src/stores/LegendStudioBaseStore.ts +20 -147
  171. package/src/stores/editor/NewElementState.ts +8 -2
  172. package/src/stores/editor-state/GenerationSpecificationEditorState.ts +1 -15
  173. package/src/stores/editor-state/element-editor-state/ElementEditorState.ts +2 -3
  174. package/src/stores/editor-state/element-editor-state/mapping/MappingEditorState.ts +1 -1
  175. package/src/stores/editor-state/element-editor-state/mapping/MappingExecutionState.ts +1 -1
  176. package/src/stores/graphModifier/DomainGraphModifierHelper.ts +92 -0
  177. package/src/stores/shared/DnDUtil.ts +0 -2
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useRef, useEffect, useCallback } from 'react';
17
+ import { useRef, useCallback } from 'react';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import {
20
20
  GenerationSpecificationEditorState,
@@ -22,14 +22,7 @@ import {
22
22
  type GenerationSpecNodeDropTarget,
23
23
  type GenerationTreeNodeState,
24
24
  } from '../../../stores/editor-state/GenerationSpecificationEditorState.js';
25
- import { getEmptyImage } from 'react-dnd-html5-backend';
26
- import {
27
- type DropTargetMonitor,
28
- type XYCoord,
29
- useDragLayer,
30
- useDrag,
31
- useDrop,
32
- } from 'react-dnd';
25
+ import { type DropTargetMonitor, useDrag, useDrop } from 'react-dnd';
33
26
  import { getElementIcon } from '../../shared/ElementIconUtils.js';
34
27
  import {
35
28
  clsx,
@@ -45,6 +38,10 @@ import {
45
38
  TimesIcon,
46
39
  PlusIcon,
47
40
  LongArrowRightIcon,
41
+ PanelDropZone,
42
+ DragPreviewLayer,
43
+ useDragPreviewLayer,
44
+ PanelEntryDropZonePlaceholder,
48
45
  } from '@finos/legend-art';
49
46
  import {
50
47
  CORE_DND_TYPE,
@@ -75,48 +72,16 @@ import {
75
72
  generationSpecification_setId,
76
73
  } from '../../../stores/graphModifier/DSLGeneration_GraphModifierHelper.js';
77
74
 
78
- const ModelGenerationDragLayer: React.FC = () => {
79
- const { itemType, item, isDragging, currentPosition } = useDragLayer(
80
- (monitor) => ({
81
- itemType: monitor.getItemType(),
82
- item: monitor.getItem<GenerationSpecNodeDragSource | null>(),
83
- isDragging: monitor.isDragging(),
84
- initialOffset: monitor.getInitialSourceClientOffset(),
85
- currentPosition: monitor.getClientOffset(),
86
- }),
87
- );
88
- if (!isDragging || !item || itemType !== CORE_DND_TYPE.GENERATION_SPEC_NODE) {
89
- return null;
90
- }
91
- return (
92
- <div className="generation-spec-model-generation-editor__item__drag-preview-layer">
93
- <div
94
- className="generation-spec-model-generation-editor__item__drag-preview"
95
- style={
96
- !currentPosition
97
- ? { display: 'none' }
98
- : {
99
- transform: `translate(${currentPosition.x + 20}px, ${
100
- currentPosition.y + 10
101
- }px)`,
102
- }
103
- }
104
- >
105
- {item.nodeState.node.generationElement.value.name}
106
- </div>
107
- </div>
108
- );
109
- };
75
+ const GENERATION_SPEC_NODE_DND_TYPE = 'GENERATION_SPEC_NODE';
110
76
 
111
77
  const ModelGenerationItem = observer(
112
78
  (props: {
113
79
  specState: GenerationSpecificationEditorState;
114
80
  nodeState: GenerationTreeNodeState;
115
81
  options: PackageableElementOption<PackageableElement>[];
116
- isRearrangingNodes: boolean;
117
82
  }) => {
118
83
  const ref = useRef<HTMLDivElement>(null);
119
- const { nodeState, specState, options, isRearrangingNodes } = props;
84
+ const { nodeState, specState, options } = props;
120
85
  const generationTreeNode = nodeState.node;
121
86
  const editorStore = useEditorStore();
122
87
  const modelGenerationRef = generationTreeNode.generationElement;
@@ -164,8 +129,7 @@ const ModelGenerationItem = observer(
164
129
  ((hoverBoundingReact?.bottom ?? 0) - (hoverBoundingReact?.top ?? 0)) /
165
130
  2;
166
131
  const dragDistance =
167
- (monitor.getClientOffset() as XYCoord).y -
168
- (hoverBoundingReact?.top ?? 0);
132
+ (monitor.getClientOffset()?.y ?? 0) - (hoverBoundingReact?.top ?? 0);
169
133
  if (dragIndex < hoverIndex && dragDistance < distanceThreshold) {
170
134
  return;
171
135
  }
@@ -176,89 +140,84 @@ const ModelGenerationItem = observer(
176
140
  },
177
141
  [nodeState, specState],
178
142
  );
179
- const [, dropConnector] = useDrop(
143
+ const [{ nodeBeingDragged }, dropConnector] = useDrop<
144
+ GenerationSpecNodeDragSource,
145
+ void,
146
+ { nodeBeingDragged: GenerationTreeNode | undefined }
147
+ >(
180
148
  () => ({
181
- accept: [CORE_DND_TYPE.GENERATION_SPEC_NODE],
182
- hover: (
183
- item: GenerationSpecNodeDragSource,
184
- monitor: DropTargetMonitor,
185
- ): void => handleHover(item, monitor),
149
+ accept: [GENERATION_SPEC_NODE_DND_TYPE],
150
+ hover: (item, monitor): void => handleHover(item, monitor),
151
+ collect: (
152
+ monitor,
153
+ ): { nodeBeingDragged: GenerationTreeNode | undefined } => ({
154
+ /**
155
+ * @workaround typings - https://github.com/react-dnd/react-dnd/pull/3484
156
+ */
157
+ nodeBeingDragged:
158
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
159
+ (monitor.getItem() as GenerationSpecNodeDragSource | null)
160
+ ?.nodeState.node,
161
+ }),
186
162
  }),
187
163
  [handleHover],
188
164
  );
189
- const [, dragConnector, dragPreviewConnector] = useDrag(
190
- () => ({
191
- type: CORE_DND_TYPE.GENERATION_SPEC_NODE,
192
- item: (): GenerationSpecNodeDragSource => {
193
- nodeState.setIsBeingDragged(true);
194
- return { nodeState };
195
- },
196
- end: (item: GenerationSpecNodeDragSource | undefined): void =>
197
- item?.nodeState.setIsBeingDragged(false),
198
- }),
199
- [nodeState],
200
- );
165
+ const isBeingDragged = nodeState.node === nodeBeingDragged;
166
+ const [, dragConnector, dragPreviewConnector] =
167
+ useDrag<GenerationSpecNodeDragSource>(
168
+ () => ({
169
+ type: GENERATION_SPEC_NODE_DND_TYPE,
170
+ item: () => ({ nodeState }),
171
+ }),
172
+ [nodeState],
173
+ );
201
174
  dragConnector(dropConnector(ref));
202
- // hide default HTML5 preview image
203
- useEffect(() => {
204
- dragPreviewConnector(getEmptyImage(), { captureDraggingState: true });
205
- }, [dragPreviewConnector]);
175
+
176
+ useDragPreviewLayer(dragPreviewConnector);
177
+
206
178
  return (
207
- <div
208
- ref={ref}
209
- className={clsx('generation-spec-model-generation-editor__item', {
210
- 'generation-spec-model-generation-editor__item--dragged':
211
- nodeState.isBeingDragged,
212
- 'generation-spec-model-generation-editor__item---no-hover':
213
- isRearrangingNodes,
214
- })}
215
- >
216
- {nodeState.isBeingDragged && (
217
- <div className="generation-spec-editor__dnd__placeholder" />
218
- )}
219
- {!nodeState.isBeingDragged && (
220
- <>
221
- <div className="btn--sm generation-spec-model-generation-editor__item__label">
222
- {getElementIcon(editorStore, modelGeneration)}
223
- </div>
224
- <input
225
- className={clsx(
226
- 'generation-spec-model-generation-editor__item__id',
227
- {
228
- 'generation-spec-model-generation-editor__item__id--has-error':
229
- !isUnique,
230
- },
231
- )}
232
- spellCheck={false}
233
- value={isDefault ? 'DEFAULT' : generationTreeNode.id}
234
- onChange={changeNodeId}
235
- disabled={isDefault}
236
- />
237
- <CustomSelectorInput
238
- className="generation-spec-model-generation-editor__item__dropdown"
239
- options={options}
240
- onChange={onChange}
241
- value={value}
242
- darkMode={true}
243
- />
244
- <button
245
- className="btn--dark btn--sm"
246
- onClick={visitModelGeneration}
247
- tabIndex={-1}
248
- title={'See mapping'}
249
- >
250
- <LongArrowRightIcon />
251
- </button>
252
- <button
253
- className="generation-spec-model-generation-editor__item__remove-btn"
254
- onClick={deleteNode}
255
- tabIndex={-1}
256
- title={'Remove'}
257
- >
258
- <TimesIcon />
259
- </button>
260
- </>
261
- )}
179
+ <div ref={ref} className="generation-spec-model-generation-editor__item">
180
+ <PanelEntryDropZonePlaceholder showPlaceholder={isBeingDragged}>
181
+ <div className="btn--sm generation-spec-model-generation-editor__item__label">
182
+ {getElementIcon(editorStore, modelGeneration)}
183
+ </div>
184
+ <input
185
+ className={clsx(
186
+ 'generation-spec-model-generation-editor__item__id',
187
+ {
188
+ 'generation-spec-model-generation-editor__item__id--has-error':
189
+ !isUnique,
190
+ },
191
+ )}
192
+ spellCheck={false}
193
+ value={isDefault ? 'DEFAULT' : generationTreeNode.id}
194
+ onChange={changeNodeId}
195
+ disabled={isDefault}
196
+ />
197
+ <CustomSelectorInput
198
+ className="generation-spec-model-generation-editor__item__dropdown"
199
+ options={options}
200
+ onChange={onChange}
201
+ value={value}
202
+ darkMode={true}
203
+ />
204
+ <button
205
+ className="btn--dark btn--sm"
206
+ onClick={visitModelGeneration}
207
+ tabIndex={-1}
208
+ title={'See mapping'}
209
+ >
210
+ <LongArrowRightIcon />
211
+ </button>
212
+ <button
213
+ className="generation-spec-model-generation-editor__item__remove-btn"
214
+ onClick={deleteNode}
215
+ tabIndex={-1}
216
+ title={'Remove'}
217
+ >
218
+ <TimesIcon />
219
+ </button>
220
+ </PanelEntryDropZonePlaceholder>
262
221
  </div>
263
222
  );
264
223
  },
@@ -300,9 +259,6 @@ const ModelGenerationSpecifications = observer(
300
259
  }
301
260
  };
302
261
  // Drag and Drop
303
- const isRearrangingNodes = specNodesStates.some(
304
- (nodeState) => nodeState.isBeingDragged,
305
- );
306
262
  const handleDrop = useCallback(
307
263
  (item: ElementDragSource): void =>
308
264
  specState.addGenerationTreeNode(
@@ -314,16 +270,20 @@ const ModelGenerationSpecifications = observer(
314
270
  ),
315
271
  [specState],
316
272
  );
317
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
273
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
274
+ ElementDragSource,
275
+ void,
276
+ { isDragOver: boolean }
277
+ >(
318
278
  () => ({
319
279
  accept: extraModelGenerationSpecificationElementDnDTypes,
320
- drop: (item: ElementDragSource, monitor: DropTargetMonitor): void => {
280
+ drop: (item, monitor): void => {
321
281
  if (!monitor.didDrop()) {
322
282
  handleDrop(item);
323
283
  } // prevent drop event propagation to accomondate for nested DnD
324
284
  },
325
- collect: (monitor): { isPropertyDragOver: boolean } => ({
326
- isPropertyDragOver: monitor.isOver({ shallow: true }),
285
+ collect: (monitor) => ({
286
+ isDragOver: monitor.isOver({ shallow: true }),
327
287
  }),
328
288
  }),
329
289
  [handleDrop],
@@ -346,31 +306,36 @@ const ModelGenerationSpecifications = observer(
346
306
  </button>
347
307
  </div>
348
308
  </div>
349
- <div
350
- className="panel__content dnd__overlay__container"
351
- ref={dropConnector}
352
- >
353
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
354
- {specNodesStates.length ? (
355
- <div className="generation-spec-model-generation-editor__items">
356
- <ModelGenerationDragLayer />
357
- {specNodesStates.map((nodeState) => (
358
- <ModelGenerationItem
359
- key={nodeState.uuid}
360
- isRearrangingNodes={isRearrangingNodes}
361
- specState={specState}
362
- nodeState={nodeState}
363
- options={modelGenerationElementOptions}
309
+ <div className="panel__content">
310
+ <PanelDropZone
311
+ isDragOver={isDragOver}
312
+ dropTargetConnector={dropTargetConnector}
313
+ >
314
+ {specNodesStates.length ? (
315
+ <div className="generation-spec-model-generation-editor__items">
316
+ <DragPreviewLayer
317
+ labelGetter={(item: GenerationSpecNodeDragSource): string =>
318
+ item.nodeState.node.generationElement.value.name
319
+ }
320
+ types={[GENERATION_SPEC_NODE_DND_TYPE]}
364
321
  />
365
- ))}
366
- </div>
367
- ) : (
368
- <BlankPanelContent>
369
- {modelGenerationElementsInGraph.length
370
- ? 'No model generation included in spec'
371
- : 'Create a model generation element to include in spec'}
372
- </BlankPanelContent>
373
- )}
322
+ {specNodesStates.map((nodeState) => (
323
+ <ModelGenerationItem
324
+ key={nodeState.uuid}
325
+ specState={specState}
326
+ nodeState={nodeState}
327
+ options={modelGenerationElementOptions}
328
+ />
329
+ ))}
330
+ </div>
331
+ ) : (
332
+ <BlankPanelContent>
333
+ {modelGenerationElementsInGraph.length
334
+ ? 'No model generation included in spec'
335
+ : 'Create a model generation element to include in spec'}
336
+ </BlankPanelContent>
337
+ )}
338
+ </PanelDropZone>
374
339
  </div>
375
340
  </div>
376
341
  );
@@ -402,7 +367,7 @@ const FileGenerationItem = observer(
402
367
  );
403
368
  const visitFileGen = (): void => editorStore.openElement(fileGeneration);
404
369
  return (
405
- <div className="panel__content__form__section__list__item generation-spec-file-generation-editor__item">
370
+ <div className="generation-spec-file-generation-editor__item">
406
371
  <div className="btn--sm generation-spec-file-generation-editor__item__label">
407
372
  <PURE_FileGenerationIcon />
408
373
  </div>
@@ -469,16 +434,20 @@ const FileGenerationSpecifications = observer(
469
434
  },
470
435
  [fileGenerations, generationSpec],
471
436
  );
472
- const [{ isPropertyDragOver }, dropConnector] = useDrop(
437
+ const [{ isDragOver }, dropTargetConnector] = useDrop<
438
+ ElementDragSource,
439
+ void,
440
+ { isDragOver: boolean }
441
+ >(
473
442
  () => ({
474
443
  accept: [CORE_DND_TYPE.PROJECT_EXPLORER_FILE_GENERATION],
475
- drop: (item: ElementDragSource, monitor: DropTargetMonitor): void => {
444
+ drop: (item, monitor): void => {
476
445
  if (!monitor.didDrop()) {
477
446
  handleDrop(item);
478
- }
447
+ } // prevent drop event propagation to accomondate for nested DnD
479
448
  },
480
- collect: (monitor): { isPropertyDragOver: boolean } => ({
481
- isPropertyDragOver: monitor.isOver({ shallow: true }),
449
+ collect: (monitor) => ({
450
+ isDragOver: monitor.isOver({ shallow: true }),
482
451
  }),
483
452
  }),
484
453
  [handleDrop],
@@ -501,31 +470,32 @@ const FileGenerationSpecifications = observer(
501
470
  </button>
502
471
  </div>
503
472
  </div>
504
- <div
505
- className="panel__content dnd__overlay__container"
506
- ref={dropConnector}
507
- >
508
- <div className={clsx({ dnd__overlay: isPropertyDragOver })} />
509
- {generationSpec.fileGenerations.length ? (
510
- <div className="generation-spec-file-generation-editor__items">
511
- {generationSpec.fileGenerations.map((fileGen) => (
512
- <FileGenerationItem
513
- key={fileGen.value.path}
514
- generationSpecificationEditorState={
515
- generationSpecificationEditorState
516
- }
517
- fileGeneraitonRef={fileGen}
518
- options={fileGenerationsOptions}
519
- />
520
- ))}
521
- </div>
522
- ) : (
523
- <BlankPanelContent>
524
- {fileGenerationInGraph.length
525
- ? 'Add file generation to spec'
526
- : 'Create a file generation to include in spec'}
527
- </BlankPanelContent>
528
- )}
473
+ <div className="panel__content">
474
+ <PanelDropZone
475
+ isDragOver={isDragOver}
476
+ dropTargetConnector={dropTargetConnector}
477
+ >
478
+ {generationSpec.fileGenerations.length ? (
479
+ <div className="generation-spec-file-generation-editor__items">
480
+ {generationSpec.fileGenerations.map((fileGen) => (
481
+ <FileGenerationItem
482
+ key={fileGen.value.path}
483
+ generationSpecificationEditorState={
484
+ generationSpecificationEditorState
485
+ }
486
+ fileGeneraitonRef={fileGen}
487
+ options={fileGenerationsOptions}
488
+ />
489
+ ))}
490
+ </div>
491
+ ) : (
492
+ <BlankPanelContent>
493
+ {fileGenerationInGraph.length
494
+ ? 'Add file generation to spec'
495
+ : 'Create a file generation to include in spec'}
496
+ </BlankPanelContent>
497
+ )}
498
+ </PanelDropZone>
529
499
  </div>
530
500
  </div>
531
501
  );
@@ -50,7 +50,7 @@ import {
50
50
  type ElementDragSource,
51
51
  CORE_DND_TYPE,
52
52
  } from '../../../stores/shared/DnDUtil.js';
53
- import { type DropTargetMonitor, useDrop } from 'react-dnd';
53
+ import { useDrop } from 'react-dnd';
54
54
  import type {
55
55
  DSL_LegendStudioApplicationPlugin_Extension,
56
56
  PureGrammarTextSuggestion,
@@ -825,7 +825,7 @@ export const GrammarTextEditor = observer(() => {
825
825
  ).getExtraPureGrammarTextEditorDnDTypes?.() ?? [],
826
826
  );
827
827
  const handleDrop = useCallback(
828
- (item: ElementDragSource, monitor: DropTargetMonitor): void => {
828
+ (item: ElementDragSource): void => {
829
829
  if (editor) {
830
830
  editor.trigger('keyboard', 'type', {
831
831
  text: item.data.packageableElement.path,
@@ -834,7 +834,7 @@ export const GrammarTextEditor = observer(() => {
834
834
  },
835
835
  [editor],
836
836
  );
837
- const [, dropConnector] = useDrop(
837
+ const [, dropConnector] = useDrop<ElementDragSource>(
838
838
  () => ({
839
839
  accept: [
840
840
  ...extraDnDTypes,
@@ -856,8 +856,7 @@ export const GrammarTextEditor = observer(() => {
856
856
  CORE_DND_TYPE.PROJECT_EXPLORER_DATA,
857
857
  ],
858
858
 
859
- drop: (item: ElementDragSource, monitor): void =>
860
- handleDrop(item, monitor),
859
+ drop: (item) => handleDrop(item),
861
860
  }),
862
861
  [extraDnDTypes, handleDrop],
863
862
  );