From 401fa3dcdd981abe6534bbe16702e97d1bccac1b Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 24 Dec 2024 22:00:17 +0800 Subject: [PATCH] feat(ui): new WorkflowRuns using antd --- ui/package-lock.json | 32 ---- ui/package.json | 1 - ui/src/App.tsx | 1 + .../certificate/CertificateDetailDrawer.tsx | 9 +- ui/src/components/ui/table.tsx | 47 ------ ui/src/components/workflow/DataTable.tsx | 120 ------------- ui/src/components/workflow/WorkflowLog.tsx | 93 ----------- .../components/workflow/WorkflowLogDetail.tsx | 85 ---------- .../workflow/run/WorkflowRunDetailDrawer.tsx | 80 +++++++++ .../components/workflow/run/WorkflowRuns.tsx | 157 ++++++++++++++++++ ui/src/domain/workflow.ts | 6 + ui/src/domain/workflowRun.ts | 14 ++ ui/src/global.css | 1 - ui/src/i18n/locales/en/nls.workflow.json | 19 ++- ui/src/i18n/locales/zh/nls.workflow.json | 21 +-- ui/src/pages/accesses/AccessList.tsx | 62 ++++--- ui/src/pages/certificates/CertificateList.tsx | 6 +- ui/src/pages/workflows/WorkflowDetail.tsx | 16 +- ui/src/pages/workflows/WorkflowList.tsx | 11 +- .../{workflowRunLog.ts => workflowRun.ts} | 12 +- ui/tailwind.config.js | 5 - 21 files changed, 340 insertions(+), 458 deletions(-) delete mode 100644 ui/src/components/ui/table.tsx delete mode 100644 ui/src/components/workflow/DataTable.tsx delete mode 100644 ui/src/components/workflow/WorkflowLog.tsx delete mode 100644 ui/src/components/workflow/WorkflowLogDetail.tsx create mode 100644 ui/src/components/workflow/run/WorkflowRunDetailDrawer.tsx create mode 100644 ui/src/components/workflow/run/WorkflowRuns.tsx create mode 100644 ui/src/domain/workflowRun.ts rename ui/src/repository/{workflowRunLog.ts => workflowRun.ts} (59%) diff --git a/ui/package-lock.json b/ui/package-lock.json index cce4813e..f705d7b5 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -16,7 +16,6 @@ "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", - "@tanstack/react-table": "^8.20.5", "ahooks": "^3.8.4", "antd": "^5.22.5", "antd-zod": "^6.0.0", @@ -3939,37 +3938,6 @@ "win32" ] }, - "node_modules/@tanstack/react-table": { - "version": "8.20.5", - "resolved": "https://registry.npmmirror.com/@tanstack/react-table/-/react-table-8.20.5.tgz", - "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", - "dependencies": { - "@tanstack/table-core": "8.20.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/@tanstack/table-core": { - "version": "8.20.5", - "resolved": "https://registry.npmmirror.com/@tanstack/table-core/-/table-core-8.20.5.tgz", - "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", diff --git a/ui/package.json b/ui/package.json index 2c514768..61ec5f26 100644 --- a/ui/package.json +++ b/ui/package.json @@ -18,7 +18,6 @@ "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", - "@tanstack/react-table": "^8.20.5", "ahooks": "^3.8.4", "antd": "^5.22.5", "antd-zod": "^6.0.0", diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 481631ff..389dbef1 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -55,6 +55,7 @@ const RootApp = () => { ...antdTheme, token: { colorPrimary: "hsl(24.6 95% 53.1%)", + colorLink: "hsl(24.6 95% 53.1%)", }, }} > diff --git a/ui/src/components/certificate/CertificateDetailDrawer.tsx b/ui/src/components/certificate/CertificateDetailDrawer.tsx index 0966f611..1b1a0d12 100644 --- a/ui/src/components/certificate/CertificateDetailDrawer.tsx +++ b/ui/src/components/certificate/CertificateDetailDrawer.tsx @@ -2,8 +2,9 @@ import { cloneElement, useMemo } from "react"; import { useControllableValue } from "ahooks"; import { Drawer } from "antd"; -import { type CertificateModel } from "@/domain/certificate"; +import Show from "@/components/Show"; import CertificateDetail from "./CertificateDetail"; +import { type CertificateModel } from "@/domain/certificate"; export type CertificateDetailDrawerProps = { data?: CertificateModel; @@ -38,8 +39,10 @@ const CertificateDetailDrawer = ({ data, loading, trigger, ...props }: Certifica <> {triggerEl} - setOpen(false)}> - {data ? : <>} + setOpen(false)}> + + + ); diff --git a/ui/src/components/ui/table.tsx b/ui/src/components/ui/table.tsx deleted file mode 100644 index dbd959ad..00000000 --- a/ui/src/components/ui/table.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import * as React from "react"; - -import { cn } from "./utils"; - -const Table = React.forwardRef>(({ className, ...props }, ref) => ( -
- - -)); -Table.displayName = "Table"; - -const TableHeader = React.forwardRef>(({ className, ...props }, ref) => ( - -)); -TableHeader.displayName = "TableHeader"; - -const TableBody = React.forwardRef>(({ className, ...props }, ref) => ( - -)); -TableBody.displayName = "TableBody"; - -const TableFooter = React.forwardRef>(({ className, ...props }, ref) => ( - tr]:last:border-b-0", className)} {...props} /> -)); -TableFooter.displayName = "TableFooter"; - -const TableRow = React.forwardRef>(({ className, ...props }, ref) => ( - -)); -TableRow.displayName = "TableRow"; - -const TableHead = React.forwardRef>(({ className, ...props }, ref) => ( -
-)); -TableHead.displayName = "TableHead"; - -const TableCell = React.forwardRef>(({ className, ...props }, ref) => ( - -)); -TableCell.displayName = "TableCell"; - -const TableCaption = React.forwardRef>(({ className, ...props }, ref) => ( -
-)); -TableCaption.displayName = "TableCaption"; - -export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }; diff --git a/ui/src/components/workflow/DataTable.tsx b/ui/src/components/workflow/DataTable.tsx deleted file mode 100644 index 8475d390..00000000 --- a/ui/src/components/workflow/DataTable.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import { ColumnDef, flexRender, getCoreRowModel, getPaginationRowModel, PaginationState, useReactTable } from "@tanstack/react-table"; - -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; -import { Button } from "../ui/button"; -import { useEffect, useState } from "react"; -import Show from "../Show"; -import { useTranslation } from "react-i18next"; - -interface DataTableProps { - columns: ColumnDef[]; - data: TData[]; - pageCount: number; - onPageChange?: (pageIndex: number, pageSize?: number) => Promise; - onRowClick?: (id: string) => void; - withPagination?: boolean; - fallback?: React.ReactNode; -} - -export function DataTable({ - columns, - data, - onPageChange, - pageCount, - onRowClick, - withPagination, - fallback, -}: DataTableProps) { - const [{ pageIndex, pageSize }, setPagination] = useState({ - pageIndex: 0, - pageSize: 10, - }); - - const { t } = useTranslation(); - - const pagination = { - pageIndex, - pageSize, - }; - - const table = useReactTable({ - data, - columns, - pageCount: pageCount, - getCoreRowModel: getCoreRowModel(), - getPaginationRowModel: getPaginationRowModel(), - state: { - pagination, - }, - onPaginationChange: setPagination, - manualPagination: true, - }); - - useEffect(() => { - onPageChange?.(pageIndex, pageSize); - }, [pageIndex]); - - const handleRowClick = (id: string) => { - onRowClick?.(id); - }; - - return ( -
-
- - - {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => { - return {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}; - })} - - ))} - - - {table.getRowModel().rows?.length ? ( - table.getRowModel().rows.map((row) => ( - { - e.stopPropagation(); - handleRowClick(row.original.id); - }} - > - {row.getVisibleCells().map((cell) => ( - {flexRender(cell.column.columnDef.cell, cell.getContext())} - ))} - - )) - ) : ( - - - {fallback ? fallback : t("common.text.nodata")} - - - )} - -
-
- -
-
- {table.getCanPreviousPage() && ( - - )} - - {table.getCanNextPage && ( - - )} -
-
-
-
- ); -} diff --git a/ui/src/components/workflow/WorkflowLog.tsx b/ui/src/components/workflow/WorkflowLog.tsx deleted file mode 100644 index d94a3f86..00000000 --- a/ui/src/components/workflow/WorkflowLog.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { WorkflowRunLog } from "@/domain/workflow"; -import { list as logs } from "@/repository/workflowRunLog"; -import { ColumnDef } from "@tanstack/react-table"; -import { useState } from "react"; -import { DataTable } from "./DataTable"; -import { useParams } from "react-router-dom"; -import { Check, X } from "lucide-react"; -import WorkflowLogDetail from "./WorkflowLogDetail"; -import { useTranslation } from "react-i18next"; - -const WorkflowLog = () => { - const [data, setData] = useState([]); - const [pageCount, setPageCount] = useState(0); - - const { id } = useParams(); - - const { t } = useTranslation(); - - const [open, setOpen] = useState(false); - const [selectedLog, setSelectedLog] = useState(); - - const fetchData = async (page: number, pageSize?: number) => { - const resp = await logs({ page: page, perPage: pageSize, id: id ?? "" }); - setData(resp.items); - setPageCount(resp.totalPages); - }; - - const columns: ColumnDef[] = [ - { - accessorKey: "succeed", - header: t("workflow.history.props.state"), - cell: ({ row }) => { - const succeed: boolean = row.getValue("succeed"); - if (succeed) { - return ( -
-
- -
-
{t("workflow.history.props.state.success")}
-
- ); - } else { - return ( -
-
- -
-
{t("workflow.history.props.state.failed")}
-
- ); - } - }, - }, - { - accessorKey: "error", - header: t("workflow.history.props.reason"), - cell: ({ row }) => { - let error: string = row.getValue("error"); - if (!error) { - error = ""; - } - return
{error}
; - }, - }, - { - accessorKey: "created", - header: t("workflow.history.props.time"), - cell: ({ row }) => { - const date: string = row.getValue("created"); - return new Date(date).toLocaleString(); - }, - }, - ]; - - const handleRowClick = (id: string) => { - setOpen(true); - const log = data.find((item) => item.id === id); - setSelectedLog(log); - }; - return ( -
-
-
{t("workflow.history.page.title")}
- -
- - -
- ); -}; - -export default WorkflowLog; diff --git a/ui/src/components/workflow/WorkflowLogDetail.tsx b/ui/src/components/workflow/WorkflowLogDetail.tsx deleted file mode 100644 index 6d27cbfb..00000000 --- a/ui/src/components/workflow/WorkflowLogDetail.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { WorkflowOutput, WorkflowRunLog, WorkflowRunLogItem } from "@/domain/workflow"; -import { Sheet, SheetContent, SheetHeader, SheetTitle } from "../ui/sheet"; -import { Check, X } from "lucide-react"; -import { ScrollArea } from "../ui/scroll-area"; -import { useTranslation } from "react-i18next"; - -type WorkflowLogDetailProps = { - open: boolean; - onOpenChange: (open: boolean) => void; - log?: WorkflowRunLog; -}; -const WorkflowLogDetail = ({ open, onOpenChange, log }: WorkflowLogDetailProps) => { - const { t } = useTranslation(); - return ( - - - - {t("workflow.history.page.title")} - - -
- {log?.succeed ? ( -
-
-
- -
-
{t("workflow.history.props.state.success")}
-
- -
{new Date(log.created).toLocaleString()}
-
- ) : ( -
-
-
- -
-
{t("workflow.history.props.state.failed")}
-
- -
{log?.error}
- -
{log?.created && new Date(log.created).toLocaleString()}
-
- )} - - -
- {log?.log.map((item: WorkflowRunLogItem, i) => { - return ( -
-
{item.nodeName}
-
- {item.outputs.map((output: WorkflowOutput) => { - return ( - <> -
-
[{output.time}]
- {output.error ? ( - <> -
{output.error}
- - ) : ( - <> -
{output.content}
- - )} -
- - ); - })} -
-
- ); - })} -
-
-
-
-
- ); -}; - -export default WorkflowLogDetail; diff --git a/ui/src/components/workflow/run/WorkflowRunDetailDrawer.tsx b/ui/src/components/workflow/run/WorkflowRunDetailDrawer.tsx new file mode 100644 index 00000000..45ba3661 --- /dev/null +++ b/ui/src/components/workflow/run/WorkflowRunDetailDrawer.tsx @@ -0,0 +1,80 @@ +import { cloneElement, useMemo } from "react"; +import { useTranslation } from "react-i18next"; +import { useControllableValue } from "ahooks"; +import { Alert, Drawer } from "antd"; + +import Show from "@/components/Show"; +import { type WorkflowRunModel } from "@/domain/workflowRun"; + +export type WorkflowRunDetailDrawerProps = { + data?: WorkflowRunModel; + loading?: boolean; + trigger?: React.ReactElement; + onOpenChange?: (open: boolean) => void; +}; + +const WorkflowRunDetailDrawer = ({ data, loading, trigger, ...props }: WorkflowRunDetailDrawerProps) => { + const { t } = useTranslation(); + + const [open, setOpen] = useControllableValue(props, { + valuePropName: "open", + defaultValuePropName: "defaultOpen", + trigger: "onOpenChange", + }); + + const triggerEl = useMemo(() => { + if (!trigger) { + return null; + } + + return cloneElement(trigger, { + ...trigger.props, + onClick: () => { + setOpen(true); + trigger.props?.onClick?.(); + }, + }); + }, [trigger, setOpen]); + + return ( + <> + {triggerEl} + + setOpen(false)}> + + + + + + + + + +
+
+ {data!.log.map((item, i) => { + return ( +
+
{item.nodeName}
+
+ {item.outputs.map((output, j) => { + return ( +
+
[{output.time}]
+ {output.error ?
{output.error}
:
{output.content}
} +
+ ); + })} +
+
+ ); + })} +
+
+
+
+ + ); +}; + +export default WorkflowRunDetailDrawer; diff --git a/ui/src/components/workflow/run/WorkflowRuns.tsx b/ui/src/components/workflow/run/WorkflowRuns.tsx new file mode 100644 index 00000000..0cf76772 --- /dev/null +++ b/ui/src/components/workflow/run/WorkflowRuns.tsx @@ -0,0 +1,157 @@ +import { useState } from "react"; +import { useParams } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { useRequest } from "ahooks"; +import { Button, Empty, notification, Space, Table, theme, Tooltip, Typography, type TableProps } from "antd"; +import { CircleCheck as CircleCheckIcon, CircleX as CircleXIcon, Eye as EyeIcon } from "lucide-react"; +import dayjs from "dayjs"; +import { ClientResponseError } from "pocketbase"; + +import WorkflowRunDetailDrawer from "./WorkflowRunDetailDrawer"; +import { type WorkflowRunModel } from "@/domain/workflowRun"; +import { list as listWorkflowRuns } from "@/repository/workflowRun"; +import { getErrMsg } from "@/utils/error"; + +export type WorkflowRunsProps = { + className?: string; + style?: React.CSSProperties; +}; + +const WorkflowRuns = ({ className, style }: WorkflowRunsProps) => { + const { t } = useTranslation(); + + const { token: themeToken } = theme.useToken(); + + const [notificationApi, NotificationContextHolder] = notification.useNotification(); + + const tableColumns: TableProps["columns"] = [ + { + key: "$index", + align: "center", + fixed: "left", + width: 50, + render: (_, __, index) => (page - 1) * pageSize + index + 1, + }, + { + key: "id", + title: t("workflow_run.props.id"), + ellipsis: true, + render: (_, record) => record.id, + }, + { + key: "status", + title: t("workflow_run.props.status"), + ellipsis: true, + render: (_, record) => { + if (record.succeed) { + return ( + + + {t("workflow_run.props.status.succeeded")} + + ); + } else { + + + + {t("workflow_run.props.status.failed")} + + ; + } + }, + }, + { + key: "startedAt", + title: t("workflow_run.props.started_at"), + ellipsis: true, + render: (_, record) => { + return "TODO"; + }, + }, + { + key: "completedAt", + title: t("workflow_run.props.completed_at"), + ellipsis: true, + render: (_, record) => { + return "TODO"; + }, + }, + { + key: "$action", + align: "end", + fixed: "right", + width: 120, + render: (_, record) => ( + + } variant="text" />} /> + + ), + }, + ]; + const [tableData, setTableData] = useState([]); + const [tableTotal, setTableTotal] = useState(0); + + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(10); + + const { id: workflowId } = useParams(); // TODO: 外部传参 + const { loading } = useRequest( + () => { + return listWorkflowRuns({ + workflowId: workflowId!, + page: page, + perPage: pageSize, + }); + }, + { + refreshDeps: [workflowId, page, pageSize], + onSuccess: (data) => { + setTableData(data.items); + setTableTotal(data.totalItems); + }, + onError: (err) => { + if (err instanceof ClientResponseError && err.isAbort) { + return; + } + + console.error(err); + notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) }); + }, + } + ); + + return ( + <> + {NotificationContextHolder} + +
+ + columns={tableColumns} + dataSource={tableData} + loading={loading} + locale={{ + emptyText: , + }} + pagination={{ + current: page, + pageSize: pageSize, + total: tableTotal, + showSizeChanger: true, + onChange: (page: number, pageSize: number) => { + setPage(page); + setPageSize(pageSize); + }, + onShowSizeChange: (page: number, pageSize: number) => { + setPage(page); + setPageSize(pageSize); + }, + }} + rowKey={(record: WorkflowRunModel) => record.id} + scroll={{ x: "max(100%, 960px)" }} + /> +
+ + ); +}; + +export default WorkflowRuns; diff --git a/ui/src/domain/workflow.ts b/ui/src/domain/workflow.ts index 7ba29a82..f919a79e 100644 --- a/ui/src/domain/workflow.ts +++ b/ui/src/domain/workflow.ts @@ -4,6 +4,9 @@ import { nanoid } from "nanoid"; import i18n from "@/i18n"; import { deployTargets } from "./domain"; +/** + * @deprecated + */ export type WorkflowRunLog = { id: string; workflow: string; @@ -14,6 +17,9 @@ export type WorkflowRunLog = { updated: string; }; +/** + * @deprecated + */ export type WorkflowRunLogItem = { nodeName: string; error: string; diff --git a/ui/src/domain/workflowRun.ts b/ui/src/domain/workflowRun.ts new file mode 100644 index 00000000..f1c11411 --- /dev/null +++ b/ui/src/domain/workflowRun.ts @@ -0,0 +1,14 @@ +import { type WorkflowOutput } from "./workflow"; + +export interface WorkflowRunModel extends BaseModel { + workflow: string; + log: WorkflowRunLog[]; + error: string; + succeed: boolean; +} + +export type WorkflowRunLog = { + nodeName: string; + error: string; + outputs: WorkflowOutput[]; +}; diff --git a/ui/src/global.css b/ui/src/global.css index b9980108..4f5ac844 100644 --- a/ui/src/global.css +++ b/ui/src/global.css @@ -21,7 +21,6 @@ --border: 20 5.9% 90%; --input: 20 5.9% 90%; --ring: 24.6 95% 53.1%; - --radius: 0.5rem; } .dark { diff --git a/ui/src/i18n/locales/en/nls.workflow.json b/ui/src/i18n/locales/en/nls.workflow.json index 03b05640..6f39393b 100644 --- a/ui/src/i18n/locales/en/nls.workflow.json +++ b/ui/src/i18n/locales/en/nls.workflow.json @@ -20,27 +20,30 @@ "workflow.props.created_at": "Created At", "workflow.props.updated_at": "Updated At", + "workflow.detail.orchestration.tab": "Orchestration", + "workflow.detail.runs.tab": "Workflow Runs", + "workflow.baseinfo.modal.title": "Workflow Base Information", "workflow.baseinfo.form.name.label": "Name", "workflow.baseinfo.form.name.placeholder": "Please enter name", "workflow.baseinfo.form.description.label": "Description", "workflow.baseinfo.form.description.placeholder": "Please enter description", + "workflow_run.props.id": "ID", + "workflow_run.props.status": "Status", + "workflow_run.props.status.succeeded": "Succeeded", + "workflow_run.props.status.failed": "Failed", + "workflow_run.props.started_at": "Started At", + "workflow_run.props.completed_at": "Completed At", + "workflow.detail.action.save": "Save updates", "workflow.detail.action.save.failed": "Save failed", - "workflow.detail.action.save.failed.uncompleted": "Please complete all node settings", + "workflow.detail.action.save.failed.uncompleted": "Please complete the orchestration and publish the changes first", "workflow.detail.action.run": "Run", "workflow.detail.action.run.failed": "Run failed", "workflow.detail.action.run.success": "Run success", "workflow.detail.action.running": "Running", - "workflow.history.page.title": "Logs", - "workflow.history.props.state": "State", - "workflow.history.props.state.success": "Success", - "workflow.history.props.state.failed": "Failed", - "workflow.history.props.reason": "Reason", - "workflow.history.props.time": "Time", - "workflow.common.certificate.label": "Certificate", "workflow.common.certificate.placeholder": "Please select certificate source", diff --git a/ui/src/i18n/locales/zh/nls.workflow.json b/ui/src/i18n/locales/zh/nls.workflow.json index 9dd65c04..c2729c23 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.json +++ b/ui/src/i18n/locales/zh/nls.workflow.json @@ -20,29 +20,30 @@ "workflow.props.created_at": "创建时间", "workflow.props.updated_at": "更新时间", + "workflow.detail.orchestration.tab": "流程编排", + "workflow.detail.runs.tab": "执行历史", + "workflow.baseinfo.modal.title": "编辑基本信息", "workflow.baseinfo.form.name.label": "名称", "workflow.baseinfo.form.name.placeholder": "请输入工作流名称", "workflow.baseinfo.form.description.label": "描述", "workflow.baseinfo.form.description.placeholder": "请输入工作流描述", + "workflow_run.props.id": "ID", + "workflow_run.props.status": "状态", + "workflow_run.props.status.succeeded": "成功", + "workflow_run.props.status.failed": "失败", + "workflow_run.props.started_at": "开始时间", + "workflow_run.props.completed_at": "完成时间", + "workflow.detail.action.save": "保存变更", "workflow.detail.action.save.failed": "保存失败", - "workflow.detail.action.save.failed.uncompleted": "请完成所有节点设置", + "workflow.detail.action.save.failed.uncompleted": "请先完成流程编排并发布更改", "workflow.detail.action.run": "立即执行", "workflow.detail.action.run.failed": "执行失败", "workflow.detail.action.run.success": "执行成功", "workflow.detail.action.running": "正在执行", - "workflow.baseinfo.title": "基本信息", - - "workflow.history.page.title": "日志", - "workflow.history.props.state": "状态", - "workflow.history.props.state.success": "通过", - "workflow.history.props.state.failed": "失败", - "workflow.history.props.reason": "原因", - "workflow.history.props.time": "时间", - "workflow.common.certificate.label": "证书", "workflow.common.certificate.placeholder": "请选择证书来源", diff --git a/ui/src/pages/accesses/AccessList.tsx b/ui/src/pages/accesses/AccessList.tsx index b4e43098..44631263 100644 --- a/ui/src/pages/accesses/AccessList.tsx +++ b/ui/src/pages/accesses/AccessList.tsx @@ -69,40 +69,38 @@ const AccessList = () => { fixed: "right", width: 120, render: (_, record) => ( - <> - - -