@zerodep-dev/vue-tsx-pro-ui 0.2.0 → 0.3.0
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/base/Badge.js +3 -3
- package/dist/base/Badge.js.map +1 -1
- package/dist/base/Can.d.ts +12 -0
- package/dist/base/Can.js +20 -0
- package/dist/base/Can.js.map +1 -0
- package/dist/base/ClientOnly.d.ts +10 -0
- package/dist/base/ClientOnly.js +18 -0
- package/dist/base/ClientOnly.js.map +1 -0
- package/dist/base/CloseButton.js +3 -3
- package/dist/base/CloseButton.js.map +1 -1
- package/dist/base/CodeBlock.js +5 -5
- package/dist/base/CodeBlock.js.map +1 -1
- package/dist/base/CopyButton.js +3 -3
- package/dist/base/CopyButton.js.map +1 -1
- package/dist/base/Icon.js +3 -3
- package/dist/base/Icon.js.map +1 -1
- package/dist/base/Indicator.js +3 -3
- package/dist/base/Indicator.js.map +1 -1
- package/dist/base/StatusDot.js +3 -3
- package/dist/base/StatusDot.js.map +1 -1
- package/dist/base/Tag.js +5 -5
- package/dist/base/Tag.js.map +1 -1
- package/dist/base/button-core.js +4 -4
- package/dist/base/button-core.js.map +1 -1
- package/dist/charts/AreaChart.js +3 -3
- package/dist/charts/AreaChart.js.map +1 -1
- package/dist/charts/BarChart.js +3 -3
- package/dist/charts/BarChart.js.map +1 -1
- package/dist/charts/ChordChart.js +3 -3
- package/dist/charts/ChordChart.js.map +1 -1
- package/dist/charts/ComboChart.js +3 -3
- package/dist/charts/ComboChart.js.map +1 -1
- package/dist/charts/DonutChart.js +3 -3
- package/dist/charts/DonutChart.js.map +1 -1
- package/dist/charts/FunnelChart.js +5 -5
- package/dist/charts/FunnelChart.js.map +1 -1
- package/dist/charts/GraphChart.js +3 -3
- package/dist/charts/GraphChart.js.map +1 -1
- package/dist/charts/LineChart.js +3 -3
- package/dist/charts/LineChart.js.map +1 -1
- package/dist/charts/MapChart.js +7 -7
- package/dist/charts/MapChart.js.map +1 -1
- package/dist/charts/RadarChart.js +16 -15
- package/dist/charts/RadarChart.js.map +1 -1
- package/dist/charts/SankeyChart.js +3 -3
- package/dist/charts/SankeyChart.js.map +1 -1
- package/dist/charts/ScatterChart.js +3 -3
- package/dist/charts/ScatterChart.js.map +1 -1
- package/dist/charts/TimelineChart.js +6 -5
- package/dist/charts/TimelineChart.js.map +1 -1
- package/dist/charts/TreemapChart.js +3 -3
- package/dist/charts/TreemapChart.js.map +1 -1
- package/dist/charts/WaterfallChart.js +3 -3
- package/dist/charts/WaterfallChart.js.map +1 -1
- package/dist/charts/XYChart.js +9 -7
- package/dist/charts/XYChart.js.map +1 -1
- package/dist/charts/frame.js +10 -8
- package/dist/charts/frame.js.map +1 -1
- package/dist/charts/single.js +4 -3
- package/dist/charts/single.js.map +1 -1
- package/dist/config/Provider.d.ts +3 -1
- package/dist/config/Provider.js +9 -4
- package/dist/config/Provider.js.map +1 -1
- package/dist/config/context.d.ts +18 -0
- package/dist/config/context.js +16 -1
- package/dist/config/context.js.map +1 -1
- package/dist/config/createUi.d.ts +20 -3
- package/dist/config/createUi.js +80 -49
- package/dist/config/createUi.js.map +1 -1
- package/dist/config/layout/preference.d.ts +43 -0
- package/dist/config/layout/preference.js +108 -0
- package/dist/config/layout/preference.js.map +1 -0
- package/dist/date/Calendar.js +3 -3
- package/dist/date/Calendar.js.map +1 -1
- package/dist/date/CalendarBoard.js +9 -9
- package/dist/date/CalendarBoard.js.map +1 -1
- package/dist/date/CalendarView.js +7 -7
- package/dist/date/CalendarView.js.map +1 -1
- package/dist/date/DateField.js +3 -3
- package/dist/date/DateField.js.map +1 -1
- package/dist/date/DatePicker.js +5 -5
- package/dist/date/DatePicker.js.map +1 -1
- package/dist/date/DateRangePicker.js +5 -5
- package/dist/date/DateRangePicker.js.map +1 -1
- package/dist/date/DateSegmentGroup.js +5 -5
- package/dist/date/DateSegmentGroup.js.map +1 -1
- package/dist/date/QuarterCalendar.js +6 -6
- package/dist/date/QuarterCalendar.js.map +1 -1
- package/dist/date/RangeCalendar.js +3 -3
- package/dist/date/RangeCalendar.js.map +1 -1
- package/dist/date/SegmentedField.js +3 -3
- package/dist/date/SegmentedField.js.map +1 -1
- package/dist/date/TimeField.js +3 -3
- package/dist/date/TimeField.js.map +1 -1
- package/dist/date/TimePicker.js +4 -4
- package/dist/date/TimePicker.js.map +1 -1
- package/dist/date/date-segments.js +1 -1
- package/dist/date/date-segments.js.map +1 -1
- package/dist/date/picker-popover.js +3 -2
- package/dist/date/picker-popover.js.map +1 -1
- package/dist/diagram/Diagram.js +12 -12
- package/dist/diagram/Diagram.js.map +1 -1
- package/dist/diagram/DiagramLanes.js +3 -3
- package/dist/diagram/DiagramLanes.js.map +1 -1
- package/dist/diagram/DiagramMinimap.js +4 -4
- package/dist/diagram/DiagramMinimap.js.map +1 -1
- package/dist/display/Accordion.js +6 -6
- package/dist/display/Accordion.js.map +1 -1
- package/dist/display/AnimatedNumber.js +4 -4
- package/dist/display/AnimatedNumber.js.map +1 -1
- package/dist/display/Avatar.js +4 -4
- package/dist/display/Avatar.js.map +1 -1
- package/dist/display/Checklist.js +7 -7
- package/dist/display/Checklist.js.map +1 -1
- package/dist/display/Collapse.js +8 -5
- package/dist/display/Collapse.js.map +1 -1
- package/dist/display/Collapsible.js +3 -3
- package/dist/display/Collapsible.js.map +1 -1
- package/dist/display/Descriptions.js +5 -5
- package/dist/display/Descriptions.js.map +1 -1
- package/dist/display/Ellipsis.js +3 -3
- package/dist/display/Ellipsis.js.map +1 -1
- package/dist/display/FieldCompare.js +4 -4
- package/dist/display/FieldCompare.js.map +1 -1
- package/dist/display/Gauge.js +11 -11
- package/dist/display/Gauge.js.map +1 -1
- package/dist/display/Image.js +4 -4
- package/dist/display/Image.js.map +1 -1
- package/dist/display/Marquee.js +3 -3
- package/dist/display/Marquee.js.map +1 -1
- package/dist/display/ProportionBar.js +4 -4
- package/dist/display/ProportionBar.js.map +1 -1
- package/dist/display/Sortable.js +4 -4
- package/dist/display/Sortable.js.map +1 -1
- package/dist/display/Sparkline.js +6 -6
- package/dist/display/Sparkline.js.map +1 -1
- package/dist/display/Stat.js +3 -3
- package/dist/display/Stat.js.map +1 -1
- package/dist/display/Timeline.js +7 -7
- package/dist/display/Timeline.js.map +1 -1
- package/dist/display/Tree.js +10 -10
- package/dist/display/Tree.js.map +1 -1
- package/dist/display/VirtualList.js +7 -7
- package/dist/display/VirtualList.js.map +1 -1
- package/dist/display/Watermark.js +3 -3
- package/dist/display/Watermark.js.map +1 -1
- package/dist/docs-kit/CodeGroup.js +5 -5
- package/dist/docs-kit/CodeGroup.js.map +1 -1
- package/dist/docs-kit/CodePreview.js +6 -6
- package/dist/docs-kit/CodePreview.js.map +1 -1
- package/dist/docs-kit/PropsTable.js +4 -4
- package/dist/docs-kit/PropsTable.js.map +1 -1
- package/dist/feedback/Alert.js +5 -5
- package/dist/feedback/Alert.js.map +1 -1
- package/dist/feedback/Banner.js +5 -5
- package/dist/feedback/Banner.js.map +1 -1
- package/dist/feedback/Empty.js +4 -4
- package/dist/feedback/Empty.js.map +1 -1
- package/dist/feedback/LoadingBar.js +20 -13
- package/dist/feedback/LoadingBar.js.map +1 -1
- package/dist/feedback/LoadingOverlay.js +3 -3
- package/dist/feedback/LoadingOverlay.js.map +1 -1
- package/dist/feedback/Progress.js +14 -14
- package/dist/feedback/Progress.js.map +1 -1
- package/dist/feedback/Result.js +4 -4
- package/dist/feedback/Result.js.map +1 -1
- package/dist/feedback/SkeletonText.js +3 -3
- package/dist/feedback/SkeletonText.js.map +1 -1
- package/dist/feedback/Toast.js +6 -6
- package/dist/feedback/Toast.js.map +1 -1
- package/dist/form/Field.js +7 -7
- package/dist/form/Field.js.map +1 -1
- package/dist/form/Form.js +3 -3
- package/dist/form/Form.js.map +1 -1
- package/dist/form/FormErrorSummary.js +3 -3
- package/dist/form/FormErrorSummary.js.map +1 -1
- package/dist/form/FormSection.js +6 -6
- package/dist/form/FormSection.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.js +10 -5
- package/dist/input/Autocomplete.js +3 -3
- package/dist/input/Autocomplete.js.map +1 -1
- package/dist/input/Cascader.js +7 -7
- package/dist/input/Cascader.js.map +1 -1
- package/dist/input/CharacterCount.js +3 -3
- package/dist/input/CharacterCount.js.map +1 -1
- package/dist/input/Checkbox.js +5 -5
- package/dist/input/Checkbox.js.map +1 -1
- package/dist/input/ColorField.js +4 -4
- package/dist/input/ColorField.js.map +1 -1
- package/dist/input/Combobox.js +4 -4
- package/dist/input/Combobox.js.map +1 -1
- package/dist/input/ConditionBuilder.js +15 -14
- package/dist/input/ConditionBuilder.js.map +1 -1
- package/dist/input/FileDrop.js +3 -3
- package/dist/input/FileDrop.js.map +1 -1
- package/dist/input/Listbox.js +9 -9
- package/dist/input/Listbox.js.map +1 -1
- package/dist/input/Mentions.js +3 -3
- package/dist/input/Mentions.js.map +1 -1
- package/dist/input/NumberField.js +3 -3
- package/dist/input/NumberField.js.map +1 -1
- package/dist/input/NumberRangeField.js +5 -5
- package/dist/input/NumberRangeField.js.map +1 -1
- package/dist/input/OtpField.js +5 -5
- package/dist/input/OtpField.js.map +1 -1
- package/dist/input/PeoplePicker.js +6 -6
- package/dist/input/PeoplePicker.js.map +1 -1
- package/dist/input/PeoplePickerPanel.js +4 -4
- package/dist/input/PeoplePickerPanel.js.map +1 -1
- package/dist/input/Radio.js +4 -4
- package/dist/input/Radio.js.map +1 -1
- package/dist/input/Rating.js +5 -5
- package/dist/input/Rating.js.map +1 -1
- package/dist/input/Select.js +4 -4
- package/dist/input/Select.js.map +1 -1
- package/dist/input/SelectedTags.js +4 -4
- package/dist/input/SelectedTags.js.map +1 -1
- package/dist/input/Slider.js +6 -6
- package/dist/input/Slider.js.map +1 -1
- package/dist/input/Switch.js +3 -3
- package/dist/input/Switch.js.map +1 -1
- package/dist/input/TagsInput.js +5 -5
- package/dist/input/TagsInput.js.map +1 -1
- package/dist/input/TextField.js +5 -5
- package/dist/input/TextField.js.map +1 -1
- package/dist/input/Textarea.js +4 -4
- package/dist/input/Textarea.js.map +1 -1
- package/dist/input/ToggleGroup.js +4 -4
- package/dist/input/ToggleGroup.js.map +1 -1
- package/dist/input/Transfer.js +8 -8
- package/dist/input/Transfer.js.map +1 -1
- package/dist/input/TreeSelect.js +6 -6
- package/dist/input/TreeSelect.js.map +1 -1
- package/dist/input/Upload.js +8 -8
- package/dist/input/Upload.js.map +1 -1
- package/dist/layout/Affix.js +4 -4
- package/dist/layout/Affix.js.map +1 -1
- package/dist/layout/ResizeHandle.d.ts +6 -2
- package/dist/layout/ResizeHandle.js +32 -9
- package/dist/layout/ResizeHandle.js.map +1 -1
- package/dist/layout/ScrollArea.js +3 -3
- package/dist/layout/ScrollArea.js.map +1 -1
- package/dist/layout/Separator.js +3 -3
- package/dist/layout/Separator.js.map +1 -1
- package/dist/layout/Splitter.js +3 -3
- package/dist/layout/Splitter.js.map +1 -1
- package/dist/layout/ViewportFill.d.ts +2 -2
- package/dist/layout/ViewportFill.js +4 -4
- package/dist/layout/ViewportFill.js.map +1 -1
- package/dist/navigation/Breadcrumbs.js +4 -4
- package/dist/navigation/Breadcrumbs.js.map +1 -1
- package/dist/navigation/NavBar.js +6 -6
- package/dist/navigation/NavBar.js.map +1 -1
- package/dist/navigation/NavList.d.ts +1 -0
- package/dist/navigation/NavList.js +20 -12
- package/dist/navigation/NavList.js.map +1 -1
- package/dist/navigation/NavMenu.d.ts +27 -0
- package/dist/navigation/NavMenu.js +54 -0
- package/dist/navigation/NavMenu.js.map +1 -0
- package/dist/navigation/PageJump.js +3 -3
- package/dist/navigation/PageJump.js.map +1 -1
- package/dist/navigation/PageSizeSelect.js +4 -4
- package/dist/navigation/PageSizeSelect.js.map +1 -1
- package/dist/navigation/Pagination.js +6 -6
- package/dist/navigation/Pagination.js.map +1 -1
- package/dist/navigation/PaginationBar.js +5 -5
- package/dist/navigation/PaginationBar.js.map +1 -1
- package/dist/navigation/Steps.js +4 -4
- package/dist/navigation/Steps.js.map +1 -1
- package/dist/navigation/TableOfContents.js +5 -5
- package/dist/navigation/TableOfContents.js.map +1 -1
- package/dist/navigation/Tabs.js +7 -7
- package/dist/navigation/Tabs.js.map +1 -1
- package/dist/navigation/Toolbar.js +3 -3
- package/dist/navigation/Toolbar.js.map +1 -1
- package/dist/overlay/AlertDialog.js +4 -4
- package/dist/overlay/AlertDialog.js.map +1 -1
- package/dist/overlay/CommandPalette.js +4 -4
- package/dist/overlay/CommandPalette.js.map +1 -1
- package/dist/overlay/ContextMenu.js +3 -3
- package/dist/overlay/ContextMenu.js.map +1 -1
- package/dist/overlay/Dialog.js +4 -4
- package/dist/overlay/Dialog.js.map +1 -1
- package/dist/overlay/Drawer.js +5 -5
- package/dist/overlay/Drawer.js.map +1 -1
- package/dist/overlay/HoverCard.js +5 -3
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Lightbox.js +5 -5
- package/dist/overlay/Lightbox.js.map +1 -1
- package/dist/overlay/Menu.js +7 -7
- package/dist/overlay/Menu.js.map +1 -1
- package/dist/overlay/ModalCore.js +9 -9
- package/dist/overlay/ModalCore.js.map +1 -1
- package/dist/overlay/Popconfirm.js +6 -6
- package/dist/overlay/Popconfirm.js.map +1 -1
- package/dist/overlay/Popover.js +5 -3
- package/dist/overlay/Popover.js.map +1 -1
- package/dist/overlay/Tooltip.js +5 -3
- package/dist/overlay/Tooltip.js.map +1 -1
- package/dist/overlay/Tour.js +8 -8
- package/dist/overlay/Tour.js.map +1 -1
- package/dist/overlay/detached.d.ts +2 -0
- package/dist/overlay/detached.js +73 -42
- package/dist/overlay/detached.js.map +1 -1
- package/dist/patterns/ActionBar.js +3 -3
- package/dist/patterns/ActionBar.js.map +1 -1
- package/dist/patterns/AppShell.d.ts +28 -1
- package/dist/patterns/AppShell.js +158 -52
- package/dist/patterns/AppShell.js.map +1 -1
- package/dist/patterns/AuthLayout.d.ts +28 -0
- package/dist/patterns/AuthLayout.js +77 -0
- package/dist/patterns/AuthLayout.js.map +1 -0
- package/dist/patterns/CommentThread.js +9 -9
- package/dist/patterns/CommentThread.js.map +1 -1
- package/dist/patterns/DataImport.js +4 -4
- package/dist/patterns/DataImport.js.map +1 -1
- package/dist/patterns/DeadlineBadge.js +3 -3
- package/dist/patterns/DeadlineBadge.js.map +1 -1
- package/dist/patterns/FilterBar.d.ts +11 -1
- package/dist/patterns/FilterBar.js +39 -10
- package/dist/patterns/FilterBar.js.map +1 -1
- package/dist/patterns/FormDialog.d.ts +18 -0
- package/dist/patterns/FormDialog.js +46 -0
- package/dist/patterns/FormDialog.js.map +1 -0
- package/dist/patterns/KanbanBoard.js +8 -8
- package/dist/patterns/KanbanBoard.js.map +1 -1
- package/dist/patterns/LayoutSwitcher.d.ts +12 -0
- package/dist/patterns/LayoutSwitcher.js +79 -0
- package/dist/patterns/LayoutSwitcher.js.map +1 -0
- package/dist/patterns/NotificationCenter.js +8 -8
- package/dist/patterns/NotificationCenter.js.map +1 -1
- package/dist/patterns/PageTabs.d.ts +12 -7
- package/dist/patterns/PageTabs.js +41 -29
- package/dist/patterns/PageTabs.js.map +1 -1
- package/dist/patterns/QueryTable.d.ts +7 -1
- package/dist/patterns/QueryTable.js +116 -81
- package/dist/patterns/QueryTable.js.map +1 -1
- package/dist/patterns/SlideCaptcha.d.ts +80 -0
- package/dist/patterns/SlideCaptcha.js +354 -0
- package/dist/patterns/SlideCaptcha.js.map +1 -0
- package/dist/patterns/StepsForm.js +7 -7
- package/dist/patterns/StepsForm.js.map +1 -1
- package/dist/patterns/ThemeSwitcher.js +3 -3
- package/dist/patterns/ThemeSwitcher.js.map +1 -1
- package/dist/patterns/index.d.ts +7 -3
- package/dist/patterns/index.js +5 -1
- package/dist/patterns/messages.d.ts +37 -1
- package/dist/patterns/messages.js +38 -2
- package/dist/patterns/messages.js.map +1 -1
- package/dist/table/ColumnHeaderActions.js +3 -3
- package/dist/table/ColumnHeaderActions.js.map +1 -1
- package/dist/table/ColumnResizer.js +3 -3
- package/dist/table/ColumnResizer.js.map +1 -1
- package/dist/table/ColumnSettings.js +5 -5
- package/dist/table/ColumnSettings.js.map +1 -1
- package/dist/table/ColumnTable.js +8 -8
- package/dist/table/ColumnTable.js.map +1 -1
- package/dist/table/DataTable.js +8 -8
- package/dist/table/DataTable.js.map +1 -1
- package/dist/table/DataTableView.js +21 -21
- package/dist/table/DataTableView.js.map +1 -1
- package/dist/table/PivotTable.js +3 -3
- package/dist/table/PivotTable.js.map +1 -1
- package/dist/table/SelectionBar.js +4 -4
- package/dist/table/SelectionBar.js.map +1 -1
- package/dist/table/TreeDataTable.js +5 -5
- package/dist/table/TreeDataTable.js.map +1 -1
- package/dist/theme-customize/ThemeCustomizer.js +7 -6
- package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
- package/dist/theme-customize/ThemeThumbnail.js +3 -3
- package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
- package/dist/three/background/AuroraBackground.js +3 -3
- package/dist/three/background/AuroraBackground.js.map +1 -1
- package/dist/three/background/MeshGradient.js +3 -3
- package/dist/three/background/MeshGradient.js.map +1 -1
- package/dist/three/background/ShaderBackground.js +3 -3
- package/dist/three/background/ShaderBackground.js.map +1 -1
- package/dist/three/core/EffectSurface.js +3 -3
- package/dist/three/core/EffectSurface.js.map +1 -1
- package/dist/three/core/ThreeCanvas.js +4 -4
- package/dist/three/core/ThreeCanvas.js.map +1 -1
- package/dist/three/effects/Confetti.js +3 -3
- package/dist/three/effects/Confetti.js.map +1 -1
- package/dist/three/effects/ParticleField.js +3 -3
- package/dist/three/effects/ParticleField.js.map +1 -1
- package/dist/three/effects/WaveGrid.js +3 -3
- package/dist/three/effects/WaveGrid.js.map +1 -1
- package/dist/three/globe/Globe.js +3 -3
- package/dist/three/globe/Globe.js.map +1 -1
- package/dist/three/model/ModelViewer.js +3 -3
- package/dist/three/model/ModelViewer.js.map +1 -1
- package/dist/utils/data/number.d.ts +5 -0
- package/dist/utils/data/number.js +8 -1
- package/dist/utils/data/number.js.map +1 -1
- package/dist/utils/dom/element.d.ts +3 -1
- package/dist/utils/dom/element.js +8 -4
- package/dist/utils/dom/element.js.map +1 -1
- package/dist/utils/dom/fullscreen.d.ts +1 -1
- package/dist/utils/dom/fullscreen.js +12 -8
- package/dist/utils/dom/fullscreen.js.map +1 -1
- package/dist/utils/dom/mounted.d.ts +7 -0
- package/dist/utils/dom/mounted.js +16 -0
- package/dist/utils/dom/mounted.js.map +1 -0
- package/dist/utils/dom/overflow.js +2 -1
- package/dist/utils/dom/overflow.js.map +1 -1
- package/dist/utils/dom/pan-zoom.js +2 -1
- package/dist/utils/dom/pan-zoom.js.map +1 -1
- package/dist/utils/props.js +3 -13
- package/dist/utils/props.js.map +1 -1
- package/dist/utils/request/http.d.ts +12 -0
- package/dist/utils/request/http.js +6 -2
- package/dist/utils/request/http.js.map +1 -1
- package/dist/utils/request/use-request.js +4 -2
- package/dist/utils/request/use-request.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 页面组合(AppShell、FilterBar、NotificationCenter、KanbanBoard、DeadlineBadge、ThemeSwitcher)自带的文案:
|
|
2
|
+
* 页面组合(AppShell、FilterBar、NotificationCenter、KanbanBoard、DeadlineBadge、ThemeSwitcher、SlideCaptcha)自带的文案:
|
|
3
3
|
* 中文与英文各一份,可以在 createUi 的 lang.messages.patterns 里按字段改写(见 config/lang/messages.ts)
|
|
4
4
|
*/
|
|
5
5
|
import type { MessageTable } from '../config/lang/messages';
|
|
@@ -55,6 +55,8 @@ export interface PatternsMessages {
|
|
|
55
55
|
readonly navigationMenu: string;
|
|
56
56
|
/** 抽屉式侧边导航的宽度调整手柄,默认“调整导航宽度” */
|
|
57
57
|
readonly navigationResize: string;
|
|
58
|
+
/** 上下抽屉的高度手柄的名称,默认“调整导航高度” */
|
|
59
|
+
readonly navigationResizeHeight: string;
|
|
58
60
|
/** AppShell 侧栏底部收起成图标栏的按钮,默认“收起侧栏” */
|
|
59
61
|
readonly sidebarCollapse: string;
|
|
60
62
|
/** AppShell 侧栏收起后展开的按钮,默认“展开侧栏” */
|
|
@@ -143,6 +145,24 @@ export interface PatternsMessages {
|
|
|
143
145
|
readonly dataImportPreview: string;
|
|
144
146
|
/** 主题切换的名称,默认“主题” */
|
|
145
147
|
readonly themeLabel: string;
|
|
148
|
+
/** 布局切换的名称,默认“布局” */
|
|
149
|
+
readonly layoutLabel: string;
|
|
150
|
+
/** 布局切换:侧栏形式一组的标题,默认“侧栏形式” */
|
|
151
|
+
readonly layoutMode: string;
|
|
152
|
+
/** 布局切换:固定侧栏,默认“固定” */
|
|
153
|
+
readonly layoutModeDocked: string;
|
|
154
|
+
/** 布局切换:抽屉式侧栏,默认“抽屉” */
|
|
155
|
+
readonly layoutModeOverlay: string;
|
|
156
|
+
/** 布局切换:抽屉位置一组的标题,默认“抽屉位置” */
|
|
157
|
+
readonly layoutSide: string;
|
|
158
|
+
/** 布局切换:抽屉在起始边,默认“左侧” */
|
|
159
|
+
readonly layoutSideStart: string;
|
|
160
|
+
/** 布局切换:抽屉在结束边,默认“右侧” */
|
|
161
|
+
readonly layoutSideEnd: string;
|
|
162
|
+
/** 布局切换:抽屉在顶部,默认“顶部” */
|
|
163
|
+
readonly layoutSideTop: string;
|
|
164
|
+
/** 布局切换:抽屉在底部,默认“底部” */
|
|
165
|
+
readonly layoutSideBottom: string;
|
|
146
166
|
/** 留言:留言列表的名称,默认“留言” */
|
|
147
167
|
readonly comments: string;
|
|
148
168
|
/** 留言:没有留言时,默认“还没有留言” */
|
|
@@ -169,6 +189,22 @@ export interface PatternsMessages {
|
|
|
169
189
|
readonly commentReplies: (count: number) => string;
|
|
170
190
|
/** 留言:附件列表的名称,默认“附件” */
|
|
171
191
|
readonly commentAttachments: string;
|
|
192
|
+
/** 滑块验证码:滑块条上的提示,默认“向右拖动滑块,让拼图对准缺口” */
|
|
193
|
+
readonly slideHint: string;
|
|
194
|
+
/** 滑块验证码:服务端判定中,默认“验证中…” */
|
|
195
|
+
readonly slideVerifying: string;
|
|
196
|
+
/** 滑块验证码:通过,默认“验证通过” */
|
|
197
|
+
readonly slideSuccess: string;
|
|
198
|
+
/** 滑块验证码:没对准,默认“没对准,请再试一次” */
|
|
199
|
+
readonly slideError: string;
|
|
200
|
+
/** 滑块验证码:换一张的按钮,默认“换一张” */
|
|
201
|
+
readonly slideRefresh: string;
|
|
202
|
+
/** 滑块验证码:图片还没拿到,默认“加载中…” */
|
|
203
|
+
readonly slideLoading: string;
|
|
204
|
+
/** 滑块验证码:滑块的名称,默认“滑动验证” */
|
|
205
|
+
readonly slideLabel: string;
|
|
206
|
+
/** 滑块验证码:滑块当前位置的读法:`(120)` → “120 像素” */
|
|
207
|
+
readonly slidePosition: (pixels: number) => string;
|
|
172
208
|
}
|
|
173
209
|
/** 页面组合的文案表:中文与英文,别的语言先找同语种、再用英文 */
|
|
174
210
|
export declare const patternsMessages: MessageTable<PatternsMessages>;
|
|
@@ -27,6 +27,7 @@ var patternsMessages = {
|
|
|
27
27
|
navigationOpen: "打开导航",
|
|
28
28
|
navigationMenu: "菜单",
|
|
29
29
|
navigationResize: "调整导航宽度",
|
|
30
|
+
navigationResizeHeight: "调整导航高度",
|
|
30
31
|
sidebarCollapse: "收起侧栏",
|
|
31
32
|
sidebarExpand: "展开侧栏",
|
|
32
33
|
pageTabsLabel: "打开的页面",
|
|
@@ -76,6 +77,15 @@ var patternsMessages = {
|
|
|
76
77
|
dataImportNotNumber: "不是数字",
|
|
77
78
|
dataImportPreview: "导入预览",
|
|
78
79
|
themeLabel: "主题",
|
|
80
|
+
layoutLabel: "布局",
|
|
81
|
+
layoutMode: "侧栏形式",
|
|
82
|
+
layoutModeDocked: "固定",
|
|
83
|
+
layoutModeOverlay: "抽屉",
|
|
84
|
+
layoutSide: "抽屉位置",
|
|
85
|
+
layoutSideStart: "左侧",
|
|
86
|
+
layoutSideEnd: "右侧",
|
|
87
|
+
layoutSideTop: "顶部",
|
|
88
|
+
layoutSideBottom: "底部",
|
|
79
89
|
comments: "留言",
|
|
80
90
|
commentsEmpty: "还没有留言",
|
|
81
91
|
commentPlaceholder: "写下留言,输入 @ 提及相关的人",
|
|
@@ -88,7 +98,15 @@ var patternsMessages = {
|
|
|
88
98
|
commentSendFailed: "发送失败,内容已保留,请重试",
|
|
89
99
|
commentEdited: "已编辑",
|
|
90
100
|
commentReplies: (count) => `${count} 条回复`,
|
|
91
|
-
commentAttachments: "附件"
|
|
101
|
+
commentAttachments: "附件",
|
|
102
|
+
slideHint: "向右拖动滑块,让拼图对准缺口",
|
|
103
|
+
slideVerifying: "验证中…",
|
|
104
|
+
slideSuccess: "验证通过",
|
|
105
|
+
slideError: "没对准,请再试一次",
|
|
106
|
+
slideRefresh: "换一张",
|
|
107
|
+
slideLoading: "加载中…",
|
|
108
|
+
slideLabel: "滑动验证",
|
|
109
|
+
slidePosition: (pixels) => `${pixels} 像素`
|
|
92
110
|
},
|
|
93
111
|
"en-US": {
|
|
94
112
|
filterSearch: "Search",
|
|
@@ -116,6 +134,7 @@ var patternsMessages = {
|
|
|
116
134
|
navigationOpen: "Open navigation",
|
|
117
135
|
navigationMenu: "Menu",
|
|
118
136
|
navigationResize: "Resize navigation",
|
|
137
|
+
navigationResizeHeight: "Resize navigation height",
|
|
119
138
|
sidebarCollapse: "Collapse sidebar",
|
|
120
139
|
sidebarExpand: "Expand sidebar",
|
|
121
140
|
pageTabsLabel: "Open pages",
|
|
@@ -165,6 +184,15 @@ var patternsMessages = {
|
|
|
165
184
|
dataImportNotNumber: "Not a number",
|
|
166
185
|
dataImportPreview: "Import preview",
|
|
167
186
|
themeLabel: "Theme",
|
|
187
|
+
layoutLabel: "Layout",
|
|
188
|
+
layoutMode: "Sidebar",
|
|
189
|
+
layoutModeDocked: "Docked",
|
|
190
|
+
layoutModeOverlay: "Drawer",
|
|
191
|
+
layoutSide: "Drawer position",
|
|
192
|
+
layoutSideStart: "Left",
|
|
193
|
+
layoutSideEnd: "Right",
|
|
194
|
+
layoutSideTop: "Top",
|
|
195
|
+
layoutSideBottom: "Bottom",
|
|
168
196
|
comments: "Comments",
|
|
169
197
|
commentsEmpty: "No comments yet",
|
|
170
198
|
commentPlaceholder: "Write a comment, type @ to mention someone",
|
|
@@ -177,7 +205,15 @@ var patternsMessages = {
|
|
|
177
205
|
commentSendFailed: "Could not send. Your text is kept, please try again",
|
|
178
206
|
commentEdited: "Edited",
|
|
179
207
|
commentReplies: (count) => count === 1 ? "1 reply" : `${count} replies`,
|
|
180
|
-
commentAttachments: "Attachments"
|
|
208
|
+
commentAttachments: "Attachments",
|
|
209
|
+
slideHint: "Drag the slider to fit the puzzle piece into the gap",
|
|
210
|
+
slideVerifying: "Verifying…",
|
|
211
|
+
slideSuccess: "Verified",
|
|
212
|
+
slideError: "Not aligned, please try again",
|
|
213
|
+
slideRefresh: "Try another",
|
|
214
|
+
slideLoading: "Loading…",
|
|
215
|
+
slideLabel: "Slide to verify",
|
|
216
|
+
slidePosition: (pixels) => `${pixels} pixels`
|
|
181
217
|
}
|
|
182
218
|
};
|
|
183
219
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","names":[],"sources":["../../src/patterns/messages.ts"],"sourcesContent":["/**\n * 页面组合(AppShell、FilterBar、NotificationCenter、KanbanBoard、DeadlineBadge、ThemeSwitcher)自带的文案:\n * 中文与英文各一份,可以在 createUi 的 lang.messages.patterns 里按字段改写(见 config/lang/messages.ts)\n */\nimport type { MessageTable } from '../config/lang/messages';\n\n/** 页面组合的文案 */\nexport interface PatternsMessages {\n /** 查询栏的查询按钮,默认“查询” */\n readonly filterSearch: string;\n /** 查询栏的重置按钮,默认“重置” */\n readonly filterReset: string;\n /** 查询栏展开更多条件,默认“展开” */\n readonly filterExpand: string;\n /** 查询栏收起更多条件,默认“收起” */\n readonly filterCollapse: string;\n /** 收起的条件里已经填了几项:`(2)` → “已设 2 项” */\n readonly filterActive: (count: number) => string;\n /** 查询栏的高级筛选(按钮、条件构造器的名称、摘要的开头),默认“高级筛选” */\n readonly filterAdvanced: string;\n /** 时限标记:还剩几个工作日,默认“剩 n 个工作日” */\n readonly deadlineRemaining: (workdays: number) => string;\n /** 时限标记:今天到期,默认“今天到期” */\n readonly deadlineDue: string;\n /** 时限标记:超时几个工作日(0 时是周末、假日里刚过期),默认“超时 n 个工作日”“已超时” */\n readonly deadlineOverdue: (workdays: number) => string;\n /** 时限标记:按时完成,默认“按时完成” */\n readonly deadlineDone: string;\n /** 时限标记:超时完成,默认“超时 n 个工作日完成” */\n readonly deadlineDoneLate: (workdays: number) => string;\n /** 时限标记的完整说明(title 与读屏):截止日,默认“截止 2026-10-23” */\n readonly deadlineOn: (date: string) => string;\n /** 通知中心的标题与按钮名称,默认“通知” */\n readonly notifications: string;\n /** 通知中心按钮的名称(带未读数),默认“通知,未读 n 条” */\n readonly notificationsUnread: (count: number) => string;\n /** 通知中心:全部标为已读,默认“全部标为已读” */\n readonly notificationsMarkAllRead: string;\n /** 通知中心:不按类型筛选,默认“全部” */\n readonly notificationsAll: string;\n /** 通知中心:只看未读,默认“只看未读” */\n readonly notificationsUnreadOnly: string;\n /** 通知中心:没有通知,默认“没有通知” */\n readonly notificationsEmpty: string;\n /** 通知中心:一条未读的标记(读屏),默认“未读” */\n readonly notificationUnreadMark: string;\n /** 看板卡片把手的操作说明,默认“按空格拿起,左右方向键换列、上下方向键调整位置,再按空格放下,Esc 取消” */\n readonly kanbanInstructions: string;\n /** 看板:一列没有卡片时,默认“没有” */\n readonly kanbanEmpty: string;\n /** 窄屏时收着侧边导航的抽屉的标题,默认“导航” */\n readonly navigation: string;\n /** 窄屏时打开侧边导航的按钮,默认“打开导航” */\n readonly navigationOpen: string;\n /** 抽屉式侧边导航的开关按钮上的文字,默认“菜单” */\n readonly navigationMenu: string;\n /** 抽屉式侧边导航的宽度调整手柄,默认“调整导航宽度” */\n readonly navigationResize: string;\n /** AppShell 侧栏底部收起成图标栏的按钮,默认“收起侧栏” */\n readonly sidebarCollapse: string;\n /** AppShell 侧栏收起后展开的按钮,默认“展开侧栏” */\n readonly sidebarExpand: string;\n /** 页签区的名称,默认“打开的页面” */\n readonly pageTabsLabel: string;\n /** 页签的右键菜单的名称,默认“页签操作” */\n readonly pageTabsMenu: string;\n /** 页签的右键菜单:关闭这一个,默认“关闭” */\n readonly pageTabsClose: string;\n /** 页签的右键菜单:关闭其他的,默认“关闭其他” */\n readonly pageTabsCloseOthers: string;\n /** 页签的右键菜单:关闭右边的,默认“关闭右侧” */\n readonly pageTabsCloseRight: string;\n /** 查询表格:刷新,默认“刷新” */\n readonly queryTableRefresh: string;\n /** 查询表格:加载失败的提示条上的重试按钮,默认“重试” */\n readonly queryTableRetry: string;\n /** 查询表格:行高菜单,默认“行高” */\n readonly queryTableDensity: string;\n /** 行高:紧凑,默认“紧凑” */\n readonly queryTableDensityCompact: string;\n /** 行高:标准,默认“标准” */\n readonly queryTableDensityStandard: string;\n /** 行高:宽松,默认“宽松” */\n readonly queryTableDensityComfortable: string;\n /** 查询表格:全屏,默认“全屏” */\n readonly queryTableFullscreen: string;\n /** 查询表格:退出全屏,默认“退出全屏” */\n readonly queryTableExitFullscreen: string;\n /** 查询表格分页导航的名称:`('任务台账')` → “任务台账分页” */\n readonly queryTablePagination: (title: string) => string;\n /** 查询表格的查询栏(search 地标)的名称:`('任务台账')` → “任务台账查询” */\n readonly queryTableSearch: (title: string) => string;\n /** 分步表单:上一步,默认“上一步” */\n readonly stepsFormPrevious: string;\n /** 分步表单:下一步,默认“下一步” */\n readonly stepsFormNext: string;\n /** 分步表单:最后一步的提交,默认“提交” */\n readonly stepsFormSubmit: string;\n /** 分步表单这一步内容的名称:`(2, 3)` → “第 2 步,共 3 步” */\n readonly stepsFormStep: (step: number, total: number) => string;\n /** 导入的四步:上传文件、对应列、校验与预览、完成 */\n readonly dataImportSteps: readonly [string, string, string, string];\n /** 导入:支持的格式说明:`('.xlsx, .csv')` → “支持 .xlsx, .csv” */\n readonly dataImportAccept: (accept: string) => string;\n /** 导入:下载模板按钮,默认“下载模板” */\n readonly dataImportTemplate: string;\n /** 导入:选工作表,默认“工作表” */\n readonly dataImportSheet: string;\n /** 导入:读文件失败:`('…')` → “读不了这个文件:…” */\n readonly dataImportParseFailed: (reason: string) => string;\n /** 导入:文件里没有数据行,默认“文件里没有数据行” */\n readonly dataImportEmpty: string;\n /** 导入:对应列表格的列标题“字段” */\n readonly dataImportField: string;\n /** 导入:对应列表格的列标题“文件中的列” */\n readonly dataImportColumn: string;\n /** 导入:对应列表格的列标题“示例” */\n readonly dataImportSample: string;\n /** 导入:不导入这个字段,默认“不导入” */\n readonly dataImportSkip: string;\n /** 导入:必填字段还没对应:`(['零件号'])` → “必填的字段还没对应:零件号” */\n readonly dataImportUnmapped: (labels: readonly string[]) => string;\n /** 导入:校验结果:`(120, 118, 2)` → “共 120 行,可以导入 118 行,2 行有错” */\n readonly dataImportSummary: (total: number, valid: number, invalid: number) => string;\n /** 导入:只看有错的行,默认“只看有错的行” */\n readonly dataImportOnlyErrors: string;\n /** 导入:预览表的“序号”列(第几行数据) */\n readonly dataImportRow: string;\n /** 导入:预览表的“校验”列 */\n readonly dataImportStatus: string;\n /** 导入:没有错的行,默认“可以导入” */\n readonly dataImportValid: string;\n /** 导入:改了格子之后的提示,默认“格子可以直接改,改完重新校验” */\n readonly dataImportEditHint: string;\n /** 导入:确认按钮:`(118)` → “导入 118 行” */\n readonly dataImportSubmit: (count: number) => string;\n /** 导入:完成:`(118)` → “已导入 118 行” */\n readonly dataImportDone: (count: number) => string;\n /** 导入:再导入一份,默认“再导入一份” */\n readonly dataImportAgain: string;\n /** 导入:数字列里不是数字,默认“不是数字” */\n readonly dataImportNotNumber: string;\n /** 导入:所在的预览表的名称,默认“导入预览” */\n readonly dataImportPreview: string;\n /** 主题切换的名称,默认“主题” */\n readonly themeLabel: string;\n /** 留言:留言列表的名称,默认“留言” */\n readonly comments: string;\n /** 留言:没有留言时,默认“还没有留言” */\n readonly commentsEmpty: string;\n /** 留言:输入框的提示,默认“写下留言,输入 @ 提及相关的人” */\n readonly commentPlaceholder: string;\n /** 留言:回复按钮,默认“回复” */\n readonly commentReply: string;\n /** 留言:回复某人时输入框的名称:`('林小满')` → “回复 林小满” */\n readonly commentReplyTo: (name: string) => string;\n /** 留言:发送按钮,默认“发送” */\n readonly commentSend: string;\n /** 留言:取消回复,默认“取消” */\n readonly commentCancel: string;\n /** 留言:添加附件的按钮,默认“附件” */\n readonly commentAttach: string;\n /** 留言:发送的快捷键说明,默认“Ctrl + Enter 发送” */\n readonly commentSendHint: string;\n /** 留言:发送失败,默认“发送失败,内容已保留,请重试” */\n readonly commentSendFailed: string;\n /** 留言:改过的留言的标记,默认“已编辑” */\n readonly commentEdited: string;\n /** 留言:一条留言下面回复列表的名称:`(3)` → “3 条回复” */\n readonly commentReplies: (count: number) => string;\n /** 留言:附件列表的名称,默认“附件” */\n readonly commentAttachments: string;\n}\n\n/** 页面组合的文案表:中文与英文,别的语言先找同语种、再用英文 */\nexport const patternsMessages: MessageTable<PatternsMessages> = {\n 'zh-CN': {\n filterSearch: '查询',\n filterReset: '重置',\n filterExpand: '展开',\n filterCollapse: '收起',\n filterActive: (count) => `已设 ${count} 项`,\n filterAdvanced: '高级筛选',\n deadlineRemaining: (workdays) => `剩 ${workdays} 个工作日`,\n deadlineDue: '今天到期',\n deadlineOverdue: (workdays) => (workdays > 0 ? `超时 ${workdays} 个工作日` : '已超时'),\n deadlineDone: '按时完成',\n deadlineDoneLate: (workdays) => `超时 ${workdays} 个工作日完成`,\n deadlineOn: (date) => `截止 ${date}`,\n notifications: '通知',\n notificationsUnread: (count) => (count > 0 ? `通知,未读 ${count} 条` : '通知'),\n notificationsMarkAllRead: '全部标为已读',\n notificationsAll: '全部',\n notificationsUnreadOnly: '只看未读',\n notificationsEmpty: '没有通知',\n notificationUnreadMark: '未读',\n kanbanInstructions: '按空格拿起,左右方向键换列、上下方向键调整位置,再按空格放下,Esc 取消',\n kanbanEmpty: '没有',\n navigation: '导航',\n navigationOpen: '打开导航',\n navigationMenu: '菜单',\n navigationResize: '调整导航宽度',\n sidebarCollapse: '收起侧栏',\n sidebarExpand: '展开侧栏',\n pageTabsLabel: '打开的页面',\n pageTabsMenu: '页签操作',\n pageTabsClose: '关闭',\n pageTabsCloseOthers: '关闭其他',\n pageTabsCloseRight: '关闭右侧',\n queryTableRefresh: '刷新',\n queryTableRetry: '重试',\n queryTableDensity: '行高',\n queryTableDensityCompact: '紧凑',\n queryTableDensityStandard: '标准',\n queryTableDensityComfortable: '宽松',\n queryTableFullscreen: '全屏',\n queryTableExitFullscreen: '退出全屏',\n queryTablePagination: (title) => `${title}分页`,\n queryTableSearch: (title) => `${title}查询`,\n stepsFormPrevious: '上一步',\n stepsFormNext: '下一步',\n stepsFormSubmit: '提交',\n stepsFormStep: (step, total) => `第 ${step} 步,共 ${total} 步`,\n dataImportSteps: ['上传文件', '对应列', '校验与预览', '完成'],\n dataImportAccept: (accept) => `支持 ${accept}`,\n dataImportTemplate: '下载模板',\n dataImportSheet: '工作表',\n dataImportParseFailed: (reason) => `读不了这个文件:${reason}`,\n dataImportEmpty: '文件里没有数据行',\n dataImportField: '字段',\n dataImportColumn: '文件中的列',\n dataImportSample: '示例',\n dataImportSkip: '不导入',\n dataImportUnmapped: (labels) => `必填的字段还没对应:${labels.join('、')}`,\n dataImportSummary: (total, valid, invalid) =>\n `共 ${total} 行,可以导入 ${valid} 行${invalid ? `,${invalid} 行有错` : ''}`,\n dataImportOnlyErrors: '只看有错的行',\n dataImportRow: '序号',\n dataImportStatus: '校验',\n dataImportValid: '可以导入',\n dataImportEditHint: '有错的格子可以直接改,改完重新校验',\n dataImportSubmit: (count) => `导入 ${count} 行`,\n dataImportDone: (count) => `已导入 ${count} 行`,\n dataImportAgain: '再导入一份',\n dataImportNotNumber: '不是数字',\n dataImportPreview: '导入预览',\n themeLabel: '主题',\n comments: '留言',\n commentsEmpty: '还没有留言',\n commentPlaceholder: '写下留言,输入 @ 提及相关的人',\n commentReply: '回复',\n commentReplyTo: (name) => `回复 ${name}`,\n commentSend: '发送',\n commentCancel: '取消',\n commentAttach: '附件',\n commentSendHint: 'Ctrl + Enter 发送',\n commentSendFailed: '发送失败,内容已保留,请重试',\n commentEdited: '已编辑',\n commentReplies: (count) => `${count} 条回复`,\n commentAttachments: '附件',\n },\n 'en-US': {\n filterSearch: 'Search',\n filterReset: 'Reset',\n filterExpand: 'More filters',\n filterCollapse: 'Fewer filters',\n filterActive: (count) => `${count} set`,\n filterAdvanced: 'Advanced filter',\n deadlineRemaining: (workdays) => `${workdays} ${workdays === 1 ? 'workday' : 'workdays'} left`,\n deadlineDue: 'Due today',\n deadlineOverdue: (workdays) =>\n workdays > 0 ? `${workdays} ${workdays === 1 ? 'workday' : 'workdays'} overdue` : 'Overdue',\n deadlineDone: 'Done on time',\n deadlineDoneLate: (workdays) =>\n `Done ${workdays} ${workdays === 1 ? 'workday' : 'workdays'} late`,\n deadlineOn: (date) => `Due ${date}`,\n notifications: 'Notifications',\n notificationsUnread: (count) =>\n count > 0 ? `Notifications, ${count} unread` : 'Notifications',\n notificationsMarkAllRead: 'Mark all as read',\n notificationsAll: 'All',\n notificationsUnreadOnly: 'Unread only',\n notificationsEmpty: 'No notifications',\n notificationUnreadMark: 'Unread',\n kanbanInstructions:\n 'Press space to pick up, use the left and right arrow keys to change column and the up and down arrow keys to change position, press space again to drop, Escape to cancel',\n kanbanEmpty: 'None',\n navigation: 'Navigation',\n navigationOpen: 'Open navigation',\n navigationMenu: 'Menu',\n navigationResize: 'Resize navigation',\n sidebarCollapse: 'Collapse sidebar',\n sidebarExpand: 'Expand sidebar',\n pageTabsLabel: 'Open pages',\n pageTabsMenu: 'Tab actions',\n pageTabsClose: 'Close',\n pageTabsCloseOthers: 'Close others',\n pageTabsCloseRight: 'Close tabs to the right',\n queryTableRefresh: 'Refresh',\n queryTableRetry: 'Retry',\n queryTableDensity: 'Row height',\n queryTableDensityCompact: 'Compact',\n queryTableDensityStandard: 'Standard',\n queryTableDensityComfortable: 'Comfortable',\n queryTableFullscreen: 'Full screen',\n queryTableExitFullscreen: 'Exit full screen',\n queryTablePagination: (title) => `${title} pagination`,\n queryTableSearch: (title) => `Search ${title}`,\n stepsFormPrevious: 'Previous',\n stepsFormNext: 'Next',\n stepsFormSubmit: 'Submit',\n stepsFormStep: (step, total) => `Step ${step} of ${total}`,\n dataImportSteps: ['Upload', 'Map columns', 'Review', 'Done'],\n dataImportAccept: (accept) => `Supports ${accept}`,\n dataImportTemplate: 'Download template',\n dataImportSheet: 'Sheet',\n dataImportParseFailed: (reason) => `Can't read this file: ${reason}`,\n dataImportEmpty: 'The file has no data rows',\n dataImportField: 'Field',\n dataImportColumn: 'Column in file',\n dataImportSample: 'Sample',\n dataImportSkip: \"Don't import\",\n dataImportUnmapped: (labels) => `Required fields not mapped: ${labels.join(', ')}`,\n dataImportSummary: (total, valid, invalid) =>\n `${total} rows, ${valid} ready to import${invalid ? `, ${invalid} with problems` : ''}`,\n dataImportOnlyErrors: 'Only rows with problems',\n dataImportRow: '#',\n dataImportStatus: 'Check',\n dataImportValid: 'Ready',\n dataImportEditHint: 'Fix cells in place; they are checked again',\n dataImportSubmit: (count) => `Import ${count} rows`,\n dataImportDone: (count) => `Imported ${count} rows`,\n dataImportAgain: 'Import another file',\n dataImportNotNumber: 'Not a number',\n dataImportPreview: 'Import preview',\n themeLabel: 'Theme',\n comments: 'Comments',\n commentsEmpty: 'No comments yet',\n commentPlaceholder: 'Write a comment, type @ to mention someone',\n commentReply: 'Reply',\n commentReplyTo: (name) => `Reply to ${name}`,\n commentSend: 'Send',\n commentCancel: 'Cancel',\n commentAttach: 'Attach',\n commentSendHint: 'Ctrl + Enter to send',\n commentSendFailed: 'Could not send. Your text is kept, please try again',\n commentEdited: 'Edited',\n commentReplies: (count) => (count === 1 ? '1 reply' : `${count} replies`),\n commentAttachments: 'Attachments',\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"messages.js","names":[],"sources":["../../src/patterns/messages.ts"],"sourcesContent":["/**\n * 页面组合(AppShell、FilterBar、NotificationCenter、KanbanBoard、DeadlineBadge、ThemeSwitcher、SlideCaptcha)自带的文案:\n * 中文与英文各一份,可以在 createUi 的 lang.messages.patterns 里按字段改写(见 config/lang/messages.ts)\n */\nimport type { MessageTable } from '../config/lang/messages';\n\n/** 页面组合的文案 */\nexport interface PatternsMessages {\n /** 查询栏的查询按钮,默认“查询” */\n readonly filterSearch: string;\n /** 查询栏的重置按钮,默认“重置” */\n readonly filterReset: string;\n /** 查询栏展开更多条件,默认“展开” */\n readonly filterExpand: string;\n /** 查询栏收起更多条件,默认“收起” */\n readonly filterCollapse: string;\n /** 收起的条件里已经填了几项:`(2)` → “已设 2 项” */\n readonly filterActive: (count: number) => string;\n /** 查询栏的高级筛选(按钮、条件构造器的名称、摘要的开头),默认“高级筛选” */\n readonly filterAdvanced: string;\n /** 时限标记:还剩几个工作日,默认“剩 n 个工作日” */\n readonly deadlineRemaining: (workdays: number) => string;\n /** 时限标记:今天到期,默认“今天到期” */\n readonly deadlineDue: string;\n /** 时限标记:超时几个工作日(0 时是周末、假日里刚过期),默认“超时 n 个工作日”“已超时” */\n readonly deadlineOverdue: (workdays: number) => string;\n /** 时限标记:按时完成,默认“按时完成” */\n readonly deadlineDone: string;\n /** 时限标记:超时完成,默认“超时 n 个工作日完成” */\n readonly deadlineDoneLate: (workdays: number) => string;\n /** 时限标记的完整说明(title 与读屏):截止日,默认“截止 2026-10-23” */\n readonly deadlineOn: (date: string) => string;\n /** 通知中心的标题与按钮名称,默认“通知” */\n readonly notifications: string;\n /** 通知中心按钮的名称(带未读数),默认“通知,未读 n 条” */\n readonly notificationsUnread: (count: number) => string;\n /** 通知中心:全部标为已读,默认“全部标为已读” */\n readonly notificationsMarkAllRead: string;\n /** 通知中心:不按类型筛选,默认“全部” */\n readonly notificationsAll: string;\n /** 通知中心:只看未读,默认“只看未读” */\n readonly notificationsUnreadOnly: string;\n /** 通知中心:没有通知,默认“没有通知” */\n readonly notificationsEmpty: string;\n /** 通知中心:一条未读的标记(读屏),默认“未读” */\n readonly notificationUnreadMark: string;\n /** 看板卡片把手的操作说明,默认“按空格拿起,左右方向键换列、上下方向键调整位置,再按空格放下,Esc 取消” */\n readonly kanbanInstructions: string;\n /** 看板:一列没有卡片时,默认“没有” */\n readonly kanbanEmpty: string;\n /** 窄屏时收着侧边导航的抽屉的标题,默认“导航” */\n readonly navigation: string;\n /** 窄屏时打开侧边导航的按钮,默认“打开导航” */\n readonly navigationOpen: string;\n /** 抽屉式侧边导航的开关按钮上的文字,默认“菜单” */\n readonly navigationMenu: string;\n /** 抽屉式侧边导航的宽度调整手柄,默认“调整导航宽度” */\n readonly navigationResize: string;\n /** 上下抽屉的高度手柄的名称,默认“调整导航高度” */\n readonly navigationResizeHeight: string;\n /** AppShell 侧栏底部收起成图标栏的按钮,默认“收起侧栏” */\n readonly sidebarCollapse: string;\n /** AppShell 侧栏收起后展开的按钮,默认“展开侧栏” */\n readonly sidebarExpand: string;\n /** 页签区的名称,默认“打开的页面” */\n readonly pageTabsLabel: string;\n /** 页签的右键菜单的名称,默认“页签操作” */\n readonly pageTabsMenu: string;\n /** 页签的右键菜单:关闭这一个,默认“关闭” */\n readonly pageTabsClose: string;\n /** 页签的右键菜单:关闭其他的,默认“关闭其他” */\n readonly pageTabsCloseOthers: string;\n /** 页签的右键菜单:关闭右边的,默认“关闭右侧” */\n readonly pageTabsCloseRight: string;\n /** 查询表格:刷新,默认“刷新” */\n readonly queryTableRefresh: string;\n /** 查询表格:加载失败的提示条上的重试按钮,默认“重试” */\n readonly queryTableRetry: string;\n /** 查询表格:行高菜单,默认“行高” */\n readonly queryTableDensity: string;\n /** 行高:紧凑,默认“紧凑” */\n readonly queryTableDensityCompact: string;\n /** 行高:标准,默认“标准” */\n readonly queryTableDensityStandard: string;\n /** 行高:宽松,默认“宽松” */\n readonly queryTableDensityComfortable: string;\n /** 查询表格:全屏,默认“全屏” */\n readonly queryTableFullscreen: string;\n /** 查询表格:退出全屏,默认“退出全屏” */\n readonly queryTableExitFullscreen: string;\n /** 查询表格分页导航的名称:`('任务台账')` → “任务台账分页” */\n readonly queryTablePagination: (title: string) => string;\n /** 查询表格的查询栏(search 地标)的名称:`('任务台账')` → “任务台账查询” */\n readonly queryTableSearch: (title: string) => string;\n /** 分步表单:上一步,默认“上一步” */\n readonly stepsFormPrevious: string;\n /** 分步表单:下一步,默认“下一步” */\n readonly stepsFormNext: string;\n /** 分步表单:最后一步的提交,默认“提交” */\n readonly stepsFormSubmit: string;\n /** 分步表单这一步内容的名称:`(2, 3)` → “第 2 步,共 3 步” */\n readonly stepsFormStep: (step: number, total: number) => string;\n /** 导入的四步:上传文件、对应列、校验与预览、完成 */\n readonly dataImportSteps: readonly [string, string, string, string];\n /** 导入:支持的格式说明:`('.xlsx, .csv')` → “支持 .xlsx, .csv” */\n readonly dataImportAccept: (accept: string) => string;\n /** 导入:下载模板按钮,默认“下载模板” */\n readonly dataImportTemplate: string;\n /** 导入:选工作表,默认“工作表” */\n readonly dataImportSheet: string;\n /** 导入:读文件失败:`('…')` → “读不了这个文件:…” */\n readonly dataImportParseFailed: (reason: string) => string;\n /** 导入:文件里没有数据行,默认“文件里没有数据行” */\n readonly dataImportEmpty: string;\n /** 导入:对应列表格的列标题“字段” */\n readonly dataImportField: string;\n /** 导入:对应列表格的列标题“文件中的列” */\n readonly dataImportColumn: string;\n /** 导入:对应列表格的列标题“示例” */\n readonly dataImportSample: string;\n /** 导入:不导入这个字段,默认“不导入” */\n readonly dataImportSkip: string;\n /** 导入:必填字段还没对应:`(['零件号'])` → “必填的字段还没对应:零件号” */\n readonly dataImportUnmapped: (labels: readonly string[]) => string;\n /** 导入:校验结果:`(120, 118, 2)` → “共 120 行,可以导入 118 行,2 行有错” */\n readonly dataImportSummary: (total: number, valid: number, invalid: number) => string;\n /** 导入:只看有错的行,默认“只看有错的行” */\n readonly dataImportOnlyErrors: string;\n /** 导入:预览表的“序号”列(第几行数据) */\n readonly dataImportRow: string;\n /** 导入:预览表的“校验”列 */\n readonly dataImportStatus: string;\n /** 导入:没有错的行,默认“可以导入” */\n readonly dataImportValid: string;\n /** 导入:改了格子之后的提示,默认“格子可以直接改,改完重新校验” */\n readonly dataImportEditHint: string;\n /** 导入:确认按钮:`(118)` → “导入 118 行” */\n readonly dataImportSubmit: (count: number) => string;\n /** 导入:完成:`(118)` → “已导入 118 行” */\n readonly dataImportDone: (count: number) => string;\n /** 导入:再导入一份,默认“再导入一份” */\n readonly dataImportAgain: string;\n /** 导入:数字列里不是数字,默认“不是数字” */\n readonly dataImportNotNumber: string;\n /** 导入:所在的预览表的名称,默认“导入预览” */\n readonly dataImportPreview: string;\n /** 主题切换的名称,默认“主题” */\n readonly themeLabel: string;\n /** 布局切换的名称,默认“布局” */\n readonly layoutLabel: string;\n /** 布局切换:侧栏形式一组的标题,默认“侧栏形式” */\n readonly layoutMode: string;\n /** 布局切换:固定侧栏,默认“固定” */\n readonly layoutModeDocked: string;\n /** 布局切换:抽屉式侧栏,默认“抽屉” */\n readonly layoutModeOverlay: string;\n /** 布局切换:抽屉位置一组的标题,默认“抽屉位置” */\n readonly layoutSide: string;\n /** 布局切换:抽屉在起始边,默认“左侧” */\n readonly layoutSideStart: string;\n /** 布局切换:抽屉在结束边,默认“右侧” */\n readonly layoutSideEnd: string;\n /** 布局切换:抽屉在顶部,默认“顶部” */\n readonly layoutSideTop: string;\n /** 布局切换:抽屉在底部,默认“底部” */\n readonly layoutSideBottom: string;\n /** 留言:留言列表的名称,默认“留言” */\n readonly comments: string;\n /** 留言:没有留言时,默认“还没有留言” */\n readonly commentsEmpty: string;\n /** 留言:输入框的提示,默认“写下留言,输入 @ 提及相关的人” */\n readonly commentPlaceholder: string;\n /** 留言:回复按钮,默认“回复” */\n readonly commentReply: string;\n /** 留言:回复某人时输入框的名称:`('林小满')` → “回复 林小满” */\n readonly commentReplyTo: (name: string) => string;\n /** 留言:发送按钮,默认“发送” */\n readonly commentSend: string;\n /** 留言:取消回复,默认“取消” */\n readonly commentCancel: string;\n /** 留言:添加附件的按钮,默认“附件” */\n readonly commentAttach: string;\n /** 留言:发送的快捷键说明,默认“Ctrl + Enter 发送” */\n readonly commentSendHint: string;\n /** 留言:发送失败,默认“发送失败,内容已保留,请重试” */\n readonly commentSendFailed: string;\n /** 留言:改过的留言的标记,默认“已编辑” */\n readonly commentEdited: string;\n /** 留言:一条留言下面回复列表的名称:`(3)` → “3 条回复” */\n readonly commentReplies: (count: number) => string;\n /** 留言:附件列表的名称,默认“附件” */\n readonly commentAttachments: string;\n /** 滑块验证码:滑块条上的提示,默认“向右拖动滑块,让拼图对准缺口” */\n readonly slideHint: string;\n /** 滑块验证码:服务端判定中,默认“验证中…” */\n readonly slideVerifying: string;\n /** 滑块验证码:通过,默认“验证通过” */\n readonly slideSuccess: string;\n /** 滑块验证码:没对准,默认“没对准,请再试一次” */\n readonly slideError: string;\n /** 滑块验证码:换一张的按钮,默认“换一张” */\n readonly slideRefresh: string;\n /** 滑块验证码:图片还没拿到,默认“加载中…” */\n readonly slideLoading: string;\n /** 滑块验证码:滑块的名称,默认“滑动验证” */\n readonly slideLabel: string;\n /** 滑块验证码:滑块当前位置的读法:`(120)` → “120 像素” */\n readonly slidePosition: (pixels: number) => string;\n}\n\n/** 页面组合的文案表:中文与英文,别的语言先找同语种、再用英文 */\nexport const patternsMessages: MessageTable<PatternsMessages> = {\n 'zh-CN': {\n filterSearch: '查询',\n filterReset: '重置',\n filterExpand: '展开',\n filterCollapse: '收起',\n filterActive: (count) => `已设 ${count} 项`,\n filterAdvanced: '高级筛选',\n deadlineRemaining: (workdays) => `剩 ${workdays} 个工作日`,\n deadlineDue: '今天到期',\n deadlineOverdue: (workdays) => (workdays > 0 ? `超时 ${workdays} 个工作日` : '已超时'),\n deadlineDone: '按时完成',\n deadlineDoneLate: (workdays) => `超时 ${workdays} 个工作日完成`,\n deadlineOn: (date) => `截止 ${date}`,\n notifications: '通知',\n notificationsUnread: (count) => (count > 0 ? `通知,未读 ${count} 条` : '通知'),\n notificationsMarkAllRead: '全部标为已读',\n notificationsAll: '全部',\n notificationsUnreadOnly: '只看未读',\n notificationsEmpty: '没有通知',\n notificationUnreadMark: '未读',\n kanbanInstructions: '按空格拿起,左右方向键换列、上下方向键调整位置,再按空格放下,Esc 取消',\n kanbanEmpty: '没有',\n navigation: '导航',\n navigationOpen: '打开导航',\n navigationMenu: '菜单',\n navigationResize: '调整导航宽度',\n navigationResizeHeight: '调整导航高度',\n sidebarCollapse: '收起侧栏',\n sidebarExpand: '展开侧栏',\n pageTabsLabel: '打开的页面',\n pageTabsMenu: '页签操作',\n pageTabsClose: '关闭',\n pageTabsCloseOthers: '关闭其他',\n pageTabsCloseRight: '关闭右侧',\n queryTableRefresh: '刷新',\n queryTableRetry: '重试',\n queryTableDensity: '行高',\n queryTableDensityCompact: '紧凑',\n queryTableDensityStandard: '标准',\n queryTableDensityComfortable: '宽松',\n queryTableFullscreen: '全屏',\n queryTableExitFullscreen: '退出全屏',\n queryTablePagination: (title) => `${title}分页`,\n queryTableSearch: (title) => `${title}查询`,\n stepsFormPrevious: '上一步',\n stepsFormNext: '下一步',\n stepsFormSubmit: '提交',\n stepsFormStep: (step, total) => `第 ${step} 步,共 ${total} 步`,\n dataImportSteps: ['上传文件', '对应列', '校验与预览', '完成'],\n dataImportAccept: (accept) => `支持 ${accept}`,\n dataImportTemplate: '下载模板',\n dataImportSheet: '工作表',\n dataImportParseFailed: (reason) => `读不了这个文件:${reason}`,\n dataImportEmpty: '文件里没有数据行',\n dataImportField: '字段',\n dataImportColumn: '文件中的列',\n dataImportSample: '示例',\n dataImportSkip: '不导入',\n dataImportUnmapped: (labels) => `必填的字段还没对应:${labels.join('、')}`,\n dataImportSummary: (total, valid, invalid) =>\n `共 ${total} 行,可以导入 ${valid} 行${invalid ? `,${invalid} 行有错` : ''}`,\n dataImportOnlyErrors: '只看有错的行',\n dataImportRow: '序号',\n dataImportStatus: '校验',\n dataImportValid: '可以导入',\n dataImportEditHint: '有错的格子可以直接改,改完重新校验',\n dataImportSubmit: (count) => `导入 ${count} 行`,\n dataImportDone: (count) => `已导入 ${count} 行`,\n dataImportAgain: '再导入一份',\n dataImportNotNumber: '不是数字',\n dataImportPreview: '导入预览',\n themeLabel: '主题',\n layoutLabel: '布局',\n layoutMode: '侧栏形式',\n layoutModeDocked: '固定',\n layoutModeOverlay: '抽屉',\n layoutSide: '抽屉位置',\n layoutSideStart: '左侧',\n layoutSideEnd: '右侧',\n layoutSideTop: '顶部',\n layoutSideBottom: '底部',\n comments: '留言',\n commentsEmpty: '还没有留言',\n commentPlaceholder: '写下留言,输入 @ 提及相关的人',\n commentReply: '回复',\n commentReplyTo: (name) => `回复 ${name}`,\n commentSend: '发送',\n commentCancel: '取消',\n commentAttach: '附件',\n commentSendHint: 'Ctrl + Enter 发送',\n commentSendFailed: '发送失败,内容已保留,请重试',\n commentEdited: '已编辑',\n commentReplies: (count) => `${count} 条回复`,\n commentAttachments: '附件',\n slideHint: '向右拖动滑块,让拼图对准缺口',\n slideVerifying: '验证中…',\n slideSuccess: '验证通过',\n slideError: '没对准,请再试一次',\n slideRefresh: '换一张',\n slideLoading: '加载中…',\n slideLabel: '滑动验证',\n slidePosition: (pixels) => `${pixels} 像素`,\n },\n 'en-US': {\n filterSearch: 'Search',\n filterReset: 'Reset',\n filterExpand: 'More filters',\n filterCollapse: 'Fewer filters',\n filterActive: (count) => `${count} set`,\n filterAdvanced: 'Advanced filter',\n deadlineRemaining: (workdays) => `${workdays} ${workdays === 1 ? 'workday' : 'workdays'} left`,\n deadlineDue: 'Due today',\n deadlineOverdue: (workdays) =>\n workdays > 0 ? `${workdays} ${workdays === 1 ? 'workday' : 'workdays'} overdue` : 'Overdue',\n deadlineDone: 'Done on time',\n deadlineDoneLate: (workdays) =>\n `Done ${workdays} ${workdays === 1 ? 'workday' : 'workdays'} late`,\n deadlineOn: (date) => `Due ${date}`,\n notifications: 'Notifications',\n notificationsUnread: (count) =>\n count > 0 ? `Notifications, ${count} unread` : 'Notifications',\n notificationsMarkAllRead: 'Mark all as read',\n notificationsAll: 'All',\n notificationsUnreadOnly: 'Unread only',\n notificationsEmpty: 'No notifications',\n notificationUnreadMark: 'Unread',\n kanbanInstructions:\n 'Press space to pick up, use the left and right arrow keys to change column and the up and down arrow keys to change position, press space again to drop, Escape to cancel',\n kanbanEmpty: 'None',\n navigation: 'Navigation',\n navigationOpen: 'Open navigation',\n navigationMenu: 'Menu',\n navigationResize: 'Resize navigation',\n navigationResizeHeight: 'Resize navigation height',\n sidebarCollapse: 'Collapse sidebar',\n sidebarExpand: 'Expand sidebar',\n pageTabsLabel: 'Open pages',\n pageTabsMenu: 'Tab actions',\n pageTabsClose: 'Close',\n pageTabsCloseOthers: 'Close others',\n pageTabsCloseRight: 'Close tabs to the right',\n queryTableRefresh: 'Refresh',\n queryTableRetry: 'Retry',\n queryTableDensity: 'Row height',\n queryTableDensityCompact: 'Compact',\n queryTableDensityStandard: 'Standard',\n queryTableDensityComfortable: 'Comfortable',\n queryTableFullscreen: 'Full screen',\n queryTableExitFullscreen: 'Exit full screen',\n queryTablePagination: (title) => `${title} pagination`,\n queryTableSearch: (title) => `Search ${title}`,\n stepsFormPrevious: 'Previous',\n stepsFormNext: 'Next',\n stepsFormSubmit: 'Submit',\n stepsFormStep: (step, total) => `Step ${step} of ${total}`,\n dataImportSteps: ['Upload', 'Map columns', 'Review', 'Done'],\n dataImportAccept: (accept) => `Supports ${accept}`,\n dataImportTemplate: 'Download template',\n dataImportSheet: 'Sheet',\n dataImportParseFailed: (reason) => `Can't read this file: ${reason}`,\n dataImportEmpty: 'The file has no data rows',\n dataImportField: 'Field',\n dataImportColumn: 'Column in file',\n dataImportSample: 'Sample',\n dataImportSkip: \"Don't import\",\n dataImportUnmapped: (labels) => `Required fields not mapped: ${labels.join(', ')}`,\n dataImportSummary: (total, valid, invalid) =>\n `${total} rows, ${valid} ready to import${invalid ? `, ${invalid} with problems` : ''}`,\n dataImportOnlyErrors: 'Only rows with problems',\n dataImportRow: '#',\n dataImportStatus: 'Check',\n dataImportValid: 'Ready',\n dataImportEditHint: 'Fix cells in place; they are checked again',\n dataImportSubmit: (count) => `Import ${count} rows`,\n dataImportDone: (count) => `Imported ${count} rows`,\n dataImportAgain: 'Import another file',\n dataImportNotNumber: 'Not a number',\n dataImportPreview: 'Import preview',\n themeLabel: 'Theme',\n layoutLabel: 'Layout',\n layoutMode: 'Sidebar',\n layoutModeDocked: 'Docked',\n layoutModeOverlay: 'Drawer',\n layoutSide: 'Drawer position',\n layoutSideStart: 'Left',\n layoutSideEnd: 'Right',\n layoutSideTop: 'Top',\n layoutSideBottom: 'Bottom',\n comments: 'Comments',\n commentsEmpty: 'No comments yet',\n commentPlaceholder: 'Write a comment, type @ to mention someone',\n commentReply: 'Reply',\n commentReplyTo: (name) => `Reply to ${name}`,\n commentSend: 'Send',\n commentCancel: 'Cancel',\n commentAttach: 'Attach',\n commentSendHint: 'Ctrl + Enter to send',\n commentSendFailed: 'Could not send. Your text is kept, please try again',\n commentEdited: 'Edited',\n commentReplies: (count) => (count === 1 ? '1 reply' : `${count} replies`),\n commentAttachments: 'Attachments',\n slideHint: 'Drag the slider to fit the puzzle piece into the gap',\n slideVerifying: 'Verifying…',\n slideSuccess: 'Verified',\n slideError: 'Not aligned, please try again',\n slideRefresh: 'Try another',\n slideLoading: 'Loading…',\n slideLabel: 'Slide to verify',\n slidePosition: (pixels) => `${pixels} pixels`,\n },\n};\n"],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@ import { Checkbox } from "../input/Checkbox.js";
|
|
|
8
8
|
import { Menu as Menu$1, MenuItem } from "../overlay/Menu.js";
|
|
9
9
|
import { Popover } from "../overlay/Popover.js";
|
|
10
10
|
import { TextField } from "../input/TextField.js";
|
|
11
|
-
import { Fragment, createVNode,
|
|
12
|
-
import { _component, readonlyProp } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
11
|
+
import { Fragment, createVNode, ref } from "vue";
|
|
12
|
+
import { _component, mergeJsxProps, readonlyProp } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
13
13
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
14
14
|
import { EllipsisVertical, Funnel } from "@lucide/icons";
|
|
15
15
|
//#region src/table/ColumnHeaderActions.tsx
|
|
@@ -83,7 +83,7 @@ var ColumnFilterButton = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
83
83
|
"placeholder": lang.tableFilterSearch,
|
|
84
84
|
"clearable": true,
|
|
85
85
|
"size": "sm"
|
|
86
|
-
}, null), createVNode("div",
|
|
86
|
+
}, null), createVNode("div", mergeJsxProps(css.attrs(columnHeaderActionStyles.options), {
|
|
87
87
|
"role": "group",
|
|
88
88
|
"aria-label": label.value
|
|
89
89
|
}), [shown().map((option) => createVNode(Checkbox, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnHeaderActions.js","names":["_vtp_readonlyProp","_vue_ref","_createVNode","_Fragment","_mergeProps","Menu"],"sources":["../../src/table/ColumnHeaderActions.tsx"],"sourcesContent":["/**\n * 列标题上的两个小按钮:表头筛选(ColumnFilterButton,弹出勾选的值或关键字)与列菜单(ColumnMenuButton:排序、固定、移动、隐藏)。\n * DataTableView 在列定义写了 filter、或表格开了 columnMenu 时放进列标题;状态都在外层(DataTable),这里只管画与报告。\n */\nimport { EllipsisVertical, Funnel } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { Button } from '../base/Button';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang, useTextMatcher } from '../config/context';\nimport { Checkbox } from '../input/Checkbox';\nimport { TextField } from '../input/TextField';\nimport { Separator } from '../layout/Separator';\nimport { Menu, MenuItem } from '../overlay/Menu';\nimport { Popover } from '../overlay/Popover';\nimport { plainText } from '../utils/data/text';\nimport { mergePartProps } from '../utils/props';\nimport type { ColumnFilterOption, ColumnStickies, SortState } from './columns';\n\n/** 选项多于这么多时,筛选里多一个搜索框 */\nconst SEARCH_THRESHOLD = 8;\n\n/** ColumnHeaderActions 的样式:trigger、active、panel、options、footer */\nexport const columnHeaderActionStyles = css.create({\n // 比正文小一档,不撑高表头\n trigger: { flexShrink: 0, marginBlock: '-0.25em' },\n active: { color: '_accentText' },\n panel: { display: 'flex', flexDirection: 'column', gap: '_sm', minWidth: '12rem' },\n options: {\n display: 'flex',\n flexDirection: 'column',\n gap: '_xs',\n maxHeight: '16rem',\n overflowY: 'auto',\n fontWeight: '_normal',\n color: '_text',\n },\n footer: { display: 'flex', justifyContent: 'flex-end' },\n});\n\n/** 表头筛选按钮的属性 */\nexport interface ColumnFilterButtonProps {\n /** 列标题的文字:按钮的名称 */\n label: string;\n /** 可以勾选的值;关键字筛选时为 'text' */\n options: readonly ColumnFilterOption[] | 'text';\n /** 选中的值(关键字筛选时是 [关键字]) */\n values: readonly string[];\n /** 改了筛选 */\n onChange: (values: string[]) => void;\n /** 按钮的部件属性 */\n propsTrigger?: Partial<IconButtonProps>;\n}\n\n/** 表头筛选:漏斗按钮,弹出勾选的值(多时可以搜索)或关键字输入框;改了立即生效 */\nexport const ColumnFilterButton = _component(\n ({ label, options, values, onChange, propsTrigger }: ColumnFilterButtonProps) => {\n const lang = useLang();\n const matcher = useTextMatcher();\n let search = _state('');\n\n const shown = () => {\n if (options === 'text' || !search) return options === 'text' ? [] : options;\n const match = matcher();\n return options.filter((option) => match(plainText(option.label) ?? option.value, search));\n };\n\n function toggle(value: string, checked: boolean) {\n onChange(checked ? [...values, value] : values.filter((item) => item !== value));\n }\n\n function renderOptions(): VNodeChild {\n if (options === 'text')\n return (\n <TextField\n _value={values[0] ?? ''}\n onUpdate:_value={(text: string) => onChange(text ? [text] : [])}\n aria-label={lang.tableFilterSearch}\n placeholder={lang.tableFilterSearch}\n clearable\n autofocus\n size=\"sm\"\n />\n );\n return (\n <>\n {options.length > SEARCH_THRESHOLD && (\n <TextField\n _value={search}\n onUpdate:_value={(text: string) => (search = text)}\n aria-label={lang.tableFilterSearch}\n placeholder={lang.tableFilterSearch}\n clearable\n size=\"sm\"\n />\n )}\n <div {...css.attrs(columnHeaderActionStyles.options)} role=\"group\" aria-label={label}>\n {shown().map((option) => (\n <Checkbox\n key={option.value}\n _checked={values.includes(option.value)}\n onUpdate:_checked={(checked: boolean) => toggle(option.value, checked)}\n >\n {option.label ?? option.value}\n </Checkbox>\n ))}\n </div>\n </>\n );\n }\n\n return () => {\n const active = values.length > 0;\n return (\n <Popover\n placement=\"bottom-end\"\n aria-label={lang.tableFilterColumn(label, false)}\n trigger={(props) => (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: Funnel,\n size: 'xs',\n variant: 'ghost',\n tone: 'neutral',\n sx: [columnHeaderActionStyles.trigger, active && columnHeaderActionStyles.active],\n 'aria-label': lang.tableFilterColumn(label, active),\n },\n propsTrigger,\n props,\n )}\n />\n )}\n >\n <div {...css.attrs(columnHeaderActionStyles.panel)}>\n {renderOptions()}\n <div {...css.attrs(columnHeaderActionStyles.footer)}>\n <Button size=\"sm\" variant=\"ghost\" disabled={!active} onClick={() => onChange([])}>\n {lang.tableFilterClear}\n </Button>\n </div>\n </div>\n </Popover>\n );\n };\n },\n);\n\n/** 列菜单里的一项操作 */\nexport interface ColumnMenuActions {\n /** 按这一列升序 */\n sortAscending: unknown;\n /** 按这一列降序 */\n sortDescending: unknown;\n /** 取消这一列的排序 */\n unsort: unknown;\n /** 固定在开头 */\n pinStart: unknown;\n /** 固定在结尾 */\n pinEnd: unknown;\n /** 取消固定 */\n unpin: unknown;\n /** 往前移一列 */\n moveBackward: unknown;\n /** 往后移一列 */\n moveForward: unknown;\n /** 隐藏这一列 */\n hide: unknown;\n}\n\n/** 列菜单按钮的属性 */\nexport interface ColumnMenuButtonProps {\n /** 列标题的文字:按钮的名称 */\n label: string;\n /** 可以排序:菜单里有升序、降序 */\n sortable: boolean;\n /** 这一列当前的排序 */\n sorted?: SortState['direction'];\n /** 这一列当前固定在哪一侧 */\n pinned?: keyof ColumnStickies;\n /** 能不能往前、往后移(已经在头上、尾上时不能) */\n canMove: { backward: boolean; forward: boolean };\n /** 能不能隐藏(只剩一列时不能) */\n canHide: boolean;\n /** 选了一项 */\n onAction: (action: keyof ColumnMenuActions) => void;\n /** 按钮的部件属性 */\n propsTrigger?: Partial<IconButtonProps>;\n}\n\n/** 列菜单:⋮ 按钮,弹出排序、固定、移动、隐藏 */\nexport const ColumnMenuButton = _component(\n ({\n label,\n sortable,\n sorted,\n pinned,\n canMove,\n canHide,\n onAction,\n propsTrigger,\n }: ColumnMenuButtonProps) => {\n const lang = useLang();\n return () => (\n <Menu\n placement=\"bottom-end\"\n trigger={(props) => (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: EllipsisVertical,\n size: 'xs',\n variant: 'ghost',\n tone: 'neutral',\n sx: columnHeaderActionStyles.trigger,\n 'aria-label': lang.tableColumnMenu(label),\n },\n propsTrigger,\n props,\n )}\n />\n )}\n >\n {sortable && (\n <>\n <MenuItem disabled={sorted === 'ascending'} onAction={() => onAction('sortAscending')}>\n {lang.tableSortAscending}\n </MenuItem>\n <MenuItem\n disabled={sorted === 'descending'}\n onAction={() => onAction('sortDescending')}\n >\n {lang.tableSortDescending}\n </MenuItem>\n {sorted && (\n <MenuItem onAction={() => onAction('unsort')}>{lang.tableSortClear}</MenuItem>\n )}\n <Separator decorative={false} />\n </>\n )}\n {pinned !== 'start' && (\n <MenuItem onAction={() => onAction('pinStart')}>{lang.tablePinStart}</MenuItem>\n )}\n {pinned !== 'end' && (\n <MenuItem onAction={() => onAction('pinEnd')}>{lang.tablePinEnd}</MenuItem>\n )}\n {pinned && <MenuItem onAction={() => onAction('unpin')}>{lang.tableUnpin}</MenuItem>}\n <Separator decorative={false} />\n <MenuItem disabled={!canMove.backward} onAction={() => onAction('moveBackward')}>\n {lang.tableMoveBackward}\n </MenuItem>\n <MenuItem disabled={!canMove.forward} onAction={() => onAction('moveForward')}>\n {lang.tableMoveForward}\n </MenuItem>\n <MenuItem disabled={!canHide} onAction={() => onAction('hide')}>\n {lang.tableHideColumn}\n </MenuItem>\n </Menu>\n );\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ColumnHeaderActions.js","names":["_vtp_readonlyProp","_vue_ref","_createVNode","_Fragment","_mergeProps","Menu"],"sources":["../../src/table/ColumnHeaderActions.tsx"],"sourcesContent":["/**\n * 列标题上的两个小按钮:表头筛选(ColumnFilterButton,弹出勾选的值或关键字)与列菜单(ColumnMenuButton:排序、固定、移动、隐藏)。\n * DataTableView 在列定义写了 filter、或表格开了 columnMenu 时放进列标题;状态都在外层(DataTable),这里只管画与报告。\n */\nimport { EllipsisVertical, Funnel } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { Button } from '../base/Button';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang, useTextMatcher } from '../config/context';\nimport { Checkbox } from '../input/Checkbox';\nimport { TextField } from '../input/TextField';\nimport { Separator } from '../layout/Separator';\nimport { Menu, MenuItem } from '../overlay/Menu';\nimport { Popover } from '../overlay/Popover';\nimport { plainText } from '../utils/data/text';\nimport { mergePartProps } from '../utils/props';\nimport type { ColumnFilterOption, ColumnStickies, SortState } from './columns';\n\n/** 选项多于这么多时,筛选里多一个搜索框 */\nconst SEARCH_THRESHOLD = 8;\n\n/** ColumnHeaderActions 的样式:trigger、active、panel、options、footer */\nexport const columnHeaderActionStyles = css.create({\n // 比正文小一档,不撑高表头\n trigger: { flexShrink: 0, marginBlock: '-0.25em' },\n active: { color: '_accentText' },\n panel: { display: 'flex', flexDirection: 'column', gap: '_sm', minWidth: '12rem' },\n options: {\n display: 'flex',\n flexDirection: 'column',\n gap: '_xs',\n maxHeight: '16rem',\n overflowY: 'auto',\n fontWeight: '_normal',\n color: '_text',\n },\n footer: { display: 'flex', justifyContent: 'flex-end' },\n});\n\n/** 表头筛选按钮的属性 */\nexport interface ColumnFilterButtonProps {\n /** 列标题的文字:按钮的名称 */\n label: string;\n /** 可以勾选的值;关键字筛选时为 'text' */\n options: readonly ColumnFilterOption[] | 'text';\n /** 选中的值(关键字筛选时是 [关键字]) */\n values: readonly string[];\n /** 改了筛选 */\n onChange: (values: string[]) => void;\n /** 按钮的部件属性 */\n propsTrigger?: Partial<IconButtonProps>;\n}\n\n/** 表头筛选:漏斗按钮,弹出勾选的值(多时可以搜索)或关键字输入框;改了立即生效 */\nexport const ColumnFilterButton = _component(\n ({ label, options, values, onChange, propsTrigger }: ColumnFilterButtonProps) => {\n const lang = useLang();\n const matcher = useTextMatcher();\n let search = _state('');\n\n const shown = () => {\n if (options === 'text' || !search) return options === 'text' ? [] : options;\n const match = matcher();\n return options.filter((option) => match(plainText(option.label) ?? option.value, search));\n };\n\n function toggle(value: string, checked: boolean) {\n onChange(checked ? [...values, value] : values.filter((item) => item !== value));\n }\n\n function renderOptions(): VNodeChild {\n if (options === 'text')\n return (\n <TextField\n _value={values[0] ?? ''}\n onUpdate:_value={(text: string) => onChange(text ? [text] : [])}\n aria-label={lang.tableFilterSearch}\n placeholder={lang.tableFilterSearch}\n clearable\n autofocus\n size=\"sm\"\n />\n );\n return (\n <>\n {options.length > SEARCH_THRESHOLD && (\n <TextField\n _value={search}\n onUpdate:_value={(text: string) => (search = text)}\n aria-label={lang.tableFilterSearch}\n placeholder={lang.tableFilterSearch}\n clearable\n size=\"sm\"\n />\n )}\n <div {...css.attrs(columnHeaderActionStyles.options)} role=\"group\" aria-label={label}>\n {shown().map((option) => (\n <Checkbox\n key={option.value}\n _checked={values.includes(option.value)}\n onUpdate:_checked={(checked: boolean) => toggle(option.value, checked)}\n >\n {option.label ?? option.value}\n </Checkbox>\n ))}\n </div>\n </>\n );\n }\n\n return () => {\n const active = values.length > 0;\n return (\n <Popover\n placement=\"bottom-end\"\n aria-label={lang.tableFilterColumn(label, false)}\n trigger={(props) => (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: Funnel,\n size: 'xs',\n variant: 'ghost',\n tone: 'neutral',\n sx: [columnHeaderActionStyles.trigger, active && columnHeaderActionStyles.active],\n 'aria-label': lang.tableFilterColumn(label, active),\n },\n propsTrigger,\n props,\n )}\n />\n )}\n >\n <div {...css.attrs(columnHeaderActionStyles.panel)}>\n {renderOptions()}\n <div {...css.attrs(columnHeaderActionStyles.footer)}>\n <Button size=\"sm\" variant=\"ghost\" disabled={!active} onClick={() => onChange([])}>\n {lang.tableFilterClear}\n </Button>\n </div>\n </div>\n </Popover>\n );\n };\n },\n);\n\n/** 列菜单里的一项操作 */\nexport interface ColumnMenuActions {\n /** 按这一列升序 */\n sortAscending: unknown;\n /** 按这一列降序 */\n sortDescending: unknown;\n /** 取消这一列的排序 */\n unsort: unknown;\n /** 固定在开头 */\n pinStart: unknown;\n /** 固定在结尾 */\n pinEnd: unknown;\n /** 取消固定 */\n unpin: unknown;\n /** 往前移一列 */\n moveBackward: unknown;\n /** 往后移一列 */\n moveForward: unknown;\n /** 隐藏这一列 */\n hide: unknown;\n}\n\n/** 列菜单按钮的属性 */\nexport interface ColumnMenuButtonProps {\n /** 列标题的文字:按钮的名称 */\n label: string;\n /** 可以排序:菜单里有升序、降序 */\n sortable: boolean;\n /** 这一列当前的排序 */\n sorted?: SortState['direction'];\n /** 这一列当前固定在哪一侧 */\n pinned?: keyof ColumnStickies;\n /** 能不能往前、往后移(已经在头上、尾上时不能) */\n canMove: { backward: boolean; forward: boolean };\n /** 能不能隐藏(只剩一列时不能) */\n canHide: boolean;\n /** 选了一项 */\n onAction: (action: keyof ColumnMenuActions) => void;\n /** 按钮的部件属性 */\n propsTrigger?: Partial<IconButtonProps>;\n}\n\n/** 列菜单:⋮ 按钮,弹出排序、固定、移动、隐藏 */\nexport const ColumnMenuButton = _component(\n ({\n label,\n sortable,\n sorted,\n pinned,\n canMove,\n canHide,\n onAction,\n propsTrigger,\n }: ColumnMenuButtonProps) => {\n const lang = useLang();\n return () => (\n <Menu\n placement=\"bottom-end\"\n trigger={(props) => (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: EllipsisVertical,\n size: 'xs',\n variant: 'ghost',\n tone: 'neutral',\n sx: columnHeaderActionStyles.trigger,\n 'aria-label': lang.tableColumnMenu(label),\n },\n propsTrigger,\n props,\n )}\n />\n )}\n >\n {sortable && (\n <>\n <MenuItem disabled={sorted === 'ascending'} onAction={() => onAction('sortAscending')}>\n {lang.tableSortAscending}\n </MenuItem>\n <MenuItem\n disabled={sorted === 'descending'}\n onAction={() => onAction('sortDescending')}\n >\n {lang.tableSortDescending}\n </MenuItem>\n {sorted && (\n <MenuItem onAction={() => onAction('unsort')}>{lang.tableSortClear}</MenuItem>\n )}\n <Separator decorative={false} />\n </>\n )}\n {pinned !== 'start' && (\n <MenuItem onAction={() => onAction('pinStart')}>{lang.tablePinStart}</MenuItem>\n )}\n {pinned !== 'end' && (\n <MenuItem onAction={() => onAction('pinEnd')}>{lang.tablePinEnd}</MenuItem>\n )}\n {pinned && <MenuItem onAction={() => onAction('unpin')}>{lang.tableUnpin}</MenuItem>}\n <Separator decorative={false} />\n <MenuItem disabled={!canMove.backward} onAction={() => onAction('moveBackward')}>\n {lang.tableMoveBackward}\n </MenuItem>\n <MenuItem disabled={!canMove.forward} onAction={() => onAction('moveForward')}>\n {lang.tableMoveForward}\n </MenuItem>\n <MenuItem disabled={!canHide} onAction={() => onAction('hide')}>\n {lang.tableHideColumn}\n </MenuItem>\n </Menu>\n );\n },\n);\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useLang } from "../config/context.js";
|
|
2
2
|
import { ResizeHandle } from "../layout/ResizeHandle.js";
|
|
3
3
|
import "./columns.js";
|
|
4
|
-
import { createVNode
|
|
5
|
-
import { _component, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
4
|
+
import { createVNode } from "vue";
|
|
5
|
+
import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
6
6
|
//#region src/table/ColumnResizer.tsx
|
|
7
7
|
/** 分隔条的角色、可聚焦、名称与取值由组件管理 */
|
|
8
8
|
/** 未声明的属性落到手柄(span)上 */
|
|
@@ -13,7 +13,7 @@ var ColumnResizer = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
13
13
|
const onWidthChange = readonlyProp(_props, "onWidthChange");
|
|
14
14
|
const rest = restProps(_props, _ctx, true);
|
|
15
15
|
const lang = useLang();
|
|
16
|
-
return () => createVNode(ResizeHandle,
|
|
16
|
+
return () => createVNode(ResizeHandle, mergeJsxProps(rest, {
|
|
17
17
|
"minWidth": minWidth.value,
|
|
18
18
|
"onWidthChange": onWidthChange.value,
|
|
19
19
|
"aria-label": lang.tableResizeColumn(label.value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnResizer.js","names":["_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/table/ColumnResizer.tsx"],"sourcesContent":["/**\n * 列宽调整手柄:表头单元格结束边的 ResizeHandle,名称取语言包(调整“列名”的列宽),最小宽度默认 COLUMN_MIN_WIDTH。\n * 宽度从所在单元格量起,所以要放在 th 里;DataTableView 的可调整列都用它。\n *\n * <th>…<ColumnResizer label=\"金额\" width={widths.amount} onWidthChange={(px) => …} /></th>\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { useLang } from '../config/context';\nimport {\n ResizeHandle,\n type ResizeHandleManaged,\n type ResizeHandleProps,\n} from '../layout/ResizeHandle';\nimport { COLUMN_MIN_WIDTH } from './columns';\n\n/** 分隔条的角色、可聚焦、名称与取值由组件管理 */\nexport type ColumnResizerManaged = ResizeHandleManaged | 'aria-label';\n\n/** 未声明的属性落到手柄(span)上 */\nexport interface ColumnResizerProps extends Omit<ResizeHandleProps, 'aria-label'> {\n /** 列名:手柄的无障碍名称取语言包(调整“列名”的列宽) */\n label: string;\n /** 拖动或用键盘调整了宽度 */\n onWidthChange: (width: number) => void;\n}\n\n/** 列宽调整手柄:拖动或用 ← / → 调整所在列的宽度 */\nexport const ColumnResizer = _component(\n ({ label, minWidth = COLUMN_MIN_WIDTH, onWidthChange, ...rest }: ColumnResizerProps) => {\n const lang = useLang();\n return () => (\n <ResizeHandle\n {...rest}\n minWidth={minWidth}\n onWidthChange={onWidthChange}\n aria-label={lang.tableResizeColumn(label)}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;AA2BA,IAAa,gBAAgB,0BAC3B,QAAA,SAAwF;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,kBAAA,EAAnD;CAAA,MAAA,gBAAAA,aAAA,QAAA,eAAA;CAAA,MAAoB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAC3D,MAAM,OAAO,QAAQ;CACrB,aAAOC,YAAA,cAAAC,
|
|
1
|
+
{"version":3,"file":"ColumnResizer.js","names":["_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/table/ColumnResizer.tsx"],"sourcesContent":["/**\n * 列宽调整手柄:表头单元格结束边的 ResizeHandle,名称取语言包(调整“列名”的列宽),最小宽度默认 COLUMN_MIN_WIDTH。\n * 宽度从所在单元格量起,所以要放在 th 里;DataTableView 的可调整列都用它。\n *\n * <th>…<ColumnResizer label=\"金额\" width={widths.amount} onWidthChange={(px) => …} /></th>\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { useLang } from '../config/context';\nimport {\n ResizeHandle,\n type ResizeHandleManaged,\n type ResizeHandleProps,\n} from '../layout/ResizeHandle';\nimport { COLUMN_MIN_WIDTH } from './columns';\n\n/** 分隔条的角色、可聚焦、名称与取值由组件管理 */\nexport type ColumnResizerManaged = ResizeHandleManaged | 'aria-label';\n\n/** 未声明的属性落到手柄(span)上 */\nexport interface ColumnResizerProps extends Omit<ResizeHandleProps, 'aria-label'> {\n /** 列名:手柄的无障碍名称取语言包(调整“列名”的列宽) */\n label: string;\n /** 拖动或用键盘调整了宽度 */\n onWidthChange: (width: number) => void;\n}\n\n/** 列宽调整手柄:拖动或用 ← / → 调整所在列的宽度 */\nexport const ColumnResizer = _component(\n ({ label, minWidth = COLUMN_MIN_WIDTH, onWidthChange, ...rest }: ColumnResizerProps) => {\n const lang = useLang();\n return () => (\n <ResizeHandle\n {...rest}\n minWidth={minWidth}\n onWidthChange={onWidthChange}\n aria-label={lang.tableResizeColumn(label)}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;AA2BA,IAAa,gBAAgB,0BAC3B,QAAA,SAAwF;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,kBAAA,EAAnD;CAAA,MAAA,gBAAAA,aAAA,QAAA,eAAA;CAAA,MAAoB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAC3D,MAAM,OAAO,QAAQ;CACrB,aAAOC,YAAA,cAAAC,cAEC,MAAI;EAAA,YAAA,SAAA;EAAA,iBAAA,cAAA;EAAA,cAGI,KAAK,kBAAiB,MAAA,KAAM;CAAC,CAAA,GAAA,IAAA;AAG/C,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
|
|
@@ -7,8 +7,8 @@ import { arrangeColumns } from "./columns.js";
|
|
|
7
7
|
import { Sortable } from "../display/Sortable.js";
|
|
8
8
|
import { Checkbox } from "../input/Checkbox.js";
|
|
9
9
|
import { Popover } from "../overlay/Popover.js";
|
|
10
|
-
import { createVNode, isVNode
|
|
11
|
-
import { _component, bindable, readonlyProp } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
10
|
+
import { createVNode, isVNode } from "vue";
|
|
11
|
+
import { _component, bindable, mergeJsxProps, readonlyProp } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
12
12
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
13
13
|
import { Columns3 } from "@lucide/icons";
|
|
14
14
|
//#region src/table/ColumnSettings.tsx
|
|
@@ -71,7 +71,7 @@ var ColumnSettings = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
71
71
|
order.value = [];
|
|
72
72
|
onReset.value?.();
|
|
73
73
|
}
|
|
74
|
-
return () => createVNode(Popover,
|
|
74
|
+
return () => createVNode(Popover, mergeJsxProps(mergePartProps({
|
|
75
75
|
placement: "bottom-end",
|
|
76
76
|
"aria-label": lang.tableColumnSettings
|
|
77
77
|
}, propsPanel.value), {
|
|
@@ -83,7 +83,7 @@ var ColumnSettings = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
83
83
|
}, propsTrigger.value, props), null)),
|
|
84
84
|
"key": "__site2"
|
|
85
85
|
}), {
|
|
86
|
-
default: () => [createVNode("div", css.attrs(columnSettingsStyles.panel), [createVNode("div", css.attrs(columnSettingsStyles.header), [createVNode("span", css.attrs(columnSettingsStyles.title), [lang.tableColumnSettings]), createVNode(Button,
|
|
86
|
+
default: () => [createVNode("div", css.attrs(columnSettingsStyles.panel), [createVNode("div", css.attrs(columnSettingsStyles.header), [createVNode("span", css.attrs(columnSettingsStyles.title), [lang.tableColumnSettings]), createVNode(Button, mergeJsxProps(mergePartProps({
|
|
87
87
|
size: "sm",
|
|
88
88
|
variant: "ghost"
|
|
89
89
|
}, propsReset.value, {
|
|
@@ -92,7 +92,7 @@ var ColumnSettings = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
92
92
|
}), { "key": "__site0" }), {
|
|
93
93
|
default: () => [lang.tableColumnSettingsReset],
|
|
94
94
|
$stable: true
|
|
95
|
-
})]), createVNode(Sortable,
|
|
95
|
+
})]), createVNode(Sortable, mergeJsxProps(mergePartProps({
|
|
96
96
|
sx: columnSettingsStyles.list,
|
|
97
97
|
"aria-label": lang.tableColumnSettings
|
|
98
98
|
}, propsList.value), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnSettings.js","names":["_isVNode","_vtp_readonlyProp","_vtp_bindable","_createVNode","_mergeProps"],"sources":["../../src/table/ColumnSettings.tsx"],"sourcesContent":["/**\n * 列设置:表格工具栏上的按钮,弹出全部的列——勾选显示哪些、拖动(或聚焦把手后用键盘)调整顺序,“重置”回到列定义。\n * 写回的 hidden、order 与 DataTable 的 hiddenColumns、columnOrder 是同一份,两边双向绑定同一个状态即可。\n *\n * <ColumnSettings columns={columns} _hidden={hidden} _order={order} />\n * <DataTable columns={columns} _hiddenColumns={hidden} _columnOrder={order} … />\n *\n * 只剩一列可见时不能再隐藏。部件:Trigger(IconButton)、Panel(Popover 的弹出层)、List(Sortable)、Reset(Button)。\n */\nimport { Columns3 } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang } from '../config/context';\nimport { Sortable, type SortableProps } from '../display/Sortable';\nimport { Checkbox } from '../input/Checkbox';\nimport { Popover, type PopoverProps } from '../overlay/Popover';\nimport { plainText } from '../utils/data/text';\nimport { mergePartProps } from '../utils/props';\nimport { arrangeColumns, type DataTableColumn } from './columns';\n\n/** ColumnSettings 的属性 */\nexport interface ColumnSettingsProps<T> {\n /** 全部的列(列定义的顺序) */\n columns: readonly DataTableColumn<T>[];\n /** 隐藏的列的 key:父级写 _hidden={x},与 DataTable 的 hiddenColumns 绑同一个状态 */\n _hidden?: string[];\n /** 列的顺序:父级写 _order={x},与 DataTable 的 columnOrder 绑同一个状态 */\n _order?: string[];\n /** 点了“重置”:显示与顺序回到列定义;要连列宽、固定一起还原时在这里清掉 */\n onReset?: () => void;\n /** 触发按钮的部件属性 */\n propsTrigger?: Partial<IconButtonProps>;\n /** 弹出层(Popover)的部件属性 */\n propsPanel?: Partial<PopoverProps>;\n /** 列表(Sortable)的部件属性 */\n propsList?: Partial<SortableProps<DataTableColumn<T>>>;\n /** “重置”按钮的部件属性 */\n propsReset?: Partial<ButtonProps>;\n}\n\n/** ColumnSettings 的样式:panel、list、header */\nexport const columnSettingsStyles = css.create({\n panel: { display: 'flex', flexDirection: 'column', gap: '_sm', minWidth: '14rem' },\n list: { maxHeight: '20rem', overflowY: 'auto' },\n header: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '_md' },\n title: { fontWeight: '_semibold', fontSize: '_sm' },\n});\n\n/** 列设置:勾选显示、拖动排序、重置 */\nexport const ColumnSettings = _component(\n <T,>({\n columns,\n _hidden: hidden = _bindable<string[]>([]),\n _order: order = _bindable<string[]>([]),\n onReset,\n propsTrigger,\n propsPanel,\n propsList,\n propsReset,\n }: ColumnSettingsProps<T>) => {\n const lang = useLang();\n const labelOf = (column: DataTableColumn<T>) => plainText(column.header) ?? column.key;\n // 按当前顺序列出(固定列照常在两头)\n const arranged = () => arrangeColumns(columns, order, undefined);\n const visibleCount = () => columns.length - hidden.length;\n\n function toggle(key: string, visible: boolean) {\n hidden = visible ? hidden.filter((item) => item !== key) : [...hidden, key];\n }\n\n function reset() {\n hidden = [];\n order = [];\n onReset?.();\n }\n\n return () => (\n <Popover\n {...mergePartProps<Partial<PopoverProps>>(\n { placement: 'bottom-end', 'aria-label': lang.tableColumnSettings },\n propsPanel,\n )}\n trigger={(props) => (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: Columns3,\n variant: 'ghost',\n tone: 'neutral',\n 'aria-label': lang.tableColumnSettings,\n },\n propsTrigger,\n props,\n )}\n />\n )}\n >\n <div {...css.attrs(columnSettingsStyles.panel)}>\n <div {...css.attrs(columnSettingsStyles.header)}>\n <span {...css.attrs(columnSettingsStyles.title)}>{lang.tableColumnSettings}</span>\n <Button\n {...mergePartProps<ButtonProps>({ size: 'sm', variant: 'ghost' }, propsReset, {\n disabled: hidden.length === 0 && order.length === 0,\n onClick: reset,\n })}\n >\n {lang.tableColumnSettingsReset}\n </Button>\n </div>\n <Sortable\n {...mergePartProps<Partial<SortableProps<DataTableColumn<T>>>>(\n { sx: columnSettingsStyles.list, 'aria-label': lang.tableColumnSettings },\n propsList,\n )}\n _items={arranged()}\n onUpdate:_items={(next: DataTableColumn<T>[]) =>\n (order = next.map((column) => column.key))\n }\n getKey={(column) => column.key}\n getLabel={labelOf}\n >\n {(column) => {\n const visible = !hidden.includes(column.key);\n return (\n <Checkbox\n _checked={visible}\n // 只剩这一列可见时不能再隐藏\n disabled={visible && visibleCount() <= 1}\n onUpdate:_checked={(checked: boolean) => toggle(column.key, checked)}\n >\n {labelOf(column)}\n </Checkbox>\n );\n }}\n </Sortable>\n </div>\n </Popover>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAA,QAAA,GAAA;CAAA,OAAA,OAAA,MAAA,cAAA,OAAA,UAAA,SAAA,KAAA,CAAA,MAAA,qBAAA,CAAAA,QAAA,CAAA;AAAA;;AAqBA,IAAa,uBAAuB,IAAI,OAAO;CAC7C,OAAO;EAAE,SAAS;EAAQ,eAAe;EAAU,KAAK;EAAO,UAAU;CAAQ;CACjF,MAAM;EAAE,WAAW;EAAS,WAAW;CAAO;CAC9C,QAAQ;EAAE,SAAS;EAAQ,YAAY;EAAU,gBAAgB;EAAiB,KAAK;CAAM;CAC7F,OAAO;EAAE,YAAY;EAAa,UAAU;CAAM;AACpD,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAS8B;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,UAAAC,aAAA,QAAA,SAAA;CAAA,MAAA,SAAAC,SAAA,QAAA,iBAPU,CAAA,GAAE,KAAA,IAAA;CAAA,MAAA,QAAAA,SAAA,QAAA,gBACJ,CAAA,GAAE,KAAA,IAAA;CAAA,MAAA,UAAAD,aAAA,QAAA,SAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAOtC,MAAM,OAAO,QAAQ;CACrB,MAAM,WAAW,WAA+B,UAAU,OAAO,MAAM,KAAK,OAAO;CAEnF,MAAM,iBAAiB,eAAc,QAAA,OAAA,MAAA,OAAiB,KAAA,CAAS;CAC/D,MAAM,qBAAqB,QAAA,MAAQ,SAAS,OAAA,MAAO;CAEnD,SAAS,OAAO,KAAa,SAAkB;EAC7C,OAAA,QAAS,UAAU,OAAA,MAAO,QAAQ,SAAS,SAAS,GAAG,IAAI,CAAC,GAAA,OAAA,OAAW,GAAG;CAC5E;CAEA,SAAS,QAAQ;EACf,OAAA,QAAS,CAAA;EACT,MAAA,QAAQ,CAAA;EACR,QAAA,QAAU;CACZ;CAEA,aAAOE,YAAA,SAAAC,
|
|
1
|
+
{"version":3,"file":"ColumnSettings.js","names":["_isVNode","_vtp_readonlyProp","_vtp_bindable","_createVNode","_mergeProps"],"sources":["../../src/table/ColumnSettings.tsx"],"sourcesContent":["/**\n * 列设置:表格工具栏上的按钮,弹出全部的列——勾选显示哪些、拖动(或聚焦把手后用键盘)调整顺序,“重置”回到列定义。\n * 写回的 hidden、order 与 DataTable 的 hiddenColumns、columnOrder 是同一份,两边双向绑定同一个状态即可。\n *\n * <ColumnSettings columns={columns} _hidden={hidden} _order={order} />\n * <DataTable columns={columns} _hiddenColumns={hidden} _columnOrder={order} … />\n *\n * 只剩一列可见时不能再隐藏。部件:Trigger(IconButton)、Panel(Popover 的弹出层)、List(Sortable)、Reset(Button)。\n */\nimport { Columns3 } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang } from '../config/context';\nimport { Sortable, type SortableProps } from '../display/Sortable';\nimport { Checkbox } from '../input/Checkbox';\nimport { Popover, type PopoverProps } from '../overlay/Popover';\nimport { plainText } from '../utils/data/text';\nimport { mergePartProps } from '../utils/props';\nimport { arrangeColumns, type DataTableColumn } from './columns';\n\n/** ColumnSettings 的属性 */\nexport interface ColumnSettingsProps<T> {\n /** 全部的列(列定义的顺序) */\n columns: readonly DataTableColumn<T>[];\n /** 隐藏的列的 key:父级写 _hidden={x},与 DataTable 的 hiddenColumns 绑同一个状态 */\n _hidden?: string[];\n /** 列的顺序:父级写 _order={x},与 DataTable 的 columnOrder 绑同一个状态 */\n _order?: string[];\n /** 点了“重置”:显示与顺序回到列定义;要连列宽、固定一起还原时在这里清掉 */\n onReset?: () => void;\n /** 触发按钮的部件属性 */\n propsTrigger?: Partial<IconButtonProps>;\n /** 弹出层(Popover)的部件属性 */\n propsPanel?: Partial<PopoverProps>;\n /** 列表(Sortable)的部件属性 */\n propsList?: Partial<SortableProps<DataTableColumn<T>>>;\n /** “重置”按钮的部件属性 */\n propsReset?: Partial<ButtonProps>;\n}\n\n/** ColumnSettings 的样式:panel、list、header */\nexport const columnSettingsStyles = css.create({\n panel: { display: 'flex', flexDirection: 'column', gap: '_sm', minWidth: '14rem' },\n list: { maxHeight: '20rem', overflowY: 'auto' },\n header: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '_md' },\n title: { fontWeight: '_semibold', fontSize: '_sm' },\n});\n\n/** 列设置:勾选显示、拖动排序、重置 */\nexport const ColumnSettings = _component(\n <T,>({\n columns,\n _hidden: hidden = _bindable<string[]>([]),\n _order: order = _bindable<string[]>([]),\n onReset,\n propsTrigger,\n propsPanel,\n propsList,\n propsReset,\n }: ColumnSettingsProps<T>) => {\n const lang = useLang();\n const labelOf = (column: DataTableColumn<T>) => plainText(column.header) ?? column.key;\n // 按当前顺序列出(固定列照常在两头)\n const arranged = () => arrangeColumns(columns, order, undefined);\n const visibleCount = () => columns.length - hidden.length;\n\n function toggle(key: string, visible: boolean) {\n hidden = visible ? hidden.filter((item) => item !== key) : [...hidden, key];\n }\n\n function reset() {\n hidden = [];\n order = [];\n onReset?.();\n }\n\n return () => (\n <Popover\n {...mergePartProps<Partial<PopoverProps>>(\n { placement: 'bottom-end', 'aria-label': lang.tableColumnSettings },\n propsPanel,\n )}\n trigger={(props) => (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: Columns3,\n variant: 'ghost',\n tone: 'neutral',\n 'aria-label': lang.tableColumnSettings,\n },\n propsTrigger,\n props,\n )}\n />\n )}\n >\n <div {...css.attrs(columnSettingsStyles.panel)}>\n <div {...css.attrs(columnSettingsStyles.header)}>\n <span {...css.attrs(columnSettingsStyles.title)}>{lang.tableColumnSettings}</span>\n <Button\n {...mergePartProps<ButtonProps>({ size: 'sm', variant: 'ghost' }, propsReset, {\n disabled: hidden.length === 0 && order.length === 0,\n onClick: reset,\n })}\n >\n {lang.tableColumnSettingsReset}\n </Button>\n </div>\n <Sortable\n {...mergePartProps<Partial<SortableProps<DataTableColumn<T>>>>(\n { sx: columnSettingsStyles.list, 'aria-label': lang.tableColumnSettings },\n propsList,\n )}\n _items={arranged()}\n onUpdate:_items={(next: DataTableColumn<T>[]) =>\n (order = next.map((column) => column.key))\n }\n getKey={(column) => column.key}\n getLabel={labelOf}\n >\n {(column) => {\n const visible = !hidden.includes(column.key);\n return (\n <Checkbox\n _checked={visible}\n // 只剩这一列可见时不能再隐藏\n disabled={visible && visibleCount() <= 1}\n onUpdate:_checked={(checked: boolean) => toggle(column.key, checked)}\n >\n {labelOf(column)}\n </Checkbox>\n );\n }}\n </Sortable>\n </div>\n </Popover>\n );\n },\n);\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useLang } from "../config/context.js";
|
|
2
|
-
import { mergeProps
|
|
2
|
+
import { mergeProps } from "../utils/props.js";
|
|
3
3
|
import { columnType, columnValue, sumColumn } from "./columns.js";
|
|
4
4
|
import { useColumnDisplay } from "./column-display.js";
|
|
5
5
|
import { Table, TableBody, TableCell, TableFoot, TableHead, TableHeaderCell, TableRow } from "./Table.js";
|
|
6
|
-
import { computed, createVNode, isVNode
|
|
7
|
-
import { _component, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
6
|
+
import { computed, createVNode, isVNode } from "vue";
|
|
7
|
+
import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
|
|
8
8
|
import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
|
|
9
9
|
//#region src/table/ColumnTable.tsx
|
|
10
10
|
/** 一格合并几行、几列;0 是被别的格合并掉(不渲染) */
|
|
@@ -75,11 +75,11 @@ var ColumnTable = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
75
75
|
if (column.summary) return column.summary(rows.value);
|
|
76
76
|
return position === 0 ? summaryLabel.value ?? lang.tableSummary : null;
|
|
77
77
|
}
|
|
78
|
-
return () => createVNode(Table,
|
|
78
|
+
return () => createVNode(Table, mergeJsxProps(rest, { "key": "__site5" }), {
|
|
79
79
|
default: () => [
|
|
80
80
|
createVNode(TableHead, { "key": "__site1" }, {
|
|
81
81
|
default: () => [createVNode(TableRow, { "key": "__site0" }, {
|
|
82
|
-
default: () => [shown.value.map((column) => createVNode(TableHeaderCell,
|
|
82
|
+
default: () => [shown.value.map((column) => createVNode(TableHeaderCell, mergeJsxProps({ "key": column.key }, typeof propsHeaderCell.value === "function" ? propsHeaderCell.value(column) : propsHeaderCell.value, {
|
|
83
83
|
"align": column.align,
|
|
84
84
|
"width": column.width
|
|
85
85
|
}), { default: () => [column.header] }))],
|
|
@@ -90,12 +90,12 @@ var ColumnTable = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
90
90
|
createVNode(TableBody, { "key": "__site2" }, {
|
|
91
91
|
default: () => [rows.value.map((row, index) => {
|
|
92
92
|
let _slot2;
|
|
93
|
-
return createVNode(TableRow,
|
|
93
|
+
return createVNode(TableRow, mergeJsxProps({ "key": getKey.value?.(row, index) ?? index }, mergeProps({}, typeof propsRow.value === "function" ? propsRow.value(row, index) : propsRow.value)), _isSlot(_slot2 = shown.value.map((column) => {
|
|
94
94
|
let _slot;
|
|
95
95
|
const span = spanOf(row, column, index);
|
|
96
96
|
if (span?.rowSpan === 0 || span?.colSpan === 0) return null;
|
|
97
97
|
const own = typeof propsCell.value === "function" ? propsCell.value(row, column) : propsCell.value;
|
|
98
|
-
return createVNode(TableCell,
|
|
98
|
+
return createVNode(TableCell, mergeJsxProps({ "key": column.key }, mergeProps({ sx: span?.rowSpan ? columnTableStyles.merged : void 0 }, own, {
|
|
99
99
|
rowspan: span?.rowSpan,
|
|
100
100
|
colspan: span?.colSpan
|
|
101
101
|
}), {
|
|
@@ -110,7 +110,7 @@ var ColumnTable = /*#__PURE__*/ _component((_props, _ctx) => {
|
|
|
110
110
|
default: () => [createVNode(TableRow, { "key": "__site3" }, {
|
|
111
111
|
default: () => [shown.value.map((column, position) => {
|
|
112
112
|
let _slot3;
|
|
113
|
-
return createVNode(TableCell,
|
|
113
|
+
return createVNode(TableCell, mergeJsxProps({ "key": column.key }, typeof propsSummaryCell.value === "function" ? propsSummaryCell.value(column) : propsSummaryCell.value, { "align": column.align }), _isSlot(_slot3 = summaryCell(column, position)) ? _slot3 : { default: () => [_slot3] });
|
|
114
114
|
})],
|
|
115
115
|
$stable: true
|
|
116
116
|
})],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnTable.js","names":["_isVNode","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps","mergeProps"],"sources":["../../src/table/ColumnTable.tsx"],"sourcesContent":["/**\n * 按列定义渲染的静态表格:列定义与 DataTable 相同(type、format、statuses、empty、summary、align、cell),\n * 渲染成普通的 Table(不虚拟滚动、列宽按内容、单元格可以换行),可以合并单元格。打印、导出预览、详情页里的明细表用它;\n * 要排序、勾选、筛选、十万行的用 DataTable。\n *\n * <ColumnTable rows={items} columns={columns} getKey={(item) => item.id} mergeRepeated={['supplier']} aria-label=\"报价明细\" />\n *\n * 合并单元格:mergeRepeated 写列的 key,这几列里上下相邻、值相同的格合成一格(后一列只在前一列的同一格里合并,层层分组);\n * 更灵活的用 cellSpan,返回 { rowSpan, colSpan },被合并掉的格返回 0(同 Ant Design 的 onCell)。合并的格垂直居中。\n *\n * 部件:Root(Table)、HeaderCell(th)、Row(tr)、Cell(td)、SummaryCell(表尾的 td)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { mergeProps, type PartProps } from '../utils/props';\nimport { useColumnDisplay } from './column-display';\nimport { columnType, columnValue, sumColumn, type DataTableColumn } from './columns';\nimport {\n Table,\n TableBody,\n TableCell,\n TableFoot,\n TableHead,\n TableHeaderCell,\n TableRow,\n type TableHeaderCellProps,\n type TableProps,\n} from './Table';\n\n/** 一格合并几行、几列;0 是被别的格合并掉(不渲染) */\nexport interface CellSpan {\n /** 往下合并几行,默认 1 */\n rowSpan?: number;\n /** 往后合并几列,默认 1 */\n colSpan?: number;\n}\n\n/** 列标题的部件属性:对齐与宽度跟随列定义 */\ntype HeaderCellParts = Partial<TableHeaderCellProps>;\n/** 单元格的部件属性:对齐跟随列定义,合并由 cellSpan、mergeRepeated 决定 */\ntype CellParts = PartProps<'td', 'align' | 'rowspan' | 'colspan'>;\n\n/** 未声明的属性落到 table 上;外观(density、variant、striped)同 Table */\nexport interface ColumnTableProps<T> extends Omit<TableProps, 'children'> {\n /** 数据 */\n rows: readonly T[];\n /** 列定义(与 DataTable 相同;sortable、filter、sticky、resizable 在这里不起作用) */\n columns: readonly DataTableColumn<T>[];\n /** 行的 key;不写时用下标 */\n getKey?: (row: T, index: number) => string;\n /** 这几列里上下相邻、值相同的格合成一格;后一列只在前一列的同一格里合并 */\n mergeRepeated?: readonly string[];\n /** 合并单元格:返回这一格合并几行、几列,被合并掉的返回 { rowSpan: 0 } 或 { colSpan: 0 } */\n cellSpan?: (row: T, column: DataTableColumn<T>, index: number) => CellSpan | undefined;\n /** 合计行第一列的文字(第一列自己没写 summary 时),默认取语言包(合计) */\n summaryLabel?: VNodeChild;\n /** 列标题(th)的部件属性,可以按列计算 */\n propsHeaderCell?: HeaderCellParts | ((column: DataTableColumn<T>) => HeaderCellParts);\n /** 每一行(tr)的部件属性,可以按行计算 */\n propsRow?: PartProps<'tr'> | ((row: T, index: number) => PartProps<'tr'>);\n /** 每个单元格(td)的部件属性,可以按行与列计算 */\n propsCell?: CellParts | ((row: T, column: DataTableColumn<T>) => CellParts);\n /** 合计行每个单元格的部件属性,可以按列计算 */\n propsSummaryCell?: CellParts | ((column: DataTableColumn<T>) => CellParts);\n}\n\n/** ColumnTable 的样式:merged */\nexport const columnTableStyles = css.create({\n // 合并的格跨了几行:内容垂直居中,下边线照常\n merged: { verticalAlign: 'middle' },\n});\n\n/**\n * mergeRepeated 的跨行数:每列一个数组,第 i 行是这一格往下合并几行,被合并掉的是 0。\n * 后一列在前一列的分组边界处断开(不把不同供应商下同名的品类合在一起)\n */\nexport function repeatedRowSpans<T>(\n rows: readonly T[],\n columns: readonly DataTableColumn<T>[],\n keys: readonly string[],\n): Map<string, number[]> {\n const spans = new Map<string, number[]>();\n // 上一列的分组从哪些行开始:本列的合并不能跨过它们\n let boundaries = new Set<number>([0]);\n for (const key of keys) {\n const column = columns.find((item) => item.key === key);\n if (!column) continue;\n const list = Array.from({ length: rows.length }, () => 1);\n const starts = new Set<number>();\n let start = 0;\n for (let index = 0; index < rows.length; index++) {\n const same =\n index > start &&\n !boundaries.has(index) &&\n String(columnValue(column, rows[index]!)) === String(columnValue(column, rows[start]!));\n if (same) {\n list[start]!++;\n list[index] = 0;\n } else {\n start = index;\n starts.add(index);\n }\n }\n spans.set(key, list);\n boundaries = new Set([...boundaries, ...starts]);\n }\n return spans;\n}\n\n/** 按列定义渲染的静态表格:格式化同 DataTable,可以合并单元格、带合计行 */\nexport const ColumnTable = _component(\n <T,>({\n rows,\n columns,\n getKey,\n mergeRepeated,\n cellSpan,\n summaryLabel,\n propsHeaderCell,\n propsRow,\n propsCell,\n propsSummaryCell,\n ...rest\n }: ColumnTableProps<T>) => {\n const lang = useLang();\n const display = useColumnDisplay<T>();\n const types = _derived(columns.map((column) => columnType(column, rows)));\n const shown = _derived(display.columns(columns, types));\n const merged = _derived(\n mergeRepeated?.length ? repeatedRowSpans(rows, columns, mergeRepeated) : null,\n );\n const hasSummary = _derived(columns.some((column) => column.summary != null));\n\n /** 一格的合并:cellSpan 优先,其次 mergeRepeated */\n function spanOf(row: T, column: DataTableColumn<T>, index: number): CellSpan | undefined {\n const own = cellSpan?.(row, column, index);\n if (own) return own;\n const rowSpan = merged?.get(column.key)?.[index];\n return rowSpan == null || rowSpan === 1 ? undefined : { rowSpan };\n }\n\n function summaryCell(column: DataTableColumn<T>, position: number): VNodeChild {\n if (column.summary === 'sum') {\n const total = sumColumn(column, rows);\n return total == null\n ? (column.empty ?? lang.emptyValue)\n : display.value(column, types[position]!, total);\n }\n if (column.summary) return column.summary(rows);\n return position === 0 ? (summaryLabel ?? lang.tableSummary) : null;\n }\n\n return () => (\n <Table {...rest}>\n <TableHead>\n <TableRow>\n {shown.map((column) => (\n <TableHeaderCell\n key={column.key}\n {...(typeof propsHeaderCell === 'function'\n ? propsHeaderCell(column)\n : propsHeaderCell)}\n align={column.align}\n width={column.width}\n >\n {column.header}\n </TableHeaderCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n key={getKey?.(row, index) ?? index}\n {...mergeProps<'tr'>(\n {},\n typeof propsRow === 'function' ? propsRow(row, index) : propsRow,\n )}\n >\n {shown.map((column) => {\n const span = spanOf(row, column, index);\n if (span?.rowSpan === 0 || span?.colSpan === 0) return null;\n const own = typeof propsCell === 'function' ? propsCell(row, column) : propsCell;\n return (\n <TableCell\n key={column.key}\n {...mergeProps<'td'>(\n { sx: span?.rowSpan ? columnTableStyles.merged : undefined },\n own,\n { rowspan: span?.rowSpan, colspan: span?.colSpan },\n )}\n align={column.align}\n nowrap={!column.wrap && column.width != null}\n >\n {column.cell!(row, index)}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n {hasSummary && (\n <TableFoot>\n <TableRow>\n {shown.map((column, position) => (\n <TableCell\n key={column.key}\n {...(typeof propsSummaryCell === 'function'\n ? propsSummaryCell(column)\n : propsSummaryCell)}\n align={column.align}\n >\n {summaryCell(column, position)}\n </TableCell>\n ))}\n </TableRow>\n </TableFoot>\n )}\n </Table>\n );\n },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ColumnTable.js","names":["_isVNode","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/table/ColumnTable.tsx"],"sourcesContent":["/**\n * 按列定义渲染的静态表格:列定义与 DataTable 相同(type、format、statuses、empty、summary、align、cell),\n * 渲染成普通的 Table(不虚拟滚动、列宽按内容、单元格可以换行),可以合并单元格。打印、导出预览、详情页里的明细表用它;\n * 要排序、勾选、筛选、十万行的用 DataTable。\n *\n * <ColumnTable rows={items} columns={columns} getKey={(item) => item.id} mergeRepeated={['supplier']} aria-label=\"报价明细\" />\n *\n * 合并单元格:mergeRepeated 写列的 key,这几列里上下相邻、值相同的格合成一格(后一列只在前一列的同一格里合并,层层分组);\n * 更灵活的用 cellSpan,返回 { rowSpan, colSpan },被合并掉的格返回 0(同 Ant Design 的 onCell)。合并的格垂直居中。\n *\n * 部件:Root(Table)、HeaderCell(th)、Row(tr)、Cell(td)、SummaryCell(表尾的 td)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { mergeProps, type PartProps } from '../utils/props';\nimport { useColumnDisplay } from './column-display';\nimport { columnType, columnValue, sumColumn, type DataTableColumn } from './columns';\nimport {\n Table,\n TableBody,\n TableCell,\n TableFoot,\n TableHead,\n TableHeaderCell,\n TableRow,\n type TableHeaderCellProps,\n type TableProps,\n} from './Table';\n\n/** 一格合并几行、几列;0 是被别的格合并掉(不渲染) */\nexport interface CellSpan {\n /** 往下合并几行,默认 1 */\n rowSpan?: number;\n /** 往后合并几列,默认 1 */\n colSpan?: number;\n}\n\n/** 列标题的部件属性:对齐与宽度跟随列定义 */\ntype HeaderCellParts = Partial<TableHeaderCellProps>;\n/** 单元格的部件属性:对齐跟随列定义,合并由 cellSpan、mergeRepeated 决定 */\ntype CellParts = PartProps<'td', 'align' | 'rowspan' | 'colspan'>;\n\n/** 未声明的属性落到 table 上;外观(density、variant、striped)同 Table */\nexport interface ColumnTableProps<T> extends Omit<TableProps, 'children'> {\n /** 数据 */\n rows: readonly T[];\n /** 列定义(与 DataTable 相同;sortable、filter、sticky、resizable 在这里不起作用) */\n columns: readonly DataTableColumn<T>[];\n /** 行的 key;不写时用下标 */\n getKey?: (row: T, index: number) => string;\n /** 这几列里上下相邻、值相同的格合成一格;后一列只在前一列的同一格里合并 */\n mergeRepeated?: readonly string[];\n /** 合并单元格:返回这一格合并几行、几列,被合并掉的返回 { rowSpan: 0 } 或 { colSpan: 0 } */\n cellSpan?: (row: T, column: DataTableColumn<T>, index: number) => CellSpan | undefined;\n /** 合计行第一列的文字(第一列自己没写 summary 时),默认取语言包(合计) */\n summaryLabel?: VNodeChild;\n /** 列标题(th)的部件属性,可以按列计算 */\n propsHeaderCell?: HeaderCellParts | ((column: DataTableColumn<T>) => HeaderCellParts);\n /** 每一行(tr)的部件属性,可以按行计算 */\n propsRow?: PartProps<'tr'> | ((row: T, index: number) => PartProps<'tr'>);\n /** 每个单元格(td)的部件属性,可以按行与列计算 */\n propsCell?: CellParts | ((row: T, column: DataTableColumn<T>) => CellParts);\n /** 合计行每个单元格的部件属性,可以按列计算 */\n propsSummaryCell?: CellParts | ((column: DataTableColumn<T>) => CellParts);\n}\n\n/** ColumnTable 的样式:merged */\nexport const columnTableStyles = css.create({\n // 合并的格跨了几行:内容垂直居中,下边线照常\n merged: { verticalAlign: 'middle' },\n});\n\n/**\n * mergeRepeated 的跨行数:每列一个数组,第 i 行是这一格往下合并几行,被合并掉的是 0。\n * 后一列在前一列的分组边界处断开(不把不同供应商下同名的品类合在一起)\n */\nexport function repeatedRowSpans<T>(\n rows: readonly T[],\n columns: readonly DataTableColumn<T>[],\n keys: readonly string[],\n): Map<string, number[]> {\n const spans = new Map<string, number[]>();\n // 上一列的分组从哪些行开始:本列的合并不能跨过它们\n let boundaries = new Set<number>([0]);\n for (const key of keys) {\n const column = columns.find((item) => item.key === key);\n if (!column) continue;\n const list = Array.from({ length: rows.length }, () => 1);\n const starts = new Set<number>();\n let start = 0;\n for (let index = 0; index < rows.length; index++) {\n const same =\n index > start &&\n !boundaries.has(index) &&\n String(columnValue(column, rows[index]!)) === String(columnValue(column, rows[start]!));\n if (same) {\n list[start]!++;\n list[index] = 0;\n } else {\n start = index;\n starts.add(index);\n }\n }\n spans.set(key, list);\n boundaries = new Set([...boundaries, ...starts]);\n }\n return spans;\n}\n\n/** 按列定义渲染的静态表格:格式化同 DataTable,可以合并单元格、带合计行 */\nexport const ColumnTable = _component(\n <T,>({\n rows,\n columns,\n getKey,\n mergeRepeated,\n cellSpan,\n summaryLabel,\n propsHeaderCell,\n propsRow,\n propsCell,\n propsSummaryCell,\n ...rest\n }: ColumnTableProps<T>) => {\n const lang = useLang();\n const display = useColumnDisplay<T>();\n const types = _derived(columns.map((column) => columnType(column, rows)));\n const shown = _derived(display.columns(columns, types));\n const merged = _derived(\n mergeRepeated?.length ? repeatedRowSpans(rows, columns, mergeRepeated) : null,\n );\n const hasSummary = _derived(columns.some((column) => column.summary != null));\n\n /** 一格的合并:cellSpan 优先,其次 mergeRepeated */\n function spanOf(row: T, column: DataTableColumn<T>, index: number): CellSpan | undefined {\n const own = cellSpan?.(row, column, index);\n if (own) return own;\n const rowSpan = merged?.get(column.key)?.[index];\n return rowSpan == null || rowSpan === 1 ? undefined : { rowSpan };\n }\n\n function summaryCell(column: DataTableColumn<T>, position: number): VNodeChild {\n if (column.summary === 'sum') {\n const total = sumColumn(column, rows);\n return total == null\n ? (column.empty ?? lang.emptyValue)\n : display.value(column, types[position]!, total);\n }\n if (column.summary) return column.summary(rows);\n return position === 0 ? (summaryLabel ?? lang.tableSummary) : null;\n }\n\n return () => (\n <Table {...rest}>\n <TableHead>\n <TableRow>\n {shown.map((column) => (\n <TableHeaderCell\n key={column.key}\n {...(typeof propsHeaderCell === 'function'\n ? propsHeaderCell(column)\n : propsHeaderCell)}\n align={column.align}\n width={column.width}\n >\n {column.header}\n </TableHeaderCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row, index) => (\n <TableRow\n key={getKey?.(row, index) ?? index}\n {...mergeProps<'tr'>(\n {},\n typeof propsRow === 'function' ? propsRow(row, index) : propsRow,\n )}\n >\n {shown.map((column) => {\n const span = spanOf(row, column, index);\n if (span?.rowSpan === 0 || span?.colSpan === 0) return null;\n const own = typeof propsCell === 'function' ? propsCell(row, column) : propsCell;\n return (\n <TableCell\n key={column.key}\n {...mergeProps<'td'>(\n { sx: span?.rowSpan ? columnTableStyles.merged : undefined },\n own,\n { rowspan: span?.rowSpan, colspan: span?.colSpan },\n )}\n align={column.align}\n nowrap={!column.wrap && column.width != null}\n >\n {column.cell!(row, index)}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n {hasSummary && (\n <TableFoot>\n <TableRow>\n {shown.map((column, position) => (\n <TableCell\n key={column.key}\n {...(typeof propsSummaryCell === 'function'\n ? propsSummaryCell(column)\n : propsSummaryCell)}\n align={column.align}\n >\n {summaryCell(column, position)}\n </TableCell>\n ))}\n </TableRow>\n </TableFoot>\n )}\n </Table>\n );\n },\n);\n"],"mappings":"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"}
|