@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,189 @@
1
+ import Message from './message'
2
+ import MessageBox from './message-box/main.js'
3
+ import locale from './locale'
4
+ import Button from "./button/Button";
5
+ import ButtonGroup from "./button/ButtonGroup";
6
+ import Alert from "./alert/Alert";
7
+ import BaseBacktop from "./backtop/main";
8
+ import Carousel from "./carousel/Carousel";
9
+ import CarouselItem from "./carousel/CarouselItem";
10
+ import autocompleteSuggestions from "./autocomplete/autocomplete-suggestions";
11
+ import autocomplete from "./autocomplete/autocomplete";
12
+ import cascader from "./cascader/cascader";
13
+ import cascaderMenu from "./cascader-panel/cascader-menu";
14
+ import cascaderPanel from "./cascader-panel/cascader-panel";
15
+ import datePicker from "./date-picker/picker/date-picker";
16
+ import timePicker from "./date-picker/picker/time-picker";
17
+ import timeSelect from "./date-picker/picker/time-select";
18
+ import checkbox from "./checkbox/checkbox";
19
+ import checkboxButton from "./checkbox/checkbox-button";
20
+ import checkboxGroup from "./checkbox/checkbox-group";
21
+ import col from "./col/col";
22
+ import collapse from "./collapse/collapse";
23
+ import collapseItem from "./collapse/collapse-item";
24
+ import BaseColorPicker from './color-picker/main'
25
+ import BaseDialog from './dialog/Index'
26
+ import Divider from "./divider/Divider";
27
+ import Drawer from "./drawer/Drawer";
28
+ import dropdown from "./dropdown/dropdown";
29
+ import dropdownItem from "./dropdown/dropdown-item";
30
+ import dropdownMenu from "./dropdown/dropdown-menu";
31
+ import Form from "./form/Form";
32
+ import FormItem from "./form/FormItem";
33
+ import icon from "./icon/icon";
34
+ import BaseImage from './image/main'
35
+ import Input from "./input/Input";
36
+ import menu from "./menu/menu";
37
+ import menuItem from "./menu/menu-item";
38
+ import menuItemGroup from "./menu/menu-item-group";
39
+ import submenu from "./menu/submenu";
40
+ import pagination from "./pagination/pagination";
41
+ import BasePopover from "./popover/main"
42
+ import Progress from "./progress/Progress";
43
+ import radio from "./radio/radio";
44
+ import radioButton from "./radio/radio-button";
45
+ import radioGroup from "./radio/radio-group";
46
+ import row from "./row/row";
47
+ import BaseScrollbar from "./scrollbar/index"
48
+ import Option from "./select/Option";
49
+ import OptionGroup from "./select/OptionGroup";
50
+ import Select from "./select/Select";
51
+ import SelectDropdown from "./select/SelectDropdown";
52
+ import BaseSwitch from './switch/index'
53
+ import tabs from "./tabs/tabs";
54
+ import tabPane from "./tabs/tab-pane";
55
+ import Tag from "./tag/Tag";
56
+ import tooltip from "./tooltip/tooltip";
57
+ import BaseUpload from './upload/Index'
58
+ const components = [
59
+ Button,
60
+ ButtonGroup,
61
+ Alert,
62
+ BaseBacktop,
63
+ Carousel,
64
+ CarouselItem,
65
+ autocomplete,
66
+ cascaderMenu,
67
+ cascader,
68
+ cascaderPanel,
69
+ datePicker,
70
+ timePicker,
71
+ timeSelect,
72
+ checkbox,
73
+ checkboxButton,
74
+ checkboxGroup,
75
+ col,
76
+ collapse,
77
+ collapseItem,
78
+ BaseColorPicker,
79
+ BaseDialog,
80
+ Divider,
81
+ Drawer,
82
+ dropdown,
83
+ dropdownItem,
84
+ dropdownMenu,
85
+ Form,
86
+ FormItem,
87
+ icon,
88
+ BaseImage,
89
+ Input,
90
+ menu,
91
+ menuItem,
92
+ menuItemGroup,
93
+ submenu,
94
+ pagination,
95
+ BasePopover,
96
+ Progress,
97
+ radio,
98
+ radioButton,
99
+ radioGroup,
100
+ row,
101
+ BaseScrollbar,
102
+ Option,
103
+ OptionGroup,
104
+ Select,
105
+ SelectDropdown,
106
+ BaseSwitch,
107
+ tabs,
108
+ tabPane,
109
+ Tag,
110
+ tooltip,
111
+ BaseUpload
112
+ ];
113
+ const BaseUI = {
114
+ install: function(Vue, opts = {}) {
115
+ locale.use(opts.locale)
116
+ locale.i18n(opts.i18n)
117
+ components.forEach(component => {
118
+ Vue.component(component.name, component);
119
+ });
120
+ Vue.prototype.$ELEMENT = {
121
+ size: opts.size || '',
122
+ zIndex: opts.zIndex || 2000
123
+ }
124
+
125
+ Vue.prototype.$msgbox = MessageBox;
126
+ Vue.prototype.$alert = MessageBox.alert;
127
+ Vue.prototype.$confirm = MessageBox.confirm;
128
+ Vue.prototype.$prompt = MessageBox.prompt;
129
+ Vue.prototype.$notify = Notification;
130
+ Vue.prototype.$message = Message;
131
+ }
132
+ }
133
+
134
+ export default BaseUI
135
+ export {
136
+ Button,
137
+ ButtonGroup,
138
+ Alert,
139
+ BaseBacktop,
140
+ Carousel,
141
+ CarouselItem,
142
+ autocomplete,
143
+ cascaderMenu,
144
+ cascader,
145
+ cascaderPanel,
146
+ datePicker,
147
+ timePicker,
148
+ timeSelect,
149
+ checkbox,
150
+ checkboxButton,
151
+ checkboxGroup,
152
+ col,
153
+ collapse,
154
+ collapseItem,
155
+ BaseColorPicker,
156
+ BaseDialog,
157
+ Divider,
158
+ Drawer,
159
+ dropdown,
160
+ dropdownItem,
161
+ dropdownMenu,
162
+ Form,
163
+ FormItem,
164
+ icon,
165
+ BaseImage,
166
+ Input,
167
+ menu,
168
+ menuItem,
169
+ menuItemGroup,
170
+ submenu,
171
+ pagination,
172
+ BasePopover,
173
+ Progress,
174
+ radio,
175
+ radioButton,
176
+ radioGroup,
177
+ row,
178
+ BaseScrollbar,
179
+ Option,
180
+ OptionGroup,
181
+ Select,
182
+ SelectDropdown,
183
+ BaseSwitch,
184
+ tabs,
185
+ tabPane,
186
+ Tag,
187
+ tooltip,
188
+ BaseUpload
189
+ };
@@ -0,0 +1,438 @@
1
+ <template>
2
+ <div :class="[
3
+ type === 'textarea' ? 'base-textarea' : 'base-input',
4
+ inputSize ? 'base-input--' + inputSize : '',
5
+ {
6
+ 'is-rippled': ripple,
7
+ 'is-focused': focused && enableFocusClass,
8
+ 'is-disabled': inputDisabled,
9
+ 'is-exceed': inputExceed,
10
+ 'base-input-group': $slots.prepend || $slots.append,
11
+ 'base-input-group--append': $slots.append,
12
+ 'base-input-group--prepend': $slots.prepend,
13
+ 'base-input--prefix': $slots.prefix || prefixIcon,
14
+ 'base-input--suffix': $slots.suffix || suffixIcon || clearable || showPassword
15
+ }
16
+ ]"
17
+ @mouseenter="hovering = true"
18
+ @mouseleave="hovering = false"
19
+ >
20
+ <template v-if="type !== 'textarea'">
21
+ <!-- 前置元素 -->
22
+ <div class="base-input-group__prepend" v-if="$slots.prepend">
23
+ <slot name="prepend"></slot>
24
+ </div>
25
+ <input
26
+ :tabindex="tabindex"
27
+ v-if="type !== 'textarea'"
28
+ class="base-input__inner"
29
+ v-bind="$attrs"
30
+ :type="showPassword ? (passwordVisible ? 'text': 'password') : type"
31
+ :disabled="inputDisabled"
32
+ :readonly="readonly"
33
+ :autocomplete="autoComplete || autocomplete"
34
+ :placeholder="showLabel ? null : placeholder"
35
+ ref="input"
36
+ @compositionstart="handleCompositionStart"
37
+ @compositionupdate="handleCompositionUpdate"
38
+ @compositionend="handleCompositionEnd"
39
+ @input="handleInput"
40
+ @focus="handleFocus"
41
+ @blur="handleBlur"
42
+ @change="handleChange"
43
+ @keyup.enter="handleKeyUpEnter"
44
+ :aria-label="label"
45
+ >
46
+ <!-- 前置内容 -->
47
+ <span class="base-input__prefix" v-if="$slots.prefix || prefixIcon">
48
+ <slot name="prefix"></slot>
49
+ <i class="base-input__icon"
50
+ v-if="prefixIcon"
51
+ :class="prefixIcon">
52
+ </i>
53
+ </span>
54
+ <!-- 后置内容 -->
55
+ <span
56
+ class="base-input__suffix"
57
+ v-if="getSuffixVisible()">
58
+ <span class="base-input__suffix-inner">
59
+ <template v-if="!showClear || !showPwdVisible || !isWordLimitVisible">
60
+ <slot name="suffix"></slot>
61
+ <i class="base-input__icon"
62
+ v-if="suffixIcon"
63
+ :class="suffixIcon">
64
+ </i>
65
+ </template>
66
+ <i v-if="showClear"
67
+ class="base-input__icon base-icon-close base-input__clear"
68
+ @mousedown.prevent
69
+ @click="clear"
70
+ ></i>
71
+ <i v-if="showPwdVisible"
72
+ class="base-input__icon base-icon-view base-input__clear"
73
+ @click="handlePasswordVisible"
74
+ ></i>
75
+ <span v-if="isWordLimitVisible" class="base-input__count">
76
+ <span class="base-input__count-inner">
77
+ {{ textLength }}/{{ upperLimit }}
78
+ </span>
79
+ </span>
80
+ </span>
81
+ <i class="base-input__icon"
82
+ v-if="validateState"
83
+ :class="['base-input__validateIcon', validateIcon]">
84
+ </i>
85
+ </span>
86
+ <!-- 后置元素 -->
87
+ <div class="base-input-group__append" v-if="$slots.append">
88
+ <slot name="append"></slot>
89
+ </div>
90
+ </template>
91
+ <textarea
92
+ v-else
93
+ :tabindex="tabindex"
94
+ class="base-textarea__inner"
95
+ @compositionstart="handleCompositionStart"
96
+ @compositionupdate="handleCompositionUpdate"
97
+ @compositionend="handleCompositionEnd"
98
+ @input="handleInput"
99
+ :placeholder="showLabel ? null : placeholder"
100
+ ref="textarea"
101
+ v-bind="$attrs"
102
+ :disabled="inputDisabled"
103
+ :readonly="readonly"
104
+ :autocomplete="autoComplete || autocomplete"
105
+ :style="textareaStyle"
106
+ @focus="handleFocus"
107
+ @blur="handleBlur"
108
+ @change="handleChange"
109
+ :aria-label="label"
110
+ >
111
+ </textarea>
112
+ <div class="base-input__placeholder" :class="{ 'is-active' : focused || value }" v-if="showLabel && placeholder">{{ placeholder }}</div>
113
+ <span v-if="isWordLimitVisible && type === 'textarea'" class="base-input__count">{{ textLength }}/{{ upperLimit }}</span>
114
+ </div>
115
+ </template>
116
+ <script>
117
+ import emitter from '../mixin/emitter'
118
+ import Migrating from '../mixin/migrating'
119
+ import calcTextareaHeight from './calcTextareaHeight'
120
+ import merge from '../util/merge'
121
+ import {isKorean} from '../util/shared'
122
+
123
+ export default {
124
+ name: 'BaseInput',
125
+ componentName: 'BaseInput',
126
+ mixins: [emitter, Migrating],
127
+ inheritAttrs: false,
128
+ inject: {
129
+ baseForm: {
130
+ default: ''
131
+ },
132
+ baseFormItem: {
133
+ default: ''
134
+ }
135
+ },
136
+ data() {
137
+ return {
138
+ textareaCalcStyle: {},
139
+ hovering: false,
140
+ focused: false,
141
+ isComposing: false,
142
+ passwordVisible: false
143
+ };
144
+ },
145
+ props: {
146
+ value: [String, Number],
147
+ size: String,
148
+ resize: String,
149
+ form: String,
150
+ disabled: Boolean,
151
+ readonly: Boolean,
152
+ type: {
153
+ type: String,
154
+ default: 'text'
155
+ },
156
+ autosize: {
157
+ type: [Boolean, Object],
158
+ default: false
159
+ },
160
+ autocomplete: {
161
+ type: String,
162
+ default: 'off'
163
+ },
164
+ /** @Deprecated in next major version */
165
+ autoComplete: {
166
+ type: String,
167
+ validator(val) {
168
+ process.env.NODE_ENV !== 'production' &&
169
+ console.warn('[Element Warn][Input]\'auto-complete\' property will be deprecated in next major version. please use \'autocomplete\' instead.');
170
+ return true;
171
+ }
172
+ },
173
+ validateEvent: {
174
+ type: Boolean,
175
+ default: true
176
+ },
177
+ suffixIcon: String,
178
+ prefixIcon: String,
179
+ label: String,
180
+ clearable: {
181
+ type: Boolean,
182
+ default: false
183
+ },
184
+ alwaysShowClear:{
185
+ type: Boolean,
186
+ default: false
187
+ },
188
+ showPassword: {
189
+ type: Boolean,
190
+ default: false
191
+ },
192
+ showWordLimit: {
193
+ type: Boolean,
194
+ default: false
195
+ },
196
+ showLabel: {
197
+ type: Boolean,
198
+ default: true
199
+ },
200
+ tabindex: String,
201
+ placeholder: String,
202
+ ripple: {
203
+ type: Boolean,
204
+ default: true
205
+ },
206
+ enableFocusClass: {
207
+ type: Boolean,
208
+ default: true
209
+ }
210
+ },
211
+ computed: {
212
+ _baseFormItemSize() {
213
+ return (this.baseFormItem || {}).baseFormItemSize
214
+ },
215
+ validateState() {
216
+ return this.baseFormItem ? this.baseFormItem.validateState : ''
217
+ },
218
+ needStatusIcon() {
219
+ return this.baseForm ? this.baseForm.statusIcon : false
220
+ },
221
+ validateIcon() {
222
+ return {
223
+ validating: 'base-icon-loading',
224
+ success: 'base-icon-circle-check',
225
+ error: 'base-icon-circle-close'
226
+ }[this.validateState]
227
+ },
228
+ textareaStyle() {
229
+ return merge({}, this.textareaCalcStyle, { resize: this.resize })
230
+ },
231
+ inputSize() {
232
+ return this.size || this._baseFormItemSize || (this.$ELEMENT || {}).size
233
+ },
234
+ inputDisabled() {
235
+ return this.disabled || (this.baseForm || {}).disabled;
236
+ },
237
+ nativeInputValue() {
238
+ return this.value === null || this.value === undefined ? '' : String(this.value)
239
+ },
240
+ showClear() {
241
+ return this.clearable &&
242
+ !this.inputDisabled &&
243
+ !this.readonly &&
244
+ this.nativeInputValue &&
245
+ (this.focused || this.hovering || this.alwaysShowClear)
246
+ },
247
+ showPwdVisible() {
248
+ return this.showPassword &&
249
+ !this.inputDisabled &&
250
+ !this.readonly &&
251
+ (!!this.nativeInputValue || this.focused)
252
+ },
253
+ isWordLimitVisible() {
254
+ return this.showWordLimit &&
255
+ this.$attrs.maxlength &&
256
+ (this.type === 'text' || this.type === 'textarea') &&
257
+ !this.inputDisabled &&
258
+ !this.readonly &&
259
+ !this.showPassword
260
+ },
261
+ upperLimit() {
262
+ return this.$attrs.maxlength
263
+ },
264
+ textLength() {
265
+ if (typeof this.value === 'number') {
266
+ return String(this.value).length
267
+ }
268
+
269
+ return (this.value || '').length
270
+ },
271
+ inputExceed() {
272
+ // show exceed style if length of initial value greater then maxlength
273
+ return this.isWordLimitVisible &&
274
+ (this.textLength > this.upperLimit)
275
+ }
276
+ },
277
+ watch: {
278
+ value(val) {
279
+ this.$nextTick(this.resizeTextarea)
280
+ if (this.validateEvent) {
281
+ this.dispatch('BaseFormItem', 'base.form.change', [val])
282
+ }
283
+ },
284
+ nativeInputValue() {
285
+ this.setNativeInputValue()
286
+ },
287
+ type() {
288
+ this.$nextTick(() => {
289
+ this.setNativeInputValue()
290
+ this.resizeTextarea()
291
+ this.updateIconOffset()
292
+ })
293
+ }
294
+ },
295
+ methods: {
296
+ focus() {
297
+ this.getInput().focus()
298
+ },
299
+ blur() {
300
+ this.getInput().blur()
301
+ },
302
+ getMigratingConfig() {
303
+ return {
304
+ props: {
305
+ 'icon': 'icon is removed, use suffix-icon / prefix-icon instead.',
306
+ 'on-icon-click': 'on-icon-click is removed.'
307
+ },
308
+ events: {
309
+ 'click': 'click is removed.'
310
+ }
311
+ }
312
+ },
313
+ handleBlur(event) {
314
+ this.focused = false
315
+ this.$emit('blur', event)
316
+ if (this.validateEvent) {
317
+ this.dispatch('BaseFormItem', 'base.form.blur', [this.value])
318
+ }
319
+ },
320
+ select() {
321
+ this.getInput().select()
322
+ },
323
+ resizeTextarea() {
324
+ if (this.$isServer) return
325
+ const { autosize, type } = this
326
+ if (type !== 'textarea') return
327
+ if (!autosize) {
328
+ this.textareaCalcStyle = {
329
+ minHeight: calcTextareaHeight(this.$refs.textarea).minHeight
330
+ }
331
+ return
332
+ }
333
+ const minRows = autosize.minRows
334
+ const maxRows = autosize.maxRows
335
+
336
+ this.textareaCalcStyle = calcTextareaHeight(this.$refs.textarea, minRows, maxRows)
337
+ },
338
+ setNativeInputValue() {
339
+ const input = this.getInput()
340
+ if (!input) return
341
+ if (input.value === this.nativeInputValue) return
342
+ input.value = this.nativeInputValue
343
+ },
344
+ handleFocus(event) {
345
+ this.focused = true
346
+ this.$emit('focus', event)
347
+ if (this.validateEvent) {
348
+ this.dispatch('BaseFormItem', 'clearValidate')
349
+ }
350
+ },
351
+ handleCompositionStart() {
352
+ this.isComposing = true
353
+ },
354
+ handleCompositionUpdate(event) {
355
+ const text = event.target.value
356
+ const lastCharacter = text[text.length - 1] || ''
357
+ this.isComposing = !isKorean(lastCharacter)
358
+ },
359
+ handleCompositionEnd(event) {
360
+ if (this.isComposing) {
361
+ this.isComposing = false
362
+ this.handleInput(event)
363
+ }
364
+ },
365
+ handleInput(event) {
366
+ if (this.isComposing) return
367
+ if (event.target.value === this.nativeInputValue) return
368
+ this.$emit('input', event.target.value)
369
+ this.$nextTick(this.setNativeInputValue)
370
+ },
371
+ handleChange(event) {
372
+ this.$emit('change', event.target.value)
373
+ },
374
+ handleKeyUpEnter() {
375
+ this.$emit('key-up-enter')
376
+ },
377
+ calcIconOffset(place) {
378
+ let elList = [].slice.call(this.$el.querySelectorAll(`.base-input__${place}`) || [])
379
+ if (!elList.length) return
380
+ let el = null
381
+ for (let i = 0; i < elList.length; i++) {
382
+ if (elList[i].parentNode === this.$el) {
383
+ el = elList[i];
384
+ break
385
+ }
386
+ }
387
+ if (!el) return
388
+ const pendantMap = {
389
+ suffix: 'append',
390
+ prefix: 'prepend'
391
+ }
392
+
393
+ const pendant = pendantMap[place]
394
+ if (this.$slots[pendant]) {
395
+ el.style.transform = `translateX(${place === 'suffix' ? '-' : ''}${this.$el.querySelector(`.base-input-group__${pendant}`).offsetWidth}px)`
396
+ } else {
397
+ el.removeAttribute('style')
398
+ }
399
+ },
400
+ updateIconOffset() {
401
+ this.calcIconOffset('prefix')
402
+ this.calcIconOffset('suffix')
403
+ },
404
+ clear() {
405
+ this.$emit('input', '')
406
+ this.$emit('change', '')
407
+ this.$emit('clear')
408
+ },
409
+ handlePasswordVisible() {
410
+ this.passwordVisible = !this.passwordVisible
411
+ this.focus()
412
+ },
413
+ getInput() {
414
+ return this.$refs.input || this.$refs.textarea
415
+ },
416
+ getSuffixVisible() {
417
+ return this.$slots.suffix ||
418
+ this.suffixIcon ||
419
+ this.showClear ||
420
+ this.showPassword ||
421
+ this.isWordLimitVisible ||
422
+ (this.validateState && this.needStatusIcon)
423
+ }
424
+ },
425
+ created() {
426
+ this.$on('inputSelect', this.select)
427
+ this.$on('clearError', this.focus)
428
+ },
429
+ mounted() {
430
+ this.setNativeInputValue()
431
+ this.resizeTextarea()
432
+ this.updateIconOffset()
433
+ },
434
+ updated() {
435
+ this.$nextTick(this.updateIconOffset)
436
+ }
437
+ }
438
+ </script>