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