@veltra/desktop 1.1.28 → 1.1.30
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.d.ts +4 -6
- package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js +1 -1
- 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/action/action.vue.d.ts +4 -7
- package/dist/components/action/di.js.map +1 -1
- package/dist/components/auto-complete/auto-complete.js.map +1 -1
- package/dist/components/auto-complete/auto-complete.vue.d.ts +3 -5
- package/dist/components/auto-complete/use-keyboard.js.map +1 -1
- package/dist/components/auto-complete/use-suggestions.js.map +1 -1
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/badge/badge.vue.d.ts +2 -4
- 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.map +1 -1
- package/dist/components/batch-edit/batch-edit.vue.d.ts +4 -7
- package/dist/components/batch-edit/di.js.map +1 -1
- package/dist/components/batch-edit/helper.js.map +1 -1
- package/dist/components/batch-edit/use-edit.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.vue.d.ts +3 -5
- package/dist/components/button/button-group.js.map +1 -1
- package/dist/components/button/button-group.vue.d.ts +1 -3
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button/button.vue.d.ts +4 -6
- package/dist/components/calendar/calendar.js.map +1 -1
- package/dist/components/calendar/calendar.vue.d.ts +3 -5
- package/dist/components/calendar/utils.js.map +1 -1
- package/dist/components/card/card-action.js.map +1 -1
- package/dist/components/card/card-action.vue.d.ts +1 -3
- package/dist/components/card/card-content.js.map +1 -1
- package/dist/components/card/card-content.vue.d.ts +1 -3
- package/dist/components/card/card-cover.js.map +1 -1
- package/dist/components/card/card-cover.vue.d.ts +1 -3
- package/dist/components/card/card-header.js.map +1 -1
- package/dist/components/card/card-header.vue.d.ts +1 -3
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/card/card.vue.d.ts +1 -3
- package/dist/components/card/di.js.map +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/cascade/cascade.vue.d.ts +6 -8
- package/dist/components/cascade/di.js.map +1 -1
- package/dist/components/cascade/node.js.map +1 -1
- package/dist/components/cascade/use-check.js.map +1 -1
- package/dist/components/cascade/use-data-map.js.map +1 -1
- package/dist/components/cascade/use-select.js.map +1 -1
- package/dist/components/check-tag/check-tag.js.map +1 -1
- package/dist/components/check-tag/check-tag.vue.d.ts +3 -5
- package/dist/components/checkbox/checkbox-button.js.map +1 -1
- package/dist/components/checkbox/checkbox-button.vue.d.ts +4 -7
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox/checkbox.vue.d.ts +3 -5
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.vue.d.ts +3 -5
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/code-editor/code-editor.vue.d.ts +3 -5
- package/dist/components/collapse/collapse-item.js.map +1 -1
- package/dist/components/collapse/collapse-item.vue.d.ts +1 -3
- package/dist/components/collapse/collapse.js.map +1 -1
- package/dist/components/collapse/collapse.vue.d.ts +3 -5
- package/dist/components/collapse/di.js.map +1 -1
- 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/condition-editor.vue.d.ts +3 -5
- package/dist/components/condition-editor/core/evaluator.js.map +1 -1
- package/dist/components/condition-editor/core/operators.js.map +1 -1
- package/dist/components/context-menu/api.js.map +1 -1
- package/dist/components/context-menu/context-menu-item.js.map +1 -1
- package/dist/components/context-menu/context-menu.js.map +1 -1
- package/dist/components/context-menu/context-menu.vue.d.ts +3 -5
- package/dist/components/context-menu/di.js.map +1 -1
- package/dist/components/date-panel/date-panel.js.map +1 -1
- package/dist/components/date-panel/date-panel.vue.d.ts +8 -12
- package/dist/components/date-panel/di.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/use-date-select.js.map +1 -1
- package/dist/components/date-panel/use-panel-date.js.map +1 -1
- package/dist/components/date-panel/use-panel.js.map +1 -1
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-picker/date-picker.vue.d.ts +3 -5
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.vue.d.ts +3 -5
- package/dist/components/dialog/di.js.map +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/dialog/dialog.vue.d.ts +3 -6
- package/dist/components/dialog/use-maximum.js.map +1 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/drawer/drawer.vue.d.ts +3 -5
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/dropdown/dropdown.vue.d.ts +3 -6
- package/dist/components/empty/empty.js.map +1 -1
- package/dist/components/empty/empty.vue.d.ts +2 -4
- 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/chip.js.map +1 -1
- package/dist/components/expression-editor/core/editor.js.map +1 -1
- package/dist/components/expression-editor/core/mention.js.map +1 -1
- package/dist/components/expression-editor/core/model.js.map +1 -1
- package/dist/components/expression-editor/di.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.vue.d.ts +3 -5
- package/dist/components/file-picker/file-picker.js.map +1 -1
- package/dist/components/file-picker/file-picker.vue.d.ts +3 -5
- package/dist/components/file-picker/helper.js.map +1 -1
- package/dist/components/file-viewer/file-viewer.js +1 -1
- package/dist/components/file-viewer/file-viewer.js.map +1 -1
- package/dist/components/file-viewer/file-viewer.vue.d.ts +5 -6
- 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.map +1 -1
- 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/float-button/float-button.js.map +1 -1
- package/dist/components/float-button/float-button.vue.d.ts +3 -5
- package/dist/components/form/dynamic-form-model.js.map +1 -1
- package/dist/components/form/form-model.js.map +1 -1
- package/dist/components/form/form.vue.d.ts +3 -4
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/helper.js.map +1 -1
- package/dist/components/form/use-node-interceptor.js.map +1 -1
- package/dist/components/form-item/form-item.vue.d.ts +2 -4
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +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/helper.js.map +1 -1
- package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
- package/dist/components/gantt-chart/gantt-chart.vue.d.ts +1 -3
- package/dist/components/grid/breakpoint.js.map +1 -1
- package/dist/components/grid/di.js.map +1 -1
- package/dist/components/grid/grid-item.js.map +1 -1
- package/dist/components/grid/grid-item.vue.d.ts +2 -4
- package/dist/components/grid/grid.js.map +1 -1
- package/dist/components/grid/grid.vue.d.ts +3 -5
- package/dist/components/grid/use-responsive.js.map +1 -1
- package/dist/components/grid-input/grid-input.js.map +1 -1
- package/dist/components/grid-input/grid-input.vue.d.ts +3 -6
- package/dist/components/group-input/group-input.js.map +1 -1
- package/dist/components/group-input/group-input.vue.d.ts +2 -4
- package/dist/components/group-input/use-group-items.js.map +1 -1
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/icon/icon.vue.d.ts +1 -3
- package/dist/components/input/input.vue.d.ts +3 -5
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js +3 -3
- 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/kbd.vue.d.ts +1 -3
- package/dist/components/layout/di.js.map +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/layout.vue.d.ts +2 -4
- package/dist/components/list/list-item.js.map +1 -1
- package/dist/components/list/list-item.vue.d.ts +1 -3
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/list/list.vue.d.ts +1 -3
- package/dist/components/loading/directive.js.map +1 -1
- package/dist/components/loading/loading.js.map +1 -1
- package/dist/components/loading/loading.vue.d.ts +2 -4
- package/dist/components/menu/di.js.map +1 -1
- package/dist/components/menu/helper.js.map +1 -1
- package/dist/components/menu/menu-icon.js.map +1 -1
- package/dist/components/menu/menu-item-collapsed.js.map +1 -1
- package/dist/components/menu/menu-item.js.map +1 -1
- package/dist/components/menu/menu-item.vue.d.ts +1 -3
- package/dist/components/menu/menu-sub-collapsed.js.map +1 -1
- package/dist/components/menu/menu-sub.js.map +1 -1
- package/dist/components/menu/menu-sub.vue.d.ts +1 -3
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/menu/menu.vue.d.ts +3 -5
- package/dist/components/menu/use-menu-item.js.map +1 -1
- package/dist/components/menu/walk-menu-path.js.map +1 -1
- package/dist/components/message/helper.js.map +1 -1
- package/dist/components/message/message-box.js.map +1 -1
- package/dist/components/message/message.js.map +1 -1
- package/dist/components/message/message.vue.d.ts +3 -5
- package/dist/components/message/message2.js.map +1 -1
- package/dist/components/message-confirm/message-confirm.js.map +1 -1
- package/dist/components/message-confirm/message-confirm.vue.d.ts +2 -3
- package/dist/components/message-confirm/message-confirm2.js.map +1 -1
- package/dist/components/multi-select/di.js.map +1 -1
- package/dist/components/multi-select/multi-select-option.js.map +1 -1
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/multi-select.vue.d.ts +5 -7
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +6 -7
- package/dist/components/node-render/node-render.js.map +1 -1
- package/dist/components/notification/index.js.map +1 -1
- package/dist/components/notification/notification.js.map +1 -1
- package/dist/components/notification/notification.vue.d.ts +3 -6
- package/dist/components/number/number.js.map +1 -1
- package/dist/components/number/number.vue.d.ts +2 -4
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-input/number-input.vue.d.ts +3 -5
- package/dist/components/number-range-input/number-range-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.vue.d.ts +4 -6
- package/dist/components/paginator/paginator.js.map +1 -1
- package/dist/components/paginator/paginator.vue.d.ts +3 -5
- package/dist/components/palette/color-transform.js.map +1 -1
- package/dist/components/palette/di.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/palette/palette.vue.d.ts +3 -5
- package/dist/components/palette/use-hsv.js.map +1 -1
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/password-input/password-input.vue.d.ts +3 -5
- package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.vue.d.ts +4 -6
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/progress/progress.vue.d.ts +2 -3
- package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
- package/dist/components/progress-nodes/progress-nodes.vue.d.ts +4 -7
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/radio/radio.vue.d.ts +3 -5
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/radio-group/radio-group.vue.d.ts +3 -5
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +4 -6
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- package/dist/components/scroll/di.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/scroll.vue.d.ts +3 -5
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/select.vue.d.ts +5 -7
- package/dist/components/select/use-keyboard.js.map +1 -1
- package/dist/components/select/use-options.js.map +1 -1
- package/dist/components/slider/di.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/slider.vue.d.ts +2 -4
- package/dist/components/slider/use-slider.js.map +1 -1
- package/dist/components/steps/steps.js.map +1 -1
- package/dist/components/steps/steps.vue.d.ts +4 -7
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/switch/switch.vue.d.ts +3 -5
- package/dist/components/table/di.js.map +1 -1
- package/dist/components/table/node/col.js.map +1 -1
- package/dist/components/table/node/row.js.map +1 -1
- 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-head.js.map +1 -1
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/table.vue.d.ts +7 -10
- package/dist/components/table/use-check.js.map +1 -1
- package/dist/components/table/use-col-resize.js.map +1 -1
- package/dist/components/table/use-columns.js.map +1 -1
- package/dist/components/table/use-fixed-columns.js.map +1 -1
- package/dist/components/table/use-rows.js.map +1 -1
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/table-editor/table-editor.js.map +1 -1
- package/dist/components/table-editor/table-editor.vue.d.ts +3 -5
- package/dist/components/tabs/tabs-horizontal.js +5 -2
- package/dist/components/tabs/tabs-horizontal.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +6 -7
- package/dist/components/tabs/tabs-vertical.js +5 -2
- package/dist/components/tabs/tabs-vertical.js.map +1 -1
- package/dist/components/tabs/tabs-vertical.vue.d.ts +10 -10
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/tabs.vue.d.ts +11 -6
- package/dist/components/tabs/use-tabs-bar.js.map +1 -1
- package/dist/components/tag/tag.js.map +1 -1
- package/dist/components/tag/tag.vue.d.ts +3 -5
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/text/text.vue.d.ts +2 -4
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/textarea/textarea.vue.d.ts +3 -5
- package/dist/components/textarea/utils.js.map +1 -1
- package/dist/components/theme/schema.js.map +1 -1
- package/dist/components/theme/theme.js.map +1 -1
- package/dist/components/theme/theme.vue.d.ts +1 -3
- package/dist/components/tip/tip.js.map +1 -1
- package/dist/components/tip/tip.vue.d.ts +3 -5
- package/dist/components/tip/use-nest.js.map +1 -1
- package/dist/components/tree/di.js.map +1 -1
- package/dist/components/tree/tree-node.js.map +1 -1
- package/dist/components/tree/tree-node2.js.map +1 -1
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree/tree.vue.d.ts +3 -5
- package/dist/components/tree/use-check.js.map +1 -1
- package/dist/components/tree/use-filter.js.map +1 -1
- package/dist/components/tree/use-select.js.map +1 -1
- package/dist/components/tree/use-tree-nodes.js.map +1 -1
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/tree-select/tree-select.vue.d.ts +6 -7
- package/dist/components/watermark/watermark.js.map +1 -1
- package/dist/components/watermark/watermark.vue.d.ts +2 -4
- package/dist/index.d.ts +1 -1
- package/dist/install.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +8 -8
- package/src/components/tabs/tabs-horizontal.vue +2 -2
- package/src/components/tabs/tabs-vertical.vue +3 -1
- package/src/components/tabs/tabs.vue +2 -2
- package/dist/components/kbd/index.d.ts +0 -1
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { MenuItem, MenuProps } from "../../types/menu.js";
|
|
2
|
-
import * as _$vue from "vue";
|
|
3
|
-
|
|
4
2
|
//#region src/components/menu/menu.vue.d.ts
|
|
5
|
-
declare const __VLS_export:
|
|
3
|
+
declare const __VLS_export: import("vue").DefineComponent<MenuProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
6
4
|
"item-click": (item: MenuItem) => any;
|
|
7
|
-
}, string,
|
|
5
|
+
}, string, import("vue").PublicProps, Readonly<MenuProps> & Readonly<{
|
|
8
6
|
"onItem-click"?: ((item: MenuItem) => any) | undefined;
|
|
9
7
|
}>, {
|
|
10
8
|
collapsed: boolean;
|
|
11
9
|
uniqueOpened: boolean;
|
|
12
|
-
}, {}, {}, {}, string,
|
|
10
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
11
|
declare const _default: typeof __VLS_export;
|
|
14
12
|
//#endregion
|
|
15
13
|
export { _default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-menu-item.js","names":[],"sources":["../../../src/components/menu/use-menu-item.ts"],"sourcesContent":["import { scrollIntoContainerView, type BEM } from '@veltra/utils'\nimport { computed, inject, watch, type ShallowRef, type ComputedRef } from 'vue'\n\nimport type { MenuItem } from '../../types'\nimport { MenuDIKey } from './di'\n\ninterface Options {\n itemProps: { menu: MenuItem; depth: number }\n itemRef: ShallowRef<HTMLElement | null>\n}\n\ninterface UseMenuItemReturned {\n cls: BEM<'menu'>\n collapsedCls: BEM<'collapsed-menu'>\n\n active: ComputedRef<boolean>\n handleClickMenu: () => void\n}\n\nexport function useMenuItem(options: Options): UseMenuItemReturned {\n const { itemProps, itemRef } = options\n const { cls, collapsedCls, menuProps, menuEmit } = inject(MenuDIKey)!\n\n const active = computed(() => {\n return menuProps.currentPath === itemProps.menu.path\n })\n\n let changedByClick = false\n watch([active, itemRef], ([active, itemEl]) => {\n if (changedByClick) {\n changedByClick = false\n return\n }\n if (!active || !itemEl) return\n scrollIntoContainerView(itemEl, null)\n })\n\n function handleClickMenu() {\n if (itemProps.menu.disabled) return\n changedByClick = true\n menuEmit('item-click', itemProps.menu)\n }\n\n return {\n cls,\n collapsedCls,\n\n active,\n handleClickMenu\n }\n}\n"],"mappings":";;;;AAmBA,SAAgB,YAAY,SAAuC;CACjE,MAAM,EAAE,WAAW,YAAY;CAC/B,MAAM,EAAE,KAAK,cAAc,WAAW,aAAa,OAAO,
|
|
1
|
+
{"version":3,"file":"use-menu-item.js","names":[],"sources":["../../../src/components/menu/use-menu-item.ts"],"sourcesContent":["import { scrollIntoContainerView, type BEM } from '@veltra/utils'\nimport { computed, inject, watch, type ShallowRef, type ComputedRef } from 'vue'\n\nimport type { MenuItem } from '../../types'\nimport { MenuDIKey } from './di'\n\ninterface Options {\n itemProps: { menu: MenuItem; depth: number }\n itemRef: ShallowRef<HTMLElement | null>\n}\n\ninterface UseMenuItemReturned {\n cls: BEM<'menu'>\n collapsedCls: BEM<'collapsed-menu'>\n\n active: ComputedRef<boolean>\n handleClickMenu: () => void\n}\n\nexport function useMenuItem(options: Options): UseMenuItemReturned {\n const { itemProps, itemRef } = options\n const { cls, collapsedCls, menuProps, menuEmit } = inject(MenuDIKey)!\n\n const active = computed(() => {\n return menuProps.currentPath === itemProps.menu.path\n })\n\n let changedByClick = false\n watch([active, itemRef], ([active, itemEl]) => {\n if (changedByClick) {\n changedByClick = false\n return\n }\n if (!active || !itemEl) return\n scrollIntoContainerView(itemEl, null)\n })\n\n function handleClickMenu() {\n if (itemProps.menu.disabled) return\n changedByClick = true\n menuEmit('item-click', itemProps.menu)\n }\n\n return {\n cls,\n collapsedCls,\n\n active,\n handleClickMenu\n }\n}\n"],"mappings":";;;;AAmBA,SAAgB,YAAY,SAAuC;CACjE,MAAM,EAAE,WAAW,YAAY;CAC/B,MAAM,EAAE,KAAK,cAAc,WAAW,aAAa,OAAO,SAAS;CAEnE,MAAM,SAAS,eAAe;EAC5B,OAAO,UAAU,gBAAgB,UAAU,KAAK;CAClD,CAAC;CAED,IAAI,iBAAiB;CACrB,MAAM,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,YAAY;EAC7C,IAAI,gBAAgB;GAClB,iBAAiB;GACjB;EACF;EACA,IAAI,CAAC,UAAU,CAAC,QAAQ;EACxB,wBAAwB,QAAQ,IAAI;CACtC,CAAC;CAED,SAAS,kBAAkB;EACzB,IAAI,UAAU,KAAK,UAAU;EAC7B,iBAAiB;EACjB,SAAS,cAAc,UAAU,IAAI;CACvC;CAEA,OAAO;EACL;EACA;EAEA;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk-menu-path.js","names":[],"sources":["../../../src/components/menu/walk-menu-path.ts"],"sourcesContent":["/**\n * 深度优先 + 路径;回调返回 `false` 时剪枝当前节点子树(不中断兄弟)。\n * `@cat-kit/core` 的 `dfs` 在返回 `true` 时会终止整段遍历,语义不同,故保留此辅助。\n */\nexport function walkMenuWithPath<T extends Record<string, unknown>>(\n data: T,\n cb: (node: T, path: T[]) => void | false,\n childrenKey = 'children',\n prefix: T[] = []\n): void {\n const path = [...prefix, data]\n if (cb(data, path) === false) return\n const raw = data[childrenKey]\n if (!Array.isArray(raw)) return\n for (let i = 0; i < raw.length; i++) {\n walkMenuWithPath(raw[i] as T, cb, childrenKey, path)\n }\n}\n"],"mappings":";;;;;AAIA,SAAgB,iBACd,MACA,IACA,cAAc,YACd,SAAc,
|
|
1
|
+
{"version":3,"file":"walk-menu-path.js","names":[],"sources":["../../../src/components/menu/walk-menu-path.ts"],"sourcesContent":["/**\n * 深度优先 + 路径;回调返回 `false` 时剪枝当前节点子树(不中断兄弟)。\n * `@cat-kit/core` 的 `dfs` 在返回 `true` 时会终止整段遍历,语义不同,故保留此辅助。\n */\nexport function walkMenuWithPath<T extends Record<string, unknown>>(\n data: T,\n cb: (node: T, path: T[]) => void | false,\n childrenKey = 'children',\n prefix: T[] = []\n): void {\n const path = [...prefix, data]\n if (cb(data, path) === false) return\n const raw = data[childrenKey]\n if (!Array.isArray(raw)) return\n for (let i = 0; i < raw.length; i++) {\n walkMenuWithPath(raw[i] as T, cb, childrenKey, path)\n }\n}\n"],"mappings":";;;;;AAIA,SAAgB,iBACd,MACA,IACA,cAAc,YACd,SAAc,CAAC,GACT;CACN,MAAM,OAAO,CAAC,GAAG,QAAQ,IAAI;CAC7B,IAAI,GAAG,MAAM,IAAI,MAAM,OAAO;CAC9B,MAAM,MAAM,KAAK;CACjB,IAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAC9B,iBAAiB,IAAI,IAAS,IAAI,aAAa,IAAI;AAEvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/message/helper.ts"],"sourcesContent":["import {\n CircleCheckFilled,\n CircleClose,\n InfoFilled,\n QuestionFilled,\n WarningFilled\n} from '@veltra/icons/normal'\nimport type { DefineComponent } from 'vue'\n\nimport type { ColorType, MessageType } from '../../types'\n\nconst typeIcons = {\n default: InfoFilled,\n info: QuestionFilled,\n success: CircleCheckFilled,\n warn: WarningFilled,\n error: CircleClose\n}\nexport function getTypeIcon(type: MessageType, icon?: DefineComponent): DefineComponent {\n return (icon ?? typeIcons[type]) as any\n}\n\nconst typeColors = { error: 'danger', warn: 'warning' }\n\nexport function getTypeColor(type: MessageType): ColorType {\n return typeColors[type] ?? type\n}\n"],"mappings":";;AAWA,MAAM,YAAY;CAChB,SAAS;CACT,MAAM;CACN,SAAS;CACT,MAAM;CACN,OAAO;
|
|
1
|
+
{"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/message/helper.ts"],"sourcesContent":["import {\n CircleCheckFilled,\n CircleClose,\n InfoFilled,\n QuestionFilled,\n WarningFilled\n} from '@veltra/icons/normal'\nimport type { DefineComponent } from 'vue'\n\nimport type { ColorType, MessageType } from '../../types'\n\nconst typeIcons = {\n default: InfoFilled,\n info: QuestionFilled,\n success: CircleCheckFilled,\n warn: WarningFilled,\n error: CircleClose\n}\nexport function getTypeIcon(type: MessageType, icon?: DefineComponent): DefineComponent {\n return (icon ?? typeIcons[type]) as any\n}\n\nconst typeColors = { error: 'danger', warn: 'warning' }\n\nexport function getTypeColor(type: MessageType): ColorType {\n return typeColors[type] ?? type\n}\n"],"mappings":";;AAWA,MAAM,YAAY;CAChB,SAAS;CACT,MAAM;CACN,SAAS;CACT,MAAM;CACN,OAAO;AACT;AACA,SAAgB,YAAY,MAAmB,MAAyC;CACtF,OAAQ,QAAQ,UAAU;AAC5B;AAEA,MAAM,aAAa;CAAE,OAAO;CAAU,MAAM;AAAU;AAEtD,SAAgB,aAAa,MAA8B;CACzD,OAAO,WAAW,SAAS;AAC7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-box.js","names":[],"sources":["../../../src/components/message/message-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message\" appear @after-leave=\"handleAfterLeave\">\n <UMessage\n v-for=\"({ onClose, ...message }, index) of messages\"\n v-bind=\"message\"\n :data-id=\"message.key\"\n @close=\"handleClose(index, onClose)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageOptions } from '../../types'\nimport UMessage from './message.vue'\n\ndefineOptions({ name: 'MessageBox' })\n\ndefineProps<{ messages: Array<Omit<MessageOptions & { key: string }, 'onClosed'>> }>()\n\nconst emit = defineEmits<{ (e: 'closed', id: string): void; (e: 'close', index: number): void }>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.id as string)\n}\n\nfunction handleClose(i: number, onClose?: () => void) {\n emit('close', i)\n onClose?.()\n}\n</script>\n"],"mappings":";;;;;;;;;EAmBA,MAAM,OAAO;EAEb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,
|
|
1
|
+
{"version":3,"file":"message-box.js","names":[],"sources":["../../../src/components/message/message-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message\" appear @after-leave=\"handleAfterLeave\">\n <UMessage\n v-for=\"({ onClose, ...message }, index) of messages\"\n v-bind=\"message\"\n :data-id=\"message.key\"\n @close=\"handleClose(index, onClose)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageOptions } from '../../types'\nimport UMessage from './message.vue'\n\ndefineOptions({ name: 'MessageBox' })\n\ndefineProps<{ messages: Array<Omit<MessageOptions & { key: string }, 'onClosed'>> }>()\n\nconst emit = defineEmits<{ (e: 'closed', id: string): void; (e: 'close', index: number): void }>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.id as string)\n}\n\nfunction handleClose(i: number, onClose?: () => void) {\n emit('close', i)\n onClose?.()\n}\n</script>\n"],"mappings":";;;;;;;;;EAmBA,MAAM,OAAO;EAEb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,EAAY;EACzD;EAEA,SAAS,YAAY,GAAW,SAAsB;GACpD,KAAK,SAAS,CAAC;GACf,UAAU;EACZ;;uBA3BE,YAOmB,iBAAA;IAPD,MAAK;IAAU,QAAA;IAAQ,cAAa;;2BAEE,EAAA,UAAA,IAAA,GADtD,mBAKE,UAAA,MAAA,WAJ2C,QAAA,WAAQ,EAAzC,SAAO,GAAK,WAAW,UAAK;yBADxC,YAKE,aALF,WAKE,EAAA,SAAA,KAAA,GAHQ,SAAO;MACd,WAAS,QAAQ;MACjB,UAAK,WAAE,YAAY,OAAO,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","names":[],"sources":["../../../src/components/message/message.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.b, cls.m(size), cls.m('color-' + getTypeColor(type))]\"\n @mouseenter=\"suspendClose\"\n @mouseleave=\"close\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"getTypeIcon(type, icon)\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\" v-if=\"html\" v-html=\"message\"></div>\n <div :class=\"cls.e('content')\" v-else>\n {{ message }}\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"immediateClose\">\n <UIcon><Close /></UIcon>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { onMounted } from 'vue'\n\nimport type { MessageProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { getTypeColor, getTypeIcon } from './helper'\n\ndefineOptions({ name: 'Message' })\n\nconst props = withDefaults(defineProps<MessageProps>(), {\n type: 'default',\n duration: 3000,\n offset: 20\n})\n\nconst emit = defineEmits<{ (e: 'close'): void }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('message')\n\nlet startTime = 0\nlet timer: number\nlet restDuration = 0\n\nfunction close() {\n if (props.duration === 0) return\n startTime = Date.now()\n timer = setTimeout(() => {\n emit('close')\n }, restDuration)\n}\n\nfunction startClose() {\n if (props.duration <= 0) return\n restDuration = props.duration\n close()\n}\n\nonMounted(() => {\n startClose()\n})\n\nfunction suspendClose() {\n clearTimeout(timer)\n restDuration = restDuration - (Date.now() - startTime)\n}\n\nfunction immediateClose() {\n emit('close')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"message.js","names":[],"sources":["../../../src/components/message/message.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.b, cls.m(size), cls.m('color-' + getTypeColor(type))]\"\n @mouseenter=\"suspendClose\"\n @mouseleave=\"close\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"getTypeIcon(type, icon)\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\" v-if=\"html\" v-html=\"message\"></div>\n <div :class=\"cls.e('content')\" v-else>\n {{ message }}\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"immediateClose\">\n <UIcon><Close /></UIcon>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { onMounted } from 'vue'\n\nimport type { MessageProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { getTypeColor, getTypeIcon } from './helper'\n\ndefineOptions({ name: 'Message' })\n\nconst props = withDefaults(defineProps<MessageProps>(), {\n type: 'default',\n duration: 3000,\n offset: 20\n})\n\nconst emit = defineEmits<{ (e: 'close'): void }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('message')\n\nlet startTime = 0\nlet timer: number\nlet restDuration = 0\n\nfunction close() {\n if (props.duration === 0) return\n startTime = Date.now()\n timer = setTimeout(() => {\n emit('close')\n }, restDuration)\n}\n\nfunction startClose() {\n if (props.duration <= 0) return\n restDuration = props.duration\n close()\n}\n\nonMounted(() => {\n startClose()\n})\n\nfunction suspendClose() {\n clearTimeout(timer)\n restDuration = restDuration - (Date.now() - startTime)\n}\n\nfunction immediateClose() {\n emit('close')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAE9D,MAAM,MAAM,IAAI,SAAS;EAEzB,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI,eAAe;EAEnB,SAAS,QAAQ;GACf,IAAI,MAAM,aAAa,GAAG;GAC1B,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB;IACvB,KAAK,OAAO;GACd,GAAG,YAAY;EACjB;EAEA,SAAS,aAAa;GACpB,IAAI,MAAM,YAAY,GAAG;GACzB,eAAe,MAAM;GACrB,MAAM;EACR;EAEA,gBAAgB;GACd,WAAW;EACb,CAAC;EAED,SAAS,eAAe;GACtB,aAAa,KAAK;GAClB,eAAe,gBAAgB,KAAK,IAAI,IAAI;EAC9C;EAEA,SAAS,iBAAiB;GACxB,KAAK,OAAO;EACd;;uBAzEE,mBAiBK,MAAA;IAhBF,OAAK,eAAA;KAAG,MAAA,GAAA,EAAI;KAAG,MAAA,GAAA,EAAI,EAAE,MAAA,IAAA,CAAI;KAAG,MAAA,GAAA,EAAI,EAAC,WAAY,MAAA,YAAA,EAAa,QAAA,IAAI,CAAA;IAAA,CAAA;IAC9D,cAAY;IACZ,cAAY;;IAEb,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,MAAA,CAAA,EAAA,GAAA,CAChB,YAEQ,MAAA,WAAA,GAAA,MAAA;4BADqC,EAAA,UAAA,GAA3C,YAA2C,wBAA3B,MAAA,WAAA,EAAY,QAAA,MAAM,QAAA,IAAI,CAAA,CAAA,EAAA,CAAA;;;IAGL,QAAA,QAAA,UAAA,GAArC,mBAAkE,OAAA;;KAA5D,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,SAAA,CAAA;KAAyB,WAAQ,QAAA;8CACnD,mBAEM,OAAA;;KAFA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,SAAA,CAAA;uBACb,QAAA,OAAO,GAAA,CAAA;IAEuB,QAAA,YAAY,QAAA,aAAQ,KAAA,UAAA,GAAvD,mBAEM,OAAA;;KAFA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,OAAA,CAAA;KAA8C,SAAK,cAAO,gBAAc,CAAA,MAAA,CAAA;QACxF,YAAwB,MAAA,WAAA,GAAA,MAAA;4BAAR,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { MessageProps, MessageType } from "../../types/message.js";
|
|
2
|
-
import * as _$vue from "vue";
|
|
3
|
-
|
|
4
2
|
//#region src/components/message/message.vue.d.ts
|
|
5
|
-
declare const __VLS_export:
|
|
3
|
+
declare const __VLS_export: import("vue").DefineComponent<MessageProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
6
4
|
close: () => any;
|
|
7
|
-
}, string,
|
|
5
|
+
}, string, import("vue").PublicProps, Readonly<MessageProps> & Readonly<{
|
|
8
6
|
onClose?: (() => any) | undefined;
|
|
9
7
|
}>, {
|
|
10
8
|
type: MessageType;
|
|
11
9
|
duration: number;
|
|
12
|
-
}, {}, {}, {}, string,
|
|
10
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
11
|
declare const _default: typeof __VLS_export;
|
|
14
12
|
//#endregion
|
|
15
13
|
export { _default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message2.js","names":["UMessageBox"],"sources":["../../../src/components/message/message.ts"],"sourcesContent":["import { bem, setStyles, zIndex } from '@veltra/utils'\nimport { h, render, shallowReactive } from 'vue'\n\nimport type { MessageOptions, Message, MessageInstance } from '../../types'\nimport UMessageBox from './message-box.vue'\n\nconst cls = bem('message')\n\n/** 消息项数据结构 */\ntype MessageItem = MessageOptions & { key: string }\n\n/** --- 状态管理 --- */\nlet container: HTMLElement | null = null\nconst messages = shallowReactive<MessageItem[]>([])\n\n/** 消息关闭后回调 */\nconst closedCallbacks = new Map<string, () => void>()\n\n/** 用于计数正在显示的 DOM 节点 (包含动画执行中) */\nlet activeCount = 0\nlet uid = 0\n\n/** --- 内部辅助函数 --- */\n\n/** 彻底销毁容器 */\nconst destroy = () => {\n if (container) {\n render(null, container)\n document.body.removeChild(container)\n container = null\n }\n}\n\n/** 离开动画结束后的清理 */\nconst handleClosed = (id: string) => {\n activeCount--\n\n const cb = closedCallbacks.get(id)\n if (cb) {\n cb()\n closedCallbacks.delete(id)\n }\n\n // 没有活跃消息时销毁容器,保持页面干净\n if (activeCount === 0) destroy()\n}\n\n/** 触发关闭 (仅从数组移除,触发 Transition 离开动画) */\nconst handleClose = (id: string) => {\n const index = messages.findIndex((m) => m.key === id)\n if (index !== -1) messages.splice(index, 1)\n}\n\n/** 挂载并渲染容器 */\nconst ensureContainer = () => {\n if (container) return container\n\n container = document.createElement('ul')\n container.className = cls.e('container')\n document.body.appendChild(container)\n return container\n}\n\n/** 执行 Vue 渲染逻辑 */\nconst updateView = () => {\n const el = ensureContainer()\n setStyles(el, { zIndex: zIndex() })\n\n const vnode = h(UMessageBox, {\n messages,\n onClosed: handleClosed,\n onClose: (i: number) => messages.splice(i, 1)\n })\n\n vnode.appContext = message._context\n render(vnode, el)\n}\n\n/** 创建消息实例 */\nconst createMessage = (options: MessageOptions): MessageInstance => {\n const { onClosed: userOnClosed, ...messageOptions } = options\n const id = `msg_${uid++}`\n activeCount++\n\n // 生命周期 Promise\n let resolveClosed: () => void\n const onClosed = new Promise<void>((r) => (resolveClosed = r))\n\n closedCallbacks.set(id, () => {\n userOnClosed?.()\n resolveClosed()\n })\n\n messages.push({ key: id, ...messageOptions })\n updateView()\n\n return { id, close: () => handleClose(id), onClosed }\n}\n\n/** --- 导出 API --- */\n\nexport const message = ((options) => {\n const mergedOptions = typeof options === 'string' ? { message: options } : options\n return createMessage(mergedOptions)\n}) as Message\n\nmessage._context = null\n\n// 挂载快捷方法: message.success(...)\nconst messageTypes = ['success', 'warn', 'info', 'error', 'default'] as const\nmessageTypes.forEach((type) => {\n message[type] = (msg, config) => message({ ...config, message: msg, type })\n})\n\n/** 关闭所有当前显示的消息 */\nmessage.closeAll = () => {\n messages.splice(0)\n}\n"],"mappings":";;;;AAMA,MAAM,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"message2.js","names":["UMessageBox"],"sources":["../../../src/components/message/message.ts"],"sourcesContent":["import { bem, setStyles, zIndex } from '@veltra/utils'\nimport { h, render, shallowReactive } from 'vue'\n\nimport type { MessageOptions, Message, MessageInstance } from '../../types'\nimport UMessageBox from './message-box.vue'\n\nconst cls = bem('message')\n\n/** 消息项数据结构 */\ntype MessageItem = MessageOptions & { key: string }\n\n/** --- 状态管理 --- */\nlet container: HTMLElement | null = null\nconst messages = shallowReactive<MessageItem[]>([])\n\n/** 消息关闭后回调 */\nconst closedCallbacks = new Map<string, () => void>()\n\n/** 用于计数正在显示的 DOM 节点 (包含动画执行中) */\nlet activeCount = 0\nlet uid = 0\n\n/** --- 内部辅助函数 --- */\n\n/** 彻底销毁容器 */\nconst destroy = () => {\n if (container) {\n render(null, container)\n document.body.removeChild(container)\n container = null\n }\n}\n\n/** 离开动画结束后的清理 */\nconst handleClosed = (id: string) => {\n activeCount--\n\n const cb = closedCallbacks.get(id)\n if (cb) {\n cb()\n closedCallbacks.delete(id)\n }\n\n // 没有活跃消息时销毁容器,保持页面干净\n if (activeCount === 0) destroy()\n}\n\n/** 触发关闭 (仅从数组移除,触发 Transition 离开动画) */\nconst handleClose = (id: string) => {\n const index = messages.findIndex((m) => m.key === id)\n if (index !== -1) messages.splice(index, 1)\n}\n\n/** 挂载并渲染容器 */\nconst ensureContainer = () => {\n if (container) return container\n\n container = document.createElement('ul')\n container.className = cls.e('container')\n document.body.appendChild(container)\n return container\n}\n\n/** 执行 Vue 渲染逻辑 */\nconst updateView = () => {\n const el = ensureContainer()\n setStyles(el, { zIndex: zIndex() })\n\n const vnode = h(UMessageBox, {\n messages,\n onClosed: handleClosed,\n onClose: (i: number) => messages.splice(i, 1)\n })\n\n vnode.appContext = message._context\n render(vnode, el)\n}\n\n/** 创建消息实例 */\nconst createMessage = (options: MessageOptions): MessageInstance => {\n const { onClosed: userOnClosed, ...messageOptions } = options\n const id = `msg_${uid++}`\n activeCount++\n\n // 生命周期 Promise\n let resolveClosed: () => void\n const onClosed = new Promise<void>((r) => (resolveClosed = r))\n\n closedCallbacks.set(id, () => {\n userOnClosed?.()\n resolveClosed()\n })\n\n messages.push({ key: id, ...messageOptions })\n updateView()\n\n return { id, close: () => handleClose(id), onClosed }\n}\n\n/** --- 导出 API --- */\n\nexport const message = ((options) => {\n const mergedOptions = typeof options === 'string' ? { message: options } : options\n return createMessage(mergedOptions)\n}) as Message\n\nmessage._context = null\n\n// 挂载快捷方法: message.success(...)\nconst messageTypes = ['success', 'warn', 'info', 'error', 'default'] as const\nmessageTypes.forEach((type) => {\n message[type] = (msg, config) => message({ ...config, message: msg, type })\n})\n\n/** 关闭所有当前显示的消息 */\nmessage.closeAll = () => {\n messages.splice(0)\n}\n"],"mappings":";;;;AAMA,MAAM,MAAM,IAAI,SAAS;;AAMzB,IAAI,YAAgC;AACpC,MAAM,WAAW,gBAA+B,CAAC,CAAC;;AAGlD,MAAM,kCAAkB,IAAI,IAAwB;;AAGpD,IAAI,cAAc;AAClB,IAAI,MAAM;;;AAKV,MAAM,gBAAgB;CACpB,IAAI,WAAW;EACb,OAAO,MAAM,SAAS;EACtB,SAAS,KAAK,YAAY,SAAS;EACnC,YAAY;CACd;AACF;;AAGA,MAAM,gBAAgB,OAAe;CACnC;CAEA,MAAM,KAAK,gBAAgB,IAAI,EAAE;CACjC,IAAI,IAAI;EACN,GAAG;EACH,gBAAgB,OAAO,EAAE;CAC3B;CAGA,IAAI,gBAAgB,GAAG,QAAQ;AACjC;;AAGA,MAAM,eAAe,OAAe;CAClC,MAAM,QAAQ,SAAS,WAAW,MAAM,EAAE,QAAQ,EAAE;CACpD,IAAI,UAAU,IAAI,SAAS,OAAO,OAAO,CAAC;AAC5C;;AAGA,MAAM,wBAAwB;CAC5B,IAAI,WAAW,OAAO;CAEtB,YAAY,SAAS,cAAc,IAAI;CACvC,UAAU,YAAY,IAAI,EAAE,WAAW;CACvC,SAAS,KAAK,YAAY,SAAS;CACnC,OAAO;AACT;;AAGA,MAAM,mBAAmB;CACvB,MAAM,KAAK,gBAAgB;CAC3B,UAAU,IAAI,EAAE,QAAQ,OAAO,EAAE,CAAC;CAElC,MAAM,QAAQ,EAAEA,WAAa;EAC3B;EACA,UAAU;EACV,UAAU,MAAc,SAAS,OAAO,GAAG,CAAC;CAC9C,CAAC;CAED,MAAM,aAAa,QAAQ;CAC3B,OAAO,OAAO,EAAE;AAClB;;AAGA,MAAM,iBAAiB,YAA6C;CAClE,MAAM,EAAE,UAAU,cAAc,GAAG,mBAAmB;CACtD,MAAM,KAAK,OAAO;CAClB;CAGA,IAAI;CACJ,MAAM,WAAW,IAAI,SAAe,MAAO,gBAAgB,CAAE;CAE7D,gBAAgB,IAAI,UAAU;EAC5B,eAAe;EACf,cAAc;CAChB,CAAC;CAED,SAAS,KAAK;EAAE,KAAK;EAAI,GAAG;CAAe,CAAC;CAC5C,WAAW;CAEX,OAAO;EAAE;EAAI,aAAa,YAAY,EAAE;EAAG;CAAS;AACtD;;AAIA,MAAa,YAAY,YAAY;CAEnC,OAAO,cADe,OAAO,YAAY,WAAW,EAAE,SAAS,QAAQ,IAAI,OACzC;AACpC;AAEA,QAAQ,WAAW;AAInB;CADsB;CAAW;CAAQ;CAAQ;CAAS;AAC/C,EAAE,SAAS,SAAS;CAC7B,QAAQ,SAAS,KAAK,WAAW,QAAQ;EAAE,GAAG;EAAQ,SAAS;EAAK;CAAK,CAAC;AAC5E,CAAC;;AAGD,QAAQ,iBAAiB;CACvB,SAAS,OAAO,CAAC;AACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-confirm.js","names":["$emit"],"sources":["../../../src/components/message-confirm/message-confirm.vue"],"sourcesContent":["<template>\n <transition name=\"message-confirm-fade\" @after-leave=\"$emit('destroy')\">\n <div :class=\"[cls.b, cls.m(size)]\" v-show=\"visible\">\n <div :class=\"cls.e('mask')\" :style=\"{ zIndex: `${zIndex()}` }\">\n <div :class=\"cls.e('box')\">\n <div :class=\"cls.e('header')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.e('content')\">{{ message }}</div>\n <div :class=\"cls.e('footer')\">\n <UButton\n plain\n @click=\"close('cancel')\"\n :class=\"cls.em('footer', 'btn')\"\n v-if=\"cancelButtonText\"\n >{{ cancelButtonText }}</UButton\n >\n <UButton\n :type=\"confirmButtonType\"\n @click=\"close('confirm')\"\n :class=\"cls.em('footer', 'btn')\"\n >{{ confirmButtonText }}</UButton\n >\n </div>\n </div>\n </div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { ref, onMounted } from 'vue'\n\nimport type { MessageConfirmProps, ColorType, ComponentSize } from '../../types'\nimport { UButton } from '../button'\n\ndefineOptions({ name: 'MessageConfirm' })\n\nconst props = withDefaults(defineProps<MessageConfirmProps>(), {\n title: '',\n message: '',\n confirmButtonText: '确定',\n confirmButtonType: 'primary' as ColorType,\n cancelButtonText: ''\n})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('message-confirm')\n\nconst visible = ref<boolean>(false)\n\nonMounted(() => {\n visible.value = true\n})\n\nconst close = (action: 'cancel' | 'confirm') => {\n visible.value = false\n if (props.onClose) props.onClose(action)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAsCA,MAAM,QAAQ;EAQd,MAAM,EAAE,SAAS,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"message-confirm.js","names":["$emit"],"sources":["../../../src/components/message-confirm/message-confirm.vue"],"sourcesContent":["<template>\n <transition name=\"message-confirm-fade\" @after-leave=\"$emit('destroy')\">\n <div :class=\"[cls.b, cls.m(size)]\" v-show=\"visible\">\n <div :class=\"cls.e('mask')\" :style=\"{ zIndex: `${zIndex()}` }\">\n <div :class=\"cls.e('box')\">\n <div :class=\"cls.e('header')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.e('content')\">{{ message }}</div>\n <div :class=\"cls.e('footer')\">\n <UButton\n plain\n @click=\"close('cancel')\"\n :class=\"cls.em('footer', 'btn')\"\n v-if=\"cancelButtonText\"\n >{{ cancelButtonText }}</UButton\n >\n <UButton\n :type=\"confirmButtonType\"\n @click=\"close('confirm')\"\n :class=\"cls.em('footer', 'btn')\"\n >{{ confirmButtonText }}</UButton\n >\n </div>\n </div>\n </div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { ref, onMounted } from 'vue'\n\nimport type { MessageConfirmProps, ColorType, ComponentSize } from '../../types'\nimport { UButton } from '../button'\n\ndefineOptions({ name: 'MessageConfirm' })\n\nconst props = withDefaults(defineProps<MessageConfirmProps>(), {\n title: '',\n message: '',\n confirmButtonText: '确定',\n confirmButtonType: 'primary' as ColorType,\n cancelButtonText: ''\n})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('message-confirm')\n\nconst visible = ref<boolean>(false)\n\nonMounted(() => {\n visible.value = true\n})\n\nconst close = (action: 'cancel' | 'confirm') => {\n visible.value = false\n if (props.onClose) props.onClose(action)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAsCA,MAAM,QAAQ;EAQd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,iBAAiB;EAEjC,MAAM,UAAU,IAAa,KAAK;EAElC,gBAAgB;GACd,QAAQ,QAAQ;EAClB,CAAC;EAED,MAAM,SAAS,WAAiC;GAC9C,QAAQ,QAAQ;GAChB,IAAI,MAAM,SAAS,MAAM,QAAQ,MAAM;EACzC;;uBA1DE,YAwBa,YAAA;IAxBD,MAAK;IAAwB,cAAW,OAAA,OAAA,OAAA,MAAA,WAAEA,KAAAA,MAAK,SAAA;IAA3D,WAAA;;2BAuBQ,CAAA,eAtBN,mBAsBM,OAAA,EAtBA,OAAK,eAAA,CAAG,MAAA,GAAA,EAAI,GAAG,MAAA,GAAA,EAAI,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA,EAAA,GAAA,CAC7B,mBAoBM,OAAA;KApBA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,MAAA,CAAA;KAAW,OAAK,eAAA,EAAA,QAAA,GAAe,MAAA,MAAA,EAAM,IAAA,CAAA;QACrD,mBAkBM,OAAA,EAlBA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,KAAA,CAAA,EAAA,GAAA;KACoB,QAAA,SAAA,UAAA,GAApC,mBAA4D,OAAA;;MAAtD,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,QAAA,CAAA;wBAA4B,QAAA,KAAK,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;KACnD,mBAAkD,OAAA,EAA5C,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,SAAA,CAAA,EAAA,GAAA,gBAAgB,QAAA,OAAO,GAAA,CAAA;KACzC,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,GAAA,EAAI,EAAC,QAAA,CAAA,EAAA,GAAA,CAKR,QAAA,oBAAA,UAAA,GAJR,YAMC,MAAA,WAAA,GAAA;;MALC,OAAA;MACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAK,QAAA;MACZ,OAAK,eAAE,MAAA,GAAA,EAAI,GAAE,UAAA,KAAA,CAAA;;6BAES,CAAA,gBAAA,gBAAnB,QAAA,gBAAgB,GAAA,CAAA,CAAA,CAAA;;2DAEtB,YAKC,MAAA,WAAA,GAAA;MAJE,MAAM,QAAA;MACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAK,SAAA;MACZ,OAAK,eAAE,MAAA,GAAA,EAAI,GAAE,UAAA,KAAA,CAAA;;6BACU,CAAA,gBAAA,gBAApB,QAAA,iBAAiB,GAAA,CAAA,CAAA,CAAA;;;8BAjBY,QAAA,KAAO,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { MessageConfirmProps } from "../../types/message-confirm.js";
|
|
2
2
|
import { index_d_exports } from "../../types/index.js";
|
|
3
|
-
import * as _$vue from "vue";
|
|
4
3
|
|
|
5
4
|
//#region src/components/message-confirm/message-confirm.vue.d.ts
|
|
6
|
-
declare const __VLS_export:
|
|
5
|
+
declare const __VLS_export: import("vue").DefineComponent<MessageConfirmProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MessageConfirmProps> & Readonly<{}>, {
|
|
7
6
|
title: string;
|
|
8
7
|
message: string;
|
|
9
8
|
confirmButtonText: string;
|
|
10
9
|
cancelButtonText: string;
|
|
11
10
|
confirmButtonType: index_d_exports.ColorType;
|
|
12
|
-
}, {}, {}, {}, string,
|
|
11
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
12
|
declare const _default: typeof __VLS_export;
|
|
14
13
|
//#endregion
|
|
15
14
|
export { _default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-confirm2.js","names":["UMessageConfirm"],"sources":["../../../src/components/message-confirm/message-confirm.ts"],"sourcesContent":["import { zIndex } from '@veltra/utils'\nimport { createVNode, render } from 'vue'\n\nimport type { MessageConfirmProps, ColorType } from '../../types'\nimport UMessageConfirm from './message-confirm.vue'\n\nconst ColorTypeArray: ColorType[] = ['primary', 'success', 'info', 'warning', 'danger']\n\ntype MessageConfirmFn = (options: MessageConfirmProps) => void\n\ntype MessageConfirmTypeFn = {\n [k in ColorType]: (message: string, onClose?: (action: 'cancel' | 'confirm') => void) => void\n} & MessageConfirmFn\n\nconst MessageConfirm: MessageConfirmFn & Partial<MessageConfirmTypeFn> = (\n options: MessageConfirmProps\n) => {\n const container = document.createElement('div')\n const vm = createVNode(UMessageConfirm, { ...options, zIndex: zIndex() })\n vm.props!.onDestroy = () => render(null, container)\n render(vm, container)\n document.body.appendChild(container.firstElementChild!)\n}\n\nColorTypeArray.forEach((type) => {\n MessageConfirm[type] = (message: string, onClose?: (action: 'cancel' | 'confirm') => void) => {\n return MessageConfirm({ message, confirmButtonType: type, onClose })\n }\n})\n\nexport default MessageConfirm as MessageConfirmTypeFn\n"],"mappings":";;;;AAMA,MAAM,iBAA8B;CAAC;CAAW;CAAW;CAAQ;CAAW;
|
|
1
|
+
{"version":3,"file":"message-confirm2.js","names":["UMessageConfirm"],"sources":["../../../src/components/message-confirm/message-confirm.ts"],"sourcesContent":["import { zIndex } from '@veltra/utils'\nimport { createVNode, render } from 'vue'\n\nimport type { MessageConfirmProps, ColorType } from '../../types'\nimport UMessageConfirm from './message-confirm.vue'\n\nconst ColorTypeArray: ColorType[] = ['primary', 'success', 'info', 'warning', 'danger']\n\ntype MessageConfirmFn = (options: MessageConfirmProps) => void\n\ntype MessageConfirmTypeFn = {\n [k in ColorType]: (message: string, onClose?: (action: 'cancel' | 'confirm') => void) => void\n} & MessageConfirmFn\n\nconst MessageConfirm: MessageConfirmFn & Partial<MessageConfirmTypeFn> = (\n options: MessageConfirmProps\n) => {\n const container = document.createElement('div')\n const vm = createVNode(UMessageConfirm, { ...options, zIndex: zIndex() })\n vm.props!.onDestroy = () => render(null, container)\n render(vm, container)\n document.body.appendChild(container.firstElementChild!)\n}\n\nColorTypeArray.forEach((type) => {\n MessageConfirm[type] = (message: string, onClose?: (action: 'cancel' | 'confirm') => void) => {\n return MessageConfirm({ message, confirmButtonType: type, onClose })\n }\n})\n\nexport default MessageConfirm as MessageConfirmTypeFn\n"],"mappings":";;;;AAMA,MAAM,iBAA8B;CAAC;CAAW;CAAW;CAAQ;CAAW;AAAQ;AAQtF,MAAM,kBACJ,YACG;CACH,MAAM,YAAY,SAAS,cAAc,KAAK;CAC9C,MAAM,KAAK,YAAYA,WAAiB;EAAE,GAAG;EAAS,QAAQ,OAAO;CAAE,CAAC;CACxE,GAAG,MAAO,kBAAkB,OAAO,MAAM,SAAS;CAClD,OAAO,IAAI,SAAS;CACpB,SAAS,KAAK,YAAY,UAAU,iBAAkB;AACxD;AAEA,eAAe,SAAS,SAAS;CAC/B,eAAe,SAAS,SAAiB,YAAqD;EAC5F,OAAO,eAAe;GAAE;GAAS,mBAAmB;GAAM;EAAQ,CAAC;CACrE;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"di.js","names":[],"sources":["../../../src/components/multi-select/di.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\n\nexport const MultiSelectDIKey: InjectionKey<{\n /** 选项类 */\n optionClass: string\n /** 波纹类 */\n rippleClass: string\n /** 复选框类 */\n checkboxClass: string\n}> = Symbol('MultiSelectDIKey')\n"],"mappings":";AAEA,MAAa,mBAOR,OAAO,
|
|
1
|
+
{"version":3,"file":"di.js","names":[],"sources":["../../../src/components/multi-select/di.ts"],"sourcesContent":["import type { InjectionKey } from 'vue'\n\nexport const MultiSelectDIKey: InjectionKey<{\n /** 选项类 */\n optionClass: string\n /** 波纹类 */\n rippleClass: string\n /** 复选框类 */\n checkboxClass: string\n}> = Symbol('MultiSelectDIKey')\n"],"mappings":";AAEA,MAAa,mBAOR,OAAO,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select-option.js","names":[],"sources":["../../../src/components/multi-select/multi-select-option.vue"],"sourcesContent":["<template>\n <li\n :class=\"optionClass\"\n @click=\"handleClick\"\n @mousedown=\"handleMousedown\"\n @mouseup=\"handleMouseup\"\n @mouseleave=\"handleMouseleave\"\n :ref=\"measureRef\"\n >\n <u-checkbox\n :class=\"checkboxClass\"\n :model-value=\"checked\"\n @update:model-value=\"emit('check', $event)\"\n @click.stop\n :disabled=\"disabled\"\n />\n\n <slot />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Ripple } from '@veltra/directives'\nimport { inject, onBeforeUnmount, shallowRef } from 'vue'\n\nimport { UCheckbox } from '../checkbox'\nimport { MultiSelectDIKey } from './di'\n\ndefineOptions({ name: 'MultiSelectOption' })\n\nconst props = defineProps<{\n option: Record<string, any>\n disabled?: boolean\n checked: boolean\n /**\n * 虚拟项索引:对应 `options` 数组中的绝对位置。\n * 非虚拟模式下可省略;虚拟模式下必须传入,否则元素卸载时 Virtualizer 无法及时解绑,\n * 会因为 ResizeObserver 对脱离 DOM 的元素回调 size=0 而污染尺寸缓存。\n */\n index?: number\n measureElement?: (index: number, el: Element | null) => void\n}>()\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nconst emit = defineEmits<{ (e: 'check', checked: boolean): void }>()\n\nconst { optionClass, rippleClass, checkboxClass } = inject(MultiSelectDIKey)!\n\nconst rippleRef = shallowRef<Ripple | null>(null)\n\nfunction handleClick(e) {\n if (props.disabled) return\n emit('check', !props.checked)\n}\n\nfunction handleMousedown(e: MouseEvent) {\n if (props.disabled) return\n\n // 清理旧实例,避免同一元素上多个 Ripple 实例同时修改样式\n if (rippleRef.value) {\n rippleRef.value.remove()\n rippleRef.value = null\n }\n\n rippleRef.value = new Ripple(e.currentTarget as HTMLElement, { rippleClass })\n\n rippleRef.value.showByEvent(e)\n}\n\nfunction handleMouseleave() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nfunction handleMouseup() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nonBeforeUnmount(() => {\n rippleRef.value?.remove()\n rippleRef.value = null\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAad,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"multi-select-option.js","names":[],"sources":["../../../src/components/multi-select/multi-select-option.vue"],"sourcesContent":["<template>\n <li\n :class=\"optionClass\"\n @click=\"handleClick\"\n @mousedown=\"handleMousedown\"\n @mouseup=\"handleMouseup\"\n @mouseleave=\"handleMouseleave\"\n :ref=\"measureRef\"\n >\n <u-checkbox\n :class=\"checkboxClass\"\n :model-value=\"checked\"\n @update:model-value=\"emit('check', $event)\"\n @click.stop\n :disabled=\"disabled\"\n />\n\n <slot />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Ripple } from '@veltra/directives'\nimport { inject, onBeforeUnmount, shallowRef } from 'vue'\n\nimport { UCheckbox } from '../checkbox'\nimport { MultiSelectDIKey } from './di'\n\ndefineOptions({ name: 'MultiSelectOption' })\n\nconst props = defineProps<{\n option: Record<string, any>\n disabled?: boolean\n checked: boolean\n /**\n * 虚拟项索引:对应 `options` 数组中的绝对位置。\n * 非虚拟模式下可省略;虚拟模式下必须传入,否则元素卸载时 Virtualizer 无法及时解绑,\n * 会因为 ResizeObserver 对脱离 DOM 的元素回调 size=0 而污染尺寸缓存。\n */\n index?: number\n measureElement?: (index: number, el: Element | null) => void\n}>()\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nconst emit = defineEmits<{ (e: 'check', checked: boolean): void }>()\n\nconst { optionClass, rippleClass, checkboxClass } = inject(MultiSelectDIKey)!\n\nconst rippleRef = shallowRef<Ripple | null>(null)\n\nfunction handleClick(e) {\n if (props.disabled) return\n emit('check', !props.checked)\n}\n\nfunction handleMousedown(e: MouseEvent) {\n if (props.disabled) return\n\n // 清理旧实例,避免同一元素上多个 Ripple 实例同时修改样式\n if (rippleRef.value) {\n rippleRef.value.remove()\n rippleRef.value = null\n }\n\n rippleRef.value = new Ripple(e.currentTarget as HTMLElement, { rippleClass })\n\n rippleRef.value.showByEvent(e)\n}\n\nfunction handleMouseleave() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nfunction handleMouseup() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nonBeforeUnmount(() => {\n rippleRef.value?.remove()\n rippleRef.value = null\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAad,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,EAAoB;EACxD;EAEA,MAAM,OAAO;EAEb,MAAM,EAAE,aAAa,aAAa,kBAAkB,OAAO,gBAAgB;EAE3E,MAAM,YAAY,WAA0B,IAAI;EAEhD,SAAS,YAAY,GAAG;GACtB,IAAI,MAAM,UAAU;GACpB,KAAK,SAAS,CAAC,MAAM,OAAO;EAC9B;EAEA,SAAS,gBAAgB,GAAe;GACtC,IAAI,MAAM,UAAU;GAGpB,IAAI,UAAU,OAAO;IACnB,UAAU,MAAM,OAAO;IACvB,UAAU,QAAQ;GACpB;GAEA,UAAU,QAAQ,IAAI,OAAO,EAAE,eAA8B,EAAE,YAAY,CAAC;GAE5E,UAAU,MAAM,YAAY,CAAC;EAC/B;EAEA,SAAS,mBAAmB;GAC1B,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB;EAEA,SAAS,gBAAgB;GACvB,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB;EAEA,sBAAsB;GACpB,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB,CAAC;;uBArFC,mBAiBK,MAAA;IAhBF,OAAK,eAAE,MAAA,WAAA,CAAW;IAClB,SAAO;IACP,aAAW;IACX,WAAS;IACT,cAAY;IACZ,KAAK;OAEN,YAME,MAAA,WAAA,GAAA;IALC,OAAK,eAAE,MAAA,aAAA,CAAa;IACpB,eAAa,QAAA;IACb,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAU,MAAM;IACxC,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;IACV,UAAU,QAAA;;;;;OAGb,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,EAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select.js","names":[],"sources":["../../../src/components/multi-select/multi-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n :disabled=\"disabled\"\n @update:visible=\"handleDropdownVisible\"\n >\n <!-- 触发 -->\n <template #trigger>\n <span :class=\"cls.e('placeholder')\" v-show=\"!model?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"model?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"option of tags\"\n :key=\"option[valueKey]\"\n :closable=\"!disabled\"\n @close=\"handleClose(option)\"\n >\n {{ option[labelKey] }}\n </u-tag>\n <u-tag v-if=\"restTag\"> {{ restTag }}+ </u-tag>\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && model?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <!-- 多选栏 -->\n <div :class=\"cls.e('content-header')\">\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n :disabled=\"max !== undefined\"\n >\n 全选\n </u-checkbox>\n\n <span> 已选 {{ model?.length }}/{{ max ?? options?.length ?? 0 }} </span>\n </div>\n\n <!-- 过滤器 -->\n <div v-if=\"filterable\" :class=\"cls.e('content-filter')\">\n <u-input\n placeholder=\"输入关键字进行过滤\"\n v-model=\"queryString\"\n @keydown.enter.prevent=\"handleCreateByEnter\"\n >\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <!-- 多选列表 -->\n <!--\n 虚拟化启用时内容容器 height 由 useVirtualizer 命令式写入;\n 模板不再绑定 totalSize,避免尺寸变化引起重渲染。\n -->\n <u-scroll\n tag=\"ul\"\n :class=\"[cls.e('options')]\"\n ref=\"scrollRef\"\n v-if=\"options.length\"\n :content-class=\"[cls.e('options-wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <u-multi-select-option\n v-for=\"{ option, index, key, label, offset } of virtualOptions\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"key\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ label }}\n </slot>\n </u-multi-select-option>\n </template>\n\n <template v-else>\n <u-multi-select-option\n v-for=\"(option, index) of options\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"chainObj(option).get(valueKey)\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ chainObj(option).get(labelKey) }}\n </slot>\n </u-multi-select-option>\n </template>\n </u-scroll>\n\n <div v-else :class=\"cls.e('empty')\">\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o as chainObj } from '@cat-kit/core'\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, shallowReactive, watch, provide } from 'vue'\n\nimport type {\n MultiSelectEmits,\n MultiSelectProps,\n ScrollExposed,\n DropdownExposed\n} from '../../types'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UScroll } from '../scroll'\nimport { useOptions } from '../select/use-options'\nimport { UTag } from '../tag'\nimport { MultiSelectDIKey } from './di'\nimport UMultiSelectOption from './multi-select-option.vue'\n\ndefineOptions({ name: 'MultiSelect' })\n\nconst props = withDefaults(defineProps<MultiSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n clearable: true,\n visibilityLimit: 3,\n disabled: undefined,\n readonly: undefined,\n minWidth: '220px'\n})\n\nconst emit = defineEmits<MultiSelectEmits>()\n\nconst cls = bem('multi-select')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst hovered = shallowRef(false)\n\nconst { options: rawOptions, queryString, allOptions: rawAllOptions } = useOptions({ props })\n\nconst createdOptions = shallowRef<Record<string, any>[]>([])\n\nconst options = computed(() => {\n const base = rawOptions.value\n if (!props.creatable || !createdOptions.value.length) return base\n\n const { valueKey } = props\n const createdValues = new Set(createdOptions.value.map((o) => chainObj(o).get(valueKey)))\n const deduped = base.filter((o) => !(o.__isTemp && createdValues.has(chainObj(o).get(valueKey))))\n const dedupedValues = new Set(deduped.map((o) => chainObj(o).get(valueKey)))\n const toAdd = createdOptions.value.filter((o) => !dedupedValues.has(chainObj(o).get(valueKey)))\n return [...toAdd, ...deduped]\n})\n\nconst allOptions = computed(() => {\n if (!props.creatable || !createdOptions.value.length) return rawAllOptions.value\n return [...createdOptions.value, ...rawAllOptions.value]\n})\n\nconst virtualEnabled = computed(() => options.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n estimateSize: () => 40,\n count: computed(() => options.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null)\n})\n\nconst virtualOptions = computed(() => {\n const { valueKey, labelKey } = props\n const _options = options.value\n return items.value.map((v) => {\n const option = _options[v.index]!\n const val = chainObj(option).get(valueKey)\n return {\n option,\n index: v.index,\n val,\n key: v.index,\n offset: v.start,\n label: chainObj(option).get(labelKey)\n }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nconst filterable = computed(() => {\n return props.filterable || props.creatable || typeof props.options === 'function'\n})\n\nconst model = defineModel<Array<string | number>>()\n\nconst checkedSet = shallowReactive<Set<Record<string, any>>>(new Set())\nconst allChecked = computed(() => {\n return checkedSet.size === options.value.length\n})\nconst indeterminate = computed(() => {\n return checkedSet.size > 0 && !allChecked.value\n})\n\nconst optionsMap = computed(() => {\n const { valueKey } = props\n return new Map<string | number, Record<string, any>>(\n allOptions.value.map((option) => [option[valueKey], option])\n )\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet internalChange = false\n\nwatch(\n [model, optionsMap],\n ([model, optionsMap]) => {\n if (internalChange) {\n internalChange = false\n return\n }\n checkedSet.clear()\n if (optionsMap.size && model?.length) {\n model.forEach((v) => {\n const option = optionsMap.get(v)\n option && checkedSet.add(option)\n })\n }\n },\n { immediate: true }\n)\n\nconst emitChange = () => {\n emit('change', Array.from(checkedSet))\n}\n\nconst tags = computed(() => {\n let tags: Record<string, any>[] = []\n let { visibilityLimit } = props\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n\n // 禁用时,显示全部\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n\n model.value?.slice(0, visibilityLimit).forEach((k) => {\n const option = optionsMap.value.get(k)\n option && tags.push(option)\n })\n\n return tags\n})\n\nconst restTag = computed(() => {\n return (model.value?.length ?? 0) - tags.value.length\n})\n\nconst handleDropdownVisible = (visible: boolean) => {\n if (!visible) {\n queryString.value = ''\n }\n}\n\nconst handleCheck = (option: Record<string, any>, checked: boolean) => {\n const { valueKey, labelKey } = props\n if (checked) {\n if (option.__isTemp && props.creatable) {\n const created: Record<string, any> = {\n [labelKey]: chainObj(option).get(labelKey),\n [valueKey]: chainObj(option).get(valueKey)\n }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(created).get(valueKey)]\n queryString.value = ''\n } else if (!checkedSet.has(option)) {\n checkedSet.add(option)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(option).get(valueKey)]\n }\n } else {\n checkedSet.delete(option)\n const val = chainObj(option).get(valueKey)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\n/** 全选 */\nconst handleCheckAll = (checked: boolean) => {\n const { valueKey } = props\n if (checked) {\n options.value.forEach((option) => {\n if (!option.__isTemp) checkedSet.add(option)\n })\n internalChange = true\n model.value = Array.from(checkedSet).map((o) => chainObj(o).get(valueKey))\n } else {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\n/** 清除选项 */\nconst handleClear = () => {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n emit('change', [])\n}\n\nconst handleClose = (option: Record<string, any>) => {\n checkedSet.delete(option)\n const val = chainObj(option).get(props.valueKey)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n emitChange()\n}\n\nconst removeCreatedOption = (option: Record<string, any>) => {\n if (!props.creatable || !createdOptions.value.length) return\n const { valueKey } = props\n const val = chainObj(option).get(valueKey)\n createdOptions.value = createdOptions.value.filter((o) => chainObj(o).get(valueKey) !== val)\n}\n\nconst handleCreateByEnter = () => {\n if (!props.creatable) return\n const qs = queryString.value?.trim()\n if (!qs) return\n\n const { labelKey, valueKey } = props\n\n const existingCreated = createdOptions.value.find((o) => chainObj(o).get(valueKey) === qs)\n if (existingCreated) {\n if (!checkedSet.has(existingCreated)) {\n checkedSet.add(existingCreated)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(existingCreated).get(valueKey)]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const exactMatch = rawOptions.value.find((o) => !o.__isTemp && chainObj(o).get(labelKey) === qs)\n if (exactMatch) {\n if (!checkedSet.has(exactMatch)) {\n checkedSet.add(exactMatch)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(exactMatch).get(valueKey)]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const created: Record<string, any> = { [labelKey]: qs, [valueKey]: qs }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), qs]\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\nconst isDisabled = (option: Record<string, any>) => {\n const { max } = props\n return max !== undefined && checkedSet.size >= max && !checkedSet.has(option)\n}\n\nconst optionClass = cls.e('option')\nconst rippleClass = cls.e('ripple')\nconst checkboxClass = cls.e('checkbox')\n\nprovide(MultiSelectDIKey, { optionClass, rippleClass, checkboxClass })\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-select.js","names":[],"sources":["../../../src/components/multi-select/multi-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n :disabled=\"disabled\"\n @update:visible=\"handleDropdownVisible\"\n >\n <!-- 触发 -->\n <template #trigger>\n <span :class=\"cls.e('placeholder')\" v-show=\"!model?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"model?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"option of tags\"\n :key=\"option[valueKey]\"\n :closable=\"!disabled\"\n @close=\"handleClose(option)\"\n >\n {{ option[labelKey] }}\n </u-tag>\n <u-tag v-if=\"restTag\"> {{ restTag }}+ </u-tag>\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && model?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <!-- 多选栏 -->\n <div :class=\"cls.e('content-header')\">\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n :disabled=\"max !== undefined\"\n >\n 全选\n </u-checkbox>\n\n <span> 已选 {{ model?.length }}/{{ max ?? options?.length ?? 0 }} </span>\n </div>\n\n <!-- 过滤器 -->\n <div v-if=\"filterable\" :class=\"cls.e('content-filter')\">\n <u-input\n placeholder=\"输入关键字进行过滤\"\n v-model=\"queryString\"\n @keydown.enter.prevent=\"handleCreateByEnter\"\n >\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <!-- 多选列表 -->\n <!--\n 虚拟化启用时内容容器 height 由 useVirtualizer 命令式写入;\n 模板不再绑定 totalSize,避免尺寸变化引起重渲染。\n -->\n <u-scroll\n tag=\"ul\"\n :class=\"[cls.e('options')]\"\n ref=\"scrollRef\"\n v-if=\"options.length\"\n :content-class=\"[cls.e('options-wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <u-multi-select-option\n v-for=\"{ option, index, key, label, offset } of virtualOptions\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"key\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ label }}\n </slot>\n </u-multi-select-option>\n </template>\n\n <template v-else>\n <u-multi-select-option\n v-for=\"(option, index) of options\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"chainObj(option).get(valueKey)\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ chainObj(option).get(labelKey) }}\n </slot>\n </u-multi-select-option>\n </template>\n </u-scroll>\n\n <div v-else :class=\"cls.e('empty')\">\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o as chainObj } from '@cat-kit/core'\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, shallowReactive, watch, provide } from 'vue'\n\nimport type {\n MultiSelectEmits,\n MultiSelectProps,\n ScrollExposed,\n DropdownExposed\n} from '../../types'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UScroll } from '../scroll'\nimport { useOptions } from '../select/use-options'\nimport { UTag } from '../tag'\nimport { MultiSelectDIKey } from './di'\nimport UMultiSelectOption from './multi-select-option.vue'\n\ndefineOptions({ name: 'MultiSelect' })\n\nconst props = withDefaults(defineProps<MultiSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n clearable: true,\n visibilityLimit: 3,\n disabled: undefined,\n readonly: undefined,\n minWidth: '220px'\n})\n\nconst emit = defineEmits<MultiSelectEmits>()\n\nconst cls = bem('multi-select')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst hovered = shallowRef(false)\n\nconst { options: rawOptions, queryString, allOptions: rawAllOptions } = useOptions({ props })\n\nconst createdOptions = shallowRef<Record<string, any>[]>([])\n\nconst options = computed(() => {\n const base = rawOptions.value\n if (!props.creatable || !createdOptions.value.length) return base\n\n const { valueKey } = props\n const createdValues = new Set(createdOptions.value.map((o) => chainObj(o).get(valueKey)))\n const deduped = base.filter((o) => !(o.__isTemp && createdValues.has(chainObj(o).get(valueKey))))\n const dedupedValues = new Set(deduped.map((o) => chainObj(o).get(valueKey)))\n const toAdd = createdOptions.value.filter((o) => !dedupedValues.has(chainObj(o).get(valueKey)))\n return [...toAdd, ...deduped]\n})\n\nconst allOptions = computed(() => {\n if (!props.creatable || !createdOptions.value.length) return rawAllOptions.value\n return [...createdOptions.value, ...rawAllOptions.value]\n})\n\nconst virtualEnabled = computed(() => options.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n estimateSize: () => 40,\n count: computed(() => options.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null)\n})\n\nconst virtualOptions = computed(() => {\n const { valueKey, labelKey } = props\n const _options = options.value\n return items.value.map((v) => {\n const option = _options[v.index]!\n const val = chainObj(option).get(valueKey)\n return {\n option,\n index: v.index,\n val,\n key: v.index,\n offset: v.start,\n label: chainObj(option).get(labelKey)\n }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nconst filterable = computed(() => {\n return props.filterable || props.creatable || typeof props.options === 'function'\n})\n\nconst model = defineModel<Array<string | number>>()\n\nconst checkedSet = shallowReactive<Set<Record<string, any>>>(new Set())\nconst allChecked = computed(() => {\n return checkedSet.size === options.value.length\n})\nconst indeterminate = computed(() => {\n return checkedSet.size > 0 && !allChecked.value\n})\n\nconst optionsMap = computed(() => {\n const { valueKey } = props\n return new Map<string | number, Record<string, any>>(\n allOptions.value.map((option) => [option[valueKey], option])\n )\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet internalChange = false\n\nwatch(\n [model, optionsMap],\n ([model, optionsMap]) => {\n if (internalChange) {\n internalChange = false\n return\n }\n checkedSet.clear()\n if (optionsMap.size && model?.length) {\n model.forEach((v) => {\n const option = optionsMap.get(v)\n option && checkedSet.add(option)\n })\n }\n },\n { immediate: true }\n)\n\nconst emitChange = () => {\n emit('change', Array.from(checkedSet))\n}\n\nconst tags = computed(() => {\n let tags: Record<string, any>[] = []\n let { visibilityLimit } = props\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n\n // 禁用时,显示全部\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n\n model.value?.slice(0, visibilityLimit).forEach((k) => {\n const option = optionsMap.value.get(k)\n option && tags.push(option)\n })\n\n return tags\n})\n\nconst restTag = computed(() => {\n return (model.value?.length ?? 0) - tags.value.length\n})\n\nconst handleDropdownVisible = (visible: boolean) => {\n if (!visible) {\n queryString.value = ''\n }\n}\n\nconst handleCheck = (option: Record<string, any>, checked: boolean) => {\n const { valueKey, labelKey } = props\n if (checked) {\n if (option.__isTemp && props.creatable) {\n const created: Record<string, any> = {\n [labelKey]: chainObj(option).get(labelKey),\n [valueKey]: chainObj(option).get(valueKey)\n }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(created).get(valueKey)]\n queryString.value = ''\n } else if (!checkedSet.has(option)) {\n checkedSet.add(option)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(option).get(valueKey)]\n }\n } else {\n checkedSet.delete(option)\n const val = chainObj(option).get(valueKey)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\n/** 全选 */\nconst handleCheckAll = (checked: boolean) => {\n const { valueKey } = props\n if (checked) {\n options.value.forEach((option) => {\n if (!option.__isTemp) checkedSet.add(option)\n })\n internalChange = true\n model.value = Array.from(checkedSet).map((o) => chainObj(o).get(valueKey))\n } else {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\n/** 清除选项 */\nconst handleClear = () => {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n emit('change', [])\n}\n\nconst handleClose = (option: Record<string, any>) => {\n checkedSet.delete(option)\n const val = chainObj(option).get(props.valueKey)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n emitChange()\n}\n\nconst removeCreatedOption = (option: Record<string, any>) => {\n if (!props.creatable || !createdOptions.value.length) return\n const { valueKey } = props\n const val = chainObj(option).get(valueKey)\n createdOptions.value = createdOptions.value.filter((o) => chainObj(o).get(valueKey) !== val)\n}\n\nconst handleCreateByEnter = () => {\n if (!props.creatable) return\n const qs = queryString.value?.trim()\n if (!qs) return\n\n const { labelKey, valueKey } = props\n\n const existingCreated = createdOptions.value.find((o) => chainObj(o).get(valueKey) === qs)\n if (existingCreated) {\n if (!checkedSet.has(existingCreated)) {\n checkedSet.add(existingCreated)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(existingCreated).get(valueKey)]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const exactMatch = rawOptions.value.find((o) => !o.__isTemp && chainObj(o).get(labelKey) === qs)\n if (exactMatch) {\n if (!checkedSet.has(exactMatch)) {\n checkedSet.add(exactMatch)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(exactMatch).get(valueKey)]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const created: Record<string, any> = { [labelKey]: qs, [valueKey]: qs }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), qs]\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\nconst isDisabled = (option: Record<string, any>) => {\n const { max } = props\n return max !== undefined && checkedSet.size >= max && !checkedSet.has(option)\n}\n\nconst optionClass = cls.e('option')\nconst rippleClass = cls.e('ripple')\nconst checkboxClass = cls.e('checkbox')\n\nprovide(MultiSelectDIKey, { optionClass, rippleClass, checkboxClass })\n</script>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { MultiSelectProps } from "../../types/multi-select.js";
|
|
2
|
-
import * as _$vue from "vue";
|
|
3
|
-
|
|
4
2
|
//#region src/components/multi-select/multi-select.vue.d.ts
|
|
5
3
|
type __VLS_Props = MultiSelectProps;
|
|
6
4
|
type __VLS_ModelProps = {
|
|
@@ -19,24 +17,24 @@ type __VLS_Slots = {} & {
|
|
|
19
17
|
} & {
|
|
20
18
|
default?: (props: typeof __VLS_113) => any;
|
|
21
19
|
};
|
|
22
|
-
declare const __VLS_base:
|
|
20
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
23
21
|
"update:modelValue": (value: (string | number)[] | undefined) => any;
|
|
24
22
|
} & {
|
|
25
23
|
"update:modelValue": (value: any[]) => any;
|
|
26
24
|
change: (options: Record<string, any>[]) => any;
|
|
27
|
-
}, string,
|
|
25
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
28
26
|
"onUpdate:modelValue"?: ((value: any[]) => any) | undefined;
|
|
29
27
|
onChange?: ((options: Record<string, any>[]) => any) | undefined;
|
|
30
28
|
}>, {
|
|
31
29
|
disabled: boolean;
|
|
32
30
|
readonly: boolean;
|
|
31
|
+
labelKey: string;
|
|
32
|
+
valueKey: string;
|
|
33
33
|
placeholder: string;
|
|
34
34
|
clearable: boolean;
|
|
35
35
|
minWidth: string;
|
|
36
|
-
labelKey: string;
|
|
37
|
-
valueKey: string;
|
|
38
36
|
visibilityLimit: number;
|
|
39
|
-
}, {}, {}, {}, string,
|
|
37
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
40
38
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
41
39
|
declare const _default: typeof __VLS_export;
|
|
42
40
|
type __VLS_WithSlots<T, S> = T & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-tree-select.js","names":[],"sources":["../../../src/components/multi-tree-select/multi-tree-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :disabled=\"disabled\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n ref=\"dropdownRef\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <!-- 默认展示 -->\n <span :class=\"cls.e('placeholder')\" v-show=\"!tags.length\">\n {{ placeholder }}\n </span>\n\n <!-- 选择的数据项 -->\n <div v-if=\"tags.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"(tag, index) in visibleTags\"\n :key=\"tag[valueKey]\"\n :closable=\"!disabled\"\n @close=\"handleRemove(index)\"\n >\n {{ tag[labelKey] }}\n </u-tag>\n <u-tag v-if=\"hiddenCount > 0\">+{{ hiddenCount }}</u-tag>\n </div>\n <!-- 清空 icon -->\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon v-if=\"showClear\" :class=\"cls.e('clear')\" @click.stop=\"handleClear\">\n <Close />\n </u-icon>\n\n <!-- 下拉 icon -->\n <u-icon :class=\"cls.e(`arrow`)\" v-else-if=\"!readonly\">\n <ArrowDown />\n </u-icon>\n </transition>\n </template>\n <template #content>\n <div :class=\"[cls.e('content-header'), cls.m(size)]\">\n <!-- 全选 -->\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n >\n 全选\n </u-checkbox>\n\n <u-button size=\"small\" text type=\"primary\" @click=\"handleToggleExpandAll\">\n {{ allExpanded ? '收起全部' : '展开全部' }}\n </u-button>\n </div>\n <!-- 过滤器 -->\n <div v-if=\"filterable\" :class=\"[cls.e('content-filter'), cls.m(size)]\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\">\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n <!-- 菜单列表 -->\n <u-tree\n v-bind=\"treeProps\"\n v-model:checked=\"model\"\n @update:checked=\"handleCheck\"\n ref=\"treeRef\"\n :class=\"cls.e('content-tree')\"\n checkable\n :data=\"data\"\n :slots=\"slots\"\n scroll-to-view\n ></u-tree>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { dfs, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, shallowRef, watch } from 'vue'\n\nimport type { MultiTreeSelectProps, MultiTreeSelectEmits, TreeExposed } from '../../types'\nimport type { DropdownExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport { UTree } from '../tree'\nimport type { TreeSlotsScope } from '../tree/di'\n\ndefineOptions({ name: 'MultiTreeSelect' })\n\nconst cls = bem('multi-tree-select')\n\nconst props = withDefaults(defineProps<MultiTreeSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n expandAll: false,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n filterable: false,\n visibilityLimit: 3,\n minWidth: '280px'\n})\n\nconst treeProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'tips',\n 'field',\n 'placeholder',\n 'disabled',\n 'label',\n 'readonly',\n 'modelValue',\n 'contentClass',\n 'contentStyle',\n 'minWidth',\n 'width'\n ])\n})\n\nconst emit = defineEmits<MultiTreeSelectEmits>()\n\nconst slots = defineSlots<{ default?: (props: TreeSlotsScope) => any }>()\n\n/**过滤 */\nconst qs = shallowRef('')\nwatch(qs, (qs) => {\n treeRef.value?.filter(qs)\n})\n\nconst model = defineModel<(string | number)[]>({ default: () => [] })\n\nconst hovered = shallowRef(false)\n\nconst tags = shallowRef<Record<string, any>[]>([])\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst showClear = computed(() => {\n return props.clearable && model.value?.length && hovered.value && !disabled.value\n})\n\nconst treeRef = shallowRef<TreeExposed>()\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet changedByEvent = false\n\nfunction markEvent() {\n changedByEvent = true\n nextTick(() => {\n changedByEvent = false\n })\n}\n\n/**是否全选 */\nconst allChecked = computed(() => {\n return model.value?.length === treeRef.value?.forest.size\n})\n\n/**部分 */\nconst indeterminate = computed(() => {\n return model.value.length! > 0 && !allChecked.value\n})\n\n/** 全选*/\nconst handleCheckAll = (checked: boolean) => {\n treeRef.value?.checkAll(checked)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**选中 */\nconst handleCheck = (checked: (string | number)[], checkedData: Record<string, any>[]) => {\n markEvent()\n tags.value = checkedData\n emit('change', checkedData!)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**删除 */\nconst handleRemove = (index: number) => {\n markEvent()\n tags.value = tags.value.filter((_, i) => i !== index)\n model.value = model.value.filter((_, i) => i !== index)\n emit('change', tags.value)\n}\n\n/**清空 */\nconst handleClear = () => {\n markEvent()\n tags.value = []\n model.value = []\n emit('clear')\n}\n\nconst keyDicts = shallowRef(new Map<string | number, Record<string, any>>())\n\nwatch(\n () => props.data,\n (data) => {\n if (!data?.length) {\n keyDicts.value = new Map()\n } else {\n const newDict = new Map()\n data.forEach((item) => {\n dfs(\n item,\n (v) => {\n newDict.set(v[props.valueKey], v)\n },\n props.childrenKey\n )\n })\n keyDicts.value = newDict\n }\n },\n { immediate: true }\n)\n\nwatch(\n [keyDicts, model],\n ([keyDicts, model]) => {\n if (changedByEvent) return\n\n if (!keyDicts.size || !model?.length) {\n tags.value = []\n return\n }\n\n tags.value = model.filter((v) => keyDicts.has(v)).map((v) => keyDicts.get(v)!)\n },\n { immediate: true }\n)\n\nconst allExpanded = shallowRef(props.expandAll)\nfunction handleToggleExpandAll() {\n allExpanded.value = !allExpanded.value\n allExpanded.value ? treeRef.value?.expandAll() : treeRef.value?.collapseAll()\n}\n\nwatch(treeRef, (treeRef) => {\n if (!treeRef) {\n allExpanded.value = props.expandAll\n }\n})\n\nconst limit = () => {\n let { visibilityLimit } = props\n\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n return visibilityLimit\n}\n\nconst visibleTags = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.slice(0, limit())\n }\n return tags.value\n})\n\nconst hiddenCount = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.length - limit()\n }\n return 0\n})\n\nconst handleDropdownVisible = (visible: boolean) => {\n if (!visible) {\n qs.value = ''\n }\n}\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-tree-select.js","names":[],"sources":["../../../src/components/multi-tree-select/multi-tree-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :disabled=\"disabled\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n ref=\"dropdownRef\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <!-- 默认展示 -->\n <span :class=\"cls.e('placeholder')\" v-show=\"!tags.length\">\n {{ placeholder }}\n </span>\n\n <!-- 选择的数据项 -->\n <div v-if=\"tags.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"(tag, index) in visibleTags\"\n :key=\"tag[valueKey]\"\n :closable=\"!disabled\"\n @close=\"handleRemove(index)\"\n >\n {{ tag[labelKey] }}\n </u-tag>\n <u-tag v-if=\"hiddenCount > 0\">+{{ hiddenCount }}</u-tag>\n </div>\n <!-- 清空 icon -->\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon v-if=\"showClear\" :class=\"cls.e('clear')\" @click.stop=\"handleClear\">\n <Close />\n </u-icon>\n\n <!-- 下拉 icon -->\n <u-icon :class=\"cls.e(`arrow`)\" v-else-if=\"!readonly\">\n <ArrowDown />\n </u-icon>\n </transition>\n </template>\n <template #content>\n <div :class=\"[cls.e('content-header'), cls.m(size)]\">\n <!-- 全选 -->\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n >\n 全选\n </u-checkbox>\n\n <u-button size=\"small\" text type=\"primary\" @click=\"handleToggleExpandAll\">\n {{ allExpanded ? '收起全部' : '展开全部' }}\n </u-button>\n </div>\n <!-- 过滤器 -->\n <div v-if=\"filterable\" :class=\"[cls.e('content-filter'), cls.m(size)]\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\">\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n <!-- 菜单列表 -->\n <u-tree\n v-bind=\"treeProps\"\n v-model:checked=\"model\"\n @update:checked=\"handleCheck\"\n ref=\"treeRef\"\n :class=\"cls.e('content-tree')\"\n checkable\n :data=\"data\"\n :slots=\"slots\"\n scroll-to-view\n ></u-tree>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { dfs, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, shallowRef, watch } from 'vue'\n\nimport type { MultiTreeSelectProps, MultiTreeSelectEmits, TreeExposed } from '../../types'\nimport type { DropdownExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport { UTree } from '../tree'\nimport type { TreeSlotsScope } from '../tree/di'\n\ndefineOptions({ name: 'MultiTreeSelect' })\n\nconst cls = bem('multi-tree-select')\n\nconst props = withDefaults(defineProps<MultiTreeSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n expandAll: false,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n filterable: false,\n visibilityLimit: 3,\n minWidth: '280px'\n})\n\nconst treeProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'tips',\n 'field',\n 'placeholder',\n 'disabled',\n 'label',\n 'readonly',\n 'modelValue',\n 'contentClass',\n 'contentStyle',\n 'minWidth',\n 'width'\n ])\n})\n\nconst emit = defineEmits<MultiTreeSelectEmits>()\n\nconst slots = defineSlots<{ default?: (props: TreeSlotsScope) => any }>()\n\n/**过滤 */\nconst qs = shallowRef('')\nwatch(qs, (qs) => {\n treeRef.value?.filter(qs)\n})\n\nconst model = defineModel<(string | number)[]>({ default: () => [] })\n\nconst hovered = shallowRef(false)\n\nconst tags = shallowRef<Record<string, any>[]>([])\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst showClear = computed(() => {\n return props.clearable && model.value?.length && hovered.value && !disabled.value\n})\n\nconst treeRef = shallowRef<TreeExposed>()\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet changedByEvent = false\n\nfunction markEvent() {\n changedByEvent = true\n nextTick(() => {\n changedByEvent = false\n })\n}\n\n/**是否全选 */\nconst allChecked = computed(() => {\n return model.value?.length === treeRef.value?.forest.size\n})\n\n/**部分 */\nconst indeterminate = computed(() => {\n return model.value.length! > 0 && !allChecked.value\n})\n\n/** 全选*/\nconst handleCheckAll = (checked: boolean) => {\n treeRef.value?.checkAll(checked)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**选中 */\nconst handleCheck = (checked: (string | number)[], checkedData: Record<string, any>[]) => {\n markEvent()\n tags.value = checkedData\n emit('change', checkedData!)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**删除 */\nconst handleRemove = (index: number) => {\n markEvent()\n tags.value = tags.value.filter((_, i) => i !== index)\n model.value = model.value.filter((_, i) => i !== index)\n emit('change', tags.value)\n}\n\n/**清空 */\nconst handleClear = () => {\n markEvent()\n tags.value = []\n model.value = []\n emit('clear')\n}\n\nconst keyDicts = shallowRef(new Map<string | number, Record<string, any>>())\n\nwatch(\n () => props.data,\n (data) => {\n if (!data?.length) {\n keyDicts.value = new Map()\n } else {\n const newDict = new Map()\n data.forEach((item) => {\n dfs(\n item,\n (v) => {\n newDict.set(v[props.valueKey], v)\n },\n props.childrenKey\n )\n })\n keyDicts.value = newDict\n }\n },\n { immediate: true }\n)\n\nwatch(\n [keyDicts, model],\n ([keyDicts, model]) => {\n if (changedByEvent) return\n\n if (!keyDicts.size || !model?.length) {\n tags.value = []\n return\n }\n\n tags.value = model.filter((v) => keyDicts.has(v)).map((v) => keyDicts.get(v)!)\n },\n { immediate: true }\n)\n\nconst allExpanded = shallowRef(props.expandAll)\nfunction handleToggleExpandAll() {\n allExpanded.value = !allExpanded.value\n allExpanded.value ? treeRef.value?.expandAll() : treeRef.value?.collapseAll()\n}\n\nwatch(treeRef, (treeRef) => {\n if (!treeRef) {\n allExpanded.value = props.expandAll\n }\n})\n\nconst limit = () => {\n let { visibilityLimit } = props\n\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n return visibilityLimit\n}\n\nconst visibleTags = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.slice(0, limit())\n }\n return tags.value\n})\n\nconst hiddenCount = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.length - limit()\n }\n return 0\n})\n\nconst handleDropdownVisible = (visible: boolean) => {\n if (!visible) {\n qs.value = ''\n }\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { MultiTreeSelectProps } from "../../types/multi-tree-select.js";
|
|
2
2
|
import { TreeSlotsScope } from "../tree/di.js";
|
|
3
|
-
import * as _$vue from "vue";
|
|
4
3
|
|
|
5
4
|
//#region src/components/multi-tree-select/multi-tree-select.vue.d.ts
|
|
6
5
|
type __VLS_Props = MultiTreeSelectProps;
|
|
@@ -11,28 +10,28 @@ type __VLS_ModelProps = {
|
|
|
11
10
|
modelValue?: (string | number)[];
|
|
12
11
|
};
|
|
13
12
|
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
14
|
-
declare const __VLS_base:
|
|
13
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
15
14
|
"update:modelValue": (value: (string | number)[]) => any;
|
|
16
15
|
} & {
|
|
17
16
|
"update:modelValue": (value: any[]) => any;
|
|
18
17
|
clear: () => any;
|
|
19
18
|
change: (checked: Record<string, any>[]) => any;
|
|
20
|
-
}, string,
|
|
19
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
21
20
|
"onUpdate:modelValue"?: ((value: any[]) => any) | undefined;
|
|
22
21
|
onClear?: (() => any) | undefined;
|
|
23
22
|
onChange?: ((checked: Record<string, any>[]) => any) | undefined;
|
|
24
23
|
}>, {
|
|
25
24
|
disabled: boolean;
|
|
26
25
|
readonly: boolean;
|
|
27
|
-
placeholder: string;
|
|
28
|
-
clearable: boolean;
|
|
29
|
-
minWidth: string;
|
|
30
26
|
expandAll: boolean;
|
|
31
27
|
labelKey: string;
|
|
32
28
|
valueKey: string;
|
|
29
|
+
placeholder: string;
|
|
30
|
+
clearable: boolean;
|
|
33
31
|
filterable: boolean;
|
|
32
|
+
minWidth: string;
|
|
34
33
|
visibilityLimit: number;
|
|
35
|
-
}, {}, {}, {}, string,
|
|
34
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
36
35
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
37
36
|
declare const _default: typeof __VLS_export;
|
|
38
37
|
type __VLS_WithSlots<T, S> = T & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-render.js","names":[],"sources":["../../../src/components/node-render/node-render.ts"],"sourcesContent":["import {\n type DefineComponent,\n type VNode,\n type VNodeArrayChildren,\n defineComponent,\n isVNode,\n mergeProps\n} from 'vue'\n\nconst NodeRender: DefineComponent<{\n content: null | undefined | VNodeArrayChildren | VNode | string | number | boolean\n}> = defineComponent({\n name: 'NodeRender',\n\n inheritAttrs: false,\n\n props: ['content'],\n\n render() {\n const { content, $slots, $attrs, $props } = this\n\n if (content === undefined) {\n return $slots.default?.()\n }\n\n if (Array.isArray(content)) {\n return content\n }\n\n if (isVNode(content)) {\n content.props = $attrs ? mergeProps(content.props ?? {}, $attrs) : $props\n return content\n }\n\n return content\n }\n})\n\nexport default NodeRender\n"],"mappings":";;AASA,MAAM,aAED,gBAAgB;CACnB,MAAM;CAEN,cAAc;CAEd,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"node-render.js","names":[],"sources":["../../../src/components/node-render/node-render.ts"],"sourcesContent":["import {\n type DefineComponent,\n type VNode,\n type VNodeArrayChildren,\n defineComponent,\n isVNode,\n mergeProps\n} from 'vue'\n\nconst NodeRender: DefineComponent<{\n content: null | undefined | VNodeArrayChildren | VNode | string | number | boolean\n}> = defineComponent({\n name: 'NodeRender',\n\n inheritAttrs: false,\n\n props: ['content'],\n\n render() {\n const { content, $slots, $attrs, $props } = this\n\n if (content === undefined) {\n return $slots.default?.()\n }\n\n if (Array.isArray(content)) {\n return content\n }\n\n if (isVNode(content)) {\n content.props = $attrs ? mergeProps(content.props ?? {}, $attrs) : $props\n return content\n }\n\n return content\n }\n})\n\nexport default NodeRender\n"],"mappings":";;AASA,MAAM,aAED,gBAAgB;CACnB,MAAM;CAEN,cAAc;CAEd,OAAO,CAAC,SAAS;CAEjB,SAAS;EACP,MAAM,EAAE,SAAS,QAAQ,QAAQ,WAAW;EAE5C,IAAI,YAAY,KAAA,GACd,OAAO,OAAO,UAAU;EAG1B,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO;EAGT,IAAI,QAAQ,OAAO,GAAG;GACpB,QAAQ,QAAQ,SAAS,WAAW,QAAQ,SAAS,CAAC,GAAG,MAAM,IAAI;GACnE,OAAO;EACT;EAEA,OAAO;CACT;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["UNotification"],"sources":["../../../src/components/notification/index.ts"],"sourcesContent":["export { default as UNotification } from './notification.vue'\nimport { zIndex } from '@veltra/utils'\nimport { createVNode, render, type VNode, reactive } from 'vue'\n\nimport type { NotificationProps } from '../../types'\nimport UNotification from './notification.vue'\n\ntype NotificationItem = { vm: VNode }\n\nconst notificationQueue = reactive({\n 'bottom-right': [] as NotificationItem[],\n 'bottom-left': [] as NotificationItem[],\n 'top-right': [] as NotificationItem[],\n 'top-left': [] as NotificationItem[]\n})\n\nconst length = (key: string) => {\n return notificationQueue[key].length\n}\n\nlet count = 1\n\nconst close = (id: string, position: string, userClose?: (vm: VNode) => void) => {\n const index = notificationQueue[position].findIndex(({ vm }) => {\n return id === vm.component!.props.id\n })\n if (index > -1) {\n const { vm } = notificationQueue[position][index]!\n userClose?.(vm)\n let offset = Number(notificationQueue[position][index]!.vm.component!.props.offset)\n notificationQueue[position].splice(index, 1)\n let temp = 0\n for (let i = length(position); i > 0; i--) {\n if (i < index + 1) {\n temp = Number(notificationQueue[position][i - 1]!.vm.component!.props.offset)\n notificationQueue[position][i - 1]!.vm.component!.props.offset = offset\n offset = temp\n }\n }\n }\n if (!notificationQueue[position].length) {\n const wrapper = document.getElementById(`notification-${position}-id`)!\n wrapper.style.removeProperty('height')\n wrapper.style.removeProperty('overflow')\n }\n}\n\nconst createWrapper = (options: NotificationProps) => {\n const position = options.position || 'bottom-right'\n if (document.getElementById(`notification-${position}-id`)) {\n return document.getElementById(`notification-${position}-id`)\n } else {\n const offset = options.offset || 20\n const wrapper = document.createElement('div')\n wrapper.id = `notification-${position}-id`\n Object.assign(\n wrapper.style,\n { position: 'fixed', textAlign: 'center' },\n {\n 'top-right': { top: `${offset}px`, right: `${offset}px` },\n 'top-left': { top: `${offset}px`, left: `${offset}px` },\n 'bottom-left': { bottom: `${offset}px`, left: `${offset}px` },\n 'bottom-right': { bottom: `${offset}px`, right: `${offset}px` }\n }[position]\n )\n wrapper.addEventListener('mouseenter', (e: MouseEvent) => {\n if (length(position)) {\n let innerCount = 0\n let innerOffset = 0\n let width = 0\n let height = 0\n for (let i = length(position); i > 0; i--) {\n notificationQueue[position][i - 1]!.vm.component!.exposed!.clearTimer()\n if (i === length(position)) {\n width = notificationQueue[position][i - 1]!.vm.el?.offsetWidth + 8\n }\n notificationQueue[position][i - 1]!.vm.component!.props.offset = innerOffset\n innerOffset += notificationQueue[position][i - 1]!.vm.el?.offsetHeight / 2 + 5\n if (innerCount < 3) height += notificationQueue[position][i - 1]!.vm.el?.offsetHeight + 10\n innerCount++\n }\n\n Object.assign((e.target as HTMLElement).style, {\n width: `${width}px`,\n height: `${height}px`,\n overflow: 'hidden',\n transition: 'height 0.4s'\n })\n }\n })\n wrapper.addEventListener('mouseleave', (e: MouseEvent) => {\n if (length(position)) {\n let innerOffset = 0\n let innerCount = 0\n let height = 0\n for (let i = length(position); i > 0; i--) {\n notificationQueue[position][i - 1]!.vm.component!.exposed!.startTimer()\n if (i === length(position))\n height = notificationQueue[position][i - 1]!.vm.el?.offsetHeight + 80\n notificationQueue[position][i - 1]!.vm.component!.props.offset = innerOffset\n if (innerCount < 2) innerOffset += 10\n innerCount++\n }\n ;(e.target as HTMLElement).style.transition = 'height 0.45s'\n ;(e.target as HTMLElement).style.height = `${height}px`\n } else {\n ;(e.target as HTMLElement).style.removeProperty('height')\n ;(e.target as HTMLElement).style.removeProperty('overflow')\n }\n })\n document.body.appendChild(wrapper)\n return wrapper\n }\n}\n\nexport const Notification = (options: NotificationProps): void => {\n const position = options.position || 'bottom-right'\n const container = document.createElement('div')\n const id = `notification_${count++}`\n\n if (length(position)) {\n let innerOffset = 0\n let innerCount = 0\n for (let i = length(position); i > 0; i--) {\n if (innerCount < 2) innerOffset += 10\n notificationQueue[position][i - 1]!.vm.component!.props.offset = innerOffset\n innerCount++\n }\n }\n\n const vm = createVNode(UNotification, {\n ...options,\n offset: 0,\n id,\n zIndex: zIndex(),\n onClose: () => {\n close(id, position, options.onClose)\n }\n })\n vm.props!.onDestroy = () => render(null, container)\n render(vm, container)\n notificationQueue[position].push({ vm })\n const wrapper = createWrapper(options)\n wrapper?.appendChild(container.firstElementChild!)\n}\n"],"mappings":";;;;AASA,MAAM,oBAAoB,SAAS;CACjC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","names":["UNotification"],"sources":["../../../src/components/notification/index.ts"],"sourcesContent":["export { default as UNotification } from './notification.vue'\nimport { zIndex } from '@veltra/utils'\nimport { createVNode, render, type VNode, reactive } from 'vue'\n\nimport type { NotificationProps } from '../../types'\nimport UNotification from './notification.vue'\n\ntype NotificationItem = { vm: VNode }\n\nconst notificationQueue = reactive({\n 'bottom-right': [] as NotificationItem[],\n 'bottom-left': [] as NotificationItem[],\n 'top-right': [] as NotificationItem[],\n 'top-left': [] as NotificationItem[]\n})\n\nconst length = (key: string) => {\n return notificationQueue[key].length\n}\n\nlet count = 1\n\nconst close = (id: string, position: string, userClose?: (vm: VNode) => void) => {\n const index = notificationQueue[position].findIndex(({ vm }) => {\n return id === vm.component!.props.id\n })\n if (index > -1) {\n const { vm } = notificationQueue[position][index]!\n userClose?.(vm)\n let offset = Number(notificationQueue[position][index]!.vm.component!.props.offset)\n notificationQueue[position].splice(index, 1)\n let temp = 0\n for (let i = length(position); i > 0; i--) {\n if (i < index + 1) {\n temp = Number(notificationQueue[position][i - 1]!.vm.component!.props.offset)\n notificationQueue[position][i - 1]!.vm.component!.props.offset = offset\n offset = temp\n }\n }\n }\n if (!notificationQueue[position].length) {\n const wrapper = document.getElementById(`notification-${position}-id`)!\n wrapper.style.removeProperty('height')\n wrapper.style.removeProperty('overflow')\n }\n}\n\nconst createWrapper = (options: NotificationProps) => {\n const position = options.position || 'bottom-right'\n if (document.getElementById(`notification-${position}-id`)) {\n return document.getElementById(`notification-${position}-id`)\n } else {\n const offset = options.offset || 20\n const wrapper = document.createElement('div')\n wrapper.id = `notification-${position}-id`\n Object.assign(\n wrapper.style,\n { position: 'fixed', textAlign: 'center' },\n {\n 'top-right': { top: `${offset}px`, right: `${offset}px` },\n 'top-left': { top: `${offset}px`, left: `${offset}px` },\n 'bottom-left': { bottom: `${offset}px`, left: `${offset}px` },\n 'bottom-right': { bottom: `${offset}px`, right: `${offset}px` }\n }[position]\n )\n wrapper.addEventListener('mouseenter', (e: MouseEvent) => {\n if (length(position)) {\n let innerCount = 0\n let innerOffset = 0\n let width = 0\n let height = 0\n for (let i = length(position); i > 0; i--) {\n notificationQueue[position][i - 1]!.vm.component!.exposed!.clearTimer()\n if (i === length(position)) {\n width = notificationQueue[position][i - 1]!.vm.el?.offsetWidth + 8\n }\n notificationQueue[position][i - 1]!.vm.component!.props.offset = innerOffset\n innerOffset += notificationQueue[position][i - 1]!.vm.el?.offsetHeight / 2 + 5\n if (innerCount < 3) height += notificationQueue[position][i - 1]!.vm.el?.offsetHeight + 10\n innerCount++\n }\n\n Object.assign((e.target as HTMLElement).style, {\n width: `${width}px`,\n height: `${height}px`,\n overflow: 'hidden',\n transition: 'height 0.4s'\n })\n }\n })\n wrapper.addEventListener('mouseleave', (e: MouseEvent) => {\n if (length(position)) {\n let innerOffset = 0\n let innerCount = 0\n let height = 0\n for (let i = length(position); i > 0; i--) {\n notificationQueue[position][i - 1]!.vm.component!.exposed!.startTimer()\n if (i === length(position))\n height = notificationQueue[position][i - 1]!.vm.el?.offsetHeight + 80\n notificationQueue[position][i - 1]!.vm.component!.props.offset = innerOffset\n if (innerCount < 2) innerOffset += 10\n innerCount++\n }\n ;(e.target as HTMLElement).style.transition = 'height 0.45s'\n ;(e.target as HTMLElement).style.height = `${height}px`\n } else {\n ;(e.target as HTMLElement).style.removeProperty('height')\n ;(e.target as HTMLElement).style.removeProperty('overflow')\n }\n })\n document.body.appendChild(wrapper)\n return wrapper\n }\n}\n\nexport const Notification = (options: NotificationProps): void => {\n const position = options.position || 'bottom-right'\n const container = document.createElement('div')\n const id = `notification_${count++}`\n\n if (length(position)) {\n let innerOffset = 0\n let innerCount = 0\n for (let i = length(position); i > 0; i--) {\n if (innerCount < 2) innerOffset += 10\n notificationQueue[position][i - 1]!.vm.component!.props.offset = innerOffset\n innerCount++\n }\n }\n\n const vm = createVNode(UNotification, {\n ...options,\n offset: 0,\n id,\n zIndex: zIndex(),\n onClose: () => {\n close(id, position, options.onClose)\n }\n })\n vm.props!.onDestroy = () => render(null, container)\n render(vm, container)\n notificationQueue[position].push({ vm })\n const wrapper = createWrapper(options)\n wrapper?.appendChild(container.firstElementChild!)\n}\n"],"mappings":"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"}
|