dishui 0.0.108 → 0.0.110

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 (384) hide show
  1. package/dist/.release-verified.json +3 -2
  2. package/dist/components/Accordion/index.js.map +1 -1
  3. package/dist/components/Avatar/index.js.map +1 -1
  4. package/dist/components/Badge/index.js.map +1 -1
  5. package/dist/components/Button/index.js.map +1 -1
  6. package/dist/components/ButtonMenu/index.js.map +1 -1
  7. package/dist/components/Card/Metric2.js.map +1 -1
  8. package/dist/components/Card/Ticket2.js.map +1 -1
  9. package/dist/components/Card/index.js.map +1 -1
  10. package/dist/components/Chart/Chart.js.map +1 -1
  11. package/dist/components/Checkbox/index.js.map +1 -1
  12. package/dist/components/ChoicePicker/index.js.map +1 -1
  13. package/dist/components/Column/index.js.map +1 -1
  14. package/dist/components/ConfirmDialog/index.js.map +1 -1
  15. package/dist/components/DateTimeInput/index.js.map +1 -1
  16. package/dist/components/Demo/index.js.map +1 -1
  17. package/dist/components/Demo/source.js.map +1 -1
  18. package/dist/components/Divider/index.js.map +1 -1
  19. package/dist/components/EmptyState/index.js.map +1 -1
  20. package/dist/components/Field/index.js.map +1 -1
  21. package/dist/components/FileUploader/DropZone.js.map +1 -1
  22. package/dist/components/FileUploader/FileItem.js.map +1 -1
  23. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  24. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  25. package/dist/components/GroupButton/index.js.map +1 -1
  26. package/dist/components/GroupedTable/index.js.map +1 -1
  27. package/dist/components/Icon/index.js.map +1 -1
  28. package/dist/components/Image/index.js.map +1 -1
  29. package/dist/components/Input/index.js.map +1 -1
  30. package/dist/components/Label/index.js.map +1 -1
  31. package/dist/components/Layout/index.js.map +1 -1
  32. package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
  33. package/dist/components/LayoutSuite/index.js.map +1 -1
  34. package/dist/components/List/index.js.map +1 -1
  35. package/dist/components/Markdown/Markdown.js.map +1 -1
  36. package/dist/components/Markdown/codeThemes.js.map +1 -1
  37. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  38. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  39. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  40. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  41. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  42. package/dist/components/Modal/focusScope.js.map +1 -1
  43. package/dist/components/Modal/index.js.map +1 -1
  44. package/dist/components/MultipleChoice/index.js.map +1 -1
  45. package/dist/components/NavigationList/index.js.map +1 -1
  46. package/dist/components/Page/Float2.js.map +1 -1
  47. package/dist/components/Page/index.js.map +1 -1
  48. package/dist/components/Page/resize2.js.map +1 -1
  49. package/dist/components/PageHeader/index.js.map +1 -1
  50. package/dist/components/PagePanel/index.js.map +1 -1
  51. package/dist/components/ProtectedRoute/index.js.map +1 -1
  52. package/dist/components/Resizable/ResizeGrip.js.map +1 -1
  53. package/dist/components/Resizable/index.js.map +1 -1
  54. package/dist/components/Resizable/useResize.js.map +1 -1
  55. package/dist/components/Row/index.js.map +1 -1
  56. package/dist/components/Section/index.js.map +1 -1
  57. package/dist/components/Select/index.js.map +1 -1
  58. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  59. package/dist/components/Skeleton/index.js.map +1 -1
  60. package/dist/components/Slider/index.js.map +1 -1
  61. package/dist/components/Switch/index.js.map +1 -1
  62. package/dist/components/Tab/index.js.map +1 -1
  63. package/dist/components/Table/index.js.map +1 -1
  64. package/dist/components/Tabs/index.js.map +1 -1
  65. package/dist/components/Tabs/tabNavigation.js.map +1 -1
  66. package/dist/components/Text/index.js.map +1 -1
  67. package/dist/components/Textarea/index.js.map +1 -1
  68. package/dist/components/Tooltip/index.js.map +1 -1
  69. package/dist/components/Tree/Tree.js.map +1 -1
  70. package/dist/components/ai/AgentChat/index.js.map +1 -1
  71. package/dist/components/ai/AgentRunCard/index.js.map +1 -1
  72. package/dist/components/ai/AgentScreen/index.js.map +1 -1
  73. package/dist/components/ai/ApprovalCard/index.js.map +1 -1
  74. package/dist/components/ai/CodeView/index.js.map +1 -1
  75. package/dist/components/ai/CommandSearch/index.js.map +1 -1
  76. package/dist/components/ai/ContextCards/index.js.map +1 -1
  77. package/dist/components/ai/DiffTable/index.js.map +1 -1
  78. package/dist/components/ai/FilterTable/index.js.map +1 -1
  79. package/dist/components/ai/FineTuneCard/index.js.map +1 -1
  80. package/dist/components/ai/InsightCards/index.js.map +1 -1
  81. package/dist/components/ai/IssueCard/index.js.map +1 -1
  82. package/dist/components/ai/LoadingState/index.js.map +1 -1
  83. package/dist/components/ai/PromptBar/index.js.map +1 -1
  84. package/dist/components/ai/RecommendationCard/index.js.map +1 -1
  85. package/dist/components/ai/RecordsTable/index.js.map +1 -1
  86. package/dist/components/ai/SelectionActions/index.js.map +1 -1
  87. package/dist/components/ai/StateFlow/index.js.map +1 -1
  88. package/dist/components/ai/StreamingText/index.js.map +1 -1
  89. package/dist/components/ai/TaskRows/index.js.map +1 -1
  90. package/dist/components/ai/Thinking/index.js.map +1 -1
  91. package/dist/components/ai/ToolChips/index.js.map +1 -1
  92. package/dist/components/ai/shared.js.map +1 -1
  93. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  94. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  95. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  96. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  97. package/dist/components/pro/Calendar/Calendar.js +165 -160
  98. package/dist/components/pro/Calendar/Calendar.js.map +1 -1
  99. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
  100. package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
  101. package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
  102. package/dist/components/pro/Calendar/utils.js.map +1 -1
  103. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  104. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  105. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  106. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  107. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  108. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  109. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  110. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  111. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  112. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  113. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
  114. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  115. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  116. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  117. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  118. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  119. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  120. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  121. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  122. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  123. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  124. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  125. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  126. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  127. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  128. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  129. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  130. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  131. package/dist/components/pro/DataTable/extension.js.map +1 -1
  132. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  133. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  134. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  135. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  136. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  137. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  138. package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
  139. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
  140. package/dist/components/pro/DataTable/utils.js.map +1 -1
  141. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  142. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  143. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  144. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  145. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  146. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  147. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  148. package/dist/components/pro/Flow/Flow.js.map +1 -1
  149. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  150. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  151. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  152. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  153. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  154. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  155. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  156. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  157. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  158. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  159. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  160. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  161. package/dist/components/pro/Flow/constants.js.map +1 -1
  162. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  163. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  164. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  165. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  166. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  167. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  168. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  169. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  170. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  171. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  172. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  173. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  174. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  175. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  176. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  177. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  178. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  179. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  180. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  181. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  182. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  183. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  184. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  185. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  186. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  187. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  188. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  189. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  190. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  191. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  192. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  193. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  194. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  195. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  196. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  197. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  198. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  199. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
  200. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  201. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
  202. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  203. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  204. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  205. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  206. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  207. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  208. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  209. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  210. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  211. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  212. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  213. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  214. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  215. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  216. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  217. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  218. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  219. package/dist/components/pro/Flow/types.js.map +1 -1
  220. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  221. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  222. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  223. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  224. package/dist/components/pro/Gantt/Gantt.js.map +1 -1
  225. package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
  226. package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
  227. package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
  228. package/dist/components/pro/Gantt/utils.js.map +1 -1
  229. package/dist/components/pro/Kanban/Kanban.js.map +1 -1
  230. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
  231. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
  232. package/dist/components/pro/Kanban/utils.js.map +1 -1
  233. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  234. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  235. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  243. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  258. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  259. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  260. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  261. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  262. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  263. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  264. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  265. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  266. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  267. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  268. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  269. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  270. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  271. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  272. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  273. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  274. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  275. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  276. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  277. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  278. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  279. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  280. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  281. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  282. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  283. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  284. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  285. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  286. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  287. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  288. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  289. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  290. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  291. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  292. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  293. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  294. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  295. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  296. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  297. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  298. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  299. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  300. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  301. package/dist/components/pro/Sprite/actions.js +16 -0
  302. package/dist/components/pro/Sprite/actions.js.map +1 -0
  303. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  304. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  305. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  306. package/dist/components/pro/Sprite/index.d.ts +4 -0
  307. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  308. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  309. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  310. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  311. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  312. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  313. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  314. package/dist/components/pro/Sprite/shared/events.js +21 -0
  315. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  316. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  317. package/dist/components/pro/Sprite/shared/face.js +33 -0
  318. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  319. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  320. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  321. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  322. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  323. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  324. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  325. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  326. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  327. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  328. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  329. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  330. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  331. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  332. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  333. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  334. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  335. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  336. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  337. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  338. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  339. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  340. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  341. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  342. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  343. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  344. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  345. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  346. package/dist/components/pro/Sprite/types.d.ts +40 -0
  347. package/dist/contexts/AppContext.js.map +1 -1
  348. package/dist/contexts/authentication.js.map +1 -1
  349. package/dist/data-table.js +3 -3
  350. package/dist/data-table.js.map +1 -1
  351. package/dist/dishui.css +1 -1
  352. package/dist/hooks/useClickOutside.js.map +1 -1
  353. package/dist/hooks/useContainerElement.js.map +1 -1
  354. package/dist/hooks/useControllableState.js.map +1 -1
  355. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  356. package/dist/hooks/useDebounce.js.map +1 -1
  357. package/dist/hooks/useDraggable.js.map +1 -1
  358. package/dist/hooks/useTableColumns.js.map +1 -1
  359. package/dist/hooks/useTableData.js.map +1 -1
  360. package/dist/index-nostyled.d.ts +2 -0
  361. package/dist/index.d.ts +2 -0
  362. package/dist/index.js +116 -115
  363. package/dist/layouts/MainLayout.js.map +1 -1
  364. package/dist/layouts/Navbar.js.map +1 -1
  365. package/dist/layouts/Sidebar.js.map +1 -1
  366. package/dist/layouts/headbar/Headbar.js.map +1 -1
  367. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  368. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  369. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  370. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  371. package/dist/sprite.js +2 -0
  372. package/dist/styles/themeStyles.js.map +1 -1
  373. package/dist/utils/cn.js.map +1 -1
  374. package/dist/utils/flexLayout.js.map +1 -1
  375. package/dist/utils/i18n.js.map +1 -1
  376. package/dist/utils/menu.js.map +1 -1
  377. package/dist/utils/rehype-code-meta.js.map +1 -1
  378. package/dist/utils/remark-code-meta.js.map +1 -1
  379. package/dist/utils/routerBuilder.js.map +1 -1
  380. package/dist/utils/safeStorage.js.map +1 -1
  381. package/dist/utils/selection.js +29 -20
  382. package/dist/utils/selection.js.map +1 -1
  383. package/dist/utils/themes.js.map +1 -1
  384. package/package.json +15 -11
@@ -1 +1 @@
1
- {"version":3,"file":"BulkActions.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/BulkActions.tsx"],"sourcesContent":["import React from 'react';\nimport { RowSelectionState } from '../tanstack-table';\nimport { BulkAction } from '../types';\nimport { useAppContext } from '../../../../contexts/AppContext';\n\ninterface BulkActionsProps<T extends object> {\n bulkActions: BulkAction[];\n rowSelection: RowSelectionState;\n data: T[];\n}\n\nexport function BulkActions<T extends object>({\n bulkActions,\n rowSelection,\n data,\n}: BulkActionsProps<T>) {\n const { language } = useAppContext();\n\n const getLocalizedText = (zhText: string, enText: string) => {\n return language === 'zh' ? zhText : enText;\n };\n\n if (!bulkActions || bulkActions.length === 0) return null;\n\n return (\n <div className=\"flex gap-2\">\n <div className=\"dropdown dropdown-end\">\n <div tabIndex={0} role=\"button\" className=\"btn btn-sm btn-primary\">\n {getLocalizedText('批量操作', 'Bulk Actions')}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 ml-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <ul tabIndex={0} className=\"dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52\">\n {bulkActions.map((action, index) => (\n <li key={index}>\n <a\n onClick={() => {\n const selectedRowIds = Object.keys(rowSelection);\n const selectedRowData = selectedRowIds.map(id => {\n const rowData = data.find((row, idx) => {\n const rowId = (row as any).id !== undefined ? (row as any).id.toString() : idx.toString();\n return rowId === id;\n });\n return rowData;\n }).filter(Boolean);\n\n action.onClick(rowSelection, selectedRowData);\n }}\n className={action.className}\n >\n {action.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AAWA,SAAgB,EAA8B,EAC1C,gBACA,iBACA,WACoB;CACpB,IAAM,EAAE,gBAAa,EAAc;CAQnC,OAFI,CAAC,KAAe,EAAY,WAAW,IAAU,OAGjD,kBAAC,OAAD;EAAK,WAAU;EACX,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,kBAAC,OAAD;IAAK,UAAU;IAAG,MAAK;IAAS,WAAU;IAA1C,UAAA,GATc,GAAgB,MAC/B,MAAa,OAAO,IAAS,EASvB,CAAiB,QAAQ,cAAc,GACxC,kBAAC,OAAD;KACI,OAAM;KACN,WAAU;KACV,MAAK;KACL,SAAQ;KACR,QAAO;KAEP,UAAA,kBAAC,QAAD;MAAM,eAAc;MAAQ,gBAAe;MAAQ,aAAY;MAAI,GAAE;KAAkB,CAAA;IACtF,CAAA,CACJ;GACL,CAAA,GAAA,kBAAC,MAAD;IAAI,UAAU;IAAG,WAAU;IACtB,UAAA,EAAY,KAAK,GAAQ,MACtB,kBAAC,MAAD,EAAA,UACI,kBAAC,KAAD;KACI,eAAe;MAEX,IAAM,IADiB,OAAO,KAAK,CACX,CAAA,CAAe,KAAI,MACvB,EAAK,MAAM,GAAK,OACb,EAAY,OAAO,KAAA,IAAyC,EAAI,SAAS,IAAzC,EAAY,GAAG,SAAS,OACtD,CAEd,CACV,CAAC,CAAC,OAAO,OAAO;MAEjB,EAAO,QAAQ,GAAc,CAAe;KAChD;KACA,WAAW,EAAO;KAEjB,UAAA,EAAO;IACT,CAAA,EACH,GAlBK,CAkBL,CACP;GACD,CAAA,CACH;;CACJ,CAAA;AAEb"}
1
+ {"version":3,"file":"BulkActions.js","names":["BulkActions","useAppContext","bulkActions","language","zhText","enText","selectedRowData","rowSelection","data","row","idx","id","action","index"],"sources":["../../../../../src/components/pro/DataTable/components/BulkActions.tsx"],"sourcesContent":["import React from 'react';\nimport { RowSelectionState } from '../tanstack-table';\nimport { BulkAction } from '../types';\nimport { useAppContext } from '../../../../contexts/AppContext';\n\ninterface BulkActionsProps<T extends object> {\n bulkActions: BulkAction[];\n rowSelection: RowSelectionState;\n data: T[];\n}\n\nexport function BulkActions<T extends object>({\n bulkActions,\n rowSelection,\n data,\n}: BulkActionsProps<T>) {\n const { language } = useAppContext();\n\n const getLocalizedText = (zhText: string, enText: string) => {\n return language === 'zh' ? zhText : enText;\n };\n\n if (!bulkActions || bulkActions.length === 0) return null;\n\n return (\n <div className=\"flex gap-2\">\n <div className=\"dropdown dropdown-end\">\n <div tabIndex={0} role=\"button\" className=\"btn btn-sm btn-primary\">\n {getLocalizedText('批量操作', 'Bulk Actions')}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 ml-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <ul tabIndex={0} className=\"dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52\">\n {bulkActions.map((action, index) => (\n <li key={index}>\n <a\n onClick={() => {\n const selectedRowIds = Object.keys(rowSelection);\n const selectedRowData = selectedRowIds.map(id => {\n const rowData = data.find((row, idx) => {\n const rowId = (row as any).id !== undefined ? (row as any).id.toString() : idx.toString();\n return rowId === id;\n });\n return rowData;\n }).filter(Boolean);\n\n action.onClick(rowSelection, selectedRowData);\n }}\n className={action.className}\n >\n {action.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AAWA,SAAgBA,EAA8B,EAC1C,gBACA,iBACA,WACoB;CACpB,IAAM,EAAE,gBAAaC,EAAc;CAQnC,OAFI,CAACC,KAAeA,EAAY,WAAW,IAAU,OAGjD,kBAAC,OAAD;EAAK,WAAU;EACX,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,kBAAC,OAAD;IAAK,UAAU;IAAG,MAAK;IAAS,WAAU;IAA1C,UAAA,GATc,GAAgB,MAC/BC,MAAa,OAAOC,IAASC,EASvB,CAAiB,QAAQ,cAAc,GACxC,kBAAC,OAAD;KACI,OAAM;KACN,WAAU;KACV,MAAK;KACL,SAAQ;KACR,QAAO;KAEP,UAAA,kBAAC,QAAD;MAAM,eAAc;MAAQ,gBAAe;MAAQ,aAAY;MAAI,GAAE;KAAkB,CAAA;IACtF,CAAA,CACJ;GACL,CAAA,GAAA,kBAAC,MAAD;IAAI,UAAU;IAAG,WAAU;IACtB,UAAAH,EAAY,KAAK,GAAQ,MACtB,kBAAC,MAAD,EAAA,UACI,kBAAC,KAAD;KACI,eAAe;MAEX,IAAMI,IADiB,OAAO,KAAKC,CACX,CAAA,CAAe,KAAI,MACvBC,EAAK,MAAM,GAAK,OACbC,EAAY,OAAO,KAAA,IAAyCC,EAAI,SAAS,IAAzCD,EAAY,GAAG,SAAS,OACtDE,CAEd,CACV,CAAC,CAAC,OAAO,OAAO;MAEjB,EAAO,QAAQJ,GAAcD,CAAe;KAChD;KACA,WAAWM,EAAO;KAEjB,UAAAA,EAAO;IACT,CAAA,EACH,GAlBKC,CAkBL,CACP;GACD,CAAA,CACH;;CACJ,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnSelector.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/ColumnSelector.tsx"],"sourcesContent":["import React from 'react';\nimport { Table, VisibilityState } from '../tanstack-table';\nimport { useAppContext } from '../../../../contexts/AppContext';\n\ninterface ColumnSelectorProps<T extends object> {\n table: Table<T>;\n columns: any[];\n columnOrderState: string[];\n visibilityState: VisibilityState;\n toggleColumnVisibility: (columnId: string) => void;\n enableColumnReordering: boolean;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n draggedColumnId: string | null;\n}\n\nexport function ColumnSelector<T extends object>({\n columns,\n columnOrderState,\n visibilityState,\n toggleColumnVisibility,\n enableColumnReordering,\n handleDragStart,\n handleDrop,\n draggedColumnId,\n}: ColumnSelectorProps<T>) {\n const { language } = useAppContext();\n\n const getLocalizedText = (zhText: string, enText: string) => {\n return language === 'zh' ? zhText : enText;\n };\n\n return (\n <div className=\"dropdown\">\n <div tabIndex={0} role=\"button\" className=\"btn btn-sm\">\n {getLocalizedText('列控制', 'Column Control')}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 ml-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <ul tabIndex={0} className=\"dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52\">\n {(() => {\n const validColumnIds = columns\n .map(col => 'accessorKey' in col ? col.accessorKey as string : col.id as string)\n .filter(id => id !== 'selection');\n\n const fullOrderedColumnIds = [\n ...columnOrderState.filter(id => validColumnIds.includes(id)),\n ...validColumnIds.filter(id => !columnOrderState.includes(id))\n ];\n\n return fullOrderedColumnIds.map(columnId => {\n const column = columns.find(col =>\n ('accessorKey' in col && col.accessorKey === columnId) ||\n ('id' in col && col.id === columnId)\n );\n\n if (!column) return null;\n\n const headerText = typeof column.header === 'string'\n ? column.header\n : columnId;\n\n const isDragging = draggedColumnId === columnId;\n\n return (\n <li key={columnId}>\n <a\n className={`flex items-center justify-between py-2 px-2 ${isDragging ? 'bg-primary/30 shadow-md border-l-4 border-primary' : ''\n }`}\n onClick={() => toggleColumnVisibility(columnId)}\n draggable={enableColumnReordering}\n onDragStart={(e) => {\n handleDragStart(e, columnId);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n document.querySelectorAll('.menu-item-highlight').forEach(el => {\n if (el !== e.currentTarget) {\n el.classList.remove('menu-item-highlight');\n el.classList.remove('bg-primary/10');\n el.classList.remove('border-l-4');\n el.classList.remove('border-primary');\n }\n });\n\n e.currentTarget.classList.add('menu-item-highlight');\n e.currentTarget.classList.add('bg-primary/10');\n e.currentTarget.classList.add('border-l-4');\n e.currentTarget.classList.add('border-primary');\n }}\n onDragLeave={(e) => {\n e.currentTarget.classList.remove('menu-item-highlight');\n e.currentTarget.classList.remove('bg-primary/10');\n e.currentTarget.classList.remove('border-l-4');\n e.currentTarget.classList.remove('border-primary');\n }}\n onDrop={(e) => {\n e.currentTarget.classList.remove('menu-item-highlight');\n e.currentTarget.classList.remove('bg-primary/10');\n e.currentTarget.classList.remove('border-l-4');\n e.currentTarget.classList.remove('border-primary');\n\n handleDrop(e, columnId);\n\n document.querySelectorAll('.dragging-source, .menu-item-highlight').forEach(el => {\n el.classList.remove('dragging-source');\n el.classList.remove('menu-item-highlight');\n });\n }}\n >\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={visibilityState[columnId] !== false}\n onChange={(e) => {\n e.stopPropagation();\n toggleColumnVisibility(columnId);\n }}\n onClick={(e) => e.stopPropagation()}\n />\n <span>{headerText}</span>\n </div>\n\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-4 w-4 cursor-grab active:cursor-grabbing`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n </a>\n </li>\n );\n });\n })()}\n </ul>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ColumnSelector.js","names":["ColumnSelector","useAppContext","language","zhText","enText","validColumnIds","columns","col","id","columnOrderState","column","columnId","headerText","draggedColumnId","toggleColumnVisibility","enableColumnReordering","e","el","handleDrop","visibilityState"],"sources":["../../../../../src/components/pro/DataTable/components/ColumnSelector.tsx"],"sourcesContent":["import React from 'react';\nimport { Table, VisibilityState } from '../tanstack-table';\nimport { useAppContext } from '../../../../contexts/AppContext';\n\ninterface ColumnSelectorProps<T extends object> {\n table: Table<T>;\n columns: any[];\n columnOrderState: string[];\n visibilityState: VisibilityState;\n toggleColumnVisibility: (columnId: string) => void;\n enableColumnReordering: boolean;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n draggedColumnId: string | null;\n}\n\nexport function ColumnSelector<T extends object>({\n columns,\n columnOrderState,\n visibilityState,\n toggleColumnVisibility,\n enableColumnReordering,\n handleDragStart,\n handleDrop,\n draggedColumnId,\n}: ColumnSelectorProps<T>) {\n const { language } = useAppContext();\n\n const getLocalizedText = (zhText: string, enText: string) => {\n return language === 'zh' ? zhText : enText;\n };\n\n return (\n <div className=\"dropdown\">\n <div tabIndex={0} role=\"button\" className=\"btn btn-sm\">\n {getLocalizedText('列控制', 'Column Control')}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 ml-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <ul tabIndex={0} className=\"dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52\">\n {(() => {\n const validColumnIds = columns\n .map(col => 'accessorKey' in col ? col.accessorKey as string : col.id as string)\n .filter(id => id !== 'selection');\n\n const fullOrderedColumnIds = [\n ...columnOrderState.filter(id => validColumnIds.includes(id)),\n ...validColumnIds.filter(id => !columnOrderState.includes(id))\n ];\n\n return fullOrderedColumnIds.map(columnId => {\n const column = columns.find(col =>\n ('accessorKey' in col && col.accessorKey === columnId) ||\n ('id' in col && col.id === columnId)\n );\n\n if (!column) return null;\n\n const headerText = typeof column.header === 'string'\n ? column.header\n : columnId;\n\n const isDragging = draggedColumnId === columnId;\n\n return (\n <li key={columnId}>\n <a\n className={`flex items-center justify-between py-2 px-2 ${isDragging ? 'bg-primary/30 shadow-md border-l-4 border-primary' : ''\n }`}\n onClick={() => toggleColumnVisibility(columnId)}\n draggable={enableColumnReordering}\n onDragStart={(e) => {\n handleDragStart(e, columnId);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n document.querySelectorAll('.menu-item-highlight').forEach(el => {\n if (el !== e.currentTarget) {\n el.classList.remove('menu-item-highlight');\n el.classList.remove('bg-primary/10');\n el.classList.remove('border-l-4');\n el.classList.remove('border-primary');\n }\n });\n\n e.currentTarget.classList.add('menu-item-highlight');\n e.currentTarget.classList.add('bg-primary/10');\n e.currentTarget.classList.add('border-l-4');\n e.currentTarget.classList.add('border-primary');\n }}\n onDragLeave={(e) => {\n e.currentTarget.classList.remove('menu-item-highlight');\n e.currentTarget.classList.remove('bg-primary/10');\n e.currentTarget.classList.remove('border-l-4');\n e.currentTarget.classList.remove('border-primary');\n }}\n onDrop={(e) => {\n e.currentTarget.classList.remove('menu-item-highlight');\n e.currentTarget.classList.remove('bg-primary/10');\n e.currentTarget.classList.remove('border-l-4');\n e.currentTarget.classList.remove('border-primary');\n\n handleDrop(e, columnId);\n\n document.querySelectorAll('.dragging-source, .menu-item-highlight').forEach(el => {\n el.classList.remove('dragging-source');\n el.classList.remove('menu-item-highlight');\n });\n }}\n >\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n className=\"checkbox checkbox-sm\"\n checked={visibilityState[columnId] !== false}\n onChange={(e) => {\n e.stopPropagation();\n toggleColumnVisibility(columnId);\n }}\n onClick={(e) => e.stopPropagation()}\n />\n <span>{headerText}</span>\n </div>\n\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`h-4 w-4 cursor-grab active:cursor-grabbing`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n </a>\n </li>\n );\n });\n })()}\n </ul>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/FilterBar.tsx"],"sourcesContent":["import React from 'react';\nimport { Table } from '../tanstack-table';\nimport { FilterConfig, CustomFilterPanelProps } from '../types';\nimport { useAppContext } from '../../../../contexts/AppContext';\nimport { FilterPanel } from '../Filters';\n\ninterface FilterBarProps<T extends object> {\n table: Table<T>;\n columns: any[];\n activeFilter: string | null;\n setActiveFilter: (filter: string | null) => void;\n customFilterPanel?: React.ComponentType<CustomFilterPanelProps>;\n filterConfig?: FilterConfig;\n}\n\nexport function FilterBar<T extends object>({\n table,\n columns,\n activeFilter,\n setActiveFilter,\n customFilterPanel,\n filterConfig,\n}: FilterBarProps<T>) {\n const { language } = useAppContext();\n\n const getLocalizedText = (zhText: string, enText: string) => {\n return language === 'zh' ? zhText : enText;\n };\n\n const renderColumnFilter = (columnId: string) => {\n const column = columns.find(col =>\n ('accessorKey' in col && col.accessorKey === columnId) ||\n ('id' in col && col.id === columnId)\n );\n\n if (!column) return null;\n\n const isActive = activeFilter === columnId;\n const filterType = column.meta?.filterType;\n\n if (!filterType) return null;\n\n const tableColumn = table.getColumn(columnId);\n if (!tableColumn) return null;\n\n const columnHeader = typeof column.header === 'string' ? column.header : columnId;\n\n return (\n <div className=\"relative\">\n <button\n className={`btn btn-sm ${isActive ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setActiveFilter(isActive ? null : columnId)}\n >\n {columnHeader}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 ml-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\" />\n </svg>\n </button>\n\n {isActive && (\n <div className=\"absolute mt-2 z-[100]\">\n {React.createElement(customFilterPanel || FilterPanel, {\n column: tableColumn as any,\n onClose: () => setActiveFilter(null)\n })}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"flex gap-2 flex-wrap items-center\">\n {columns.map(column => {\n const columnId = 'accessorKey' in column ? column.accessorKey as string : column.id as string;\n if (column.meta?.filterType) {\n return <React.Fragment key={columnId}>{renderColumnFilter(columnId)}</React.Fragment>;\n }\n return null;\n })}\n\n {filterConfig?.showClearAll && (\n <button\n className=\"btn btn-sm btn-ghost text-error\"\n onClick={() => table.resetColumnFilters()}\n >\n {getLocalizedText('清除所有', 'Clear All')}\n </button>\n )}\n\n {filterConfig?.customFilters}\n </div>\n );\n}\n"],"mappings":";;;;;AAeA,SAAgB,EAA4B,EACxC,UACA,YACA,iBACA,oBACA,sBACA,mBACkB;CAClB,IAAM,EAAE,gBAAa,EAAc,GAE7B,KAAoB,GAAgB,MAC/B,MAAa,OAAO,IAAS,GAGlC,KAAsB,MAAqB;EAC7C,IAAM,IAAS,EAAQ,MAAK,MACvB,iBAAiB,KAAO,EAAI,gBAAgB,KAC5C,QAAQ,KAAO,EAAI,OAAO,CAC/B;EAEA,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAM,IAAW,MAAiB;EAGlC,IAAI,CAFe,EAAO,MAAM,YAEf,OAAO;EAExB,IAAM,IAAc,EAAM,UAAU,CAAQ;EAC5C,IAAI,CAAC,GAAa,OAAO;EAEzB,IAAM,IAAe,OAAO,EAAO,UAAW,WAAW,EAAO,SAAS;EAEzE,OACI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,kBAAC,UAAD;IACI,WAAW,cAAc,IAAW,gBAAgB;IACpD,eAAe,EAAgB,IAAW,OAAO,CAAQ;IAF7D,UAAA,CAIK,GACD,kBAAC,OAAD;KACI,OAAM;KACN,WAAU;KACV,MAAK;KACL,SAAQ;KACR,QAAO;KAEP,UAAA,kBAAC,QAAD;MAAM,eAAc;MAAQ,gBAAe;MAAQ,aAAY;MAAI,GAAE;KAA2J,CAAA;IAC/N,CAAA,CACD;GAEP,CAAA,GAAA,KACG,kBAAC,OAAD;IAAK,WAAU;IACV,UAAA,EAAM,cAAc,KAAqB,GAAa;KACnD,QAAQ;KACR,eAAe,EAAgB,IAAI;IACvC,CAAC;GACA,CAAA,CAER;;CAEb;CAEA,OACI,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACK,EAAQ,KAAI,MAAU;IACnB,IAAM,IAAW,iBAAiB,IAAS,EAAO,cAAwB,EAAO;IAIjF,OAHI,EAAO,MAAM,aACN,kBAAC,EAAM,UAAP,EAAA,UAAgC,EAAmB,CAAQ,EAAkB,GAAxD,CAAwD,IAEjF;GACX,CAAC;GAEA,GAAc,gBACX,kBAAC,UAAD;IACI,WAAU;IACV,eAAe,EAAM,mBAAmB;IAEvC,UAAA,EAAiB,QAAQ,WAAW;GACjC,CAAA;GAGX,GAAc;EACd;;AAEb"}
1
+ {"version":3,"file":"FilterBar.js","names":["React","FilterBar","useAppContext","getLocalizedText","language","zhText","enText","renderColumnFilter","column","columns","col","columnId","isActive","activeFilter","tableColumn","table","columnHeader","setActiveFilter","customFilterPanel","FilterPanel","filterConfig"],"sources":["../../../../../src/components/pro/DataTable/components/FilterBar.tsx"],"sourcesContent":["import React from 'react';\nimport { Table } from '../tanstack-table';\nimport { FilterConfig, CustomFilterPanelProps } from '../types';\nimport { useAppContext } from '../../../../contexts/AppContext';\nimport { FilterPanel } from '../Filters';\n\ninterface FilterBarProps<T extends object> {\n table: Table<T>;\n columns: any[];\n activeFilter: string | null;\n setActiveFilter: (filter: string | null) => void;\n customFilterPanel?: React.ComponentType<CustomFilterPanelProps>;\n filterConfig?: FilterConfig;\n}\n\nexport function FilterBar<T extends object>({\n table,\n columns,\n activeFilter,\n setActiveFilter,\n customFilterPanel,\n filterConfig,\n}: FilterBarProps<T>) {\n const { language } = useAppContext();\n\n const getLocalizedText = (zhText: string, enText: string) => {\n return language === 'zh' ? zhText : enText;\n };\n\n const renderColumnFilter = (columnId: string) => {\n const column = columns.find(col =>\n ('accessorKey' in col && col.accessorKey === columnId) ||\n ('id' in col && col.id === columnId)\n );\n\n if (!column) return null;\n\n const isActive = activeFilter === columnId;\n const filterType = column.meta?.filterType;\n\n if (!filterType) return null;\n\n const tableColumn = table.getColumn(columnId);\n if (!tableColumn) return null;\n\n const columnHeader = typeof column.header === 'string' ? column.header : columnId;\n\n return (\n <div className=\"relative\">\n <button\n className={`btn btn-sm ${isActive ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setActiveFilter(isActive ? null : columnId)}\n >\n {columnHeader}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 ml-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\" />\n </svg>\n </button>\n\n {isActive && (\n <div className=\"absolute mt-2 z-[100]\">\n {React.createElement(customFilterPanel || FilterPanel, {\n column: tableColumn as any,\n onClose: () => setActiveFilter(null)\n })}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className=\"flex gap-2 flex-wrap items-center\">\n {columns.map(column => {\n const columnId = 'accessorKey' in column ? column.accessorKey as string : column.id as string;\n if (column.meta?.filterType) {\n return <React.Fragment key={columnId}>{renderColumnFilter(columnId)}</React.Fragment>;\n }\n return null;\n })}\n\n {filterConfig?.showClearAll && (\n <button\n className=\"btn btn-sm btn-ghost text-error\"\n onClick={() => table.resetColumnFilters()}\n >\n {getLocalizedText('清除所有', 'Clear All')}\n </button>\n )}\n\n {filterConfig?.customFilters}\n </div>\n );\n}\n"],"mappings":";;;;;AAeA,SAAgBC,EAA4B,EACxC,UACA,YACA,iBACA,oBACA,sBACA,mBACkB;CAClB,IAAM,EAAE,gBAAaC,EAAc,GAE7BC,KAAoB,GAAgB,MAC/BC,MAAa,OAAOC,IAASC,GAGlCC,KAAsB,MAAqB;EAC7C,IAAMC,IAASC,EAAQ,MAAK,MACvB,iBAAiBC,KAAOA,EAAI,gBAAgBC,KAC5C,QAAQD,KAAOA,EAAI,OAAOC,CAC/B;EAEA,IAAI,CAACH,GAAQ,OAAO;EAEpB,IAAMI,IAAWC,MAAiBF;EAGlC,IAAI,CAFeH,EAAO,MAAM,YAEf,OAAO;EAExB,IAAMM,IAAcC,EAAM,UAAUJ,CAAQ;EAC5C,IAAI,CAACG,GAAa,OAAO;EAEzB,IAAME,IAAe,OAAOR,EAAO,UAAW,WAAWA,EAAO,SAASG;EAEzE,OACI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACI,kBAAC,UAAD;IACI,WAAW,cAAcC,IAAW,gBAAgB;IACpD,eAAeK,EAAgBL,IAAW,OAAOD,CAAQ;IAF7D,UAAA,CAIKK,GACD,kBAAC,OAAD;KACI,OAAM;KACN,WAAU;KACV,MAAK;KACL,SAAQ;KACR,QAAO;KAEP,UAAA,kBAAC,QAAD;MAAM,eAAc;MAAQ,gBAAe;MAAQ,aAAY;MAAI,GAAE;KAA2J,CAAA;IAC/N,CAAA,CACD;GAEP,CAAA,GAAAJ,KACG,kBAAC,OAAD;IAAK,WAAU;IACV,UAAAZ,EAAM,cAAckB,KAAqBC,GAAa;KACnD,QAAQL;KACR,eAAeG,EAAgB,IAAI;IACvC,CAAC;GACA,CAAA,CAER;;CAEb;CAEA,OACI,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACKR,EAAQ,KAAI,MAAU;IACnB,IAAME,IAAW,iBAAiBH,IAASA,EAAO,cAAwBA,EAAO;IAIjF,OAHIA,EAAO,MAAM,aACN,kBAACR,EAAM,UAAP,EAAA,UAAgCO,EAAmBI,CAAQ,EAAkB,GAAxDA,CAAwD,IAEjF;GACX,CAAC;GAEAS,GAAc,gBACX,kBAAC,UAAD;IACI,WAAU;IACV,eAAeL,EAAM,mBAAmB;IAEvC,UAAAZ,EAAiB,QAAQ,WAAW;GACjC,CAAA;GAGXiB,GAAc;EACd;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableBody.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableBody.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, flexRender } from '../tanstack-table';\nimport Table from '../../../Table';\nimport { RowEventHandler, CellEventHandler } from '../types';\nimport type {\n DataTableApi,\n DataTableCellContext,\n DataTableExtension,\n DataTableRowContext,\n} from '../extension';\n\ninterface TableBodyProps<T extends object> {\n table: TanStackTable<T>;\n card?: boolean;\n fieldLabels?: Record<string, React.ReactNode>;\n expandedRowsState: Record<string, boolean>;\n onRowClick?: RowEventHandler;\n onRowDoubleClick?: RowEventHandler;\n onRowMouseEnter?: RowEventHandler;\n onRowMouseLeave?: RowEventHandler;\n onCellClick?: CellEventHandler;\n onCellDoubleClick?: CellEventHandler;\n onCellMouseEnter?: CellEventHandler;\n onCellMouseLeave?: CellEventHandler;\n enableExpanding: boolean;\n indentSize: number;\n handleRowExpand: (rowId: string, row: T) => void;\n // 扩展系统\n extensions?: DataTableExtension<T>[];\n extensionApi?: DataTableApi<T>;\n getRowId?: (row: T, index: number) => string;\n onCellContextMenu?: (\n e: React.MouseEvent,\n row: T,\n column: any,\n rowIndex: number,\n ) => void;\n}\n\nexport function TableBody<T extends object>({\n table,\n card = false,\n fieldLabels,\n expandedRowsState,\n onRowClick,\n onRowDoubleClick,\n onRowMouseEnter,\n onRowMouseLeave,\n onCellClick,\n onCellDoubleClick,\n onCellMouseEnter,\n onCellMouseLeave,\n enableExpanding,\n indentSize,\n handleRowExpand,\n extensions = [],\n extensionApi,\n getRowId,\n onCellContextMenu,\n}: TableBodyProps<T>) {\n const hasExtensions = extensions.length > 0 && !!extensionApi;\n\n return (\n <Table.Body>\n {table.getRowModel().rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={table.getAllColumns().length} className=\"text-center py-4\">\n 没有数据\n </Table.Cell>\n </Table.Row>\n ) : (\n table.getRowModel().rows.map((row, rowIndex) => {\n const depth = row.depth;\n const hasChildren = row.subRows.length > 0;\n const rowId = row.id;\n const isExpanded = hasChildren && expandedRowsState[rowId] || false;\n\n // 根据层级和展开状态应用不同的CSS类\n const rowClassName = `\n ${row.getIsSelected() ? 'bg-primary/10' : ''}\n ${hasChildren ? (isExpanded ? 'tree-row-expanded' : '') : ''}\n `;\n\n\n // 扩展的行级上下文与注入属性\n const resolvedRowId = getRowId\n ? getRowId(row.original, rowIndex)\n : row.id;\n const rowCtx: DataTableRowContext<T> = {\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n selected: row.getIsSelected(),\n };\n const extraRowProps = hasExtensions\n ? extensions.reduce<React.HTMLAttributes<HTMLTableRowElement>>(\n (acc, ext) =>\n Object.assign(acc, ext.rowProps?.(rowCtx, extensionApi!) ?? {}),\n {},\n )\n : {};\n\n const rowElement = (\n <Table.Row\n key={row.id}\n selected={row.getIsSelected()}\n className={rowClassName}\n onClick={onRowClick ? e => onRowClick(row.original, e) : undefined}\n onDoubleClick={onRowDoubleClick ? e => onRowDoubleClick(row.original, e) : undefined}\n onMouseEnter={onRowMouseEnter ? e => onRowMouseEnter(row.original, e) : undefined}\n onMouseLeave={onRowMouseLeave ? e => onRowMouseLeave(row.original, e) : undefined}\n {...(extraRowProps as any)}\n >\n {row.getVisibleCells().map((cell, cellIndex) => {\n // 为第一列添加缩进和展开/折叠控件\n const isFirstColumn = cellIndex === 0;\n\n // 扩展可覆写单元格渲染。\n let cellContent: React.ReactNode | undefined;\n if (hasExtensions) {\n const cellCtx: DataTableCellContext<T> = {\n value: cell.getValue(),\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n columnId: cell.column.id,\n };\n for (const ext of extensions) {\n const out = ext.cell?.(cellCtx, extensionApi!);\n if (out !== undefined) {\n cellContent = out;\n break;\n }\n }\n }\n if (cellContent === undefined) {\n cellContent = flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n );\n }\n\n return (\n <Table.Cell\n key={cell.id}\n label={card ? (\n fieldLabels && Object.prototype.hasOwnProperty.call(fieldLabels, cell.column.id)\n ? fieldLabels[cell.column.id]\n : typeof cell.column.columnDef.header === 'string'\n ? cell.column.columnDef.header\n : cell.column.id\n ) : undefined}\n onClick={onCellClick ? e => {\n e.stopPropagation(); // 防止触发行点击事件\n onCellClick(row.original, cell.column, e);\n } : undefined}\n onDoubleClick={onCellDoubleClick ? e => {\n e.stopPropagation(); // 防止触发行双击事件\n onCellDoubleClick(row.original, cell.column, e);\n } : undefined}\n onMouseEnter={onCellMouseEnter ? e => onCellMouseEnter(row.original, cell.column, e) : undefined}\n onMouseLeave={onCellMouseLeave ? e => onCellMouseLeave(row.original, cell.column, e) : undefined}\n >\n <div\n className=\"flex items-center\"\n onContextMenu={\n onCellContextMenu\n ? e =>\n onCellContextMenu(\n e,\n row.original,\n cell.column,\n rowIndex,\n )\n : undefined\n }\n >\n {isFirstColumn && enableExpanding && (\n <>\n <div style={{ width: `${depth * indentSize}px` }} />\n {hasChildren ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRowExpand(rowId, row.original);\n }}\n className=\"mr-2 focus:outline-none\"\n >\n {/* 完全重写箭头图标部分,使用内联样式控制方向 */}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n style={{\n transition: 'transform 0.3s ease',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)'\n }}\n >\n {/* 使用右箭头,通过旋转变为下箭头 */}\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"w-6\"></div>\n )}\n </>\n )}\n {cellContent}\n </div>\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n\n // 让扩展包裹整行(如在行下方追加 detail 面板)。\n if (hasExtensions) {\n const wrapped = extensions.reduce<React.ReactNode>(\n (node, ext) => ext.wrapRow?.(node, rowCtx, extensionApi!) ?? node,\n rowElement,\n );\n if (wrapped !== rowElement) {\n return <React.Fragment key={row.id}>{wrapped}</React.Fragment>;\n }\n }\n\n return rowElement;\n })\n )}\n </Table.Body>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableBody.js","names":["Table","_Fragment","TableWithCompounds","React","TableBody","hasExtensions","extensions","extensionApi","table","depth","row","hasChildren","rowId","isExpanded","expandedRowsState","rowClassName","resolvedRowId","getRowId","rowIndex","rowCtx","extraRowProps","acc","ext","rowElement","onRowClick","onRowDoubleClick","onRowMouseEnter","onRowMouseLeave","isFirstColumn","cellIndex","cellContent","cellCtx","cell","out","flexRender","card","fieldLabels","onCellClick","onCellDoubleClick","onCellMouseEnter","onCellMouseLeave","onCellContextMenu","enableExpanding","Fragment","indentSize","handleRowExpand","wrapped","node"],"sources":["../../../../../src/components/pro/DataTable/components/TableBody.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, flexRender } from '../tanstack-table';\nimport Table from '../../../Table';\nimport { RowEventHandler, CellEventHandler } from '../types';\nimport type {\n DataTableApi,\n DataTableCellContext,\n DataTableExtension,\n DataTableRowContext,\n} from '../extension';\n\ninterface TableBodyProps<T extends object> {\n table: TanStackTable<T>;\n card?: boolean;\n fieldLabels?: Record<string, React.ReactNode>;\n expandedRowsState: Record<string, boolean>;\n onRowClick?: RowEventHandler;\n onRowDoubleClick?: RowEventHandler;\n onRowMouseEnter?: RowEventHandler;\n onRowMouseLeave?: RowEventHandler;\n onCellClick?: CellEventHandler;\n onCellDoubleClick?: CellEventHandler;\n onCellMouseEnter?: CellEventHandler;\n onCellMouseLeave?: CellEventHandler;\n enableExpanding: boolean;\n indentSize: number;\n handleRowExpand: (rowId: string, row: T) => void;\n // 扩展系统\n extensions?: DataTableExtension<T>[];\n extensionApi?: DataTableApi<T>;\n getRowId?: (row: T, index: number) => string;\n onCellContextMenu?: (\n e: React.MouseEvent,\n row: T,\n column: any,\n rowIndex: number,\n ) => void;\n}\n\nexport function TableBody<T extends object>({\n table,\n card = false,\n fieldLabels,\n expandedRowsState,\n onRowClick,\n onRowDoubleClick,\n onRowMouseEnter,\n onRowMouseLeave,\n onCellClick,\n onCellDoubleClick,\n onCellMouseEnter,\n onCellMouseLeave,\n enableExpanding,\n indentSize,\n handleRowExpand,\n extensions = [],\n extensionApi,\n getRowId,\n onCellContextMenu,\n}: TableBodyProps<T>) {\n const hasExtensions = extensions.length > 0 && !!extensionApi;\n\n return (\n <Table.Body>\n {table.getRowModel().rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={table.getAllColumns().length} className=\"text-center py-4\">\n 没有数据\n </Table.Cell>\n </Table.Row>\n ) : (\n table.getRowModel().rows.map((row, rowIndex) => {\n const depth = row.depth;\n const hasChildren = row.subRows.length > 0;\n const rowId = row.id;\n const isExpanded = hasChildren && expandedRowsState[rowId] || false;\n\n // 根据层级和展开状态应用不同的CSS类\n const rowClassName = `\n ${row.getIsSelected() ? 'bg-primary/10' : ''}\n ${hasChildren ? (isExpanded ? 'tree-row-expanded' : '') : ''}\n `;\n\n\n // 扩展的行级上下文与注入属性\n const resolvedRowId = getRowId\n ? getRowId(row.original, rowIndex)\n : row.id;\n const rowCtx: DataTableRowContext<T> = {\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n selected: row.getIsSelected(),\n };\n const extraRowProps = hasExtensions\n ? extensions.reduce<React.HTMLAttributes<HTMLTableRowElement>>(\n (acc, ext) =>\n Object.assign(acc, ext.rowProps?.(rowCtx, extensionApi!) ?? {}),\n {},\n )\n : {};\n\n const rowElement = (\n <Table.Row\n key={row.id}\n selected={row.getIsSelected()}\n className={rowClassName}\n onClick={onRowClick ? e => onRowClick(row.original, e) : undefined}\n onDoubleClick={onRowDoubleClick ? e => onRowDoubleClick(row.original, e) : undefined}\n onMouseEnter={onRowMouseEnter ? e => onRowMouseEnter(row.original, e) : undefined}\n onMouseLeave={onRowMouseLeave ? e => onRowMouseLeave(row.original, e) : undefined}\n {...(extraRowProps as any)}\n >\n {row.getVisibleCells().map((cell, cellIndex) => {\n // 为第一列添加缩进和展开/折叠控件\n const isFirstColumn = cellIndex === 0;\n\n // 扩展可覆写单元格渲染。\n let cellContent: React.ReactNode | undefined;\n if (hasExtensions) {\n const cellCtx: DataTableCellContext<T> = {\n value: cell.getValue(),\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n columnId: cell.column.id,\n };\n for (const ext of extensions) {\n const out = ext.cell?.(cellCtx, extensionApi!);\n if (out !== undefined) {\n cellContent = out;\n break;\n }\n }\n }\n if (cellContent === undefined) {\n cellContent = flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n );\n }\n\n return (\n <Table.Cell\n key={cell.id}\n label={card ? (\n fieldLabels && Object.prototype.hasOwnProperty.call(fieldLabels, cell.column.id)\n ? fieldLabels[cell.column.id]\n : typeof cell.column.columnDef.header === 'string'\n ? cell.column.columnDef.header\n : cell.column.id\n ) : undefined}\n onClick={onCellClick ? e => {\n e.stopPropagation(); // 防止触发行点击事件\n onCellClick(row.original, cell.column, e);\n } : undefined}\n onDoubleClick={onCellDoubleClick ? e => {\n e.stopPropagation(); // 防止触发行双击事件\n onCellDoubleClick(row.original, cell.column, e);\n } : undefined}\n onMouseEnter={onCellMouseEnter ? e => onCellMouseEnter(row.original, cell.column, e) : undefined}\n onMouseLeave={onCellMouseLeave ? e => onCellMouseLeave(row.original, cell.column, e) : undefined}\n >\n <div\n className=\"flex items-center\"\n onContextMenu={\n onCellContextMenu\n ? e =>\n onCellContextMenu(\n e,\n row.original,\n cell.column,\n rowIndex,\n )\n : undefined\n }\n >\n {isFirstColumn && enableExpanding && (\n <>\n <div style={{ width: `${depth * indentSize}px` }} />\n {hasChildren ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRowExpand(rowId, row.original);\n }}\n className=\"mr-2 focus:outline-none\"\n >\n {/* 完全重写箭头图标部分,使用内联样式控制方向 */}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n style={{\n transition: 'transform 0.3s ease',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)'\n }}\n >\n {/* 使用右箭头,通过旋转变为下箭头 */}\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"w-6\"></div>\n )}\n </>\n )}\n {cellContent}\n </div>\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n\n // 让扩展包裹整行(如在行下方追加 detail 面板)。\n if (hasExtensions) {\n const wrapped = extensions.reduce<React.ReactNode>(\n (node, ext) => ext.wrapRow?.(node, rowCtx, extensionApi!) ?? node,\n rowElement,\n );\n if (wrapped !== rowElement) {\n return <React.Fragment key={row.id}>{wrapped}</React.Fragment>;\n }\n }\n\n return rowElement;\n })\n )}\n </Table.Body>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeader.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableHeader.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, VisibilityState, flexRender } from '../tanstack-table';\nimport Table from '../../../Table';\nimport { ColumnEventHandler } from '../types';\n\ninterface TableHeaderProps<T extends object> {\n table: TanStackTable<T>;\n visibilityState: VisibilityState;\n enableSorting: boolean;\n enableColumnReordering: boolean;\n draggedColumnId: string | null;\n onColumnMouseEnter?: ColumnEventHandler;\n onColumnMouseLeave?: ColumnEventHandler;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n handleDragOver: (e: React.DragEvent | Event) => void;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n}\n\nexport function TableHeader<T extends object>({\n table,\n visibilityState,\n enableSorting,\n enableColumnReordering,\n draggedColumnId,\n onColumnMouseEnter,\n onColumnMouseLeave,\n handleDragStart,\n handleDragOver,\n handleDrop,\n}: TableHeaderProps<T>) {\n return (\n <Table.Head>\n {table.getHeaderGroups().map(headerGroup => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map(header => {\n // 确保列是可见的\n const columnId = header.column.id;\n if (visibilityState[columnId] === false) return null;\n\n // 获取列的自定义元数据\n const meta = header.column.columnDef.meta || {};\n const isSortable = enableSorting && header.column.getCanSort();\n\n return (\n <Table.HeaderCell\n key={header.id}\n className={`\n ${isSortable ? 'cursor-pointer' : ''}\n ${enableColumnReordering ? 'cursor-move' : ''}\n ${draggedColumnId === header.id ? 'bg-primary/30 shadow-lg border-2 border-primary' : ''}\n `}\n onClick={isSortable ? header.column.getToggleSortingHandler() : undefined}\n onMouseEnter={onColumnMouseEnter ? e => onColumnMouseEnter(header.column, e) : undefined}\n onMouseLeave={onColumnMouseLeave ? e => onColumnMouseLeave(header.column, e) : undefined}\n draggable={enableColumnReordering}\n onDragStart={enableColumnReordering ? e => handleDragStart(e, header.id) : undefined}\n onDragOver={enableColumnReordering ? handleDragOver : undefined}\n onDrop={enableColumnReordering ? e => {\n handleDrop(e, header.id);\n // 清理所有拖拽相关的样式\n document.querySelectorAll('.bg-primary\\\\/20, .bg-primary\\\\/30, .dragging-source, .menu-item-highlight').forEach(el => {\n el.classList.remove('bg-primary/20');\n el.classList.remove('bg-primary/30');\n el.classList.remove('shadow-lg');\n el.classList.remove('border-b-2');\n el.classList.remove('border-2');\n el.classList.remove('border-l-4');\n el.classList.remove('border-primary');\n el.classList.remove('dragging-source');\n el.classList.remove('menu-item-highlight');\n });\n } : undefined}\n >\n <div className=\"flex items-center justify-between w-full\">\n {header.isPlaceholder ? null : (\n <div className=\"flex items-center\">\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n\n {isSortable && (\n <div className=\"flex items-center ml-2\">\n <span className=\"w-4 flex justify-center\">\n {header.column.getIsSorted() ? (\n header.column.getIsSorted() === 'desc' ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-success\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-error\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n )\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-base-content/30\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n )}\n </span>\n </div>\n )}\n </div>\n </Table.HeaderCell>\n );\n })}\n </Table.Row>\n ))}\n </Table.Head>\n );\n}\n"],"mappings":";;;;;AAkBA,SAAgB,EAA8B,EAC1C,UACA,oBACA,kBACA,2BACA,oBACA,uBACA,uBACA,oBACA,mBACA,iBACoB;CACpB,OACI,kBAAC,EAAM,MAAP,EAAA,UACK,EAAM,gBAAgB,CAAC,CAAC,KAAI,MACzB,kBAAC,EAAM,KAAP,EAAA,UACK,EAAY,QAAQ,KAAI,MAAU;EAG/B,IAAI,EADa,EAAO,OAAO,QACG,IAAO,OAAO;EAGnC,EAAO,OAAO,UAAU;EACrC,IAAM,IAAa,KAAiB,EAAO,OAAO,WAAW;EAE7D,OACI,kBAAC,EAAM,YAAP;GAEI,WAAW;oBACvB,IAAa,mBAAmB,GAAG;oBACnC,IAAyB,gBAAgB,GAAG;oBAC5C,MAAoB,EAAO,KAAK,oDAAoD,GAAG;;GAE3E,SAAS,IAAa,EAAO,OAAO,wBAAwB,IAAI,KAAA;GAChE,cAAc,KAAqB,MAAK,EAAmB,EAAO,QAAQ,CAAC,IAAI,KAAA;GAC/E,cAAc,KAAqB,MAAK,EAAmB,EAAO,QAAQ,CAAC,IAAI,KAAA;GAC/E,WAAW;GACX,aAAa,KAAyB,MAAK,EAAgB,GAAG,EAAO,EAAE,IAAI,KAAA;GAC3E,YAAY,IAAyB,IAAiB,KAAA;GACtD,QAAQ,KAAyB,MAAK;IAGlC,AAFA,EAAW,GAAG,EAAO,EAAE,GAEvB,SAAS,iBAAiB,4EAA4E,CAAC,CAAC,SAAQ,MAAM;KASlH,AARA,EAAG,UAAU,OAAO,eAAe,GACnC,EAAG,UAAU,OAAO,eAAe,GACnC,EAAG,UAAU,OAAO,WAAW,GAC/B,EAAG,UAAU,OAAO,YAAY,GAChC,EAAG,UAAU,OAAO,UAAU,GAC9B,EAAG,UAAU,OAAO,YAAY,GAChC,EAAG,UAAU,OAAO,gBAAgB,GACpC,EAAG,UAAU,OAAO,iBAAiB,GACrC,EAAG,UAAU,OAAO,qBAAqB;IAC7C,CAAC;GACL,IAAI,KAAA;GAEJ,UAAA,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACK,EAAO,gBAAgB,OACpB,kBAAC,OAAD;KAAK,WAAU;KACV,UAAA,EACG,EAAO,OAAO,UAAU,QACxB,EAAO,WAAW,CACtB;IACC,CAAA,GAGR,KACG,kBAAC,OAAD;KAAK,WAAU;KACX,UAAA,kBAAC,QAAD;MAAM,WAAU;MACX,UAAA,EAAO,OAAO,YAAY,IACvB,EAAO,OAAO,YAAY,MAAM,SAC5B,kBAAC,OAAD;OACI,OAAM;OACN,WAAU;OACV,MAAK;OACL,SAAQ;OACR,QAAO;OAEP,UAAA,kBAAC,QAAD;QAAM,eAAc;QAAQ,gBAAe;QAAQ,aAAY;QAAI,GAAE;OAAiB,CAAA;MACrF,CAAA,IAEL,kBAAC,OAAD;OACI,OAAM;OACN,WAAU;OACV,MAAK;OACL,SAAQ;OACR,QAAO;OAEP,UAAA,kBAAC,QAAD;QAAM,eAAc;QAAQ,gBAAe;QAAQ,aAAY;QAAI,GAAE;OAAkB,CAAA;MACtF,CAAA,IAGT,kBAAC,OAAD;OACI,OAAM;OACN,WAAU;OACV,MAAK;OACL,SAAQ;OACR,QAAO;OAEP,UAAA,kBAAC,QAAD;QAAM,eAAc;QAAQ,gBAAe;QAAQ,aAAY;QAAI,GAAE;OAAoD,CAAA;MACxH,CAAA;KAEP,CAAA;IACL,CAAA,CAER;;EACS,GA9ET,EAAO,EA8EE;CAE1B,CAAC,EACM,GA7FK,EAAY,EA6FjB,CACd,EACO,CAAA;AAEpB"}
1
+ {"version":3,"file":"TableHeader.js","names":["Table","TableWithCompounds","TableHeader","table","headerGroup","visibilityState","header","isSortable","enableSorting","enableColumnReordering","draggedColumnId","onColumnMouseEnter","onColumnMouseLeave","handleDragStart","handleDragOver","handleDrop","el","flexRender"],"sources":["../../../../../src/components/pro/DataTable/components/TableHeader.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, VisibilityState, flexRender } from '../tanstack-table';\nimport Table from '../../../Table';\nimport { ColumnEventHandler } from '../types';\n\ninterface TableHeaderProps<T extends object> {\n table: TanStackTable<T>;\n visibilityState: VisibilityState;\n enableSorting: boolean;\n enableColumnReordering: boolean;\n draggedColumnId: string | null;\n onColumnMouseEnter?: ColumnEventHandler;\n onColumnMouseLeave?: ColumnEventHandler;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n handleDragOver: (e: React.DragEvent | Event) => void;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n}\n\nexport function TableHeader<T extends object>({\n table,\n visibilityState,\n enableSorting,\n enableColumnReordering,\n draggedColumnId,\n onColumnMouseEnter,\n onColumnMouseLeave,\n handleDragStart,\n handleDragOver,\n handleDrop,\n}: TableHeaderProps<T>) {\n return (\n <Table.Head>\n {table.getHeaderGroups().map(headerGroup => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map(header => {\n // 确保列是可见的\n const columnId = header.column.id;\n if (visibilityState[columnId] === false) return null;\n\n // 获取列的自定义元数据\n const meta = header.column.columnDef.meta || {};\n const isSortable = enableSorting && header.column.getCanSort();\n\n return (\n <Table.HeaderCell\n key={header.id}\n className={`\n ${isSortable ? 'cursor-pointer' : ''}\n ${enableColumnReordering ? 'cursor-move' : ''}\n ${draggedColumnId === header.id ? 'bg-primary/30 shadow-lg border-2 border-primary' : ''}\n `}\n onClick={isSortable ? header.column.getToggleSortingHandler() : undefined}\n onMouseEnter={onColumnMouseEnter ? e => onColumnMouseEnter(header.column, e) : undefined}\n onMouseLeave={onColumnMouseLeave ? e => onColumnMouseLeave(header.column, e) : undefined}\n draggable={enableColumnReordering}\n onDragStart={enableColumnReordering ? e => handleDragStart(e, header.id) : undefined}\n onDragOver={enableColumnReordering ? handleDragOver : undefined}\n onDrop={enableColumnReordering ? e => {\n handleDrop(e, header.id);\n // 清理所有拖拽相关的样式\n document.querySelectorAll('.bg-primary\\\\/20, .bg-primary\\\\/30, .dragging-source, .menu-item-highlight').forEach(el => {\n el.classList.remove('bg-primary/20');\n el.classList.remove('bg-primary/30');\n el.classList.remove('shadow-lg');\n el.classList.remove('border-b-2');\n el.classList.remove('border-2');\n el.classList.remove('border-l-4');\n el.classList.remove('border-primary');\n el.classList.remove('dragging-source');\n el.classList.remove('menu-item-highlight');\n });\n } : undefined}\n >\n <div className=\"flex items-center justify-between w-full\">\n {header.isPlaceholder ? null : (\n <div className=\"flex items-center\">\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </div>\n )}\n\n {isSortable && (\n <div className=\"flex items-center ml-2\">\n <span className=\"w-4 flex justify-center\">\n {header.column.getIsSorted() ? (\n header.column.getIsSorted() === 'desc' ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-success\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 15l7-7 7 7\" />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-error\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n )\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4 text-base-content/30\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n )}\n </span>\n </div>\n )}\n </div>\n </Table.HeaderCell>\n );\n })}\n </Table.Row>\n ))}\n </Table.Head>\n );\n}\n"],"mappings":";;;;;AAkBA,SAAgBE,EAA8B,EAC1C,UACA,oBACA,kBACA,2BACA,oBACA,uBACA,uBACA,oBACA,mBACA,iBACoB;CACpB,OACI,kBAACF,EAAM,MAAP,EAAA,UACKG,EAAM,gBAAgB,CAAC,CAAC,KAAI,MACzB,kBAACH,EAAM,KAAP,EAAA,UACKI,EAAY,QAAQ,KAAI,MAAU;EAG/B,IAAIC,EADaC,EAAO,OAAO,QACG,IAAO,OAAO;EAGnC,EAAO,OAAO,UAAU;EACrC,IAAMC,IAAaC,KAAiBF,EAAO,OAAO,WAAW;EAE7D,OACI,kBAACN,EAAM,YAAP;GAEI,WAAW;oBACvBO,IAAa,mBAAmB,GAAG;oBACnCE,IAAyB,gBAAgB,GAAG;oBAC5CC,MAAoBJ,EAAO,KAAK,oDAAoD,GAAG;;GAE3E,SAASC,IAAaD,EAAO,OAAO,wBAAwB,IAAI,KAAA;GAChE,cAAcK,KAAqB,MAAKA,EAAmBL,EAAO,QAAQ,CAAC,IAAI,KAAA;GAC/E,cAAcM,KAAqB,MAAKA,EAAmBN,EAAO,QAAQ,CAAC,IAAI,KAAA;GAC/E,WAAWG;GACX,aAAaA,KAAyB,MAAKI,EAAgB,GAAGP,EAAO,EAAE,IAAI,KAAA;GAC3E,YAAYG,IAAyBK,IAAiB,KAAA;GACtD,QAAQL,KAAyB,MAAK;IAGlC,AAFAM,EAAW,GAAGT,EAAO,EAAE,GAEvB,SAAS,iBAAiB,4EAA4E,CAAC,CAAC,SAAQ,MAAM;KASlH,AARAU,EAAG,UAAU,OAAO,eAAe,GACnCA,EAAG,UAAU,OAAO,eAAe,GACnCA,EAAG,UAAU,OAAO,WAAW,GAC/BA,EAAG,UAAU,OAAO,YAAY,GAChCA,EAAG,UAAU,OAAO,UAAU,GAC9BA,EAAG,UAAU,OAAO,YAAY,GAChCA,EAAG,UAAU,OAAO,gBAAgB,GACpCA,EAAG,UAAU,OAAO,iBAAiB,GACrCA,EAAG,UAAU,OAAO,qBAAqB;IAC7C,CAAC;GACL,IAAI,KAAA;GAEJ,UAAA,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACKV,EAAO,gBAAgB,OACpB,kBAAC,OAAD;KAAK,WAAU;KACV,UAAAW,EACGX,EAAO,OAAO,UAAU,QACxBA,EAAO,WAAW,CACtB;IACC,CAAA,GAGRC,KACG,kBAAC,OAAD;KAAK,WAAU;KACX,UAAA,kBAAC,QAAD;MAAM,WAAU;MACX,UAAAD,EAAO,OAAO,YAAY,IACvBA,EAAO,OAAO,YAAY,MAAM,SAC5B,kBAAC,OAAD;OACI,OAAM;OACN,WAAU;OACV,MAAK;OACL,SAAQ;OACR,QAAO;OAEP,UAAA,kBAAC,QAAD;QAAM,eAAc;QAAQ,gBAAe;QAAQ,aAAY;QAAI,GAAE;OAAiB,CAAA;MACrF,CAAA,IAEL,kBAAC,OAAD;OACI,OAAM;OACN,WAAU;OACV,MAAK;OACL,SAAQ;OACR,QAAO;OAEP,UAAA,kBAAC,QAAD;QAAM,eAAc;QAAQ,gBAAe;QAAQ,aAAY;QAAI,GAAE;OAAkB,CAAA;MACtF,CAAA,IAGT,kBAAC,OAAD;OACI,OAAM;OACN,WAAU;OACV,MAAK;OACL,SAAQ;OACR,QAAO;OAEP,UAAA,kBAAC,QAAD;QAAM,eAAc;QAAQ,gBAAe;QAAQ,aAAY;QAAI,GAAE;OAAoD,CAAA;MACxH,CAAA;KAEP,CAAA;IACL,CAAA,CAER;;EACS,GA9ETA,EAAO,EA8EE;CAE1B,CAAC,EACM,GA7FKF,EAAY,EA6FjB,CACd,EACO,CAAA;AAEpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"TablePagination.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TablePagination.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, PaginationState } from '../tanstack-table';\n\ninterface TablePaginationProps<T extends object> {\n enablePagination: boolean;\n table: TanStackTable<T>;\n onPaginationChange: (pagination: PaginationState) => void;\n}\n\nexport function TablePagination<T extends object>({\n enablePagination,\n table,\n onPaginationChange,\n}: TablePaginationProps<T>) {\n if (!enablePagination) return null;\n\n const { pageIndex, pageSize } = table.state.pagination;\n const pageCount = table.getPageCount();\n const handlePageChange = (next: number) => onPaginationChange({ pageIndex: next, pageSize });\n const pageSizes = [...new Set([5, 10, 15, 20, 25, pageSize])].sort((a, b) => a - b);\n\n return (\n <div className=\"mt-4 flex justify-between items-center\">\n <div>\n <span className=\"text-sm\">\n 第 {pageCount === 0 ? 0 : pageIndex + 1} 页,共 {pageCount} 页\n </span>\n </div>\n <div className=\"join\">\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(0)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<<'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex - 1)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<'}\n </button>\n {Array.from({ length: Math.min(5, pageCount) }).map((_, i) => {\n // 显示当前页前后两页\n let pageNum = pageIndex - 2 + i;\n\n // 确保页码在合法范围内\n if (pageNum < 0) pageNum = i;\n if (pageNum >= pageCount) pageNum = pageCount - 5 + i;\n\n // 如果总页数小于5,直接显示全部页码\n if (pageCount <= 5) {\n pageNum = i;\n }\n\n // 如果页码超出范围,不显示\n if (pageNum < 0 || pageNum >= pageCount) return null;\n\n return (\n <button\n key={pageNum}\n className={`join-item btn btn-sm ${pageNum === pageIndex ? 'btn-active' : ''}`}\n onClick={() => handlePageChange(pageNum)}\n >\n {pageNum + 1}\n </button>\n );\n })}\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex + 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>>'}\n </button>\n </div>\n <div>\n <select\n className=\"select select-sm select-bordered\"\n value={pageSize}\n onChange={(e) => onPaginationChange({ pageIndex: 0, pageSize: Number(e.target.value) })}\n >\n {pageSizes.map((pageSize) => (\n <option key={pageSize} value={pageSize}>\n {pageSize} 条/页\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n}\n"],"mappings":";;;AASA,SAAgB,EAAkC,EAC9C,qBACA,UACA,yBACwB;CACxB,IAAI,CAAC,GAAkB,OAAO;CAE9B,IAAM,EAAE,cAAW,gBAAa,EAAM,MAAM,YACtC,IAAY,EAAM,aAAa,GAC/B,KAAoB,MAAiB,EAAmB;EAAE,WAAW;EAAM;CAAS,CAAC,GACrF,IAAY,CAAC,mBAAG,IAAI,IAAI;EAAC;EAAG;EAAI;EAAI;EAAI;EAAI;CAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CAElF,OACI,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACI,kBAAC,OAAD,EAAA,UACI,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KAA0B;KACnB,MAAc,IAAI,IAAI,IAAY;KAAE;KAAM;KAAU;IACrD;GACL,CAAA,EAAA,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACI,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,CAAC;MACjC,UAAU,CAAC,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACP,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,CAAS,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM;MAE1D,IAAI,IAAU,IAAY,IAAI;MAc9B,OAXI,IAAU,MAAG,IAAU,IACvB,KAAW,MAAW,IAAU,IAAY,IAAI,IAGhD,KAAa,MACb,IAAU,IAIV,IAAU,KAAK,KAAW,IAAkB,OAG5C,kBAAC,UAAD;OAEI,WAAW,wBAAwB,MAAY,IAAY,eAAe;OAC1E,eAAe,EAAiB,CAAO;OAEtC,UAAA,IAAU;MACP,GALC,CAKD;KAEhB,CAAC;KACD,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;IACP;;GACL,kBAAC,OAAD,EAAA,UACI,kBAAC,UAAD;IACI,WAAU;IACV,OAAO;IACP,WAAW,MAAM,EAAmB;KAAE,WAAW;KAAG,UAAU,OAAO,EAAE,OAAO,KAAK;IAAE,CAAC;IAErF,UAAA,EAAU,KAAK,MACZ,kBAAC,UAAD;KAAuB,OAAO;KAA9B,UAAA,CACK,GAAS,MACN;IAFK,GAAA,CAEL,CACX;GACG,CAAA,EACP,CAAA;EACJ;;AAEb"}
1
+ {"version":3,"file":"TablePagination.js","names":["TablePagination","enablePagination","table","pageCount","handlePageChange","onPaginationChange","next","pageSizes","pageSize","a","b","pageIndex","pageNum","i"],"sources":["../../../../../src/components/pro/DataTable/components/TablePagination.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, PaginationState } from '../tanstack-table';\n\ninterface TablePaginationProps<T extends object> {\n enablePagination: boolean;\n table: TanStackTable<T>;\n onPaginationChange: (pagination: PaginationState) => void;\n}\n\nexport function TablePagination<T extends object>({\n enablePagination,\n table,\n onPaginationChange,\n}: TablePaginationProps<T>) {\n if (!enablePagination) return null;\n\n const { pageIndex, pageSize } = table.state.pagination;\n const pageCount = table.getPageCount();\n const handlePageChange = (next: number) => onPaginationChange({ pageIndex: next, pageSize });\n const pageSizes = [...new Set([5, 10, 15, 20, 25, pageSize])].sort((a, b) => a - b);\n\n return (\n <div className=\"mt-4 flex justify-between items-center\">\n <div>\n <span className=\"text-sm\">\n 第 {pageCount === 0 ? 0 : pageIndex + 1} 页,共 {pageCount} 页\n </span>\n </div>\n <div className=\"join\">\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(0)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<<'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex - 1)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<'}\n </button>\n {Array.from({ length: Math.min(5, pageCount) }).map((_, i) => {\n // 显示当前页前后两页\n let pageNum = pageIndex - 2 + i;\n\n // 确保页码在合法范围内\n if (pageNum < 0) pageNum = i;\n if (pageNum >= pageCount) pageNum = pageCount - 5 + i;\n\n // 如果总页数小于5,直接显示全部页码\n if (pageCount <= 5) {\n pageNum = i;\n }\n\n // 如果页码超出范围,不显示\n if (pageNum < 0 || pageNum >= pageCount) return null;\n\n return (\n <button\n key={pageNum}\n className={`join-item btn btn-sm ${pageNum === pageIndex ? 'btn-active' : ''}`}\n onClick={() => handlePageChange(pageNum)}\n >\n {pageNum + 1}\n </button>\n );\n })}\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex + 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>>'}\n </button>\n </div>\n <div>\n <select\n className=\"select select-sm select-bordered\"\n value={pageSize}\n onChange={(e) => onPaginationChange({ pageIndex: 0, pageSize: Number(e.target.value) })}\n >\n {pageSizes.map((pageSize) => (\n <option key={pageSize} value={pageSize}>\n {pageSize} 条/页\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n}\n"],"mappings":";;;AASA,SAAgBA,EAAkC,EAC9C,qBACA,UACA,yBACwB;CACxB,IAAI,CAACC,GAAkB,OAAO;CAE9B,IAAM,EAAE,cAAW,gBAAaC,EAAM,MAAM,YACtCC,IAAYD,EAAM,aAAa,GAC/BE,KAAoB,MAAiBC,EAAmB;EAAE,WAAWC;EAAM;CAAS,CAAC,GACrFC,IAAY,CAAC,mBAAG,IAAI,IAAI;EAAC;EAAG;EAAI;EAAI;EAAI;EAAIC;CAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAMC,IAAIC,CAAC;CAElF,OACI,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACI,kBAAC,OAAD,EAAA,UACI,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KAA0B;KACnBP,MAAc,IAAI,IAAIQ,IAAY;KAAE;KAAMR;KAAU;IACrD;GACL,CAAA,EAAA,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACI,kBAAC,UAAD;MACI,WAAU;MACV,eAAeC,EAAiB,CAAC;MACjC,UAAU,CAACF,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAeE,EAAiBO,IAAY,CAAC;MAC7C,UAAU,CAACT,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACP,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAGC,CAAS,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM;MAE1D,IAAIS,IAAUD,IAAY,IAAIE;MAc9B,OAXID,IAAU,MAAG,IAAUC,IACvBD,KAAWT,MAAW,IAAUA,IAAY,IAAIU,IAGhDV,KAAa,MACb,IAAUU,IAIVD,IAAU,KAAKA,KAAWT,IAAkB,OAG5C,kBAAC,UAAD;OAEI,WAAW,wBAAwBS,MAAYD,IAAY,eAAe;OAC1E,eAAeP,EAAiBQ,CAAO;OAEtC,UAAAA,IAAU;MACP,GALCA,CAKD;KAEhB,CAAC;KACD,kBAAC,UAAD;MACI,WAAU;MACV,eAAeR,EAAiBO,IAAY,CAAC;MAC7C,UAAU,CAACT,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAeE,EAAiBD,IAAY,CAAC;MAC7C,UAAU,CAACD,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;IACP;;GACL,kBAAC,OAAD,EAAA,UACI,kBAAC,UAAD;IACI,WAAU;IACV,OAAOM;IACP,WAAW,MAAMH,EAAmB;KAAE,WAAW;KAAG,UAAU,OAAO,EAAE,OAAO,KAAK;IAAE,CAAC;IAErF,UAAAE,EAAU,KAAK,MACZ,kBAAC,UAAD;KAAuB,OAAOC;KAA9B,UAAA,CACKA,GAAS,MACN;IAFK,GAAAA,CAEL,CACX;GACG,CAAA,EACP,CAAA;EACJ;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableToolbar.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Table, VisibilityState, RowSelectionState } from '../tanstack-table';\nimport { ToolbarOptions, CustomFilterPanelProps, DataTableProps } from '../types';\nimport { ColumnSelector } from './ColumnSelector';\nimport { FilterBar } from './FilterBar';\nimport { BulkActions } from './BulkActions';\n\ninterface TableToolbarProps<T extends object> {\n toolbar: ToolbarOptions;\n viewSwitcher?: React.ReactNode;\n table: Table<T>;\n columns: DataTableProps<T>['columns'];\n columnOrderState: string[];\n visibilityState: VisibilityState;\n activeFilter: string | null;\n setActiveFilter: (filter: string | null) => void;\n customFilterPanel?: React.ComponentType<CustomFilterPanelProps>;\n draggedColumnId: string | null;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n toggleColumnVisibility: (columnId: string) => void;\n rowSelection: RowSelectionState;\n data: T[];\n enableColumnReordering: boolean;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n}\n\nexport function TableToolbar<T extends object>({\n toolbar,\n viewSwitcher,\n table,\n columns,\n columnOrderState,\n visibilityState,\n activeFilter,\n setActiveFilter,\n customFilterPanel,\n draggedColumnId,\n handleDragStart,\n toggleColumnVisibility,\n rowSelection,\n data,\n enableColumnReordering,\n handleDrop,\n}: TableToolbarProps<T>) {\n if (!toolbar.enabled) {\n return viewSwitcher ? <div className=\"flex justify-end mb-4\">{viewSwitcher}</div> : null;\n }\n\n return (\n <div className=\"flex flex-wrap justify-between gap-4 mb-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {toolbar.enableColumnSelector && (\n <ColumnSelector\n table={table}\n columns={columns}\n columnOrderState={columnOrderState}\n visibilityState={visibilityState}\n toggleColumnVisibility={toggleColumnVisibility}\n enableColumnReordering={enableColumnReordering}\n handleDragStart={handleDragStart}\n handleDrop={handleDrop}\n draggedColumnId={draggedColumnId}\n />\n )}\n\n {toolbar.enableFiltering && (\n <FilterBar\n table={table}\n columns={columns}\n activeFilter={activeFilter}\n setActiveFilter={setActiveFilter}\n customFilterPanel={customFilterPanel}\n filterConfig={toolbar.filterConfig}\n />\n )}\n\n {toolbar.customComponents}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {viewSwitcher}\n {toolbar.enableBulkActions && toolbar.bulkActions && (\n <BulkActions\n bulkActions={toolbar.bulkActions}\n rowSelection={rowSelection}\n data={data}\n />\n )}\n </div>\n </div>\n );\n}\n\n"],"mappings":";;;;;;AA0BA,SAAgB,EAA+B,EAC3C,YACA,iBACA,UACA,YACA,qBACA,oBACA,iBACA,oBACA,sBACA,oBACA,oBACA,2BACA,iBACA,SACA,2BACA,iBACqB;CAKrB,OAJK,EAAQ,UAKT,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACK,EAAQ,wBACL,kBAAC,GAAD;KACW;KACE;KACS;KACD;KACO;KACA;KACP;KACL;KACK;IACpB,CAAA;IAGJ,EAAQ,mBACL,kBAAC,GAAD;KACW;KACE;KACK;KACG;KACE;KACnB,cAAc,EAAQ;IACzB,CAAA;IAGJ,EAAQ;GACR;EAEL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACK,GACA,EAAQ,qBAAqB,EAAQ,eAClC,kBAAC,GAAD;IACI,aAAa,EAAQ;IACP;IACR;GACT,CAAA,CAEJ;EACJ,CAAA,CAAA;MA5CE,IAAe,kBAAC,OAAD;EAAK,WAAU;EAAyB,UAAA;CAAkB,CAAA,IAAI;AA8C5F"}
1
+ {"version":3,"file":"TableToolbar.js","names":["TableToolbar","toolbar","ColumnSelector","FilterBar","viewSwitcher","BulkActions"],"sources":["../../../../../src/components/pro/DataTable/components/TableToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Table, VisibilityState, RowSelectionState } from '../tanstack-table';\nimport { ToolbarOptions, CustomFilterPanelProps, DataTableProps } from '../types';\nimport { ColumnSelector } from './ColumnSelector';\nimport { FilterBar } from './FilterBar';\nimport { BulkActions } from './BulkActions';\n\ninterface TableToolbarProps<T extends object> {\n toolbar: ToolbarOptions;\n viewSwitcher?: React.ReactNode;\n table: Table<T>;\n columns: DataTableProps<T>['columns'];\n columnOrderState: string[];\n visibilityState: VisibilityState;\n activeFilter: string | null;\n setActiveFilter: (filter: string | null) => void;\n customFilterPanel?: React.ComponentType<CustomFilterPanelProps>;\n draggedColumnId: string | null;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n toggleColumnVisibility: (columnId: string) => void;\n rowSelection: RowSelectionState;\n data: T[];\n enableColumnReordering: boolean;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n}\n\nexport function TableToolbar<T extends object>({\n toolbar,\n viewSwitcher,\n table,\n columns,\n columnOrderState,\n visibilityState,\n activeFilter,\n setActiveFilter,\n customFilterPanel,\n draggedColumnId,\n handleDragStart,\n toggleColumnVisibility,\n rowSelection,\n data,\n enableColumnReordering,\n handleDrop,\n}: TableToolbarProps<T>) {\n if (!toolbar.enabled) {\n return viewSwitcher ? <div className=\"flex justify-end mb-4\">{viewSwitcher}</div> : null;\n }\n\n return (\n <div className=\"flex flex-wrap justify-between gap-4 mb-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {toolbar.enableColumnSelector && (\n <ColumnSelector\n table={table}\n columns={columns}\n columnOrderState={columnOrderState}\n visibilityState={visibilityState}\n toggleColumnVisibility={toggleColumnVisibility}\n enableColumnReordering={enableColumnReordering}\n handleDragStart={handleDragStart}\n handleDrop={handleDrop}\n draggedColumnId={draggedColumnId}\n />\n )}\n\n {toolbar.enableFiltering && (\n <FilterBar\n table={table}\n columns={columns}\n activeFilter={activeFilter}\n setActiveFilter={setActiveFilter}\n customFilterPanel={customFilterPanel}\n filterConfig={toolbar.filterConfig}\n />\n )}\n\n {toolbar.customComponents}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {viewSwitcher}\n {toolbar.enableBulkActions && toolbar.bulkActions && (\n <BulkActions\n bulkActions={toolbar.bulkActions}\n rowSelection={rowSelection}\n data={data}\n />\n )}\n </div>\n </div>\n );\n}\n\n"],"mappings":";;;;;;AA0BA,SAAgBA,EAA+B,EAC3C,YACA,iBACA,UACA,YACA,qBACA,oBACA,iBACA,oBACA,sBACA,oBACA,oBACA,2BACA,iBACA,SACA,2BACA,iBACqB;CAKrB,OAJKC,EAAQ,UAKT,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACKA,EAAQ,wBACL,kBAACC,GAAD;KACW;KACE;KACS;KACD;KACO;KACA;KACP;KACL;KACK;IACpB,CAAA;IAGJD,EAAQ,mBACL,kBAACE,GAAD;KACW;KACE;KACK;KACG;KACE;KACnB,cAAcF,EAAQ;IACzB,CAAA;IAGJA,EAAQ;GACR;EAEL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACKG,GACAH,EAAQ,qBAAqBA,EAAQ,eAClC,kBAACI,GAAD;IACI,aAAaJ,EAAQ;IACP;IACR;GACT,CAAA,CAEJ;EACJ,CAAA,CAAA;MA5CEG,IAAe,kBAAC,OAAD;EAAK,WAAU;EAAyB,UAAAA;CAAkB,CAAA,IAAI;AA8C5F"}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","names":[],"sources":["../../../../src/components/pro/DataTable/extension.ts"],"sourcesContent":["// DataTable 扩展系统(Core + Extension 架构)\n// ---------------------------------------------------------------------------\n// 参考 DataTable/frontend 的可插拔扩展设计。DishUI 的 DataTable 作为「主 core」,\n// 只负责渲染基础的排序/筛选/分页表格;所有额外能力(透视 Pivot、行详情、\n// 自定义工具栏按钮、单元格覆写、右键菜单等)都以「扩展」的形式插入。\n//\n// 一个扩展是一个普通对象,因此可以自由组合:`extensions={[a, b, c]}`。\n// core 会按数组顺序依次调用每个 hook,未使用的能力零开销。\n//\n// 扩展可以挂载到以下几个明确的位置:\n// * `toolbar` —— 向工具栏贡献按钮/控件。\n// * `footer` —— 向表格底部(分页下方)贡献内容。\n// * `cell` —— 覆写某个单元格的渲染。\n// * `wrapRow` —— 包裹/增强已渲染的行(如 master-detail 面板)。\n// * `rowProps` —— 向行容器注入 DOM 属性/事件。\n// * `contextMenu` —— 贡献右键菜单项。\n// * `renderContent` —— 完全接管表格主体的渲染(Pivot 透视即基于此实现)。\n\nimport type { ReactNode } from 'react';\nimport type { Table, Row } from './tanstack-table';\n\n/** 交给每个扩展 hook 的表格读/写访问句柄。 */\nexport interface DataTableApi<T extends object> {\n /** 底层 TanStack Table 实例。 */\n readonly table: Table<T>;\n /** 原始数据源(未经分页/展开处理)。 */\n readonly data: T[];\n /** 当前页可见的行对象(TanStack Row)。 */\n readonly rows: Row<T>[];\n /** 当前选中的行数据。 */\n readonly selectedRows: T[];\n /** 解析行的稳定 id。 */\n getRowId: (row: T, index: number) => string;\n}\n\n/** 行级扩展 hook 的上下文。 */\nexport interface DataTableRowContext<T extends object> {\n row: T;\n rowId: string;\n rowIndex: number;\n selected: boolean;\n}\n\n/** 单元格级扩展 hook 的上下文。 */\nexport interface DataTableCellContext<T extends object> {\n value: unknown;\n row: T;\n rowId: string;\n rowIndex: number;\n columnId: string;\n}\n\n/** 扩展贡献的右键菜单项。 */\nexport interface DataTableMenuItem<T extends object> {\n key: string;\n label: ReactNode;\n onSelect?: (ctx: DataTableCellContext<T>) => void;\n disabled?: boolean;\n separator?: boolean;\n}\n\n/**\n * 一个可插拔的表格能力。只需实现你需要的 hook,所有字段都是可选的。\n * 扩展会拿到实时的 {@link DataTableApi},可以读取状态并派发更新。\n */\nexport interface DataTableExtension<T extends object> {\n /** 唯一名称,用于去重与调试。 */\n name: string;\n\n /** 向工具栏贡献控件,位于内置控件之后,从左到右渲染。 */\n toolbar?: (api: DataTableApi<T>) => ReactNode;\n\n /** 向底部(表格/分页下方)贡献控件。 */\n footer?: (api: DataTableApi<T>) => ReactNode;\n\n /**\n * 覆写单元格渲染。返回 `undefined` 表示交给下一个扩展 / 列自身的 `cell` /\n * 原始值处理。\n */\n cell?: (\n ctx: DataTableCellContext<T>,\n api: DataTableApi<T>,\n ) => ReactNode | undefined;\n\n /**\n * 包裹一整行。可用于在行「下方」渲染 master/detail 面板。\n * 若不想处理某一行,原样返回 `children` 即可。\n */\n wrapRow?: (\n children: ReactNode,\n ctx: DataTableRowContext<T>,\n api: DataTableApi<T>,\n ) => ReactNode;\n\n /** 向行容器注入 DOM 属性(浅合并,后者覆盖前者)。 */\n rowProps?: (\n ctx: DataTableRowContext<T>,\n api: DataTableApi<T>,\n ) => React.HTMLAttributes<HTMLTableRowElement> | undefined;\n\n /** 为单元格贡献右键菜单项。 */\n contextMenu?: (\n ctx: DataTableCellContext<T>,\n api: DataTableApi<T>,\n ) => DataTableMenuItem<T>[];\n\n /**\n * 完全接管表格主体的渲染。返回非 `undefined` 时,core 会用它替换默认的\n * 表格主体(此时不渲染表头/表体/分页)。Pivot 透视扩展即基于此实现。\n * 多个扩展同时提供时,数组中第一个返回非 `undefined` 的生效。\n */\n renderContent?: (api: DataTableApi<T>) => ReactNode | undefined;\n}\n\n/** 定义扩展的辅助函数,可获得完整的 `T` 类型推断。 */\nexport function defineExtension<T extends object>(\n ext: DataTableExtension<T>,\n): DataTableExtension<T> {\n return ext;\n}\n"],"mappings":";AAmHA,SAAgB,EACZ,GACqB;CACrB,OAAO;AACX"}
1
+ {"version":3,"file":"extension.js","names":["defineExtension","ext"],"sources":["../../../../src/components/pro/DataTable/extension.ts"],"sourcesContent":["// DataTable 扩展系统(Core + Extension 架构)\n// ---------------------------------------------------------------------------\n// 参考 DataTable/frontend 的可插拔扩展设计。DishUI 的 DataTable 作为「主 core」,\n// 只负责渲染基础的排序/筛选/分页表格;所有额外能力(透视 Pivot、行详情、\n// 自定义工具栏按钮、单元格覆写、右键菜单等)都以「扩展」的形式插入。\n//\n// 一个扩展是一个普通对象,因此可以自由组合:`extensions={[a, b, c]}`。\n// core 会按数组顺序依次调用每个 hook,未使用的能力零开销。\n//\n// 扩展可以挂载到以下几个明确的位置:\n// * `toolbar` —— 向工具栏贡献按钮/控件。\n// * `footer` —— 向表格底部(分页下方)贡献内容。\n// * `cell` —— 覆写某个单元格的渲染。\n// * `wrapRow` —— 包裹/增强已渲染的行(如 master-detail 面板)。\n// * `rowProps` —— 向行容器注入 DOM 属性/事件。\n// * `contextMenu` —— 贡献右键菜单项。\n// * `renderContent` —— 完全接管表格主体的渲染(Pivot 透视即基于此实现)。\n\nimport type { ReactNode } from 'react';\nimport type { Table, Row } from './tanstack-table';\n\n/** 交给每个扩展 hook 的表格读/写访问句柄。 */\nexport interface DataTableApi<T extends object> {\n /** 底层 TanStack Table 实例。 */\n readonly table: Table<T>;\n /** 原始数据源(未经分页/展开处理)。 */\n readonly data: T[];\n /** 当前页可见的行对象(TanStack Row)。 */\n readonly rows: Row<T>[];\n /** 当前选中的行数据。 */\n readonly selectedRows: T[];\n /** 解析行的稳定 id。 */\n getRowId: (row: T, index: number) => string;\n}\n\n/** 行级扩展 hook 的上下文。 */\nexport interface DataTableRowContext<T extends object> {\n row: T;\n rowId: string;\n rowIndex: number;\n selected: boolean;\n}\n\n/** 单元格级扩展 hook 的上下文。 */\nexport interface DataTableCellContext<T extends object> {\n value: unknown;\n row: T;\n rowId: string;\n rowIndex: number;\n columnId: string;\n}\n\n/** 扩展贡献的右键菜单项。 */\nexport interface DataTableMenuItem<T extends object> {\n key: string;\n label: ReactNode;\n onSelect?: (ctx: DataTableCellContext<T>) => void;\n disabled?: boolean;\n separator?: boolean;\n}\n\n/**\n * 一个可插拔的表格能力。只需实现你需要的 hook,所有字段都是可选的。\n * 扩展会拿到实时的 {@link DataTableApi},可以读取状态并派发更新。\n */\nexport interface DataTableExtension<T extends object> {\n /** 唯一名称,用于去重与调试。 */\n name: string;\n\n /** 向工具栏贡献控件,位于内置控件之后,从左到右渲染。 */\n toolbar?: (api: DataTableApi<T>) => ReactNode;\n\n /** 向底部(表格/分页下方)贡献控件。 */\n footer?: (api: DataTableApi<T>) => ReactNode;\n\n /**\n * 覆写单元格渲染。返回 `undefined` 表示交给下一个扩展 / 列自身的 `cell` /\n * 原始值处理。\n */\n cell?: (\n ctx: DataTableCellContext<T>,\n api: DataTableApi<T>,\n ) => ReactNode | undefined;\n\n /**\n * 包裹一整行。可用于在行「下方」渲染 master/detail 面板。\n * 若不想处理某一行,原样返回 `children` 即可。\n */\n wrapRow?: (\n children: ReactNode,\n ctx: DataTableRowContext<T>,\n api: DataTableApi<T>,\n ) => ReactNode;\n\n /** 向行容器注入 DOM 属性(浅合并,后者覆盖前者)。 */\n rowProps?: (\n ctx: DataTableRowContext<T>,\n api: DataTableApi<T>,\n ) => React.HTMLAttributes<HTMLTableRowElement> | undefined;\n\n /** 为单元格贡献右键菜单项。 */\n contextMenu?: (\n ctx: DataTableCellContext<T>,\n api: DataTableApi<T>,\n ) => DataTableMenuItem<T>[];\n\n /**\n * 完全接管表格主体的渲染。返回非 `undefined` 时,core 会用它替换默认的\n * 表格主体(此时不渲染表头/表体/分页)。Pivot 透视扩展即基于此实现。\n * 多个扩展同时提供时,数组中第一个返回非 `undefined` 的生效。\n */\n renderContent?: (api: DataTableApi<T>) => ReactNode | undefined;\n}\n\n/** 定义扩展的辅助函数,可获得完整的 `T` 类型推断。 */\nexport function defineExtension<T extends object>(\n ext: DataTableExtension<T>,\n): DataTableExtension<T> {\n return ext;\n}\n"],"mappings":";AAmHA,SAAgBA,EACZ,GACqB;CACrB,OAAOC;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"pivotEngine.js","names":[],"sources":["../../../../src/components/pro/DataTable/pivotEngine.ts"],"sourcesContent":["// 客户端透视(Pivot)聚合引擎。\n//\n// 参考 DataTable/frontend 的 pivotEngine 实现,在已加载的行上生成交叉表\n// (cross-tab)矩阵,并构建带层级聚合的行分组树,供 ag-grid 风格的透视视图使用。\n\n/** 支持的聚合函数。 */\nexport type PivotAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max';\n\n/** 透视配置。 */\nexport interface PivotConfig {\n /** 行分组字段(可多级)。 */\n rowFields: string[];\n /** 列分组字段(交叉表列头,可多级)。 */\n colFields: string[];\n /** 参与聚合的数值字段。 */\n valueField: string;\n /** 聚合函数。 */\n aggFn: PivotAggFn;\n}\n\n/**\n * 行分组树节点。每个节点携带完整的 key 路径、展示标签(key 的最后一段)、\n * 记录数、自身正确聚合后的一行单元格(每个列 key 一个),以及子节点。\n */\nexport interface PivotRowNode {\n key: string[];\n label: string;\n count: number;\n cells: (number | null)[];\n children: PivotRowNode[];\n depth: number;\n}\n\n/** 透视计算结果。 */\nexport interface PivotResult {\n rowKeys: string[][];\n colKeys: string[][];\n rowFields: string[];\n colFields: string[];\n matrix: (number | null)[][];\n /** 每个行 key 的总记录数(顺序与 `rowKeys` 一致)。 */\n rowCounts: number[];\n /**\n * 带层级正确聚合的行分组树。存在至少一个行字段时生成,供树形透视视图使用。\n */\n rowTree: PivotRowNode[];\n}\n\ninterface Acc {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\nfunction newAcc(): Acc {\n return { sum: 0, count: 0, min: Infinity, max: -Infinity };\n}\n\nfunction push(acc: Acc, v: number) {\n acc.sum += v;\n acc.count += 1;\n if (v < acc.min) acc.min = v;\n if (v > acc.max) acc.max = v;\n}\n\nfunction finalize(acc: Acc | undefined, fn: PivotAggFn): number | null {\n if (!acc || acc.count === 0) return null;\n switch (fn) {\n case 'sum':\n return acc.sum;\n case 'avg':\n return acc.sum / acc.count;\n case 'count':\n return acc.count;\n case 'min':\n return acc.min;\n case 'max':\n return acc.max;\n }\n}\n\nconst SEP = '\\u0001';\n\nfunction keyOf(row: Record<string, unknown>, fields: string[]): string[] {\n return fields.map((f) => String(row[f]));\n}\n\nfunction compareKeys(a: string[], b: string[]): number {\n for (let i = 0; i < a.length; i++) {\n if (a[i] < b[i]) return -1;\n if (a[i] > b[i]) return 1;\n }\n return 0;\n}\n\n/**\n * 客户端透视聚合。生成一个交叉表矩阵,设计为在已加载的行上运行。\n */\nexport function computePivot<T extends object>(\n rows: T[],\n config: PivotConfig,\n): PivotResult {\n const { rowFields, colFields, valueField, aggFn } = config;\n const rowKeySet = new Map<string, string[]>();\n const colKeySet = new Map<string, string[]>();\n const cells = new Map<string, Acc>();\n const rowTotals = new Map<string, number>();\n\n // 前缀累加器:为每个行前缀长度(1..rowFields.length)维护\n // 一个独立的 Acc(按 prefixKey × colKey)以及记录数,\n // 让父级树节点能对每种聚合函数正确地完成自身聚合\n // (avg/min/max 无法简单地从子节点求和得到)。\n const prefixCells = new Map<string, Acc>();\n const prefixCounts = new Map<string, number>();\n const prefixKeys = new Map<string, string[]>();\n\n for (const raw of rows) {\n const row = raw as Record<string, unknown>;\n const rk = keyOf(row, rowFields);\n const ck = keyOf(row, colFields);\n const rkStr = rk.join(SEP);\n const ckStr = ck.join(SEP);\n if (!rowKeySet.has(rkStr)) rowKeySet.set(rkStr, rk);\n if (!colKeySet.has(ckStr)) colKeySet.set(ckStr, ck);\n rowTotals.set(rkStr, (rowTotals.get(rkStr) ?? 0) + 1);\n const cellKey = rkStr + SEP + SEP + ckStr;\n let acc = cells.get(cellKey);\n if (!acc) {\n acc = newAcc();\n cells.set(cellKey, acc);\n }\n const v = Number(row[valueField]) || 0;\n push(acc, v);\n\n // 累加行 key 的每一个前缀。\n for (let len = 1; len <= rowFields.length; len++) {\n const prefix = rk.slice(0, len);\n const pStr = prefix.join(SEP);\n if (!prefixKeys.has(pStr)) prefixKeys.set(pStr, prefix);\n prefixCounts.set(pStr, (prefixCounts.get(pStr) ?? 0) + 1);\n const pCellKey = pStr + SEP + SEP + ckStr;\n let pAcc = prefixCells.get(pCellKey);\n if (!pAcc) {\n pAcc = newAcc();\n prefixCells.set(pCellKey, pAcc);\n }\n push(pAcc, v);\n }\n }\n\n const rowKeys = [...rowKeySet.values()].sort(compareKeys);\n const colKeys =\n colFields.length === 0 ? [[]] : [...colKeySet.values()].sort(compareKeys);\n\n const matrix: (number | null)[][] = rowKeys.map((rk) => {\n const rkStr = rk.join(SEP);\n return colKeys.map((ck) => {\n const ckStr = ck.join(SEP);\n return finalize(cells.get(rkStr + SEP + SEP + ckStr), aggFn);\n });\n });\n\n const rowCounts = rowKeys.map((rk) => rowTotals.get(rk.join(SEP)) ?? 0);\n\n const rowTree = buildRowTree(rowKeys, colKeys, prefixCells, prefixCounts, aggFn);\n\n return { rowKeys, colKeys, rowFields, colFields, matrix, rowCounts, rowTree };\n}\n\n/**\n * 从每前缀累加器组装嵌套的行分组树。每个节点从自身的前缀累加器完成自身单元格\n * (每个列 key 一个),因此在任意层级、任意聚合函数下都是正确的。\n */\nfunction buildRowTree(\n rowKeys: string[][],\n colKeys: string[][],\n prefixCells: Map<string, Acc>,\n prefixCounts: Map<string, number>,\n aggFn: PivotAggFn,\n): PivotRowNode[] {\n const roots: PivotRowNode[] = [];\n const byPrefix = new Map<string, PivotRowNode>();\n\n const makeNode = (prefix: string[]): PivotRowNode => {\n const pStr = prefix.join(SEP);\n const nodeCells = colKeys.map((ck) =>\n finalize(prefixCells.get(pStr + SEP + SEP + ck.join(SEP)), aggFn),\n );\n return {\n key: prefix,\n label: prefix[prefix.length - 1] ?? '',\n count: prefixCounts.get(pStr) ?? 0,\n cells: nodeCells,\n children: [],\n depth: prefix.length - 1,\n };\n };\n\n for (const rk of rowKeys) {\n for (let len = 1; len <= rk.length; len++) {\n const prefix = rk.slice(0, len);\n const pStr = prefix.join(SEP);\n if (byPrefix.has(pStr)) continue;\n const node = makeNode(prefix);\n byPrefix.set(pStr, node);\n if (len === 1) {\n roots.push(node);\n } else {\n const parentStr = prefix.slice(0, len - 1).join(SEP);\n byPrefix.get(parentStr)?.children.push(node);\n }\n }\n }\n\n return roots;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pivotEngine.js","names":["newAcc","push","v","acc","finalize","fn","keyOf","fields","row","f","compareKeys","i","a","b","computePivot","config","rowKeySet","colKeySet","cells","rowTotals","prefixCells","prefixCounts","prefixKeys","raw","rows","rk","rowFields","ck","colFields","rkStr","ckStr","cellKey","valueField","len","prefix","pStr","pCellKey","pAcc","rowKeys","colKeys","aggFn","buildRowTree","roots","byPrefix","makeNode","nodeCells","node","parentStr"],"sources":["../../../../src/components/pro/DataTable/pivotEngine.ts"],"sourcesContent":["// 客户端透视(Pivot)聚合引擎。\n//\n// 参考 DataTable/frontend 的 pivotEngine 实现,在已加载的行上生成交叉表\n// (cross-tab)矩阵,并构建带层级聚合的行分组树,供 ag-grid 风格的透视视图使用。\n\n/** 支持的聚合函数。 */\nexport type PivotAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max';\n\n/** 透视配置。 */\nexport interface PivotConfig {\n /** 行分组字段(可多级)。 */\n rowFields: string[];\n /** 列分组字段(交叉表列头,可多级)。 */\n colFields: string[];\n /** 参与聚合的数值字段。 */\n valueField: string;\n /** 聚合函数。 */\n aggFn: PivotAggFn;\n}\n\n/**\n * 行分组树节点。每个节点携带完整的 key 路径、展示标签(key 的最后一段)、\n * 记录数、自身正确聚合后的一行单元格(每个列 key 一个),以及子节点。\n */\nexport interface PivotRowNode {\n key: string[];\n label: string;\n count: number;\n cells: (number | null)[];\n children: PivotRowNode[];\n depth: number;\n}\n\n/** 透视计算结果。 */\nexport interface PivotResult {\n rowKeys: string[][];\n colKeys: string[][];\n rowFields: string[];\n colFields: string[];\n matrix: (number | null)[][];\n /** 每个行 key 的总记录数(顺序与 `rowKeys` 一致)。 */\n rowCounts: number[];\n /**\n * 带层级正确聚合的行分组树。存在至少一个行字段时生成,供树形透视视图使用。\n */\n rowTree: PivotRowNode[];\n}\n\ninterface Acc {\n sum: number;\n count: number;\n min: number;\n max: number;\n}\n\nfunction newAcc(): Acc {\n return { sum: 0, count: 0, min: Infinity, max: -Infinity };\n}\n\nfunction push(acc: Acc, v: number) {\n acc.sum += v;\n acc.count += 1;\n if (v < acc.min) acc.min = v;\n if (v > acc.max) acc.max = v;\n}\n\nfunction finalize(acc: Acc | undefined, fn: PivotAggFn): number | null {\n if (!acc || acc.count === 0) return null;\n switch (fn) {\n case 'sum':\n return acc.sum;\n case 'avg':\n return acc.sum / acc.count;\n case 'count':\n return acc.count;\n case 'min':\n return acc.min;\n case 'max':\n return acc.max;\n }\n}\n\nconst SEP = '\\u0001';\n\nfunction keyOf(row: Record<string, unknown>, fields: string[]): string[] {\n return fields.map((f) => String(row[f]));\n}\n\nfunction compareKeys(a: string[], b: string[]): number {\n for (let i = 0; i < a.length; i++) {\n if (a[i] < b[i]) return -1;\n if (a[i] > b[i]) return 1;\n }\n return 0;\n}\n\n/**\n * 客户端透视聚合。生成一个交叉表矩阵,设计为在已加载的行上运行。\n */\nexport function computePivot<T extends object>(\n rows: T[],\n config: PivotConfig,\n): PivotResult {\n const { rowFields, colFields, valueField, aggFn } = config;\n const rowKeySet = new Map<string, string[]>();\n const colKeySet = new Map<string, string[]>();\n const cells = new Map<string, Acc>();\n const rowTotals = new Map<string, number>();\n\n // 前缀累加器:为每个行前缀长度(1..rowFields.length)维护\n // 一个独立的 Acc(按 prefixKey × colKey)以及记录数,\n // 让父级树节点能对每种聚合函数正确地完成自身聚合\n // (avg/min/max 无法简单地从子节点求和得到)。\n const prefixCells = new Map<string, Acc>();\n const prefixCounts = new Map<string, number>();\n const prefixKeys = new Map<string, string[]>();\n\n for (const raw of rows) {\n const row = raw as Record<string, unknown>;\n const rk = keyOf(row, rowFields);\n const ck = keyOf(row, colFields);\n const rkStr = rk.join(SEP);\n const ckStr = ck.join(SEP);\n if (!rowKeySet.has(rkStr)) rowKeySet.set(rkStr, rk);\n if (!colKeySet.has(ckStr)) colKeySet.set(ckStr, ck);\n rowTotals.set(rkStr, (rowTotals.get(rkStr) ?? 0) + 1);\n const cellKey = rkStr + SEP + SEP + ckStr;\n let acc = cells.get(cellKey);\n if (!acc) {\n acc = newAcc();\n cells.set(cellKey, acc);\n }\n const v = Number(row[valueField]) || 0;\n push(acc, v);\n\n // 累加行 key 的每一个前缀。\n for (let len = 1; len <= rowFields.length; len++) {\n const prefix = rk.slice(0, len);\n const pStr = prefix.join(SEP);\n if (!prefixKeys.has(pStr)) prefixKeys.set(pStr, prefix);\n prefixCounts.set(pStr, (prefixCounts.get(pStr) ?? 0) + 1);\n const pCellKey = pStr + SEP + SEP + ckStr;\n let pAcc = prefixCells.get(pCellKey);\n if (!pAcc) {\n pAcc = newAcc();\n prefixCells.set(pCellKey, pAcc);\n }\n push(pAcc, v);\n }\n }\n\n const rowKeys = [...rowKeySet.values()].sort(compareKeys);\n const colKeys =\n colFields.length === 0 ? [[]] : [...colKeySet.values()].sort(compareKeys);\n\n const matrix: (number | null)[][] = rowKeys.map((rk) => {\n const rkStr = rk.join(SEP);\n return colKeys.map((ck) => {\n const ckStr = ck.join(SEP);\n return finalize(cells.get(rkStr + SEP + SEP + ckStr), aggFn);\n });\n });\n\n const rowCounts = rowKeys.map((rk) => rowTotals.get(rk.join(SEP)) ?? 0);\n\n const rowTree = buildRowTree(rowKeys, colKeys, prefixCells, prefixCounts, aggFn);\n\n return { rowKeys, colKeys, rowFields, colFields, matrix, rowCounts, rowTree };\n}\n\n/**\n * 从每前缀累加器组装嵌套的行分组树。每个节点从自身的前缀累加器完成自身单元格\n * (每个列 key 一个),因此在任意层级、任意聚合函数下都是正确的。\n */\nfunction buildRowTree(\n rowKeys: string[][],\n colKeys: string[][],\n prefixCells: Map<string, Acc>,\n prefixCounts: Map<string, number>,\n aggFn: PivotAggFn,\n): PivotRowNode[] {\n const roots: PivotRowNode[] = [];\n const byPrefix = new Map<string, PivotRowNode>();\n\n const makeNode = (prefix: string[]): PivotRowNode => {\n const pStr = prefix.join(SEP);\n const nodeCells = colKeys.map((ck) =>\n finalize(prefixCells.get(pStr + SEP + SEP + ck.join(SEP)), aggFn),\n );\n return {\n key: prefix,\n label: prefix[prefix.length - 1] ?? '',\n count: prefixCounts.get(pStr) ?? 0,\n cells: nodeCells,\n children: [],\n depth: prefix.length - 1,\n };\n };\n\n for (const rk of rowKeys) {\n for (let len = 1; len <= rk.length; len++) {\n const prefix = rk.slice(0, len);\n const pStr = prefix.join(SEP);\n if (byPrefix.has(pStr)) continue;\n const node = makeNode(prefix);\n byPrefix.set(pStr, node);\n if (len === 1) {\n roots.push(node);\n } else {\n const parentStr = prefix.slice(0, len - 1).join(SEP);\n byPrefix.get(parentStr)?.children.push(node);\n }\n }\n }\n\n return roots;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pivotExtension.js","names":[],"sources":["../../../../src/components/pro/DataTable/pivotExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n PivotView,\n type PivotValue,\n type PivotFieldLabels,\n} from './PivotView';\nimport { PivotPanel } from './PivotPanel';\nimport type { DataTableExtension } from './extension';\n\n/** 可参与透视的字段描述。 */\nexport interface PivotField {\n /** 字段 key(对应数据对象的属性名)。 */\n field: string;\n /** 展示标签。 */\n label?: string;\n /** 是否为可聚合的数值字段。默认 false(维度字段)。 */\n numeric?: boolean;\n}\n\n/** 配置面板的排布位置。 */\nexport type PivotPanelPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface PivotExtensionOptions {\n /** 可用于透视的字段列表。 */\n fields: PivotField[];\n /** 初始行分组字段。 */\n initialRowFields?: string[];\n /** 初始列分组字段。 */\n initialColFields?: string[];\n /** 初始数值度量。 */\n initialValues?: PivotValue[];\n /** 初始是否启用透视模式。默认 false。 */\n initialActive?: boolean;\n /** 是否以树形(可展开分组)展示多级行分组。默认 true。 */\n treeView?: boolean;\n /** 语言。默认 'zh'。 */\n lang?: 'zh' | 'en';\n /**\n * 配置面板的排布位置:\n * - `'top'`(默认)水平排布在工具栏下方;\n * - `'bottom'` 水平排布在透视表格下方;\n * - `'left'` / `'right'` 纵向排布在透视表格的左/右侧。\n */\n panelPlacement?: PivotPanelPlacement;\n /**\n * 垂直(`'left'`/`'right'`)面板的宽度。数字视为 px,字符串直接\n * 作为 CSS 宽度(如 `'20%'` / `'16rem'`)。仅对左/右侧纵向面板生效,\n * 默认 224px。\n */\n panelWidth?: number | string;\n /**\n * 隐藏工具栏中的「透视模式」开关。默认 false。\n * 适用于由外部(如宿主 Inspector)控制透视开关的场景:此时模式仅能通过\n * `initialActive` 设定,工具栏不再渲染开关;未激活时不占用任何工具栏空间。\n */\n hideModeToggle?: boolean;\n}\n\nconst TEXT = {\n zh: { pivotMode: '透视模式' },\n en: { pivotMode: 'Pivot Mode' },\n} as const;\n\n/**\n * 透视(Pivot)扩展。\n *\n * 使用方式(在组件内调用该 hook,因为它持有 React 状态):\n * ```tsx\n * const pivot = usePivotExtension<Row>({\n * fields: [\n * { field: 'region', label: '地区' },\n * { field: 'category', label: '品类' },\n * { field: 'amount', label: '金额', numeric: true },\n * ],\n * initialRowFields: ['region'],\n * initialValues: [{ field: 'amount', aggFn: 'sum' }],\n * panelPlacement: 'left', // 面板纵向排布在左侧\n * });\n * <DataTable data={data} columns={columns} extensions={[pivot]} />\n * ```\n *\n * 扩展会:\n * - 在工具栏放一个「透视模式」开关;\n * - 开启后通过 `renderContent` 接管表格主体,渲染 ag-grid 风格的交叉表 +\n * 可拖拽配置面板(支持顶部水平 / 左右纵向排布,拖拽时带跟随光标的拖拽引用)。\n */\nexport function usePivotExtension<T extends object>(\n options: PivotExtensionOptions,\n): DataTableExtension<T> {\n const {\n fields,\n initialRowFields = [],\n initialColFields = [],\n initialValues = [],\n initialActive = false,\n treeView = true,\n lang = 'zh',\n panelPlacement = 'top',\n panelWidth = 224,\n hideModeToggle = false,\n } = options;\n\n const [active, setActive] = useState(initialActive);\n const [rowFields, setRowFields] = useState<string[]>(initialRowFields);\n const [colFields, setColFields] = useState<string[]>(initialColFields);\n const [values, setValues] = useState<PivotValue[]>(initialValues);\n\n const t = TEXT[lang];\n\n const fieldLabels: PivotFieldLabels = useMemo(() => {\n const map: PivotFieldLabels = {};\n for (const f of fields) map[f.field] = f.label ?? f.field;\n return map;\n }, [fields]);\n\n const dimensionFields = useMemo(\n () => fields.filter((f) => !f.numeric),\n [fields],\n );\n const numericFields = useMemo(\n () => fields.filter((f) => f.numeric),\n [fields],\n );\n\n return useMemo<DataTableExtension<T>>(() => {\n const panel = (orientation: 'horizontal' | 'vertical') => (\n <PivotPanel\n orientation={orientation}\n lang={lang}\n fieldLabels={fieldLabels}\n dimensionFields={dimensionFields}\n numericFields={numericFields}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n setRowFields={setRowFields}\n setColFields={setColFields}\n setValues={setValues}\n panelWidth={panelWidth}\n />\n );\n\n return {\n name: 'pivot',\n toolbar: () => {\n // 隐藏开关时:未激活不渲染任何内容(不占空间);激活且面板在顶部\n // 时仅渲染面板本身。\n if (hideModeToggle) {\n if (!active || panelPlacement !== 'top') return null;\n return panel('horizontal');\n }\n return (\n <div className=\"w-full flex flex-col gap-2\">\n <label className=\"flex items-center gap-2 cursor-pointer w-fit\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-sm toggle-primary\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n />\n <span className=\"text-sm font-medium\">{t.pivotMode}</span>\n </label>\n {/* 顶部(水平)面板放在工具栏内。 */}\n {active && panelPlacement === 'top' && panel('horizontal')}\n </div>\n );\n },\n renderContent: (api) => {\n if (!active) return undefined;\n const content = (\n <PivotView<T>\n data={api.data}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n fieldLabels={fieldLabels}\n lang={lang}\n treeView={treeView}\n />\n );\n // 顶部面板已在工具栏内渲染,这里只渲染表格主体。\n if (panelPlacement === 'top') return content;\n // 底部面板:水平排布在透视表格下方。\n if (panelPlacement === 'bottom') {\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panel('horizontal')}\n </div>\n );\n }\n // 左/右侧纵向面板:与透视表格并排,默认与表格同高。\n return (\n <div className=\"flex gap-3 items-stretch\">\n {panelPlacement === 'left' && panel('vertical')}\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panelPlacement === 'right' && panel('vertical')}\n </div>\n );\n },\n };\n }, [\n active,\n rowFields,\n colFields,\n values,\n fieldLabels,\n dimensionFields,\n numericFields,\n treeView,\n lang,\n panelPlacement,\n panelWidth,\n hideModeToggle,\n t,\n ]);\n}\n"],"mappings":";;;;;AA0DA,IAAM,IAAO;CACT,IAAI,EAAE,WAAW,OAAO;CACxB,IAAI,EAAE,WAAW,aAAa;AAClC;AAyBA,SAAgB,EACZ,GACqB;CACrB,IAAM,EACF,WACA,sBAAmB,CAAC,GACpB,sBAAmB,CAAC,GACpB,mBAAgB,CAAC,GACjB,mBAAgB,IAChB,cAAW,IACX,UAAO,MACP,oBAAiB,OACjB,gBAAa,KACb,oBAAiB,OACjB,GAEE,CAAC,GAAQ,KAAa,EAAS,CAAa,GAC5C,CAAC,GAAW,KAAgB,EAAmB,CAAgB,GAC/D,CAAC,GAAW,KAAgB,EAAmB,CAAgB,GAC/D,CAAC,GAAQ,KAAa,EAAuB,CAAa,GAE1D,IAAI,EAAK,IAET,IAAgC,QAAc;EAChD,IAAM,IAAwB,CAAC;EAC/B,KAAK,IAAM,KAAK,GAAQ,EAAI,EAAE,SAAS,EAAE,SAAS,EAAE;EACpD,OAAO;CACX,GAAG,CAAC,CAAM,CAAC,GAEL,IAAkB,QACd,EAAO,QAAQ,MAAM,CAAC,EAAE,OAAO,GACrC,CAAC,CAAM,CACX,GACM,IAAgB,QACZ,EAAO,QAAQ,MAAM,EAAE,OAAO,GACpC,CAAC,CAAM,CACX;CAEA,OAAO,QAAqC;EACxC,IAAM,KAAS,MACX,kBAAC,GAAD;GACiB;GACP;GACO;GACI;GACF;GACJ;GACA;GACH;GACM;GACA;GACH;GACC;EACf,CAAA;EAGL,OAAO;GACH,MAAM;GACN,eAGQ,IACI,CAAC,KAAU,MAAmB,QAAc,OACzC,EAAM,YAAY,IAGzB,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,kBAAC,SAAD;KAAO,WAAU;KAAjB,UAAA,CACI,kBAAC,SAAD;MACI,MAAK;MACL,WAAU;MACV,SAAS;MACT,WAAW,MAAM,EAAU,EAAE,OAAO,OAAO;KAC9C,CAAA,GACD,kBAAC,QAAD;MAAM,WAAU;MAAuB,UAAA,EAAE;KAAgB,CAAA,CACtD;IAEN,CAAA,GAAA,KAAU,MAAmB,SAAS,EAAM,YAAY,CACxD;;GAGb,gBAAgB,MAAQ;IACpB,IAAI,CAAC,GAAQ;IACb,IAAM,IACF,kBAAC,GAAD;KACI,MAAM,EAAI;KACC;KACA;KACH;KACK;KACP;KACI;IACb,CAAA;IAcL,OAXI,MAAmB,QAAc,IAEjC,MAAmB,WAEf,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACI,kBAAC,OAAD;MAAK,WAAU;MAAkB,UAAA;KAAa,CAAA,GAC7C,EAAM,YAAY,CAClB;SAKT,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACK,MAAmB,UAAU,EAAM,UAAU;MAC9C,kBAAC,OAAD;OAAK,WAAU;OAAkB,UAAA;MAAa,CAAA;MAC7C,MAAmB,WAAW,EAAM,UAAU;KAC9C;;GAEb;EACJ;CACJ,GAAG;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC;AACL"}
1
+ {"version":3,"file":"pivotExtension.js","names":["TEXT","usePivotExtension","options","active","setActive","useState","initialActive","rowFields","setRowFields","initialRowFields","colFields","setColFields","initialColFields","values","setValues","initialValues","t","lang","fieldLabels","useMemo","map","f","fields","dimensionFields","numericFields","panel","PivotPanel","hideModeToggle","panelPlacement","content","PivotView","api","treeView","panelWidth"],"sources":["../../../../src/components/pro/DataTable/pivotExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n PivotView,\n type PivotValue,\n type PivotFieldLabels,\n} from './PivotView';\nimport { PivotPanel } from './PivotPanel';\nimport type { DataTableExtension } from './extension';\n\n/** 可参与透视的字段描述。 */\nexport interface PivotField {\n /** 字段 key(对应数据对象的属性名)。 */\n field: string;\n /** 展示标签。 */\n label?: string;\n /** 是否为可聚合的数值字段。默认 false(维度字段)。 */\n numeric?: boolean;\n}\n\n/** 配置面板的排布位置。 */\nexport type PivotPanelPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface PivotExtensionOptions {\n /** 可用于透视的字段列表。 */\n fields: PivotField[];\n /** 初始行分组字段。 */\n initialRowFields?: string[];\n /** 初始列分组字段。 */\n initialColFields?: string[];\n /** 初始数值度量。 */\n initialValues?: PivotValue[];\n /** 初始是否启用透视模式。默认 false。 */\n initialActive?: boolean;\n /** 是否以树形(可展开分组)展示多级行分组。默认 true。 */\n treeView?: boolean;\n /** 语言。默认 'zh'。 */\n lang?: 'zh' | 'en';\n /**\n * 配置面板的排布位置:\n * - `'top'`(默认)水平排布在工具栏下方;\n * - `'bottom'` 水平排布在透视表格下方;\n * - `'left'` / `'right'` 纵向排布在透视表格的左/右侧。\n */\n panelPlacement?: PivotPanelPlacement;\n /**\n * 垂直(`'left'`/`'right'`)面板的宽度。数字视为 px,字符串直接\n * 作为 CSS 宽度(如 `'20%'` / `'16rem'`)。仅对左/右侧纵向面板生效,\n * 默认 224px。\n */\n panelWidth?: number | string;\n /**\n * 隐藏工具栏中的「透视模式」开关。默认 false。\n * 适用于由外部(如宿主 Inspector)控制透视开关的场景:此时模式仅能通过\n * `initialActive` 设定,工具栏不再渲染开关;未激活时不占用任何工具栏空间。\n */\n hideModeToggle?: boolean;\n}\n\nconst TEXT = {\n zh: { pivotMode: '透视模式' },\n en: { pivotMode: 'Pivot Mode' },\n} as const;\n\n/**\n * 透视(Pivot)扩展。\n *\n * 使用方式(在组件内调用该 hook,因为它持有 React 状态):\n * ```tsx\n * const pivot = usePivotExtension<Row>({\n * fields: [\n * { field: 'region', label: '地区' },\n * { field: 'category', label: '品类' },\n * { field: 'amount', label: '金额', numeric: true },\n * ],\n * initialRowFields: ['region'],\n * initialValues: [{ field: 'amount', aggFn: 'sum' }],\n * panelPlacement: 'left', // 面板纵向排布在左侧\n * });\n * <DataTable data={data} columns={columns} extensions={[pivot]} />\n * ```\n *\n * 扩展会:\n * - 在工具栏放一个「透视模式」开关;\n * - 开启后通过 `renderContent` 接管表格主体,渲染 ag-grid 风格的交叉表 +\n * 可拖拽配置面板(支持顶部水平 / 左右纵向排布,拖拽时带跟随光标的拖拽引用)。\n */\nexport function usePivotExtension<T extends object>(\n options: PivotExtensionOptions,\n): DataTableExtension<T> {\n const {\n fields,\n initialRowFields = [],\n initialColFields = [],\n initialValues = [],\n initialActive = false,\n treeView = true,\n lang = 'zh',\n panelPlacement = 'top',\n panelWidth = 224,\n hideModeToggle = false,\n } = options;\n\n const [active, setActive] = useState(initialActive);\n const [rowFields, setRowFields] = useState<string[]>(initialRowFields);\n const [colFields, setColFields] = useState<string[]>(initialColFields);\n const [values, setValues] = useState<PivotValue[]>(initialValues);\n\n const t = TEXT[lang];\n\n const fieldLabels: PivotFieldLabels = useMemo(() => {\n const map: PivotFieldLabels = {};\n for (const f of fields) map[f.field] = f.label ?? f.field;\n return map;\n }, [fields]);\n\n const dimensionFields = useMemo(\n () => fields.filter((f) => !f.numeric),\n [fields],\n );\n const numericFields = useMemo(\n () => fields.filter((f) => f.numeric),\n [fields],\n );\n\n return useMemo<DataTableExtension<T>>(() => {\n const panel = (orientation: 'horizontal' | 'vertical') => (\n <PivotPanel\n orientation={orientation}\n lang={lang}\n fieldLabels={fieldLabels}\n dimensionFields={dimensionFields}\n numericFields={numericFields}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n setRowFields={setRowFields}\n setColFields={setColFields}\n setValues={setValues}\n panelWidth={panelWidth}\n />\n );\n\n return {\n name: 'pivot',\n toolbar: () => {\n // 隐藏开关时:未激活不渲染任何内容(不占空间);激活且面板在顶部\n // 时仅渲染面板本身。\n if (hideModeToggle) {\n if (!active || panelPlacement !== 'top') return null;\n return panel('horizontal');\n }\n return (\n <div className=\"w-full flex flex-col gap-2\">\n <label className=\"flex items-center gap-2 cursor-pointer w-fit\">\n <input\n type=\"checkbox\"\n className=\"toggle toggle-sm toggle-primary\"\n checked={active}\n onChange={(e) => setActive(e.target.checked)}\n />\n <span className=\"text-sm font-medium\">{t.pivotMode}</span>\n </label>\n {/* 顶部(水平)面板放在工具栏内。 */}\n {active && panelPlacement === 'top' && panel('horizontal')}\n </div>\n );\n },\n renderContent: (api) => {\n if (!active) return undefined;\n const content = (\n <PivotView<T>\n data={api.data}\n rowFields={rowFields}\n colFields={colFields}\n values={values}\n fieldLabels={fieldLabels}\n lang={lang}\n treeView={treeView}\n />\n );\n // 顶部面板已在工具栏内渲染,这里只渲染表格主体。\n if (panelPlacement === 'top') return content;\n // 底部面板:水平排布在透视表格下方。\n if (panelPlacement === 'bottom') {\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panel('horizontal')}\n </div>\n );\n }\n // 左/右侧纵向面板:与透视表格并排,默认与表格同高。\n return (\n <div className=\"flex gap-3 items-stretch\">\n {panelPlacement === 'left' && panel('vertical')}\n <div className=\"flex-1 min-w-0\">{content}</div>\n {panelPlacement === 'right' && panel('vertical')}\n </div>\n );\n },\n };\n }, [\n active,\n rowFields,\n colFields,\n values,\n fieldLabels,\n dimensionFields,\n numericFields,\n treeView,\n lang,\n panelPlacement,\n panelWidth,\n hideModeToggle,\n t,\n ]);\n}\n"],"mappings":";;;;;AA0DA,IAAMA,IAAO;CACT,IAAI,EAAE,WAAW,OAAO;CACxB,IAAI,EAAE,WAAW,aAAa;AAClC;AAyBA,SAAgBC,EACZ,GACqB;CACrB,IAAM,EACF,WACA,sBAAmB,CAAC,GACpB,sBAAmB,CAAC,GACpB,mBAAgB,CAAC,GACjB,mBAAgB,IAChB,cAAW,IACX,UAAO,MACP,oBAAiB,OACjB,gBAAa,KACb,oBAAiB,OACjBC,GAEE,CAACC,GAAQC,KAAaC,EAASC,CAAa,GAC5C,CAACC,GAAWC,KAAgBH,EAAmBI,CAAgB,GAC/D,CAACC,GAAWC,KAAgBN,EAAmBO,CAAgB,GAC/D,CAACC,GAAQC,KAAaT,EAAuBU,CAAa,GAE1DC,IAAIhB,EAAKiB,IAETC,IAAgCC,QAAc;EAChD,IAAMC,IAAwB,CAAC;EAC/B,KAAK,IAAMC,KAAKC,GAAQ,EAAID,EAAE,SAASA,EAAE,SAASA,EAAE;EACpD,OAAOD;CACX,GAAG,CAACE,CAAM,CAAC,GAELC,IAAkBJ,QACdG,EAAO,QAAQ,MAAM,CAACD,EAAE,OAAO,GACrC,CAACC,CAAM,CACX,GACME,IAAgBL,QACZG,EAAO,QAAQ,MAAMD,EAAE,OAAO,GACpC,CAACC,CAAM,CACX;CAEA,OAAOH,QAAqC;EACxC,IAAMM,KAAS,MACX,kBAACC,GAAD;GACiB;GACP;GACO;GACI;GACF;GACJ;GACA;GACH;GACM;GACA;GACH;GACC;EACf,CAAA;EAGL,OAAO;GACH,MAAM;GACN,eAGQC,IACI,CAACxB,KAAUyB,MAAmB,QAAc,OACzCH,EAAM,YAAY,IAGzB,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,kBAAC,SAAD;KAAO,WAAU;KAAjB,UAAA,CACI,kBAAC,SAAD;MACI,MAAK;MACL,WAAU;MACV,SAAStB;MACT,WAAW,MAAMC,EAAU,EAAE,OAAO,OAAO;KAC9C,CAAA,GACD,kBAAC,QAAD;MAAM,WAAU;MAAuB,UAAAY,EAAE;KAAgB,CAAA,CACtD;IAEN,CAAA,GAAAb,KAAUyB,MAAmB,SAASH,EAAM,YAAY,CACxD;;GAGb,gBAAgB,MAAQ;IACpB,IAAI,CAACtB,GAAQ;IACb,IAAM0B,IACF,kBAACC,GAAD;KACI,MAAMC,EAAI;KACC;KACA;KACH;KACK;KACP;KACI;IACb,CAAA;IAcL,OAXIH,MAAmB,QAAcC,IAEjCD,MAAmB,WAEf,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACI,kBAAC,OAAD;MAAK,WAAU;MAAkB,UAAAC;KAAa,CAAA,GAC7CJ,EAAM,YAAY,CAClB;SAKT,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACKG,MAAmB,UAAUH,EAAM,UAAU;MAC9C,kBAAC,OAAD;OAAK,WAAU;OAAkB,UAAAI;MAAa,CAAA;MAC7CD,MAAmB,WAAWH,EAAM,UAAU;KAC9C;;GAEb;EACJ;CACJ,GAAG;EACCtB;EACAI;EACAG;EACAG;EACAK;EACAK;EACAC;EACAQ;EACAf;EACAW;EACAK;EACAN;EACAX;CACJ,CAAC;AACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"rowDetailExtension.js","names":[],"sources":["../../../../src/components/pro/DataTable/rowDetailExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport type { DataTableExtension, DataTableRowContext } from './extension';\n\nexport interface RowDetailOptions<T extends object> {\n /** 渲染展开后的行详情面板。 */\n render: (ctx: DataTableRowContext<T>) => React.ReactNode;\n}\n\n/**\n * 行详情(master/detail)扩展。\n *\n * 由于扩展是普通对象无法持有 React 状态,这里以 hook 工厂的形式返回一个绑定了\n * 展开状态的扩展。为每一行的第一列注入一个展开按钮(通过 `cell` 覆写),点击后\n * 在该行下方渲染一个详情面板(通过 `wrapRow`)。\n *\n * 使用方式:\n * ```tsx\n * const detail = useRowDetailExtension<Row>({\n * render: ({ row }) => <pre>{JSON.stringify(row, null, 2)}</pre>,\n * });\n * <DataTable data={data} columns={columns} extensions={[detail]} />\n * ```\n */\nexport function useRowDetailExtension<T extends object>({\n render,\n}: RowDetailOptions<T>): DataTableExtension<T> {\n const [open, setOpen] = useState<Record<string, boolean>>({});\n\n return useMemo<DataTableExtension<T>>(\n () => ({\n name: 'row-detail',\n wrapRow: (children, ctx) => {\n if (!open[ctx.rowId]) return children;\n return (\n <>\n {children}\n <tr className=\"table-row dishui-table-card__detail\">\n <td className=\"table-cell p-0\" colSpan={9999}>\n <div className=\"bg-base-200/60 p-4 border-l-4 border-primary\">\n {render(ctx)}\n </div>\n </td>\n </tr>\n </>\n );\n },\n rowProps: (ctx) =>\n ({\n 'data-detail-open': open[ctx.rowId] ? 'true' : undefined,\n }) as React.HTMLAttributes<HTMLTableRowElement>,\n // 通过右键菜单切换详情面板,避免占用列布局。\n contextMenu: (ctx) => [\n {\n key: 'toggle-detail',\n label: open[ctx.rowId] ? '收起详情' : '展开详情',\n onSelect: () =>\n setOpen((s) => ({ ...s, [ctx.rowId]: !s[ctx.rowId] })),\n },\n ],\n }),\n [open, render],\n );\n}\n"],"mappings":";;;AAuBA,SAAgB,EAAwC,EACpD,aAC2C;CAC3C,IAAM,CAAC,GAAM,KAAW,EAAkC,CAAC,CAAC;CAE5D,OAAO,SACI;EACH,MAAM;EACN,UAAU,GAAU,MACX,EAAK,EAAI,SAEV,kBAAA,GAAA,EAAA,UAAA,CACK,GACD,kBAAC,MAAD;GAAI,WAAU;GACV,UAAA,kBAAC,MAAD;IAAI,WAAU;IAAiB,SAAS;IACpC,UAAA,kBAAC,OAAD;KAAK,WAAU;KACV,UAAA,EAAO,CAAG;IACV,CAAA;GACL,CAAA;EACJ,CAAA,CACN,EAAA,CAAA,IAXuB;EAcjC,WAAW,OACN,EACG,oBAAoB,EAAK,EAAI,SAAS,SAAS,KAAA,EACnD;EAEJ,cAAc,MAAQ,CAClB;GACI,KAAK;GACL,OAAO,EAAK,EAAI,SAAS,SAAS;GAClC,gBACI,GAAS,OAAO;IAAE,GAAG;KAAI,EAAI,QAAQ,CAAC,EAAE,EAAI;GAAO,EAAE;EAC7D,CACJ;CACJ,IACA,CAAC,GAAM,CAAM,CACjB;AACJ"}
1
+ {"version":3,"file":"rowDetailExtension.js","names":["_Fragment","useRowDetailExtension","open","setOpen","useState","useMemo","ctx","Fragment","children","render","s"],"sources":["../../../../src/components/pro/DataTable/rowDetailExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport type { DataTableExtension, DataTableRowContext } from './extension';\n\nexport interface RowDetailOptions<T extends object> {\n /** 渲染展开后的行详情面板。 */\n render: (ctx: DataTableRowContext<T>) => React.ReactNode;\n}\n\n/**\n * 行详情(master/detail)扩展。\n *\n * 由于扩展是普通对象无法持有 React 状态,这里以 hook 工厂的形式返回一个绑定了\n * 展开状态的扩展。为每一行的第一列注入一个展开按钮(通过 `cell` 覆写),点击后\n * 在该行下方渲染一个详情面板(通过 `wrapRow`)。\n *\n * 使用方式:\n * ```tsx\n * const detail = useRowDetailExtension<Row>({\n * render: ({ row }) => <pre>{JSON.stringify(row, null, 2)}</pre>,\n * });\n * <DataTable data={data} columns={columns} extensions={[detail]} />\n * ```\n */\nexport function useRowDetailExtension<T extends object>({\n render,\n}: RowDetailOptions<T>): DataTableExtension<T> {\n const [open, setOpen] = useState<Record<string, boolean>>({});\n\n return useMemo<DataTableExtension<T>>(\n () => ({\n name: 'row-detail',\n wrapRow: (children, ctx) => {\n if (!open[ctx.rowId]) return children;\n return (\n <>\n {children}\n <tr className=\"table-row dishui-table-card__detail\">\n <td className=\"table-cell p-0\" colSpan={9999}>\n <div className=\"bg-base-200/60 p-4 border-l-4 border-primary\">\n {render(ctx)}\n </div>\n </td>\n </tr>\n </>\n );\n },\n rowProps: (ctx) =>\n ({\n 'data-detail-open': open[ctx.rowId] ? 'true' : undefined,\n }) as React.HTMLAttributes<HTMLTableRowElement>,\n // 通过右键菜单切换详情面板,避免占用列布局。\n contextMenu: (ctx) => [\n {\n key: 'toggle-detail',\n label: open[ctx.rowId] ? '收起详情' : '展开详情',\n onSelect: () =>\n setOpen((s) => ({ ...s, [ctx.rowId]: !s[ctx.rowId] })),\n },\n ],\n }),\n [open, render],\n );\n}\n"],"mappings":";;;AAuBA,SAAgBC,EAAwC,EACpD,aAC2C;CAC3C,IAAM,CAACC,GAAMC,KAAWC,EAAkC,CAAC,CAAC;CAE5D,OAAOC,SACI;EACH,MAAM;EACN,UAAU,GAAU,MACXH,EAAKI,EAAI,SAEV,kBAAAN,GAAA,EAAA,UAAA,CACKQ,GACD,kBAAC,MAAD;GAAI,WAAU;GACV,UAAA,kBAAC,MAAD;IAAI,WAAU;IAAiB,SAAS;IACpC,UAAA,kBAAC,OAAD;KAAK,WAAU;KACV,UAAAC,EAAOH,CAAG;IACV,CAAA;GACL,CAAA;EACJ,CAAA,CACN,EAAA,CAAA,IAXuBE;EAcjC,WAAW,OACN,EACG,oBAAoBN,EAAKI,EAAI,SAAS,SAAS,KAAA,EACnD;EAEJ,cAAc,MAAQ,CAClB;GACI,KAAK;GACL,OAAOJ,EAAKI,EAAI,SAAS,SAAS;GAClC,gBACIH,GAAS,OAAO;IAAE,GAAGO;KAAIJ,EAAI,QAAQ,CAACI,EAAEJ,EAAI;GAAO,EAAE;EAC7D,CACJ;CACJ,IACA,CAACJ,GAAMO,CAAM,CACjB;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"tanstack-table.js","names":[],"sources":["../../../../src/components/pro/DataTable/tanstack-table.ts"],"sourcesContent":["/**\n * TanStack Table v9 适配层(全面使用 v9 原生 API)。\n *\n * DishUI 的 DataTable 现已全面迁移到 TanStack Table v9 的原生 API:\n * - `useTable` + `tableFeatures({...})` 显式注册特性与 row model 工厂;\n * - row model 通过 `createCoreRowModel()` / `createSortedRowModel()` 等工厂注册;\n * - 使用 `table.state`(而非 v8 的 `table.getState()`)读取状态;\n * - 列定义的自定义排序使用 `sortFn`(v8 为 `sortingFn`)。\n *\n * 本模块把 v9 的多泛型类型(`<TFeatures, TData, TValue>`)用 `StockFeatures`\n * 预绑定成单泛型别名(`ColumnDef<T>`、`Row<T>`、`Table<T>` 等),让上层代码\n * 保持简洁;同时保留一个 v8 命名习惯的 `useReactTable` 包装器,内部把\n * 「row model 工厂」组装进 v9 的 `features`,从而对调用方屏蔽 v9 的 `features`\n * 组装细节。请始终从本模块导入表格相关类型与工具,而不要直接依赖\n * `@tanstack/react-table`。\n */\nimport {\n useTable,\n flexRender,\n sortFns as builtInSortFns,\n filterFns as builtInFilterFns,\n tableFeatures,\n type ReactTable,\n // 核心特性\n coreFeatures,\n // 各功能特性\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n // row model 工厂\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n} from '@tanstack/react-table';\nimport type {\n RowData,\n OnChangeFn,\n Updater,\n CellContext as CoreCellContext,\n HeaderContext as CoreHeaderContext,\n // 状态类型\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n ColumnVisibilityState,\n // 多泛型类型(用 StockFeatures 预绑定为单泛型别名)\n StockFeatures,\n Column as CoreColumn,\n ColumnDef as CoreColumnDef,\n Row as CoreRow,\n Cell as CoreCell,\n Header as CoreHeader,\n HeaderGroup as CoreHeaderGroup,\n SortFnOption,\n SortFn as CoreSortFn,\n FilterFn as CoreFilterFn,\n ColumnMeta as CoreColumnMeta,\n TableOptions,\n} from '@tanstack/react-table';\nimport { useMemo } from 'react';\n\nexport { flexRender, useTable, tableFeatures, builtInSortFns };\n\n/**\n * 一个包含全部常用特性 + row model 工厂的默认 features 预设。\n * `useReactTable` 会用它作为默认 `features`,因此调用方无需手动组装。\n * (内部常量:其推断类型引用了 table-core 的内部路径,不对外导出以避免\n * 声明文件的可移植性问题;对外通过 `DishUITableFeatures` 类型别名暴露。)\n */\nconst dishuiTableFeatures = tableFeatures({\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n sortFns: builtInSortFns,\n filterFns: builtInFilterFns,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n});\n\nexport type DishUITableFeatures = StockFeatures;\n\n// v9 原生 row model 工厂再导出(供需要精细控制 features 的调用方使用)。\nexport {\n coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n};\n\n// 单泛型(StockFeatures 预绑定)类型别名,保持上层简洁。\n// `Table` 映射到 `useTable` 返回的 ReactTable(具备 `.state` / `.FlexRender`)。\nexport type Table<TData extends RowData> = ReactTable<DishUITableFeatures, TData>;\nexport type Column<TData extends RowData, TValue = unknown> = CoreColumn<DishUITableFeatures, TData, TValue>;\nexport type ColumnDef<TData extends RowData, TValue = unknown> = CoreColumnDef<DishUITableFeatures, TData, TValue>;\nexport type Row<TData extends RowData> = CoreRow<DishUITableFeatures, TData>;\nexport type Cell<TData extends RowData, TValue = unknown> = CoreCell<DishUITableFeatures, TData, TValue>;\nexport type Header<TData extends RowData, TValue = unknown> = CoreHeader<DishUITableFeatures, TData, TValue>;\nexport type HeaderGroup<TData extends RowData> = CoreHeaderGroup<DishUITableFeatures, TData>;\nexport type CellContext<TData extends RowData, TValue = unknown> = CoreCellContext<DishUITableFeatures, TData, TValue>;\nexport type HeaderContext<TData extends RowData, TValue = unknown> = CoreHeaderContext<DishUITableFeatures, TData, TValue>;\n\n// 状态类型(沿用 v8 惯用命名)。\nexport type {\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n OnChangeFn,\n Updater,\n RowData,\n};\n\n/** v8 `VisibilityState` -> v9 `ColumnVisibilityState`。 */\nexport type VisibilityState = ColumnVisibilityState;\n\n/** 列的自定义排序函数(v9:`sortFn`)。 */\nexport type SortingFnOption<TData extends RowData> = SortFnOption<DishUITableFeatures, TData>;\nexport type SortingFn<TData extends RowData> = CoreSortFn<DishUITableFeatures, TData>;\nexport type FilterFn<TData extends RowData> = CoreFilterFn<DishUITableFeatures, TData>;\nexport type ColumnMeta<TData extends RowData, TValue = unknown> = CoreColumnMeta<DishUITableFeatures, TData, TValue>;\n\n/**\n * v8 命名习惯的表格 hook 包装器。\n *\n * 接收「已经组装好的」表格选项(不含 `features`),自动注入 DishUI 的默认\n * `features` 预设(含 core + 全部常用特性 + row model 工厂),返回 v9 原生\n * 的 `useTable` 实例。若需自定义排序/筛选函数注册表,可通过 `sortFns` /\n * `filterFns` 传入(会并入 features)。\n */\nexport function useReactTable<TData extends RowData>(\n options: Omit<TableOptions<DishUITableFeatures, TData>, 'features'> & {\n /** 自定义排序函数注册表(v9:合入 features 的 sortFns)。 */\n sortFns?: Record<string, SortingFn<TData>>;\n /** 自定义筛选函数注册表(v9:合入 features 的 filterFns)。 */\n filterFns?: Record<string, FilterFn<TData>>;\n },\n): Table<TData> {\n const { sortFns, filterFns, ...rest } = options;\n\n const features = useMemo(() => {\n if (!sortFns && !filterFns) return dishuiTableFeatures;\n const merged: Record<string, unknown> = {\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n };\n merged.sortFns = { ...builtInSortFns, ...sortFns };\n merged.filterFns = { ...builtInFilterFns, ...filterFns };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return tableFeatures(merged as any);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sortFns, filterFns]);\n\n return useTable<DishUITableFeatures, TData>({\n features,\n ...rest,\n } as TableOptions<DishUITableFeatures, TData>) as unknown as Table<TData>;\n}\n"],"mappings":";;;AA+EA,IAAM,IAAsB,EAAc;CACxC,GAAG;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,SAAS;CACE;CACX,cAAc,EAAmB;CACjC,kBAAkB,EAAuB;CACzC,gBAAgB,EAAqB;CACrC,mBAAmB,EAAwB;CAC3C,kBAAkB,EAAuB;AAC3C,CAAC;AAgED,SAAgB,EACd,GAMc;CACd,IAAM,EAAE,YAAS,WAAA,GAAW,GAAG,MAAS,GAElC,IAAW,QAAc;EAC7B,IAAI,CAAC,KAAW,CAAC,GAAW,OAAO;EACnC,IAAM,IAAkC;GACtC,GAAG;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,cAAc,EAAmB;GACjC,kBAAkB,EAAuB;GACzC,gBAAgB,EAAqB;GACrC,mBAAmB,EAAwB;GAC3C,kBAAkB,EAAuB;EAC3C;EAIA,OAHA,EAAO,UAAU;GAAE,GAAG;GAAgB,GAAG;EAAQ,GACjD,EAAO,YAAY;GAAE,GAAG;GAAkB,GAAG;EAAU,GAEhD,EAAc,CAAa;CAEpC,GAAG,CAAC,GAAS,CAAS,CAAC;CAEvB,OAAO,EAAqC;EAC1C;EACA,GAAG;CACL,CAA6C;AAC/C"}
1
+ {"version":3,"file":"tanstack-table.js","names":["builtInFilterFns","filterFns","builtInSortFns","dishuiTableFeatures","tableFeatures","coreFeatures","createCoreRowModel","createFilteredRowModel","createSortedRowModel","createPaginatedRowModel","createExpandedRowModel","useReactTable","filterFns$1","rest","options","features","useMemo","sortFns","merged","filterFns","useTable","columnFilteringFeature","columnOrderingFeature","columnVisibilityFeature","flexRender","globalFilteringFeature","rowExpandingFeature","rowPaginationFeature","rowSelectionFeature","rowSortingFeature"],"sources":["../../../../src/components/pro/DataTable/tanstack-table.ts"],"sourcesContent":["/**\n * TanStack Table v9 适配层(全面使用 v9 原生 API)。\n *\n * DishUI 的 DataTable 现已全面迁移到 TanStack Table v9 的原生 API:\n * - `useTable` + `tableFeatures({...})` 显式注册特性与 row model 工厂;\n * - row model 通过 `createCoreRowModel()` / `createSortedRowModel()` 等工厂注册;\n * - 使用 `table.state`(而非 v8 的 `table.getState()`)读取状态;\n * - 列定义的自定义排序使用 `sortFn`(v8 为 `sortingFn`)。\n *\n * 本模块把 v9 的多泛型类型(`<TFeatures, TData, TValue>`)用 `StockFeatures`\n * 预绑定成单泛型别名(`ColumnDef<T>`、`Row<T>`、`Table<T>` 等),让上层代码\n * 保持简洁;同时保留一个 v8 命名习惯的 `useReactTable` 包装器,内部把\n * 「row model 工厂」组装进 v9 的 `features`,从而对调用方屏蔽 v9 的 `features`\n * 组装细节。请始终从本模块导入表格相关类型与工具,而不要直接依赖\n * `@tanstack/react-table`。\n */\nimport {\n useTable,\n flexRender,\n sortFns as builtInSortFns,\n filterFns as builtInFilterFns,\n tableFeatures,\n type ReactTable,\n // 核心特性\n coreFeatures,\n // 各功能特性\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n // row model 工厂\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n} from '@tanstack/react-table';\nimport type {\n RowData,\n OnChangeFn,\n Updater,\n CellContext as CoreCellContext,\n HeaderContext as CoreHeaderContext,\n // 状态类型\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n ColumnVisibilityState,\n // 多泛型类型(用 StockFeatures 预绑定为单泛型别名)\n StockFeatures,\n Column as CoreColumn,\n ColumnDef as CoreColumnDef,\n Row as CoreRow,\n Cell as CoreCell,\n Header as CoreHeader,\n HeaderGroup as CoreHeaderGroup,\n SortFnOption,\n SortFn as CoreSortFn,\n FilterFn as CoreFilterFn,\n ColumnMeta as CoreColumnMeta,\n TableOptions,\n} from '@tanstack/react-table';\nimport { useMemo } from 'react';\n\nexport { flexRender, useTable, tableFeatures, builtInSortFns };\n\n/**\n * 一个包含全部常用特性 + row model 工厂的默认 features 预设。\n * `useReactTable` 会用它作为默认 `features`,因此调用方无需手动组装。\n * (内部常量:其推断类型引用了 table-core 的内部路径,不对外导出以避免\n * 声明文件的可移植性问题;对外通过 `DishUITableFeatures` 类型别名暴露。)\n */\nconst dishuiTableFeatures = tableFeatures({\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n sortFns: builtInSortFns,\n filterFns: builtInFilterFns,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n});\n\nexport type DishUITableFeatures = StockFeatures;\n\n// v9 原生 row model 工厂再导出(供需要精细控制 features 的调用方使用)。\nexport {\n coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n};\n\n// 单泛型(StockFeatures 预绑定)类型别名,保持上层简洁。\n// `Table` 映射到 `useTable` 返回的 ReactTable(具备 `.state` / `.FlexRender`)。\nexport type Table<TData extends RowData> = ReactTable<DishUITableFeatures, TData>;\nexport type Column<TData extends RowData, TValue = unknown> = CoreColumn<DishUITableFeatures, TData, TValue>;\nexport type ColumnDef<TData extends RowData, TValue = unknown> = CoreColumnDef<DishUITableFeatures, TData, TValue>;\nexport type Row<TData extends RowData> = CoreRow<DishUITableFeatures, TData>;\nexport type Cell<TData extends RowData, TValue = unknown> = CoreCell<DishUITableFeatures, TData, TValue>;\nexport type Header<TData extends RowData, TValue = unknown> = CoreHeader<DishUITableFeatures, TData, TValue>;\nexport type HeaderGroup<TData extends RowData> = CoreHeaderGroup<DishUITableFeatures, TData>;\nexport type CellContext<TData extends RowData, TValue = unknown> = CoreCellContext<DishUITableFeatures, TData, TValue>;\nexport type HeaderContext<TData extends RowData, TValue = unknown> = CoreHeaderContext<DishUITableFeatures, TData, TValue>;\n\n// 状态类型(沿用 v8 惯用命名)。\nexport type {\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n OnChangeFn,\n Updater,\n RowData,\n};\n\n/** v8 `VisibilityState` -> v9 `ColumnVisibilityState`。 */\nexport type VisibilityState = ColumnVisibilityState;\n\n/** 列的自定义排序函数(v9:`sortFn`)。 */\nexport type SortingFnOption<TData extends RowData> = SortFnOption<DishUITableFeatures, TData>;\nexport type SortingFn<TData extends RowData> = CoreSortFn<DishUITableFeatures, TData>;\nexport type FilterFn<TData extends RowData> = CoreFilterFn<DishUITableFeatures, TData>;\nexport type ColumnMeta<TData extends RowData, TValue = unknown> = CoreColumnMeta<DishUITableFeatures, TData, TValue>;\n\n/**\n * v8 命名习惯的表格 hook 包装器。\n *\n * 接收「已经组装好的」表格选项(不含 `features`),自动注入 DishUI 的默认\n * `features` 预设(含 core + 全部常用特性 + row model 工厂),返回 v9 原生\n * 的 `useTable` 实例。若需自定义排序/筛选函数注册表,可通过 `sortFns` /\n * `filterFns` 传入(会并入 features)。\n */\nexport function useReactTable<TData extends RowData>(\n options: Omit<TableOptions<DishUITableFeatures, TData>, 'features'> & {\n /** 自定义排序函数注册表(v9:合入 features 的 sortFns)。 */\n sortFns?: Record<string, SortingFn<TData>>;\n /** 自定义筛选函数注册表(v9:合入 features 的 filterFns)。 */\n filterFns?: Record<string, FilterFn<TData>>;\n },\n): Table<TData> {\n const { sortFns, filterFns, ...rest } = options;\n\n const features = useMemo(() => {\n if (!sortFns && !filterFns) return dishuiTableFeatures;\n const merged: Record<string, unknown> = {\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n };\n merged.sortFns = { ...builtInSortFns, ...sortFns };\n merged.filterFns = { ...builtInFilterFns, ...filterFns };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return tableFeatures(merged as any);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sortFns, filterFns]);\n\n return useTable<DishUITableFeatures, TData>({\n features,\n ...rest,\n } as TableOptions<DishUITableFeatures, TData>) as unknown as Table<TData>;\n}\n"],"mappings":";;;AA+EA,IAAMG,IAAsBC,EAAc;CACxC,GAAGC;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,SAASH;CACEF;CACX,cAAcM,EAAmB;CACjC,kBAAkBC,EAAuB;CACzC,gBAAgBC,EAAqB;CACrC,mBAAmBC,EAAwB;CAC3C,kBAAkBC,EAAuB;AAC3C,CAAC;AAgED,SAAgBC,EACd,GAMc;CACd,IAAM,EAAE,YAAS,WAAAC,GAAW,GAAGC,MAASC,GAElCC,IAAWC,QAAc;EAC7B,IAAI,CAACC,KAAW,CAAChB,GAAW,OAAOE;EACnC,IAAMe,IAAkC;GACtC,GAAGb;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,cAAcC,EAAmB;GACjC,kBAAkBC,EAAuB;GACzC,gBAAgBC,EAAqB;GACrC,mBAAmBC,EAAwB;GAC3C,kBAAkBC,EAAuB;EAC3C;EAIA,OAHA,EAAO,UAAU;GAAE,GAAGR;GAAgB,GAAGe;EAAQ,GACjD,EAAO,YAAY;GAAE,GAAGjB;GAAkB,GAAGC;EAAU,GAEhDG,EAAcc,CAAa;CAEpC,GAAG,CAACD,GAAShB,CAAS,CAAC;CAEvB,OAAOmB,EAAqC;EAC1C;EACA,GAAGP;CACL,CAA6C;AAC/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"treeDataUtils.js","names":[],"sources":["../../../../src/components/pro/DataTable/treeDataUtils.ts"],"sourcesContent":["import { Row } from './tanstack-table';\n\nexport const treeRowAnimationStyles = `\n.tree-row-icon {\n transition: transform 0.3s ease;\n}\n\n.tree-row-expanded .tree-row-icon {\n transform: rotate(90deg);\n}\n`;\n\nexport function findAllChildRowIds<T>(\n row: any,\n parentId: string,\n subDataKey: string,\n getRowId?: (row: T, index: number) => string,\n prefix: string = '',\n): string[] {\n const childIds: string[] = [];\n const subs = row[subDataKey];\n\n if (Array.isArray(subs) && subs.length > 0) {\n subs.forEach((subRow: any, index: number) => {\n const childId = getRowId\n ? getRowId(subRow, index)\n : `${parentId}_${index}`;\n\n childIds.push(childId);\n\n const subChildIds = findAllChildRowIds(\n subRow, childId, subDataKey, getRowId,\n );\n childIds.push(...subChildIds);\n });\n }\n\n return childIds;\n}\n\nexport function flattenTreeData<T extends object>(\n items: T[],\n expandedRowsState: Record<string, boolean>,\n subDataKey: string,\n getRowId?: (row: T, index: number) => string,\n depth: number = 0,\n parentId: string = '',\n isParentExpanded: boolean = true,\n result: any[] = [],\n onlyTopLevel: boolean = false,\n) {\n items.forEach((item: any, index: number) => {\n const rowId = getRowId\n ? getRowId(item, index)\n : parentId ? `${parentId}_${index}` : `${index}`;\n\n const rowWithMeta = {\n ...item,\n __depth: depth,\n __id: rowId,\n __parentId: parentId,\n __hasChildren: Array.isArray(item[subDataKey]) && item[subDataKey].length > 0,\n __isExpanded: expandedRowsState[rowId] || false,\n __childCount: Array.isArray(item[subDataKey]) ? item[subDataKey].length : 0,\n };\n\n if (onlyTopLevel) {\n if (depth === 0) result.push(rowWithMeta);\n } else {\n if (depth === 0 || isParentExpanded) result.push(rowWithMeta);\n }\n\n const isExpanded = expandedRowsState[rowId] || false;\n if (Array.isArray(item[subDataKey]) && item[subDataKey].length > 0 && isExpanded && !onlyTopLevel) {\n flattenTreeData(\n item[subDataKey], expandedRowsState, subDataKey, getRowId,\n depth + 1, rowId, isParentExpanded && isExpanded, result, onlyTopLevel,\n );\n }\n });\n\n return result;\n}\n\n/** Keep the hierarchy intact for TanStack's filter → sort → root-page → expand pipeline. */\nexport function prepareTreeData<T extends object>(\n items: T[],\n expanded: Record<string, boolean>,\n subDataKey: string,\n getRowId?: (row: T, index: number) => string,\n depth = 0,\n parentId = '',\n): T[] {\n return items.map((item, index) => {\n const id = getRowId ? getRowId(item, index) : depth > 0 ? `${parentId}_${index}` : String(index);\n const children = (item as Record<string, unknown>)[subDataKey];\n const subs = Array.isArray(children) ? children as T[] : [];\n return {\n ...item,\n [subDataKey]: prepareTreeData(subs, expanded, subDataKey, getRowId, depth + 1, id),\n __id: id,\n __parentId: parentId,\n __depth: depth,\n __hasChildren: subs.length > 0,\n __childCount: subs.length,\n __isExpanded: expanded[id] || false,\n };\n });\n}\n\nexport function createTreeSortingFns<T extends object>() {\n return {\n treeSortAsc: (rowA: Row<T>, rowB: Row<T>, columnId: string) => {\n const valueA = rowA.original as any;\n const valueB = rowB.original as any;\n\n const depthA = rowA.depth ?? valueA.__depth ?? 0;\n const depthB = rowB.depth ?? valueB.__depth ?? 0;\n\n if (depthA !== depthB) return 0;\n\n if (depthA === 0 && depthB === 0) {\n const colA = rowA.getValue(columnId);\n const colB = rowB.getValue(columnId);\n\n if (colA === colB) return 0;\n if (colA == null) return -1;\n if (colB == null) return 1;\n\n if (typeof colA === 'number' && typeof colB === 'number') {\n return colA - colB;\n }\n if (colA instanceof Date && colB instanceof Date) {\n return colA.getTime() - colB.getTime();\n }\n return String(colA).localeCompare(String(colB));\n }\n\n return 0;\n },\n };\n}\n"],"mappings":";AAEA,IAAa,IAAyB;AAUtC,SAAgB,EACd,GACA,GACA,GACA,GACA,IAAiB,IACP;CACV,IAAM,IAAqB,CAAC,GACtB,IAAO,EAAI;CAiBjB,OAfI,MAAM,QAAQ,CAAI,KAAK,EAAK,SAAS,KACvC,EAAK,SAAS,GAAa,MAAkB;EAC3C,IAAM,IAAU,IACZ,EAAS,GAAQ,CAAK,IACtB,GAAG,EAAS,GAAG;EAEnB,EAAS,KAAK,CAAO;EAErB,IAAM,IAAc,EAClB,GAAQ,GAAS,GAAY,CAC/B;EACA,EAAS,KAAK,GAAG,CAAW;CAC9B,CAAC,GAGI;AACT;AA+CA,SAAgB,EACd,GACA,GACA,GACA,GACA,IAAQ,GACR,IAAW,IACN;CACL,OAAO,EAAM,KAAK,GAAM,MAAU;EAChC,IAAM,IAAK,IAAW,EAAS,GAAM,CAAK,IAAI,IAAQ,IAAI,GAAG,EAAS,GAAG,MAAU,OAAO,CAAK,GACzF,IAAY,EAAiC,IAC7C,IAAO,MAAM,QAAQ,CAAQ,IAAI,IAAkB,CAAC;EAC1D,OAAO;GACL,GAAG;IACF,IAAa,EAAgB,GAAM,GAAU,GAAY,GAAU,IAAQ,GAAG,CAAE;GACjF,MAAM;GACN,YAAY;GACZ,SAAS;GACT,eAAe,EAAK,SAAS;GAC7B,cAAc,EAAK;GACnB,cAAc,EAAS,MAAO;EAChC;CACF,CAAC;AACH;AAEA,SAAgB,IAAyC;CACvD,OAAO,EACL,cAAc,GAAc,GAAc,MAAqB;EAC7D,IAAM,IAAS,EAAK,UACd,IAAS,EAAK,UAEd,IAAS,EAAK,SAAS,EAAO,WAAW,GACzC,IAAS,EAAK,SAAS,EAAO,WAAW;EAE/C,IAAI,MAAW,GAAQ,OAAO;EAE9B,IAAI,MAAW,KAAK,MAAW,GAAG;GAChC,IAAM,IAAO,EAAK,SAAS,CAAQ,GAC7B,IAAO,EAAK,SAAS,CAAQ;GAYnC,OAVI,MAAS,IAAa,IACtB,KAAQ,OAAa,KACrB,KAAQ,OAAa,IAErB,OAAO,KAAS,YAAY,OAAO,KAAS,WACvC,IAAO,IAEZ,aAAgB,QAAQ,aAAgB,OACnC,EAAK,QAAQ,IAAI,EAAK,QAAQ,IAEhC,OAAO,CAAI,CAAC,CAAC,cAAc,OAAO,CAAI,CAAC;EAChD;EAEA,OAAO;CACT,EACF;AACF"}
1
+ {"version":3,"file":"treeDataUtils.js","names":["treeRowAnimationStyles","findAllChildRowIds","childIds","subs","row","subDataKey","childId","getRowId","subRow","index","parentId","subChildIds","prepareTreeData","items","id","item","depth","children","expanded","createTreeSortingFns","valueA","rowA","valueB","rowB","depthA","depthB","colA","columnId","colB"],"sources":["../../../../src/components/pro/DataTable/treeDataUtils.ts"],"sourcesContent":["import { Row } from './tanstack-table';\n\nexport const treeRowAnimationStyles = `\n.tree-row-icon {\n transition: transform 0.3s ease;\n}\n\n.tree-row-expanded .tree-row-icon {\n transform: rotate(90deg);\n}\n`;\n\nexport function findAllChildRowIds<T>(\n row: any,\n parentId: string,\n subDataKey: string,\n getRowId?: (row: T, index: number) => string,\n prefix: string = '',\n): string[] {\n const childIds: string[] = [];\n const subs = row[subDataKey];\n\n if (Array.isArray(subs) && subs.length > 0) {\n subs.forEach((subRow: any, index: number) => {\n const childId = getRowId\n ? getRowId(subRow, index)\n : `${parentId}_${index}`;\n\n childIds.push(childId);\n\n const subChildIds = findAllChildRowIds(\n subRow, childId, subDataKey, getRowId,\n );\n childIds.push(...subChildIds);\n });\n }\n\n return childIds;\n}\n\nexport function flattenTreeData<T extends object>(\n items: T[],\n expandedRowsState: Record<string, boolean>,\n subDataKey: string,\n getRowId?: (row: T, index: number) => string,\n depth: number = 0,\n parentId: string = '',\n isParentExpanded: boolean = true,\n result: any[] = [],\n onlyTopLevel: boolean = false,\n) {\n items.forEach((item: any, index: number) => {\n const rowId = getRowId\n ? getRowId(item, index)\n : parentId ? `${parentId}_${index}` : `${index}`;\n\n const rowWithMeta = {\n ...item,\n __depth: depth,\n __id: rowId,\n __parentId: parentId,\n __hasChildren: Array.isArray(item[subDataKey]) && item[subDataKey].length > 0,\n __isExpanded: expandedRowsState[rowId] || false,\n __childCount: Array.isArray(item[subDataKey]) ? item[subDataKey].length : 0,\n };\n\n if (onlyTopLevel) {\n if (depth === 0) result.push(rowWithMeta);\n } else {\n if (depth === 0 || isParentExpanded) result.push(rowWithMeta);\n }\n\n const isExpanded = expandedRowsState[rowId] || false;\n if (Array.isArray(item[subDataKey]) && item[subDataKey].length > 0 && isExpanded && !onlyTopLevel) {\n flattenTreeData(\n item[subDataKey], expandedRowsState, subDataKey, getRowId,\n depth + 1, rowId, isParentExpanded && isExpanded, result, onlyTopLevel,\n );\n }\n });\n\n return result;\n}\n\n/** Keep the hierarchy intact for TanStack's filter → sort → root-page → expand pipeline. */\nexport function prepareTreeData<T extends object>(\n items: T[],\n expanded: Record<string, boolean>,\n subDataKey: string,\n getRowId?: (row: T, index: number) => string,\n depth = 0,\n parentId = '',\n): T[] {\n return items.map((item, index) => {\n const id = getRowId ? getRowId(item, index) : depth > 0 ? `${parentId}_${index}` : String(index);\n const children = (item as Record<string, unknown>)[subDataKey];\n const subs = Array.isArray(children) ? children as T[] : [];\n return {\n ...item,\n [subDataKey]: prepareTreeData(subs, expanded, subDataKey, getRowId, depth + 1, id),\n __id: id,\n __parentId: parentId,\n __depth: depth,\n __hasChildren: subs.length > 0,\n __childCount: subs.length,\n __isExpanded: expanded[id] || false,\n };\n });\n}\n\nexport function createTreeSortingFns<T extends object>() {\n return {\n treeSortAsc: (rowA: Row<T>, rowB: Row<T>, columnId: string) => {\n const valueA = rowA.original as any;\n const valueB = rowB.original as any;\n\n const depthA = rowA.depth ?? valueA.__depth ?? 0;\n const depthB = rowB.depth ?? valueB.__depth ?? 0;\n\n if (depthA !== depthB) return 0;\n\n if (depthA === 0 && depthB === 0) {\n const colA = rowA.getValue(columnId);\n const colB = rowB.getValue(columnId);\n\n if (colA === colB) return 0;\n if (colA == null) return -1;\n if (colB == null) return 1;\n\n if (typeof colA === 'number' && typeof colB === 'number') {\n return colA - colB;\n }\n if (colA instanceof Date && colB instanceof Date) {\n return colA.getTime() - colB.getTime();\n }\n return String(colA).localeCompare(String(colB));\n }\n\n return 0;\n },\n };\n}\n"],"mappings":";AAEA,IAAaA,IAAyB;AAUtC,SAAgBC,EACd,GACA,GACA,GACA,GACA,IAAiB,IACP;CACV,IAAMC,IAAqB,CAAC,GACtBC,IAAOC,EAAIC;CAiBjB,OAfI,MAAM,QAAQF,CAAI,KAAKA,EAAK,SAAS,KACvCA,EAAK,SAAS,GAAa,MAAkB;EAC3C,IAAMG,IAAUC,IACZA,EAASC,GAAQC,CAAK,IACtB,GAAGC,EAAS,GAAGD;EAEnB,EAAS,KAAKH,CAAO;EAErB,IAAMK,IAAcV,EAClBO,GAAQF,GAASD,GAAYE,CAC/B;EACA,EAAS,KAAK,GAAGI,CAAW;CAC9B,CAAC,GAGIT;AACT;AA+CA,SAAgBU,EACd,GACA,GACA,GACA,GACA,IAAQ,GACR,IAAW,IACN;CACL,OAAOC,EAAM,KAAK,GAAM,MAAU;EAChC,IAAMC,IAAKP,IAAWA,EAASQ,GAAMN,CAAK,IAAIO,IAAQ,IAAI,GAAGN,EAAS,GAAGD,MAAU,OAAOA,CAAK,GACzFQ,IAAYF,EAAiCV,IAC7CF,IAAO,MAAM,QAAQc,CAAQ,IAAIA,IAAkB,CAAC;EAC1D,OAAO;GACL,GAAGF;IACFV,IAAaO,EAAgBT,GAAMe,GAAUb,GAAYE,GAAUS,IAAQ,GAAGF,CAAE;GACjF,MAAMA;GACN,YAAYJ;GACZ,SAASM;GACT,eAAeb,EAAK,SAAS;GAC7B,cAAcA,EAAK;GACnB,cAAce,EAASJ,MAAO;EAChC;CACF,CAAC;AACH;AAEA,SAAgBK,IAAyC;CACvD,OAAO,EACL,cAAc,GAAc,GAAc,MAAqB;EAC7D,IAAMC,IAASC,EAAK,UACdC,IAASC,EAAK,UAEdC,IAASH,EAAK,SAASD,EAAO,WAAW,GACzCK,IAASF,EAAK,SAASD,EAAO,WAAW;EAE/C,IAAIE,MAAWC,GAAQ,OAAO;EAE9B,IAAID,MAAW,KAAKC,MAAW,GAAG;GAChC,IAAMC,IAAOL,EAAK,SAASM,CAAQ,GAC7BC,IAAOL,EAAK,SAASI,CAAQ;GAYnC,OAVID,MAASE,IAAa,IACtBF,KAAQ,OAAa,KACrBE,KAAQ,OAAa,IAErB,OAAOF,KAAS,YAAY,OAAOE,KAAS,WACvCF,IAAOE,IAEZF,aAAgB,QAAQE,aAAgB,OACnCF,EAAK,QAAQ,IAAIE,EAAK,QAAQ,IAEhC,OAAOF,CAAI,CAAC,CAAC,cAAc,OAAOE,CAAI,CAAC;EAChD;EAEA,OAAO;CACT,EACF;AACF"}