diff --git a/ui/package-lock.json b/ui/package-lock.json index a4c40e0a..40085794 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -7,26 +7,24 @@ "": { "name": "@certimate/webui", "dependencies": { - "@ant-design/icons": "^6.0.0", - "@ant-design/pro-components": "^2.8.10", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-yaml": "^6.1.2", "@codemirror/language": "^6.11.2", "@codemirror/legacy-modes": "^6.5.1", - "@flowgram.ai/document": "^0.3.4", - "@flowgram.ai/fixed-layout-editor": "^0.3.4", - "@flowgram.ai/minimap-plugin": "^0.3.4", + "@flowgram.ai/document": "^0.3.5", + "@flowgram.ai/fixed-layout-editor": "^0.3.5", + "@flowgram.ai/minimap-plugin": "^0.3.5", "@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", "ahooks": "^3.9.0", - "antd": "^5.26.7", + "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.2", + "i18next": "^25.3.4", "i18next-browser-languagedetector": "^8.2.0", "immer": "^10.1.1", "nanoid": "^5.1.5", @@ -38,7 +36,7 @@ "react-i18next": "^15.6.1", "react-router-dom": "^7.8.0", "tailwind-merge": "^3.3.1", - "zod": "^4.0.16", + "zod": "^4.0.17", "zustand": "^5.0.7" }, "devDependencies": { @@ -65,7 +63,7 @@ "prettier": "^3.6.2", "tailwindcss": "^4.1.11", "typescript": "^5.8.3", - "typescript-eslint": "^8.39.0", + "typescript-eslint": "^8.39.1", "vite": "^6.3.5" } }, @@ -144,471 +142,11 @@ "node": ">=8.x" } }, - "node_modules/@ant-design/icons": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-6.0.0.tgz", - "integrity": "sha512-o0aCCAlHc1o4CQcapAwWzHeaW2x9F49g7P3IDtvtNXgHowtRWYb7kiubt8sQPFvfVIVU/jLw2hzeSlNt0FU+Uw==", - "dependencies": { - "@ant-design/colors": "^8.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@rc-component/util": "^1.2.1", - "classnames": "^2.2.6" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/@ant-design/icons-svg": { "version": "4.4.2", "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" }, - "node_modules/@ant-design/icons/node_modules/@ant-design/colors": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-8.0.0.tgz", - "integrity": "sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==", - "dependencies": { - "@ant-design/fast-color": "^3.0.0" - } - }, - "node_modules/@ant-design/icons/node_modules/@ant-design/fast-color": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/@ant-design/fast-color/-/fast-color-3.0.0.tgz", - "integrity": "sha512-eqvpP7xEDm2S7dUzl5srEQCBTXZMmY3ekf97zI+M2DHOYyKdJGH0qua0JACHTqbkRnD/KHFQP9J1uMJ/XWVzzA==", - "engines": { - "node": ">=8.x" - } - }, - "node_modules/@ant-design/pro-card": { - "version": "2.10.0", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-card/-/pro-card-2.10.0.tgz", - "integrity": "sha512-sLONn1odmE0Wkbse8pol4WiaEzBV8JU5s3FAMflPpycfUcbSaa1ktXzQ7LCo2SAvOS7gkfmpFjBPtrfbigKh4g==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.4.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-card/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-components": { - "version": "2.8.10", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-components/-/pro-components-2.8.10.tgz", - "integrity": "sha512-QHnnIXdmC5GTAtm6i8eeJy5yT9npPlFyxpDm+duiDrTRKRFaAQBduArxlH3DA/hoRCCypzPONxfK9BQNIhIyZA==", - "dependencies": { - "@ant-design/pro-card": "2.10.0", - "@ant-design/pro-descriptions": "2.6.10", - "@ant-design/pro-field": "3.1.0", - "@ant-design/pro-form": "2.32.0", - "@ant-design/pro-layout": "7.22.7", - "@ant-design/pro-list": "2.6.10", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-skeleton": "2.2.1", - "@ant-design/pro-table": "3.21.0", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.16.3" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-descriptions": { - "version": "2.6.10", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-descriptions/-/pro-descriptions-2.6.10.tgz", - "integrity": "sha512-+4MbiOfumnWlW0Awm4m8JML5o3lR649FD24AaivCmr8BQvIAAXdTITnDMXEg8BqvdP4KOvNsStZrvYfqoev33A==", - "dependencies": { - "@ant-design/pro-field": "3.1.0", - "@ant-design/pro-form": "2.32.0", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-skeleton": "2.2.1", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "rc-resize-observer": "^0.2.3", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-descriptions/node_modules/rc-resize-observer": { - "version": "0.2.6", - "resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-0.2.6.tgz", - "integrity": "sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==", - "dependencies": { - "@babel/runtime": "^7.10.1", - "classnames": "^2.2.1", - "rc-util": "^5.0.0", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@ant-design/pro-field": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-field/-/pro-field-3.1.0.tgz", - "integrity": "sha512-+Dgp31WjD+iwg9KIRAMgNkfQivkJKMcYBrIBmho1e8ep/O0HgWSp48g70tBIWi/Lfem/Ky2schF7O8XCFouczw==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "@chenshuai2144/sketch-color": "^1.0.8", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-util": "^5.4.0", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-field/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-form": { - "version": "2.32.0", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-form/-/pro-form-2.32.0.tgz", - "integrity": "sha512-GZnVAMeYv+YHJb17lJ7rX5PYuQPvEA6EotQnPbHi9tGLN3PfexcAd21rqzuO+OrulU2x7TEMDIxtY9MzvvOGbg==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-field": "3.1.0", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "@chenshuai2144/sketch-color": "^1.0.7", - "@umijs/use-params": "^1.0.9", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.0.6" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "rc-field-form": ">=1.22.0", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-form/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-layout": { - "version": "7.22.7", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-layout/-/pro-layout-7.22.7.tgz", - "integrity": "sha512-fvmtNA1r9SaasVIQIQt611VSlNxtVxDbQ3e+1GhYQza3tVJi/3gCZuDyfMfTnbLmf3PaW/YvLkn7MqDbzAzoLA==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "@umijs/route-utils": "^4.0.0", - "@umijs/use-params": "^1.0.9", - "classnames": "^2.3.2", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "path-to-regexp": "8.2.0", - "rc-resize-observer": "^1.1.0", - "rc-util": "^5.0.6", - "swr": "^2.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-layout/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-list": { - "version": "2.6.10", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-list/-/pro-list-2.6.10.tgz", - "integrity": "sha512-xSWwnqCr+hPEYR4qY7nFUaxO5RQBxNlFaPNmobP2i+Im31slk9JuAusgWeIYO0mNhLJuLbxd8CCma2AZij3fBQ==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-card": "2.10.0", - "@ant-design/pro-field": "3.1.0", - "@ant-design/pro-table": "3.21.0", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "rc-resize-observer": "^1.0.0", - "rc-util": "^4.19.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/@ant-design/icons/node_modules/rc-util": { - "version": "5.44.4", - "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz", - "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "react-is": "^18.2.0" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/@ant-design/icons/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/@ant-design/pro-list/node_modules/rc-util": { - "version": "4.21.1", - "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-4.21.1.tgz", - "integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==", - "dependencies": { - "add-dom-event-listener": "^1.1.0", - "prop-types": "^15.5.10", - "react-is": "^16.12.0", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.1.0" - } - }, - "node_modules/@ant-design/pro-list/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/@ant-design/pro-provider": { - "version": "2.16.2", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-provider/-/pro-provider-2.16.2.tgz", - "integrity": "sha512-0KmCH1EaOND787Jz6VRMYtLNZmqfT0JPjdUfxhyOxFfnBRfrjyfZgIa6CQoAJLEUMWv57PccWS8wRHVUUk2Yiw==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@babel/runtime": "^7.18.0", - "@ctrl/tinycolor": "^3.4.0", - "dayjs": "^1.11.10", - "rc-util": "^5.0.1", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-skeleton": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-skeleton/-/pro-skeleton-2.2.1.tgz", - "integrity": "sha512-3M2jNOZQZWEDR8pheY00OkHREfb0rquvFZLCa6DypGmiksiuuYuR9Y4iA82ZF+mva2FmpHekdwbje/GpbxqBeg==", - "dependencies": { - "@babel/runtime": "^7.18.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-table": { - "version": "3.21.0", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-table/-/pro-table-3.21.0.tgz", - "integrity": "sha512-sI81d3FYRv5sXamUc+M5CsHZ9CchuUQgOAPzo5H4oPAVL5h+mkYGRsBzPsxQX7khTNpWjrAtPoRm5ipx3vvWog==", - "dependencies": { - "@ant-design/cssinjs": "^1.21.1", - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-card": "2.10.0", - "@ant-design/pro-field": "3.1.0", - "@ant-design/pro-form": "2.32.0", - "@ant-design/pro-provider": "2.16.2", - "@ant-design/pro-utils": "2.18.0", - "@babel/runtime": "^7.18.0", - "@dnd-kit/core": "^6.0.8", - "@dnd-kit/modifiers": "^6.0.1", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.1", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-resize-observer": "^1.0.0", - "rc-util": "^5.0.1" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "rc-field-form": ">=1.22.0", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-table/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/@ant-design/pro-utils": { - "version": "2.18.0", - "resolved": "https://registry.npmmirror.com/@ant-design/pro-utils/-/pro-utils-2.18.0.tgz", - "integrity": "sha512-8+ikyrN8L8a8Ph4oeHTOJEiranTj18+9+WHCHjKNdEfukI7Rjn8xpYdLJWb2AUJkb9d4eoAqjd5+k+7w81Df0w==", - "dependencies": { - "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.16.2", - "@babel/runtime": "^7.18.0", - "classnames": "^2.3.2", - "dayjs": "^1.11.10", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "rc-util": "^5.0.6", - "safe-stable-stringify": "^2.4.3", - "swr": "^2.0.0" - }, - "peerDependencies": { - "antd": "^4.24.15 || ^5.11.2", - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@ant-design/pro-utils/node_modules/@ant-design/icons": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.6.1.tgz", - "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", - "dependencies": { - "@ant-design/colors": "^7.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@babel/runtime": "^7.24.8", - "classnames": "^2.2.6", - "rc-util": "^5.31.1" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, "node_modules/@ant-design/react-slick": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz", @@ -2107,18 +1645,6 @@ "node": ">=6.9.0" } }, - "node_modules/@chenshuai2144/sketch-color": { - "version": "1.0.9", - "resolved": "https://registry.npmmirror.com/@chenshuai2144/sketch-color/-/sketch-color-1.0.9.tgz", - "integrity": "sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==", - "dependencies": { - "reactcss": "^1.2.3", - "tinycolor2": "^1.4.2" - }, - "peerDependencies": { - "react": ">=16.12.0" - } - }, "node_modules/@codemirror/autocomplete": { "version": "6.18.6", "resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", @@ -2234,76 +1760,6 @@ "w3c-keyname": "^2.2.4" } }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/modifiers": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz", - "integrity": "sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==", - "dependencies": { - "@dnd-kit/utilities": "^3.2.1", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.0.6", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "7.0.2", - "resolved": "https://registry.npmmirror.com/@dnd-kit/sortable/-/sortable-7.0.2.tgz", - "integrity": "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==", - "dependencies": { - "@dnd-kit/utilities": "^3.2.0", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.0.7", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmmirror.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.4.3.tgz", @@ -2952,12 +2408,12 @@ } }, "node_modules/@flowgram.ai/background-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/background-plugin/-/background-plugin-0.3.4.tgz", - "integrity": "sha512-fGJZIIaGVQwVs0fTd5dHjRnxQEzpZqtqPaHfyh40CX33x7NjtgPIPwUoNMkVoQ7+IFJAvNxShqiVAbkTbbxdYQ==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2967,11 +2423,11 @@ } }, "node_modules/@flowgram.ai/command": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/command/-/command-0.3.4.tgz", - "integrity": "sha512-Vl/eX/mt78UThjpiU0iVD7BGNU/zus3lOrlGNt+fOjdr9QsOtDu6R4jjUA/6lxWGMuiEkVhFupILEhK3kVe9zA==", + "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==", "dependencies": { - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -2981,12 +2437,12 @@ } }, "node_modules/@flowgram.ai/core": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/core/-/core-0.3.4.tgz", - "integrity": "sha512-bs0UwHNkc9pprx3R3HiOGRL9BmDuoxMCdAZH+mrJecq17axzqt2X+qUNtCnji7CHVHw/r11oJy2DsJot52iaIg==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/core/-/core-0.3.5.tgz", + "integrity": "sha512-XrrogUnSjari3FipYUqpyiPKy30vewI5Jp9khRgyXc9cZiLVbdOd8Ki/LzHyxQc0E5R2H84XHHCpt1eWcKGMew==", "dependencies": { - "@flowgram.ai/command": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/command": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "@phosphor/messaging": "^1.3.0", "@tweenjs/tween.js": "^18", "clsx": "^1.1.1", @@ -3026,12 +2482,12 @@ } }, "node_modules/@flowgram.ai/document": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/document/-/document-0.3.4.tgz", - "integrity": "sha512-tLftf4Z90EGBEaweYGczE5RZLK0DGAQ6Z9QB3BANpf1QjzYeKZNcucDLqJk6f/WqInjVzYDqBt0me9O8/FpEdQ==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/document/-/document-0.3.5.tgz", + "integrity": "sha512-Y6Rrka33peD56bfJ5kDm2Ah+aDXiLJZdhepVoyvVBupySDnsGvAl7D4s0/dev+zQb6XsatgWAJf1SZ3UzdeTxQ==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.2", @@ -3056,29 +2512,29 @@ } }, "node_modules/@flowgram.ai/editor": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/editor/-/editor-0.3.4.tgz", - "integrity": "sha512-MTcE33V48U44aJ2EDpGpsc4H/ve7s24JKy/xK16sT1RhkN8YqYgbR/W1l8ftQ/ofudMgbnrhYqUK6qVGf7HYNw==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/editor/-/editor-0.3.5.tgz", + "integrity": "sha512-/DCivTv4Gog8bXJ/qL10CTAGcwitnP3+Mnb6bJAjwvfX/y5FCD0OL9SKRIVXQhip4zxmFrmZmwnswJPnpbvxtA==", "dependencies": { - "@flowgram.ai/background-plugin": "0.3.4", - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/group-plugin": "0.3.4", - "@flowgram.ai/history": "0.3.4", - "@flowgram.ai/history-node-plugin": "0.3.4", - "@flowgram.ai/i18n-plugin": "0.3.4", - "@flowgram.ai/materials-plugin": "0.3.4", - "@flowgram.ai/node": "0.3.4", - "@flowgram.ai/node-core-plugin": "0.3.4", - "@flowgram.ai/node-variable-plugin": "0.3.4", - "@flowgram.ai/playground-react": "0.3.4", - "@flowgram.ai/redux-devtool-plugin": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", - "@flowgram.ai/shortcuts-plugin": "0.3.4", - "@flowgram.ai/utils": "0.3.4", - "@flowgram.ai/variable-plugin": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3088,13 +2544,13 @@ } }, "node_modules/@flowgram.ai/fixed-drag-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-drag-plugin/-/fixed-drag-plugin-0.3.4.tgz", - "integrity": "sha512-yNz6giVOFAe1fZpqyqvupmRE78mWftoQmz9L+fXTaYJjmGPgTi5KlwwncoCM8xN7pJ5Dq30VXF5AlYmELThjBQ==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/renderer": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3104,29 +2560,29 @@ } }, "node_modules/@flowgram.ai/fixed-history-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-history-plugin/-/fixed-history-plugin-0.3.4.tgz", - "integrity": "sha512-L9nKjBH6QUZc9jIfaXmuNOt4fQXYfbB4gS+Ife7G0o2IJteLYUm0i7D02ohRt/B8OYXVL/TUqWLWtOrUcgtPBg==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/history": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" } }, "node_modules/@flowgram.ai/fixed-layout-core": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-core/-/fixed-layout-core-0.3.4.tgz", - "integrity": "sha512-gFnHCBjVTJc5V0UC5Y7KNLMhQuXfpuPItpdwMQYre8xOicxuStdll4SIzBPFm+ihPnO4ymymKeWdl2cAHP1zYg==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/renderer": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3137,19 +2593,19 @@ } }, "node_modules/@flowgram.ai/fixed-layout-editor": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/fixed-layout-editor/-/fixed-layout-editor-0.3.4.tgz", - "integrity": "sha512-vgCUiPHCEWdsnuM97SGAPji04ld3QurLaHJ8AexNmYXHW2vQn27RFATaSmX54rD4K8SE7/hcgIm9aJQQ8cr+Ig==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/editor": "0.3.4", - "@flowgram.ai/fixed-drag-plugin": "0.3.4", - "@flowgram.ai/fixed-history-plugin": "0.3.4", - "@flowgram.ai/fixed-layout-core": "0.3.4", - "@flowgram.ai/history": "0.3.4", - "@flowgram.ai/reactive": "0.3.4", - "@flowgram.ai/select-box-plugin": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3159,12 +2615,12 @@ } }, "node_modules/@flowgram.ai/form": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/form/-/form-0.3.4.tgz", - "integrity": "sha512-3566t7gDGKodpDlo6tnq0IjmIxysqRgf+aq0pgVBeJemalgameHXCEqee8nq7TEemE1fqA5ivHW1q4bdbYouiw==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/form/-/form-0.3.5.tgz", + "integrity": "sha512-PmoG4k+aAdzt0v2aZKb3A/ArpUe0NKsACU68185PyXfGl8AU+GWP8ujdx3txKm2VTVEDjOFWsLSMh1/3RkRgkA==", "dependencies": { - "@flowgram.ai/reactive": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/reactive": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "fast-equals": "^2.0.0", "lodash": "^4.17.21", "nanoid": "^4.0.2" @@ -3175,13 +2631,13 @@ } }, "node_modules/@flowgram.ai/form-core": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/form-core/-/form-core-0.3.4.tgz", - "integrity": "sha512-MNDO2Opl77vgybTJ9R4NDmkRSGXuMopdQei7MC4vckYIqxTQiCbn/NxplFjwa3KpXBdMABjdlRT9ROWzk8kYKA==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/form-core/-/form-core-0.3.5.tgz", + "integrity": "sha512-fgzjJT9cUIYcclRSbMfoAHS9hqN8AvbvaZcx2EXlQDVpGAZsrTrMe4WmPe1mQ3eCakj9oj4VKqu8kipfT6spSg==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3209,16 +2665,16 @@ } }, "node_modules/@flowgram.ai/free-layout-core": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/free-layout-core/-/free-layout-core-0.3.4.tgz", - "integrity": "sha512-DU+ZPYvtKEF0DiXJw+QSDPPhbs5Wl6vR7bKHChweveKzXqBD3glCBOYl3tWFN92Jkvequ9lj7glmngTj8KsT/Q==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/node": "0.3.4", - "@flowgram.ai/reactive": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "lodash-es": "^4.17.21", "nanoid": "^4.0.2", @@ -3247,14 +2703,14 @@ } }, "node_modules/@flowgram.ai/group-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/group-plugin/-/group-plugin-0.3.4.tgz", - "integrity": "sha512-rqUo7PYhnaRousBIlQIP65JOjN65ssf6GoifkR1xLEVKhNimdVe6A0pGQ5QfUdCAJy/CgXW+Z1MVGLU1vGouLQ==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/renderer": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3264,12 +2720,12 @@ } }, "node_modules/@flowgram.ai/history": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/history/-/history-0.3.4.tgz", - "integrity": "sha512-Q72BwZtAeTBS2QGx12qM+3vdx4COG+Lj8asWrebO9Af1FTMJzqyn1OgwkUfywn6XW3qowb7I+w1daedUZLnDhw==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/history/-/history-0.3.5.tgz", + "integrity": "sha512-G0vU9vNJdpbHSnBx8GG8VOyTfD5Qy4L4j8S577SHl3RxhIIh7vr1tm5REEzzhxJWsvOID+v1+73XhSTzTmVi8w==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.2", @@ -3277,17 +2733,17 @@ } }, "node_modules/@flowgram.ai/history-node-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/history-node-plugin/-/history-node-plugin-0.3.4.tgz", - "integrity": "sha512-yLqU7l7YVbWVvXBWRlUaGAVxDm5KyKVjIcCPfSm4roIPyS96+SElRpj4949emucW38UtstBVsNnpFZ5WV9EStw==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/history": "0.3.4", - "@flowgram.ai/node": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3316,32 +2772,32 @@ } }, "node_modules/@flowgram.ai/i18n": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n/-/i18n-0.3.4.tgz", - "integrity": "sha512-SLn7A6x/bnuLqAZo1R4QGZR/i7Pex6/48AW0rokUgair9qm3sMpnX82DCltjG4GbddiKeUPkJLv9KLb7XaAN5Q==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n/-/i18n-0.3.5.tgz", + "integrity": "sha512-5G4wMZ3QjCIEeU2g0Cqa+vjvEoVZxs/hFx/9AV1HusBBDjeV3LOod8AM50VwIDbL/nGjLHQo2e7Nf6WBMOj86Q==", "dependencies": { - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/utils": "0.3.5", "i18n-js": "^4.5.1" } }, "node_modules/@flowgram.ai/i18n-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/i18n-plugin/-/i18n-plugin-0.3.4.tgz", - "integrity": "sha512-XB5uGA+R5d2lbLT7jR8FCz8cguGXxVfE1CFk1KxkG9nCCvlv5ZT1kz8/Lcn1DQkALpK1LOElqCax2YG7vHhYXg==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/i18n": "0.3.4" + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/i18n": "0.3.5" } }, "node_modules/@flowgram.ai/materials-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/materials-plugin/-/materials-plugin-0.3.4.tgz", - "integrity": "sha512-3voP3+AH0QnJdroh5GxLOI/JFajYaUVuCPioWC9paHJv8Jp3KBxjbq68HWMEhT37y5yuMFyRH7G62fp9GdMLGg==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3352,14 +2808,14 @@ } }, "node_modules/@flowgram.ai/minimap-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/minimap-plugin/-/minimap-plugin-0.3.4.tgz", - "integrity": "sha512-iqy4VPqOee1HQwYtp659i8xWWCaHYiBK8EOOcfxhDonhSwXKTm+NxfcLFUUzTvEwG54yqMcxfgXjTX0YeDsdKA==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/minimap-plugin/-/minimap-plugin-0.3.5.tgz", + "integrity": "sha512-+mQx4SoaoA0EghPRmBxqIK5jbHQrzswfg9CQ3kqk5Yu5rhPTpmr+IaHbRK6FWpuehJZNxkjcUKAY705rtFIZcA==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/renderer": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3371,15 +2827,15 @@ } }, "node_modules/@flowgram.ai/node": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/node/-/node-0.3.4.tgz", - "integrity": "sha512-r/21XzWZIk7YKWkEF1vimv2jPLYQmsdh0qXfO7sYBwqIH2CrcwPAtH4nVNkvZ/EjUf2q7ZoXc1Ur6MI3IFI+EQ==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/node/-/node-0.3.5.tgz", + "integrity": "sha512-OQvcuMH3T+l9RCXfAt4tWX6tijXtCp/Kkp/pcoNFfJ7o1abfRHMKEE66i51TPn89MYrIjRxH0GY+qcm9UOuiQQ==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "lodash": "^4.17.21", "nanoid": "^4.0.2", @@ -3391,16 +2847,16 @@ } }, "node_modules/@flowgram.ai/node-core-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/node-core-plugin/-/node-core-plugin-0.3.4.tgz", - "integrity": "sha512-aGYp0tfSwFsz4qYTXD55Rgpdt5kUM2aus/5ZKfVbLpvNjGJis7lYbwvlLy3RwEXQActyHaEV+YEIGqcQ14hZXA==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/node": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3411,16 +2867,16 @@ } }, "node_modules/@flowgram.ai/node-variable-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/node-variable-plugin/-/node-variable-plugin-0.3.4.tgz", - "integrity": "sha512-u4QGhxpGKTy+2FC/fO6FzCf+JdgFbcT4WDJymlRv7KgeGWSlAOX1WC2ZgmfwBMSbRcpevJe7vUmUrP5RTSN8nA==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/form-core": "0.3.4", - "@flowgram.ai/node": "0.3.4", - "@flowgram.ai/utils": "0.3.4", - "@flowgram.ai/variable-plugin": "0.3.4", + "@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", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3449,14 +2905,14 @@ } }, "node_modules/@flowgram.ai/playground-react": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/playground-react/-/playground-react-0.3.4.tgz", - "integrity": "sha512-o3+8QJC/Z/7+bcxLkGVScZZCVgP/zmJQaFUYcvAjElw+UPnYJ6gukyYwrTkNpUlXZq2dqGYjUSrIrWZlf/03/Q==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/playground-react/-/playground-react-0.3.5.tgz", + "integrity": "sha512-zBcHDS7hQ58F4o3yw0eGNv3U2qcp2qvdRJmHD0oyyCCfygBk1iqycqB8mK0J0CaferPIr7xf7CW4QAsJ/EAvbQ==", "dependencies": { - "@flowgram.ai/background-plugin": "0.3.4", - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/shortcuts-plugin": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3466,11 +2922,11 @@ } }, "node_modules/@flowgram.ai/reactive": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/reactive/-/reactive-0.3.4.tgz", - "integrity": "sha512-A+XrcromfG0+1HzngwanYEVcb42OltqCE7ua1JKBhr9JzvoyFf6wWyDCm8P8Q0JF20vHC/60A+CazBbyBIwATg==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/reactive/-/reactive-0.3.5.tgz", + "integrity": "sha512-qzb7bB7SXk2JkikaCRxzKAs5rvSJqAfCCSwgbXSo3/1r4XsARuGYE0iyoobl0Fa4gD9kUk1FSv7htsxTqja9SQ==", "dependencies": { - "@flowgram.ai/utils": "0.3.4" + "@flowgram.ai/utils": "0.3.5" }, "peerDependencies": { "react": ">=16.8", @@ -3478,12 +2934,12 @@ } }, "node_modules/@flowgram.ai/redux-devtool-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/redux-devtool-plugin/-/redux-devtool-plugin-0.3.4.tgz", - "integrity": "sha512-kBjIlIJQMQj+lDSHCScpFv/9a3KLFNPTW2ssWm5RPrqxI2OF7ghXAV9Gk+AFnDCHSOy57g8XbSOIZYbBWJiOMg==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/variable-core": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/variable-core": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -3538,14 +2994,14 @@ } }, "node_modules/@flowgram.ai/renderer": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/renderer/-/renderer-0.3.4.tgz", - "integrity": "sha512-sN/7rmC0uWpTXVY/lGYFRP+UJcNDcYoBEap5+KxhwMGCC5XbEWTp9+Y4NYJIs/Ephq+7S2um5Ue3lNhg2Lry5Q==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/renderer/-/renderer-0.3.5.tgz", + "integrity": "sha512-YheWVjZ1CUIUfjfQwf7G/4jeyWsYWKG9+4zJW+co5U8isNAnVH2l+8Ahibx5fOIEnmzerOVRN73dKSSetwDdPg==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/i18n": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/i18n": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "lodash": "^4.17.21", "reflect-metadata": "~0.2.2" @@ -3556,12 +3012,12 @@ } }, "node_modules/@flowgram.ai/select-box-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/select-box-plugin/-/select-box-plugin-0.3.4.tgz", - "integrity": "sha512-mqSw5Ayuk/ieBiE4Tqvz6NJW+WVT9qLpnER6MUFAwNFoQAFO5unXx/rF6UjH/42EnM1XCUEHkaJ58nuCOQzMgQ==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/renderer": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/renderer": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2" }, @@ -3571,13 +3027,13 @@ } }, "node_modules/@flowgram.ai/shortcuts-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/shortcuts-plugin/-/shortcuts-plugin-0.3.4.tgz", - "integrity": "sha512-XeUGslbb3yHyoS9dmPno4bvOQRcCeUvmsRXeAg4I0k7Vgs2IeubJPOy1+HbA+SPkHXLOEqBUJExzrbG5+TTmmw==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/document": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -3632,9 +3088,9 @@ } }, "node_modules/@flowgram.ai/utils": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/utils/-/utils-0.3.4.tgz", - "integrity": "sha512-wtgYpcBciubTODOpx+Qls9B5YNmKwvVDiLksWoehhYKH9PlrFSAgnwskNC37M5I+a3AAHFKQT3HUpo9T2CZiOw==", + "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==", "dependencies": { "clsx": "^1.1.1", "inversify": "^6.0.1", @@ -3672,12 +3128,12 @@ } }, "node_modules/@flowgram.ai/variable-core": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-core/-/variable-core-0.3.4.tgz", - "integrity": "sha512-qomM9Pc38Su/Kis0MymbK/zbYca3zXEfIWwIO3RpHURBUXsVsMjLKPEMjGd6sHewlHDzu+wBep3p0Yn+37fS7A==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", + "@flowgram.ai/core": "0.3.5", + "@flowgram.ai/utils": "0.3.5", "fast-equals": "^2.0.0", "inversify": "^6.0.1", "lodash": "^4.17.21", @@ -3708,15 +3164,15 @@ } }, "node_modules/@flowgram.ai/variable-layout": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-layout/-/variable-layout-0.3.4.tgz", - "integrity": "sha512-6tSsUNbf9tC9DvAD1BX0gWSpxEcs2DNyexnfDqTx4I4bRHqV7wHbVZfCfgWqkORuTBHxTkr+kVW4wFwpaV5dBQ==", + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-layout/-/variable-layout-0.3.5.tgz", + "integrity": "sha512-ah0J5Jzj0nDHNMdjMrZ7VJtxi5DkVgolNhLjN6HyoC4JyxRTMqDSwT1JQI09pLoxqhC+LuEZ4D36eJqAY883uw==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/free-layout-core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", - "@flowgram.ai/variable-core": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -3771,16 +3227,16 @@ } }, "node_modules/@flowgram.ai/variable-plugin": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/@flowgram.ai/variable-plugin/-/variable-plugin-0.3.4.tgz", - "integrity": "sha512-RJ+kyNiyJ/pP9scP0OtZ04zfnl7vTJ2KbmEOXEFQ+RGcLpfrf60L4hg6tjZWgdljG9aU0KWgY3YkyFhbERDJXQ==", + "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==", "dependencies": { - "@flowgram.ai/core": "0.3.4", - "@flowgram.ai/document": "0.3.4", - "@flowgram.ai/free-layout-core": "0.3.4", - "@flowgram.ai/utils": "0.3.4", - "@flowgram.ai/variable-core": "0.3.4", - "@flowgram.ai/variable-layout": "0.3.4", + "@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", "inversify": "^6.0.1", "reflect-metadata": "~0.2.2", "styled-components": "^5" @@ -4234,19 +3690,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/util": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/@rc-component/util/-/util-1.2.2.tgz", - "integrity": "sha512-p3zQr9Wu8BKncqmuW23olzBoAFsN8PYMS9FaI4JwJLwknH7DvfHAr1fwbfl9aAWw4Jva64ucpenbgG4fznLUSw==", - "dependencies": { - "is-mobile": "^5.0.0", - "react-is": "^18.2.0" - }, - "peerDependencies": { - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -4967,16 +4410,16 @@ "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", - "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", + "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/type-utils": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/type-utils": "8.39.1", + "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -4990,7 +4433,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.39.0", + "@typescript-eslint/parser": "^8.39.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -5005,15 +4448,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.39.0.tgz", - "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.39.1.tgz", + "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4" }, "engines": { @@ -5029,13 +4472,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" }, "engines": { @@ -5050,13 +4493,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5067,9 +4510,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5083,14 +4526,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", - "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", + "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5107,9 +4550,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5120,15 +4563,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5148,15 +4591,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5171,12 +4614,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5279,19 +4722,6 @@ "react-dom": ">=17.0.0" } }, - "node_modules/@umijs/route-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/@umijs/route-utils/-/route-utils-4.0.1.tgz", - "integrity": "sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==" - }, - "node_modules/@umijs/use-params": { - "version": "1.0.9", - "resolved": "https://registry.npmmirror.com/@umijs/use-params/-/use-params-1.0.9.tgz", - "integrity": "sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==", - "peerDependencies": { - "react": "*" - } - }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.9.2", "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz", @@ -5609,14 +5039,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/add-dom-event-listener": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz", - "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==", - "dependencies": { - "object-assign": "4.x" - } - }, "node_modules/ahooks": { "version": "3.9.0", "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.0.tgz", @@ -5672,9 +5094,9 @@ } }, "node_modules/antd": { - "version": "5.26.7", - "resolved": "https://registry.npmmirror.com/antd/-/antd-5.26.7.tgz", - "integrity": "sha512-iCyXN6+i2CUVEOSzzJKfbKeg115qoJhGvSkCh5uzAf9hANwHUOJQhsMn+KtN+Lx/2NQ6wfM7nGZ+7NPNO5Pn1w==", + "version": "5.27.0", + "resolved": "https://registry.npmmirror.com/antd/-/antd-5.27.0.tgz", + "integrity": "sha512-o54dmpooLOc08RSGCkeEQBYAGPxUSmnhmYJKCNTHH46vzjOVxdteu+wPTRVkRbAkDTbs2VcNr5VL7Lu67rPIiA==", "dependencies": { "@ant-design/colors": "^7.2.1", "@ant-design/cssinjs": "^1.23.0", @@ -5716,8 +5138,8 @@ "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", "rc-table": "~7.51.1", - "rc-tabs": "~15.6.1", - "rc-textarea": "~1.10.1", + "rc-tabs": "~15.7.0", + "rc-textarea": "~1.10.2", "rc-tooltip": "~6.4.0", "rc-tree": "~5.13.1", "rc-tree-select": "~5.27.0", @@ -6448,14 +5870,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.4.tgz", @@ -7635,9 +7049,9 @@ } }, "node_modules/i18next": { - "version": "25.3.2", - "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.3.2.tgz", - "integrity": "sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==", + "version": "25.3.4", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.3.4.tgz", + "integrity": "sha512-AHklEYFLiRRxW1Cb6zE9lfnEtYvsydRC8nRS3RSKGX3zCqZ8nLZwMaUsrb80YuccPNv2RNokDL8LkTNnp+6mDw==", "funding": [ { "type": "individual", @@ -7941,11 +7355,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-mobile": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/is-mobile/-/is-mobile-5.0.0.tgz", - "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==" - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -8902,14 +8311,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "engines": { - "node": ">=16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", @@ -9546,9 +8947,9 @@ } }, "node_modules/rc-tabs": { - "version": "15.6.1", - "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.6.1.tgz", - "integrity": "sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==", + "version": "15.7.0", + "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.7.0.tgz", + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", @@ -9747,11 +9148,6 @@ "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", @@ -9797,14 +9193,6 @@ "react-dom": ">=18" } }, - "node_modules/reactcss": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/reactcss/-/reactcss-1.2.3.tgz", - "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", - "dependencies": { - "lodash": "^4.0.1" - } - }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", @@ -10125,14 +9513,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "engines": { - "node": ">=10" - } - }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", @@ -10580,18 +9960,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swr": { - "version": "2.3.4", - "resolved": "https://registry.npmmirror.com/swr/-/swr-2.3.4.tgz", - "integrity": "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.11.11.tgz", @@ -10710,11 +10078,6 @@ "node": ">=12.22" } }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -10944,15 +10307,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.39.0.tgz", - "integrity": "sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==", + "version": "8.39.1", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.39.1.tgz", + "integrity": "sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0" + "@typescript-eslint/eslint-plugin": "8.39.1", + "@typescript-eslint/parser": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11115,6 +10478,8 @@ "version": "1.4.0", "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "optional": true, + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -11232,14 +10597,6 @@ "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", @@ -11387,9 +10744,9 @@ } }, "node_modules/zod": { - "version": "4.0.16", - "resolved": "https://registry.npmmirror.com/zod/-/zod-4.0.16.tgz", - "integrity": "sha512-Djo/cM339grjI7/HmN+ixYO2FzEMcWr/On50UlQ/RjrWK1I/hPpWhpC76heCptnRFpH0LMwrEbUY50HDc0V8wg==", + "version": "4.0.17", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.0.17.tgz", + "integrity": "sha512-1PHjlYRevNxxdy2JZ8JcNAw7rX8V9P1AKkP+x/xZfxB0K5FYfuV+Ug6P/6NVSR2jHQ+FzDDoDHS04nYUsOIyLQ==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/ui/package.json b/ui/package.json index 42744c9f..78b7ede4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,26 +9,24 @@ "preview": "vite preview" }, "dependencies": { - "@ant-design/icons": "^6.0.0", - "@ant-design/pro-components": "^2.8.10", "@codemirror/lang-json": "^6.0.2", "@codemirror/lang-yaml": "^6.1.2", "@codemirror/language": "^6.11.2", "@codemirror/legacy-modes": "^6.5.1", - "@flowgram.ai/document": "^0.3.4", - "@flowgram.ai/fixed-layout-editor": "^0.3.4", - "@flowgram.ai/minimap-plugin": "^0.3.4", + "@flowgram.ai/document": "^0.3.5", + "@flowgram.ai/fixed-layout-editor": "^0.3.5", + "@flowgram.ai/minimap-plugin": "^0.3.5", "@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", "ahooks": "^3.9.0", - "antd": "^5.26.7", + "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.2", + "i18next": "^25.3.4", "i18next-browser-languagedetector": "^8.2.0", "immer": "^10.1.1", "nanoid": "^5.1.5", @@ -40,7 +38,7 @@ "react-i18next": "^15.6.1", "react-router-dom": "^7.8.0", "tailwind-merge": "^3.3.1", - "zod": "^4.0.16", + "zod": "^4.0.17", "zustand": "^5.0.7" }, "devDependencies": { @@ -67,7 +65,7 @@ "prettier": "^3.6.2", "tailwindcss": "^4.1.11", "typescript": "^5.8.3", - "typescript-eslint": "^8.39.0", + "typescript-eslint": "^8.39.1", "vite": "^6.3.5" } } diff --git a/ui/src/components/AppDocument.tsx b/ui/src/components/AppDocument.tsx index 0aac68b2..ef738d99 100644 --- a/ui/src/components/AppDocument.tsx +++ b/ui/src/components/AppDocument.tsx @@ -10,9 +10,7 @@ export interface AppDocumentLinkButtonProps { showIcon?: boolean; } -const AppDocumentLinkButton = (props: AppDocumentLinkButtonProps) => { - const { className, style, showIcon = true } = props; - +const AppDocumentLinkButton = ({ className, style, showIcon = true }: AppDocumentLinkButtonProps) => { const { i18n, t } = useTranslation(); const handleDocumentClick = () => { diff --git a/ui/src/components/AppLocale.tsx b/ui/src/components/AppLocale.tsx index 4a50ed65..a97387b4 100644 --- a/ui/src/components/AppLocale.tsx +++ b/ui/src/components/AppLocale.tsx @@ -30,9 +30,7 @@ export interface AppLocaleDropdownProps { trigger?: DropdownProps["trigger"]; } -const AppLocaleDropdown = (props: AppLocaleDropdownProps) => { - const { children, trigger = ["click"] } = props; - +const AppLocaleDropdown = ({ children, trigger = ["click"] }: AppLocaleDropdownProps) => { const items = useAppLocaleMenuItems(); return ( @@ -62,9 +60,7 @@ export interface AppLocaleLinkButtonProps { showIcon?: boolean; } -const AppLocaleLinkButton = (props: AppLocaleLinkButtonProps) => { - const { className, style, showIcon = true } = props; - +const AppLocaleLinkButton = ({ className, style, showIcon = true }: AppLocaleLinkButtonProps) => { const { t } = useTranslation(); const { i18n } = useTranslation(); diff --git a/ui/src/components/AppTheme.tsx b/ui/src/components/AppTheme.tsx index 0499859b..b138d637 100644 --- a/ui/src/components/AppTheme.tsx +++ b/ui/src/components/AppTheme.tsx @@ -39,9 +39,7 @@ export interface AppThemeDropdownProps { trigger?: DropdownProps["trigger"]; } -const AppThemeDropdown = (props: AppThemeDropdownProps) => { - const { children, trigger = ["click"] } = props; - +const AppThemeDropdown = ({ children, trigger = ["click"] }: AppThemeDropdownProps) => { const items = useAppThemeMenuItems(); return ( @@ -65,9 +63,7 @@ export interface AppThemeLinkButtonProps { showIcon?: boolean; } -const AppThemeLinkButton = (props: AppThemeLinkButtonProps) => { - const { className, style, showIcon = true } = props; - +const AppThemeLinkButton = ({ className, style, showIcon = true }: AppThemeLinkButtonProps) => { const { t } = useTranslation(); const { themeMode } = useBrowserTheme(); diff --git a/ui/src/components/AppVersion.tsx b/ui/src/components/AppVersion.tsx index dbde4e39..23f1252b 100644 --- a/ui/src/components/AppVersion.tsx +++ b/ui/src/components/AppVersion.tsx @@ -25,7 +25,7 @@ export interface AppVersionBadgeProps { } const AppVersionBadge = ({ className, style, children }: AppVersionBadgeProps) => { - const { hasNewVersion } = useVersionChecker(); + const { hasUpdate } = useVersionChecker(); return ( {children} diff --git a/ui/src/components/Tips.tsx b/ui/src/components/Tips.tsx index 84aa210a..fdf19d25 100644 --- a/ui/src/components/Tips.tsx +++ b/ui/src/components/Tips.tsx @@ -16,10 +16,12 @@ const Tips = ({ className, style, message }: TipsProps) => { style={style} message={ -
- +
+ +
+
+ {message}
- {message} } type="info" diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index dff1f069..8ce53863 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -139,12 +139,6 @@ const AccessForm = forwardRef(({ className, console.warn(`[certimate] unsupported provider usage: '${usage}'`); } }, [usage]); - const providerTooltip = useMemo(() => { - switch (usage) { - case "dns-hosting": - return ; - } - }, [usage]); const fieldProvider = Form.useWatch["provider"]>("provider", formInst); const [fieldProviderPicked, setFieldProviderPicked] = useState(initialValues?.provider); // bugfix: Form.useWatch 在条件渲染下不生效,这里用单独的变量存放 Picker 组件选择的值 @@ -378,7 +372,12 @@ const AccessForm = forwardRef(({ className, - + : null} + rules={[formRule]} + > } > diff --git a/ui/src/components/access/AccessFormEmailConfig.tsx b/ui/src/components/access/AccessFormEmailConfig.tsx index 6b5df551..95148f79 100644 --- a/ui/src/components/access/AccessFormEmailConfig.tsx +++ b/ui/src/components/access/AccessFormEmailConfig.tsx @@ -117,7 +117,12 @@ const AccessFormEmailConfig = ({ form: formInst, formName, disabled, initialValu - + diff --git a/ui/src/components/access/AccessFormMattermostConfig.tsx b/ui/src/components/access/AccessFormMattermostConfig.tsx index c42a328e..881b43b4 100644 --- a/ui/src/components/access/AccessFormMattermostConfig.tsx +++ b/ui/src/components/access/AccessFormMattermostConfig.tsx @@ -67,6 +67,7 @@ const AccessFormMattermostConfig = ({ form: formInst, formName, disabled, initia } > diff --git a/ui/src/components/access/AccessFormSSHConfig.tsx b/ui/src/components/access/AccessFormSSHConfig.tsx index 53898f6a..0e9771f8 100644 --- a/ui/src/components/access/AccessFormSSHConfig.tsx +++ b/ui/src/components/access/AccessFormSSHConfig.tsx @@ -135,17 +135,14 @@ const AccessFormSSHConfig = ({ form: formInst, formName, disabled, initialValues
- + - -
- + +
{ - -
- + +
void; } -const AccessProviderPicker = ({ className, style, autoFocus, placeholder, showOptionTags, onFilter, onSelect, ...props }: AccessProviderPickerProps) => { - const { gap = "middle" } = props; - +const AccessProviderPicker = ({ className, style, autoFocus, gap = "middle", placeholder, showOptionTags, onFilter, onSelect }: AccessProviderPickerProps) => { const { t } = useTranslation(); const wrapperRef = useRef(null); @@ -99,7 +97,7 @@ const AccessProviderPicker = ({ className, style, autoFocus, placeholder, showOp return (
{ @@ -110,14 +108,18 @@ const AccessProviderPicker = ({ className, style, autoFocus, placeholder, showOp handleProviderTypeSelect(provider.type); }} > -
- } shape="square" size={28} /> -
-
- {t(provider.name) || "\u00A0"} +
+
+ } shape="square" size={32} /> +
+
+
+ + {t(provider.name) || "\u00A0"} +
-
+
{t("access.props.provider.builtin")} diff --git a/ui/src/components/provider/CAProviderSelect.tsx b/ui/src/components/provider/CAProviderSelect.tsx index c74059c6..ab89bd06 100644 --- a/ui/src/components/provider/CAProviderSelect.tsx +++ b/ui/src/components/provider/CAProviderSelect.tsx @@ -33,7 +33,7 @@ const CAProviderSelect = ({ onFilter, ...props }: CAProviderSelectProps) => { temp.unshift({ key: "", value: "", - label: t("provider.text.default_ca_provider.label"), + label: t("provider.text.default_ca_provider"), data: {} as CAProvider, }); @@ -45,7 +45,7 @@ const CAProviderSelect = ({ onFilter, ...props }: CAProviderSelectProps) => { return (
- {t("provider.text.default_ca_provider.label")} + {t("provider.text.default_ca_provider")}
); diff --git a/ui/src/components/provider/DeploymentProviderPicker.tsx b/ui/src/components/provider/DeploymentProviderPicker.tsx index 8b91a187..5e3dddcc 100644 --- a/ui/src/components/provider/DeploymentProviderPicker.tsx +++ b/ui/src/components/provider/DeploymentProviderPicker.tsx @@ -1,10 +1,12 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useSize } from "ahooks"; -import { Avatar, Card, Empty, Flex, Input, type InputRef, Tabs, Tooltip, Typography } from "antd"; +import { Avatar, Card, Checkbox, Empty, Flex, Input, type InputRef, Tabs, Tooltip, Typography } from "antd"; import Show from "@/components/Show"; import { DEPLOYMENT_CATEGORIES, type DeploymentProvider, deploymentProvidersMap } from "@/domain/provider"; +import { useZustandShallowSelector } from "@/hooks"; +import { useAccessesStore } from "@/stores/access"; import { mergeCls } from "@/utils/css"; export interface DeploymentProviderPickerProps { @@ -17,14 +19,19 @@ export interface DeploymentProviderPickerProps { onSelect?: (value: string) => void; } -const DeploymentProviderPicker = ({ className, style, autoFocus, onFilter, placeholder, onSelect, ...props }: DeploymentProviderPickerProps) => { - const { gap = "middle" } = props; - +const DeploymentProviderPicker = ({ className, style, autoFocus, gap = "middle", placeholder, onFilter, onSelect }: DeploymentProviderPickerProps) => { const { t } = useTranslation(); + const { accesses, fetchAccesses } = useAccessesStore(useZustandShallowSelector(["accesses", "fetchAccesses"])); + useEffect(() => { + fetchAccesses(false); + }, []); + const wrapperRef = useRef(null); const wrapperSize = useSize(wrapperRef); + const [isAvailableOnly, setIsAvailableOnly] = useState(true); + const [category, setCategory] = useState(DEPLOYMENT_CATEGORIES.ALL); const [keyword, setKeyword] = useState(); @@ -44,6 +51,13 @@ const DeploymentProviderPicker = ({ className, style, autoFocus, onFilter, place return true; }) + .filter((provider) => { + if (isAvailableOnly) { + return provider.builtin || accesses.some((access) => access.provider === provider.provider); + } + + return true; + }) .filter((provider) => { if (category && category !== DEPLOYMENT_CATEGORIES.ALL) { return provider.category === category; @@ -59,7 +73,7 @@ const DeploymentProviderPicker = ({ className, style, autoFocus, onFilter, place return true; }); - }, [onFilter, category, keyword]); + }, [onFilter, accesses, isAvailableOnly, category, keyword]); const providerCols = useMemo(() => { if (!wrapperSize) { return 1; @@ -77,6 +91,14 @@ const DeploymentProviderPicker = ({ className, style, autoFocus, onFilter, place
setKeyword(e.target.value.trim())} /> +
+ + setIsAvailableOnly(!isAvailableOnly)}> + {t("provider.text.show_available_hosting_provider_only")} + + +
+
- -
- } shape="square" size={28} /> -
-
+
+ } shape="square" size={28} /> +
+
+ {t(provider.name) || "\u00A0"} -
+
- +
); diff --git a/ui/src/components/workflow/WorkflowElement.tsx b/ui/src/components/workflow/WorkflowElement.tsx index 4e827f8d..7b1325a2 100644 --- a/ui/src/components/workflow/WorkflowElement.tsx +++ b/ui/src/components/workflow/WorkflowElement.tsx @@ -15,6 +15,10 @@ import StartNode from "./node/StartNode"; import UnknownNode from "./node/UnknownNode"; import UploadNode from "./node/UploadNode"; +/** + * + * @deprecated + */ export interface WorkflowElementProps { node: WorkflowNode; disabled?: boolean; diff --git a/ui/src/components/workflow/WorkflowElements.tsx b/ui/src/components/workflow/WorkflowElements.tsx index d3e772e3..c9d64876 100644 --- a/ui/src/components/workflow/WorkflowElements.tsx +++ b/ui/src/components/workflow/WorkflowElements.tsx @@ -5,6 +5,10 @@ import { WorkflowNodeType, newNode } from "@/domain/workflow"; import { useZustandShallowSelector } from "@/hooks"; import { useWorkflowStore } from "@/stores/workflow"; +/** + * + * @deprecated + */ export interface WorkflowElementsProps { className?: string; style?: React.CSSProperties; diff --git a/ui/src/components/workflow/WorkflowElementsContainer.tsx b/ui/src/components/workflow/WorkflowElementsContainer.tsx index 5cd0f29e..339315bc 100644 --- a/ui/src/components/workflow/WorkflowElementsContainer.tsx +++ b/ui/src/components/workflow/WorkflowElementsContainer.tsx @@ -5,6 +5,10 @@ import { Button, Card, Typography } from "antd"; import WorkflowElements from "@/components/workflow/WorkflowElements"; import { mergeCls } from "@/utils/css"; +/** + * + * @deprecated + */ export interface WorkflowElementsProps { className?: string; style?: React.CSSProperties; diff --git a/ui/src/components/workflow/WorkflowRunDetail.tsx b/ui/src/components/workflow/WorkflowRunDetail.tsx index 87bbef85..73efbedc 100644 --- a/ui/src/components/workflow/WorkflowRunDetail.tsx +++ b/ui/src/components/workflow/WorkflowRunDetail.tsx @@ -17,7 +17,7 @@ import { listByWorkflowRunId as listLogsByWorkflowRunId } from "@/repository/wor import { mergeCls } from "@/utils/css"; import { getErrMsg } from "@/utils/error"; -import WorkflowStatusIcon from "./WorkflowStatusIcon"; +import WorkflowStatus from "./WorkflowStatus"; export interface WorkflowRunDetailProps { className?: string; @@ -88,34 +88,6 @@ const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: strin const [showTimestamp, setShowTimestamp] = useState(true); const [showWhitespace, setShowWhitespace] = useState(true); - const renderBadge = () => { - let color: string | undefined; - - switch (runStatus) { - case WORKFLOW_RUN_STATUSES.PENDING: - break; - case WORKFLOW_RUN_STATUSES.RUNNING: - color = themeToken.colorInfo; - break; - case WORKFLOW_RUN_STATUSES.SUCCEEDED: - color = themeToken.colorSuccess; - break; - case WORKFLOW_RUN_STATUSES.FAILED: - color = themeToken.colorError; - break; - case WORKFLOW_RUN_STATUSES.CANCELED: - color = themeToken.colorWarning; - break; - } - - return ( - - - {t(`workflow_run.props.status.${runStatus}`)} - - ); - }; - const renderRecord = (record: Log) => { let message = <>{record.message}; if (record.data != null && Object.keys(record.data).length > 0) { @@ -189,7 +161,9 @@ const WorkflowRunLogs = ({ runId, runStatus }: { runId: string; runStatus: strin {t("workflow_run.logs")}
-
{renderBadge()}
+
+ +
{ + const { token: themeToken } = theme.useToken(); + + switch (value) { + case WORKFLOW_RUN_STATUSES.PENDING: + if (defaultColor == null || !defaultColor) { + return themeToken.colorTextSecondary; + } + break; + case WORKFLOW_RUN_STATUSES.RUNNING: + if (defaultColor == null || !defaultColor) { + return themeToken.colorInfo; + } + break; + case WORKFLOW_RUN_STATUSES.SUCCEEDED: + if (defaultColor == null || !defaultColor) { + return themeToken.colorSuccess; + } + break; + case WORKFLOW_RUN_STATUSES.FAILED: + if (defaultColor == null || !defaultColor) { + return themeToken.colorError; + } + break; + case WORKFLOW_RUN_STATUSES.CANCELED: + if (defaultColor == null || !defaultColor) { + return themeToken.colorWarning; + } + break; + default: + if (defaultColor == null || !defaultColor) { + return themeToken.colorTextSecondary; + } + break; + } + + return defaultColor; +}; + +export interface WorkflowStatusIconProps { + className?: string; + style?: React.CSSProperties; + color?: string | false; + size?: number | string; + type?: "filled" | "outlined"; + value: WorkflorRunStatusType | string; +} + +const WorkflowStatusIcon = ({ className, style, size = "1.25em", type = "outlined", value, ...props }: WorkflowStatusIconProps) => { + const color = useColor(value, props.color); + + switch (value) { + case WORKFLOW_RUN_STATUSES.PENDING: + return ( + + {type === "filled" ? : } + + ); + case WORKFLOW_RUN_STATUSES.RUNNING: + return ( + + + + ); + case WORKFLOW_RUN_STATUSES.SUCCEEDED: + return ( + + {type === "filled" ? : } + + ); + case WORKFLOW_RUN_STATUSES.FAILED: + return ( + + {type === "filled" ? : } + + ); + case WORKFLOW_RUN_STATUSES.CANCELED: + return ( + + + + ); + default: + return ( + + + + ); + } +}; + +export interface WorkflowStatusProps { + className?: string; + style?: React.CSSProperties; + children?: React.ReactNode; + color?: string | false; + showIcon?: boolean; + type?: WorkflowStatusIconProps["type"]; + value: WorkflorRunStatusType | string; +} + +const WorkflowStatus = ({ className, style, children, showIcon = true, type, value, ...props }: WorkflowStatusProps) => { + const { t } = useTranslation(); + + const color = useColor(value, props.color); + + const renderIcon = () => (showIcon ? : null); + + switch (value) { + case WORKFLOW_RUN_STATUSES.PENDING: + case WORKFLOW_RUN_STATUSES.RUNNING: + case WORKFLOW_RUN_STATUSES.SUCCEEDED: + case WORKFLOW_RUN_STATUSES.FAILED: + case WORKFLOW_RUN_STATUSES.CANCELED: + return ( + +
+ {renderIcon()} + {children != null ? children : {t(`workflow_run.props.status.${value.toLowerCase()}`)}} +
+
+ ); + default: + return ( + +
{children != null ? children : <>}
+
+ ); + } +}; + +const _default = Object.assign(WorkflowStatus, { + Icon: WorkflowStatusIcon, +}); + +export default _default; diff --git a/ui/src/components/workflow/WorkflowStatusIcon.tsx b/ui/src/components/workflow/WorkflowStatusIcon.tsx deleted file mode 100644 index 04d4d2d3..00000000 --- a/ui/src/components/workflow/WorkflowStatusIcon.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { IconCircleCheck, IconCircleDashed, IconCircleOff, IconCircleX, IconClock, IconLoader3 } from "@tabler/icons-react"; -import { theme } from "antd"; - -import { WORKFLOW_RUN_STATUSES } from "@/domain/workflowRun"; -import { mergeCls } from "@/utils/css"; - -export interface WorkflowStatusIconProps { - className?: string; - style?: React.CSSProperties; - color?: string | true; - size?: number | string; - status: string; -} - -const WorkflowStatusIcon = ({ className, style, color, status, ...props }: WorkflowStatusIconProps) => { - const { size = "1em" } = props; - - const { token: themeToken } = theme.useToken(); - - switch (status) { - case WORKFLOW_RUN_STATUSES.PENDING: - if (color === true) { - color = themeToken.colorTextSecondary; - } - return ( - - - - ); - case WORKFLOW_RUN_STATUSES.RUNNING: - if (color === true) { - color = themeToken.colorInfo; - } - return ( - - - - ); - case WORKFLOW_RUN_STATUSES.SUCCEEDED: - if (color === true) { - color = themeToken.colorSuccess; - } - return ( - - - - ); - case WORKFLOW_RUN_STATUSES.FAILED: - if (color === true) { - color = themeToken.colorError; - } - return ( - - - - ); - case WORKFLOW_RUN_STATUSES.CANCELED: - if (color === true) { - color = themeToken.colorWarning; - } - return ( - - - - ); - default: - if (color === true) { - color = themeToken.colorTextSecondary; - } - return ( - - - - ); - } -}; - -export default WorkflowStatusIcon; diff --git a/ui/src/components/workflow/WorkflowStatusTag.tsx b/ui/src/components/workflow/WorkflowStatusTag.tsx deleted file mode 100644 index 12a645d9..00000000 --- a/ui/src/components/workflow/WorkflowStatusTag.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useTranslation } from "react-i18next"; -import { Tag } from "antd"; - -import { WORKFLOW_RUN_STATUSES } from "@/domain/workflowRun"; - -import WorkflowStatusIcon from "./WorkflowStatusIcon"; - -export interface WorkflowStatusTagProps { - className?: string; - style?: React.CSSProperties; - status: string; -} - -const WorkflowStatusTag = ({ className, style, status }: WorkflowStatusTagProps) => { - const { t } = useTranslation(); - - const Icon = ; - - switch (status) { - case WORKFLOW_RUN_STATUSES.PENDING: - return ( - - {t("workflow_run.props.status.pending")} - - ); - case WORKFLOW_RUN_STATUSES.RUNNING: - return ( - - {t("workflow_run.props.status.running")} - - ); - case WORKFLOW_RUN_STATUSES.SUCCEEDED: - return ( - - {t("workflow_run.props.status.succeeded")} - - ); - case WORKFLOW_RUN_STATUSES.FAILED: - return ( - - {t("workflow_run.props.status.failed")} - - ); - case WORKFLOW_RUN_STATUSES.CANCELED: - return ( - - {t("workflow_run.props.status.canceled")} - - ); - default: - return <>; - } -}; - -export default WorkflowStatusTag; diff --git a/ui/src/components/workflow/designer/Editor.tsx b/ui/src/components/workflow/designer/Designer.tsx similarity index 86% rename from ui/src/components/workflow/designer/Editor.tsx rename to ui/src/components/workflow/designer/Designer.tsx index 218ac8ca..bee18f0a 100644 --- a/ui/src/components/workflow/designer/Editor.tsx +++ b/ui/src/components/workflow/designer/Designer.tsx @@ -14,14 +14,14 @@ import { createMinimapPlugin } from "@flowgram.ai/minimap-plugin"; import "@flowgram.ai/fixed-layout-editor/index.css"; import { theme } from "antd"; -import { getFlowComponents } from "./components"; -import { EditorContextProvider } from "./EditorContext"; +import { DegisnerContextProvider } from "./DesignerContext"; +import { getAllElements } from "./elements"; import NodeRender from "./NodeRender"; -import { getFlowNodeRegistries } from "./nodes"; +import { getAllNodeRegistries } from "./nodes"; import { BranchNode } from "./nodes/_shared"; import "./flowgram.css"; -export interface EditorProps { +export interface DesignerProps { className?: string; style?: React.CSSProperties; children?: React.ReactNode; @@ -30,12 +30,12 @@ export interface EditorProps { onNodeClick?: (ctx: FixedLayoutPluginContext, node: FlowNodeEntity) => void; } -export interface EditorInstance extends FixedLayoutPluginContext { +export interface DesignerInstance extends FixedLayoutPluginContext { validateNode(node: string | FlowNodeEntity): Promise; validateAllNodes(): Promise; } -const Editor = forwardRef(({ className, style, children, initialData, readonly, onNodeClick }, ref) => { +const Designer = forwardRef(({ className, style, children, initialData, readonly, onNodeClick }, ref) => { const { token: themeToken } = theme.useToken(); const flowgramEditorRef = useRef(null); @@ -80,16 +80,16 @@ const Editor = forwardRef(({ className, style, chil }, materials: { - components: getFlowComponents(), + components: getAllElements(), renderTexts: { [FlowTextKey.TRY_START_TEXT]: "Try", - [FlowTextKey.TRY_END_TEXT]: "Finally", + [FlowTextKey.TRY_END_TEXT]: "Then", [FlowTextKey.CATCH_TEXT]: "Catch", }, renderDefaultNode: NodeRender, }, - nodeRegistries: getFlowNodeRegistries(), + nodeRegistries: getAllNodeRegistries(), getNodeDefaultRegistry(type) { return { @@ -172,12 +172,12 @@ const Editor = forwardRef(({ className, style, chil return ( - onNodeClick?.(flowgramEditorRef.current!, node) }}> + onNodeClick?.(flowgramEditorRef.current!, node) }}> {children} - + ); }); -export default Editor; +export default Designer; diff --git a/ui/src/components/workflow/designer/DesignerContext.ts b/ui/src/components/workflow/designer/DesignerContext.ts new file mode 100644 index 00000000..4db5975e --- /dev/null +++ b/ui/src/components/workflow/designer/DesignerContext.ts @@ -0,0 +1,20 @@ +import { createContext, useContext } from "react"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; + +export type DesignerContextType = { + onNodeClick: (node: FlowNodeEntity) => void; +}; + +export const DesignerContext = createContext({ + onNodeClick: () => {}, +}); + +export const DegisnerContextProvider = DesignerContext.Provider; + +export const useDesignerContext = () => { + const context = useContext(DesignerContext); + if (!context) { + throw new Error("`DesignerContext` must be used within a `DesignerContextProvider`"); + } + return context; +}; diff --git a/ui/src/components/workflow/designer/EditorContext.ts b/ui/src/components/workflow/designer/EditorContext.ts deleted file mode 100644 index fe36fcd3..00000000 --- a/ui/src/components/workflow/designer/EditorContext.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createContext, useContext } from "react"; -import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; - -export type NodeRenderContextType = { - onNodeClick: (node: FlowNodeEntity) => void; -}; - -export const EditorContext = createContext({ - onNodeClick: () => {}, -}); - -export const EditorContextProvider = EditorContext.Provider; - -export const useEditorContext = () => { - const context = useContext(EditorContext); - if (!context) { - throw new Error("`EditorContext` must be used within a `EditorContextProvider`"); - } - return context; -}; diff --git a/ui/src/components/workflow/designer/NodeDrawer.tsx b/ui/src/components/workflow/designer/NodeDrawer.tsx index 60664856..0c6e26df 100644 --- a/ui/src/components/workflow/designer/NodeDrawer.tsx +++ b/ui/src/components/workflow/designer/NodeDrawer.tsx @@ -22,9 +22,7 @@ export interface NodeDrawerProps { onOpenChange?: (open: boolean) => void; } -const NodeDrawer = (_: NodeDrawerProps) => { - const { node, trigger, ...props } = _; - +const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { const [open, setOpen] = useControllableValue(props, { valuePropName: "open", defaultValuePropName: "defaultOpen", diff --git a/ui/src/components/workflow/designer/NodeRender.tsx b/ui/src/components/workflow/designer/NodeRender.tsx index a0c80376..e1553678 100644 --- a/ui/src/components/workflow/designer/NodeRender.tsx +++ b/ui/src/components/workflow/designer/NodeRender.tsx @@ -1,7 +1,7 @@ import { useEffect } from "react"; import { type NodeRenderProps, useClientContext, useNodeRender, useRefresh } from "@flowgram.ai/fixed-layout-editor"; -import { useEditorContext } from "./EditorContext"; +import { useDesignerContext } from "./DesignerContext"; import { NodeRenderContextProvider } from "./NodeRenderContext"; import { type NodeRegistry } from "./nodes/typings"; @@ -14,6 +14,8 @@ const Node = (_: NodeProps) => { const nodeRender = useNodeRender(); + const designer = useDesignerContext(); + useEffect(() => { const d = ctx.document.originTree.onTreeChange(() => refresh()); return () => d.dispose(); @@ -28,11 +30,10 @@ const Node = (_: NodeProps) => { }; }, [nodeRender.form]); - const { onNodeClick } = useEditorContext(); const handleNodeClick = () => { const node = nodeRender.node; if (node.getNodeRegistry().meta?.clickable) { - onNodeClick?.(node); + designer.onNodeClick?.(node); } }; diff --git a/ui/src/components/workflow/designer/components/Adder.tsx b/ui/src/components/workflow/designer/components/Adder.tsx deleted file mode 100644 index ecb840e8..00000000 --- a/ui/src/components/workflow/designer/components/Adder.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { type AdderProps as FlowgramAdderProps, useClientContext } from "@flowgram.ai/fixed-layout-editor"; - -import { IconPlus } from "@tabler/icons-react"; -import { Button, Dropdown } from "antd"; - -import { getFlowNodeRegistries } from "../nodes"; - -export interface AdderProps extends FlowgramAdderProps {} - -const Adder = ({ from, hoverActivated }: AdderProps) => { - const ctx = useClientContext(); - const { operation, playground } = ctx; - - const menuItems = getFlowNodeRegistries() - .filter((registry) => { - if (registry.meta?.addDisable != null) { - return !registry.meta.addDisable; - } - return true; - }) - .filter((registry) => { - if (registry.canAdd != null) { - return registry.canAdd(ctx, from); - } - return true; - }) - .map((registry) => { - const Icon = registry.meta?.icon; - - return { - key: registry.type, - label: registry.meta?.labelText ?? registry.type, - icon: {Icon && }, - onClick: () => { - const block = operation.addFromNode(from, registry.onAdd!(ctx, from)); - - setTimeout(() => { - playground.scrollToView({ - bounds: block.bounds, - scrollToCenter: true, - }); - }, 1); - }, - }; - }); - - return playground.config.readonlyOrDisabled ? null : ( -
- - {hoverActivated ? ( -
- ); -}; - -export default Adder; diff --git a/ui/src/components/workflow/designer/elements/Adder.tsx b/ui/src/components/workflow/designer/elements/Adder.tsx new file mode 100644 index 00000000..ef2307ca --- /dev/null +++ b/ui/src/components/workflow/designer/elements/Adder.tsx @@ -0,0 +1,82 @@ +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { type AdderProps as FlowgramAdderProps, useClientContext } from "@flowgram.ai/fixed-layout-editor"; + +import { IconPlus } from "@tabler/icons-react"; +import { Button, Dropdown, type MenuProps } from "antd"; + +import { getAllNodeRegistries } from "../nodes"; + +export interface AdderProps extends FlowgramAdderProps {} + +const Adder = ({ from, hoverActivated }: AdderProps) => { + const { t } = useTranslation(); + + const ctx = useClientContext(); + const { operation, playground } = ctx; + + const [menuOpen, setMenuOpen] = useState(false); // 使用受控组件,避免下拉菜单展开时鼠标移出而产生的布局抖动 + const menuItems = getAllNodeRegistries() + .filter((registry) => { + if (registry.meta?.addDisable != null) { + return !registry.meta.addDisable; + } + return true; + }) + .filter((registry) => { + if (registry.canAdd != null) { + return registry.canAdd(ctx, from); + } + return true; + }) + .reduce( + (acc, registry) => { + let group = acc.find((item) => item!.key === registry.kindType); + if (!group) { + group = { + key: registry.kindType, + type: "group", + label: registry.kindType ? t(`workflow_node.kind.${registry.kindType}`) : null, + children: [], + }; + acc.push(group); + } + + if (group.type === "group") { + const NodeIcon = registry.meta?.icon; + group.children!.push({ + key: registry.type, + label: registry.meta?.labelText ?? registry.type, + icon: {NodeIcon && }, + onClick: () => { + const block = operation.addFromNode(from, registry.onAdd!(ctx, from)); + + setTimeout(() => { + playground.scrollToView({ + bounds: block.bounds, + scrollToCenter: true, + }); + }, 1); + }, + }); + } + + return acc; + }, + [] as Required["items"] + ); + + return playground.config.readonlyOrDisabled ? null : ( +
+ + {hoverActivated || menuOpen ? ( +
+ ); +}; + +export default Adder; diff --git a/ui/src/components/workflow/designer/components/BranchAdder.tsx b/ui/src/components/workflow/designer/elements/BranchAdder.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/BranchAdder.tsx rename to ui/src/components/workflow/designer/elements/BranchAdder.tsx diff --git a/ui/src/components/workflow/designer/components/Collapse.tsx b/ui/src/components/workflow/designer/elements/Collapse.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/Collapse.tsx rename to ui/src/components/workflow/designer/elements/Collapse.tsx diff --git a/ui/src/components/workflow/designer/components/DragHighlightAdder.tsx b/ui/src/components/workflow/designer/elements/DragHighlightAdder.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/DragHighlightAdder.tsx rename to ui/src/components/workflow/designer/elements/DragHighlightAdder.tsx diff --git a/ui/src/components/workflow/designer/components/DragNode.tsx b/ui/src/components/workflow/designer/elements/DragNode.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/DragNode.tsx rename to ui/src/components/workflow/designer/elements/DragNode.tsx diff --git a/ui/src/components/workflow/designer/components/DraggingAdder.tsx b/ui/src/components/workflow/designer/elements/DraggingAdder.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/DraggingAdder.tsx rename to ui/src/components/workflow/designer/elements/DraggingAdder.tsx diff --git a/ui/src/components/workflow/designer/components/Null.tsx b/ui/src/components/workflow/designer/elements/Null.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/Null.tsx rename to ui/src/components/workflow/designer/elements/Null.tsx diff --git a/ui/src/components/workflow/designer/components/TryCatchCollapse.tsx b/ui/src/components/workflow/designer/elements/TryCatchCollapse.tsx similarity index 100% rename from ui/src/components/workflow/designer/components/TryCatchCollapse.tsx rename to ui/src/components/workflow/designer/elements/TryCatchCollapse.tsx diff --git a/ui/src/components/workflow/designer/components/index.ts b/ui/src/components/workflow/designer/elements/index.ts similarity index 96% rename from ui/src/components/workflow/designer/components/index.ts rename to ui/src/components/workflow/designer/elements/index.ts index 90fb868a..f975f718 100644 --- a/ui/src/components/workflow/designer/components/index.ts +++ b/ui/src/components/workflow/designer/elements/index.ts @@ -9,7 +9,7 @@ import DragNode from "./DragNode"; import Null from "./Null"; import TryCatchCollapse from "./TryCatchCollapse"; -export const getFlowComponents = () => { +export const getAllElements = () => { return { [FlowRendererKey.ADDER]: Adder, [FlowRendererKey.BRANCH_ADDER]: BranchAdder, diff --git a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigDrawer.tsx index 08dede4f..6d736aa8 100644 --- a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigDrawer.tsx +++ b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigDrawer.tsx @@ -13,8 +13,7 @@ export interface BizApplyNodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -const BizApplyNodeConfigDrawer = (_: BizApplyNodeConfigDrawerProps) => { - const { node, ...props } = _; +const BizApplyNodeConfigDrawer = ({ node, ...props }: BizApplyNodeConfigDrawerProps) => { if (node.flowNodeType !== NodeType.BizApply) { console.warn(`[certimate] current workflow node type is not: ${NodeType.BizApply}`); } diff --git a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx index 76fd62bf..57a22030 100644 --- a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx @@ -1,11 +1,10 @@ import { memo, useEffect, useMemo, useState } from "react"; import { getI18n, useTranslation } from "react-i18next"; import { Link } from "react-router"; -import { QuestionCircleOutlined as IconQuestionCircleOutlined } from "@ant-design/icons"; import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; import { IconChevronRight, IconCircleMinus, IconPlus } from "@tabler/icons-react"; import { useControllableValue } from "ahooks"; -import { type AnchorProps, AutoComplete, Button, Divider, Flex, Form, type FormInstance, Input, InputNumber, Select, Switch, Tooltip, Typography } from "antd"; +import { type AnchorProps, AutoComplete, Button, Divider, Flex, Form, type FormInstance, Input, InputNumber, Select, Switch, Typography } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; @@ -150,12 +149,7 @@ const BizApplyNodeConfigForm = ({ node, ...props }: BizApplyNodeConfigFormProps)
- } - > + } > - + - - - + } + > +
+ + {t("workflow_node.apply.form.provider_access.button")} + + + } + usage="dns" + afterSubmit={(record) => { + const provider = accessProvidersMap.get(record.provider); + if (provider?.usages?.includes(ACCESS_USAGES.DNS)) { + formInst.setFieldValue("providerAccessId", record.id); + handleProviderAccessSelect(record.id); + } + }} + /> +
+ - - - + +
+ + + + + +
+ - @@ -362,32 +360,25 @@ const BizDeployNodeConfigFormProviderSSH = () => {
- - - + +
+ ({ + key, + label: t(`workflow_node.deploy.form.ssh_preset_scripts.option.${key}.label`), + onClick: () => handlePresetPreScriptClick(key), + })), + }} + trigger={["click"]} + > + + +
+ {
- - - + +
+ ({ + key, + label: t(`workflow_node.deploy.form.ssh_preset_scripts.option.${key}.label`), + onClick: () => handlePresetPostScriptClick(key), + })), + }} + trigger={["click"]} + > + + +
+ >> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderSafeLine.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderSafeLine.tsx index ea40626a..20562ded 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderSafeLine.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderSafeLine.tsx @@ -58,7 +58,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCDN.tsx index 2ab258c6..df1f0527 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCDN.tsx @@ -48,7 +48,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCLB.tsx index a6a6f453..dca1df77 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCLB.tsx @@ -101,6 +101,7 @@ const BizDeployNodeConfigFormProviderTencentCloudCLB = () => { name={[parentNamePath, "domain"]} initialValue={initialValues.domain} label={t("workflow_node.deploy.form.tencentcloud_clb_snidomain.label")} + extra={t("workflow_node.deploy.form.tencentcloud_clb_snidomain.help")} rules={[formRule]} tooltip={} > @@ -131,7 +132,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCOS.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCOS.tsx index f011a7eb..8dd31bb6 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCOS.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCOS.tsx @@ -60,7 +60,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCSS.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCSS.tsx index 4b9e4f01..06069b23 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCSS.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudCSS.tsx @@ -48,7 +48,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudECDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudECDN.tsx index aeb4d8ea..516231fd 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudECDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudECDN.tsx @@ -48,7 +48,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudEO.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudEO.tsx index 3d3fa845..75c62115 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudEO.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudEO.tsx @@ -46,6 +46,7 @@ const BizDeployNodeConfigFormProviderTencentCloudEO = () => { name={[parentNamePath, "domains"]} initialValue={initialValues.domains} label={t("workflow_node.deploy.form.tencentcloud_eo_domains.label")} + extra={t("workflow_node.deploy.form.tencentcloud_eo_domains.help")} rules={[formRule]} tooltip={} > @@ -67,7 +68,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudGAAP.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudGAAP.tsx index 343b956d..fae72c29 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudGAAP.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudGAAP.tsx @@ -78,7 +78,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSCF.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSCF.tsx index f7f2e54b..91cb9007 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSCF.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSCF.tsx @@ -59,7 +59,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSL.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSL.tsx index 33211d3b..aa5a990b 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSL.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSL.tsx @@ -34,7 +34,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t: _ } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLDeploy.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLDeploy.tsx index 151fea4b..86b9ba53 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLDeploy.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLDeploy.tsx @@ -1,9 +1,10 @@ import { getI18n, useTranslation } from "react-i18next"; -import { Alert, AutoComplete, Form, Input } from "antd"; +import { AutoComplete, Form, Input } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import MultipleSplitValueInput from "@/components/MultipleSplitValueInput"; +import Tips from "@/components/Tips"; import { useFormNestedFieldsContext } from "./_context"; @@ -22,39 +23,39 @@ const BizDeployNodeConfigFormProviderTencentCloudSSLDeploy = () => { return ( <> - } /> + } /> } + tooltip={} > - + } + tooltip={} > - + } + tooltip={} > ({ value }))} - placeholder={t("workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_type.placeholder")} + placeholder={t("workflow_node.deploy.form.tencentcloud_ssldeploy_resource_type.placeholder")} filterOption={(inputValue, option) => option!.value.toLowerCase().includes(inputValue.toLowerCase())} /> @@ -62,14 +63,15 @@ const BizDeployNodeConfigFormProviderTencentCloudSSLDeploy = () => { } + tooltip={} > @@ -86,19 +88,19 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ endpoint: z.string().nullish(), - region: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_ssl_deploy_region.placeholder")), - resourceType: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_type.placeholder")), + region: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_ssldeploy_region.placeholder")), + resourceType: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_ssldeploy_resource_type.placeholder")), resourceIds: z.string().refine((v) => { if (!v) return false; return String(v) .split(MULTIPLE_INPUT_SEPARATOR) .every((e) => /^[A-Za-z0-9*._\-|]+$/.test(e)); - }, t("workflow_node.deploy.form.tencentcloud_ssl_deploy_resource_ids.errmsg.invalid")), + }, t("workflow_node.deploy.form.tencentcloud_ssldeploy_resource_ids.errmsg.invalid")), }); }; diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLUpdate.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLUpdate.tsx index 28ba3344..f7bd0d97 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLUpdate.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudSSLUpdate.tsx @@ -1,9 +1,10 @@ import { getI18n, useTranslation } from "react-i18next"; -import { Alert, Form, Input, Switch } from "antd"; +import { Form, Input, Switch } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import MultipleSplitValueInput from "@/components/MultipleSplitValueInput"; +import Tips from "@/components/Tips"; import { useFormNestedFieldsContext } from "./_context"; @@ -22,40 +23,41 @@ const BizDeployNodeConfigFormProviderTencentCloudSSLUpdate = () => { return ( <> - } /> + } /> } + tooltip={} > - + } + tooltip={} > - + } + tooltip={} > @@ -64,14 +66,15 @@ const BizDeployNodeConfigFormProviderTencentCloudSSLUpdate = () => { } + tooltip={} > @@ -80,9 +83,9 @@ const BizDeployNodeConfigFormProviderTencentCloudSSLUpdate = () => { } + tooltip={} > @@ -97,18 +100,18 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ endpoint: z.string().nullish(), - certificateId: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_ssl_update_certificate_id.placeholder")), + certificateId: z.string().nonempty(t("workflow_node.deploy.form.tencentcloud_sslupdate_certificate_id.placeholder")), resourceTypes: z.string().refine((v) => { if (!v) return false; return String(v) .split(MULTIPLE_INPUT_SEPARATOR) .every((e) => !!e.trim()); - }, t("workflow_node.deploy.form.tencentcloud_ssl_update_resource_types.placeholder")), + }, t("workflow_node.deploy.form.tencentcloud_sslupdate_resource_types.placeholder")), resourceRegions: z .string() .nullish() @@ -117,7 +120,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return String(v) .split(MULTIPLE_INPUT_SEPARATOR) .every((e) => !!e.trim()); - }, t("workflow_node.deploy.form.tencentcloud_ssl_update_resource_regions.placeholder")), + }, t("workflow_node.deploy.form.tencentcloud_sslupdate_resource_regions.placeholder")), isReplaced: z.boolean().nullish(), }); }; diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudVOD.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudVOD.tsx index 72ec0ea1..8cab2b71 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudVOD.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudVOD.tsx @@ -58,7 +58,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudWAF.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudWAF.tsx index 5b1b219b..e26b5b79 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudWAF.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderTencentCloudWAF.tsx @@ -81,7 +81,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUCDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUCDN.tsx index 01a3711e..44471c43 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUCDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUCDN.tsx @@ -36,7 +36,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUS3.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUS3.tsx index 2b4e83fd..33d87b54 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUS3.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUCloudUS3.tsx @@ -60,7 +60,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUniCloudWebHost.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUniCloudWebHost.tsx index e5d89b5d..07c306ee 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUniCloudWebHost.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUniCloudWebHost.tsx @@ -1,8 +1,9 @@ import { getI18n, useTranslation } from "react-i18next"; -import { Alert, Form, Input, Select } from "antd"; +import { Form, Input, Select } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; +import Tips from "@/components/Tips"; import { validDomainName } from "@/utils/validators"; import { useFormNestedFieldsContext } from "./_context"; @@ -20,7 +21,7 @@ const BizDeployNodeConfigFormProviderUniCloudWebHost = () => { return ( <> - } /> + } /> >> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunCDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunCDN.tsx index 93a023a3..4d641a9d 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunCDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunCDN.tsx @@ -1,8 +1,9 @@ import { getI18n, useTranslation } from "react-i18next"; -import { Alert, Form, Input } from "antd"; +import { Form, Input } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; +import Tips from "@/components/Tips"; import { validDomainName } from "@/utils/validators"; import { useFormNestedFieldsContext } from "./_context"; @@ -20,7 +21,7 @@ const BizDeployNodeConfigFormProviderUpyunCDN = () => { return ( <> - } /> + } /> >> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunFile.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunFile.tsx index f5431a48..b4ec73c0 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunFile.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderUpyunFile.tsx @@ -1,8 +1,9 @@ import { getI18n, useTranslation } from "react-i18next"; -import { Alert, Form, Input } from "antd"; +import { Form, Input } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; +import Tips from "@/components/Tips"; import { validDomainName } from "@/utils/validators"; import { useFormNestedFieldsContext } from "./_context"; @@ -20,7 +21,7 @@ const BizDeployNodeConfigFormProviderUpyunFile = () => { return ( <> - } /> + } /> >> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineALB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineALB.tsx index 164c73e9..ad7fee72 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineALB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineALB.tsx @@ -81,6 +81,7 @@ const BizDeployNodeConfigFormProviderVolcEngineALB = () => { name={[parentNamePath, "domain"]} initialValue={initialValues.domain} label={t("workflow_node.deploy.form.volcengine_alb_snidomain.label")} + extra={t("workflow_node.deploy.form.volcengine_alb_snidomain.help")} rules={[formRule]} tooltip={} > @@ -98,7 +99,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCDN.tsx index 465822b9..c463a056 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCDN.tsx @@ -38,7 +38,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCLB.tsx index f38b4d8c..c19c4e6a 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCLB.tsx @@ -85,7 +85,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCertCenter.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCertCenter.tsx index 2f129713..3741275c 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCertCenter.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineCertCenter.tsx @@ -35,7 +35,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineDCDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineDCDN.tsx index 565dee33..a13ce96a 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineDCDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineDCDN.tsx @@ -38,7 +38,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineImageX.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineImageX.tsx index 4ba36177..3361d988 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineImageX.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineImageX.tsx @@ -60,7 +60,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineLive.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineLive.tsx index 0ddd3903..25a6127d 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineLive.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineLive.tsx @@ -38,7 +38,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineTOS.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineTOS.tsx index 8b6a6f10..a8d338ed 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineTOS.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderVolcEngineTOS.tsx @@ -60,7 +60,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDN.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDN.tsx index 1360c5cc..54da6bfe 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDN.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDN.tsx @@ -26,6 +26,7 @@ const BizDeployNodeConfigFormProviderWangsuCDN = () => { name={[parentNamePath, "domains"]} initialValue={initialValues.domains} label={t("workflow_node.deploy.form.wangsu_cdn_domains.label")} + extra={t("workflow_node.deploy.form.wangsu_cdn_domains.help")} rules={[formRule]} tooltip={} > @@ -47,7 +48,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDNPro.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDNPro.tsx index b5b2579c..584a6ad7 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDNPro.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCDNPro.tsx @@ -52,6 +52,7 @@ const BizDeployNodeConfigFormProviderWangsuCDNPro = () => { name={[parentNamePath, "certificateId"]} initialValue={initialValues.certificateId} label={t("workflow_node.deploy.form.wangsu_cdnpro_certificate_id.label")} + extra={t("workflow_node.deploy.form.wangsu_cdnpro_certificate_id.help")} rules={[formRule]} tooltip={} > @@ -78,7 +79,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCertificate.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCertificate.tsx index 7d58eea6..e0e25c01 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCertificate.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWangsuCertificate.tsx @@ -21,6 +21,7 @@ const BizDeployNodeConfigFormProviderWangsuCertificate = () => { name={[parentNamePath, "certificateId"]} initialValue={initialValues.certificateId} label={t("workflow_node.deploy.form.wangsu_certificate_id.label")} + extra={t("workflow_node.deploy.form.wangsu_certificate_id.help")} rules={[formRule]} tooltip={} > @@ -34,7 +35,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t: _ } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWebhook.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWebhook.tsx index b4290c8a..2014aa50 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWebhook.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderWebhook.tsx @@ -1,9 +1,10 @@ import { getI18n, useTranslation } from "react-i18next"; -import { Alert, Form } from "antd"; +import { Form } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import CodeInput from "@/components/CodeInput"; +import Tips from "@/components/Tips"; import { useFormNestedFieldsContext } from "./_context"; @@ -19,10 +20,10 @@ const BizDeployNodeConfigFormProviderWebhook = () => { const initialValues = getInitialValues(); const handleWebhookDataBlur = () => { - const value = formInst.getFieldValue("webhookData"); + const value = formInst.getFieldValue([parentNamePath, "webhookData"]); try { const json = JSON.stringify(JSON.parse(value), null, 2); - formInst.setFieldValue("webhookData", json); + formInst.setFieldValue([parentNamePath, "webhookData"], json); } catch { return; } @@ -34,8 +35,8 @@ const BizDeployNodeConfigFormProviderWebhook = () => { name={[parentNamePath, "webhookData"]} initialValue={initialValues.webhookData} label={t("workflow_node.deploy.form.webhook_data.label")} + extra={t("workflow_node.deploy.form.webhook_data.help")} rules={[formRule]} - tooltip={} > { - } /> + } /> ); @@ -58,7 +59,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigDrawer.tsx index a0d6b8cd..3ef0b4cd 100644 --- a/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigDrawer.tsx +++ b/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigDrawer.tsx @@ -13,8 +13,7 @@ export interface BizMonitorNodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -const BizMonitorNodeConfigDrawer = (_: BizMonitorNodeConfigDrawerProps) => { - const { node, ...props } = _; +const BizMonitorNodeConfigDrawer = ({ node, ...props }: BizMonitorNodeConfigDrawerProps) => { if (node.flowNodeType !== NodeType.BizMonitor) { console.warn(`[certimate] current workflow node type is not: ${NodeType.BizMonitor}`); } diff --git a/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx index 0ac7f0b3..17d8f1b2 100644 --- a/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx @@ -59,7 +59,7 @@ const BizMonitorNodeConfigForm = ({ node, ...props }: BizMonitorNodeConfigFormPr
- + @@ -72,7 +72,7 @@ const BizMonitorNodeConfigForm = ({ node, ...props }: BizMonitorNodeConfigFormPr ); }; -const getAnchorItems = ({ i18n = getI18n() }: { i18n: ReturnType }): Required["items"] => { +const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType }): Required["items"] => { const { t } = i18n; return ["parameters"].map((key) => ({ @@ -86,7 +86,7 @@ const getInitialValues = (): Nullish>> => { return defaultNodeConfigForMonitor(); }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigDrawer.tsx index faf51db5..a88c08a7 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigDrawer.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigDrawer.tsx @@ -13,8 +13,7 @@ export interface BizNotifyNodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -const BizNotifyNodeConfigDrawer = (_: BizNotifyNodeConfigDrawerProps) => { - const { node, ...props } = _; +const BizNotifyNodeConfigDrawer = ({ node, ...props }: BizNotifyNodeConfigDrawerProps) => { if (node.flowNodeType !== NodeType.BizNotify) { console.warn(`[certimate] current workflow node type is not: ${NodeType.BizNotify}`); } diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx index 888b441f..b8e8be6b 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx @@ -134,34 +134,27 @@ const BizNotifyNodeConfigForm = ({ node, ...props }: BizNotifyNodeConfigFormProp /> - - - + +
+ + {t("workflow_node.notify.form.provider_access.button")} + + + } + usage="notification" + afterSubmit={(record) => { + const provider = accessProvidersMap.get(record.provider); + if (provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION)) { + formInst.setFieldValue("providerAccessId", record.id); + handleProviderAccessSelect(record.id); + } + }} + /> +
+ }): Required["items"] => { +const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType }): Required["items"] => { const { t } = i18n; return ["parameters", "strategy"].map((key) => ({ @@ -226,7 +219,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderDiscordBot.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderDiscordBot.tsx index 83bc2cae..3a395f38 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderDiscordBot.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderDiscordBot.tsx @@ -21,8 +21,8 @@ const BizNotifyNodeConfigFormProviderDiscordBot = () => { name={[parentNamePath, "channelId"]} initialValue={initialValues.channelId} label={t("workflow_node.notify.form.discordbot_channel_id.label")} + extra={t("workflow_node.notify.form.discordbot_channel_id.help")} rules={[formRule]} - tooltip={} > @@ -34,7 +34,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t: _ } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderEmail.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderEmail.tsx index de878e59..65d5c848 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderEmail.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderEmail.tsx @@ -23,8 +23,8 @@ const BizNotifyNodeConfigFormProviderEmail = () => { name={[parentNamePath, "receiverAddress"]} initialValue={initialValues.receiverAddress} label={t("workflow_node.notify.form.email_receiver_address.label")} + extra={t("workflow_node.notify.form.email_receiver_address.help")} rules={[formRule]} - tooltip={} >
@@ -36,7 +36,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderMattermost.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderMattermost.tsx index 53e8692d..89f44277 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderMattermost.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderMattermost.tsx @@ -21,8 +21,8 @@ const BizNotifyNodeConfigFormProviderMattermost = () => { name={[parentNamePath, "channelId"]} initialValue={initialValues.channelId} label={t("workflow_node.notify.form.mattermost_channel_id.label")} + extra={t("workflow_node.notify.form.mattermost_channel_id.help")} rules={[formRule]} - tooltip={} >
@@ -34,7 +34,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t: _ } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderSlackBot.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderSlackBot.tsx index 761b11c6..286d5c40 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderSlackBot.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderSlackBot.tsx @@ -21,8 +21,8 @@ const BizNotifyNodeConfigFormProviderSlackBot = () => { name={[parentNamePath, "channelId"]} initialValue={initialValues.channelId} label={t("workflow_node.notify.form.slackbot_channel_id.label")} + extra={t("workflow_node.notify.form.slackbot_channel_id.help")} rules={[formRule]} - tooltip={} >
@@ -34,7 +34,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t: _ } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx index 1d4a5996..c085e79e 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx @@ -21,8 +21,8 @@ const BizNotifyNodeConfigFormProviderTelegramBot = () => { name={[parentNamePath, "chatId"]} initialValue={initialValues.chatId} label={t("workflow_node.notify.form.telegrambot_chat_id.label")} + extra={t("workflow_node.notify.form.telegrambot_chat_id.help")} rules={[formRule]} - tooltip={} > @@ -34,7 +34,7 @@ const getInitialValues = (): Nullish>> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderWebhook.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderWebhook.tsx index cccf3cff..005e297b 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderWebhook.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderWebhook.tsx @@ -20,10 +20,10 @@ const BizNotifyNodeConfigFormProviderWebhook = () => { const initialValues = getInitialValues(); const handleWebhookDataBlur = () => { - const value = formInst.getFieldValue("webhookData"); + const value = formInst.getFieldValue([parentNamePath, "webhookData"]); try { const json = JSON.stringify(JSON.parse(value), null, 2); - formInst.setFieldValue("webhookData", json); + formInst.setFieldValue([parentNamePath, "webhookData"], json); } catch { return; } @@ -35,8 +35,8 @@ const BizNotifyNodeConfigFormProviderWebhook = () => { name={[parentNamePath, "webhookData"]} initialValue={initialValues.webhookData} label={t("workflow_node.notify.form.webhook_data.label")} + extra={t("workflow_node.notify.form.webhook_data.help")} rules={[formRule]} - tooltip={} > >> => { return {}; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BizUploadNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/BizUploadNodeConfigDrawer.tsx index daf14007..826024b8 100644 --- a/ui/src/components/workflow/designer/forms/BizUploadNodeConfigDrawer.tsx +++ b/ui/src/components/workflow/designer/forms/BizUploadNodeConfigDrawer.tsx @@ -13,8 +13,7 @@ export interface BizUploadNodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -const BizUploadNodeConfigDrawer = (_: BizUploadNodeConfigDrawerProps) => { - const { node, ...props } = _; +const BizUploadNodeConfigDrawer = ({ node, ...props }: BizUploadNodeConfigDrawerProps) => { if (node.flowNodeType !== NodeType.BizUpload) { console.warn(`[certimate] current workflow node type is not: ${NodeType.BizUpload}`); } diff --git a/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx index 1d9bf152..05a38702 100644 --- a/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx @@ -115,7 +115,7 @@ const BizUploadNodeConfigForm = ({ node, ...props }: BizUploadNodeConfigFormProp ); }; -const getAnchorItems = ({ i18n = getI18n() }: { i18n: ReturnType }): Required["items"] => { +const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType }): Required["items"] => { const { t } = i18n; return ["parameters"].map((key) => ({ @@ -133,7 +133,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigDrawer.tsx index f1b7d103..98530101 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigDrawer.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigDrawer.tsx @@ -13,8 +13,7 @@ export interface BranchBlockNodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -const BranchBlockNodeConfigDrawer = (_: BranchBlockNodeConfigDrawerProps) => { - const { node, ...props } = _; +const BranchBlockNodeConfigDrawer = ({ node, ...props }: BranchBlockNodeConfigDrawerProps) => { if (node.flowNodeType !== NodeType.BranchBlock) { console.warn(`[certimate] current workflow node type is not: ${NodeType.BranchBlock}`); } diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx index b915388c..e9d7557f 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx @@ -64,7 +64,7 @@ const BranchBlockNodeConfigForm = ({ node, ...props }: BranchBlockNodeConfigForm ); }; -const getAnchorItems = ({ i18n = getI18n() }: { i18n: ReturnType }): Required["items"] => { +const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType }): Required["items"] => { const { t } = i18n; return ["parameters"].map((key) => ({ @@ -78,7 +78,7 @@ const getInitialValues = (): Nullish>> => { return defaultNodeConfigForCondition(); }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t: _ } = i18n; return z.object({ diff --git a/ui/src/components/workflow/designer/forms/StartNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/StartNodeConfigDrawer.tsx index 8b59e30a..0f02fe6c 100644 --- a/ui/src/components/workflow/designer/forms/StartNodeConfigDrawer.tsx +++ b/ui/src/components/workflow/designer/forms/StartNodeConfigDrawer.tsx @@ -13,8 +13,7 @@ export interface StartNodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -const StartNodeConfigDrawer = (_: StartNodeConfigDrawerProps) => { - const { node, ...props } = _; +const StartNodeConfigDrawer = ({ node, ...props }: StartNodeConfigDrawerProps) => { if (node.flowNodeType !== NodeType.Start) { console.warn(`[certimate] current workflow node type is not: ${NodeType.Start}`); } diff --git a/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx index 163768b3..9c458ca8 100644 --- a/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx @@ -112,7 +112,7 @@ const StartNodeConfigForm = ({ node, ...props }: StartNodeConfigFormProps) => { ); }; -const getAnchorItems = ({ i18n = getI18n() }: { i18n: ReturnType }): Required["items"] => { +const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType }): Required["items"] => { const { t } = i18n; return ["parameters"].map((key) => ({ @@ -129,7 +129,7 @@ const getInitialValues = (): Nullish>> => { }; }; -const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { const { t } = i18n; return z diff --git a/ui/src/components/workflow/designer/forms/_shared.tsx b/ui/src/components/workflow/designer/forms/_shared.tsx index 85d90669..6ca67a85 100644 --- a/ui/src/components/workflow/designer/forms/_shared.tsx +++ b/ui/src/components/workflow/designer/forms/_shared.tsx @@ -21,9 +21,7 @@ export interface NodeConfigDrawerProps { onOpenChange?: (open: boolean) => void; } -export const NodeConfigDrawer = (_: NodeConfigDrawerProps) => { - const { children, anchor, footer = true, form: formInst, loading, node, ...props } = _; - +export const NodeConfigDrawer = ({ children, anchor, footer = true, form: formInst, loading, node, ...props }: NodeConfigDrawerProps) => { const { t } = useTranslation(); const { modal, notification } = App.useApp(); diff --git a/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx index de3b99d9..4c1e0b7b 100644 --- a/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx @@ -7,10 +7,12 @@ import { nanoid } from "nanoid"; import { acmeDns01ProvidersMap } from "@/domain/provider"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import BizApplyNodeConfigForm from "../forms/BizApplyNodeConfigForm"; export const BizApplyNodeRegistry: NodeRegistry = { type: NodeType.BizApply, + kindType: NodeKindType.Business, meta: { helpText: getI18n().t("workflow_node.apply.help"), @@ -25,34 +27,11 @@ export const BizApplyNodeRegistry: NodeRegistry = { formMeta: { validate: { - ["config.domains"]: ({ value }) => { - if (!value) { + ["config"]: ({ value }) => { + const res = BizApplyNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.contactEmail"]: ({ value }) => { - if (!value) { - return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.provider"]: ({ value }) => { - if (!value) { - return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.providerAccessId"]: ({ value }) => { - if (!value) { - return { - message: "required", + message: res.error.message, level: FeedbackLevel.Error, }; } diff --git a/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx index d48c6192..c89e721c 100644 --- a/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx @@ -7,10 +7,12 @@ import { nanoid } from "nanoid"; import { deploymentProvidersMap } from "@/domain/provider"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import BizDeployNodeConfigForm from "../forms/BizDeployNodeConfigForm"; export const BizDeployNodeRegistry: NodeRegistry = { type: NodeType.BizDeploy, + kindType: NodeKindType.Business, meta: { helpText: getI18n().t("workflow_node.deploy.help"), @@ -25,18 +27,11 @@ export const BizDeployNodeRegistry: NodeRegistry = { formMeta: { validate: { - ["config.provider"]: ({ value }) => { - if (!value) { + ["config"]: ({ value }) => { + const res = BizDeployNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.providerAccessId"]: ({ value }) => { - if (!value) { - return { - message: "required", + message: res.error.message, level: FeedbackLevel.Error, }; } diff --git a/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx index 80a6851b..eb0d518b 100644 --- a/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx @@ -4,10 +4,12 @@ import { IconDeviceDesktopSearch } from "@tabler/icons-react"; import { nanoid } from "nanoid"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import BizMonitorNodeConfigForm from "../forms/BizMonitorNodeConfigForm"; export const BizMonitorNodeRegistry: NodeRegistry = { type: NodeType.BizMonitor, + kindType: NodeKindType.Business, meta: { helpText: getI18n().t("workflow_node.monitor.help"), @@ -22,10 +24,11 @@ export const BizMonitorNodeRegistry: NodeRegistry = { formMeta: { validate: { - ["config.host"]: ({ value }) => { - if (!value) { + ["config"]: ({ value }) => { + const res = BizMonitorNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { return { - message: "required", + message: res.error.message, level: FeedbackLevel.Error, }; } diff --git a/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx index 4cd245d6..86763c50 100644 --- a/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx @@ -7,10 +7,12 @@ import { nanoid } from "nanoid"; import { notificationProvidersMap } from "@/domain/provider"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import BizNotifyNodeConfigForm from "../forms/BizNotifyNodeConfigForm"; export const BizNotifyNodeRegistry: NodeRegistry = { type: NodeType.BizNotify, + kindType: NodeKindType.Business, meta: { helpText: getI18n().t("workflow_node.notify.help"), @@ -25,34 +27,11 @@ export const BizNotifyNodeRegistry: NodeRegistry = { formMeta: { validate: { - ["config.subject"]: ({ value }) => { - if (!value) { + ["config"]: ({ value }) => { + const res = BizNotifyNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.message"]: ({ value }) => { - if (!value) { - return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.provider"]: ({ value }) => { - if (!value) { - return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.providerAccessId"]: ({ value }) => { - if (!value) { - return { - message: "required", + message: res.error.message, level: FeedbackLevel.Error, }; } diff --git a/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx index 2a7b7d1e..270b9ac9 100644 --- a/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx @@ -4,10 +4,12 @@ import { IconCloudUpload } from "@tabler/icons-react"; import { nanoid } from "nanoid"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import BizUploadNodeConfigForm from "../forms/BizUploadNodeConfigForm"; export const BizUploadNodeRegistry: NodeRegistry = { type: NodeType.BizUpload, + kindType: NodeKindType.Business, meta: { helpText: getI18n().t("workflow_node.upload.help"), @@ -22,18 +24,11 @@ export const BizUploadNodeRegistry: NodeRegistry = { formMeta: { validate: { - ["config.certificate"]: ({ value }) => { - if (!value) { + ["config"]: ({ value }) => { + const res = BizUploadNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.privateKey"]: ({ value }) => { - if (!value) { - return { - message: "required", + message: res.error.message, level: FeedbackLevel.Error, }; } diff --git a/ui/src/components/workflow/designer/nodes/ConditionNode.tsx b/ui/src/components/workflow/designer/nodes/ConditionNode.tsx index 1f306e3c..52f788a7 100644 --- a/ui/src/components/workflow/designer/nodes/ConditionNode.tsx +++ b/ui/src/components/workflow/designer/nodes/ConditionNode.tsx @@ -1,5 +1,5 @@ import { getI18n } from "react-i18next"; -import { Field, FlowNodeBaseType, FlowNodeSplitType } from "@flowgram.ai/fixed-layout-editor"; +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"; @@ -7,10 +7,12 @@ import { nanoid } from "nanoid"; import { type Expr, ExprType } from "@/domain/workflow"; import { BaseNode, BranchNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import BranchBlockNodeConfigForm from "../forms/BranchBlockNodeConfigForm"; export const ConditionNodeRegistry: NodeRegistry = { type: NodeType.Condition, + kindType: NodeKindType.Logic, extend: FlowNodeSplitType.DYNAMIC_SPLIT, @@ -66,6 +68,7 @@ export const ConditionNodeRegistry: NodeRegistry = { export const BranchBlockNodeRegistry: NodeRegistry = { type: NodeType.BranchBlock, + kindType: NodeKindType.Logic, extend: FlowNodeBaseType.BLOCK, @@ -83,6 +86,18 @@ export const BranchBlockNodeRegistry: NodeRegistry = { }, formMeta: { + validate: { + ["config"]: ({ value }) => { + const res = BranchBlockNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { + return { + message: res.error.message, + level: FeedbackLevel.Error, + }; + } + }, + }, + render: () => { const { t } = getI18n(); diff --git a/ui/src/components/workflow/designer/nodes/EndNode.tsx b/ui/src/components/workflow/designer/nodes/EndNode.tsx index 649e5650..f851f8b6 100644 --- a/ui/src/components/workflow/designer/nodes/EndNode.tsx +++ b/ui/src/components/workflow/designer/nodes/EndNode.tsx @@ -4,10 +4,11 @@ import { IconLogout } from "@tabler/icons-react"; import { nanoid } from "nanoid"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; export const EndNodeRegistry: NodeRegistry = { type: NodeType.End, + kindType: NodeKindType.Common, meta: { helpText: getI18n().t("workflow_node.end.help"), diff --git a/ui/src/components/workflow/designer/nodes/StartNode.tsx b/ui/src/components/workflow/designer/nodes/StartNode.tsx index 6dbb4a98..64b60faf 100644 --- a/ui/src/components/workflow/designer/nodes/StartNode.tsx +++ b/ui/src/components/workflow/designer/nodes/StartNode.tsx @@ -5,10 +5,12 @@ import { IconRocket } from "@tabler/icons-react"; import { WORKFLOW_TRIGGERS } from "@/domain/workflow"; import { BaseNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import StartNodeConfigForm from "../forms/StartNodeConfigForm"; export const StartNodeRegistry: NodeRegistry = { type: NodeType.Start, + kindType: NodeKindType.Common, meta: { helpText: getI18n().t("workflow_node.start.help"), @@ -31,18 +33,11 @@ export const StartNodeRegistry: NodeRegistry = { formMeta: { validate: { - ["config.trigger"]: ({ value }) => { - if (!value) { + ["config"]: ({ value }) => { + const res = StartNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { return { - message: "required", - level: FeedbackLevel.Error, - }; - } - }, - ["config.triggerCron"]: ({ value, formValues }) => { - if (!value && formValues.config.trigger === WORKFLOW_TRIGGERS.SCHEDULED) { - return { - message: "required", + message: res.error.message, level: FeedbackLevel.Error, }; } diff --git a/ui/src/components/workflow/designer/nodes/TryCatchNode.tsx b/ui/src/components/workflow/designer/nodes/TryCatchNode.tsx index 0dca9bdf..7149bf3b 100644 --- a/ui/src/components/workflow/designer/nodes/TryCatchNode.tsx +++ b/ui/src/components/workflow/designer/nodes/TryCatchNode.tsx @@ -4,10 +4,11 @@ import { IconArrowsSplit, IconCircleX } from "@tabler/icons-react"; import { nanoid } from "nanoid"; import { BaseNode, BranchNode } from "./_shared"; -import { type NodeRegistry, NodeType } from "./typings"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; export const TryCatchNodeRegistry: NodeRegistry = { type: NodeType.TryCatch, + kindType: NodeKindType.Logic, meta: { helpText: getI18n().t("workflow_node.try_catch.help"), @@ -65,6 +66,7 @@ export const TryCatchNodeRegistry: NodeRegistry = { export const CatchBlockNodeRegistry: NodeRegistry = { type: NodeType.CatchBlock, + kindType: NodeKindType.Logic, meta: { labelText: getI18n().t("workflow_node.catch_block.label"), diff --git a/ui/src/components/workflow/designer/nodes/_shared.tsx b/ui/src/components/workflow/designer/nodes/_shared.tsx index 2c92c2e8..ac195cb9 100644 --- a/ui/src/components/workflow/designer/nodes/_shared.tsx +++ b/ui/src/components/workflow/designer/nodes/_shared.tsx @@ -228,13 +228,26 @@ const InternalNodeMenuButton = ({ onClick: handleClickRemove, }, ], + onClick: (e) => { + e.domEvent.stopPropagation(); + }, }} overlayStyle={{ zIndex: 10 /* 确保要比 Minimap 组件层级要高,防止被遮挡而点击不到 */, }} trigger={["click"]} > -
@@ -150,7 +170,7 @@ const ConsoleLayout = () => { ); }; -const SiderMenu = memo(({ onSelect }: { onSelect?: (key: string) => void }) => { +const SiderMenu = memo(({ collapsed, onSelect }: { collapsed?: boolean; onSelect?: (key: string) => void }) => { const location = useLocation(); const navigate = useNavigate(); @@ -210,14 +230,19 @@ const SiderMenu = memo(({ onSelect }: { onSelect?: (key: string) => void }) => { return ( <> -
- - Certimate - +
+
+ + + Certimate + + +
{ const triggerEl = useTriggerElement(trigger, { onClick: () => setSiderOpen(true) }); + const handleMenuSelect = useCallback(() => { + setSiderOpen(false); + }, []); + return ( <> {triggerEl} @@ -252,7 +281,7 @@ const SiderMenuDrawer = memo(({ trigger }: { trigger: React.ReactNode }) => { }} onClose={() => setSiderOpen(false)} > - setSiderOpen(false)} /> + ); diff --git a/ui/src/pages/accesses/AccessList.tsx b/ui/src/pages/accesses/AccessList.tsx index 7015766f..2a28ad75 100644 --- a/ui/src/pages/accesses/AccessList.tsx +++ b/ui/src/pages/accesses/AccessList.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from "react"; +import { CopyToClipboard } from "react-copy-to-clipboard"; import { useTranslation } from "react-i18next"; import { useNavigate, useSearchParams } from "react-router-dom"; import { IconCirclePlus, IconCopy, IconDots, IconEdit, IconFingerprint, IconPlus, IconReload, IconTrash } from "@tabler/icons-react"; @@ -26,7 +27,7 @@ const AccessList = () => { const { token: themeToken } = theme.useToken(); - const { modal, notification } = App.useApp(); + const { message, modal, notification } = App.useApp(); const { appSettings: globalAppSettings } = useAppSettings(); @@ -47,6 +48,28 @@ const AccessList = () => { const [tableTotal, setTableTotal] = useState(0); const [tableSelectedRowKeys, setTableSelectedRowKeys] = useState([]); const tableColumns: TableProps["columns"] = [ + { + key: "id", + title: "ID", + width: 160, + render: (_, record) => { + return ( + { + message.success(t("common.text.copied")); + }} + > +
e.stopPropagation()}> +
+ {record.id} +
+
+
+
+ ); + }, + }, { key: "name", title: t("access.props.name"), @@ -83,7 +106,7 @@ const AccessList = () => { items: [ { key: "edit", - label: t("access.action.edit.button"), + label: t("access.action.edit.menu"), icon: ( @@ -95,7 +118,7 @@ const AccessList = () => { }, { key: "duplicate", - label: t("access.action.duplicate.button"), + label: t("access.action.duplicate.menu"), icon: ( @@ -110,7 +133,7 @@ const AccessList = () => { }, { key: "delete", - label: t("access.action.delete.button"), + label: t("access.action.delete.menu"), danger: true, icon: ( @@ -228,6 +251,7 @@ const AccessList = () => { onSuccess: (res) => { setTableData(res.items); setTableTotal(res.totalItems); + setTableSelectedRowKeys([]); }, } ); @@ -316,7 +340,6 @@ const AccessList = () => { try { const resp = await deleteAccess(records); if (resp) { - setTableSelectedRowKeys([]); setTableData((prev) => prev.filter((item) => !records.some((record) => record.id === item.id))); setTableTotal((prev) => prev - records.length); refreshData(); @@ -391,6 +414,7 @@ const AccessList = () => { ) : ( } @@ -431,7 +455,7 @@ const AccessList = () => { }} >
-
diff --git a/ui/src/pages/certificates/CertificateList.tsx b/ui/src/pages/certificates/CertificateList.tsx index 7594df18..c4a01765 100644 --- a/ui/src/pages/certificates/CertificateList.tsx +++ b/ui/src/pages/certificates/CertificateList.tsx @@ -142,7 +142,7 @@ const CertificateList = () => { items: [ { key: "view", - label: t("certificate.action.view.button"), + label: t("certificate.action.view.menu"), icon: ( @@ -157,7 +157,7 @@ const CertificateList = () => { }, { key: "delete", - label: t("certificate.action.delete.button"), + label: t("certificate.action.delete.menu"), danger: true, icon: ( @@ -250,11 +250,11 @@ const CertificateList = () => { return prev; }); - setTableSelectedRowKeys([]); }, onSuccess: (res) => { setTableData(res.items); setTableTotal(res.totalItems); + setTableSelectedRowKeys([]); }, onError: (err) => { if (err instanceof ClientResponseError && err.isAbort) { @@ -340,7 +340,6 @@ const CertificateList = () => { try { const resp = await removeCertificate(records); if (resp) { - setTableSelectedRowKeys([]); setTableData((prev) => prev.filter((item) => !records.some((record) => record.id === item.id))); setTableTotal((prev) => prev - records.length); refreshData(); @@ -405,6 +404,7 @@ const CertificateList = () => { ) : ( } @@ -454,7 +454,7 @@ const CertificateList = () => { }} >
-
diff --git a/ui/src/pages/dashboard/Dashboard.tsx b/ui/src/pages/dashboard/Dashboard.tsx index 5462528d..426fd48a 100644 --- a/ui/src/pages/dashboard/Dashboard.tsx +++ b/ui/src/pages/dashboard/Dashboard.tsx @@ -15,14 +15,14 @@ import { IconShieldCheckered, } from "@tabler/icons-react"; import { useRequest } from "ahooks"; -import { App, Button, Card, Col, Divider, Flex, Grid, Row, Skeleton, Table, type TableProps, Typography } from "antd"; +import { App, Button, Card, Col, Row, Skeleton, Table, type TableProps, Typography } from "antd"; import dayjs from "dayjs"; import { ClientResponseError } from "pocketbase"; import { get as getStatistics } from "@/api/statistics"; import Empty from "@/components/Empty"; import WorkflowRunDetailDrawer from "@/components/workflow/WorkflowRunDetailDrawer"; -import WorkflowStatusTag from "@/components/workflow/WorkflowStatusTag"; +import WorkflowStatus from "@/components/workflow/WorkflowStatus"; import { type Statistics } from "@/domain/statistics"; import { type WorkflowRunModel } from "@/domain/workflowRun"; import { useBrowserTheme } from "@/hooks"; @@ -35,8 +35,6 @@ const Dashboard = () => { const { t } = useTranslation(); - const breakpoints = Grid.useBreakpoint(); - return (
@@ -48,26 +46,25 @@ const Dashboard = () => {
- +
+

{t("dashboard.shortcut")}

+
+ + + +
+
- - -
- - - -
-
- - - -
+
+

{t("dashboard.latest_workflow_runs")}

+ +
); @@ -268,7 +265,7 @@ const WorkflowRunHistoryTable = ({ className, style }: { className?: string; sty key: "status", title: t("workflow_run.props.status"), render: (_, record) => { - return ; + return ; }, }, { @@ -350,6 +347,7 @@ const WorkflowRunHistoryTable = ({ className, style }: { className?: string; sty ) : ( } diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx index e68ebca0..4170af57 100644 --- a/ui/src/pages/settings/SettingsSSLProvider.tsx +++ b/ui/src/pages/settings/SettingsSSLProvider.tsx @@ -1,7 +1,6 @@ import { createContext, useContext, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { CheckCard } from "@ant-design/pro-components"; -import { App, Button, Form, Input, Skeleton, Typography } from "antd"; +import { App, Button, Card, Form, Input, Skeleton, Typography } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { produce } from "immer"; import { z } from "zod"; @@ -12,6 +11,7 @@ import { type CAProviderType, CA_PROVIDERS } from "@/domain/provider"; import { SETTINGS_NAMES, type SSLProviderSettingsContent, type SettingsModel } from "@/domain/settings"; import { useAntdForm } from "@/hooks"; import { get as getSettings, save as saveSettings } from "@/repository/settings"; +import { mergeCls } from "@/utils/css"; import { getErrMsg } from "@/utils/error"; const SSLProviderContext = createContext( @@ -359,6 +359,86 @@ const SSLProviderEditFormZeroSSLConfig = () => { ); }; +const SSLProviderEditFormACMECAConfig = () => { + const { t } = useTranslation(); + + const { pending, settings, updateSettings } = useContext(SSLProviderContext); + + const formSchema = z.object({ + endpoint: z.url(t("common.errmsg.url_invalid")), + eabKid: z + .string(t("access.form.acmeca_eab_kid.placeholder")) + .min(1, t("access.form.acmeca_eab_kid.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + eabHmacKey: z + .string(t("access.form.acmeca_eab_hmac_key.placeholder")) + .min(1, t("access.form.acmeca_eab_hmac_key.placeholder")) + .max(256, t("common.errmsg.string_max", { max: 256 })), + }); + const formRule = createSchemaFieldRule(formSchema); + const { form: formInst, formProps } = useAntdForm>({ + initialValues: settings?.content?.config?.[CA_PROVIDERS.ACMECA], + onSubmit: async (values) => { + const newSettings = produce(settings, (draft) => { + draft.content ??= {} as SSLProviderSettingsContent; + draft.content.provider = CA_PROVIDERS.ACMECA; + + draft.content.config ??= {} as SSLProviderSettingsContent["config"]; + draft.content.config[CA_PROVIDERS.ACMECA] = values; + }); + await updateSettings(newSettings); + + setFormChanged(false); + }, + }); + + const [formChanged, setFormChanged] = useState(false); + useEffect(() => { + setFormChanged(settings?.content?.provider !== CA_PROVIDERS.ACMECA); + }, [settings?.content?.provider]); + + const handleFormChange = () => { + setFormChanged(true); + }; + + return ( + + } + > + + + + } + > + + + + } + > + + + + + + + + ); +}; + const SettingsSSLProvider = () => { const { t } = useTranslation(); @@ -375,7 +455,7 @@ const SettingsSSLProvider = () => { const settings = await getSettings(SETTINGS_NAMES.SSL_PROVIDER); setSettings(settings); - setProviderType(settings.content?.provider); + setProviderValue(settings.content?.provider); setLoading(false); }; @@ -383,9 +463,25 @@ const SettingsSSLProvider = () => { fetchData(); }, []); - const [providerType, setProviderType] = useState(CA_PROVIDERS.LETSENCRYPT); + const providers = [ + [CA_PROVIDERS.LETSENCRYPT, "provider.letsencrypt", "letsencrypt.org", "/imgs/providers/letsencrypt.svg"], + [CA_PROVIDERS.LETSENCRYPTSTAGING, "provider.letsencryptstaging", "letsencrypt.org", "/imgs/providers/letsencrypt.svg"], + [CA_PROVIDERS.BUYPASS, "provider.buypass", "buypass.com", "/imgs/providers/buypass.png"], + [CA_PROVIDERS.GOOGLETRUSTSERVICES, "provider.googletrustservices", "pki.goog", "/imgs/providers/google.svg"], + [CA_PROVIDERS.SSLCOM, "provider.sslcom", "ssl.com", "/imgs/providers/sslcom.svg"], + [CA_PROVIDERS.ZEROSSL, "provider.zerossl", "zerossl.com", "/imgs/providers/zerossl.svg"], + [CA_PROVIDERS.ACMECA, "provider.acmeca", "\u00A0", "/imgs/providers/acmeca.svg"], + ].map(([value, name, description, icon]) => { + return { + value: value as CAProviderType, + name: t(name), + description, + icon, + }; + }); + const [providerValue, setProviderValue] = useState(CA_PROVIDERS.LETSENCRYPT); const providerFormEl = useMemo(() => { - switch (providerType) { + switch (providerValue) { case CA_PROVIDERS.LETSENCRYPT: return ; case CA_PROVIDERS.LETSENCRYPTSTAGING: @@ -398,8 +494,10 @@ const SettingsSSLProvider = () => { return ; case CA_PROVIDERS.ZEROSSL: return ; + case CA_PROVIDERS.ACMECA: + return ; } - }, [providerType]); + }, [providerValue]); const updateContextSettings = async (settings: MaybeModelRecordWithId>) => { setFormPending(true); @@ -407,7 +505,7 @@ const SettingsSSLProvider = () => { try { const resp = await saveSettings(settings); setSettings(resp); - setProviderType(resp.content?.provider); + setProviderValue(resp.content?.provider); message.success(t("common.text.operation_succeeded")); } catch (err) { @@ -427,58 +525,41 @@ const SettingsSSLProvider = () => { >

{t("settings.sslprovider.ca.title")}

}> -
+
- - setProviderType(value as CAProviderType)}> - } - size="small" - title={t("provider.letsencrypt")} - description="letsencrypt.org" - value={CA_PROVIDERS.LETSENCRYPT} - /> - } - size="small" - title={t("provider.letsencryptstaging")} - description="letsencrypt.org" - value={CA_PROVIDERS.LETSENCRYPTSTAGING} - /> - } - size="small" - title={t("provider.buypass")} - description="buypass.com" - value={CA_PROVIDERS.BUYPASS} - /> - } - size="small" - title={t("provider.googletrustservices")} - description="pki.goog" - value={CA_PROVIDERS.GOOGLETRUSTSERVICES} - /> - } - size="small" - title={t("provider.sslcom")} - description="ssl.com" - value={CA_PROVIDERS.SSLCOM} - /> - } - size="small" - title={t("provider.zerossl")} - description="zerossl.com" - value={CA_PROVIDERS.ZEROSSL} - /> - + +
+ {providers.map((provider) => ( + setProviderValue(provider.value)} + > +
+
+
+ +
+
+
{provider.name}
+
{provider.description}
+
+
+
+ {providerValue === provider.value &&
} +
+ ))} +
diff --git a/ui/src/pages/workflows/WorkflowDetailDesign.tsx b/ui/src/pages/workflows/WorkflowDetailDesign.tsx index f46d01c7..b913e28f 100644 --- a/ui/src/pages/workflows/WorkflowDetailDesign.tsx +++ b/ui/src/pages/workflows/WorkflowDetailDesign.tsx @@ -8,7 +8,7 @@ import { nanoid } from "nanoid"; import { debounce, isEqual } from "radash"; import Show from "@/components/Show"; -import WorkflowEditor, { type EditorInstance as WorkflowEditorInstance } from "@/components/workflow/designer/Editor"; +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 { type WorkflowNode, WorkflowNodeType } from "@/domain/workflow"; @@ -41,22 +41,22 @@ const WorkflowDetailDesign = () => { setAllowPublish(!isPendingOrRunning && hasChanges); }, [workflow.content, workflow.draft, workflow.hasDraft, isPendingOrRunning]); - const editorRef = useRef(null); - const [editorData, setEditorData] = useState(); + const designerRef = useRef(null); + const [degisnerData, setEditorData] = useState(); useDeepCompareEffect(() => { const data = { nodes: compactWorkflowDraft(workflow.draft) }; - editorRef.current?.document?.fromJSON(data); + designerRef.current?.document?.fromJSON(data); setEditorData(data); }, [workflow.draft]); - const onEditorDocumentChange = debounce({ delay: 300 }, () => { - if (!editorRef.current || editorRef.current.document.disposed) return; + const onDesignerDocumentChange = debounce({ delay: 300 }, () => { + if (!designerRef.current || designerRef.current.document.disposed) return; - console.log("document changed", editorRef.current!.document.toJSON()); + console.log("document changed", designerRef.current!.document.toJSON()); }); useEffect(() => { - const disposable = editorRef.current?.document?.originTree?.onTreeChange(onEditorDocumentChange); + const disposable = designerRef.current?.document?.originTree?.onTreeChange(onDesignerDocumentChange); return () => disposable?.dispose(); }, []); @@ -80,7 +80,7 @@ const WorkflowDetailDesign = () => { }; const handlePublishClick = async () => { - if (!(await editorRef.current!.validateAllNodes())) { + if (!(await designerRef.current!.validateAllNodes())) { message.warning(t("workflow.detail.design.uncompleted_design.alert")); return; } @@ -113,9 +113,9 @@ const WorkflowDetailDesign = () => { }, }} > - { setDrawerNode(node); setNodeDrawerOpen(true); @@ -123,6 +123,19 @@ const WorkflowDetailDesign = () => { >
+ + 该子页面仍在建设中,目前各节点数据只读,如需编辑请使用旧版编排工具。 +
+ This subpage is under construction. All node data is read-only currently. Please use the legacy designer if you want to edit workflow. +
+ } + showIcon + closable + type="warning" + />
@@ -169,7 +182,7 @@ const WorkflowDetailDesign = () => {
- +
); diff --git a/ui/src/pages/workflows/WorkflowDetailDesignLegacy.tsx b/ui/src/pages/workflows/WorkflowDetailDesignLegacy.tsx index 3bd52ac1..2f085f09 100644 --- a/ui/src/pages/workflows/WorkflowDetailDesignLegacy.tsx +++ b/ui/src/pages/workflows/WorkflowDetailDesignLegacy.tsx @@ -93,6 +93,19 @@ const WorkflowDetailDesign = () => {
+ + 该子页面即将在 v0.4.0 中被移除。 +
+ This subpage will be dropped in v0.4.0. +
+ } + showIcon + closable + type="warning" + />
diff --git a/ui/src/pages/workflows/WorkflowDetailRuns.tsx b/ui/src/pages/workflows/WorkflowDetailRuns.tsx index fe79ba88..b2a2469c 100644 --- a/ui/src/pages/workflows/WorkflowDetailRuns.tsx +++ b/ui/src/pages/workflows/WorkflowDetailRuns.tsx @@ -2,15 +2,16 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { IconBrowserShare, IconDots, IconHistory, IconPlayerPause, IconTrash } from "@tabler/icons-react"; import { useRequest } from "ahooks"; -import { App, Button, Dropdown, Skeleton, Table, type TableProps } from "antd"; +import { App, Button, Dropdown, Skeleton, Table, type TableProps, theme } from "antd"; import dayjs from "dayjs"; import { ClientResponseError } from "pocketbase"; import { cancelRun as cancelWorkflowRun } from "@/api/workflows"; import Empty from "@/components/Empty"; +import Show from "@/components/Show"; import Tips from "@/components/Tips"; import WorkflowRunDetailDrawer from "@/components/workflow/WorkflowRunDetailDrawer"; -import WorkflowStatusTag from "@/components/workflow/WorkflowStatusTag"; +import WorkflowStatus from "@/components/workflow/WorkflowStatus"; import { WORKFLOW_TRIGGERS } from "@/domain/workflow"; import { WORKFLOW_RUN_STATUSES, type WorkflowRunModel } from "@/domain/workflowRun"; import { useAppSettings, useZustandShallowSelector } from "@/hooks"; @@ -26,6 +27,8 @@ import { getErrMsg } from "@/utils/error"; const WorkflowDetailRuns = () => { const { t } = useTranslation(); + const { token: themeToken } = theme.useToken(); + const { modal, notification } = App.useApp(); const { appSettings: globalAppSettings } = useAppSettings(); @@ -37,24 +40,19 @@ const WorkflowDetailRuns = () => { const [tableData, setTableData] = useState([]); const [tableTotal, setTableTotal] = useState(0); + const [tableSelectedRowKeys, setTableSelectedRowKeys] = useState([]); const tableColumns: TableProps["columns"] = [ - { - key: "$index", - align: "center", - fixed: "left", - width: 48, - render: (_, __, index) => (page - 1) * pageSize + index + 1, - }, { key: "id", - title: t("workflow_run.props.id"), + title: "ID", + width: 160, render: (_, record) => {record.id}, }, { key: "status", title: t("workflow_run.props.status"), render: (_, record) => { - return ; + return ; }, }, { @@ -110,7 +108,7 @@ const WorkflowDetailRuns = () => { items: [ { key: "view", - label: t("workflow_run.action.view.button"), + label: t("workflow_run.action.view.menu"), icon: ( @@ -122,7 +120,7 @@ const WorkflowDetailRuns = () => { }, { key: "cancel", - label: t("workflow_run.action.cancel.button"), + label: t("workflow_run.action.cancel.menu"), icon: ( @@ -138,7 +136,7 @@ const WorkflowDetailRuns = () => { }, { key: "delete", - label: t("workflow_run.action.delete.button"), + label: t("workflow_run.action.delete.menu"), icon: ( @@ -167,6 +165,31 @@ const WorkflowDetailRuns = () => { }, }, ]; + const tableRowSelection: TableProps["rowSelection"] = { + fixed: true, + selectedRowKeys: tableSelectedRowKeys, + renderCell(checked, _, index, node) { + if (!checked) { + return ( +
+
{(page - 1) * pageSize + index + 1}
+
{node}
+
+ ); + } + return node; + }, + onCell: () => { + return { + onClick: (e) => { + e.stopPropagation(); + }, + }; + }, + onChange: (keys) => { + setTableSelectedRowKeys(keys as string[]); + }, + }; const { loading, @@ -185,6 +208,7 @@ const WorkflowDetailRuns = () => { onSuccess: (res) => { setTableData(res.items); setTableTotal(res.totalItems); + setTableSelectedRowKeys([]); }, onError: (err) => { if (err instanceof ClientResponseError && err.isAbort) { @@ -284,44 +308,99 @@ const WorkflowDetailRuns = () => { }); }; + const handleBatchDeleteClick = () => { + let records = tableData.filter((item) => tableSelectedRowKeys.includes(item.id)); + if (records.length === 0) { + return; + } + + modal.confirm({ + title: {t("workflow_run.action.batch_delete.modal.title")}, + content: , + icon: ( + + + + ), + okText: t("common.button.confirm"), + okButtonProps: { danger: true }, + onOk: async () => { + // 未结束的记录不允许删除 + records = records.filter((record) => !([WORKFLOW_RUN_STATUSES.PENDING, WORKFLOW_RUN_STATUSES.RUNNING] as string[]).includes(record.status)); + try { + const resp = await removeWorkflowRun(records); + if (resp) { + setTableData((prev) => prev.filter((item) => !records.some((record) => record.id === item.id))); + setTableTotal((prev) => prev - records.length); + refreshData(); + } + } catch (err) { + console.error(err); + notification.error({ message: t("common.text.request_error"), description: getErrMsg(err) }); + } + }, + }); + }; + return (
} /> } /> - - columns={tableColumns} - dataSource={tableData} - loading={loading} - locale={{ - emptyText: loading ? ( - - ) : ( - } - /> - ), - }} - pagination={{ - current: page, - pageSize: pageSize, - total: tableTotal, - showSizeChanger: true, - onChange: handlePaginationChange, - onShowSizeChange: handlePaginationChange, - }} - rowClassName="cursor-pointer" - rowKey={(record) => record.id} - scroll={{ x: "max(100%, 960px)" }} - onRow={(record) => ({ - onClick: () => { - handleRecordDetailClick(record); - }, - })} - /> +
+ + columns={tableColumns} + dataSource={tableData} + loading={loading} + locale={{ + emptyText: loading ? ( + + ) : ( + } + /> + ), + }} + pagination={{ + current: page, + pageSize: pageSize, + total: tableTotal, + showSizeChanger: true, + onChange: handlePaginationChange, + onShowSizeChange: handlePaginationChange, + }} + rowClassName="cursor-pointer" + rowKey={(record) => record.id} + rowSelection={tableRowSelection} + scroll={{ x: "max(100%, 960px)" }} + onRow={(record) => ({ + onClick: () => { + handleRecordDetailClick(record); + }, + })} + /> + + 0}> +
+
+ +
+
+
+
diff --git a/ui/src/pages/workflows/WorkflowList.tsx b/ui/src/pages/workflows/WorkflowList.tsx index 6e18736a..ec1f0be8 100644 --- a/ui/src/pages/workflows/WorkflowList.tsx +++ b/ui/src/pages/workflows/WorkflowList.tsx @@ -1,15 +1,16 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate, useSearchParams } from "react-router-dom"; -import { IconCirclePlus, IconCopy, IconDots, IconEdit, IconHierarchy3, IconPlus, IconReload, IconTrash } from "@tabler/icons-react"; +import { IconCirclePlus, IconCopy, IconDots, IconEdit, IconHierarchy3, IconPlayerPlay, IconPlus, IconReload, IconTrash } from "@tabler/icons-react"; import { useRequest } from "ahooks"; import { App, Button, Dropdown, Flex, Input, Segmented, Skeleton, Switch, Table, type TableProps, Typography, theme } from "antd"; import dayjs from "dayjs"; import { ClientResponseError } from "pocketbase"; +import { startRun as startWorkflowRun } from "@/api/workflows"; import Empty from "@/components/Empty"; import Show from "@/components/Show"; -import WorkflowStatusIcon from "@/components/workflow/WorkflowStatusIcon"; +import WorkflowStatus from "@/components/workflow/WorkflowStatus"; import { WORKFLOW_TRIGGERS, type WorkflowModel, cloneNode, initWorkflow, isAllNodesValidated } from "@/domain/workflow"; import { useAppSettings } from "@/hooks"; import { list as listWorkflows, remove as removeWorkflow, save as saveWorkflow } from "@/repository/workflow"; @@ -107,10 +108,9 @@ const WorkflowList = () => { return <>; } else { return ( - - - {lastRunTime ? dayjs(lastRunTime).format("YYYY-MM-DD HH:mm:ss") : ""} - + + {lastRunTime ? dayjs(lastRunTime).format("YYYY-MM-DD HH:mm:ss") : ""} + ); } }, @@ -134,7 +134,7 @@ const WorkflowList = () => { items: [ { key: "edit", - label: t("workflow.action.edit.button"), + label: t("workflow.action.edit.menu"), icon: ( @@ -146,7 +146,7 @@ const WorkflowList = () => { }, { key: "duplicate", - label: t("workflow.action.duplicate.button"), + label: t("workflow.action.duplicate.menu"), icon: ( @@ -156,12 +156,24 @@ const WorkflowList = () => { handleRecordDuplicateClick(record); }, }, + { + key: "run", + label: t("workflow.action.run.menu"), + icon: ( + + + + ), + onClick: () => { + handleRecordRunClick(record); + }, + }, { type: "divider", }, { key: "delete", - label: t("workflow.action.delete.button"), + label: t("workflow.action.delete.menu"), danger: true, icon: ( @@ -259,6 +271,7 @@ const WorkflowList = () => { onSuccess: (res) => { setTableData(res.items); setTableTotal(res.totalItems); + setTableSelectedRowKeys([]); }, onError: (err) => { if (err instanceof ClientResponseError && err.isAbort) { @@ -324,6 +337,17 @@ const WorkflowList = () => { } }; + const handleRecordRunClick = async (workflow: WorkflowModel) => { + try { + await startWorkflowRun(workflow.id); + + message.info(t("workflow.action.run.prompt")); + } catch (err) { + console.error(err); + notification.error({ message: t("common.text.request_error"), description: getErrMsg(err) }); + } + }; + const handleRecordDuplicateClick = (workflow: WorkflowModel) => { modal.confirm({ title: t("workflow.action.duplicate.modal.title", { name: workflow.name }), @@ -400,7 +424,6 @@ const WorkflowList = () => { try { const resp = await removeWorkflow(records); if (resp) { - setTableSelectedRowKeys([]); setTableData((prev) => prev.filter((item) => !records.some((record) => record.id === item.id))); setTableTotal((prev) => prev - records.length); refreshData(); @@ -469,6 +492,7 @@ const WorkflowList = () => { ) : ( } @@ -518,7 +542,7 @@ const WorkflowList = () => { }} >
-
diff --git a/ui/src/repository/access.ts b/ui/src/repository/access.ts index 2b834512..5926fccc 100644 --- a/ui/src/repository/access.ts +++ b/ui/src/repository/access.ts @@ -35,7 +35,7 @@ export const remove = async (record: MaybeModelRecordWithId | Maybe batch.collection(COLLECTION_NAME_ACCESS).update(item.id, { deleted: deletedAt }); } const res = await batch.send(); - return res.every((e) => e.status === 200); + return res.every((e) => e.status >= 200 && e.status < 400); } else { await pb.collection(COLLECTION_NAME_ACCESS).update(record.id!, { deleted: deletedAt }); return true; diff --git a/ui/src/repository/certificate.ts b/ui/src/repository/certificate.ts index 92ad852b..da322d21 100644 --- a/ui/src/repository/certificate.ts +++ b/ui/src/repository/certificate.ts @@ -64,7 +64,7 @@ export const remove = async (record: MaybeModelRecordWithId | batch.collection(COLLECTION_NAME_CERTIFICATE).update(item.id, { deleted: deletedAt }); } const res = await batch.send(); - return res.every((e) => e.status === 200); + return res.every((e) => e.status >= 200 && e.status < 400); } else { await pb.collection(COLLECTION_NAME_CERTIFICATE).update(record.id!, { deleted: deletedAt }); return true; diff --git a/ui/src/repository/workflow.ts b/ui/src/repository/workflow.ts index 32ffac47..c7a931a2 100644 --- a/ui/src/repository/workflow.ts +++ b/ui/src/repository/workflow.ts @@ -62,7 +62,7 @@ export const remove = async (record: MaybeModelRecordWithId | May batch.collection(COLLECTION_NAME_WORKFLOW).delete(item.id); } const res = await batch.send(); - return res.every((e) => e.status === 200); + return res.every((e) => e.status >= 200 && e.status < 400); } else { return await pb.collection(COLLECTION_NAME_WORKFLOW).delete(record.id); } diff --git a/ui/src/repository/workflowRun.ts b/ui/src/repository/workflowRun.ts index c1f46280..d4568822 100644 --- a/ui/src/repository/workflowRun.ts +++ b/ui/src/repository/workflowRun.ts @@ -38,7 +38,7 @@ export const remove = async (record: MaybeModelRecordWithId | batch.collection(COLLECTION_NAME_WORKFLOW_RUN).delete(item.id); } const res = await batch.send(); - return res.every((e) => e.status === 200); + return res.every((e) => e.status >= 200 && e.status < 400); } else { await pb.collection(COLLECTION_NAME_WORKFLOW_RUN).delete(record.id!); return true; diff --git a/ui/src/stores/access/index.ts b/ui/src/stores/access/index.ts index c51fa3bf..2ee1bd5f 100644 --- a/ui/src/stores/access/index.ts +++ b/ui/src/stores/access/index.ts @@ -6,7 +6,7 @@ import { list as listAccesses, remove as removeAccess, save as saveAccess } from import { type AccessesState, type AccessesStore } from "./types"; -export const useAccessesStore = create((set) => { +export const useAccessesStore = create((set, get) => { let fetcher: Promise | null = null; // 防止多次重复请求 return { @@ -14,7 +14,13 @@ export const useAccessesStore = create((set) => { loading: false, loadedAtOnce: false, - fetchAccesses: async () => { + fetchAccesses: async (refresh = true) => { + if (!refresh) { + if (get().loadedAtOnce) { + return; + } + } + fetcher ??= listAccesses().then((res) => res.items); try { diff --git a/ui/src/stores/access/types.ts b/ui/src/stores/access/types.ts index 2c987beb..943966f6 100644 --- a/ui/src/stores/access/types.ts +++ b/ui/src/stores/access/types.ts @@ -7,7 +7,7 @@ export interface AccessesState { } export interface AccessesActions { - fetchAccesses: () => Promise; + fetchAccesses: (refresh?: boolean) => Promise; createAccess: (access: MaybeModelRecord) => Promise; updateAccess: (access: MaybeModelRecordWithId) => Promise; deleteAccess: (access: MaybeModelRecordWithId | MaybeModelRecordWithId[]) => Promise; diff --git a/ui/src/stores/contact/index.ts b/ui/src/stores/contact/index.ts index e554bfb8..edf65687 100644 --- a/ui/src/stores/contact/index.ts +++ b/ui/src/stores/contact/index.ts @@ -15,7 +15,13 @@ export const useContactEmailsStore = create((set, get) => { loading: false, loadedAtOnce: false, - fetchEmails: async () => { + fetchEmails: async (refresh = true) => { + if (!refresh) { + if (get().loadedAtOnce) { + return; + } + } + fetcher ??= getSettings(SETTINGS_NAMES.EMAILS); try { diff --git a/ui/src/stores/contact/types.ts b/ui/src/stores/contact/types.ts index a1ee603c..af1e6950 100644 --- a/ui/src/stores/contact/types.ts +++ b/ui/src/stores/contact/types.ts @@ -5,7 +5,7 @@ } export interface ContactEmailsActions { - fetchEmails: () => Promise; + fetchEmails: (refresh?: boolean) => Promise; setEmails: (emails: string[]) => Promise; addEmail: (email: string) => Promise; removeEmail: (email: string) => Promise;