@zkwq/business 0.0.1

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 (231) hide show
  1. package/dist/index.css +1 -0
  2. package/dist/index.js +21861 -0
  3. package/dist/index.umd.cjs +46 -0
  4. package/package.json +27 -0
  5. package/src/components/base/ui/alert/Alert.vue +94 -0
  6. package/src/components/base/ui/autocomplete/autocomplete-suggestions.vue +77 -0
  7. package/src/components/base/ui/autocomplete/autocomplete.vue +305 -0
  8. package/src/components/base/ui/backtop/main.vue +112 -0
  9. package/src/components/base/ui/button/Button.vue +84 -0
  10. package/src/components/base/ui/button/ButtonGroup.vue +10 -0
  11. package/src/components/base/ui/carousel/Carousel.vue +304 -0
  12. package/src/components/base/ui/carousel/CarouselItem.vue +137 -0
  13. package/src/components/base/ui/cascader/cascader.vue +650 -0
  14. package/src/components/base/ui/cascader-panel/cascader-menu.vue +138 -0
  15. package/src/components/base/ui/cascader-panel/cascader-node.vue +246 -0
  16. package/src/components/base/ui/cascader-panel/cascader-panel.vue +382 -0
  17. package/src/components/base/ui/cascader-panel/node.js +166 -0
  18. package/src/components/base/ui/cascader-panel/store.js +62 -0
  19. package/src/components/base/ui/checkbox/checkbox-button.vue +199 -0
  20. package/src/components/base/ui/checkbox/checkbox-group.vue +48 -0
  21. package/src/components/base/ui/checkbox/checkbox.vue +222 -0
  22. package/src/components/base/ui/col/col.js +71 -0
  23. package/src/components/base/ui/collapse/collapse-item.vue +180 -0
  24. package/src/components/base/ui/collapse/collapse.vue +73 -0
  25. package/src/components/base/ui/color-picker/color.js +317 -0
  26. package/src/components/base/ui/color-picker/components/alpha-slider.vue +132 -0
  27. package/src/components/base/ui/color-picker/components/hue-slider.vue +123 -0
  28. package/src/components/base/ui/color-picker/components/picker-dropdown.vue +119 -0
  29. package/src/components/base/ui/color-picker/components/predefine.vue +61 -0
  30. package/src/components/base/ui/color-picker/components/sv-panel.vue +100 -0
  31. package/src/components/base/ui/color-picker/draggable.js +36 -0
  32. package/src/components/base/ui/color-picker/index.js +2 -0
  33. package/src/components/base/ui/color-picker/main.vue +188 -0
  34. package/src/components/base/ui/date-picker/basic/date-table.vue +441 -0
  35. package/src/components/base/ui/date-picker/basic/month-table.vue +254 -0
  36. package/src/components/base/ui/date-picker/basic/time-spinner.vue +304 -0
  37. package/src/components/base/ui/date-picker/basic/year-table.vue +101 -0
  38. package/src/components/base/ui/date-picker/panel/date-range.vue +680 -0
  39. package/src/components/base/ui/date-picker/panel/date.vue +597 -0
  40. package/src/components/base/ui/date-picker/panel/month-range.vue +289 -0
  41. package/src/components/base/ui/date-picker/panel/time-range.vue +248 -0
  42. package/src/components/base/ui/date-picker/panel/time-select.vue +178 -0
  43. package/src/components/base/ui/date-picker/panel/time.vue +186 -0
  44. package/src/components/base/ui/date-picker/picker/date-picker.js +43 -0
  45. package/src/components/base/ui/date-picker/picker/time-picker.js +39 -0
  46. package/src/components/base/ui/date-picker/picker/time-select.js +21 -0
  47. package/src/components/base/ui/date-picker/picker.vue +942 -0
  48. package/src/components/base/ui/dialog/Index.vue +212 -0
  49. package/src/components/base/ui/directive/repeat-click.js +24 -0
  50. package/src/components/base/ui/directive/ripple.js +303 -0
  51. package/src/components/base/ui/divider/Divider.vue +37 -0
  52. package/src/components/base/ui/drawer/Drawer.vue +202 -0
  53. package/src/components/base/ui/dropdown/dropdown-item.vue +39 -0
  54. package/src/components/base/ui/dropdown/dropdown-menu.vue +63 -0
  55. package/src/components/base/ui/dropdown/dropdown.vue +308 -0
  56. package/src/components/base/ui/form/Form.vue +167 -0
  57. package/src/components/base/ui/form/FormItem.vue +334 -0
  58. package/src/components/base/ui/form/LabelWrap.vue +69 -0
  59. package/src/components/base/ui/icon/icon.vue +13 -0
  60. package/src/components/base/ui/image/image-viewer.vue +302 -0
  61. package/src/components/base/ui/image/main.vue +248 -0
  62. package/src/components/base/ui/index.js +189 -0
  63. package/src/components/base/ui/input/Input.vue +438 -0
  64. package/src/components/base/ui/input/calcTextareaHeight.js +104 -0
  65. package/src/components/base/ui/input-number/input-number.vue +285 -0
  66. package/src/components/base/ui/locale/format.js +32 -0
  67. package/src/components/base/ui/locale/index.js +48 -0
  68. package/src/components/base/ui/locale/lang/zh-CN.js +120 -0
  69. package/src/components/base/ui/menu/menu-item-group.vue +45 -0
  70. package/src/components/base/ui/menu/menu-item.vue +112 -0
  71. package/src/components/base/ui/menu/menu-mixin.js +44 -0
  72. package/src/components/base/ui/menu/menu.vue +312 -0
  73. package/src/components/base/ui/menu/submenu.vue +408 -0
  74. package/src/components/base/ui/message/index.js +2 -0
  75. package/src/components/base/ui/message/main.js +87 -0
  76. package/src/components/base/ui/message/main.vue +110 -0
  77. package/src/components/base/ui/message-box/main.js +216 -0
  78. package/src/components/base/ui/message-box/main.vue +323 -0
  79. package/src/components/base/ui/mixin/emitter.js +31 -0
  80. package/src/components/base/ui/mixin/focus.js +9 -0
  81. package/src/components/base/ui/mixin/locale.js +9 -0
  82. package/src/components/base/ui/mixin/migrating.js +33 -0
  83. package/src/components/base/ui/pagination/pager.vue +163 -0
  84. package/src/components/base/ui/pagination/pagination.jsx +391 -0
  85. package/src/components/base/ui/popover/directive.js +20 -0
  86. package/src/components/base/ui/popover/index.js +14 -0
  87. package/src/components/base/ui/popover/main.vue +236 -0
  88. package/src/components/base/ui/progress/Progress.vue +227 -0
  89. package/src/components/base/ui/radio/radio-button.vue +114 -0
  90. package/src/components/base/ui/radio/radio-group.vue +111 -0
  91. package/src/components/base/ui/radio/radio.vue +134 -0
  92. package/src/components/base/ui/row/row.js +47 -0
  93. package/src/components/base/ui/scrollbar/bar.jsx +91 -0
  94. package/src/components/base/ui/scrollbar/index.jsx +203 -0
  95. package/src/components/base/ui/scrollbar/util.js +32 -0
  96. package/src/components/base/ui/select/Option.vue +168 -0
  97. package/src/components/base/ui/select/OptionGroup.vue +60 -0
  98. package/src/components/base/ui/select/Select.vue +920 -0
  99. package/src/components/base/ui/select/SelectDropdown.vue +74 -0
  100. package/src/components/base/ui/select/navigation-mixin.js +54 -0
  101. package/src/components/base/ui/skeleton/index.js +8 -0
  102. package/src/components/base/ui/skeleton/src/img-placeholder.vue +16 -0
  103. package/src/components/base/ui/skeleton/src/index.vue +80 -0
  104. package/src/components/base/ui/skeleton/src/item.vue +22 -0
  105. package/src/components/base/ui/skeleton-item/index.js +8 -0
  106. package/src/components/base/ui/slider/button.vue +238 -0
  107. package/src/components/base/ui/slider/main.vue +427 -0
  108. package/src/components/base/ui/slider/marker.js +18 -0
  109. package/src/components/base/ui/style/alert.scss +147 -0
  110. package/src/components/base/ui/style/animations.scss +65 -0
  111. package/src/components/base/ui/style/autocomplete.scss +81 -0
  112. package/src/components/base/ui/style/backtop.scss +20 -0
  113. package/src/components/base/ui/style/button-group.scss +0 -0
  114. package/src/components/base/ui/style/button.scss +380 -0
  115. package/src/components/base/ui/style/carousel-item.scss +50 -0
  116. package/src/components/base/ui/style/carousel.scss +161 -0
  117. package/src/components/base/ui/style/cascader-panel.scss +120 -0
  118. package/src/components/base/ui/style/cascader.scss +185 -0
  119. package/src/components/base/ui/style/checkbox-button.scss +0 -0
  120. package/src/components/base/ui/style/checkbox-group.scss +0 -0
  121. package/src/components/base/ui/style/checkbox.scss +360 -0
  122. package/src/components/base/ui/style/col.scss +156 -0
  123. package/src/components/base/ui/style/collapse-item.scss +0 -0
  124. package/src/components/base/ui/style/collapse.scss +114 -0
  125. package/src/components/base/ui/style/color-picker.scss +387 -0
  126. package/src/components/base/ui/style/config.scss +4 -0
  127. package/src/components/base/ui/style/date-picker/date-picker.scss +97 -0
  128. package/src/components/base/ui/style/date-picker/date-range-picker.scss +101 -0
  129. package/src/components/base/ui/style/date-picker/date-table.scss +151 -0
  130. package/src/components/base/ui/style/date-picker/month-table.scss +82 -0
  131. package/src/components/base/ui/style/date-picker/picker-panel.scss +117 -0
  132. package/src/components/base/ui/style/date-picker/picker.scss +197 -0
  133. package/src/components/base/ui/style/date-picker/time-picker.scss +85 -0
  134. package/src/components/base/ui/style/date-picker/time-range-picker.scss +31 -0
  135. package/src/components/base/ui/style/date-picker/time-spinner.scss +110 -0
  136. package/src/components/base/ui/style/date-picker/year-table.scss +51 -0
  137. package/src/components/base/ui/style/date-picker.scss +12 -0
  138. package/src/components/base/ui/style/dialog.scss +123 -0
  139. package/src/components/base/ui/style/divider.scss +47 -0
  140. package/src/components/base/ui/style/drawer.scss +218 -0
  141. package/src/components/base/ui/style/dropdown-item.scss +0 -0
  142. package/src/components/base/ui/style/dropdown-menu.scss +0 -0
  143. package/src/components/base/ui/style/dropdown.scss +185 -0
  144. package/src/components/base/ui/style/form-item.scss +0 -0
  145. package/src/components/base/ui/style/form.scss +203 -0
  146. package/src/components/base/ui/style/function.scss +43 -0
  147. package/src/components/base/ui/style/icon.scss +1167 -0
  148. package/src/components/base/ui/style/image.scss +184 -0
  149. package/src/components/base/ui/style/index.scss +57 -0
  150. package/src/components/base/ui/style/input-number.scss +187 -0
  151. package/src/components/base/ui/style/input.scss +477 -0
  152. package/src/components/base/ui/style/menu-item-group.scss +0 -0
  153. package/src/components/base/ui/style/menu-item.scss +0 -0
  154. package/src/components/base/ui/style/menu.scss +294 -0
  155. package/src/components/base/ui/style/message-box.scss +231 -0
  156. package/src/components/base/ui/style/message.scss +120 -0
  157. package/src/components/base/ui/style/mixins.scss +196 -0
  158. package/src/components/base/ui/style/option-group.scss +42 -0
  159. package/src/components/base/ui/style/option.scss +36 -0
  160. package/src/components/base/ui/style/pagination.scss +295 -0
  161. package/src/components/base/ui/style/popover.scss +40 -0
  162. package/src/components/base/ui/style/popper.scss +102 -0
  163. package/src/components/base/ui/style/popup.scss +42 -0
  164. package/src/components/base/ui/style/progress.scss +141 -0
  165. package/src/components/base/ui/style/radio-button.scss +113 -0
  166. package/src/components/base/ui/style/radio-group.scss +9 -0
  167. package/src/components/base/ui/style/radio.scss +203 -0
  168. package/src/components/base/ui/style/ripple.scss +35 -0
  169. package/src/components/base/ui/style/row.scss +39 -0
  170. package/src/components/base/ui/style/scrollbar.scss +75 -0
  171. package/src/components/base/ui/style/select-dropdown.scss +59 -0
  172. package/src/components/base/ui/style/select.scss +154 -0
  173. package/src/components/base/ui/style/skeleton-item.scss +84 -0
  174. package/src/components/base/ui/style/skeleton.scss +40 -0
  175. package/src/components/base/ui/style/slider.scss +250 -0
  176. package/src/components/base/ui/style/switch.scss +116 -0
  177. package/src/components/base/ui/style/tabs.scss +602 -0
  178. package/src/components/base/ui/style/tag.scss +174 -0
  179. package/src/components/base/ui/style/tooltip.scss +146 -0
  180. package/src/components/base/ui/style/transition.scss +138 -0
  181. package/src/components/base/ui/style/upload.scss +603 -0
  182. package/src/components/base/ui/style/utils.scss +39 -0
  183. package/src/components/base/ui/style/var.scss +1007 -0
  184. package/src/components/base/ui/switch/index.vue +174 -0
  185. package/src/components/base/ui/tabs/tab-bar.vue +57 -0
  186. package/src/components/base/ui/tabs/tab-nav.vue +294 -0
  187. package/src/components/base/ui/tabs/tab-pane.vue +56 -0
  188. package/src/components/base/ui/tabs/tabs.vue +191 -0
  189. package/src/components/base/ui/tag/Tag.vue +60 -0
  190. package/src/components/base/ui/tooltip/tooltip.jsx +234 -0
  191. package/src/components/base/ui/upload/Index.vue +340 -0
  192. package/src/components/base/ui/upload/Upload.vue +216 -0
  193. package/src/components/base/ui/upload/UploadDragger.vue +70 -0
  194. package/src/components/base/ui/upload/UploadList.vue +100 -0
  195. package/src/components/base/ui/upload/ajax.js +85 -0
  196. package/src/components/base/ui/util/aria-dialog.js +90 -0
  197. package/src/components/base/ui/util/aria-utils.js +122 -0
  198. package/src/components/base/ui/util/clickoutside.js +76 -0
  199. package/src/components/base/ui/util/date-util.js +292 -0
  200. package/src/components/base/ui/util/date.js +370 -0
  201. package/src/components/base/ui/util/debounce.js +21 -0
  202. package/src/components/base/ui/util/deepmerge.js +100 -0
  203. package/src/components/base/ui/util/dom.js +215 -0
  204. package/src/components/base/ui/util/index.js +262 -0
  205. package/src/components/base/ui/util/menu/aria-menubar.js +14 -0
  206. package/src/components/base/ui/util/menu/aria-menuitem.js +49 -0
  207. package/src/components/base/ui/util/menu/aria-submenu.js +59 -0
  208. package/src/components/base/ui/util/merge.js +14 -0
  209. package/src/components/base/ui/util/popper.js +1235 -0
  210. package/src/components/base/ui/util/popup/index.js +218 -0
  211. package/src/components/base/ui/util/popup/popup-manager.js +194 -0
  212. package/src/components/base/ui/util/resize-events.js +32 -0
  213. package/src/components/base/ui/util/scroll-into-view.js +27 -0
  214. package/src/components/base/ui/util/scrollbar-width.js +29 -0
  215. package/src/components/base/ui/util/shared.js +7 -0
  216. package/src/components/base/ui/util/throttle.js +91 -0
  217. package/src/components/base/ui/util/types.js +24 -0
  218. package/src/components/base/ui/util/vdom.js +5 -0
  219. package/src/components/base/ui/util/vue-popper.js +188 -0
  220. package/src/components/normal/AggsItemH.vue +139 -0
  221. package/src/index.js +10 -0
  222. package/src/static/base-icons.ttf +0 -0
  223. package/src/static/base-icons.woff +0 -0
  224. package/src/static/label_bg.png +0 -0
  225. package/src/static/term-label-bg.png +0 -0
  226. package/src/style/app-article.scss +698 -0
  227. package/src/style/app-comment.scss +259 -0
  228. package/src/style/app-recommend.scss +48 -0
  229. package/src/style/app-richtext.scss +176 -0
  230. package/src/style/index.scss +523 -0
  231. package/vite.config.js +38 -0
@@ -0,0 +1,382 @@
1
+ <template>
2
+ <div
3
+ :class="[
4
+ 'base-cascader-panel',
5
+ border && 'is-bordered'
6
+ ]"
7
+ @keydown="handleKeyDown">
8
+ <cascader-menu
9
+ ref="menu"
10
+ v-for="(menu, index) in menus"
11
+ :index="index"
12
+ :key="index"
13
+ :nodes="menu"></cascader-menu>
14
+ </div>
15
+ </template>
16
+
17
+ <script>
18
+ import CascaderMenu from './cascader-menu';
19
+ import Store from './store';
20
+ import merge from '../util/merge';
21
+ import AriaUtils from '../util/aria-utils';
22
+ import scrollIntoView from '../util/scroll-into-view';
23
+ import {
24
+ noop,
25
+ coerceTruthyValueToArray,
26
+ isEqual,
27
+ isEmpty,
28
+ valueEquals
29
+ } from '../util/index';
30
+
31
+ const { keys: KeyCode } = AriaUtils;
32
+ const DefaultProps = {
33
+ expandTrigger: 'click', // or hover
34
+ multiple: false,
35
+ checkStrictly: false, // whether all nodes can be selected
36
+ emitPath: true, // wether to emit an array of all levels value in which node is located
37
+ lazy: false,
38
+ lazyLoad: noop,
39
+ value: 'value',
40
+ label: 'label',
41
+ children: 'children',
42
+ leaf: 'leaf',
43
+ disabled: 'disabled',
44
+ hoverThreshold: 500
45
+ };
46
+
47
+ const isLeaf = el => !el.getAttribute('aria-owns');
48
+
49
+ const getSibling = (el, distance) => {
50
+ const { parentNode } = el;
51
+ if (parentNode) {
52
+ const siblings = parentNode.querySelectorAll('.base-cascader-node[tabindex="-1"]');
53
+ const index = Array.prototype.indexOf.call(siblings, el);
54
+ return siblings[index + distance] || null;
55
+ }
56
+ return null;
57
+ };
58
+
59
+ const getMenuIndex = (el, distance) => {
60
+ if (!el) return;
61
+ const pieces = el.id.split('-');
62
+ return Number(pieces[pieces.length - 2]);
63
+ };
64
+
65
+ const focusNode = el => {
66
+ if (!el) return;
67
+ el.focus();
68
+ !isLeaf(el) && el.click();
69
+ };
70
+
71
+ const checkNode = el => {
72
+ if (!el) return;
73
+
74
+ const input = el.querySelector('input');
75
+ if (input) {
76
+ input.click();
77
+ } else if (isLeaf(el)) {
78
+ el.click();
79
+ }
80
+ };
81
+
82
+ export default {
83
+ name: 'BaseCascaderPanel',
84
+
85
+ components: {
86
+ CascaderMenu
87
+ },
88
+
89
+ props: {
90
+ value: {},
91
+ options: Array,
92
+ props: Object,
93
+ border: {
94
+ type: Boolean,
95
+ default: true
96
+ },
97
+ renderLabel: Function
98
+ },
99
+
100
+ provide() {
101
+ return {
102
+ panel: this
103
+ };
104
+ },
105
+
106
+ data() {
107
+ return {
108
+ checkedValue: null,
109
+ checkedNodePaths: [],
110
+ store: [],
111
+ menus: [],
112
+ activePath: [],
113
+ loadCount: 0
114
+ };
115
+ },
116
+
117
+ computed: {
118
+ config() {
119
+ return merge({ ...DefaultProps }, this.props || {});
120
+ },
121
+ multiple() {
122
+ return this.config.multiple;
123
+ },
124
+ checkStrictly() {
125
+ return this.config.checkStrictly;
126
+ },
127
+ leafOnly() {
128
+ return !this.checkStrictly;
129
+ },
130
+ isHoverMenu() {
131
+ return this.config.expandTrigger === 'hover';
132
+ },
133
+ renderLabelFn() {
134
+ return this.renderLabel || this.$scopedSlots.default;
135
+ }
136
+ },
137
+
138
+ watch: {
139
+ options: {
140
+ handler: function() {
141
+ this.initStore();
142
+ },
143
+ immediate: true,
144
+ deep: true
145
+ },
146
+ value() {
147
+ this.syncCheckedValue();
148
+ this.checkStrictly && this.calculateCheckedNodePaths();
149
+ },
150
+ checkedValue(val) {
151
+ if (!isEqual(val, this.value)) {
152
+ this.checkStrictly && this.calculateCheckedNodePaths();
153
+ this.$emit('input', val);
154
+ this.$emit('change', val);
155
+ }
156
+ }
157
+ },
158
+
159
+ mounted() {
160
+ if (!isEmpty(this.value)) {
161
+ this.syncCheckedValue();
162
+ }
163
+ },
164
+
165
+ methods: {
166
+ initStore() {
167
+ const { config, options } = this;
168
+ if (config.lazy && isEmpty(options)) {
169
+ this.lazyLoad();
170
+ } else {
171
+ this.store = new Store(options, config);
172
+ this.menus = [this.store.getNodes()];
173
+ this.syncMenuState();
174
+ }
175
+ },
176
+ syncCheckedValue() {
177
+ const { value, checkedValue } = this;
178
+ if (!isEqual(value, checkedValue)) {
179
+ this.checkedValue = value;
180
+ this.syncMenuState();
181
+ }
182
+ },
183
+ syncMenuState() {
184
+ const { multiple, checkStrictly } = this;
185
+ this.syncActivePath();
186
+ multiple && this.syncMultiCheckState();
187
+ checkStrictly && this.calculateCheckedNodePaths();
188
+ this.$nextTick(this.scrollIntoView);
189
+ },
190
+ syncMultiCheckState() {
191
+ const nodes = this.getFlattedNodes(this.leafOnly);
192
+
193
+ nodes.forEach(node => {
194
+ node.syncCheckState(this.checkedValue);
195
+ });
196
+ },
197
+ syncActivePath() {
198
+ const { store, multiple, activePath, checkedValue } = this;
199
+
200
+ if (!isEmpty(activePath)) {
201
+ const nodes = activePath.map(node => this.getNodeByValue(node.getValue()));
202
+ this.expandNodes(nodes);
203
+ } else if (!isEmpty(checkedValue)) {
204
+ const value = multiple ? checkedValue[0] : checkedValue;
205
+ const checkedNode = this.getNodeByValue(value) || {};
206
+ const nodes = (checkedNode.pathNodes || []).slice(0, -1);
207
+ this.expandNodes(nodes);
208
+ } else {
209
+ this.activePath = [];
210
+ this.menus = [store.getNodes()];
211
+ }
212
+ },
213
+ expandNodes(nodes) {
214
+ nodes.forEach(node => this.handleExpand(node, true /* silent */));
215
+ },
216
+ calculateCheckedNodePaths() {
217
+ const { checkedValue, multiple } = this;
218
+ const checkedValues = multiple
219
+ ? coerceTruthyValueToArray(checkedValue)
220
+ : [ checkedValue ];
221
+ this.checkedNodePaths = checkedValues.map(v => {
222
+ const checkedNode = this.getNodeByValue(v);
223
+ return checkedNode ? checkedNode.pathNodes : [];
224
+ });
225
+ },
226
+ handleKeyDown(e) {
227
+ const { target, keyCode } = e;
228
+
229
+ switch (keyCode) {
230
+ case KeyCode.up:
231
+ const prev = getSibling(target, -1);
232
+ focusNode(prev);
233
+ break;
234
+ case KeyCode.down:
235
+ const next = getSibling(target, 1);
236
+ focusNode(next);
237
+ break;
238
+ case KeyCode.left:
239
+ const preMenu = this.$refs.menu[getMenuIndex(target) - 1];
240
+ if (preMenu) {
241
+ const expandedNode = preMenu.$el.querySelector('.base-cascader-node[aria-expanded="true"]');
242
+ focusNode(expandedNode);
243
+ }
244
+ break;
245
+ case KeyCode.right:
246
+ const nextMenu = this.$refs.menu[getMenuIndex(target) + 1];
247
+ if (nextMenu) {
248
+ const firstNode = nextMenu.$el.querySelector('.base-cascader-node[tabindex="-1"]');
249
+ focusNode(firstNode);
250
+ }
251
+ break;
252
+ case KeyCode.enter:
253
+ checkNode(target);
254
+ break;
255
+ case KeyCode.esc:
256
+ case KeyCode.tab:
257
+ this.$emit('close');
258
+ break;
259
+ default:
260
+ return;
261
+ }
262
+ },
263
+ handleExpand(node, silent) {
264
+ const { activePath } = this;
265
+ const { level } = node;
266
+ const path = activePath.slice(0, level - 1);
267
+ const menus = this.menus.slice(0, level);
268
+
269
+ if (!node.isLeaf) {
270
+ path.push(node);
271
+ menus.push(node.children);
272
+ }
273
+
274
+ this.activePath = path;
275
+ this.menus = menus;
276
+
277
+ if (!silent) {
278
+ const pathValues = path.map(node => node.getValue());
279
+ const activePathValues = activePath.map(node => node.getValue());
280
+ if (!valueEquals(pathValues, activePathValues)) {
281
+ this.$emit('active-item-change', pathValues); // Deprecated
282
+ this.$emit('expand-change', pathValues);
283
+ }
284
+ }
285
+ },
286
+ handleCheckChange(value) {
287
+ this.checkedValue = value;
288
+ },
289
+ lazyLoad(node, onFullfiled) {
290
+ const { config } = this;
291
+ if (!node) {
292
+ node = node || { root: true, level: 0 };
293
+ this.store = new Store([], config);
294
+ this.menus = [this.store.getNodes()];
295
+ }
296
+ node.loading = true;
297
+ const resolve = dataList => {
298
+ const parent = node.root ? null : node;
299
+ dataList && dataList.length && this.store.appendNodes(dataList, parent);
300
+ node.loading = false;
301
+ node.loaded = true;
302
+
303
+ // dispose default value on lazy load mode
304
+ if (Array.isArray(this.checkedValue)) {
305
+ const nodeValue = this.checkedValue[this.loadCount++];
306
+ const valueKey = this.config.value;
307
+ const leafKey = this.config.leaf;
308
+
309
+ if (Array.isArray(dataList) && dataList.filter(item => item[valueKey] === nodeValue).length > 0) {
310
+ const checkedNode = this.store.getNodeByValue(nodeValue);
311
+
312
+ if (!checkedNode.data[leafKey]) {
313
+ this.lazyLoad(checkedNode, () => {
314
+ this.handleExpand(checkedNode);
315
+ });
316
+ }
317
+
318
+ if (this.loadCount === this.checkedValue.length) {
319
+ this.$parent.computePresentText();
320
+ }
321
+ }
322
+ }
323
+
324
+ onFullfiled && onFullfiled(dataList);
325
+ };
326
+ config.lazyLoad(node, resolve);
327
+ },
328
+
329
+ /**
330
+ * public methods
331
+ */
332
+ calculateMultiCheckedValue() {
333
+ this.checkedValue = this.getCheckedNodes(this.leafOnly)
334
+ .map(node => node.getValueByOption());
335
+ },
336
+ scrollIntoView() {
337
+ if (this.$isServer) return;
338
+
339
+ const menus = this.$refs.menu || [];
340
+ menus.forEach(menu => {
341
+ const menuElement = menu.$el;
342
+ if (menuElement) {
343
+ const container = menuElement.querySelector('.base-scrollbar__wrap');
344
+ const activeNode = menuElement.querySelector('.base-cascader-node.is-active') ||
345
+ menuElement.querySelector('.base-cascader-node.in-active-path');
346
+ scrollIntoView(container, activeNode);
347
+ }
348
+ });
349
+ },
350
+ getNodeByValue(val) {
351
+ return this.store.getNodeByValue(val);
352
+ },
353
+ getFlattedNodes(leafOnly) {
354
+ const cached = !this.config.lazy;
355
+ return this.store.getFlattedNodes(leafOnly, cached);
356
+ },
357
+ getCheckedNodes(leafOnly) {
358
+ const { checkedValue, multiple } = this;
359
+ if (multiple) {
360
+ const nodes = this.getFlattedNodes(leafOnly);
361
+ return nodes.filter(node => node.checked);
362
+ } else {
363
+ return isEmpty(checkedValue)
364
+ ? []
365
+ : [this.getNodeByValue(checkedValue)];
366
+ }
367
+ },
368
+ clearCheckedNodes() {
369
+ const { config, leafOnly } = this;
370
+ const { multiple, emitPath } = config;
371
+ if (multiple) {
372
+ this.getCheckedNodes(leafOnly)
373
+ .filter(node => !node.isDisabled)
374
+ .forEach(node => node.doCheck(false));
375
+ this.calculateMultiCheckedValue();
376
+ } else {
377
+ this.checkedValue = emitPath ? [] : null;
378
+ }
379
+ }
380
+ }
381
+ };
382
+ </script>
@@ -0,0 +1,166 @@
1
+ import { isEqual, capitalize } from '../util/index';
2
+ import { isDef } from '../util/shared';
3
+
4
+ let uid = 0;
5
+
6
+ export default class Node {
7
+
8
+ constructor(data, config, parentNode) {
9
+ this.data = data;
10
+ this.config = config;
11
+ this.parent = parentNode || null;
12
+ this.level = !this.parent ? 1 : this.parent.level + 1;
13
+ this.uid = uid++;
14
+
15
+ this.initState();
16
+ this.initChildren();
17
+ }
18
+
19
+ initState() {
20
+ const { value: valueKey, label: labelKey } = this.config;
21
+
22
+ this.value = this.data[valueKey];
23
+ this.label = this.data[labelKey];
24
+ this.pathNodes = this.calculatePathNodes();
25
+ this.path = this.pathNodes.map(node => node.value);
26
+ this.pathLabels = this.pathNodes.map(node => node.label);
27
+
28
+ // lazy load
29
+ this.loading = false;
30
+ this.loaded = false;
31
+ }
32
+
33
+ initChildren() {
34
+ const { config } = this;
35
+ const childrenKey = config.children;
36
+ const childrenData = this.data[childrenKey];
37
+ this.hasChildren = Array.isArray(childrenData);
38
+ this.children = (childrenData || []).map(child => new Node(child, config, this));
39
+ }
40
+
41
+ get isDisabled() {
42
+ const { data, parent, config } = this;
43
+ const disabledKey = config.disabled;
44
+ const { checkStrictly } = config;
45
+ return data[disabledKey] ||
46
+ !checkStrictly && parent && parent.isDisabled;
47
+ }
48
+
49
+ get isLeaf() {
50
+ const { data, loaded, hasChildren, children } = this;
51
+ const { lazy, leaf: leafKey } = this.config;
52
+ if (lazy) {
53
+ const isLeaf = isDef(data[leafKey])
54
+ ? data[leafKey]
55
+ : (loaded ? !children.length : false);
56
+ this.hasChildren = !isLeaf;
57
+ return isLeaf;
58
+ }
59
+ return !hasChildren;
60
+ }
61
+
62
+ calculatePathNodes() {
63
+ const nodes = [this];
64
+ let parent = this.parent;
65
+
66
+ while (parent) {
67
+ nodes.unshift(parent);
68
+ parent = parent.parent;
69
+ }
70
+
71
+ return nodes;
72
+ }
73
+
74
+ getPath() {
75
+ return this.path;
76
+ }
77
+
78
+ getValue() {
79
+ return this.value;
80
+ }
81
+
82
+ getValueByOption() {
83
+ return this.config.emitPath
84
+ ? this.getPath()
85
+ : this.getValue();
86
+ }
87
+
88
+ getText(allLevels, separator) {
89
+ return allLevels ? this.pathLabels.join(separator) : this.label;
90
+ }
91
+
92
+ isSameNode(checkedValue) {
93
+ const value = this.getValueByOption();
94
+ return this.config.multiple && Array.isArray(checkedValue)
95
+ ? checkedValue.some(val => isEqual(val, value))
96
+ : isEqual(checkedValue, value);
97
+ }
98
+
99
+ broadcast(event, ...args) {
100
+ const handlerName = `onParent${capitalize(event)}`;
101
+
102
+ this.children.forEach(child => {
103
+ if (child) {
104
+ // bottom up
105
+ child.broadcast(event, ...args);
106
+ child[handlerName] && child[handlerName](...args);
107
+ }
108
+ });
109
+ }
110
+
111
+ emit(event, ...args) {
112
+ const { parent } = this;
113
+ const handlerName = `onChild${capitalize(event)}`;
114
+ if (parent) {
115
+ parent[handlerName] && parent[handlerName](...args);
116
+ parent.emit(event, ...args);
117
+ }
118
+ }
119
+
120
+ onParentCheck(checked) {
121
+ if (!this.isDisabled) {
122
+ this.setCheckState(checked);
123
+ }
124
+ }
125
+
126
+ onChildCheck() {
127
+ const { children } = this;
128
+ const validChildren = children.filter(child => !child.isDisabled);
129
+ const checked = validChildren.length
130
+ ? validChildren.every(child => child.checked)
131
+ : false;
132
+
133
+ this.setCheckState(checked);
134
+ }
135
+
136
+ setCheckState(checked) {
137
+ const totalNum = this.children.length;
138
+ const checkedNum = this.children.reduce((c, p) => {
139
+ const num = p.checked ? 1 : (p.indeterminate ? 0.5 : 0);
140
+ return c + num;
141
+ }, 0);
142
+
143
+ this.checked = checked;
144
+ this.indeterminate = checkedNum !== totalNum && checkedNum > 0;
145
+ }
146
+
147
+ syncCheckState(checkedValue) {
148
+ const value = this.getValueByOption();
149
+ const checked = this.isSameNode(checkedValue, value);
150
+
151
+ this.doCheck(checked);
152
+ }
153
+
154
+ doCheck(checked) {
155
+ if (this.checked !== checked) {
156
+ if (this.config.checkStrictly) {
157
+ this.checked = checked;
158
+ } else {
159
+ // bottom up to unify the calculation of the indeterminate state
160
+ this.broadcast('check', checked);
161
+ this.setCheckState(checked);
162
+ this.emit('check');
163
+ }
164
+ }
165
+ }
166
+ }
@@ -0,0 +1,62 @@
1
+ import Node from './node';
2
+ import { coerceTruthyValueToArray, valueEquals } from '../util/index';
3
+
4
+ const flatNodes = (data, leafOnly) => {
5
+ return data.reduce((res, node) => {
6
+ if (node.isLeaf) {
7
+ res.push(node);
8
+ } else {
9
+ !leafOnly && res.push(node);
10
+ res = res.concat(flatNodes(node.children, leafOnly));
11
+ }
12
+ return res;
13
+ }, []);
14
+ };
15
+
16
+ export default class Store {
17
+
18
+ constructor(data, config) {
19
+ this.config = config;
20
+ this.initNodes(data);
21
+ }
22
+
23
+ initNodes(data) {
24
+ data = coerceTruthyValueToArray(data);
25
+ this.nodes = data.map(nodeData => new Node(nodeData, this.config));
26
+ this.flattedNodes = this.getFlattedNodes(false, false);
27
+ this.leafNodes = this.getFlattedNodes(true, false);
28
+ }
29
+
30
+ appendNode(nodeData, parentNode) {
31
+ const node = new Node(nodeData, this.config, parentNode);
32
+ const children = parentNode ? parentNode.children : this.nodes;
33
+
34
+ children.push(node);
35
+ }
36
+
37
+ appendNodes(nodeDataList, parentNode) {
38
+ nodeDataList = coerceTruthyValueToArray(nodeDataList);
39
+ nodeDataList.forEach(nodeData => this.appendNode(nodeData, parentNode));
40
+ }
41
+
42
+ getNodes() {
43
+ return this.nodes;
44
+ }
45
+
46
+ getFlattedNodes(leafOnly, cached = true) {
47
+ const cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes;
48
+ return cached
49
+ ? cachedNodes
50
+ : flatNodes(this.nodes, leafOnly);
51
+ }
52
+
53
+ getNodeByValue(value) {
54
+ if (value) {
55
+ const nodes = this.getFlattedNodes(false, !this.config.lazy)
56
+ .filter(node => (valueEquals(node.path, value) || node.value === value));
57
+ return nodes && nodes.length ? nodes[0] : null;
58
+ }
59
+ return null;
60
+ }
61
+
62
+ }