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.
- package/dist/.release-verified.json +3 -2
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonMenu/index.js.map +1 -1
- package/dist/components/Card/Metric2.js.map +1 -1
- package/dist/components/Card/Ticket2.js.map +1 -1
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/ChoicePicker/index.js.map +1 -1
- package/dist/components/Column/index.js.map +1 -1
- package/dist/components/ConfirmDialog/index.js.map +1 -1
- package/dist/components/DateTimeInput/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Demo/source.js.map +1 -1
- package/dist/components/Divider/index.js.map +1 -1
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Field/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/GroupButton/index.js.map +1 -1
- package/dist/components/GroupedTable/index.js.map +1 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/Layout/index.js.map +1 -1
- package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/codeThemes.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Modal/focusScope.js.map +1 -1
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/MultipleChoice/index.js.map +1 -1
- package/dist/components/NavigationList/index.js.map +1 -1
- package/dist/components/Page/Float2.js.map +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/Page/resize2.js.map +1 -1
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/PagePanel/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Resizable/ResizeGrip.js.map +1 -1
- package/dist/components/Resizable/index.js.map +1 -1
- package/dist/components/Resizable/useResize.js.map +1 -1
- package/dist/components/Row/index.js.map +1 -1
- package/dist/components/Section/index.js.map +1 -1
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Switch/index.js.map +1 -1
- package/dist/components/Tab/index.js.map +1 -1
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tabs/tabNavigation.js.map +1 -1
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/ai/AgentChat/index.js.map +1 -1
- package/dist/components/ai/AgentRunCard/index.js.map +1 -1
- package/dist/components/ai/AgentScreen/index.js.map +1 -1
- package/dist/components/ai/ApprovalCard/index.js.map +1 -1
- package/dist/components/ai/CodeView/index.js.map +1 -1
- package/dist/components/ai/CommandSearch/index.js.map +1 -1
- package/dist/components/ai/ContextCards/index.js.map +1 -1
- package/dist/components/ai/DiffTable/index.js.map +1 -1
- package/dist/components/ai/FilterTable/index.js.map +1 -1
- package/dist/components/ai/FineTuneCard/index.js.map +1 -1
- package/dist/components/ai/InsightCards/index.js.map +1 -1
- package/dist/components/ai/IssueCard/index.js.map +1 -1
- package/dist/components/ai/LoadingState/index.js.map +1 -1
- package/dist/components/ai/PromptBar/index.js.map +1 -1
- package/dist/components/ai/RecommendationCard/index.js.map +1 -1
- package/dist/components/ai/RecordsTable/index.js.map +1 -1
- package/dist/components/ai/SelectionActions/index.js.map +1 -1
- package/dist/components/ai/StateFlow/index.js.map +1 -1
- package/dist/components/ai/StreamingText/index.js.map +1 -1
- package/dist/components/ai/TaskRows/index.js.map +1 -1
- package/dist/components/ai/Thinking/index.js.map +1 -1
- package/dist/components/ai/ToolChips/index.js.map +1 -1
- package/dist/components/ai/shared.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
- package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
- package/dist/components/pro/Calendar/Calendar.js +165 -160
- package/dist/components/pro/Calendar/Calendar.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
- package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
- package/dist/components/pro/Calendar/utils.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/CodeEditor/utils.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/extension.js.map +1 -1
- package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
- package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
- package/dist/components/pro/DataTable/utils.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/archify/build.js.map +1 -1
- package/dist/components/pro/Flow/archify/convert.js.map +1 -1
- package/dist/components/pro/Flow/archify/palette.js.map +1 -1
- package/dist/components/pro/Flow/archify/presets.js.map +1 -1
- package/dist/components/pro/Flow/archify/spec.js.map +1 -1
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
- package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
- package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
- package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
- package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
- package/dist/components/pro/Gantt/Gantt.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
- package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
- package/dist/components/pro/Gantt/utils.js.map +1 -1
- package/dist/components/pro/Kanban/Kanban.js.map +1 -1
- package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
- package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
- package/dist/components/pro/Kanban/utils.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
- package/dist/components/pro/RichTextEditor/types.js.map +1 -1
- package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Molly/animations.js +52 -0
- package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Molly/events.js +46 -0
- package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Molly/index.js +12 -0
- package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Molly/model.js +614 -0
- package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
- package/dist/components/pro/Sprite/Molly/rig.js +102 -0
- package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
- package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Ruby/events.js +46 -0
- package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Ruby/index.js +12 -0
- package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Ruby/model.js +605 -0
- package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
- package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
- package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
- package/dist/components/pro/Sprite/Sprite2.js +224 -0
- package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
- package/dist/components/pro/Sprite/actions.d.ts +3 -0
- package/dist/components/pro/Sprite/actions.js +16 -0
- package/dist/components/pro/Sprite/actions.js.map +1 -0
- package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
- package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
- package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
- package/dist/components/pro/Sprite/index.d.ts +4 -0
- package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
- package/dist/components/pro/Sprite/shared/animation.js +39 -0
- package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
- package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/events.js +21 -0
- package/dist/components/pro/Sprite/shared/events.js.map +1 -0
- package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/face.js +33 -0
- package/dist/components/pro/Sprite/shared/face.js.map +1 -0
- package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
- package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/gait.js +19 -0
- package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
- package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/geometry.js +59 -0
- package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
- package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
- package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/playback.js +74 -0
- package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
- package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/rig.js +48 -0
- package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
- package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
- package/dist/components/pro/Sprite/shared/scene.js +21 -0
- package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
- package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
- package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
- package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
- package/dist/components/pro/Sprite/types.d.ts +40 -0
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.js.map +1 -1
- package/dist/data-table.js +3 -3
- package/dist/data-table.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useClickOutside.js.map +1 -1
- package/dist/hooks/useContainerElement.js.map +1 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useDraggable.js.map +1 -1
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -115
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/sprite.js +2 -0
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/flexLayout.js.map +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/rehype-code-meta.js.map +1 -1
- package/dist/utils/remark-code-meta.js.map +1 -1
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.js.map +1 -1
- package/dist/utils/selection.js +29 -20
- package/dist/utils/selection.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +15 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColumnDragReorder.js","names":[],"sources":["../../../../src/components/pro/DataTable/useColumnDragReorder.ts"],"sourcesContent":["import React, { useState } from 'react';\nimport type { DragInfo } from './types';\n\nconst emptyDragImage = new Image();\nemptyDragImage.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\nexport function useColumnDragReorder(\n columnOrderState: string[],\n setColumnOrderState: (order: string[]) => void,\n) {\n const [dragInfo, setDragInfo] = useState<DragInfo>({\n isDragging: false,\n startX: 0,\n columnId: null,\n newOrder: [],\n });\n const [draggedColumnId, setDraggedColumnId] = useState<string | null>(null);\n\n const handleDragStart = (e: React.DragEvent, columnId: string) => {\n e.stopPropagation();\n e.dataTransfer.setData('text/plain', columnId);\n e.dataTransfer.setData('application/column-id', columnId);\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setDragImage(emptyDragImage, -99999, -99999);\n\n setDraggedColumnId(columnId);\n setDragInfo({\n ...dragInfo,\n isDragging: true,\n startX: e.clientX,\n columnId,\n });\n\n const el = e.currentTarget as HTMLElement;\n if (el) el.classList.add('dragging-source');\n };\n\n const handleDragEnd = (e: React.DragEvent) => {\n const el = e.currentTarget as HTMLElement;\n if (el) el.classList.remove('dragging-source');\n\n document.querySelectorAll('.bg-primary\\\\/20, .bg-primary\\\\/30, .dragging-source, .menu-item-highlight').forEach(el => {\n el.classList.remove('bg-primary/20', 'bg-primary/30', 'shadow-lg', 'border-b-2', 'border-2', 'border-l-4', 'border-primary', 'dragging-source', 'menu-item-highlight');\n });\n\n setDraggedColumnId(null);\n setDragInfo({ ...dragInfo, isDragging: false, columnId: null });\n };\n\n const handleDragOver = (e: React.DragEvent | Event) => {\n e.preventDefault?.();\n if (e instanceof DragEvent && e.dataTransfer) {\n e.dataTransfer.dropEffect = 'move';\n }\n\n const target = e.currentTarget as HTMLElement;\n if (target && target.tagName === 'TH') {\n document.querySelectorAll('th.bg-primary\\\\/20').forEach(el => {\n if (el !== target) {\n el.classList.remove('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n }\n });\n target.classList.add('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n }\n };\n\n const handleDragLeave = (e: React.DragEvent | Event) => {\n const target = e.currentTarget as HTMLElement;\n if (target && target.tagName === 'TH') {\n target.classList.remove('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n }\n };\n\n const handleDrop = (e: React.DragEvent, targetColumnId: string) => {\n e.preventDefault();\n e.stopPropagation();\n\n document.querySelectorAll('th').forEach(el => {\n el.classList.remove('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n });\n\n let sourceColumnId = '';\n try {\n sourceColumnId = e.dataTransfer.getData('application/column-id');\n if (!sourceColumnId) sourceColumnId = e.dataTransfer.getData('text/plain');\n } catch {\n if (draggedColumnId) sourceColumnId = draggedColumnId;\n }\n\n if (sourceColumnId && targetColumnId && sourceColumnId !== targetColumnId) {\n const newOrder = [...columnOrderState];\n const sourceIndex = newOrder.indexOf(sourceColumnId);\n const targetIndex = newOrder.indexOf(targetColumnId);\n\n if (sourceIndex > -1 && targetIndex > -1) {\n newOrder.splice(sourceIndex, 1);\n newOrder.splice(targetIndex, 0, sourceColumnId);\n setColumnOrderState(newOrder);\n }\n }\n\n setDraggedColumnId(null);\n setDragInfo({ ...dragInfo, isDragging: false, columnId: null });\n };\n\n return {\n dragInfo,\n draggedColumnId,\n handleDragStart,\n handleDragEnd,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n };\n}\n"],"mappings":";;AAGA,
|
|
1
|
+
{"version":3,"file":"useColumnDragReorder.js","names":["emptyDragImage","useColumnDragReorder","dragInfo","setDragInfo","useState","draggedColumnId","setDraggedColumnId","columnId","el","target","sourceColumnId","targetColumnId","newOrder","columnOrderState","sourceIndex","targetIndex","setColumnOrderState"],"sources":["../../../../src/components/pro/DataTable/useColumnDragReorder.ts"],"sourcesContent":["import React, { useState } from 'react';\nimport type { DragInfo } from './types';\n\nconst emptyDragImage = new Image();\nemptyDragImage.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\nexport function useColumnDragReorder(\n columnOrderState: string[],\n setColumnOrderState: (order: string[]) => void,\n) {\n const [dragInfo, setDragInfo] = useState<DragInfo>({\n isDragging: false,\n startX: 0,\n columnId: null,\n newOrder: [],\n });\n const [draggedColumnId, setDraggedColumnId] = useState<string | null>(null);\n\n const handleDragStart = (e: React.DragEvent, columnId: string) => {\n e.stopPropagation();\n e.dataTransfer.setData('text/plain', columnId);\n e.dataTransfer.setData('application/column-id', columnId);\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setDragImage(emptyDragImage, -99999, -99999);\n\n setDraggedColumnId(columnId);\n setDragInfo({\n ...dragInfo,\n isDragging: true,\n startX: e.clientX,\n columnId,\n });\n\n const el = e.currentTarget as HTMLElement;\n if (el) el.classList.add('dragging-source');\n };\n\n const handleDragEnd = (e: React.DragEvent) => {\n const el = e.currentTarget as HTMLElement;\n if (el) el.classList.remove('dragging-source');\n\n document.querySelectorAll('.bg-primary\\\\/20, .bg-primary\\\\/30, .dragging-source, .menu-item-highlight').forEach(el => {\n el.classList.remove('bg-primary/20', 'bg-primary/30', 'shadow-lg', 'border-b-2', 'border-2', 'border-l-4', 'border-primary', 'dragging-source', 'menu-item-highlight');\n });\n\n setDraggedColumnId(null);\n setDragInfo({ ...dragInfo, isDragging: false, columnId: null });\n };\n\n const handleDragOver = (e: React.DragEvent | Event) => {\n e.preventDefault?.();\n if (e instanceof DragEvent && e.dataTransfer) {\n e.dataTransfer.dropEffect = 'move';\n }\n\n const target = e.currentTarget as HTMLElement;\n if (target && target.tagName === 'TH') {\n document.querySelectorAll('th.bg-primary\\\\/20').forEach(el => {\n if (el !== target) {\n el.classList.remove('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n }\n });\n target.classList.add('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n }\n };\n\n const handleDragLeave = (e: React.DragEvent | Event) => {\n const target = e.currentTarget as HTMLElement;\n if (target && target.tagName === 'TH') {\n target.classList.remove('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n }\n };\n\n const handleDrop = (e: React.DragEvent, targetColumnId: string) => {\n e.preventDefault();\n e.stopPropagation();\n\n document.querySelectorAll('th').forEach(el => {\n el.classList.remove('bg-primary/20', 'shadow-lg', 'border-b-2', 'border-primary');\n });\n\n let sourceColumnId = '';\n try {\n sourceColumnId = e.dataTransfer.getData('application/column-id');\n if (!sourceColumnId) sourceColumnId = e.dataTransfer.getData('text/plain');\n } catch {\n if (draggedColumnId) sourceColumnId = draggedColumnId;\n }\n\n if (sourceColumnId && targetColumnId && sourceColumnId !== targetColumnId) {\n const newOrder = [...columnOrderState];\n const sourceIndex = newOrder.indexOf(sourceColumnId);\n const targetIndex = newOrder.indexOf(targetColumnId);\n\n if (sourceIndex > -1 && targetIndex > -1) {\n newOrder.splice(sourceIndex, 1);\n newOrder.splice(targetIndex, 0, sourceColumnId);\n setColumnOrderState(newOrder);\n }\n }\n\n setDraggedColumnId(null);\n setDragInfo({ ...dragInfo, isDragging: false, columnId: null });\n };\n\n return {\n dragInfo,\n draggedColumnId,\n handleDragStart,\n handleDragEnd,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n };\n}\n"],"mappings":";;AAGA,IAAMA,IAAiB,IAAI,MAAM;AACjC,EAAe,MAAM;AAErB,SAAgBC,EACd,GACA,GACA;CACA,IAAM,CAACC,GAAUC,KAAeC,EAAmB;EACjD,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,UAAU,CAAC;CACb,CAAC,GACK,CAACC,GAAiBC,KAAsBF,EAAwB,IAAI;CAyF1E,OAAO;EACL;EACA;EACA,kBA1FuB,GAAoB,MAAqB;GAQhE,AAPA,EAAE,gBAAgB,GAClB,EAAE,aAAa,QAAQ,cAAcG,CAAQ,GAC7C,EAAE,aAAa,QAAQ,yBAAyBA,CAAQ,GACxD,EAAE,aAAa,gBAAgB,QAC/B,EAAE,aAAa,aAAaP,GAAgB,QAAQ,MAAM,GAE1DM,EAAmBC,CAAQ,GAC3BJ,EAAY;IACV,GAAGD;IACH,YAAY;IACZ,QAAQ,EAAE;IACV;GACF,CAAC;GAED,IAAMM,IAAK,EAAE;GACb,AAAIA,KAAIA,EAAG,UAAU,IAAI,iBAAiB;EAC5C;EA0EE,gBAxEqB,MAAuB;GAC5C,IAAMA,IAAK,EAAE;GAQb,AAPIA,KAAIA,EAAG,UAAU,OAAO,iBAAiB,GAE7C,SAAS,iBAAiB,4EAA4E,CAAC,CAAC,SAAQ,MAAM;IACpH,EAAG,UAAU,OAAO,iBAAiB,iBAAiB,aAAa,cAAc,YAAY,cAAc,kBAAkB,mBAAmB,qBAAqB;GACvK,CAAC,GAEDF,EAAmB,IAAI,GACvBH,EAAY;IAAE,GAAGD;IAAU,YAAY;IAAO,UAAU;GAAK,CAAC;EAChE;EA+DE,iBA7DsB,MAA+B;GAErD,AADA,EAAE,iBAAiB,GACf,aAAa,aAAa,EAAE,iBAC9B,EAAE,aAAa,aAAa;GAG9B,IAAMO,IAAS,EAAE;GACjB,AAAIA,KAAUA,EAAO,YAAY,SAC/B,SAAS,iBAAiB,oBAAoB,CAAC,CAAC,SAAQ,MAAM;IAC5D,AAAID,MAAOC,KACTD,EAAG,UAAU,OAAO,iBAAiB,aAAa,cAAc,gBAAgB;GAEpF,CAAC,GACDC,EAAO,UAAU,IAAI,iBAAiB,aAAa,cAAc,gBAAgB;EAErF;EA+CE,kBA7CuB,MAA+B;GACtD,IAAMA,IAAS,EAAE;GACjB,AAAIA,KAAUA,EAAO,YAAY,QAC/BA,EAAO,UAAU,OAAO,iBAAiB,aAAa,cAAc,gBAAgB;EAExF;EAyCE,aAvCkB,GAAoB,MAA2B;GAIjE,AAHA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAElB,SAAS,iBAAiB,IAAI,CAAC,CAAC,SAAQ,MAAM;IAC5C,EAAG,UAAU,OAAO,iBAAiB,aAAa,cAAc,gBAAgB;GAClF,CAAC;GAED,IAAIC,IAAiB;GACrB,IAAI;IAEF,AADA,IAAiB,EAAE,aAAa,QAAQ,uBAAuB,GAC/D,AAAqBA,MAAiB,EAAE,aAAa,QAAQ,YAAY;GAC3E,QAAQ;IACN,AAAIL,MAAiB,IAAiBA;GACxC;GAEA,IAAIK,KAAkBC,KAAkBD,MAAmBC,GAAgB;IACzE,IAAMC,IAAW,CAAC,GAAGC,CAAgB,GAC/BC,IAAcF,EAAS,QAAQF,CAAc,GAC7CK,IAAcH,EAAS,QAAQD,CAAc;IAEnD,AAAIG,IAAc,MAAMC,IAAc,OACpCH,EAAS,OAAOE,GAAa,CAAC,GAC9BF,EAAS,OAAOG,GAAa,GAAGL,CAAc,GAC9CM,EAAoBJ,CAAQ;GAEhC;GAGA,AADAN,EAAmB,IAAI,GACvBH,EAAY;IAAE,GAAGD;IAAU,YAAY;IAAO,UAAU;GAAK,CAAC;EAChE;CAUA;AACF"}
|
|
@@ -1,148 +1,163 @@
|
|
|
1
1
|
import { builtInSortFns as e, useReactTable as t } from "./tanstack-table.js";
|
|
2
2
|
import { createTreeSortingFns as n, findAllChildRowIds as r, prepareTreeData as i } from "./treeDataUtils.js";
|
|
3
3
|
import { deepEqual as a, useControllableState as o } from "../../../hooks/useControllableState.js";
|
|
4
|
-
import {
|
|
4
|
+
import { defaultFilterFunctions as s } from "./utils.js";
|
|
5
|
+
import { useCallback as c, useEffect as l, useLayoutEffect as u, useMemo as d, useRef as f } from "react";
|
|
5
6
|
//#region src/components/pro/DataTable/useDataTableModel.ts
|
|
6
|
-
|
|
7
|
+
var p = {
|
|
8
|
+
text: s.text,
|
|
9
|
+
number: s.range,
|
|
10
|
+
select: (e, t, n) => {
|
|
11
|
+
let r = e.getValue(t);
|
|
12
|
+
return r != null && String(r) === n;
|
|
13
|
+
},
|
|
14
|
+
boolean: s.boolean,
|
|
15
|
+
date: s.dateRange,
|
|
16
|
+
multiSelect: s.multiSelect
|
|
17
|
+
};
|
|
18
|
+
function m(e, t, n = 0) {
|
|
7
19
|
if (!Number.isSafeInteger(t) || t < n) throw RangeError(`DataTable: ${e} must be an integer >= ${n}.`);
|
|
8
20
|
}
|
|
9
|
-
function
|
|
10
|
-
let { data:
|
|
11
|
-
if (
|
|
12
|
-
let
|
|
13
|
-
|
|
21
|
+
function h(s) {
|
|
22
|
+
let { data: h, columns: g, getRowId: _, subDataKey: v = "subs", enableExpanding: y = !1, enableTreeSort: b = !0, enablePagination: x = !0, manualPagination: S = !1, enableSorting: C = !0, enableFiltering: w = !0, enableSelection: T = !0, manualSorting: E = !1, manualFiltering: D = !1, rowCount: O, pageCount: k } = s, [A, j] = o(s.sortingState, s.onSortingChange, a, s.defaultSortingState ?? []), [M, N] = o(s.selectedRows, s.onRowSelectionChange, a, s.defaultSelectedRows ?? {}), [P, F] = o(s.columnFilters, s.onColumnFiltersChange, a, s.defaultColumnFilters ?? []), [I, L] = o(s.columnVisibility, s.onColumnVisibilityChange, a, s.defaultColumnVisibility ?? {}), [R, z] = o(s.columnOrder, s.onColumnOrderChange, a, s.defaultColumnOrder ?? []), [B, V] = o(s.expandedRows, s.onExpandedRowsChange, a, s.defaultExpandedRows ?? {}), [H, U] = o(s.pageIndex, s.onPageChange, Object.is, s.defaultPageIndex ?? 0), [W, G] = o(s.pageSize, s.onPageSizeChange, Object.is, s.defaultPageSize ?? 10);
|
|
23
|
+
if (m("pageIndex", H), m("pageSize", W, 1), S && (O !== void 0 && m("rowCount", O), k !== void 0 && m("pageCount", k), x && O === void 0 && k === void 0)) throw Error("DataTable: manualPagination requires rowCount or pageCount.");
|
|
24
|
+
let K = d(() => y ? i(h, B, v, _) : h, [
|
|
25
|
+
h,
|
|
26
|
+
y,
|
|
27
|
+
B,
|
|
14
28
|
v,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
]), K = u(() => {
|
|
19
|
-
if (!v || !y) return h;
|
|
20
|
-
let t = n().treeSortAsc, r = (n) => n.map((n) => {
|
|
29
|
+
_
|
|
30
|
+
]), q = d(() => {
|
|
31
|
+
let t = y && b ? n().treeSortAsc : void 0, r = (n) => n.map((n) => {
|
|
21
32
|
if ("columns" in n) return {
|
|
22
33
|
...n,
|
|
23
34
|
columns: r(n.columns ?? [])
|
|
24
35
|
};
|
|
25
|
-
|
|
26
|
-
let i = n.sortFn, a = typeof i == "function" ? i : i && i !== "auto" ? e[i] : t;
|
|
27
|
-
return {
|
|
36
|
+
let i = (n.filterFn === null || n.filterFn === void 0) && n.meta?.filterType ? {
|
|
28
37
|
...n,
|
|
38
|
+
filterFn: p[n.meta.filterType]
|
|
39
|
+
} : n;
|
|
40
|
+
if (!t || i.enableSorting === !1) return i;
|
|
41
|
+
let a = i.sortFn, o = typeof a == "function" ? a : a && a !== "auto" ? e[a] : t;
|
|
42
|
+
return {
|
|
43
|
+
...i,
|
|
29
44
|
sortUndefined: !1,
|
|
30
|
-
sortFn: (e, n, r) => e.depth > 0 || n.depth > 0 ? 0 : (
|
|
45
|
+
sortFn: (e, n, r) => e.depth > 0 || n.depth > 0 ? 0 : (o ?? t)(e, n, r)
|
|
31
46
|
};
|
|
32
47
|
});
|
|
33
|
-
return r(
|
|
48
|
+
return r(g);
|
|
34
49
|
}, [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
]),
|
|
39
|
-
pageIndex:
|
|
40
|
-
pageSize:
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
g,
|
|
51
|
+
y,
|
|
52
|
+
b
|
|
53
|
+
]), J = {
|
|
54
|
+
pageIndex: H,
|
|
55
|
+
pageSize: W
|
|
56
|
+
}, Y = f(J);
|
|
57
|
+
u(() => {
|
|
58
|
+
Y.current = J;
|
|
44
59
|
});
|
|
45
|
-
let
|
|
46
|
-
let t =
|
|
47
|
-
|
|
48
|
-
pageIndex:
|
|
49
|
-
pageSize:
|
|
50
|
-
},
|
|
60
|
+
let X = c((e) => {
|
|
61
|
+
let t = Y.current, n = typeof e == "function" ? e(t) : e;
|
|
62
|
+
m("pageIndex", n.pageIndex), m("pageSize", n.pageSize, 1), Y.current = {
|
|
63
|
+
pageIndex: s.pageIndex === void 0 ? n.pageIndex : t.pageIndex,
|
|
64
|
+
pageSize: s.pageSize === void 0 ? n.pageSize : t.pageSize
|
|
65
|
+
}, G(n.pageSize), U(n.pageIndex);
|
|
51
66
|
}, [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
]),
|
|
57
|
-
data:
|
|
58
|
-
columns:
|
|
59
|
-
getRowId: (e, t) =>
|
|
60
|
-
getSubRows:
|
|
61
|
-
manualPagination:
|
|
62
|
-
manualSorting:
|
|
63
|
-
manualFiltering:
|
|
64
|
-
pageCount:
|
|
65
|
-
rowCount:
|
|
67
|
+
s.pageIndex,
|
|
68
|
+
s.pageSize,
|
|
69
|
+
U,
|
|
70
|
+
G
|
|
71
|
+
]), Z = t({
|
|
72
|
+
data: K,
|
|
73
|
+
columns: q,
|
|
74
|
+
getRowId: (e, t) => y ? String(e.__id) : _?.(e, t) ?? String(t),
|
|
75
|
+
getSubRows: y ? (e) => e[v] : void 0,
|
|
76
|
+
manualPagination: S || !x,
|
|
77
|
+
manualSorting: S || E || !C,
|
|
78
|
+
manualFiltering: S || D || !w,
|
|
79
|
+
pageCount: S ? k : void 0,
|
|
80
|
+
rowCount: S ? O : void 0,
|
|
66
81
|
paginateExpandedRows: !1,
|
|
67
|
-
maxLeafRowFilterDepth:
|
|
68
|
-
enableSorting:
|
|
69
|
-
enableFilters:
|
|
70
|
-
enableRowSelection:
|
|
82
|
+
maxLeafRowFilterDepth: y ? 0 : void 0,
|
|
83
|
+
enableSorting: C,
|
|
84
|
+
enableFilters: w,
|
|
85
|
+
enableRowSelection: T,
|
|
71
86
|
enableSubRowSelection: !1,
|
|
72
87
|
autoResetPageIndex: !1,
|
|
73
88
|
autoResetExpanded: !1,
|
|
74
89
|
state: {
|
|
75
|
-
sorting:
|
|
76
|
-
rowSelection:
|
|
77
|
-
columnFilters:
|
|
78
|
-
columnVisibility:
|
|
79
|
-
columnOrder:
|
|
80
|
-
expanded:
|
|
90
|
+
sorting: A,
|
|
91
|
+
rowSelection: M,
|
|
92
|
+
columnFilters: P,
|
|
93
|
+
columnVisibility: I,
|
|
94
|
+
columnOrder: R,
|
|
95
|
+
expanded: B,
|
|
81
96
|
pagination: {
|
|
82
|
-
pageIndex:
|
|
83
|
-
pageSize:
|
|
97
|
+
pageIndex: H,
|
|
98
|
+
pageSize: W
|
|
84
99
|
}
|
|
85
100
|
},
|
|
86
|
-
onSortingChange:
|
|
87
|
-
onRowSelectionChange:
|
|
88
|
-
onColumnFiltersChange:
|
|
89
|
-
onColumnVisibilityChange:
|
|
90
|
-
onColumnOrderChange:
|
|
91
|
-
onExpandedChange: (e) =>
|
|
101
|
+
onSortingChange: j,
|
|
102
|
+
onRowSelectionChange: N,
|
|
103
|
+
onColumnFiltersChange: F,
|
|
104
|
+
onColumnVisibilityChange: L,
|
|
105
|
+
onColumnOrderChange: z,
|
|
106
|
+
onExpandedChange: (e) => V((t) => {
|
|
92
107
|
let n = typeof e == "function" ? e(t) : e;
|
|
93
|
-
return n === !0 ? Object.fromEntries(
|
|
108
|
+
return n === !0 ? Object.fromEntries(Z.getCoreRowModel().flatRows.map((e) => [e.id, !0])) : n;
|
|
94
109
|
}),
|
|
95
|
-
onPaginationChange:
|
|
96
|
-
}),
|
|
97
|
-
sorting:
|
|
98
|
-
columnFilters:
|
|
99
|
-
size:
|
|
110
|
+
onPaginationChange: X
|
|
111
|
+
}), Q = Z.getPageCount(), $ = f({
|
|
112
|
+
sorting: A,
|
|
113
|
+
columnFilters: P,
|
|
114
|
+
size: W
|
|
100
115
|
});
|
|
101
|
-
|
|
102
|
-
let e =
|
|
103
|
-
|
|
104
|
-
sorting:
|
|
105
|
-
columnFilters:
|
|
106
|
-
size:
|
|
107
|
-
},
|
|
116
|
+
l(() => {
|
|
117
|
+
let e = $.current;
|
|
118
|
+
$.current = {
|
|
119
|
+
sorting: A,
|
|
120
|
+
columnFilters: P,
|
|
121
|
+
size: W
|
|
122
|
+
}, x && !S && s.pageIndex === void 0 && (!a(e.sorting, A) || !a(e.columnFilters, P) || e.size !== W ? U(0) : H >= Q && U(Math.max(0, Q - 1)));
|
|
108
123
|
}, [
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
b,
|
|
124
|
+
A,
|
|
125
|
+
P,
|
|
126
|
+
W,
|
|
127
|
+
H,
|
|
128
|
+
Q,
|
|
115
129
|
x,
|
|
116
|
-
|
|
117
|
-
|
|
130
|
+
S,
|
|
131
|
+
s.pageIndex,
|
|
132
|
+
U
|
|
118
133
|
]);
|
|
119
|
-
let
|
|
120
|
-
let n = !
|
|
121
|
-
|
|
134
|
+
let ee = (e, t) => {
|
|
135
|
+
let n = !B[e];
|
|
136
|
+
V((i) => {
|
|
122
137
|
let a = {
|
|
123
138
|
...i,
|
|
124
139
|
[e]: n
|
|
125
140
|
};
|
|
126
|
-
return n || r(t, e,
|
|
141
|
+
return n || r(t, e, v, _).forEach((e) => {
|
|
127
142
|
a[e] = !1;
|
|
128
143
|
}), a;
|
|
129
|
-
}),
|
|
130
|
-
},
|
|
144
|
+
}), s.onRowExpand?.(t, n);
|
|
145
|
+
}, te = new Map(Z.getCoreRowModel().flatRows.map((e) => [e.original, e.id]));
|
|
131
146
|
return {
|
|
132
|
-
table:
|
|
133
|
-
rowSelection:
|
|
134
|
-
visibilityState:
|
|
135
|
-
columnOrderState:
|
|
136
|
-
setColumnOrderState:
|
|
137
|
-
expandedRowsState:
|
|
138
|
-
handleRowExpand:
|
|
139
|
-
resolveRowId: (e, t) =>
|
|
140
|
-
internalPageIndex:
|
|
141
|
-
internalPageSize:
|
|
142
|
-
handlePaginationChange:
|
|
147
|
+
table: Z,
|
|
148
|
+
rowSelection: M,
|
|
149
|
+
visibilityState: I,
|
|
150
|
+
columnOrderState: Z.getAllLeafColumns().map((e) => e.id),
|
|
151
|
+
setColumnOrderState: z,
|
|
152
|
+
expandedRowsState: B,
|
|
153
|
+
handleRowExpand: ee,
|
|
154
|
+
resolveRowId: (e, t) => te.get(e) ?? _?.(e, t) ?? String(t),
|
|
155
|
+
internalPageIndex: H,
|
|
156
|
+
internalPageSize: W,
|
|
157
|
+
handlePaginationChange: X
|
|
143
158
|
};
|
|
144
159
|
}
|
|
145
160
|
//#endregion
|
|
146
|
-
export {
|
|
161
|
+
export { h as useDataTableModel };
|
|
147
162
|
|
|
148
163
|
//# sourceMappingURL=useDataTableModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataTableModel.js","names":[],"sources":["../../../../src/components/pro/DataTable/useDataTableModel.ts"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useControllableState, deepEqual } from '../../../hooks/useControllableState';\nimport {\n useReactTable, builtInSortFns,\n type ColumnDef, type SortingFn, type PaginationState, type Updater,\n} from './tanstack-table';\nimport type { DataTableProps } from './types';\nimport { createTreeSortingFns, findAllChildRowIds, prepareTreeData } from './treeDataUtils';\n\nfunction assertInteger(name: string, value: number, minimum = 0) {\n if (!Number.isSafeInteger(value) || value < minimum) {\n throw new RangeError(`DataTable: ${name} must be an integer >= ${minimum}.`);\n }\n}\n\n/** Shared by the view and executable row-model regression tests. */\nexport function useDataTableModel<T extends object>(props: DataTableProps<T>) {\n const {\n data, columns, getRowId, subDataKey = 'subs', enableExpanding = false,\n enableTreeSort = true, enablePagination = true, manualPagination = false,\n enableSorting = true, enableFiltering = true, enableSelection = true,\n manualSorting = false, manualFiltering = false, rowCount, pageCount,\n } = props;\n const [sorting, setSorting] = useControllableState(\n props.sortingState, props.onSortingChange, deepEqual, props.defaultSortingState ?? [],\n );\n const [rowSelection, setRowSelection] = useControllableState(\n props.selectedRows, props.onRowSelectionChange, deepEqual, props.defaultSelectedRows ?? {},\n );\n const [columnFilters, setColumnFilters] = useControllableState(\n props.columnFilters, props.onColumnFiltersChange, deepEqual, props.defaultColumnFilters ?? [],\n );\n const [visibilityState, setVisibilityState] = useControllableState(\n props.columnVisibility, props.onColumnVisibilityChange, deepEqual, props.defaultColumnVisibility ?? {},\n );\n const [columnOrder, setColumnOrderState] = useControllableState(\n props.columnOrder, props.onColumnOrderChange, deepEqual, props.defaultColumnOrder ?? [],\n );\n const [expandedRowsState, setExpandedRowsState] = useControllableState(\n props.expandedRows, props.onExpandedRowsChange, deepEqual, props.defaultExpandedRows ?? {},\n );\n const [internalPageIndex, setInternalPageIndex] = useControllableState(\n props.pageIndex, props.onPageChange, Object.is, props.defaultPageIndex ?? 0,\n );\n const [internalPageSize, setInternalPageSize] = useControllableState(\n props.pageSize, props.onPageSizeChange, Object.is, props.defaultPageSize ?? 10,\n );\n assertInteger('pageIndex', internalPageIndex);\n assertInteger('pageSize', internalPageSize, 1);\n if (manualPagination) {\n if (rowCount !== undefined) assertInteger('rowCount', rowCount);\n if (pageCount !== undefined) assertInteger('pageCount', pageCount);\n if (enablePagination && rowCount === undefined && pageCount === undefined) {\n throw new Error('DataTable: manualPagination requires rowCount or pageCount.');\n }\n }\n\n const tableData = useMemo(() => enableExpanding\n ? prepareTreeData(data, expandedRowsState, subDataKey, getRowId)\n : data, [data, enableExpanding, expandedRowsState, subDataKey, getRowId]);\n\n const processedColumns = useMemo(() => {\n if (!enableExpanding || !enableTreeSort) return columns;\n const defaultSort = createTreeSortingFns<T>().treeSortAsc;\n const wrap = (defs: readonly ColumnDef<T, any>[]): ColumnDef<T, any>[] => defs.map(column => {\n if ('columns' in column) return { ...column, columns: wrap(column.columns ?? []) };\n if (column.enableSorting === false) return column;\n const originalSort = column.sortFn;\n const sort = typeof originalSort === 'function' ? originalSort\n : originalSort && originalSort !== 'auto'\n ? builtInSortFns[originalSort as keyof typeof builtInSortFns] as SortingFn<T>\n : defaultSort;\n return {\n ...column,\n // TanStack handles undefined before invoking sortFn. Disable that shortcut\n // so an undefined child value cannot reorder an otherwise unsorted subtree.\n sortUndefined: false,\n sortFn: (a, b, id) => a.depth > 0 || b.depth > 0 ? 0 : (sort ?? defaultSort)(a, b, id),\n };\n });\n return wrap(columns);\n }, [columns, enableExpanding, enableTreeSort]);\n\n const pagination = { pageIndex: internalPageIndex, pageSize: internalPageSize };\n const paginationRef = useRef(pagination);\n useLayoutEffect(() => { paginationRef.current = pagination; });\n const handlePaginationChange = useCallback((updater: Updater<PaginationState>) => {\n const current = paginationRef.current;\n const next = typeof updater === 'function' ? updater(current) : updater;\n assertInteger('pageIndex', next.pageIndex);\n assertInteger('pageSize', next.pageSize, 1);\n // Preserve pending uncontrolled slices across batched TanStack updaters,\n // while controlled slices continue to use the parent's committed values.\n paginationRef.current = {\n pageIndex: props.pageIndex === undefined ? next.pageIndex : current.pageIndex,\n pageSize: props.pageSize === undefined ? next.pageSize : current.pageSize,\n };\n setInternalPageSize(next.pageSize);\n setInternalPageIndex(next.pageIndex);\n }, [props.pageIndex, props.pageSize, setInternalPageIndex, setInternalPageSize]);\n\n const table = useReactTable<T>({\n data: tableData,\n columns: processedColumns,\n getRowId: (row, index) => enableExpanding\n ? String((row as Record<string, unknown>).__id)\n : getRowId?.(row, index) ?? String(index),\n getSubRows: enableExpanding\n ? row => (row as Record<string, unknown>)[subDataKey] as T[]\n : undefined,\n // Local pipeline sees the full hierarchy. Only server mode bypasses all\n // processing; hiding pagination alone still permits local sort/filter.\n manualPagination: manualPagination || !enablePagination,\n manualSorting: manualPagination || manualSorting || !enableSorting,\n manualFiltering: manualPagination || manualFiltering || !enableFiltering,\n pageCount: manualPagination ? pageCount : undefined,\n rowCount: manualPagination ? rowCount : undefined,\n paginateExpandedRows: false,\n maxLeafRowFilterDepth: enableExpanding ? 0 : undefined,\n enableSorting,\n enableFilters: enableFiltering,\n enableRowSelection: enableSelection,\n enableSubRowSelection: false,\n autoResetPageIndex: false,\n autoResetExpanded: false,\n state: {\n sorting, rowSelection, columnFilters, columnVisibility: visibilityState,\n columnOrder, expanded: expandedRowsState,\n pagination: { pageIndex: internalPageIndex, pageSize: internalPageSize },\n },\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setVisibilityState,\n onColumnOrderChange: setColumnOrderState,\n onExpandedChange: updater => setExpandedRowsState(previous => {\n const next = typeof updater === 'function' ? updater(previous) : updater;\n return next === true\n ? Object.fromEntries(table.getCoreRowModel().flatRows.map(row => [row.id, true]))\n : next;\n }),\n onPaginationChange: handlePaginationChange,\n });\n\n const localPageCount = table.getPageCount();\n const previousQuery = useRef({ sorting, columnFilters, size: internalPageSize });\n useEffect(() => {\n const previous = previousQuery.current;\n previousQuery.current = { sorting, columnFilters, size: internalPageSize };\n // Never rewrite a controlled page or a server request. Their owner must\n // reset/clamp the page along with the query and remote total.\n if (!enablePagination || manualPagination || props.pageIndex !== undefined) return;\n if (!deepEqual(previous.sorting, sorting) || !deepEqual(previous.columnFilters, columnFilters)\n || previous.size !== internalPageSize) {\n setInternalPageIndex(0);\n } else if (internalPageIndex >= localPageCount) {\n setInternalPageIndex(Math.max(0, localPageCount - 1));\n }\n }, [sorting, columnFilters, internalPageSize, internalPageIndex, localPageCount,\n enablePagination, manualPagination, props.pageIndex, setInternalPageIndex]);\n\n const handleRowExpand = (rowId: string, row: T) => {\n const expanded = !expandedRowsState[rowId];\n setExpandedRowsState(previous => {\n const next = { ...previous, [rowId]: expanded };\n if (!expanded) {\n findAllChildRowIds(row, rowId, subDataKey, getRowId).forEach(id => { next[id] = false; });\n }\n return next;\n });\n props.onRowExpand?.(row, expanded);\n };\n\n // TanStack owns mutable row models; snapshot IDs per render rather than\n // caching by flatRows identity, which does not guarantee unchanged contents.\n const rowIds = new Map(table.getCoreRowModel().flatRows.map(row => [row.original, row.id]));\n const resolveRowId = (row: T, index: number) =>\n rowIds.get(row) ?? getRowId?.(row, index) ?? String(index);\n\n // Derive the default order instead of notifying the parent on mount.\n const columnOrderState = table.getAllLeafColumns().map(column => column.id);\n return {\n table, rowSelection, visibilityState, columnOrderState, setColumnOrderState,\n expandedRowsState, handleRowExpand, resolveRowId,\n internalPageIndex, internalPageSize, handlePaginationChange,\n };\n}\n"],"mappings":";;;;;AASA,SAAS,EAAc,GAAc,GAAe,IAAU,GAAG;CAC/D,IAAI,CAAC,OAAO,cAAc,CAAK,KAAK,IAAQ,GAC1C,MAAU,WAAW,cAAc,EAAK,yBAAyB,EAAQ,EAAE;AAE/E;AAGA,SAAgB,EAAoC,GAA0B;CAC5E,IAAM,EACJ,SAAM,YAAS,aAAU,gBAAa,QAAQ,qBAAkB,IAChE,oBAAiB,IAAM,sBAAmB,IAAM,sBAAmB,IACnE,mBAAgB,IAAM,qBAAkB,IAAM,qBAAkB,IAChE,mBAAgB,IAAO,qBAAkB,IAAO,aAAU,iBACxD,GACE,CAAC,GAAS,KAAc,EAC5B,EAAM,cAAc,EAAM,iBAAiB,GAAW,EAAM,uBAAuB,CAAC,CACtF,GACM,CAAC,GAAc,KAAmB,EACtC,EAAM,cAAc,EAAM,sBAAsB,GAAW,EAAM,uBAAuB,CAAC,CAC3F,GACM,CAAC,GAAe,KAAoB,EACxC,EAAM,eAAe,EAAM,uBAAuB,GAAW,EAAM,wBAAwB,CAAC,CAC9F,GACM,CAAC,GAAiB,KAAsB,EAC5C,EAAM,kBAAkB,EAAM,0BAA0B,GAAW,EAAM,2BAA2B,CAAC,CACvG,GACM,CAAC,GAAa,KAAuB,EACzC,EAAM,aAAa,EAAM,qBAAqB,GAAW,EAAM,sBAAsB,CAAC,CACxF,GACM,CAAC,GAAmB,KAAwB,EAChD,EAAM,cAAc,EAAM,sBAAsB,GAAW,EAAM,uBAAuB,CAAC,CAC3F,GACM,CAAC,GAAmB,KAAwB,EAChD,EAAM,WAAW,EAAM,cAAc,OAAO,IAAI,EAAM,oBAAoB,CAC5E,GACM,CAAC,GAAkB,KAAuB,EAC9C,EAAM,UAAU,EAAM,kBAAkB,OAAO,IAAI,EAAM,mBAAmB,EAC9E;CAGA,IAFA,EAAc,aAAa,CAAiB,GAC5C,EAAc,YAAY,GAAkB,CAAC,GACzC,MACE,MAAa,KAAA,KAAW,EAAc,YAAY,CAAQ,GAC1D,MAAc,KAAA,KAAW,EAAc,aAAa,CAAS,GAC7D,KAAoB,MAAa,KAAA,KAAa,MAAc,KAAA,IAC9D,MAAU,MAAM,6DAA6D;CAIjF,IAAM,IAAY,QAAc,IAC5B,EAAgB,GAAM,GAAmB,GAAY,CAAQ,IAC7D,GAAM;EAAC;EAAM;EAAiB;EAAmB;EAAY;CAAQ,CAAC,GAEpE,IAAmB,QAAc;EACrC,IAAI,CAAC,KAAmB,CAAC,GAAgB,OAAO;EAChD,IAAM,IAAc,EAAwB,CAAC,CAAC,aACxC,KAAQ,MAA4D,EAAK,KAAI,MAAU;GAC3F,IAAI,aAAa,GAAQ,OAAO;IAAE,GAAG;IAAQ,SAAS,EAAK,EAAO,WAAW,CAAC,CAAC;GAAE;GACjF,IAAI,EAAO,kBAAkB,IAAO,OAAO;GAC3C,IAAM,IAAe,EAAO,QACtB,IAAO,OAAO,KAAiB,aAAa,IAC9C,KAAgB,MAAiB,SAC/B,EAAe,KACf;GACN,OAAO;IACL,GAAG;IAGH,eAAe;IACf,SAAS,GAAG,GAAG,MAAO,EAAE,QAAQ,KAAK,EAAE,QAAQ,IAAI,KAAK,KAAQ,EAAA,CAAa,GAAG,GAAG,CAAE;GACvF;EACF,CAAC;EACD,OAAO,EAAK,CAAO;CACrB,GAAG;EAAC;EAAS;EAAiB;CAAc,CAAC,GAEvC,IAAa;EAAE,WAAW;EAAmB,UAAU;CAAiB,GACxE,IAAgB,EAAO,CAAU;CACvC,QAAsB;EAAE,EAAc,UAAU;CAAY,CAAC;CAC7D,IAAM,IAAyB,GAAa,MAAsC;EAChF,IAAM,IAAU,EAAc,SACxB,IAAO,OAAO,KAAY,aAAa,EAAQ,CAAO,IAAI;EAUhE,AATA,EAAc,aAAa,EAAK,SAAS,GACzC,EAAc,YAAY,EAAK,UAAU,CAAC,GAG1C,EAAc,UAAU;GACtB,WAAW,EAAM,cAAc,KAAA,IAAY,EAAK,YAAY,EAAQ;GACpE,UAAU,EAAM,aAAa,KAAA,IAAY,EAAK,WAAW,EAAQ;EACnE,GACA,EAAoB,EAAK,QAAQ,GACjC,EAAqB,EAAK,SAAS;CACrC,GAAG;EAAC,EAAM;EAAW,EAAM;EAAU;EAAsB;CAAmB,CAAC,GAEzE,IAAQ,EAAiB;EAC7B,MAAM;EACN,SAAS;EACT,WAAW,GAAK,MAAU,IACtB,OAAQ,EAAgC,IAAI,IAC5C,IAAW,GAAK,CAAK,KAAK,OAAO,CAAK;EAC1C,YAAY,KACR,MAAQ,EAAgC,KACxC,KAAA;EAGJ,kBAAkB,KAAoB,CAAC;EACvC,eAAe,KAAoB,KAAiB,CAAC;EACrD,iBAAiB,KAAoB,KAAmB,CAAC;EACzD,WAAW,IAAmB,IAAY,KAAA;EAC1C,UAAU,IAAmB,IAAW,KAAA;EACxC,sBAAsB;EACtB,uBAAuB,IAAkB,IAAI,KAAA;EAC7C;EACA,eAAe;EACf,oBAAoB;EACpB,uBAAuB;EACvB,oBAAoB;EACpB,mBAAmB;EACnB,OAAO;GACL;GAAS;GAAc;GAAe,kBAAkB;GACxD;GAAa,UAAU;GACvB,YAAY;IAAE,WAAW;IAAmB,UAAU;GAAiB;EACzE;EACA,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EACvB,0BAA0B;EAC1B,qBAAqB;EACrB,mBAAkB,MAAW,GAAqB,MAAY;GAC5D,IAAM,IAAO,OAAO,KAAY,aAAa,EAAQ,CAAQ,IAAI;GACjE,OAAO,MAAS,KACZ,OAAO,YAAY,EAAM,gBAAgB,CAAC,CAAC,SAAS,KAAI,MAAO,CAAC,EAAI,IAAI,EAAI,CAAC,CAAC,IAC9E;EACN,CAAC;EACD,oBAAoB;CACtB,CAAC,GAEK,IAAiB,EAAM,aAAa,GACpC,IAAgB,EAAO;EAAE;EAAS;EAAe,MAAM;CAAiB,CAAC;CAC/E,QAAgB;EACd,IAAM,IAAW,EAAc;EAC/B,EAAc,UAAU;GAAE;GAAS;GAAe,MAAM;EAAiB,GAGpE,KAAoB,MAAoB,EAAM,cAAc,KAAA,MAC7D,CAAC,EAAU,EAAS,SAAS,CAAO,KAAK,CAAC,EAAU,EAAS,eAAe,CAAa,KACxF,EAAS,SAAS,IACrB,EAAqB,CAAC,IACb,KAAqB,KAC9B,EAAqB,KAAK,IAAI,GAAG,IAAiB,CAAC,CAAC;CAExD,GAAG;EAAC;EAAS;EAAe;EAAkB;EAAmB;EAC/D;EAAkB;EAAkB,EAAM;EAAW;CAAoB,CAAC;CAE5E,IAAM,KAAmB,GAAe,MAAW;EACjD,IAAM,IAAW,CAAC,EAAkB;EAQpC,AAPA,GAAqB,MAAY;GAC/B,IAAM,IAAO;IAAE,GAAG;KAAW,IAAQ;GAAS;GAI9C,OAHK,KACH,EAAmB,GAAK,GAAO,GAAY,CAAQ,CAAC,CAAC,SAAQ,MAAM;IAAE,EAAK,KAAM;GAAO,CAAC,GAEnF;EACT,CAAC,GACD,EAAM,cAAc,GAAK,CAAQ;CACnC,GAIM,KAAS,IAAI,IAAI,EAAM,gBAAgB,CAAC,CAAC,SAAS,KAAI,MAAO,CAAC,EAAI,UAAU,EAAI,EAAE,CAAC,CAAC;CAM1F,OAAO;EACL;EAAO;EAAc;EAAiB,kBAFf,EAAM,kBAAkB,CAAC,CAAC,KAAI,MAAU,EAAO,EAEhC;EAAkB;EACxD;EAAmB;EAAiB,eAPhB,GAAQ,MAC5B,GAAO,IAAI,CAAG,KAAK,IAAW,GAAK,CAAK,KAAK,OAAO,CAAK;EAOzD;EAAmB;EAAkB;CACvC;AACF"}
|
|
1
|
+
{"version":3,"file":"useDataTableModel.js","names":["panelFilterFns","defaultFilterFunctions","cellValue","row","id","value","assertInteger","minimum","name","useDataTableModel","props","sorting","setSorting","useControllableState","deepEqual","rowSelection","setRowSelection","columnFilters","setColumnFilters","visibilityState","setVisibilityState","columnOrder","setColumnOrderState","expandedRowsState","setExpandedRowsState","internalPageIndex","setInternalPageIndex","internalPageSize","setInternalPageSize","manualPagination","rowCount","pageCount","enablePagination","tableData","useMemo","enableExpanding","prepareTreeData","data","subDataKey","getRowId","processedColumns","defaultSort","enableTreeSort","createTreeSortingFns","wrap","defs","column","filteredColumn","originalSort","sort","builtInSortFns","a","b","columns","pagination","paginationRef","useRef","handlePaginationChange","useCallback","current","next","updater","table","useReactTable","index","manualSorting","enableSorting","manualFiltering","enableFiltering","enableSelection","previous","localPageCount","previousQuery","handleRowExpand","expanded","rowId","findAllChildRowIds","rowIds"],"sources":["../../../../src/components/pro/DataTable/useDataTableModel.ts"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useControllableState, deepEqual } from '../../../hooks/useControllableState';\nimport {\n useReactTable, builtInSortFns,\n type ColumnDef, type SortingFn, type PaginationState, type Updater,\n} from './tanstack-table';\nimport type { DataTableProps } from './types';\nimport { createTreeSortingFns, findAllChildRowIds, prepareTreeData } from './treeDataUtils';\nimport { defaultFilterFunctions } from './utils';\n\nconst panelFilterFns = {\n text: defaultFilterFunctions.text,\n number: defaultFilterFunctions.range,\n select: (row: { getValue: (id: string) => unknown }, id: string, value: string) => {\n const cellValue = row.getValue(id);\n return cellValue !== null && cellValue !== undefined && String(cellValue) === value;\n },\n boolean: defaultFilterFunctions.boolean,\n date: defaultFilterFunctions.dateRange,\n multiSelect: defaultFilterFunctions.multiSelect,\n};\n\nfunction assertInteger(name: string, value: number, minimum = 0) {\n if (!Number.isSafeInteger(value) || value < minimum) {\n throw new RangeError(`DataTable: ${name} must be an integer >= ${minimum}.`);\n }\n}\n\n/** Shared by the view and executable row-model regression tests. */\nexport function useDataTableModel<T extends object>(props: DataTableProps<T>) {\n const {\n data, columns, getRowId, subDataKey = 'subs', enableExpanding = false,\n enableTreeSort = true, enablePagination = true, manualPagination = false,\n enableSorting = true, enableFiltering = true, enableSelection = true,\n manualSorting = false, manualFiltering = false, rowCount, pageCount,\n } = props;\n const [sorting, setSorting] = useControllableState(\n props.sortingState, props.onSortingChange, deepEqual, props.defaultSortingState ?? [],\n );\n const [rowSelection, setRowSelection] = useControllableState(\n props.selectedRows, props.onRowSelectionChange, deepEqual, props.defaultSelectedRows ?? {},\n );\n const [columnFilters, setColumnFilters] = useControllableState(\n props.columnFilters, props.onColumnFiltersChange, deepEqual, props.defaultColumnFilters ?? [],\n );\n const [visibilityState, setVisibilityState] = useControllableState(\n props.columnVisibility, props.onColumnVisibilityChange, deepEqual, props.defaultColumnVisibility ?? {},\n );\n const [columnOrder, setColumnOrderState] = useControllableState(\n props.columnOrder, props.onColumnOrderChange, deepEqual, props.defaultColumnOrder ?? [],\n );\n const [expandedRowsState, setExpandedRowsState] = useControllableState(\n props.expandedRows, props.onExpandedRowsChange, deepEqual, props.defaultExpandedRows ?? {},\n );\n const [internalPageIndex, setInternalPageIndex] = useControllableState(\n props.pageIndex, props.onPageChange, Object.is, props.defaultPageIndex ?? 0,\n );\n const [internalPageSize, setInternalPageSize] = useControllableState(\n props.pageSize, props.onPageSizeChange, Object.is, props.defaultPageSize ?? 10,\n );\n assertInteger('pageIndex', internalPageIndex);\n assertInteger('pageSize', internalPageSize, 1);\n if (manualPagination) {\n if (rowCount !== undefined) assertInteger('rowCount', rowCount);\n if (pageCount !== undefined) assertInteger('pageCount', pageCount);\n if (enablePagination && rowCount === undefined && pageCount === undefined) {\n throw new Error('DataTable: manualPagination requires rowCount or pageCount.');\n }\n }\n\n const tableData = useMemo(() => enableExpanding\n ? prepareTreeData(data, expandedRowsState, subDataKey, getRowId)\n : data, [data, enableExpanding, expandedRowsState, subDataKey, getRowId]);\n\n const processedColumns = useMemo(() => {\n const defaultSort = enableExpanding && enableTreeSort ? createTreeSortingFns<T>().treeSortAsc : undefined;\n const wrap = (defs: readonly ColumnDef<T, any>[]): ColumnDef<T, any>[] => defs.map(column => {\n if ('columns' in column) return { ...column, columns: wrap(column.columns ?? []) };\n // Panel values have a shape determined by filterType, not by the first row's data type.\n const filteredColumn = (column.filterFn === null || column.filterFn === undefined) && column.meta?.filterType\n ? { ...column, filterFn: panelFilterFns[column.meta.filterType] }\n : column;\n if (!defaultSort || filteredColumn.enableSorting === false) return filteredColumn;\n const originalSort = filteredColumn.sortFn;\n const sort = typeof originalSort === 'function' ? originalSort\n : originalSort && originalSort !== 'auto'\n ? builtInSortFns[originalSort as keyof typeof builtInSortFns] as SortingFn<T>\n : defaultSort;\n return {\n ...filteredColumn,\n // TanStack handles undefined before invoking sortFn. Disable that shortcut\n // so an undefined child value cannot reorder an otherwise unsorted subtree.\n sortUndefined: false,\n sortFn: (a, b, id) => a.depth > 0 || b.depth > 0 ? 0 : (sort ?? defaultSort)(a, b, id),\n };\n });\n return wrap(columns);\n }, [columns, enableExpanding, enableTreeSort]);\n\n const pagination = { pageIndex: internalPageIndex, pageSize: internalPageSize };\n const paginationRef = useRef(pagination);\n useLayoutEffect(() => { paginationRef.current = pagination; });\n const handlePaginationChange = useCallback((updater: Updater<PaginationState>) => {\n const current = paginationRef.current;\n const next = typeof updater === 'function' ? updater(current) : updater;\n assertInteger('pageIndex', next.pageIndex);\n assertInteger('pageSize', next.pageSize, 1);\n // Preserve pending uncontrolled slices across batched TanStack updaters,\n // while controlled slices continue to use the parent's committed values.\n paginationRef.current = {\n pageIndex: props.pageIndex === undefined ? next.pageIndex : current.pageIndex,\n pageSize: props.pageSize === undefined ? next.pageSize : current.pageSize,\n };\n setInternalPageSize(next.pageSize);\n setInternalPageIndex(next.pageIndex);\n }, [props.pageIndex, props.pageSize, setInternalPageIndex, setInternalPageSize]);\n\n const table = useReactTable<T>({\n data: tableData,\n columns: processedColumns,\n getRowId: (row, index) => enableExpanding\n ? String((row as Record<string, unknown>).__id)\n : getRowId?.(row, index) ?? String(index),\n getSubRows: enableExpanding\n ? row => (row as Record<string, unknown>)[subDataKey] as T[]\n : undefined,\n // Local pipeline sees the full hierarchy. Only server mode bypasses all\n // processing; hiding pagination alone still permits local sort/filter.\n manualPagination: manualPagination || !enablePagination,\n manualSorting: manualPagination || manualSorting || !enableSorting,\n manualFiltering: manualPagination || manualFiltering || !enableFiltering,\n pageCount: manualPagination ? pageCount : undefined,\n rowCount: manualPagination ? rowCount : undefined,\n paginateExpandedRows: false,\n maxLeafRowFilterDepth: enableExpanding ? 0 : undefined,\n enableSorting,\n enableFilters: enableFiltering,\n enableRowSelection: enableSelection,\n enableSubRowSelection: false,\n autoResetPageIndex: false,\n autoResetExpanded: false,\n state: {\n sorting, rowSelection, columnFilters, columnVisibility: visibilityState,\n columnOrder, expanded: expandedRowsState,\n pagination: { pageIndex: internalPageIndex, pageSize: internalPageSize },\n },\n onSortingChange: setSorting,\n onRowSelectionChange: setRowSelection,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setVisibilityState,\n onColumnOrderChange: setColumnOrderState,\n onExpandedChange: updater => setExpandedRowsState(previous => {\n const next = typeof updater === 'function' ? updater(previous) : updater;\n return next === true\n ? Object.fromEntries(table.getCoreRowModel().flatRows.map(row => [row.id, true]))\n : next;\n }),\n onPaginationChange: handlePaginationChange,\n });\n\n const localPageCount = table.getPageCount();\n const previousQuery = useRef({ sorting, columnFilters, size: internalPageSize });\n useEffect(() => {\n const previous = previousQuery.current;\n previousQuery.current = { sorting, columnFilters, size: internalPageSize };\n // Never rewrite a controlled page or a server request. Their owner must\n // reset/clamp the page along with the query and remote total.\n if (!enablePagination || manualPagination || props.pageIndex !== undefined) return;\n if (!deepEqual(previous.sorting, sorting) || !deepEqual(previous.columnFilters, columnFilters)\n || previous.size !== internalPageSize) {\n setInternalPageIndex(0);\n } else if (internalPageIndex >= localPageCount) {\n setInternalPageIndex(Math.max(0, localPageCount - 1));\n }\n }, [sorting, columnFilters, internalPageSize, internalPageIndex, localPageCount,\n enablePagination, manualPagination, props.pageIndex, setInternalPageIndex]);\n\n const handleRowExpand = (rowId: string, row: T) => {\n const expanded = !expandedRowsState[rowId];\n setExpandedRowsState(previous => {\n const next = { ...previous, [rowId]: expanded };\n if (!expanded) {\n findAllChildRowIds(row, rowId, subDataKey, getRowId).forEach(id => { next[id] = false; });\n }\n return next;\n });\n props.onRowExpand?.(row, expanded);\n };\n\n // TanStack owns mutable row models; snapshot IDs per render rather than\n // caching by flatRows identity, which does not guarantee unchanged contents.\n const rowIds = new Map(table.getCoreRowModel().flatRows.map(row => [row.original, row.id]));\n const resolveRowId = (row: T, index: number) =>\n rowIds.get(row) ?? getRowId?.(row, index) ?? String(index);\n\n // Derive the default order instead of notifying the parent on mount.\n const columnOrderState = table.getAllLeafColumns().map(column => column.id);\n return {\n table, rowSelection, visibilityState, columnOrderState, setColumnOrderState,\n expandedRowsState, handleRowExpand, resolveRowId,\n internalPageIndex, internalPageSize, handlePaginationChange,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../../../src/components/pro/DataTable/utils.ts"],"sourcesContent":["import React from 'react';\nimport { ColumnDef, Row, SortingFn, SortingFnOption } from './tanstack-table';\n\n/**\n * 列选项类型:在标准 v9 `ColumnDef` 基础上,额外兼容 v8 命名的 `sortingFn`\n * (会在 `createColumn` 内部归一化为 v9 的 `sortFn`)。\n */\nexport type ColumnOptions<T extends object> = Partial<ColumnDef<T>> & {\n /** @deprecated 请使用 v9 的 `sortFn`。为向后兼容保留,内部会归一化为 `sortFn`。 */\n sortingFn?: SortingFnOption<T> | SortingFn<T>;\n};\n\n/** 将 v8 命名的 `sortingFn` 归一化为 v9 的 `sortFn`。 */\nfunction normalizeColumn<T extends object>(col: ColumnOptions<T>): ColumnDef<T> {\n if (col && 'sortingFn' in col && col.sortingFn != null) {\n const { sortingFn, ...rest } = col as ColumnOptions<T> & { sortFn?: unknown };\n return { sortFn: sortingFn, ...rest } as ColumnDef<T>;\n }\n return col as ColumnDef<T>;\n}\n\n// 创建DataTable列的辅助函数\nexport function createColumn<T extends object>(\n accessorKeyOrOptions: keyof T | string | ColumnOptions<T>,\n headerOrNone?: string,\n options: ColumnOptions<T> = {}\n): ColumnDef<T> {\n // 检查参数类型,支持两种调用方式:\n // 1. createColumn(accessorKey, header, options)\n // 2. createColumn({ accessorKey, header, ...options })\n if (typeof accessorKeyOrOptions === 'object') {\n // 使用对象形式的参数\n return normalizeColumn(accessorKeyOrOptions);\n } else {\n // 使用传统的参数形式\n return normalizeColumn({\n accessorKey: String(accessorKeyOrOptions),\n header: headerOrNone || String(accessorKeyOrOptions),\n ...options,\n });\n }\n}\n\n// 创建计算列的辅助函数\nexport function createComputedColumn<T extends object>(\n idOrOptions: string | Partial<ColumnDef<T>>,\n headerOrNone?: string,\n accessorFnOrNone?: (row: T) => any,\n options: Partial<ColumnDef<T>> = {}\n): ColumnDef<T> {\n // 检查参数类型,支持两种调用方式\n if (typeof idOrOptions === 'object') {\n // 使用对象形式的参数\n return idOrOptions as ColumnDef<T>;\n } else {\n // 使用传统的参数形式\n return {\n id: idOrOptions,\n header: headerOrNone || idOrOptions,\n accessorFn: accessorFnOrNone,\n ...options,\n };\n }\n}\n\n// 创建操作列的辅助函数\nexport function createActionColumn<T extends object>(\n idOrOptions: string | Partial<ColumnDef<T>>,\n headerOrNone?: string,\n cellOrNone?: (props: { row: Row<T> }) => React.ReactNode,\n options: Partial<ColumnDef<T>> = {}\n): ColumnDef<T> {\n // 检查参数类型,支持两种调用方式\n if (typeof idOrOptions === 'object') {\n // 使用对象形式的参数,并确保enableSorting默认为false\n return {\n enableSorting: false,\n ...idOrOptions as ColumnDef<T>\n };\n } else {\n // 使用传统的参数形式\n return {\n id: idOrOptions,\n header: headerOrNone || idOrOptions,\n cell: cellOrNone,\n enableSorting: false,\n ...options,\n };\n }\n}\n\n// 创建选择列的辅助函数\nexport function createSelectionColumn<T extends object>(\n options: Partial<ColumnDef<T>> = {}\n): ColumnDef<T> {\n const defaults = {\n id: 'selection',\n header: ({ table }: any) => \n React.createElement('input', {\n type: \"checkbox\",\n checked: table.getIsAllRowsSelected(),\n onChange: table.getToggleAllRowsSelectedHandler(),\n className: \"checkbox checkbox-sm\"\n }),\n cell: ({ row }: any) => \n React.createElement('input', {\n type: \"checkbox\",\n checked: row.getIsSelected(),\n onChange: row.getToggleSelectedHandler(),\n className: \"checkbox checkbox-sm\",\n onClick: (e: React.MouseEvent) => e.stopPropagation()\n }),\n enableSorting: false,\n };\n\n // 强制类型转换为ColumnDef<T>,因为我们确保提供了必要的id属性\n return { ...defaults, ...options } as ColumnDef<T>;\n}\n\n// 数字排序函数,支持null和undefined\nexport const numericSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = rowA.getValue(columnId);\n const valueB = rowB.getValue(columnId);\n \n // 处理null或undefined值\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n \n // 尝试将字符串转换为数字\n const numA = typeof valueA === 'string' ? parseFloat(valueA) : Number(valueA);\n const numB = typeof valueB === 'string' ? parseFloat(valueB) : Number(valueB);\n \n if (Number.isNaN(numA) && Number.isNaN(numB)) return 0;\n if (Number.isNaN(numA)) return -1;\n if (Number.isNaN(numB)) return 1;\n \n return numA - numB;\n};\n\n// 日期排序函数,支持不同的日期格式\nexport const dateSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = rowA.getValue(columnId);\n const valueB = rowB.getValue(columnId);\n \n // 处理null或undefined值\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n \n // 将值转换为Date对象\n const dateA = valueA instanceof Date ? valueA : new Date(String(valueA));\n const dateB = valueB instanceof Date ? valueB : new Date(String(valueB));\n \n // 处理无效日期\n if (isNaN(dateA.getTime()) && isNaN(dateB.getTime())) return 0;\n if (isNaN(dateA.getTime())) return -1;\n if (isNaN(dateB.getTime())) return 1;\n \n return dateA.getTime() - dateB.getTime();\n};\n\n// 字符串排序函数,支持本地化比较和大小写不敏感\nexport const stringSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = rowA.getValue(columnId);\n const valueB = rowB.getValue(columnId);\n \n // 处理null或undefined值\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n \n // 转换为字符串并进行本地化比较\n const strA = String(valueA).toLowerCase();\n const strB = String(valueB).toLowerCase();\n \n return strA.localeCompare(strB);\n};\n\n// 定义树状数据行的接口,包含深度信息\nexport interface TreeDataRow {\n __depth?: number;\n __id?: string;\n __parentId?: string;\n __hasChildren?: boolean;\n __isExpanded?: boolean;\n __childCount?: number;\n [key: string]: any;\n}\n\n// 树状结构排序函数 - 只对最外层的父项数据进行排序\nexport const treeSort = <T extends TreeDataRow>(\n sortFn: SortingFn<T>,\n subDataKey: string\n): SortingFn<T> => {\n return (rowA, rowB, columnId) => {\n const valueA = rowA.original;\n const valueB = rowB.original;\n \n // 检查是否为子项\n const depthA = valueA.__depth !== undefined ? valueA.__depth : 0;\n const depthB = valueB.__depth !== undefined ? valueB.__depth : 0;\n \n // 如果两行深度不同,保持原来的顺序\n // 这意味着子项将总是跟随其父项\n if (depthA !== depthB) {\n return 0;\n }\n \n // 如果两行都是顶层(depth=0),使用传入的排序函数\n if (depthA === 0 && depthB === 0) {\n return sortFn(rowA, rowB, columnId);\n }\n \n // 对于相同深度的非顶层行,保持它们相对顺序不变\n return 0;\n };\n};\n\n// 将对象数组转换为SelectFilter的选项格式\nexport function createSelectOptions<T>(\n items: T[], \n labelField: keyof T, \n valueField: keyof T = labelField\n) {\n return items.map(item => ({\n label: String(item[labelField]),\n value: String(item[valueField]),\n }));\n}\n\n// 从数据中提取唯一值作为SelectFilter的选项\nexport function extractUniqueOptions<T>(\n data: T[], \n field: keyof T\n) {\n const uniqueValues = new Set<any>();\n \n data.forEach(item => {\n if (item[field] != null) {\n uniqueValues.add(item[field]);\n }\n });\n \n return Array.from(uniqueValues).map(value => ({\n label: String(value),\n value: String(value)\n }));\n}\n\n// 默认的列筛选函数\nexport const defaultFilterFunctions = {\n // 文本筛选\n text: (row: any, columnId: string, filterValue: string) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n return String(value).toLowerCase().includes(filterValue.toLowerCase());\n },\n \n // 范围筛选\n range: (row: any, columnId: string, filterValue: [number | undefined, number | undefined]) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n \n const numValue = typeof value === 'string' ? parseFloat(value) : value;\n if (isNaN(numValue)) return false;\n \n const [min, max] = filterValue;\n if (min !== undefined && numValue < min) return false;\n if (max !== undefined && numValue > max) return false;\n \n return true;\n },\n \n // 日期范围筛选\n dateRange: (row: any, columnId: string, filterValue: [string | undefined, string | undefined]) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n \n const dateValue = value instanceof Date ? value : new Date(value);\n if (isNaN(dateValue.getTime())) return false;\n \n const [startDate, endDate] = filterValue;\n \n if (startDate) {\n const start = new Date(startDate);\n start.setHours(0, 0, 0, 0);\n if (dateValue < start) return false;\n }\n \n if (endDate) {\n const end = new Date(endDate);\n end.setHours(23, 59, 59, 999);\n if (dateValue > end) return false;\n }\n \n return true;\n },\n \n // 布尔值筛选\n boolean: (row: any, columnId: string, filterValue: boolean) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n return value === filterValue;\n },\n \n // 多选筛选\n multiSelect: (row: any, columnId: string, filterValue: string[]) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n return filterValue.includes(String(value));\n }\n};\n\nexport default {\n createColumn,\n createComputedColumn,\n createActionColumn,\n createSelectionColumn,\n numericSort,\n dateSort,\n stringSort,\n treeSort,\n createSelectOptions,\n extractUniqueOptions,\n defaultFilterFunctions\n}; "],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["React","utils_exports","createActionColumn","createColumn","createComputedColumn","createSelectOptions","createSelectionColumn","dateSort","utils_default","defaultFilterFunctions","extractUniqueOptions","numericSort","stringSort","treeSort","normalizeColumn","col","rest","sortingFn","accessorKeyOrOptions","headerOrNone","options","idOrOptions","accessorFnOrNone","cellOrNone","table","row","valueA","rowA","columnId","valueB","rowB","numA","numB","dateA","dateB","strA","strB","depthA","depthB","sortFn","labelField","items","item","valueField","uniqueValues","data","field","value","filterValue","numValue","min","max","dateValue","startDate","endDate","start","end"],"sources":["../../../../src/components/pro/DataTable/utils.ts"],"sourcesContent":["import React from 'react';\nimport { ColumnDef, Row, SortingFn, SortingFnOption } from './tanstack-table';\n\n/**\n * 列选项类型:在标准 v9 `ColumnDef` 基础上,额外兼容 v8 命名的 `sortingFn`\n * (会在 `createColumn` 内部归一化为 v9 的 `sortFn`)。\n */\nexport type ColumnOptions<T extends object> = Partial<ColumnDef<T>> & {\n /** @deprecated 请使用 v9 的 `sortFn`。为向后兼容保留,内部会归一化为 `sortFn`。 */\n sortingFn?: SortingFnOption<T> | SortingFn<T>;\n};\n\n/** 将 v8 命名的 `sortingFn` 归一化为 v9 的 `sortFn`。 */\nfunction normalizeColumn<T extends object>(col: ColumnOptions<T>): ColumnDef<T> {\n if (col && 'sortingFn' in col && col.sortingFn != null) {\n const { sortingFn, ...rest } = col as ColumnOptions<T> & { sortFn?: unknown };\n return { sortFn: sortingFn, ...rest } as ColumnDef<T>;\n }\n return col as ColumnDef<T>;\n}\n\n// 创建DataTable列的辅助函数\nexport function createColumn<T extends object>(\n accessorKeyOrOptions: keyof T | string | ColumnOptions<T>,\n headerOrNone?: string,\n options: ColumnOptions<T> = {}\n): ColumnDef<T> {\n // 检查参数类型,支持两种调用方式:\n // 1. createColumn(accessorKey, header, options)\n // 2. createColumn({ accessorKey, header, ...options })\n if (typeof accessorKeyOrOptions === 'object') {\n // 使用对象形式的参数\n return normalizeColumn(accessorKeyOrOptions);\n } else {\n // 使用传统的参数形式\n return normalizeColumn({\n accessorKey: String(accessorKeyOrOptions),\n header: headerOrNone || String(accessorKeyOrOptions),\n ...options,\n });\n }\n}\n\n// 创建计算列的辅助函数\nexport function createComputedColumn<T extends object>(\n idOrOptions: string | Partial<ColumnDef<T>>,\n headerOrNone?: string,\n accessorFnOrNone?: (row: T) => any,\n options: Partial<ColumnDef<T>> = {}\n): ColumnDef<T> {\n // 检查参数类型,支持两种调用方式\n if (typeof idOrOptions === 'object') {\n // 使用对象形式的参数\n return idOrOptions as ColumnDef<T>;\n } else {\n // 使用传统的参数形式\n return {\n id: idOrOptions,\n header: headerOrNone || idOrOptions,\n accessorFn: accessorFnOrNone,\n ...options,\n };\n }\n}\n\n// 创建操作列的辅助函数\nexport function createActionColumn<T extends object>(\n idOrOptions: string | Partial<ColumnDef<T>>,\n headerOrNone?: string,\n cellOrNone?: (props: { row: Row<T> }) => React.ReactNode,\n options: Partial<ColumnDef<T>> = {}\n): ColumnDef<T> {\n // 检查参数类型,支持两种调用方式\n if (typeof idOrOptions === 'object') {\n // 使用对象形式的参数,并确保enableSorting默认为false\n return {\n enableSorting: false,\n ...idOrOptions as ColumnDef<T>\n };\n } else {\n // 使用传统的参数形式\n return {\n id: idOrOptions,\n header: headerOrNone || idOrOptions,\n cell: cellOrNone,\n enableSorting: false,\n ...options,\n };\n }\n}\n\n// 创建选择列的辅助函数\nexport function createSelectionColumn<T extends object>(\n options: Partial<ColumnDef<T>> = {}\n): ColumnDef<T> {\n const defaults = {\n id: 'selection',\n header: ({ table }: any) => \n React.createElement('input', {\n type: \"checkbox\",\n checked: table.getIsAllRowsSelected(),\n onChange: table.getToggleAllRowsSelectedHandler(),\n className: \"checkbox checkbox-sm\"\n }),\n cell: ({ row }: any) => \n React.createElement('input', {\n type: \"checkbox\",\n checked: row.getIsSelected(),\n onChange: row.getToggleSelectedHandler(),\n className: \"checkbox checkbox-sm\",\n onClick: (e: React.MouseEvent) => e.stopPropagation()\n }),\n enableSorting: false,\n };\n\n // 强制类型转换为ColumnDef<T>,因为我们确保提供了必要的id属性\n return { ...defaults, ...options } as ColumnDef<T>;\n}\n\n// 数字排序函数,支持null和undefined\nexport const numericSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = rowA.getValue(columnId);\n const valueB = rowB.getValue(columnId);\n \n // 处理null或undefined值\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n \n // 尝试将字符串转换为数字\n const numA = typeof valueA === 'string' ? parseFloat(valueA) : Number(valueA);\n const numB = typeof valueB === 'string' ? parseFloat(valueB) : Number(valueB);\n \n if (Number.isNaN(numA) && Number.isNaN(numB)) return 0;\n if (Number.isNaN(numA)) return -1;\n if (Number.isNaN(numB)) return 1;\n \n return numA - numB;\n};\n\n// 日期排序函数,支持不同的日期格式\nexport const dateSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = rowA.getValue(columnId);\n const valueB = rowB.getValue(columnId);\n \n // 处理null或undefined值\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n \n // 将值转换为Date对象\n const dateA = valueA instanceof Date ? valueA : new Date(String(valueA));\n const dateB = valueB instanceof Date ? valueB : new Date(String(valueB));\n \n // 处理无效日期\n if (isNaN(dateA.getTime()) && isNaN(dateB.getTime())) return 0;\n if (isNaN(dateA.getTime())) return -1;\n if (isNaN(dateB.getTime())) return 1;\n \n return dateA.getTime() - dateB.getTime();\n};\n\n// 字符串排序函数,支持本地化比较和大小写不敏感\nexport const stringSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = rowA.getValue(columnId);\n const valueB = rowB.getValue(columnId);\n \n // 处理null或undefined值\n if (valueA == null && valueB == null) return 0;\n if (valueA == null) return -1;\n if (valueB == null) return 1;\n \n // 转换为字符串并进行本地化比较\n const strA = String(valueA).toLowerCase();\n const strB = String(valueB).toLowerCase();\n \n return strA.localeCompare(strB);\n};\n\n// 定义树状数据行的接口,包含深度信息\nexport interface TreeDataRow {\n __depth?: number;\n __id?: string;\n __parentId?: string;\n __hasChildren?: boolean;\n __isExpanded?: boolean;\n __childCount?: number;\n [key: string]: any;\n}\n\n// 树状结构排序函数 - 只对最外层的父项数据进行排序\nexport const treeSort = <T extends TreeDataRow>(\n sortFn: SortingFn<T>,\n subDataKey: string\n): SortingFn<T> => {\n return (rowA, rowB, columnId) => {\n const valueA = rowA.original;\n const valueB = rowB.original;\n \n // 检查是否为子项\n const depthA = valueA.__depth !== undefined ? valueA.__depth : 0;\n const depthB = valueB.__depth !== undefined ? valueB.__depth : 0;\n \n // 如果两行深度不同,保持原来的顺序\n // 这意味着子项将总是跟随其父项\n if (depthA !== depthB) {\n return 0;\n }\n \n // 如果两行都是顶层(depth=0),使用传入的排序函数\n if (depthA === 0 && depthB === 0) {\n return sortFn(rowA, rowB, columnId);\n }\n \n // 对于相同深度的非顶层行,保持它们相对顺序不变\n return 0;\n };\n};\n\n// 将对象数组转换为SelectFilter的选项格式\nexport function createSelectOptions<T>(\n items: T[], \n labelField: keyof T, \n valueField: keyof T = labelField\n) {\n return items.map(item => ({\n label: String(item[labelField]),\n value: String(item[valueField]),\n }));\n}\n\n// 从数据中提取唯一值作为SelectFilter的选项\nexport function extractUniqueOptions<T>(\n data: T[], \n field: keyof T\n) {\n const uniqueValues = new Set<any>();\n \n data.forEach(item => {\n if (item[field] != null) {\n uniqueValues.add(item[field]);\n }\n });\n \n return Array.from(uniqueValues).map(value => ({\n label: String(value),\n value: String(value)\n }));\n}\n\n// 默认的列筛选函数\nexport const defaultFilterFunctions = {\n // 文本筛选\n text: (row: any, columnId: string, filterValue: string) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n return String(value).toLowerCase().includes(filterValue.toLowerCase());\n },\n \n // 范围筛选\n range: (row: any, columnId: string, filterValue: [number | undefined, number | undefined]) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n \n const numValue = typeof value === 'string' ? parseFloat(value) : value;\n if (isNaN(numValue)) return false;\n \n const [min, max] = filterValue;\n if (min !== undefined && numValue < min) return false;\n if (max !== undefined && numValue > max) return false;\n \n return true;\n },\n \n // 日期范围筛选\n dateRange: (row: any, columnId: string, filterValue: [string | undefined, string | undefined]) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n \n const dateValue = value instanceof Date ? value : new Date(value);\n if (isNaN(dateValue.getTime())) return false;\n \n const [startDate, endDate] = filterValue;\n \n if (startDate) {\n const start = new Date(startDate);\n start.setHours(0, 0, 0, 0);\n if (dateValue < start) return false;\n }\n \n if (endDate) {\n const end = new Date(endDate);\n end.setHours(23, 59, 59, 999);\n if (dateValue > end) return false;\n }\n \n return true;\n },\n \n // 布尔值筛选\n boolean: (row: any, columnId: string, filterValue: boolean) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n return value === filterValue;\n },\n \n // 多选筛选\n multiSelect: (row: any, columnId: string, filterValue: string[]) => {\n const value = row.getValue(columnId);\n if (value == null) return false;\n return filterValue.includes(String(value));\n }\n};\n\nexport default {\n createColumn,\n createComputedColumn,\n createActionColumn,\n createSelectionColumn,\n numericSort,\n dateSort,\n stringSort,\n treeSort,\n createSelectOptions,\n extractUniqueOptions,\n defaultFilterFunctions\n}; "],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumb.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/Breadcrumb.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { BreadcrumbProps } from './types';\nimport { useClickOutside } from '../../../hooks/useClickOutside';\nimport { Tree, TreeNode } from '../../Tree';\n\nconst defaultLabels = {\n root: 'Root',\n};\n\nconst HomeIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" />\n </svg>\n);\n\nconst ChevronIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n);\n\nconst FolderIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 text-blue-500 opacity-80\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M2 6a2 2 0 012-2h4l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V6z\" />\n </svg>\n);\n\nconst DocumentIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 text-gray-500 opacity-80\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z\" clipRule=\"evenodd\" />\n </svg>\n);\n\nconst BreadcrumbDropTree: React.FC<{\n path: string;\n adapter: any;\n onNavigate: (path: string) => void;\n}> = ({ path, adapter, onNavigate }) => {\n const [treeData, setTreeData] = useState<TreeNode[]>([]);\n const [loading, setLoading] = useState(false);\n\n const loadPath = useCallback(async (dirPath: string): Promise<TreeNode[]> => {\n try {\n const entries = await adapter.list(dirPath);\n return entries\n .sort((a: any, b: any) => {\n if (a.type !== b.type) return a.type === 'folder' ? -1 : 1;\n return String(a.name).localeCompare(String(b.name));\n })\n .map((e: any) => ({\n id: e.path,\n label: e.name,\n icon: e.type === 'folder' ? <FolderIcon /> : <DocumentIcon />,\n meta: { type: e.type },\n children: e.type === 'folder' ? [{ id: `${e.path}/_dummy`, label: 'Loading...' }] : undefined\n }));\n } catch (e) {\n return [];\n }\n }, [adapter]);\n\n useEffect(() => {\n let mounted = true;\n setLoading(true);\n loadPath(path).then(nodes => {\n if (mounted) {\n setTreeData(nodes);\n setLoading(false);\n }\n });\n return () => { mounted = false; };\n }, [path, loadPath]);\n\n const handleToggle = useCallback(async (nodeId: string | number, expanded: boolean) => {\n if (!expanded) return;\n const idStr = String(nodeId);\n\n const findNode = (nodes: TreeNode[], targetId: string): TreeNode | null => {\n for (const n of nodes) {\n if (n.id === targetId) return n;\n if (n.children) {\n const found = findNode(n.children, targetId);\n if (found) return found;\n }\n }\n return null;\n };\n\n const node = findNode(treeData, idStr);\n if (node && node.children?.length === 1 && String(node.children[0].id).endsWith('_dummy')) {\n const childrenNodes = await loadPath(idStr);\n const updateNodes = (nodes: TreeNode[]): TreeNode[] => {\n return nodes.map(n => {\n if (n.id === idStr) {\n return { ...n, children: childrenNodes };\n }\n if (n.children) return { ...n, children: updateNodes(n.children) };\n return n;\n });\n };\n setTreeData(prev => updateNodes(prev));\n }\n }, [treeData, loadPath]);\n\n const handleClick = useCallback((node: TreeNode) => {\n if (String(node.id).endsWith('_dummy')) return;\n if (node.meta?.type === 'file') return;\n onNavigate(String(node.id));\n }, [onNavigate]);\n\n if (loading) return <div className=\"px-4 py-3 w-48 text-center text-xs opacity-50\">Loading...</div>;\n if (treeData.length === 0) return <div className=\"px-4 py-3 w-48 text-center text-xs opacity-50\">Empty Folder</div>;\n\n return (\n <div className=\"p-1 w-64 max-h-[300px] overflow-y-auto sm:min-w-[200px] max-w-[80vw]\">\n <Tree\n data={treeData}\n onNodeClick={handleClick}\n onNodeToggle={handleToggle}\n showSearch={false}\n showExpandAll={false}\n showLine={false}\n showIcon={true}\n showCount={false}\n className=\"!bg-transparent !border-none !p-1 shadow-none overflow-visible\"\n indent={12}\n />\n </div>\n );\n};\n\nconst ChevronDrop: React.FC<{\n path: string;\n adapter?: any;\n onNavigate: (p: string) => void;\n}> = ({ path, adapter, onNavigate }) => {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useClickOutside(ref, () => setOpen(false), open);\n\n return (\n <div className=\"relative flex items-center\" ref={ref}>\n {adapter ? (\n <button\n className={`btn btn-ghost btn-xs px-0.5 mx-0.5 min-h-0 h-5 rounded hover:bg-base-200 transition-colors ${open ? 'bg-base-200' : 'opacity-50'}`}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(!open);\n }}\n >\n <ChevronIcon />\n </button>\n ) : (\n <span className=\"opacity-40 mx-1\"><ChevronIcon /></span>\n )}\n\n {open && adapter && (\n <div\n className=\"absolute top-full left-1/2 -translate-x-1/2 mt-1 bg-base-100 shadow-2xl border border-base-200 rounded-xl z-[9999]\"\n onClick={(e) => e.stopPropagation()}\n >\n <BreadcrumbDropTree\n path={path}\n adapter={adapter}\n onNavigate={(p) => {\n onNavigate(p);\n setOpen(false);\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\n/** Split a path like \"/a/b/c\" into breadcrumb segments */\nfunction pathSegments(path: string): { label: string; path: string; basePath: string }[] {\n const parts = path.split('/').filter(Boolean);\n const segments: { label: string; path: string; basePath: string }[] = [];\n for (let i = 0; i < parts.length; i++) {\n segments.push({\n label: parts[i],\n path: '/' + parts.slice(0, i + 1).join('/'),\n basePath: i === 0 ? '/' : '/' + parts.slice(0, i).join('/')\n });\n }\n return segments;\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({\n path,\n labels: userLabels,\n adapter,\n onNavigate,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n const segments = pathSegments(path);\n const isRoot = segments.length === 0;\n\n return (\n <nav className=\"flex items-center text-sm overflow-x-visible py-2 px-1 gap-0.5 min-h-[36px]\">\n <button\n className={`btn btn-ghost btn-xs gap-1 flex-shrink-0 ${isRoot ? 'font-semibold' : ''}`}\n onClick={() => onNavigate('/')}\n >\n <HomeIcon />\n {labels.root}\n </button>\n\n {segments.map((seg, idx) => {\n const isLast = idx === segments.length - 1;\n return (\n <React.Fragment key={seg.path}>\n <ChevronDrop path={seg.basePath} adapter={adapter} onNavigate={onNavigate} />\n <button\n className={`btn btn-ghost btn-xs flex-shrink-0 truncate max-w-[160px] ${isLast ? 'font-semibold' : ''}`}\n onClick={() => onNavigate(seg.path)}\n disabled={isLast}\n >\n {seg.label}\n </button>\n </React.Fragment>\n );\n })}\n </nav>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","names":["Tree","React","defaultLabels","HomeIcon","ChevronIcon","FolderIcon","DocumentIcon","BreadcrumbDropTree","treeData","setTreeData","useState","loading","setLoading","loadPath","useCallback","adapter","dirPath","a","b","mounted","path","nodes","handleToggle","expanded","idStr","nodeId","findNode","targetId","found","node","childrenNodes","updateNodes","n","prev","handleClick","onNavigate","ChevronDrop","open","setOpen","ref","useRef","useClickOutside","p","pathSegments","parts","segments","i","Breadcrumb","userLabels","labels","isRoot","isLast","idx","seg"],"sources":["../../../../src/components/pro/FileExplorer/Breadcrumb.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { BreadcrumbProps } from './types';\nimport { useClickOutside } from '../../../hooks/useClickOutside';\nimport { Tree, TreeNode } from '../../Tree';\n\nconst defaultLabels = {\n root: 'Root',\n};\n\nconst HomeIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" />\n </svg>\n);\n\nconst ChevronIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n);\n\nconst FolderIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 text-blue-500 opacity-80\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path d=\"M2 6a2 2 0 012-2h4l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V6z\" />\n </svg>\n);\n\nconst DocumentIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 text-gray-500 opacity-80\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z\" clipRule=\"evenodd\" />\n </svg>\n);\n\nconst BreadcrumbDropTree: React.FC<{\n path: string;\n adapter: any;\n onNavigate: (path: string) => void;\n}> = ({ path, adapter, onNavigate }) => {\n const [treeData, setTreeData] = useState<TreeNode[]>([]);\n const [loading, setLoading] = useState(false);\n\n const loadPath = useCallback(async (dirPath: string): Promise<TreeNode[]> => {\n try {\n const entries = await adapter.list(dirPath);\n return entries\n .sort((a: any, b: any) => {\n if (a.type !== b.type) return a.type === 'folder' ? -1 : 1;\n return String(a.name).localeCompare(String(b.name));\n })\n .map((e: any) => ({\n id: e.path,\n label: e.name,\n icon: e.type === 'folder' ? <FolderIcon /> : <DocumentIcon />,\n meta: { type: e.type },\n children: e.type === 'folder' ? [{ id: `${e.path}/_dummy`, label: 'Loading...' }] : undefined\n }));\n } catch (e) {\n return [];\n }\n }, [adapter]);\n\n useEffect(() => {\n let mounted = true;\n setLoading(true);\n loadPath(path).then(nodes => {\n if (mounted) {\n setTreeData(nodes);\n setLoading(false);\n }\n });\n return () => { mounted = false; };\n }, [path, loadPath]);\n\n const handleToggle = useCallback(async (nodeId: string | number, expanded: boolean) => {\n if (!expanded) return;\n const idStr = String(nodeId);\n\n const findNode = (nodes: TreeNode[], targetId: string): TreeNode | null => {\n for (const n of nodes) {\n if (n.id === targetId) return n;\n if (n.children) {\n const found = findNode(n.children, targetId);\n if (found) return found;\n }\n }\n return null;\n };\n\n const node = findNode(treeData, idStr);\n if (node && node.children?.length === 1 && String(node.children[0].id).endsWith('_dummy')) {\n const childrenNodes = await loadPath(idStr);\n const updateNodes = (nodes: TreeNode[]): TreeNode[] => {\n return nodes.map(n => {\n if (n.id === idStr) {\n return { ...n, children: childrenNodes };\n }\n if (n.children) return { ...n, children: updateNodes(n.children) };\n return n;\n });\n };\n setTreeData(prev => updateNodes(prev));\n }\n }, [treeData, loadPath]);\n\n const handleClick = useCallback((node: TreeNode) => {\n if (String(node.id).endsWith('_dummy')) return;\n if (node.meta?.type === 'file') return;\n onNavigate(String(node.id));\n }, [onNavigate]);\n\n if (loading) return <div className=\"px-4 py-3 w-48 text-center text-xs opacity-50\">Loading...</div>;\n if (treeData.length === 0) return <div className=\"px-4 py-3 w-48 text-center text-xs opacity-50\">Empty Folder</div>;\n\n return (\n <div className=\"p-1 w-64 max-h-[300px] overflow-y-auto sm:min-w-[200px] max-w-[80vw]\">\n <Tree\n data={treeData}\n onNodeClick={handleClick}\n onNodeToggle={handleToggle}\n showSearch={false}\n showExpandAll={false}\n showLine={false}\n showIcon={true}\n showCount={false}\n className=\"!bg-transparent !border-none !p-1 shadow-none overflow-visible\"\n indent={12}\n />\n </div>\n );\n};\n\nconst ChevronDrop: React.FC<{\n path: string;\n adapter?: any;\n onNavigate: (p: string) => void;\n}> = ({ path, adapter, onNavigate }) => {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useClickOutside(ref, () => setOpen(false), open);\n\n return (\n <div className=\"relative flex items-center\" ref={ref}>\n {adapter ? (\n <button\n className={`btn btn-ghost btn-xs px-0.5 mx-0.5 min-h-0 h-5 rounded hover:bg-base-200 transition-colors ${open ? 'bg-base-200' : 'opacity-50'}`}\n onClick={(e) => {\n e.stopPropagation();\n setOpen(!open);\n }}\n >\n <ChevronIcon />\n </button>\n ) : (\n <span className=\"opacity-40 mx-1\"><ChevronIcon /></span>\n )}\n\n {open && adapter && (\n <div\n className=\"absolute top-full left-1/2 -translate-x-1/2 mt-1 bg-base-100 shadow-2xl border border-base-200 rounded-xl z-[9999]\"\n onClick={(e) => e.stopPropagation()}\n >\n <BreadcrumbDropTree\n path={path}\n adapter={adapter}\n onNavigate={(p) => {\n onNavigate(p);\n setOpen(false);\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\n/** Split a path like \"/a/b/c\" into breadcrumb segments */\nfunction pathSegments(path: string): { label: string; path: string; basePath: string }[] {\n const parts = path.split('/').filter(Boolean);\n const segments: { label: string; path: string; basePath: string }[] = [];\n for (let i = 0; i < parts.length; i++) {\n segments.push({\n label: parts[i],\n path: '/' + parts.slice(0, i + 1).join('/'),\n basePath: i === 0 ? '/' : '/' + parts.slice(0, i).join('/')\n });\n }\n return segments;\n}\n\nexport const Breadcrumb: React.FC<BreadcrumbProps> = ({\n path,\n labels: userLabels,\n adapter,\n onNavigate,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n const segments = pathSegments(path);\n const isRoot = segments.length === 0;\n\n return (\n <nav className=\"flex items-center text-sm overflow-x-visible py-2 px-1 gap-0.5 min-h-[36px]\">\n <button\n className={`btn btn-ghost btn-xs gap-1 flex-shrink-0 ${isRoot ? 'font-semibold' : ''}`}\n onClick={() => onNavigate('/')}\n >\n <HomeIcon />\n {labels.root}\n </button>\n\n {segments.map((seg, idx) => {\n const isLast = idx === segments.length - 1;\n return (\n <React.Fragment key={seg.path}>\n <ChevronDrop path={seg.basePath} adapter={adapter} onNavigate={onNavigate} />\n <button\n className={`btn btn-ghost btn-xs flex-shrink-0 truncate max-w-[160px] ${isLast ? 'font-semibold' : ''}`}\n onClick={() => onNavigate(seg.path)}\n disabled={isLast}\n >\n {seg.label}\n </button>\n </React.Fragment>\n );\n })}\n </nav>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDialog.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/CreateDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { CreateDialogProps } from './types';\nimport Button from '../../Button';\nimport Input from '../../Input';\n\nconst defaultLabels = {\n newFolder: 'New Folder',\n newFile: 'New File',\n create: 'Create',\n cancel: 'Cancel',\n folderNamePlaceholder: 'Folder name',\n fileNamePlaceholder: 'File name',\n};\n\nexport const CreateDialog: React.FC<CreateDialogProps> = ({\n type,\n labels: userLabels,\n onConfirm,\n onCancel,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n const [name, setName] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n // Auto-focus the input with a small delay for animation\n const timer = setTimeout(() => {\n inputRef.current?.focus();\n }, 50);\n return () => clearTimeout(timer);\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const trimmed = name.trim();\n if (trimmed) {\n onConfirm(trimmed);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel();\n }\n };\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-base-200/80 rounded-lg border border-base-300 animate-in\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 opacity-50 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n {type === 'folder' ? (\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n ) : (\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m5 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n )}\n </svg>\n\n <form onSubmit={handleSubmit} className=\"flex items-center gap-2 flex-1\" onKeyDown={handleKeyDown}>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"input input-sm input-bordered flex-1 min-w-0\"\n placeholder={type === 'folder' ? labels.folderNamePlaceholder : labels.fileNamePlaceholder}\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n <Button\n variant=\"primary\"\n size=\"xs\"\n disabled={!name.trim()}\n onClick={() => { if (name.trim()) onConfirm(name.trim()); }}\n >\n {labels.create}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={onCancel}\n >\n {labels.cancel}\n </Button>\n </form>\n </div>\n );\n};\n"],"mappings":";;;;AAKA,
|
|
1
|
+
{"version":3,"file":"CreateDialog.js","names":["Button","ButtonWithCompounds","defaultLabels","CreateDialog","userLabels","labels","name","setName","useState","inputRef","useRef","useEffect","timer","type","trimmed","onConfirm","onCancel"],"sources":["../../../../src/components/pro/FileExplorer/CreateDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { CreateDialogProps } from './types';\nimport Button from '../../Button';\nimport Input from '../../Input';\n\nconst defaultLabels = {\n newFolder: 'New Folder',\n newFile: 'New File',\n create: 'Create',\n cancel: 'Cancel',\n folderNamePlaceholder: 'Folder name',\n fileNamePlaceholder: 'File name',\n};\n\nexport const CreateDialog: React.FC<CreateDialogProps> = ({\n type,\n labels: userLabels,\n onConfirm,\n onCancel,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n const [name, setName] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n // Auto-focus the input with a small delay for animation\n const timer = setTimeout(() => {\n inputRef.current?.focus();\n }, 50);\n return () => clearTimeout(timer);\n }, []);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const trimmed = name.trim();\n if (trimmed) {\n onConfirm(trimmed);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel();\n }\n };\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-base-200/80 rounded-lg border border-base-300 animate-in\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 opacity-50 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n {type === 'folder' ? (\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n ) : (\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m5 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n )}\n </svg>\n\n <form onSubmit={handleSubmit} className=\"flex items-center gap-2 flex-1\" onKeyDown={handleKeyDown}>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"input input-sm input-bordered flex-1 min-w-0\"\n placeholder={type === 'folder' ? labels.folderNamePlaceholder : labels.fileNamePlaceholder}\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n <Button\n variant=\"primary\"\n size=\"xs\"\n disabled={!name.trim()}\n onClick={() => { if (name.trim()) onConfirm(name.trim()); }}\n >\n {labels.create}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={onCancel}\n >\n {labels.cancel}\n </Button>\n </form>\n </div>\n );\n};\n"],"mappings":";;;;AAKA,IAAME,IAAgB;CAClB,WAAW;CACX,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,uBAAuB;CACvB,qBAAqB;AACzB,GAEaC,KAA6C,EACtD,SACA,QAAQC,GACR,cACA,kBACE;CACF,IAAMC,IAAS;EAAE,GAAGH;EAAe,GAAGE;CAAW,GAC3C,CAACE,GAAMC,KAAWC,EAAS,EAAE,GAC7BC,IAAWC,EAAyB,IAAI;CAwB9C,OAtBAC,QAAgB;EAEZ,IAAMC,IAAQ,iBAAiB;GAC3B,EAAS,SAAS,MAAM;EAC5B,GAAG,EAAE;EACL,aAAa,aAAaA,CAAK;CACnC,GAAG,CAAC,CAAC,GAiBD,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,kBAAC,OAAD;GAAK,OAAM;GAA6B,WAAU;GAAmC,MAAK;GAAO,SAAQ;GAAY,QAAO;GAAe,aAAa;GACnJ,UAAAC,MAAS,WACN,kBAAC,QAAD;IAAM,eAAc;IAAQ,gBAAe;IAAQ,GAAE;GAAwF,CAAA,IAE7I,kBAAC,QAAD;IAAM,eAAc;IAAQ,gBAAe;IAAQ,GAAE;GAAwH,CAAA;EAEhL,CAAA,GAEL,kBAAC,QAAD;GAAM,WAxBQ,MAAuB;IACzC,EAAE,eAAe;IACjB,IAAMC,IAAUR,EAAK,KAAK;IAC1B,AAAIQ,KACAC,EAAUD,CAAO;GAEzB;GAkBsC,WAAU;GAAiC,YAhB1D,MAA2B;IAC9C,AAAI,EAAE,QAAQ,YACVE,EAAS;GAEjB;GAYQ,UAAA;IACI,kBAAC,SAAD;KACI,KAAKP;KACL,MAAK;KACL,WAAU;KACV,aAAaI,MAAS,WAAWR,EAAO,wBAAwBA,EAAO;KACvE,OAAOC;KACP,WAAW,MAAMC,EAAQ,EAAE,OAAO,KAAK;IAC1C,CAAA;IACD,kBAACP,GAAD;KACI,SAAQ;KACR,MAAK;KACL,UAAU,CAACM,EAAK,KAAK;KACrB,eAAe;MAAE,AAAIA,EAAK,KAAK,KAAGS,EAAUT,EAAK,KAAK,CAAC;KAAG;KAEzD,UAAAD,EAAO;IACJ,CAAA;IACR,kBAACL,GAAD;KACI,SAAQ;KACR,MAAK;KACL,SAASgB;KAER,UAAAX,EAAO;IACJ,CAAA;GACN;EACL,CAAA,CAAA;;AAEb"}
|