From 2b93552d1d9bb0eb5bced933757dad21b127b8f3 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 25 Nov 2024 21:22:20 +0800 Subject: [PATCH 01/25] chore: comments --- .../pkg/core/notifier/providers/bark/bark.go | 3 +++ .../notifier/providers/dingtalk/dingtalk.go | 4 +++- .../core/notifier/providers/email/email.go | 20 +++++++++++++------ .../pkg/core/notifier/providers/lark/lark.go | 1 + .../providers/serverchan/serverchan.go | 1 + .../notifier/providers/telegram/telegram.go | 4 +++- .../notifier/providers/webhook/webhook.go | 1 + .../providers/aliyun-cas/aliyun_cas.go | 7 +++++-- .../providers/aliyun-slb/aliyun_slb.go | 7 +++++-- .../providers/byteplus-cdn/byteplus_cdn.go | 2 ++ .../uploader/providers/dogecloud/dogecloud.go | 2 ++ .../huaweicloud-elb/huaweicloud_elb.go | 7 +++++-- .../huaweicloud-scm/huaweicloud_scm.go | 7 +++++-- .../providers/qiniu-sslcert/qiniu_sslcert.go | 2 ++ .../tencentcloud-ssl/tencentcloud_ssl.go | 4 +++- .../volcengine-cdn/volcengine_cdn.go | 4 +++- .../volcengine-live/volcengine_live.go | 4 +++- 17 files changed, 61 insertions(+), 19 deletions(-) diff --git a/internal/pkg/core/notifier/providers/bark/bark.go b/internal/pkg/core/notifier/providers/bark/bark.go index cd8119e1..74683f82 100644 --- a/internal/pkg/core/notifier/providers/bark/bark.go +++ b/internal/pkg/core/notifier/providers/bark/bark.go @@ -11,7 +11,10 @@ import ( ) type BarkNotifierConfig struct { + // Bark 服务地址。 + // 零值时默认使用官方服务器。 ServerUrl string `json:"serverUrl"` + // Bark 设备密钥。 DeviceKey string `json:"deviceKey"` } diff --git a/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go b/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go index 9ca1fcac..52fe5f27 100644 --- a/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go +++ b/internal/pkg/core/notifier/providers/dingtalk/dingtalk.go @@ -10,8 +10,10 @@ import ( ) type DingTalkNotifierConfig struct { + // 钉钉机器人的 Token。 AccessToken string `json:"accessToken"` - Secret string `json:"secret"` + // 钉钉机器人的 Secret。 + Secret string `json:"secret"` } type DingTalkNotifier struct { diff --git a/internal/pkg/core/notifier/providers/email/email.go b/internal/pkg/core/notifier/providers/email/email.go index b79618cc..127c5528 100644 --- a/internal/pkg/core/notifier/providers/email/email.go +++ b/internal/pkg/core/notifier/providers/email/email.go @@ -13,12 +13,20 @@ import ( ) type EmailNotifierConfig struct { - SmtpHost string `json:"smtpHost"` - SmtpPort int32 `json:"smtpPort"` - SmtpTLS bool `json:"smtpTLS"` - Username string `json:"username"` - Password string `json:"password"` - SenderAddress string `json:"senderAddress"` + // SMTP 服务器地址。 + SmtpHost string `json:"smtpHost"` + // SMTP 服务器端口。 + // 零值时根据是否启用 TLS 决定。 + SmtpPort int32 `json:"smtpPort"` + // 是否启用 TLS。 + SmtpTLS bool `json:"smtpTLS"` + // 用户名。 + Username string `json:"username"` + // 密码。 + Password string `json:"password"` + // 发件人邮箱。 + SenderAddress string `json:"senderAddress"` + // 收件人邮箱。 ReceiverAddress string `json:"receiverAddress"` } diff --git a/internal/pkg/core/notifier/providers/lark/lark.go b/internal/pkg/core/notifier/providers/lark/lark.go index 7a1dfc13..0ab94fbb 100644 --- a/internal/pkg/core/notifier/providers/lark/lark.go +++ b/internal/pkg/core/notifier/providers/lark/lark.go @@ -10,6 +10,7 @@ import ( ) type LarkNotifierConfig struct { + // 飞书 Webhook 地址。 WebhookUrl string `json:"webhookUrl"` } diff --git a/internal/pkg/core/notifier/providers/serverchan/serverchan.go b/internal/pkg/core/notifier/providers/serverchan/serverchan.go index 07d2b6e0..7b5a6de0 100644 --- a/internal/pkg/core/notifier/providers/serverchan/serverchan.go +++ b/internal/pkg/core/notifier/providers/serverchan/serverchan.go @@ -11,6 +11,7 @@ import ( ) type ServerChanNotifierConfig struct { + // ServerChan 服务地址。 Url string `json:"url"` } diff --git a/internal/pkg/core/notifier/providers/telegram/telegram.go b/internal/pkg/core/notifier/providers/telegram/telegram.go index 3560b87b..d1dcc45f 100644 --- a/internal/pkg/core/notifier/providers/telegram/telegram.go +++ b/internal/pkg/core/notifier/providers/telegram/telegram.go @@ -10,8 +10,10 @@ import ( ) type TelegramNotifierConfig struct { + // Telegram API Token。 ApiToken string `json:"apiToken"` - ChatId int64 `json:"chatId"` + // Telegram Chat ID。 + ChatId int64 `json:"chatId"` } type TelegramNotifier struct { diff --git a/internal/pkg/core/notifier/providers/webhook/webhook.go b/internal/pkg/core/notifier/providers/webhook/webhook.go index aa27014a..3c2bc05f 100644 --- a/internal/pkg/core/notifier/providers/webhook/webhook.go +++ b/internal/pkg/core/notifier/providers/webhook/webhook.go @@ -10,6 +10,7 @@ import ( ) type WebhookNotifierConfig struct { + // Webhook URL。 Url string `json:"url"` } diff --git a/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go b/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go index b65cd1d2..27633ca0 100644 --- a/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go +++ b/internal/pkg/core/uploader/providers/aliyun-cas/aliyun_cas.go @@ -17,9 +17,12 @@ import ( ) type AliyunCASUploaderConfig struct { - AccessKeyId string `json:"accessKeyId"` + // 阿里云 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 阿里云 AccessKeySecret。 AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` + // 阿里云地域。 + Region string `json:"region"` } type AliyunCASUploader struct { diff --git a/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go b/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go index f78c85ce..f5939354 100644 --- a/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go +++ b/internal/pkg/core/uploader/providers/aliyun-slb/aliyun_slb.go @@ -20,9 +20,12 @@ import ( ) type AliyunSLBUploaderConfig struct { - AccessKeyId string `json:"accessKeyId"` + // 阿里云 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 阿里云 AccessKeySecret。 AccessKeySecret string `json:"accessKeySecret"` - Region string `json:"region"` + // 阿里云地域。 + Region string `json:"region"` } type AliyunSLBUploader struct { diff --git a/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go b/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go index a5364a02..471debdd 100644 --- a/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go +++ b/internal/pkg/core/uploader/providers/byteplus-cdn/byteplus_cdn.go @@ -19,7 +19,9 @@ import ( ) type ByteplusCDNUploaderConfig struct { + // BytePlus AccessKey。 AccessKey string `json:"accessKey"` + // BytePlus SecretKey。 SecretKey string `json:"secretKey"` } diff --git a/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go b/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go index 1daec4bb..a38e832c 100644 --- a/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go +++ b/internal/pkg/core/uploader/providers/dogecloud/dogecloud.go @@ -13,7 +13,9 @@ import ( ) type DogeCloudUploaderConfig struct { + // 多吉云 AccessKey。 AccessKey string `json:"accessKey"` + // 多吉云 SecretKey。 SecretKey string `json:"secretKey"` } diff --git a/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go b/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go index 526d35ef..42c4747f 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-elb/huaweicloud_elb.go @@ -22,9 +22,12 @@ import ( ) type HuaweiCloudELBUploaderConfig struct { - AccessKeyId string `json:"accessKeyId"` + // 华为云 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 华为云 SecretAccessKey。 SecretAccessKey string `json:"secretAccessKey"` - Region string `json:"region"` + // 华为云地域。 + Region string `json:"region"` } type HuaweiCloudELBUploader struct { diff --git a/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go b/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go index 6d85fbff..1c219c79 100644 --- a/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go +++ b/internal/pkg/core/uploader/providers/huaweicloud-scm/huaweicloud_scm.go @@ -18,9 +18,12 @@ import ( ) type HuaweiCloudSCMUploaderConfig struct { - AccessKeyId string `json:"accessKeyId"` + // 华为云 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 华为云 SecretAccessKey。 SecretAccessKey string `json:"secretAccessKey"` - Region string `json:"region"` + // 华为云地域。 + Region string `json:"region"` } type HuaweiCloudSCMUploader struct { diff --git a/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go b/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go index afd36316..d5912988 100644 --- a/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go +++ b/internal/pkg/core/uploader/providers/qiniu-sslcert/qiniu_sslcert.go @@ -15,7 +15,9 @@ import ( ) type QiniuSSLCertUploaderConfig struct { + // 七牛云 AccessKey。 AccessKey string `json:"accessKey"` + // 七牛云 SecretKey。 SecretKey string `json:"secretKey"` } diff --git a/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go b/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go index f0755f3e..a94af000 100644 --- a/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go +++ b/internal/pkg/core/uploader/providers/tencentcloud-ssl/tencentcloud_ssl.go @@ -13,7 +13,9 @@ import ( ) type TencentCloudSSLUploaderConfig struct { - SecretId string `json:"secretId"` + // 腾讯云 SecretId。 + SecretId string `json:"secretId"` + // 腾讯云 SecretKey。 SecretKey string `json:"secretKey"` } diff --git a/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go b/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go index 7822a02d..3da0d732 100644 --- a/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go +++ b/internal/pkg/core/uploader/providers/volcengine-cdn/volcengine_cdn.go @@ -19,7 +19,9 @@ import ( ) type VolcEngineCDNUploaderConfig struct { - AccessKeyId string `json:"accessKeyId"` + // 火山引擎 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 火山引擎 AccessKeySecret。 AccessKeySecret string `json:"accessKeySecret"` } diff --git a/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go b/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go index a9ee7008..bad76a67 100644 --- a/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go +++ b/internal/pkg/core/uploader/providers/volcengine-live/volcengine_live.go @@ -16,7 +16,9 @@ import ( ) type VolcEngineLiveUploaderConfig struct { - AccessKeyId string `json:"accessKeyId"` + // 火山引擎 AccessKeyId。 + AccessKeyId string `json:"accessKeyId"` + // 火山引擎 AccessKeySecret。 AccessKeySecret string `json:"accessKeySecret"` } From 4f2363230d939a2613541420c5c81da038cd8b18 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 25 Nov 2024 21:28:07 +0800 Subject: [PATCH 02/25] chore: fix typo --- .../workflow/DropdownMenuItemIcon.tsx | 6 ++--- ui/src/domain/settings.ts | 4 +-- ui/src/domain/workflow.ts | 27 ++++++++++--------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ui/src/components/workflow/DropdownMenuItemIcon.tsx b/ui/src/components/workflow/DropdownMenuItemIcon.tsx index 95c937a0..537d8efa 100644 --- a/ui/src/components/workflow/DropdownMenuItemIcon.tsx +++ b/ui/src/components/workflow/DropdownMenuItemIcon.tsx @@ -1,4 +1,4 @@ -import { WorkflowwNodeDropdwonItemIcon, WorkflowwNodeDropdwonItemIconType } from "@/domain/workflow"; +import { WorkflowNodeDropdwonItemIcon, WorkflowNodeDropdwonItemIconType } from "@/domain/workflow"; import { CloudUpload, GitFork, Megaphone, NotebookPen } from "lucide-react"; const icons = new Map([ @@ -8,9 +8,9 @@ const icons = new Map([ ["Megaphone", ], ]); -const DropdownMenuItemIcon = ({ type, name }: WorkflowwNodeDropdwonItemIcon) => { +const DropdownMenuItemIcon = ({ type, name }: WorkflowNodeDropdwonItemIcon) => { const getIcon = () => { - if (type === WorkflowwNodeDropdwonItemIconType.Icon) { + if (type === WorkflowNodeDropdwonItemIconType.Icon) { return icons.get(name); } else { return ; diff --git a/ui/src/domain/settings.ts b/ui/src/domain/settings.ts index 8709e67b..46803370 100644 --- a/ui/src/domain/settings.ts +++ b/ui/src/domain/settings.ts @@ -56,8 +56,8 @@ export const channels: ChannelLabel[] = [ label: "common.provider.serverchan", }, { - name: "mail", - label: "common.provider.mail", + name: "email", + label: "common.provider.email", }, { name: "bark", diff --git a/ui/src/domain/workflow.ts b/ui/src/domain/workflow.ts index d200b5b4..0f74bc09 100644 --- a/ui/src/domain/workflow.ts +++ b/ui/src/domain/workflow.ts @@ -1,5 +1,6 @@ import { produce } from "immer"; import { nanoid } from "nanoid"; + import i18n from "@/i18n"; import { deployTargets, KVType } from "./domain"; @@ -399,44 +400,44 @@ export type WorkflowBranchNode = { next?: WorkflowNode | WorkflowBranchNode; }; -type WorkflowwNodeDropdwonItem = { +type WorkflowNodeDropdwonItem = { type: WorkflowNodeType; providerType?: string; name: string; - icon: WorkflowwNodeDropdwonItemIcon; + icon: WorkflowNodeDropdwonItemIcon; leaf?: boolean; - children?: WorkflowwNodeDropdwonItem[]; + children?: WorkflowNodeDropdwonItem[]; }; -export enum WorkflowwNodeDropdwonItemIconType { +export enum WorkflowNodeDropdwonItemIconType { Icon, Provider, } -export type WorkflowwNodeDropdwonItemIcon = { - type: WorkflowwNodeDropdwonItemIconType; +export type WorkflowNodeDropdwonItemIcon = { + type: WorkflowNodeDropdwonItemIconType; name: string; }; -const workflowNodeDropdownDeployList: WorkflowwNodeDropdwonItem[] = deployTargets.map((item) => { +const workflowNodeDropdownDeployList: WorkflowNodeDropdwonItem[] = deployTargets.map((item) => { return { type: WorkflowNodeType.Apply, providerType: item.type, name: i18n.t(item.name), leaf: true, icon: { - type: WorkflowwNodeDropdwonItemIconType.Provider, + type: WorkflowNodeDropdwonItemIconType.Provider, name: item.icon, }, }; }); -export const workflowNodeDropdownList: WorkflowwNodeDropdwonItem[] = [ +export const workflowNodeDropdownList: WorkflowNodeDropdwonItem[] = [ { type: WorkflowNodeType.Apply, name: workflowNodeTypeDefaultName.get(WorkflowNodeType.Apply) ?? "", icon: { - type: WorkflowwNodeDropdwonItemIconType.Icon, + type: WorkflowNodeDropdwonItemIconType.Icon, name: "NotebookPen", }, leaf: true, @@ -445,7 +446,7 @@ export const workflowNodeDropdownList: WorkflowwNodeDropdwonItem[] = [ type: WorkflowNodeType.Deploy, name: workflowNodeTypeDefaultName.get(WorkflowNodeType.Deploy) ?? "", icon: { - type: WorkflowwNodeDropdwonItemIconType.Icon, + type: WorkflowNodeDropdwonItemIconType.Icon, name: "CloudUpload", }, children: workflowNodeDropdownDeployList, @@ -455,7 +456,7 @@ export const workflowNodeDropdownList: WorkflowwNodeDropdwonItem[] = [ name: workflowNodeTypeDefaultName.get(WorkflowNodeType.Branch) ?? "", leaf: true, icon: { - type: WorkflowwNodeDropdwonItemIconType.Icon, + type: WorkflowNodeDropdwonItemIconType.Icon, name: "GitFork", }, }, @@ -464,7 +465,7 @@ export const workflowNodeDropdownList: WorkflowwNodeDropdwonItem[] = [ name: workflowNodeTypeDefaultName.get(WorkflowNodeType.Notify) ?? "", leaf: true, icon: { - type: WorkflowwNodeDropdwonItemIconType.Icon, + type: WorkflowNodeDropdwonItemIconType.Icon, name: "Megaphone", }, }, From 668f6ee36fb25eb3e449cd6e37718dfaee22779f Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 25 Nov 2024 21:28:38 +0800 Subject: [PATCH 03/25] feat(ui): use ant-design --- ui/package-lock.json | 965 ++++++++++++++++++++++++++++++++++++++++++- ui/package.json | 1 + ui/src/main.tsx | 12 +- 3 files changed, 970 insertions(+), 8 deletions(-) diff --git a/ui/package-lock.json b/ui/package-lock.json index 39a27371..7170d6e2 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -28,6 +28,7 @@ "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-table": "^8.20.5", + "antd": "^5.22.2", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cmdk": "^1.0.0", @@ -98,6 +99,96 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.1.0.tgz", + "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", + "dependencies": { + "@ctrl/tinycolor": "^3.6.1" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.22.0", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.22.0.tgz", + "integrity": "sha512-W9XSFeRPR0mAN3OuxfuS/xhENCYKf+8s+QyNNER0FSWoK9OpISTag6CCweg6lq0hASQ/2Vcza0Z8/kGivCP0Ng==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.1.tgz", + "integrity": "sha512-2HAiyGGGnM0es40SxdszeQAU5iWp41wBIInq+ONTCKjlSKOrzQfnw4JDtB8IBmqE6tQaEKwmzTP2LGdt5DSwYQ==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.5.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.5.1.tgz", + "integrity": "sha512-0UrM02MA2iDIgvLatWrj6YTCYe0F/cwXvVE0E2SqGrL7PZireQwgEKTKBisWpZyal5eXZLvuM98kju6YtYne8w==", + "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/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/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -400,9 +491,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -459,6 +550,24 @@ "node": ">=6.9.0" } }, + "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/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -2516,6 +2625,146 @@ "resolved": "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz", "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-2.2.5.tgz", + "integrity": "sha512-F1EJ4KjFpGAHAjuKvOyZB/6IZDkVx0bHl0M4fQM5wXcmm7lgTgVSSnR3bXwdmS6jOJGHOqfDxIJW3WUvwMIXhQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@remix-run/router": { "version": "1.18.0", "resolved": "https://registry.npmmirror.com/@remix-run/router/-/router-1.18.0.tgz", @@ -3130,6 +3379,70 @@ "node": ">=4" } }, + "node_modules/antd": { + "version": "5.22.2", + "resolved": "https://registry.npmmirror.com/antd/-/antd-5.22.2.tgz", + "integrity": "sha512-vihhiJbm9VG3d6boUeD1q2MXMax+qBrXhgqCEC+45v8iGUF6m4Ct+lFiCW4oWaN3EABOsbVA6Svy3Rj/QkQFKw==", + "dependencies": { + "@ant-design/colors": "^7.1.0", + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/cssinjs-utils": "^1.1.1", + "@ant-design/icons": "^5.5.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.25.7", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.5", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.30.0", + "rc-checkbox": "~3.3.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.2.0", + "rc-dropdown": "~4.2.0", + "rc-field-form": "~2.5.1", + "rc-image": "~7.11.0", + "rc-input": "~1.6.3", + "rc-input-number": "~9.3.0", + "rc-mentions": "~2.17.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.9.3", + "rc-notification": "~5.6.2", + "rc-pagination": "~4.3.0", + "rc-picker": "~4.8.1", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.5.0", + "rc-select": "~14.16.3", + "rc-slider": "~11.1.7", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.48.1", + "rc-tabs": "~15.4.0", + "rc-textarea": "~1.8.2", + "rc-tooltip": "~6.2.1", + "rc-tree": "~5.10.1", + "rc-tree-select": "~5.24.4", + "rc-upload": "~4.8.1", + "rc-util": "^5.43.0", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", @@ -3386,6 +3699,11 @@ "node": ">=6" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", @@ -3777,6 +4095,11 @@ "node": ">= 6" } }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", @@ -3789,6 +4112,14 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", @@ -3840,8 +4171,12 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { "version": "4.3.5", @@ -4885,6 +5220,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", @@ -5575,6 +5918,577 @@ } ] }, + "node_modules/rc-cascader": { + "version": "3.30.0", + "resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.30.0.tgz", + "integrity": "sha512-rrzSbk1Bdqbu+pDwiLCLHu72+lwX9BZ28+JKzoi0DWZ4N29QYFeip8Gctl33QVd2Xg3Rf14D3yAOG76ElJw16w==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.10.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.3.0.tgz", + "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-7.2.0.tgz", + "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.2.0.tgz", + "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.5.1.tgz", + "integrity": "sha512-33hunXwynQJyeae7LS3hMGTXNeRBjiPyPYgB0824EbmLHiXC1EBGyUwRh6xjLRy9c+en5WARYN0gJz5+JAqwig==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.11.0", + "resolved": "https://registry.npmmirror.com/rc-image/-/rc-image-7.11.0.tgz", + "integrity": "sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/rc-input/-/rc-input-1.6.3.tgz", + "integrity": "sha512-wI4NzuqBS8vvKr8cljsvnTUqItMfG1QbJoxovCgL+DX4eVUcHIjVwharwevIxyy7H/jbLryh+K7ysnJr23aWIA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.3.0", + "resolved": "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-9.3.0.tgz", + "integrity": "sha512-JQ363ywqRyxwgVxpg2z2kja3CehTpYdqR7emJ/6yJjRdbvo+RvfE83fcpBCIJRq3zLp8SakmEXq60qzWyZ7Usw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.6.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.17.0", + "resolved": "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.17.0.tgz", + "integrity": "sha512-sfHy+qLvc+p8jx8GUsujZWXDOIlIimp6YQz7N5ONQ6bHsa2kyG+BLa5k2wuxgebBbH97is33wxiyq5UkiXRpHA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.6.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.8.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.0", + "resolved": "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.16.0.tgz", + "integrity": "sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.3", + "resolved": "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.3.tgz", + "integrity": "sha512-rkW47ABVkic7WEB0EKJqzySpvDqwl60/tdkY7hWP7dYnh5pm0SzJpo54oW3TDUGXV5wfxXFmMkxrzRRbotQ0+w==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.6.2.tgz", + "integrity": "sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-4.3.0.tgz", + "integrity": "sha512-UubEWA0ShnroQ1tDa291Fzw6kj0iOeF26IsUObxYTpimgj4/qPCWVFl18RLZE+0Up1IZg0IK4pMn6nB3mjvB7g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.8.2", + "resolved": "https://registry.npmmirror.com/rc-picker/-/rc-picker-4.8.2.tgz", + "integrity": "sha512-I6Nn4ngkRskSD//rsXDvjlEQ8CzX9kPQrUIb7+qTY49erJaa3/oKJWmi6JIxo/A7gy59phNmPTdhKosAa/NrQQ==", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.13.0.tgz", + "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.5.0.tgz", + "integrity": "sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.3", + "resolved": "https://registry.npmmirror.com/rc-select/-/rc-select-14.16.3.tgz", + "integrity": "sha512-51+j6s3fJJJXB7E+B6W1hM4Tjzv1B/Decooz9ilgegDBt3ZAth1b/xMwYCTrT5BbG2e53XACQsyDib2+3Ro1fg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.7", + "resolved": "https://registry.npmmirror.com/rc-slider/-/rc-slider-11.1.7.tgz", + "integrity": "sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.48.1", + "resolved": "https://registry.npmmirror.com/rc-table/-/rc-table-7.48.1.tgz", + "integrity": "sha512-Z4mDKjWg+xz/Ezdw6ivWcbqRpaJ0QfCORRoRrlrw65KSGZLK8OcTdacH22/fyGb8L4It/0/9qcMm8VrVAk/WBw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.41.0", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.4.0", + "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.4.0.tgz", + "integrity": "sha512-llKuyiAVqmXm2z7OrmhX5cNb2ueZaL8ZyA2P4R+6/72NYYcbEgOXibwHiQCFY2RiN3swXl53SIABi2CumUS02g==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.8.2.tgz", + "integrity": "sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.6.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.2.1.tgz", + "integrity": "sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.10.1", + "resolved": "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.10.1.tgz", + "integrity": "sha512-FPXb3tT/u39mgjr6JNlHaUTYfHkVGW56XaGDahDpEFLGsnPxGcVLNTjcqoQb/GNbSCycl7tD7EvIymwOTP0+Yw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.24.5", + "resolved": "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.24.5.tgz", + "integrity": "sha512-PnyR8LZJWaiEFw0SHRqo4MNQWyyZsyMs8eNmo68uXZWjxc7QqeWcjPPoONN0rc90c3HZqGF9z+Roz+GLzY5GXA==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.10.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.8.1", + "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.8.1.tgz", + "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.43.0", + "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.43.0.tgz", + "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.15.0", + "resolved": "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.15.0.tgz", + "integrity": "sha512-dF2YQztqrU3ijAeWOqscTshCEr7vpimzSqAVjO1AyAmaqcHulaXpnGR0ptK5PXfxTUy48VkJOiglMIxlkYGs0w==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", @@ -5634,6 +6548,11 @@ } } }, + "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/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.2.tgz", @@ -5778,6 +6697,11 @@ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", @@ -5898,6 +6822,14 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz", @@ -5970,6 +6902,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", @@ -6065,6 +7002,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz", @@ -6222,6 +7164,14 @@ "node": ">=0.8" } }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -6242,6 +7192,11 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", diff --git a/ui/package.json b/ui/package.json index 9ef49558..eb6b0da7 100644 --- a/ui/package.json +++ b/ui/package.json @@ -30,6 +30,7 @@ "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-table": "^8.20.5", + "antd": "^5.22.2", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cmdk": "^1.0.0", diff --git a/ui/src/main.tsx b/ui/src/main.tsx index d9248981..79332280 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -1,16 +1,22 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { RouterProvider } from "react-router-dom"; +import { ConfigProvider } from "antd"; +import AntdLocaleZhCN from "antd/locale/zh_CN"; +import "dayjs/locale/zh-cn"; import { router } from "./router.tsx"; import { ThemeProvider } from "./components/ThemeProvider.tsx"; import "./i18n"; import "./global.css"; +// TODO: antd i18n ReactDOM.createRoot(document.getElementById("root")!).render( - - - + + + + + ); From c522196029359811a96da2fd2f5e11e82d3bbbb6 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 4 Dec 2024 21:55:52 +0800 Subject: [PATCH 04/25] feat(ui): new WorkflowList UI using antd --- ui/package-lock.json | 478 ++++++++++++++++++++ ui/package.json | 1 + ui/src/api/notify.ts | 4 +- ui/src/api/statistics.ts | 4 +- ui/src/api/workflow.ts | 4 +- ui/src/i18n/locales/en/nls.common.json | 1 + ui/src/i18n/locales/en/nls.domain.json | 2 +- ui/src/i18n/locales/en/nls.workflow.json | 7 +- ui/src/i18n/locales/zh/nls.common.json | 1 + ui/src/i18n/locales/zh/nls.domain.json | 2 +- ui/src/i18n/locales/zh/nls.workflow.json | 9 +- ui/src/main.tsx | 21 +- ui/src/pages/DashboardLayout.tsx | 15 +- ui/src/pages/LoginLayout.tsx | 4 +- ui/src/pages/dashboard/Dashboard.tsx | 4 +- ui/src/pages/login/Login.tsx | 4 +- ui/src/pages/setting/Account.tsx | 8 +- ui/src/pages/setting/Password.tsx | 8 +- ui/src/pages/workflow/WorkflowList.tsx | 248 ++++++++++ ui/src/pages/workflow/index.tsx | 224 --------- ui/src/repository/access.ts | 10 +- ui/src/repository/certificate.ts | 4 +- ui/src/repository/deployment.ts | 4 +- ui/src/repository/domains.ts | 16 +- ui/src/repository/{api.ts => pocketbase.ts} | 2 +- ui/src/repository/settings.ts | 8 +- ui/src/repository/workflow.ts | 81 ++-- ui/src/router.tsx | 6 +- 28 files changed, 838 insertions(+), 342 deletions(-) create mode 100644 ui/src/pages/workflow/WorkflowList.tsx delete mode 100644 ui/src/pages/workflow/index.tsx rename ui/src/repository/{api.ts => pocketbase.ts} (84%) diff --git a/ui/package-lock.json b/ui/package-lock.json index 7170d6e2..88ff0bf6 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -8,6 +8,7 @@ "name": "ui", "version": "0.0.0", "dependencies": { + "@ant-design/pro-components": "^2.8.2", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", @@ -174,6 +175,286 @@ "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/pro-card": { + "version": "2.9.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-card/-/pro-card-2.9.2.tgz", + "integrity": "sha512-mKOmNb7jc3Pz41RrPY7EFKRWBjLdN4tp9yzmRkS2g8K7P3pW435f7Ip6rc+58FWDzbZa8lElTGPxAoFB/dq7LA==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-utils": "2.16.2", + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "omit.js": "^2.0.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-components": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-components/-/pro-components-2.8.2.tgz", + "integrity": "sha512-gSzt/Pw1ayZeHhxh5yaeP7pGpk0V2ZsB4PZab0s6V88O15Ql3w5ciYTObxbxGXMPc+A72AwVThoYLv2ZIl3cMA==", + "dependencies": { + "@ant-design/pro-card": "2.9.2", + "@ant-design/pro-descriptions": "2.6.2", + "@ant-design/pro-field": "2.17.2", + "@ant-design/pro-form": "2.31.2", + "@ant-design/pro-layout": "7.21.2", + "@ant-design/pro-list": "2.6.2", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-skeleton": "2.2.1", + "@ant-design/pro-table": "3.18.2", + "@ant-design/pro-utils": "2.16.2", + "@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.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-descriptions/-/pro-descriptions-2.6.2.tgz", + "integrity": "sha512-IrXf4qNMyaypEhO54oZDOFNJ9jrQgg2ovARY7hHRZCChC+I2xVGFCFWXrmtyS82kusxHb6OlLw20ahm+TLZ71w==", + "dependencies": { + "@ant-design/pro-field": "2.17.2", + "@ant-design/pro-form": "2.31.2", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-skeleton": "2.2.1", + "@ant-design/pro-utils": "2.16.2", + "@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": "2.17.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-field/-/pro-field-2.17.2.tgz", + "integrity": "sha512-cebfWGaE6MYwfchXpU9xA6jPETZOvk3i9+1IvebjSEKKVXecXuA+muZorpwYzORmkgGBmSPyR0KW+6Ttgtmg9Q==", + "dependencies": { + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-utils": "2.16.2", + "@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", + "omit.js": "^2.0.2", + "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-form": { + "version": "2.31.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-form/-/pro-form-2.31.2.tgz", + "integrity": "sha512-fzchlk+vGi8rCpmC62/SrikuwC2ZpyKnvNVAyihPCNe9oyyv+LD2TZAD0fbshfifP/1aHOOtS4fb7ptYq+LarQ==", + "dependencies": { + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-field": "2.17.2", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-utils": "2.16.2", + "@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", + "omit.js": "^2.0.2", + "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-layout": { + "version": "7.21.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-layout/-/pro-layout-7.21.2.tgz", + "integrity": "sha512-dtqap5YNDrxUWxhi43QJQSv1JLHYPCV4/h4cFM10HNiX/86Cxw37DiCOMdIM/ZwWk619BiwN7CJNgL5Q8obrAQ==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-utils": "2.16.2", + "@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", + "omit.js": "^2.0.2", + "path-to-regexp": "8.0.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-list": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-list/-/pro-list-2.6.2.tgz", + "integrity": "sha512-BEM/WFe8vj4TCdsxa1JDQwl87Xb7oj+3bxA8yLDjRWWwX+D9UuxdYyB2lZsFfSEnphau/mccDE3K/Lbtim6yJg==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-card": "2.9.2", + "@ant-design/pro-field": "2.17.2", + "@ant-design/pro-table": "3.18.2", + "@ant-design/pro-utils": "2.16.2", + "@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/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.15.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-provider/-/pro-provider-2.15.2.tgz", + "integrity": "sha512-7WSJcjYIuLwco1YiiSgEEJnrqvg7x/YZap8pxOChRnyNh9S3HuV1D5HTc18kfHTpWqZWTAUcS66b0kMP96uKrw==", + "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.18.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-table/-/pro-table-3.18.2.tgz", + "integrity": "sha512-IIhWXvpBfdy1hqh0qYQOou6tDawrisFYwFhYdiMwuCnvy7UvaHi/JS4yikMe+KG0XVdh6xxfrF1Ad39SR8CrxQ==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-card": "2.9.2", + "@ant-design/pro-field": "2.17.2", + "@ant-design/pro-form": "2.31.2", + "@ant-design/pro-provider": "2.15.2", + "@ant-design/pro-utils": "2.16.2", + "@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", + "omit.js": "^2.0.2", + "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-utils": { + "version": "2.16.2", + "resolved": "https://registry.npmmirror.com/@ant-design/pro-utils/-/pro-utils-2.16.2.tgz", + "integrity": "sha512-ama73ZSzz9O6Qz6DvHd6cnyUA3vI7N+AAl5BV5plijujtnXpNC8KJMXl9jOI1K7QuUVJgJIKbZ2DVm8LnBcTAQ==", + "dependencies": { + "@ant-design/icons": "^5.0.0", + "@ant-design/pro-provider": "2.15.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/react-slick": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz", @@ -550,6 +831,18 @@ "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/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -558,6 +851,68 @@ "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.2.0", + "resolved": "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.2.0.tgz", + "integrity": "sha512-KVK/CJmaYGTxTPU6P0+Oy4itgffTUa80B8317sXzfOr1qUzSL29jE7Th11llXiu2haB7B9Glpzo2CDElin+geQ==", + "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/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", @@ -3297,6 +3652,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "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/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -3343,6 +3711,14 @@ "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/ajv": { "version": "6.12.6", "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", @@ -3704,6 +4080,11 @@ "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", @@ -5321,6 +5702,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5510,6 +5901,11 @@ "node": ">= 6" } }, + "node_modules/omit.js": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-2.0.2.tgz", + "integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", @@ -5639,6 +6035,14 @@ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, + "node_modules/path-to-regexp": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.0.0.tgz", + "integrity": "sha512-GAWaqWlTjYK/7SVpIUA6CTxmcg65SP30sbjdCvyYReosRkk7Z/LyHWwkK3Vu0FcIi0FNTADUs4eh1AsU5s10cg==", + "engines": { + "node": ">=16" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", @@ -5890,6 +6294,21 @@ "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/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/punycode": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", @@ -6553,6 +6972,11 @@ "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.14.2", "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.2.tgz", @@ -6659,6 +7083,14 @@ } } }, + "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", @@ -6814,6 +7246,14 @@ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "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", @@ -6847,6 +7287,11 @@ "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7070,6 +7515,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swr": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/swr/-/swr-2.2.5.tgz", + "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", + "dependencies": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/synckit": { "version": "0.9.2", "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.9.2.tgz", @@ -7172,6 +7629,11 @@ "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/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7356,6 +7818,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -7440,6 +7910,14 @@ "node": ">=0.10.0" } }, + "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/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/ui/package.json b/ui/package.json index eb6b0da7..69387634 100644 --- a/ui/package.json +++ b/ui/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@ant-design/pro-components": "^2.8.2", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", diff --git a/ui/src/api/notify.ts b/ui/src/api/notify.ts index 52400b32..98a579c8 100644 --- a/ui/src/api/notify.ts +++ b/ui/src/api/notify.ts @@ -1,7 +1,7 @@ -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; export const notifyTest = async (channel: string) => { - const pb = getPb(); + const pb = getPocketBase(); const resp = await pb.send("/api/notify/test", { method: "POST", diff --git a/ui/src/api/statistics.ts b/ui/src/api/statistics.ts index 11b84d27..56a0471f 100644 --- a/ui/src/api/statistics.ts +++ b/ui/src/api/statistics.ts @@ -1,7 +1,7 @@ -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; export const get = async () => { - const pb = getPb(); + const pb = getPocketBase(); const resp = await pb.send("/api/statistics/get", { method: "GET", diff --git a/ui/src/api/workflow.ts b/ui/src/api/workflow.ts index f639e9b9..9fcf94a4 100644 --- a/ui/src/api/workflow.ts +++ b/ui/src/api/workflow.ts @@ -1,7 +1,7 @@ -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; export const run = async (id: string) => { - const pb = getPb(); + const pb = getPocketBase(); const resp = await pb.send("/api/workflow/run", { method: "POST", diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index 559557b4..fd5aa42b 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -30,6 +30,7 @@ "common.text.updated_at": "Updated At", "common.text.operations": "Operations", "common.text.nodata": "No data available", + "common.text.request_error": "Request error", "common.menu.settings": "Settings", "common.menu.logout": "Logout", diff --git a/ui/src/i18n/locales/en/nls.domain.json b/ui/src/i18n/locales/en/nls.domain.json index 068aec7a..8d6e042f 100644 --- a/ui/src/i18n/locales/en/nls.domain.json +++ b/ui/src/i18n/locales/en/nls.domain.json @@ -40,7 +40,7 @@ "domain.application.form.key_algorithm.label": "Certificate Key Algorithm (Default: RSA2048)", "domain.application.form.key_algorithm.placeholder": "Please select certificate key algorithm", "domain.application.form.timeout.label": "DNS Propagation Timeout (Seconds)", - "domain.application.form.timeoue.placeholder": "Please enter maximum waiting time for DNS propagation", + "domain.application.form.timeout.placeholder": "Please enter maximum waiting time for DNS propagation", "domain.application.form.disable_follow_cname.label": "Disable DNS CNAME following", "domain.application.form.disable_follow_cname.tips": "This option will disable Acme DNS authentication CNAME follow. If you don't understand this option, just keep it by default. ", "domain.application.form.disable_follow_cname.tips_link": "Learn more", diff --git a/ui/src/i18n/locales/en/nls.workflow.json b/ui/src/i18n/locales/en/nls.workflow.json index d85c7ed7..ba27b49e 100644 --- a/ui/src/i18n/locales/en/nls.workflow.json +++ b/ui/src/i18n/locales/en/nls.workflow.json @@ -20,15 +20,15 @@ "workflow.props.description.placeholder": "Please enter description", "workflow.props.executionMethod": "Execution Method", "workflow.props.enabled": "Enabled", - "workflow.props.created": "Created", - "workflow.props.updated": "Updated", + "workflow.props.createdAt": "Created", + "workflow.props.updatedAt": "Updated", "workflow.action": "Action", "workflow.action.edit": "Edit", "workflow.action.create": "Create Workflow", "workflow.action.delete.alert.title": "Delete Workflow", - "workflow.action.delete.alert.description": "Are you sure you want to delete this workflow?", + "workflow.action.delete.alert.content": "Are you sure you want to delete this workflow?", "workflow.history.page.title": "Logs", "workflow.history.props.state": "State", @@ -68,4 +68,3 @@ "workflow.node.notify.form.channel.placeholder": "Please select channel", "workflow.node.notify.form.settingChannel.label": "Setting Channel" } - diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index 691e9a34..760edc0d 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -30,6 +30,7 @@ "common.text.updated_at": "更新时间", "common.text.operations": "操作", "common.text.nodata": "暂无数据", + "common.text.request_error": "请求错误", "common.menu.settings": "系统设置", "common.menu.logout": "退出登录", diff --git a/ui/src/i18n/locales/zh/nls.domain.json b/ui/src/i18n/locales/zh/nls.domain.json index 36f6e44d..743c83a3 100644 --- a/ui/src/i18n/locales/zh/nls.domain.json +++ b/ui/src/i18n/locales/zh/nls.domain.json @@ -40,7 +40,7 @@ "domain.application.form.key_algorithm.label": "数字证书算法(默认:RSA2048)", "domain.application.form.key_algorithm.placeholder": "请选择数字证书算法", "domain.application.form.timeout.label": "DNS 传播检查超时时间(单位:秒)", - "domain.application.form.timeoue.placeholder": "请输入 DNS 传播检查超时时间", + "domain.application.form.timeout.placeholder": "请输入 DNS 传播检查超时时间", "domain.application.form.disable_follow_cname.label": "禁用 DNS CNAME 跟随", "domain.application.form.disable_follow_cname.tips": "该选项将禁用 Acme DNS 认证 CNAME 跟随,如果你不了解此选项保持默认即可,", "domain.application.form.disable_follow_cname.tips_link": "了解更多", diff --git a/ui/src/i18n/locales/zh/nls.workflow.json b/ui/src/i18n/locales/zh/nls.workflow.json index a870fae8..915d628e 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.json +++ b/ui/src/i18n/locales/zh/nls.workflow.json @@ -20,15 +20,15 @@ "workflow.props.description.placeholder": "请输入描述", "workflow.props.executionMethod": "执行方式", "workflow.props.enabled": "是否启用", - "workflow.props.created": "创建时间", - "workflow.props.updated": "更新时间", + "workflow.props.createdAt": "创建时间", + "workflow.props.updatedAt": "更新时间", "workflow.action": "操作", "workflow.action.edit": "编辑", - "workflow.action.create": "创建工作流", + "workflow.action.create": "新建工作流", "workflow.action.delete.alert.title": "删除工作流", - "workflow.action.delete.alert.description": "确定要删除此工作流吗?", + "workflow.action.delete.alert.content": "确定要删除此工作流吗?", "workflow.history.page.title": "日志", "workflow.history.props.state": "状态", @@ -68,4 +68,3 @@ "workflow.node.notify.form.channel.placeholder": "请选择推送渠道", "workflow.node.notify.form.settingChannel.label": "设置推送渠道" } - diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 79332280..97fcfd1e 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -1,7 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { RouterProvider } from "react-router-dom"; -import { ConfigProvider } from "antd"; +import { App, ConfigProvider } from "antd"; import AntdLocaleZhCN from "antd/locale/zh_CN"; import "dayjs/locale/zh-cn"; @@ -13,10 +13,19 @@ import "./global.css"; // TODO: antd i18n ReactDOM.createRoot(document.getElementById("root")!).render( - - - - - + + + + + + + ); diff --git a/ui/src/pages/DashboardLayout.tsx b/ui/src/pages/DashboardLayout.tsx index 1d9c5c04..74f4759c 100644 --- a/ui/src/pages/DashboardLayout.tsx +++ b/ui/src/pages/DashboardLayout.tsx @@ -8,7 +8,7 @@ import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; import { cn } from "@/lib/utils"; -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; import { ConfigProvider } from "@/providers/config"; import Version from "@/components/certimate/Version"; @@ -18,7 +18,7 @@ export default function Dashboard() { const location = useLocation(); const { t } = useTranslation(); - if (!getPb().authStore.isValid || !getPb().authStore.isAdmin) { + if (!getPocketBase().authStore.isValid || !getPocketBase().authStore.isAdmin) { return ; } @@ -31,7 +31,7 @@ export default function Dashboard() { }; const handleLogoutClick = () => { - getPb().authStore.clear(); + getPocketBase().authStore.clear(); navigate("/login"); }; @@ -57,7 +57,10 @@ export default function Dashboard() { {t("dashboard.page.title")} - + {t("workflow.page.title")} @@ -103,8 +106,8 @@ export default function Dashboard() { {t("dashboard.page.title")} {t("workflow.page.title")} diff --git a/ui/src/pages/LoginLayout.tsx b/ui/src/pages/LoginLayout.tsx index 8a9aa7a4..d8a17702 100644 --- a/ui/src/pages/LoginLayout.tsx +++ b/ui/src/pages/LoginLayout.tsx @@ -1,10 +1,10 @@ import { Navigate, Outlet } from "react-router-dom"; import Version from "@/components/certimate/Version"; -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; const LoginLayout = () => { - if (getPb().authStore.isValid && getPb().authStore.isAdmin) { + if (getPocketBase().authStore.isValid && getPocketBase().authStore.isAdmin) { return ; } diff --git a/ui/src/pages/dashboard/Dashboard.tsx b/ui/src/pages/dashboard/Dashboard.tsx index 19c88f05..8798e371 100644 --- a/ui/src/pages/dashboard/Dashboard.tsx +++ b/ui/src/pages/dashboard/Dashboard.tsx @@ -101,7 +101,7 @@ const Dashboard = () => {
{statistic?.workflowTotal ? ( - + {statistic?.workflowTotal} ) : ( @@ -122,7 +122,7 @@ const Dashboard = () => {
{statistic?.workflowEnabled ? ( - + {statistic?.workflowEnabled} ) : ( diff --git a/ui/src/pages/login/Login.tsx b/ui/src/pages/login/Login.tsx index eff5fd9d..b3bafb04 100644 --- a/ui/src/pages/login/Login.tsx +++ b/ui/src/pages/login/Login.tsx @@ -8,7 +8,7 @@ import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { getErrMessage } from "@/lib/error"; -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; const formSchema = z.object({ username: z.string().email({ @@ -33,7 +33,7 @@ const Login = () => { // 2. Define a submit handler. const onSubmit = async (values: z.infer) => { try { - await getPb().admins.authWithPassword(values.username, values.password); + await getPocketBase().admins.authWithPassword(values.username, values.password); navigage("/"); } catch (e) { const message = getErrMessage(e); diff --git a/ui/src/pages/setting/Account.tsx b/ui/src/pages/setting/Account.tsx index 0bc55263..c12b6d94 100644 --- a/ui/src/pages/setting/Account.tsx +++ b/ui/src/pages/setting/Account.tsx @@ -10,7 +10,7 @@ import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from " import { Input } from "@/components/ui/input"; import { useToast } from "@/components/ui/use-toast"; import { getErrMessage } from "@/lib/error"; -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; const formSchema = z.object({ email: z.string().email("settings.account.email.errmsg.invalid"), @@ -26,17 +26,17 @@ const Account = () => { const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { - email: getPb().authStore.model?.email, + email: getPocketBase().authStore.model?.email, }, }); const onSubmit = async (values: z.infer) => { try { - await getPb().admins.update(getPb().authStore.model?.id, { + await getPocketBase().admins.update(getPocketBase().authStore.model?.id, { email: values.email, }); - getPb().authStore.clear(); + getPocketBase().authStore.clear(); toast({ title: t("settings.account.email.changed.message"), description: t("settings.account.relogin.message"), diff --git a/ui/src/pages/setting/Password.tsx b/ui/src/pages/setting/Password.tsx index 7bd7371d..0868ecbb 100644 --- a/ui/src/pages/setting/Password.tsx +++ b/ui/src/pages/setting/Password.tsx @@ -9,7 +9,7 @@ import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from " import { Input } from "@/components/ui/input"; import { useToast } from "@/components/ui/use-toast"; import { getErrMessage } from "@/lib/error"; -import { getPb } from "@/repository/api"; +import { getPocketBase } from "@/repository/pocketbase"; const formSchema = z .object({ @@ -44,19 +44,19 @@ const Password = () => { const onSubmit = async (values: z.infer) => { try { - await getPb().admins.authWithPassword(getPb().authStore.model?.email, values.oldPassword); + await getPocketBase().admins.authWithPassword(getPocketBase().authStore.model?.email, values.oldPassword); } catch (e) { const message = getErrMessage(e); form.setError("oldPassword", { message }); } try { - await getPb().admins.update(getPb().authStore.model?.id, { + await getPocketBase().admins.update(getPocketBase().authStore.model?.id, { password: values.newPassword, passwordConfirm: values.confirmPassword, }); - getPb().authStore.clear(); + getPocketBase().authStore.clear(); toast({ title: t("settings.password.changed.message"), description: t("settings.account.relogin.message"), diff --git a/ui/src/pages/workflow/WorkflowList.tsx b/ui/src/pages/workflow/WorkflowList.tsx new file mode 100644 index 00000000..6451698a --- /dev/null +++ b/ui/src/pages/workflow/WorkflowList.tsx @@ -0,0 +1,248 @@ +import { useEffect, useState } from "react"; +import { useNavigate, useSearchParams } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { Button, Modal, notification, Space, Switch, Table, Tooltip, Typography, type TableProps } from "antd"; +import { PageHeader } from "@ant-design/pro-components"; +import { Pencil as PencilIcon, Plus as PlusIcon, Trash2 as Trash2Icon } from "lucide-react"; + +import { Workflow as WorkflowType } from "@/domain/workflow"; +import { list as listWorkflow, remove as removeWorkflow, save as saveWorkflow, type WorkflowListReq } from "@/repository/workflow"; + +const WorkflowList = () => { + const navigate = useNavigate(); + + const { t } = useTranslation(); + + const [modalApi, ModelContextHolder] = Modal.useModal(); + const [notificationApi, NotificationContextHolder] = notification.useNotification(); + + const [loading, setLoading] = useState(false); + + const [searchParams] = useSearchParams(); + + const tableColumns: TableProps["columns"] = [ + { + key: "$index", + align: "center", + title: "", + width: 50, + render: (_, __, index) => (page - 1) * pageSize + index + 1, + }, + { + key: "name", + title: t("common.text.name"), + render: (_, record) => ( + + {record.name} + + {record.description} + + + ), + }, + { + key: "type", + title: t("workflow.props.executionMethod"), + render: (_, record) => { + const method = record.type; + if (!method) { + return "-"; + } else if (method === "manual") { + return {t("workflow.node.start.form.executionMethod.options.manual")}; + } else if (method === "auto") { + return ( + + {t("workflow.node.start.form.executionMethod.options.auto")} + {record.crontab ?? ""} + + ); + } + }, + }, + { + key: "enabled", + title: t("workflow.props.enabled"), + render: (_, record) => { + const enabled = record.enabled; + return ( + <> + { + handleEnabledChange(record.id); + }} + /> + + ); + }, + }, + { + key: "lastExecutedAt", + title: "最近执行状态", + render: () => { + // TODO: 最近执行状态 + return <>TODO; + }, + }, + { + key: "createdAt", + title: t("common.text.created_at"), + ellipsis: true, + render: (_, record) => { + return new Date(record.created!).toLocaleString(); + }, + }, + { + key: "updatedAt", + title: t("common.text.updated_at"), + ellipsis: true, + render: (_, record) => { + return new Date(record.updated!).toLocaleString(); + }, + }, + { + key: "$operations", + align: "end", + width: 100, + render: (_, record) => ( + + + , + ]} + /> + + + columns={tableColumns} + dataSource={tableData} + rowKey={(record) => record.id} + loading={loading} + pagination={{ + current: page, + pageSize: pageSize, + total: tableTotal, + onChange: (page, pageSize) => { + setPage(page); + setPageSize(pageSize); + }, + onShowSizeChange: (page, pageSize) => { + setPage(page); + setPageSize(pageSize); + }, + }} + /> + + {ModelContextHolder} + {NotificationContextHolder} + + ); +}; + +export default WorkflowList; diff --git a/ui/src/pages/workflow/index.tsx b/ui/src/pages/workflow/index.tsx deleted file mode 100644 index bb8460ce..00000000 --- a/ui/src/pages/workflow/index.tsx +++ /dev/null @@ -1,224 +0,0 @@ -import { Button } from "@/components/ui/button"; -import { MoreHorizontal, Plus } from "lucide-react"; -import { useNavigate, useSearchParams } from "react-router-dom"; -import { ColumnDef } from "@tanstack/react-table"; -import { Workflow as WorkflowType } from "@/domain/workflow"; -import { DataTable } from "@/components/workflow/DataTable"; -import { useState } from "react"; -import { list, remove, save, WorkflowListReq } from "@/repository/workflow"; -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; -import { Switch } from "@/components/ui/switch"; - -import { useTranslation } from "react-i18next"; -import CustomAlertDialog from "@/components/workflow/CustomAlertDialog"; - -const Workflow = () => { - const navigate = useNavigate(); - - const [data, setData] = useState([]); - const [pageCount, setPageCount] = useState(0); - - const { t } = useTranslation(); - - const [alertOpen, setAlertOpen] = useState(false); - - const [alertProps, setAlertProps] = useState<{ - title: string; - description: string; - onConfirm: () => void; - }>(); - - const [searchParams] = useSearchParams(); - - const fetchData = async (page: number, pageSize?: number) => { - const state = searchParams.get("state"); - const req: WorkflowListReq = { page: page, perPage: pageSize }; - if (state && state == "enabled") { - req.enabled = true; - } - const resp = await list(req); - setData(resp.items); - setPageCount(resp.totalPages); - }; - - const columns: ColumnDef[] = [ - { - accessorKey: "name", - header: t("workflow.props.name"), - cell: ({ row }) => { - let name: string = row.getValue("name"); - if (!name) { - name = t("workflow.props.name.default"); - } - return
{name}
; - }, - }, - { - accessorKey: "description", - header: t("workflow.props.description"), - cell: ({ row }) => { - let description: string = row.getValue("description"); - if (!description) { - description = "-"; - } - return
{description}
; - }, - }, - { - accessorKey: "type", - header: t("workflow.props.executionMethod"), - cell: ({ row }) => { - const method = row.getValue("type"); - if (!method) { - return "-"; - } else if (method === "manual") { - return t("workflow.node.start.form.executionMethod.options.manual"); - } else if (method === "auto") { - const crontab: string = row.original.crontab ?? ""; - return ( -
-
{t("workflow.node.start.form.executionMethod.options.auto")}
-
{crontab}
-
- ); - } - }, - }, - { - accessorKey: "enabled", - header: t("workflow.props.enabled"), - cell: ({ row }) => { - const enabled: boolean = row.getValue("enabled"); - - return ( - <> - { - handleCheckedChange(row.original.id ?? ""); - }} - onClick={(e) => { - e.stopPropagation(); - }} - /> - - ); - }, - }, - { - accessorKey: "created", - header: t("workflow.props.created"), - cell: ({ row }) => { - const date: string = row.getValue("created"); - return new Date(date).toLocaleString(); - }, - }, - { - accessorKey: "updated", - header: t("workflow.props.updated"), - cell: ({ row }) => { - const date: string = row.getValue("updated"); - return new Date(date).toLocaleString(); - }, - }, - - { - id: "actions", - cell: ({ row }) => { - const workflow = row.original; - return ( - - - - - - {t("workflow.action")} - { - e.stopPropagation(); - navigate(`/workflow/detail?id=${workflow.id}`); - }} - > - {t("workflow.action.edit")} - - { - e.stopPropagation(); - handleDeleteClick(workflow.id ?? ""); - }} - > - {t("common.delete")} - - - - ); - }, - }, - ]; - - const handleCheckedChange = async (id: string) => { - const resp = await save({ id, enabled: !data.find((item) => item.id === id)?.enabled }); - if (resp) { - setData((prev) => { - return prev.map((item) => { - if (item.id === id) { - return resp; - } - return item; - }); - }); - } - }; - - const handleDeleteClick = (id: string) => { - setAlertProps({ - title: t("workflow.action.delete.alert.title"), - description: t("workflow.action.delete.alert.description"), - onConfirm: async () => { - const resp = await remove(id); - if (resp) { - setData((prev) => { - return prev.filter((item) => item.id !== id); - }); - } - }, - }); - setAlertOpen(true); - }; - const handleCreateClick = () => { - navigate("/workflow/detail"); - }; - - const handleRowClick = (id: string) => { - navigate(`/workflow/detail?id=${id}`); - }; - return ( - <> -
-
{t("workflow.page.title")}
- -
- -
- -
- - - - ); -}; - -export default Workflow; diff --git a/ui/src/repository/access.ts b/ui/src/repository/access.ts index fb942c95..0f82ebcd 100644 --- a/ui/src/repository/access.ts +++ b/ui/src/repository/access.ts @@ -1,10 +1,10 @@ import moment from "moment"; import { Access } from "@/domain/access"; -import { getPb } from "./api"; +import { getPocketBase } from "./pocketbase"; export const list = async () => { - return await getPb().collection("access").getFullList({ + return await getPocketBase().collection("access").getFullList({ sort: "-created", filter: "deleted = null", }); @@ -12,12 +12,12 @@ export const list = async () => { export const save = async (data: Access) => { if (data.id) { - return await getPb().collection("access").update(data.id, data); + return await getPocketBase().collection("access").update(data.id, data); } - return await getPb().collection("access").create(data); + return await getPocketBase().collection("access").create(data); }; export const remove = async (data: Access) => { data.deleted = moment.utc().format("YYYY-MM-DD HH:mm:ss"); - return await getPb().collection("access").update(data.id, data); + return await getPocketBase().collection("access").update(data.id, data); }; diff --git a/ui/src/repository/certificate.ts b/ui/src/repository/certificate.ts index 4f04f4c0..8e48b391 100644 --- a/ui/src/repository/certificate.ts +++ b/ui/src/repository/certificate.ts @@ -1,5 +1,5 @@ import { Certificate } from "@/domain/certificate"; -import { getPb } from "./api"; +import { getPocketBase } from "./pocketbase"; import { RecordListOptions } from "pocketbase"; import { getTimeAfter } from "@/lib/time"; @@ -10,7 +10,7 @@ type CertificateListReq = { }; export const list = async (req: CertificateListReq) => { - const pb = getPb(); + const pb = getPocketBase(); let page = 1; if (req.page) { diff --git a/ui/src/repository/deployment.ts b/ui/src/repository/deployment.ts index 46b14b60..277d0f48 100644 --- a/ui/src/repository/deployment.ts +++ b/ui/src/repository/deployment.ts @@ -1,5 +1,5 @@ import { Deployment, DeploymentListReq } from "@/domain/deployment"; -import { getPb } from "./api"; +import { getPocketBase } from "./pocketbase"; export const list = async (req: DeploymentListReq) => { let page = 1; @@ -17,7 +17,7 @@ export const list = async (req: DeploymentListReq) => { filter = `domain="${req.domain}"`; } - return await getPb().collection("deployments").getList(page, perPage, { + return await getPocketBase().collection("deployments").getList(page, perPage, { filter: filter, sort: "-deployedAt", expand: "domain", diff --git a/ui/src/repository/domains.ts b/ui/src/repository/domains.ts index 15e796d7..7940f35d 100644 --- a/ui/src/repository/domains.ts +++ b/ui/src/repository/domains.ts @@ -1,6 +1,6 @@ import { getTimeAfter } from "@/lib/time"; import { Domain } from "@/domain/domain"; -import { getPb } from "./api"; +import { getPocketBase } from "./pocketbase"; type DomainListReq = { domain?: string; @@ -10,7 +10,7 @@ type DomainListReq = { }; export const list = async (req: DomainListReq) => { - const pb = getPb(); + const pb = getPocketBase(); let page = 1; if (req.page) { @@ -43,24 +43,24 @@ export const list = async (req: DomainListReq) => { }; export const get = async (id: string) => { - const response = await getPb().collection("domains").getOne(id); + const response = await getPocketBase().collection("domains").getOne(id); return response; }; export const save = async (data: Domain) => { if (data.id) { - return await getPb().collection("domains").update(data.id, data); + return await getPocketBase().collection("domains").update(data.id, data); } - return await getPb().collection("domains").create(data); + return await getPocketBase().collection("domains").create(data); }; export const remove = async (id: string) => { - return await getPb().collection("domains").delete(id); + return await getPocketBase().collection("domains").delete(id); }; type Callback = (data: Domain) => void; export const subscribeId = (id: string, callback: Callback) => { - return getPb() + return getPocketBase() .collection("domains") .subscribe( id, @@ -76,5 +76,5 @@ export const subscribeId = (id: string, callback: Callback) => { }; export const unsubscribeId = (id: string) => { - getPb().collection("domains").unsubscribe(id); + getPocketBase().collection("domains").unsubscribe(id); }; diff --git a/ui/src/repository/api.ts b/ui/src/repository/pocketbase.ts similarity index 84% rename from ui/src/repository/api.ts rename to ui/src/repository/pocketbase.ts index 2118764c..f705ae6f 100644 --- a/ui/src/repository/api.ts +++ b/ui/src/repository/pocketbase.ts @@ -4,7 +4,7 @@ const apiDomain = import.meta.env.VITE_API_DOMAIN; console.log(apiDomain); let pb: PocketBase; -export const getPb = () => { +export const getPocketBase = () => { if (pb) return pb; pb = new PocketBase("/"); return pb; diff --git a/ui/src/repository/settings.ts b/ui/src/repository/settings.ts index 5894c50c..1b008f57 100644 --- a/ui/src/repository/settings.ts +++ b/ui/src/repository/settings.ts @@ -1,9 +1,9 @@ import { EmailsSetting, Setting } from "@/domain/settings"; -import { getPb } from "./api"; +import { getPocketBase } from "./pocketbase"; export const getEmails = async () => { try { - const resp = await getPb().collection("settings").getFirstListItem>("name='emails'"); + const resp = await getPocketBase().collection("settings").getFirstListItem>("name='emails'"); return resp; } catch (e) { return { @@ -14,7 +14,7 @@ export const getEmails = async () => { export const getSetting = async (name: string) => { try { - const resp = await getPb().collection("settings").getFirstListItem>(`name='${name}'`); + const resp = await getPocketBase().collection("settings").getFirstListItem>(`name='${name}'`); return resp; } catch (e) { const rs: Setting = { @@ -25,7 +25,7 @@ export const getSetting = async (name: string) => { }; export const update = async (setting: Setting) => { - const pb = getPb(); + const pb = getPocketBase(); let resp: Setting; if (setting.id) { resp = await pb.collection("settings").update(setting.id, setting); diff --git a/ui/src/repository/workflow.ts b/ui/src/repository/workflow.ts index 5163533d..7a7be749 100644 --- a/ui/src/repository/workflow.ts +++ b/ui/src/repository/workflow.ts @@ -1,77 +1,58 @@ -import { Workflow, WorkflowNode, WorkflowRunLog } from "@/domain/workflow"; -import { getPb } from "./api"; -import { RecordListOptions } from "pocketbase"; +import { type RecordListOptions } from "pocketbase"; + +import { type Workflow, type WorkflowNode, type WorkflowRunLog } from "@/domain/workflow"; +import { getPocketBase } from "./pocketbase"; + +export type WorkflowListReq = { + page?: number; + perPage?: number; + enabled?: boolean; +}; + +export const list = async (req: WorkflowListReq) => { + const page = req.page || 1; + const perPage = req.perPage || 10; + + const options: RecordListOptions = { sort: "-created" }; + if (req.enabled != null) { + options.filter = getPocketBase().filter("enabled={:enabled}", { enabled: req.enabled }); + } + + return await getPocketBase().collection("workflow").getList(page, perPage, options); +}; export const get = async (id: string) => { - const response = await getPb().collection("workflow").getOne(id); - return response; + return await getPocketBase().collection("workflow").getOne(id); }; export const save = async (data: Record) => { if (data.id) { - return await getPb() + return await getPocketBase() .collection("workflow") .update(data.id as string, data); } - return await getPb().collection("workflow").create(data); -}; -export type WorkflowListReq = { - page: number; - perPage?: number; - enabled?: boolean; -}; -export const list = async (req: WorkflowListReq) => { - let page = 1; - if (req.page) { - page = req.page; - } - let perPage = 10; - if (req.perPage) { - perPage = req.perPage; - } - - const options: RecordListOptions = { - sort: "-created", - }; - - if (req.enabled !== undefined) { - options.filter = getPb().filter("enabled={:enabled}", { - enabled: req.enabled, - }); - } - - const response = await getPb().collection("workflow").getList(page, perPage, options); - - return response; + return await getPocketBase().collection("workflow").create(data); }; export const remove = async (id: string) => { - return await getPb().collection("workflow").delete(id); + return await getPocketBase().collection("workflow").delete(id); }; type WorkflowLogsReq = { id: string; - page: number; + page?: number; perPage?: number; }; export const logs = async (req: WorkflowLogsReq) => { - let page = 1; - if (req.page) { - page = req.page; - } - let perPage = 10; - if (req.perPage) { - perPage = req.perPage; - } + const page = req.page || 1; + const perPage = req.perPage || 10; - const response = await getPb() + return await getPocketBase() .collection("workflow_run_log") .getList(page, perPage, { sort: "-created", - filter: getPb().filter("workflow={:workflowId}", { workflowId: req.id }), + filter: getPocketBase().filter("workflow={:workflowId}", { workflowId: req.id }), }); - - return response; }; diff --git a/ui/src/router.tsx b/ui/src/router.tsx index bd9e01dd..680e028a 100644 --- a/ui/src/router.tsx +++ b/ui/src/router.tsx @@ -10,7 +10,7 @@ import Dashboard from "./pages/dashboard/Dashboard"; import Account from "./pages/setting/Account"; import Notify from "./pages/setting/Notify"; import SSLProvider from "./pages/setting/SSLProvider"; -import Workflow from "./pages/workflow"; +import WorkflowList from "./pages/workflow/WorkflowList"; import WorkflowDetail from "./pages/workflow/WorkflowDetail"; import Certificate from "./pages/certificate"; @@ -28,8 +28,8 @@ export const router = createHashRouter([ element: , }, { - path: "/workflow", - element: , + path: "/workflows", + element: , }, { path: "/certificate", From 65d9c6fe2fbdbf7ea68644da14c54a1503a14756 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Thu, 5 Dec 2024 21:52:27 +0800 Subject: [PATCH 05/25] feat(ui): new CertificateList UI using antd --- ui/src/i18n/locales/en/nls.certificate.json | 2 +- ui/src/i18n/locales/en/nls.common.json | 6 +- ui/src/i18n/locales/zh/nls.certificate.json | 4 +- ui/src/i18n/locales/zh/nls.common.json | 2 + ui/src/pages/DashboardLayout.tsx | 8 +- ui/src/pages/certificate/index.tsx | 15 -- ui/src/pages/certificates/CertificateList.tsx | 176 ++++++++++++++++++ ui/src/pages/dashboard/Dashboard.tsx | 6 +- .../WorkflowDetail.tsx | 0 .../{workflow => workflows}/WorkflowList.tsx | 9 +- ui/src/repository/certificate.ts | 28 +-- ui/src/repository/workflow.ts | 6 +- ui/src/router.tsx | 10 +- 13 files changed, 216 insertions(+), 56 deletions(-) delete mode 100644 ui/src/pages/certificate/index.tsx create mode 100644 ui/src/pages/certificates/CertificateList.tsx rename ui/src/pages/{workflow => workflows}/WorkflowDetail.tsx (100%) rename ui/src/pages/{workflow => workflows}/WorkflowList.tsx (99%) diff --git a/ui/src/i18n/locales/en/nls.certificate.json b/ui/src/i18n/locales/en/nls.certificate.json index 743e5efd..37bf01ef 100644 --- a/ui/src/i18n/locales/en/nls.certificate.json +++ b/ui/src/i18n/locales/en/nls.certificate.json @@ -9,6 +9,7 @@ "certificate.props.expiry.expired": "Expired", "certificate.props.expiry.text.expire": "Expire", "certificate.props.workflow": "Workflow", + "certificate.props.source": "Source", "certificate.props.created": "Created", "certificate.props.certificate": "Certificate", "certificate.props.private.key": "Private Key", @@ -16,4 +17,3 @@ "certificate.action.view": "View Certificate", "certificate.action.download": "Download Certificate" } - diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index fd5aa42b..22051c9d 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -1,8 +1,9 @@ { + "common.add": "Add", "common.save": "Save", "common.save.succeeded.message": "Save Successful", "common.save.failed.message": "Save Failed", - "common.add": "Add", + "common.view": "View", "common.edit": "Edit", "common.copy": "Copy", "common.download": "Download", @@ -24,8 +25,9 @@ "common.text.dns": "Domain Name Server", "common.text.dns.empty": "No DNS", "common.text.ca": "Certificate Authority", - "common.text.provider": "Provider", "common.text.name": "Name", + "common.text.provider": "Provider", + "common.text.workflow": "Workflow", "common.text.created_at": "Created At", "common.text.updated_at": "Updated At", "common.text.operations": "Operations", diff --git a/ui/src/i18n/locales/zh/nls.certificate.json b/ui/src/i18n/locales/zh/nls.certificate.json index 79598856..249578fd 100644 --- a/ui/src/i18n/locales/zh/nls.certificate.json +++ b/ui/src/i18n/locales/zh/nls.certificate.json @@ -1,5 +1,5 @@ { - "certificate.page.title": "证书", + "certificate.page.title": "证书管理", "certificate.nodata": "暂无证书,添加工作流去生成证书吧😀", @@ -9,6 +9,7 @@ "certificate.props.expiry.expired": "已到期", "certificate.props.expiry.text.expire": "到期", "certificate.props.workflow": "所属工作流", + "certificate.props.source": "来源", "certificate.props.created": "颁发时间", "certificate.props.certificate": "证书", "certificate.props.private.key": "私钥", @@ -16,4 +17,3 @@ "certificate.action.view": "查看证书", "certificate.action.download": "下载证书" } - diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index 760edc0d..0d66a3ba 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -3,6 +3,7 @@ "common.save": "保存", "common.save.succeeded.message": "保存成功", "common.save.failed.message": "保存失败", + "common.view": "查看", "common.edit": "编辑", "common.copy": "复制", "common.download": "下载", @@ -26,6 +27,7 @@ "common.text.ca": "CA(证书颁发机构)", "common.text.name": "名称", "common.text.provider": "服务商", + "common.text.workflow": "工作流", "common.text.created_at": "创建时间", "common.text.updated_at": "更新时间", "common.text.operations": "操作", diff --git a/ui/src/pages/DashboardLayout.tsx b/ui/src/pages/DashboardLayout.tsx index 74f4759c..f577bcb4 100644 --- a/ui/src/pages/DashboardLayout.tsx +++ b/ui/src/pages/DashboardLayout.tsx @@ -66,8 +66,8 @@ export default function Dashboard() { {t("certificate.page.title")} @@ -114,8 +114,8 @@ export default function Dashboard() { {t("certificate.page.title")} diff --git a/ui/src/pages/certificate/index.tsx b/ui/src/pages/certificate/index.tsx deleted file mode 100644 index a9b332c5..00000000 --- a/ui/src/pages/certificate/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import CertificateList from "@/components/certificate/CertificateList"; -import { useTranslation } from "react-i18next"; - -const Certificate = () => { - const { t } = useTranslation(); - return ( -
-
{t("certificate.page.title")}
- - -
- ); -}; - -export default Certificate; diff --git a/ui/src/pages/certificates/CertificateList.tsx b/ui/src/pages/certificates/CertificateList.tsx new file mode 100644 index 00000000..fb1d67e3 --- /dev/null +++ b/ui/src/pages/certificates/CertificateList.tsx @@ -0,0 +1,176 @@ +import { useEffect, useState } from "react"; +import { useNavigate, useSearchParams } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { Button, Space, Table, Tooltip, Typography, type TableProps } from "antd"; +import { PageHeader } from "@ant-design/pro-components"; +import { Eye as EyeIcon } from "lucide-react"; + +import { Certificate as CertificateType } from "@/domain/certificate"; +import { list as listCertificate, type CertificateListReq } from "@/repository/certificate"; +import { diffDays, getLeftDays } from "@/lib/time"; + +const CertificateList = () => { + const { t } = useTranslation(); + + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + + const [loading, setLoading] = useState(false); + + const tableColumns: TableProps["columns"] = [ + { + key: "$index", + align: "center", + title: "", + width: 50, + render: (_, __, index) => (page - 1) * pageSize + index + 1, + }, + { + key: "name", + title: t("common.text.domain"), + render: (_, record) => {record.san}, + }, + { + key: "expiry", + title: t("certificate.props.expiry"), + render: (_, record) => { + const leftDays = getLeftDays(record.expireAt); + const allDays = diffDays(record.expireAt, record.created); + return ( + + {leftDays > 0 ? ( + + {leftDays} / {allDays} {t("certificate.props.expiry.days")} + + ) : ( + {t("certificate.props.expiry.expired")} + )} + + + {new Date(record.expireAt).toLocaleString().split(" ")[0]} {t("certificate.props.expiry.text.expire")} + + + ); + }, + }, + { + key: "source", + title: t("certificate.props.source"), + render: (_, record) => { + const workflowId = record.workflow; + return workflowId ? ( + + {t("common.text.workflow")} + { + navigate(`/workflow/detail?id=${workflowId}`); + }} + > + {record.expand?.workflow?.name ?? ""} + + + ) : ( + <>TODO: 手动上传 + ); + }, + }, + { + key: "createdAt", + title: t("common.text.created_at"), + ellipsis: true, + render: (_, record) => { + return new Date(record.created!).toLocaleString(); + }, + }, + { + key: "updatedAt", + title: t("common.text.updated_at"), + ellipsis: true, + render: (_, record) => { + return new Date(record.updated!).toLocaleString(); + }, + }, + { + key: "$operations", + align: "end", + width: 100, + render: (_, record) => ( + + + +
); diff --git a/ui/src/components/notify/ServerChan.tsx b/ui/src/components/notify/ServerChan.tsx index 0029d00b..4e97294a 100644 --- a/ui/src/components/notify/ServerChan.tsx +++ b/ui/src/components/notify/ServerChan.tsx @@ -96,7 +96,7 @@ const ServerChan = () => { serverchan.data.url = serverchan.data.url.trim(); if (!isValidURL(serverchan.data.url)) { toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: t("common.errmsg.url_invalid"), variant: "destructive", }); @@ -116,14 +116,14 @@ const ServerChan = () => { setChannels(resp); toast({ - title: t("common.save.succeeded.message"), + title: t("common.text.operation_succeeded"), description: t("settings.notification.config.saved.message"), }); } catch (e) { const msg = getErrMsg(e); toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: `${t("settings.notification.config.failed.message")}: ${msg}`, variant: "destructive", }); @@ -183,7 +183,7 @@ const ServerChan = () => { const msg = getErrMsg(e); toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: `${t("settings.notification.config.failed.message")}: ${msg}`, variant: "destructive", }); @@ -225,7 +225,7 @@ const ServerChan = () => { handleSaveClick(); }} > - {t("common.save")} + {t("common.button.save")} diff --git a/ui/src/components/notify/Telegram.tsx b/ui/src/components/notify/Telegram.tsx index b11c8b8e..31d793e5 100644 --- a/ui/src/components/notify/Telegram.tsx +++ b/ui/src/components/notify/Telegram.tsx @@ -109,14 +109,14 @@ const Telegram = () => { setChannels(resp); toast({ - title: t("common.save.succeeded.message"), + title: t("common.text.operation_succeeded"), description: t("settings.notification.config.saved.message"), }); } catch (e) { const msg = getErrMsg(e); toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: `${t("settings.notification.config.failed.message")}: ${msg}`, variant: "destructive", }); @@ -176,7 +176,7 @@ const Telegram = () => { const msg = getErrMsg(e); toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: `${t("settings.notification.config.failed.message")}: ${msg}`, variant: "destructive", }); @@ -238,7 +238,7 @@ const Telegram = () => { handleSaveClick(); }} > - {t("common.save")} + {t("common.button.save")} diff --git a/ui/src/components/notify/Webhook.tsx b/ui/src/components/notify/Webhook.tsx index f8b632da..d9377f43 100644 --- a/ui/src/components/notify/Webhook.tsx +++ b/ui/src/components/notify/Webhook.tsx @@ -96,7 +96,7 @@ const Webhook = () => { webhook.data.url = webhook.data.url.trim(); if (!isValidURL(webhook.data.url)) { toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: t("common.errmsg.url_invalid"), variant: "destructive", }); @@ -116,14 +116,14 @@ const Webhook = () => { setChannels(resp); toast({ - title: t("common.save.succeeded.message"), + title: t("common.text.operation_succeeded"), description: t("settings.notification.config.saved.message"), }); } catch (e) { const msg = getErrMsg(e); toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: `${t("settings.notification.config.failed.message")}: ${msg}`, variant: "destructive", }); @@ -183,7 +183,7 @@ const Webhook = () => { const msg = getErrMsg(e); toast({ - title: t("common.save.failed.message"), + title: t("common.text.operation_failed"), description: `${t("settings.notification.config.failed.message")}: ${msg}`, variant: "destructive", }); @@ -225,7 +225,7 @@ const Webhook = () => { handleSaveClick(); }} > - {t("common.save")} + {t("common.button.save")} diff --git a/ui/src/components/workflow/ApplyForm.tsx b/ui/src/components/workflow/ApplyForm.tsx index 571d8351..998e5564 100644 --- a/ui/src/components/workflow/ApplyForm.tsx +++ b/ui/src/components/workflow/ApplyForm.tsx @@ -122,7 +122,7 @@ const ApplyForm = ({ data }: ApplyFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} /> @@ -168,7 +168,7 @@ const ApplyForm = ({ data }: ApplyFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -342,7 +342,7 @@ const ApplyForm = ({ data }: ApplyFormProps) => {
- +
diff --git a/ui/src/components/workflow/DeployToAliyunALB.tsx b/ui/src/components/workflow/DeployToAliyunALB.tsx index fda198a9..947c0fcb 100644 --- a/ui/src/components/workflow/DeployToAliyunALB.tsx +++ b/ui/src/components/workflow/DeployToAliyunALB.tsx @@ -110,7 +110,7 @@ const DeployToAliyunALB = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -251,7 +251,7 @@ const DeployToAliyunALB = ({ data }: DeployFormProps) => { )}
- +
diff --git a/ui/src/components/workflow/DeployToAliyunCDN.tsx b/ui/src/components/workflow/DeployToAliyunCDN.tsx index 0bf57ec2..3e4da4b7 100644 --- a/ui/src/components/workflow/DeployToAliyunCDN.tsx +++ b/ui/src/components/workflow/DeployToAliyunCDN.tsx @@ -90,7 +90,7 @@ const DeployToAliyunCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToAliyunCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToAliyunCLB.tsx b/ui/src/components/workflow/DeployToAliyunCLB.tsx index 79c78027..b7edb9bc 100644 --- a/ui/src/components/workflow/DeployToAliyunCLB.tsx +++ b/ui/src/components/workflow/DeployToAliyunCLB.tsx @@ -110,7 +110,7 @@ const DeployToAliyunCLB = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -251,7 +251,7 @@ const DeployToAliyunCLB = ({ data }: DeployFormProps) => { )}
- +
diff --git a/ui/src/components/workflow/DeployToAliyunNLB.tsx b/ui/src/components/workflow/DeployToAliyunNLB.tsx index a902cb6c..5f183dae 100644 --- a/ui/src/components/workflow/DeployToAliyunNLB.tsx +++ b/ui/src/components/workflow/DeployToAliyunNLB.tsx @@ -213,7 +213,7 @@ const DeployToAliyunNLB = ({ data }: DeployFormProps) => { )}
- +
diff --git a/ui/src/components/workflow/DeployToAliyunOss.tsx b/ui/src/components/workflow/DeployToAliyunOss.tsx index b1011a91..7434d658 100644 --- a/ui/src/components/workflow/DeployToAliyunOss.tsx +++ b/ui/src/components/workflow/DeployToAliyunOss.tsx @@ -101,7 +101,7 @@ const DeployToAliyunOSS = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -209,7 +209,7 @@ const DeployToAliyunOSS = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToBaiduCloudCDN.tsx b/ui/src/components/workflow/DeployToBaiduCloudCDN.tsx index 6394444f..c0d20a0b 100644 --- a/ui/src/components/workflow/DeployToBaiduCloudCDN.tsx +++ b/ui/src/components/workflow/DeployToBaiduCloudCDN.tsx @@ -90,7 +90,7 @@ const DeployToBaiduCloudCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToBaiduCloudCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToByteplusCDN.tsx b/ui/src/components/workflow/DeployToByteplusCDN.tsx index d460b97a..22121ea7 100644 --- a/ui/src/components/workflow/DeployToByteplusCDN.tsx +++ b/ui/src/components/workflow/DeployToByteplusCDN.tsx @@ -90,7 +90,7 @@ const DeployToByteplusCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToByteplusCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToDogeCloudCDN.tsx b/ui/src/components/workflow/DeployToDogeCloudCDN.tsx index 27ee6b43..4a8a0f92 100644 --- a/ui/src/components/workflow/DeployToDogeCloudCDN.tsx +++ b/ui/src/components/workflow/DeployToDogeCloudCDN.tsx @@ -91,7 +91,7 @@ const DeployToDogeCloudCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToDogeCloudCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToHuaweiCloudCDN.tsx b/ui/src/components/workflow/DeployToHuaweiCloudCDN.tsx index f8a89d0c..2c337f9a 100644 --- a/ui/src/components/workflow/DeployToHuaweiCloudCDN.tsx +++ b/ui/src/components/workflow/DeployToHuaweiCloudCDN.tsx @@ -96,7 +96,7 @@ const DeployToHuaweiCloudCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -191,7 +191,7 @@ const DeployToHuaweiCloudCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToHuaweiCloudELB.tsx b/ui/src/components/workflow/DeployToHuaweiCloudELB.tsx index ea6a306c..bb6a87c5 100644 --- a/ui/src/components/workflow/DeployToHuaweiCloudELB.tsx +++ b/ui/src/components/workflow/DeployToHuaweiCloudELB.tsx @@ -118,7 +118,7 @@ const DeployToHuaweiCloudELB = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -282,7 +282,7 @@ const DeployToHuaweiCloudELB = ({ data }: DeployFormProps) => { )}
- +
diff --git a/ui/src/components/workflow/DeployToKubernetesSecret.tsx b/ui/src/components/workflow/DeployToKubernetesSecret.tsx index 6c3db321..f24c8c64 100644 --- a/ui/src/components/workflow/DeployToKubernetesSecret.tsx +++ b/ui/src/components/workflow/DeployToKubernetesSecret.tsx @@ -105,7 +105,7 @@ const DeployToKubernetesSecret = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -226,7 +226,7 @@ const DeployToKubernetesSecret = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToLocal.tsx b/ui/src/components/workflow/DeployToLocal.tsx index 5e9cec63..30f48e91 100644 --- a/ui/src/components/workflow/DeployToLocal.tsx +++ b/ui/src/components/workflow/DeployToLocal.tsx @@ -215,7 +215,7 @@ Remove-Item -Path "$pfxPath" -Force trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -462,7 +462,7 @@ Remove-Item -Path "$pfxPath" -Force />
- +
diff --git a/ui/src/components/workflow/DeployToQiniuCDN.tsx b/ui/src/components/workflow/DeployToQiniuCDN.tsx index b353942e..bb9935fb 100644 --- a/ui/src/components/workflow/DeployToQiniuCDN.tsx +++ b/ui/src/components/workflow/DeployToQiniuCDN.tsx @@ -91,7 +91,7 @@ const DeployToQiniuCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -171,7 +171,7 @@ const DeployToQiniuCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToSSH.tsx b/ui/src/components/workflow/DeployToSSH.tsx index 3056c678..339a7cd7 100644 --- a/ui/src/components/workflow/DeployToSSH.tsx +++ b/ui/src/components/workflow/DeployToSSH.tsx @@ -133,7 +133,7 @@ const DeployToSSH = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -339,7 +339,7 @@ const DeployToSSH = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToTencentCDN.tsx b/ui/src/components/workflow/DeployToTencentCDN.tsx index 4ae8270d..a8626d08 100644 --- a/ui/src/components/workflow/DeployToTencentCDN.tsx +++ b/ui/src/components/workflow/DeployToTencentCDN.tsx @@ -90,7 +90,7 @@ const DeployToTencentCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToTencentCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToTencentCLB.tsx b/ui/src/components/workflow/DeployToTencentCLB.tsx index d2fd2c26..77690e25 100644 --- a/ui/src/components/workflow/DeployToTencentCLB.tsx +++ b/ui/src/components/workflow/DeployToTencentCLB.tsx @@ -130,7 +130,7 @@ const DeployToTencentCLB = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -310,7 +310,7 @@ const DeployToTencentCLB = ({ data }: DeployFormProps) => { )}
- +
diff --git a/ui/src/components/workflow/DeployToTencentCOS.tsx b/ui/src/components/workflow/DeployToTencentCOS.tsx index 4091e0b0..1cdb6e91 100644 --- a/ui/src/components/workflow/DeployToTencentCOS.tsx +++ b/ui/src/components/workflow/DeployToTencentCOS.tsx @@ -96,7 +96,7 @@ const DeployToTencentCOS = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -206,7 +206,7 @@ const DeployToTencentCOS = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToTencentTEO.tsx b/ui/src/components/workflow/DeployToTencentTEO.tsx index 00247b36..dcb5d9cc 100644 --- a/ui/src/components/workflow/DeployToTencentTEO.tsx +++ b/ui/src/components/workflow/DeployToTencentTEO.tsx @@ -93,7 +93,7 @@ const DeployToTencentTEO = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -188,7 +188,7 @@ const DeployToTencentTEO = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToVolcengineCDN.tsx b/ui/src/components/workflow/DeployToVolcengineCDN.tsx index ad5b0e5e..320bd0c9 100644 --- a/ui/src/components/workflow/DeployToVolcengineCDN.tsx +++ b/ui/src/components/workflow/DeployToVolcengineCDN.tsx @@ -90,7 +90,7 @@ const DeployToVolcengineCDN = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToVolcengineCDN = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToVolcengineLive.tsx b/ui/src/components/workflow/DeployToVolcengineLive.tsx index 67e68365..80da9e30 100644 --- a/ui/src/components/workflow/DeployToVolcengineLive.tsx +++ b/ui/src/components/workflow/DeployToVolcengineLive.tsx @@ -90,7 +90,7 @@ const DeployToVolcengineLive = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -170,7 +170,7 @@ const DeployToVolcengineLive = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/DeployToWebhook.tsx b/ui/src/components/workflow/DeployToWebhook.tsx index 078bff6e..0f5698b6 100644 --- a/ui/src/components/workflow/DeployToWebhook.tsx +++ b/ui/src/components/workflow/DeployToWebhook.tsx @@ -94,7 +94,7 @@ const DeployToWebhook = ({ data }: DeployFormProps) => { trigger={
- {t("common.add")} + {t("common.button.add")}
} op="add" @@ -174,7 +174,7 @@ const DeployToWebhook = ({ data }: DeployFormProps) => { />
- +
diff --git a/ui/src/components/workflow/NotifyForm.tsx b/ui/src/components/workflow/NotifyForm.tsx index 8d6e2d16..ea48cc3c 100644 --- a/ui/src/components/workflow/NotifyForm.tsx +++ b/ui/src/components/workflow/NotifyForm.tsx @@ -171,7 +171,7 @@ const NotifyForm = ({ data }: NotifyFormProps) => { />
- +
diff --git a/ui/src/components/workflow/StartForm.tsx b/ui/src/components/workflow/StartForm.tsx index cbdf83ff..f7986e77 100644 --- a/ui/src/components/workflow/StartForm.tsx +++ b/ui/src/components/workflow/StartForm.tsx @@ -135,7 +135,7 @@ const StartForm = ({ data }: StartFormProps) => { />
- +
diff --git a/ui/src/components/workflow/WorkflowBaseInfoEditDialog.tsx b/ui/src/components/workflow/WorkflowBaseInfoEditDialog.tsx index a33a430a..0ed4162a 100644 --- a/ui/src/components/workflow/WorkflowBaseInfoEditDialog.tsx +++ b/ui/src/components/workflow/WorkflowBaseInfoEditDialog.tsx @@ -115,7 +115,7 @@ const WorkflowNameBaseInfoDialog = ({ trigger }: WorkflowNameEditDialogProps) => />
- +
diff --git a/ui/src/i18n/locales/en/index.ts b/ui/src/i18n/locales/en/index.ts index 38f3b2e9..b23a3bf7 100644 --- a/ui/src/i18n/locales/en/index.ts +++ b/ui/src/i18n/locales/en/index.ts @@ -4,7 +4,6 @@ import nlsDashboard from "./nls.dashboard.json"; import nlsSettings from "./nls.settings.json"; import nlsDomain from "./nls.domain.json"; import nlsAccess from "./nls.access.json"; -import nlsHistory from "./nls.history.json"; import nlsWorkflow from "./nls.workflow.json"; import nlsCertificate from "./nls.certificate.json"; @@ -15,7 +14,6 @@ export default Object.freeze({ ...nlsSettings, ...nlsDomain, ...nlsAccess, - ...nlsHistory, ...nlsWorkflow, ...nlsCertificate, }); diff --git a/ui/src/i18n/locales/en/nls.access.json b/ui/src/i18n/locales/en/nls.access.json index 7cd46980..bb42852c 100644 --- a/ui/src/i18n/locales/en/nls.access.json +++ b/ui/src/i18n/locales/en/nls.access.json @@ -7,7 +7,12 @@ "access.action.edit": "Edit Authorization", "access.action.copy": "Copy Authorization", "access.action.delete": "Delete Authorization", - "access.action.delete.confirm": "Are you sure you want to delete the deployment authorization?", + "access.action.delete.confirm": "Are you sure to delete this authorization?", + + "access.props.name": "Name", + "access.props.provider": "Provider", + "access.props.created_at": "Created At", + "access.props.updated_at": "Updated At", "access.authorization.form.type.label": "Provider", "access.authorization.form.type.placeholder": "Please select a provider", diff --git a/ui/src/i18n/locales/en/nls.certificate.json b/ui/src/i18n/locales/en/nls.certificate.json index 0599e7e8..88ebed31 100644 --- a/ui/src/i18n/locales/en/nls.certificate.json +++ b/ui/src/i18n/locales/en/nls.certificate.json @@ -15,6 +15,9 @@ "certificate.props.expiry.filter.expired": "Expired", "certificate.props.workflow": "Workflow", "certificate.props.source": "Source", + "certificate.props.source.workflow": "Workflow", "certificate.props.certificate_chain": "Certificate Chain", - "certificate.props.private_key": "Private Key" + "certificate.props.private_key": "Private Key", + "certificate.props.created_at": "Created At", + "certificate.props.updated_at": "Updated At" } diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index d3b5c6d3..5095bab9 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -1,24 +1,12 @@ { - "common.add": "Add", - "common.save": "Save", - "common.save.succeeded.message": "Save Successful", - "common.save.failed.message": "Save Failed", - "common.view": "View", - "common.edit": "Edit", - "common.copy": "Copy", - "common.copy.done": "Copied", - "common.download": "Download", - "common.delete": "Delete", - "common.delete.succeeded.message": "Delete Successful", - "common.delete.failed.message": "Delete Failed", - "common.next": "Next", - "common.reset": "Reset", - "common.confirm": "Confirm", - "common.cancel": "Cancel", - "common.submit": "Submit", - "common.update": "Update", - "common.update.succeeded.message": "Update Successful", - "common.update.failed.message": "Update Failed", + "common.button.add": "Add", + "common.button.cancel": "Cancel", + "common.button.copy": "Copy", + "common.button.delete": "Delete", + "common.button.ok": "Ok", + "common.button.reset": "Reset", + "common.button.save": "Save", + "common.button.submit": "Submit", "common.text.domain": "Domain", "common.text.domain.empty": "No Domain", @@ -27,13 +15,10 @@ "common.text.dns": "Domain Name Server", "common.text.dns.empty": "No DNS", "common.text.ca": "Certificate Authority", - "common.text.name": "Name", - "common.text.provider": "Provider", - "common.text.workflow": "Workflow", - "common.text.created_at": "Created At", - "common.text.updated_at": "Updated At", - "common.text.operations": "Operations", + "common.text.copied": "Copied", "common.text.nodata": "No data available", + "common.text.operation_succeeded": "Operation succeeded", + "common.text.operation_failed": "Operation failed", "common.text.request_error": "Request error", "common.menu.theme": "Change Theme", diff --git a/ui/src/i18n/locales/en/nls.dashboard.json b/ui/src/i18n/locales/en/nls.dashboard.json index 68d61004..5450bfa3 100644 --- a/ui/src/i18n/locales/en/nls.dashboard.json +++ b/ui/src/i18n/locales/en/nls.dashboard.json @@ -8,5 +8,5 @@ "dashboard.statistics.enabled_workflows": "Enabled Workflows", "dashboard.statistics.unit": "", - "dashboard.certificate": "Latest Certificate" + "dashboard.latest_workflow_run": "Latest Workflow Run" } diff --git a/ui/src/i18n/locales/en/nls.history.json b/ui/src/i18n/locales/en/nls.history.json deleted file mode 100644 index fb3df441..00000000 --- a/ui/src/i18n/locales/en/nls.history.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "history.page.title": "Deployment History", - - "history.nodata": "You have not created any deployments yet, please add a domain to start deployment!", - - "history.props.domain": "Domain", - "history.props.status": "Status", - "history.props.stage": "Stage", - "history.props.stage.progress.check": "Check", - "history.props.stage.progress.apply": "Apply", - "history.props.stage.progress.deploy": "Deploy", - "history.props.last_execution_time": "Last Execution Time", - - "history.log": "Log" -} diff --git a/ui/src/i18n/locales/en/nls.workflow.json b/ui/src/i18n/locales/en/nls.workflow.json index b4ff4f01..e2d9f67f 100644 --- a/ui/src/i18n/locales/en/nls.workflow.json +++ b/ui/src/i18n/locales/en/nls.workflow.json @@ -3,6 +3,23 @@ "workflow.nodata": "No workflows. Please create a workflow to generate certificates! 😀", + "workflow.action.create": "Create Workflow", + "workflow.action.edit": "Edit Workflow", + "workflow.action.delete": "Delete Workflow", + "workflow.action.delete.confirm": "Are you sure to delete this workflow?", + + "workflow.props.name": "Name", + "workflow.props.name.placeholder": "Please enter name", + "workflow.props.name.default": "Unnamed", + "workflow.props.description": "Description", + "workflow.props.description.placeholder": "Please enter description", + "workflow.props.execution_method": "Execution Method", + "workflow.props.state": "State", + "workflow.props.state.filter.enabled": "Enabled", + "workflow.props.state.filter.disabled": "Disabled", + "workflow.props.created_at": "Created At", + "workflow.props.updated_at": "Updated At", + "workflow.detail.title": "Workflow", "workflow.detail.history": "History", "workflow.detail.action.save": "Save updates", @@ -15,25 +32,6 @@ "workflow.baseinfo.title": "Basic Information", - "workflow.props.name": "Name", - "workflow.props.name.placeholder": "Please enter name", - "workflow.props.name.default": "Unnamed", - "workflow.props.description": "Description", - "workflow.props.description.placeholder": "Please enter description", - "workflow.props.executionMethod": "Execution Method", - "workflow.props.state": "State", - "workflow.props.state.filter.enabled": "Enabled", - "workflow.props.state.filter.disabled": "Disabled", - "workflow.props.createdAt": "Created", - "workflow.props.updatedAt": "Updated", - - "workflow.action": "Action", - "workflow.action.edit": "Edit", - "workflow.action.create": "Create Workflow", - - "workflow.action.delete.alert.title": "Delete Workflow", - "workflow.action.delete.alert.content": "Are you sure you want to delete this workflow?", - "workflow.history.page.title": "Logs", "workflow.history.props.state": "State", "workflow.history.props.state.success": "Success", diff --git a/ui/src/i18n/locales/zh/index.ts b/ui/src/i18n/locales/zh/index.ts index 38f3b2e9..b23a3bf7 100644 --- a/ui/src/i18n/locales/zh/index.ts +++ b/ui/src/i18n/locales/zh/index.ts @@ -4,7 +4,6 @@ import nlsDashboard from "./nls.dashboard.json"; import nlsSettings from "./nls.settings.json"; import nlsDomain from "./nls.domain.json"; import nlsAccess from "./nls.access.json"; -import nlsHistory from "./nls.history.json"; import nlsWorkflow from "./nls.workflow.json"; import nlsCertificate from "./nls.certificate.json"; @@ -15,7 +14,6 @@ export default Object.freeze({ ...nlsSettings, ...nlsDomain, ...nlsAccess, - ...nlsHistory, ...nlsWorkflow, ...nlsCertificate, }); diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index f4862fbb..fbbe38b5 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -9,6 +9,11 @@ "access.action.delete": "删除授权", "access.action.delete.confirm": "确定要删除此授权吗?", + "access.props.name": "名称", + "access.props.provider": "服务商", + "access.props.created_at": "创建时间", + "access.props.updated_at": "更新时间", + "access.authorization.form.type.label": "服务商", "access.authorization.form.type.placeholder": "请选择服务商", "access.authorization.form.type.search.placeholder": "搜索服务商", diff --git a/ui/src/i18n/locales/zh/nls.certificate.json b/ui/src/i18n/locales/zh/nls.certificate.json index e9274c5f..538e24bf 100644 --- a/ui/src/i18n/locales/zh/nls.certificate.json +++ b/ui/src/i18n/locales/zh/nls.certificate.json @@ -15,6 +15,9 @@ "certificate.props.expiry.filter.expired": "已到期", "certificate.props.workflow": "所属工作流", "certificate.props.source": "来源", + "certificate.props.source.workflow": "工作流", "certificate.props.certificate_chain": "证书内容", - "certificate.props.private_key": "私钥内容" + "certificate.props.private_key": "私钥内容", + "certificate.props.created_at": "创建时间", + "certificate.props.updated_at": "更新时间" } diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index fc986eda..22d41588 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -1,24 +1,12 @@ { - "common.add": "新增", - "common.save": "保存", - "common.save.succeeded.message": "保存成功", - "common.save.failed.message": "保存失败", - "common.view": "查看", - "common.edit": "编辑", - "common.copy": "复制", - "common.copy.done": "已复制", - "common.download": "下载", - "common.delete": "刪除", - "common.delete.succeeded.message": "删除成功", - "common.delete.failed.message": "删除失败", - "common.next": "下一步", - "common.reset": "重置", - "common.confirm": "确认", - "common.cancel": "取消", - "common.submit": "提交", - "common.update": "更新", - "common.update.succeeded.message": "修改成功", - "common.update.failed.message": "修改失败", + "common.button.add": "新增", + "common.button.cancel": "取消", + "common.button.copy": "复制", + "common.button.delete": "刪除", + "common.button.ok": "确定", + "common.button.reset": "重置", + "common.button.save": "保存", + "common.button.submit": "提交", "common.text.domain": "域名", "common.text.domain.empty": "无域名", @@ -27,13 +15,10 @@ "common.text.dns": "DNS(域名服务器)", "common.text.dns.empty": "无 DNS 地址", "common.text.ca": "CA(证书颁发机构)", - "common.text.name": "名称", - "common.text.provider": "服务商", - "common.text.workflow": "工作流", - "common.text.created_at": "创建时间", - "common.text.updated_at": "更新时间", - "common.text.operations": "操作", + "common.text.copied": "已复制", "common.text.nodata": "暂无数据", + "common.text.operation_succeeded": "操作成功", + "common.text.operation_failed": "操作失败", "common.text.request_error": "请求错误", "common.menu.theme": "切换主题", diff --git a/ui/src/i18n/locales/zh/nls.dashboard.json b/ui/src/i18n/locales/zh/nls.dashboard.json index 07100082..72086011 100644 --- a/ui/src/i18n/locales/zh/nls.dashboard.json +++ b/ui/src/i18n/locales/zh/nls.dashboard.json @@ -8,5 +8,5 @@ "dashboard.statistics.enabled_workflows": "已启用工作流", "dashboard.statistics.unit": "个", - "dashboard.certificate": "最新证书" + "dashboard.latest_workflow_run": "最近执行的工作流" } diff --git a/ui/src/i18n/locales/zh/nls.history.json b/ui/src/i18n/locales/zh/nls.history.json deleted file mode 100644 index 30e0cb1e..00000000 --- a/ui/src/i18n/locales/zh/nls.history.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "history.page.title": "部署历史", - - "history.nodata": "你暂未创建任何部署,请先添加域名进行部署吧!", - - "history.props.domain": "域名", - "history.props.status": "状态", - "history.props.stage": "阶段", - "history.props.stage.progress.check": "检查", - "history.props.stage.progress.apply": "获取", - "history.props.stage.progress.deploy": "部署", - "history.props.last_execution_time": "最近执行时间", - - "history.log": "日志" -} diff --git a/ui/src/i18n/locales/zh/nls.workflow.json b/ui/src/i18n/locales/zh/nls.workflow.json index ae323d6b..bbb0c364 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.json +++ b/ui/src/i18n/locales/zh/nls.workflow.json @@ -3,6 +3,23 @@ "workflow.nodata": "暂无工作流,请先新建", + "workflow.action.create": "新建工作流", + "workflow.action.edit": "编辑工作流", + "workflow.action.delete": "删除工作流", + "workflow.action.delete.confirm": "确定要删除此工作流吗?", + + "workflow.props.name": "名称", + "workflow.props.name.placeholder": "请输入名称", + "workflow.props.name.default": "未命名工作流", + "workflow.props.description": "描述", + "workflow.props.description.placeholder": "请输入描述", + "workflow.props.execution_method": "执行方式", + "workflow.props.state": "启用状态", + "workflow.props.state.filter.enabled": "启用", + "workflow.props.state.filter.disabled": "未启用", + "workflow.props.created_at": "创建时间", + "workflow.props.updated_at": "更新时间", + "workflow.detail.title": "流程", "workflow.detail.history": "历史", "workflow.detail.action.save": "保存变更", @@ -15,25 +32,6 @@ "workflow.baseinfo.title": "基本信息", - "workflow.props.name": "名称", - "workflow.props.name.placeholder": "请输入名称", - "workflow.props.name.default": "未命名工作流", - "workflow.props.description": "描述", - "workflow.props.description.placeholder": "请输入描述", - "workflow.props.executionMethod": "执行方式", - "workflow.props.state": "启用状态", - "workflow.props.state.filter.enabled": "启用", - "workflow.props.state.filter.disabled": "未启用", - "workflow.props.createdAt": "创建时间", - "workflow.props.updatedAt": "更新时间", - - "workflow.action": "操作", - "workflow.action.edit": "编辑", - "workflow.action.create": "新建工作流", - - "workflow.action.delete.alert.title": "删除工作流", - "workflow.action.delete.alert.content": "确定要删除此工作流吗?", - "workflow.history.page.title": "日志", "workflow.history.props.state": "状态", "workflow.history.props.state.success": "通过", diff --git a/ui/src/pages/accesses/AccessList.tsx b/ui/src/pages/accesses/AccessList.tsx index dc08a936..8198cfdc 100644 --- a/ui/src/pages/accesses/AccessList.tsx +++ b/ui/src/pages/accesses/AccessList.tsx @@ -29,13 +29,13 @@ const AccessList = () => { }, { key: "name", - title: t("common.text.name"), + title: t("access.props.name"), ellipsis: true, render: (_, record) => <>{record.name}, }, { key: "provider", - title: t("common.text.provider"), + title: t("access.props.provider"), ellipsis: true, render: (_, record) => { return ( @@ -48,7 +48,7 @@ const AccessList = () => { }, { key: "createdAt", - title: t("common.text.created_at"), + title: t("access.props.created_at"), ellipsis: true, render: (_, record) => { return dayjs(record.created!).format("YYYY-MM-DD HH:mm:ss"); @@ -56,7 +56,7 @@ const AccessList = () => { }, { key: "updatedAt", - title: t("common.text.updated_at"), + title: t("access.props.updated_at"), ellipsis: true, render: (_, record) => { return dayjs(record.updated!).format("YYYY-MM-DD HH:mm:ss"); diff --git a/ui/src/pages/certificates/CertificateList.tsx b/ui/src/pages/certificates/CertificateList.tsx index de37254e..2f918087 100644 --- a/ui/src/pages/certificates/CertificateList.tsx +++ b/ui/src/pages/certificates/CertificateList.tsx @@ -77,10 +77,10 @@ const CertificateList = () => {
@@ -113,7 +113,7 @@ const CertificateList = () => { const workflowId = record.workflow; return workflowId ? ( - {t("common.text.workflow")} + {t("certificate.props.source.workflow")} { }, { key: "createdAt", - title: t("common.text.created_at"), + title: t("certificate.props.created_at"), ellipsis: true, render: (_, record) => { return dayjs(record.created!).format("YYYY-MM-DD HH:mm:ss"); @@ -139,7 +139,7 @@ const CertificateList = () => { }, { key: "updatedAt", - title: t("common.text.updated_at"), + title: t("certificate.props.updated_at"), ellipsis: true, render: (_, record) => { return dayjs(record.updated!).format("YYYY-MM-DD HH:mm:ss"); diff --git a/ui/src/pages/dashboard/Dashboard.tsx b/ui/src/pages/dashboard/Dashboard.tsx index 69c9ff6c..f767037a 100644 --- a/ui/src/pages/dashboard/Dashboard.tsx +++ b/ui/src/pages/dashboard/Dashboard.tsx @@ -115,7 +115,7 @@ const Dashboard = () => { -
TODO: 最近执行的工作流 LatestWorkflowRun
+
TODO: {t("dashboard.latest_workflow_run")}
); }; diff --git a/ui/src/pages/settings/Account.tsx b/ui/src/pages/settings/Account.tsx index 3d1555bf..dc388201 100644 --- a/ui/src/pages/settings/Account.tsx +++ b/ui/src/pages/settings/Account.tsx @@ -84,10 +84,10 @@ const Account = () => {
{changed ? ( - + ) : ( )}
diff --git a/ui/src/pages/settings/Password.tsx b/ui/src/pages/settings/Password.tsx index d500f561..fa527627 100644 --- a/ui/src/pages/settings/Password.tsx +++ b/ui/src/pages/settings/Password.tsx @@ -124,7 +124,7 @@ const Password = () => { )} />
- +
diff --git a/ui/src/pages/settings/SSLProvider.tsx b/ui/src/pages/settings/SSLProvider.tsx index bd14af22..d8421c74 100644 --- a/ui/src/pages/settings/SSLProvider.tsx +++ b/ui/src/pages/settings/SSLProvider.tsx @@ -80,13 +80,13 @@ const SSLProvider = () => { const resp = await update({ ...data }); setConfig(resp); toast({ - title: t("common.update.succeeded.message"), - description: t("common.update.succeeded.message"), + title: t("common.text.operation_succeeded"), + description: t("common.text.operation_succeeded"), }); } catch (e) { const message = getErrMsg(e); toast({ - title: t("common.update.failed.message"), + title: t("common.text.operation_failed"), description: message, variant: "destructive", }); @@ -222,7 +222,7 @@ const SSLProviderLetsEncryptForm = () => {
- +
@@ -328,7 +328,7 @@ const SSLProviderZeroSSLForm = () => {
- +
@@ -435,7 +435,7 @@ const SSLProviderGtsForm = () => {
- +
diff --git a/ui/src/pages/workflows/WorkflowList.tsx b/ui/src/pages/workflows/WorkflowList.tsx index a1cb95d2..320a934c 100644 --- a/ui/src/pages/workflows/WorkflowList.tsx +++ b/ui/src/pages/workflows/WorkflowList.tsx @@ -49,7 +49,7 @@ const WorkflowList = () => { }, { key: "name", - title: t("common.text.name"), + title: t("workflow.props.name"), ellipsis: true, render: (_, record) => ( @@ -62,7 +62,7 @@ const WorkflowList = () => { }, { key: "type", - title: t("workflow.props.executionMethod"), + title: t("workflow.props.execution_method"), ellipsis: true, render: (_, record) => { const method = record.type; @@ -120,10 +120,10 @@ const WorkflowList = () => { @@ -152,7 +152,7 @@ const WorkflowList = () => { }, { key: "createdAt", - title: t("common.text.created_at"), + title: t("workflow.props.created_at"), ellipsis: true, render: (_, record) => { return dayjs(record.created!).format("YYYY-MM-DD HH:mm:ss"); @@ -160,7 +160,7 @@ const WorkflowList = () => { }, { key: "updatedAt", - title: t("common.text.updated_at"), + title: t("workflow.props.updated_at"), ellipsis: true, render: (_, record) => { return dayjs(record.updated!).format("YYYY-MM-DD HH:mm:ss"); @@ -173,7 +173,7 @@ const WorkflowList = () => { width: 120, render: (_, record) => ( - +