Browse Source

feat(free-demo): move out container button

liuyangxing 10 months ago
parent
commit
2f991dd2ad
1 changed files with 54 additions and 24 deletions
  1. 54 24
      apps/demo-free-layout/src/form-components/form-header/index.tsx

+ 54 - 24
apps/demo-free-layout/src/form-components/form-header/index.tsx

@@ -1,10 +1,14 @@
+import { useCallback, useState, type MouseEvent } from 'react';
+
 import {
 import {
   Command,
   Command,
   Field,
   Field,
   FieldRenderProps,
   FieldRenderProps,
   useClientContext,
   useClientContext,
   useNodeRender,
   useNodeRender,
+  useService,
 } from '@flowgram.ai/free-layout-editor';
 } from '@flowgram.ai/free-layout-editor';
+import { NodeIntoContainerService } from '@flowgram.ai/free-container-plugin';
 import { IconButton, Dropdown, Typography } from '@douyinfe/semi-ui';
 import { IconButton, Dropdown, Typography } from '@douyinfe/semi-ui';
 import { IconMore } from '@douyinfe/semi-icons';
 import { IconMore } from '@douyinfe/semi-icons';
 
 
@@ -15,30 +19,64 @@ import { Header, Operators, Title } from './styles';
 
 
 const { Text } = Typography;
 const { Text } = Typography;
 
 
-function DropdownContent() {
+function DropdownButton() {
+  const [key, setKey] = useState(0);
   const { node, deleteNode } = useNodeRender();
   const { node, deleteNode } = useNodeRender();
   const clientContext = useClientContext();
   const clientContext = useClientContext();
   const registry = node.getNodeRegistry<FlowNodeRegistry>();
   const registry = node.getNodeRegistry<FlowNodeRegistry>();
-  const handleCopy = () => {
+  const nodeIntoContainerService = useService<NodeIntoContainerService>(NodeIntoContainerService);
+  const canMoveOut = nodeIntoContainerService.canMoveOutContainer(node);
+
+  const rerenderMenu = useCallback(() => {
+    setKey((prevKey) => prevKey + 1);
+  }, []);
+
+  const handleMoveOut = useCallback(
+    (e: MouseEvent) => {
+      e.stopPropagation();
+      nodeIntoContainerService.moveOutContainer({ node });
+      nodeIntoContainerService.removeNodeLines(node);
+      requestAnimationFrame(rerenderMenu);
+    },
+    [nodeIntoContainerService, node, rerenderMenu]
+  );
+
+  const handleCopy = useCallback(() => {
     clientContext.playground.commandService.executeCommand(Command.Default.COPY, node);
     clientContext.playground.commandService.executeCommand(Command.Default.COPY, node);
-  };
+  }, [clientContext, node]);
   return (
   return (
-    <Dropdown.Menu>
-      <Dropdown.Item onClick={handleCopy} disabled={registry.meta!.copyDisable === true}>
-        Copy
-      </Dropdown.Item>
-      <Dropdown.Item
-        onClick={deleteNode}
-        disabled={!!(registry.canDelete?.(clientContext, node) || registry.meta!.deleteDisable)}
-      >
-        Delete
-      </Dropdown.Item>
-    </Dropdown.Menu>
+    <Dropdown
+      trigger="hover"
+      position="bottomRight"
+      onVisibleChange={rerenderMenu}
+      render={
+        <Dropdown.Menu key={key}>
+          {canMoveOut && <Dropdown.Item onClick={handleMoveOut}>Move out</Dropdown.Item>}
+          <Dropdown.Item onClick={handleCopy} disabled={registry.meta!.copyDisable === true}>
+            Copy
+          </Dropdown.Item>
+          <Dropdown.Item
+            onClick={deleteNode}
+            disabled={!!(registry.canDelete?.(clientContext, node) || registry.meta!.deleteDisable)}
+          >
+            Delete
+          </Dropdown.Item>
+        </Dropdown.Menu>
+      }
+    >
+      <IconButton
+        color="secondary"
+        size="small"
+        theme="borderless"
+        icon={<IconMore />}
+        onClick={(e) => e.stopPropagation()}
+      />
+    </Dropdown>
   );
   );
 }
 }
 
 
 export function FormHeader() {
 export function FormHeader() {
-  const { node, expanded, toggleExpand, readonly } = useNodeRender();
+  const { node, readonly } = useNodeRender();
 
 
   return (
   return (
     <Header>
     <Header>
@@ -55,15 +93,7 @@ export function FormHeader() {
       </Title>
       </Title>
       {readonly ? undefined : (
       {readonly ? undefined : (
         <Operators>
         <Operators>
-          <Dropdown trigger="hover" position="bottomRight" render={<DropdownContent />}>
-            <IconButton
-              color="secondary"
-              size="small"
-              theme="borderless"
-              icon={<IconMore />}
-              onClick={(e) => e.stopPropagation()}
-            />
-          </Dropdown>
+          <DropdownButton />
         </Operators>
         </Operators>
       )}
       )}
     </Header>
     </Header>