@gadmin2n/schematics 0.0.72 → 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/job.prisma +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +0 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +171 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/AgendaJob.ts +60 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeInstance.ts +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeType.ts +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +14 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +49 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +746 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +786 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.controller.ts +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +79 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.ts +145 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/{canvas/canvas.service.spec.ts → agendaJob/agendaJob.service.spec.ts} +71 -65
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.service.ts +83 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.module.ts +9 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +100 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +43 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +317 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.controller.ts +16 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.service.ts +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +220 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +82 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +16 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +505 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +22 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +147 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +356 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +110 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.spec.ts +22 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +216 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +356 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +168 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.spec.ts +22 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.ts +199 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +348 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.ts +106 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +579 -1082
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +278 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/config/development-sql.yaml +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/docker-compose.yml +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/package.json +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/sql/create-event-trigger.sql +87 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.env +7 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/SANDBOX.md +122 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package-lock.json +4285 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package.json +28 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/code-execute.test.ts +44 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/http-request.test.ts +87 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/helpers.test.ts +225 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/node-type-consistency.test.ts +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/code-execute.ts +51 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-execute.ts +85 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-query.ts +35 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/http-request.ts +54 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/index.ts +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/reporting.ts +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/send-notification.ts +47 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/config.ts +13 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/condition.ts +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/context.ts +58 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/graph.ts +184 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/helpers.ts +133 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +57 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/types.ts +77 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/index.ts +36 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/outbox-poller.ts +226 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/workflows/dsl-workflow.ts +411 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/tsconfig.json +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/vitest.config.ts +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/yarn.lock +1905 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package-lock.json +17555 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +5 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +5 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +63 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +91 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +48 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +43 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +14 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +14 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +309 -56
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +1 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/create.tsx +108 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +124 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/index.tsx +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +245 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +160 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +120 -148
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +74 -181
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +15 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +338 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +18 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +10 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +10 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/{ChartViewerConfigModal.tsx → MultiChartConfigModal.tsx} +30 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +427 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +10 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +6 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +10 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +10 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +24 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +45 -63
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +99 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +87 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +322 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +175 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +60 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +1150 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +198 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +81 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +566 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +224 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +524 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +343 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +243 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +363 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +154 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +176 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +77 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +112 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +305 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +282 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +469 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +92 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +111 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +127 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +254 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1501 -1199
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.spec.ts +0 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +0 -896
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +0 -219
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +0 -159
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +0 -192
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +0 -1034
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +0 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +0 -509
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +0 -66
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +0 -552
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +0 -263
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +0 -35
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +0 -207
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +0 -382
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +0 -135
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +0 -53
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +0 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +0 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +0 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +0 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +0 -39349
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +0 -19
|
@@ -2,6 +2,10 @@ import React, { useState, useEffect } from 'react';
|
|
|
2
2
|
import { Modal, Checkbox, Input, Button, Select } from 'antd';
|
|
3
3
|
import { PlusOutlined, MinusCircleOutlined } from '@ant-design/icons';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import {
|
|
6
|
+
CANVAS_MODAL_PROPS,
|
|
7
|
+
CANVAS_MODAL_TITLE_STYLE,
|
|
8
|
+
} from './canvasModalProps';
|
|
5
9
|
|
|
6
10
|
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
7
11
|
|
|
@@ -77,15 +81,17 @@ const TableDataSourceModal: React.FC<TableDataSourceModalProps> = ({
|
|
|
77
81
|
|
|
78
82
|
return (
|
|
79
83
|
<Modal
|
|
80
|
-
|
|
84
|
+
{...CANVAS_MODAL_PROPS}
|
|
85
|
+
title={
|
|
86
|
+
<span style={CANVAS_MODAL_TITLE_STYLE}>
|
|
87
|
+
{t('canvas.dataSourceModal.title')}
|
|
88
|
+
</span>
|
|
89
|
+
}
|
|
81
90
|
open={open}
|
|
82
91
|
onOk={handleConfirm}
|
|
83
92
|
onCancel={onCancel}
|
|
84
93
|
okText={t('canvas.dataSourceModal.ok')}
|
|
85
94
|
cancelText={t('canvas.dataSourceModal.cancel')}
|
|
86
|
-
width={480}
|
|
87
|
-
centered
|
|
88
|
-
destroyOnClose
|
|
89
95
|
>
|
|
90
96
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
|
|
91
97
|
{/* 列配置 */}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas 编辑弹窗统一样式 Props
|
|
3
|
+
*
|
|
4
|
+
* 所有 Canvas 画布内的工具/配置弹窗共享这些 Modal props,
|
|
5
|
+
* 保证视觉风格一致(间距、无分隔线、居中、无关闭按钮)。
|
|
6
|
+
*/
|
|
7
|
+
export const CANVAS_MODAL_PROPS = {
|
|
8
|
+
width: 420,
|
|
9
|
+
centered: true,
|
|
10
|
+
destroyOnClose: true,
|
|
11
|
+
closable: false,
|
|
12
|
+
styles: {
|
|
13
|
+
header: { padding: '16px 20px 0', marginBottom: 0 },
|
|
14
|
+
body: { padding: '12px 20px 16px' },
|
|
15
|
+
footer: { padding: '0 20px 16px', borderTop: 'none' },
|
|
16
|
+
},
|
|
17
|
+
} as const;
|
|
18
|
+
|
|
19
|
+
/** 统一标题样式 */
|
|
20
|
+
export const CANVAS_MODAL_TITLE_STYLE: React.CSSProperties = {
|
|
21
|
+
fontSize: 13,
|
|
22
|
+
fontWeight: 500,
|
|
23
|
+
color: '#595959',
|
|
24
|
+
};
|
|
@@ -6,7 +6,7 @@ const numCardDemo: ComponentDemo = {
|
|
|
6
6
|
title: 'NumCard',
|
|
7
7
|
description:
|
|
8
8
|
"项目唯一的数字指标卡片,用于展示单一关键数字(如总数、成功率、延迟、金额)。传 null / undefined / NaN 自动显示 '--',无需手动判断。",
|
|
9
|
-
imports: `import { NumCard } from "
|
|
9
|
+
imports: `import { NumCard } from "@gadmin2n/charts";`,
|
|
10
10
|
props: [
|
|
11
11
|
{
|
|
12
12
|
name: 'variant',
|
|
@@ -117,7 +117,7 @@ const filterDemo: ComponentDemo = {
|
|
|
117
117
|
title: 'Filter',
|
|
118
118
|
description:
|
|
119
119
|
'项目统一的过滤条容器,封装布局标准化、搜索/重置按钮、Form 实例管理。3 种 layout:card-grid(Card+Grid)/ inline(单行)/ inline-right(右对齐,无按钮)。',
|
|
120
|
-
imports: `import { Filter } from "
|
|
120
|
+
imports: `import { Filter } from "@gadmin2n/charts";
|
|
121
121
|
import { Form, Select, DatePicker, Input } from "antd";`,
|
|
122
122
|
props: [
|
|
123
123
|
{
|
|
@@ -268,13 +268,13 @@ const barChartDemo: ComponentDemo = {
|
|
|
268
268
|
title: 'BarChart',
|
|
269
269
|
description:
|
|
270
270
|
'项目统一柱状图,封装标准 ECharts 配置。支持纵柱、横柱、多系列堆叠、百分比堆叠,数据格式随 variant 不同。',
|
|
271
|
-
imports: `import { BarChart } from "
|
|
271
|
+
imports: `import { BarChart } from "@gadmin2n/charts";`,
|
|
272
272
|
props: [
|
|
273
273
|
{
|
|
274
274
|
name: 'variant',
|
|
275
|
-
type: '"bar" | "
|
|
275
|
+
type: '"bar" | "groupBar"',
|
|
276
276
|
default: '"bar"',
|
|
277
|
-
desc: 'bar: 单系列柱状图;
|
|
277
|
+
desc: 'bar: 单系列柱状图;groupBar: 多系列柱状图(通过 stacked/percent 控制行为)',
|
|
278
278
|
},
|
|
279
279
|
{
|
|
280
280
|
name: 'direction',
|
|
@@ -282,6 +282,18 @@ const barChartDemo: ComponentDemo = {
|
|
|
282
282
|
default: '"vertical"',
|
|
283
283
|
desc: '图表方向:vertical 为纵向(默认),horizontal 为横向',
|
|
284
284
|
},
|
|
285
|
+
{
|
|
286
|
+
name: 'stacked',
|
|
287
|
+
type: 'boolean',
|
|
288
|
+
default: 'false',
|
|
289
|
+
desc: '多系列堆叠模式(仅 groupBar 生效)',
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
name: 'percent',
|
|
293
|
+
type: 'boolean',
|
|
294
|
+
default: 'false',
|
|
295
|
+
desc: '百分比堆叠(仅 stacked=true 时生效)',
|
|
296
|
+
},
|
|
285
297
|
{
|
|
286
298
|
name: 'data',
|
|
287
299
|
type: 'BarDataSingle | BarDataMulti | BarDataPercent',
|
|
@@ -304,7 +316,7 @@ const barChartDemo: ComponentDemo = {
|
|
|
304
316
|
name: 'showLabel',
|
|
305
317
|
type: 'boolean',
|
|
306
318
|
default: 'true',
|
|
307
|
-
desc: '
|
|
319
|
+
desc: '是否在柱顶/柱右显示数值标签;堆叠模式仅最后一段显示总量',
|
|
308
320
|
},
|
|
309
321
|
{
|
|
310
322
|
name: 'legendShow',
|
|
@@ -361,15 +373,14 @@ const barChartDemo: ComponentDemo = {
|
|
|
361
373
|
unit="件"
|
|
362
374
|
title="数据对比"
|
|
363
375
|
height={300}
|
|
364
|
-
legendShow={true}
|
|
365
376
|
testId="canvas-barchart-bar"
|
|
366
377
|
/>`,
|
|
367
378
|
},
|
|
368
379
|
{
|
|
369
|
-
name: '
|
|
370
|
-
label: '
|
|
380
|
+
name: 'groupBar',
|
|
381
|
+
label: 'groupBar',
|
|
371
382
|
code: `<BarChart
|
|
372
|
-
variant="
|
|
383
|
+
variant="groupBar"
|
|
373
384
|
data={{
|
|
374
385
|
xData: ["Jan", "Feb", "Mar", "Apr", "May", "Jun"],
|
|
375
386
|
series: [
|
|
@@ -379,38 +390,9 @@ const barChartDemo: ComponentDemo = {
|
|
|
379
390
|
],
|
|
380
391
|
}}
|
|
381
392
|
unit="万"
|
|
382
|
-
title="
|
|
383
|
-
height={300}
|
|
384
|
-
legendShow={true}
|
|
385
|
-
testId="canvas-barchart-stack"
|
|
386
|
-
/>`,
|
|
387
|
-
},
|
|
388
|
-
{
|
|
389
|
-
name: 'stackBarPercent',
|
|
390
|
-
label: 'stackBarPercent',
|
|
391
|
-
code: `<BarChart
|
|
392
|
-
variant="stackBarPercent"
|
|
393
|
-
data={{
|
|
394
|
-
xData: ["Jan", "Feb", "Mar", "Apr", "May"],
|
|
395
|
-
series: [
|
|
396
|
-
{ name: "类型A", data: [55, 58, 52, 60, 57] },
|
|
397
|
-
{ name: "类型B", data: [30, 28, 33, 25, 29] },
|
|
398
|
-
{ name: "类型C", data: [15, 14, 15, 15, 14] },
|
|
399
|
-
],
|
|
400
|
-
allTypes: ["类型A", "类型B", "类型C"],
|
|
401
|
-
originalData: {
|
|
402
|
-
"Jan": [{ key: "类型A", active_device_cnt: 110 }, { key: "类型B", active_device_cnt: 60 }, { key: "类型C", active_device_cnt: 30 }],
|
|
403
|
-
"Feb": [{ key: "类型A", active_device_cnt: 116 }, { key: "类型B", active_device_cnt: 56 }, { key: "类型C", active_device_cnt: 28 }],
|
|
404
|
-
"Mar": [{ key: "类型A", active_device_cnt: 104 }, { key: "类型B", active_device_cnt: 66 }, { key: "类型C", active_device_cnt: 30 }],
|
|
405
|
-
"Apr": [{ key: "类型A", active_device_cnt: 120 }, { key: "类型B", active_device_cnt: 50 }, { key: "类型C", active_device_cnt: 30 }],
|
|
406
|
-
"May": [{ key: "类型A", active_device_cnt: 114 }, { key: "类型B", active_device_cnt: 58 }, { key: "类型C", active_device_cnt: 28 }],
|
|
407
|
-
},
|
|
408
|
-
}}
|
|
409
|
-
unit="%"
|
|
410
|
-
title="占比分析"
|
|
393
|
+
title="分组对比"
|
|
411
394
|
height={300}
|
|
412
|
-
|
|
413
|
-
testId="canvas-barchart-stackpercent"
|
|
395
|
+
testId="canvas-barchart-group"
|
|
414
396
|
/>`,
|
|
415
397
|
},
|
|
416
398
|
],
|
|
@@ -422,7 +404,7 @@ const lineChartDemo: ComponentDemo = {
|
|
|
422
404
|
title: 'LineChart',
|
|
423
405
|
description:
|
|
424
406
|
'项目统一折线图,支持单系列、多系列堆叠、面积堆叠(hover 只高亮当前系列)、分组面积折线(hover 同父类分组高亮)、迷你趋势线、双 Y 轴混合图。',
|
|
425
|
-
imports: `import { LineChart } from "
|
|
407
|
+
imports: `import { LineChart } from "@gadmin2n/charts";`,
|
|
426
408
|
props: [
|
|
427
409
|
{
|
|
428
410
|
name: 'variant',
|
|
@@ -532,7 +514,7 @@ const pieChartDemo: ComponentDemo = {
|
|
|
532
514
|
title: 'PieChart',
|
|
533
515
|
description:
|
|
534
516
|
'项目统一饼图,支持标准饼图、环形图(甜甜圈)、旭日图。数据自动按 value 从大到小排序,超 topN 项自动合并为 Others。',
|
|
535
|
-
imports: `import { PieChart } from "
|
|
517
|
+
imports: `import { PieChart } from "@gadmin2n/charts";`,
|
|
536
518
|
props: [
|
|
537
519
|
{
|
|
538
520
|
name: 'variant',
|
|
@@ -694,7 +676,7 @@ const radarChartDemo: ComponentDemo = {
|
|
|
694
676
|
title: 'RadarChart',
|
|
695
677
|
description:
|
|
696
678
|
'项目统一雷达图,适用于多维度能力评估和多实体横向对比。indicators 和 series.data 长度必须相同。',
|
|
697
|
-
imports: `import { RadarChart } from "
|
|
679
|
+
imports: `import { RadarChart } from "@gadmin2n/charts";`,
|
|
698
680
|
props: [
|
|
699
681
|
{
|
|
700
682
|
name: 'indicators',
|
|
@@ -752,8 +734,8 @@ const radarChartDemo: ComponentDemo = {
|
|
|
752
734
|
],
|
|
753
735
|
variants: [
|
|
754
736
|
{
|
|
755
|
-
name: '
|
|
756
|
-
label: '
|
|
737
|
+
name: 'default',
|
|
738
|
+
label: 'default',
|
|
757
739
|
code: `<RadarChart
|
|
758
740
|
indicators={[
|
|
759
741
|
{ name: "维度A" }, { name: "维度B" },
|
|
@@ -777,7 +759,7 @@ const treemapChartDemo: ComponentDemo = {
|
|
|
777
759
|
title: 'TreemapChart',
|
|
778
760
|
description:
|
|
779
761
|
'矩形树图,方块面积 = 数值大小,适合多分类占比展示(>8 项时替代饼图)。自动检测扁平 / 嵌套结构。',
|
|
780
|
-
imports: `import { TreemapChart } from "
|
|
762
|
+
imports: `import { TreemapChart } from "@gadmin2n/charts";`,
|
|
781
763
|
props: [
|
|
782
764
|
{
|
|
783
765
|
name: 'data',
|
|
@@ -841,8 +823,8 @@ const treemapChartDemo: ComponentDemo = {
|
|
|
841
823
|
],
|
|
842
824
|
variants: [
|
|
843
825
|
{
|
|
844
|
-
name: '
|
|
845
|
-
label: '
|
|
826
|
+
name: 'default',
|
|
827
|
+
label: 'default',
|
|
846
828
|
code: `<TreemapChart
|
|
847
829
|
data={[
|
|
848
830
|
{
|
|
@@ -886,7 +868,7 @@ const tableDemo: ComponentDemo = {
|
|
|
886
868
|
title: 'Table',
|
|
887
869
|
description:
|
|
888
870
|
'drop-in 替换 antd Table,传 pagination 对象自动补 showSizeChanger + pageSizeOptions。不传 pagination 则不分页。',
|
|
889
|
-
imports: `import { Table } from "
|
|
871
|
+
imports: `import { Table } from "@gadmin2n/charts";`,
|
|
890
872
|
props: [
|
|
891
873
|
{
|
|
892
874
|
name: 'dataSource',
|
|
@@ -963,7 +945,7 @@ const worldMapDemo: ComponentDemo = {
|
|
|
963
945
|
title: 'WorldMap',
|
|
964
946
|
description:
|
|
965
947
|
'项目统一世界地图,封装标准 geo 基准配置(Highcharts 坐标系,aspectScale 固定为 1)。通过 option 透传 series、geo 差异字段即可。',
|
|
966
|
-
imports: `import { WorldMap } from "
|
|
948
|
+
imports: `import { WorldMap } from "@gadmin2n/charts";`,
|
|
967
949
|
props: [
|
|
968
950
|
{
|
|
969
951
|
name: 'option',
|
|
@@ -1016,8 +998,8 @@ const worldMapDemo: ComponentDemo = {
|
|
|
1016
998
|
],
|
|
1017
999
|
variants: [
|
|
1018
1000
|
{
|
|
1019
|
-
name: '
|
|
1020
|
-
label: '
|
|
1001
|
+
name: 'default',
|
|
1002
|
+
label: 'default',
|
|
1021
1003
|
code: `<WorldMap
|
|
1022
1004
|
option={{
|
|
1023
1005
|
geo: {
|
|
@@ -1078,13 +1060,13 @@ const worldMapDemo: ComponentDemo = {
|
|
|
1078
1060
|
],
|
|
1079
1061
|
};
|
|
1080
1062
|
|
|
1081
|
-
// ───
|
|
1082
|
-
const
|
|
1083
|
-
id: 'chart
|
|
1084
|
-
title: '
|
|
1063
|
+
// ─── MultiChart ──────────────────────────────────────────────────────────────
|
|
1064
|
+
const multiChartDemo: ComponentDemo = {
|
|
1065
|
+
id: 'multi-chart',
|
|
1066
|
+
title: 'MultiChart',
|
|
1085
1067
|
description:
|
|
1086
|
-
'
|
|
1087
|
-
imports: `import {
|
|
1068
|
+
'复合图表:右上角按钮切换柱状图、折线图、饼图。支持配置包含哪些图表、右键切换和各图表独立配置。',
|
|
1069
|
+
imports: `import { MultiChart } from "@gadmin2n/charts";`,
|
|
1088
1070
|
props: [
|
|
1089
1071
|
{ name: 'height', type: 'number', default: '300', desc: '图表高度(px)' },
|
|
1090
1072
|
{
|
|
@@ -1106,9 +1088,9 @@ const chartViewerDemo: ComponentDemo = {
|
|
|
1106
1088
|
{
|
|
1107
1089
|
name: 'default',
|
|
1108
1090
|
label: 'default',
|
|
1109
|
-
code: `<
|
|
1091
|
+
code: `<MultiChart
|
|
1110
1092
|
height={300}
|
|
1111
|
-
testId="canvas-
|
|
1093
|
+
testId="canvas-multichart-default"
|
|
1112
1094
|
/>`,
|
|
1113
1095
|
},
|
|
1114
1096
|
],
|
|
@@ -1119,7 +1101,7 @@ const sectionDemo: ComponentDemo = {
|
|
|
1119
1101
|
id: 'section',
|
|
1120
1102
|
title: 'Section',
|
|
1121
1103
|
description: '白色背景容器,左上角标题,其他组件可放在其上方形成视觉分组。',
|
|
1122
|
-
imports: `import { Section } from "
|
|
1104
|
+
imports: `import { Section } from "@gadmin2n/charts";`,
|
|
1123
1105
|
props: [
|
|
1124
1106
|
{ name: 'title', type: 'string', desc: '左上角标题文字' },
|
|
1125
1107
|
{
|
|
@@ -1148,6 +1130,6 @@ export const allDemos: ComponentDemo[] = [
|
|
|
1148
1130
|
treemapChartDemo,
|
|
1149
1131
|
tableDemo,
|
|
1150
1132
|
worldMapDemo,
|
|
1151
|
-
|
|
1133
|
+
multiChartDemo,
|
|
1152
1134
|
sectionDemo,
|
|
1153
1135
|
];
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import React, { memo } from 'react';
|
|
2
|
+
import { Handle, Position, type NodeProps } from '@xyflow/react';
|
|
3
|
+
|
|
4
|
+
const CATEGORY_COLORS: Record<string, { bg: string; border: string }> = {
|
|
5
|
+
TRIGGER: { bg: '#e6f7ff', border: '#91caff' },
|
|
6
|
+
ACTION: { bg: '#f6ffed', border: '#b7eb8f' },
|
|
7
|
+
CONDITION: { bg: '#fff7e6', border: '#ffd591' },
|
|
8
|
+
LOOP: { bg: '#f9f0ff', border: '#d3adf7' },
|
|
9
|
+
APPROVAL: { bg: '#fff1f0', border: '#ffa39e' },
|
|
10
|
+
SUB_WORKFLOW: { bg: '#f0f5ff', border: '#adc6ff' },
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export interface CustomNodeData {
|
|
14
|
+
label: string;
|
|
15
|
+
category: string;
|
|
16
|
+
isSelected: boolean;
|
|
17
|
+
readonly?: boolean;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const CustomNode = memo(({ data }: NodeProps) => {
|
|
22
|
+
const nodeData = data as CustomNodeData;
|
|
23
|
+
const colors = CATEGORY_COLORS[nodeData.category] || CATEGORY_COLORS.ACTION;
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
style={{
|
|
28
|
+
background: colors.bg,
|
|
29
|
+
border: nodeData.isSelected
|
|
30
|
+
? '2px solid #1677ff'
|
|
31
|
+
: `1px solid ${colors.border}`,
|
|
32
|
+
borderRadius: 8,
|
|
33
|
+
padding: '8px 16px',
|
|
34
|
+
fontSize: 14,
|
|
35
|
+
minWidth: 120,
|
|
36
|
+
textAlign: 'center',
|
|
37
|
+
boxShadow: nodeData.isSelected
|
|
38
|
+
? '0 0 0 2px rgba(22,119,255,0.2)'
|
|
39
|
+
: undefined,
|
|
40
|
+
}}
|
|
41
|
+
>
|
|
42
|
+
{!nodeData.readonly && (
|
|
43
|
+
<Handle
|
|
44
|
+
type="target"
|
|
45
|
+
position={Position.Top}
|
|
46
|
+
style={{
|
|
47
|
+
width: 14,
|
|
48
|
+
height: 14,
|
|
49
|
+
background: '#fff',
|
|
50
|
+
border: '2px solid #555',
|
|
51
|
+
cursor: 'crosshair',
|
|
52
|
+
}}
|
|
53
|
+
/>
|
|
54
|
+
)}
|
|
55
|
+
{nodeData.readonly && (
|
|
56
|
+
<Handle
|
|
57
|
+
type="target"
|
|
58
|
+
position={Position.Top}
|
|
59
|
+
style={{
|
|
60
|
+
width: 0,
|
|
61
|
+
height: 0,
|
|
62
|
+
border: 'none',
|
|
63
|
+
background: 'transparent',
|
|
64
|
+
visibility: 'hidden',
|
|
65
|
+
}}
|
|
66
|
+
/>
|
|
67
|
+
)}
|
|
68
|
+
<div>{nodeData.label}</div>
|
|
69
|
+
{!nodeData.readonly && (
|
|
70
|
+
<Handle
|
|
71
|
+
type="source"
|
|
72
|
+
position={Position.Bottom}
|
|
73
|
+
style={{
|
|
74
|
+
width: 14,
|
|
75
|
+
height: 14,
|
|
76
|
+
background: '#fff',
|
|
77
|
+
border: '2px solid #555',
|
|
78
|
+
cursor: 'crosshair',
|
|
79
|
+
}}
|
|
80
|
+
/>
|
|
81
|
+
)}
|
|
82
|
+
{nodeData.readonly && (
|
|
83
|
+
<Handle
|
|
84
|
+
type="source"
|
|
85
|
+
position={Position.Bottom}
|
|
86
|
+
style={{
|
|
87
|
+
width: 0,
|
|
88
|
+
height: 0,
|
|
89
|
+
border: 'none',
|
|
90
|
+
background: 'transparent',
|
|
91
|
+
visibility: 'hidden',
|
|
92
|
+
}}
|
|
93
|
+
/>
|
|
94
|
+
)}
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
CustomNode.displayName = 'CustomNode';
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { Button, Input, Modal, Space, message } from 'antd';
|
|
3
|
+
import { CopyOutlined, LoadingOutlined } from '@ant-design/icons';
|
|
4
|
+
import { customRequest } from 'helpers/http';
|
|
5
|
+
|
|
6
|
+
interface ExportModalProps {
|
|
7
|
+
open: boolean;
|
|
8
|
+
workflowId: string | null;
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function ExportModal({ open, workflowId, onClose }: ExportModalProps) {
|
|
13
|
+
const [url, setUrl] = useState<string>('');
|
|
14
|
+
const [loading, setLoading] = useState(false);
|
|
15
|
+
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (open && workflowId) {
|
|
18
|
+
setUrl('');
|
|
19
|
+
setLoading(true);
|
|
20
|
+
customRequest<{ url: string }>(
|
|
21
|
+
`workflow/${workflowId}/export-token`,
|
|
22
|
+
'POST',
|
|
23
|
+
)
|
|
24
|
+
.then((res) => setUrl(res.url))
|
|
25
|
+
.catch((e: any) =>
|
|
26
|
+
message.error(e?.message ?? 'Failed to generate export URL'),
|
|
27
|
+
)
|
|
28
|
+
.finally(() => setLoading(false));
|
|
29
|
+
}
|
|
30
|
+
}, [open, workflowId]);
|
|
31
|
+
|
|
32
|
+
const handleCopy = useCallback(async () => {
|
|
33
|
+
try {
|
|
34
|
+
await navigator.clipboard.writeText(url);
|
|
35
|
+
message.success('URL copied to clipboard');
|
|
36
|
+
} catch {
|
|
37
|
+
// Fallback for older browsers
|
|
38
|
+
const textarea = document.getElementById(
|
|
39
|
+
'export-url-input',
|
|
40
|
+
) as HTMLTextAreaElement;
|
|
41
|
+
textarea?.select();
|
|
42
|
+
document.execCommand('copy');
|
|
43
|
+
message.success('URL copied to clipboard');
|
|
44
|
+
}
|
|
45
|
+
}, [url]);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<Modal
|
|
49
|
+
title="Export Workflow"
|
|
50
|
+
open={open}
|
|
51
|
+
onCancel={onClose}
|
|
52
|
+
footer={
|
|
53
|
+
<Space>
|
|
54
|
+
<Button onClick={onClose}>Close</Button>
|
|
55
|
+
<Button
|
|
56
|
+
type="primary"
|
|
57
|
+
icon={<CopyOutlined />}
|
|
58
|
+
onClick={handleCopy}
|
|
59
|
+
disabled={!url}
|
|
60
|
+
>
|
|
61
|
+
Copy URL
|
|
62
|
+
</Button>
|
|
63
|
+
</Space>
|
|
64
|
+
}
|
|
65
|
+
>
|
|
66
|
+
{loading ? (
|
|
67
|
+
<div style={{ textAlign: 'center', padding: 24 }}>
|
|
68
|
+
<LoadingOutlined style={{ fontSize: 24 }} />
|
|
69
|
+
<p>Generating export URL...</p>
|
|
70
|
+
</div>
|
|
71
|
+
) : (
|
|
72
|
+
<>
|
|
73
|
+
<p style={{ marginBottom: 8, color: '#666' }}>
|
|
74
|
+
Export URL (valid for 30 minutes):
|
|
75
|
+
</p>
|
|
76
|
+
<Input.TextArea
|
|
77
|
+
id="export-url-input"
|
|
78
|
+
value={url}
|
|
79
|
+
readOnly
|
|
80
|
+
autoSize={{ minRows: 3, maxRows: 5 }}
|
|
81
|
+
onFocus={(e) => e.target.select()}
|
|
82
|
+
/>
|
|
83
|
+
</>
|
|
84
|
+
)}
|
|
85
|
+
</Modal>
|
|
86
|
+
);
|
|
87
|
+
}
|