sard-uniapp 1.25.3 → 1.25.5
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/CHANGELOG.md +25 -0
- package/README.md +15 -0
- package/components/accordion/accordion.vue +1 -1
- package/components/accordion-item/accordion-item.vue +1 -1
- package/components/action-sheet/action-sheet.vue +1 -1
- package/components/alert/alert.vue +1 -1
- package/components/avatar/avatar.vue +1 -1
- package/components/avatar-group/avatar-group.vue +1 -1
- package/components/back-top/back-top.vue +1 -1
- package/components/badge/badge.vue +1 -1
- package/components/button/button.vue +1 -1
- package/components/calendar/calendar.vue +1 -1
- package/components/calendar-input/README.md +1 -3
- package/components/calendar-input/calendar-input.d.ts +2 -0
- package/components/calendar-input/calendar-input.vue +13 -3
- package/components/calendar-input/common.d.ts +152 -0
- package/components/calendar-popout/calendar-popout.vue +2 -2
- package/components/card/card.vue +1 -1
- package/components/cascader/README.md +89 -18
- package/components/cascader/cascader.d.ts +6 -6
- package/components/cascader/cascader.vue +201 -182
- package/components/cascader/common.d.ts +32 -7
- package/components/cascader/common.js +39 -23
- package/components/cascader/index.d.ts +1 -1
- package/components/cascader/index.scss +40 -4
- package/components/cascader/useCascaderTabs.d.ts +12 -0
- package/components/cascader/useCascaderTabs.js +59 -0
- package/components/cascader/useCascaderTree.d.ts +66 -0
- package/components/cascader/useCascaderTree.js +194 -0
- package/components/cascader/variables.scss +9 -2
- package/components/cascader-input/README.md +27 -18
- package/components/cascader-input/cascader-input.d.ts +9 -2
- package/components/cascader-input/cascader-input.vue +81 -17
- package/components/cascader-input/common.d.ts +470 -28
- package/components/cascader-popout/README.md +6 -0
- package/components/cascader-popout/cascader-popout.d.ts +5 -1
- package/components/cascader-popout/cascader-popout.vue +16 -4
- package/components/cascader-popout/common.d.ts +169 -17
- package/components/check-icon/check-icon.vue +1 -1
- package/components/checkbox/checkbox.d.ts +2 -2
- package/components/checkbox/checkbox.vue +1 -1
- package/components/checkbox-group/checkbox-group.vue +1 -1
- package/components/checkbox-input/README.md +1 -3
- package/components/checkbox-input/checkbox-input.d.ts +2 -0
- package/components/checkbox-input/checkbox-input.vue +13 -3
- package/components/checkbox-input/common.d.ts +128 -0
- package/components/checkbox-popout/checkbox-popout.vue +2 -2
- package/components/col/col.vue +1 -1
- package/components/collapse/collapse.vue +1 -1
- package/components/config/index.js +4 -1
- package/components/cool-icon/cool-icon.vue +1 -1
- package/components/count-down/count-down.vue +1 -1
- package/components/crop-image/crop-image.vue +1 -1
- package/components/crop-image-agent/crop-image-agent.vue +1 -1
- package/components/datetime-picker/datetime-picker.vue +1 -1
- package/components/datetime-picker-input/README.md +1 -3
- package/components/datetime-picker-input/common.d.ts +116 -0
- package/components/datetime-picker-input/datetime-picker-input.d.ts +2 -0
- package/components/datetime-picker-input/datetime-picker-input.vue +13 -3
- package/components/datetime-picker-popout/datetime-picker-popout.vue +2 -2
- package/components/datetime-range-picker/datetime-range-picker.vue +1 -1
- package/components/datetime-range-picker-input/README.md +1 -3
- package/components/datetime-range-picker-input/common.d.ts +120 -0
- package/components/datetime-range-picker-input/datetime-range-picker-input.d.ts +2 -0
- package/components/datetime-range-picker-input/datetime-range-picker-input.vue +13 -3
- package/components/datetime-range-picker-popout/datetime-range-picker-popout.vue +2 -2
- package/components/dialog/dialog.vue +2 -2
- package/components/dialog-agent/dialog-agent.vue +2 -2
- package/components/divider/divider.vue +1 -1
- package/components/dnd/dnd.vue +1 -1
- package/components/dnd-handle/dnd-handle.vue +1 -1
- package/components/dnd-item/dnd-item.vue +1 -1
- package/components/dropdown/dropdown.vue +1 -1
- package/components/dropdown-item/dropdown-item.vue +7 -2
- package/components/empty/empty.vue +1 -1
- package/components/fab/fab.vue +1 -1
- package/components/fab-item/fab-item.vue +1 -1
- package/components/floating-bubble/floating-bubble.vue +1 -1
- package/components/floating-panel/floating-panel.vue +1 -1
- package/components/form/form.vue +1 -1
- package/components/form-item/form-item.vue +1 -1
- package/components/form-item-plain/form-item-plain.vue +1 -1
- package/components/form-plain/form-plain.vue +1 -1
- package/components/grid/grid.vue +1 -1
- package/components/grid-item/grid-item.vue +2 -2
- package/components/icon/icon.vue +1 -1
- package/components/icon/sari.scss +17 -17
- package/components/image/image.vue +10 -4
- package/components/indexes/indexes.vue +1 -1
- package/components/indexes-anchor/indexes-anchor.vue +1 -1
- package/components/input/index.scss +2 -0
- package/components/input/input.vue +1 -1
- package/components/keyboard/keyboard.vue +1 -1
- package/components/list/list.vue +1 -1
- package/components/list-item/list-item.vue +1 -1
- package/components/load-more/load-more.vue +1 -1
- package/components/loading/loading.vue +1 -1
- package/components/locale/lang/ar-SA.d.ts +2 -0
- package/components/locale/lang/ar-SA.js +2 -0
- package/components/locale/lang/en-US.d.ts +2 -0
- package/components/locale/lang/en-US.js +2 -0
- package/components/locale/lang/vi-VN.d.ts +2 -0
- package/components/locale/lang/vi-VN.js +2 -0
- package/components/locale/lang/zh-CN.d.ts +2 -0
- package/components/locale/lang/zh-CN.js +2 -0
- package/components/marquee/marquee.vue +1 -1
- package/components/menu/menu.vue +1 -1
- package/components/navbar/navbar.vue +2 -2
- package/components/navbar-item/navbar-item.vue +1 -1
- package/components/navbar-pit/navbar-pit.vue +1 -1
- package/components/notice-bar/notice-bar.vue +1 -1
- package/components/notify/notify.vue +2 -1
- package/components/notify-agent/notify-agent.vue +1 -1
- package/components/overlay/overlay.vue +1 -1
- package/components/pagination/pagination.vue +1 -1
- package/components/password-input/password-input.vue +1 -1
- package/components/picker/picker.vue +1 -1
- package/components/picker-input/README.md +1 -7
- package/components/picker-input/common.d.ts +102 -0
- package/components/picker-input/picker-input.d.ts +2 -0
- package/components/picker-input/picker-input.vue +13 -4
- package/components/picker-item/picker-item.vue +1 -1
- package/components/picker-popout/picker-popout.vue +2 -2
- package/components/popout/popout.vue +1 -1
- package/components/popout-input/README.md +5 -3
- package/components/popout-input/common.d.ts +63 -1
- package/components/popout-input/index.scss +0 -1
- package/components/popout-input/popout-input.d.ts +2 -0
- package/components/popout-input/popout-input.vue +5 -3
- package/components/popout-input/variables.scss +0 -1
- package/components/popover/popover.vue +3 -2
- package/components/popover-reference/popover-reference.vue +1 -1
- package/components/popup/README.md +1 -0
- package/components/popup/common.d.ts +28 -0
- package/components/popup/index.scss +4 -2
- package/components/popup/popup.d.ts +1 -0
- package/components/popup/popup.vue +82 -16
- package/components/popup/variables.scss +6 -0
- package/components/progress-bar/progress-bar.vue +1 -1
- package/components/progress-circle/progress-circle.vue +1 -1
- package/components/pull-down-refresh/pull-down-refresh.vue +1 -1
- package/components/qrcode/qrcode.vue +6 -5
- package/components/radio/radio.vue +1 -1
- package/components/radio-group/radio-group.vue +1 -1
- package/components/radio-input/README.md +1 -3
- package/components/radio-input/common.d.ts +122 -0
- package/components/radio-input/radio-input.d.ts +2 -0
- package/components/radio-input/radio-input.vue +13 -3
- package/components/radio-popout/radio-popout.vue +2 -2
- package/components/rate/rate.vue +1 -1
- package/components/read-more/read-more.vue +1 -1
- package/components/resize-sensor/index.scss +7 -0
- package/components/resize-sensor/resize-sensor.vue +10 -3
- package/components/result/result.vue +1 -1
- package/components/row/row.vue +1 -1
- package/components/scroll-list/scroll-list.vue +1 -1
- package/components/scroll-spy/scroll-spy.vue +1 -1
- package/components/scroll-spy-anchor/scroll-spy-anchor.vue +1 -1
- package/components/search/search.vue +1 -1
- package/components/segmented/segmented.vue +1 -1
- package/components/segmented-item/segmented-item.vue +1 -1
- package/components/share-sheet/share-sheet.vue +2 -1
- package/components/sidebar/sidebar.vue +1 -1
- package/components/sidebar-item/sidebar-item.vue +1 -1
- package/components/signature/signature.vue +1 -1
- package/components/skeleton/skeleton.vue +1 -1
- package/components/skeleton-avatar/skeleton-avatar.vue +1 -1
- package/components/skeleton-block/skeleton-block.vue +1 -1
- package/components/skeleton-paragraph/skeleton-paragraph.vue +1 -1
- package/components/skeleton-title/skeleton-title.vue +1 -1
- package/components/slider/slider.vue +1 -1
- package/components/space/space.vue +1 -1
- package/components/status-bar/status-bar.vue +1 -1
- package/components/step/step.vue +1 -1
- package/components/stepper/stepper.vue +1 -1
- package/components/steps/steps.vue +1 -1
- package/components/sticky/sticky.vue +1 -1
- package/components/sticky-box/sticky-box.vue +1 -1
- package/components/swipe-action/swipe-action.vue +1 -1
- package/components/swiper-dot/swiper-dot.vue +1 -1
- package/components/switch/switch.vue +1 -1
- package/components/tab/tab.vue +1 -1
- package/components/tabbar/tabbar.vue +1 -1
- package/components/tabbar-item/tabbar-item.vue +1 -1
- package/components/tabbar-pit/tabbar-pit.vue +1 -1
- package/components/table/table.vue +1 -1
- package/components/table-cell/table-cell.vue +1 -1
- package/components/table-fixation/table-fixation.vue +1 -1
- package/components/table-row/table-row.vue +1 -1
- package/components/tabs/tabs.vue +1 -1
- package/components/tag/tag.vue +1 -1
- package/components/timeline/timeline.vue +1 -1
- package/components/timeline-item/timeline-item.vue +1 -1
- package/components/toast/toast.vue +2 -1
- package/components/toast-agent/toast-agent.vue +1 -1
- package/components/tree/README.md +0 -2
- package/components/tree/tree.d.ts +1 -1
- package/components/tree/tree.vue +36 -81
- package/components/tree-node/tree-node.vue +8 -4
- package/components/upload/upload.vue +1 -1
- package/components/upload-preview/upload-preview.vue +1 -1
- package/components/waterfall/waterfall.vue +1 -1
- package/components/waterfall-item/waterfall-item.vue +1 -1
- package/components/waterfall-load/waterfall-load.vue +1 -1
- package/components/watermark/watermark.vue +6 -8
- package/package.json +2 -1
- package/use/index.d.ts +1 -0
- package/use/index.js +1 -0
- package/use/useLockScroll.d.ts +8 -0
- package/use/useLockScroll.js +88 -0
- package/utils/file.d.ts +6 -0
- package/utils/file.js +33 -11
- package/utils/index.d.ts +2 -0
- package/utils/index.js +2 -0
- package/utils/log.d.ts +1 -0
- package/utils/log.js +4 -0
- package/utils/router.js +2 -1
- package/utils/system.d.ts +2 -0
- package/utils/system.js +6 -1
- package/utils/tree.d.ts +18 -0
- package/utils/tree.js +94 -0
- package/components/tree/utils.d.ts +0 -5
- package/components/tree/utils.js +0 -29
|
@@ -62,6 +62,33 @@
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
@include e(selection) {
|
|
66
|
+
@include universal;
|
|
67
|
+
justify-content: center;
|
|
68
|
+
margin: calc(var(--sar-cascader-option-padding-y) * -1) 0
|
|
69
|
+
calc(var(--sar-cascader-option-padding-y) * -1)
|
|
70
|
+
calc(var(--sar-cascader-selection-padding-x) * -1);
|
|
71
|
+
padding: var(--sar-cascader-option-padding-y)
|
|
72
|
+
var(--sar-cascader-selection-padding-x);
|
|
73
|
+
font-weight: normal;
|
|
74
|
+
cursor: pointer;
|
|
75
|
+
|
|
76
|
+
@include m(disabled) {
|
|
77
|
+
cursor: not-allowed;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@include e(option-loading) {
|
|
82
|
+
display: none;
|
|
83
|
+
margin-right: var(--sar-cascader-option-loading-margin-right);
|
|
84
|
+
font-size: var(--sar-cascader-option-loading-size);
|
|
85
|
+
color: var(--sar-cascader-option-loading-color);
|
|
86
|
+
|
|
87
|
+
@include m(show) {
|
|
88
|
+
display: inline-flex;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
65
92
|
@include e(option-label) {
|
|
66
93
|
font-size: var(--sar-cascader-option-font-size);
|
|
67
94
|
line-height: var(--sar-cascader-option-line-height);
|
|
@@ -74,27 +101,36 @@
|
|
|
74
101
|
margin-left: auto;
|
|
75
102
|
}
|
|
76
103
|
|
|
77
|
-
@include e(
|
|
104
|
+
@include e(load-status-wrapper) {
|
|
78
105
|
@include universal;
|
|
79
106
|
position: absolute;
|
|
80
107
|
top: 0;
|
|
81
108
|
left: 0;
|
|
82
|
-
z-index:
|
|
109
|
+
z-index: 1;
|
|
83
110
|
width: 100%;
|
|
84
111
|
height: 100%;
|
|
85
112
|
justify-content: center;
|
|
86
113
|
align-items: center;
|
|
87
114
|
opacity: 0;
|
|
88
|
-
transition: opacity var(--sar-cascader-
|
|
115
|
+
transition: opacity var(--sar-cascader-load-status-wrapper-duration);
|
|
89
116
|
pointer-events: none;
|
|
90
117
|
|
|
91
118
|
@include m(show) {
|
|
92
119
|
opacity: 1;
|
|
120
|
+
pointer-events: auto;
|
|
93
121
|
}
|
|
94
122
|
}
|
|
95
123
|
|
|
124
|
+
@include e(load-status) {
|
|
125
|
+
font-size: var(--sar-cascader-load-status-size);
|
|
126
|
+
color: var(--sar-cascader-load-status-color);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@include e(error, empty) {
|
|
130
|
+
cursor: pointer;
|
|
131
|
+
}
|
|
132
|
+
|
|
96
133
|
@include e(loading) {
|
|
97
134
|
font-size: var(--sar-cascader-loading-size);
|
|
98
|
-
color: var(--sar-cascader-loading-color);
|
|
99
135
|
}
|
|
100
136
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
import { type CascaderPanel, type CascaderProps, type CascaderStateNode } from './common';
|
|
3
|
+
export declare function useCascaderTabs(props: CascaderProps, config: {
|
|
4
|
+
treeData: Ref<CascaderStateNode[]>;
|
|
5
|
+
}): {
|
|
6
|
+
panels: import("vue").ComputedRef<CascaderPanel[]>;
|
|
7
|
+
renderedPane: Ref<boolean, boolean>;
|
|
8
|
+
currentTab: Ref<number, number>;
|
|
9
|
+
tabList: import("vue").ComputedRef<{
|
|
10
|
+
title: string;
|
|
11
|
+
}[]>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { computed, ref, watch } from 'vue';
|
|
2
|
+
import { useTranslate } from '../locale';
|
|
3
|
+
export function useCascaderTabs(props, config) {
|
|
4
|
+
const { treeData } = config;
|
|
5
|
+
const currentTab = ref(0);
|
|
6
|
+
const renderedPane = ref(false);
|
|
7
|
+
const panels = computed(() => {
|
|
8
|
+
let currentPanels = {
|
|
9
|
+
nodes: treeData.value,
|
|
10
|
+
selected: null,
|
|
11
|
+
};
|
|
12
|
+
const panels = [currentPanels];
|
|
13
|
+
while (currentPanels) {
|
|
14
|
+
const node = currentPanels.nodes.find((node) => node.selected);
|
|
15
|
+
if (node) {
|
|
16
|
+
currentPanels.selected = node;
|
|
17
|
+
}
|
|
18
|
+
if (node && node.children && node.children.length) {
|
|
19
|
+
panels.push((currentPanels = {
|
|
20
|
+
nodes: node.children,
|
|
21
|
+
selected: null,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return panels;
|
|
29
|
+
});
|
|
30
|
+
watch(panels, () => {
|
|
31
|
+
if (!renderedPane.value) {
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
renderedPane.value = true;
|
|
34
|
+
// 确保小程序端已渲染完毕
|
|
35
|
+
}, 30);
|
|
36
|
+
}
|
|
37
|
+
}, {
|
|
38
|
+
immediate: true,
|
|
39
|
+
});
|
|
40
|
+
const { t } = useTranslate('cascader');
|
|
41
|
+
const innerPaceholder = computed(() => {
|
|
42
|
+
return props.hintText || t('pleaseSelect');
|
|
43
|
+
});
|
|
44
|
+
const tabList = computed(() => {
|
|
45
|
+
return panels.value.map((panel) => {
|
|
46
|
+
const { selected } = panel;
|
|
47
|
+
const label = selected ? selected.label : innerPaceholder.value;
|
|
48
|
+
return {
|
|
49
|
+
title: label,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
panels,
|
|
55
|
+
renderedPane,
|
|
56
|
+
currentTab,
|
|
57
|
+
tabList,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ComputedRef, type Ref } from 'vue';
|
|
2
|
+
import { type CascaderValue, type CascaderFieldKeys, type CascaderOption, type CascaderProps, type CascaderStateNode } from './common';
|
|
3
|
+
export declare function useCascaderTree(props: CascaderProps, config: {
|
|
4
|
+
fieldKeys: ComputedRef<Required<CascaderFieldKeys>>;
|
|
5
|
+
innerValue: Ref<CascaderValue | undefined>;
|
|
6
|
+
}): {
|
|
7
|
+
treeData: Ref<{
|
|
8
|
+
label: string;
|
|
9
|
+
value: string | number;
|
|
10
|
+
key: string | number;
|
|
11
|
+
disabled: boolean;
|
|
12
|
+
children?: any[] | undefined;
|
|
13
|
+
parent: any | null;
|
|
14
|
+
isLeaf: boolean;
|
|
15
|
+
loadStatus: "idle" | "loading" | "loaded";
|
|
16
|
+
depth: number;
|
|
17
|
+
indeterminate: boolean;
|
|
18
|
+
checked: boolean;
|
|
19
|
+
selected: boolean;
|
|
20
|
+
option: {
|
|
21
|
+
[x: string]: any;
|
|
22
|
+
[x: number]: any;
|
|
23
|
+
[x: symbol]: any;
|
|
24
|
+
label?: string | undefined;
|
|
25
|
+
value?: (string | number) | undefined;
|
|
26
|
+
disabled?: boolean | undefined;
|
|
27
|
+
children?: any[] | undefined;
|
|
28
|
+
isLeaf?: boolean | undefined;
|
|
29
|
+
};
|
|
30
|
+
}[], CascaderStateNode[] | {
|
|
31
|
+
label: string;
|
|
32
|
+
value: string | number;
|
|
33
|
+
key: string | number;
|
|
34
|
+
disabled: boolean;
|
|
35
|
+
children?: any[] | undefined;
|
|
36
|
+
parent: any | null;
|
|
37
|
+
isLeaf: boolean;
|
|
38
|
+
loadStatus: "idle" | "loading" | "loaded";
|
|
39
|
+
depth: number;
|
|
40
|
+
indeterminate: boolean;
|
|
41
|
+
checked: boolean;
|
|
42
|
+
selected: boolean;
|
|
43
|
+
option: {
|
|
44
|
+
[x: string]: any;
|
|
45
|
+
[x: number]: any;
|
|
46
|
+
[x: symbol]: any;
|
|
47
|
+
label?: string | undefined;
|
|
48
|
+
value?: (string | number) | undefined;
|
|
49
|
+
disabled?: boolean | undefined;
|
|
50
|
+
children?: any[] | undefined;
|
|
51
|
+
isLeaf?: boolean | undefined;
|
|
52
|
+
};
|
|
53
|
+
}[]>;
|
|
54
|
+
originalTreeData: import("vue").ShallowRef<CascaderOption[], CascaderOption[]>;
|
|
55
|
+
loadStatus: Ref<"idle" | "error" | "loading" | "loaded", "idle" | "error" | "loading" | "loaded">;
|
|
56
|
+
legacyLoadChildren: Ref<boolean, boolean>;
|
|
57
|
+
toStateNodes: (options: CascaderOption[], parent: CascaderStateNode | null) => CascaderStateNode[];
|
|
58
|
+
setSelectedByNode: (node: CascaderStateNode) => void;
|
|
59
|
+
updateChecked: (value?: CascaderValue) => void;
|
|
60
|
+
setCheckedByNode: (node: CascaderStateNode, checked: boolean) => void;
|
|
61
|
+
isLeaf: (node: CascaderStateNode) => boolean;
|
|
62
|
+
getCheckedLeaves: () => CascaderStateNode[];
|
|
63
|
+
getCheckedNodes: () => CascaderStateNode[];
|
|
64
|
+
getAncestors: (node: CascaderStateNode) => CascaderStateNode[];
|
|
65
|
+
initialize: () => Promise<void>;
|
|
66
|
+
};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { computed, inject, reactive, ref, shallowRef, watch, } from 'vue';
|
|
2
|
+
import { cascaderOptionsContextSymbol, } from './common';
|
|
3
|
+
import { isNumber, isString, setCheckedRecursively, walkAncestor, walkNodes, } from '../../utils';
|
|
4
|
+
export function useCascaderTree(props, config) {
|
|
5
|
+
const { fieldKeys, innerValue } = config;
|
|
6
|
+
const options = computed(() => props.options || []);
|
|
7
|
+
const legacyLoadChildren = ref(false);
|
|
8
|
+
const treeData = ref([]);
|
|
9
|
+
const originalTreeData = shallowRef([]);
|
|
10
|
+
const loadStatus = ref('loaded');
|
|
11
|
+
const toStateNodes = (options, parent) => {
|
|
12
|
+
const keys = fieldKeys.value;
|
|
13
|
+
return options.map((option) => {
|
|
14
|
+
const key = option[keys.value];
|
|
15
|
+
const stateNode = reactive({
|
|
16
|
+
label: option[keys.label],
|
|
17
|
+
value: option[keys.value],
|
|
18
|
+
key,
|
|
19
|
+
disabled: !!option[keys.disabled],
|
|
20
|
+
parent,
|
|
21
|
+
isLeaf: !!option[keys.isLeaf],
|
|
22
|
+
depth: parent ? parent.depth + 1 : 0,
|
|
23
|
+
indeterminate: false,
|
|
24
|
+
checked: false,
|
|
25
|
+
selected: false,
|
|
26
|
+
loadStatus: 'idle',
|
|
27
|
+
option,
|
|
28
|
+
});
|
|
29
|
+
const children = option[keys.children];
|
|
30
|
+
if (children) {
|
|
31
|
+
stateNode.children = toStateNodes(children, stateNode);
|
|
32
|
+
}
|
|
33
|
+
treeMap.value[key] = stateNode;
|
|
34
|
+
return stateNode;
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
const isLeaf = (node) => {
|
|
38
|
+
return node.isLeaf || !Array.isArray(node.children);
|
|
39
|
+
};
|
|
40
|
+
const clearSelected = () => {
|
|
41
|
+
walkNodes(treeData.value, (node) => {
|
|
42
|
+
node.selected = false;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const setAncestorSelected = (node) => {
|
|
46
|
+
walkAncestor(node, (node) => {
|
|
47
|
+
node.selected = true;
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const setSelectedByNode = (node) => {
|
|
51
|
+
clearSelected();
|
|
52
|
+
setAncestorSelected(node);
|
|
53
|
+
};
|
|
54
|
+
const clearChecked = () => {
|
|
55
|
+
walkNodes(treeData.value, (node) => {
|
|
56
|
+
node.checked = false;
|
|
57
|
+
node.indeterminate = false;
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const setCheckedByNode = (node, checked) => {
|
|
61
|
+
setCheckedRecursively(node, checked, props.checkStrictly);
|
|
62
|
+
};
|
|
63
|
+
const getCheckedLeaves = () => {
|
|
64
|
+
const nodes = [];
|
|
65
|
+
walkNodes(treeData.value, (node) => {
|
|
66
|
+
if (node.checked && isLeaf(node)) {
|
|
67
|
+
nodes.push(node);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return nodes;
|
|
71
|
+
};
|
|
72
|
+
const getCheckedNodes = () => {
|
|
73
|
+
const nodes = [];
|
|
74
|
+
walkNodes(treeData.value, (node) => {
|
|
75
|
+
if (node.checked) {
|
|
76
|
+
nodes.push(node);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return nodes;
|
|
80
|
+
};
|
|
81
|
+
const getAncestors = (node) => {
|
|
82
|
+
const nodes = [];
|
|
83
|
+
walkAncestor(node, (node) => {
|
|
84
|
+
nodes.unshift(node);
|
|
85
|
+
});
|
|
86
|
+
return nodes;
|
|
87
|
+
};
|
|
88
|
+
const updateChecked = (value) => {
|
|
89
|
+
clearSelected();
|
|
90
|
+
// 多选
|
|
91
|
+
if (props.multiple) {
|
|
92
|
+
clearChecked();
|
|
93
|
+
if (Array.isArray(value)) {
|
|
94
|
+
let lastNode;
|
|
95
|
+
const maySetChecked = (value) => {
|
|
96
|
+
if (isString(value) || isNumber(value)) {
|
|
97
|
+
const node = treeMap.value[value];
|
|
98
|
+
if (node) {
|
|
99
|
+
lastNode = node;
|
|
100
|
+
setCheckedByNode(node, true);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
// 全路径
|
|
105
|
+
if (props.allLevels) {
|
|
106
|
+
value.forEach((item) => {
|
|
107
|
+
if (Array.isArray(item)) {
|
|
108
|
+
maySetChecked(item[item.length - 1]);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// 最后一级
|
|
113
|
+
else {
|
|
114
|
+
value.forEach(maySetChecked);
|
|
115
|
+
}
|
|
116
|
+
if (lastNode) {
|
|
117
|
+
setAncestorSelected(lastNode);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 单选
|
|
122
|
+
else {
|
|
123
|
+
const maySetSelected = (value) => {
|
|
124
|
+
if (isString(value) || isNumber(value)) {
|
|
125
|
+
const node = treeMap.value[value];
|
|
126
|
+
if (node) {
|
|
127
|
+
setAncestorSelected(node);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
// 全路径
|
|
132
|
+
if (props.allLevels) {
|
|
133
|
+
if (Array.isArray(value)) {
|
|
134
|
+
maySetSelected(value[value.length - 1]);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// 最后一级
|
|
138
|
+
else {
|
|
139
|
+
maySetSelected(value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
const initialize = async () => {
|
|
144
|
+
if (props.lazy && props.load) {
|
|
145
|
+
try {
|
|
146
|
+
loadStatus.value = 'loading';
|
|
147
|
+
const data = await props.load();
|
|
148
|
+
loadStatus.value = 'loaded';
|
|
149
|
+
initializeTree(data);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
loadStatus.value = 'error';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
initializeTree(options.value);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
const treeMap = shallowRef({});
|
|
160
|
+
const initializeTree = (data) => {
|
|
161
|
+
if (legacyLoadChildren.value) {
|
|
162
|
+
legacyLoadChildren.value = false;
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
treeMap.value = {};
|
|
166
|
+
treeData.value = toStateNodes(data, null);
|
|
167
|
+
updateChecked(innerValue.value);
|
|
168
|
+
originalTreeData.value = data;
|
|
169
|
+
};
|
|
170
|
+
watch(options, () => {
|
|
171
|
+
initializeTree(options.value);
|
|
172
|
+
});
|
|
173
|
+
const optionsContext = inject(cascaderOptionsContextSymbol, null);
|
|
174
|
+
watch(originalTreeData, () => {
|
|
175
|
+
if (optionsContext) {
|
|
176
|
+
optionsContext.set(originalTreeData.value);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
treeData,
|
|
181
|
+
originalTreeData,
|
|
182
|
+
loadStatus,
|
|
183
|
+
legacyLoadChildren,
|
|
184
|
+
toStateNodes,
|
|
185
|
+
setSelectedByNode,
|
|
186
|
+
updateChecked,
|
|
187
|
+
setCheckedByNode,
|
|
188
|
+
isLeaf,
|
|
189
|
+
getCheckedLeaves,
|
|
190
|
+
getCheckedNodes,
|
|
191
|
+
getAncestors,
|
|
192
|
+
initialize,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
page,
|
|
3
3
|
.sar-portal {
|
|
4
4
|
--sar-cascader-wrapper-duration: var(--sar-duration);
|
|
5
|
-
--sar-cascader-
|
|
5
|
+
--sar-cascader-load-status-wrapper-duration: var(--sar-duration);
|
|
6
6
|
|
|
7
7
|
--sar-cascader-selected-color: var(--sar-primary);
|
|
8
8
|
|
|
9
|
+
--sar-cascader-selection-padding-x: 24rpx;
|
|
10
|
+
|
|
9
11
|
--sar-cascader-options-height: 640rpx;
|
|
10
12
|
|
|
11
13
|
--sar-cascader-option-padding-y: 16rpx;
|
|
@@ -14,7 +16,12 @@ page,
|
|
|
14
16
|
--sar-cascader-option-line-height: 48rpx;
|
|
15
17
|
--sar-cascader-option-active-bg: var(--sar-active-bg);
|
|
16
18
|
|
|
19
|
+
--sar-cascader-option-loading-size: var(--sar-text-base);
|
|
20
|
+
--sar-cascader-option-loading-color: var(--sar-fourth-color);
|
|
21
|
+
--sar-cascader-option-loading-margin-right: 16rpx;
|
|
22
|
+
|
|
23
|
+
--sar-cascader-load-status-size: var(--sar-text-base);
|
|
24
|
+
--sar-cascader-load-status-color: var(--sar-fourth-color);
|
|
17
25
|
--sar-cascader-loading-size: var(--sar-text-xl);
|
|
18
|
-
--sar-cascader-loading-color: var(--sar-tertiary-color);
|
|
19
26
|
}
|
|
20
27
|
// #endvariables
|
|
@@ -25,33 +25,42 @@ import CascaderInput from 'sard-uniapp/components/cascader-input/cascader-input.
|
|
|
25
25
|
|
|
26
26
|
@code('${DEMO_PATH}/cascader-input/demo/Basic.vue')
|
|
27
27
|
|
|
28
|
+
### 多选
|
|
29
|
+
|
|
30
|
+
设置 `multiple` 可进行多选,设置 `max-rows` 可限制输入框展示的行数。
|
|
31
|
+
|
|
32
|
+
@code('${DEMO_PATH}/cascader-input/demo/Multiple.vue')
|
|
33
|
+
|
|
34
|
+
### 懒加载 <sup>1.25.5+</sup>
|
|
35
|
+
|
|
36
|
+
没有加载到数据时,输入框会暂时展示值,而不是标签文本,当加载完数据时,才替换为标签文本。
|
|
37
|
+
|
|
38
|
+
@code('${DEMO_PATH}/cascader-input/demo/Lazy.vue')
|
|
39
|
+
|
|
28
40
|
## API
|
|
29
41
|
|
|
30
42
|
### CascaderInputProps
|
|
31
43
|
|
|
32
44
|
继承 [`CascaderPopoutProps`](./cascader-popout#CascaderPopoutProps) 并有以下额外属性:
|
|
33
45
|
|
|
34
|
-
| 属性 | 描述
|
|
35
|
-
| --------------------------------- |
|
|
36
|
-
| root-class | 弹出式输入框根元素类名
|
|
37
|
-
| root-style | 弹出式输入框根元素样式
|
|
38
|
-
| disabled | 禁用状态
|
|
39
|
-
| readonly | 只读状态
|
|
40
|
-
| loading | 加载状态
|
|
41
|
-
| clearable | 是否显示清空按钮
|
|
42
|
-
| placeholder | 输入框占位符内容
|
|
43
|
-
| value-on-clear <sup>1.19.2+</sup> | 设置点击清除按钮后的值
|
|
44
|
-
| arrow <sup>1.22+</sup> | 自定义箭头图标名
|
|
45
|
-
| arrow-family <sup>1.22+</sup> | 自定义箭头图标字体
|
|
46
|
-
| input-props <sup>1.22+</sup> | 自定义输入框组件属性
|
|
46
|
+
| 属性 | 描述 | 类型 | 默认值 |
|
|
47
|
+
| --------------------------------- | ---------------------------------------------- | ---------- | --------------- |
|
|
48
|
+
| root-class | 弹出式输入框根元素类名 | string | - |
|
|
49
|
+
| root-style | 弹出式输入框根元素样式 | StyleValue | - |
|
|
50
|
+
| disabled | 禁用状态 | boolean | false |
|
|
51
|
+
| readonly | 只读状态 | boolean | false |
|
|
52
|
+
| loading | 加载状态 | boolean | false |
|
|
53
|
+
| clearable | 是否显示清空按钮 | boolean | false |
|
|
54
|
+
| placeholder | 输入框占位符内容 | string | - |
|
|
55
|
+
| value-on-clear <sup>1.19.2+</sup> | 设置点击清除按钮后的值 | () => any | () => undefined |
|
|
56
|
+
| arrow <sup>1.22+</sup> | 自定义箭头图标名 | string | 'caret-right' |
|
|
57
|
+
| arrow-family <sup>1.22+</sup> | 自定义箭头图标字体 | string | 'sari' |
|
|
58
|
+
| input-props <sup>1.22+</sup> | 自定义输入框组件属性 | InputProps | - |
|
|
59
|
+
| max-rows <sup>1.25.5+</sup> | 多选时,输入框最大展示行数,设为 -1 表示不限制 | number | 3 |
|
|
47
60
|
|
|
48
61
|
### CascaderInputSlots
|
|
49
62
|
|
|
50
|
-
继承 [`CascaderPopoutSlots`](./cascader-popout#CascaderPopoutSlots)
|
|
51
|
-
|
|
52
|
-
| 插槽 | 描述 | 属性 |
|
|
53
|
-
| ---------------------- | ---------- | ---------- |
|
|
54
|
-
| arrow <sup>1.22+</sup> | 自定义箭头 | () => void |
|
|
63
|
+
继承 [`CascaderPopoutSlots`](./cascader-popout#CascaderPopoutSlots)和[`PopoutInputSlots`](./popout-input#PopoutInputSlots)
|
|
55
64
|
|
|
56
65
|
### CascaderInputEmits
|
|
57
66
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CascaderFieldKeys, type CascaderOption } from '../cascader/common';
|
|
1
|
+
import { type CascaderFieldKeys, type CascaderOption, type CascaderValue } from '../cascader/common';
|
|
2
2
|
import { type CascaderInputProps, type CascaderInputSlots } from './common';
|
|
3
3
|
declare function __VLS_template(): Readonly<CascaderInputSlots> & CascaderInputSlots;
|
|
4
4
|
declare const __VLS_component: import("vue").DefineComponent<CascaderInputProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
@@ -8,10 +8,13 @@ declare const __VLS_component: import("vue").DefineComponent<CascaderInputProps,
|
|
|
8
8
|
}, string, import("vue").PublicProps, Readonly<CascaderInputProps> & Readonly<{
|
|
9
9
|
[x: `on${Capitalize<any>}`]: ((...args: any) => any) | undefined;
|
|
10
10
|
}>, {
|
|
11
|
+
multiple: boolean;
|
|
12
|
+
lazy: boolean;
|
|
13
|
+
load: (node?: import("../cascader/common").CascaderStateNode) => Promise<CascaderOption[]> | CascaderOption[];
|
|
11
14
|
options: CascaderOption[];
|
|
12
15
|
rootStyle: string | false | import("vue").CSSProperties | import("vue").StyleValue[] | null;
|
|
13
16
|
rootClass: string;
|
|
14
|
-
modelValue:
|
|
17
|
+
modelValue: CascaderValue;
|
|
15
18
|
title: string;
|
|
16
19
|
visible: boolean;
|
|
17
20
|
valueOnClear: () => any;
|
|
@@ -25,9 +28,11 @@ declare const __VLS_component: import("vue").DefineComponent<CascaderInputProps,
|
|
|
25
28
|
resettable: boolean;
|
|
26
29
|
placeholder: string;
|
|
27
30
|
clearable: boolean;
|
|
31
|
+
internalPrepend: number;
|
|
28
32
|
multiline: boolean;
|
|
29
33
|
arrow: string;
|
|
30
34
|
arrowFamily: string;
|
|
35
|
+
internalAppend: number;
|
|
31
36
|
internalArrow: number;
|
|
32
37
|
inputProps: import("../input/common.js").InputProps;
|
|
33
38
|
fieldKeys: CascaderFieldKeys;
|
|
@@ -35,6 +40,8 @@ declare const __VLS_component: import("vue").DefineComponent<CascaderInputProps,
|
|
|
35
40
|
labelRender: (option: CascaderOption) => string;
|
|
36
41
|
changeOnSelect: boolean;
|
|
37
42
|
allLevels: boolean;
|
|
43
|
+
checkStrictly: boolean;
|
|
44
|
+
maxRows: number;
|
|
38
45
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
39
46
|
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
|
|
40
47
|
export default _default;
|