feat(ui): node outputs adapt to new workflow designer

This commit is contained in:
Fu Diwei
2025-08-15 09:34:04 +08:00
parent c7b88cbcfb
commit 139746ba62
28 changed files with 660 additions and 492 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Certimate - Your Trusted SSL Automation Partner</title>
<title>Certimate - Your Trusted Partner in SSL Automation</title>
</head>
<body style="pointer-events: auto !important">
<div id="root"></div>
+244 -244
View File
@@ -11,13 +11,13 @@
"@codemirror/lang-yaml": "^6.1.2",
"@codemirror/language": "^6.11.2",
"@codemirror/legacy-modes": "^6.5.1",
"@flowgram.ai/document": "^0.3.5",
"@flowgram.ai/fixed-layout-editor": "^0.3.5",
"@flowgram.ai/minimap-plugin": "^0.3.5",
"@flowgram.ai/document": "^0.3.6",
"@flowgram.ai/fixed-layout-editor": "^0.3.6",
"@flowgram.ai/minimap-plugin": "^0.3.6",
"@tabler/icons-react": "^3.34.1",
"@uiw/codemirror-extensions-basic-setup": "^4.24.2",
"@uiw/codemirror-theme-vscode": "^4.24.2",
"@uiw/react-codemirror": "^4.24.2",
"@uiw/codemirror-extensions-basic-setup": "^4.25.1",
"@uiw/codemirror-theme-vscode": "^4.25.1",
"@uiw/react-codemirror": "^4.25.1",
"ahooks": "^3.9.0",
"antd": "^5.27.0",
"antd-zod": "^7.0.0",
@@ -2408,12 +2408,12 @@
}
},
"node_modules/@flowgram.ai/background-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/background-plugin/-/background-plugin-0.3.5.tgz",
"integrity": "sha512-4iUka9SQNNceNQwivTBE1XPJjNSj4tP/6dieO2CVInPEl/PgIRodgTM5gjVvrnr/Mvrk1231+ttFL68HsVnByA==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/background-plugin/-/background-plugin-0.3.6.tgz",
"integrity": "sha512-nFCbR1JDbuZHPmwlnjxHyP1WeM3xv786GLdKfzU6h5v+VRrHZsRgu3r+j6d+CQSYTM3Mem3UAlXI4BWukZa9UQ==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2423,11 +2423,11 @@
}
},
"node_modules/@flowgram.ai/command": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/command/-/command-0.3.5.tgz",
"integrity": "sha512-FWGaOD0+vGaKzDq2+c7NtzTyLofK/9rUoXA8YLbEnG+CNSaCDh9Q2+93YrTowRcCvSWxSHewGlLSquj2uAP3Wg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/command/-/command-0.3.6.tgz",
"integrity": "sha512-tI7192YZnFmC4t298PLd9u+dDwFsCzWaA2p2qVSpiTlGsk2ZOdTOfKbA/sFqearV0DOAG97KW1h81M4XbXGKkQ==",
"dependencies": {
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2437,12 +2437,12 @@
}
},
"node_modules/@flowgram.ai/core": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/core/-/core-0.3.5.tgz",
"integrity": "sha512-XrrogUnSjari3FipYUqpyiPKy30vewI5Jp9khRgyXc9cZiLVbdOd8Ki/LzHyxQc0E5R2H84XHHCpt1eWcKGMew==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/core/-/core-0.3.6.tgz",
"integrity": "sha512-/6PeNGAa0lGmCoA7/PzqGx0vnWQ+oizdvKG9P8/sm0aI8iu9+wxGOKUGUNUASkDRzJk8vzIPzP/26qaPrxKK2w==",
"dependencies": {
"@flowgram.ai/command": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/command": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"@phosphor/messaging": "^1.3.0",
"@tweenjs/tween.js": "^18",
"clsx": "^1.1.1",
@@ -2482,12 +2482,12 @@
}
},
"node_modules/@flowgram.ai/document": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/document/-/document-0.3.5.tgz",
"integrity": "sha512-Y6Rrka33peD56bfJ5kDm2Ah+aDXiLJZdhepVoyvVBupySDnsGvAl7D4s0/dev+zQb6XsatgWAJf1SZ3UzdeTxQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/document/-/document-0.3.6.tgz",
"integrity": "sha512-idEXiFsoOrWgxA1DAQy2QBm+OI14xAZ87L7IjDJO6aaU52VpJxZZuQEQ3DI+ocndzT4kTaJsK2/QyzRPA98H7A==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"nanoid": "^4.0.2",
@@ -2512,29 +2512,29 @@
}
},
"node_modules/@flowgram.ai/editor": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/editor/-/editor-0.3.5.tgz",
"integrity": "sha512-/DCivTv4Gog8bXJ/qL10CTAGcwitnP3+Mnb6bJAjwvfX/y5FCD0OL9SKRIVXQhip4zxmFrmZmwnswJPnpbvxtA==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/editor/-/editor-0.3.6.tgz",
"integrity": "sha512-xsKJ0RtJUDlq08KXaFTnjYgvDhg5zU2EaeXPk1vGGgK2dWKrEir7odpGrr3jOxt9oTIaT3Xdxoi9YwneqL3srw==",
"dependencies": {
"@flowgram.ai/background-plugin": "0.3.5",
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/group-plugin": "0.3.5",
"@flowgram.ai/history": "0.3.5",
"@flowgram.ai/history-node-plugin": "0.3.5",
"@flowgram.ai/i18n-plugin": "0.3.5",
"@flowgram.ai/materials-plugin": "0.3.5",
"@flowgram.ai/node": "0.3.5",
"@flowgram.ai/node-core-plugin": "0.3.5",
"@flowgram.ai/node-variable-plugin": "0.3.5",
"@flowgram.ai/playground-react": "0.3.5",
"@flowgram.ai/redux-devtool-plugin": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/shortcuts-plugin": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/variable-plugin": "0.3.5",
"@flowgram.ai/background-plugin": "0.3.6",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/group-plugin": "0.3.6",
"@flowgram.ai/history": "0.3.6",
"@flowgram.ai/history-node-plugin": "0.3.6",
"@flowgram.ai/i18n-plugin": "0.3.6",
"@flowgram.ai/materials-plugin": "0.3.6",
"@flowgram.ai/node": "0.3.6",
"@flowgram.ai/node-core-plugin": "0.3.6",
"@flowgram.ai/node-variable-plugin": "0.3.6",
"@flowgram.ai/playground-react": "0.3.6",
"@flowgram.ai/redux-devtool-plugin": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"@flowgram.ai/shortcuts-plugin": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"@flowgram.ai/variable-plugin": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2544,13 +2544,13 @@
}
},
"node_modules/@flowgram.ai/fixed-drag-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-drag-plugin/-/fixed-drag-plugin-0.3.5.tgz",
"integrity": "sha512-sytXPYyiNU6RpLKsTPeXd83BWQjQaIrgQRGKuSoTYI9LUe8fDKz558xE/kJaLOvoyfeQwvpKj1kp03LAZ63+zA==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-drag-plugin/-/fixed-drag-plugin-0.3.6.tgz",
"integrity": "sha512-UhWVMTCKpsVu63M3VCxDjmAST88eNKrfkHNCQ73+obS/dKNKh4tyroz9kSnGHYfWjxme40fUP4bO459QgDhg7Q==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2560,29 +2560,29 @@
}
},
"node_modules/@flowgram.ai/fixed-history-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-history-plugin/-/fixed-history-plugin-0.3.5.tgz",
"integrity": "sha512-V7QTfMykzmVfn0eaq1z7C/ukQnJhP8kr2qGUK/fxjOqhacgcBYW1+Pc+XsQWHQbo5dADr2kTlr42dgqjqY2Grg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-history-plugin/-/fixed-history-plugin-0.3.6.tgz",
"integrity": "sha512-bVWoKNUDybC5ojnZ/j1LFGRAfKw/3Ur/JYtA80d2qaq2WT+XXd2+f1RrbpRQaGQvcpVwhZT+oHFINn4srUl5vg==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/history": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/history": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
}
},
"node_modules/@flowgram.ai/fixed-layout-core": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-core/-/fixed-layout-core-0.3.5.tgz",
"integrity": "sha512-ojhQaIOweR5QH7gsc7fWavb5aF270jHu0m0RIjLtc7dFCUMiadlU+tkm2sP7Y1BM76aPXsG3hnjHUk7wM2sU4A==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-core/-/fixed-layout-core-0.3.6.tgz",
"integrity": "sha512-TbpDN7zKaZCMk5RfRxTCuQkmd56cC11qFPysMzGe5g/2Yqy3OZ5P8VdavhHrOv/hN9sdnHrs8mEirN1APIp22Q==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
@@ -2593,19 +2593,19 @@
}
},
"node_modules/@flowgram.ai/fixed-layout-editor": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-editor/-/fixed-layout-editor-0.3.5.tgz",
"integrity": "sha512-bwMChriT0e0msP/6UGS6gAH+r3wqPDI2PObV01c/+JxkPjTHK/B+e1WoI5xZriQB7WQ0Y0/v2pxxrYmiGP3rvw==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-editor/-/fixed-layout-editor-0.3.6.tgz",
"integrity": "sha512-0FMBbd6VXsHLFF5kBptEKp6S0YGYdlHNKZGI+KYJL3KwtklqoYr8/AvFtY5IS6nF3n44tP6m8CsuvwQZUXIFAw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/editor": "0.3.5",
"@flowgram.ai/fixed-drag-plugin": "0.3.5",
"@flowgram.ai/fixed-history-plugin": "0.3.5",
"@flowgram.ai/fixed-layout-core": "0.3.5",
"@flowgram.ai/history": "0.3.5",
"@flowgram.ai/reactive": "0.3.5",
"@flowgram.ai/select-box-plugin": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/editor": "0.3.6",
"@flowgram.ai/fixed-drag-plugin": "0.3.6",
"@flowgram.ai/fixed-history-plugin": "0.3.6",
"@flowgram.ai/fixed-layout-core": "0.3.6",
"@flowgram.ai/history": "0.3.6",
"@flowgram.ai/reactive": "0.3.6",
"@flowgram.ai/select-box-plugin": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2615,12 +2615,12 @@
}
},
"node_modules/@flowgram.ai/form": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/form/-/form-0.3.5.tgz",
"integrity": "sha512-PmoG4k+aAdzt0v2aZKb3A/ArpUe0NKsACU68185PyXfGl8AU+GWP8ujdx3txKm2VTVEDjOFWsLSMh1/3RkRgkA==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/form/-/form-0.3.6.tgz",
"integrity": "sha512-lXNCq8sgNOPc50uVbPHAk+IsSFFNIvLkMMVvGaXXapH9p4Up5zGVPrRRuzCKeUdZHMe7wvWiAvR5hG335EsCKQ==",
"dependencies": {
"@flowgram.ai/reactive": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/reactive": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"fast-equals": "^2.0.0",
"lodash": "^4.17.21",
"nanoid": "^4.0.2"
@@ -2631,13 +2631,13 @@
}
},
"node_modules/@flowgram.ai/form-core": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/form-core/-/form-core-0.3.5.tgz",
"integrity": "sha512-fgzjJT9cUIYcclRSbMfoAHS9hqN8AvbvaZcx2EXlQDVpGAZsrTrMe4WmPe1mQ3eCakj9oj4VKqu8kipfT6spSg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/form-core/-/form-core-0.3.6.tgz",
"integrity": "sha512-wVrJZ+o1FbLwLBOchbJ1vc8BYPeMqHUuGNUu4TdmNvmHQtxChwUqX2nyCQYUXP3/sXnQnpuKHfvwA6VY12H6gQ==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
@@ -2665,16 +2665,16 @@
}
},
"node_modules/@flowgram.ai/free-layout-core": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/free-layout-core/-/free-layout-core-0.3.5.tgz",
"integrity": "sha512-ZyjSFe+/Wg8wYXtxylMfLTuapOwSucHIXmJXD4Oz6WJQk39mJ6Cfds8pbp9aPDpFYfhRdQJOLAb9nUOh5+QnBw==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/free-layout-core/-/free-layout-core-0.3.6.tgz",
"integrity": "sha512-Rcaol6+X1cBLX6Iu3AwixZC7516fOocxMPW2JeSPrWJChDOJmHtme5iMcxAKirpct9L/+AxSD0c0gIsrEmiqag==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/node": "0.3.5",
"@flowgram.ai/reactive": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/node": "0.3.6",
"@flowgram.ai/reactive": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash-es": "^4.17.21",
"nanoid": "^4.0.2",
@@ -2703,14 +2703,14 @@
}
},
"node_modules/@flowgram.ai/group-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/group-plugin/-/group-plugin-0.3.5.tgz",
"integrity": "sha512-FRic+LX9NjjW18sd7A/lV1v+wBJKwDnFUranye1nK2f9znN51k1GLm/0W/Ch0N0pZXlV8clCHYaMN9TIIZMHtQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/group-plugin/-/group-plugin-0.3.6.tgz",
"integrity": "sha512-neDrH5KNPStAmUgQhEuTmfd0zFgsERFplRIwXX+ByV7gPpHWdPHoboTPSzJ7ZXEAjogFEQgY8IRsp7KSA7iNAw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2720,12 +2720,12 @@
}
},
"node_modules/@flowgram.ai/history": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/history/-/history-0.3.5.tgz",
"integrity": "sha512-G0vU9vNJdpbHSnBx8GG8VOyTfD5Qy4L4j8S577SHl3RxhIIh7vr1tm5REEzzhxJWsvOID+v1+73XhSTzTmVi8w==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/history/-/history-0.3.6.tgz",
"integrity": "sha512-Hk3u5lLh29XqZovyrzPI35ItgB4u0+J1N36u6+HlR+Wk82HTHW6K4sKQErzZFSVEByBC/X1XlwtSNOOutxQALw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"nanoid": "^4.0.2",
@@ -2733,17 +2733,17 @@
}
},
"node_modules/@flowgram.ai/history-node-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/history-node-plugin/-/history-node-plugin-0.3.5.tgz",
"integrity": "sha512-oeoy0DJdP0dAfcOLRnKPB/r6wJcnd2rtkVwVrrpQCr3H2QF7IBNKmQFf+ueXR6e8onbNoS0b7stYqCRIFeeCaQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/history-node-plugin/-/history-node-plugin-0.3.6.tgz",
"integrity": "sha512-PD7w6/VBExL4VQkWwh+x7OjnPZaGTPhXB1DSETivTtj8pfB4HkihbtG5VlnyoDJWooBvzBJhk2Dmx91fGak6Tw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/history": "0.3.5",
"@flowgram.ai/node": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/history": "0.3.6",
"@flowgram.ai/node": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
@@ -2772,32 +2772,32 @@
}
},
"node_modules/@flowgram.ai/i18n": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n/-/i18n-0.3.5.tgz",
"integrity": "sha512-5G4wMZ3QjCIEeU2g0Cqa+vjvEoVZxs/hFx/9AV1HusBBDjeV3LOod8AM50VwIDbL/nGjLHQo2e7Nf6WBMOj86Q==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n/-/i18n-0.3.6.tgz",
"integrity": "sha512-yPuYl1miztb4I4tC1QFzvYyN82j+qWIsxcahizbmrI9eA3RhsqTDq/UgX7r9pOzVlfdITMqQ8OKUyW/lPNZcjA==",
"dependencies": {
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/utils": "0.3.6",
"i18n-js": "^4.5.1"
}
},
"node_modules/@flowgram.ai/i18n-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n-plugin/-/i18n-plugin-0.3.5.tgz",
"integrity": "sha512-rm+nQ5r7QAWSEjEyO+cT9raIVOGDa5QIdezI+NiCco27VFGsRY28dQXROd0jf/mDK91IfHrSec5nVks5bE9ZMg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n-plugin/-/i18n-plugin-0.3.6.tgz",
"integrity": "sha512-2FJACeapk49F/kpfVNI9DwYPQITvXYfA86pAWKPL51v1TncBdbdvzc3WSSOEXVdWpvA8axztYlrwYQz8ra9tvA==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/i18n": "0.3.5"
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/i18n": "0.3.6"
}
},
"node_modules/@flowgram.ai/materials-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/materials-plugin/-/materials-plugin-0.3.5.tgz",
"integrity": "sha512-ZORaEEDBPKXbTD9LIhPX8PfPfeIYiyJsPkwKm+wtSEoKbP7G+tahSMTVPDwLiIeWbQ93lEZK1/JK2XpL6rA19Q==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/materials-plugin/-/materials-plugin-0.3.6.tgz",
"integrity": "sha512-UVyPEMnzP14bULUIpThogzaJA3Xc0Uo5QVTwB8nZ4gpo4tlkv2ssLbAUnJx6fB/+1Fh99vRdJb1lR8mbfsauOA==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2808,14 +2808,14 @@
}
},
"node_modules/@flowgram.ai/minimap-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/minimap-plugin/-/minimap-plugin-0.3.5.tgz",
"integrity": "sha512-+mQx4SoaoA0EghPRmBxqIK5jbHQrzswfg9CQ3kqk5Yu5rhPTpmr+IaHbRK6FWpuehJZNxkjcUKAY705rtFIZcA==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/minimap-plugin/-/minimap-plugin-0.3.6.tgz",
"integrity": "sha512-f3sDist0dOp3hHDTp83e5Y8m+9c/vKnm3emdGXeomZZgDqCMTCYC+4OPHLCxNLhdxdaLbV5EAvRY7mVHk63qIw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
@@ -2827,15 +2827,15 @@
}
},
"node_modules/@flowgram.ai/node": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/node/-/node-0.3.5.tgz",
"integrity": "sha512-OQvcuMH3T+l9RCXfAt4tWX6tijXtCp/Kkp/pcoNFfJ7o1abfRHMKEE66i51TPn89MYrIjRxH0GY+qcm9UOuiQQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/node/-/node-0.3.6.tgz",
"integrity": "sha512-Wg7lbw/MAezapLuYCfJ/m89f/RbFwntpoWuR9B9/Eah2riGTQOYpU69+9IuRjokpaqW4T/KNDFF6BZiOz0h+Ew==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"nanoid": "^4.0.2",
@@ -2847,16 +2847,16 @@
}
},
"node_modules/@flowgram.ai/node-core-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/node-core-plugin/-/node-core-plugin-0.3.5.tgz",
"integrity": "sha512-SdWDx2ghcRbb6imacoAi+j/tZIVPcLt7FGYBg0FpXH2r0jVioXjq1BRq11GpvQqlCyDuE/J+IP21NWi1DSwKcA==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/node-core-plugin/-/node-core-plugin-0.3.6.tgz",
"integrity": "sha512-5KIJaFb6CmZbXosN+D5ulNLRiDFJEq+DK3jbCqw+Hg+BC1YA2EAwCVTQvphptYAXP12BQ8B23S0QMYGUkuhWsA==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/node": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/node": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2867,16 +2867,16 @@
}
},
"node_modules/@flowgram.ai/node-variable-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/node-variable-plugin/-/node-variable-plugin-0.3.5.tgz",
"integrity": "sha512-uZXyuBQDC9GHnJsx8w+aVM3Eb9+DNNH0qe1rZzS5MrrRG7A85t/OsGPL98p2kZJVU6Q6N+38REchsV9KdYot+Q==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/node-variable-plugin/-/node-variable-plugin-0.3.6.tgz",
"integrity": "sha512-7lBgAOyfGqNCSSVWqe3QetNG4hK9UiABz0DCVZl2ihc/9TuTev+BS+Lb0w/aTNKsr4HvTXbeERsxyTdolKrYVA==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/form-core": "0.3.5",
"@flowgram.ai/node": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/variable-plugin": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/form-core": "0.3.6",
"@flowgram.ai/node": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"@flowgram.ai/variable-plugin": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
@@ -2905,14 +2905,14 @@
}
},
"node_modules/@flowgram.ai/playground-react": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/playground-react/-/playground-react-0.3.5.tgz",
"integrity": "sha512-zBcHDS7hQ58F4o3yw0eGNv3U2qcp2qvdRJmHD0oyyCCfygBk1iqycqB8mK0J0CaferPIr7xf7CW4QAsJ/EAvbQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/playground-react/-/playground-react-0.3.6.tgz",
"integrity": "sha512-cL4i0sg3h9Y693N5i1tLrjleJsM9wMC+E+bNR7pV2BatRji7boz3+sfBfOIZnMCAxgl4ppUtnXGt2BYnkl2Pkw==",
"dependencies": {
"@flowgram.ai/background-plugin": "0.3.5",
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/shortcuts-plugin": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/background-plugin": "0.3.6",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/shortcuts-plugin": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -2922,11 +2922,11 @@
}
},
"node_modules/@flowgram.ai/reactive": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/reactive/-/reactive-0.3.5.tgz",
"integrity": "sha512-qzb7bB7SXk2JkikaCRxzKAs5rvSJqAfCCSwgbXSo3/1r4XsARuGYE0iyoobl0Fa4gD9kUk1FSv7htsxTqja9SQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/reactive/-/reactive-0.3.6.tgz",
"integrity": "sha512-iv0eWuZkVo1vHRO6f+nFGlZCDiRNSN4+cOtZb40RepKVU8vNZr9xLptsnZ1vvh8csl7LLi5V/7V/ZaZ2BqGskw==",
"dependencies": {
"@flowgram.ai/utils": "0.3.5"
"@flowgram.ai/utils": "0.3.6"
},
"peerDependencies": {
"react": ">=16.8",
@@ -2934,12 +2934,12 @@
}
},
"node_modules/@flowgram.ai/redux-devtool-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/redux-devtool-plugin/-/redux-devtool-plugin-0.3.5.tgz",
"integrity": "sha512-3mLlbz+RI5mPKVXLwqH2tT4L9ngmMZlq2Z4zmMl/F83JSOi1PCdYlD6J4FHG2jRBES7iI37VTFDxiJoHbP9tFw==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/redux-devtool-plugin/-/redux-devtool-plugin-0.3.6.tgz",
"integrity": "sha512-3nM+O9C0Sv1+k3PdrWEPZfGTDppf+lKSvUj4tZcEOHv1XTwd8wZ23ZVz5+8wWy3UBzEFCbC/BNHl4ahEcIDbKA==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/variable-core": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/variable-core": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2",
"styled-components": "^5"
@@ -2994,14 +2994,14 @@
}
},
"node_modules/@flowgram.ai/renderer": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/renderer/-/renderer-0.3.5.tgz",
"integrity": "sha512-YheWVjZ1CUIUfjfQwf7G/4jeyWsYWKG9+4zJW+co5U8isNAnVH2l+8Ahibx5fOIEnmzerOVRN73dKSSetwDdPg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/renderer/-/renderer-0.3.6.tgz",
"integrity": "sha512-o2S1oeWfWSR7C2Y6TSFAjdcHqdOPBOBWNtAglB4nK1SdHT9/sRWt60rdyArrWajU9DLvG197RN8qzSRTNkDbsQ==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/i18n": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/i18n": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
"reflect-metadata": "~0.2.2"
@@ -3012,12 +3012,12 @@
}
},
"node_modules/@flowgram.ai/select-box-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/select-box-plugin/-/select-box-plugin-0.3.5.tgz",
"integrity": "sha512-8I1+KoE9LQaDIfte/AyC4SwB9pcmb/HcQQNKklZbSPR8He3Fu4dLrTcquLO6dkRx/aF6dvugT3/78ise3mijoQ==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/select-box-plugin/-/select-box-plugin-0.3.6.tgz",
"integrity": "sha512-lsrFq01YUhLOFGjPhKQA6nmsNI9U1aM7hg3p1Fw4ILIHyRFZse8mvHrMvf/fjAPfVOdJTKjcsGfQPOjWTrhWFQ==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/renderer": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/renderer": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2"
},
@@ -3027,13 +3027,13 @@
}
},
"node_modules/@flowgram.ai/shortcuts-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/shortcuts-plugin/-/shortcuts-plugin-0.3.5.tgz",
"integrity": "sha512-68RV3LAgsZxeHvUpHCQpa4k80J06D9zpRgCjXfCpyBqUkXfMqp/uvv3pM/LBynl+4OyLzbFCxt0dsXDQP6mjNw==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/shortcuts-plugin/-/shortcuts-plugin-0.3.6.tgz",
"integrity": "sha512-RQ5fnqtqw2aXJTptV3yLEKFNl7mdd2q8CXQ7v8snqRUaB5vzI55M3SJUvCgmenayXSGktBofGcZ/mpA578lVKw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2",
"styled-components": "^5"
@@ -3088,9 +3088,9 @@
}
},
"node_modules/@flowgram.ai/utils": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/utils/-/utils-0.3.5.tgz",
"integrity": "sha512-t8KZ7c0+evAqo0e+wE3Kw58UGRkM0+DSit+X0wqerbVZe0K3j6fIIU/C0xuiVxhvxYAyCHpbNaJR0REE6jCcgg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/utils/-/utils-0.3.6.tgz",
"integrity": "sha512-5RKx2JrEjlcMOFe81F2DnroQT195ycSmuzt71p2LP/JDzNM0nG5FDRFY9DN5xuvXAeDvbD9L61rZBIgaAIXFKw==",
"dependencies": {
"clsx": "^1.1.1",
"inversify": "^6.0.1",
@@ -3128,12 +3128,12 @@
}
},
"node_modules/@flowgram.ai/variable-core": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-core/-/variable-core-0.3.5.tgz",
"integrity": "sha512-A+FwAF3uFOnULsnRz6UeVofax3fR9nIY4f+9f2td1+SEN/sCrI15vmsb9rWynC2OfSdx3k+IMzuQrpP/BwGVPw==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-core/-/variable-core-0.3.6.tgz",
"integrity": "sha512-IIssDNEpjyno7m+T3FiOzsrx4bM0qJGsZM+0MIF/CG8lbu//mtpd35SFEODePB8jZLg8sMU49/9f81LtWXXZsA==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"fast-equals": "^2.0.0",
"inversify": "^6.0.1",
"lodash": "^4.17.21",
@@ -3164,15 +3164,15 @@
}
},
"node_modules/@flowgram.ai/variable-layout": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-layout/-/variable-layout-0.3.5.tgz",
"integrity": "sha512-ah0J5Jzj0nDHNMdjMrZ7VJtxi5DkVgolNhLjN6HyoC4JyxRTMqDSwT1JQI09pLoxqhC+LuEZ4D36eJqAY883uw==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-layout/-/variable-layout-0.3.6.tgz",
"integrity": "sha512-f43k2OnOL7KXcuewQHX9Oy4t6cy4iotIYRnV5kvlD5JlZpPxCxKBtFeRPH6L/xXoKNCLA9JFv9IIBvO+omeU4A==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/free-layout-core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/variable-core": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/free-layout-core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"@flowgram.ai/variable-core": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2",
"styled-components": "^5"
@@ -3227,16 +3227,16 @@
}
},
"node_modules/@flowgram.ai/variable-plugin": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-plugin/-/variable-plugin-0.3.5.tgz",
"integrity": "sha512-Y7kgLgV/jZS/u9BfcstmxxHYi9NbGZqr2jsBXkOiV/+eYsSaVZW11YXZaC0ZNetl5/SVR68zbvzqjJV6nKIIHg==",
"version": "0.3.6",
"resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-plugin/-/variable-plugin-0.3.6.tgz",
"integrity": "sha512-b7q5/FjdbLTChuW2eLh708KDhLF4gdjzkXrjwWoyZ0vleo/Qs7S8NMuzHnhYusu5zdj0N0aFDOb+5jl7uPk2rw==",
"dependencies": {
"@flowgram.ai/core": "0.3.5",
"@flowgram.ai/document": "0.3.5",
"@flowgram.ai/free-layout-core": "0.3.5",
"@flowgram.ai/utils": "0.3.5",
"@flowgram.ai/variable-core": "0.3.5",
"@flowgram.ai/variable-layout": "0.3.5",
"@flowgram.ai/core": "0.3.6",
"@flowgram.ai/document": "0.3.6",
"@flowgram.ai/free-layout-core": "0.3.6",
"@flowgram.ai/utils": "0.3.6",
"@flowgram.ai/variable-core": "0.3.6",
"@flowgram.ai/variable-layout": "0.3.6",
"inversify": "^6.0.1",
"reflect-metadata": "~0.2.2",
"styled-components": "^5"
@@ -4643,9 +4643,9 @@
}
},
"node_modules/@uiw/codemirror-extensions-basic-setup": {
"version": "4.24.2",
"resolved": "https://registry.npmmirror.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.24.2.tgz",
"integrity": "sha512-wW/gjLRvVUeYyhdh2TApn25cvdcR+Rhg6R/j3eTOvXQzU1HNzNYCVH4YKVIfgtfdM/Xs+N8fkk+rbr1YvBppCg==",
"version": "4.25.1",
"resolved": "https://registry.npmmirror.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.1.tgz",
"integrity": "sha512-zxgA2QkvP3ZDKxTBc9UltNFTrSeFezGXcZtZj6qcsBxiMzowoEMP5mVwXcKjpzldpZVRuY+JCC+RsekEgid4vg==",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/commands": "^6.0.0",
@@ -4669,20 +4669,20 @@
}
},
"node_modules/@uiw/codemirror-theme-vscode": {
"version": "4.24.2",
"resolved": "https://registry.npmmirror.com/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.24.2.tgz",
"integrity": "sha512-5rLvAMKNjqtHSy3BZnI1Q4ZLqUDDJC5fKOp8Mv5VjPqEmAxEAIGrIXBnhAFlRg5VjHbHEMtM1O5ugL3IeHoBdQ==",
"version": "4.25.1",
"resolved": "https://registry.npmmirror.com/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.25.1.tgz",
"integrity": "sha512-vZXvErVDvHLFWCo78Y22R2grisGkWJFFKkdOu9+tcRjWfOVb7K3fDu/H4fDr6JujLTaL+LY/vP/LZYAGJXVqgA==",
"dependencies": {
"@uiw/codemirror-themes": "4.24.2"
"@uiw/codemirror-themes": "4.25.1"
},
"funding": {
"url": "https://jaywcjlove.github.io/#/sponsor"
}
},
"node_modules/@uiw/codemirror-themes": {
"version": "4.24.2",
"resolved": "https://registry.npmmirror.com/@uiw/codemirror-themes/-/codemirror-themes-4.24.2.tgz",
"integrity": "sha512-0fQusJE08APL+1WM0xYqvampVM2RpABHjvZbcJWHdRc+teZbrP8907VW1ZX1tO/7/xgRRt4Fc3RHPCcTs7b0NQ==",
"version": "4.25.1",
"resolved": "https://registry.npmmirror.com/@uiw/codemirror-themes/-/codemirror-themes-4.25.1.tgz",
"integrity": "sha512-6o8tQ8bdq14RuVFpZ7l9u8KnuPq824uG3U1VV933Uhv8mfaxaoaOQSjv6T2bQUPhjH6ZlEu5+tAMkOfIL21eIQ==",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
@@ -4698,15 +4698,15 @@
}
},
"node_modules/@uiw/react-codemirror": {
"version": "4.24.2",
"resolved": "https://registry.npmmirror.com/@uiw/react-codemirror/-/react-codemirror-4.24.2.tgz",
"integrity": "sha512-kp7DhTq4RR+M2zJBQBrHn1dIkBrtOskcwJX4vVsKGByReOvfMrhqRkGTxYMRDTX6x75EG2mvBJPDKYcUQcHWBw==",
"version": "4.25.1",
"resolved": "https://registry.npmmirror.com/@uiw/react-codemirror/-/react-codemirror-4.25.1.tgz",
"integrity": "sha512-eESBKHndoYkaEGlKCwRO4KrnTw1HkWBxVpEeqntoWTpoFEUYxdLWUYmkPBVk4/u8YzVy9g91nFfIRpqe5LjApg==",
"dependencies": {
"@babel/runtime": "^7.18.6",
"@codemirror/commands": "^6.1.0",
"@codemirror/state": "^6.1.1",
"@codemirror/theme-one-dark": "^6.0.0",
"@uiw/codemirror-extensions-basic-setup": "4.24.2",
"@uiw/codemirror-extensions-basic-setup": "4.25.1",
"codemirror": "^6.0.0"
},
"funding": {
+10 -10
View File
@@ -13,20 +13,20 @@
"@codemirror/lang-yaml": "^6.1.2",
"@codemirror/language": "^6.11.2",
"@codemirror/legacy-modes": "^6.5.1",
"@flowgram.ai/document": "^0.3.5",
"@flowgram.ai/fixed-layout-editor": "^0.3.5",
"@flowgram.ai/minimap-plugin": "^0.3.5",
"@flowgram.ai/document": "^0.3.6",
"@flowgram.ai/fixed-layout-editor": "^0.3.6",
"@flowgram.ai/minimap-plugin": "^0.3.6",
"@tabler/icons-react": "^3.34.1",
"@uiw/codemirror-extensions-basic-setup": "^4.24.2",
"@uiw/codemirror-theme-vscode": "^4.24.2",
"@uiw/react-codemirror": "^4.24.2",
"@uiw/codemirror-extensions-basic-setup": "^4.25.1",
"@uiw/codemirror-theme-vscode": "^4.25.1",
"@uiw/react-codemirror": "^4.25.1",
"ahooks": "^3.9.0",
"antd": "^5.27.0",
"antd-zod": "^7.0.0",
"clsx": "^2.1.1",
"cron-parser": "^5.3.0",
"file-saver": "^2.0.5",
"i18next": "^25.3.4",
"i18next": "^25.3.6",
"i18next-browser-languagedetector": "^8.2.0",
"immer": "^10.1.1",
"nanoid": "^5.1.5",
@@ -43,8 +43,8 @@
},
"devDependencies": {
"@eslint/js": "^9.33.0",
"@tailwindcss/postcss": "^4.1.11",
"@tailwindcss/vite": "^4.1.11",
"@tailwindcss/postcss": "^4.1.12",
"@tailwindcss/vite": "^4.1.12",
"@types/file-saver": "^2.0.7",
"@types/fs-extra": "^11.0.4",
"@types/node": "^22.16.5",
@@ -63,7 +63,7 @@
"eslint-plugin-react-refresh": "^0.4.20",
"fs-extra": "^11.3.1",
"prettier": "^3.6.2",
"tailwindcss": "^4.1.11",
"tailwindcss": "^4.1.12",
"typescript": "^5.8.3",
"typescript-eslint": "^8.39.1",
"vite": "^6.3.5"
+25 -7
View File
@@ -7,7 +7,7 @@ import { shell } from "@codemirror/legacy-modes/mode/shell";
import { basicSetup } from "@uiw/codemirror-extensions-basic-setup";
import { vscodeDark, vscodeLight } from "@uiw/codemirror-theme-vscode";
import CodeMirror, { type ReactCodeMirrorProps, type ReactCodeMirrorRef } from "@uiw/react-codemirror";
import { useFocusWithin } from "ahooks";
import { useFocusWithin, useHover } from "ahooks";
import { theme } from "antd";
import { useBrowserTheme } from "@/hooks";
@@ -24,7 +24,8 @@ const CodeInput = ({ className, style, disabled, language, ...props }: CodeInput
const { theme: browserTheme } = useBrowserTheme();
const cmRef = useRef<ReactCodeMirrorRef>(null);
const isFocusWithin = useFocusWithin(cmRef.current?.editor);
const isFocusing = useFocusWithin(cmRef.current?.editor);
const isHovering = useHover(cmRef.current?.editor);
const cmTheme = useMemo(() => {
if (browserTheme === "dark") {
@@ -66,13 +67,30 @@ const CodeInput = ({ className, style, disabled, language, ...props }: CodeInput
return (
<div
className={mergeCls(className, `hover:border-[${themeToken.colorPrimaryBorderHover}]`)}
className={mergeCls("ant-input", className)}
style={{
...(style ?? {}),
border: `1px solid ${isFocusWithin ? (themeToken.Input?.activeBorderColor ?? themeToken.colorPrimaryBorder) : themeToken.colorBorder}`,
...style,
paddingBlock: themeToken.Input?.paddingBlock,
paddingInline: themeToken.Input?.paddingInline,
fontSize: themeToken.Input?.inputFontSize,
lineHeight: themeToken.lineHeight,
color: disabled ? themeToken.colorTextDisabled : themeToken.colorText,
backgroundColor: disabled
? themeToken.colorBgContainerDisabled
: isFocusing
? (themeToken.Input?.activeBg ?? themeToken.colorBgContainer)
: isHovering
? (themeToken.Input?.hoverBg ?? themeToken.colorBgContainer)
: void 0,
borderWidth: `${themeToken.lineWidth}px`,
borderStyle: themeToken.lineType,
borderColor: isFocusing
? (themeToken.Input?.activeBorderColor ?? themeToken.colorPrimaryActive)
: isHovering
? (themeToken.Input?.hoverBorderColor ?? themeToken.colorPrimaryHover)
: themeToken.colorBorder,
borderRadius: `${themeToken.borderRadius}px`,
backgroundColor: disabled ? themeToken.colorBgContainerDisabled : themeToken.colorBgContainer,
boxShadow: isFocusWithin ? themeToken.Input?.activeShadow : void 0,
boxShadow: isFocusing ? themeToken.Input?.activeShadow : void 0,
overflow: "hidden",
}}
>
@@ -1,4 +1,4 @@
import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from "react";
import { forwardRef, useImperativeHandle, useMemo, useRef } from "react";
import {
ConstantKeys,
EditorRenderer,
@@ -119,6 +119,18 @@ const Designer = forwardRef<DesignerInstance, DesignerProps>(
}),
],
onInit: (ctx) => {
const callback = () => {
if (rendered.current) {
onDocumentChange?.(flowgramEditorRef.current!);
}
};
ctx.document.onNodeCreate(callback);
ctx.document.onNodeUpdate(callback);
ctx.document.onNodeDispose(callback);
ctx.document.originTree.onTreeChange(callback);
},
onAllLayersRendered: (ctx) => {
rendered.current = true;
@@ -128,50 +140,34 @@ const Designer = forwardRef<DesignerInstance, DesignerProps>(
}, 1);
},
}),
[themeToken, initialData, readonly]
[themeToken, initialData, readonly, onDocumentChange]
);
useEffect(() => {
const callback = () => {
if (rendered.current) {
onDocumentChange?.(flowgramEditorRef.current!);
}
};
const d1 = flowgramEditorRef.current?.document?.onNodeCreate(callback);
const d2 = flowgramEditorRef.current?.document?.onNodeUpdate(callback);
const d3 = flowgramEditorRef.current?.document?.onNodeDispose(callback);
const d4 = flowgramEditorRef.current?.document?.renderTree?.onTreeChange(callback);
return () => {
d1?.dispose();
d2?.dispose();
d3?.dispose();
d4?.dispose();
};
}, [onDocumentChange]);
useImperativeHandle(ref, () => {
return {
get clipboard() {
return flowgramEditorRef.current!.clipboard;
},
get container() {
return flowgramEditorRef.current!.container;
},
get document() {
return flowgramEditorRef.current!.document;
},
get playground() {
return flowgramEditorRef.current!.playground;
get history() {
return flowgramEditorRef.current!.history;
},
get operation() {
return flowgramEditorRef.current!.operation;
},
get clipboard() {
return flowgramEditorRef.current!.clipboard;
get playground() {
return flowgramEditorRef.current!.playground;
},
get selection() {
return flowgramEditorRef.current!.selection;
},
get history() {
return flowgramEditorRef.current!.history;
get tools() {
return flowgramEditorRef.current!.tools;
},
get(identifier) {
@@ -19,7 +19,7 @@ const Toolbar = ({ className, style }: ToolbarProps) => {
const ctx = useClientContext();
const { playground } = ctx;
const tools = usePlaygroundTools({ minZoom: 0.1, maxZoom: 3, padding: 48 });
const tools = usePlaygroundTools({ minZoom: 0.1, maxZoom: 3 });
const refresh = useRefresh();
@@ -0,0 +1,182 @@
import { FlowNodeBaseType, type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor";
import { Immer } from "immer";
import { nanoid } from "nanoid";
import { type NodeJSON, NodeType } from "./nodes/typings";
/**
* 返回一个新的节点 ID。
* @returns {String}
*/
export const newNodeId = () => nanoid();
/**
* 克隆节点 JSON 对象。节点及其子节点 ID 均会重新分配。
* @param {NodeJSON} node
* @param {Object} options
* @returns {NodeJSON}
*/
export const duplicateNodeJSON = (node: NodeJSON, options?: { withCopySuffix?: boolean }) => {
const { produce } = new Immer({ autoFreeze: false });
const deepClone = (node: NodeJSON, { withCopySuffix, nodeIdMap }: { withCopySuffix: boolean; nodeIdMap: Map<string, string> }) => {
return produce(node, (draft) => {
draft.data ??= {};
draft.id = newNodeId();
draft.data.name = withCopySuffix ? `${draft.data?.name || ""}-copy` : `${draft.data?.name || ""}`;
nodeIdMap.set(node.id, draft.id); // 原节点 ID 映射到新节点 ID
if (draft.blocks) {
draft.blocks = draft.blocks.map((block) => deepClone(block as NodeJSON, { withCopySuffix: false, nodeIdMap }));
}
if (draft.data?.config) {
switch (draft.type) {
case NodeType.BizDeploy:
{
const prevNodeId = draft.data.config.certificate?.split("#")?.[0];
if (nodeIdMap.has(prevNodeId)) {
draft.data.config = {
...draft.data.config,
certificate: `${nodeIdMap.get(prevNodeId)}#certificate`,
};
}
}
break;
case NodeType.Condition:
{
const stack = [] as any[];
const expr = draft.data.config.expression;
if (expr) {
stack.push(expr);
while (stack.length > 0) {
const n = stack.pop()!;
if ("left" in n) {
stack.push(n.left);
if ("selector" in n.left) {
const prevNodeId = n.left.selector.id;
if (nodeIdMap.has(prevNodeId)) {
n.left.selector.id = nodeIdMap.get(prevNodeId)!;
}
}
}
if ("right" in n) {
stack.push(n.right);
}
}
draft.data.config = {
...draft.data.config,
expression: expr,
};
}
}
break;
}
}
return draft;
});
};
return deepClone(node, { withCopySuffix: options?.withCopySuffix ?? true, nodeIdMap: new Map() });
};
/**
* 获取指定节点到根节点为止的所有前序节点。不包括自身和根节点或开始节点。
* @param {FlowNodeEntity} node
* @returns {FlowNodeEntity[]}
*/
export const getAllPreviousNodes = (node: FlowNodeEntity): FlowNodeEntity[] => {
if (node == null) return [];
// TODO: 不应该获取到旁路分支
// // 先获取单一链路(即不包含分支)的全部节点
// const chains: FlowNodeEntity[] = [];
// let chain: FlowNodeEntity | undefined = node;
// while (chain) {
// if (chain.isStart || chain.flowNodeType === FlowNodeBaseType.ROOT) {
// break;
// }
// chains.push(chain);
// chain = chain.pre ?? chain.parent;
// }
// 再获取实际的全部节点
const visited = new Set<string>();
const result: FlowNodeEntity[] = [];
let current: FlowNodeEntity | undefined = node;
while (current) {
if (current.isStart || current.flowNodeType === FlowNodeBaseType.ROOT) {
break;
}
if (current.flowNodeType === NodeType.Condition) {
/**
* condition
* blockIcon
* inlineBlocks
* branchBlock_1
* blockOrderIcon
* ...
* branchBlock_2
* blockOrderIcon
* ...
*/
current.lastBlock?.blocks?.forEach((block) => {
block.allChildren?.forEach((child) => {
if (!visited.has(child.id)) {
visited.add(child.id);
result.push(child);
}
});
});
} else if (current.flowNodeType === NodeType.TryCatch) {
/**
* tryCatch
* blockIcon
* mainInlineBlocks
* tryBlock
* trySlot
* ...
* catchInlineBlocks
* catchBlock_1
* blockOrderIcon
* ...
* end
* catchBlock_2
* blockOrderIcon
* ...
* end
*/
current.lastBlock?.blocks?.forEach((block) => {
block.allChildren?.forEach((child) => {
if (!visited.has(child.id)) {
visited.add(child.id);
result.push(child);
}
});
});
}
if (!visited.has(current.id)) {
visited.add(current.id);
result.push(current);
}
current = current.pre ?? current.parent;
}
const prevNodes = result.filter((e) => {
if (e.id === node.id) return false;
if (e.isTypeOrExtendType(FlowNodeBaseType.BLOCK_ICON)) return false;
if (e.isTypeOrExtendType(FlowNodeBaseType.BLOCK_ORDER_ICON)) return false;
if (e.isTypeOrExtendType(FlowNodeBaseType.INLINE_BLOCKS)) return false;
if (e.isTypeOrExtendType("trySlot")) return false;
return true;
});
console.log(node.document.root);
console.log(prevNodes);
return prevNodes;
};
@@ -555,13 +555,13 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
}, t("common.errmsg.domain_invalid")),
contactEmail: z.email(t("common.errmsg.email_invalid")),
challengeType: z.string().nullish(),
provider: z.string().nonempty(t("workflow_node.apply.form.provider.placeholder")),
providerAccessId: z.string().nonempty(t("workflow_node.apply.form.provider_access.placeholder")),
provider: z.string(t("workflow_node.apply.form.provider.placeholder")).nonempty(t("workflow_node.apply.form.provider.placeholder")),
providerAccessId: z.string(t("workflow_node.apply.form.provider_access.placeholder")).nonempty(t("workflow_node.apply.form.provider_access.placeholder")),
providerConfig: z.any().nullish(),
caProvider: z.string().nullish(),
caProviderAccessId: z.string().nullish(),
caProviderConfig: z.any().nullish(),
keyAlgorithm: z.string().nonempty(t("workflow_node.apply.form.key_algorithm.placeholder")),
keyAlgorithm: z.string(t("workflow_node.apply.form.key_algorithm.placeholder")).nonempty(t("workflow_node.apply.form.key_algorithm.placeholder")),
nameservers: z
.string()
.nullish()
@@ -12,10 +12,10 @@ import DeploymentProviderPicker from "@/components/provider/DeploymentProviderPi
import DeploymentProviderSelect from "@/components/provider/DeploymentProviderSelect";
import Show from "@/components/Show";
import { ACCESS_USAGES, DEPLOYMENT_PROVIDERS, accessProvidersMap, deploymentProvidersMap } from "@/domain/provider";
import { type WorkflowNodeConfigForDeploy, WorkflowNodeType, defaultNodeConfigForDeploy } from "@/domain/workflow";
import { useAntdForm, useZustandShallowSelector } from "@/hooks";
import { useWorkflowStore } from "@/stores/workflow";
import { type WorkflowNodeConfigForDeploy, defaultNodeConfigForDeploy } from "@/domain/workflow";
import { useAntdForm } from "@/hooks";
import { getAllPreviousNodes } from "../_util";
import { FormNestedFieldsContextProvider, NodeFormContextProvider } from "./_context";
import BizDeployNodeConfigFormProvider1PanelConsole from "./BizDeployNodeConfigFormProvider1PanelConsole";
import BizDeployNodeConfigFormProvider1PanelSite from "./BizDeployNodeConfigFormProvider1PanelSite";
@@ -126,13 +126,21 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp
const { token: themeToken } = theme.useToken();
const { getWorkflowOuptutBeforeId } = useWorkflowStore(useZustandShallowSelector(["updateNode", "getWorkflowOuptutBeforeId"]));
const initialValues = useMemo(() => {
return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForDeploy | undefined;
}, [node]);
const formSchema = getSchema({ i18n });
const formSchema = getSchema({ i18n }).superRefine((values, ctx) => {
if (values.certificateOutputNodeId) {
if (!certificateOutputNodeIdOptions.some((option) => option.value === values.certificateOutputNodeId)) {
ctx.addIssue({
code: "custom",
message: t("workflow_node.deploy.form.certificate_output_node_id.placeholder"),
path: ["certificateOutputNodeId"],
});
}
}
});
const formRule = createSchemaFieldRule(formSchema);
const { form: formInst, formProps } = useAntdForm({
form: props.form,
@@ -142,6 +150,17 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp
const fieldProvider = Form.useWatch<string>("provider", { form: formInst, preserve: true });
const certificateOutputNodeIdOptions = useMemo(() => {
return getAllPreviousNodes(node)
.filter((node) => node.flowNodeType === NodeType.BizApply || node.flowNodeType === NodeType.BizUpload)
.map((node) => {
return {
label: getNodeForm(node)?.getValueIn("name"),
value: node.id,
};
});
}, [node]);
const [showProviderAccess, setShowProviderAccess] = useState(false);
useEffect(() => {
// 内置的部署提供商(如本地部署)无需显示授权信息字段
@@ -153,25 +172,6 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp
}
}, [fieldProvider]);
// TODO: 适配 flowgram
const certificateCandidates = useMemo(() => {
const previousNodes = getWorkflowOuptutBeforeId(node.id, "certificate");
return previousNodes
.filter((node) => node.type === WorkflowNodeType.Apply || node.type === WorkflowNodeType.Upload)
.map((item) => {
return {
label: item.name,
options: (item.outputs ?? [])?.map((output) => {
return {
label: output.label,
value: `${item.id}#${output.name}`,
};
}),
};
})
.filter((group) => group.options.length > 0);
}, [node.id]);
const NestedProviderConfigFields = useMemo(() => {
/*
注意:如果追加新的子组件,请保持以 ASCII 排序。
@@ -369,7 +369,6 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp
const handleProviderPick = (value: string) => {
formInst.setFieldValue("provider", value);
console.log();
};
const handleProviderSelect = (value?: string | undefined) => {
@@ -380,7 +379,7 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp
const oldValues = formInst.getFieldsValue();
const newValues: Record<string, unknown> = {};
for (const key in oldValues) {
if (key === "provider" || key === "providerAccessId" || key === "certificate" || key === "skipOnLastSucceeded") {
if (key === "certificateOutputNodeId" || key === "provider" || key === "providerAccessId" || key === "skipOnLastSucceeded") {
newValues[key] = oldValues[key];
} else {
delete newValues[key];
@@ -455,22 +454,24 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp
</Form.Item>
<Form.Item
name="certificate"
label={t("workflow_node.deploy.form.certificate.label")}
extra={t("workflow_node.deploy.form.certificate.help")}
name="certificateOutputNodeId"
label={t("workflow_node.deploy.form.certificate_output_node_id.label")}
extra={t("workflow_node.deploy.form.certificate_output_node_id.help")}
rules={[formRule]}
>
<Select
labelRender={({ label, value }) => {
if (value != null) {
const group = certificateCandidates.find((group) => group.options.some((option) => option.value === value));
return `${group?.label} - ${label}`;
}
return <span style={{ color: themeToken.colorTextPlaceholder }}>{t("workflow_node.deploy.form.certificate.placeholder")}</span>;
optionRender={({ label, value }) => {
return (
<div className="flex items-center justify-between gap-4 overflow-hidden">
<div className="flex-1 truncate">{label}</div>
<div className="origin-right scale-90 font-mono text-xs" style={{ color: themeToken.colorTextSecondary }}>
(NodeID: {value})
</div>
</div>
);
}}
options={certificateCandidates}
placeholder={t("workflow_node.deploy.form.certificate.placeholder")}
options={certificateOutputNodeIdOptions}
placeholder={t("workflow_node.deploy.form.certificate_output_node_id.placeholder")}
/>
</Form.Item>
</div>
@@ -529,8 +530,6 @@ const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
certificate: "",
provider: "",
...defaultNodeConfigForDeploy(),
};
};
@@ -540,8 +539,10 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
return z
.object({
certificate: z.string().nonempty(t("workflow_node.deploy.form.certificate.placeholder")),
provider: z.string().nonempty(t("workflow_node.deploy.form.provider.placeholder")),
certificateOutputNodeId: z
.string(t("workflow_node.deploy.form.certificate_output_node_id.placeholder"))
.nonempty(t("workflow_node.deploy.form.certificate_output_node_id.placeholder")),
provider: z.string(t("workflow_node.deploy.form.provider.placeholder")).nonempty(t("workflow_node.deploy.form.provider.placeholder")),
providerAccessId: z.string().nullish(),
providerConfig: z.any().nullish(),
skipOnLastSucceeded: z.boolean().nullish(),
@@ -213,8 +213,6 @@ const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
return {
subject: "",
message: "",
provider: "",
providerAccessId: "",
...defaultNodeConfigForNotify(),
};
};
@@ -231,8 +229,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> })
.string()
.min(1, t("workflow_node.notify.form.message.placeholder"))
.max(20480, t("common.errmsg.string_max", { max: 20480 })),
provider: z.string().nonempty(t("workflow_node.notify.form.provider.placeholder")),
providerAccessId: z.string().nonempty(t("workflow_node.notify.form.provider_access.placeholder")),
provider: z.string(t("workflow_node.notify.form.provider.placeholder")).nonempty(t("workflow_node.notify.form.provider.placeholder")),
providerAccessId: z.string(t("workflow_node.notify.form.provider_access.placeholder")).nonempty(t("workflow_node.notify.form.provider_access.placeholder")),
providerConfig: z.any().nullish(),
skipOnAllPrevSkipped: z.boolean().nullish(),
});
@@ -1,5 +1,6 @@
import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { getNodeForm } from "@flowgram.ai/fixed-layout-editor";
import { IconCircleMinus, IconCirclePlus } from "@tabler/icons-react";
import { useControllableValue } from "ahooks";
import { Button, Form, Input, Radio, Select, theme } from "antd";
@@ -7,10 +8,10 @@ import { Button, Form, Input, Radio, Select, theme } from "antd";
import Show from "@/components/Show";
import type { Expr, ExprComparisonOperator, ExprLogicalOperator, ExprValue, ExprValueSelector, ExprValueType } from "@/domain/workflow";
import { ExprType } from "@/domain/workflow";
import { useAntdFormName, useZustandShallowSelector } from "@/hooks";
import { useWorkflowStore } from "@/stores/workflow";
import { useAntdFormName } from "@/hooks";
import { useNodeFormContext } from "./_context";
import { getAllPreviousNodes } from "../_util";
export interface BranchBlockNodeConfigFormExpressionEditorProps {
className?: string;
@@ -135,8 +136,6 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef<BranchBlockNodeConf
const { token: themeToken } = theme.useToken();
const { getWorkflowOuptutBeforeId } = useWorkflowStore(useZustandShallowSelector(["updateNode", "getWorkflowOuptutBeforeId"]));
const [value, setValue] = useControllableValue<Expr | undefined>(props, {
valuePropName: "value",
defaultValuePropName: "defaultValue",
@@ -160,17 +159,27 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef<BranchBlockNodeConf
}
}, [value]);
// TODO: 适配 flowgram
const ciSelectorCandidates = useMemo(() => {
const previousNodes = getWorkflowOuptutBeforeId(node.id);
return previousNodes
const ciSelectorOptions = useMemo(() => {
return getAllPreviousNodes(node)
.map((node) => {
const form = getNodeForm(node);
const group = {
label: node.name,
data: {
name: form?.getValueIn("name"),
...form?.values,
},
label: (
<div className="flex items-center justify-between gap-4 overflow-hidden">
<div className="flex-1 truncate">{form?.getValueIn("name")}</div>
<div className="origin-right scale-90 font-mono text-xs" style={{ color: themeToken.colorTextSecondary }}>
(NodeID: {node.id})
</div>
</div>
),
options: Array<{ label: string; value: string }>(),
};
for (const output of node.outputs ?? []) {
for (const output of form?.getValueIn("outputs") ?? []) {
switch (output.type) {
case "certificate":
group.options.push({
@@ -196,7 +205,7 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef<BranchBlockNodeConf
return group;
})
.filter((item) => item.options.length > 0);
}, [node.id]);
}, [node]);
const getValueTypeBySelector = (selector: string): ExprValueType | undefined => {
if (!selector) return;
@@ -279,15 +288,15 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef<BranchBlockNodeConf
<Select
labelRender={({ label, value }) => {
if (value != null) {
const group = ciSelectorCandidates.find((group) => group.options.some((option) => option.value === value));
return `${group?.label} - ${label}`;
const group = ciSelectorOptions.find((group) => group.options.some((option) => option.value === value));
return `${group?.data?.name} - ${label}`;
}
return (
<span style={{ color: themeToken.colorTextPlaceholder }}>{t("workflow_node.branch_block.form.expression.variable.placeholder")}</span>
);
}}
options={ciSelectorCandidates}
options={ciSelectorOptions}
placeholder={t("workflow_node.branch_block.form.expression.variable.placeholder")}
/>
</Form.Item>
@@ -114,7 +114,6 @@ export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true,
const { promise, resolve, reject } = Promise.withResolvers();
if (changed) {
console.log(oldValues, newValues);
modal.confirm({
title: t("common.text.operation_confirm"),
content: t("workflow.detail.design.unsaved_changes.confirm"),
@@ -192,7 +191,7 @@ export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true,
}
onClose={handleClose}
>
<div ref={containerRef} style={{ height: "100%", overflow: "auto" }}>
<div ref={containerRef} style={{ height: "100%", overflowX: "hidden", overflowY: "auto" }}>
{children}
</div>
</Drawer>
@@ -0,0 +1,16 @@
import Designer from "./Designer";
import NodeDrawer from "./NodeDrawer";
import Toolbar from "./Toolbar";
export { type DesignerInstance as WorkflowDesignerInstance, type DesignerProps as WorkflowDesignerProps } from "./Designer";
export const WorkflowDesigner = Designer;
export { type NodeDrawerProps as WorkflowNodeDrawerProps } from "./NodeDrawer";
export const WorkflowNodeDrawer = NodeDrawer;
export { type ToolbarProps as WorkflowToolbarProps } from "./Toolbar";
export const WorkflowToolbar = Toolbar;
export * from "./_util";
export type * from "./nodes/typings";
@@ -2,12 +2,13 @@ import { getI18n } from "react-i18next";
import { FeedbackLevel, Field } from "@flowgram.ai/fixed-layout-editor";
import { IconContract } from "@tabler/icons-react";
import { Avatar } from "antd";
import { nanoid } from "nanoid";
import { acmeDns01ProvidersMap } from "@/domain/provider";
import { defaultNodeConfigForApply } from "@/domain/workflow";
import { BaseNode } from "./_shared";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
import { newNodeId } from "../_util";
import BizApplyNodeConfigForm from "../forms/BizApplyNodeConfigForm";
export const BizApplyNodeRegistry: NodeRegistry = {
@@ -64,10 +65,11 @@ export const BizApplyNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.BizApply,
data: {
name: t("workflow_node.apply.default_name"),
config: defaultNodeConfigForApply(),
},
};
},
@@ -2,10 +2,11 @@ import { getI18n } from "react-i18next";
import { FeedbackLevel, Field } from "@flowgram.ai/fixed-layout-editor";
import { IconPackage } from "@tabler/icons-react";
import { Avatar } from "antd";
import { nanoid } from "nanoid";
import { deploymentProvidersMap } from "@/domain/provider";
import { defaultNodeConfigForDeploy } from "@/domain/workflow";
import { getAllPreviousNodes, newNodeId } from "../_util";
import { BaseNode } from "./_shared";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
import BizDeployNodeConfigForm from "../forms/BizDeployNodeConfigForm";
@@ -36,6 +37,14 @@ export const BizDeployNodeRegistry: NodeRegistry = {
};
}
},
["config.certificateOutputNodeId"]: ({ value, context: { node } }) => {
if (!getAllPreviousNodes(node).includes(value)) {
return {
message: "Invalid input",
level: FeedbackLevel.Error,
};
}
},
},
render: () => {
@@ -70,10 +79,11 @@ export const BizDeployNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
type: NodeType.BizMonitor,
id: newNodeId(),
type: NodeType.BizDeploy,
data: {
name: t("workflow_node.deploy.default_name"),
config: defaultNodeConfigForDeploy(),
},
};
},
@@ -1,9 +1,11 @@
import { getI18n } from "react-i18next";
import { FeedbackLevel, Field } from "@flowgram.ai/fixed-layout-editor";
import { IconDeviceDesktopSearch } from "@tabler/icons-react";
import { nanoid } from "nanoid";
import { defaultNodeConfigForMonitor } from "@/domain/workflow";
import { BaseNode } from "./_shared";
import { newNodeId } from "../_util";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
import BizMonitorNodeConfigForm from "../forms/BizMonitorNodeConfigForm";
@@ -60,10 +62,11 @@ export const BizMonitorNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.BizMonitor,
data: {
name: t("workflow_node.monitor.default_name"),
config: defaultNodeConfigForMonitor(),
},
};
},
@@ -2,11 +2,12 @@ import { getI18n } from "react-i18next";
import { FeedbackLevel, Field } from "@flowgram.ai/fixed-layout-editor";
import { IconSend } from "@tabler/icons-react";
import { Avatar } from "antd";
import { nanoid } from "nanoid";
import { notificationProvidersMap } from "@/domain/provider";
import { defaultNodeConfigForNotify } from "@/domain/workflow";
import { BaseNode } from "./_shared";
import { newNodeId } from "../_util";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
import BizNotifyNodeConfigForm from "../forms/BizNotifyNodeConfigForm";
@@ -70,10 +71,11 @@ export const BizNotifyNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.BizNotify,
data: {
name: t("workflow_node.notify.default_name"),
config: defaultNodeConfigForNotify(),
},
};
},
@@ -1,9 +1,11 @@
import { getI18n } from "react-i18next";
import { FeedbackLevel, Field } from "@flowgram.ai/fixed-layout-editor";
import { IconCloudUpload } from "@tabler/icons-react";
import { nanoid } from "nanoid";
import { defaultNodeConfigForUpload } from "@/domain/workflow";
import { BaseNode } from "./_shared";
import { newNodeId } from "../_util";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
import BizUploadNodeConfigForm from "../forms/BizUploadNodeConfigForm";
@@ -50,10 +52,11 @@ export const BizUploadNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.BizUpload,
data: {
name: t("workflow_node.upload.default_name"),
config: defaultNodeConfigForUpload(),
},
};
},
@@ -2,11 +2,11 @@ import { getI18n } from "react-i18next";
import { FeedbackLevel, Field, FlowNodeBaseType, FlowNodeSplitType } from "@flowgram.ai/fixed-layout-editor";
import { IconFilter, IconFilterFilled, IconSitemap } from "@tabler/icons-react";
import { Typography } from "antd";
import { nanoid } from "nanoid";
import { type Expr, ExprType } from "@/domain/workflow";
import { BaseNode, BranchNode } from "./_shared";
import { newNodeId } from "../_util";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
import BranchBlockNodeConfigForm from "../forms/BranchBlockNodeConfigForm";
@@ -40,14 +40,14 @@ export const ConditionNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.Condition,
data: {
name: t("workflow_node.condition.default_name"),
},
blocks: [
{
id: nanoid(),
id: newNodeId(),
type: NodeType.BranchBlock,
blocks: [],
data: {
@@ -55,7 +55,7 @@ export const ConditionNodeRegistry: NodeRegistry = {
},
},
{
id: nanoid(),
id: newNodeId(),
type: NodeType.BranchBlock,
data: {
name: t("workflow_node.branch_block.default_name") + " 2",
@@ -165,7 +165,7 @@ export const BranchBlockNodeRegistry: NodeRegistry = {
}
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.BranchBlock,
data: {
name: nodeName,
@@ -1,9 +1,9 @@
import { getI18n } from "react-i18next";
import { FlowNodeBaseType } from "@flowgram.ai/fixed-layout-editor";
import { IconLogout } from "@tabler/icons-react";
import { nanoid } from "nanoid";
import { BaseNode } from "./_shared";
import { newNodeId } from "../_util";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
export const EndNodeRegistry: NodeRegistry = {
@@ -37,22 +37,11 @@ export const EndNodeRegistry: NodeRegistry = {
// You can only add to the last node of the branch
if (!from.isLast) return false;
/**
* condition
* blockIcon
* inlineBlocks
* block1
* blockOrderIcon
* <---- [add end]
* block2
* blockOrderIcon
* end
*/
// originParent can determine whether it is condition , and then determine whether it is the last one
// `originParent` can determine whether it is condition, and then determine whether it is the last one
// https://github.com/bytedance/flowgram.ai/pull/146
if (from.parent && from.parent.parent?.flowNodeType === FlowNodeBaseType.INLINE_BLOCKS && from.parent.originParent && !from.parent.originParent.isLast) {
const allBranches = from.parent.parent!.blocks;
// Determine whether the last node of all branch is end, All branches are not allowed to be end
// Determine whether the last node of all branch is end, all branches are not allowed to be end
const branchEndCount = allBranches.filter((block) => block.blocks[block.blocks.length - 1]?.getNodeMeta().isNodeEnd).length;
return branchEndCount < allBranches.length - 1;
}
@@ -68,7 +57,7 @@ export const EndNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.End,
data: {
name: t("workflow_node.end.default_name"),
@@ -1,9 +1,9 @@
import { getI18n } from "react-i18next";
import { Field } from "@flowgram.ai/fixed-layout-editor";
import { IconArrowsSplit, IconCircleX } from "@tabler/icons-react";
import { nanoid } from "nanoid";
import { BaseNode, BranchNode } from "./_shared";
import { newNodeId } from "../_util";
import { NodeKindType, type NodeRegistry, NodeType } from "./typings";
export const TryCatchNodeRegistry: NodeRegistry = {
@@ -32,23 +32,23 @@ export const TryCatchNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.TryCatch,
data: {
name: t("workflow_node.try_catch.default_name"),
},
blocks: [
{
id: nanoid(),
id: newNodeId(),
type: NodeType.TryBlock,
blocks: [],
},
{
id: nanoid(),
id: newNodeId(),
type: NodeType.CatchBlock,
blocks: [
{
id: nanoid(),
id: newNodeId(),
type: NodeType.End,
data: {
name: t("workflow_node.end.default_name"),
@@ -106,11 +106,11 @@ export const CatchBlockNodeRegistry: NodeRegistry = {
const { t } = getI18n();
return {
id: nanoid(),
id: newNodeId(),
type: NodeType.CatchBlock,
blocks: [
{
id: nanoid(),
id: newNodeId(),
type: NodeType.End,
data: {
name: t("workflow_node.end.default_name"),
@@ -8,14 +8,13 @@ import {
useClientContext,
useWatchFormState,
} from "@flowgram.ai/fixed-layout-editor";
import { IconCopy, IconDotsVertical, IconExclamationCircle, IconGripVertical, IconLabel, IconX } from "@tabler/icons-react";
import { IconCopy, IconDotsVertical, IconGripVertical, IconLabel, IconX } from "@tabler/icons-react";
import { Button, type ButtonProps, Card, Dropdown, Input, type InputRef, Popover, Tooltip, theme } from "antd";
import { Immer } from "immer";
import { nanoid } from "nanoid";
import { mergeCls } from "@/utils/css";
import { type NodeJSON, type NodeRegistry, NodeType } from "./typings";
import { type NodeJSON, type NodeRegistry } from "./typings";
import { duplicateNodeJSON } from "../_util";
import { useNodeRenderContext } from "../NodeRenderContext";
const useInternalRenamingInput = ({ nodeRender }: { nodeRender: NodeRenderReturnType }) => {
@@ -44,7 +43,7 @@ const useInternalRenamingInput = ({ nodeRender }: { nodeRender: NodeRenderReturn
setInputVisible(false);
nodeRender.updateData({ name: value });
nodeRender.updateData({ ...nodeRender.data, name: value });
};
return {
@@ -72,7 +71,7 @@ const InternalNodeCard = ({
const nodeRegistry = nodeRender.node.getNodeRegistry<NodeRegistry>();
const isActivated = useMemo(() => nodeRenderData.activated || nodeRenderData.lineActivated, [nodeRenderData.activated, nodeRenderData.lineActivated]);
const [isHovered, setIsHovered] = useState(false);
const [isHovering, setIsHovering] = useState(false);
const [isInvalid, setIsInvalid] = useState(false);
const formState = useWatchFormState(nodeRender.node);
@@ -89,8 +88,8 @@ const InternalNodeCard = ({
style={style}
styles={{ body: { padding: 0 } }}
hoverable
onMouseEnter={() => startTransition(() => setIsHovered(true))}
onMouseLeave={() => startTransition(() => setIsHovered(false))}
onMouseEnter={() => startTransition(() => setIsHovering(true))}
onMouseLeave={() => startTransition(() => setIsHovering(false))}
>
<div className="relative z-1">{children}</div>
<div
@@ -101,7 +100,7 @@ const InternalNodeCard = ({
right: "-1px",
bottom: "-1px",
borderWidth: "2px",
borderColor: isHovered ? "var(--color-primary)" : isInvalid ? "var(--color-error)" : void 0,
borderColor: isHovering ? "var(--color-primary)" : isInvalid ? "var(--color-error)" : void 0,
}}
/>
</Card>
@@ -284,11 +283,6 @@ export const BaseNode = ({ className, style, children, description }: BaseNodePr
);
};
const [isInvalid, setIsInvalid] = useState(false);
const formState = useWatchFormState(nodeRender.node);
useEffect(() => setIsInvalid(!!formState?.invalid), [formState?.invalid]);
const {
inputRef,
visible: inputVisible,
@@ -349,9 +343,6 @@ export const BaseNode = ({ className, style, children, description }: BaseNodePr
</div>
)}
</div>
<div className="flex items-center justify-center" onClick={(e) => e.stopPropagation()}>
{isInvalid && <IconExclamationCircle color="var(--color-error)" size="1.25em" />}
</div>
</div>
)}
</InternalNodeCard>
@@ -462,70 +453,3 @@ export const BranchNode = ({ className, style, children, description }: BranchNo
</Popover>
);
};
// TODO: 应放至领域层
export const duplicateNodeJSON = (node: NodeJSON, options?: { withCopySuffix?: boolean }) => {
const { produce } = new Immer({ autoFreeze: false });
const deepClone = (node: NodeJSON, { withCopySuffix, nodeIdMap }: { withCopySuffix: boolean; nodeIdMap: Map<string, string> }) => {
return produce(node, (draft) => {
draft.data ??= {};
draft.id = nanoid();
draft.data.name = withCopySuffix ? `${draft.data?.name || ""}-copy` : `${draft.data?.name || ""}`;
nodeIdMap.set(node.id, draft.id); // 原节点 ID 映射到新节点 ID
if (draft.blocks) {
draft.blocks = draft.blocks.map((block) => deepClone(block as NodeJSON, { withCopySuffix: false, nodeIdMap }));
}
if (draft.data?.config) {
switch (draft.type) {
case NodeType.BizDeploy:
{
const prevNodeId = draft.data.config.certificate?.split("#")?.[0];
if (nodeIdMap.has(prevNodeId)) {
draft.data.config = {
...draft.data.config,
certificate: `${nodeIdMap.get(prevNodeId)}#certificate`,
};
}
}
break;
case NodeType.Condition:
{
const stack = [] as any[];
const expr = draft.data.config.expression;
if (expr) {
stack.push(expr);
while (stack.length > 0) {
const n = stack.pop()!;
if ("left" in n) {
stack.push(n.left);
if ("selector" in n.left) {
const prevNodeId = n.left.selector.id;
if (nodeIdMap.has(prevNodeId)) {
n.left.selector.id = nodeIdMap.get(prevNodeId)!;
}
}
}
if ("right" in n) {
stack.push(n.right);
}
}
draft.data.config = {
...draft.data.config,
expression: expr,
};
}
}
break;
}
}
return draft;
});
};
return deepClone(node, { withCopySuffix: options?.withCopySuffix ?? true, nodeIdMap: new Map() });
};
@@ -24,6 +24,4 @@ export const getAllNodeRegistries = () => {
];
};
export { duplicateNodeJSON } from "./_shared";
export type * from "./typings";
+2 -1
View File
@@ -140,7 +140,6 @@ export type WorkflowNodeConfigForStart = {
export const defaultNodeConfigForStart = (): Partial<WorkflowNodeConfigForStart> => {
return {
trigger: WORKFLOW_TRIGGERS.MANUAL,
triggerCron: "0 0 * * *",
};
};
@@ -199,7 +198,9 @@ export const defaultNodeConfigForMonitor = (): Partial<WorkflowNodeConfigForMoni
};
export type WorkflowNodeConfigForDeploy = {
/** @deprecated **/
certificate: string;
certificateOutputNodeId: string;
provider: string;
providerAccessId?: string;
providerConfig?: Record<string, unknown>;
@@ -137,6 +137,9 @@
"workflow_node.deploy.form_anchor.deployment.title": "Deployment settings",
"workflow_node.deploy.form_anchor.strategy.tab": "Strategy",
"workflow_node.deploy.form_anchor.strategy.title": "Strategy settings",
"workflow_node.deploy.form.certificate_output_node_id.label": "Certificate reference node",
"workflow_node.deploy.form.certificate_output_node_id.placeholder": "Please select certificate reference node",
"workflow_node.deploy.form.certificate_output_node_id.help": "Notes: The certificate to be deployed comes from the previous nodes of application or upload.",
"workflow_node.deploy.form.provider.label": "Deploy target",
"workflow_node.deploy.form.provider.placeholder": "Please select deploy target",
"workflow_node.deploy.form.provider.search.placeholder": "Search deploy target ...",
@@ -144,9 +147,6 @@
"workflow_node.deploy.form.provider_access.placeholder": "Please select an credential of Hosting provider",
"workflow_node.deploy.form.provider_access.tooltip": "Used to invoke API during deployment.",
"workflow_node.deploy.form.provider_access.button": "Create",
"workflow_node.deploy.form.certificate.label": "Certificate",
"workflow_node.deploy.form.certificate.placeholder": "Please select certificate",
"workflow_node.deploy.form.certificate.help": "Notes: The certificate to be deployed comes from the previous nodes of application or upload.",
"workflow_node.deploy.form.1panel_console_auto_restart.label": "Auto restart 1Panel after deployment",
"workflow_node.deploy.form.1panel_site_node_name.label": "1Panel node name (Optional)",
"workflow_node.deploy.form.1panel_site_node_name.placeholder": "Please enter 1Panel node name",
@@ -1079,6 +1079,9 @@
"workflow_node.action.rename_branch": "Rename branch",
"workflow_node.action.duplicate_branch": "Duplicate branch",
"workflow_node.action.remove_branch": "Delete branch",
"workflow_node.deploy.form.certificate.label": "Certificate",
"workflow_node.deploy.form.certificate.placeholder": "Please select certificate",
"workflow_node.deploy.form.certificate.help": "Notes: The certificate to be deployed comes from the previous nodes of application or upload.",
"workflow_node.branch.label": "Parallel/Conditional branch",
"workflow_node.branch.default_name": "Branch",
"workflow_node.condition.form.expression.label": "Conditions to enter the branch",
@@ -136,6 +136,9 @@
"workflow_node.deploy.form_anchor.deployment.title": "部署设置",
"workflow_node.deploy.form_anchor.strategy.tab": "执行策略",
"workflow_node.deploy.form_anchor.strategy.title": "执行策略",
"workflow_node.deploy.form.certificate_output_node_id.label": "待部署证书节点",
"workflow_node.deploy.form.certificate_output_node_id.placeholder": "请选择待部署证书节点",
"workflow_node.deploy.form.certificate_output_node_id.help": "提示:待部署证书来自之前的申请或上传节点,如果选项为空请先检查前序节点。",
"workflow_node.deploy.form.provider.label": "部署目标",
"workflow_node.deploy.form.provider.placeholder": "请选择部署目标",
"workflow_node.deploy.form.provider.search.placeholder": "搜索部署目标……",
@@ -143,9 +146,6 @@
"workflow_node.deploy.form.provider_access.placeholder": "请选择主机提供商授权",
"workflow_node.deploy.form.provider_access.tooltip": "用于部署证书时调用相关 API,注意与申请阶段所需的 DNS 提供商相区分。",
"workflow_node.deploy.form.provider_access.button": "新建",
"workflow_node.deploy.form.certificate.label": "待部署证书",
"workflow_node.deploy.form.certificate.placeholder": "请选择待部署证书",
"workflow_node.deploy.form.certificate.help": "提示:待部署证书来自之前的申请或上传节点,如果选项为空请先检查前序节点。",
"workflow_node.deploy.form.1panel_console_auto_restart.label": "部署后自动重启 1Panel 服务",
"workflow_node.deploy.form.1panel_site_node_name.label": "1Panel 子节点名称(可选)",
"workflow_node.deploy.form.1panel_site_node_name.placeholder": "请输入 1Panel 子节点名称",
@@ -1077,6 +1077,9 @@
"workflow_node.action.rename_branch": "重命名",
"workflow_node.action.duplicate_branch": "复制分支",
"workflow_node.action.remove_branch": "删除分支",
"workflow_node.deploy.form.certificate.label": "待部署证书",
"workflow_node.deploy.form.certificate.placeholder": "请选择待部署证书",
"workflow_node.deploy.form.certificate.help": "提示:待部署证书来自之前的申请或上传节点,如果选项为空请先检查前序节点。",
"workflow_node.branch.label": "并行/条件分支",
"workflow_node.branch.default_name": "分支",
"workflow_node.condition.form.expression.label": "分支进入条件",
-1
View File
@@ -368,7 +368,6 @@ const WorkflowRunHistoryTable = ({ className, style }: { className?: string; sty
rowClassName="cursor-pointer"
rowKey={(record) => record.id}
scroll={{ x: "max(100%, 720px)" }}
size="small"
onRow={(record) => ({
onClick: () => {
handleRecordDetailClick(record);
@@ -8,9 +8,7 @@ import { nanoid } from "nanoid";
import { debounce, isEqual } from "radash";
import Show from "@/components/Show";
import WorkflowDesigner, { type DesignerInstance as WorkflowDesignerInstance } from "@/components/workflow/designer/Designer";
import WorkflowNodeDrawer from "@/components/workflow/designer/NodeDrawer";
import WorkflowToolbar from "@/components/workflow/designer/Toolbar";
import { WorkflowDesigner, type WorkflowDesignerInstance, WorkflowNodeDrawer, WorkflowToolbar } from "@/components/workflow/designer";
import { type WorkflowNode, WorkflowNodeType } from "@/domain/workflow";
import { WORKFLOW_RUN_STATUSES } from "@/domain/workflowRun";
import { useZustandShallowSelector } from "@/hooks";
@@ -222,6 +220,8 @@ const compactWorkflowDraft = (root: WorkflowNode | undefined) => {
data: {
name: current.name,
config: current.config,
inputs: current.inputs,
outputs: current.outputs,
},
});
break;
@@ -233,6 +233,8 @@ const compactWorkflowDraft = (root: WorkflowNode | undefined) => {
data: {
name: current.name,
config: current.config,
inputs: current.inputs,
outputs: current.outputs,
},
});
break;
@@ -244,6 +246,8 @@ const compactWorkflowDraft = (root: WorkflowNode | undefined) => {
data: {
name: current.name,
config: current.config,
inputs: current.inputs,
outputs: current.outputs,
},
});
break;
@@ -254,7 +258,13 @@ const compactWorkflowDraft = (root: WorkflowNode | undefined) => {
type: "bizDeploy",
data: {
name: current.name,
config: current.config,
config: {
...current.config,
certificate: undefined,
certificateOutputNodeId: (current.config?.certificate as string)?.split("#")?.shift(),
},
inputs: current.inputs,
outputs: current.outputs,
},
});
break;
@@ -266,6 +276,8 @@ const compactWorkflowDraft = (root: WorkflowNode | undefined) => {
data: {
name: current.name,
config: current.config,
inputs: current.inputs,
outputs: current.outputs,
},
});
break;