@veltra/desktop 1.3.10 → 1.5.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/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/action/action.js.map +1 -1
- package/dist/components/auto-complete/auto-complete.js.map +1 -1
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/badge/style.d.ts +1 -1
- package/dist/components/batch-edit/batch-edit-form.js +8 -12
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.js +2 -1
- package/dist/components/batch-edit/batch-edit.js.map +1 -1
- package/dist/components/batch-edit/di.js.map +1 -1
- package/dist/components/batch-edit/index.d.ts +2 -2
- package/dist/components/batch-edit/use-edit-state.js +11 -9
- package/dist/components/batch-edit/use-edit-state.js.map +1 -1
- package/dist/components/batch-edit/use-handlers.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/breadcrumb/style.d.ts +1 -1
- package/dist/components/button/button-group.js.map +1 -1
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/calendar/calendar.js.map +1 -1
- package/dist/components/calendar/style.d.ts +1 -1
- package/dist/components/card/card-action.js.map +1 -1
- package/dist/components/card/card-content.js.map +1 -1
- package/dist/components/card/card-cover.js.map +1 -1
- package/dist/components/card/card-header.js.map +1 -1
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/card/style.d.ts +1 -1
- package/dist/components/cascade/cascade-panel-item.js.map +1 -1
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/check-tag/check-tag.js.map +1 -1
- package/dist/components/check-tag/style.d.ts +1 -1
- package/dist/components/checkbox/checkbox-button.js.map +1 -1
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/code-editor/basic-setup.js +2 -2
- package/dist/components/code-editor/code-editor.js +2 -2
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/code-editor/lang-loaders.js +1 -1
- package/dist/components/code-editor/shell-extension.js +2 -2
- package/dist/components/collapse/collapse-item.js +34 -11
- package/dist/components/collapse/collapse-item.js.map +1 -1
- package/dist/components/collapse/collapse.js.map +1 -1
- package/dist/components/collapse/style.d.ts +1 -1
- package/dist/components/collapse/style2.css +29 -51
- package/dist/components/condition-editor/components/condition-group.js.map +1 -1
- package/dist/components/condition-editor/components/condition-row.js.map +1 -1
- package/dist/components/condition-editor/condition-editor.js.map +1 -1
- package/dist/components/condition-editor/index.d.ts +2 -2
- package/dist/components/contextmenu/contextmenu-item.js +13 -6
- package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-panel.js +12 -6
- package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
- package/dist/components/contextmenu/contextmenu.js.map +1 -1
- package/dist/components/contextmenu/di.d.ts +15 -0
- package/dist/components/contextmenu/index.d.ts +3 -2
- package/dist/components/contextmenu/style2.css +13 -0
- package/dist/components/date-panel/date-panel.js.map +1 -1
- package/dist/components/date-panel/headers/day.js.map +1 -1
- package/dist/components/date-panel/headers/month.js.map +1 -1
- package/dist/components/date-panel/headers/year.js.map +1 -1
- package/dist/components/date-panel/panels/day.js.map +1 -1
- package/dist/components/date-panel/panels/month.js.map +1 -1
- package/dist/components/date-panel/panels/year.js.map +1 -1
- package/dist/components/date-panel/style.d.ts +1 -1
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
- package/dist/components/dual-nav/dual-nav.js.map +1 -1
- package/dist/components/empty/empty.js.map +1 -1
- package/dist/components/empty/style.d.ts +1 -1
- package/dist/components/expression-editor/components/path-preview.js.map +1 -1
- package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
- package/dist/components/expression-editor/core/editor.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/expression-editor/style.d.ts +1 -1
- package/dist/components/file-picker/file-picker.js.map +1 -1
- package/dist/components/file-picker/style.d.ts +1 -1
- package/dist/components/file-viewer/file-viewer.js.map +1 -1
- package/dist/components/file-viewer/helper.js +1 -38
- package/dist/components/file-viewer/helper.js.map +1 -1
- package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
- package/dist/components/file-viewer/previewers/sheet-previewer.js +68 -37
- package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/text-previewer.js +2 -2
- package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
- package/dist/components/file-viewer/style.d.ts +1 -1
- package/dist/components/float-button/float-button.js.map +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/style.d.ts +1 -1
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form-item/style.d.ts +1 -1
- package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
- package/dist/components/gantt-chart/style.d.ts +1 -1
- package/dist/components/grid/grid-item.js.map +1 -1
- package/dist/components/grid/grid.js +3 -2
- package/dist/components/grid/grid.js.map +1 -1
- package/dist/components/grid/style.d.ts +1 -1
- package/dist/components/grid-input/grid-input.js.map +1 -1
- package/dist/components/grid-input/style.d.ts +1 -1
- package/dist/components/group-input/group-input.js.map +1 -1
- package/dist/components/group-nav/group-nav-item.js.map +1 -1
- package/dist/components/group-nav/group-nav.js.map +1 -1
- package/dist/components/group-nav/style.d.ts +1 -1
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/icon/style.d.ts +1 -1
- package/dist/components/index.d.ts +91 -156
- package/dist/components/index.js +4 -1
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/kbd/kbd.js.map +1 -1
- package/dist/components/kbd/style.d.ts +1 -1
- package/dist/components/layout/layout-resizer.js.map +1 -1
- package/dist/components/layout/layout.js.map +1 -1
- package/dist/components/layout/style.d.ts +1 -1
- package/dist/components/list/list-item.js.map +1 -1
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/loading/directive.js +2 -1
- package/dist/components/loading/directive.js.map +1 -1
- package/dist/components/loading/index.d.ts +2 -2
- package/dist/components/loading/loading.js.map +1 -1
- package/dist/components/message/index.d.ts +2 -2
- package/dist/components/message/message-box.js.map +1 -1
- package/dist/components/message/message.js.map +1 -1
- package/dist/components/message/style.d.ts +1 -1
- package/dist/components/message-confirm/index.d.ts +2 -2
- package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
- package/dist/components/message-confirm/message-confirm.js.map +1 -1
- package/dist/components/message-confirm/style.d.ts +1 -1
- package/dist/components/message-confirm/style2.css +18 -0
- package/dist/components/multi-select/multi-select-option.js.map +1 -1
- package/dist/components/multi-select/multi-select.js +6 -3
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/nav/nav-icon.js.map +1 -1
- package/dist/components/nav/nav-item-collapsed.js.map +1 -1
- package/dist/components/nav/nav-item.js +4 -2
- package/dist/components/nav/nav-item.js.map +1 -1
- package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
- package/dist/components/nav/nav-sub.js.map +1 -1
- package/dist/components/nav/nav.js.map +1 -1
- package/dist/components/nav/style.d.ts +1 -1
- package/dist/components/node-render/style.d.ts +1 -1
- package/dist/components/notification/index.d.ts +2 -2
- package/dist/components/notification/notification-box.js +2 -2
- package/dist/components/notification/notification-box.js.map +1 -1
- package/dist/components/notification/notification.js.map +1 -1
- package/dist/components/notification/style.d.ts +1 -1
- package/dist/components/number/number.js.map +1 -1
- package/dist/components/number/style.d.ts +1 -1
- package/dist/components/number-input/number-input.js +2 -1
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.js.map +1 -1
- package/dist/components/paginator/paginator.js.map +1 -1
- package/dist/components/palette/palette-alpha.js.map +1 -1
- package/dist/components/palette/palette-color-switch.js.map +1 -1
- package/dist/components/palette/palette-hue.js.map +1 -1
- package/dist/components/palette/palette-sv.js.map +1 -1
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/progress/style.d.ts +1 -1
- package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
- package/dist/components/progress-nodes/style.d.ts +1 -1
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.js +2 -1
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/style.d.ts +1 -1
- package/dist/components/rich-text-editor/toolbar.js +3 -4
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- package/dist/components/scroll/scroll-bar.js.map +1 -1
- package/dist/components/scroll/scroll.js.map +1 -1
- package/dist/components/scroll/style.d.ts +1 -1
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/slider/slider-thumb.js.map +1 -1
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/slider/style.d.ts +1 -1
- package/dist/components/steps/steps.js.map +1 -1
- package/dist/components/steps/style.d.ts +1 -1
- package/dist/components/steps/style2.css +14 -14
- package/dist/components/switch/style.d.ts +1 -1
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/index.d.ts +2 -2
- package/dist/components/table/node/col.d.ts +1 -49
- package/dist/components/table/table-body.js.map +1 -1
- package/dist/components/table/table-cell.js.map +1 -1
- package/dist/components/table/table-foot.js.map +1 -1
- package/dist/components/table/table-row.js +2 -1
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/use-check.js +2 -1
- package/dist/components/table/use-check.js.map +1 -1
- package/dist/components/table/use-columns.d.ts +1 -1
- package/dist/components/table/use-rows.js +2 -1
- package/dist/components/table/use-rows.js.map +1 -1
- package/dist/components/table-editor/table-editor.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.js +2 -1
- package/dist/components/tabs/tabs-horizontal.js.map +1 -1
- package/dist/components/tabs/tabs-vertical.js.map +1 -1
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/use-tabs-bar.js +10 -25
- package/dist/components/tabs/use-tabs-bar.js.map +1 -1
- package/dist/components/tag/style.d.ts +1 -1
- package/dist/components/tag/tag.js.map +1 -1
- package/dist/components/text/style.d.ts +1 -1
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/theme/theme.js +3 -2
- package/dist/components/theme/theme.js.map +1 -1
- package/dist/components/tip/style.d.ts +1 -1
- package/dist/components/tip/tip.js.map +1 -1
- package/dist/components/tree/tree-node.js.map +1 -1
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/watermark/style.d.ts +1 -1
- package/dist/components/watermark/watermark.js.map +1 -1
- package/dist/index.d.ts +93 -97
- package/dist/index.js +2 -1
- package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js +2 -2
- package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js +3 -3
- package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_lang-css@6.3.1/node_modules/@codemirror/lang-css/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js +5 -4
- package/dist/node_modules/.bun/@codemirror_lang-html@6.4.11/node_modules/@codemirror/lang-html/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_lang-javascript@6.2.5/node_modules/@codemirror/lang-javascript/dist/index.js +2 -2
- package/dist/node_modules/.bun/{@codemirror_lang-markdown@6.5.1 → @codemirror_lang-markdown@6.5.2}/node_modules/@codemirror/lang-markdown/dist/index.js +4 -3
- package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.2/node_modules/@codemirror/lang-markdown/dist/index.js.map +1 -0
- package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js +2 -1
- package/dist/node_modules/.bun/@codemirror_lang-sql@6.10.0/node_modules/@codemirror/lang-sql/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js +2 -2
- package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js +4 -3
- package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js +2 -2
- package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/{@codemirror_state@6.7.0 → @codemirror_state@6.7.1}/node_modules/@codemirror/state/dist/index.js +13 -3
- package/dist/node_modules/.bun/@codemirror_state@6.7.1/node_modules/@codemirror/state/dist/index.js.map +1 -0
- package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js +1 -1
- package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/{@codemirror_view@6.43.4 → @codemirror_view@6.43.8}/node_modules/@codemirror/view/dist/index.js +86 -64
- package/dist/node_modules/.bun/@codemirror_view@6.43.8/node_modules/@codemirror/view/dist/index.js.map +1 -0
- package/dist/node_modules/.bun/@lezer_common@1.5.2/node_modules/@lezer/common/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@lezer_css@1.3.4/node_modules/@lezer/css/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@lezer_highlight@1.2.3/node_modules/@lezer/highlight/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@lezer_html@1.3.13/node_modules/@lezer/html/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@lezer_javascript@1.5.4/node_modules/@lezer/javascript/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@lezer_lr@1.4.10/node_modules/@lezer/lr/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js +1 -1
- package/dist/node_modules/.bun/@lezer_markdown@1.7.2/node_modules/@lezer/markdown/dist/index.js.map +1 -1
- package/dist/node_modules/.bun/@marijn_find-cluster-break@1.0.2/node_modules/@marijn/find-cluster-break/src/index.js.map +1 -1
- package/dist/node_modules/.bun/style-mod@4.1.3/node_modules/style-mod/src/style-mod.js.map +1 -1
- package/dist/types/collapse.d.ts +23 -4
- package/dist/types/contextmenu.d.ts +10 -4
- package/dist/types/index.d.ts +2 -8
- package/package.json +34 -30
- package/src/components/batch-edit/__test__/batch-edit.test.ts +199 -0
- package/src/components/batch-edit/batch-edit-form.vue +8 -8
- package/src/components/batch-edit/batch-edit.vue +2 -1
- package/src/components/batch-edit/di.ts +2 -0
- package/src/components/batch-edit/use-edit-state.ts +19 -12
- package/src/components/collapse/__test__/collapse.test.ts +178 -1
- package/src/components/collapse/collapse-item.vue +40 -12
- package/src/components/collapse/style.scss +26 -62
- package/src/components/contextmenu/__test__/contextmenu.test.ts +165 -0
- package/src/components/contextmenu/contextmenu-item.vue +7 -4
- package/src/components/contextmenu/contextmenu-panel.vue +7 -4
- package/src/components/contextmenu/index.ts +1 -0
- package/src/components/contextmenu/style.scss +16 -0
- package/src/components/file-viewer/helper.ts +0 -53
- package/src/components/file-viewer/previewers/sheet-previewer.vue +91 -46
- package/src/components/message-confirm/style.scss +19 -0
- package/src/components/notification/style.scss +16 -4
- package/src/components/radio-group/style.scss +1 -1
- package/src/components/slider/style.scss +1 -1
- package/src/components/steps/style.scss +2 -2
- package/src/components/tabs/use-tabs-bar.ts +15 -20
- package/src/types/collapse.ts +25 -3
- package/src/types/contextmenu.ts +10 -4
- package/dist/components/action/action-group.vue.d.ts +0 -25
- package/dist/components/action/action.vue.d.ts +0 -33
- package/dist/components/action/index.d.ts +0 -3
- package/dist/components/auto-complete/auto-complete.vue.d.ts +0 -41
- package/dist/components/auto-complete/index.d.ts +0 -2
- package/dist/components/badge/badge.vue.d.ts +0 -20
- package/dist/components/badge/index.d.ts +0 -2
- package/dist/components/batch-edit/batch-edit.vue.d.ts +0 -45
- package/dist/components/breadcrumb/breadcrumb.vue.d.ts +0 -24
- package/dist/components/breadcrumb/index.d.ts +0 -2
- package/dist/components/button/button-group.vue.d.ts +0 -19
- package/dist/components/button/button.vue.d.ts +0 -27
- package/dist/components/button/index.d.ts +0 -3
- package/dist/components/calendar/calendar.vue.d.ts +0 -17
- package/dist/components/calendar/index.d.ts +0 -2
- package/dist/components/card/card-action.vue.d.ts +0 -18
- package/dist/components/card/card-content.vue.d.ts +0 -18
- package/dist/components/card/card-cover.vue.d.ts +0 -8
- package/dist/components/card/card-header.vue.d.ts +0 -16
- package/dist/components/card/card.vue.d.ts +0 -18
- package/dist/components/card/index.d.ts +0 -6
- package/dist/components/cascade/cascade.vue.d.ts +0 -31
- package/dist/components/cascade/index.d.ts +0 -2
- package/dist/components/check-tag/check-tag.vue.d.ts +0 -22
- package/dist/components/check-tag/index.d.ts +0 -2
- package/dist/components/checkbox/checkbox-button.vue.d.ts +0 -35
- package/dist/components/checkbox/checkbox.vue.d.ts +0 -34
- package/dist/components/checkbox/index.d.ts +0 -3
- package/dist/components/checkbox-group/checkbox-group.vue.d.ts +0 -24
- package/dist/components/checkbox-group/index.d.ts +0 -2
- package/dist/components/code-editor/code-editor.vue.d.ts +0 -30
- package/dist/components/code-editor/index.d.ts +0 -2
- package/dist/components/collapse/collapse-item.vue.d.ts +0 -24
- package/dist/components/collapse/collapse.vue.d.ts +0 -27
- package/dist/components/collapse/index.d.ts +0 -3
- package/dist/components/condition-editor/condition-editor.vue.d.ts +0 -15
- package/dist/components/contextmenu/contextmenu.vue.d.ts +0 -14
- package/dist/components/date-panel/date-panel.vue.d.ts +0 -17
- package/dist/components/date-panel/index.d.ts +0 -2
- package/dist/components/date-picker/date-picker.vue.d.ts +0 -18
- package/dist/components/date-picker/index.d.ts +0 -2
- package/dist/components/date-range-picker/date-range-picker.vue.d.ts +0 -18
- package/dist/components/date-range-picker/index.d.ts +0 -2
- package/dist/components/dialog/dialog.vue.d.ts +0 -43
- package/dist/components/dialog/index.d.ts +0 -2
- package/dist/components/drawer/drawer.vue.d.ts +0 -36
- package/dist/components/drawer/index.d.ts +0 -2
- package/dist/components/dropdown/dropdown.vue.d.ts +0 -30
- package/dist/components/dropdown/index.d.ts +0 -2
- package/dist/components/dual-nav/dual-nav.vue.d.ts +0 -15
- package/dist/components/dual-nav/index.d.ts +0 -2
- package/dist/components/empty/empty.vue.d.ts +0 -11
- package/dist/components/empty/index.d.ts +0 -2
- package/dist/components/expression-editor/expression-editor.vue.d.ts +0 -16
- package/dist/components/expression-editor/index.d.ts +0 -2
- package/dist/components/file-picker/file-picker.vue.d.ts +0 -27
- package/dist/components/file-picker/index.d.ts +0 -2
- package/dist/components/file-viewer/file-viewer.vue.d.ts +0 -40
- package/dist/components/file-viewer/index.d.ts +0 -2
- package/dist/components/file-viewer/sheet-parser.js +0 -46
- package/dist/components/file-viewer/sheet-parser.js.map +0 -1
- package/dist/components/float-button/float-button.vue.d.ts +0 -12
- package/dist/components/float-button/index.d.ts +0 -2
- package/dist/components/form/form.vue.d.ts +0 -23
- package/dist/components/form/index.d.ts +0 -2
- package/dist/components/form-item/form-item.vue.d.ts +0 -21
- package/dist/components/form-item/index.d.ts +0 -2
- package/dist/components/gantt-chart/gantt-chart.vue.d.ts +0 -8
- package/dist/components/gantt-chart/index.d.ts +0 -2
- package/dist/components/grid/grid-item.vue.d.ts +0 -20
- package/dist/components/grid/grid.vue.d.ts +0 -27
- package/dist/components/grid/index.d.ts +0 -3
- package/dist/components/grid-input/grid-input.vue.d.ts +0 -19
- package/dist/components/grid-input/index.d.ts +0 -2
- package/dist/components/group-input/group-input.vue.d.ts +0 -26
- package/dist/components/group-input/index.d.ts +0 -2
- package/dist/components/group-nav/group-nav.vue.d.ts +0 -12
- package/dist/components/group-nav/index.d.ts +0 -2
- package/dist/components/icon/icon.vue.d.ts +0 -18
- package/dist/components/icon/index.d.ts +0 -2
- package/dist/components/input/index.d.ts +0 -2
- package/dist/components/input/input.vue.d.ts +0 -50
- package/dist/components/kbd/kbd.vue.d.ts +0 -16
- package/dist/components/layout/index.d.ts +0 -2
- package/dist/components/layout/layout.vue.d.ts +0 -20
- package/dist/components/list/index.d.ts +0 -3
- package/dist/components/list/list-item.vue.d.ts +0 -16
- package/dist/components/list/list.vue.d.ts +0 -21
- package/dist/components/loading/loading.vue.d.ts +0 -11
- package/dist/components/message/message.vue.d.ts +0 -16
- package/dist/components/message-confirm/message-confirm.vue.d.ts +0 -19
- package/dist/components/multi-select/index.d.ts +0 -2
- package/dist/components/multi-select/multi-select.vue.d.ts +0 -48
- package/dist/components/multi-tree-select/index.d.ts +0 -2
- package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +0 -44
- package/dist/components/nav/index.d.ts +0 -4
- package/dist/components/nav/nav-item.vue.d.ts +0 -12
- package/dist/components/nav/nav-sub.vue.d.ts +0 -13
- package/dist/components/nav/nav.vue.d.ts +0 -19
- package/dist/components/notification/notification.vue.d.ts +0 -18
- package/dist/components/number/index.d.ts +0 -2
- package/dist/components/number/number.vue.d.ts +0 -11
- package/dist/components/number-input/index.d.ts +0 -2
- package/dist/components/number-input/number-input.vue.d.ts +0 -39
- package/dist/components/number-range-input/index.d.ts +0 -2
- package/dist/components/number-range-input/number-range-input.vue.d.ts +0 -36
- package/dist/components/paginator/index.d.ts +0 -2
- package/dist/components/paginator/paginator.vue.d.ts +0 -29
- package/dist/components/palette/index.d.ts +0 -2
- package/dist/components/palette/palette.vue.d.ts +0 -20
- package/dist/components/password-input/index.d.ts +0 -2
- package/dist/components/password-input/password-input.vue.d.ts +0 -30
- package/dist/components/pop-confirm/index.d.ts +0 -2
- package/dist/components/pop-confirm/pop-confirm.vue.d.ts +0 -33
- package/dist/components/progress/index.d.ts +0 -2
- package/dist/components/progress/progress.vue.d.ts +0 -25
- package/dist/components/progress-nodes/index.d.ts +0 -2
- package/dist/components/progress-nodes/progress-nodes.vue.d.ts +0 -36
- package/dist/components/radio/index.d.ts +0 -2
- package/dist/components/radio/radio.vue.d.ts +0 -31
- package/dist/components/radio-group/index.d.ts +0 -2
- package/dist/components/radio-group/radio-group.vue.d.ts +0 -26
- package/dist/components/rich-text-editor/index.d.ts +0 -2
- package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +0 -23
- package/dist/components/scroll/index.d.ts +0 -2
- package/dist/components/scroll/scroll.vue.d.ts +0 -28
- package/dist/components/select/index.d.ts +0 -2
- package/dist/components/select/select.vue.d.ts +0 -38
- package/dist/components/slider/index.d.ts +0 -2
- package/dist/components/slider/slider.vue.d.ts +0 -21
- package/dist/components/steps/index.d.ts +0 -2
- package/dist/components/steps/steps.vue.d.ts +0 -29
- package/dist/components/switch/index.d.ts +0 -2
- package/dist/components/switch/switch.vue.d.ts +0 -24
- package/dist/components/table/node/row.d.ts +0 -49
- package/dist/components/table/table.vue.d.ts +0 -54
- package/dist/components/table-editor/index.d.ts +0 -2
- package/dist/components/table-editor/table-editor.vue.d.ts +0 -12
- package/dist/components/tabs/index.d.ts +0 -4
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +0 -40
- package/dist/components/tabs/tabs-vertical.vue.d.ts +0 -39
- package/dist/components/tabs/tabs.vue.d.ts +0 -36
- package/dist/components/tag/index.d.ts +0 -2
- package/dist/components/tag/tag.vue.d.ts +0 -22
- package/dist/components/text/index.d.ts +0 -2
- package/dist/components/text/text.vue.d.ts +0 -10
- package/dist/components/textarea/index.d.ts +0 -2
- package/dist/components/textarea/textarea.vue.d.ts +0 -34
- package/dist/components/theme/index.d.ts +0 -2
- package/dist/components/theme/theme.vue.d.ts +0 -8
- package/dist/components/tip/index.d.ts +0 -2
- package/dist/components/tip/tip.vue.d.ts +0 -31
- package/dist/components/tree/di.d.ts +0 -12
- package/dist/components/tree/index.d.ts +0 -2
- package/dist/components/tree/tree.vue.d.ts +0 -40
- package/dist/components/tree-select/index.d.ts +0 -2
- package/dist/components/tree-select/tree-select.vue.d.ts +0 -48
- package/dist/components/watermark/index.d.ts +0 -2
- package/dist/components/watermark/watermark.vue.d.ts +0 -21
- package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.1/node_modules/@codemirror/lang-markdown/dist/index.js.map +0 -1
- package/dist/node_modules/.bun/@codemirror_state@6.7.0/node_modules/@codemirror/state/dist/index.js.map +0 -1
- package/dist/node_modules/.bun/@codemirror_view@6.43.4/node_modules/@codemirror/view/dist/index.js.map +0 -1
- package/src/components/file-viewer/sheet-parser.ts +0 -52
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-foot.js","names":[],"sources":["../../../src/components/table/table-foot.vue"],"sourcesContent":["<template>\n <tfoot v-if=\"tableSlots.foot || showSummary\" :class=\"cls.e('foot')\">\n <tr v-if=\"showSummary\">\n <td\n v-if=\"leafColumns[0]\"\n :class=\"getCellClass(leafColumns[0])\"\n :style=\"{\n right: withUnit(leafColumns[0].style.right, 'px'),\n left: withUnit(leafColumns[0].style.left, 'px')\n }\"\n >\n 合计:\n </td>\n <td\n v-for=\"column of leafColumns.slice(1)\"\n :class=\"getCellClass(column)\"\n :key=\"column.key\"\n :style=\"{\n right: withUnit(column.style.right, 'px'),\n left: withUnit(column.style.left, 'px')\n }\"\n >\n <u-node-render :content=\"getColumnSummaryNode(column)\" />\n </td>\n </tr>\n <slot />\n </tfoot>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n } from '@cat-kit/core'\nimport { withUnit, type RenderReturn } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport { UNodeRender } from '../node-render'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\n\ndefineOptions({ name: 'UTableFoot' })\n\nconst { cls, columnConfig, rows, checkedRows, tableSlots, getCellClass } = inject(TableDIKey)!\n\nconst { leafColumns } = columnConfig\n\nconst showSummary = computed(() => {\n return leafColumns.value.some((col) => !!col.data.summary)\n})\n\nfunction computeSummary(key: string) {\n let sum = 0\n let i = 0\n\n while (i < rows.value.length) {\n sum = $n.plus(sum, rows.value[i]!.data[key] ?? 0)\n if (isNaN(sum)) return sum\n i++\n }\n\n return sum\n}\n\nconst summaryRow = computed<Record<string, any>>(() => {\n return leafColumns.value.reduce((acc, column) => {\n if (column.data.summary) {\n acc[column.key] = computeSummary(column.key)\n }\n return acc\n }, {})\n})\n\nfunction getColumnSummaryNode(column: ColumnNode): RenderReturn {\n const { summary } = column.data\n\n if (!summary) return null\n\n let total = summaryRow.value[column.key]\n\n if (typeof summary === 'function') {\n return summary({ total, rows: rows.value, checkedRows: checkedRows.value, column })\n }\n return total\n}\n\ndefineExpose({\n getSummaryRow(): Record<string, any> {\n return summaryRow.value\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;EAwCA,MAAM,EAAE,KAAK,cAAc,MAAM,aAAa,YAAY,iBAAiB,OAAO,UAAU;EAE5F,MAAM,EAAE,gBAAgB;EAExB,MAAM,cAAc,eAAe;GACjC,OAAO,YAAY,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,OAAO;EAC3D,CAAC;EAED,SAAS,eAAe,KAAa;GACnC,IAAI,MAAM;GACV,IAAI,IAAI;GAER,OAAO,IAAI,KAAK,MAAM,QAAQ;IAC5B,MAAM,GAAG,KAAK,KAAK,KAAK,MAAM,EAAE,CAAE,KAAK,QAAQ,CAAC;IAChD,IAAI,MAAM,GAAG,GAAG,OAAO;IACvB;GACF;GAEA,OAAO;EACT;EAEA,MAAM,aAAa,eAAoC;GACrD,OAAO,YAAY,MAAM,QAAQ,KAAK,WAAW;IAC/C,IAAI,OAAO,KAAK,SACd,IAAI,OAAO,OAAO,eAAe,OAAO,GAAG;IAE7C,OAAO;GACT,GAAG,CAAC,CAAC;EACP,CAAC;EAED,SAAS,qBAAqB,QAAkC;GAC9D,MAAM,EAAE,YAAY,OAAO;GAE3B,IAAI,CAAC,SAAS,OAAO;GAErB,IAAI,QAAQ,WAAW,MAAM,OAAO;GAEpC,IAAI,OAAO,YAAY,YACrB,OAAO,QAAQ;IAAE;IAAO,MAAM,KAAK;IAAO,aAAa,YAAY;IAAO;GAAO,CAAC;GAEpF,OAAO;EACT;EAEA,SAAa,EACX,gBAAqC;GACnC,OAAO,WAAW;EACpB,EACF,CAAC;;
|
|
1
|
+
{"version":3,"file":"table-foot.js","names":[],"sources":["../../../src/components/table/table-foot.vue"],"sourcesContent":["<template>\n <tfoot v-if=\"tableSlots.foot || showSummary\" :class=\"cls.e('foot')\">\n <tr v-if=\"showSummary\">\n <td\n v-if=\"leafColumns[0]\"\n :class=\"getCellClass(leafColumns[0])\"\n :style=\"{\n right: withUnit(leafColumns[0].style.right, 'px'),\n left: withUnit(leafColumns[0].style.left, 'px')\n }\"\n >\n 合计:\n </td>\n <td\n v-for=\"column of leafColumns.slice(1)\"\n :class=\"getCellClass(column)\"\n :key=\"column.key\"\n :style=\"{\n right: withUnit(column.style.right, 'px'),\n left: withUnit(column.style.left, 'px')\n }\"\n >\n <u-node-render :content=\"getColumnSummaryNode(column)\" />\n </td>\n </tr>\n <slot />\n </tfoot>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n } from '@cat-kit/core'\nimport { withUnit, type RenderReturn } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport { UNodeRender } from '../node-render'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\n\ndefineOptions({ name: 'UTableFoot' })\n\nconst { cls, columnConfig, rows, checkedRows, tableSlots, getCellClass } = inject(TableDIKey)!\n\nconst { leafColumns } = columnConfig\n\nconst showSummary = computed(() => {\n return leafColumns.value.some((col) => !!col.data.summary)\n})\n\nfunction computeSummary(key: string) {\n let sum = 0\n let i = 0\n\n while (i < rows.value.length) {\n sum = $n.plus(sum, rows.value[i]!.data[key] ?? 0)\n if (isNaN(sum)) return sum\n i++\n }\n\n return sum\n}\n\nconst summaryRow = computed<Record<string, any>>(() => {\n return leafColumns.value.reduce((acc, column) => {\n if (column.data.summary) {\n acc[column.key] = computeSummary(column.key)\n }\n return acc\n }, {})\n})\n\nfunction getColumnSummaryNode(column: ColumnNode): RenderReturn {\n const { summary } = column.data\n\n if (!summary) return null\n\n let total = summaryRow.value[column.key]\n\n if (typeof summary === 'function') {\n return summary({ total, rows: rows.value, checkedRows: checkedRows.value, column })\n }\n return total\n}\n\ndefineExpose({\n getSummaryRow(): Record<string, any> {\n return summaryRow.value\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;EAwCA,MAAM,EAAE,KAAK,cAAc,MAAM,aAAa,YAAY,iBAAiB,OAAO,UAAU;EAE5F,MAAM,EAAE,gBAAgB;EAExB,MAAM,cAAc,eAAe;GACjC,OAAO,YAAY,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,OAAO;EAC3D,CAAC;EAED,SAAS,eAAe,KAAa;GACnC,IAAI,MAAM;GACV,IAAI,IAAI;GAER,OAAO,IAAI,KAAK,MAAM,QAAQ;IAC5B,MAAM,GAAG,KAAK,KAAK,KAAK,MAAM,EAAE,CAAE,KAAK,QAAQ,CAAC;IAChD,IAAI,MAAM,GAAG,GAAG,OAAO;IACvB;GACF;GAEA,OAAO;EACT;EAEA,MAAM,aAAa,eAAoC;GACrD,OAAO,YAAY,MAAM,QAAQ,KAAK,WAAW;IAC/C,IAAI,OAAO,KAAK,SACd,IAAI,OAAO,OAAO,eAAe,OAAO,GAAG;IAE7C,OAAO;GACT,GAAG,CAAC,CAAC;EACP,CAAC;EAED,SAAS,qBAAqB,QAAkC;GAC9D,MAAM,EAAE,YAAY,OAAO;GAE3B,IAAI,CAAC,SAAS,OAAO;GAErB,IAAI,QAAQ,WAAW,MAAM,OAAO;GAEpC,IAAI,OAAO,YAAY,YACrB,OAAO,QAAQ;IAAE;IAAO,MAAM,KAAK;IAAO,aAAa,YAAY;IAAO;GAAO,CAAC;GAEpF,OAAO;EACT;EAEA,SAAa,EACX,gBAAqC;GACnC,OAAO,WAAW;EACpB,EACF,CAAC;;GAtFc,OAAA,MAAA,UAAA,CAAU,CAAC,QAAQ,YAAA,SAAA,UAAA,GAAhC,mBAyBQ,SAAA;;IAzBsC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;GAC9C,GAAA,CAAA,YAAA,SAAA,UAAA,GAAV,mBAsBK,MAAA,YAAA,CApBK,MAAA,WAAA,CAAW,CAAA,MAAA,UAAA,GADnB,mBASK,MAAA;;IAPF,OAAK,eAAE,MAAA,YAAA,CAAY,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAA;IAC/B,OAAK,eAAA;KAAqB,OAAA,MAAA,QAAA,CAAQ,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI,MAAM,OAAK,IAAA;KAAyB,MAAA,MAAA,QAAA,CAAQ,CAAC,MAAA,WAAA,CAAW,CAAA,EAAA,CAAI,MAAM,MAAI,IAAA;;GAI1H,GAAA,SAED,CAAA,KAAA,mBAAA,QAAA,IAAA,IAAA,UAAA,IAAA,GACA,mBAUK,UAAA,MAAA,WATc,MAAA,WAAA,CAAW,CAAC,MAAK,CAAA,IAA3B,WAAM;IADf,OAAA,UAAA,GAAA,mBAUK,MAAA;KARF,OAAK,eAAE,MAAA,YAAA,CAAY,CAAC,MAAM,CAAA;KAC1B,KAAK,OAAO;KACZ,OAAK,eAAA;MAAqB,OAAA,MAAA,QAAA,CAAQ,CAAC,OAAO,MAAM,OAAK,IAAA;MAAyB,MAAA,MAAA,QAAA,CAAQ,CAAC,OAAO,MAAM,MAAI,IAAA;;IAKzG,GAAA,CAAA,YAAyD,MAAA,UAAA,GAAA,EAAzC,SAAS,qBAAqB,MAAM,EAAA,GAAA,MAAA,GAAA,CAAA,SAAA,CAAA,CAAA,GAAA,CAAA;GAGxD,CAAA,GAAA,GAAA,EAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA"}
|
|
@@ -95,8 +95,9 @@ const UTableRow = defineComponent({
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
const mod = rowModCls(row);
|
|
98
|
+
const rowCls = mod ? rowBaseCls + " " + mod : rowBaseCls;
|
|
98
99
|
return createVNode("tr", {
|
|
99
|
-
"class":
|
|
100
|
+
"class": rowCls,
|
|
100
101
|
"onClick": (e) => handleRowClick(row, e),
|
|
101
102
|
"ref": getMeasureRef(props.index),
|
|
102
103
|
"key": row.uid
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-row.js","names":[],"sources":["../../../src/components/table/table-row.tsx"],"sourcesContent":["import { ArrowRight } from '@veltra/icons/normal'\nimport { defineComponent, type DefineComponent } from 'vue'\nimport { inject, onUnmounted } from 'vue'\nimport type { JSX } from 'vue/jsx-runtime'\n\nimport type { TableRow as ITableRow } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { TableDIKey } from './di'\nimport UTabelCell from './table-cell.vue'\n\n/**\n * A3:行修饰类组合静态查找表。\n *\n * 位模式:bit2 = isCurrent, bit1 = checked, bit0 = expanded。\n * 与 `bem.is('...')` 对于 `'current' | 'checked' | 'expanded'` 的输出完全等价,\n * 直接从 index 读字符串,消除每行渲染期间的字符串拼接和 3 次 bem.is 调用。\n *\n * 放在模块顶层使所有 TableRow 实例共享一份引用(不会随 setup 重建)。\n */\nconst ROW_MOD_CLASS: readonly string[] = [\n '',\n 'is-expanded',\n 'is-checked',\n 'is-checked is-expanded',\n 'is-current',\n 'is-current is-expanded',\n 'is-current is-checked',\n 'is-current is-checked is-expanded'\n] as const\n\nfunction rowModCls(row: ITableRow): string {\n const i = (row.isCurrent ? 4 : 0) | (row.checked ? 2 : 0) | (row.expanded ? 1 : 0)\n return ROW_MOD_CLASS[i]!\n}\n\nexport const UTableRow: DefineComponent<{ row: ITableRow; index: number }> = defineComponent({\n name: 'TableRow',\n\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n\n setup(props) {\n const {\n cls,\n columnConfig,\n getColumnSlotsNode,\n toggleTreeRowExpand,\n getCellCtx,\n handleRowClick,\n handleCellClick,\n tableProps,\n measureElement,\n getCellClass\n } = inject(TableDIKey)!\n\n // A1:把 cls.e('row') / cls.e('expand-toggle') 等静态字符串提升到 setup 一次性计算,\n // 避免每次 render 重新走 `cls.e` 拼接。\n const rowBaseCls = cls.e('row')\n const expandToggleCls = cls.e('expand-toggle')\n const expandSpaceCls = cls.e('expand-space')\n\n // A2:measureRef 按 index 缓存闭包。\n // 行虚拟化下,同一 TableRow 实例的 props.index 大多稳定,但在虚拟化重排或展开行切换时\n // 仍会发生变化;把 (index) → refFn 缓存起来,既保证引用稳定(利于 Vue 的 ref diff),\n // 又避免在未来可能的\"同实例跨 index 复用\"情形下重复分配闭包。\n const measureRefCache = new Map<number, (el: unknown) => void>()\n const getMeasureRef = (index: number): ((el: unknown) => void) => {\n let ref = measureRefCache.get(index)\n if (ref === undefined) {\n ref = (el: unknown) => {\n measureElement(index, el as Element | null)\n }\n measureRefCache.set(index, ref)\n }\n return ref\n }\n onUnmounted(() => {\n measureRefCache.clear()\n })\n\n const { columns, expandColumn } = columnConfig\n\n return () => {\n const { row } = props\n const _expandColumn = expandColumn.value\n\n let expandCell: JSX.Element | null = null\n if (_expandColumn) {\n const expandCtx = getCellCtx(row, _expandColumn)\n const cellSpan = tableProps.mergeCell?.(expandCtx)\n\n if (!cellSpan || (cellSpan.colspan && cellSpan.rowspan)) {\n const marginLeft = tableProps.tree ? row.depth * 14 : 0\n expandCell = (\n <UTabelCell\n cellClass={getCellClass(_expandColumn)}\n left={_expandColumn.style.left}\n right={_expandColumn.style.right}\n key={row.uid + _expandColumn.key}\n {...tableProps.mergeCell?.(expandCtx)}\n >\n {!row.isLeaf || (tableProps.expandable && !row.isExpandRow) ? (\n <UButton\n text\n class={expandToggleCls}\n type='primary'\n size='small'\n circle\n onClick={(e) => {\n e.stopPropagation()\n toggleTreeRowExpand(row)\n }}\n style={`margin-left: ${marginLeft}px`}\n >\n <UIcon>\n <ArrowRight />\n </UIcon>\n </UButton>\n ) : (\n <i class={expandSpaceCls} style={`margin-left: ${marginLeft}px`}></i>\n )}\n\n {getColumnSlotsNode(expandCtx)}\n </UTabelCell>\n )\n }\n }\n\n // A3:行 class 由 base + 3-bit 组合查找产出,避免 Vue 的 class 数组归一化开销。\n const mod = rowModCls(row)\n const rowCls = mod ? rowBaseCls + ' ' + mod : rowBaseCls\n\n return (\n <tr\n class={rowCls}\n onClick={(e) => handleRowClick(row, e)}\n ref={getMeasureRef(props.index)}\n key={row.uid}\n >\n {expandCell}\n\n {columns.value.map((column) => {\n const cellCtx = getCellCtx(row, column)\n const cellSpan = tableProps.mergeCell?.(cellCtx)\n if (cellSpan && (!cellSpan.colspan || !cellSpan.rowspan)) {\n return null\n }\n\n const cellNode = getColumnSlotsNode(cellCtx)\n\n return (\n <UTabelCell\n cellClass={getCellClass(column)}\n left={column.style.left}\n right={column.style.right}\n key={row.uid + column.key}\n // @ts-ignore\n onClick={(e) => handleCellClick(row, column, e)}\n {...cellSpan}\n >\n {cellNode}\n </UTabelCell>\n )\n })}\n </tr>\n )\n }\n }\n})\n\nexport const UExpandTableRow = defineComponent({\n name: 'ExpandTableRow',\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n setup(props) {\n const { getExpandRowSlotsNode, cls, measureElement, columnConfig } = inject(TableDIKey)!\n const { leafColumns } = columnConfig\n\n const rowBaseCls = cls.e('row')\n const cellCls = cls.e('cell')\n\n const measureRef = (el: unknown) => {\n measureElement(props.index, el as Element | null)\n }\n\n return () => {\n const { row } = props\n const node = getExpandRowSlotsNode({\n row,\n index: row.index,\n columns: leafColumns.value,\n rowData: row.data\n })\n return (\n <tr class={rowBaseCls} ref={measureRef}>\n <td colspan={leafColumns.value.length} class={cellCls}>\n {node}\n </td>\n </tr>\n )\n }\n }\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAWA,SAAA,QAAA,GAAA;CAAA,OAAA,OAAA,MAAA,cAAA,OAAA,UAAA,SAAA,KAAA,CAAA,MAAA,qBAAA,CAAA,QAAA,CAAA;AAAA;AASA,MAAM,gBAAmC;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAAmC;AAGrC,SAAS,UAAU,KAAwB;CACzC,MAAM,KAAK,IAAI,YAAY,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,WAAW,IAAI;CAChF,OAAO,cAAc;AACvB;AAEA,MAAa,YAAgE,gBAAgB;CAC3F,MAAM;CAEN,OAAO;EACL,KAAK;GAAE,MAAM;GAA2B,UAAU;EAAK;EACvD,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAK;CACxC;CAEA,MAAM,OAAO;EACX,MAAM,EACJ,KACA,cACA,oBACA,qBACA,YACA,gBACA,iBACA,YACA,gBACA,iBACE,OAAO,UAAU;EAIrB,MAAM,aAAa,IAAI,EAAE,KAAK;EAC9B,MAAM,kBAAkB,IAAI,EAAE,eAAe;EAC7C,MAAM,iBAAiB,IAAI,EAAE,cAAc;EAM3C,MAAM,kCAAkB,IAAI,IAAmC;EAC/D,MAAM,iBAAiB,UAA2C;GAChE,IAAI,MAAM,gBAAgB,IAAI,KAAK;GACnC,IAAI,QAAQ,KAAA,GAAW;IACrB,OAAO,OAAgB;KACrB,eAAe,OAAO,EAAoB;IAC5C;IACA,gBAAgB,IAAI,OAAO,GAAG;GAChC;GACA,OAAO;EACT;EACA,kBAAkB;GAChB,gBAAgB,MAAM;EACxB,CAAC;EAED,MAAM,EAAE,SAAS,iBAAiB;EAElC,aAAa;GACX,MAAM,EAAE,QAAQ;GAChB,MAAM,gBAAgB,aAAa;GAEnC,IAAI,aAAiC;GACrC,IAAI,eAAe;IACjB,MAAM,YAAY,WAAW,KAAK,aAAa;IAC/C,MAAM,WAAW,WAAW,YAAY,SAAS;IAEjD,IAAI,CAAC,YAAa,SAAS,WAAW,SAAS,SAAU;KACvD,MAAM,aAAa,WAAW,OAAO,IAAI,QAAQ,KAAK;KACtD,aAAU,YAAA,aAAA,WAAA;MAAA,aAEK,aAAa,aAAa;MAAC,QAChC,cAAc,MAAM;MAAI,SACvB,cAAc,MAAM;MAAK,OAC3B,IAAI,MAAM,cAAc;KAAG,GAC5B,WAAW,YAAY,SAAS,CAAC,GAAA,EAAA,eAAA,CAEpC,CAAC,IAAI,UAAW,WAAW,cAAc,CAAC,IAAI,cAAY,YAAA,aAAA;MAAA,QAAA;MAAA,SAGhD;MAAe,QAAA;MAAA,QAAA;MAAA,UAAA;MAAA,YAIZ,MAAM;OACd,EAAE,gBAAgB;OAClB,oBAAoB,GAAG;MACzB;MAAC,SACM,gBAAgB,WAAU;KAAI,GAAA,EAAA,eAAA,CAAA,YAAA,WAAA,MAAA,EAAA,eAAA,CAAA,YAAA,YAAA,MAAA,IAAA,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,IAAA,YAAA,KAAA;MAAA,SAO7B;MAAc,SAAS,gBAAgB,WAAU;KAAI,GAAA,IAAA,GAGhE,mBAAmB,SAAS,CAAC,EAAA,CAAA;IAGpC;GACF;GAGA,MAAM,MAAM,UAAU,GAAG;
|
|
1
|
+
{"version":3,"file":"table-row.js","names":[],"sources":["../../../src/components/table/table-row.tsx"],"sourcesContent":["import { ArrowRight } from '@veltra/icons/normal'\nimport { defineComponent, type DefineComponent } from 'vue'\nimport { inject, onUnmounted } from 'vue'\nimport type { JSX } from 'vue/jsx-runtime'\n\nimport type { TableRow as ITableRow } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\nimport { TableDIKey } from './di'\nimport UTabelCell from './table-cell.vue'\n\n/**\n * A3:行修饰类组合静态查找表。\n *\n * 位模式:bit2 = isCurrent, bit1 = checked, bit0 = expanded。\n * 与 `bem.is('...')` 对于 `'current' | 'checked' | 'expanded'` 的输出完全等价,\n * 直接从 index 读字符串,消除每行渲染期间的字符串拼接和 3 次 bem.is 调用。\n *\n * 放在模块顶层使所有 TableRow 实例共享一份引用(不会随 setup 重建)。\n */\nconst ROW_MOD_CLASS: readonly string[] = [\n '',\n 'is-expanded',\n 'is-checked',\n 'is-checked is-expanded',\n 'is-current',\n 'is-current is-expanded',\n 'is-current is-checked',\n 'is-current is-checked is-expanded'\n] as const\n\nfunction rowModCls(row: ITableRow): string {\n const i = (row.isCurrent ? 4 : 0) | (row.checked ? 2 : 0) | (row.expanded ? 1 : 0)\n return ROW_MOD_CLASS[i]!\n}\n\nexport const UTableRow: DefineComponent<{ row: ITableRow; index: number }> = defineComponent({\n name: 'TableRow',\n\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n\n setup(props) {\n const {\n cls,\n columnConfig,\n getColumnSlotsNode,\n toggleTreeRowExpand,\n getCellCtx,\n handleRowClick,\n handleCellClick,\n tableProps,\n measureElement,\n getCellClass\n } = inject(TableDIKey)!\n\n // A1:把 cls.e('row') / cls.e('expand-toggle') 等静态字符串提升到 setup 一次性计算,\n // 避免每次 render 重新走 `cls.e` 拼接。\n const rowBaseCls = cls.e('row')\n const expandToggleCls = cls.e('expand-toggle')\n const expandSpaceCls = cls.e('expand-space')\n\n // A2:measureRef 按 index 缓存闭包。\n // 行虚拟化下,同一 TableRow 实例的 props.index 大多稳定,但在虚拟化重排或展开行切换时\n // 仍会发生变化;把 (index) → refFn 缓存起来,既保证引用稳定(利于 Vue 的 ref diff),\n // 又避免在未来可能的\"同实例跨 index 复用\"情形下重复分配闭包。\n const measureRefCache = new Map<number, (el: unknown) => void>()\n const getMeasureRef = (index: number): ((el: unknown) => void) => {\n let ref = measureRefCache.get(index)\n if (ref === undefined) {\n ref = (el: unknown) => {\n measureElement(index, el as Element | null)\n }\n measureRefCache.set(index, ref)\n }\n return ref\n }\n onUnmounted(() => {\n measureRefCache.clear()\n })\n\n const { columns, expandColumn } = columnConfig\n\n return () => {\n const { row } = props\n const _expandColumn = expandColumn.value\n\n let expandCell: JSX.Element | null = null\n if (_expandColumn) {\n const expandCtx = getCellCtx(row, _expandColumn)\n const cellSpan = tableProps.mergeCell?.(expandCtx)\n\n if (!cellSpan || (cellSpan.colspan && cellSpan.rowspan)) {\n const marginLeft = tableProps.tree ? row.depth * 14 : 0\n expandCell = (\n <UTabelCell\n cellClass={getCellClass(_expandColumn)}\n left={_expandColumn.style.left}\n right={_expandColumn.style.right}\n key={row.uid + _expandColumn.key}\n {...tableProps.mergeCell?.(expandCtx)}\n >\n {!row.isLeaf || (tableProps.expandable && !row.isExpandRow) ? (\n <UButton\n text\n class={expandToggleCls}\n type='primary'\n size='small'\n circle\n onClick={(e) => {\n e.stopPropagation()\n toggleTreeRowExpand(row)\n }}\n style={`margin-left: ${marginLeft}px`}\n >\n <UIcon>\n <ArrowRight />\n </UIcon>\n </UButton>\n ) : (\n <i class={expandSpaceCls} style={`margin-left: ${marginLeft}px`}></i>\n )}\n\n {getColumnSlotsNode(expandCtx)}\n </UTabelCell>\n )\n }\n }\n\n // A3:行 class 由 base + 3-bit 组合查找产出,避免 Vue 的 class 数组归一化开销。\n const mod = rowModCls(row)\n const rowCls = mod ? rowBaseCls + ' ' + mod : rowBaseCls\n\n return (\n <tr\n class={rowCls}\n onClick={(e) => handleRowClick(row, e)}\n ref={getMeasureRef(props.index)}\n key={row.uid}\n >\n {expandCell}\n\n {columns.value.map((column) => {\n const cellCtx = getCellCtx(row, column)\n const cellSpan = tableProps.mergeCell?.(cellCtx)\n if (cellSpan && (!cellSpan.colspan || !cellSpan.rowspan)) {\n return null\n }\n\n const cellNode = getColumnSlotsNode(cellCtx)\n\n return (\n <UTabelCell\n cellClass={getCellClass(column)}\n left={column.style.left}\n right={column.style.right}\n key={row.uid + column.key}\n // @ts-ignore\n onClick={(e) => handleCellClick(row, column, e)}\n {...cellSpan}\n >\n {cellNode}\n </UTabelCell>\n )\n })}\n </tr>\n )\n }\n }\n})\n\nexport const UExpandTableRow = defineComponent({\n name: 'ExpandTableRow',\n props: {\n row: { type: Object as () => ITableRow, required: true },\n index: { type: Number, required: true }\n },\n setup(props) {\n const { getExpandRowSlotsNode, cls, measureElement, columnConfig } = inject(TableDIKey)!\n const { leafColumns } = columnConfig\n\n const rowBaseCls = cls.e('row')\n const cellCls = cls.e('cell')\n\n const measureRef = (el: unknown) => {\n measureElement(props.index, el as Element | null)\n }\n\n return () => {\n const { row } = props\n const node = getExpandRowSlotsNode({\n row,\n index: row.index,\n columns: leafColumns.value,\n rowData: row.data\n })\n return (\n <tr class={rowBaseCls} ref={measureRef}>\n <td colspan={leafColumns.value.length} class={cellCls}>\n {node}\n </td>\n </tr>\n )\n }\n }\n})\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","names":[],"sources":["../../../src/components/table/table.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"[\n cls.b,\n cls.m(size),\n bem.is('border', border),\n bem.is('all-expanded', allExpanded),\n bem.is('text-ellipsis', textEllipsis)\n ]\"\n ref=\"scrollRef\"\n :content-class=\"cls.e('content')\"\n @scroll=\"handleScroll\"\n >\n <table :class=\"cls.e('wrap')\">\n <colgroup ref=\"colgroupRef\">\n <col\n v-for=\"column of leafColumns\"\n :key=\"column.key\"\n :class=\"column.fixed\"\n :style=\"{\n width: withUnit(column.width, 'px'),\n minWidth: withUnit(column.minWidth, 'px')\n }\"\n />\n </colgroup>\n <UTableHead />\n\n <!--\n 虚拟滚动上占位:替代 tbody transform,避免 table-layout: fixed 下列宽抖动。\n 高度由 useVirtualizer 命令式写入 `style.height`,不经过模板响应式绑定,\n 因此滚动窗口变化不会引起表格模板重渲染。\n -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"beforeSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-body>\n <slot name=\"body\" :columns=\"leafColumns\" :rows=\"rows\" />\n\n <template #empty v-if=\"slots.empty\">\n <slot name=\"empty\" />\n </template>\n </u-table-body>\n\n <!-- 虚拟滚动下占位(高度由 useVirtualizer 命令式写入) -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"afterSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-foot ref=\"tableFoot\">\n <slot name=\"foot\" :columns=\"leafColumns\" :rows=\"rows\" />\n </u-table-foot>\n </table>\n\n <slot name=\"append\" />\n\n <div v-if=\"showResizeLine\" :class=\"cls.e('resize-line')\" ref=\"resizeLineRef\"></div>\n\n <!-- <u-tip v-if=\"textEllipsis\" ref=\"tip\"> </u-tip> -->\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { computed, provide, shallowRef, toRef, useTemplateRef, watch } from 'vue'\n\nimport type {\n TableProps,\n TableEmits,\n _TableExposed,\n TableColumnSlotsScope,\n ComponentSize,\n ScrollExposed,\n TableRowSlotsScope\n} from '../../types'\nimport { UScroll } from '../scroll'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\nimport type { TableRowNode } from './node/row'\nimport UTableBody from './table-body.vue'\nimport UTableFoot from './table-foot.vue'\n// import { UTip } from '../tip'\nimport UTableHead from './table-head'\nimport { useCheck } from './use-check'\nimport { useColResize } from './use-col-resize'\nimport { useColumns } from './use-columns'\nimport { useFixedColumns } from './use-fixed-columns'\nimport { useRows } from './use-rows'\nimport { useTable } from './use-table'\n\ndefineOptions({ name: 'UTable' })\n\nconst props = withDefaults(defineProps<TableProps>(), {\n tree: false,\n stripe: true,\n textOverflow: 'line-break',\n virtualThreshold: 80\n})\nconst emit = defineEmits<TableEmits>()\n\nconst slots = defineSlots<{\n [key: `column:${string}`]: (props: TableColumnSlotsScope) => any\n [key: `header:${string}`]: (props: { column: ColumnNode }) => any\n 'row:expand'?: (props: TableRowSlotsScope) => any\n foot?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n body?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n empty?: () => any\n append?: () => any\n}>()\n\nconst cls = bem('table')\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\n// 占位 tr 的 DOM 句柄;交给 useVirtualizer 直接命令式写 style.height。\nconst beforeSpacerRef = useTemplateRef<HTMLElement>('beforeSpacerRef')\nconst afterSpacerRef = useTemplateRef<HTMLElement>('afterSpacerRef')\n\n// 行(useRows / useFixedColumns 需要 isScrolling,而虚拟化 hook 又依赖 rows.length;\n// 先用中继占位,下方 isScrolling 到位后 watch 回灌)。\nconst isScrollingRelay = shallowRef(false)\n\nconst {\n rows,\n toggleTreeRowExpand,\n allExpanded,\n toggleAllTreeRowExpand,\n rowForest,\n handleRowClick,\n handleCellClick,\n getRowByData\n} = useRows({ props, emit, isScrolling: isScrollingRelay })\n\nconst { createCheckColumn, createSelectColumn, clearChecked, clearSelected, checkedRows } =\n useCheck({ size, props, rows, rowForest, emit, cls })\n\nconst columnConfig = useColumns({\n props,\n createCheckColumn,\n createSelectColumn,\n toggleAllTreeRowExpand,\n cls\n})\n\nconst { leafColumns } = columnConfig\n\nconst { handleScroll, leftFixed, rightFixed } = useFixedColumns()\n\nconst {\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass\n} = useTable({ props, cls, leftFixed, rightFixed })\n\nconst { showResizeLine, resizeLineRef, colgroupRef } = useColResize({ scrollRef, leafColumns })\n\nconst { virtualizer, items, isScrolling } = useVirtualizer({\n count: computed(() => rows.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n beforeEl: beforeSpacerRef,\n afterEl: afterSpacerRef,\n estimateSize: () => 41,\n // 注意:getItemKey 在构造期一次性写入底层 Virtualizer;闭包每次读的是当前 rows.value,\n // rows 引用整体替换后 key 仍有效(无需再 setOptions)。\n getItemKey: (i) => rows.value[i]?.uid ?? i\n})\n\nconst virtualEnabled = computed(() => {\n const t = props.virtualThreshold\n return t ? rows.value.length > t : true\n})\n\n// 把虚拟化 isScrolling 回灌到中继,供 useRows / useFixedColumns 读取。\nwatch(isScrolling, (v) => {\n isScrollingRelay.value = v\n})\n\n/**\n * E1:数据替换时的条件置顶。\n *\n * 旧实现无差别地 `scrollTo({ y: 0 })`,在「行内增删 / 排序 / 单行更新」等\n * 场景会把用户当前阅读位置跳走;仅在「翻页 / 显著数据集替换」时才需要复位。\n *\n * 判定阈值:|Δlen| / max(newLen, oldLen) ≥ 0.5,即行数变化量超过更大侧的一半时视为显著变化。\n * 选择 0.5 是因为典型的分页/搜索场景会带来 50% 以上的行数差(通常完全替换数据集),\n * 而行内追加 / 删除个位数通常只带来 <5% 的变化;两者区分度足够宽。\n */\nconst LENGTH_DELTA_RATIO_TO_RESET_SCROLL = 0.5\n\nwatch(\n () => props.data,\n (next, prev) => {\n const nextLen = next?.length ?? 0\n const prevLen = prev?.length ?? 0\n const denom = Math.max(nextLen, prevLen, 1)\n const ratio = Math.abs(nextLen - prevLen) / denom\n if (ratio >= LENGTH_DELTA_RATIO_TO_RESET_SCROLL) {\n scrollRef.value?.scrollTo({ y: 0 })\n }\n }\n)\n\n// const tipRef = useTemplateRef('tip')\n\nprovide(TableDIKey, {\n tableProps: props,\n tableSlots: slots,\n cls,\n rows,\n checkedRows,\n columnConfig,\n handleRowClick,\n handleCellClick,\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass,\n // tipRef,\n toggleTreeRowExpand,\n virtualList: items,\n virtualEnabled,\n measureElement: (index, el) => virtualizer.measureElement(index, el)\n})\n\nconst tableFootRef = useTemplateRef('tableFoot')\n\ndefineExpose<_TableExposed>({\n el: toRef(() => scrollRef.value?.el),\n clearChecked,\n clearSelected,\n getRowByData,\n getSummaryRow: () => tableFootRef.value!.getSummaryRow()\n})\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.js","names":[],"sources":["../../../src/components/table/table.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"[\n cls.b,\n cls.m(size),\n bem.is('border', border),\n bem.is('all-expanded', allExpanded),\n bem.is('text-ellipsis', textEllipsis)\n ]\"\n ref=\"scrollRef\"\n :content-class=\"cls.e('content')\"\n @scroll=\"handleScroll\"\n >\n <table :class=\"cls.e('wrap')\">\n <colgroup ref=\"colgroupRef\">\n <col\n v-for=\"column of leafColumns\"\n :key=\"column.key\"\n :class=\"column.fixed\"\n :style=\"{\n width: withUnit(column.width, 'px'),\n minWidth: withUnit(column.minWidth, 'px')\n }\"\n />\n </colgroup>\n <UTableHead />\n\n <!--\n 虚拟滚动上占位:替代 tbody transform,避免 table-layout: fixed 下列宽抖动。\n 高度由 useVirtualizer 命令式写入 `style.height`,不经过模板响应式绑定,\n 因此滚动窗口变化不会引起表格模板重渲染。\n -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"beforeSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-body>\n <slot name=\"body\" :columns=\"leafColumns\" :rows=\"rows\" />\n\n <template #empty v-if=\"slots.empty\">\n <slot name=\"empty\" />\n </template>\n </u-table-body>\n\n <!-- 虚拟滚动下占位(高度由 useVirtualizer 命令式写入) -->\n <tbody v-if=\"virtualEnabled\" aria-hidden=\"true\">\n <tr ref=\"afterSpacerRef\">\n <td :colspan=\"leafColumns.length\" style=\"padding: 0; border: none\"></td>\n </tr>\n </tbody>\n\n <u-table-foot ref=\"tableFoot\">\n <slot name=\"foot\" :columns=\"leafColumns\" :rows=\"rows\" />\n </u-table-foot>\n </table>\n\n <slot name=\"append\" />\n\n <div v-if=\"showResizeLine\" :class=\"cls.e('resize-line')\" ref=\"resizeLineRef\"></div>\n\n <!-- <u-tip v-if=\"textEllipsis\" ref=\"tip\"> </u-tip> -->\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { computed, provide, shallowRef, toRef, useTemplateRef, watch } from 'vue'\n\nimport type {\n TableProps,\n TableEmits,\n _TableExposed,\n TableColumnSlotsScope,\n ComponentSize,\n ScrollExposed,\n TableRowSlotsScope\n} from '../../types'\nimport { UScroll } from '../scroll'\nimport { TableDIKey } from './di'\nimport type { ColumnNode } from './node/col'\nimport type { TableRowNode } from './node/row'\nimport UTableBody from './table-body.vue'\nimport UTableFoot from './table-foot.vue'\n// import { UTip } from '../tip'\nimport UTableHead from './table-head'\nimport { useCheck } from './use-check'\nimport { useColResize } from './use-col-resize'\nimport { useColumns } from './use-columns'\nimport { useFixedColumns } from './use-fixed-columns'\nimport { useRows } from './use-rows'\nimport { useTable } from './use-table'\n\ndefineOptions({ name: 'UTable' })\n\nconst props = withDefaults(defineProps<TableProps>(), {\n tree: false,\n stripe: true,\n textOverflow: 'line-break',\n virtualThreshold: 80\n})\nconst emit = defineEmits<TableEmits>()\n\nconst slots = defineSlots<{\n [key: `column:${string}`]: (props: TableColumnSlotsScope) => any\n [key: `header:${string}`]: (props: { column: ColumnNode }) => any\n 'row:expand'?: (props: TableRowSlotsScope) => any\n foot?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n body?: (props: { columns: ColumnNode[]; rows: TableRowNode[] }) => any\n empty?: () => any\n append?: () => any\n}>()\n\nconst cls = bem('table')\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\n// 占位 tr 的 DOM 句柄;交给 useVirtualizer 直接命令式写 style.height。\nconst beforeSpacerRef = useTemplateRef<HTMLElement>('beforeSpacerRef')\nconst afterSpacerRef = useTemplateRef<HTMLElement>('afterSpacerRef')\n\n// 行(useRows / useFixedColumns 需要 isScrolling,而虚拟化 hook 又依赖 rows.length;\n// 先用中继占位,下方 isScrolling 到位后 watch 回灌)。\nconst isScrollingRelay = shallowRef(false)\n\nconst {\n rows,\n toggleTreeRowExpand,\n allExpanded,\n toggleAllTreeRowExpand,\n rowForest,\n handleRowClick,\n handleCellClick,\n getRowByData\n} = useRows({ props, emit, isScrolling: isScrollingRelay })\n\nconst { createCheckColumn, createSelectColumn, clearChecked, clearSelected, checkedRows } =\n useCheck({ size, props, rows, rowForest, emit, cls })\n\nconst columnConfig = useColumns({\n props,\n createCheckColumn,\n createSelectColumn,\n toggleAllTreeRowExpand,\n cls\n})\n\nconst { leafColumns } = columnConfig\n\nconst { handleScroll, leftFixed, rightFixed } = useFixedColumns()\n\nconst {\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass\n} = useTable({ props, cls, leftFixed, rightFixed })\n\nconst { showResizeLine, resizeLineRef, colgroupRef } = useColResize({ scrollRef, leafColumns })\n\nconst { virtualizer, items, isScrolling } = useVirtualizer({\n count: computed(() => rows.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n beforeEl: beforeSpacerRef,\n afterEl: afterSpacerRef,\n estimateSize: () => 41,\n // 注意:getItemKey 在构造期一次性写入底层 Virtualizer;闭包每次读的是当前 rows.value,\n // rows 引用整体替换后 key 仍有效(无需再 setOptions)。\n getItemKey: (i) => rows.value[i]?.uid ?? i\n})\n\nconst virtualEnabled = computed(() => {\n const t = props.virtualThreshold\n return t ? rows.value.length > t : true\n})\n\n// 把虚拟化 isScrolling 回灌到中继,供 useRows / useFixedColumns 读取。\nwatch(isScrolling, (v) => {\n isScrollingRelay.value = v\n})\n\n/**\n * E1:数据替换时的条件置顶。\n *\n * 旧实现无差别地 `scrollTo({ y: 0 })`,在「行内增删 / 排序 / 单行更新」等\n * 场景会把用户当前阅读位置跳走;仅在「翻页 / 显著数据集替换」时才需要复位。\n *\n * 判定阈值:|Δlen| / max(newLen, oldLen) ≥ 0.5,即行数变化量超过更大侧的一半时视为显著变化。\n * 选择 0.5 是因为典型的分页/搜索场景会带来 50% 以上的行数差(通常完全替换数据集),\n * 而行内追加 / 删除个位数通常只带来 <5% 的变化;两者区分度足够宽。\n */\nconst LENGTH_DELTA_RATIO_TO_RESET_SCROLL = 0.5\n\nwatch(\n () => props.data,\n (next, prev) => {\n const nextLen = next?.length ?? 0\n const prevLen = prev?.length ?? 0\n const denom = Math.max(nextLen, prevLen, 1)\n const ratio = Math.abs(nextLen - prevLen) / denom\n if (ratio >= LENGTH_DELTA_RATIO_TO_RESET_SCROLL) {\n scrollRef.value?.scrollTo({ y: 0 })\n }\n }\n)\n\n// const tipRef = useTemplateRef('tip')\n\nprovide(TableDIKey, {\n tableProps: props,\n tableSlots: slots,\n cls,\n rows,\n checkedRows,\n columnConfig,\n handleRowClick,\n handleCellClick,\n getColumnSlotsNode,\n getExpandRowSlotsNode,\n getHeaderSlotsNode,\n getCellClass,\n getCellCtx,\n getHeaderCellClass,\n // tipRef,\n toggleTreeRowExpand,\n virtualList: items,\n virtualEnabled,\n measureElement: (index, el) => virtualizer.measureElement(index, el)\n})\n\nconst tableFootRef = useTemplateRef('tableFoot')\n\ndefineExpose<_TableExposed>({\n el: toRef(() => scrollRef.value?.el),\n clearChecked,\n clearSelected,\n getRowByData,\n getSummaryRow: () => tableFootRef.value!.getSummaryRow()\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -144,11 +144,12 @@ function useCheck(options) {
|
|
|
144
144
|
}
|
|
145
145
|
function handleCheckRow(row, check) {
|
|
146
146
|
const cb = check ? (row) => checkedRows.value.add(row) : (row) => checkedRows.value.delete(row);
|
|
147
|
+
const childrenKey = typeof props.tree === "string" ? props.tree : "children";
|
|
147
148
|
dfs(row, (node) => {
|
|
148
149
|
const r = node;
|
|
149
150
|
r.checked = check;
|
|
150
151
|
cb(r);
|
|
151
|
-
},
|
|
152
|
+
}, childrenKey);
|
|
152
153
|
triggerCheckedRows();
|
|
153
154
|
}
|
|
154
155
|
const getCheckboxColumnWidth = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-check.js","names":["UCheckbox"],"sources":["../../../src/components/table/use-check.ts"],"sourcesContent":["import { dfs, o, type Forest } from '@cat-kit/core'\nimport type { BEM } from '@veltra/utils'\nimport {\n computed,\n createTextVNode,\n createVNode,\n nextTick,\n shallowRef,\n toRaw,\n triggerRef,\n watch,\n type ComputedRef,\n type ShallowRef\n} from 'vue'\n\nimport type { TableRow, TableColumn, TableEmits, TableProps, ComponentSize } from '../../types'\nimport { UCheckbox } from '../checkbox'\n\ninterface Options {\n rows: ShallowRef<TableRow[] | undefined>\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n props: TableProps\n emit: TableEmits<any>\n size: ComputedRef<ComponentSize>\n cls: BEM<'table'>\n}\n\ninterface UseCheckReturned {\n checkedRows: ShallowRef<Set<TableRow>>\n clearChecked: () => void\n clearSelected: () => void\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n}\n\nexport function useCheck(options: Options): UseCheckReturned {\n const { rows, rowForest, props, emit, size, cls } = options\n\n const checkedRows = shallowRef(new Set<TableRow>())\n const selectedRow = shallowRef<TableRow>()\n\n /** 触发checkedRows的更新 */\n function triggerCheckedRows() {\n triggerRef(checkedRows)\n }\n\n function clearChecked() {\n checkedRows.value.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n triggerCheckedRows()\n }\n\n function clearSelected() {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n selectedRow.value = undefined\n }\n }\n\n watch([() => props.checkable, () => props.selectable, () => rows.value], () => {\n clearChecked()\n clearSelected()\n })\n\n watch(selectedRow, (selectedRow) => {\n if (changedByModel) return\n changedByEvent = true\n emit('update:selected', selectedRow?.data ? toRaw(selectedRow.data) : undefined)\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let changedByEvent = false\n let changedByModel = false\n watch(checkedRows, (checkedRows) => {\n if (changedByModel) return\n changedByEvent = true\n emit(\n 'update:checked',\n Array.from(checkedRows).map((row) => toRaw(row.data))\n )\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let dicts: Map<string | number, TableRow> | undefined = undefined\n\n // 设置uid -> row 字典,以便于数据重复使用\n function setDicts() {\n if (dicts || !rows.value || !props.rowKey) return\n\n let mapEntries: [string | number, TableRow][] = []\n let i = 0\n while (i < rows.value.length) {\n const row = rows.value[i]!\n\n mapEntries.push([row.uid, row])\n i++\n }\n dicts = new Map(mapEntries)\n }\n\n watch(rows, () => {\n dicts = undefined\n })\n\n watch(\n [() => props.checked, () => props.rowKey, () => props.checkable, rows],\n ([checked, rowKey, checkable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !checkable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典\n rows !== oRows && setDicts()\n\n clearChecked()\n\n checked?.forEach((item) => {\n const uid = o(item).get(rowKey)\n if (uid === undefined || uid === null) return\n const row = dicts?.get(uid as string | number)\n if (!row) return\n\n row.checked = true\n checkedRows.value.add(row)\n })\n triggerCheckedRows()\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n watch(\n [() => props.selected, () => props.rowKey, () => props.selectable, rows],\n ([selected, rowKey, selectable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !selectable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典(懒建立)\n rows !== oRows && setDicts()\n\n if (selected) {\n const uid = o(selected).get(rowKey)\n const row =\n uid === undefined || uid === null ? undefined : dicts?.get(uid as string | number)\n if (row) {\n row.checked = true\n selectedRow.value = row\n }\n } else {\n clearSelected()\n }\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n const allChecked = computed(() => {\n const rowSize = props.tree ? rowForest.value?.size : rows.value?.length\n return !!rowSize && rowSize === checkedRows.value.size\n })\n\n function handleCheckAllTree(check: boolean) {\n if (check) {\n rowForest.value?.dfs((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rowForest.value?.dfs((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAllRows(check: boolean) {\n if (check) {\n rows.value?.forEach((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rows.value?.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAll(check: boolean) {\n if (props.tree) {\n handleCheckAllTree(check as boolean)\n } else {\n handleCheckAllRows(check as boolean)\n }\n }\n\n function handleCheckRow(row: TableRow, check: boolean) {\n const cb = check\n ? (row: TableRow) => checkedRows.value.add(row)\n : (row: TableRow) => checkedRows.value.delete(row)\n\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n dfs(\n row as unknown as Record<string, unknown>,\n (node) => {\n const r = node as unknown as TableRow\n r.checked = check\n cb(r)\n },\n childrenKey\n )\n\n triggerCheckedRows()\n }\n\n const getCheckboxColumnWidth = () => {\n return size.value === 'large' ? 80 : 60\n }\n\n const checkboxClass = cls.e('checkbox')\n const checkboxClick = (e: Event) => e.stopPropagation()\n\n function createCheckColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_check_column__',\n name: '',\n width,\n minWidth: width,\n align: 'center',\n fixed: 'left',\n resizable: false,\n nameRender() {\n const checkboxNode = createVNode(UCheckbox, {\n modelValue: allChecked.value,\n 'onUpdate:modelValue': handleCheckAll\n })\n if (!props.tree) {\n return checkboxNode\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [checkboxNode]\n },\n render(ctx) {\n const { row } = ctx\n\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleCheckRow(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n function handleSelect(row: TableRow, check: boolean) {\n row.checked = check\n if (check) {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n }\n selectedRow.value = row\n } else {\n selectedRow.value = undefined\n }\n }\n\n function createSelectColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_select_column__',\n name: '单选',\n minWidth: width,\n resizable: false,\n width,\n align: 'center',\n fixed: 'left',\n nameRender(_ctx) {\n if (!props.tree) {\n return '单选'\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [createTextVNode('单选')]\n },\n\n render({ row }) {\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleSelect(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n return { checkedRows, createCheckColumn, createSelectColumn, clearChecked, clearSelected }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-check.js","names":["UCheckbox"],"sources":["../../../src/components/table/use-check.ts"],"sourcesContent":["import { dfs, o, type Forest } from '@cat-kit/core'\nimport type { BEM } from '@veltra/utils'\nimport {\n computed,\n createTextVNode,\n createVNode,\n nextTick,\n shallowRef,\n toRaw,\n triggerRef,\n watch,\n type ComputedRef,\n type ShallowRef\n} from 'vue'\n\nimport type { TableRow, TableColumn, TableEmits, TableProps, ComponentSize } from '../../types'\nimport { UCheckbox } from '../checkbox'\n\ninterface Options {\n rows: ShallowRef<TableRow[] | undefined>\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n props: TableProps\n emit: TableEmits<any>\n size: ComputedRef<ComponentSize>\n cls: BEM<'table'>\n}\n\ninterface UseCheckReturned {\n checkedRows: ShallowRef<Set<TableRow>>\n clearChecked: () => void\n clearSelected: () => void\n createCheckColumn: () => TableColumn\n createSelectColumn: () => TableColumn\n}\n\nexport function useCheck(options: Options): UseCheckReturned {\n const { rows, rowForest, props, emit, size, cls } = options\n\n const checkedRows = shallowRef(new Set<TableRow>())\n const selectedRow = shallowRef<TableRow>()\n\n /** 触发checkedRows的更新 */\n function triggerCheckedRows() {\n triggerRef(checkedRows)\n }\n\n function clearChecked() {\n checkedRows.value.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n triggerCheckedRows()\n }\n\n function clearSelected() {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n selectedRow.value = undefined\n }\n }\n\n watch([() => props.checkable, () => props.selectable, () => rows.value], () => {\n clearChecked()\n clearSelected()\n })\n\n watch(selectedRow, (selectedRow) => {\n if (changedByModel) return\n changedByEvent = true\n emit('update:selected', selectedRow?.data ? toRaw(selectedRow.data) : undefined)\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let changedByEvent = false\n let changedByModel = false\n watch(checkedRows, (checkedRows) => {\n if (changedByModel) return\n changedByEvent = true\n emit(\n 'update:checked',\n Array.from(checkedRows).map((row) => toRaw(row.data))\n )\n nextTick(() => {\n changedByEvent = false\n })\n })\n\n let dicts: Map<string | number, TableRow> | undefined = undefined\n\n // 设置uid -> row 字典,以便于数据重复使用\n function setDicts() {\n if (dicts || !rows.value || !props.rowKey) return\n\n let mapEntries: [string | number, TableRow][] = []\n let i = 0\n while (i < rows.value.length) {\n const row = rows.value[i]!\n\n mapEntries.push([row.uid, row])\n i++\n }\n dicts = new Map(mapEntries)\n }\n\n watch(rows, () => {\n dicts = undefined\n })\n\n watch(\n [() => props.checked, () => props.rowKey, () => props.checkable, rows],\n ([checked, rowKey, checkable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !checkable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典\n rows !== oRows && setDicts()\n\n clearChecked()\n\n checked?.forEach((item) => {\n const uid = o(item).get(rowKey)\n if (uid === undefined || uid === null) return\n const row = dicts?.get(uid as string | number)\n if (!row) return\n\n row.checked = true\n checkedRows.value.add(row)\n })\n triggerCheckedRows()\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n watch(\n [() => props.selected, () => props.rowKey, () => props.selectable, rows],\n ([selected, rowKey, selectable, rows], [_, __, ___, oRows]) => {\n if (changedByEvent || !selectable || !rowKey) return\n\n changedByModel = true\n\n // 如果没有字典,先建立字典(懒建立)\n rows !== oRows && setDicts()\n\n if (selected) {\n const uid = o(selected).get(rowKey)\n const row =\n uid === undefined || uid === null ? undefined : dicts?.get(uid as string | number)\n if (row) {\n row.checked = true\n selectedRow.value = row\n }\n } else {\n clearSelected()\n }\n\n nextTick(() => {\n changedByModel = false\n })\n },\n { immediate: true }\n )\n\n const allChecked = computed(() => {\n const rowSize = props.tree ? rowForest.value?.size : rows.value?.length\n return !!rowSize && rowSize === checkedRows.value.size\n })\n\n function handleCheckAllTree(check: boolean) {\n if (check) {\n rowForest.value?.dfs((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rowForest.value?.dfs((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAllRows(check: boolean) {\n if (check) {\n rows.value?.forEach((row) => {\n row.checked = true\n checkedRows.value.add(row)\n })\n } else {\n rows.value?.forEach((row) => {\n row.checked = false\n })\n checkedRows.value.clear()\n }\n triggerCheckedRows()\n }\n\n function handleCheckAll(check: boolean) {\n if (props.tree) {\n handleCheckAllTree(check as boolean)\n } else {\n handleCheckAllRows(check as boolean)\n }\n }\n\n function handleCheckRow(row: TableRow, check: boolean) {\n const cb = check\n ? (row: TableRow) => checkedRows.value.add(row)\n : (row: TableRow) => checkedRows.value.delete(row)\n\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n dfs(\n row as unknown as Record<string, unknown>,\n (node) => {\n const r = node as unknown as TableRow\n r.checked = check\n cb(r)\n },\n childrenKey\n )\n\n triggerCheckedRows()\n }\n\n const getCheckboxColumnWidth = () => {\n return size.value === 'large' ? 80 : 60\n }\n\n const checkboxClass = cls.e('checkbox')\n const checkboxClick = (e: Event) => e.stopPropagation()\n\n function createCheckColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_check_column__',\n name: '',\n width,\n minWidth: width,\n align: 'center',\n fixed: 'left',\n resizable: false,\n nameRender() {\n const checkboxNode = createVNode(UCheckbox, {\n modelValue: allChecked.value,\n 'onUpdate:modelValue': handleCheckAll\n })\n if (!props.tree) {\n return checkboxNode\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [checkboxNode]\n },\n render(ctx) {\n const { row } = ctx\n\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleCheckRow(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n function handleSelect(row: TableRow, check: boolean) {\n row.checked = check\n if (check) {\n if (selectedRow.value) {\n selectedRow.value.checked = false\n }\n selectedRow.value = row\n } else {\n selectedRow.value = undefined\n }\n }\n\n function createSelectColumn(): TableColumn {\n const width = getCheckboxColumnWidth()\n return {\n key: '__is_select_column__',\n name: '单选',\n minWidth: width,\n resizable: false,\n width,\n align: 'center',\n fixed: 'left',\n nameRender(_ctx) {\n if (!props.tree) {\n return '单选'\n }\n\n // const expandNode = createVNode('i', {\n // text: true,\n // class: cls.e('expand-space')\n // })\n return [createTextVNode('单选')]\n },\n\n render({ row }) {\n // @ts-ignore\n return createVNode(UCheckbox, {\n class: checkboxClass,\n modelValue: row.checked,\n 'onUpdate:modelValue': (val: boolean) => {\n handleSelect(row, val)\n },\n onClick: checkboxClick\n })\n }\n }\n }\n\n return { checkedRows, createCheckColumn, createSelectColumn, clearChecked, clearSelected }\n}\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { TableColumn } from "../../types/table.js";
|
|
|
2
2
|
import "../../types/index.js";
|
|
3
3
|
import "./node/col.js";
|
|
4
4
|
import { ComputedRef, ShallowRef } from "vue";
|
|
5
|
-
import "@veltra/utils";
|
|
5
|
+
import { BEM } from "@veltra/utils";
|
|
6
6
|
//#region src/components/table/use-columns.d.ts
|
|
7
7
|
/**
|
|
8
8
|
* 定义表格列
|
|
@@ -76,9 +76,10 @@ function useRows(options) {
|
|
|
76
76
|
/** 处理树形森林结构 */
|
|
77
77
|
function getRowForest(data) {
|
|
78
78
|
tempRowDicts = /* @__PURE__ */ new WeakMap();
|
|
79
|
+
const childrenKey = typeof props.tree === "string" ? props.tree : "children";
|
|
79
80
|
const ret = new Forest({
|
|
80
81
|
data,
|
|
81
|
-
childrenKey
|
|
82
|
+
childrenKey,
|
|
82
83
|
createNode(val, index, depth, _forest, parent) {
|
|
83
84
|
const row = createRow(val, index, depth, parent);
|
|
84
85
|
if (props.defaultExpandAll) row.expanded = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-rows.js","names":["useModel"],"sources":["../../../src/components/table/use-rows.ts"],"sourcesContent":["import { Forest, o } from '@cat-kit/core'\nimport { useModel } from '@veltra/compositions'\nimport { shallowRef, watch, type Ref, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableEmits, TableProps, TableRow } from '../../types'\nimport { TableRowNode } from './node/row'\n\ninterface Options {\n props: TableProps\n emit: TableEmits\n /**\n * D2:滚动中 (`true`) 跳过 `currentRow` 高亮写入。\n *\n * 行点击处理会通过 `currentRow` watcher 把 `isCurrent` 切换到新行 / 旧行上,\n * 触发对应 `<tr>` 的 class 重绘。在滚动期间 (移动端/触控板惯性滚动常见)\n * 意外点击不应改变高亮,因此直接跳过;滚动结束后的正常点击仍会生效。\n */\n isScrolling?: Ref<boolean>\n}\n\ninterface UseRowsReturned {\n /** 所有的行森林(树形数据) */\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n /** 当前可见的展平行列表 */\n rows: ShallowRef<TableRowNode[]>\n /** 切换树形行节点的展开/折叠 */\n toggleTreeRowExpand: (node: TableRow) => void\n /** 是否全部展开 */\n allExpanded: ShallowRef<boolean>\n /** 切换全部展开/折叠 */\n toggleAllTreeRowExpand: () => void\n /** 行点击处理 */\n handleRowClick: (row: TableRow, e: MouseEvent) => void\n /** 单元格点击处理 */\n handleCellClick: (row: TableRow, column: TableColumn, e: MouseEvent) => void\n /** 根据原始数据对象获取对应的 TableRow */\n getRowByData: (data: Record<string, any>) => TableRow | undefined\n}\n\nexport function useRows(options: Options): UseRowsReturned {\n const { props, emit, isScrolling } = options\n\n // --- 状态定义 ---\n\n /** 所有可见的行 */\n const rows = shallowRef<TableRowNode[]>([])\n /** 数据行, 不包括展开和折叠的行 */\n const dataRows = shallowRef<TableRowNode[]>([])\n /** 行森林(数据结构树) */\n const rowForest = shallowRef<Forest<Record<string, unknown>, any>>()\n /** 树形节点是否全部展开 */\n const allExpanded = shallowRef(props.defaultExpandAll ?? false)\n\n /** 当前高亮的行 */\n const currentRow = useModel({\n props,\n emit,\n propName: 'current',\n shallow: true,\n local: () => !!props.highlightCurrent\n })\n\n // --- 行字典维护 (性能优化) ---\n\n /**\n * 用于优化增删改时的性能。\n * 原理:Vue 的组件在属性发生改变时会重新渲染,通过 WeakMap 缓存 data -> TableRow 的映射,\n * 可以在数据更新时复用已有的 TableRowNode 实例,避免重复创建和 DOM 抖动。\n */\n let rowDicts = new WeakMap<Record<string, any>, TableRowNode>()\n let tempRowDicts: null | WeakMap<Record<string, any>, TableRowNode> = null\n let uidSeed = 0\n\n /** 获取行唯一标识 */\n const getRowUID = props.rowKey\n ? (rowData: Record<string, any>) => rowData && o(rowData).get(props.rowKey!)\n : () => uidSeed++\n\n /** 创建或复用 TableRow 实例 */\n const createRow = (\n data: Record<string, any>,\n index: number,\n depth = 0,\n parent?: TableRowNode\n ) => {\n const existRow = data ? rowDicts.get(data) : undefined\n if (existRow) {\n existRow.index = index\n existRow.depth = depth\n existRow.parent = parent\n return existRow\n }\n return new TableRowNode({ data, index, depth, parent, uid: getRowUID(data) })\n }\n\n // --- 行处理逻辑 ---\n\n /** 处理常规扁平列表 */\n function getDataRows(data: Record<string, any>[]): TableRowNode[] {\n let i = data.length\n const result = Array.from({ length: i }) as TableRowNode[]\n tempRowDicts = new WeakMap()\n\n while (i--) {\n const dataItem = data[i]!\n const row = createRow(dataItem, i)\n result[i] = row\n tempRowDicts.set(dataItem, row)\n }\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return result\n }\n\n function expandDataRows(): void {\n const result: TableRowNode[] = []\n let i = -1\n while (++i < dataRows.value.length) {\n const row = dataRows.value[i]!\n result.push(row)\n if (row.expanded) {\n result.push(row.copy())\n }\n }\n rows.value = result\n }\n\n /** 处理树形森林结构 */\n function getRowForest(data: Record<string, any>[]): Forest<Record<string, unknown>, any> {\n tempRowDicts = new WeakMap()\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n const ret = new Forest<Record<string, unknown>, any>({\n data,\n childrenKey,\n createNode(val, index, depth, _forest, parent) {\n const row = createRow(val, index, depth, parent)\n if (props.defaultExpandAll) {\n row.expanded = true\n }\n val && tempRowDicts!.set(val, row)\n return row\n }\n })\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return ret\n }\n\n /** 展平树形结构为可见行列表 */\n function updateFlattedRows(): void {\n if (!rowForest.value) return\n rows.value = rowForest.value.flattenVisible((n) => n.expanded)\n }\n\n // --- 副作用监听 ---\n\n // 监听当前行切换,维护 isCurrent 状态\n watch(\n () => currentRow.value,\n (row, oldRow) => {\n if (oldRow) oldRow.isCurrent = false\n if (row) row.isCurrent = true\n }\n )\n\n // 同步状态给外部\n watch(rows, (rows) => emit('update:rows', rows))\n watch(rowForest, (forest) => emit('update:forest', forest))\n\n // 核心:监听原始数据变化,重新构建行列表或树\n watch(\n [() => props.data, () => props.tree, () => props.defaultExpandAll],\n ([data, tree]) => {\n if (!data?.length) {\n rows.value = []\n rowDicts = new WeakMap()\n rowForest.value = undefined\n return\n }\n\n if (!tree) {\n rowForest.value = undefined\n dataRows.value = getDataRows(data)\n rows.value = dataRows.value\n } else {\n dataRows.value = []\n rowForest.value = getRowForest(data)\n updateFlattedRows()\n }\n },\n { immediate: true }\n )\n\n // --- 交互方法 ---\n\n function toggleTreeRowExpand(node: TableRow): void {\n node.expanded = !node.expanded\n\n if (props.tree) {\n return updateFlattedRows()\n }\n if (props.expandable) {\n expandDataRows()\n }\n }\n\n function toggleAllTreeRowExpand(): void {\n allExpanded.value = !allExpanded.value\n if (props.tree) {\n rowForest.value?.dfs((node) => {\n node.expanded = allExpanded.value\n })\n updateFlattedRows()\n return\n }\n if (props.expandable) {\n dataRows.value.forEach((row) => {\n row.expanded = allExpanded.value\n })\n expandDataRows()\n return\n }\n }\n\n function handleRowClick(row: TableRow, e: MouseEvent): void {\n // D2:滚动中的点击(多为惯性滚动误触)不应改变 currentRow 高亮。\n if (!isScrolling?.value) {\n currentRow.value = currentRow.value === row ? undefined : row\n }\n emit('row-click', row, e)\n }\n\n function handleCellClick(row: TableRow, column: TableColumn, e: MouseEvent): void {\n emit('cell-click', row, column, e)\n }\n\n function getRowByData(data: Record<string, any>): TableRow | undefined {\n return rowDicts.get(data)\n }\n\n return {\n rowForest,\n rows,\n allExpanded,\n toggleTreeRowExpand,\n toggleAllTreeRowExpand,\n handleRowClick,\n handleCellClick,\n getRowByData\n }\n}\n"],"mappings":";;;;;AAuCA,SAAgB,QAAQ,SAAmC;CACzD,MAAM,EAAE,OAAO,MAAM,gBAAgB;;CAKrC,MAAM,OAAO,WAA2B,CAAC,CAAC;;CAE1C,MAAM,WAAW,WAA2B,CAAC,CAAC;;CAE9C,MAAM,YAAY,WAAiD;;CAEnE,MAAM,cAAc,WAAW,MAAM,oBAAoB,KAAK;;CAG9D,MAAM,aAAaA,WAAS;EAC1B;EACA;EACA,UAAU;EACV,SAAS;EACT,aAAa,CAAC,CAAC,MAAM;CACvB,CAAC;;;;;;CASD,IAAI,2BAAW,IAAI,QAA2C;CAC9D,IAAI,eAAkE;CACtE,IAAI,UAAU;;CAGd,MAAM,YAAY,MAAM,UACnB,YAAiC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,MAAO,UACnE;;CAGV,MAAM,aACJ,MACA,OACA,QAAQ,GACR,WACG;EACH,MAAM,WAAW,OAAO,SAAS,IAAI,IAAI,IAAI,KAAA;EAC7C,IAAI,UAAU;GACZ,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,SAAS,SAAS;GAClB,OAAO;EACT;EACA,OAAO,IAAI,aAAa;GAAE;GAAM;GAAO;GAAO;GAAQ,KAAK,UAAU,IAAI;EAAE,CAAC;CAC9E;;CAKA,SAAS,YAAY,MAA6C;EAChE,IAAI,IAAI,KAAK;EACb,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC;EACvC,+BAAe,IAAI,QAAQ;EAE3B,OAAO,KAAK;GACV,MAAM,WAAW,KAAK;GACtB,MAAM,MAAM,UAAU,UAAU,CAAC;GACjC,OAAO,KAAK;GACZ,aAAa,IAAI,UAAU,GAAG;EAChC;EAEA,WAAW;EACX,eAAe;EACf,OAAO;CACT;CAEA,SAAS,iBAAuB;EAC9B,MAAM,SAAyB,CAAC;EAChC,IAAI,IAAI;EACR,OAAO,EAAE,IAAI,SAAS,MAAM,QAAQ;GAClC,MAAM,MAAM,SAAS,MAAM;GAC3B,OAAO,KAAK,GAAG;GACf,IAAI,IAAI,UACN,OAAO,KAAK,IAAI,KAAK,CAAC;EAE1B;EACA,KAAK,QAAQ;CACf;;CAGA,SAAS,aAAa,MAAmE;EACvF,+BAAe,IAAI,QAAQ;
|
|
1
|
+
{"version":3,"file":"use-rows.js","names":["useModel"],"sources":["../../../src/components/table/use-rows.ts"],"sourcesContent":["import { Forest, o } from '@cat-kit/core'\nimport { useModel } from '@veltra/compositions'\nimport { shallowRef, watch, type Ref, type ShallowRef } from 'vue'\n\nimport type { TableColumn, TableEmits, TableProps, TableRow } from '../../types'\nimport { TableRowNode } from './node/row'\n\ninterface Options {\n props: TableProps\n emit: TableEmits\n /**\n * D2:滚动中 (`true`) 跳过 `currentRow` 高亮写入。\n *\n * 行点击处理会通过 `currentRow` watcher 把 `isCurrent` 切换到新行 / 旧行上,\n * 触发对应 `<tr>` 的 class 重绘。在滚动期间 (移动端/触控板惯性滚动常见)\n * 意外点击不应改变高亮,因此直接跳过;滚动结束后的正常点击仍会生效。\n */\n isScrolling?: Ref<boolean>\n}\n\ninterface UseRowsReturned {\n /** 所有的行森林(树形数据) */\n rowForest: ShallowRef<Forest<Record<string, unknown>, any> | undefined>\n /** 当前可见的展平行列表 */\n rows: ShallowRef<TableRowNode[]>\n /** 切换树形行节点的展开/折叠 */\n toggleTreeRowExpand: (node: TableRow) => void\n /** 是否全部展开 */\n allExpanded: ShallowRef<boolean>\n /** 切换全部展开/折叠 */\n toggleAllTreeRowExpand: () => void\n /** 行点击处理 */\n handleRowClick: (row: TableRow, e: MouseEvent) => void\n /** 单元格点击处理 */\n handleCellClick: (row: TableRow, column: TableColumn, e: MouseEvent) => void\n /** 根据原始数据对象获取对应的 TableRow */\n getRowByData: (data: Record<string, any>) => TableRow | undefined\n}\n\nexport function useRows(options: Options): UseRowsReturned {\n const { props, emit, isScrolling } = options\n\n // --- 状态定义 ---\n\n /** 所有可见的行 */\n const rows = shallowRef<TableRowNode[]>([])\n /** 数据行, 不包括展开和折叠的行 */\n const dataRows = shallowRef<TableRowNode[]>([])\n /** 行森林(数据结构树) */\n const rowForest = shallowRef<Forest<Record<string, unknown>, any>>()\n /** 树形节点是否全部展开 */\n const allExpanded = shallowRef(props.defaultExpandAll ?? false)\n\n /** 当前高亮的行 */\n const currentRow = useModel({\n props,\n emit,\n propName: 'current',\n shallow: true,\n local: () => !!props.highlightCurrent\n })\n\n // --- 行字典维护 (性能优化) ---\n\n /**\n * 用于优化增删改时的性能。\n * 原理:Vue 的组件在属性发生改变时会重新渲染,通过 WeakMap 缓存 data -> TableRow 的映射,\n * 可以在数据更新时复用已有的 TableRowNode 实例,避免重复创建和 DOM 抖动。\n */\n let rowDicts = new WeakMap<Record<string, any>, TableRowNode>()\n let tempRowDicts: null | WeakMap<Record<string, any>, TableRowNode> = null\n let uidSeed = 0\n\n /** 获取行唯一标识 */\n const getRowUID = props.rowKey\n ? (rowData: Record<string, any>) => rowData && o(rowData).get(props.rowKey!)\n : () => uidSeed++\n\n /** 创建或复用 TableRow 实例 */\n const createRow = (\n data: Record<string, any>,\n index: number,\n depth = 0,\n parent?: TableRowNode\n ) => {\n const existRow = data ? rowDicts.get(data) : undefined\n if (existRow) {\n existRow.index = index\n existRow.depth = depth\n existRow.parent = parent\n return existRow\n }\n return new TableRowNode({ data, index, depth, parent, uid: getRowUID(data) })\n }\n\n // --- 行处理逻辑 ---\n\n /** 处理常规扁平列表 */\n function getDataRows(data: Record<string, any>[]): TableRowNode[] {\n let i = data.length\n const result = Array.from({ length: i }) as TableRowNode[]\n tempRowDicts = new WeakMap()\n\n while (i--) {\n const dataItem = data[i]!\n const row = createRow(dataItem, i)\n result[i] = row\n tempRowDicts.set(dataItem, row)\n }\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return result\n }\n\n function expandDataRows(): void {\n const result: TableRowNode[] = []\n let i = -1\n while (++i < dataRows.value.length) {\n const row = dataRows.value[i]!\n result.push(row)\n if (row.expanded) {\n result.push(row.copy())\n }\n }\n rows.value = result\n }\n\n /** 处理树形森林结构 */\n function getRowForest(data: Record<string, any>[]): Forest<Record<string, unknown>, any> {\n tempRowDicts = new WeakMap()\n const childrenKey = typeof props.tree === 'string' ? props.tree : 'children'\n const ret = new Forest<Record<string, unknown>, any>({\n data,\n childrenKey,\n createNode(val, index, depth, _forest, parent) {\n const row = createRow(val, index, depth, parent)\n if (props.defaultExpandAll) {\n row.expanded = true\n }\n val && tempRowDicts!.set(val, row)\n return row\n }\n })\n\n rowDicts = tempRowDicts\n tempRowDicts = null\n return ret\n }\n\n /** 展平树形结构为可见行列表 */\n function updateFlattedRows(): void {\n if (!rowForest.value) return\n rows.value = rowForest.value.flattenVisible((n) => n.expanded)\n }\n\n // --- 副作用监听 ---\n\n // 监听当前行切换,维护 isCurrent 状态\n watch(\n () => currentRow.value,\n (row, oldRow) => {\n if (oldRow) oldRow.isCurrent = false\n if (row) row.isCurrent = true\n }\n )\n\n // 同步状态给外部\n watch(rows, (rows) => emit('update:rows', rows))\n watch(rowForest, (forest) => emit('update:forest', forest))\n\n // 核心:监听原始数据变化,重新构建行列表或树\n watch(\n [() => props.data, () => props.tree, () => props.defaultExpandAll],\n ([data, tree]) => {\n if (!data?.length) {\n rows.value = []\n rowDicts = new WeakMap()\n rowForest.value = undefined\n return\n }\n\n if (!tree) {\n rowForest.value = undefined\n dataRows.value = getDataRows(data)\n rows.value = dataRows.value\n } else {\n dataRows.value = []\n rowForest.value = getRowForest(data)\n updateFlattedRows()\n }\n },\n { immediate: true }\n )\n\n // --- 交互方法 ---\n\n function toggleTreeRowExpand(node: TableRow): void {\n node.expanded = !node.expanded\n\n if (props.tree) {\n return updateFlattedRows()\n }\n if (props.expandable) {\n expandDataRows()\n }\n }\n\n function toggleAllTreeRowExpand(): void {\n allExpanded.value = !allExpanded.value\n if (props.tree) {\n rowForest.value?.dfs((node) => {\n node.expanded = allExpanded.value\n })\n updateFlattedRows()\n return\n }\n if (props.expandable) {\n dataRows.value.forEach((row) => {\n row.expanded = allExpanded.value\n })\n expandDataRows()\n return\n }\n }\n\n function handleRowClick(row: TableRow, e: MouseEvent): void {\n // D2:滚动中的点击(多为惯性滚动误触)不应改变 currentRow 高亮。\n if (!isScrolling?.value) {\n currentRow.value = currentRow.value === row ? undefined : row\n }\n emit('row-click', row, e)\n }\n\n function handleCellClick(row: TableRow, column: TableColumn, e: MouseEvent): void {\n emit('cell-click', row, column, e)\n }\n\n function getRowByData(data: Record<string, any>): TableRow | undefined {\n return rowDicts.get(data)\n }\n\n return {\n rowForest,\n rows,\n allExpanded,\n toggleTreeRowExpand,\n toggleAllTreeRowExpand,\n handleRowClick,\n handleCellClick,\n getRowByData\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-editor.js","names":["$slots"],"sources":["../../../src/components/table-editor/table-editor.vue"],"sourcesContent":["<template>\n <u-table\n :columns=\"internalColumns\"\n :data=\"modelValue || []\"\n :class=\"cls.b\"\n :stripe=\"false\"\n show-index\n :slots=\"$slots\"\n >\n <template #column:__operation=\"{ row }\">\n <ButtonCommonProps tag=\"div\" style=\"display: flex; justify-content: center; gap: 8px\">\n <u-button type=\"danger\" @click=\"handleDelete(row.index)\" :icon=\"Minus\" title=\"移除\" />\n <u-button :icon=\"Plus\" @click=\"handleCreate(row.index)\" title=\"新增到下一行\" />\n <u-button :icon=\"Copy\" @click=\"handleCopy(row)\" title=\"复制到下一行\" />\n </ButtonCommonProps>\n </template>\n\n <!-- <template #header:__operation> </template> -->\n\n <template #empty>\n <div style=\"text-align: center; padding: 4px 0\">\n <u-button\n text\n size=\"small\"\n type=\"primary\"\n v-if=\"!modelValue.length\"\n :icon=\"Plus\"\n @click=\"handleCreate()\"\n >添加</u-button\n >\n </div>\n </template>\n </u-table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useComponentProps } from '@veltra/compositions'\nimport { Copy, Minus, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TableEditorProps, TableEditorEmits, TableColumn } from '../../types'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport type { TableRowNode } from '../table/node/row'\n\ndefineOptions({ name: 'UTableEditor' })\n\nconst { columns = [], modelValue = [] } = defineProps<TableEditorProps>()\nconst emit = defineEmits<TableEditorEmits>()\n\nconst cls = bem('table-editor')\n\nconst ButtonCommonProps = useComponentProps({\n size: 'small',\n circle: true,\n text: true,\n type: 'primary'\n})\n\nconst actionColumn: TableColumn = {\n key: '__operation',\n name: '操作', // 使用name而不是title\n width: 120,\n align: 'center',\n fixed: 'right',\n resizable: false\n}\n\n// 内部列定义,添加编辑和删除操作列\nconst internalColumns = computed(() => {\n return [...columns, actionColumn]\n})\n\nfunction handleCreate(index?: number) {\n if (index !== undefined) {\n emit('update:modelValue', [\n ...modelValue.slice(0, index + 1),\n {},\n ...modelValue.slice(index + 1)\n ])\n } else {\n emit('update:modelValue', [...modelValue, {}])\n }\n}\n\nfunction handleCopy(row: TableRowNode) {\n emit('update:modelValue', [\n ...modelValue.slice(0, row.index + 1),\n JSON.parse(JSON.stringify(row.data)),\n ...modelValue.slice(row.index + 1)\n ])\n}\n\nfunction handleDelete(index: number) {\n emit(\n 'update:modelValue',\n modelValue.filter((_, i) => i !== index)\n )\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,oBAAoB,kBAAkB;GAC1C,MAAM;GACN,QAAQ;GACR,MAAM;GACN,MAAM;EACR,CAAC;EAED,MAAM,eAA4B;GAChC,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,WAAW;EACb;EAGA,MAAM,kBAAkB,eAAe;GACrC,OAAO,CAAC,GAAG,QAAA,SAAS,YAAY;EAClC,CAAC;EAED,SAAS,aAAa,OAAgB;GACpC,IAAI,UAAU,KAAA,GACZ,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;IACD,GAAG,QAAA,WAAW,MAAM,QAAQ,CAAC;GAC/B,CAAC;QAED,KAAK,qBAAqB,CAAC,GAAG,QAAA,YAAY,CAAC,CAAC,CAAC;EAEjD;EAEA,SAAS,WAAW,KAAmB;GACrC,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,IAAI,QAAQ,CAAC;IACpC,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC;IACnC,GAAG,QAAA,WAAW,MAAM,IAAI,QAAQ,CAAC;GACnC,CAAC;EACH;EAEA,SAAS,aAAa,OAAe;GACnC,KACE,qBACA,QAAA,WAAW,QAAQ,GAAG,MAAM,MAAM,KAAK,CACzC;EACF;;
|
|
1
|
+
{"version":3,"file":"table-editor.js","names":["$slots"],"sources":["../../../src/components/table-editor/table-editor.vue"],"sourcesContent":["<template>\n <u-table\n :columns=\"internalColumns\"\n :data=\"modelValue || []\"\n :class=\"cls.b\"\n :stripe=\"false\"\n show-index\n :slots=\"$slots\"\n >\n <template #column:__operation=\"{ row }\">\n <ButtonCommonProps tag=\"div\" style=\"display: flex; justify-content: center; gap: 8px\">\n <u-button type=\"danger\" @click=\"handleDelete(row.index)\" :icon=\"Minus\" title=\"移除\" />\n <u-button :icon=\"Plus\" @click=\"handleCreate(row.index)\" title=\"新增到下一行\" />\n <u-button :icon=\"Copy\" @click=\"handleCopy(row)\" title=\"复制到下一行\" />\n </ButtonCommonProps>\n </template>\n\n <!-- <template #header:__operation> </template> -->\n\n <template #empty>\n <div style=\"text-align: center; padding: 4px 0\">\n <u-button\n text\n size=\"small\"\n type=\"primary\"\n v-if=\"!modelValue.length\"\n :icon=\"Plus\"\n @click=\"handleCreate()\"\n >添加</u-button\n >\n </div>\n </template>\n </u-table>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useComponentProps } from '@veltra/compositions'\nimport { Copy, Minus, Plus } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TableEditorProps, TableEditorEmits, TableColumn } from '../../types'\nimport { UButton } from '../button'\nimport { UTable } from '../table'\nimport type { TableRowNode } from '../table/node/row'\n\ndefineOptions({ name: 'UTableEditor' })\n\nconst { columns = [], modelValue = [] } = defineProps<TableEditorProps>()\nconst emit = defineEmits<TableEditorEmits>()\n\nconst cls = bem('table-editor')\n\nconst ButtonCommonProps = useComponentProps({\n size: 'small',\n circle: true,\n text: true,\n type: 'primary'\n})\n\nconst actionColumn: TableColumn = {\n key: '__operation',\n name: '操作', // 使用name而不是title\n width: 120,\n align: 'center',\n fixed: 'right',\n resizable: false\n}\n\n// 内部列定义,添加编辑和删除操作列\nconst internalColumns = computed(() => {\n return [...columns, actionColumn]\n})\n\nfunction handleCreate(index?: number) {\n if (index !== undefined) {\n emit('update:modelValue', [\n ...modelValue.slice(0, index + 1),\n {},\n ...modelValue.slice(index + 1)\n ])\n } else {\n emit('update:modelValue', [...modelValue, {}])\n }\n}\n\nfunction handleCopy(row: TableRowNode) {\n emit('update:modelValue', [\n ...modelValue.slice(0, row.index + 1),\n JSON.parse(JSON.stringify(row.data)),\n ...modelValue.slice(row.index + 1)\n ])\n}\n\nfunction handleDelete(index: number) {\n emit(\n 'update:modelValue',\n modelValue.filter((_, i) => i !== index)\n )\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,oBAAoB,kBAAkB;GAC1C,MAAM;GACN,QAAQ;GACR,MAAM;GACN,MAAM;EACR,CAAC;EAED,MAAM,eAA4B;GAChC,KAAK;GACL,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO;GACP,WAAW;EACb;EAGA,MAAM,kBAAkB,eAAe;GACrC,OAAO,CAAC,GAAG,QAAA,SAAS,YAAY;EAClC,CAAC;EAED,SAAS,aAAa,OAAgB;GACpC,IAAI,UAAU,KAAA,GACZ,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,QAAQ,CAAC;IAChC,CAAC;IACD,GAAG,QAAA,WAAW,MAAM,QAAQ,CAAC;GAC/B,CAAC;QAED,KAAK,qBAAqB,CAAC,GAAG,QAAA,YAAY,CAAC,CAAC,CAAC;EAEjD;EAEA,SAAS,WAAW,KAAmB;GACrC,KAAK,qBAAqB;IACxB,GAAG,QAAA,WAAW,MAAM,GAAG,IAAI,QAAQ,CAAC;IACpC,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC;IACnC,GAAG,QAAA,WAAW,MAAM,IAAI,QAAQ,CAAC;GACnC,CAAC;EACH;EAEA,SAAS,aAAa,OAAe;GACnC,KACE,qBACA,QAAA,WAAW,QAAQ,GAAG,MAAM,MAAM,KAAK,CACzC;EACF;;GAlGE,OAAA,UAAA,GAAA,YA+BU,MAAA,WAAA,GAAA;IA9BP,SAAS,gBAAA;IACT,MAAM,QAAA,cAAU,CAAA;IAChB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IACZ,QAAQ;IACT,cAAA;IACC,OAAOA,KAAAA;;IAEG,sBAAkB,SAKP,EALW,UAAG,CAClC,YAIoB,MAAA,iBAAA,GAAA;KAJD,KAAI;KAAM,OAAA;MAAA,WAAA;MAAA,mBAAA;MAAA,OAAA;KAAA;;KACyD,SAAA,cAAA;MAApF,YAAoF,MAAA,WAAA,GAAA;OAA1E,MAAK;OAAU,UAAK,WAAE,aAAa,IAAI,KAAK;OAAI,MAAM,MAAA,KAAA;OAAO,OAAM;;MAC7E,YAAyE,MAAA,WAAA,GAAA;OAA9D,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,aAAa,IAAI,KAAK;OAAG,OAAM;;MAC9D,YAAiE,MAAA,WAAA,GAAA;OAAtD,MAAM,MAAA,IAAA;OAAO,UAAK,WAAE,WAAW,GAAG;OAAG,OAAM;;;;;IAM/C,OAAK,cAWR,CAVN,mBAUM,OAVN,YAUM,CAAA,CALK,QAAA,WAAW,UAAA,UAAA,GAJpB,YAQC,MAAA,WAAA,GAAA;;KAPC,MAAA;KACA,MAAK;KACL,MAAK;KAEJ,MAAM,MAAA,IAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,aAAY;;KACjB,SAAA,cAAA,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAF,MAAE,EAAA,CAAA,EAAA,CAAA"}
|
|
@@ -46,10 +46,11 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
46
46
|
const model = useModel(__props, "modelValue");
|
|
47
47
|
const viewportRef = shallowRef();
|
|
48
48
|
const listRef = shallowRef();
|
|
49
|
+
const itemsRef = computed(() => props.items);
|
|
49
50
|
const { showNav, canPrev, canNext, scrollByStep } = useTabsBar({
|
|
50
51
|
viewportRef,
|
|
51
52
|
listRef,
|
|
52
|
-
items:
|
|
53
|
+
items: itemsRef,
|
|
53
54
|
model
|
|
54
55
|
});
|
|
55
56
|
const isItemClosable = (item) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,cAAc,WAAwB;EAC5C,MAAM,UAAU,WAAwB;
|
|
1
|
+
{"version":3,"file":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;
|
|
1
|
+
{"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;GA1EE,OAAA,UAAA,GAAA,mBA+BM,OAAA,EA9BH,OAAK,eAAA;IAAG,MAAA,GAAA,CAAG,CAAC;IAAG,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA;IAAc,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ;IAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;IAAG,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,OAAO;GAAA,CAAA,EAAA,GAE1F,EAAA,UAAA,IAAA,GAAA,mBA2BS,UAAA,MAAA,WAxBiB,QAAA,QAAhB,MAAM,UAAK;IAHrB,OAAA,UAAA,GAAA,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAK,eAAA;MAAY,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;MAAkB,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;MAAW,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,KAAK,aAAQ,IAAA;;KAKtH,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;IAEpC,GAAA,CAAA,WAEO,KAAA,QAAA,WAFP,WAEO,EAAA,SAAA,KAAA,GAAA;KAFS;KAAM;IAAK,CAAA,SAEpB,CADL,mBAAqE,QAAA,EAA9D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GAAmB,gBAAA,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAGrD,eAAe,IAAI,KAAA,UAAA,GAD3B,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAK,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;IAEpC,GAAA,CAAA,YAES,MAAA,WAAA,GAAA,MAAA;KADE,SAAA,cAAA,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;
|
|
1
|
+
{"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQ,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAY,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;GAtFE,OAAA,UAAA,GAAA,mBA+BM,OAAA,EA/BA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ,CAAA,CAAA,EAAA,GAEzB,CAAA,aAAA,SAAA,UAAA,GADR,YAWE,aAAA;;IATS,YAAA,MAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,mBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,OAAO,QAAA;IACP,SAAS,QAAA;IACF;IACA;;;;;;;;;GAEV,CAAA,MAAA,UAAA,GAAA,YAUE,aAAA;;IARS,YAAA,MAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,iBAAA;IACV,MAAM,MAAA,IAAA;IACN,UAAU,QAAA;IACV,SAAS,QAAA;IACF;IACA;;;;;;;;GAGV,CAAA,IAAA,YAKa,YAAA;IALD,MAAK;IAAO,MAAK;;IAGf,SAAA,cAAA,CAFK,QAAA,aAAA,UAAA,GAAjB,YAEY,WAAA,EAAA,KAAA,EAAA,GAAA,EAAA,UAAA,GADV,YAA8C,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,GAAA,IAExB,MAAA,UAAA,GAAA,YAAqD,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,CAAA"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { nextTick, onBeforeUnmount, onMounted, shallowRef, watch } from "vue";
|
|
2
2
|
import { useResizeObserver } from "@veltra/compositions";
|
|
3
|
+
import { applyWheelHorizontalScroll, computeOverflowNavState, scrollElementIntoView, scrollViewportByStep } from "@veltra/utils";
|
|
3
4
|
//#region src/components/tabs/use-tabs-bar.ts
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
+
* 水平标签栏的溢出滚动逻辑(滚动几何/滚轮转横滚/元素滚入视野共享
|
|
7
|
+
* @veltra/utils overflow-nav,见 #17;此处保留 useResizeObserver 与 watch 差异):
|
|
6
8
|
* - 计算 nav 按钮显隐与可用状态
|
|
7
9
|
* - 提供按步滚动与活动标签自动滚入视野的方法
|
|
8
10
|
* - 绑定 wheel / scroll / resize 事件
|
|
@@ -16,20 +18,16 @@ function useTabsBar(options) {
|
|
|
16
18
|
const updateNavState = () => {
|
|
17
19
|
const vp = viewportRef.value;
|
|
18
20
|
if (!vp) return;
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
canNext.value = overflowing && scrollLeft + clientWidth < scrollWidth - 1;
|
|
21
|
+
const state = computeOverflowNavState(vp);
|
|
22
|
+
showNav.value = state.overflowing;
|
|
23
|
+
canPrev.value = state.canPrev;
|
|
24
|
+
canNext.value = state.canNext;
|
|
24
25
|
};
|
|
25
26
|
/** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */
|
|
26
27
|
const scrollByStep = (dir) => {
|
|
27
28
|
const vp = viewportRef.value;
|
|
28
29
|
if (!vp) return;
|
|
29
|
-
vp
|
|
30
|
-
left: vp.scrollLeft + dir * vp.clientWidth * .8,
|
|
31
|
-
behavior: "smooth"
|
|
32
|
-
});
|
|
30
|
+
scrollViewportByStep(vp, dir);
|
|
33
31
|
};
|
|
34
32
|
/** 活动标签自动滚入视野 */
|
|
35
33
|
const ensureActiveVisible = () => {
|
|
@@ -42,26 +40,13 @@ function useTabsBar(options) {
|
|
|
42
40
|
if (activeIndex < 0) return;
|
|
43
41
|
const el = list.children[activeIndex];
|
|
44
42
|
if (!el) return;
|
|
45
|
-
|
|
46
|
-
const elRect = el.getBoundingClientRect();
|
|
47
|
-
if (elRect.left < vpRect.left) vp.scrollTo({
|
|
48
|
-
left: vp.scrollLeft + (elRect.left - vpRect.left) - 8,
|
|
49
|
-
behavior: "smooth"
|
|
50
|
-
});
|
|
51
|
-
else if (elRect.right > vpRect.right) vp.scrollTo({
|
|
52
|
-
left: vp.scrollLeft + (elRect.right - vpRect.right) + 8,
|
|
53
|
-
behavior: "smooth"
|
|
54
|
-
});
|
|
43
|
+
scrollElementIntoView(vp, el);
|
|
55
44
|
};
|
|
56
45
|
/** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */
|
|
57
46
|
const handleWheel = (e) => {
|
|
58
|
-
if (!showNav.value) return;
|
|
59
47
|
const vp = viewportRef.value;
|
|
60
48
|
if (!vp) return;
|
|
61
|
-
|
|
62
|
-
if (e.deltaY === 0) return;
|
|
63
|
-
e.preventDefault();
|
|
64
|
-
vp.scrollLeft += e.deltaY;
|
|
49
|
+
applyWheelHorizontalScroll(e, vp, showNav.value);
|
|
65
50
|
};
|
|
66
51
|
useResizeObserver({
|
|
67
52
|
targets: [viewportRef, listRef],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tabs-bar.js","names":[],"sources":["../../../src/components/tabs/use-tabs-bar.ts"],"sourcesContent":["import { useResizeObserver } from '@veltra/compositions'\nimport {\n type ModelRef,\n type Ref,\n type ShallowRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n watch\n} from 'vue'\n\nimport type { TabItem } from '../../types'\n\ninterface UseTabsBarOptions {\n viewportRef: ShallowRef<HTMLElement | undefined>\n listRef: ShallowRef<HTMLElement | undefined>\n items: Ref<TabItem[]>\n model: ModelRef<string | undefined>\n}\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"use-tabs-bar.js","names":[],"sources":["../../../src/components/tabs/use-tabs-bar.ts"],"sourcesContent":["import { useResizeObserver } from '@veltra/compositions'\nimport {\n applyWheelHorizontalScroll,\n computeOverflowNavState,\n scrollElementIntoView,\n scrollViewportByStep\n} from '@veltra/utils'\nimport {\n type ModelRef,\n type Ref,\n type ShallowRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n watch\n} from 'vue'\n\nimport type { TabItem } from '../../types'\n\ninterface UseTabsBarOptions {\n viewportRef: ShallowRef<HTMLElement | undefined>\n listRef: ShallowRef<HTMLElement | undefined>\n items: Ref<TabItem[]>\n model: ModelRef<string | undefined>\n}\n\n/**\n * 水平标签栏的溢出滚动逻辑(滚动几何/滚轮转横滚/元素滚入视野共享\n * @veltra/utils overflow-nav,见 #17;此处保留 useResizeObserver 与 watch 差异):\n * - 计算 nav 按钮显隐与可用状态\n * - 提供按步滚动与活动标签自动滚入视野的方法\n * - 绑定 wheel / scroll / resize 事件\n */\nexport function useTabsBar(options: UseTabsBarOptions) {\n const { viewportRef, listRef, items, model } = options\n\n const showNav = shallowRef(false)\n const canPrev = shallowRef(false)\n const canNext = shallowRef(false)\n\n /** 依据 viewport 与内容尺寸推导滚动按钮可用状态 */\n const updateNavState = () => {\n const vp = viewportRef.value\n if (!vp) return\n const state = computeOverflowNavState(vp)\n showNav.value = state.overflowing\n canPrev.value = state.canPrev\n canNext.value = state.canNext\n }\n\n /** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */\n const scrollByStep = (dir: 1 | -1) => {\n const vp = viewportRef.value\n if (!vp) return\n scrollViewportByStep(vp, dir)\n }\n\n /** 活动标签自动滚入视野 */\n const ensureActiveVisible = () => {\n const vp = viewportRef.value\n const list = listRef.value\n if (!vp || !list) return\n const activeKey = model.value\n if (!activeKey) return\n const activeIndex = items.value.findIndex((i) => i.key === activeKey)\n if (activeIndex < 0) return\n const el = list.children[activeIndex] as HTMLElement | undefined\n if (!el) return\n scrollElementIntoView(vp, el)\n }\n\n /** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */\n const handleWheel = (e: WheelEvent) => {\n const vp = viewportRef.value\n if (!vp) return\n applyWheelHorizontalScroll(e, vp, showNav.value)\n }\n\n useResizeObserver({ targets: [viewportRef, listRef], onResize: () => updateNavState() })\n\n watch(model, async () => {\n await nextTick()\n ensureActiveVisible()\n })\n\n watch(\n items,\n async () => {\n await nextTick()\n updateNavState()\n ensureActiveVisible()\n },\n { deep: false }\n )\n\n onMounted(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.addEventListener('wheel', handleWheel, { passive: false })\n vp.addEventListener('scroll', updateNavState, { passive: true })\n updateNavState()\n nextTick(ensureActiveVisible)\n })\n\n onBeforeUnmount(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.removeEventListener('wheel', handleWheel)\n vp.removeEventListener('scroll', updateNavState)\n })\n\n return { showNav, canPrev, canNext, updateNavState, scrollByStep, ensureActiveVisible }\n}\n"],"mappings":";;;;;;;;;;;AAkCA,SAAgB,WAAW,SAA4B;CACrD,MAAM,EAAE,aAAa,SAAS,OAAO,UAAU;CAE/C,MAAM,UAAU,WAAW,KAAK;CAChC,MAAM,UAAU,WAAW,KAAK;CAChC,MAAM,UAAU,WAAW,KAAK;;CAGhC,MAAM,uBAAuB;EAC3B,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,MAAM,QAAQ,wBAAwB,EAAE;EACxC,QAAQ,QAAQ,MAAM;EACtB,QAAQ,QAAQ,MAAM;EACtB,QAAQ,QAAQ,MAAM;CACxB;;CAGA,MAAM,gBAAgB,QAAgB;EACpC,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,qBAAqB,IAAI,GAAG;CAC9B;;CAGA,MAAM,4BAA4B;EAChC,MAAM,KAAK,YAAY;EACvB,MAAM,OAAO,QAAQ;EACrB,IAAI,CAAC,MAAM,CAAC,MAAM;EAClB,MAAM,YAAY,MAAM;EACxB,IAAI,CAAC,WAAW;EAChB,MAAM,cAAc,MAAM,MAAM,WAAW,MAAM,EAAE,QAAQ,SAAS;EACpE,IAAI,cAAc,GAAG;EACrB,MAAM,KAAK,KAAK,SAAS;EACzB,IAAI,CAAC,IAAI;EACT,sBAAsB,IAAI,EAAE;CAC9B;;CAGA,MAAM,eAAe,MAAkB;EACrC,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,2BAA2B,GAAG,IAAI,QAAQ,KAAK;CACjD;CAEA,kBAAkB;EAAE,SAAS,CAAC,aAAa,OAAO;EAAG,gBAAgB,eAAe;CAAE,CAAC;CAEvF,MAAM,OAAO,YAAY;EACvB,MAAM,SAAS;EACf,oBAAoB;CACtB,CAAC;CAED,MACE,OACA,YAAY;EACV,MAAM,SAAS;EACf,eAAe;EACf,oBAAoB;CACtB,GACA,EAAE,MAAM,MAAM,CAChB;CAEA,gBAAgB;EACd,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,iBAAiB,SAAS,aAAa,EAAE,SAAS,MAAM,CAAC;EAC5D,GAAG,iBAAiB,UAAU,gBAAgB,EAAE,SAAS,KAAK,CAAC;EAC/D,eAAe;EACf,SAAS,mBAAmB;CAC9B,CAAC;CAED,sBAAsB;EACpB,MAAM,KAAK,YAAY;EACvB,IAAI,CAAC,IAAI;EACT,GAAG,oBAAoB,SAAS,WAAW;EAC3C,GAAG,oBAAoB,UAAU,cAAc;CACjD,CAAC;CAED,OAAO;EAAE;EAAS;EAAS;EAAS;EAAgB;EAAc;CAAoB;AACxF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;
|
|
1
|
+
{"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;GA7CC,OAAA,UAAA,GAAA,mBAQO,QAAA,EARA,OAAK,eAAE,UAAA,KAAS,EAAA,GACrB,CAAA,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GACjB,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAGI,GAAA,QAAA,YAAA,UAAA,GAAd,YAES,MAAA,WAAA,GAAA;;IAFgB,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IACpD,SAAA,cAAA,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;
|
|
1
|
+
{"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;GAjEE,OAAA,UAAA,GAAA,mBAEI,KAAA;IAFA,OAAK,eAAE,UAAA,KAAS;IAAG,OAAK,eAAE,MAAA,KAAK;GACjC,GAAA,CAAA,YAAkD,MAAA,UAAA,GAAA;IAApC,SAAS,aAAY;IAAI,KAAI"}
|