@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.
Files changed (173) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/job.prisma +62 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +0 -21
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +171 -0
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/AgendaJob.ts +60 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +1 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +62 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeInstance.ts +62 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeType.ts +62 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +5 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -4
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +14 -7
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +4 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +49 -3
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +746 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +786 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.controller.ts +6 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +79 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.spec.ts +20 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.ts +145 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.module.ts +10 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/{canvas/canvas.service.spec.ts → agendaJob/agendaJob.service.spec.ts} +71 -65
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.service.ts +83 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.module.ts +9 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +100 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +19 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +43 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +317 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.controller.ts +16 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.service.ts +13 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +220 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +82 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +16 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +505 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +22 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +147 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +10 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +356 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +110 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.spec.ts +22 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +216 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +10 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +356 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +168 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.spec.ts +22 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.ts +199 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.module.ts +10 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +348 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.ts +106 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +579 -1082
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +278 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/config/development-sql.yaml +5 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/docker-compose.yml +25 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/package.json +13 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/sql/create-event-trigger.sql +87 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.env +7 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/SANDBOX.md +122 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package-lock.json +4285 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package.json +28 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/code-execute.test.ts +44 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/http-request.test.ts +87 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/helpers.test.ts +225 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/node-type-consistency.test.ts +101 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/code-execute.ts +51 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-execute.ts +85 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-query.ts +35 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/http-request.ts +54 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/index.ts +6 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/reporting.ts +62 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/send-notification.ts +47 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/config.ts +13 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/condition.ts +101 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/context.ts +58 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/graph.ts +184 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/helpers.ts +133 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +57 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/types.ts +77 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/index.ts +36 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/outbox-poller.ts +226 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/workflows/dsl-workflow.ts +411 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/tsconfig.json +19 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/vitest.config.ts +8 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/yarn.lock +1905 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package-lock.json +17555 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +5 -2
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +1 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +5 -1
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +1 -1
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +63 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +91 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +48 -2
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +43 -2
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +14 -9
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +14 -9
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +309 -56
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +1 -3
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/create.tsx +108 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +124 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/index.tsx +4 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +245 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +70 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +0 -1
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +160 -2
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +120 -148
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +74 -181
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +15 -13
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +2 -2
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +338 -3
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +18 -17
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +10 -4
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +10 -4
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/{ChartViewerConfigModal.tsx → MultiChartConfigModal.tsx} +30 -18
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +427 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +10 -4
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +6 -14
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +10 -4
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +10 -4
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +24 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +45 -63
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +99 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +87 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +322 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +175 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +60 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +1150 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +101 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +198 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +81 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +566 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +224 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +524 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +343 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +243 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +363 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +154 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +176 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +77 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +112 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +305 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +282 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +469 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +92 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +111 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +127 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +4 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +254 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +74 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1501 -1199
  151. package/package.json +1 -1
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.spec.ts +0 -22
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +0 -896
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +0 -219
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +0 -159
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +0 -192
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +0 -1034
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +0 -8
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +0 -509
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +0 -66
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +0 -552
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +0 -263
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +0 -35
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +0 -207
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +0 -382
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +0 -135
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +0 -53
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +0 -8
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +0 -1
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +0 -31
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +0 -9
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +0 -39349
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +0 -19
@@ -1,219 +0,0 @@
1
- import React, { useCallback } from 'react';
2
- import type { CSSProperties } from 'react';
3
- import { Button, Tooltip, Flex, Dropdown, Checkbox } from 'antd';
4
- import { HolderOutlined } from '@ant-design/icons';
5
- import {
6
- DndContext,
7
- PointerSensor,
8
- useSensor,
9
- useSensors,
10
- type DragEndEvent,
11
- } from '@dnd-kit/core';
12
- import {
13
- SortableContext,
14
- arrayMove,
15
- useSortable,
16
- verticalListSortingStrategy,
17
- } from '@dnd-kit/sortable';
18
- import { CSS } from '@dnd-kit/utilities';
19
- import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
20
-
21
- // ─── Types ────────────────────────────────────────────────────────────────────
22
-
23
- export interface ChartSwitcherItem {
24
- /** 图表唯一标识,例如 "bar"、"line" */
25
- key: string;
26
- /** 显示的标签(Tooltip 文字) */
27
- label: string;
28
- /** Ant Design 图标节点,例如 <BarChartOutlined /> */
29
- icon: React.ReactNode;
30
- /** 是否在工具栏中显示(右键菜单勾选控制) */
31
- visible: boolean;
32
- }
33
-
34
- export interface ChartSwitcherProps {
35
- // ── 数据 ────────────────────────────────
36
- /** 所有图表项(含顺序、visible 状态) */
37
- items: ChartSwitcherItem[];
38
- /** 当前选中的图表 key */
39
- value: string;
40
-
41
- // ── 事件 ────────────────────────────────
42
- /** 点击图表按钮时触发 */
43
- onChange: (key: string) => void;
44
- /** 右键菜单勾选/拖动后,items 发生变化时触发 */
45
- onItemsChange: (items: ChartSwitcherItem[]) => void;
46
-
47
- // ── 样式 ────────────────────────────────
48
- style?: CSSProperties;
49
- className?: string;
50
-
51
- // ── 测试 ────────────────────────────────
52
- testId: string;
53
- }
54
-
55
- // ─── SortableMenuItem ─────────────────────────────────────────────────────────
56
-
57
- interface SortableMenuItemProps {
58
- item: ChartSwitcherItem;
59
- isLastVisible: boolean;
60
- testId: string;
61
- onToggle: (key: string, checked: boolean) => void;
62
- }
63
-
64
- const SortableMenuItem: React.FC<SortableMenuItemProps> = ({
65
- item,
66
- isLastVisible,
67
- testId,
68
- onToggle,
69
- }) => {
70
- const {
71
- attributes,
72
- listeners,
73
- setNodeRef,
74
- transform,
75
- transition,
76
- isDragging,
77
- } = useSortable({ id: item.key });
78
-
79
- const itemStyle: CSSProperties = {
80
- transform: CSS.Transform.toString(transform),
81
- transition,
82
- opacity: isDragging ? 0.5 : 1,
83
- padding: '4px 0',
84
- cursor: 'default',
85
- userSelect: 'none',
86
- };
87
-
88
- return (
89
- <Flex
90
- ref={setNodeRef}
91
- align="center"
92
- gap={8}
93
- style={itemStyle}
94
- data-testid={`${testId}-menu-${item.key}`}
95
- >
96
- {/* 拖动手柄:仅手柄响应拖拽,避免干扰 Checkbox 点击 */}
97
- <HolderOutlined
98
- {...attributes}
99
- {...listeners}
100
- style={{ color: '#ccc', cursor: 'grab', touchAction: 'none' }}
101
- />
102
- <Checkbox
103
- checked={item.visible}
104
- disabled={isLastVisible}
105
- onChange={(e) => onToggle(item.key, e.target.checked)}
106
- />
107
- {item.icon}
108
- <span style={{ fontSize: 13 }}>{item.label}</span>
109
- </Flex>
110
- );
111
- };
112
-
113
- // ─── ChartSwitcher ────────────────────────────────────────────────────────────
114
-
115
- export const ChartSwitcher: React.FC<ChartSwitcherProps> = ({
116
- items,
117
- value,
118
- onChange,
119
- onItemsChange,
120
- style,
121
- className,
122
- testId,
123
- }) => {
124
- const visibleItems = items.filter((item) => item.visible);
125
- const visibleCount = visibleItems.length;
126
-
127
- const sensors = useSensors(
128
- useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
129
- );
130
-
131
- // 切换某项的 visible 状态
132
- const handleToggleVisible = useCallback(
133
- (key: string, checked: boolean) => {
134
- const newItems = items.map((item) =>
135
- item.key === key ? { ...item, visible: checked } : item,
136
- );
137
- onItemsChange(newItems);
138
- // 若当前选中项被隐藏,自动切换到第一个 visible 项
139
- if (!checked && key === value) {
140
- const firstVisible = newItems.find((item) => item.visible);
141
- if (firstVisible) onChange(firstVisible.key);
142
- }
143
- },
144
- [items, value, onChange, onItemsChange],
145
- );
146
-
147
- // 拖拽结束,更新 items 顺序
148
- const handleDragEnd = useCallback(
149
- (event: DragEndEvent) => {
150
- const { active, over } = event;
151
- if (!over || active.id === over.id) return;
152
- const oldIndex = items.findIndex((item) => item.key === active.id);
153
- const newIndex = items.findIndex((item) => item.key === over.id);
154
- onItemsChange(arrayMove(items, oldIndex, newIndex));
155
- },
156
- [items, onItemsChange],
157
- );
158
-
159
- // 右键菜单 overlay(自定义渲染,嵌入 DndContext)
160
- const dropdownOverlay = (
161
- <div
162
- style={{
163
- background: '#fff',
164
- borderRadius: 8,
165
- boxShadow: '0 6px 16px rgba(0,0,0,0.12)',
166
- padding: '4px 0',
167
- minWidth: 160,
168
- }}
169
- >
170
- <DndContext
171
- sensors={sensors}
172
- modifiers={[restrictToVerticalAxis]}
173
- onDragEnd={handleDragEnd}
174
- >
175
- <SortableContext
176
- items={items.map((item) => item.key)}
177
- strategy={verticalListSortingStrategy}
178
- >
179
- {items.map((item) => (
180
- <div key={item.key} style={{ padding: '0 12px' }}>
181
- <SortableMenuItem
182
- item={item}
183
- isLastVisible={item.visible && visibleCount === 1}
184
- testId={testId}
185
- onToggle={handleToggleVisible}
186
- />
187
- </div>
188
- ))}
189
- </SortableContext>
190
- </DndContext>
191
- </div>
192
- );
193
-
194
- return (
195
- <Dropdown dropdownRender={() => dropdownOverlay} trigger={['contextMenu']}>
196
- <Flex
197
- gap={4}
198
- align="center"
199
- data-testid={testId}
200
- style={{ ...style, cursor: 'context-menu' }}
201
- className={className}
202
- >
203
- {visibleItems.map((item) => (
204
- <Tooltip key={item.key} title={item.label} placement="bottom">
205
- <Button
206
- size="small"
207
- type={value === item.key ? 'primary' : 'text'}
208
- icon={item.icon}
209
- onClick={() => onChange(item.key)}
210
- data-testid={`${testId}-btn-${item.key}`}
211
- />
212
- </Tooltip>
213
- ))}
214
- </Flex>
215
- </Dropdown>
216
- );
217
- };
218
-
219
- export default ChartSwitcher;
@@ -1,159 +0,0 @@
1
- import React, { useState } from 'react';
2
- import type { CSSProperties } from 'react';
3
- import { Button, Tooltip, Flex } from 'antd';
4
- import {
5
- BarChartOutlined,
6
- LineChartOutlined,
7
- PieChartOutlined,
8
- } from '@ant-design/icons';
9
- import { BarChart } from '@/components/canvas/BarChart';
10
- import { LineChart } from '@/components/canvas/LineChart';
11
- import { PieChart } from '@/components/canvas/PieChart';
12
-
13
- // ─── Types ────────────────────────────────────────────────────────────────────
14
-
15
- export type ChartViewerChart = 'bar' | 'line' | 'pie';
16
-
17
- export interface ChartViewerProps {
18
- // ── 图表配置 ────────────────────────────
19
- /** 显示哪些图表及顺序,默认 ["bar", "line", "pie"] */
20
- charts?: ChartViewerChart[];
21
-
22
- // ── 布局 ────────────────────────────────
23
- /** 图表高度,默认 300 */
24
- height?: number;
25
-
26
- // ── 初始状态 ────────────────────────────
27
- /** 初始显示的图表类型,默认 charts[0] */
28
- defaultVariant?: ChartViewerChart;
29
-
30
- // ── 样式 ────────────────────────────────
31
- style?: CSSProperties;
32
- className?: string;
33
-
34
- // ── 测试 ────────────────────────────────
35
- testId: string;
36
- }
37
-
38
- // ─── Mock 数据 ────────────────────────────────────────────────────────────────
39
-
40
- const MOCK_BAR_DATA = [
41
- { name: 'Q1', value: 820 },
42
- { name: 'Q2', value: 932 },
43
- { name: 'Q3', value: 901 },
44
- { name: 'Q4', value: 1290 },
45
- ];
46
-
47
- const MOCK_LINE_DATA = {
48
- xData: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
49
- series: [
50
- { name: 'A 系列', data: [65, 72, 78, 85, 82, 91] },
51
- { name: 'B 系列', data: [35, 28, 22, 15, 18, 9] },
52
- ],
53
- };
54
-
55
- const MOCK_PIE_DATA = [
56
- { name: '类目A', value: 335 },
57
- { name: '类目B', value: 310 },
58
- { name: '类目C', value: 234 },
59
- { name: '类目D', value: 135 },
60
- { name: '其他', value: 100 },
61
- ];
62
-
63
- // ─── 所有图表的元信息 ─────────────────────────────────────────────────────────
64
-
65
- const CHART_META: Record<
66
- ChartViewerChart,
67
- { label: string; icon: React.ReactNode }
68
- > = {
69
- bar: { label: '柱状图', icon: <BarChartOutlined /> },
70
- line: { label: '折线图', icon: <LineChartOutlined /> },
71
- pie: { label: '饼图', icon: <PieChartOutlined /> },
72
- };
73
-
74
- const DEFAULT_CHARTS: ChartViewerChart[] = ['bar', 'line', 'pie'];
75
-
76
- // ─── Component ────────────────────────────────────────────────────────────────
77
-
78
- export const ChartViewer: React.FC<ChartViewerProps> = ({
79
- charts = DEFAULT_CHARTS,
80
- height = 300,
81
- defaultVariant,
82
- style,
83
- className,
84
- testId,
85
- }) => {
86
- const effectiveCharts = charts.length > 0 ? charts : DEFAULT_CHARTS;
87
- const initialVariant =
88
- defaultVariant && effectiveCharts.includes(defaultVariant)
89
- ? defaultVariant
90
- : effectiveCharts[0];
91
-
92
- const [activeVariant, setActiveVariant] =
93
- useState<ChartViewerChart>(initialVariant);
94
- const active = effectiveCharts.includes(activeVariant)
95
- ? activeVariant
96
- : effectiveCharts[0];
97
-
98
- return (
99
- <div
100
- style={{ position: 'relative', ...style }}
101
- className={className}
102
- data-testid={testId}
103
- >
104
- {/* ── 图表区域 ── */}
105
- {active === 'bar' && (
106
- <BarChart
107
- variant="bar"
108
- data={MOCK_BAR_DATA}
109
- height={height}
110
- testId={`${testId}-bar`}
111
- />
112
- )}
113
- {active === 'line' && (
114
- <LineChart
115
- variant="stackLine"
116
- data={MOCK_LINE_DATA}
117
- height={height}
118
- testId={`${testId}-line`}
119
- />
120
- )}
121
- {active === 'pie' && (
122
- <PieChart
123
- variant="pie"
124
- data={MOCK_PIE_DATA}
125
- height={height}
126
- testId={`${testId}-pie`}
127
- />
128
- )}
129
-
130
- {/* ── 右上角切换按钮(按 charts 顺序渲染) ── */}
131
- <Flex
132
- gap={2}
133
- style={{
134
- position: 'absolute',
135
- top: 8,
136
- right: 8,
137
- zIndex: 1,
138
- }}
139
- >
140
- {effectiveCharts.map((key) => {
141
- const { label, icon } = CHART_META[key];
142
- return (
143
- <Tooltip key={key} title={label} placement="bottom">
144
- <Button
145
- size="small"
146
- type={active === key ? 'primary' : 'text'}
147
- icon={icon}
148
- onClick={() => setActiveVariant(key)}
149
- data-testid={`${testId}-btn-${key}`}
150
- />
151
- </Tooltip>
152
- );
153
- })}
154
- </Flex>
155
- </div>
156
- );
157
- };
158
-
159
- export default ChartViewer;
@@ -1,192 +0,0 @@
1
- import React from 'react';
2
- import { Button, Card, Form } from 'antd';
3
- import { useTranslation } from 'react-i18next';
4
- import type { FormInstance, FormProps } from 'antd';
5
-
6
- // ─── Types ────────────────────────────────────────────────────────────────────
7
-
8
- export type FilterLayout = 'card-grid' | 'inline' | 'inline-right';
9
-
10
- export interface FilterProps {
11
- // ── 布局 ──────────────────────────────────────────────────────────────────
12
- /**
13
- * 布局模式:
14
- * - `"card-grid"`(默认):Card 包裹 + CSS grid,适用于多字段过滤条(如 software、staff、hardware)
15
- * - `"inline"`:Form layout=inline 单行,适用于少量字段(如 network、ssc)
16
- * - `"inline-right"`:右对齐 flex,无搜索/重置按钮,字段变化自动触发(如 soc、tsec)
17
- */
18
- layout?: FilterLayout;
19
-
20
- /**
21
- * grid 列数,仅在 `layout="card-grid"` 时有效。默认 4。
22
- */
23
- columns?: number;
24
-
25
- // ── 表单 ──────────────────────────────────────────────────────────────────
26
- /** 透传给 antd Form 的 props(initialValues、onValuesChange 等),layout 和 form 由组件内部管理 */
27
- formProps?: Omit<FormProps, 'form' | 'layout' | 'onFinish' | 'style'>;
28
-
29
- /** 外部传入 form 实例(需要在父组件访问 form.resetFields() 等方法时使用) */
30
- form?: FormInstance;
31
-
32
- /** 点击"查询"或 Form onFinish 时的回调 */
33
- onSearch: (values: any) => void;
34
-
35
- /**
36
- * 点击"重置"时的回调。
37
- * 若不传,重置只执行 form.resetFields(),不会触发 onSearch。
38
- * 若传入,重置后会以初始值重新调用 onSearch。
39
- */
40
- onReset?: (form: FormInstance) => void;
41
-
42
- // ── 按钮 ──────────────────────────────────────────────────────────────────
43
- /**
44
- * 是否显示搜索/重置按钮。
45
- * `layout="inline-right"` 时默认 false,其余默认 true。
46
- */
47
- showActions?: boolean;
48
-
49
- /** 查询按钮文字,默认读 i18n `common.query` */
50
- searchText?: string;
51
-
52
- /** 重置按钮文字,默认读 i18n `common.reset` */
53
- resetText?: string;
54
-
55
- // ── 样式 ──────────────────────────────────────────────────────────────────
56
- className?: string;
57
- style?: React.CSSProperties;
58
-
59
- // ── 测试 / AI 定位 ────────────────────────────────────────────────────────
60
- testId: string;
61
-
62
- // ── 子字段 ────────────────────────────────────────────────────────────────
63
- children?: React.ReactNode;
64
- }
65
-
66
- // ─── 组件 ─────────────────────────────────────────────────────────────────────
67
-
68
- export const Filter: React.FC<FilterProps> = ({
69
- layout = 'card-grid',
70
- columns = 4,
71
- formProps,
72
- form: externalForm,
73
- onSearch,
74
- onReset,
75
- showActions,
76
- searchText,
77
- resetText,
78
- className,
79
- style,
80
- testId,
81
- children,
82
- }) => {
83
- const { t } = useTranslation();
84
- const [internalForm] = Form.useForm();
85
- const form = externalForm ?? internalForm;
86
-
87
- // inline-right 默认不显示按钮
88
- const shouldShowActions = showActions ?? layout !== 'inline-right';
89
-
90
- const handleFinish = (values: any) => {
91
- onSearch(values);
92
- };
93
-
94
- const handleReset = () => {
95
- if (onReset) {
96
- onReset(form);
97
- } else {
98
- form.resetFields();
99
- }
100
- };
101
-
102
- // ── 搜索/重置按钮 ────────────────────────────────────────────────────────
103
- const actionsNode = shouldShowActions && (
104
- <Form.Item shouldUpdate style={{ marginBottom: 0 }}>
105
- {() => (
106
- <>
107
- <Button style={{ marginRight: 8 }} type="primary" htmlType="submit">
108
- {searchText ?? t('common.query')}
109
- </Button>
110
- <Button type="default" onClick={handleReset}>
111
- {resetText ?? t('common.reset')}
112
- </Button>
113
- </>
114
- )}
115
- </Form.Item>
116
- );
117
-
118
- // ── card-grid 布局 ────────────────────────────────────────────────────────
119
- if (layout === 'card-grid') {
120
- return (
121
- <Form
122
- form={form}
123
- layout="inline"
124
- onFinish={handleFinish}
125
- style={{ width: '100%', ...style }}
126
- {...formProps}
127
- data-testid={testId}
128
- className={className}
129
- >
130
- <Card style={{ width: '100%' }}>
131
- <div
132
- style={{
133
- display: 'grid',
134
- gridTemplateColumns: `repeat(${columns}, 1fr)`,
135
- width: '100%',
136
- gap: '10px 0',
137
- }}
138
- >
139
- {children}
140
- {actionsNode}
141
- </div>
142
- </Card>
143
- </Form>
144
- );
145
- }
146
-
147
- // ── inline-right 布局 ─────────────────────────────────────────────────────
148
- if (layout === 'inline-right') {
149
- return (
150
- <div
151
- style={{
152
- width: '100%',
153
- display: 'flex',
154
- justifyContent: 'flex-end',
155
- ...style,
156
- }}
157
- data-testid={testId}
158
- className={className}
159
- >
160
- <Form
161
- form={form}
162
- onFinish={handleFinish}
163
- style={{ marginBottom: 0 }}
164
- {...formProps}
165
- >
166
- <div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
167
- {children}
168
- {actionsNode}
169
- </div>
170
- </Form>
171
- </div>
172
- );
173
- }
174
-
175
- // ── inline 布局(默认 fallback)────────────────────────────────────────────
176
- return (
177
- <Form
178
- form={form}
179
- layout="inline"
180
- onFinish={handleFinish}
181
- style={{ width: '100%', ...style }}
182
- data-testid={testId}
183
- className={className}
184
- {...formProps}
185
- >
186
- {children}
187
- {actionsNode}
188
- </Form>
189
- );
190
- };
191
-
192
- export default Filter;