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.
Files changed (223) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +15 -0
  3. package/components/accordion/accordion.vue +1 -1
  4. package/components/accordion-item/accordion-item.vue +1 -1
  5. package/components/action-sheet/action-sheet.vue +1 -1
  6. package/components/alert/alert.vue +1 -1
  7. package/components/avatar/avatar.vue +1 -1
  8. package/components/avatar-group/avatar-group.vue +1 -1
  9. package/components/back-top/back-top.vue +1 -1
  10. package/components/badge/badge.vue +1 -1
  11. package/components/button/button.vue +1 -1
  12. package/components/calendar/calendar.vue +1 -1
  13. package/components/calendar-input/README.md +1 -3
  14. package/components/calendar-input/calendar-input.d.ts +2 -0
  15. package/components/calendar-input/calendar-input.vue +13 -3
  16. package/components/calendar-input/common.d.ts +152 -0
  17. package/components/calendar-popout/calendar-popout.vue +2 -2
  18. package/components/card/card.vue +1 -1
  19. package/components/cascader/README.md +89 -18
  20. package/components/cascader/cascader.d.ts +6 -6
  21. package/components/cascader/cascader.vue +201 -182
  22. package/components/cascader/common.d.ts +32 -7
  23. package/components/cascader/common.js +39 -23
  24. package/components/cascader/index.d.ts +1 -1
  25. package/components/cascader/index.scss +40 -4
  26. package/components/cascader/useCascaderTabs.d.ts +12 -0
  27. package/components/cascader/useCascaderTabs.js +59 -0
  28. package/components/cascader/useCascaderTree.d.ts +66 -0
  29. package/components/cascader/useCascaderTree.js +194 -0
  30. package/components/cascader/variables.scss +9 -2
  31. package/components/cascader-input/README.md +27 -18
  32. package/components/cascader-input/cascader-input.d.ts +9 -2
  33. package/components/cascader-input/cascader-input.vue +81 -17
  34. package/components/cascader-input/common.d.ts +470 -28
  35. package/components/cascader-popout/README.md +6 -0
  36. package/components/cascader-popout/cascader-popout.d.ts +5 -1
  37. package/components/cascader-popout/cascader-popout.vue +16 -4
  38. package/components/cascader-popout/common.d.ts +169 -17
  39. package/components/check-icon/check-icon.vue +1 -1
  40. package/components/checkbox/checkbox.d.ts +2 -2
  41. package/components/checkbox/checkbox.vue +1 -1
  42. package/components/checkbox-group/checkbox-group.vue +1 -1
  43. package/components/checkbox-input/README.md +1 -3
  44. package/components/checkbox-input/checkbox-input.d.ts +2 -0
  45. package/components/checkbox-input/checkbox-input.vue +13 -3
  46. package/components/checkbox-input/common.d.ts +128 -0
  47. package/components/checkbox-popout/checkbox-popout.vue +2 -2
  48. package/components/col/col.vue +1 -1
  49. package/components/collapse/collapse.vue +1 -1
  50. package/components/config/index.js +4 -1
  51. package/components/cool-icon/cool-icon.vue +1 -1
  52. package/components/count-down/count-down.vue +1 -1
  53. package/components/crop-image/crop-image.vue +1 -1
  54. package/components/crop-image-agent/crop-image-agent.vue +1 -1
  55. package/components/datetime-picker/datetime-picker.vue +1 -1
  56. package/components/datetime-picker-input/README.md +1 -3
  57. package/components/datetime-picker-input/common.d.ts +116 -0
  58. package/components/datetime-picker-input/datetime-picker-input.d.ts +2 -0
  59. package/components/datetime-picker-input/datetime-picker-input.vue +13 -3
  60. package/components/datetime-picker-popout/datetime-picker-popout.vue +2 -2
  61. package/components/datetime-range-picker/datetime-range-picker.vue +1 -1
  62. package/components/datetime-range-picker-input/README.md +1 -3
  63. package/components/datetime-range-picker-input/common.d.ts +120 -0
  64. package/components/datetime-range-picker-input/datetime-range-picker-input.d.ts +2 -0
  65. package/components/datetime-range-picker-input/datetime-range-picker-input.vue +13 -3
  66. package/components/datetime-range-picker-popout/datetime-range-picker-popout.vue +2 -2
  67. package/components/dialog/dialog.vue +2 -2
  68. package/components/dialog-agent/dialog-agent.vue +2 -2
  69. package/components/divider/divider.vue +1 -1
  70. package/components/dnd/dnd.vue +1 -1
  71. package/components/dnd-handle/dnd-handle.vue +1 -1
  72. package/components/dnd-item/dnd-item.vue +1 -1
  73. package/components/dropdown/dropdown.vue +1 -1
  74. package/components/dropdown-item/dropdown-item.vue +7 -2
  75. package/components/empty/empty.vue +1 -1
  76. package/components/fab/fab.vue +1 -1
  77. package/components/fab-item/fab-item.vue +1 -1
  78. package/components/floating-bubble/floating-bubble.vue +1 -1
  79. package/components/floating-panel/floating-panel.vue +1 -1
  80. package/components/form/form.vue +1 -1
  81. package/components/form-item/form-item.vue +1 -1
  82. package/components/form-item-plain/form-item-plain.vue +1 -1
  83. package/components/form-plain/form-plain.vue +1 -1
  84. package/components/grid/grid.vue +1 -1
  85. package/components/grid-item/grid-item.vue +2 -2
  86. package/components/icon/icon.vue +1 -1
  87. package/components/icon/sari.scss +17 -17
  88. package/components/image/image.vue +10 -4
  89. package/components/indexes/indexes.vue +1 -1
  90. package/components/indexes-anchor/indexes-anchor.vue +1 -1
  91. package/components/input/index.scss +2 -0
  92. package/components/input/input.vue +1 -1
  93. package/components/keyboard/keyboard.vue +1 -1
  94. package/components/list/list.vue +1 -1
  95. package/components/list-item/list-item.vue +1 -1
  96. package/components/load-more/load-more.vue +1 -1
  97. package/components/loading/loading.vue +1 -1
  98. package/components/locale/lang/ar-SA.d.ts +2 -0
  99. package/components/locale/lang/ar-SA.js +2 -0
  100. package/components/locale/lang/en-US.d.ts +2 -0
  101. package/components/locale/lang/en-US.js +2 -0
  102. package/components/locale/lang/vi-VN.d.ts +2 -0
  103. package/components/locale/lang/vi-VN.js +2 -0
  104. package/components/locale/lang/zh-CN.d.ts +2 -0
  105. package/components/locale/lang/zh-CN.js +2 -0
  106. package/components/marquee/marquee.vue +1 -1
  107. package/components/menu/menu.vue +1 -1
  108. package/components/navbar/navbar.vue +2 -2
  109. package/components/navbar-item/navbar-item.vue +1 -1
  110. package/components/navbar-pit/navbar-pit.vue +1 -1
  111. package/components/notice-bar/notice-bar.vue +1 -1
  112. package/components/notify/notify.vue +2 -1
  113. package/components/notify-agent/notify-agent.vue +1 -1
  114. package/components/overlay/overlay.vue +1 -1
  115. package/components/pagination/pagination.vue +1 -1
  116. package/components/password-input/password-input.vue +1 -1
  117. package/components/picker/picker.vue +1 -1
  118. package/components/picker-input/README.md +1 -7
  119. package/components/picker-input/common.d.ts +102 -0
  120. package/components/picker-input/picker-input.d.ts +2 -0
  121. package/components/picker-input/picker-input.vue +13 -4
  122. package/components/picker-item/picker-item.vue +1 -1
  123. package/components/picker-popout/picker-popout.vue +2 -2
  124. package/components/popout/popout.vue +1 -1
  125. package/components/popout-input/README.md +5 -3
  126. package/components/popout-input/common.d.ts +63 -1
  127. package/components/popout-input/index.scss +0 -1
  128. package/components/popout-input/popout-input.d.ts +2 -0
  129. package/components/popout-input/popout-input.vue +5 -3
  130. package/components/popout-input/variables.scss +0 -1
  131. package/components/popover/popover.vue +3 -2
  132. package/components/popover-reference/popover-reference.vue +1 -1
  133. package/components/popup/README.md +1 -0
  134. package/components/popup/common.d.ts +28 -0
  135. package/components/popup/index.scss +4 -2
  136. package/components/popup/popup.d.ts +1 -0
  137. package/components/popup/popup.vue +82 -16
  138. package/components/popup/variables.scss +6 -0
  139. package/components/progress-bar/progress-bar.vue +1 -1
  140. package/components/progress-circle/progress-circle.vue +1 -1
  141. package/components/pull-down-refresh/pull-down-refresh.vue +1 -1
  142. package/components/qrcode/qrcode.vue +6 -5
  143. package/components/radio/radio.vue +1 -1
  144. package/components/radio-group/radio-group.vue +1 -1
  145. package/components/radio-input/README.md +1 -3
  146. package/components/radio-input/common.d.ts +122 -0
  147. package/components/radio-input/radio-input.d.ts +2 -0
  148. package/components/radio-input/radio-input.vue +13 -3
  149. package/components/radio-popout/radio-popout.vue +2 -2
  150. package/components/rate/rate.vue +1 -1
  151. package/components/read-more/read-more.vue +1 -1
  152. package/components/resize-sensor/index.scss +7 -0
  153. package/components/resize-sensor/resize-sensor.vue +10 -3
  154. package/components/result/result.vue +1 -1
  155. package/components/row/row.vue +1 -1
  156. package/components/scroll-list/scroll-list.vue +1 -1
  157. package/components/scroll-spy/scroll-spy.vue +1 -1
  158. package/components/scroll-spy-anchor/scroll-spy-anchor.vue +1 -1
  159. package/components/search/search.vue +1 -1
  160. package/components/segmented/segmented.vue +1 -1
  161. package/components/segmented-item/segmented-item.vue +1 -1
  162. package/components/share-sheet/share-sheet.vue +2 -1
  163. package/components/sidebar/sidebar.vue +1 -1
  164. package/components/sidebar-item/sidebar-item.vue +1 -1
  165. package/components/signature/signature.vue +1 -1
  166. package/components/skeleton/skeleton.vue +1 -1
  167. package/components/skeleton-avatar/skeleton-avatar.vue +1 -1
  168. package/components/skeleton-block/skeleton-block.vue +1 -1
  169. package/components/skeleton-paragraph/skeleton-paragraph.vue +1 -1
  170. package/components/skeleton-title/skeleton-title.vue +1 -1
  171. package/components/slider/slider.vue +1 -1
  172. package/components/space/space.vue +1 -1
  173. package/components/status-bar/status-bar.vue +1 -1
  174. package/components/step/step.vue +1 -1
  175. package/components/stepper/stepper.vue +1 -1
  176. package/components/steps/steps.vue +1 -1
  177. package/components/sticky/sticky.vue +1 -1
  178. package/components/sticky-box/sticky-box.vue +1 -1
  179. package/components/swipe-action/swipe-action.vue +1 -1
  180. package/components/swiper-dot/swiper-dot.vue +1 -1
  181. package/components/switch/switch.vue +1 -1
  182. package/components/tab/tab.vue +1 -1
  183. package/components/tabbar/tabbar.vue +1 -1
  184. package/components/tabbar-item/tabbar-item.vue +1 -1
  185. package/components/tabbar-pit/tabbar-pit.vue +1 -1
  186. package/components/table/table.vue +1 -1
  187. package/components/table-cell/table-cell.vue +1 -1
  188. package/components/table-fixation/table-fixation.vue +1 -1
  189. package/components/table-row/table-row.vue +1 -1
  190. package/components/tabs/tabs.vue +1 -1
  191. package/components/tag/tag.vue +1 -1
  192. package/components/timeline/timeline.vue +1 -1
  193. package/components/timeline-item/timeline-item.vue +1 -1
  194. package/components/toast/toast.vue +2 -1
  195. package/components/toast-agent/toast-agent.vue +1 -1
  196. package/components/tree/README.md +0 -2
  197. package/components/tree/tree.d.ts +1 -1
  198. package/components/tree/tree.vue +36 -81
  199. package/components/tree-node/tree-node.vue +8 -4
  200. package/components/upload/upload.vue +1 -1
  201. package/components/upload-preview/upload-preview.vue +1 -1
  202. package/components/waterfall/waterfall.vue +1 -1
  203. package/components/waterfall-item/waterfall-item.vue +1 -1
  204. package/components/waterfall-load/waterfall-load.vue +1 -1
  205. package/components/watermark/watermark.vue +6 -8
  206. package/package.json +2 -1
  207. package/use/index.d.ts +1 -0
  208. package/use/index.js +1 -0
  209. package/use/useLockScroll.d.ts +8 -0
  210. package/use/useLockScroll.js +88 -0
  211. package/utils/file.d.ts +6 -0
  212. package/utils/file.js +33 -11
  213. package/utils/index.d.ts +2 -0
  214. package/utils/index.js +2 -0
  215. package/utils/log.d.ts +1 -0
  216. package/utils/log.js +4 -0
  217. package/utils/router.js +2 -1
  218. package/utils/system.d.ts +2 -0
  219. package/utils/system.js +6 -1
  220. package/utils/tree.d.ts +18 -0
  221. package/utils/tree.js +94 -0
  222. package/components/tree/utils.d.ts +0 -5
  223. 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(loading-wrapper) {
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: 2;
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-loading-wrapper-duration);
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-loading-wrapper-duration: var(--sar-duration);
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 | 弹出式输入框根元素类名 | string | - |
37
- | root-style | 弹出式输入框根元素样式 | StyleValue | - |
38
- | disabled | 禁用状态 | boolean | false |
39
- | readonly | 只读状态 | boolean | false |
40
- | loading | 加载状态 | boolean | false |
41
- | clearable | 是否显示清空按钮 | boolean | false |
42
- | placeholder | 输入框占位符内容 | string | - |
43
- | value-on-clear <sup>1.19.2+</sup> | 设置点击清除按钮后的值 | () => any | () => undefined |
44
- | arrow <sup>1.22+</sup> | 自定义箭头图标名 | string | 'caret-right' |
45
- | arrow-family <sup>1.22+</sup> | 自定义箭头图标字体 | string | 'sari' |
46
- | input-props <sup>1.22+</sup> | 自定义输入框组件属性 | InputProps | - |
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: string | number | (string | number)[];
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;