dishui 0.0.65 → 0.0.67

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 (507) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +10 -11
  2. package/dist/chart.js +12 -46
  3. package/dist/code-editor.js +16 -43
  4. package/dist/components/Accordion/index.d.ts +39 -0
  5. package/dist/components/Accordion/index.js +70 -0
  6. package/dist/components/Accordion/index.js.map +1 -0
  7. package/dist/components/Avatar/index.d.ts +48 -0
  8. package/dist/components/Avatar/index.js +71 -0
  9. package/dist/components/Avatar/index.js.map +1 -0
  10. package/dist/components/Badge/index.js +10 -15
  11. package/dist/components/Badge/index.js.map +1 -1
  12. package/dist/components/Button/index.js +62 -89
  13. package/dist/components/Button/index.js.map +1 -1
  14. package/dist/components/Card/index.d.ts +142 -0
  15. package/dist/components/Card/index.js +368 -69
  16. package/dist/components/Card/index.js.map +1 -1
  17. package/dist/components/Chart/Chart.js +25 -25
  18. package/dist/components/Chart/Chart.js.map +1 -1
  19. package/dist/components/Checkbox/index.js +57 -65
  20. package/dist/components/Checkbox/index.js.map +1 -1
  21. package/dist/components/ChoicePicker/index.d.ts +44 -0
  22. package/dist/components/ChoicePicker/index.js +81 -0
  23. package/dist/components/ChoicePicker/index.js.map +1 -0
  24. package/dist/components/Column/index.d.ts +28 -0
  25. package/dist/components/Column/index.js +30 -0
  26. package/dist/components/Column/index.js.map +1 -0
  27. package/dist/components/DateTimeInput/index.d.ts +44 -0
  28. package/dist/components/DateTimeInput/index.js +48 -0
  29. package/dist/components/DateTimeInput/index.js.map +1 -0
  30. package/dist/components/Demo/index.js +107 -107
  31. package/dist/components/Demo/index.js.map +1 -1
  32. package/dist/components/Divider/index.d.ts +20 -0
  33. package/dist/components/Divider/index.js +30 -0
  34. package/dist/components/Divider/index.js.map +1 -0
  35. package/dist/components/EmptyState/index.js +24 -24
  36. package/dist/components/EmptyState/index.js.map +1 -1
  37. package/dist/components/FileUploader/DropZone.js +134 -136
  38. package/dist/components/FileUploader/DropZone.js.map +1 -1
  39. package/dist/components/FileUploader/FileItem.js +159 -163
  40. package/dist/components/FileUploader/FileItem.js.map +1 -1
  41. package/dist/components/FileUploader/FileUploader.js +126 -127
  42. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  43. package/dist/components/FileUploader/UploadQueue.js +62 -62
  44. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  45. package/dist/components/FloatWindow/index.d.ts +28 -0
  46. package/dist/components/GridLayout/index.d.ts +42 -0
  47. package/dist/components/Icon/index.d.ts +26 -0
  48. package/dist/components/Icon/index.js +27 -0
  49. package/dist/components/Icon/index.js.map +1 -0
  50. package/dist/components/Image/index.d.ts +33 -0
  51. package/dist/components/Image/index.js +44 -0
  52. package/dist/components/Image/index.js.map +1 -0
  53. package/dist/components/Input/index.js +196 -197
  54. package/dist/components/Input/index.js.map +1 -1
  55. package/dist/components/Label/index.js +62 -74
  56. package/dist/components/Label/index.js.map +1 -1
  57. package/dist/components/Layout/index.js +134 -139
  58. package/dist/components/Layout/index.js.map +1 -1
  59. package/dist/components/List/index.js +45 -58
  60. package/dist/components/List/index.js.map +1 -1
  61. package/dist/components/Markdown/Markdown.js +106 -107
  62. package/dist/components/Markdown/Markdown.js.map +1 -1
  63. package/dist/components/Markdown/codeThemes.js +24 -33
  64. package/dist/components/Markdown/codeThemes.js.map +1 -1
  65. package/dist/components/Markdown/markdownComponents.js +203 -208
  66. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  67. package/dist/components/Markdown/parseCodeBlockMeta.js +22 -22
  68. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  69. package/dist/components/Markdown/useMarkdownSource.js +46 -46
  70. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  71. package/dist/components/Markdown/useMarkmapRenderer.js +35 -36
  72. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  73. package/dist/components/Markdown/useMermaidRenderer.js +41 -42
  74. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  75. package/dist/components/Modal/index.js +82 -82
  76. package/dist/components/Modal/index.js.map +1 -1
  77. package/dist/components/MultipleChoice/index.d.ts +44 -0
  78. package/dist/components/MultipleChoice/index.js +52 -0
  79. package/dist/components/MultipleChoice/index.js.map +1 -0
  80. package/dist/components/Notification/index.d.ts +17 -0
  81. package/dist/components/Page/index.d.ts +1 -1
  82. package/dist/components/Page/index.js +40 -71
  83. package/dist/components/Page/index.js.map +1 -1
  84. package/dist/components/PageHeader/index.js +28 -28
  85. package/dist/components/PageHeader/index.js.map +1 -1
  86. package/dist/components/ProtectedRoute/index.js +8 -9
  87. package/dist/components/ProtectedRoute/index.js.map +1 -1
  88. package/dist/components/Row/index.d.ts +28 -0
  89. package/dist/components/Row/index.js +30 -0
  90. package/dist/components/Row/index.js.map +1 -0
  91. package/dist/components/Select/index.js +251 -254
  92. package/dist/components/Select/index.js.map +1 -1
  93. package/dist/components/SidebarToggleButton/index.js +56 -59
  94. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  95. package/dist/components/Slider/index.d.ts +39 -0
  96. package/dist/components/Slider/index.js +52 -0
  97. package/dist/components/Slider/index.js.map +1 -0
  98. package/dist/components/Switch/index.d.ts +34 -0
  99. package/dist/components/Switch/index.js +55 -0
  100. package/dist/components/Switch/index.js.map +1 -0
  101. package/dist/components/Tab/index.d.ts +40 -0
  102. package/dist/components/Table/index.js +109 -121
  103. package/dist/components/Table/index.js.map +1 -1
  104. package/dist/components/Tabs/index.js +28 -38
  105. package/dist/components/Tabs/index.js.map +1 -1
  106. package/dist/components/Text/index.d.ts +43 -0
  107. package/dist/components/Text/index.js +55 -0
  108. package/dist/components/Text/index.js.map +1 -0
  109. package/dist/components/Tooltip/index.d.ts +23 -0
  110. package/dist/components/Tooltip/index.js +34 -0
  111. package/dist/components/Tooltip/index.js.map +1 -0
  112. package/dist/components/Tree/Tree.js +205 -205
  113. package/dist/components/Tree/Tree.js.map +1 -1
  114. package/dist/components/pro/ArticleContextMenu/index.js +86 -87
  115. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  116. package/dist/components/pro/ArticleControl/ArticleControl2.js +250 -250
  117. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  118. package/dist/components/pro/ArticleControl/buildHeadingTree.js +31 -32
  119. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  120. package/dist/components/pro/ArticleControl/useArticleToc.js +100 -102
  121. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  122. package/dist/components/pro/Calendar/Calendar.d.ts +10 -0
  123. package/dist/components/pro/Calendar/hooks/useCalendarDrag.d.ts +47 -0
  124. package/dist/components/pro/Calendar/hooks/useCalendarState.d.ts +56 -0
  125. package/dist/components/pro/Calendar/index.d.ts +7 -0
  126. package/dist/components/pro/Calendar/types.d.ts +151 -0
  127. package/dist/components/pro/Calendar/utils.d.ts +94 -0
  128. package/dist/components/pro/Chat/Chat.d.ts +6 -0
  129. package/dist/components/pro/Chat/index.d.ts +2 -0
  130. package/dist/components/pro/Chat/types.d.ts +84 -0
  131. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +287 -327
  132. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  133. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -224
  134. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  135. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js +594 -613
  136. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  137. package/dist/components/pro/CodeEditor/extensions/contextMenu.js +54 -55
  138. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  139. package/dist/components/pro/CodeEditor/extensions/index.js +152 -160
  140. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  141. package/dist/components/pro/CodeEditor/langs/index.js +7 -15
  142. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  143. package/dist/components/pro/CodeEditor/langs/javascript.js +11 -48
  144. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  145. package/dist/components/pro/CodeEditor/langs/python.js +4 -40
  146. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  147. package/dist/components/pro/CodeEditor/langs/snippets.js +118 -147
  148. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  149. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js +153 -153
  150. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  151. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +180 -190
  152. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  153. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js +130 -137
  154. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  155. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js +228 -242
  156. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  157. package/dist/components/pro/CodeEditor/panels/VariablePanel.js +208 -248
  158. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  159. package/dist/components/pro/CodeEditor/themes.js +513 -483
  160. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  161. package/dist/components/pro/CodeEditor/types.d.ts +1 -1
  162. package/dist/components/pro/CodeEditor/utils.js +171 -175
  163. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  164. package/dist/components/pro/DataTable/DataTable.js +305 -306
  165. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  166. package/dist/components/pro/DataTable/Filters.js +299 -314
  167. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  168. package/dist/components/pro/DataTable/PivotPanel.js +203 -204
  169. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  170. package/dist/components/pro/DataTable/PivotView.js +142 -144
  171. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  172. package/dist/components/pro/DataTable/components/BulkActions.js +42 -42
  173. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  174. package/dist/components/pro/DataTable/components/ColumnSelector.js +84 -84
  175. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  176. package/dist/components/pro/DataTable/components/FilterBar.js +58 -58
  177. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  178. package/dist/components/pro/DataTable/components/TableBody.js +93 -94
  179. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  180. package/dist/components/pro/DataTable/components/TableHeader.js +78 -78
  181. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  182. package/dist/components/pro/DataTable/components/TablePagination.js +77 -77
  183. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  184. package/dist/components/pro/DataTable/components/TableToolbar.js +40 -40
  185. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  186. package/dist/components/pro/DataTable/extension.js +5 -5
  187. package/dist/components/pro/DataTable/extension.js.map +1 -1
  188. package/dist/components/pro/DataTable/pivotEngine.js +84 -92
  189. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  190. package/dist/components/pro/DataTable/pivotExtension.js +93 -93
  191. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  192. package/dist/components/pro/DataTable/rowDetailExtension.js +30 -30
  193. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  194. package/dist/components/pro/DataTable/tanstack-table.js +45 -62
  195. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  196. package/dist/components/pro/DataTable/treeDataUtils.js +37 -48
  197. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  198. package/dist/components/pro/DataTable/useColumnDragReorder.js +68 -68
  199. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  200. package/dist/components/pro/DataTable/utils.js +156 -168
  201. package/dist/components/pro/DataTable/utils.js.map +1 -1
  202. package/dist/components/pro/FileExplorer/Breadcrumb.js +180 -180
  203. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  204. package/dist/components/pro/FileExplorer/CreateDialog.js +78 -78
  205. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  206. package/dist/components/pro/FileExplorer/FileExplorer.js +202 -205
  207. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  208. package/dist/components/pro/FileExplorer/FileIcon.js +189 -189
  209. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  210. package/dist/components/pro/FileExplorer/GridView.js +100 -100
  211. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  212. package/dist/components/pro/FileExplorer/ListView.js +209 -209
  213. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  214. package/dist/components/pro/FileExplorer/Toolbar.js +199 -199
  215. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  216. package/dist/components/pro/Flow/Flow.js +920 -948
  217. package/dist/components/pro/Flow/Flow.js.map +1 -1
  218. package/dist/components/pro/Flow/FlowCanvas.js +1626 -1662
  219. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  220. package/dist/components/pro/Flow/archify/build.js +85 -94
  221. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  222. package/dist/components/pro/Flow/archify/convert.js +512 -519
  223. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  224. package/dist/components/pro/Flow/archify/palette.js +87 -104
  225. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  226. package/dist/components/pro/Flow/archify/presets.js +34 -37
  227. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  228. package/dist/components/pro/Flow/archify/spec.js +7 -7
  229. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  230. package/dist/components/pro/Flow/canvas/AlignmentGuides.js +25 -25
  231. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  232. package/dist/components/pro/Flow/canvas/GridRenderer.js +54 -55
  233. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  234. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +54 -58
  235. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  236. package/dist/components/pro/Flow/canvas/PixiApp.js +105 -102
  237. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  238. package/dist/components/pro/Flow/canvas/SelectionOverlay.js +38 -38
  239. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  240. package/dist/components/pro/Flow/canvas/ViewportContainer.js +117 -117
  241. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  242. package/dist/components/pro/Flow/constants.js +266 -278
  243. package/dist/components/pro/Flow/constants.js.map +1 -1
  244. package/dist/components/pro/Flow/context/FlowAIContext.js +27 -28
  245. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  246. package/dist/components/pro/Flow/context/FlowContext.js +60 -61
  247. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  248. package/dist/components/pro/Flow/context/FlowUIContext.js +115 -117
  249. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  250. package/dist/components/pro/Flow/edges/EdgeRenderer.js +135 -138
  251. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  252. package/dist/components/pro/Flow/edges/edgeMarkers.js +11 -14
  253. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  254. package/dist/components/pro/Flow/edges/edgePaths.js +351 -367
  255. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  256. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js +49 -52
  257. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  258. package/dist/components/pro/Flow/hooks/useClipboard.js +154 -154
  259. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  260. package/dist/components/pro/Flow/hooks/useCompactMode.js +17 -17
  261. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  262. package/dist/components/pro/Flow/hooks/useDeleteSelection.js +40 -40
  263. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  264. package/dist/components/pro/Flow/hooks/useDraggablePanel.js +51 -51
  265. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  266. package/dist/components/pro/Flow/hooks/useEdgeMutations.js +157 -157
  267. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  268. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +190 -201
  269. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  270. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js +32 -38
  271. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  272. package/dist/components/pro/Flow/hooks/useLayoutActions.js +172 -180
  273. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  274. package/dist/components/pro/Flow/hooks/useLineMutations.js +57 -57
  275. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  276. package/dist/components/pro/Flow/hooks/useMindMap.js +229 -238
  277. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  278. package/dist/components/pro/Flow/hooks/useNodeMutations.js +102 -102
  279. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  280. package/dist/components/pro/Flow/hooks/usePdfExport.js +55 -56
  281. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  282. package/dist/components/pro/Flow/hooks/usePixiApp.js +55 -57
  283. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  284. package/dist/components/pro/Flow/hooks/useResizablePanel.js +31 -31
  285. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  286. package/dist/components/pro/Flow/hooks/useSelection.js +69 -69
  287. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  288. package/dist/components/pro/Flow/hooks/useUndoRedo.js +27 -27
  289. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  290. package/dist/components/pro/Flow/hooks/useViewport.js +28 -28
  291. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  292. package/dist/components/pro/Flow/lines/FreehandTool.js +63 -63
  293. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  294. package/dist/components/pro/Flow/lines/GeometricLineTool.js +80 -80
  295. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  296. package/dist/components/pro/Flow/lines/LineRenderer.js +88 -88
  297. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  298. package/dist/components/pro/Flow/lines/lineSmoothing.js +32 -34
  299. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  300. package/dist/components/pro/Flow/nodes/DataNodeView.js +236 -242
  301. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  302. package/dist/components/pro/Flow/nodes/MediaContent.js +236 -246
  303. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  304. package/dist/components/pro/Flow/nodes/MediaOverlay.js +63 -63
  305. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  306. package/dist/components/pro/Flow/nodes/Model3DView.js +111 -113
  307. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  308. package/dist/components/pro/Flow/nodes/NodeHandles.js +74 -80
  309. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  310. package/dist/components/pro/Flow/nodes/NodeRenderer.js +303 -314
  311. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  312. package/dist/components/pro/Flow/nodes/NodeText.js +25 -29
  313. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  314. package/dist/components/pro/Flow/nodes/aiClient.js +124 -137
  315. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  316. package/dist/components/pro/Flow/nodes/animAnchors.js +42 -49
  317. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  318. package/dist/components/pro/Flow/nodes/dataUtils.js +246 -267
  319. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  320. package/dist/components/pro/Flow/nodes/nodeUtils.js +23 -28
  321. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  322. package/dist/components/pro/Flow/nodes/shapes.js +556 -589
  323. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  324. package/dist/components/pro/Flow/nodes/svgIconTexture.js +37 -39
  325. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  326. package/dist/components/pro/Flow/nodes/svgIcons.js +684 -689
  327. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  328. package/dist/components/pro/Flow/panels/AIPanel.js +464 -491
  329. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  330. package/dist/components/pro/Flow/panels/Breadcrumb.js +41 -41
  331. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  332. package/dist/components/pro/Flow/panels/ContextMenu.js +37 -37
  333. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  334. package/dist/components/pro/Flow/panels/DataInspectorSection.js +428 -432
  335. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  336. package/dist/components/pro/Flow/panels/ExpandableTextarea.js +61 -62
  337. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  338. package/dist/components/pro/Flow/panels/FlowPanelGroup.js +114 -114
  339. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  340. package/dist/components/pro/Flow/panels/FlowToolbar.js +347 -391
  341. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  342. package/dist/components/pro/Flow/panels/InspectorPanel.js +1792 -1798
  343. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  344. package/dist/components/pro/Flow/panels/OutlinePanel.js +242 -248
  345. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  346. package/dist/components/pro/Flow/panels/PresentationMode.js +137 -140
  347. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  348. package/dist/components/pro/Flow/panels/ProjectTitle.js +46 -46
  349. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  350. package/dist/components/pro/Flow/panels/ShapePalette.js +557 -572
  351. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  352. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +0 -1
  353. package/dist/components/pro/Flow/panels/toolbarIcons.js +508 -557
  354. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  355. package/dist/components/pro/Flow/types.js +26 -26
  356. package/dist/components/pro/Flow/types.js.map +1 -1
  357. package/dist/components/pro/Flow/utils/dashedLine.js +113 -117
  358. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  359. package/dist/components/pro/Flow/utils/gradient.js +55 -55
  360. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  361. package/dist/components/pro/Flow/utils/pdfExport.js +50 -89
  362. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  363. package/dist/components/pro/Flow/utils/themeColor.js +185 -195
  364. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  365. package/dist/components/pro/Gantt/Gantt.d.ts +7 -0
  366. package/dist/components/pro/Gantt/hooks/useGanttDrag.d.ts +31 -0
  367. package/dist/components/pro/Gantt/hooks/useGanttState.d.ts +58 -0
  368. package/dist/components/pro/Gantt/index.d.ts +6 -0
  369. package/dist/components/pro/Gantt/types.d.ts +478 -0
  370. package/dist/components/pro/Gantt/utils.d.ts +124 -0
  371. package/dist/components/pro/Resizable/Resizable.d.ts +30 -0
  372. package/dist/components/pro/Resizable/index.d.ts +2 -0
  373. package/dist/components/pro/RichTextEditor/AIRewrite.js +323 -334
  374. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  375. package/dist/components/pro/RichTextEditor/BlockHandle.js +314 -316
  376. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  377. package/dist/components/pro/RichTextEditor/BubbleToolbar.js +97 -97
  378. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  379. package/dist/components/pro/RichTextEditor/CommentDialog.js +88 -88
  380. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  381. package/dist/components/pro/RichTextEditor/CommentPanel.js +240 -240
  382. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  383. package/dist/components/pro/RichTextEditor/CommentPopover.js +234 -234
  384. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  385. package/dist/components/pro/RichTextEditor/ContextMenu.js +251 -252
  386. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  387. package/dist/components/pro/RichTextEditor/RichTextEditor.js +267 -271
  388. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  389. package/dist/components/pro/RichTextEditor/SlashMenu.js +214 -214
  390. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  391. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -75
  392. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  393. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +261 -261
  394. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  395. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +172 -526
  396. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  397. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js +112 -114
  398. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  399. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +194 -194
  400. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  401. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +970 -973
  402. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  403. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +11 -12
  404. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  405. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +310 -344
  406. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  407. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +38 -39
  408. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  409. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +620 -625
  410. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  411. package/dist/components/pro/RichTextEditor/extensions/FontSize.js +25 -25
  412. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  413. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +167 -176
  414. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  415. package/dist/components/pro/RichTextEditor/types.js +75 -75
  416. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  417. package/dist/contexts/AppContext.d.ts +1 -1
  418. package/dist/contexts/AppContext.js +216 -221
  419. package/dist/contexts/AppContext.js.map +1 -1
  420. package/dist/data-table.js +15 -41
  421. package/dist/data-table.js.map +1 -1
  422. package/dist/dishui.css +1 -1
  423. package/dist/flow.js +27 -83
  424. package/dist/hooks/useClickOutside.js +18 -18
  425. package/dist/hooks/useClickOutside.js.map +1 -1
  426. package/dist/hooks/useContainerElement.js +9 -9
  427. package/dist/hooks/useContainerElement.js.map +1 -1
  428. package/dist/hooks/useControllableState.js +33 -35
  429. package/dist/hooks/useControllableState.js.map +1 -1
  430. package/dist/hooks/useCopyToClipboard.js +16 -16
  431. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  432. package/dist/hooks/useDebounce.js +14 -14
  433. package/dist/hooks/useDebounce.js.map +1 -1
  434. package/dist/hooks/useDraggable.js +50 -50
  435. package/dist/hooks/useDraggable.js.map +1 -1
  436. package/dist/hooks/useTableColumns.js +39 -41
  437. package/dist/hooks/useTableColumns.js.map +1 -1
  438. package/dist/hooks/useTableData.js +67 -68
  439. package/dist/hooks/useTableData.js.map +1 -1
  440. package/dist/index-nostyled.d.ts +8 -0
  441. package/dist/index.d.ts +31 -3
  442. package/dist/index.js +106 -241
  443. package/dist/layouts/MainLayout.js +56 -56
  444. package/dist/layouts/MainLayout.js.map +1 -1
  445. package/dist/layouts/Navbar.js +214 -214
  446. package/dist/layouts/Navbar.js.map +1 -1
  447. package/dist/layouts/Sidebar.js +184 -186
  448. package/dist/layouts/Sidebar.js.map +1 -1
  449. package/dist/layouts/headbar/Headbar.js +25 -25
  450. package/dist/layouts/headbar/Headbar.js.map +1 -1
  451. package/dist/layouts/headbar/HeadbarLangSwitcher.js +39 -39
  452. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  453. package/dist/layouts/headbar/HeadbarSearch.js +120 -120
  454. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  455. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +27 -27
  456. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  457. package/dist/layouts/headbar/HeadbarTitle.js +26 -26
  458. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  459. package/dist/lite.js +9 -24
  460. package/dist/markdown.js +4 -9
  461. package/dist/pages/components/Calendar/index.d.ts +3 -0
  462. package/dist/pages/components/Calendar/index.en.d.ts +3 -0
  463. package/dist/pages/components/Calendar/index.zh.d.ts +3 -0
  464. package/dist/pages/components/Chat/index.d.ts +3 -0
  465. package/dist/pages/components/Chat/index.en.d.ts +3 -0
  466. package/dist/pages/components/Chat/index.zh.d.ts +3 -0
  467. package/dist/pages/components/FloatWindow/index.d.ts +3 -0
  468. package/dist/pages/components/FloatWindow/index.en.d.ts +3 -0
  469. package/dist/pages/components/FloatWindow/index.zh.d.ts +3 -0
  470. package/dist/pages/components/Gantt/index.d.ts +3 -0
  471. package/dist/pages/components/Gantt/index.en.d.ts +3 -0
  472. package/dist/pages/components/Gantt/index.zh.d.ts +3 -0
  473. package/dist/pages/components/GridLayout/index.d.ts +3 -0
  474. package/dist/pages/components/GridLayout/index.en.d.ts +3 -0
  475. package/dist/pages/components/GridLayout/index.zh.d.ts +3 -0
  476. package/dist/pages/components/Notification/index.d.ts +3 -0
  477. package/dist/pages/components/Notification/index.en.d.ts +3 -0
  478. package/dist/pages/components/Notification/index.zh.d.ts +3 -0
  479. package/dist/pages/components/Resizable/index.d.ts +3 -0
  480. package/dist/pages/components/Resizable/index.en.d.ts +3 -0
  481. package/dist/pages/components/Resizable/index.zh.d.ts +3 -0
  482. package/dist/pages/components/Tab/index.d.ts +3 -0
  483. package/dist/pages/components/Tab/index.en.d.ts +3 -0
  484. package/dist/pages/components/Tab/index.zh.d.ts +3 -0
  485. package/dist/styles/themeStyles.js +87 -86
  486. package/dist/styles/themeStyles.js.map +1 -1
  487. package/dist/utils/cn.d.ts +13 -0
  488. package/dist/utils/cn.js +16 -0
  489. package/dist/utils/cn.js.map +1 -0
  490. package/dist/utils/i18n.js +700 -602
  491. package/dist/utils/i18n.js.map +1 -1
  492. package/dist/utils/menu.js +94 -94
  493. package/dist/utils/menu.js.map +1 -1
  494. package/dist/utils/rehype-code-meta.js +14 -14
  495. package/dist/utils/rehype-code-meta.js.map +1 -1
  496. package/dist/utils/remark-code-meta.js +9 -9
  497. package/dist/utils/remark-code-meta.js.map +1 -1
  498. package/dist/utils/routerBuilder.js +59 -60
  499. package/dist/utils/routerBuilder.js.map +1 -1
  500. package/dist/utils/selection.js +28 -29
  501. package/dist/utils/selection.js.map +1 -1
  502. package/dist/utils/themes.js +275 -255
  503. package/dist/utils/themes.js.map +1 -1
  504. package/package.json +19 -6
  505. package/dist/components/StatCard/index.d.ts +0 -24
  506. package/dist/components/StatCard/index.js +0 -90
  507. package/dist/components/StatCard/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PivotPanel.js","names":[],"sources":["../../../../src/components/pro/DataTable/PivotPanel.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport type { PivotValue, PivotFieldLabels } from './PivotView';\nimport type { PivotAggFn } from './pivotEngine';\nimport type { PivotField } from './pivotExtension';\n\nconst AGG_FNS: PivotAggFn[] = ['sum', 'avg', 'count', 'min', 'max'];\n\n/** 面板内的区域标识。 */\ntype ZoneId = 'available' | 'rows' | 'cols' | 'values';\n\nconst TEXT = {\n zh: {\n available: '可用字段',\n rowGroups: '行分组',\n colGroups: '列分组',\n values: '数值',\n empty: '(无字段)',\n dropHint: '拖拽字段到此',\n remove: '移除',\n },\n en: {\n available: 'Available',\n rowGroups: 'Row Groups',\n colGroups: 'Column Labels',\n values: 'Values',\n empty: '(no fields)',\n dropHint: 'Drag fields here',\n remove: 'Remove',\n },\n} as const;\n\n/** 透明的 1x1 拖拽图,用于隐藏浏览器默认的拖拽影像(改用自定义 ghost)。 */\nconst EMPTY_DRAG_IMAGE =\n typeof Image !== 'undefined'\n ? (() => {\n const img = new Image();\n img.src =\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n return img;\n })()\n : null;\n\nexport interface PivotPanelProps {\n /** 面板排布方向:水平(工具栏下方)或垂直(表格左/右侧)。 */\n orientation: 'horizontal' | 'vertical';\n lang: 'zh' | 'en';\n fieldLabels: PivotFieldLabels;\n dimensionFields: PivotField[];\n numericFields: PivotField[];\n rowFields: string[];\n colFields: string[];\n values: PivotValue[];\n setRowFields: React.Dispatch<React.SetStateAction<string[]>>;\n setColFields: React.Dispatch<React.SetStateAction<string[]>>;\n setValues: React.Dispatch<React.SetStateAction<PivotValue[]>>;\n /**\n * 垂直(左/右)面板的宽度。数字视为 px,字符串直接作为 CSS 宽度\n * (如 `'20%'` / `'16rem'`)。仅在 `orientation='vertical'` 时生效,默认 224px。\n */\n panelWidth?: number | string;\n}\n\n/**\n * 当前拖拽的字段信息(低频变化:仅在拖拽开始 / 结束时更新,\n * 不含坐标,避免拖拽过程中高频 setState 导致 chip 重挂载而使拖拽卡死)。\n */\ninterface DragInfo {\n field: string;\n label: string;\n numeric: boolean;\n}\n\n/**\n * ag-grid 风格的透视配置面板。\n *\n * 特性:\n * - 支持水平(`horizontal`)与垂直(`vertical`)两种排布,后者用于表格左/右侧。\n * - 拖拽字段时显示跟随光标的「拖拽引用」(ghost 预览),并高亮可放置的目标区域。\n *\n * 关键实现:拖拽期间**不** setState 更新坐标,而是用 ref 直接改写 ghost 的\n * transform;`Chip`/`Zone` 用渲染函数而非内联组件,避免每次渲染都被 React\n * 当作新组件类型而卸载重挂载(那会中断浏览器原生拖拽,导致卡死)。\n */\nexport function PivotPanel({\n orientation,\n lang,\n fieldLabels,\n dimensionFields,\n numericFields,\n rowFields,\n colFields,\n values,\n setRowFields,\n setColFields,\n setValues,\n panelWidth = 224,\n}: PivotPanelProps) {\n const t = TEXT[lang];\n const labelOf = (field: string) => fieldLabels[field] ?? field;\n const isNumericField = (field: string) =>\n numericFields.some((f) => f.field === field);\n\n const [drag, setDrag] = useState<DragInfo | null>(null);\n const [overZone, setOverZone] = useState<ZoneId | null>(null);\n const ghostRef = useRef<HTMLDivElement | null>(null);\n const pointerRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const dragging = drag != null;\n\n // 拖拽期间用 window 级 `dragover` 直接更新 ghost 位置(ref 操作 DOM,不触发\n // React 重渲染),坐标不进入 state,从根本上避免 chip 子树重挂载而卡死。\n // 同时用 window 级 `dragend`/`drop` 兜底清除拖拽状态:放置后源 chip 常因状态\n // 更新被移动/重建,其自身的 `onDragEnd` 可能不再触发,导致 ghost 残留。\n useEffect(() => {\n if (!dragging) return;\n const positionGhost = () => {\n const el = ghostRef.current;\n if (!el) return;\n el.style.transform = `translate(${pointerRef.current.x + 12}px, ${\n pointerRef.current.y + 12\n }px)`;\n };\n positionGhost();\n const onWindowDragOver = (e: DragEvent) => {\n if (e.clientX === 0 && e.clientY === 0) return;\n pointerRef.current = { x: e.clientX, y: e.clientY };\n positionGhost();\n };\n const clear = () => {\n setDrag(null);\n setOverZone(null);\n };\n window.addEventListener('dragover', onWindowDragOver);\n window.addEventListener('dragend', clear);\n window.addEventListener('drop', clear);\n return () => {\n window.removeEventListener('dragover', onWindowDragOver);\n window.removeEventListener('dragend', clear);\n window.removeEventListener('drop', clear);\n };\n }, [dragging]);\n\n const usedDims = new Set<string>([...rowFields, ...colFields]);\n const availableDims = dimensionFields.filter((f) => !usedDims.has(f.field));\n const usedValues = new Set(values.map((v) => v.field));\n const availableValues = numericFields.filter((f) => !usedValues.has(f.field));\n\n const removeFromAll = (field: string) => {\n setRowFields((prev) => prev.filter((x) => x !== field));\n setColFields((prev) => prev.filter((x) => x !== field));\n setValues((prev) => prev.filter((x) => x.field !== field));\n };\n\n /** 某个区域是否能接收当前正在拖拽的字段。 */\n const zoneAccepts = (zone: ZoneId): boolean => {\n if (!drag) return false;\n if (zone === 'available') return true;\n if (zone === 'values') return drag.numeric;\n return !drag.numeric; // rows / cols 只接受维度字段\n };\n\n const dropTo = (zone: ZoneId, field: string) => {\n const numeric = isNumericField(field);\n if (zone === 'values') {\n if (!numeric) return;\n setRowFields((prev) => prev.filter((x) => x !== field));\n setColFields((prev) => prev.filter((x) => x !== field));\n setValues((prev) =>\n prev.some((v) => v.field === field)\n ? prev\n : [...prev, { field, aggFn: 'sum' }],\n );\n return;\n }\n if (zone === 'rows' || zone === 'cols') {\n if (numeric) return;\n setValues((prev) => prev.filter((x) => x.field !== field));\n if (zone === 'rows') {\n setColFields((prev) => prev.filter((x) => x !== field));\n setRowFields((prev) =>\n prev.includes(field) ? prev : [...prev, field],\n );\n } else {\n setRowFields((prev) => prev.filter((x) => x !== field));\n setColFields((prev) =>\n prev.includes(field) ? prev : [...prev, field],\n );\n }\n return;\n }\n removeFromAll(field);\n };\n\n const onChipDragStart = (e: React.DragEvent, field: string) => {\n e.dataTransfer.setData('text/plain', field);\n e.dataTransfer.effectAllowed = 'move';\n if (EMPTY_DRAG_IMAGE) {\n e.dataTransfer.setDragImage(EMPTY_DRAG_IMAGE, 0, 0);\n }\n pointerRef.current = { x: e.clientX, y: e.clientY };\n setDrag({\n field,\n label: labelOf(field),\n numeric: isNumericField(field),\n });\n };\n\n const onChipDragEnd = () => {\n setDrag(null);\n setOverZone(null);\n };\n\n const vertical = orientation === 'vertical';\n\n // 渲染一个可拖拽的字段 chip(用渲染函数而非组件,避免重挂载)。\n const renderChip = (\n field: string,\n opts?: { onRemove?: () => void; prefix?: React.ReactNode },\n ) => (\n <span\n key={field}\n draggable\n onDragStart={(e) => onChipDragStart(e, field)}\n onDragEnd={onChipDragEnd}\n className={`badge badge-outline gap-1 items-center cursor-grab active:cursor-grabbing select-none ${\n drag?.field === field ? 'opacity-40' : ''\n }`}\n >\n {opts?.prefix}\n {labelOf(field)}\n {opts?.onRemove && (\n <button\n type=\"button\"\n className=\"text-xs opacity-60 hover:opacity-100\"\n onClick={opts.onRemove}\n aria-label={t.remove}\n >\n ✕\n </button>\n )}\n </span>\n );\n\n // 渲染一个拖放区段(渲染函数,非组件)。\n const renderZone = (\n zone: ZoneId,\n icon: string,\n title: string,\n children: React.ReactNode,\n ) => {\n const accepts = zoneAccepts(zone);\n const isOver = overZone === zone;\n const boxTone = drag\n ? accepts\n ? isOver\n ? 'border-primary border-solid bg-primary/10'\n : 'border-primary/60 border-dashed bg-primary/5'\n : 'border-base-300 border-dashed opacity-40'\n : 'border-base-300 border-dashed bg-base-100/50';\n return (\n <div\n className={`flex flex-col gap-1 ${vertical ? 'w-full' : 'flex-1 min-w-40'}`}\n onDragOver={(e) => {\n if (!accepts) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (overZone !== zone) setOverZone(zone);\n }}\n onDragLeave={(e) => {\n // 仅当真正离开该区域(而非进入其子元素)时才清除高亮。\n if (e.currentTarget.contains(e.relatedTarget as Node)) return;\n if (overZone === zone) setOverZone(null);\n }}\n onDrop={(e) => {\n e.preventDefault();\n const field = e.dataTransfer.getData('text/plain');\n setOverZone(null);\n if (field) dropTo(zone, field);\n }}\n >\n <span className=\"text-xs font-semibold opacity-60 flex items-center gap-1\">\n <span aria-hidden>{icon}</span>\n {title}\n </span>\n <div\n className={`flex flex-wrap gap-1 items-center content-start p-1.5 border rounded transition-colors ${\n vertical ? 'min-h-16' : 'min-h-9'\n } ${boxTone}`}\n >\n {children}\n </div>\n </div>\n );\n };\n\n const divider = vertical ? null : (\n <div className=\"w-px bg-base-300 self-stretch\" />\n );\n\n return (\n <>\n <div\n className={`gap-2 p-2 border border-base-300 rounded-box bg-base-200/40 ${\n vertical\n ? 'flex flex-col shrink-0 self-stretch overflow-auto'\n : 'w-full flex flex-wrap items-stretch'\n }`}\n style={\n vertical\n ? {\n width:\n typeof panelWidth === 'number'\n ? `${panelWidth}px`\n : panelWidth,\n }\n : undefined\n }\n >\n {renderZone(\n 'available',\n '☷',\n t.available,\n <>\n {availableDims.length === 0 &&\n availableValues.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.empty}\n </span>\n )}\n {availableDims.map((f) => renderChip(f.field))}\n {availableValues.map((f) =>\n renderChip(f.field, {\n prefix: <span className=\"opacity-70\">#</span>,\n }),\n )}\n </>,\n )}\n\n {divider}\n\n {renderZone(\n 'rows',\n '≣',\n t.rowGroups,\n <>\n {rowFields.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.dropHint}\n </span>\n )}\n {rowFields.map((field) =>\n renderChip(field, {\n onRemove: () => removeFromAll(field),\n }),\n )}\n </>,\n )}\n\n {divider}\n\n {renderZone(\n 'cols',\n '║',\n t.colGroups,\n <>\n {colFields.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.dropHint}\n </span>\n )}\n {colFields.map((field) =>\n renderChip(field, {\n onRemove: () => removeFromAll(field),\n }),\n )}\n </>,\n )}\n\n {divider}\n\n {renderZone(\n 'values',\n 'Σ',\n t.values,\n <>\n {values.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.dropHint}\n </span>\n )}\n {values.map((v, i) => (\n <span\n key={`${v.field}:${i}`}\n draggable\n onDragStart={(e) => onChipDragStart(e, v.field)}\n onDragEnd={onChipDragEnd}\n className={`badge badge-outline gap-1 items-center cursor-grab active:cursor-grabbing select-none ${\n drag?.field === v.field ? 'opacity-40' : ''\n }`}\n >\n <select\n className=\"bg-transparent text-xs outline-none\"\n value={v.aggFn}\n // 防止在 select 上开始拖拽。\n draggable={false}\n onChange={(e) =>\n setValues(\n values.map((x, xi) =>\n xi === i\n ? {\n ...x,\n aggFn: e.target\n .value as PivotAggFn,\n }\n : x,\n ),\n )\n }\n >\n {AGG_FNS.map((fn) => (\n <option key={fn} value={fn}>\n {fn}\n </option>\n ))}\n </select>\n <span>{labelOf(v.field)}</span>\n <button\n type=\"button\"\n className=\"text-xs opacity-60 hover:opacity-100\"\n onClick={() =>\n setValues(\n values.filter((_, xi) => xi !== i),\n )\n }\n aria-label={t.remove}\n >\n ✕\n </button>\n </span>\n ))}\n </>,\n )}\n </div>\n\n {/* 拖拽引用(ghost 预览):跟随光标显示当前拖拽的字段。\n 位置由 window `dragover` 通过 ref 直接更新,不触发重渲染。 */}\n {drag && (\n <div\n ref={ghostRef}\n className=\"badge badge-primary gap-1 items-center shadow-lg pointer-events-none\"\n style={{\n position: 'fixed',\n left: 0,\n top: 0,\n zIndex: 2000,\n willChange: 'transform',\n }}\n >\n {drag.numeric && <span className=\"opacity-80\">#</span>}\n {drag.label}\n </div>\n )}\n </>\n );\n}\n\nexport default PivotPanel;\n"],"mappings":";;AAKA,IAAM,IAAwB;AAAA,EAAC;AAAA,EAAO;AAAA,EAAO;AAAA,EAAS;AAAA,EAAO;AAAK,GAK5D,IAAO;AAAA,EACT,IAAI;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,EACZ;AACJ,GAGM,IACF,OAAO,QAAU,OAAA,MACJ;AACH,QAAM,IAAM,IAAI,MAAM;AACtB,SAAA,EAAI,MACA,8EACG;AACX,GAAG,IACH;AA2CV,SAAgB,GAAW,EACvB,aAAA,GACA,MAAA,GACA,aAAA,GACA,iBAAA,GACA,eAAA,GACA,WAAA,GACA,WAAA,GACA,QAAA,GACA,cAAA,GACA,cAAA,GACA,WAAA,GACA,YAAA,IAAa,IAAA,GACG;AAChB,QAAM,IAAI,EAAK,CAAA,GACT,IAAA,CAAW,MAAkB,EAAY,CAAA,KAAU,GACnD,IAAA,CAAkB,MACpB,EAAc,KAAA,CAAM,MAAM,EAAE,UAAU,CAAK,GAEzC,CAAC,GAAM,CAAA,IAAW,EAA0B,IAAI,GAChD,CAAC,GAAU,CAAA,IAAe,EAAwB,IAAI,GACtD,IAAW,EAA8B,IAAI,GAC7C,IAAa,EAAiC;AAAA,IAAE,GAAG;AAAA,IAAG,GAAG;AAAA,EAAE,CAAC,GAC5D,IAAW,KAAQ;AAMzB,EAAA,EAAA,MAAgB;AACZ,QAAI,CAAC,EAAU;AACf,UAAM,IAAA,MAAsB;AACxB,YAAM,IAAK,EAAS;AACpB,MAAK,MACL,EAAG,MAAM,YAAY,aAAa,EAAW,QAAQ,IAAI,EAAA,OACrD,EAAW,QAAQ,IAAI,EAAA;AAAA,IAE/B;AACA,IAAA,EAAc;AACd,UAAM,IAAA,CAAoB,MAAiB;AACvC,MAAI,EAAE,YAAY,KAAK,EAAE,YAAY,MACrC,EAAW,UAAU;AAAA,QAAE,GAAG,EAAE;AAAA,QAAS,GAAG,EAAE;AAAA,MAAQ,GAClD,EAAc;AAAA,IAClB,GACM,IAAA,MAAc;AAChB,MAAA,EAAQ,IAAI,GACZ,EAAY,IAAI;AAAA,IACpB;AACA,kBAAO,iBAAiB,YAAY,CAAgB,GACpD,OAAO,iBAAiB,WAAW,CAAK,GACxC,OAAO,iBAAiB,QAAQ,CAAK,GACrC,MAAa;AACT,aAAO,oBAAoB,YAAY,CAAgB,GACvD,OAAO,oBAAoB,WAAW,CAAK,GAC3C,OAAO,oBAAoB,QAAQ,CAAK;AAAA,IAC5C;AAAA,EACJ,GAAG,CAAC,CAAQ,CAAC;AAEb,QAAM,IAAW,oBAAI,IAAY,CAAC,GAAG,GAAW,GAAG,CAAS,CAAC,GACvD,IAAgB,EAAgB,OAAA,CAAQ,MAAM,CAAC,EAAS,IAAI,EAAE,KAAK,CAAC,GACpE,IAAa,IAAI,IAAI,EAAO,IAAA,CAAK,MAAM,EAAE,KAAK,CAAC,GAC/C,IAAkB,EAAc,OAAA,CAAQ,MAAM,CAAC,EAAW,IAAI,EAAE,KAAK,CAAC,GAEtE,IAAA,CAAiB,MAAkB;AACrC,IAAA,EAAA,CAAc,MAAS,EAAK,OAAA,CAAQ,MAAM,MAAM,CAAK,CAAC,GACtD,EAAA,CAAc,MAAS,EAAK,OAAA,CAAQ,MAAM,MAAM,CAAK,CAAC,GACtD,EAAA,CAAW,MAAS,EAAK,OAAA,CAAQ,MAAM,EAAE,UAAU,CAAK,CAAC;AAAA,EAC7D,GAGM,IAAA,CAAe,MACZ,IACD,MAAS,cAAoB,KAC7B,MAAS,WAAiB,EAAK,UAC5B,CAAC,EAAK,UAHK,IAMhB,IAAA,CAAU,GAAc,MAAkB;AAC5C,UAAM,IAAU,EAAe,CAAK;AACpC,QAAI,MAAS,UAAU;AACnB,UAAI,CAAC,EAAS;AACd,MAAA,EAAA,CAAc,MAAS,EAAK,OAAA,CAAQ,MAAM,MAAM,CAAK,CAAC,GACtD,EAAA,CAAc,MAAS,EAAK,OAAA,CAAQ,MAAM,MAAM,CAAK,CAAC,GACtD,EAAA,CAAW,MACP,EAAK,KAAA,CAAM,MAAM,EAAE,UAAU,CAAK,IAC5B,IACA,CAAC,GAAG,GAAM;AAAA,QAAE,OAAA;AAAA,QAAO,OAAO;AAAA,MAAM,CAAC,CAC3C;AACA;AAAA,IACJ;AACA,QAAI,MAAS,UAAU,MAAS,QAAQ;AACpC,UAAI,EAAS;AACb,MAAA,EAAA,CAAW,MAAS,EAAK,OAAA,CAAQ,MAAM,EAAE,UAAU,CAAK,CAAC,GACrD,MAAS,UACT,EAAA,CAAc,MAAS,EAAK,OAAA,CAAQ,MAAM,MAAM,CAAK,CAAC,GACtD,EAAA,CAAc,MACV,EAAK,SAAS,CAAK,IAAI,IAAO,CAAC,GAAG,GAAM,CAAK,CACjD,MAEA,EAAA,CAAc,MAAS,EAAK,OAAA,CAAQ,MAAM,MAAM,CAAK,CAAC,GACtD,EAAA,CAAc,MACV,EAAK,SAAS,CAAK,IAAI,IAAO,CAAC,GAAG,GAAM,CAAK,CACjD;AAEJ;AAAA,IACJ;AACA,IAAA,EAAc,CAAK;AAAA,EACvB,GAEM,IAAA,CAAmB,GAAoB,MAAkB;AAC3D,MAAE,aAAa,QAAQ,cAAc,CAAK,GAC1C,EAAE,aAAa,gBAAgB,QAC3B,KACA,EAAE,aAAa,aAAa,GAAkB,GAAG,CAAC,GAEtD,EAAW,UAAU;AAAA,MAAE,GAAG,EAAE;AAAA,MAAS,GAAG,EAAE;AAAA,IAAQ,GAClD,EAAQ;AAAA,MACJ,OAAA;AAAA,MACA,OAAO,EAAQ,CAAK;AAAA,MACpB,SAAS,EAAe,CAAK;AAAA,IACjC,CAAC;AAAA,EACL,GAEM,IAAA,MAAsB;AACxB,IAAA,EAAQ,IAAI,GACZ,EAAY,IAAI;AAAA,EACpB,GAEM,IAAW,MAAgB,YAG3B,IAAA,CACF,GACA,MAEA,gBAAA,EAAC,QAAD;AAAA,IAEI,WAAA;AAAA,IACA,aAAA,CAAc,MAAM,EAAgB,GAAG,CAAK;AAAA,IAC5C,WAAW;AAAA,IACX,WAAW,yFACP,GAAM,UAAU,IAAQ,eAAe,EAAA;AAAA,IAN/C,UAAA;AAAA,MASK,GAAM;AAAA,MACN,EAAQ,CAAK;AAAA,MACb,GAAM,YACH,gBAAA,EAAC,UAAD;AAAA,QACI,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,EAAK;AAAA,QACd,cAAY,EAAE;AAAA,QACjB,UAAA;AAAA,MAEO,CAAA;AAAA,IAEV;AAAA,EApBG,GAAA,CAoBH,GAIJ,IAAA,CACF,GACA,GACA,GACA,MACC;AACD,UAAM,IAAU,EAAY,CAAI;AAShC,WACI,gBAAA,EAAC,OAAD;AAAA,MACI,WAAW,uBAAuB,IAAW,WAAW,iBAAA;AAAA,MACxD,YAAA,CAAa,MAAM;AACf,QAAK,MACL,EAAE,eAAe,GACjB,EAAE,aAAa,aAAa,QACxB,MAAa,KAAM,EAAY,CAAI;AAAA,MAC3C;AAAA,MACA,aAAA,CAAc,MAAM;AAEhB,QAAI,EAAE,cAAc,SAAS,EAAE,aAAqB,KAChD,MAAa,KAAM,EAAY,IAAI;AAAA,MAC3C;AAAA,MACA,QAAA,CAAS,MAAM;AACX,QAAA,EAAE,eAAe;AACjB,cAAM,IAAQ,EAAE,aAAa,QAAQ,YAAY;AACjD,QAAA,EAAY,IAAI,GACZ,KAAO,EAAO,GAAM,CAAK;AAAA,MACjC;AAAA,MAlBJ,UAAA,CAoBI,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAA,CACI,gBAAA,EAAC,QAAD;AAAA,UAAM,eAAA;AAAA,UAAa,UAAA;AAAA,QAAW,CAAA,GAC7B,CACC;AAAA,MACN,CAAA,GAAA,gBAAA,EAAC,OAAD;AAAA,QACI,WAAW,0FACP,IAAW,aAAa,SAAA,IAlCxB,IACV,IAFS,MAAa,IAId,8CACA,iDACJ,6CACJ,8CAAA;AAAA,QA+BO,UAAA;AAAA,MACA,CAAA,CACJ;AAAA;EAEb,GAEM,IAAU,IAAW,OACvB,gBAAA,EAAC,OAAD,EAAK,WAAU,gCAAiC,CAAA;AAGpD,SACI,gBAAA,EAAA,GAAA,EAAA,UAAA,CACI,gBAAA,EAAC,OAAD;AAAA,IACI,WAAW,+DACP,IACM,sDACA,qCAAA;AAAA,IAEV,OACI,IACM,EACI,OACI,OAAO,KAAe,WAChB,GAAG,CAAA,OACH,EACd,IACA;AAAA,IAdd,UAAA;AAAA,MAiBK,EACG,aACA,KACA,EAAE,WACF,gBAAA,EAAA,GAAA,EAAA,UAAA;AAAA,QACK,EAAc,WAAW,KACtB,EAAgB,WAAW,KACvB,gBAAA,EAAC,QAAD;AAAA,UAAM,WAAU;AAAA,UACX,UAAA,EAAE;AAAA,QACD,CAAA;AAAA,QAEb,EAAc,IAAA,CAAK,MAAM,EAAW,EAAE,KAAK,CAAC;AAAA,QAC5C,EAAgB,IAAA,CAAK,MAClB,EAAW,EAAE,OAAO,EAChB,QAAQ,gBAAA,EAAC,QAAD;AAAA,UAAM,WAAU;AAAA,UAAa,UAAA;AAAA,QAAO,CAAA,EAChD,CAAC,CACL;AAAA,MACF,EAAA,CAAA,CACN;AAAA,MAEC;AAAA,MAEA,EACG,QACA,KACA,EAAE,WACF,gBAAA,EAAA,GAAA,EAAA,UAAA,CACK,EAAU,WAAW,KAClB,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,QACX,UAAA,EAAE;AAAA,MACD,CAAA,GAET,EAAU,IAAA,CAAK,MACZ,EAAW,GAAO,EACd,UAAA,MAAgB,EAAc,CAAK,EACvC,CAAC,CACL,CACF,EAAA,CAAA,CACN;AAAA,MAEC;AAAA,MAEA,EACG,QACA,KACA,EAAE,WACF,gBAAA,EAAA,GAAA,EAAA,UAAA,CACK,EAAU,WAAW,KAClB,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,QACX,UAAA,EAAE;AAAA,MACD,CAAA,GAET,EAAU,IAAA,CAAK,MACZ,EAAW,GAAO,EACd,UAAA,MAAgB,EAAc,CAAK,EACvC,CAAC,CACL,CACF,EAAA,CAAA,CACN;AAAA,MAEC;AAAA,MAEA,EACG,UACA,KACA,EAAE,QACF,gBAAA,EAAA,GAAA,EAAA,UAAA,CACK,EAAO,WAAW,KACf,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,QACX,UAAA,EAAE;AAAA,MACD,CAAA,GAET,EAAO,IAAA,CAAK,GAAG,MACZ,gBAAA,EAAC,QAAD;AAAA,QAEI,WAAA;AAAA,QACA,aAAA,CAAc,MAAM,EAAgB,GAAG,EAAE,KAAK;AAAA,QAC9C,WAAW;AAAA,QACX,WAAW,yFACP,GAAM,UAAU,EAAE,QAAQ,eAAe,EAAA;AAAA,QANjD,UAAA;AAAA,UASI,gBAAA,EAAC,UAAD;AAAA,YACI,WAAU;AAAA,YACV,OAAO,EAAE;AAAA,YAET,WAAW;AAAA,YACX,UAAA,CAAW,MACP,EACI,EAAO,IAAA,CAAK,GAAG,MACX,MAAO,IACD;AAAA,cACI,GAAG;AAAA,cACH,OAAO,EAAE,OACJ;AAAA,YACT,IACA,CACV,CACJ;AAAA,YAGH,UAAA,EAAQ,IAAA,CAAK,MACV,gBAAA,EAAC,UAAD;AAAA,cAAiB,OAAO;AAAA,cACnB,UAAA;AAAA,YACG,GAFK,CAEL,CACX;AAAA,UACG,CAAA;AAAA,UACR,gBAAA,EAAC,QAAD,EAAA,UAAO,EAAQ,EAAE,KAAK,EAAQ,CAAA;AAAA,UAC9B,gBAAA,EAAC,UAAD;AAAA,YACI,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAA,MACI,EACI,EAAO,OAAA,CAAQ,GAAG,MAAO,MAAO,CAAC,CACrC;AAAA,YAEJ,cAAY,EAAE;AAAA,YACjB,UAAA;AAAA,UAEO,CAAA;AAAA,QACN;AAAA,MA9CG,GAAA,GAAG,EAAE,KAAA,IAAS,CAAA,EA8CjB,CACT,CACH,EAAA,CAAA,CACN;AAAA,IACC;AAAA,EAIJ,CAAA,GAAA,KACG,gBAAA,EAAC,OAAD;AAAA,IACI,KAAK;AAAA,IACL,WAAU;AAAA,IACV,OAAO;AAAA,MACH,UAAU;AAAA,MACV,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,IAChB;AAAA,IATJ,UAAA,CAWK,EAAK,WAAW,gBAAA,EAAC,QAAD;AAAA,MAAM,WAAU;AAAA,MAAa,UAAA;AAAA,IAAO,CAAA,GACpD,EAAK,KACL;AAAA,EAEX,CAAA,CAAA,EAAA,CAAA;AAEV"}
1
+ {"version":3,"file":"PivotPanel.js","names":[],"sources":["../../../../src/components/pro/DataTable/PivotPanel.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport type { PivotValue, PivotFieldLabels } from './PivotView';\nimport type { PivotAggFn } from './pivotEngine';\nimport type { PivotField } from './pivotExtension';\n\nconst AGG_FNS: PivotAggFn[] = ['sum', 'avg', 'count', 'min', 'max'];\n\n/** 面板内的区域标识。 */\ntype ZoneId = 'available' | 'rows' | 'cols' | 'values';\n\nconst TEXT = {\n zh: {\n available: '可用字段',\n rowGroups: '行分组',\n colGroups: '列分组',\n values: '数值',\n empty: '(无字段)',\n dropHint: '拖拽字段到此',\n remove: '移除',\n },\n en: {\n available: 'Available',\n rowGroups: 'Row Groups',\n colGroups: 'Column Labels',\n values: 'Values',\n empty: '(no fields)',\n dropHint: 'Drag fields here',\n remove: 'Remove',\n },\n} as const;\n\n/** 透明的 1x1 拖拽图,用于隐藏浏览器默认的拖拽影像(改用自定义 ghost)。 */\nconst EMPTY_DRAG_IMAGE =\n typeof Image !== 'undefined'\n ? (() => {\n const img = new Image();\n img.src =\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n return img;\n })()\n : null;\n\nexport interface PivotPanelProps {\n /** 面板排布方向:水平(工具栏下方)或垂直(表格左/右侧)。 */\n orientation: 'horizontal' | 'vertical';\n lang: 'zh' | 'en';\n fieldLabels: PivotFieldLabels;\n dimensionFields: PivotField[];\n numericFields: PivotField[];\n rowFields: string[];\n colFields: string[];\n values: PivotValue[];\n setRowFields: React.Dispatch<React.SetStateAction<string[]>>;\n setColFields: React.Dispatch<React.SetStateAction<string[]>>;\n setValues: React.Dispatch<React.SetStateAction<PivotValue[]>>;\n /**\n * 垂直(左/右)面板的宽度。数字视为 px,字符串直接作为 CSS 宽度\n * (如 `'20%'` / `'16rem'`)。仅在 `orientation='vertical'` 时生效,默认 224px。\n */\n panelWidth?: number | string;\n}\n\n/**\n * 当前拖拽的字段信息(低频变化:仅在拖拽开始 / 结束时更新,\n * 不含坐标,避免拖拽过程中高频 setState 导致 chip 重挂载而使拖拽卡死)。\n */\ninterface DragInfo {\n field: string;\n label: string;\n numeric: boolean;\n}\n\n/**\n * ag-grid 风格的透视配置面板。\n *\n * 特性:\n * - 支持水平(`horizontal`)与垂直(`vertical`)两种排布,后者用于表格左/右侧。\n * - 拖拽字段时显示跟随光标的「拖拽引用」(ghost 预览),并高亮可放置的目标区域。\n *\n * 关键实现:拖拽期间**不** setState 更新坐标,而是用 ref 直接改写 ghost 的\n * transform;`Chip`/`Zone` 用渲染函数而非内联组件,避免每次渲染都被 React\n * 当作新组件类型而卸载重挂载(那会中断浏览器原生拖拽,导致卡死)。\n */\nexport function PivotPanel({\n orientation,\n lang,\n fieldLabels,\n dimensionFields,\n numericFields,\n rowFields,\n colFields,\n values,\n setRowFields,\n setColFields,\n setValues,\n panelWidth = 224,\n}: PivotPanelProps) {\n const t = TEXT[lang];\n const labelOf = (field: string) => fieldLabels[field] ?? field;\n const isNumericField = (field: string) =>\n numericFields.some((f) => f.field === field);\n\n const [drag, setDrag] = useState<DragInfo | null>(null);\n const [overZone, setOverZone] = useState<ZoneId | null>(null);\n const ghostRef = useRef<HTMLDivElement | null>(null);\n const pointerRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const dragging = drag != null;\n\n // 拖拽期间用 window 级 `dragover` 直接更新 ghost 位置(ref 操作 DOM,不触发\n // React 重渲染),坐标不进入 state,从根本上避免 chip 子树重挂载而卡死。\n // 同时用 window 级 `dragend`/`drop` 兜底清除拖拽状态:放置后源 chip 常因状态\n // 更新被移动/重建,其自身的 `onDragEnd` 可能不再触发,导致 ghost 残留。\n useEffect(() => {\n if (!dragging) return;\n const positionGhost = () => {\n const el = ghostRef.current;\n if (!el) return;\n el.style.transform = `translate(${pointerRef.current.x + 12}px, ${\n pointerRef.current.y + 12\n }px)`;\n };\n positionGhost();\n const onWindowDragOver = (e: DragEvent) => {\n if (e.clientX === 0 && e.clientY === 0) return;\n pointerRef.current = { x: e.clientX, y: e.clientY };\n positionGhost();\n };\n const clear = () => {\n setDrag(null);\n setOverZone(null);\n };\n window.addEventListener('dragover', onWindowDragOver);\n window.addEventListener('dragend', clear);\n window.addEventListener('drop', clear);\n return () => {\n window.removeEventListener('dragover', onWindowDragOver);\n window.removeEventListener('dragend', clear);\n window.removeEventListener('drop', clear);\n };\n }, [dragging]);\n\n const usedDims = new Set<string>([...rowFields, ...colFields]);\n const availableDims = dimensionFields.filter((f) => !usedDims.has(f.field));\n const usedValues = new Set(values.map((v) => v.field));\n const availableValues = numericFields.filter((f) => !usedValues.has(f.field));\n\n const removeFromAll = (field: string) => {\n setRowFields((prev) => prev.filter((x) => x !== field));\n setColFields((prev) => prev.filter((x) => x !== field));\n setValues((prev) => prev.filter((x) => x.field !== field));\n };\n\n /** 某个区域是否能接收当前正在拖拽的字段。 */\n const zoneAccepts = (zone: ZoneId): boolean => {\n if (!drag) return false;\n if (zone === 'available') return true;\n if (zone === 'values') return drag.numeric;\n return !drag.numeric; // rows / cols 只接受维度字段\n };\n\n const dropTo = (zone: ZoneId, field: string) => {\n const numeric = isNumericField(field);\n if (zone === 'values') {\n if (!numeric) return;\n setRowFields((prev) => prev.filter((x) => x !== field));\n setColFields((prev) => prev.filter((x) => x !== field));\n setValues((prev) =>\n prev.some((v) => v.field === field)\n ? prev\n : [...prev, { field, aggFn: 'sum' }],\n );\n return;\n }\n if (zone === 'rows' || zone === 'cols') {\n if (numeric) return;\n setValues((prev) => prev.filter((x) => x.field !== field));\n if (zone === 'rows') {\n setColFields((prev) => prev.filter((x) => x !== field));\n setRowFields((prev) =>\n prev.includes(field) ? prev : [...prev, field],\n );\n } else {\n setRowFields((prev) => prev.filter((x) => x !== field));\n setColFields((prev) =>\n prev.includes(field) ? prev : [...prev, field],\n );\n }\n return;\n }\n removeFromAll(field);\n };\n\n const onChipDragStart = (e: React.DragEvent, field: string) => {\n e.dataTransfer.setData('text/plain', field);\n e.dataTransfer.effectAllowed = 'move';\n if (EMPTY_DRAG_IMAGE) {\n e.dataTransfer.setDragImage(EMPTY_DRAG_IMAGE, 0, 0);\n }\n pointerRef.current = { x: e.clientX, y: e.clientY };\n setDrag({\n field,\n label: labelOf(field),\n numeric: isNumericField(field),\n });\n };\n\n const onChipDragEnd = () => {\n setDrag(null);\n setOverZone(null);\n };\n\n const vertical = orientation === 'vertical';\n\n // 渲染一个可拖拽的字段 chip(用渲染函数而非组件,避免重挂载)。\n const renderChip = (\n field: string,\n opts?: { onRemove?: () => void; prefix?: React.ReactNode },\n ) => (\n <span\n key={field}\n draggable\n onDragStart={(e) => onChipDragStart(e, field)}\n onDragEnd={onChipDragEnd}\n className={`badge badge-outline gap-1 items-center cursor-grab active:cursor-grabbing select-none ${\n drag?.field === field ? 'opacity-40' : ''\n }`}\n >\n {opts?.prefix}\n {labelOf(field)}\n {opts?.onRemove && (\n <button\n type=\"button\"\n className=\"text-xs opacity-60 hover:opacity-100\"\n onClick={opts.onRemove}\n aria-label={t.remove}\n >\n ✕\n </button>\n )}\n </span>\n );\n\n // 渲染一个拖放区段(渲染函数,非组件)。\n const renderZone = (\n zone: ZoneId,\n icon: string,\n title: string,\n children: React.ReactNode,\n ) => {\n const accepts = zoneAccepts(zone);\n const isOver = overZone === zone;\n const boxTone = drag\n ? accepts\n ? isOver\n ? 'border-primary border-solid bg-primary/10'\n : 'border-primary/60 border-dashed bg-primary/5'\n : 'border-base-300 border-dashed opacity-40'\n : 'border-base-300 border-dashed bg-base-100/50';\n return (\n <div\n className={`flex flex-col gap-1 ${vertical ? 'w-full' : 'flex-1 min-w-40'}`}\n onDragOver={(e) => {\n if (!accepts) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (overZone !== zone) setOverZone(zone);\n }}\n onDragLeave={(e) => {\n // 仅当真正离开该区域(而非进入其子元素)时才清除高亮。\n if (e.currentTarget.contains(e.relatedTarget as Node)) return;\n if (overZone === zone) setOverZone(null);\n }}\n onDrop={(e) => {\n e.preventDefault();\n const field = e.dataTransfer.getData('text/plain');\n setOverZone(null);\n if (field) dropTo(zone, field);\n }}\n >\n <span className=\"text-xs font-semibold opacity-60 flex items-center gap-1\">\n <span aria-hidden>{icon}</span>\n {title}\n </span>\n <div\n className={`flex flex-wrap gap-1 items-center content-start p-1.5 border rounded transition-colors ${\n vertical ? 'min-h-16' : 'min-h-9'\n } ${boxTone}`}\n >\n {children}\n </div>\n </div>\n );\n };\n\n const divider = vertical ? null : (\n <div className=\"w-px bg-base-300 self-stretch\" />\n );\n\n return (\n <>\n <div\n className={`gap-2 p-2 border border-base-300 rounded-box bg-base-200/40 ${\n vertical\n ? 'flex flex-col shrink-0 self-stretch overflow-auto'\n : 'w-full flex flex-wrap items-stretch'\n }`}\n style={\n vertical\n ? {\n width:\n typeof panelWidth === 'number'\n ? `${panelWidth}px`\n : panelWidth,\n }\n : undefined\n }\n >\n {renderZone(\n 'available',\n '☷',\n t.available,\n <>\n {availableDims.length === 0 &&\n availableValues.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.empty}\n </span>\n )}\n {availableDims.map((f) => renderChip(f.field))}\n {availableValues.map((f) =>\n renderChip(f.field, {\n prefix: <span className=\"opacity-70\">#</span>,\n }),\n )}\n </>,\n )}\n\n {divider}\n\n {renderZone(\n 'rows',\n '≣',\n t.rowGroups,\n <>\n {rowFields.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.dropHint}\n </span>\n )}\n {rowFields.map((field) =>\n renderChip(field, {\n onRemove: () => removeFromAll(field),\n }),\n )}\n </>,\n )}\n\n {divider}\n\n {renderZone(\n 'cols',\n '║',\n t.colGroups,\n <>\n {colFields.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.dropHint}\n </span>\n )}\n {colFields.map((field) =>\n renderChip(field, {\n onRemove: () => removeFromAll(field),\n }),\n )}\n </>,\n )}\n\n {divider}\n\n {renderZone(\n 'values',\n 'Σ',\n t.values,\n <>\n {values.length === 0 && (\n <span className=\"text-xs opacity-40\">\n {t.dropHint}\n </span>\n )}\n {values.map((v, i) => (\n <span\n key={`${v.field}:${i}`}\n draggable\n onDragStart={(e) => onChipDragStart(e, v.field)}\n onDragEnd={onChipDragEnd}\n className={`badge badge-outline gap-1 items-center cursor-grab active:cursor-grabbing select-none ${\n drag?.field === v.field ? 'opacity-40' : ''\n }`}\n >\n <select\n className=\"bg-transparent text-xs outline-none\"\n value={v.aggFn}\n // 防止在 select 上开始拖拽。\n draggable={false}\n onChange={(e) =>\n setValues(\n values.map((x, xi) =>\n xi === i\n ? {\n ...x,\n aggFn: e.target\n .value as PivotAggFn,\n }\n : x,\n ),\n )\n }\n >\n {AGG_FNS.map((fn) => (\n <option key={fn} value={fn}>\n {fn}\n </option>\n ))}\n </select>\n <span>{labelOf(v.field)}</span>\n <button\n type=\"button\"\n className=\"text-xs opacity-60 hover:opacity-100\"\n onClick={() =>\n setValues(\n values.filter((_, xi) => xi !== i),\n )\n }\n aria-label={t.remove}\n >\n ✕\n </button>\n </span>\n ))}\n </>,\n )}\n </div>\n\n {/* 拖拽引用(ghost 预览):跟随光标显示当前拖拽的字段。\n 位置由 window `dragover` 通过 ref 直接更新,不触发重渲染。 */}\n {drag && (\n <div\n ref={ghostRef}\n className=\"badge badge-primary gap-1 items-center shadow-lg pointer-events-none\"\n style={{\n position: 'fixed',\n left: 0,\n top: 0,\n zIndex: 2000,\n willChange: 'transform',\n }}\n >\n {drag.numeric && <span className=\"opacity-80\">#</span>}\n {drag.label}\n </div>\n )}\n </>\n );\n}\n\nexport default PivotPanel;\n"],"mappings":"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"}
@@ -1,149 +1,147 @@
1
- import t from "../../Table/index.js";
2
- import { computePivot as P } from "./pivotEngine.js";
3
- import { useMemo as W, useState as D } from "react";
4
- import { jsx as a, jsxs as s } from "react/jsx-runtime";
5
- var F = "", H = {
6
- sum: {
7
- zh: "求和",
8
- en: "Sum"
9
- },
10
- avg: {
11
- zh: "平均",
12
- en: "Avg"
13
- },
14
- count: {
15
- zh: "计数",
16
- en: "Count"
17
- },
18
- min: {
19
- zh: "最小",
20
- en: "Min"
21
- },
22
- max: {
23
- zh: "最大",
24
- en: "Max"
25
- }
1
+ import e from "../../Table/index.js";
2
+ import { computePivot as t } from "./pivotEngine.js";
3
+ import { useMemo as n, useState as r } from "react";
4
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
5
+ //#region src/components/pro/DataTable/PivotView.tsx
6
+ var o = "", s = {
7
+ sum: {
8
+ zh: "求和",
9
+ en: "Sum"
10
+ },
11
+ avg: {
12
+ zh: "平均",
13
+ en: "Avg"
14
+ },
15
+ count: {
16
+ zh: "计数",
17
+ en: "Count"
18
+ },
19
+ min: {
20
+ zh: "最小",
21
+ en: "Min"
22
+ },
23
+ max: {
24
+ zh: "最大",
25
+ en: "Max"
26
+ }
26
27
  };
27
- function A(m) {
28
- return m == null ? "" : m.toLocaleString(void 0, { maximumFractionDigits: 2 });
28
+ function c(e) {
29
+ return e == null ? "" : e.toLocaleString(void 0, { maximumFractionDigits: 2 });
29
30
  }
30
- function Q({ data: m, rowFields: g, colFields: b, values: p, fieldLabels: R = {}, lang: x = "zh", treeView: v = !0 }) {
31
- const [M, T] = D({}), y = (e) => R[e] ?? e, B = (e) => H[e][x], f = W(() => (p.length ? p : [{
32
- field: "",
33
- aggFn: "count"
34
- }]).map((e) => {
35
- const n = {
36
- rowFields: g,
37
- colFields: b,
38
- valueField: e.field,
39
- aggFn: e.aggFn
40
- };
41
- return P(m, n);
42
- }), [
43
- m,
44
- g,
45
- b,
46
- p
47
- ]), h = f[0];
48
- if (!h || g.length === 0) return /* @__PURE__ */ a("div", {
49
- className: "p-8 text-center opacity-60",
50
- children: x === "zh" ? "请至少配置一个行分组字段以启用透视视图。" : "Add at least one row group field to enable the pivot view."
51
- });
52
- const C = p.length ? p : [{
53
- field: "",
54
- aggFn: "count"
55
- }], { rowKeys: V, colKeys: N, rowFields: S } = h, k = N.length, w = h.rowCounts, r = h.colFields.length > 0, L = v && S.length > 1 && h.rowTree.length > 0, $ = S.map(y).join(" / ") || "Group", j = r ? N : [[]], _ = (e) => T((n) => ({
56
- ...n,
57
- [e]: !n[e]
58
- })), z = [];
59
- if (L) {
60
- const e = (c) => {
61
- const l = /* @__PURE__ */ new Map(), i = (u) => {
62
- for (const d of u)
63
- l.set(d.key.join(F), d), d.children.length && i(d.children);
64
- };
65
- return i(c), l;
66
- }, n = f.map((c) => e(c.rowTree)), o = (c) => {
67
- for (const l of c) {
68
- const i = l.key.join(F), u = l.children.length > 0, d = M[i] ?? l.depth === 0, E = n.map((G) => G.get(i)?.cells ?? []);
69
- z.push({
70
- keyStr: i,
71
- label: l.label,
72
- depth: l.depth,
73
- count: l.count,
74
- hasChildren: u,
75
- open: d,
76
- cellsByValue: E
77
- }), u && d && o(l.children);
78
- }
79
- };
80
- o(h.rowTree);
81
- }
82
- return /* @__PURE__ */ a("div", {
83
- className: "overflow-auto border border-base-300 rounded-box",
84
- children: /* @__PURE__ */ s(t, {
85
- className: "table-sm w-full border-collapse",
86
- children: [/* @__PURE__ */ s(t.Head, { children: [r && /* @__PURE__ */ s(t.Row, { children: [/* @__PURE__ */ a(t.Cell, {
87
- className: "bg-base-200 font-semibold text-left align-bottom",
88
- children: $
89
- }), j.map((e, n) => /* @__PURE__ */ a(t.Cell, {
90
- colSpan: C.length,
91
- className: "bg-base-200 font-semibold text-center",
92
- children: e.join(" / ")
93
- }, n))] }), /* @__PURE__ */ s(t.Row, { children: [/* @__PURE__ */ a(t.Cell, {
94
- className: "bg-base-200 font-semibold text-left",
95
- children: r ? "" : $
96
- }), j.map((e, n) => C.map((o) => /* @__PURE__ */ s(t.Cell, {
97
- className: "bg-base-200 font-semibold text-right",
98
- children: [B(o.aggFn), o.field ? `(${y(o.field)})` : ""]
99
- }, `${n}:${o.field}:${o.aggFn}`)))] })] }), /* @__PURE__ */ a(t.Body, { children: L ? z.map((e) => /* @__PURE__ */ s(t.Row, { children: [/* @__PURE__ */ a(t.Cell, {
100
- style: { paddingLeft: e.depth * 16 + 8 },
101
- children: /* @__PURE__ */ s("span", {
102
- className: "inline-flex items-center gap-1",
103
- style: { cursor: e.hasChildren ? "pointer" : "default" },
104
- onClick: () => e.hasChildren && _(e.keyStr),
105
- children: [
106
- /* @__PURE__ */ a("span", {
107
- "aria-hidden": !0,
108
- className: "inline-block w-3 text-xs opacity-60",
109
- children: e.hasChildren ? e.open ? "▾" : "▸" : ""
110
- }),
111
- /* @__PURE__ */ a("span", {
112
- style: { fontWeight: e.depth === 0 ? 600 : 400 },
113
- children: e.label
114
- }),
115
- /* @__PURE__ */ s("span", {
116
- className: "opacity-50",
117
- children: [
118
- " ",
119
- "(",
120
- e.count.toLocaleString(),
121
- ")"
122
- ]
123
- })
124
- ]
125
- })
126
- }), Array.from({ length: r ? k : 1 }).map((n, o) => e.cellsByValue.map((c, l) => /* @__PURE__ */ a(t.Cell, {
127
- className: "text-right tabular-nums",
128
- children: A(c[r ? o : 0] ?? null)
129
- }, `${o}:${l}`)))] }, e.keyStr)) : V.map((e, n) => /* @__PURE__ */ s(t.Row, { children: [/* @__PURE__ */ s(t.Cell, { children: [e.join(" / "), w[n] != null && /* @__PURE__ */ s("span", {
130
- className: "opacity-50",
131
- children: [
132
- " ",
133
- "(",
134
- w[n].toLocaleString(),
135
- ")"
136
- ]
137
- })] }), Array.from({ length: r ? k : 1 }).map((o, c) => f.map((l, i) => /* @__PURE__ */ a(t.Cell, {
138
- className: "text-right tabular-nums",
139
- children: A(l.matrix[n]?.[r ? c : 0] ?? null)
140
- }, `${c}:${i}`)))] }, n)) })]
141
- })
142
- });
31
+ function l({ data: l, rowFields: u, colFields: d, values: f, fieldLabels: p = {}, lang: m = "zh", treeView: h = !0 }) {
32
+ let [g, _] = r({}), v = (e) => p[e] ?? e, y = (e) => s[e][m], b = n(() => (f.length ? f : [{
33
+ field: "",
34
+ aggFn: "count"
35
+ }]).map((e) => {
36
+ let n = {
37
+ rowFields: u,
38
+ colFields: d,
39
+ valueField: e.field,
40
+ aggFn: e.aggFn
41
+ };
42
+ return t(l, n);
43
+ }), [
44
+ l,
45
+ u,
46
+ d,
47
+ f
48
+ ]), x = b[0];
49
+ if (!x || u.length === 0) return /* @__PURE__ */ i("div", {
50
+ className: "p-8 text-center opacity-60",
51
+ children: m === "zh" ? "请至少配置一个行分组字段以启用透视视图。" : "Add at least one row group field to enable the pivot view."
52
+ });
53
+ let S = f.length ? f : [{
54
+ field: "",
55
+ aggFn: "count"
56
+ }], { rowKeys: C, colKeys: w, rowFields: T } = x, E = w.length, D = x.rowCounts, O = x.colFields.length > 0, k = h && T.length > 1 && x.rowTree.length > 0, A = T.map(v).join(" / ") || "Group", j = O ? w : [[]], M = (e) => _((t) => ({
57
+ ...t,
58
+ [e]: !t[e]
59
+ })), N = [];
60
+ if (k) {
61
+ let e = (e) => {
62
+ let t = /* @__PURE__ */ new Map(), n = (e) => {
63
+ for (let r of e) t.set(r.key.join(o), r), r.children.length && n(r.children);
64
+ };
65
+ return n(e), t;
66
+ }, t = b.map((t) => e(t.rowTree)), n = (e) => {
67
+ for (let r of e) {
68
+ let e = r.key.join(o), i = r.children.length > 0, a = g[e] ?? r.depth === 0, s = t.map((t) => t.get(e)?.cells ?? []);
69
+ N.push({
70
+ keyStr: e,
71
+ label: r.label,
72
+ depth: r.depth,
73
+ count: r.count,
74
+ hasChildren: i,
75
+ open: a,
76
+ cellsByValue: s
77
+ }), i && a && n(r.children);
78
+ }
79
+ };
80
+ n(x.rowTree);
81
+ }
82
+ return /* @__PURE__ */ i("div", {
83
+ className: "overflow-auto border border-base-300 rounded-box",
84
+ children: /* @__PURE__ */ a(e, {
85
+ className: "table-sm w-full border-collapse",
86
+ children: [/* @__PURE__ */ a(e.Head, { children: [O && /* @__PURE__ */ a(e.Row, { children: [/* @__PURE__ */ i(e.Cell, {
87
+ className: "bg-base-200 font-semibold text-left align-bottom",
88
+ children: A
89
+ }), j.map((t, n) => /* @__PURE__ */ i(e.Cell, {
90
+ colSpan: S.length,
91
+ className: "bg-base-200 font-semibold text-center",
92
+ children: t.join(" / ")
93
+ }, n))] }), /* @__PURE__ */ a(e.Row, { children: [/* @__PURE__ */ i(e.Cell, {
94
+ className: "bg-base-200 font-semibold text-left",
95
+ children: O ? "" : A
96
+ }), j.map((t, n) => S.map((t) => /* @__PURE__ */ a(e.Cell, {
97
+ className: "bg-base-200 font-semibold text-right",
98
+ children: [y(t.aggFn), t.field ? `(${v(t.field)})` : ""]
99
+ }, `${n}:${t.field}:${t.aggFn}`)))] })] }), /* @__PURE__ */ i(e.Body, { children: k ? N.map((t) => /* @__PURE__ */ a(e.Row, { children: [/* @__PURE__ */ i(e.Cell, {
100
+ style: { paddingLeft: t.depth * 16 + 8 },
101
+ children: /* @__PURE__ */ a("span", {
102
+ className: "inline-flex items-center gap-1",
103
+ style: { cursor: t.hasChildren ? "pointer" : "default" },
104
+ onClick: () => t.hasChildren && M(t.keyStr),
105
+ children: [
106
+ /* @__PURE__ */ i("span", {
107
+ "aria-hidden": !0,
108
+ className: "inline-block w-3 text-xs opacity-60",
109
+ children: t.hasChildren ? t.open ? "▾" : "▸" : ""
110
+ }),
111
+ /* @__PURE__ */ i("span", {
112
+ style: { fontWeight: t.depth === 0 ? 600 : 400 },
113
+ children: t.label
114
+ }),
115
+ /* @__PURE__ */ a("span", {
116
+ className: "opacity-50",
117
+ children: [
118
+ " ",
119
+ "(",
120
+ t.count.toLocaleString(),
121
+ ")"
122
+ ]
123
+ })
124
+ ]
125
+ })
126
+ }), Array.from({ length: O ? E : 1 }).map((n, r) => t.cellsByValue.map((t, n) => /* @__PURE__ */ i(e.Cell, {
127
+ className: "text-right tabular-nums",
128
+ children: c(t[O ? r : 0] ?? null)
129
+ }, `${r}:${n}`)))] }, t.keyStr)) : C.map((t, n) => /* @__PURE__ */ a(e.Row, { children: [/* @__PURE__ */ a(e.Cell, { children: [t.join(" / "), D[n] != null && /* @__PURE__ */ a("span", {
130
+ className: "opacity-50",
131
+ children: [
132
+ " ",
133
+ "(",
134
+ D[n].toLocaleString(),
135
+ ")"
136
+ ]
137
+ })] }), Array.from({ length: O ? E : 1 }).map((t, r) => b.map((t, a) => /* @__PURE__ */ i(e.Cell, {
138
+ className: "text-right tabular-nums",
139
+ children: c(t.matrix[n]?.[O ? r : 0] ?? null)
140
+ }, `${r}:${a}`)))] }, n)) })]
141
+ })
142
+ });
143
143
  }
144
- export {
145
- Q as PivotView,
146
- Q as default
147
- };
144
+ //#endregion
145
+ export { l as PivotView, l as default };
148
146
 
149
147
  //# sourceMappingURL=PivotView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PivotView.js","names":[],"sources":["../../../../src/components/pro/DataTable/PivotView.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport Table from '../../Table';\nimport {\n computePivot,\n type PivotAggFn,\n type PivotConfig,\n type PivotResult,\n type PivotRowNode,\n} from './pivotEngine';\n\nconst SEP = '\\u0001';\n\n/** 一个数值度量:字段 + 聚合函数。 */\nexport interface PivotValue {\n field: string;\n aggFn: PivotAggFn;\n}\n\n/** 字段的展示标签映射。 */\nexport type PivotFieldLabels = Record<string, string>;\n\nconst AGG_LABELS: Record<PivotAggFn, { zh: string; en: string }> = {\n sum: { zh: '求和', en: 'Sum' },\n avg: { zh: '平均', en: 'Avg' },\n count: { zh: '计数', en: 'Count' },\n min: { zh: '最小', en: 'Min' },\n max: { zh: '最大', en: 'Max' },\n};\n\nfunction fmt(v: number | null): string {\n if (v == null) return '';\n return v.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nexport interface PivotViewProps<T extends object> {\n /** 全量数据(会在其之上进行客户端聚合)。 */\n data: T[];\n /** 行分组字段。 */\n rowFields: string[];\n /** 列分组字段。 */\n colFields: string[];\n /** 数值度量列表。 */\n values: PivotValue[];\n /** 字段展示标签。 */\n fieldLabels?: PivotFieldLabels;\n /** 语言(影响聚合函数文案)。默认 'zh'。 */\n lang?: 'zh' | 'en';\n /** 是否以树形(可展开分组)方式展示多级行分组。默认 true。 */\n treeView?: boolean;\n}\n\n/**\n * ag-grid 风格的透视(Pivot)交叉表视图。支持多级行分组、列分组交叉表、\n * 多个数值度量,以及树形分组的展开/折叠。\n */\nexport function PivotView<T extends object>({\n data,\n rowFields,\n colFields,\n values,\n fieldLabels = {},\n lang = 'zh',\n treeView = true,\n}: PivotViewProps<T>) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const fieldLabel = (f: string) => fieldLabels[f] ?? f;\n const aggLabel = (fn: PivotAggFn) => AGG_LABELS[fn][lang];\n\n // 为每个数值度量分别计算一份透视结果。\n const results: PivotResult[] = useMemo(() => {\n const activeValues = values.length\n ? values\n : [{ field: '', aggFn: 'count' as PivotAggFn }];\n return activeValues.map((v) => {\n const config: PivotConfig = {\n rowFields,\n colFields,\n valueField: v.field,\n aggFn: v.aggFn,\n };\n return computePivot(data, config);\n });\n }, [data, rowFields, colFields, values]);\n\n const primary = results[0];\n if (!primary || rowFields.length === 0) {\n return (\n <div className=\"p-8 text-center opacity-60\">\n {lang === 'zh'\n ? '请至少配置一个行分组字段以启用透视视图。'\n : 'Add at least one row group field to enable the pivot view.'}\n </div>\n );\n }\n\n const activeValues = values.length ? values : [{ field: '', aggFn: 'count' as PivotAggFn }];\n const { rowKeys, colKeys, rowFields: rf } = primary;\n const colCount = colKeys.length;\n const rowCounts = primary.rowCounts;\n const hasCols = primary.colFields.length > 0;\n const treeMode = treeView && rf.length > 1 && primary.rowTree.length > 0;\n\n const groupLabel = rf.map(fieldLabel).join(' / ') || 'Group';\n const columns = hasCols ? colKeys : [[]];\n\n const toggle = (nodeKey: string) =>\n setExpanded((prev) => ({ ...prev, [nodeKey]: !prev[nodeKey] }));\n\n // 树形模式:将树扁平化为可见行(尊重展开状态)。\n interface VisibleRow {\n keyStr: string;\n label: string;\n depth: number;\n count: number;\n hasChildren: boolean;\n open: boolean;\n cellsByValue: (number | null)[][];\n }\n\n const visibleRows: VisibleRow[] = [];\n if (treeMode) {\n const indexTree = (nodes: PivotRowNode[]): Map<string, PivotRowNode> => {\n const map = new Map<string, PivotRowNode>();\n const walk = (ns: PivotRowNode[]) => {\n for (const n of ns) {\n map.set(n.key.join(SEP), n);\n if (n.children.length) walk(n.children);\n }\n };\n walk(nodes);\n return map;\n };\n const valueIndexes = results.map((r) => indexTree(r.rowTree));\n\n const walk = (nodes: PivotRowNode[]) => {\n for (const node of nodes) {\n const keyStr = node.key.join(SEP);\n const hasChildren = node.children.length > 0;\n const open = expanded[keyStr] ?? node.depth === 0;\n const cellsByValue = valueIndexes.map(\n (idx) => idx.get(keyStr)?.cells ?? [],\n );\n visibleRows.push({\n keyStr,\n label: node.label,\n depth: node.depth,\n count: node.count,\n hasChildren,\n open,\n cellsByValue,\n });\n if (hasChildren && open) walk(node.children);\n }\n };\n walk(primary.rowTree);\n }\n\n return (\n <div className=\"overflow-auto border border-base-300 rounded-box\">\n <Table className=\"table-sm w-full border-collapse\">\n <Table.Head>\n {/* 列分组标签行(交叉表) */}\n {hasCols && (\n <Table.Row>\n <Table.Cell className=\"bg-base-200 font-semibold text-left align-bottom\">\n {groupLabel}\n </Table.Cell>\n {columns.map((ck, ci) => (\n <Table.Cell\n key={ci}\n colSpan={activeValues.length}\n className=\"bg-base-200 font-semibold text-center\"\n >\n {ck.join(' / ')}\n </Table.Cell>\n ))}\n </Table.Row>\n )}\n {/* 度量表头行 */}\n <Table.Row>\n <Table.Cell className=\"bg-base-200 font-semibold text-left\">\n {hasCols ? '' : groupLabel}\n </Table.Cell>\n {columns.map((_, ci) =>\n activeValues.map((v) => (\n <Table.Cell\n key={`${ci}:${v.field}:${v.aggFn}`}\n className=\"bg-base-200 font-semibold text-right\"\n >\n {aggLabel(v.aggFn)}\n {v.field ? `(${fieldLabel(v.field)})` : ''}\n </Table.Cell>\n )),\n )}\n </Table.Row>\n </Table.Head>\n <Table.Body>\n {treeMode\n ? visibleRows.map((row) => (\n <Table.Row key={row.keyStr}>\n <Table.Cell\n style={{ paddingLeft: row.depth * 16 + 8 }}\n >\n <span\n className=\"inline-flex items-center gap-1\"\n style={{\n cursor: row.hasChildren\n ? 'pointer'\n : 'default',\n }}\n onClick={() =>\n row.hasChildren && toggle(row.keyStr)\n }\n >\n <span\n aria-hidden\n className=\"inline-block w-3 text-xs opacity-60\"\n >\n {row.hasChildren\n ? row.open\n ? '▾'\n : '▸'\n : ''}\n </span>\n <span\n style={{\n fontWeight:\n row.depth === 0 ? 600 : 400,\n }}\n >\n {row.label}\n </span>\n <span className=\"opacity-50\">\n {' '}\n ({row.count.toLocaleString()})\n </span>\n </span>\n </Table.Cell>\n {Array.from({\n length: hasCols ? colCount : 1,\n }).map((_, ci) =>\n row.cellsByValue.map((cells, vi) => (\n <Table.Cell\n key={`${ci}:${vi}`}\n className=\"text-right tabular-nums\"\n >\n {fmt(cells[hasCols ? ci : 0] ?? null)}\n </Table.Cell>\n )),\n )}\n </Table.Row>\n ))\n : rowKeys.map((rk, ri) => (\n <Table.Row key={ri}>\n <Table.Cell>\n {rk.join(' / ')}\n {rowCounts[ri] != null && (\n <span className=\"opacity-50\">\n {' '}\n ({rowCounts[ri].toLocaleString()})\n </span>\n )}\n </Table.Cell>\n {Array.from({\n length: hasCols ? colCount : 1,\n }).map((_, ci) =>\n results.map((res, vi) => (\n <Table.Cell\n key={`${ci}:${vi}`}\n className=\"text-right tabular-nums\"\n >\n {fmt(\n res.matrix[ri]?.[\n hasCols ? ci : 0\n ] ?? null,\n )}\n </Table.Cell>\n )),\n )}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </div>\n );\n}\n\nexport default PivotView;\n"],"mappings":"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"}
1
+ {"version":3,"file":"PivotView.js","names":[],"sources":["../../../../src/components/pro/DataTable/PivotView.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport Table from '../../Table';\nimport {\n computePivot,\n type PivotAggFn,\n type PivotConfig,\n type PivotResult,\n type PivotRowNode,\n} from './pivotEngine';\n\nconst SEP = '\\u0001';\n\n/** 一个数值度量:字段 + 聚合函数。 */\nexport interface PivotValue {\n field: string;\n aggFn: PivotAggFn;\n}\n\n/** 字段的展示标签映射。 */\nexport type PivotFieldLabels = Record<string, string>;\n\nconst AGG_LABELS: Record<PivotAggFn, { zh: string; en: string }> = {\n sum: { zh: '求和', en: 'Sum' },\n avg: { zh: '平均', en: 'Avg' },\n count: { zh: '计数', en: 'Count' },\n min: { zh: '最小', en: 'Min' },\n max: { zh: '最大', en: 'Max' },\n};\n\nfunction fmt(v: number | null): string {\n if (v == null) return '';\n return v.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nexport interface PivotViewProps<T extends object> {\n /** 全量数据(会在其之上进行客户端聚合)。 */\n data: T[];\n /** 行分组字段。 */\n rowFields: string[];\n /** 列分组字段。 */\n colFields: string[];\n /** 数值度量列表。 */\n values: PivotValue[];\n /** 字段展示标签。 */\n fieldLabels?: PivotFieldLabels;\n /** 语言(影响聚合函数文案)。默认 'zh'。 */\n lang?: 'zh' | 'en';\n /** 是否以树形(可展开分组)方式展示多级行分组。默认 true。 */\n treeView?: boolean;\n}\n\n/**\n * ag-grid 风格的透视(Pivot)交叉表视图。支持多级行分组、列分组交叉表、\n * 多个数值度量,以及树形分组的展开/折叠。\n */\nexport function PivotView<T extends object>({\n data,\n rowFields,\n colFields,\n values,\n fieldLabels = {},\n lang = 'zh',\n treeView = true,\n}: PivotViewProps<T>) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const fieldLabel = (f: string) => fieldLabels[f] ?? f;\n const aggLabel = (fn: PivotAggFn) => AGG_LABELS[fn][lang];\n\n // 为每个数值度量分别计算一份透视结果。\n const results: PivotResult[] = useMemo(() => {\n const activeValues = values.length\n ? values\n : [{ field: '', aggFn: 'count' as PivotAggFn }];\n return activeValues.map((v) => {\n const config: PivotConfig = {\n rowFields,\n colFields,\n valueField: v.field,\n aggFn: v.aggFn,\n };\n return computePivot(data, config);\n });\n }, [data, rowFields, colFields, values]);\n\n const primary = results[0];\n if (!primary || rowFields.length === 0) {\n return (\n <div className=\"p-8 text-center opacity-60\">\n {lang === 'zh'\n ? '请至少配置一个行分组字段以启用透视视图。'\n : 'Add at least one row group field to enable the pivot view.'}\n </div>\n );\n }\n\n const activeValues = values.length ? values : [{ field: '', aggFn: 'count' as PivotAggFn }];\n const { rowKeys, colKeys, rowFields: rf } = primary;\n const colCount = colKeys.length;\n const rowCounts = primary.rowCounts;\n const hasCols = primary.colFields.length > 0;\n const treeMode = treeView && rf.length > 1 && primary.rowTree.length > 0;\n\n const groupLabel = rf.map(fieldLabel).join(' / ') || 'Group';\n const columns = hasCols ? colKeys : [[]];\n\n const toggle = (nodeKey: string) =>\n setExpanded((prev) => ({ ...prev, [nodeKey]: !prev[nodeKey] }));\n\n // 树形模式:将树扁平化为可见行(尊重展开状态)。\n interface VisibleRow {\n keyStr: string;\n label: string;\n depth: number;\n count: number;\n hasChildren: boolean;\n open: boolean;\n cellsByValue: (number | null)[][];\n }\n\n const visibleRows: VisibleRow[] = [];\n if (treeMode) {\n const indexTree = (nodes: PivotRowNode[]): Map<string, PivotRowNode> => {\n const map = new Map<string, PivotRowNode>();\n const walk = (ns: PivotRowNode[]) => {\n for (const n of ns) {\n map.set(n.key.join(SEP), n);\n if (n.children.length) walk(n.children);\n }\n };\n walk(nodes);\n return map;\n };\n const valueIndexes = results.map((r) => indexTree(r.rowTree));\n\n const walk = (nodes: PivotRowNode[]) => {\n for (const node of nodes) {\n const keyStr = node.key.join(SEP);\n const hasChildren = node.children.length > 0;\n const open = expanded[keyStr] ?? node.depth === 0;\n const cellsByValue = valueIndexes.map(\n (idx) => idx.get(keyStr)?.cells ?? [],\n );\n visibleRows.push({\n keyStr,\n label: node.label,\n depth: node.depth,\n count: node.count,\n hasChildren,\n open,\n cellsByValue,\n });\n if (hasChildren && open) walk(node.children);\n }\n };\n walk(primary.rowTree);\n }\n\n return (\n <div className=\"overflow-auto border border-base-300 rounded-box\">\n <Table className=\"table-sm w-full border-collapse\">\n <Table.Head>\n {/* 列分组标签行(交叉表) */}\n {hasCols && (\n <Table.Row>\n <Table.Cell className=\"bg-base-200 font-semibold text-left align-bottom\">\n {groupLabel}\n </Table.Cell>\n {columns.map((ck, ci) => (\n <Table.Cell\n key={ci}\n colSpan={activeValues.length}\n className=\"bg-base-200 font-semibold text-center\"\n >\n {ck.join(' / ')}\n </Table.Cell>\n ))}\n </Table.Row>\n )}\n {/* 度量表头行 */}\n <Table.Row>\n <Table.Cell className=\"bg-base-200 font-semibold text-left\">\n {hasCols ? '' : groupLabel}\n </Table.Cell>\n {columns.map((_, ci) =>\n activeValues.map((v) => (\n <Table.Cell\n key={`${ci}:${v.field}:${v.aggFn}`}\n className=\"bg-base-200 font-semibold text-right\"\n >\n {aggLabel(v.aggFn)}\n {v.field ? `(${fieldLabel(v.field)})` : ''}\n </Table.Cell>\n )),\n )}\n </Table.Row>\n </Table.Head>\n <Table.Body>\n {treeMode\n ? visibleRows.map((row) => (\n <Table.Row key={row.keyStr}>\n <Table.Cell\n style={{ paddingLeft: row.depth * 16 + 8 }}\n >\n <span\n className=\"inline-flex items-center gap-1\"\n style={{\n cursor: row.hasChildren\n ? 'pointer'\n : 'default',\n }}\n onClick={() =>\n row.hasChildren && toggle(row.keyStr)\n }\n >\n <span\n aria-hidden\n className=\"inline-block w-3 text-xs opacity-60\"\n >\n {row.hasChildren\n ? row.open\n ? '▾'\n : '▸'\n : ''}\n </span>\n <span\n style={{\n fontWeight:\n row.depth === 0 ? 600 : 400,\n }}\n >\n {row.label}\n </span>\n <span className=\"opacity-50\">\n {' '}\n ({row.count.toLocaleString()})\n </span>\n </span>\n </Table.Cell>\n {Array.from({\n length: hasCols ? colCount : 1,\n }).map((_, ci) =>\n row.cellsByValue.map((cells, vi) => (\n <Table.Cell\n key={`${ci}:${vi}`}\n className=\"text-right tabular-nums\"\n >\n {fmt(cells[hasCols ? ci : 0] ?? null)}\n </Table.Cell>\n )),\n )}\n </Table.Row>\n ))\n : rowKeys.map((rk, ri) => (\n <Table.Row key={ri}>\n <Table.Cell>\n {rk.join(' / ')}\n {rowCounts[ri] != null && (\n <span className=\"opacity-50\">\n {' '}\n ({rowCounts[ri].toLocaleString()})\n </span>\n )}\n </Table.Cell>\n {Array.from({\n length: hasCols ? colCount : 1,\n }).map((_, ci) =>\n results.map((res, vi) => (\n <Table.Cell\n key={`${ci}:${vi}`}\n className=\"text-right tabular-nums\"\n >\n {fmt(\n res.matrix[ri]?.[\n hasCols ? ci : 0\n ] ?? null,\n )}\n </Table.Cell>\n )),\n )}\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n </div>\n );\n}\n\nexport default PivotView;\n"],"mappings":"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"}
@@ -1,46 +1,46 @@
1
- import { useAppContext as u } from "../../../../contexts/AppContext.js";
1
+ import { useAppContext as e } from "../../../../contexts/AppContext.js";
2
2
  import "react";
3
- import { jsx as e, jsxs as s } from "react/jsx-runtime";
4
- function b({ bulkActions: r, rowSelection: o, data: d }) {
5
- const { language: a } = u(), i = (n, t) => a === "zh" ? n : t;
6
- return !r || r.length === 0 ? null : /* @__PURE__ */ e("div", {
7
- className: "flex gap-2",
8
- children: /* @__PURE__ */ s("div", {
9
- className: "dropdown dropdown-end",
10
- children: [/* @__PURE__ */ s("div", {
11
- tabIndex: 0,
12
- role: "button",
13
- className: "btn btn-sm btn-primary",
14
- children: [i("批量操作", "Bulk Actions"), /* @__PURE__ */ e("svg", {
15
- xmlns: "http://www.w3.org/2000/svg",
16
- className: "h-4 w-4 ml-1",
17
- fill: "none",
18
- viewBox: "0 0 24 24",
19
- stroke: "currentColor",
20
- children: /* @__PURE__ */ e("path", {
21
- strokeLinecap: "round",
22
- strokeLinejoin: "round",
23
- strokeWidth: "2",
24
- d: "M19 9l-7 7-7-7"
25
- })
26
- })]
27
- }), /* @__PURE__ */ e("ul", {
28
- tabIndex: 0,
29
- className: "dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52",
30
- children: r.map((n, t) => /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e("a", {
31
- onClick: () => {
32
- const c = Object.keys(o).map((m) => d.find((l, p) => (l.id !== void 0 ? l.id.toString() : p.toString()) === m)).filter(Boolean);
33
- n.onClick(o, c);
34
- },
35
- className: n.className,
36
- children: n.label
37
- }) }, t))
38
- })]
39
- })
40
- });
3
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
+ //#region src/components/pro/DataTable/components/BulkActions.tsx
5
+ function r({ bulkActions: r, rowSelection: i, data: a }) {
6
+ let { language: o } = e();
7
+ return !r || r.length === 0 ? null : /* @__PURE__ */ t("div", {
8
+ className: "flex gap-2",
9
+ children: /* @__PURE__ */ n("div", {
10
+ className: "dropdown dropdown-end",
11
+ children: [/* @__PURE__ */ n("div", {
12
+ tabIndex: 0,
13
+ role: "button",
14
+ className: "btn btn-sm btn-primary",
15
+ children: [((e, t) => o === "zh" ? e : t)("批量操作", "Bulk Actions"), /* @__PURE__ */ t("svg", {
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ className: "h-4 w-4 ml-1",
18
+ fill: "none",
19
+ viewBox: "0 0 24 24",
20
+ stroke: "currentColor",
21
+ children: /* @__PURE__ */ t("path", {
22
+ strokeLinecap: "round",
23
+ strokeLinejoin: "round",
24
+ strokeWidth: "2",
25
+ d: "M19 9l-7 7-7-7"
26
+ })
27
+ })]
28
+ }), /* @__PURE__ */ t("ul", {
29
+ tabIndex: 0,
30
+ className: "dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52",
31
+ children: r.map((e, n) => /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t("a", {
32
+ onClick: () => {
33
+ let t = Object.keys(i).map((e) => a.find((t, n) => (t.id === void 0 ? n.toString() : t.id.toString()) === e)).filter(Boolean);
34
+ e.onClick(i, t);
35
+ },
36
+ className: e.className,
37
+ children: e.label
38
+ }) }, n))
39
+ })]
40
+ })
41
+ });
41
42
  }
42
- export {
43
- b as BulkActions
44
- };
43
+ //#endregion
44
+ export { r as BulkActions };
45
45
 
46
46
  //# sourceMappingURL=BulkActions.js.map