@flowuent-org/diagramming-core 1.3.10 → 1.4.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.
- package/.editorconfig +13 -13
- package/.eslintignore +1 -1
- package/.eslintrc.json +35 -35
- package/.prettierignore +3 -3
- package/.prettierrc +3 -3
- package/.vscode/settings.json +6 -6
- package/README.md +95 -95
- package/apps/authentication/tsconfig.app.json +23 -23
- package/apps/authentication/tsconfig.json +21 -21
- package/apps/authentication/tsconfig.spec.json +28 -28
- package/apps/diagramming/.eslintrc.json +18 -18
- package/apps/diagramming/index.html +16 -16
- package/apps/diagramming/project.json +53 -53
- package/apps/diagramming/public/aws-icons/compute/App Runner.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Application Auto Scaling.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Batch.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Bottlerocket.svg +19 -19
- package/apps/diagramming/public/aws-icons/compute/Compute Optimizer.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/EC2 Auto Scaling.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/EC2 Image Builder.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/EC2.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Elastic Beanstalk.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Elastic Fabric Adapter.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Fargate.svg +19 -19
- package/apps/diagramming/public/aws-icons/compute/Genomics CLI.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Lambda.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Local Zones.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/NICE DCV.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/NICE EnginFrame.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Nitro Enclaves.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Outposts family.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Outposts rack.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Outposts servers.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/ParallelCluster.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Serverless Application Repository.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/SimSpace Weaver.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Deadline.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Frost.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Sequoia.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Stoke.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox XMesh.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/VMware Cloud on AWS.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Wavelength.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/ECS Anywhere.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/EKS Anywhere.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/EKS Cloud.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/EKS Distro.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Elastic Container Registry.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Elastic Container Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Elastic Kubernetes Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Fargate.svg +19 -19
- package/apps/diagramming/public/aws-icons/container/Red Hat OpenShift Service on AWS.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Aurora.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Database Migration Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/DocumentDB.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/ElastiCache.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Keyspaces.svg +15 -15
- package/apps/diagramming/public/aws-icons/database/MemoryDB for Redis.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Neptune.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/RDS on VMware.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/RDS.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Timestream.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/App Mesh.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Client VPN.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Cloud Directory.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Cloud Map.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Cloud WAN.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/CloudFront.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Direct Connect.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Elastic Load Balancing.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Global Accelerator.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Private 5G.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/PrivateLink.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Route 53.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Site to Site VPN.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Transit Gateway.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/VPC Lattice.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Verified Access.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Virtual Private Cloud.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Artifact.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Audit Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Certificate Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/CloudHSM.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Cognito.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Detective.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Directory Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Firewall Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/GuardDuty.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/IAM Identity Center.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Identity and Access Management.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Inspector.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Key Management Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Macie.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Network Firewall.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Resource Access Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Secrets Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Security Hub.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Security Lake.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Shield.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Signer.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Verified Permissions.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/WAF.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Backup.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/EFS.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Elastic Block Store.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Elastic Disaster Recovery.svg +15 -15
- package/apps/diagramming/public/aws-icons/storage/FSx for Lustre.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx for NetApp ONTAP.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx for OpenZFS.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx for WFS.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/File Cache.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/S3 on Outposts.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Simple Storage Service Glacier.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Simple Storage Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowball Edge.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowball.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowcone.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowmobile.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Storage Gateway.svg +17 -17
- package/apps/diagramming/public/azure-icons/compute/02112-icon-service-Automanaged-VM.svg +1 -1
- package/apps/diagramming/public/azure-icons/databases/02390-icon-service-Azure-SQL.svg +1 -1
- package/apps/diagramming/public/azure-icons/databases/02392-icon-service-SSIS-Lift-And-Shift-IR.svg +1 -1
- package/apps/diagramming/public/azure-icons/networking/02145-icon-service-Resource-Management-Private-Link.svg +1 -1
- package/apps/diagramming/public/azure-icons/security/02247-icon-service-Microsoft-Defender-for-IoT.svg +1 -1
- package/apps/diagramming/public/sample-node-complete.json +63 -63
- package/apps/diagramming/public/sample-node-data.json +63 -63
- package/apps/diagramming/src/AutomationDiagramData.ts +147 -480
- package/apps/diagramming/src/CollaborationDiagramData.ts +127 -127
- package/apps/diagramming/src/CustomIconExamples.ts +233 -233
- package/apps/diagramming/src/DiagramTabs.tsx +205 -205
- package/apps/diagramming/src/Pages/DevPlayground.tsx +3 -3
- package/apps/diagramming/src/Pages/Home.tsx +111 -111
- package/apps/diagramming/src/SequenceDiagramData.ts +215 -215
- package/apps/diagramming/src/StateMachineDiagramData.ts +64 -64
- package/apps/diagramming/src/UseCaseDiagramData.ts +52 -52
- package/apps/diagramming/src/cloud-data.ts +371 -371
- package/apps/diagramming/src/components/AddNodeView.tsx +252 -252
- package/apps/diagramming/src/createSelecors.tsx +17 -17
- package/apps/diagramming/src/index.scss +12 -12
- package/apps/diagramming/src/main.tsx +463 -463
- package/apps/diagramming/src/node-data.ts +664 -664
- package/apps/diagramming/src/sample-workflow-content.ts +55 -55
- package/apps/diagramming/src/stencil-items.ts +31 -31
- package/apps/diagramming/src/style.css +13 -13
- package/apps/diagramming/src/tabsStore.tsx +152 -152
- package/apps/diagramming/src/vite-env.d.ts +1 -1
- package/apps/diagramming/tsconfig.app.json +23 -23
- package/apps/diagramming/tsconfig.json +21 -21
- package/apps/diagramming/tsconfig.spec.json +28 -28
- package/apps/diagramming/vite.config.ts +34 -34
- package/apps/diagramming/webpack.config.js +13 -13
- package/apps/workflow/.eslintrc.json +18 -18
- package/apps/workflow/group/group-form-hooks/index.ts +3 -3
- package/apps/workflow/group/group-form-hooks/useFormValidation.ts +20 -20
- package/apps/workflow/group/group-form-schema/SettingsTabFormSchema.ts +7 -7
- package/apps/workflow/group/group-form-schema/index.ts +3 -3
- package/apps/workflow/i18n.ts +19 -19
- package/apps/workflow/index.html +16 -16
- package/apps/workflow/locales/en/translation.json +713 -713
- package/apps/workflow/project.json +8 -8
- package/apps/workflow/src/app/app.module.css +1 -1
- package/apps/workflow/src/app/app.spec.tsx +15 -15
- package/apps/workflow/src/app/app.tsx +370 -370
- package/apps/workflow/src/main.tsx +13 -13
- package/apps/workflow/src/styles.css +1 -1
- package/apps/workflow/src/theme/index.ts +546 -546
- package/apps/workflow/tsconfig.app.json +23 -23
- package/apps/workflow/tsconfig.json +21 -21
- package/apps/workflow/tsconfig.spec.json +28 -28
- package/apps/workflow/vite.config.ts +51 -51
- package/nx.json +58 -58
- package/package.json +1 -1
- package/packages/api/.babelrc +12 -12
- package/packages/api/.eslintrc.json +18 -18
- package/packages/api/README.md +7 -7
- package/packages/api/project.json +8 -8
- package/packages/api/src/index.ts +3 -3
- package/packages/api/src/lib/jsonPlaceholderService/endpoints.ts +3 -3
- package/packages/api/src/lib/jsonPlaceholderService/service.ts +13 -13
- package/packages/api/tsconfig.json +17 -17
- package/packages/api/tsconfig.lib.json +24 -24
- package/packages/atoms/.babelrc +12 -12
- package/packages/atoms/.eslintrc.json +18 -18
- package/packages/atoms/README.md +7 -7
- package/packages/atoms/forms/AuthenticationTabForm/authenticationTabForm.json +224 -224
- package/packages/atoms/forms/AuthenticationTabForm/index.tsx +255 -255
- package/packages/atoms/forms/SettingsTabForm/index.tsx +85 -85
- package/packages/atoms/forms/SettingsTabForm/settingTabForm.json +27 -27
- package/packages/atoms/forms/index.ts +4 -4
- package/packages/atoms/project.json +8 -8
- package/packages/atoms/src/index.ts +33 -33
- package/packages/atoms/src/lib/Accordion/Accordion.module.css +7 -7
- package/packages/atoms/src/lib/Accordion/Accordion.spec.tsx +13 -13
- package/packages/atoms/src/lib/Accordion/Accordion.tsx +29 -29
- package/packages/atoms/src/lib/Alert/Alert.module.css +7 -7
- package/packages/atoms/src/lib/Alert/Alert.spec.tsx +10 -10
- package/packages/atoms/src/lib/Alert/Alert.tsx +19 -19
- package/packages/atoms/src/lib/Avatar/Avatar.module.css +7 -7
- package/packages/atoms/src/lib/Avatar/Avatar.spec.tsx +10 -10
- package/packages/atoms/src/lib/Avatar/Avatar.tsx +22 -22
- package/packages/atoms/src/lib/Box/Box.module.css +7 -7
- package/packages/atoms/src/lib/Box/Box.spec.tsx +10 -10
- package/packages/atoms/src/lib/Box/Box.tsx +19 -19
- package/packages/atoms/src/lib/BulkEdit/BulkEdit.module.css +7 -7
- package/packages/atoms/src/lib/BulkEdit/BulkEdit.spec.tsx +10 -10
- package/packages/atoms/src/lib/BulkEdit/BulkEdit.tsx +15 -15
- package/packages/atoms/src/lib/Button/Button.module.css +7 -7
- package/packages/atoms/src/lib/Button/Button.spec.tsx +10 -10
- package/packages/atoms/src/lib/Button/Button.tsx +78 -78
- package/packages/atoms/src/lib/Card/Card.module.css +7 -7
- package/packages/atoms/src/lib/Card/Card.spec.tsx +10 -10
- package/packages/atoms/src/lib/Card/Card.tsx +19 -19
- package/packages/atoms/src/lib/CardContent/CardContent.module.css +7 -7
- package/packages/atoms/src/lib/CardContent/CardContent.spec.tsx +10 -10
- package/packages/atoms/src/lib/CardContent/CardContent.tsx +22 -22
- package/packages/atoms/src/lib/FormTextField/FormTextField.module.css +7 -7
- package/packages/atoms/src/lib/FormTextField/FormTextField.spec.tsx +10 -10
- package/packages/atoms/src/lib/FormTextField/FormTextField.tsx +35 -35
- package/packages/atoms/src/lib/Grid/Grid.module.css +7 -7
- package/packages/atoms/src/lib/Grid/Grid.spec.tsx +10 -10
- package/packages/atoms/src/lib/Grid/Grid.tsx +19 -19
- package/packages/atoms/src/lib/Stack/Stack.module.css +7 -7
- package/packages/atoms/src/lib/Stack/Stack.spec.tsx +10 -10
- package/packages/atoms/src/lib/Stack/Stack.tsx +19 -19
- package/packages/atoms/src/lib/Switch/Switch.module.css +7 -7
- package/packages/atoms/src/lib/Switch/Switch.spec.tsx +10 -10
- package/packages/atoms/src/lib/Switch/Switch.tsx +46 -46
- package/packages/atoms/src/lib/TableView/TableView.module.css +7 -7
- package/packages/atoms/src/lib/TableView/TableView.spec.tsx +10 -10
- package/packages/atoms/src/lib/TableView/TableView.tsx +88 -88
- package/packages/atoms/src/lib/TextField/TextField.module.css +7 -7
- package/packages/atoms/src/lib/TextField/TextField.spec.tsx +10 -10
- package/packages/atoms/src/lib/TextField/TextField.tsx +17 -17
- package/packages/atoms/src/lib/Typography/Typography.module.css +7 -7
- package/packages/atoms/src/lib/Typography/Typography.spec.tsx +10 -10
- package/packages/atoms/src/lib/Typography/Typography.tsx +22 -22
- package/packages/atoms/tsconfig.json +17 -17
- package/packages/atoms/tsconfig.lib.json +30 -30
- package/packages/common/.babelrc +12 -12
- package/packages/common/.eslintrc.json +18 -18
- package/packages/common/README.md +7 -7
- package/packages/common/project.json +8 -8
- package/packages/common/src/index.ts +4 -4
- package/packages/common/src/lib/generateRandomProfilePic.ts +3 -3
- package/packages/common/src/lib/generateValidationSchema.ts +46 -46
- package/packages/common/tsconfig.json +17 -17
- package/packages/common/tsconfig.lib.json +24 -24
- package/packages/contexts/.babelrc +12 -12
- package/packages/contexts/.eslintrc.json +18 -18
- package/packages/contexts/README.md +7 -7
- package/packages/contexts/project.json +8 -8
- package/packages/contexts/src/index.ts +2 -2
- package/packages/contexts/tsconfig.json +17 -17
- package/packages/contexts/tsconfig.lib.json +24 -24
- package/packages/diagrams/.babelrc +12 -12
- package/packages/diagrams/.ctirc +208 -208
- package/packages/diagrams/.eslintrc.json +17 -17
- package/packages/diagrams/CUSTOM_ICONS.md +232 -232
- package/packages/diagrams/GOOGLE_SHEETS_IMPLEMENTATION.md +233 -233
- package/packages/diagrams/NODE_DATA_UPDATE_API.md +430 -430
- package/packages/diagrams/README.md +7 -7
- package/packages/diagrams/UNDO_REDO_API.md +306 -306
- package/packages/diagrams/locales/en/translation.json +713 -713
- package/packages/diagrams/package.json +27 -27
- package/packages/diagrams/pnpm-lock.yaml +2606 -2606
- package/packages/diagrams/project.json +42 -42
- package/packages/diagrams/rollup.config.js +26 -26
- package/packages/diagrams/src/DiagramFlow.tsx +7 -7
- package/packages/diagrams/src/declarations.d.ts +7 -7
- package/packages/diagrams/src/index.ts +8 -1
- package/packages/diagrams/src/index.ts.bak +99 -99
- package/packages/diagrams/src/lib/assets/markers/markers.param.tsx +101 -101
- package/packages/diagrams/src/lib/assets/markers/markers.type.ts +10 -10
- package/packages/diagrams/src/lib/atoms/ActorNode.tsx +123 -123
- package/packages/diagrams/src/lib/atoms/AddParallelColButton.tsx +26 -26
- package/packages/diagrams/src/lib/atoms/BendpointNode.tsx +71 -71
- package/packages/diagrams/src/lib/atoms/CardBlockTypeSelector.tsx +35 -35
- package/packages/diagrams/src/lib/atoms/CardEditableTitle.tsx +76 -76
- package/packages/diagrams/src/lib/atoms/CardMainContent.tsx +19 -19
- package/packages/diagrams/src/lib/atoms/ConnectionPoints.tsx +149 -149
- package/packages/diagrams/src/lib/atoms/ContentAssist.tsx +341 -341
- package/packages/diagrams/src/lib/atoms/DiagramControls.tsx +56 -56
- package/packages/diagrams/src/lib/atoms/ExpressionInput.tsx +437 -437
- package/packages/diagrams/src/lib/atoms/FloatingConnectionLine.tsx +73 -73
- package/packages/diagrams/src/lib/atoms/LazyIcon.tsx +31 -31
- package/packages/diagrams/src/lib/atoms/MarkerSelector.tsx +106 -106
- package/packages/diagrams/src/lib/atoms/MultiSelectInput.tsx +87 -87
- package/packages/diagrams/src/lib/atoms/ParameterInput.tsx +199 -199
- package/packages/diagrams/src/lib/atoms/PropertyInput.tsx +114 -114
- package/packages/diagrams/src/lib/atoms/StyledBox.tsx +69 -69
- package/packages/diagrams/src/lib/atoms/ValidationError.tsx +37 -37
- package/packages/diagrams/src/lib/atoms/ValidationMessage.tsx +63 -63
- package/packages/diagrams/src/lib/components/AiButton.tsx +52 -52
- package/packages/diagrams/src/lib/components/ControlEdgeList.tsx +303 -303
- package/packages/diagrams/src/lib/components/CreateFunctionModal.tsx +264 -264
- package/packages/diagrams/src/lib/components/CustomCodeModal.tsx +287 -287
- package/packages/diagrams/src/lib/components/DiagramPanel.tsx +331 -331
- package/packages/diagrams/src/lib/components/FunctionModalTooltip.tsx +30 -30
- package/packages/diagrams/src/lib/components/GraphQLCustomCodeModal.tsx +210 -210
- package/packages/diagrams/src/lib/components/Header.tsx +143 -143
- package/packages/diagrams/src/lib/components/MiniMapCommon.tsx +24 -24
- package/packages/diagrams/src/lib/components/ResizeIcon.tsx +81 -81
- package/packages/diagrams/src/lib/components/SideBar.tsx +40 -40
- package/packages/diagrams/src/lib/components/automation/AISuggestionsModal.tsx +269 -269
- package/packages/diagrams/src/lib/components/automation/AISuggestionsPanel.tsx +28 -175
- package/packages/diagrams/src/lib/components/automation/AutomationApiNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationDecisionNode.tsx +94 -0
- package/packages/diagrams/src/lib/components/automation/AutomationEndNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationExecutionPanel.tsx +439 -439
- package/packages/diagrams/src/lib/components/automation/AutomationFormattingNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationInteractionNode.tsx +693 -693
- package/packages/diagrams/src/lib/components/automation/AutomationMonitoringNode.tsx +399 -399
- package/packages/diagrams/src/lib/components/automation/AutomationNavigationNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationNodeCard.tsx +414 -0
- package/packages/diagrams/src/lib/components/automation/AutomationSlackNode.tsx +694 -694
- package/packages/diagrams/src/lib/components/automation/AutomationSmsNode.tsx +62 -0
- package/packages/diagrams/src/lib/components/automation/AutomationStartNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationTelegramNode.tsx +664 -664
- package/packages/diagrams/src/lib/components/automation/AutomationVoiceCallNode.tsx +65 -0
- package/packages/diagrams/src/lib/components/automation/AutomationWorkflowNode.tsx +85 -0
- package/packages/diagrams/src/lib/components/automation/NodeAIAssistantPopup.tsx +504 -504
- package/packages/diagrams/src/lib/components/automation/index.ts +29 -19
- package/packages/diagrams/src/lib/components/automation/statusColors.ts +124 -124
- package/packages/diagrams/src/lib/contexts/CardDataProvider.tsx +111 -111
- package/packages/diagrams/src/lib/contexts/DiagramProvider.tsx +392 -391
- package/packages/diagrams/src/lib/contexts/diagramStoreTypes.tsx +134 -134
- package/packages/diagrams/src/lib/contexts/onConnect.ts +39 -39
- package/packages/diagrams/src/lib/contexts/onDragStart.ts +45 -45
- package/packages/diagrams/src/lib/contexts/onNodeDragEnd.ts +179 -179
- package/packages/diagrams/src/lib/contexts/onNodesChange.ts +406 -406
- package/packages/diagrams/src/lib/contexts/onReconnect.ts +59 -59
- package/packages/diagrams/src/lib/contexts/onWorkflowNodeDelete.ts +65 -65
- package/packages/diagrams/src/lib/contexts/setContentHeight.ts +14 -14
- package/packages/diagrams/src/lib/contexts/setDiagramType.ts +10 -10
- package/packages/diagrams/src/lib/contexts/setEdgeShapeType.ts +7 -7
- package/packages/diagrams/src/lib/contexts/setEdges.ts +9 -9
- package/packages/diagrams/src/lib/contexts/setLayoutDirection.ts +9 -9
- package/packages/diagrams/src/lib/contexts/setNodeSetting.ts +17 -17
- package/packages/diagrams/src/lib/contexts/setNodes.ts +10 -10
- package/packages/diagrams/src/lib/contexts/setPannable.ts +7 -7
- package/packages/diagrams/src/lib/contexts/setSelectedEdge.ts +7 -7
- package/packages/diagrams/src/lib/contexts/setSelectedNode.ts +7 -7
- package/packages/diagrams/src/lib/contexts/undo.ts +163 -163
- package/packages/diagrams/src/lib/contexts/updateNodeSetting.ts +17 -17
- package/packages/diagrams/src/lib/examples/TwilioWhatsAppConfigExample.ts +128 -128
- package/packages/diagrams/src/lib/externals.ts +4 -4
- package/packages/diagrams/src/lib/hooks/customUseReactFlow.tsx +90 -90
- package/packages/diagrams/src/lib/hooks/updateNodes.ts +45 -45
- package/packages/diagrams/src/lib/hooks/useAddChildButton.tsx +61 -61
- package/packages/diagrams/src/lib/hooks/useAddSwitchCase.ts +75 -75
- package/packages/diagrams/src/lib/hooks/useAutoRegisterFunctions.ts +135 -135
- package/packages/diagrams/src/lib/hooks/useAutoRegisterVariables.ts +286 -286
- package/packages/diagrams/src/lib/hooks/useDeleteNodeByEvent.ts +64 -64
- package/packages/diagrams/src/lib/hooks/useDragCallbacks.tsx +122 -122
- package/packages/diagrams/src/lib/hooks/useFormValidation.ts +349 -349
- package/packages/diagrams/src/lib/hooks/useFunctionFormCallbacks.ts +136 -136
- package/packages/diagrams/src/lib/hooks/useIsSelectedNode.ts +11 -11
- package/packages/diagrams/src/lib/hooks/useModalControls.ts +13 -13
- package/packages/diagrams/src/lib/hooks/useNodeDragHandlers.ts +43 -43
- package/packages/diagrams/src/lib/hooks/useNodeSelection.ts +55 -55
- package/packages/diagrams/src/lib/hooks/useRenderDividers.tsx +19 -19
- package/packages/diagrams/src/lib/hooks/useRenderPins.tsx +74 -74
- package/packages/diagrams/src/lib/hooks/useResizeObserver.ts +21 -21
- package/packages/diagrams/src/lib/hooks/useTreeChildNode.ts +536 -536
- package/packages/diagrams/src/lib/i18n.ts +42 -42
- package/packages/diagrams/src/lib/icons/icons.tsx +324 -0
- package/packages/diagrams/src/lib/icons/index.ts +29 -0
- package/packages/diagrams/src/lib/icons/types.ts +7 -0
- package/packages/diagrams/src/lib/molecules/AddingBlock.tsx +147 -147
- package/packages/diagrams/src/lib/molecules/AvailableVariablesDisplay.tsx +57 -57
- package/packages/diagrams/src/lib/molecules/Block.tsx +143 -143
- package/packages/diagrams/src/lib/molecules/BlockProvider.tsx +28 -28
- package/packages/diagrams/src/lib/molecules/BlockWrapper.tsx +14 -14
- package/packages/diagrams/src/lib/molecules/ConditionRule.tsx +131 -131
- package/packages/diagrams/src/lib/molecules/DraggablePane.tsx +198 -198
- package/packages/diagrams/src/lib/molecules/EntityNodeBlocks.tsx +66 -66
- package/packages/diagrams/src/lib/molecules/SideHandles.tsx +215 -215
- package/packages/diagrams/src/lib/molecules/StencilItem.tsx +85 -85
- package/packages/diagrams/src/lib/molecules/WorkflowNodeActionButtons.tsx +62 -62
- package/packages/diagrams/src/lib/molecules/animated-add-button.tsx +83 -83
- package/packages/diagrams/src/lib/molecules/json-viewer.tsx +107 -107
- package/packages/diagrams/src/lib/organisms/AddNodeView.tsx +102 -102
- package/packages/diagrams/src/lib/organisms/Card/EntityNode.tsx +259 -259
- package/packages/diagrams/src/lib/organisms/Card/card.params.ts +29 -29
- package/packages/diagrams/src/lib/organisms/Card/card.types.ts +5 -5
- package/packages/diagrams/src/lib/organisms/CodeModal.tsx +105 -105
- package/packages/diagrams/src/lib/organisms/ConditionRuleGroup.tsx +138 -138
- package/packages/diagrams/src/lib/organisms/CustomEdge/EdgeMarkers.tsx +51 -51
- package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge-generator.tsx +135 -135
- package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge.params.ts +6 -6
- package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge.type.ts +15 -15
- package/packages/diagrams/src/lib/organisms/CustomEdge/useCreateBendPoint.tsx +121 -121
- package/packages/diagrams/src/lib/organisms/CustomEdge/useEdgeModal.ts +37 -37
- package/packages/diagrams/src/lib/organisms/CustomEdge/useEdgePath.tsx +99 -99
- package/packages/diagrams/src/lib/organisms/DownloadPanel.tsx +345 -345
- package/packages/diagrams/src/lib/organisms/EdgeModal.tsx +243 -243
- package/packages/diagrams/src/lib/organisms/HistoryPane.tsx +118 -118
- package/packages/diagrams/src/lib/organisms/NodeContextMenu.tsx +259 -259
- package/packages/diagrams/src/lib/organisms/PropertiesPane.tsx +276 -276
- package/packages/diagrams/src/lib/organisms/SmartDynamicForm.tsx +226 -226
- package/packages/diagrams/src/lib/organisms/Stencil.tsx +60 -60
- package/packages/diagrams/src/lib/organisms/UseDiagramStore.tsx +4 -4
- package/packages/diagrams/src/lib/organisms/WorkFlowNode/NodeActionButtons.tsx +45 -45
- package/packages/diagrams/src/lib/organisms/WorkFlowNode/NodeTypeDisplay.tsx +114 -114
- package/packages/diagrams/src/lib/organisms/WorkFlowNode/WorkflowNodeIcons.tsx +21 -23
- package/packages/diagrams/src/lib/organisms/WorkflowNode.tsx +484 -484
- package/packages/diagrams/src/lib/services/GoogleSheetsService.ts +961 -961
- package/packages/diagrams/src/lib/services/SlackService.ts +134 -134
- package/packages/diagrams/src/lib/services/TwilioWhatsAppService.ts +273 -273
- package/packages/diagrams/src/lib/styles.css +55 -55
- package/packages/diagrams/src/lib/templates/PageLinks.tsx +13 -13
- package/packages/diagrams/src/lib/templates/arch/ArchDiagram.tsx +793 -793
- package/packages/diagrams/src/lib/templates/arch/components/EdgeDialog.tsx +82 -82
- package/packages/diagrams/src/lib/templates/arch/components/EdgeSettings.tsx +81 -81
- package/packages/diagrams/src/lib/templates/arch/components/GroupControls.tsx +59 -59
- package/packages/diagrams/src/lib/templates/arch/components/GroupSizeDialog.tsx +81 -81
- package/packages/diagrams/src/lib/templates/arch/components/NodeDialog.tsx +214 -214
- package/packages/diagrams/src/lib/templates/arch/components/nodeTypes.ts +91 -91
- package/packages/diagrams/src/lib/templates/arch/controls/ArchDiagramControls.tsx +349 -349
- package/packages/diagrams/src/lib/templates/arch/data/templatee-data.ts +212 -212
- package/packages/diagrams/src/lib/templates/cloud-arch/components/CloudArchitectureDiagram.tsx +3912 -3912
- package/packages/diagrams/src/lib/templates/cloud-arch/components/FormatConverter.tsx +809 -809
- package/packages/diagrams/src/lib/templates/cloud-arch/components/FragmentImporter.tsx +276 -276
- package/packages/diagrams/src/lib/templates/cloud-arch/components/PropertiesPanel.tsx +1063 -1063
- package/packages/diagrams/src/lib/templates/cloud-arch/components/ServiceIconPicker.tsx +138 -138
- package/packages/diagrams/src/lib/templates/cloud-arch/components/SettingsSidebar.tsx +656 -656
- package/packages/diagrams/src/lib/templates/cloud-arch/components/SubnetSelector.tsx +468 -468
- package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/ServiceNode.tsx +310 -310
- package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/SubnetNode.tsx +475 -475
- package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/UsersNode.tsx +277 -277
- package/packages/diagrams/src/lib/templates/cloud-arch/data/diagramManager.ts +364 -364
- package/packages/diagrams/src/lib/templates/cloud-arch/data/types.ts +183 -183
- package/packages/diagrams/src/lib/templates/cloud-arch/integration/diagramValidator.ts +379 -379
- package/packages/diagrams/src/lib/templates/cloud-arch/messages/errorMessages.json +95 -95
- package/packages/diagrams/src/lib/templates/cloud-arch/types/localization.ts +368 -368
- package/packages/diagrams/src/lib/templates/cloud-arch/types/validation.ts +72 -72
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/aws-icons.ts +557 -557
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/awsValidation.ts +446 -446
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/azure-icons.ts +802 -802
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/azureValidation.ts +495 -495
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/cloudValidation.ts +929 -929
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/errorMessages.ts +283 -283
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/gcp-icons.ts +186 -186
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/gcpValidation.ts +312 -312
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/genericValidation.ts +689 -689
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/iconMapping.ts +383 -383
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/idGenerator.ts +220 -220
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/localizationManager.ts +300 -300
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/restrictionEngine.ts +550 -550
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/restrictionValidator.ts +400 -400
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/serviceIcons.tsx +129 -129
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/serviceMapping.ts +330 -330
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/translations.ts +54 -54
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/validationExtractor.ts +342 -342
- package/packages/diagrams/src/lib/templates/collaborationDiagram/CollaborationDiagram.tsx +15 -15
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/AddCollabEdgeDialog.tsx +181 -181
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollabLayout.ts +182 -182
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollabObjectNodeSettings.tsx +86 -86
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollaborationDiagramFlow.tsx +731 -731
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/DraggableEdgeLabel.tsx +123 -123
- package/packages/diagrams/src/lib/templates/collaborationDiagram/controls/CollaborationControls.tsx +131 -131
- package/packages/diagrams/src/lib/templates/collaborationDiagram/nodes/CollabEdge.tsx +170 -170
- package/packages/diagrams/src/lib/templates/collaborationDiagram/nodes/CollabObjectNode.tsx +178 -178
- package/packages/diagrams/src/lib/templates/home.style.css +16 -16
- package/packages/diagrams/src/lib/templates/node-forms/ApiForm.tsx +416 -416
- package/packages/diagrams/src/lib/templates/node-forms/CallForm.tsx +370 -370
- package/packages/diagrams/src/lib/templates/node-forms/ForLoopNode.tsx +313 -313
- package/packages/diagrams/src/lib/templates/node-forms/FunctionForm.tsx +211 -211
- package/packages/diagrams/src/lib/templates/node-forms/GraphQLForm.tsx +679 -679
- package/packages/diagrams/src/lib/templates/node-forms/IfNodeForm.tsx +97 -97
- package/packages/diagrams/src/lib/templates/node-forms/LetNodeForm.tsx +533 -533
- package/packages/diagrams/src/lib/templates/node-forms/LoopNode.tsx +149 -149
- package/packages/diagrams/src/lib/templates/node-forms/NodeForm.tsx +383 -383
- package/packages/diagrams/src/lib/templates/node-forms/ReturnNodeForm.tsx +96 -96
- package/packages/diagrams/src/lib/templates/node-forms/SetNodeForm.tsx +141 -141
- package/packages/diagrams/src/lib/templates/node-forms/SwitchNodeForm.tsx +249 -249
- package/packages/diagrams/src/lib/templates/node-forms/TryCatchForm.tsx +167 -167
- package/packages/diagrams/src/lib/templates/nodeFormSchema.json +84 -84
- package/packages/diagrams/src/lib/templates/sequence/SequenceDiagram.tsx +22 -22
- package/packages/diagrams/src/lib/templates/sequence/components/ActivationBarNode.tsx +33 -33
- package/packages/diagrams/src/lib/templates/sequence/components/AddMessageDialog.tsx +302 -302
- package/packages/diagrams/src/lib/templates/sequence/components/CombinedFragmentNode.tsx +65 -65
- package/packages/diagrams/src/lib/templates/sequence/components/EntitySettings.tsx +559 -559
- package/packages/diagrams/src/lib/templates/sequence/components/FragmentSettings.tsx +116 -116
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceComponents.tsx +14 -14
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceDiagramFlow.tsx +1361 -1361
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceEntityNode.tsx +394 -394
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceMessageEdge.tsx +272 -272
- package/packages/diagrams/src/lib/templates/sequence/components/SimpleEntitySettings.tsx +89 -89
- package/packages/diagrams/src/lib/templates/sequence/controls/DiagramControls.tsx +707 -707
- package/packages/diagrams/src/lib/templates/sequence/data/template-data.ts +635 -635
- package/packages/diagrams/src/lib/templates/stateMachine/StateMachineDiagram.tsx +66 -66
- package/packages/diagrams/src/lib/templates/stateMachine/components/CompositeStateNodeSettings.tsx +638 -638
- package/packages/diagrams/src/lib/templates/stateMachine/components/CustomEdge.tsx +220 -220
- package/packages/diagrams/src/lib/templates/stateMachine/components/EdgeSettings.tsx +193 -193
- package/packages/diagrams/src/lib/templates/stateMachine/components/SelfConnectingEdge.tsx +41 -41
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineComponents.tsx +49 -49
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineDiagramFlow.tsx +1238 -1238
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineLayout.ts +350 -350
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateNodeSettings.tsx +188 -188
- package/packages/diagrams/src/lib/templates/stateMachine/components/useSelfTransition.ts +114 -114
- package/packages/diagrams/src/lib/templates/stateMachine/controls/StateDiagramControls.tsx +488 -488
- package/packages/diagrams/src/lib/templates/stateMachine/data/template-data.ts +4 -4
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/ChoicePointNode.tsx +54 -54
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/CompositeStateNode.tsx +225 -225
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/EntryPointNode.tsx +31 -31
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/ExitPointNode.tsx +44 -44
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/FinalStateNode.tsx +41 -41
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/ForkJoinNode.tsx +53 -53
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/HistoryStateNode.tsx +36 -36
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/InitialStateNode.tsx +29 -29
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/JunctionPointNode.tsx +33 -33
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/PinPointNode.tsx +111 -111
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/StateNode.tsx +124 -124
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/bendPoint.tsx +71 -71
- package/packages/diagrams/src/lib/templates/systemFlow/SystemFlowDiagram.tsx +67 -67
- package/packages/diagrams/src/lib/templates/systemFlow/components/EdgeSettings.tsx +330 -330
- package/packages/diagrams/src/lib/templates/systemFlow/components/FloatingEdge.tsx +219 -219
- package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowComponents.tsx +28 -28
- package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowDiagramFlow.tsx +1179 -1179
- package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowNodeSettings.tsx +151 -151
- package/packages/diagrams/src/lib/templates/systemFlow/controls/SystemFlowControls.tsx +435 -435
- package/packages/diagrams/src/lib/templates/systemFlow/data/template-data.ts +308 -308
- package/packages/diagrams/src/lib/templates/systemFlow/demo.tsx +91 -91
- package/packages/diagrams/src/lib/templates/systemFlow/index.ts +5 -5
- package/packages/diagrams/src/lib/templates/systemFlow/nodes/BendpointNode.tsx +80 -80
- package/packages/diagrams/src/lib/templates/systemFlow/nodes/SystemNode.tsx +92 -92
- package/packages/diagrams/src/lib/templates/systemFlow/nodes/TreeSystemNode.tsx +755 -755
- package/packages/diagrams/src/lib/templates/useCaseDiagram/UseCaseDiagram.tsx +16 -16
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/ActorNodeSettings.tsx +103 -103
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/AddRelationshipDialog.tsx +186 -186
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/PackageNodeSettings.tsx +205 -205
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/UseCaseDiagramFlow.tsx +637 -637
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/UseCaseNodeSettings.tsx +120 -120
- package/packages/diagrams/src/lib/templates/useCaseDiagram/controls/UseCaseControls.tsx +289 -289
- package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/PackageNode.tsx +83 -83
- package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/UseCaseEdge.tsx +115 -115
- package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/UseCaseNode.tsx +230 -230
- package/packages/diagrams/src/lib/templates/validationSchema.json +277 -277
- package/packages/diagrams/src/lib/theme.ts +439 -439
- package/packages/diagrams/src/lib/types/FunctionSignature.ts +11 -11
- package/packages/diagrams/src/lib/types/SmartDynamicFormField.ts +37 -37
- package/packages/diagrams/src/lib/types/automation-node-data-types.ts +45 -131
- package/packages/diagrams/src/lib/types/available-variables.ts +18 -18
- package/packages/diagrams/src/lib/types/card-node.ts +68 -68
- package/packages/diagrams/src/lib/types/collaboration-types.ts +114 -114
- package/packages/diagrams/src/lib/types/colors.ts +25 -25
- package/packages/diagrams/src/lib/types/condition-builder.ts +18 -18
- package/packages/diagrams/src/lib/types/diagram-types.ts +14 -14
- package/packages/diagrams/src/lib/types/edge-types.ts +39 -39
- package/packages/diagrams/src/lib/types/function-execution.ts +35 -35
- package/packages/diagrams/src/lib/types/hooks.types.ts +6 -6
- package/packages/diagrams/src/lib/types/ndoe-form-types.ts +139 -139
- package/packages/diagrams/src/lib/types/node-types.ts +13 -23
- package/packages/diagrams/src/lib/types/sequence-types.ts +178 -178
- package/packages/diagrams/src/lib/types/shared-node-types.ts +21 -21
- package/packages/diagrams/src/lib/types/state-machine-types.ts +225 -225
- package/packages/diagrams/src/lib/types/stencil-item.ts +7 -7
- package/packages/diagrams/src/lib/types/structures.ts +80 -80
- package/packages/diagrams/src/lib/types/system-flow-types.ts +129 -129
- package/packages/diagrams/src/lib/types/usecase-types.ts +84 -84
- package/packages/diagrams/src/lib/types/validation-types.ts +134 -134
- package/packages/diagrams/src/lib/types/workflow-content-dynamic-form-type.ts +23 -23
- package/packages/diagrams/src/lib/types/workflow-node-data-types.ts +172 -172
- package/packages/diagrams/src/lib/utils/AutomationExecutionEngine.ts +658 -1179
- package/packages/diagrams/src/lib/utils/add-new-block.ts +34 -34
- package/packages/diagrams/src/lib/utils/add-new-node.ts +52 -52
- package/packages/diagrams/src/lib/utils/addToHistory.ts +15 -15
- package/packages/diagrams/src/lib/utils/automation-flow-processor.ts +556 -619
- package/packages/diagrams/src/lib/utils/closestPoint.ts +45 -45
- package/packages/diagrams/src/lib/utils/color-options.tsx +26 -26
- package/packages/diagrams/src/lib/utils/compress-img.ts +59 -59
- package/packages/diagrams/src/lib/utils/configLoader.ts +329 -329
- package/packages/diagrams/src/lib/utils/constant-lengths.ts +8 -8
- package/packages/diagrams/src/lib/utils/create-updated.tsx +40 -40
- package/packages/diagrams/src/lib/utils/createHistoryChange.ts +3 -3
- package/packages/diagrams/src/lib/utils/dividerUtils.tsx +59 -59
- package/packages/diagrams/src/lib/utils/edge-hooks.ts +53 -53
- package/packages/diagrams/src/lib/utils/elkLayout.ts +297 -297
- package/packages/diagrams/src/lib/utils/event-hooks.ts +69 -69
- package/packages/diagrams/src/lib/utils/event-store.ts +58 -58
- package/packages/diagrams/src/lib/utils/flow-node-hooks.ts +28 -28
- package/packages/diagrams/src/lib/utils/flow-to-js.ts +1465 -1465
- package/packages/diagrams/src/lib/utils/functionGenerator.ts +38 -38
- package/packages/diagrams/src/lib/utils/generateEdgesFromNodeOrder.ts +113 -113
- package/packages/diagrams/src/lib/utils/helpers.types.ts +10 -10
- package/packages/diagrams/src/lib/utils/highlightText.tsx +93 -93
- package/packages/diagrams/src/lib/utils/iconMapper.tsx +76 -76
- package/packages/diagrams/src/lib/utils/logger.ts +5 -5
- package/packages/diagrams/src/lib/utils/model-hooks.ts +129 -129
- package/packages/diagrams/src/lib/utils/node-hooks.ts +78 -78
- package/packages/diagrams/src/lib/utils/nodeAIAssistantConfig.ts +54 -54
- package/packages/diagrams/src/lib/utils/nodeOrderByEdges.ts +437 -437
- package/packages/diagrams/src/lib/utils/nodeutils.ts +242 -242
- package/packages/diagrams/src/lib/utils/object.ts +13 -13
- package/packages/diagrams/src/lib/utils/useDebounce.ts +19 -19
- package/packages/diagrams/src/lib/utils/utilities.ts +105 -105
- package/packages/diagrams/src/lib/utils/validationEngine.ts +610 -610
- package/packages/diagrams/src/lib/utils/vhToPixels.ts +9 -9
- package/packages/diagrams/tsconfig.json +21 -21
- package/packages/diagrams/tsconfig.lib.json +26 -25
- package/packages/diagrams/webpack.config.js +17 -17
- package/packages/interfaces/.babelrc +12 -12
- package/packages/interfaces/.eslintrc.json +18 -18
- package/packages/interfaces/README.md +7 -7
- package/packages/interfaces/project.json +8 -8
- package/packages/interfaces/src/index.ts +21 -21
- package/packages/interfaces/src/lib/Button.tsx +1 -1
- package/packages/interfaces/src/lib/DataGrid.ts +14 -14
- package/packages/interfaces/src/lib/StyledBox.tsx +1 -1
- package/packages/interfaces/src/lib/ToolbarItem.ts +7 -7
- package/packages/interfaces/src/lib/UserCard.ts +8 -8
- package/packages/interfaces/src/lib/yup.ts +3 -3
- package/packages/interfaces/tsconfig.json +17 -17
- package/packages/interfaces/tsconfig.lib.json +24 -24
- package/packages/molecules/.babelrc +12 -12
- package/packages/molecules/.eslintrc.json +18 -18
- package/packages/molecules/README.md +7 -7
- package/packages/molecules/project.json +8 -8
- package/packages/molecules/src/index.ts +47 -41
- package/packages/molecules/src/lib/ActionTextField/ActionTextField.module.css +7 -7
- package/packages/molecules/src/lib/ActionTextField/ActionTextField.spec.tsx +10 -10
- package/packages/molecules/src/lib/ActionTextField/ActionTextField.tsx +33 -33
- package/packages/molecules/src/lib/ClosableButton/CloseableButton.module.css +7 -7
- package/packages/molecules/src/lib/ClosableButton/CloseableButton.spec.tsx +11 -11
- package/packages/molecules/src/lib/ClosableButton/CloseableButton.tsx +69 -69
- package/packages/molecules/src/lib/EditorTab/EditorTab.module.css +7 -7
- package/packages/molecules/src/lib/EditorTab/EditorTab.spec.tsx +10 -10
- package/packages/molecules/src/lib/EditorTab/EditorTab.tsx +42 -42
- package/packages/molecules/src/lib/EditorTab/TabPanel.tsx +25 -25
- package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.module.css +7 -7
- package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.spec.tsx +10 -10
- package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.tsx +24 -24
- package/packages/molecules/src/lib/SvgIcons/icons.tsx +323 -291
- package/packages/molecules/src/lib/SvgIcons/index.ts +31 -25
- package/packages/molecules/src/lib/SvgIcons/types.ts +7 -7
- package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.module.css +7 -7
- package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.spec.tsx +10 -10
- package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.tsx +47 -47
- package/packages/molecules/src/lib/UserCard/UserCard.module.css +7 -7
- package/packages/molecules/src/lib/UserCard/UserCard.spec.tsx +11 -11
- package/packages/molecules/src/lib/UserCard/UserCard.tsx +22 -22
- package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.module.css +7 -7
- package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.spec.tsx +10 -10
- package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.tsx +72 -72
- package/packages/molecules/tsconfig.json +17 -17
- package/packages/molecules/tsconfig.lib.json +30 -30
- package/packages/organisms/.babelrc +12 -12
- package/packages/organisms/.eslintrc.json +18 -18
- package/packages/organisms/README.md +7 -7
- package/packages/organisms/project.json +8 -8
- package/packages/organisms/src/index.ts +4 -4
- package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.module.css +7 -7
- package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.spec.tsx +10 -10
- package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.tsx +117 -117
- package/packages/organisms/src/lib/EditorToolbar/SortableItem.tsx +51 -51
- package/packages/organisms/src/lib/UserList/UserList.module.css +7 -7
- package/packages/organisms/src/lib/UserList/UserList.spec.tsx +11 -11
- package/packages/organisms/src/lib/UserList/UserList.tsx +48 -48
- package/packages/organisms/src/lib/UserList/store.ts +49 -49
- package/packages/organisms/tsconfig.json +17 -17
- package/packages/organisms/tsconfig.lib.json +24 -24
- package/packages/zustand/.babelrc +12 -12
- package/packages/zustand/.eslintrc.json +18 -18
- package/packages/zustand/README.md +7 -7
- package/packages/zustand/project.json +8 -8
- package/packages/zustand/src/index.ts +4 -4
- package/packages/zustand/tsconfig.json +17 -17
- package/packages/zustand/tsconfig.lib.json +24 -24
- package/tsconfig.base.json +29 -29
- package/packages/diagrams/src/lib/components/automation/AutomationAISuggestionNode.tsx +0 -304
- package/packages/diagrams/src/lib/components/automation/AutomationEmailNode.tsx +0 -773
- package/packages/diagrams/src/lib/components/automation/AutomationGoogleServicesNode.tsx +0 -779
- package/packages/diagrams/src/lib/components/automation/AutomationNoteNode.tsx +0 -422
- package/packages/diagrams/src/lib/components/automation/AutomationSheetsNode.tsx +0 -1135
- package/packages/diagrams/src/lib/examples/GoogleSheetsConfigurationExamples.ts +0 -306
|
@@ -1,536 +1,536 @@
|
|
|
1
|
-
import { useCallback } from 'react';
|
|
2
|
-
import { useReactFlow, Node } from '@xyflow/react';
|
|
3
|
-
import { SystemFlowNodeData } from '../types/system-flow-types';
|
|
4
|
-
|
|
5
|
-
interface UseTreeChildNodeProps {
|
|
6
|
-
id: string;
|
|
7
|
-
isTreeStructure: boolean;
|
|
8
|
-
nodeType: 'root' | 'child';
|
|
9
|
-
structureId?: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface UseTreeChildNodeReturn {
|
|
13
|
-
generateChildId: () => string;
|
|
14
|
-
addChildNode: () => void;
|
|
15
|
-
adjustChildPositions: () => void;
|
|
16
|
-
forceLayoutRecalculation: () => void;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const useTreeChildNode = ({
|
|
20
|
-
id,
|
|
21
|
-
isTreeStructure,
|
|
22
|
-
nodeType,
|
|
23
|
-
structureId,
|
|
24
|
-
}: UseTreeChildNodeProps): UseTreeChildNodeReturn => {
|
|
25
|
-
const { getNode, setNodes, getNodes, addNodes } = useReactFlow();
|
|
26
|
-
|
|
27
|
-
// Generate unique ID for new child nodes
|
|
28
|
-
const generateChildId = useCallback(() => {
|
|
29
|
-
const timestamp = Date.now();
|
|
30
|
-
const random = Math.random().toString(36).substr(2, 9);
|
|
31
|
-
return `tree-child-${timestamp}-${random}`;
|
|
32
|
-
}, []);
|
|
33
|
-
|
|
34
|
-
// Dynamic layout system for tree structure nodes - similar to ELK layout
|
|
35
|
-
const calculateTreeLayout = useCallback(() => {
|
|
36
|
-
if (!isTreeStructure) return;
|
|
37
|
-
|
|
38
|
-
const startTime = performance.now();
|
|
39
|
-
|
|
40
|
-
// Always get fresh node data to ensure we have the latest dimensions
|
|
41
|
-
const allNodes = getNodes();
|
|
42
|
-
const allStructureNodes = allNodes.filter(
|
|
43
|
-
(n) => n.data.isTreeStructure && n.data.structureId === structureId,
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
// Early exit if no structure nodes found
|
|
47
|
-
if (allStructureNodes.length === 0) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Performance optimization: Only check structure nodes and batch DOM queries
|
|
52
|
-
const structureNodes = allNodes.filter(
|
|
53
|
-
(node) =>
|
|
54
|
-
node.data.isTreeStructure && node.data.structureId === structureId,
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
// Batch DOM queries to avoid repeated querySelector calls
|
|
58
|
-
const domElements = new Map<string, DOMRect>();
|
|
59
|
-
structureNodes.forEach((node) => {
|
|
60
|
-
const domElement = document.querySelector(`[data-id="${node.id}"]`);
|
|
61
|
-
if (domElement) {
|
|
62
|
-
domElements.set(node.id, domElement.getBoundingClientRect());
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// Only update nodes that actually need dimension updates
|
|
67
|
-
const updatedNodesWithDimensions = allNodes.map((node) => {
|
|
68
|
-
if (node.data.isTreeStructure && node.data.structureId === structureId) {
|
|
69
|
-
const rect = domElements.get(node.id);
|
|
70
|
-
if (rect) {
|
|
71
|
-
const actualWidth = rect.width;
|
|
72
|
-
const actualHeight = rect.height;
|
|
73
|
-
|
|
74
|
-
// Calculate expected width based on label length
|
|
75
|
-
let expectedWidth = 120;
|
|
76
|
-
if (node.data?.label && typeof node.data.label === 'string') {
|
|
77
|
-
expectedWidth = Math.max(120, node.data.label.length * 10 + 60);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Only update if dimensions actually changed significantly
|
|
81
|
-
const currentWidth = node.measured?.width || 120;
|
|
82
|
-
const shouldUpdate =
|
|
83
|
-
actualWidth > 0 &&
|
|
84
|
-
(actualWidth !== currentWidth || expectedWidth > currentWidth + 50);
|
|
85
|
-
|
|
86
|
-
if (shouldUpdate) {
|
|
87
|
-
return {
|
|
88
|
-
...node,
|
|
89
|
-
measured: {
|
|
90
|
-
width: Math.max(actualWidth, expectedWidth),
|
|
91
|
-
height: actualHeight,
|
|
92
|
-
},
|
|
93
|
-
width: Math.max(actualWidth, expectedWidth),
|
|
94
|
-
height: actualHeight,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return node;
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Update nodes with fresh dimensions if any were found
|
|
103
|
-
const hasDimensionUpdates = updatedNodesWithDimensions.some(
|
|
104
|
-
(node, index) => node !== allNodes[index],
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
if (hasDimensionUpdates) {
|
|
108
|
-
setNodes(updatedNodesWithDimensions);
|
|
109
|
-
// Get the updated nodes for layout calculation
|
|
110
|
-
const freshAllNodes = updatedNodesWithDimensions;
|
|
111
|
-
const freshStructureNodes = freshAllNodes.filter(
|
|
112
|
-
(n) => n.data.isTreeStructure && n.data.structureId === structureId,
|
|
113
|
-
);
|
|
114
|
-
return calculateTreeLayoutWithNodes(
|
|
115
|
-
freshAllNodes,
|
|
116
|
-
freshStructureNodes,
|
|
117
|
-
startTime,
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Use the current nodes for layout calculation
|
|
122
|
-
return calculateTreeLayoutWithNodes(allNodes, allStructureNodes, startTime);
|
|
123
|
-
}, [isTreeStructure, nodeType, structureId, getNodes, setNodes, id]);
|
|
124
|
-
|
|
125
|
-
// Helper function to calculate layout with specific node data
|
|
126
|
-
const calculateTreeLayoutWithNodes = useCallback(
|
|
127
|
-
(allNodes: any[], allStructureNodes: any[], startTime: number) => {
|
|
128
|
-
// Find the root node of this structure
|
|
129
|
-
const rootNode = allStructureNodes.find(
|
|
130
|
-
(n) => n.data.nodeType === 'root',
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
if (!rootNode || allStructureNodes.length === 0) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Performance optimization: Memoize node widths to avoid recalculating
|
|
138
|
-
const nodeWidthCache = new Map<string, number>();
|
|
139
|
-
|
|
140
|
-
const getNodeWidth = (node: any) => {
|
|
141
|
-
// Check cache first
|
|
142
|
-
if (nodeWidthCache.has(node.id)) {
|
|
143
|
-
return nodeWidthCache.get(node.id)!;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Force refresh of node data to get latest dimensions
|
|
147
|
-
const freshNode = allNodes.find((n) => n.id === node.id) || node;
|
|
148
|
-
|
|
149
|
-
// If we have a label, estimate width based on label length
|
|
150
|
-
let estimatedWidth = 120; // Default width
|
|
151
|
-
if (freshNode.data?.label && typeof freshNode.data.label === 'string') {
|
|
152
|
-
const labelLength = freshNode.data.label.length;
|
|
153
|
-
// More accurate estimation: 10px per character + padding
|
|
154
|
-
estimatedWidth = Math.max(120, labelLength * 10 + 60);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Try to get actual DOM element width if available
|
|
158
|
-
let actualWidth =
|
|
159
|
-
freshNode.measured?.width || freshNode.width || estimatedWidth;
|
|
160
|
-
|
|
161
|
-
// If we have a very long label, use the estimated width even if measured width is small
|
|
162
|
-
if (
|
|
163
|
-
freshNode.data?.label &&
|
|
164
|
-
typeof freshNode.data.label === 'string' &&
|
|
165
|
-
freshNode.data.label.length > 10
|
|
166
|
-
) {
|
|
167
|
-
const labelBasedWidth = freshNode.data.label.length * 10 + 60;
|
|
168
|
-
if (labelBasedWidth > actualWidth) {
|
|
169
|
-
actualWidth = labelBasedWidth;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Cache the result
|
|
174
|
-
nodeWidthCache.set(node.id, actualWidth);
|
|
175
|
-
|
|
176
|
-
return actualWidth;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
const rootCenterX = rootNode.position.x + getNodeWidth(rootNode) / 2;
|
|
180
|
-
const minSpacing = 40; // Minimum spacing between nodes
|
|
181
|
-
const verticalDistance = 150; // Fixed Y distance between levels
|
|
182
|
-
|
|
183
|
-
// Build tree structure to understand hierarchy
|
|
184
|
-
const buildTree = (parentId: string): any[] => {
|
|
185
|
-
return allStructureNodes
|
|
186
|
-
.filter((n) => n.data.parentId === parentId)
|
|
187
|
-
.map((node) => ({
|
|
188
|
-
...node,
|
|
189
|
-
children: buildTree(node.id),
|
|
190
|
-
}));
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const tree = buildTree(rootNode.id); // Start from root
|
|
194
|
-
|
|
195
|
-
// Two-pass hierarchical tree layout that adjusts parent positions based on children
|
|
196
|
-
const calculateHierarchicalTreeLayout = () => {
|
|
197
|
-
const positionedNodes: any[] = [];
|
|
198
|
-
|
|
199
|
-
// First, position the root node
|
|
200
|
-
positionedNodes.push({
|
|
201
|
-
...rootNode,
|
|
202
|
-
position: rootNode.position,
|
|
203
|
-
data: {
|
|
204
|
-
...rootNode.data,
|
|
205
|
-
relativePosition: { x: 0, y: 0 },
|
|
206
|
-
},
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
// PASS 1: Calculate subtree widths for each node (already memoized)
|
|
210
|
-
const subtreeWidths = new Map<string, number>();
|
|
211
|
-
|
|
212
|
-
const calculateSubtreeWidth = (node: any): number => {
|
|
213
|
-
if (subtreeWidths.has(node.id)) {
|
|
214
|
-
return subtreeWidths.get(node.id)!;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const nodeWidth = getNodeWidth(node);
|
|
218
|
-
|
|
219
|
-
if (!node.children || node.children.length === 0) {
|
|
220
|
-
// Leaf node - just its own width
|
|
221
|
-
subtreeWidths.set(node.id, nodeWidth);
|
|
222
|
-
return nodeWidth;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Calculate total width of children
|
|
226
|
-
const childrenWidths = node.children.map((child: any) =>
|
|
227
|
-
calculateSubtreeWidth(child),
|
|
228
|
-
);
|
|
229
|
-
const totalChildrenWidth = childrenWidths.reduce(
|
|
230
|
-
(sum: number, width: number) => sum + width,
|
|
231
|
-
0,
|
|
232
|
-
);
|
|
233
|
-
const childrenSpacing = (node.children.length - 1) * minSpacing;
|
|
234
|
-
const totalChildrenSpace = totalChildrenWidth + childrenSpacing;
|
|
235
|
-
|
|
236
|
-
// Subtree width is the maximum of node width and children space
|
|
237
|
-
const subtreeWidth = Math.max(nodeWidth, totalChildrenSpace);
|
|
238
|
-
subtreeWidths.set(node.id, subtreeWidth);
|
|
239
|
-
|
|
240
|
-
return subtreeWidth;
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
// Calculate subtree widths for all nodes
|
|
244
|
-
tree.forEach((node) => calculateSubtreeWidth(node));
|
|
245
|
-
|
|
246
|
-
// PASS 2: Position nodes with proper spacing based on subtree widths
|
|
247
|
-
const positionNodeHierarchy = (
|
|
248
|
-
nodes: any[],
|
|
249
|
-
parentX: number,
|
|
250
|
-
parentY: number,
|
|
251
|
-
level: number,
|
|
252
|
-
) => {
|
|
253
|
-
if (nodes.length === 0) return;
|
|
254
|
-
|
|
255
|
-
const currentY = parentY + verticalDistance;
|
|
256
|
-
|
|
257
|
-
// Calculate total space needed for all subtrees
|
|
258
|
-
const subtreeWidthsForLevel = nodes.map(
|
|
259
|
-
(node) => subtreeWidths.get(node.id) || getNodeWidth(node),
|
|
260
|
-
);
|
|
261
|
-
const totalSubtreeWidth = subtreeWidthsForLevel.reduce(
|
|
262
|
-
(sum, width) => sum + width,
|
|
263
|
-
0,
|
|
264
|
-
);
|
|
265
|
-
const totalSpacing = (nodes.length - 1) * minSpacing;
|
|
266
|
-
const totalRequiredWidth = totalSubtreeWidth + totalSpacing;
|
|
267
|
-
|
|
268
|
-
// Center the group under the parent
|
|
269
|
-
let startX = parentX - totalRequiredWidth / 2;
|
|
270
|
-
let currentX = startX;
|
|
271
|
-
|
|
272
|
-
nodes.forEach((node) => {
|
|
273
|
-
const nodeWidth = getNodeWidth(node);
|
|
274
|
-
const subtreeWidth = subtreeWidths.get(node.id) || nodeWidth;
|
|
275
|
-
const nodeHeight = 60; // Standard height
|
|
276
|
-
|
|
277
|
-
// Center the node within its subtree space
|
|
278
|
-
const nodeX = currentX + (subtreeWidth - nodeWidth) / 2;
|
|
279
|
-
const nodeY = currentY;
|
|
280
|
-
|
|
281
|
-
// Ensure level is set
|
|
282
|
-
if (!node.data.level) {
|
|
283
|
-
node.data.level = level;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
positionedNodes.push({
|
|
287
|
-
...node,
|
|
288
|
-
position: { x: nodeX, y: nodeY },
|
|
289
|
-
data: {
|
|
290
|
-
...node.data,
|
|
291
|
-
relativePosition: { x: nodeX - parentX, y: verticalDistance },
|
|
292
|
-
},
|
|
293
|
-
});
|
|
294
|
-
|
|
295
|
-
// Recursively position children of this node
|
|
296
|
-
if (node.children && node.children.length > 0) {
|
|
297
|
-
const childParentX = nodeX + nodeWidth / 2; // Center children under this node
|
|
298
|
-
positionNodeHierarchy(
|
|
299
|
-
node.children,
|
|
300
|
-
childParentX,
|
|
301
|
-
nodeY,
|
|
302
|
-
level + 1,
|
|
303
|
-
);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Move to next position based on subtree width
|
|
307
|
-
currentX += subtreeWidth + minSpacing;
|
|
308
|
-
});
|
|
309
|
-
};
|
|
310
|
-
|
|
311
|
-
// Start positioning from the root
|
|
312
|
-
positionNodeHierarchy(tree, rootCenterX, rootNode.position.y, 1);
|
|
313
|
-
|
|
314
|
-
return positionedNodes;
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
// Calculate all positions using hierarchical tree layout
|
|
318
|
-
const allPositionedNodes = calculateHierarchicalTreeLayout();
|
|
319
|
-
|
|
320
|
-
// Performance optimization: Only update nodes that actually changed position
|
|
321
|
-
const updatedNodes: any[] = [];
|
|
322
|
-
let hasPositionChanges = false;
|
|
323
|
-
|
|
324
|
-
for (const node of allNodes) {
|
|
325
|
-
const positionedNode = allPositionedNodes.find(
|
|
326
|
-
(pn) => pn.id === node.id,
|
|
327
|
-
);
|
|
328
|
-
if (positionedNode) {
|
|
329
|
-
const oldPos = node.position;
|
|
330
|
-
const newPos = positionedNode.position;
|
|
331
|
-
const positionChanged =
|
|
332
|
-
oldPos.x !== newPos.x || oldPos.y !== newPos.y;
|
|
333
|
-
|
|
334
|
-
if (positionChanged) {
|
|
335
|
-
hasPositionChanges = true;
|
|
336
|
-
updatedNodes.push({
|
|
337
|
-
...node,
|
|
338
|
-
position: positionedNode.position,
|
|
339
|
-
data: positionedNode.data,
|
|
340
|
-
});
|
|
341
|
-
} else {
|
|
342
|
-
updatedNodes.push(node);
|
|
343
|
-
}
|
|
344
|
-
} else {
|
|
345
|
-
updatedNodes.push(node);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
const endTime = performance.now();
|
|
350
|
-
const duration = endTime - startTime;
|
|
351
|
-
|
|
352
|
-
if (hasPositionChanges) {
|
|
353
|
-
setNodes(updatedNodes);
|
|
354
|
-
} else {
|
|
355
|
-
}
|
|
356
|
-
},
|
|
357
|
-
[setNodes],
|
|
358
|
-
);
|
|
359
|
-
|
|
360
|
-
// Auto-adjust child node positions when node dimensions change
|
|
361
|
-
const adjustChildPositions = useCallback(() => {
|
|
362
|
-
calculateTreeLayout();
|
|
363
|
-
}, [calculateTreeLayout]);
|
|
364
|
-
|
|
365
|
-
// Add new child node to the tree structure
|
|
366
|
-
const addChildNode = useCallback(() => {
|
|
367
|
-
if (!isTreeStructure || !structureId) return;
|
|
368
|
-
|
|
369
|
-
const allNodes = getNodes();
|
|
370
|
-
const currentNode = allNodes.find((n) => n.id === id);
|
|
371
|
-
if (!currentNode) return;
|
|
372
|
-
|
|
373
|
-
// Find the root node to get the structure type
|
|
374
|
-
const rootNodeForStructureType = allNodes.find(
|
|
375
|
-
(n) =>
|
|
376
|
-
n.data.isTreeStructure &&
|
|
377
|
-
n.data.structureId === structureId &&
|
|
378
|
-
n.data.nodeType === 'root',
|
|
379
|
-
);
|
|
380
|
-
|
|
381
|
-
// Determine the level of the new child node
|
|
382
|
-
const currentLevel =
|
|
383
|
-
currentNode.data.nodeType === 'root'
|
|
384
|
-
? 0
|
|
385
|
-
: (currentNode.data.level as number) || 1;
|
|
386
|
-
const newLevel = currentLevel + 1;
|
|
387
|
-
|
|
388
|
-
// Count existing child nodes at the same level under this parent
|
|
389
|
-
const existingChildNodes = allNodes.filter(
|
|
390
|
-
(n) =>
|
|
391
|
-
n.data.isTreeStructure &&
|
|
392
|
-
n.data.structureId === structureId &&
|
|
393
|
-
n.data.parentId === id &&
|
|
394
|
-
n.data.level === newLevel,
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
const childCount = existingChildNodes.length;
|
|
398
|
-
const newChildId = generateChildId();
|
|
399
|
-
|
|
400
|
-
// Calculate position for new child node
|
|
401
|
-
const relativeX = 0; // Will be calculated by layout system
|
|
402
|
-
const verticalDistance = 150; // Fixed Y distance between levels
|
|
403
|
-
|
|
404
|
-
const newChildNode: Node = {
|
|
405
|
-
id: newChildId,
|
|
406
|
-
type: 'TreeSystemNode',
|
|
407
|
-
position: { x: 0, y: 0 }, // Will be calculated by adjustChildPositions
|
|
408
|
-
data: {
|
|
409
|
-
label: `Child ${childCount + 1}`,
|
|
410
|
-
color: '#F44336',
|
|
411
|
-
isTreeStructure: true,
|
|
412
|
-
structureId: structureId,
|
|
413
|
-
nodeType: 'child',
|
|
414
|
-
parentId: id, // Track parent node
|
|
415
|
-
level: newLevel, // Track level in tree
|
|
416
|
-
relativePosition: { x: relativeX, y: verticalDistance },
|
|
417
|
-
// Inherit structure type from root node
|
|
418
|
-
structureType:
|
|
419
|
-
rootNodeForStructureType?.data?.structureType || 'structure1',
|
|
420
|
-
} as SystemFlowNodeData,
|
|
421
|
-
draggable: true,
|
|
422
|
-
width: 120,
|
|
423
|
-
height: 60,
|
|
424
|
-
measured: {
|
|
425
|
-
width: 120,
|
|
426
|
-
height: 60,
|
|
427
|
-
},
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
// Add the new child node
|
|
431
|
-
addNodes(newChildNode);
|
|
432
|
-
|
|
433
|
-
// Find the root node and trigger its layout recalculation
|
|
434
|
-
const rootNodeForLayout = allNodes.find(
|
|
435
|
-
(n) =>
|
|
436
|
-
n.data.isTreeStructure &&
|
|
437
|
-
n.data.structureId === structureId &&
|
|
438
|
-
n.data.nodeType === 'root',
|
|
439
|
-
);
|
|
440
|
-
|
|
441
|
-
if (rootNodeForLayout) {
|
|
442
|
-
// Use a small delay to ensure the new node is added before recalculation
|
|
443
|
-
setTimeout(() => {
|
|
444
|
-
const forceLayoutRecalculation =
|
|
445
|
-
rootNodeForLayout.data?.forceLayoutRecalculation;
|
|
446
|
-
if (typeof forceLayoutRecalculation === 'function') {
|
|
447
|
-
forceLayoutRecalculation();
|
|
448
|
-
} else {
|
|
449
|
-
// Fallback: trigger layout recalculation by updating the root node
|
|
450
|
-
setNodes((nds) =>
|
|
451
|
-
nds.map((node) => {
|
|
452
|
-
if (node.id === rootNodeForLayout.id) {
|
|
453
|
-
return {
|
|
454
|
-
...node,
|
|
455
|
-
data: {
|
|
456
|
-
...node.data,
|
|
457
|
-
lastLayoutUpdate: Date.now(),
|
|
458
|
-
},
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
return node;
|
|
462
|
-
}),
|
|
463
|
-
);
|
|
464
|
-
}
|
|
465
|
-
}, 50);
|
|
466
|
-
}
|
|
467
|
-
}, [
|
|
468
|
-
isTreeStructure,
|
|
469
|
-
structureId,
|
|
470
|
-
getNodes,
|
|
471
|
-
addNodes,
|
|
472
|
-
setNodes,
|
|
473
|
-
id,
|
|
474
|
-
generateChildId,
|
|
475
|
-
]);
|
|
476
|
-
|
|
477
|
-
// Update existing child nodes to inherit structure type from root
|
|
478
|
-
const updateChildNodesStructureType = useCallback(() => {
|
|
479
|
-
if (!isTreeStructure || !structureId) return;
|
|
480
|
-
|
|
481
|
-
const allNodes = getNodes();
|
|
482
|
-
const rootNode = allNodes.find(
|
|
483
|
-
(n) =>
|
|
484
|
-
n.data.isTreeStructure &&
|
|
485
|
-
n.data.structureId === structureId &&
|
|
486
|
-
n.data.nodeType === 'root',
|
|
487
|
-
);
|
|
488
|
-
|
|
489
|
-
if (!rootNode?.data?.structureType) return;
|
|
490
|
-
|
|
491
|
-
const updatedNodes = allNodes.map((node) => {
|
|
492
|
-
if (
|
|
493
|
-
node.data.isTreeStructure &&
|
|
494
|
-
node.data.structureId === structureId &&
|
|
495
|
-
node.data.nodeType === 'child' &&
|
|
496
|
-
!node.data.structureType
|
|
497
|
-
) {
|
|
498
|
-
return {
|
|
499
|
-
...node,
|
|
500
|
-
data: {
|
|
501
|
-
...node.data,
|
|
502
|
-
structureType: rootNode.data.structureType,
|
|
503
|
-
},
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
return node;
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
// Only update if there were changes
|
|
510
|
-
const hasChanges = updatedNodes.some(
|
|
511
|
-
(node, index) => node !== allNodes[index],
|
|
512
|
-
);
|
|
513
|
-
if (hasChanges) {
|
|
514
|
-
setNodes(updatedNodes);
|
|
515
|
-
}
|
|
516
|
-
}, [isTreeStructure, structureId, getNodes, setNodes]);
|
|
517
|
-
|
|
518
|
-
// Force layout recalculation - can be called externally
|
|
519
|
-
const forceLayoutRecalculation = useCallback(() => {
|
|
520
|
-
if (isTreeStructure) {
|
|
521
|
-
// First update any existing child nodes that don't have structure type
|
|
522
|
-
updateChildNodesStructureType();
|
|
523
|
-
// Add a small delay to ensure all DOM updates are complete
|
|
524
|
-
setTimeout(() => {
|
|
525
|
-
calculateTreeLayout();
|
|
526
|
-
}, 50);
|
|
527
|
-
}
|
|
528
|
-
}, [isTreeStructure, calculateTreeLayout, updateChildNodesStructureType]);
|
|
529
|
-
|
|
530
|
-
return {
|
|
531
|
-
generateChildId,
|
|
532
|
-
addChildNode,
|
|
533
|
-
adjustChildPositions,
|
|
534
|
-
forceLayoutRecalculation,
|
|
535
|
-
};
|
|
536
|
-
};
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useReactFlow, Node } from '@xyflow/react';
|
|
3
|
+
import { SystemFlowNodeData } from '../types/system-flow-types';
|
|
4
|
+
|
|
5
|
+
interface UseTreeChildNodeProps {
|
|
6
|
+
id: string;
|
|
7
|
+
isTreeStructure: boolean;
|
|
8
|
+
nodeType: 'root' | 'child';
|
|
9
|
+
structureId?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface UseTreeChildNodeReturn {
|
|
13
|
+
generateChildId: () => string;
|
|
14
|
+
addChildNode: () => void;
|
|
15
|
+
adjustChildPositions: () => void;
|
|
16
|
+
forceLayoutRecalculation: () => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const useTreeChildNode = ({
|
|
20
|
+
id,
|
|
21
|
+
isTreeStructure,
|
|
22
|
+
nodeType,
|
|
23
|
+
structureId,
|
|
24
|
+
}: UseTreeChildNodeProps): UseTreeChildNodeReturn => {
|
|
25
|
+
const { getNode, setNodes, getNodes, addNodes } = useReactFlow();
|
|
26
|
+
|
|
27
|
+
// Generate unique ID for new child nodes
|
|
28
|
+
const generateChildId = useCallback(() => {
|
|
29
|
+
const timestamp = Date.now();
|
|
30
|
+
const random = Math.random().toString(36).substr(2, 9);
|
|
31
|
+
return `tree-child-${timestamp}-${random}`;
|
|
32
|
+
}, []);
|
|
33
|
+
|
|
34
|
+
// Dynamic layout system for tree structure nodes - similar to ELK layout
|
|
35
|
+
const calculateTreeLayout = useCallback(() => {
|
|
36
|
+
if (!isTreeStructure) return;
|
|
37
|
+
|
|
38
|
+
const startTime = performance.now();
|
|
39
|
+
|
|
40
|
+
// Always get fresh node data to ensure we have the latest dimensions
|
|
41
|
+
const allNodes = getNodes();
|
|
42
|
+
const allStructureNodes = allNodes.filter(
|
|
43
|
+
(n) => n.data.isTreeStructure && n.data.structureId === structureId,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// Early exit if no structure nodes found
|
|
47
|
+
if (allStructureNodes.length === 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Performance optimization: Only check structure nodes and batch DOM queries
|
|
52
|
+
const structureNodes = allNodes.filter(
|
|
53
|
+
(node) =>
|
|
54
|
+
node.data.isTreeStructure && node.data.structureId === structureId,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Batch DOM queries to avoid repeated querySelector calls
|
|
58
|
+
const domElements = new Map<string, DOMRect>();
|
|
59
|
+
structureNodes.forEach((node) => {
|
|
60
|
+
const domElement = document.querySelector(`[data-id="${node.id}"]`);
|
|
61
|
+
if (domElement) {
|
|
62
|
+
domElements.set(node.id, domElement.getBoundingClientRect());
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Only update nodes that actually need dimension updates
|
|
67
|
+
const updatedNodesWithDimensions = allNodes.map((node) => {
|
|
68
|
+
if (node.data.isTreeStructure && node.data.structureId === structureId) {
|
|
69
|
+
const rect = domElements.get(node.id);
|
|
70
|
+
if (rect) {
|
|
71
|
+
const actualWidth = rect.width;
|
|
72
|
+
const actualHeight = rect.height;
|
|
73
|
+
|
|
74
|
+
// Calculate expected width based on label length
|
|
75
|
+
let expectedWidth = 120;
|
|
76
|
+
if (node.data?.label && typeof node.data.label === 'string') {
|
|
77
|
+
expectedWidth = Math.max(120, node.data.label.length * 10 + 60);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Only update if dimensions actually changed significantly
|
|
81
|
+
const currentWidth = node.measured?.width || 120;
|
|
82
|
+
const shouldUpdate =
|
|
83
|
+
actualWidth > 0 &&
|
|
84
|
+
(actualWidth !== currentWidth || expectedWidth > currentWidth + 50);
|
|
85
|
+
|
|
86
|
+
if (shouldUpdate) {
|
|
87
|
+
return {
|
|
88
|
+
...node,
|
|
89
|
+
measured: {
|
|
90
|
+
width: Math.max(actualWidth, expectedWidth),
|
|
91
|
+
height: actualHeight,
|
|
92
|
+
},
|
|
93
|
+
width: Math.max(actualWidth, expectedWidth),
|
|
94
|
+
height: actualHeight,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return node;
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Update nodes with fresh dimensions if any were found
|
|
103
|
+
const hasDimensionUpdates = updatedNodesWithDimensions.some(
|
|
104
|
+
(node, index) => node !== allNodes[index],
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
if (hasDimensionUpdates) {
|
|
108
|
+
setNodes(updatedNodesWithDimensions);
|
|
109
|
+
// Get the updated nodes for layout calculation
|
|
110
|
+
const freshAllNodes = updatedNodesWithDimensions;
|
|
111
|
+
const freshStructureNodes = freshAllNodes.filter(
|
|
112
|
+
(n) => n.data.isTreeStructure && n.data.structureId === structureId,
|
|
113
|
+
);
|
|
114
|
+
return calculateTreeLayoutWithNodes(
|
|
115
|
+
freshAllNodes,
|
|
116
|
+
freshStructureNodes,
|
|
117
|
+
startTime,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Use the current nodes for layout calculation
|
|
122
|
+
return calculateTreeLayoutWithNodes(allNodes, allStructureNodes, startTime);
|
|
123
|
+
}, [isTreeStructure, nodeType, structureId, getNodes, setNodes, id]);
|
|
124
|
+
|
|
125
|
+
// Helper function to calculate layout with specific node data
|
|
126
|
+
const calculateTreeLayoutWithNodes = useCallback(
|
|
127
|
+
(allNodes: any[], allStructureNodes: any[], startTime: number) => {
|
|
128
|
+
// Find the root node of this structure
|
|
129
|
+
const rootNode = allStructureNodes.find(
|
|
130
|
+
(n) => n.data.nodeType === 'root',
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
if (!rootNode || allStructureNodes.length === 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Performance optimization: Memoize node widths to avoid recalculating
|
|
138
|
+
const nodeWidthCache = new Map<string, number>();
|
|
139
|
+
|
|
140
|
+
const getNodeWidth = (node: any) => {
|
|
141
|
+
// Check cache first
|
|
142
|
+
if (nodeWidthCache.has(node.id)) {
|
|
143
|
+
return nodeWidthCache.get(node.id)!;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Force refresh of node data to get latest dimensions
|
|
147
|
+
const freshNode = allNodes.find((n) => n.id === node.id) || node;
|
|
148
|
+
|
|
149
|
+
// If we have a label, estimate width based on label length
|
|
150
|
+
let estimatedWidth = 120; // Default width
|
|
151
|
+
if (freshNode.data?.label && typeof freshNode.data.label === 'string') {
|
|
152
|
+
const labelLength = freshNode.data.label.length;
|
|
153
|
+
// More accurate estimation: 10px per character + padding
|
|
154
|
+
estimatedWidth = Math.max(120, labelLength * 10 + 60);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Try to get actual DOM element width if available
|
|
158
|
+
let actualWidth =
|
|
159
|
+
freshNode.measured?.width || freshNode.width || estimatedWidth;
|
|
160
|
+
|
|
161
|
+
// If we have a very long label, use the estimated width even if measured width is small
|
|
162
|
+
if (
|
|
163
|
+
freshNode.data?.label &&
|
|
164
|
+
typeof freshNode.data.label === 'string' &&
|
|
165
|
+
freshNode.data.label.length > 10
|
|
166
|
+
) {
|
|
167
|
+
const labelBasedWidth = freshNode.data.label.length * 10 + 60;
|
|
168
|
+
if (labelBasedWidth > actualWidth) {
|
|
169
|
+
actualWidth = labelBasedWidth;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Cache the result
|
|
174
|
+
nodeWidthCache.set(node.id, actualWidth);
|
|
175
|
+
|
|
176
|
+
return actualWidth;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const rootCenterX = rootNode.position.x + getNodeWidth(rootNode) / 2;
|
|
180
|
+
const minSpacing = 40; // Minimum spacing between nodes
|
|
181
|
+
const verticalDistance = 150; // Fixed Y distance between levels
|
|
182
|
+
|
|
183
|
+
// Build tree structure to understand hierarchy
|
|
184
|
+
const buildTree = (parentId: string): any[] => {
|
|
185
|
+
return allStructureNodes
|
|
186
|
+
.filter((n) => n.data.parentId === parentId)
|
|
187
|
+
.map((node) => ({
|
|
188
|
+
...node,
|
|
189
|
+
children: buildTree(node.id),
|
|
190
|
+
}));
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const tree = buildTree(rootNode.id); // Start from root
|
|
194
|
+
|
|
195
|
+
// Two-pass hierarchical tree layout that adjusts parent positions based on children
|
|
196
|
+
const calculateHierarchicalTreeLayout = () => {
|
|
197
|
+
const positionedNodes: any[] = [];
|
|
198
|
+
|
|
199
|
+
// First, position the root node
|
|
200
|
+
positionedNodes.push({
|
|
201
|
+
...rootNode,
|
|
202
|
+
position: rootNode.position,
|
|
203
|
+
data: {
|
|
204
|
+
...rootNode.data,
|
|
205
|
+
relativePosition: { x: 0, y: 0 },
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// PASS 1: Calculate subtree widths for each node (already memoized)
|
|
210
|
+
const subtreeWidths = new Map<string, number>();
|
|
211
|
+
|
|
212
|
+
const calculateSubtreeWidth = (node: any): number => {
|
|
213
|
+
if (subtreeWidths.has(node.id)) {
|
|
214
|
+
return subtreeWidths.get(node.id)!;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const nodeWidth = getNodeWidth(node);
|
|
218
|
+
|
|
219
|
+
if (!node.children || node.children.length === 0) {
|
|
220
|
+
// Leaf node - just its own width
|
|
221
|
+
subtreeWidths.set(node.id, nodeWidth);
|
|
222
|
+
return nodeWidth;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Calculate total width of children
|
|
226
|
+
const childrenWidths = node.children.map((child: any) =>
|
|
227
|
+
calculateSubtreeWidth(child),
|
|
228
|
+
);
|
|
229
|
+
const totalChildrenWidth = childrenWidths.reduce(
|
|
230
|
+
(sum: number, width: number) => sum + width,
|
|
231
|
+
0,
|
|
232
|
+
);
|
|
233
|
+
const childrenSpacing = (node.children.length - 1) * minSpacing;
|
|
234
|
+
const totalChildrenSpace = totalChildrenWidth + childrenSpacing;
|
|
235
|
+
|
|
236
|
+
// Subtree width is the maximum of node width and children space
|
|
237
|
+
const subtreeWidth = Math.max(nodeWidth, totalChildrenSpace);
|
|
238
|
+
subtreeWidths.set(node.id, subtreeWidth);
|
|
239
|
+
|
|
240
|
+
return subtreeWidth;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// Calculate subtree widths for all nodes
|
|
244
|
+
tree.forEach((node) => calculateSubtreeWidth(node));
|
|
245
|
+
|
|
246
|
+
// PASS 2: Position nodes with proper spacing based on subtree widths
|
|
247
|
+
const positionNodeHierarchy = (
|
|
248
|
+
nodes: any[],
|
|
249
|
+
parentX: number,
|
|
250
|
+
parentY: number,
|
|
251
|
+
level: number,
|
|
252
|
+
) => {
|
|
253
|
+
if (nodes.length === 0) return;
|
|
254
|
+
|
|
255
|
+
const currentY = parentY + verticalDistance;
|
|
256
|
+
|
|
257
|
+
// Calculate total space needed for all subtrees
|
|
258
|
+
const subtreeWidthsForLevel = nodes.map(
|
|
259
|
+
(node) => subtreeWidths.get(node.id) || getNodeWidth(node),
|
|
260
|
+
);
|
|
261
|
+
const totalSubtreeWidth = subtreeWidthsForLevel.reduce(
|
|
262
|
+
(sum, width) => sum + width,
|
|
263
|
+
0,
|
|
264
|
+
);
|
|
265
|
+
const totalSpacing = (nodes.length - 1) * minSpacing;
|
|
266
|
+
const totalRequiredWidth = totalSubtreeWidth + totalSpacing;
|
|
267
|
+
|
|
268
|
+
// Center the group under the parent
|
|
269
|
+
let startX = parentX - totalRequiredWidth / 2;
|
|
270
|
+
let currentX = startX;
|
|
271
|
+
|
|
272
|
+
nodes.forEach((node) => {
|
|
273
|
+
const nodeWidth = getNodeWidth(node);
|
|
274
|
+
const subtreeWidth = subtreeWidths.get(node.id) || nodeWidth;
|
|
275
|
+
const nodeHeight = 60; // Standard height
|
|
276
|
+
|
|
277
|
+
// Center the node within its subtree space
|
|
278
|
+
const nodeX = currentX + (subtreeWidth - nodeWidth) / 2;
|
|
279
|
+
const nodeY = currentY;
|
|
280
|
+
|
|
281
|
+
// Ensure level is set
|
|
282
|
+
if (!node.data.level) {
|
|
283
|
+
node.data.level = level;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
positionedNodes.push({
|
|
287
|
+
...node,
|
|
288
|
+
position: { x: nodeX, y: nodeY },
|
|
289
|
+
data: {
|
|
290
|
+
...node.data,
|
|
291
|
+
relativePosition: { x: nodeX - parentX, y: verticalDistance },
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// Recursively position children of this node
|
|
296
|
+
if (node.children && node.children.length > 0) {
|
|
297
|
+
const childParentX = nodeX + nodeWidth / 2; // Center children under this node
|
|
298
|
+
positionNodeHierarchy(
|
|
299
|
+
node.children,
|
|
300
|
+
childParentX,
|
|
301
|
+
nodeY,
|
|
302
|
+
level + 1,
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Move to next position based on subtree width
|
|
307
|
+
currentX += subtreeWidth + minSpacing;
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
// Start positioning from the root
|
|
312
|
+
positionNodeHierarchy(tree, rootCenterX, rootNode.position.y, 1);
|
|
313
|
+
|
|
314
|
+
return positionedNodes;
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
// Calculate all positions using hierarchical tree layout
|
|
318
|
+
const allPositionedNodes = calculateHierarchicalTreeLayout();
|
|
319
|
+
|
|
320
|
+
// Performance optimization: Only update nodes that actually changed position
|
|
321
|
+
const updatedNodes: any[] = [];
|
|
322
|
+
let hasPositionChanges = false;
|
|
323
|
+
|
|
324
|
+
for (const node of allNodes) {
|
|
325
|
+
const positionedNode = allPositionedNodes.find(
|
|
326
|
+
(pn) => pn.id === node.id,
|
|
327
|
+
);
|
|
328
|
+
if (positionedNode) {
|
|
329
|
+
const oldPos = node.position;
|
|
330
|
+
const newPos = positionedNode.position;
|
|
331
|
+
const positionChanged =
|
|
332
|
+
oldPos.x !== newPos.x || oldPos.y !== newPos.y;
|
|
333
|
+
|
|
334
|
+
if (positionChanged) {
|
|
335
|
+
hasPositionChanges = true;
|
|
336
|
+
updatedNodes.push({
|
|
337
|
+
...node,
|
|
338
|
+
position: positionedNode.position,
|
|
339
|
+
data: positionedNode.data,
|
|
340
|
+
});
|
|
341
|
+
} else {
|
|
342
|
+
updatedNodes.push(node);
|
|
343
|
+
}
|
|
344
|
+
} else {
|
|
345
|
+
updatedNodes.push(node);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const endTime = performance.now();
|
|
350
|
+
const duration = endTime - startTime;
|
|
351
|
+
|
|
352
|
+
if (hasPositionChanges) {
|
|
353
|
+
setNodes(updatedNodes);
|
|
354
|
+
} else {
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
[setNodes],
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
// Auto-adjust child node positions when node dimensions change
|
|
361
|
+
const adjustChildPositions = useCallback(() => {
|
|
362
|
+
calculateTreeLayout();
|
|
363
|
+
}, [calculateTreeLayout]);
|
|
364
|
+
|
|
365
|
+
// Add new child node to the tree structure
|
|
366
|
+
const addChildNode = useCallback(() => {
|
|
367
|
+
if (!isTreeStructure || !structureId) return;
|
|
368
|
+
|
|
369
|
+
const allNodes = getNodes();
|
|
370
|
+
const currentNode = allNodes.find((n) => n.id === id);
|
|
371
|
+
if (!currentNode) return;
|
|
372
|
+
|
|
373
|
+
// Find the root node to get the structure type
|
|
374
|
+
const rootNodeForStructureType = allNodes.find(
|
|
375
|
+
(n) =>
|
|
376
|
+
n.data.isTreeStructure &&
|
|
377
|
+
n.data.structureId === structureId &&
|
|
378
|
+
n.data.nodeType === 'root',
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
// Determine the level of the new child node
|
|
382
|
+
const currentLevel =
|
|
383
|
+
currentNode.data.nodeType === 'root'
|
|
384
|
+
? 0
|
|
385
|
+
: (currentNode.data.level as number) || 1;
|
|
386
|
+
const newLevel = currentLevel + 1;
|
|
387
|
+
|
|
388
|
+
// Count existing child nodes at the same level under this parent
|
|
389
|
+
const existingChildNodes = allNodes.filter(
|
|
390
|
+
(n) =>
|
|
391
|
+
n.data.isTreeStructure &&
|
|
392
|
+
n.data.structureId === structureId &&
|
|
393
|
+
n.data.parentId === id &&
|
|
394
|
+
n.data.level === newLevel,
|
|
395
|
+
);
|
|
396
|
+
|
|
397
|
+
const childCount = existingChildNodes.length;
|
|
398
|
+
const newChildId = generateChildId();
|
|
399
|
+
|
|
400
|
+
// Calculate position for new child node
|
|
401
|
+
const relativeX = 0; // Will be calculated by layout system
|
|
402
|
+
const verticalDistance = 150; // Fixed Y distance between levels
|
|
403
|
+
|
|
404
|
+
const newChildNode: Node = {
|
|
405
|
+
id: newChildId,
|
|
406
|
+
type: 'TreeSystemNode',
|
|
407
|
+
position: { x: 0, y: 0 }, // Will be calculated by adjustChildPositions
|
|
408
|
+
data: {
|
|
409
|
+
label: `Child ${childCount + 1}`,
|
|
410
|
+
color: '#F44336',
|
|
411
|
+
isTreeStructure: true,
|
|
412
|
+
structureId: structureId,
|
|
413
|
+
nodeType: 'child',
|
|
414
|
+
parentId: id, // Track parent node
|
|
415
|
+
level: newLevel, // Track level in tree
|
|
416
|
+
relativePosition: { x: relativeX, y: verticalDistance },
|
|
417
|
+
// Inherit structure type from root node
|
|
418
|
+
structureType:
|
|
419
|
+
rootNodeForStructureType?.data?.structureType || 'structure1',
|
|
420
|
+
} as SystemFlowNodeData,
|
|
421
|
+
draggable: true,
|
|
422
|
+
width: 120,
|
|
423
|
+
height: 60,
|
|
424
|
+
measured: {
|
|
425
|
+
width: 120,
|
|
426
|
+
height: 60,
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// Add the new child node
|
|
431
|
+
addNodes(newChildNode);
|
|
432
|
+
|
|
433
|
+
// Find the root node and trigger its layout recalculation
|
|
434
|
+
const rootNodeForLayout = allNodes.find(
|
|
435
|
+
(n) =>
|
|
436
|
+
n.data.isTreeStructure &&
|
|
437
|
+
n.data.structureId === structureId &&
|
|
438
|
+
n.data.nodeType === 'root',
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
if (rootNodeForLayout) {
|
|
442
|
+
// Use a small delay to ensure the new node is added before recalculation
|
|
443
|
+
setTimeout(() => {
|
|
444
|
+
const forceLayoutRecalculation =
|
|
445
|
+
rootNodeForLayout.data?.forceLayoutRecalculation;
|
|
446
|
+
if (typeof forceLayoutRecalculation === 'function') {
|
|
447
|
+
forceLayoutRecalculation();
|
|
448
|
+
} else {
|
|
449
|
+
// Fallback: trigger layout recalculation by updating the root node
|
|
450
|
+
setNodes((nds) =>
|
|
451
|
+
nds.map((node) => {
|
|
452
|
+
if (node.id === rootNodeForLayout.id) {
|
|
453
|
+
return {
|
|
454
|
+
...node,
|
|
455
|
+
data: {
|
|
456
|
+
...node.data,
|
|
457
|
+
lastLayoutUpdate: Date.now(),
|
|
458
|
+
},
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
return node;
|
|
462
|
+
}),
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
}, 50);
|
|
466
|
+
}
|
|
467
|
+
}, [
|
|
468
|
+
isTreeStructure,
|
|
469
|
+
structureId,
|
|
470
|
+
getNodes,
|
|
471
|
+
addNodes,
|
|
472
|
+
setNodes,
|
|
473
|
+
id,
|
|
474
|
+
generateChildId,
|
|
475
|
+
]);
|
|
476
|
+
|
|
477
|
+
// Update existing child nodes to inherit structure type from root
|
|
478
|
+
const updateChildNodesStructureType = useCallback(() => {
|
|
479
|
+
if (!isTreeStructure || !structureId) return;
|
|
480
|
+
|
|
481
|
+
const allNodes = getNodes();
|
|
482
|
+
const rootNode = allNodes.find(
|
|
483
|
+
(n) =>
|
|
484
|
+
n.data.isTreeStructure &&
|
|
485
|
+
n.data.structureId === structureId &&
|
|
486
|
+
n.data.nodeType === 'root',
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
if (!rootNode?.data?.structureType) return;
|
|
490
|
+
|
|
491
|
+
const updatedNodes = allNodes.map((node) => {
|
|
492
|
+
if (
|
|
493
|
+
node.data.isTreeStructure &&
|
|
494
|
+
node.data.structureId === structureId &&
|
|
495
|
+
node.data.nodeType === 'child' &&
|
|
496
|
+
!node.data.structureType
|
|
497
|
+
) {
|
|
498
|
+
return {
|
|
499
|
+
...node,
|
|
500
|
+
data: {
|
|
501
|
+
...node.data,
|
|
502
|
+
structureType: rootNode.data.structureType,
|
|
503
|
+
},
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
return node;
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
// Only update if there were changes
|
|
510
|
+
const hasChanges = updatedNodes.some(
|
|
511
|
+
(node, index) => node !== allNodes[index],
|
|
512
|
+
);
|
|
513
|
+
if (hasChanges) {
|
|
514
|
+
setNodes(updatedNodes);
|
|
515
|
+
}
|
|
516
|
+
}, [isTreeStructure, structureId, getNodes, setNodes]);
|
|
517
|
+
|
|
518
|
+
// Force layout recalculation - can be called externally
|
|
519
|
+
const forceLayoutRecalculation = useCallback(() => {
|
|
520
|
+
if (isTreeStructure) {
|
|
521
|
+
// First update any existing child nodes that don't have structure type
|
|
522
|
+
updateChildNodesStructureType();
|
|
523
|
+
// Add a small delay to ensure all DOM updates are complete
|
|
524
|
+
setTimeout(() => {
|
|
525
|
+
calculateTreeLayout();
|
|
526
|
+
}, 50);
|
|
527
|
+
}
|
|
528
|
+
}, [isTreeStructure, calculateTreeLayout, updateChildNodesStructureType]);
|
|
529
|
+
|
|
530
|
+
return {
|
|
531
|
+
generateChildId,
|
|
532
|
+
addChildNode,
|
|
533
|
+
adjustChildPositions,
|
|
534
|
+
forceLayoutRecalculation,
|
|
535
|
+
};
|
|
536
|
+
};
|