@veltra/desktop 1.0.8 → 1.0.9
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 +2 -2
- package/dist/components/action/action.vue.d.ts +3 -3
- package/dist/components/auto-complete/auto-complete.vue.d.ts +1 -1
- package/dist/components/batch-edit/style.js +2 -2
- package/dist/components/button/button.vue.d.ts +1 -1
- package/dist/components/cascade/cascade.js +15 -13
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/cascade/cascade.vue.d.ts +4 -4
- package/dist/components/cascade/node.js.map +1 -1
- package/dist/components/cascade/use-check.js +3 -2
- package/dist/components/cascade/use-check.js.map +1 -1
- package/dist/components/cascade/use-select.js +3 -3
- package/dist/components/cascade/use-select.js.map +1 -1
- package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
- package/dist/components/date-picker/date-picker.js +9 -9
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-picker/date-picker.vue.d.ts +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +9 -9
- 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 +1 -1
- package/dist/components/empty/empty.vue.d.ts +1 -1
- package/dist/components/file-picker/file-picker.vue.d.ts +1 -1
- package/dist/components/file-picker/helper.js +19 -7
- package/dist/components/file-picker/helper.js.map +1 -1
- package/dist/components/file-viewer/file-viewer.js +294 -0
- package/dist/components/file-viewer/file-viewer.js.map +1 -0
- package/dist/components/file-viewer/file-viewer.vue.d.ts +42 -0
- package/dist/components/file-viewer/helper.js +185 -0
- package/dist/components/file-viewer/helper.js.map +1 -0
- package/dist/components/file-viewer/index.d.ts +1 -0
- package/dist/components/file-viewer/previewers/docx-previewer.js +76 -0
- package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/image-previewer.js +64 -0
- package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/pdf-previewer.js +90 -0
- package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/sheet-previewer.js +175 -0
- package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/text-previewer.js +74 -0
- package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/video-previewer.js +62 -0
- package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -0
- package/dist/components/file-viewer/style.d.ts +1 -0
- package/dist/components/file-viewer/style.js +4 -0
- package/dist/components/file-viewer/style2.css +445 -0
- package/dist/components/grid-input/grid-input.vue.d.ts +1 -1
- package/dist/components/index.d.ts +12 -9
- package/dist/components/input/input.vue.d.ts +1 -1
- package/dist/components/multi-select/multi-select-option.js +14 -10
- package/dist/components/multi-select/multi-select-option.js.map +1 -1
- package/dist/components/multi-select/multi-select.js +16 -19
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/multi-select.vue.d.ts +3 -3
- package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +4 -4
- package/dist/components/notification/notification.vue.d.ts +1 -1
- package/dist/components/number-input/number-input.vue.d.ts +1 -1
- package/dist/components/number-range-input/number-range-input.vue.d.ts +2 -2
- package/dist/components/palette/di.js.map +1 -1
- package/dist/components/palette/palette-alpha.js +7 -10
- package/dist/components/palette/palette-alpha.js.map +1 -1
- package/dist/components/palette/palette-hue.js +5 -7
- package/dist/components/palette/palette-hue.js.map +1 -1
- package/dist/components/palette/palette-sv.js +8 -10
- package/dist/components/palette/palette-sv.js.map +1 -1
- package/dist/components/palette/palette.js +22 -24
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/password-input/password-input.vue.d.ts +1 -1
- package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
- package/dist/components/progress-nodes/progress-nodes.vue.d.ts +3 -3
- package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +2 -2
- package/dist/components/select/select.js +14 -12
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/select.vue.d.ts +2 -2
- package/dist/components/slider/slider-thumb.js +10 -13
- package/dist/components/slider/slider-thumb.js.map +1 -1
- package/dist/components/slider/slider.js +12 -15
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/table/di.js.map +1 -1
- package/dist/components/table/node/row.d.ts +10 -1
- package/dist/components/table/node/row.js +9 -0
- package/dist/components/table/node/row.js.map +1 -1
- package/dist/components/table/style.js +1 -1
- package/dist/components/table/table-body.js +25 -26
- package/dist/components/table/table-body.js.map +1 -1
- package/dist/components/table/table-cell.js +16 -9
- package/dist/components/table/table-cell.js.map +1 -1
- package/dist/components/table/table-row.js +78 -19
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js +76 -34
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/use-fixed-columns.js +27 -8
- package/dist/components/table/use-fixed-columns.js.map +1 -1
- package/dist/components/table/use-rows.js +2 -2
- package/dist/components/table/use-rows.js.map +1 -1
- package/dist/components/table/use-table.js +25 -3
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/tabs/index.d.ts +3 -1
- package/dist/components/tabs/style2.css +169 -107
- package/dist/components/tabs/tabs-horizontal.js +133 -0
- package/dist/components/tabs/tabs-horizontal.js.map +1 -0
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +29 -0
- package/dist/components/tabs/tabs-vertical.js +89 -0
- package/dist/components/tabs/tabs-vertical.js.map +1 -0
- package/dist/components/tabs/tabs-vertical.vue.d.ts +28 -0
- package/dist/components/tabs/tabs.js +75 -105
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/tabs.vue.d.ts +9 -23
- package/dist/components/tabs/use-tabs-bar.js +105 -0
- package/dist/components/tabs/use-tabs-bar.js.map +1 -0
- package/dist/components/textarea/textarea.vue.d.ts +1 -1
- package/dist/components/tip/tip.vue.d.ts +2 -2
- package/dist/components/tree/style2.css +45 -23
- package/dist/components/tree/tree-node.js +50 -35
- package/dist/components/tree/tree-node.js.map +1 -1
- package/dist/components/tree/tree.js +27 -20
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree/tree.vue.d.ts +1 -1
- package/dist/components/tree/use-check.js +52 -14
- package/dist/components/tree/use-check.js.map +1 -1
- package/dist/components/tree/use-tree-nodes.js +51 -24
- package/dist/components/tree/use-tree-nodes.js.map +1 -1
- package/dist/components/tree-select/tree-select.vue.d.ts +3 -3
- package/dist/components/watermark/watermark.vue.d.ts +1 -1
- package/dist/index.d.ts +57 -53
- package/dist/index.js +51 -48
- package/dist/types/file-viewer.d.ts +71 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/tabs.d.ts +106 -14
- package/dist/types/tree.d.ts +6 -1
- package/package.json +32 -31
- package/src/components/cascade/cascade.vue +18 -18
- package/src/components/cascade/node.ts +4 -1
- package/src/components/cascade/use-check.ts +5 -4
- package/src/components/cascade/use-select.ts +4 -5
- package/src/components/date-picker/date-picker.vue +10 -9
- package/src/components/date-range-picker/date-range-picker.vue +12 -12
- package/src/components/file-picker/helper.ts +21 -10
- package/src/components/file-viewer/file-viewer.vue +311 -0
- package/src/components/file-viewer/helper.ts +193 -0
- package/src/components/file-viewer/index.ts +1 -0
- package/src/components/file-viewer/previewers/docx-previewer.vue +78 -0
- package/src/components/file-viewer/previewers/image-previewer.vue +64 -0
- package/src/components/file-viewer/previewers/pdf-previewer.vue +90 -0
- package/src/components/file-viewer/previewers/sheet-previewer.vue +210 -0
- package/src/components/file-viewer/previewers/text-previewer.vue +76 -0
- package/src/components/file-viewer/previewers/video-previewer.vue +72 -0
- package/src/components/file-viewer/style.scss +504 -0
- package/src/components/file-viewer/style.ts +4 -0
- package/src/components/index.ts +2 -0
- package/src/components/multi-select/multi-select-option.vue +16 -3
- package/src/components/multi-select/multi-select.vue +17 -9
- package/src/components/palette/di.ts +5 -3
- package/src/components/palette/palette-alpha.vue +7 -10
- package/src/components/palette/palette-hue.vue +5 -7
- package/src/components/palette/palette-sv.vue +12 -14
- package/src/components/palette/palette.vue +19 -21
- package/src/components/select/select.vue +21 -19
- package/src/components/slider/slider-thumb.vue +11 -14
- package/src/components/slider/slider.vue +15 -15
- package/src/components/table/di.ts +20 -3
- package/src/components/table/node/row.ts +10 -1
- package/src/components/table/table-body.vue +28 -33
- package/src/components/table/table-cell.vue +17 -9
- package/src/components/table/table-row.tsx +83 -17
- package/src/components/table/table.vue +73 -45
- package/src/components/table/use-fixed-columns.ts +46 -12
- package/src/components/table/use-rows.ts +14 -3
- package/src/components/table/use-table.ts +27 -3
- package/src/components/tabs/index.ts +2 -0
- package/src/components/tabs/style.scss +217 -134
- package/src/components/tabs/tabs-horizontal.vue +125 -0
- package/src/components/tabs/tabs-vertical.vue +75 -0
- package/src/components/tabs/tabs.vue +56 -127
- package/src/components/tabs/use-tabs-bar.ts +119 -0
- package/src/components/tree/style.scss +74 -29
- package/src/components/tree/tree-node.vue +10 -4
- package/src/components/tree/tree.vue +39 -12
- package/src/components/tree/use-check.ts +79 -23
- package/src/components/tree/use-tree-nodes.ts +85 -34
- package/src/types/file-viewer.ts +69 -0
- package/src/types/index.ts +1 -0
- package/src/types/tabs.ts +113 -19
- package/src/types/tree.ts +6 -1
|
@@ -7,9 +7,9 @@ type __VLS_Slots = {
|
|
|
7
7
|
default?: () => VNode[];
|
|
8
8
|
};
|
|
9
9
|
declare const __VLS_base: _$vue.DefineComponent<ActionGroupProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<ActionGroupProps> & Readonly<{}>, {
|
|
10
|
-
loading: boolean;
|
|
11
|
-
circle: boolean;
|
|
12
10
|
max: number;
|
|
11
|
+
circle: boolean;
|
|
12
|
+
loading: boolean;
|
|
13
13
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
14
14
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
15
15
|
declare const _default: typeof __VLS_export;
|
|
@@ -15,12 +15,12 @@ declare const __VLS_base: _$vue.DefineComponent<ActionProps, {}, {}, {}, {}, _$v
|
|
|
15
15
|
}, string, _$vue.PublicProps, Readonly<ActionProps> & Readonly<{
|
|
16
16
|
onRun?: (() => any) | undefined;
|
|
17
17
|
}>, {
|
|
18
|
+
size: _$_veltra_utils0.ComponentSize;
|
|
18
19
|
type: ButtonType;
|
|
19
|
-
loading: boolean;
|
|
20
20
|
circle: boolean;
|
|
21
|
-
inDropdown: boolean;
|
|
22
21
|
text: boolean;
|
|
23
|
-
|
|
22
|
+
loading: boolean;
|
|
23
|
+
inDropdown: boolean;
|
|
24
24
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
25
25
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
26
26
|
declare const _default: typeof __VLS_export;
|
|
@@ -25,9 +25,9 @@ declare const __VLS_base: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {}, {
|
|
|
25
25
|
onSelect?: ((value: string) => any) | undefined;
|
|
26
26
|
}>, {
|
|
27
27
|
disabled: boolean;
|
|
28
|
+
readonly: boolean;
|
|
28
29
|
placeholder: string;
|
|
29
30
|
clearable: boolean;
|
|
30
|
-
readonly: boolean;
|
|
31
31
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
32
32
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
33
33
|
declare const _default: typeof __VLS_export;
|
|
@@ -2,11 +2,11 @@ import "../button/style.js";
|
|
|
2
2
|
import "../tip/style.js";
|
|
3
3
|
import "../action/style.js";
|
|
4
4
|
import "../scroll/style.js";
|
|
5
|
+
import "../card/style.js";
|
|
6
|
+
import "../checkbox/style.js";
|
|
5
7
|
import "../layout/style.js";
|
|
6
8
|
import "../form/style.js";
|
|
7
|
-
import "../checkbox/style.js";
|
|
8
9
|
import "../table/style.js";
|
|
9
|
-
import "../card/style.js";
|
|
10
10
|
import "./style2.css";
|
|
11
11
|
import "@veltra/directives/ripple/style.js";
|
|
12
12
|
import "@veltra/styles/anime/fade.scss";
|
|
@@ -11,8 +11,8 @@ declare const __VLS_base: _$vue.DefineComponent<ButtonProps, _ButtonExposed, {},
|
|
|
11
11
|
}, string, _$vue.PublicProps, Readonly<ButtonProps> & Readonly<{
|
|
12
12
|
onClick?: ((e: MouseEvent) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
|
-
loadingIcon: _$vue.Component;
|
|
15
14
|
disabled: boolean;
|
|
15
|
+
loadingIcon: _$vue.Component;
|
|
16
16
|
iconPosition: "left" | "right";
|
|
17
17
|
propagate: boolean;
|
|
18
18
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
@@ -12,7 +12,7 @@ import { useSelect } from "./use-select.js";
|
|
|
12
12
|
import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, provide, renderList, shallowRef, toDisplayString, triggerRef, unref, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
13
13
|
import { Forest, o } from "@cat-kit/core";
|
|
14
14
|
import { FORM_EMPTY_CONTENT, bem } from "@veltra/utils";
|
|
15
|
-
import { useFormComponent, useFormFallbackProps,
|
|
15
|
+
import { useFormComponent, useFormFallbackProps, useUserAction } from "@veltra/compositions";
|
|
16
16
|
import { ArrowDown, Close, Search } from "@veltra/icons/normal";
|
|
17
17
|
//#region src/components/cascade/cascade.vue
|
|
18
18
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
@@ -96,13 +96,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
96
96
|
props,
|
|
97
97
|
forest
|
|
98
98
|
});
|
|
99
|
-
const
|
|
99
|
+
const { userAction, isUserActive } = useUserAction();
|
|
100
100
|
const { displayedValue, selectItem, updateSingleValue, panelItemList, getPanelItemList, createPanelItem, selectedNodeKeys } = useSelect({
|
|
101
101
|
props,
|
|
102
102
|
emit,
|
|
103
103
|
dataMap,
|
|
104
104
|
forest,
|
|
105
|
-
|
|
105
|
+
isUserActive,
|
|
106
106
|
dropdownRef
|
|
107
107
|
});
|
|
108
108
|
const { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } = useCheck({
|
|
@@ -111,20 +111,21 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
111
111
|
getPanelItemList,
|
|
112
112
|
emit,
|
|
113
113
|
dataMap,
|
|
114
|
-
|
|
114
|
+
isUserActive,
|
|
115
115
|
disabled,
|
|
116
116
|
readonly
|
|
117
117
|
});
|
|
118
|
+
const commitSingleSelect = userAction((item) => {
|
|
119
|
+
if (!props.strict) updateSingleValue();
|
|
120
|
+
else if (!item.children?.length) updateSingleValue();
|
|
121
|
+
});
|
|
118
122
|
function handleClick(panelIndex, item) {
|
|
119
123
|
selectItem(panelIndex, item);
|
|
120
|
-
!props.multiple
|
|
121
|
-
if (!props.strict) updateSingleValue();
|
|
122
|
-
else if (!item.children?.length) updateSingleValue();
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
function handleCheck(item, checked) {
|
|
126
|
-
updater.updateAndLock(() => checkItem(item, checked));
|
|
124
|
+
if (!props.multiple) commitSingleSelect(item);
|
|
127
125
|
}
|
|
126
|
+
const handleCheck = userAction((item, checked) => {
|
|
127
|
+
checkItem(item, checked);
|
|
128
|
+
});
|
|
128
129
|
function handleClear() {
|
|
129
130
|
if (props.multiple) {
|
|
130
131
|
checkedSet.value.clear();
|
|
@@ -278,11 +279,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
278
279
|
"panel-index": index,
|
|
279
280
|
value: unref(selectedNodeKeys)[index],
|
|
280
281
|
onClick: handleClick,
|
|
281
|
-
onCheck: handleCheck
|
|
282
|
+
onCheck: unref(handleCheck)
|
|
282
283
|
}, null, 8, [
|
|
283
284
|
"data",
|
|
284
285
|
"panel-index",
|
|
285
|
-
"value"
|
|
286
|
+
"value",
|
|
287
|
+
"onCheck"
|
|
286
288
|
]);
|
|
287
289
|
}), 128))], 2)) : (openBlock(), createElementBlock("div", {
|
|
288
290
|
key: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.js","names":[],"sources":["../../../src/components/cascade/cascade.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, bem.is('disabled', disabled), bem.is('multiple', multiple), cls.m(size)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n width=\"auto\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @update:visible=\"!$event && (qs = '')\"\n >\n <template #trigger>\n <!-- 单选展示 -->\n <u-input\n v-if=\"!multiple\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n native-readonly\n :model-value=\"displayedValue\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n\n <!-- 多选展示 -->\n <template v-if=\"multiple\">\n <span :class=\"cls.e('placeholder')\" v-show=\"!modelValue?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"modelValue?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"tag of tags\"\n :key=\"tag.value\"\n :closable=\"!disabled\"\n @close=\"handleCloseTag(tag)\"\n >\n {{ tag.label }}\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 && modelValue?.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 </template>\n\n <template #content>\n <!-- 过滤 -->\n <div v-if=\"filterable\" :class=\"cls.e('panel-filter')\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\" :size=\"size\" clearable>\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <div :class=\"cls.e('content')\" v-if=\"panelItemList.length\">\n <UCascadePanelItem\n v-for=\"({ nodes, key }, index) of panelItemList\"\n :data=\"nodes\"\n :key=\"key\"\n :panel-index=\"index\"\n :value=\"selectedNodeKeys[index]\"\n @click=\"handleClick\"\n @check=\"handleCheck\"\n />\n </div>\n\n <div :class=\"cls.e('empty')\" v-else>\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <!-- 只读 -->\n <template v-else>\n <div :class=\"[cls.m(size)]\" v-if=\"multiple\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of tags\" :key=\"tag.value\">\n {{ tag.label }}\n </u-tag>\n </div>\n </div>\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Forest, o } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps, useUpdateLock } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, provide, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { CascadeProps, CascadeEmits, DropdownExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport UCascadePanelItem from './cascade-panel-item.vue'\nimport { CascadeDIKey } from './di'\nimport { CascadeNode } from './node'\nimport { useCheck } from './use-check'\nimport { useDataMap } from './use-data-map'\nimport { useSelect } from './use-select'\n\ndefineOptions({\n name: 'Cascade'\n})\n\nconst props = withDefaults(defineProps<CascadeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n separator: '/',\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n childrenKey: 'children',\n filterable: false,\n data: () => [],\n visibilityLimit: 3\n})\n\nconst emit = defineEmits<CascadeEmits>()\n\nconst cls = bem('cascade')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst forest = computed(() => {\n return new Forest<Record<string, unknown>, any>({\n data: (props.data ?? []) as Record<string, unknown>[],\n childrenKey: props.childrenKey,\n createNode: (data, index, depth, _forest, parent) => {\n if (!data) {\n return new CascadeNode({\n data,\n index,\n depth,\n value: '',\n label: '',\n parent\n })\n }\n\n return new CascadeNode({\n data,\n index,\n depth,\n value: o(data).get(props.valueKey) ?? '',\n label: o(data).get(props.labelKey) ?? '',\n parent\n })\n }\n })\n})\n\nconst { dataMap } = useDataMap({ props, forest })\n\n// 初始化更新辅助\nconst updater = useUpdateLock()\n\nconst {\n displayedValue,\n selectItem,\n updateSingleValue,\n panelItemList,\n getPanelItemList,\n createPanelItem,\n selectedNodeKeys\n} = useSelect({\n props,\n emit,\n dataMap,\n forest,\n updater,\n dropdownRef\n})\n\nconst { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } =\n useCheck({\n props,\n forest,\n getPanelItemList,\n emit,\n dataMap,\n updater,\n disabled,\n readonly\n })\n\nfunction handleClick(panelIndex: number, item: CascadeNode) {\n // 选择\n selectItem(panelIndex, item)\n\n // 更新数据\n !props.multiple &&\n updater.updateAndLock(() => {\n if (!props.strict) {\n updateSingleValue()\n } else if (!item.children?.length) {\n updateSingleValue()\n }\n })\n}\n\nfunction handleCheck(item: CascadeNode, checked: boolean) {\n updater.updateAndLock(() => checkItem(item, checked))\n}\n\nfunction handleClear() {\n if (props.multiple) {\n checkedSet.value.clear()\n triggerRef(checkedSet)\n updateMultipleValue()\n } else {\n selectedNodeKeys.value = []\n updateSingleValue()\n }\n\n emit('clear')\n}\n\n// 过滤\nconst qs = shallowRef<string>('')\n\nwatch([qs, forest], ([qs, forest]) => {\n const { filterable } = props\n if (!filterable || !qs) {\n forest.dfs((node) => (node.visible = true))\n getPanelItemList(forest.roots)\n return\n }\n\n const cache = new Set<CascadeNode>()\n\n forest.dfs((node) => {\n if (node.label?.toLowerCase().includes(qs.toLowerCase())) {\n node.visible = true\n let parent = node.parent\n while (parent && !cache.has(parent)) {\n parent.visible = true\n cache.add(parent)\n parent = parent.parent\n }\n } else {\n node.visible = false\n }\n })\n\n panelItemList.value = [createPanelItem(forest.roots)]\n})\n\nprovide(CascadeDIKey, {\n cls,\n size,\n disabled,\n readonly,\n cascadeProps: props,\n checkedSet\n})\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cascade.js","names":[],"sources":["../../../src/components/cascade/cascade.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, bem.is('disabled', disabled), bem.is('multiple', multiple), cls.m(size)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n width=\"auto\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @update:visible=\"!$event && (qs = '')\"\n >\n <template #trigger>\n <!-- 单选展示 -->\n <u-input\n v-if=\"!multiple\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n native-readonly\n :model-value=\"displayedValue\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n\n <!-- 多选展示 -->\n <template v-if=\"multiple\">\n <span :class=\"cls.e('placeholder')\" v-show=\"!modelValue?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"modelValue?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"tag of tags\"\n :key=\"tag.value\"\n :closable=\"!disabled\"\n @close=\"handleCloseTag(tag)\"\n >\n {{ tag.label }}\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 && modelValue?.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 </template>\n\n <template #content>\n <!-- 过滤 -->\n <div v-if=\"filterable\" :class=\"cls.e('panel-filter')\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\" :size=\"size\" clearable>\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <div :class=\"cls.e('content')\" v-if=\"panelItemList.length\">\n <UCascadePanelItem\n v-for=\"({ nodes, key }, index) of panelItemList\"\n :data=\"nodes\"\n :key=\"key\"\n :panel-index=\"index\"\n :value=\"selectedNodeKeys[index]\"\n @click=\"handleClick\"\n @check=\"handleCheck\"\n />\n </div>\n\n <div :class=\"cls.e('empty')\" v-else>\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <!-- 只读 -->\n <template v-else>\n <div :class=\"[cls.m(size)]\" v-if=\"multiple\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of tags\" :key=\"tag.value\">\n {{ tag.label }}\n </u-tag>\n </div>\n </div>\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Forest, o } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, provide, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { CascadeProps, CascadeEmits, DropdownExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport UCascadePanelItem from './cascade-panel-item.vue'\nimport { CascadeDIKey } from './di'\nimport { CascadeNode } from './node'\nimport { useCheck } from './use-check'\nimport { useDataMap } from './use-data-map'\nimport { useSelect } from './use-select'\n\ndefineOptions({\n name: 'Cascade'\n})\n\nconst props = withDefaults(defineProps<CascadeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n separator: '/',\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n childrenKey: 'children',\n filterable: false,\n data: () => [],\n visibilityLimit: 3\n})\n\nconst emit = defineEmits<CascadeEmits>()\n\nconst cls = bem('cascade')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst forest = computed(() => {\n return new Forest<Record<string, unknown>, any>({\n data: (props.data ?? []) as Record<string, unknown>[],\n childrenKey: props.childrenKey,\n createNode: (data, index, depth, _forest, parent) => {\n if (!data) {\n return new CascadeNode({\n data,\n index,\n depth,\n value: '',\n label: '',\n parent\n })\n }\n\n return new CascadeNode({\n data,\n index,\n depth,\n value: o(data).get(props.valueKey) ?? '',\n label: o(data).get(props.labelKey) ?? '',\n parent\n })\n }\n })\n})\n\nconst { dataMap } = useDataMap({ props, forest })\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst {\n displayedValue,\n selectItem,\n updateSingleValue,\n panelItemList,\n getPanelItemList,\n createPanelItem,\n selectedNodeKeys\n} = useSelect({\n props,\n emit,\n dataMap,\n forest,\n isUserActive,\n dropdownRef\n})\n\nconst { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } =\n useCheck({\n props,\n forest,\n getPanelItemList,\n emit,\n dataMap,\n isUserActive,\n disabled,\n readonly\n })\n\nconst commitSingleSelect = userAction((item: CascadeNode) => {\n if (!props.strict) {\n updateSingleValue()\n } else if (!item.children?.length) {\n updateSingleValue()\n }\n})\n\nfunction handleClick(panelIndex: number, item: CascadeNode) {\n selectItem(panelIndex, item)\n\n if (!props.multiple) {\n commitSingleSelect(item)\n }\n}\n\nconst handleCheck = userAction((item: CascadeNode, checked: boolean) => {\n checkItem(item, checked)\n})\n\nfunction handleClear() {\n if (props.multiple) {\n checkedSet.value.clear()\n triggerRef(checkedSet)\n updateMultipleValue()\n } else {\n selectedNodeKeys.value = []\n updateSingleValue()\n }\n\n emit('clear')\n}\n\n// 过滤\nconst qs = shallowRef<string>('')\n\nwatch([qs, forest], ([qs, forest]) => {\n const { filterable } = props\n if (!filterable || !qs) {\n forest.dfs((node) => (node.visible = true))\n getPanelItemList(forest.roots)\n return\n }\n\n const cache = new Set<CascadeNode>()\n\n forest.dfs((node) => {\n if (node.label?.toLowerCase().includes(qs.toLowerCase())) {\n node.visible = true\n let parent = node.parent\n while (parent && !cache.has(parent)) {\n parent.visible = true\n cache.add(parent)\n parent = parent.parent\n }\n } else {\n node.visible = false\n }\n })\n\n panelItemList.value = [createPanelItem(forest.roots)]\n})\n\nprovide(CascadeDIKey, {\n cls,\n size,\n disabled,\n readonly,\n cascadeProps: props,\n checkedSet\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -11,15 +11,15 @@ declare const __VLS_export: _$vue.DefineComponent<CascadeProps, {}, {}, {}, {},
|
|
|
11
11
|
onClear?: (() => any) | undefined;
|
|
12
12
|
onChange?: ((...args: [value?: string | undefined, label?: string | undefined, item?: Record<string, any> | undefined] | [value: string[], label: string[], data: Record<string, any>[]]) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
|
+
separator: string;
|
|
14
15
|
disabled: boolean;
|
|
15
|
-
placeholder: string;
|
|
16
|
-
clearable: boolean;
|
|
17
16
|
readonly: boolean;
|
|
18
|
-
separator: string;
|
|
19
17
|
labelKey: string;
|
|
20
18
|
valueKey: string;
|
|
21
|
-
|
|
19
|
+
placeholder: string;
|
|
20
|
+
clearable: boolean;
|
|
22
21
|
data: Record<string, any>[];
|
|
22
|
+
childrenKey: string;
|
|
23
23
|
filterable: boolean;
|
|
24
24
|
visibilityLimit: number;
|
|
25
25
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","names":[],"sources":["../../../src/components/cascade/node.ts"],"sourcesContent":["import { TreeNode } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class CascadeNode<T extends Record<string, any>> extends TreeNode
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../../../src/components/cascade/node.ts"],"sourcesContent":["import { TreeNode } from '@cat-kit/core'\nimport { shallowReactive } from 'vue'\n\nexport class CascadeNode<T extends Record<string, any> = Record<string, any>> extends TreeNode<\n T,\n CascadeNode<T>\n> {\n visible = true\n\n value: string\n label: string\n\n constructor(options: {\n data: Record<string, any>\n index: number\n depth: number\n value: string\n label: string\n parent?: CascadeNode<T>\n }) {\n const { data, index, depth, parent, value, label } = options\n super(data as T, index, depth, parent)\n this.value = value\n this.label = label\n\n return shallowReactive(this)\n }\n}\n"],"mappings":";;;AAGA,IAAa,cAAb,cAAsF,SAGpF;CACA,UAAU;CAEV;CACA;CAEA,YAAY,SAOT;EACD,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,OAAO,UAAU;AACrD,QAAM,MAAW,OAAO,OAAO,OAAO;AACtC,OAAK,QAAQ;AACb,OAAK,QAAQ;AAEb,SAAO,gBAAgB,KAAK"}
|
|
@@ -2,7 +2,7 @@ import { computed, shallowRef, triggerRef, watch } from "vue";
|
|
|
2
2
|
import { dfs } from "@cat-kit/core";
|
|
3
3
|
//#region src/components/cascade/use-check.ts
|
|
4
4
|
function useCheck(options) {
|
|
5
|
-
const { props, emit, dataMap, disabled, readonly, forest,
|
|
5
|
+
const { props, emit, dataMap, disabled, readonly, forest, isUserActive, getPanelItemList } = options;
|
|
6
6
|
const hovered = shallowRef(false);
|
|
7
7
|
const checkedSet = shallowRef(/* @__PURE__ */ new Set());
|
|
8
8
|
const tags = computed(() => {
|
|
@@ -54,7 +54,8 @@ function useCheck(options) {
|
|
|
54
54
|
() => props.modelValue,
|
|
55
55
|
forest
|
|
56
56
|
], ([multiple]) => {
|
|
57
|
-
|
|
57
|
+
if (!multiple || isUserActive()) return;
|
|
58
|
+
initMultipleCheck();
|
|
58
59
|
}, { immediate: false });
|
|
59
60
|
return {
|
|
60
61
|
hovered,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-check.js","names":[],"sources":["../../../src/components/cascade/use-check.ts"],"sourcesContent":["import { dfs, type Forest } from '@cat-kit/core'\nimport
|
|
1
|
+
{"version":3,"file":"use-check.js","names":[],"sources":["../../../src/components/cascade/use-check.ts"],"sourcesContent":["import { dfs, type Forest } from '@cat-kit/core'\nimport {\n computed,\n shallowRef,\n triggerRef,\n watch,\n type ComputedRef,\n type Ref,\n type ShallowRef\n} from 'vue'\n\nimport type { CascadeProps, CascadeEmits, CascadeNode } from '../../types'\n\ninterface CheckOptions {\n props: CascadeProps\n emit: CascadeEmits\n dataMap: ShallowRef<Map<string, CascadeNode>>\n disabled: Ref<boolean>\n readonly: Ref<boolean>\n forest: Ref<Forest<Record<string, unknown>, any>>\n isUserActive: () => boolean\n getPanelItemList: (data?: CascadeNode[]) => void\n}\n\ninterface UseCheckReturned {\n hovered: ShallowRef<boolean>\n tags: ComputedRef<CascadeNode[]>\n checkedSet: ShallowRef<Set<CascadeNode>>\n restTag: ComputedRef<number>\n handleCloseTag: (tag: CascadeNode) => void\n updateMultipleValue: () => void\n checkItem: (item: CascadeNode, checked: boolean) => void\n}\n\nexport function useCheck(options: CheckOptions): UseCheckReturned {\n const { props, emit, dataMap, disabled, readonly, forest, isUserActive, getPanelItemList } =\n options\n\n const hovered = shallowRef(false)\n\n const checkedSet = shallowRef(new Set<CascadeNode>())\n\n const tags = computed(() => {\n const { modelValue, multiple } = props\n let tags: CascadeNode[] = []\n\n if (!multiple || !Array.isArray(modelValue)) return tags\n\n let { visibilityLimit } = props\n if (visibilityLimit! < 0) {\n visibilityLimit = 0\n }\n\n // 禁用时,显示全部\n if (disabled.value || readonly.value) {\n visibilityLimit = props.modelValue?.length ?? 0\n }\n\n modelValue.slice(0, visibilityLimit).forEach((k) => {\n const option = dataMap.value.get(k)\n option && tags.push(option)\n })\n\n return tags\n })\n\n function updateMultipleValue() {\n const checkedArr = Array.from(checkedSet.value)\n const targetValues = checkedArr.map((item) => item.value)\n const targetLabels = checkedArr.map((item) => item.label)\n emit('update:modelValue', targetValues)\n emit('change', targetValues, targetLabels, checkedArr)\n }\n\n const restTag = computed(() => {\n const { visibilityLimit, modelValue } = props\n\n return Math.max((modelValue?.length ?? 0) - visibilityLimit!, 0)\n })\n\n function handleCloseTag(tag: CascadeNode) {\n checkedSet.value.delete(tag)\n updateMultipleValue()\n }\n\n function checkItem(item: CascadeNode, checked: boolean) {\n const childrenKey = props.childrenKey ?? 'children'\n if (checked) {\n dfs(\n item as unknown as Record<string, unknown>,\n (node) => {\n checkedSet.value.add(node as unknown as CascadeNode)\n },\n childrenKey\n )\n } else {\n dfs(\n item as unknown as Record<string, unknown>,\n (node) => {\n checkedSet.value.delete(node as unknown as CascadeNode)\n },\n childrenKey\n )\n }\n\n triggerRef(checkedSet)\n\n updateMultipleValue()\n }\n\n function initMultipleCheck() {\n const { modelValue } = props\n getPanelItemList()\n if (Array.isArray(modelValue)) {\n checkedSet.value = new Set(modelValue.map((v) => dataMap.value.get(v)!))\n }\n }\n\n watch(\n [() => props.multiple, () => props.modelValue, forest],\n ([multiple]) => {\n if (!multiple || isUserActive()) return\n initMultipleCheck()\n },\n { immediate: false }\n )\n\n return { hovered, tags, checkedSet, restTag, handleCloseTag, updateMultipleValue, checkItem }\n}\n"],"mappings":";;;AAkCA,SAAgB,SAAS,SAAyC;CAChE,MAAM,EAAE,OAAO,MAAM,SAAS,UAAU,UAAU,QAAQ,cAAc,qBACtE;CAEF,MAAM,UAAU,WAAW,MAAM;CAEjC,MAAM,aAAa,2BAAW,IAAI,KAAkB,CAAC;CAErD,MAAM,OAAO,eAAe;EAC1B,MAAM,EAAE,YAAY,aAAa;EACjC,IAAI,OAAsB,EAAE;AAE5B,MAAI,CAAC,YAAY,CAAC,MAAM,QAAQ,WAAW,CAAE,QAAO;EAEpD,IAAI,EAAE,oBAAoB;AAC1B,MAAI,kBAAmB,EACrB,mBAAkB;AAIpB,MAAI,SAAS,SAAS,SAAS,MAC7B,mBAAkB,MAAM,YAAY,UAAU;AAGhD,aAAW,MAAM,GAAG,gBAAgB,CAAC,SAAS,MAAM;GAClD,MAAM,SAAS,QAAQ,MAAM,IAAI,EAAE;AACnC,aAAU,KAAK,KAAK,OAAO;IAC3B;AAEF,SAAO;GACP;CAEF,SAAS,sBAAsB;EAC7B,MAAM,aAAa,MAAM,KAAK,WAAW,MAAM;EAC/C,MAAM,eAAe,WAAW,KAAK,SAAS,KAAK,MAAM;EACzD,MAAM,eAAe,WAAW,KAAK,SAAS,KAAK,MAAM;AACzD,OAAK,qBAAqB,aAAa;AACvC,OAAK,UAAU,cAAc,cAAc,WAAW;;CAGxD,MAAM,UAAU,eAAe;EAC7B,MAAM,EAAE,iBAAiB,eAAe;AAExC,SAAO,KAAK,KAAK,YAAY,UAAU,KAAK,iBAAkB,EAAE;GAChE;CAEF,SAAS,eAAe,KAAkB;AACxC,aAAW,MAAM,OAAO,IAAI;AAC5B,uBAAqB;;CAGvB,SAAS,UAAU,MAAmB,SAAkB;EACtD,MAAM,cAAc,MAAM,eAAe;AACzC,MAAI,QACF,KACE,OACC,SAAS;AACR,cAAW,MAAM,IAAI,KAA+B;KAEtD,YACD;MAED,KACE,OACC,SAAS;AACR,cAAW,MAAM,OAAO,KAA+B;KAEzD,YACD;AAGH,aAAW,WAAW;AAEtB,uBAAqB;;CAGvB,SAAS,oBAAoB;EAC3B,MAAM,EAAE,eAAe;AACvB,oBAAkB;AAClB,MAAI,MAAM,QAAQ,WAAW,CAC3B,YAAW,QAAQ,IAAI,IAAI,WAAW,KAAK,MAAM,QAAQ,MAAM,IAAI,EAAE,CAAE,CAAC;;AAI5E,OACE;QAAO,MAAM;QAAgB,MAAM;EAAY;EAAO,GACrD,CAAC,cAAc;AACd,MAAI,CAAC,YAAY,cAAc,CAAE;AACjC,qBAAmB;IAErB,EAAE,WAAW,OAAO,CACrB;AAED,QAAO;EAAE;EAAS;EAAM;EAAY;EAAS;EAAgB;EAAqB;EAAW"}
|
|
@@ -3,7 +3,7 @@ import "@cat-kit/core";
|
|
|
3
3
|
import { createIncrease } from "@veltra/utils";
|
|
4
4
|
//#region src/components/cascade/use-select.ts
|
|
5
5
|
function useSelect(options) {
|
|
6
|
-
const { props, emit, dataMap,
|
|
6
|
+
const { props, emit, dataMap, isUserActive, dropdownRef, forest } = options;
|
|
7
7
|
/** 选中的节点key */
|
|
8
8
|
const selectedNodeKeys = shallowRef([]);
|
|
9
9
|
const currentItem = shallowRef();
|
|
@@ -80,8 +80,8 @@ function useSelect(options) {
|
|
|
80
80
|
() => props.modelValue,
|
|
81
81
|
forest
|
|
82
82
|
], ([multiple]) => {
|
|
83
|
-
if (multiple) return;
|
|
84
|
-
|
|
83
|
+
if (multiple || isUserActive()) return;
|
|
84
|
+
initSingleSelect();
|
|
85
85
|
}, { immediate: true });
|
|
86
86
|
return {
|
|
87
87
|
displayedValue,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-select.js","names":[],"sources":["../../../src/components/cascade/use-select.ts"],"sourcesContent":["import { Forest } from '@cat-kit/core'\nimport
|
|
1
|
+
{"version":3,"file":"use-select.js","names":[],"sources":["../../../src/components/cascade/use-select.ts"],"sourcesContent":["import { Forest } from '@cat-kit/core'\nimport { createIncrease } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n shallowRef,\n triggerRef,\n watch,\n type ComputedRef,\n type Ref,\n type ShallowRef\n} from 'vue'\n\nimport type {\n CascadeProps,\n CascadeEmits,\n CascadeNode,\n DropdownExposed,\n PanelItem\n} from '../../types'\n\ninterface SelectOptions {\n props: CascadeProps\n emit: CascadeEmits\n isUserActive: () => boolean\n forest: Ref<Forest<Record<string, unknown>, any>>\n dataMap: Ref<Map<string, CascadeNode>>\n dropdownRef: Ref<DropdownExposed | undefined>\n}\n\ninterface UseSelectReturned {\n displayedValue: ComputedRef<string | undefined>\n selectItem: (panelIndex: number, item: CascadeNode) => void\n selectedNodeKeys: ShallowRef<string[]>\n updateSingleValue: () => void\n initSingleSelect: () => void\n panelItemList: ShallowRef<PanelItem[]>\n getPanelItemList: (data?: CascadeNode[]) => void\n setPanelItem: (panelIndex: number, panelData?: CascadeNode[]) => void\n createPanelItem: (nodes: CascadeNode[]) => PanelItem\n}\n\nexport function useSelect(options: SelectOptions): UseSelectReturned {\n const { props, emit, dataMap, isUserActive, dropdownRef, forest } = options\n\n /** 选中的节点key */\n const selectedNodeKeys = shallowRef<string[]>([])\n\n const currentItem = shallowRef<Record<string, any>>()\n\n /** 面板数据 */\n const panelItemList = shallowRef<PanelItem[]>([])\n const uid = createIncrease()\n function createPanelItem(nodes: CascadeNode[]): PanelItem {\n return { key: uid(), nodes: nodes.filter((node) => node.visible) }\n }\n\n const displayedValue = computed(() => {\n const { modelValue, separator } = props\n const valueNodes =\n modelValue && typeof modelValue === 'string' ? modelValue.split(separator!) : undefined\n return valueNodes\n ?.map((v) => {\n const node = dataMap.value.get(v)\n return node?.label ?? v\n })\n .join(props.separator)\n })\n\n function getPanelItemList(data?: CascadeNode[]) {\n const _panelItemList: Array<PanelItem> = []\n if (!data?.length) return panelItemList\n _panelItemList.push(createPanelItem(data))\n\n selectedNodeKeys.value.slice(0, -1).forEach((key) => {\n const node = dataMap.value.get(key)\n node?.children?.length && _panelItemList.push(createPanelItem(node.children))\n })\n\n panelItemList.value = _panelItemList\n }\n\n function setPanelItem(panelIndex: number, panelData?: CascadeNode[]) {\n if (panelData?.length) {\n panelItemList.value[panelIndex + 1] = createPanelItem(panelData)\n panelItemList.value.splice(panelIndex + 2)\n } else {\n panelItemList.value.splice(panelIndex + 1)\n }\n\n triggerRef(panelItemList)\n }\n\n function updateSingleValue() {\n const { separator } = props\n\n const targetValue = selectedNodeKeys.value.length\n ? selectedNodeKeys.value.join(separator!)\n : undefined\n\n const targetLabel = selectedNodeKeys.value\n .map((key) => {\n const node = dataMap.value.get(key)\n return node?.label\n })\n .filter(Boolean)\n .join(separator!)\n\n emit('update:modelValue', targetValue)\n emit('change', targetValue, targetLabel, currentItem.value!)\n }\n\n /**\n * 单选选择\n *\n * @param panelIndex 面板索引\n * @param item 选中的节点\n */\n function selectItem(panelIndex: number, item: CascadeNode) {\n // 设置选中的节点\n currentItem.value = item\n selectedNodeKeys.value[panelIndex] = item.value\n selectedNodeKeys.value.splice(panelIndex + 1)\n triggerRef(selectedNodeKeys)\n\n // 展开子级面板\n setPanelItem(panelIndex, item.children)\n\n nextTick(() => {\n dropdownRef.value?.updateDropdown()\n })\n\n if (!item.children?.length && !props.multiple) {\n dropdownRef.value?.close()\n }\n }\n\n function initSingleSelect() {\n const { modelValue, separator } = props\n\n if (modelValue && typeof modelValue === 'string') {\n const nodes = modelValue.split(separator!)\n selectedNodeKeys.value = nodes\n getPanelItemList(forest.value.roots)\n } else {\n selectedNodeKeys.value = []\n getPanelItemList(forest.value.roots)\n }\n }\n\n watch(\n [() => props.multiple, () => props.modelValue, forest],\n ([multiple]) => {\n if (multiple || isUserActive()) return\n initSingleSelect()\n },\n { immediate: true }\n )\n\n return {\n displayedValue,\n selectItem,\n selectedNodeKeys,\n updateSingleValue,\n initSingleSelect,\n panelItemList,\n getPanelItemList,\n setPanelItem,\n createPanelItem\n }\n}\n"],"mappings":";;;;AA0CA,SAAgB,UAAU,SAA2C;CACnE,MAAM,EAAE,OAAO,MAAM,SAAS,cAAc,aAAa,WAAW;;CAGpE,MAAM,mBAAmB,WAAqB,EAAE,CAAC;CAEjD,MAAM,cAAc,YAAiC;;CAGrD,MAAM,gBAAgB,WAAwB,EAAE,CAAC;CACjD,MAAM,MAAM,gBAAgB;CAC5B,SAAS,gBAAgB,OAAiC;AACxD,SAAO;GAAE,KAAK,KAAK;GAAE,OAAO,MAAM,QAAQ,SAAS,KAAK,QAAQ;GAAE;;CAGpE,MAAM,iBAAiB,eAAe;EACpC,MAAM,EAAE,YAAY,cAAc;AAGlC,UADE,cAAc,OAAO,eAAe,WAAW,WAAW,MAAM,UAAW,GAAG,KAAA,IAE5E,KAAK,MAAM;AAEX,UADa,QAAQ,MAAM,IAAI,EAAE,EACpB,SAAS;IACtB,CACD,KAAK,MAAM,UAAU;GACxB;CAEF,SAAS,iBAAiB,MAAsB;EAC9C,MAAM,iBAAmC,EAAE;AAC3C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,iBAAe,KAAK,gBAAgB,KAAK,CAAC;AAE1C,mBAAiB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,QAAQ;GACnD,MAAM,OAAO,QAAQ,MAAM,IAAI,IAAI;AACnC,SAAM,UAAU,UAAU,eAAe,KAAK,gBAAgB,KAAK,SAAS,CAAC;IAC7E;AAEF,gBAAc,QAAQ;;CAGxB,SAAS,aAAa,YAAoB,WAA2B;AACnE,MAAI,WAAW,QAAQ;AACrB,iBAAc,MAAM,aAAa,KAAK,gBAAgB,UAAU;AAChE,iBAAc,MAAM,OAAO,aAAa,EAAE;QAE1C,eAAc,MAAM,OAAO,aAAa,EAAE;AAG5C,aAAW,cAAc;;CAG3B,SAAS,oBAAoB;EAC3B,MAAM,EAAE,cAAc;EAEtB,MAAM,cAAc,iBAAiB,MAAM,SACvC,iBAAiB,MAAM,KAAK,UAAW,GACvC,KAAA;EAEJ,MAAM,cAAc,iBAAiB,MAClC,KAAK,QAAQ;AAEZ,UADa,QAAQ,MAAM,IAAI,IAAI,EACtB;IACb,CACD,OAAO,QAAQ,CACf,KAAK,UAAW;AAEnB,OAAK,qBAAqB,YAAY;AACtC,OAAK,UAAU,aAAa,aAAa,YAAY,MAAO;;;;;;;;CAS9D,SAAS,WAAW,YAAoB,MAAmB;AAEzD,cAAY,QAAQ;AACpB,mBAAiB,MAAM,cAAc,KAAK;AAC1C,mBAAiB,MAAM,OAAO,aAAa,EAAE;AAC7C,aAAW,iBAAiB;AAG5B,eAAa,YAAY,KAAK,SAAS;AAEvC,iBAAe;AACb,eAAY,OAAO,gBAAgB;IACnC;AAEF,MAAI,CAAC,KAAK,UAAU,UAAU,CAAC,MAAM,SACnC,aAAY,OAAO,OAAO;;CAI9B,SAAS,mBAAmB;EAC1B,MAAM,EAAE,YAAY,cAAc;AAElC,MAAI,cAAc,OAAO,eAAe,UAAU;AAEhD,oBAAiB,QADH,WAAW,MAAM,UAAW;AAE1C,oBAAiB,OAAO,MAAM,MAAM;SAC/B;AACL,oBAAiB,QAAQ,EAAE;AAC3B,oBAAiB,OAAO,MAAM,MAAM;;;AAIxC,OACE;QAAO,MAAM;QAAgB,MAAM;EAAY;EAAO,GACrD,CAAC,cAAc;AACd,MAAI,YAAY,cAAc,CAAE;AAChC,oBAAkB;IAEpB,EAAE,WAAW,MAAM,CACpB;AAED,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD"}
|
|
@@ -11,8 +11,8 @@ declare const __VLS_export: _$vue.DefineComponent<DatePanelProps, {}, {}, {}, {}
|
|
|
11
11
|
"onSelect:range-date"?: ((rangeDate?: [_$_cat_kit_core0.Dater, _$_cat_kit_core0.Dater] | undefined) => any) | undefined;
|
|
12
12
|
"onSelect:date"?: ((date: _$_cat_kit_core0.Dater) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
|
-
type: "date" | "month" | "year";
|
|
15
14
|
size: _$_veltra_utils0.ComponentSize;
|
|
15
|
+
type: "date" | "month" | "year";
|
|
16
16
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
17
17
|
declare const _default: typeof __VLS_export;
|
|
18
18
|
//#endregion
|
|
@@ -5,7 +5,7 @@ import _sfc_main$3 from "../date-panel/date-panel.js";
|
|
|
5
5
|
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, shallowRef, toDisplayString, unref, watch, withCtx } from "vue";
|
|
6
6
|
import { date } from "@cat-kit/core";
|
|
7
7
|
import { FORM_EMPTY_CONTENT, bem } from "@veltra/utils";
|
|
8
|
-
import { useFormComponent, useFormFallbackProps,
|
|
8
|
+
import { useFormComponent, useFormFallbackProps, useUserAction } from "@veltra/compositions";
|
|
9
9
|
import { Calendar } from "@veltra/icons/normal";
|
|
10
10
|
//#region src/components/date-picker/date-picker.vue
|
|
11
11
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
@@ -60,20 +60,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
60
60
|
return "yyyy-MM-dd";
|
|
61
61
|
});
|
|
62
62
|
const currentDate = shallowRef();
|
|
63
|
-
const {
|
|
63
|
+
const { userAction, isUserActive } = useUserAction();
|
|
64
64
|
watch(() => props.modelValue, (modelValue) => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
});
|
|
65
|
+
if (isUserActive()) return;
|
|
66
|
+
currentDate.value = modelValue ? date(modelValue) : void 0;
|
|
68
67
|
}, { immediate: true });
|
|
69
68
|
const displayedValue = computed(() => {
|
|
70
69
|
return currentDate.value?.format(formatStr.value) ?? "";
|
|
71
70
|
});
|
|
71
|
+
const commitSelectedDate = userAction((date) => {
|
|
72
|
+
currentDate.value = date;
|
|
73
|
+
emit("update:modelValue", date.format(formatStr.value));
|
|
74
|
+
});
|
|
72
75
|
async function handleSelectDate(date) {
|
|
73
|
-
await
|
|
74
|
-
currentDate.value = date;
|
|
75
|
-
emit("update:modelValue", date.format(formatStr.value));
|
|
76
|
-
});
|
|
76
|
+
await commitSelectedDate(date);
|
|
77
77
|
dropdownRef.value?.close();
|
|
78
78
|
}
|
|
79
79
|
function handleClear() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.js","names":[],"sources":["../../../src/components/date-picker/date-picker.vue"],"sourcesContent":["<template>\n <u-dropdown\n :class=\"className\"\n trigger=\"click\"\n width=\"auto\"\n ref=\"dropdownRef\"\n @update:visible=\"\"\n :disabled=\"disabled\"\n v-if=\"!readonly\"\n >\n <template #trigger>\n <u-input\n :size=\"size\"\n native-readonly\n :clearable=\"clearable\"\n :placeholder=\"placeholder\"\n :model-value=\"displayedValue\"\n :disabled=\"disabled\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('icon')\"><Calendar /></u-icon>\n </template>\n </u-input>\n </template>\n\n <template #content>\n <UDatePanel :size :type :disabled-date :date=\"currentDate\" @select:date=\"handleSelectDate\" />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { date, type Dater } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps,
|
|
1
|
+
{"version":3,"file":"date-picker.js","names":[],"sources":["../../../src/components/date-picker/date-picker.vue"],"sourcesContent":["<template>\n <u-dropdown\n :class=\"className\"\n trigger=\"click\"\n width=\"auto\"\n ref=\"dropdownRef\"\n @update:visible=\"\"\n :disabled=\"disabled\"\n v-if=\"!readonly\"\n >\n <template #trigger>\n <u-input\n :size=\"size\"\n native-readonly\n :clearable=\"clearable\"\n :placeholder=\"placeholder\"\n :model-value=\"displayedValue\"\n :disabled=\"disabled\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('icon')\"><Calendar /></u-icon>\n </template>\n </u-input>\n </template>\n\n <template #content>\n <UDatePanel :size :type :disabled-date :date=\"currentDate\" @select:date=\"handleSelectDate\" />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { date, type Dater } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { Calendar } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { DatePickerEmits, DatePickerProps } from '../../types'\nimport type { DropdownExposed } from '../../types'\nimport { UDatePanel } from '../date-panel'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({\n name: 'DatePicker'\n})\n\nconst props = withDefaults(defineProps<DatePickerProps>(), {\n placeholder: '选择日期',\n type: 'date',\n disabled: undefined,\n readonly: undefined,\n clearable: true\n})\n\nconst emit = defineEmits<DatePickerEmits>()\n\nconst cls = bem('date-picker')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst formatStr = computed(() => {\n const { format, type } = props\n if (format) return format\n if (type === 'date') return 'yyyy-MM-dd'\n if (type === 'month') return 'yyyy-MM'\n if (type === 'year') return 'yyyy'\n return 'yyyy-MM-dd'\n})\n\nconst currentDate = shallowRef<Dater>()\n\nconst { userAction, isUserActive } = useUserAction()\n\nwatch(\n () => props.modelValue,\n (modelValue) => {\n if (isUserActive()) return\n currentDate.value = modelValue ? date(modelValue) : undefined\n },\n { immediate: true }\n)\n\nconst displayedValue = computed(() => {\n return currentDate.value?.format(formatStr.value) ?? ''\n})\n\nconst commitSelectedDate = userAction((date: Dater) => {\n currentDate.value = date\n emit('update:modelValue', date.format(formatStr.value))\n})\n\nasync function handleSelectDate(date: Dater) {\n await commitSelectedDate(date)\n dropdownRef.value?.close()\n}\n\nfunction handleClear() {\n currentDate.value = undefined\n emit('update:modelValue', undefined)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAa;EAE7B,MAAM,EAAE,cAAc,kBAAiB;EAEvC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE;GAClF,MAAM;GACN,UAAU;GACV,UAAU;GACX,CAAA;EAED,MAAM,YAAY,eAAe;AAC/B,UAAO,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,MAAM,CAAA;IACjC;EAED,MAAM,cAAc,YAA4B;EAEhD,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,QAAQ,SAAS;AACzB,OAAI,OAAQ,QAAO;AACnB,OAAI,SAAS,OAAQ,QAAO;AAC5B,OAAI,SAAS,QAAS,QAAO;AAC7B,OAAI,SAAS,OAAQ,QAAO;AAC5B,UAAO;IACR;EAED,MAAM,cAAc,YAAkB;EAEtC,MAAM,EAAE,YAAY,iBAAiB,eAAc;AAEnD,cACQ,MAAM,aACX,eAAe;AACd,OAAI,cAAc,CAAE;AACpB,eAAY,QAAQ,aAAa,KAAK,WAAW,GAAG,KAAA;KAEtD,EAAE,WAAW,MAAK,CACpB;EAEA,MAAM,iBAAiB,eAAe;AACpC,UAAO,YAAY,OAAO,OAAO,UAAU,MAAM,IAAI;IACtD;EAED,MAAM,qBAAqB,YAAY,SAAgB;AACrD,eAAY,QAAQ;AACpB,QAAK,qBAAqB,KAAK,OAAO,UAAU,MAAM,CAAA;IACvD;EAED,eAAe,iBAAiB,MAAa;AAC3C,SAAM,mBAAmB,KAAI;AAC7B,eAAY,OAAO,OAAM;;EAG3B,SAAS,cAAc;AACrB,eAAY,QAAQ,KAAA;AACpB,QAAK,qBAAqB,KAAA,EAAS;;;WA9G1B,MAAA,SAAQ,IAAA,WAAA,EAPjB,YA4Ba,MAAA,YAAA,EAAA;;IA3BV,OAAK,eAAE,UAAA,MAAS;IACjB,SAAQ;IACR,OAAM;aACF;IAAJ,KAAI;IACH,oBAAc,OAAA,OAAA,OAAA,WAAf;IACC,UAAU,MAAA,SAAQ;;IAGR,SAAO,cAaN,CAZV,YAYU,MAAA,cAAA,EAAA;KAXP,MAAM,MAAA,KAAI;KACX,mBAAA;KACC,WAAW,QAAA;KACX,aAAa,QAAA;KACb,eAAa,eAAA;KACb,UAAU,MAAA,SAAQ;KAClB,SAAO;;KAEG,QAAM,cACqC,CAApD,YAAoD,MAAA,YAAA,EAAA,EAA3C,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA,EAAA,EAAA;6BAAsB,CAAZ,YAAY,MAAA,SAAA,CAAA,CAAA,CAAA;;;;;;;;;;;IAKtC,SAAO,cAC6E,CAA7F,YAA6F,MAAA,YAAA,EAAA;KAAhF,MAAA,MAAA,KAAI;KAAE,MAAA,QAAA;KAAM,iBAAA,QAAA;KAAe,MAAM,YAAA;KAAc,iBAAa;;;;;;;;iDAI7E,mBAEW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAAA,gBADN,eAAA,SAAkB,MAAA,mBAAkB,CAAA,EAAA,EAAA,CAAA,EAAA,GAAA"}
|
|
@@ -9,9 +9,9 @@ declare const __VLS_export: _$vue.DefineComponent<DatePickerProps, {}, {}, {}, {
|
|
|
9
9
|
}>, {
|
|
10
10
|
type: "date" | "month" | "year";
|
|
11
11
|
disabled: boolean;
|
|
12
|
+
readonly: boolean;
|
|
12
13
|
placeholder: string;
|
|
13
14
|
clearable: boolean;
|
|
14
|
-
readonly: boolean;
|
|
15
15
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
16
16
|
declare const _default: typeof __VLS_export;
|
|
17
17
|
//#endregion
|
|
@@ -4,7 +4,7 @@ import _sfc_main$3 from "../date-panel/date-panel.js";
|
|
|
4
4
|
import { Fragment, Transition, computed, createBlock, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, shallowRef, toDisplayString, unref, watch, withCtx, withModifiers } from "vue";
|
|
5
5
|
import { date } from "@cat-kit/core";
|
|
6
6
|
import { FORM_EMPTY_CONTENT, bem } from "@veltra/utils";
|
|
7
|
-
import { useFormComponent, useFormFallbackProps,
|
|
7
|
+
import { useFormComponent, useFormFallbackProps, useUserAction } from "@veltra/compositions";
|
|
8
8
|
import { Calendar, Close } from "@veltra/icons/normal";
|
|
9
9
|
//#region src/components/date-range-picker/date-range-picker.vue
|
|
10
10
|
const _hoisted_1 = ["value", "placeholder"];
|
|
@@ -56,7 +56,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
56
56
|
readonly: false
|
|
57
57
|
});
|
|
58
58
|
const dropdownRef = shallowRef();
|
|
59
|
-
const {
|
|
59
|
+
const { userAction, isUserActive } = useUserAction();
|
|
60
60
|
const currentRangeDate = shallowRef();
|
|
61
61
|
const displayedOfStart = computed(() => {
|
|
62
62
|
return props.modelValue?.[0];
|
|
@@ -73,15 +73,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
73
73
|
return "yyyy-MM-dd";
|
|
74
74
|
});
|
|
75
75
|
watch(() => props.modelValue, (val) => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
});
|
|
76
|
+
if (isUserActive()) return;
|
|
77
|
+
if (val?.length === 2) currentRangeDate.value = [date(val[0]), date(val[1])];
|
|
79
78
|
}, { immediate: true });
|
|
79
|
+
const commitSelectedRange = userAction((rangeDate) => {
|
|
80
|
+
currentRangeDate.value = rangeDate;
|
|
81
|
+
emit("update:modelValue", rangeDate?.map((d) => d.format(formatStr.value)));
|
|
82
|
+
});
|
|
80
83
|
async function handleSelect(rangeDate) {
|
|
81
|
-
await
|
|
82
|
-
currentRangeDate.value = rangeDate;
|
|
83
|
-
emit("update:modelValue", rangeDate?.map((d) => d.format(formatStr.value)));
|
|
84
|
-
});
|
|
84
|
+
await commitSelectedRange(rangeDate);
|
|
85
85
|
dropdownRef.value?.close();
|
|
86
86
|
}
|
|
87
87
|
const hovered = shallowRef(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-range-picker.js","names":[],"sources":["../../../src/components/date-range-picker/date-range-picker.vue"],"sourcesContent":["<template>\n <u-dropdown\n :class=\"className\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n width=\"auto\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n @mouseenter.native=\"hovered = true\"\n @mouseleave.native=\"hovered = false\"\n v-if=\"!readonly\"\n >\n <template #trigger>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfStart\"\n :placeholder=\"placeholder[0]\"\n readonly\n />\n <span :class=\"cls.e('separator')\">至</span>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfEnd\"\n :placeholder=\"placeholder[1]\"\n readonly\n />\n\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <UIcon\n v-if=\"clearable && modelValue && hovered && !disabled\"\n :class=\"[cls.e('icon'), cls.e('clear')]\"\n title=\"清除\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </UIcon>\n\n <u-icon :class=\"cls.e('icon')\" v-else><Calendar /></u-icon>\n </Transition>\n </template>\n\n <template #content>\n <UDatePanel\n range\n :type\n :disabled-date\n :size\n :range-date=\"currentRangeDate\"\n @select:range-date=\"handleSelect\"\n />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ displayedOfStart || FORM_EMPTY_CONTENT }} 至\n {{ displayedOfEnd || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { date, type Dater } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps
|
|
1
|
+
{"version":3,"file":"date-range-picker.js","names":[],"sources":["../../../src/components/date-range-picker/date-range-picker.vue"],"sourcesContent":["<template>\n <u-dropdown\n :class=\"className\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n width=\"auto\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n @mouseenter.native=\"hovered = true\"\n @mouseleave.native=\"hovered = false\"\n v-if=\"!readonly\"\n >\n <template #trigger>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfStart\"\n :placeholder=\"placeholder[0]\"\n readonly\n />\n <span :class=\"cls.e('separator')\">至</span>\n <input\n type=\"text\"\n :class=\"cls.e('input')\"\n :value=\"displayedOfEnd\"\n :placeholder=\"placeholder[1]\"\n readonly\n />\n\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <UIcon\n v-if=\"clearable && modelValue && hovered && !disabled\"\n :class=\"[cls.e('icon'), cls.e('clear')]\"\n title=\"清除\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </UIcon>\n\n <u-icon :class=\"cls.e('icon')\" v-else><Calendar /></u-icon>\n </Transition>\n </template>\n\n <template #content>\n <UDatePanel\n range\n :type\n :disabled-date\n :size\n :range-date=\"currentRangeDate\"\n @select:range-date=\"handleSelect\"\n />\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ displayedOfStart || FORM_EMPTY_CONTENT }} 至\n {{ displayedOfEnd || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { date, type Dater } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { Calendar, Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { DateRangePickerEmits, DateRangePickerProps, DropdownExposed } from '../../types'\nimport { UDatePanel } from '../date-panel'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\n\ndefineOptions({\n name: 'DateRangePicker'\n})\n\nconst props = withDefaults(defineProps<DateRangePickerProps>(), {\n placeholder: () => ['起始日期', '结束日期'],\n type: 'date',\n disabled: undefined,\n readonly: undefined,\n clearable: true\n})\n\nconst emit = defineEmits<DateRangePickerEmits>()\n\nconst cls = bem('date-range-picker')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('disabled', disabled.value)]\n})\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst currentRangeDate = shallowRef<[Dater, Dater]>()\n\nconst displayedOfStart = computed(() => {\n return props.modelValue?.[0]\n})\n\nconst displayedOfEnd = computed(() => {\n return props.modelValue?.[1]\n})\n\nconst formatStr = computed(() => {\n const { format, type } = props\n if (format) return format\n if (type === 'date') return 'yyyy-MM-dd'\n if (type === 'month') return 'yyyy-MM'\n if (type === 'year') return 'yyyy'\n return 'yyyy-MM-dd'\n})\n\nwatch(\n () => props.modelValue,\n (val) => {\n if (isUserActive()) return\n if (val?.length === 2) {\n currentRangeDate.value = [date(val[0]), date(val[1])]\n }\n },\n { immediate: true }\n)\n\nconst commitSelectedRange = userAction((rangeDate: [Dater, Dater] | undefined) => {\n currentRangeDate.value = rangeDate\n emit('update:modelValue', rangeDate?.map((d) => d.format(formatStr.value)) as [string, string])\n})\n\nasync function handleSelect(rangeDate: [Dater, Dater] | undefined) {\n await commitSelectedRange(rangeDate)\n dropdownRef.value?.close()\n}\n\nconst hovered = shallowRef(false)\n\nfunction handleClear() {\n currentRangeDate.value = undefined\n emit('update:modelValue', undefined)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -9,9 +9,9 @@ declare const __VLS_export: _$vue.DefineComponent<DateRangePickerProps, {}, {},
|
|
|
9
9
|
}>, {
|
|
10
10
|
type: "date" | "month" | "year";
|
|
11
11
|
disabled: boolean;
|
|
12
|
+
readonly: boolean;
|
|
12
13
|
placeholder: [string, string];
|
|
13
14
|
clearable: boolean;
|
|
14
|
-
readonly: boolean;
|
|
15
15
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
16
16
|
declare const _default: typeof __VLS_export;
|
|
17
17
|
//#endregion
|
|
@@ -3,8 +3,8 @@ import * as _$vue from "vue";
|
|
|
3
3
|
|
|
4
4
|
//#region src/components/empty/empty.vue.d.ts
|
|
5
5
|
declare const __VLS_export: _$vue.DefineComponent<EmptyProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<EmptyProps> & Readonly<{}>, {
|
|
6
|
-
text: string;
|
|
7
6
|
size: number;
|
|
7
|
+
text: string;
|
|
8
8
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
9
9
|
declare const _default: typeof __VLS_export;
|
|
10
10
|
//#endregion
|
|
@@ -13,8 +13,8 @@ declare const __VLS_base: _$vue.DefineComponent<UploaderProps, {}, {}, {}, {}, _
|
|
|
13
13
|
}, string, _$vue.PublicProps, Readonly<UploaderProps> & Readonly<{
|
|
14
14
|
onPick?: ((files: File[]) => any) | undefined;
|
|
15
15
|
}>, {
|
|
16
|
-
multiple: boolean;
|
|
17
16
|
tag: string;
|
|
17
|
+
multiple: boolean;
|
|
18
18
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
19
19
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
20
20
|
declare const _default: typeof __VLS_export;
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
//#region src/components/file-picker/helper.ts
|
|
2
2
|
/**
|
|
3
|
-
* 校验文件是否匹配 accept
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* 校验文件是否匹配 accept 字符串(支持 MIME 类型与通配符)。
|
|
4
|
+
*
|
|
5
|
+
* 支持的形式:
|
|
6
|
+
* - `*` / `*\/*`:接受所有文件
|
|
7
|
+
* - `image/*`:MIME 类型组匹配
|
|
8
|
+
* - `application/pdf`:精确 MIME 类型
|
|
9
|
+
* - `.pdf` / `.docx`:扩展名匹配(不区分大小写)
|
|
10
|
+
*
|
|
11
|
+
* 多个值以逗号分隔,命中任一即视为匹配。
|
|
6
12
|
*/
|
|
7
13
|
function matchAccept(file, accept) {
|
|
8
14
|
if (!accept) return true;
|
|
9
15
|
const fileType = file.type.toLowerCase();
|
|
10
|
-
|
|
16
|
+
const fileName = file.name.toLowerCase();
|
|
17
|
+
const acceptList = accept.split(",").map((item) => item.trim().toLowerCase()).filter(Boolean);
|
|
18
|
+
if (!acceptList.length) return true;
|
|
19
|
+
return acceptList.some((item) => {
|
|
20
|
+
if (item === "*" || item === "*/*") return true;
|
|
21
|
+
if (item.startsWith(".")) return fileName.endsWith(item);
|
|
11
22
|
if (item.endsWith("/*")) {
|
|
12
|
-
const group = item.
|
|
13
|
-
return fileType.startsWith(group);
|
|
14
|
-
}
|
|
23
|
+
const group = item.slice(0, -2);
|
|
24
|
+
return fileType.startsWith(`${group}/`);
|
|
25
|
+
}
|
|
26
|
+
return fileType === item;
|
|
15
27
|
});
|
|
16
28
|
}
|
|
17
29
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/file-picker/helper.ts"],"sourcesContent":["/**\n * 校验文件是否匹配 accept
|
|
1
|
+
{"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/file-picker/helper.ts"],"sourcesContent":["/**\n * 校验文件是否匹配 accept 字符串(支持 MIME 类型与通配符)。\n *\n * 支持的形式:\n * - `*` / `*\\/*`:接受所有文件\n * - `image/*`:MIME 类型组匹配\n * - `application/pdf`:精确 MIME 类型\n * - `.pdf` / `.docx`:扩展名匹配(不区分大小写)\n *\n * 多个值以逗号分隔,命中任一即视为匹配。\n */\nexport function matchAccept(file: File, accept?: string): boolean {\n if (!accept) return true\n\n const fileType = file.type.toLowerCase()\n const fileName = file.name.toLowerCase()\n const acceptList = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n\n if (!acceptList.length) return true\n\n return acceptList.some((item) => {\n if (item === '*' || item === '*/*') return true\n if (item.startsWith('.')) return fileName.endsWith(item)\n if (item.endsWith('/*')) {\n const group = item.slice(0, -2)\n return fileType.startsWith(`${group}/`)\n }\n return fileType === item\n })\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,YAAY,MAAY,QAA0B;AAChE,KAAI,CAAC,OAAQ,QAAO;CAEpB,MAAM,WAAW,KAAK,KAAK,aAAa;CACxC,MAAM,WAAW,KAAK,KAAK,aAAa;CACxC,MAAM,aAAa,OAChB,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,MAAM,CAAC,aAAa,CAAC,CACxC,OAAO,QAAQ;AAElB,KAAI,CAAC,WAAW,OAAQ,QAAO;AAE/B,QAAO,WAAW,MAAM,SAAS;AAC/B,MAAI,SAAS,OAAO,SAAS,MAAO,QAAO;AAC3C,MAAI,KAAK,WAAW,IAAI,CAAE,QAAO,SAAS,SAAS,KAAK;AACxD,MAAI,KAAK,SAAS,KAAK,EAAE;GACvB,MAAM,QAAQ,KAAK,MAAM,GAAG,GAAG;AAC/B,UAAO,SAAS,WAAW,GAAG,MAAM,GAAG;;AAEzC,SAAO,aAAa;GACpB"}
|