@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,202 @@
1
+ <template>
2
+ <transition
3
+ name="base-drawer-fade"
4
+ @after-enter="afterEnter"
5
+ @after-leave="afterLeave">
6
+ <div
7
+ class="base-drawer__wrapper"
8
+ tabindex="-1"
9
+ v-show="visible">
10
+ <div
11
+ class="base-drawer__container"
12
+ :class="visible && 'base-drawer__open'"
13
+ @click.self="handleWrapperClick"
14
+ role="document"
15
+ tabindex="-1">
16
+ <div
17
+ aria-modal="true"
18
+ aria-labelledby="base-drawer__title"
19
+ :aria-label="title"
20
+ class="base-drawer"
21
+ :class="[direction, customClass]"
22
+ :style="isHorizontal ? `width: ${size}` : `height: ${size}`"
23
+ ref="drawer"
24
+ role="dialog"
25
+ tabindex="-1"
26
+ >
27
+ <header class="base-drawer__header" id="base-drawer__title" v-if="withHeader">
28
+ <slot name="title">
29
+ <span role="heading" tabindex="0">{{ title }}</span>
30
+ </slot>
31
+ <slot name="actions"></slot>
32
+ <button
33
+ :aria-label="`close ${title || 'drawer'}`"
34
+ class="base-drawer__close-btn"
35
+ type="button"
36
+ v-if="showClose"
37
+ @click="closeDrawer">
38
+ <i class="base-dialog__close base-icon base-icon-close"></i>
39
+ </button>
40
+ </header>
41
+ <base-scrollbar class="App__scroll">
42
+ <section class="base-drawer__body" v-if="rendered">
43
+ <slot></slot>
44
+ </section>
45
+ </base-scrollbar>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </transition>
50
+ </template>
51
+
52
+ <script>
53
+ import Popup from '../util/popup'
54
+ import emitter from '../mixin/emitter'
55
+ import Utils from '../util/aria-utils'
56
+ import BaseScrollbar from '../scrollbar'
57
+ export default {
58
+ name: 'BaseDrawer',
59
+ components: {BaseScrollbar},
60
+ mixins: [Popup, emitter],
61
+ props: {
62
+ appendToBody: {
63
+ type: Boolean,
64
+ default: false
65
+ },
66
+ beforeClose: {
67
+ type: Function
68
+ },
69
+ customClass: {
70
+ type: String,
71
+ default: ''
72
+ },
73
+ closeOnPressEscape: {
74
+ type: Boolean,
75
+ default: true
76
+ },
77
+ destroyOnClose: {
78
+ type: Boolean,
79
+ default: false
80
+ },
81
+ modal: {
82
+ type: Boolean,
83
+ default: true
84
+ },
85
+ direction: {
86
+ type: String,
87
+ default: 'rtl',
88
+ validator(val) {
89
+ return ['ltr', 'rtl', 'ttb', 'btt'].indexOf(val) !== -1
90
+ }
91
+ },
92
+ modalAppendToBody: {
93
+ type: Boolean,
94
+ default: true
95
+ },
96
+ showClose: {
97
+ type: Boolean,
98
+ default: true
99
+ },
100
+ size: {
101
+ type: String,
102
+ default: '30%'
103
+ },
104
+ title: {
105
+ type: String,
106
+ default: ''
107
+ },
108
+ visible: {
109
+ type: Boolean
110
+ },
111
+ wrapperClosable: {
112
+ type: Boolean,
113
+ default: true
114
+ },
115
+ withHeader: {
116
+ type: Boolean,
117
+ default: true
118
+ }
119
+ },
120
+ computed: {
121
+ isHorizontal () {
122
+ return this.direction === 'rtl' || this.direction === 'ltr'
123
+ }
124
+ },
125
+ data () {
126
+ return {
127
+ closed: false,
128
+ prevActiveElement: null
129
+ }
130
+ },
131
+ watch: {
132
+ visible (val) {
133
+ if (val) {
134
+ this.closed = false
135
+ this.$emit('open')
136
+ if (this.appendToBody) {
137
+ document.body.appendChild(this.$el)
138
+ }
139
+ this.prevActiveElement = document.activeElement
140
+ this.$nextTick(() => {
141
+ Utils.focusFirstDescendant(this.$refs.drawer)
142
+ })
143
+ } else {
144
+ if (!this.closed) this.$emit('close')
145
+ this.$nextTick(() => {
146
+ if (this.prevActiveElement) {
147
+ this.prevActiveElement.focus()
148
+ }
149
+ })
150
+ }
151
+ }
152
+ },
153
+ methods: {
154
+ afterEnter () {
155
+ this.$emit('opened')
156
+ },
157
+ afterLeave () {
158
+ this.$emit('closed')
159
+ },
160
+ hide (cancel) {
161
+ if (cancel !== false) {
162
+ this.$emit('update:visible', false)
163
+ this.$emit('close')
164
+ if (this.destroyOnClose === true) {
165
+ this.rendered = false
166
+ }
167
+ this.closed = true
168
+ }
169
+ },
170
+ handleWrapperClick () {
171
+ if (this.wrapperClosable) {
172
+ this.closeDrawer()
173
+ }
174
+ },
175
+ closeDrawer () {
176
+ if (typeof this.beforeClose === 'function') {
177
+ this.beforeClose(this.hide)
178
+ } else {
179
+ this.hide()
180
+ }
181
+ },
182
+ handleClose () {
183
+ // This method here will be called by PopupManger, when the `closeOnPressEscape` was set to true
184
+ // pressing `ESC` will call this method, and also close the drawer.
185
+ // This method also calls `beforeClose` if there was one.
186
+ this.closeDrawer()
187
+ }
188
+ },
189
+ mounted () {
190
+ if (this.visible) {
191
+ this.rendered = true
192
+ this.open()
193
+ }
194
+ },
195
+ destroyed () {
196
+ // if appendToBody is true, remove DOM node after destroy
197
+ if (this.appendToBody && this.$el && this.$el.parentNode) {
198
+ this.$el.parentNode.removeChild(this.$el)
199
+ }
200
+ }
201
+ }
202
+ </script>
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <li
3
+ class="base-dropdown-menu__item"
4
+ :class="{
5
+ 'is-disabled': disabled,
6
+ 'base-dropdown-menu__item--divided': divided
7
+ }"
8
+ @click="handleClick"
9
+ :aria-disabled="disabled"
10
+ :tabindex="disabled ? null : -1"
11
+ v-ripple
12
+ >
13
+ <i :class="icon" v-if="icon"></i>
14
+ <slot></slot>
15
+ </li>
16
+ </template>
17
+ <script>
18
+ import Emitter from '../mixin/emitter'
19
+ import Ripple from '../directive/ripple'
20
+ export default {
21
+ name: 'BaseDropdownItem',
22
+ mixins: [Emitter],
23
+ directives: {
24
+ Ripple
25
+ },
26
+ props: {
27
+ command: {},
28
+ disabled: Boolean,
29
+ divided: Boolean,
30
+ icon: String
31
+ },
32
+
33
+ methods: {
34
+ handleClick(e) {
35
+ this.dispatch('BaseDropdown', 'menu-item-click', [this.command, this])
36
+ }
37
+ }
38
+ }
39
+ </script>
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <transition name="base-slide-y" @after-leave="doDestroy">
3
+ <ul class="base-dropdown-menu base-popper" :class="[size && `base-dropdown-menu--${size}`]" v-show="showPopper">
4
+ <slot></slot>
5
+ </ul>
6
+ </transition>
7
+ </template>
8
+ <script>
9
+ import Popper from '../util/vue-popper'
10
+
11
+ export default {
12
+ name: 'BaseDropdownMenu',
13
+
14
+ componentName: 'BaseDropdownMenu',
15
+
16
+ mixins: [Popper],
17
+
18
+ props: {
19
+ visibleArrow: {
20
+ type: Boolean,
21
+ default: true
22
+ },
23
+ arrowOffset: {
24
+ type: Number,
25
+ default: 0
26
+ }
27
+ },
28
+
29
+ data() {
30
+ return {
31
+ size: this.dropdown.dropdownSize
32
+ }
33
+ },
34
+
35
+ inject: ['dropdown'],
36
+
37
+ created() {
38
+ this.$on('updatePopper', () => {
39
+ if (this.showPopper) this.updatePopper()
40
+ })
41
+ this.$on('visible', val => {
42
+ this.showPopper = val
43
+ })
44
+ },
45
+
46
+ mounted() {
47
+ this.dropdown.popperElm = this.popperElm = this.$el
48
+ this.referenceElm = this.dropdown.$el
49
+ // compatible with 2.6 new v-slot syntax
50
+ // issue link https://github.com/ElemeFE/element/issues/14345
51
+ this.dropdown.initDomOperation()
52
+ },
53
+
54
+ watch: {
55
+ 'dropdown.placement': {
56
+ immediate: true,
57
+ handler(val) {
58
+ this.currentPlacement = val
59
+ }
60
+ }
61
+ }
62
+ }
63
+ </script>
@@ -0,0 +1,308 @@
1
+ <script lang="jsx" type="text/jsx">
2
+ import Clickoutside from '../util/clickoutside'
3
+ import Emitter from '../mixin/emitter'
4
+ import Migrating from '../mixin/migrating'
5
+ import BaseButton from '../button/Button'
6
+ import BaseButtonGroup from '../button/ButtonGroup'
7
+ import { generateId } from '../util'
8
+
9
+ export default {
10
+ name: 'BaseDropdown',
11
+
12
+ componentName: 'BaseDropdown',
13
+
14
+ mixins: [Emitter, Migrating],
15
+
16
+ directives: { Clickoutside },
17
+
18
+ components: {
19
+ BaseButton,
20
+ BaseButtonGroup
21
+ },
22
+
23
+ provide() {
24
+ return {
25
+ dropdown: this
26
+ }
27
+ },
28
+
29
+ props: {
30
+ trigger: {
31
+ type: String,
32
+ default: 'hover'
33
+ },
34
+ type: String,
35
+ size: {
36
+ type: String,
37
+ default: ''
38
+ },
39
+ splitButton: Boolean,
40
+ hideOnClick: {
41
+ type: Boolean,
42
+ default: true
43
+ },
44
+ placement: {
45
+ type: String,
46
+ default: 'bottom-end'
47
+ },
48
+ visibleArrow: {
49
+ default: true
50
+ },
51
+ showTimeout: {
52
+ type: Number,
53
+ default: 150
54
+ },
55
+ hideTimeout: {
56
+ type: Number,
57
+ default: 150
58
+ },
59
+ tabindex: {
60
+ type: Number,
61
+ default: 0
62
+ }
63
+ },
64
+
65
+ data() {
66
+ return {
67
+ timeout: null,
68
+ visible: false,
69
+ triggerElm: null,
70
+ menuItems: null,
71
+ menuItemsArray: null,
72
+ dropdownElm: null,
73
+ focusing: false,
74
+ listId: `dropdown-menu-${generateId()}`
75
+ }
76
+ },
77
+
78
+ computed: {
79
+ dropdownSize() {
80
+ return this.size || (this.$ELEMENT || {}).size
81
+ }
82
+ },
83
+
84
+ mounted() {
85
+ this.$on('menu-item-click', this.handleMenuItemClick)
86
+ },
87
+
88
+ watch: {
89
+ visible (val) {
90
+ this.broadcast('BaseDropdownMenu', 'visible', val)
91
+ this.$emit('visible-change', val)
92
+ },
93
+ focusing (val) {
94
+ const selfDefine = this.$el.querySelector('.base-dropdown-selfdefine')
95
+ if (selfDefine) { // 自定义
96
+ if (val) {
97
+ selfDefine.className += ' focusing'
98
+ } else {
99
+ selfDefine.className = selfDefine.className.replace('focusing', '')
100
+ }
101
+ }
102
+ }
103
+ },
104
+
105
+ methods: {
106
+ getMigratingConfig() {
107
+ return {
108
+ props: {
109
+ 'menu-align': 'menu-align is renamed to placement.'
110
+ }
111
+ }
112
+ },
113
+ show() {
114
+ if (this.triggerElm.disabled) return
115
+ clearTimeout(this.timeout)
116
+ this.timeout = setTimeout(() => {
117
+ this.visible = true
118
+ }, this.trigger === 'click' ? 0 : this.showTimeout)
119
+ },
120
+ hide() {
121
+ if (this.triggerElm.disabled) return
122
+ this.removeTabindex()
123
+ if (this.tabindex >= 0) {
124
+ this.resetTabindex(this.triggerElm)
125
+ }
126
+ clearTimeout(this.timeout)
127
+ this.timeout = setTimeout(() => {
128
+ this.visible = false
129
+ }, this.trigger === 'click' ? 0 : this.hideTimeout)
130
+ },
131
+ handleClick() {
132
+ if (this.triggerElm.disabled) return
133
+ if (this.visible) {
134
+ this.hide()
135
+ } else {
136
+ this.show()
137
+ }
138
+ },
139
+ handleTriggerKeyDown(ev) {
140
+ const keyCode = ev.keyCode
141
+ if ([38, 40].indexOf(keyCode) > -1) { // up/down
142
+ this.removeTabindex()
143
+ this.resetTabindex(this.menuItems[0])
144
+ this.menuItems[0].focus()
145
+ ev.preventDefault()
146
+ ev.stopPropagation()
147
+ } else if (keyCode === 13) { // space enter选中
148
+ this.handleClick()
149
+ } else if ([9, 27].indexOf(keyCode) > -1) { // tab || esc
150
+ this.hide()
151
+ }
152
+ },
153
+ handleItemKeyDown(ev) {
154
+ const keyCode = ev.keyCode
155
+ const target = ev.target
156
+ const currentIndex = this.menuItemsArray.indexOf(target)
157
+ const max = this.menuItemsArray.length - 1
158
+ let nextIndex
159
+ if ([38, 40].indexOf(keyCode) > -1) { // up/down
160
+ if (keyCode === 38) { // up
161
+ nextIndex = currentIndex !== 0 ? currentIndex - 1 : 0
162
+ } else { // down
163
+ nextIndex = currentIndex < max ? currentIndex + 1 : max
164
+ }
165
+ this.removeTabindex()
166
+ this.resetTabindex(this.menuItems[nextIndex])
167
+ this.menuItems[nextIndex].focus()
168
+ ev.preventDefault()
169
+ ev.stopPropagation()
170
+ } else if (keyCode === 13) { // enter选中
171
+ this.triggerElmFocus()
172
+ target.click()
173
+ if (this.hideOnClick) { // click关闭
174
+ this.visible = false
175
+ }
176
+ } else if ([9, 27].indexOf(keyCode) > -1) { // tab // esc
177
+ this.hide()
178
+ this.triggerElmFocus()
179
+ }
180
+ },
181
+ resetTabindex(ele) { // 下次tab时组件聚焦元素
182
+ this.removeTabindex()
183
+ ele.setAttribute('tabindex', '0') // 下次期望的聚焦元素
184
+ },
185
+ removeTabindex() {
186
+ this.triggerElm.setAttribute('tabindex', '-1')
187
+ this.menuItemsArray.forEach((item) => {
188
+ item.setAttribute('tabindex', '-1')
189
+ })
190
+ },
191
+ initAria() {
192
+ this.dropdownElm.setAttribute('id', this.listId)
193
+ this.triggerElm.setAttribute('aria-haspopup', 'list')
194
+ this.triggerElm.setAttribute('aria-controls', this.listId)
195
+
196
+ if (!this.splitButton) { // 自定义
197
+ this.triggerElm.setAttribute('role', 'button')
198
+ this.triggerElm.setAttribute('tabindex', this.tabindex)
199
+ this.triggerElm.setAttribute('class', (this.triggerElm.getAttribute('class') || '') + ' base-dropdown-selfdefine') // 控制
200
+ }
201
+ },
202
+ initEvent() {
203
+ let { trigger, show, hide, handleClick, splitButton, handleTriggerKeyDown, handleItemKeyDown } = this
204
+ this.triggerElm = splitButton
205
+ ? this.$refs.trigger.$el
206
+ : this.$slots.default[0].elm
207
+
208
+ let dropdownElm = this.dropdownElm
209
+
210
+ this.triggerElm.addEventListener('keydown', handleTriggerKeyDown) // triggerElm keydown
211
+ dropdownElm.addEventListener('keydown', handleItemKeyDown, true) // item keydown
212
+ // 控制自定义元素的样式
213
+ if (!splitButton) {
214
+ this.triggerElm.addEventListener('focus', () => {
215
+ this.focusing = true
216
+ })
217
+ this.triggerElm.addEventListener('blur', () => {
218
+ this.focusing = false
219
+ })
220
+ this.triggerElm.addEventListener('click', () => {
221
+ this.focusing = false
222
+ })
223
+ }
224
+ if (trigger === 'hover') {
225
+ this.triggerElm.addEventListener('mouseenter', show)
226
+ this.triggerElm.addEventListener('mouseleave', hide)
227
+ dropdownElm.addEventListener('mouseenter', show)
228
+ dropdownElm.addEventListener('mouseleave', hide)
229
+ } else if (trigger === 'click') {
230
+ this.triggerElm.addEventListener('click', handleClick)
231
+ }
232
+ },
233
+ removeEvent() {
234
+ let { trigger, show, hide, handleClick, splitButton, handleTriggerKeyDown, handleItemKeyDown } = this
235
+ this.triggerElm = splitButton
236
+ ? this.$refs.trigger.$el
237
+ : this.$slots.default[0].elm
238
+ let dropdownElm = this.dropdownElm
239
+ this.triggerElm.removeEventListener('keydown', handleTriggerKeyDown) // triggerElm keydown
240
+ dropdownElm.removeEventListener('keydown', handleItemKeyDown, true) // item keydown
241
+ // 控制自定义元素的样式
242
+ if (!splitButton) {
243
+ this.triggerElm.removeEventListener('focus', () => {
244
+ this.focusing = true
245
+ })
246
+ this.triggerElm.removeEventListener('blur', () => {
247
+ this.focusing = false
248
+ })
249
+ this.triggerElm.removeEventListener('click', () => {
250
+ this.focusing = false
251
+ })
252
+ }
253
+ if (trigger === 'hover') {
254
+ this.triggerElm.removeEventListener('mouseenter', show)
255
+ this.triggerElm.removeEventListener('mouseleave', hide)
256
+ dropdownElm.removeEventListener('mouseenter', show)
257
+ dropdownElm.removeEventListener('mouseleave', hide)
258
+ } else if (trigger === 'click') {
259
+ this.triggerElm.removeEventListener('click', handleClick)
260
+ }
261
+ },
262
+ handleMenuItemClick(command, instance) {
263
+ if (this.hideOnClick) {
264
+ this.visible = false
265
+ }
266
+ this.$emit('command', command, instance)
267
+ },
268
+ triggerElmFocus() {
269
+ this.triggerElm.focus && this.triggerElm.focus()
270
+ },
271
+ initDomOperation() {
272
+ this.dropdownElm = this.popperElm
273
+ this.menuItems = this.dropdownElm.querySelectorAll("[tabindex='-1']")
274
+ this.menuItemsArray = [].slice.call(this.menuItems)
275
+
276
+ this.initEvent()
277
+ this.initAria()
278
+ }
279
+ },
280
+
281
+ render(h) {
282
+ let { hide, splitButton, type, dropdownSize } = this
283
+
284
+ const handleMainButtonClick = (event) => {
285
+ this.$emit('click', event)
286
+ hide()
287
+ }
288
+
289
+ let triggerElm = !splitButton
290
+ ? this.$slots.default
291
+ : (<base-button-group>
292
+ <base-button type={type} size={dropdownSize} nativeOn-click={handleMainButtonClick}>
293
+ {this.$slots.default}
294
+ </base-button>
295
+ <base-button ref="trigger" type={type} size={dropdownSize} class="base-dropdown__caret-button">
296
+ <i class="base-dropdown__icon base-icon-arrow-down"></i>
297
+ </base-button>
298
+ </base-button-group>)
299
+
300
+ return (
301
+ <div class="base-dropdown" v-clickoutside={hide}>
302
+ {triggerElm}
303
+ {this.$slots.dropdown}
304
+ </div>
305
+ )
306
+ }
307
+ }
308
+ </script>