evui 3.3.36 → 3.3.39

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 (141) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +40 -40
  3. package/dist/evui.common.js +1907 -1832
  4. package/dist/evui.common.js.map +1 -1
  5. package/dist/evui.umd.js +1907 -1832
  6. package/dist/evui.umd.js.map +1 -1
  7. package/dist/evui.umd.min.js +1 -1
  8. package/dist/evui.umd.min.js.map +1 -1
  9. package/dist/img/{EVUI.7f3588fb.svg → EVUI.b82ee81a.svg} +292 -292
  10. package/dist/img/{icon_mysql.7ea26d5d.svg → icon_mysql.1085fdc9.svg} +78 -78
  11. package/dist/img/{icon_oracle.9009b108.svg → icon_oracle.0572d3ee.svg} +13 -13
  12. package/dist/img/{icon_postgresql.f8fffba9.svg → icon_postgresql.ee12bde8.svg} +58 -58
  13. package/package.json +61 -61
  14. package/src/common/emitter.js +20 -20
  15. package/src/common/utils.debounce.js +223 -223
  16. package/src/common/utils.js +134 -134
  17. package/src/common/utils.table.js +78 -78
  18. package/src/common/utils.throttle.js +83 -83
  19. package/src/common/utils.tree.js +18 -18
  20. package/src/components/button/Button.vue +198 -198
  21. package/src/components/button/index.js +7 -7
  22. package/src/components/buttonGroup/ButtonGroup.vue +11 -11
  23. package/src/components/buttonGroup/index.js +7 -7
  24. package/src/components/calendar/Calendar.vue +661 -661
  25. package/src/components/calendar/index.js +7 -7
  26. package/src/components/calendar/uses.js +1272 -1272
  27. package/src/components/chart/Chart.vue +189 -192
  28. package/src/components/chart/chart.core.js +870 -870
  29. package/src/components/chart/element/element.bar.js +524 -524
  30. package/src/components/chart/element/element.bar.time.js +156 -156
  31. package/src/components/chart/element/element.heatmap.js +533 -533
  32. package/src/components/chart/element/element.line.js +339 -339
  33. package/src/components/chart/element/element.pie.js +197 -197
  34. package/src/components/chart/element/element.scatter.js +184 -184
  35. package/src/components/chart/element/element.tip.js +550 -542
  36. package/src/components/chart/helpers/helpers.canvas.js +265 -265
  37. package/src/components/chart/helpers/helpers.constant.js +206 -206
  38. package/src/components/chart/helpers/helpers.util.js +346 -338
  39. package/src/components/chart/index.js +9 -9
  40. package/src/components/chart/model/index.js +4 -4
  41. package/src/components/chart/model/model.series.js +93 -93
  42. package/src/components/chart/model/model.store.js +977 -967
  43. package/src/components/chart/plugins/plugins.interaction.js +769 -769
  44. package/src/components/chart/plugins/plugins.legend.gradient.js +602 -602
  45. package/src/components/chart/plugins/plugins.legend.js +1155 -1151
  46. package/src/components/chart/plugins/plugins.pie.js +254 -254
  47. package/src/components/chart/plugins/plugins.title.js +56 -56
  48. package/src/components/chart/plugins/plugins.tooltip.js +692 -692
  49. package/src/components/chart/scale/scale.js +848 -848
  50. package/src/components/chart/scale/scale.linear.js +38 -38
  51. package/src/components/chart/scale/scale.logarithmic.js +128 -128
  52. package/src/components/chart/scale/scale.step.js +336 -336
  53. package/src/components/chart/scale/scale.time.category.js +277 -277
  54. package/src/components/chart/scale/scale.time.js +48 -48
  55. package/src/components/chart/style/chart.scss +312 -312
  56. package/src/components/chart/uses.js +264 -252
  57. package/src/components/checkbox/Checkbox.vue +200 -200
  58. package/src/components/checkbox/index.js +7 -7
  59. package/src/components/checkboxGroup/CheckboxGroup.vue +44 -44
  60. package/src/components/checkboxGroup/index.js +7 -7
  61. package/src/components/contextMenu/ContextMenu.vue +80 -80
  62. package/src/components/contextMenu/MenuList.vue +149 -149
  63. package/src/components/contextMenu/index.js +7 -7
  64. package/src/components/contextMenu/uses.js +203 -203
  65. package/src/components/datePicker/DatePicker.vue +437 -437
  66. package/src/components/datePicker/index.js +7 -7
  67. package/src/components/datePicker/uses.js +419 -419
  68. package/src/components/grid/Grid.vue +827 -827
  69. package/src/components/grid/grid.filter.window.vue +493 -493
  70. package/src/components/grid/grid.pagination.vue +75 -75
  71. package/src/components/grid/grid.summary.vue +265 -265
  72. package/src/components/grid/grid.toolbar.vue +26 -26
  73. package/src/components/grid/index.js +11 -11
  74. package/src/components/grid/style/grid.scss +263 -263
  75. package/src/components/grid/uses.js +1002 -1007
  76. package/src/components/icon/Icon.vue +49 -49
  77. package/src/components/icon/index.js +8 -8
  78. package/src/components/inputNumber/InputNumber.vue +212 -212
  79. package/src/components/inputNumber/index.js +7 -7
  80. package/src/components/inputNumber/uses.js +217 -217
  81. package/src/components/loading/Loading.vue +125 -125
  82. package/src/components/loading/index.js +7 -7
  83. package/src/components/menu/Menu.vue +68 -68
  84. package/src/components/menu/MenuItem.vue +187 -187
  85. package/src/components/menu/index.js +7 -7
  86. package/src/components/message/Message.vue +223 -223
  87. package/src/components/message/index.js +31 -31
  88. package/src/components/messageBox/MessageBox.vue +358 -358
  89. package/src/components/messageBox/index.js +22 -22
  90. package/src/components/notification/Notification.vue +316 -316
  91. package/src/components/notification/index.js +49 -49
  92. package/src/components/pagination/Pagination.vue +271 -271
  93. package/src/components/pagination/index.js +7 -7
  94. package/src/components/pagination/pageButton.vue +30 -30
  95. package/src/components/progress/Progress.vue +139 -139
  96. package/src/components/progress/index.js +7 -7
  97. package/src/components/radio/Radio.vue +159 -159
  98. package/src/components/radio/index.js +7 -7
  99. package/src/components/radioGroup/RadioGroup.vue +41 -41
  100. package/src/components/radioGroup/index.js +7 -7
  101. package/src/components/scheduler/Scheduler.vue +149 -149
  102. package/src/components/scheduler/index.js +7 -7
  103. package/src/components/scheduler/uses.js +183 -183
  104. package/src/components/select/Select.vue +440 -440
  105. package/src/components/select/index.js +7 -7
  106. package/src/components/select/uses.js +270 -270
  107. package/src/components/slider/Slider.vue +505 -505
  108. package/src/components/slider/index.js +7 -7
  109. package/src/components/slider/uses.js +390 -390
  110. package/src/components/tabPanel/TabPanel.vue +74 -74
  111. package/src/components/tabPanel/index.js +7 -7
  112. package/src/components/tabs/Tabs.vue +517 -517
  113. package/src/components/tabs/index.js +7 -7
  114. package/src/components/textField/TextField.vue +375 -375
  115. package/src/components/textField/index.js +7 -7
  116. package/src/components/timePicker/TimePicker.vue +352 -352
  117. package/src/components/timePicker/index.js +7 -7
  118. package/src/components/toggle/Toggle.vue +115 -115
  119. package/src/components/toggle/index.js +7 -7
  120. package/src/components/tree/Tree.vue +313 -313
  121. package/src/components/tree/TreeNode.vue +293 -293
  122. package/src/components/tree/index.js +7 -7
  123. package/src/components/treeGrid/TreeGrid.vue +758 -758
  124. package/src/components/treeGrid/TreeGridNode.vue +275 -275
  125. package/src/components/treeGrid/index.js +9 -9
  126. package/src/components/treeGrid/style/treeGrid.scss +261 -261
  127. package/src/components/treeGrid/treeGrid.toolbar.vue +26 -26
  128. package/src/components/treeGrid/uses.js +867 -867
  129. package/src/components/window/Window.vue +329 -329
  130. package/src/components/window/index.js +7 -7
  131. package/src/components/window/uses.js +899 -899
  132. package/src/directives/clickoutside.js +90 -90
  133. package/src/main.js +116 -116
  134. package/src/style/components/input.scss +108 -108
  135. package/src/style/functions.scss +3 -3
  136. package/src/style/index.scss +6 -6
  137. package/src/style/lib/fonts/EVUI.svg +292 -292
  138. package/src/style/lib/icon.css +888 -888
  139. package/src/style/mixins.scss +94 -94
  140. package/src/style/themes.scss +67 -67
  141. package/src/style/variables.scss +22 -22
@@ -1,437 +1,437 @@
1
- <template>
2
- <div
3
- ref="datePicker"
4
- v-clickoutside="clickOutsideDropbox"
5
- class="ev-date-picker"
6
- :class="{
7
- disabled : $props.disabled,
8
- }"
9
- >
10
- <div
11
- ref="datePickerWrapper"
12
- class="ev-date-picker__wrapper"
13
- >
14
- <template v-if="$props.mode === 'date' || $props.mode === 'dateTime'">
15
- <span class="ev-date-picker-prefix-icon">
16
- <i class="ev-icon-calendar" />
17
- </span>
18
- <input
19
- v-model.trim="currentValue"
20
- type="text"
21
- class="ev-input"
22
- :placeholder="$props.placeholder"
23
- :disabled="$props.disabled"
24
- @click="clickSelectInput"
25
- @keydown.enter.prevent="validateValue(currentValue)"
26
- @change="validateValue(currentValue)"
27
- />
28
- </template>
29
- <template v-else>
30
- <div
31
- class="ev-date-picker-tag-wrapper"
32
- @click="clickSelectInput"
33
- >
34
- <span class="ev-date-picker-prefix-icon">
35
- <i class="ev-icon-calendar" />
36
- </span>
37
- <input
38
- type="text"
39
- class="ev-input readonly"
40
- readonly
41
- :placeholder="$props.placeholder"
42
- :disabled="$props.disabled"
43
- />
44
- <template
45
- v-if="$props.mode === 'dateMulti'
46
- && ($props.options.multiType === 'date' || !$props.options.tagShorten)"
47
- >
48
- <div
49
- v-for="(item, idx) in mv"
50
- :key="`${item}_${idx}`"
51
- class="ev-select-tag"
52
- :class="{ num: $props.options.multiType !== 'date' }"
53
- >
54
- <span class="ev-tag-name"> {{ item }} </span>
55
- <span
56
- v-if="$props.options.multiType === 'date'"
57
- class="ev-tag-suffix"
58
- @click.stop="[removeMv(item), changeDropboxPosition()]"
59
- >
60
- <i class="ev-tag-suffix-close ev-icon-error" />
61
- </span>
62
- </div>
63
- </template>
64
- <template v-else>
65
- <div
66
- v-if="mv[0]"
67
- class="ev-select-tag num"
68
- >
69
- <span class="ev-tag-name"> {{ mv[0] }} </span>
70
- </div>
71
- <template v-if="mv[mv.length - 1]">
72
- <div class="ev-select-tag num">
73
- <span class="ev-tag-name"> ~ </span>
74
- </div>
75
- <div class="ev-select-tag num">
76
- <span class="ev-tag-name"> {{ mv[mv.length - 1] }} </span>
77
- </div>
78
- </template>
79
- </template>
80
- </div>
81
- </template>
82
- <template v-if="$props.clearable">
83
- <span
84
- v-show="isClearableIcon"
85
- class="ev-input-suffix"
86
- @click.stop="[removeAllMv(), clickOutsideDropbox()]"
87
- >
88
- <i class="ev-icon-error" />
89
- </span>
90
- </template>
91
- <div class="ev-date-picker-dropbox-wrapper">
92
- <div
93
- v-if="isDropbox"
94
- ref="dropbox"
95
- class="ev-date-picker-dropdown"
96
- :class="$props.mode"
97
- :style="dropboxPosition"
98
- >
99
- <div
100
- v-if="usedShortcuts.length"
101
- class="ev-date-picker-dropbox__button-layout"
102
- >
103
- <ev-button
104
- v-if="usedShortcuts.length === 1"
105
- :type="usedShortcuts[0].isActive ? 'primary' : 'default'"
106
- @click="clickShortcut(usedShortcuts[0].key)"
107
- >
108
- {{ usedShortcuts[0].label }}
109
- </ev-button>
110
- <ev-button-group v-else>
111
- <ev-button
112
- v-for="button in usedShortcuts"
113
- :key="button.key"
114
- :type="button.isActive ? 'primary' : 'default'"
115
- @click="clickShortcut(button.key)"
116
- >
117
- {{ button.label }}
118
- </ev-button>
119
- </ev-button-group>
120
- </div>
121
- <div
122
- v-if="usedShortcuts.length"
123
- class="ev-date-picker-dropbox__divider"
124
- />
125
- <div
126
- :class="{ 'ev-date-picker-dropbox__calendar':usedShortcuts.length }"
127
- >
128
- <ev-calendar
129
- key="fromCalendar"
130
- v-model="mv"
131
- :mode="$props.mode"
132
- :month-notation="$props.monthNotation"
133
- :day-of-the-week-notation="$props.dayOfTheWeekNotation"
134
- :options="$props.options"
135
- />
136
- </div>
137
- </div>
138
- </div>
139
- </div>
140
- </div>
141
- </template>
142
-
143
- <script>
144
- import { datePickerClickoutside as clickoutside } from '@/directives/clickoutside';
145
- import { useModel, useDropdown, useShortcuts } from './uses';
146
-
147
- export default {
148
- name: 'EvDatePicker',
149
- directives: {
150
- clickoutside,
151
- },
152
- props: {
153
- modelValue: {
154
- type: [String, Array],
155
- default: '',
156
- validator: (value) => {
157
- const dateReg = new RegExp(/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/);
158
- const dateTimeReg = new RegExp(/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]/);
159
- if (Array.isArray(value)) {
160
- return value.every(v => !!(!v
161
- || (v.length === 10 && dateReg.exec(v)))
162
- || (v.length === 19 && dateTimeReg.exec(v)));
163
- }
164
- return !!(!value
165
- || (value.length === 10 && dateReg.exec(value))
166
- || (value.length === 19 && dateTimeReg.exec(value)));
167
- },
168
- },
169
- placeholder: {
170
- type: String,
171
- default: '',
172
- },
173
- disabled: {
174
- type: Boolean,
175
- default: false,
176
- },
177
- clearable: {
178
- type: Boolean,
179
- default: false,
180
- },
181
- mode: {
182
- type: String,
183
- default: 'date',
184
- validator: value => ['date', 'dateTime', 'dateMulti', 'dateRange', 'dateTimeRange']
185
- .indexOf(value) !== -1,
186
- },
187
- monthNotation: {
188
- type: String,
189
- default: 'fullName',
190
- validator: value => ['fullName', 'abbrName', 'numberName', 'korName']
191
- .indexOf(value) !== -1,
192
- },
193
- dayOfTheWeekNotation: {
194
- type: String,
195
- default: 'abbrUpperName',
196
- validator: value => ['abbrUpperName', 'abbrLowerName', 'abbrPascalName', 'abbrKorName']
197
- .indexOf(value) !== -1,
198
- },
199
- options: {
200
- type: Object,
201
- default: () => ({
202
- type: 'date',
203
- limit: 1,
204
- tagShorten: false,
205
- }),
206
- validator: ({ multiType, multiDayLimit, disabledDate, tagShorten, timeFormat }) => {
207
- const timeReg = new RegExp(/(HH|2[0-3]|[01][0-9]):(mm|[0-5][0-9]):(ss|[0-5][0-9])/);
208
- return (multiType ? ['weekday', 'week', 'date'].indexOf(multiType) !== -1 : true)
209
- && (multiDayLimit ? typeof multiDayLimit === 'number' && multiDayLimit > 0 : true)
210
- && (disabledDate ? (typeof disabledDate === 'function' || Array.isArray(disabledDate)) : true)
211
- && (tagShorten !== undefined ? typeof tagShorten === 'boolean' : true)
212
- && Array.isArray(timeFormat)
213
- ? timeFormat.every(v => !!(!v || timeReg.exec(v)))
214
- : !!(!timeFormat || (timeReg.exec(timeFormat)));
215
- },
216
- },
217
- shortcuts: {
218
- type: Array,
219
- default: () => [],
220
- validator: (value) => {
221
- if (!value.length) {
222
- return true;
223
- }
224
- return value.every(({ shortcutDate }) => {
225
- if (typeof shortcutDate !== 'function') {
226
- return false;
227
- }
228
- const date = shortcutDate();
229
- return (Array.isArray(date) && date.every(d => d instanceof Date) && date[0] <= date[1])
230
- || (typeof date === 'object' && date instanceof Date);
231
- });
232
- },
233
- },
234
- },
235
- emits: {
236
- 'update:modelValue': [Array, String],
237
- },
238
- setup() {
239
- const {
240
- mv,
241
- currentValue,
242
- isClearableIcon,
243
- validateValue,
244
- removeAllMv,
245
- changeMv,
246
- removeMv,
247
- } = useModel();
248
-
249
- const {
250
- isDropbox,
251
- datePicker,
252
- datePickerWrapper,
253
- dropbox,
254
- itemWrapper,
255
- dropboxPosition,
256
- clickSelectInput,
257
- clickOutsideDropbox,
258
- changeDropboxPosition,
259
- } = useDropdown();
260
-
261
- const {
262
- usedShortcuts,
263
- clickShortcut,
264
- setActiveShortcut,
265
- } = useShortcuts({
266
- mv,
267
- currentValue,
268
- clickOutsideDropbox,
269
- });
270
-
271
- setActiveShortcut();
272
-
273
- return {
274
- mv,
275
- currentValue,
276
- isClearableIcon,
277
- validateValue,
278
- removeAllMv,
279
- changeMv,
280
- removeMv,
281
-
282
- isDropbox,
283
- datePicker,
284
- datePickerWrapper,
285
- dropbox,
286
- itemWrapper,
287
- dropboxPosition,
288
- clickSelectInput,
289
- clickOutsideDropbox,
290
- changeDropboxPosition,
291
-
292
- usedShortcuts,
293
- clickShortcut,
294
- };
295
- },
296
- };
297
- </script>
298
-
299
- <style lang="scss">
300
- @import '../../style/index.scss';
301
-
302
- .ev-date-picker {
303
- $select-height: $input-default-height;
304
- display: block;
305
- position: relative;
306
- width: 100%;
307
-
308
- @import '../../style/components/input.scss';
309
-
310
- &__wrapper {
311
- position: relative;
312
- min-height: $select-height;
313
- }
314
-
315
- .ev-input {
316
- $calendar-icon-width: 30px;
317
- position: absolute;
318
- left: 0;
319
- height: 100%;
320
- padding: 0 $input-default-padding 0 $calendar-icon-width;
321
-
322
- &.readonly {
323
- cursor: pointer;
324
- }
325
- }
326
-
327
- @include state('disabled') {
328
- .ev-input {
329
- cursor: not-allowed;
330
- }
331
- }
332
-
333
- .ev-input-suffix {
334
- display: flex;
335
- position: absolute;
336
- top: 0;
337
- right: 5px;
338
- height: 100%;
339
- align-items: center;
340
- cursor: pointer;
341
- &:hover {
342
- color: #409EFF;
343
- }
344
- }
345
-
346
- .ev-date-picker-tag-wrapper {
347
- display: flex;
348
- width: 100%;
349
- height: 100%;
350
- min-height: $select-height;
351
- padding: 3px 30px 3px 30px;
352
- flex-wrap: wrap;
353
- align-items: center;
354
- }
355
- }
356
-
357
- .ev-date-picker-prefix-icon {
358
- display: flex;
359
- position: absolute;
360
- top: 0;
361
- left: 8px;
362
- height: 100%;
363
- align-items: center;
364
- color: #C2C5CD;
365
- }
366
-
367
- .ev-date-picker-dropdown {
368
- position: absolute;
369
- top: 0;
370
- left: 0;
371
- background-color: white;
372
- border: 1px solid #E4E7ED;
373
- color: #606266;
374
- box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
375
- border-radius: 4px;
376
- box-sizing: content-box;
377
- z-index: 100;
378
- }
379
-
380
- .ev-select-tag {
381
- display: flex;
382
- position: relative;
383
- height: 24px;
384
- padding: 0 19px 0 8px;
385
- margin: 2px 0 2px 6px;
386
- background-color: #F4F4F5;
387
- align-items: center;
388
- border: 1px solid #E9E9EB;
389
- border-radius: 4px;
390
- color: #909399;
391
- font-size: $font-size-base;
392
- cursor: auto;
393
-
394
- &.num {
395
- padding-right: 8px;
396
- cursor: pointer;
397
- }
398
-
399
- .ev-tag-suffix {
400
- display: flex;
401
- position: absolute;
402
- top: 0;
403
- right: 3px;
404
- height: 100%;
405
- align-items: center;
406
- color: #0D0D0D;
407
- cursor: pointer;
408
-
409
- &:hover {
410
- color: #409EFF;
411
- }
412
- }
413
- }
414
-
415
- .ev-date-picker-dropbox {
416
- &-wrapper {
417
- height: 0;
418
- z-index: 100;
419
- }
420
-
421
- &__button-layout {
422
- margin: 5px;
423
- }
424
-
425
- &__divider {
426
- width: 100%;
427
- height: 2px;
428
- margin: 8px 0;
429
- background-color: #E5E5E5;
430
- }
431
-
432
- &__calendar {
433
- height: 100%;
434
- margin: 5px;
435
- }
436
- }
437
- </style>
1
+ <template>
2
+ <div
3
+ ref="datePicker"
4
+ v-clickoutside="clickOutsideDropbox"
5
+ class="ev-date-picker"
6
+ :class="{
7
+ disabled : $props.disabled,
8
+ }"
9
+ >
10
+ <div
11
+ ref="datePickerWrapper"
12
+ class="ev-date-picker__wrapper"
13
+ >
14
+ <template v-if="$props.mode === 'date' || $props.mode === 'dateTime'">
15
+ <span class="ev-date-picker-prefix-icon">
16
+ <i class="ev-icon-calendar" />
17
+ </span>
18
+ <input
19
+ v-model.trim="currentValue"
20
+ type="text"
21
+ class="ev-input"
22
+ :placeholder="$props.placeholder"
23
+ :disabled="$props.disabled"
24
+ @click="clickSelectInput"
25
+ @keydown.enter.prevent="validateValue(currentValue)"
26
+ @change="validateValue(currentValue)"
27
+ />
28
+ </template>
29
+ <template v-else>
30
+ <div
31
+ class="ev-date-picker-tag-wrapper"
32
+ @click="clickSelectInput"
33
+ >
34
+ <span class="ev-date-picker-prefix-icon">
35
+ <i class="ev-icon-calendar" />
36
+ </span>
37
+ <input
38
+ type="text"
39
+ class="ev-input readonly"
40
+ readonly
41
+ :placeholder="$props.placeholder"
42
+ :disabled="$props.disabled"
43
+ />
44
+ <template
45
+ v-if="$props.mode === 'dateMulti'
46
+ && ($props.options.multiType === 'date' || !$props.options.tagShorten)"
47
+ >
48
+ <div
49
+ v-for="(item, idx) in mv"
50
+ :key="`${item}_${idx}`"
51
+ class="ev-select-tag"
52
+ :class="{ num: $props.options.multiType !== 'date' }"
53
+ >
54
+ <span class="ev-tag-name"> {{ item }} </span>
55
+ <span
56
+ v-if="$props.options.multiType === 'date'"
57
+ class="ev-tag-suffix"
58
+ @click.stop="[removeMv(item), changeDropboxPosition()]"
59
+ >
60
+ <i class="ev-tag-suffix-close ev-icon-error" />
61
+ </span>
62
+ </div>
63
+ </template>
64
+ <template v-else>
65
+ <div
66
+ v-if="mv[0]"
67
+ class="ev-select-tag num"
68
+ >
69
+ <span class="ev-tag-name"> {{ mv[0] }} </span>
70
+ </div>
71
+ <template v-if="mv[mv.length - 1]">
72
+ <div class="ev-select-tag num">
73
+ <span class="ev-tag-name"> ~ </span>
74
+ </div>
75
+ <div class="ev-select-tag num">
76
+ <span class="ev-tag-name"> {{ mv[mv.length - 1] }} </span>
77
+ </div>
78
+ </template>
79
+ </template>
80
+ </div>
81
+ </template>
82
+ <template v-if="$props.clearable">
83
+ <span
84
+ v-show="isClearableIcon"
85
+ class="ev-input-suffix"
86
+ @click.stop="[removeAllMv(), clickOutsideDropbox()]"
87
+ >
88
+ <i class="ev-icon-error" />
89
+ </span>
90
+ </template>
91
+ <div class="ev-date-picker-dropbox-wrapper">
92
+ <div
93
+ v-if="isDropbox"
94
+ ref="dropbox"
95
+ class="ev-date-picker-dropdown"
96
+ :class="$props.mode"
97
+ :style="dropboxPosition"
98
+ >
99
+ <div
100
+ v-if="usedShortcuts.length"
101
+ class="ev-date-picker-dropbox__button-layout"
102
+ >
103
+ <ev-button
104
+ v-if="usedShortcuts.length === 1"
105
+ :type="usedShortcuts[0].isActive ? 'primary' : 'default'"
106
+ @click="clickShortcut(usedShortcuts[0].key)"
107
+ >
108
+ {{ usedShortcuts[0].label }}
109
+ </ev-button>
110
+ <ev-button-group v-else>
111
+ <ev-button
112
+ v-for="button in usedShortcuts"
113
+ :key="button.key"
114
+ :type="button.isActive ? 'primary' : 'default'"
115
+ @click="clickShortcut(button.key)"
116
+ >
117
+ {{ button.label }}
118
+ </ev-button>
119
+ </ev-button-group>
120
+ </div>
121
+ <div
122
+ v-if="usedShortcuts.length"
123
+ class="ev-date-picker-dropbox__divider"
124
+ />
125
+ <div
126
+ :class="{ 'ev-date-picker-dropbox__calendar':usedShortcuts.length }"
127
+ >
128
+ <ev-calendar
129
+ key="fromCalendar"
130
+ v-model="mv"
131
+ :mode="$props.mode"
132
+ :month-notation="$props.monthNotation"
133
+ :day-of-the-week-notation="$props.dayOfTheWeekNotation"
134
+ :options="$props.options"
135
+ />
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </template>
142
+
143
+ <script>
144
+ import { datePickerClickoutside as clickoutside } from '@/directives/clickoutside';
145
+ import { useModel, useDropdown, useShortcuts } from './uses';
146
+
147
+ export default {
148
+ name: 'EvDatePicker',
149
+ directives: {
150
+ clickoutside,
151
+ },
152
+ props: {
153
+ modelValue: {
154
+ type: [String, Array],
155
+ default: '',
156
+ validator: (value) => {
157
+ const dateReg = new RegExp(/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/);
158
+ const dateTimeReg = new RegExp(/[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]/);
159
+ if (Array.isArray(value)) {
160
+ return value.every(v => !!(!v
161
+ || (v.length === 10 && dateReg.exec(v)))
162
+ || (v.length === 19 && dateTimeReg.exec(v)));
163
+ }
164
+ return !!(!value
165
+ || (value.length === 10 && dateReg.exec(value))
166
+ || (value.length === 19 && dateTimeReg.exec(value)));
167
+ },
168
+ },
169
+ placeholder: {
170
+ type: String,
171
+ default: '',
172
+ },
173
+ disabled: {
174
+ type: Boolean,
175
+ default: false,
176
+ },
177
+ clearable: {
178
+ type: Boolean,
179
+ default: false,
180
+ },
181
+ mode: {
182
+ type: String,
183
+ default: 'date',
184
+ validator: value => ['date', 'dateTime', 'dateMulti', 'dateRange', 'dateTimeRange']
185
+ .indexOf(value) !== -1,
186
+ },
187
+ monthNotation: {
188
+ type: String,
189
+ default: 'fullName',
190
+ validator: value => ['fullName', 'abbrName', 'numberName', 'korName']
191
+ .indexOf(value) !== -1,
192
+ },
193
+ dayOfTheWeekNotation: {
194
+ type: String,
195
+ default: 'abbrUpperName',
196
+ validator: value => ['abbrUpperName', 'abbrLowerName', 'abbrPascalName', 'abbrKorName']
197
+ .indexOf(value) !== -1,
198
+ },
199
+ options: {
200
+ type: Object,
201
+ default: () => ({
202
+ type: 'date',
203
+ limit: 1,
204
+ tagShorten: false,
205
+ }),
206
+ validator: ({ multiType, multiDayLimit, disabledDate, tagShorten, timeFormat }) => {
207
+ const timeReg = new RegExp(/(HH|2[0-3]|[01][0-9]):(mm|[0-5][0-9]):(ss|[0-5][0-9])/);
208
+ return (multiType ? ['weekday', 'week', 'date'].indexOf(multiType) !== -1 : true)
209
+ && (multiDayLimit ? typeof multiDayLimit === 'number' && multiDayLimit > 0 : true)
210
+ && (disabledDate ? (typeof disabledDate === 'function' || Array.isArray(disabledDate)) : true)
211
+ && (tagShorten !== undefined ? typeof tagShorten === 'boolean' : true)
212
+ && Array.isArray(timeFormat)
213
+ ? timeFormat.every(v => !!(!v || timeReg.exec(v)))
214
+ : !!(!timeFormat || (timeReg.exec(timeFormat)));
215
+ },
216
+ },
217
+ shortcuts: {
218
+ type: Array,
219
+ default: () => [],
220
+ validator: (value) => {
221
+ if (!value.length) {
222
+ return true;
223
+ }
224
+ return value.every(({ shortcutDate }) => {
225
+ if (typeof shortcutDate !== 'function') {
226
+ return false;
227
+ }
228
+ const date = shortcutDate();
229
+ return (Array.isArray(date) && date.every(d => d instanceof Date) && date[0] <= date[1])
230
+ || (typeof date === 'object' && date instanceof Date);
231
+ });
232
+ },
233
+ },
234
+ },
235
+ emits: {
236
+ 'update:modelValue': [Array, String],
237
+ },
238
+ setup() {
239
+ const {
240
+ mv,
241
+ currentValue,
242
+ isClearableIcon,
243
+ validateValue,
244
+ removeAllMv,
245
+ changeMv,
246
+ removeMv,
247
+ } = useModel();
248
+
249
+ const {
250
+ isDropbox,
251
+ datePicker,
252
+ datePickerWrapper,
253
+ dropbox,
254
+ itemWrapper,
255
+ dropboxPosition,
256
+ clickSelectInput,
257
+ clickOutsideDropbox,
258
+ changeDropboxPosition,
259
+ } = useDropdown();
260
+
261
+ const {
262
+ usedShortcuts,
263
+ clickShortcut,
264
+ setActiveShortcut,
265
+ } = useShortcuts({
266
+ mv,
267
+ currentValue,
268
+ clickOutsideDropbox,
269
+ });
270
+
271
+ setActiveShortcut();
272
+
273
+ return {
274
+ mv,
275
+ currentValue,
276
+ isClearableIcon,
277
+ validateValue,
278
+ removeAllMv,
279
+ changeMv,
280
+ removeMv,
281
+
282
+ isDropbox,
283
+ datePicker,
284
+ datePickerWrapper,
285
+ dropbox,
286
+ itemWrapper,
287
+ dropboxPosition,
288
+ clickSelectInput,
289
+ clickOutsideDropbox,
290
+ changeDropboxPosition,
291
+
292
+ usedShortcuts,
293
+ clickShortcut,
294
+ };
295
+ },
296
+ };
297
+ </script>
298
+
299
+ <style lang="scss">
300
+ @import '../../style/index.scss';
301
+
302
+ .ev-date-picker {
303
+ $select-height: $input-default-height;
304
+ display: block;
305
+ position: relative;
306
+ width: 100%;
307
+
308
+ @import '../../style/components/input.scss';
309
+
310
+ &__wrapper {
311
+ position: relative;
312
+ min-height: $select-height;
313
+ }
314
+
315
+ .ev-input {
316
+ $calendar-icon-width: 30px;
317
+ position: absolute;
318
+ left: 0;
319
+ height: 100%;
320
+ padding: 0 $input-default-padding 0 $calendar-icon-width;
321
+
322
+ &.readonly {
323
+ cursor: pointer;
324
+ }
325
+ }
326
+
327
+ @include state('disabled') {
328
+ .ev-input {
329
+ cursor: not-allowed;
330
+ }
331
+ }
332
+
333
+ .ev-input-suffix {
334
+ display: flex;
335
+ position: absolute;
336
+ top: 0;
337
+ right: 5px;
338
+ height: 100%;
339
+ align-items: center;
340
+ cursor: pointer;
341
+ &:hover {
342
+ color: #409EFF;
343
+ }
344
+ }
345
+
346
+ .ev-date-picker-tag-wrapper {
347
+ display: flex;
348
+ width: 100%;
349
+ height: 100%;
350
+ min-height: $select-height;
351
+ padding: 3px 30px 3px 30px;
352
+ flex-wrap: wrap;
353
+ align-items: center;
354
+ }
355
+ }
356
+
357
+ .ev-date-picker-prefix-icon {
358
+ display: flex;
359
+ position: absolute;
360
+ top: 0;
361
+ left: 8px;
362
+ height: 100%;
363
+ align-items: center;
364
+ color: #C2C5CD;
365
+ }
366
+
367
+ .ev-date-picker-dropdown {
368
+ position: absolute;
369
+ top: 0;
370
+ left: 0;
371
+ background-color: white;
372
+ border: 1px solid #E4E7ED;
373
+ color: #606266;
374
+ box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
375
+ border-radius: 4px;
376
+ box-sizing: content-box;
377
+ z-index: 100;
378
+ }
379
+
380
+ .ev-select-tag {
381
+ display: flex;
382
+ position: relative;
383
+ height: 24px;
384
+ padding: 0 19px 0 8px;
385
+ margin: 2px 0 2px 6px;
386
+ background-color: #F4F4F5;
387
+ align-items: center;
388
+ border: 1px solid #E9E9EB;
389
+ border-radius: 4px;
390
+ color: #909399;
391
+ font-size: $font-size-base;
392
+ cursor: auto;
393
+
394
+ &.num {
395
+ padding-right: 8px;
396
+ cursor: pointer;
397
+ }
398
+
399
+ .ev-tag-suffix {
400
+ display: flex;
401
+ position: absolute;
402
+ top: 0;
403
+ right: 3px;
404
+ height: 100%;
405
+ align-items: center;
406
+ color: #0D0D0D;
407
+ cursor: pointer;
408
+
409
+ &:hover {
410
+ color: #409EFF;
411
+ }
412
+ }
413
+ }
414
+
415
+ .ev-date-picker-dropbox {
416
+ &-wrapper {
417
+ height: 0;
418
+ z-index: 100;
419
+ }
420
+
421
+ &__button-layout {
422
+ margin: 5px;
423
+ }
424
+
425
+ &__divider {
426
+ width: 100%;
427
+ height: 2px;
428
+ margin: 8px 0;
429
+ background-color: #E5E5E5;
430
+ }
431
+
432
+ &__calendar {
433
+ height: 100%;
434
+ margin: 5px;
435
+ }
436
+ }
437
+ </style>