mediacube-ui 0.1.346 → 0.1.347

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 (108) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/0.mediacube-ui.umd.js +50 -0
  3. package/dist/assets/img/icons.3b7d59b2f49c67a2a3a4566b8ab233fd.svg +1 -0
  4. package/dist/assets/img/no_table_data.236cd56f46cfb71fc363b008d4ca70d5.png +0 -0
  5. package/dist/assets/img/no_user.e0030d6e54e2400e1181fd22b83cf8ae.png +0 -0
  6. package/dist/mediacube-ui.umd.js +1 -0
  7. package/package.json +14 -16
  8. package/src/assets/tokens/tokens.json +5 -0
  9. package/dist/mediacube-ui.common.js +0 -378
  10. package/src/elements/McAvatar/McAvatar.vue +0 -274
  11. package/src/elements/McBadge/McBadge.vue +0 -148
  12. package/src/elements/McButton/McButton.vue +0 -841
  13. package/src/elements/McChip/McChip.vue +0 -300
  14. package/src/elements/McCropper/McCropper.vue +0 -133
  15. package/src/elements/McDate/McDate.vue +0 -105
  16. package/src/elements/McDatePicker/McDatePicker.vue +0 -902
  17. package/src/elements/McField/McFieldCheckbox/McFieldCheckbox.vue +0 -332
  18. package/src/elements/McField/McFieldRadio/McFieldRadioButton/McFieldRadioButton.vue +0 -201
  19. package/src/elements/McField/McFieldRadio/McFieldRadioGroup/McFieldRadioGroup.vue +0 -194
  20. package/src/elements/McField/McFieldSelect/McFieldSelect.vue +0 -1087
  21. package/src/elements/McField/McFieldText/McFieldText.vue +0 -969
  22. package/src/elements/McField/McFieldToggle/McFieldToggle.vue +0 -268
  23. package/src/elements/McInfinityLoadingIndicator/McInfinityLoadingIndicator.vue +0 -97
  24. package/src/elements/McNotification/McNotification.vue +0 -209
  25. package/src/elements/McProgress/McProgress.vue +0 -218
  26. package/src/elements/McRangeSlider/McRangeSlider.vue +0 -195
  27. package/src/elements/McSeparator/McSeparator.vue +0 -143
  28. package/src/elements/McSlideUpDown/McSlideUpDown.vue +0 -157
  29. package/src/elements/McSvgIcon/McSvgIcon.vue +0 -127
  30. package/src/elements/McTabs/McTab/McTab.vue +0 -187
  31. package/src/elements/McTabs/McTabs/McTabs.vue +0 -531
  32. package/src/elements/McTitle/McTitle.vue +0 -365
  33. package/src/elements/McTooltip/McTooltip.vue +0 -334
  34. package/src/helpers/consts.js +0 -3
  35. package/src/helpers/delayedAction.js +0 -26
  36. package/src/helpers/storybookFunctions.js +0 -20
  37. package/src/helpers/storybookVariables.js +0 -24
  38. package/src/mixins/equalFieldHeight.js +0 -59
  39. package/src/mixins/fieldErrors.js +0 -28
  40. package/src/patterns/McAccordion/McAccordion.vue +0 -53
  41. package/src/patterns/McCells/McCell/McCell.vue +0 -101
  42. package/src/patterns/McChat/McChat.vue +0 -305
  43. package/src/patterns/McChat/McChatComment/McChatComment.vue +0 -265
  44. package/src/patterns/McChat/McChatForm/McChatForm.vue +0 -147
  45. package/src/patterns/McCollapse/McCollapse.vue +0 -280
  46. package/src/patterns/McDrawer/McDrawer.vue +0 -146
  47. package/src/patterns/McDropdown/McDropdown.vue +0 -247
  48. package/src/patterns/McDropdown/McDropdownPanel/McDropdownPanel.vue +0 -40
  49. package/src/patterns/McFakeScroll/McFakeScroll.vue +0 -277
  50. package/src/patterns/McFilter/McFilter.vue +0 -847
  51. package/src/patterns/McFilter/McFilterChip/McFilterChip.vue +0 -83
  52. package/src/patterns/McFilter/McFilterTags/McFilterTags.vue +0 -374
  53. package/src/patterns/McFilter/McFilterTypeDate/McFilterTypeDate.vue +0 -70
  54. package/src/patterns/McFilter/McFilterTypeRange/McFilterTypeRange.vue +0 -132
  55. package/src/patterns/McFilter/McFilterTypeRelation/McFilterTypeRelation.vue +0 -221
  56. package/src/patterns/McFilter/McFilterTypeSimple/McFilterTypeSimple.vue +0 -161
  57. package/src/patterns/McFilter/McFilterTypeText/McFilterTypeText.vue +0 -62
  58. package/src/patterns/McGrid/McGridCol/McGridCol.vue +0 -165
  59. package/src/patterns/McGrid/McGridRow/McGridRow.vue +0 -158
  60. package/src/patterns/McModal/McModal.vue +0 -680
  61. package/src/patterns/McOverlay/McOverlay.vue +0 -78
  62. package/src/patterns/McPreview/McPreview.vue +0 -118
  63. package/src/patterns/McSideBar/McSideBar/McSideBar.vue +0 -387
  64. package/src/patterns/McSideBar/McSideBarBottom/McSideBarBottom.vue +0 -125
  65. package/src/patterns/McSideBar/McSideBarButton/McSideBarButton.vue +0 -252
  66. package/src/patterns/McSideBar/McSideBarCenter/McSideBarCenter.vue +0 -367
  67. package/src/patterns/McSideBar/McSideBarTop/McSideBarTop.vue +0 -238
  68. package/src/patterns/McStack/McStack.vue +0 -158
  69. package/src/patterns/McTable/McTable/McTable.vue +0 -854
  70. package/src/patterns/McTable/McTableCol/McTableCol.vue +0 -296
  71. package/src/patterns/McTableCard/McTableCard.vue +0 -135
  72. package/src/patterns/McTableCard/McTableCardHeader/McTableCardHeader.vue +0 -74
  73. package/src/patterns/McTopBar/McTopBar.vue +0 -153
  74. package/src/patterns/McWrapScroll/McWrapScroll.vue +0 -291
  75. package/src/styles/_functions.scss +0 -187
  76. package/src/styles/_mixins.scss +0 -612
  77. package/src/styles/_spacing.scss +0 -33
  78. package/src/styles/_variables.scss +0 -23
  79. package/src/styles/global.scss +0 -308
  80. package/src/styles/main.scss +0 -4
  81. package/src/styles/table.scss +0 -10
  82. package/src/styles/toast.scss +0 -55
  83. package/src/templates/layouts/McContentFixed/McContentFixed.vue +0 -60
  84. package/src/templates/layouts/McMain/McMain.vue +0 -115
  85. package/src/templates/layouts/McRoot/McRoot.vue +0 -45
  86. package/src/tokens/animations.scss +0 -9
  87. package/src/tokens/border-radius.scss +0 -26
  88. package/src/tokens/box-shadows.scss +0 -28
  89. package/src/tokens/colors.scss +0 -82
  90. package/src/tokens/durations.scss +0 -7
  91. package/src/tokens/easings.scss +0 -6
  92. package/src/tokens/font-families.scss +0 -8
  93. package/src/tokens/font-sizes.scss +0 -23
  94. package/src/tokens/font-weights.scss +0 -9
  95. package/src/tokens/gradients.scss +0 -19
  96. package/src/tokens/letter-spacings.scss +0 -6
  97. package/src/tokens/line-heights.scss +0 -22
  98. package/src/tokens/media-queries.scss +0 -32
  99. package/src/tokens/opacities.scss +0 -8
  100. package/src/tokens/sizes.scss +0 -47
  101. package/src/tokens/spacings.scss +0 -38
  102. package/src/tokens/z-indexes.scss +0 -14
  103. package/src/utils/dayjs.js +0 -19
  104. package/src/utils/filters.js +0 -11
  105. package/src/utils/getTokens.js +0 -41
  106. package/src/utils/load-icons.js +0 -3
  107. package/src/utils/treeSearch.js +0 -30
  108. package/src/utils/webFontLoader.js +0 -12
@@ -1,902 +0,0 @@
1
- <template>
2
- <div ref="field" class="mc-date-picker" :class="classes">
3
- <label :for="name" class="mc-date-picker__header">
4
- <!-- @slot Слот для заголовка над инпутом -->
5
- <slot name="title">
6
- <mc-title v-if="title" :ellipsis="false" weight="medium">{{ title }}</mc-title>
7
- </slot>
8
- </label>
9
- <div class="mc-date-picker__inner">
10
- <div class="mc-date-picker__input-wrapper" :style="{ minWidth }">
11
- <mc-svg-icon
12
- v-if="!isTime && !inline"
13
- class="mc-date-picker__icon-calendar mx-icon-calendar"
14
- name="calendar"
15
- size="300"
16
- />
17
- <date-picker
18
- ref="input"
19
- :type="type"
20
- :value="prettyValue"
21
- v-bind="{ ...$attrs, range, ...valueType, ...hoursOptions, ...minutesOptions, ...secondsOptions }"
22
- class="mc-date-picker__date-picker"
23
- range-separator=" — "
24
- :confirm="$attrs.range"
25
- :input-attr="{ name, id: `${name}-id` }"
26
- :lang="lang"
27
- :placeholder="placeholder"
28
- :format="format"
29
- :editable="editable"
30
- :popup-class="popupClass"
31
- :inline="inline"
32
- :disabled-date="disabledDate"
33
- :disabled-time="disabledTime"
34
- :append-to-body="appendToBody"
35
- :clearable="clearable"
36
- v-on="listeners"
37
- @input="val => handleEmitDate(val)"
38
- @pick="handlePickDate"
39
- @clear="() => handleEmitDate(range ? [' ', ' '] : ' ')"
40
- >
41
- <div v-if="$slots.header" slot="header">
42
- <!-- @slot Слот для вставки в хедер попапа календаря -->
43
- <slot name="header" />
44
- </div>
45
- <div v-if="$slots.sidebar" slot="sidebar">
46
- <!-- @slot Слот для вставки в сайдбар попапа календаря -->
47
- <slot name="sidebar" />
48
- </div>
49
- <template v-if="isFooterVisible" v-slot:footer="{ emit }">
50
- <!-- @slot Слот для вставки в футер попапа календаря -->
51
- <slot name="footer">
52
- <div class="mc-datepicker__footer-popup">
53
- <div class="mc-datepicker__footer-popup-periods">
54
- <template v-if="customPresets && customPresets.length">
55
- <mc-button
56
- v-for="preset in customPresets"
57
- :key="preset.title"
58
- variation="black-link"
59
- secondary-color="purple"
60
- @click="handlerPreselectRange(preset.period)"
61
- >
62
- {{ preset.title }}
63
- </mc-button>
64
- </template>
65
- <template v-else>
66
- <mc-button
67
- v-if="placeholders.week"
68
- variation="black-link"
69
- secondary-color="purple"
70
- @click="selectPeriod('week')"
71
- >
72
- {{ placeholders.week }}
73
- </mc-button>
74
- <mc-button
75
- v-if="placeholders.month"
76
- variation="black-link"
77
- secondary-color="purple"
78
- @click="selectPeriod('month')"
79
- >
80
- {{ placeholders.month }}
81
- </mc-button>
82
- <mc-button
83
- v-if="placeholders.quarter"
84
- variation="black-link"
85
- secondary-color="purple"
86
- @click="selectPeriod('quarter')"
87
- >
88
- {{ placeholders.quarter }}
89
- </mc-button>
90
- <mc-button
91
- v-if="placeholders.year"
92
- variation="black-link"
93
- secondary-color="purple"
94
- @click="selectPeriod('year')"
95
- >
96
- {{ placeholders.year }}
97
- </mc-button>
98
- </template>
99
- </div>
100
- <mc-button
101
- v-if="placeholders.confirm"
102
- variation="purple-outline"
103
- size="xs"
104
- @click="() => handleSubmit(emit)"
105
- >
106
- {{ placeholders.confirm }}
107
- </mc-button>
108
- </div>
109
- </slot>
110
- </template>
111
- </date-picker>
112
- </div>
113
- </div>
114
- <div v-if="errorText || helpText || $slots.bottom" class="mc-date-picker__footer">
115
- <mc-title v-if="errorText" tag-name="div" :ellipsis="false" color="red" variation="overline">
116
- {{ errorText }}
117
- </mc-title>
118
- <br v-if="errorText" />
119
- <!-- @slot Слот для доп. текста под инпутом -->
120
- <slot name="bottom">
121
- <mc-title v-if="helpText" tag-name="div" :ellipsis="false" variation="overline">
122
- {{ helpText }}
123
- </mc-title>
124
- </slot>
125
- </div>
126
- </div>
127
- </template>
128
-
129
- <script>
130
- import { dayjs, dayjsLocales } from '../../utils/dayjs'
131
- import _isEmpty from 'lodash/isEmpty'
132
- import _omit from 'lodash/omit'
133
- import DatePicker from 'vue2-datepicker'
134
- import 'vue2-datepicker/locale/ru'
135
- import 'vue2-datepicker/locale/en'
136
- import 'vue2-datepicker/locale/es'
137
- import McTitle from '../McTitle/McTitle'
138
- import McSvgIcon from '../McSvgIcon/McSvgIcon'
139
- import McButton from '../McButton/McButton'
140
- import fieldErrors from '../../mixins/fieldErrors'
141
- import equalFieldHeight from '../../mixins/equalFieldHeight'
142
-
143
- export default {
144
- name: 'McDatePicker',
145
- components: {
146
- McSvgIcon,
147
- McTitle,
148
- DatePicker,
149
- McButton,
150
- },
151
- mixins: [fieldErrors, equalFieldHeight],
152
- props: {
153
- /**
154
- * Тип датапикера date|datetime|year|month|time|week
155
- */
156
- type: {
157
- type: String,
158
- default: 'date',
159
- },
160
- /**
161
- * Заголовок поля:
162
- */
163
- title: {
164
- type: String,
165
- default: '',
166
- },
167
-
168
- /**
169
- * Вспомогательный текст под инпутом:
170
- */
171
- helpText: {
172
- type: String,
173
- default: '',
174
- },
175
-
176
- /**
177
- * Редактируемый инпут
178
- */
179
- editable: {
180
- type: Boolean,
181
- default: false,
182
- },
183
-
184
- placeholder: {
185
- type: String,
186
- default: null,
187
- },
188
- /**
189
- * Значение
190
- */
191
- value: {
192
- default: null,
193
- },
194
-
195
- /**
196
- * Name
197
- */
198
- name: {
199
- type: String,
200
- required: true,
201
- },
202
-
203
- /**
204
- * Локаль
205
- */
206
- lang: {
207
- type: String,
208
- default: 'en',
209
- },
210
-
211
- /**
212
- * Ошибки
213
- */
214
- errors: {
215
- type: Array,
216
- default: () => [],
217
- },
218
-
219
- /**
220
- * Формат даты (как в dayjs)
221
- */
222
- format: {
223
- type: String,
224
- default: 'DD.MM.YYYY',
225
- },
226
-
227
- /**
228
- * Формат отдаваемой даты
229
- */
230
- toFormat: {
231
- type: String,
232
- default: 'YYYY-MM-DD',
233
- },
234
- /**
235
- * Отдаваемая дата будет в формате ISO String
236
- */
237
- toIsoFormat: {
238
- type: Boolean,
239
- default: false,
240
- },
241
- /**
242
- * Формат отдаваемой даты
243
- */
244
- placeholders: {
245
- type: Object,
246
- default: () => {
247
- return {
248
- week: 'Week',
249
- month: 'Month',
250
- quarter: 'Quarter',
251
- year: 'Year',
252
- confirm: 'Confirm',
253
- }
254
- },
255
- },
256
- /**
257
- * Пресеты для быстрых периодов
258
- *
259
- * [
260
- * {
261
- * title: String,
262
- * period: Array - [start_date, end_date],
263
- * },
264
- * ...
265
- * ]
266
- *
267
- **/
268
- customPresets: {
269
- type: Array,
270
- default: () => [],
271
- },
272
- range: {
273
- type: Boolean,
274
- default: false,
275
- },
276
- appendToBody: {
277
- type: Boolean,
278
- default: true,
279
- },
280
- /**
281
- * Если значение true, то датапикер отображается в открытом виде
282
- */
283
- inline: {
284
- type: Boolean,
285
- default: false,
286
- },
287
- /**
288
- * Функция проверяюая и устанавливающая доступна ли дата для выбора
289
- * Params [String] date - текущая дата
290
- * return Boolean, где true - дата заблокирована для выбора
291
- * **/
292
- disabledDate: {
293
- type: Function,
294
- // eslint-disable-next-line no-unused-vars
295
- default: date => false,
296
- },
297
- /**
298
- * Функция проверяюая и устанавливающая доступно ли время для выбора
299
- * Params [String] date - текущая дата
300
- * return Boolean, где true - время заблокировано для выбора
301
- * **/
302
- disabledTime: {
303
- type: Function,
304
- // eslint-disable-next-line no-unused-vars
305
- default: date => false,
306
- },
307
- minWidth: {
308
- type: String,
309
- default: '240px',
310
- },
311
- /**
312
- * Строго использовать переданный формат
313
- * */
314
- useFormat: {
315
- type: Boolean,
316
- default: false,
317
- },
318
- hours: {
319
- type: Array,
320
- default: () => [],
321
- },
322
- minutes: {
323
- type: Array,
324
- default: () => [],
325
- },
326
- seconds: {
327
- type: Array,
328
- default: () => [],
329
- },
330
- timezone: {
331
- type: String,
332
- default: dayjs.tz.guess(),
333
- },
334
- useTimezone: {
335
- type: Boolean,
336
- default: false,
337
- },
338
- /**
339
- * Показывать ли кретик очищения поля
340
- * */
341
- clearable: {
342
- type: Boolean,
343
- default: false,
344
- },
345
- setDefaultToday: {
346
- type: Boolean,
347
- default: true,
348
- },
349
- },
350
-
351
- data() {
352
- return {
353
- pickDate: null,
354
- phone: null,
355
- isScrolling: false,
356
- isTouchEnd: false,
357
- }
358
- },
359
- computed: {
360
- currentTimezone() {
361
- return this.timezone || 'UTC'
362
- },
363
- classes() {
364
- return {
365
- 'mc-date-picker--error': this.errorText,
366
- 'mc-date-picker--disabled': this.$attrs.disabled,
367
- }
368
- },
369
- popupClass() {
370
- return {
371
- 'datepicker-popup': true,
372
- ...(this.$attrs.popupClass || {}),
373
- }
374
- },
375
-
376
- listeners() {
377
- return _omit(this.$listeners, 'input')
378
- },
379
- isRange() {
380
- return this.range
381
- },
382
- isTime() {
383
- return this.type === 'time'
384
- },
385
- valueType() {
386
- return this.useFormat || this.useTimezone ? { 'value-type': 'format' } : {}
387
- },
388
- hoursOptions() {
389
- return this.hours && this.hours.length ? { 'hour-options': this.hours } : {}
390
- },
391
- minutesOptions() {
392
- return this.minutes && this.minutes.length ? { 'minute-options': this.minutes } : {}
393
- },
394
- secondsOptions() {
395
- return this.seconds && this.seconds.length ? { 'second-options': this.seconds } : {}
396
- },
397
- isFooterVisible() {
398
- return this.$slots.footer || (this.isRange && (this.customPresets?.length || !_isEmpty(this.placeholders)))
399
- },
400
- prettyValue() {
401
- if (!this.useTimezone) {
402
- if (this.isRange && this.value) return this.value.map(item => new Date(item))
403
- return this.useFormat || (!this.setDefaultToday && !this.value)
404
- ? this.value
405
- : this.value
406
- ? new Date(this.value)
407
- : new Date()
408
- }
409
- const formattingDate = date =>
410
- dayjs.tz(dayjs.utc(date, 'YYYY-MM-DD HH:mm:ss'), this.currentTimezone).format(this.format)
411
- if (this.isRange && this.value) {
412
- const [start_date, end_date] = this.value
413
- const prepared_value = [
414
- start_date,
415
- dayjs(end_date)
416
- .subtract(1, 'days')
417
- .format(),
418
- ]
419
- return prepared_value.map(item => formattingDate(item))
420
- }
421
- return formattingDate(this.value)
422
- },
423
- },
424
- watch: {
425
- lang: {
426
- immediate: true,
427
- handler() {
428
- this.setupDayjsLocale()
429
- this.setupDatePickerLocale()
430
- },
431
- },
432
- },
433
- mounted() {
434
- this.$el.addEventListener('touchstart', this.handleTouchStart)
435
- this.$el.addEventListener('touchend', this.handleTouchEnd)
436
- this.$el.addEventListener('touchmove', this.handleTouchMove)
437
- },
438
- beforeDestroy() {
439
- this.$el.removeEventListener('touchstart', this.handleTouchStart)
440
- this.$el.removeEventListener('touchend', this.handleTouchEnd)
441
- this.$el.removeEventListener('touchmove', this.handleTouchMove)
442
- },
443
- methods: {
444
- async setupDayjsLocale() {
445
- const locale = this.lang !== 'ar' && Object.keys(dayjsLocales).includes(this.lang) ? this.lang : 'en'
446
- await dayjsLocales[locale]?.()
447
- dayjs.locale(locale)
448
- },
449
- setupDatePickerLocale() {
450
- const locale = ['en', 'ru', 'es'].includes(this.lang) ? this.lang : 'en'
451
- DatePicker.locale(locale)
452
- },
453
- handleEmitDate(value) {
454
- const date = this.getFormattedDate(value)
455
- this.toggleErrorVisible()
456
- /**
457
- * Событие инпута
458
- * @property {string}
459
- */
460
- this.$emit('input', date)
461
- },
462
- getFormattedDate(value) {
463
- let newValue = value
464
-
465
- switch (true) {
466
- case this.toIsoFormat: {
467
- if (Array.isArray(newValue)) {
468
- return newValue.map(v => {
469
- return v?.toString?.().trim() ? dayjs(v).toISOString() : ' '
470
- })
471
- }
472
- return dayjs(value).toISOString()
473
- }
474
- case !this.useTimezone: {
475
- if (Array.isArray(newValue)) {
476
- return newValue.map(v => {
477
- return v?.toString?.().trim() ? dayjs(v).format(this.toFormat) : ' '
478
- })
479
- }
480
- return value?.toString?.().trim() ? (this.isTime ? value : dayjs(value).format(this.toFormat)) : ' '
481
- }
482
- default: {
483
- const hasDate = date => date && date?.trim()?.length
484
- const formatingDate = date =>
485
- dayjs
486
- .tz(dayjs(date, this.format).format('YYYY-MM-DD HH:mm:ss'), this.currentTimezone)
487
- .utc()
488
- .format()
489
- if (Array.isArray(newValue)) {
490
- const [start_date, end_date] = newValue
491
- if (hasDate(start_date) && hasDate(end_date))
492
- newValue = [
493
- start_date,
494
- dayjs(end_date, this.format)
495
- .add(1, 'days')
496
- .format(this.format),
497
- ]
498
- newValue = newValue.every(d => hasDate(d)) ? newValue.map(v => formatingDate(v)) : newValue
499
- } else {
500
- newValue = formatingDate(value)
501
- }
502
- return newValue
503
- }
504
- }
505
- },
506
- selectPeriod(key) {
507
- let start = new Date()
508
- const end = this.pickDate || new Date()
509
- switch (key) {
510
- case 'week':
511
- if (dayjs) {
512
- start = dayjs(end).subtract(7, 'days')
513
- break
514
- }
515
- start.setTime(end.getTime() - 6 * 24 * 3600 * 1000)
516
- break
517
- case 'month':
518
- if (dayjs) {
519
- start = dayjs(end).subtract(1, 'months')
520
- break
521
- }
522
- start.setMonth(end.getMonth() - 1, end.getDate())
523
- break
524
- case 'quarter':
525
- if (dayjs) {
526
- start = dayjs(end).subtract(3, 'months')
527
- break
528
- }
529
- start.setMonth(end.getMonth() - 3, end.getDate())
530
- break
531
- case 'year':
532
- if (dayjs) {
533
- start = dayjs(end).subtract(1, 'years')
534
- break
535
- }
536
- start.setFullYear(end.getFullYear() - 1, end.getMonth(), end.getDate())
537
- break
538
- }
539
- this.$refs.input.currentValue = [dayjs ? start.toDate() : start, end]
540
- },
541
- handlerPreselectRange(period) {
542
- const [start, end] = period
543
- this.$refs.input.currentValue = dayjs ? [dayjs(start).toDate(), dayjs(end).toDate()] : period
544
- },
545
- handlePickDate(date) {
546
- this.pickDate = date
547
- },
548
- handleSubmit(emit) {
549
- if (this.$refs.input.currentValue.every(val => this.isValidDate(val))) {
550
- emit(this.$refs.input.currentValue)
551
- this.closePopup()
552
- }
553
- },
554
- isValidDate(d) {
555
- return d instanceof Date && !isNaN(d)
556
- },
557
- closePopup() {
558
- this.$refs.input.closePopup()
559
- },
560
- handleTouchStart() {
561
- this.isScrolling = false
562
- },
563
- handleTouchMove() {
564
- this.isScrolling = true
565
- },
566
- handleTouchEnd(event) {
567
- if (!event) return
568
- if (!this.isScrolling && !this.isTouchEnd) {
569
- this.isTouchEnd = true
570
- event.preventDefault()
571
- event.stopPropagation()
572
- if (event.target.click !== undefined) {
573
- event.target.click()
574
- }
575
- this.isTouchEnd = false
576
- }
577
- },
578
- },
579
- }
580
- </script>
581
-
582
- <style lang="scss">
583
- @import '~vue2-datepicker/scss/index.scss';
584
- @import '../../styles/mixins';
585
- @import '../../tokens/font-families';
586
- @import '../../tokens/box-shadows';
587
- .mc-date-picker {
588
- $block-name: &;
589
-
590
- display: block;
591
-
592
- &__header {
593
- @include reset-text-indents();
594
- display: block;
595
- margin-bottom: $space-100;
596
-
597
- &:empty {
598
- display: none;
599
- }
600
- }
601
-
602
- &__inner {
603
- display: flex;
604
- align-items: center;
605
- }
606
-
607
- &__input-wrapper {
608
- position: relative;
609
- width: 100%;
610
- }
611
-
612
- &__footer {
613
- margin-top: $space-50;
614
-
615
- &:empty {
616
- display: none;
617
- }
618
- }
619
-
620
- &__icon {
621
- font-size: inherit;
622
- }
623
- .mx-input-wrapper {
624
- width: 100%;
625
- }
626
- .mx-input {
627
- font-family: $font-family-main;
628
- font-size: $font-size-200;
629
- line-height: $line-height-200;
630
- height: $size-500;
631
- padding: $space-100 $space-300 $space-100 36px;
632
- border-color: $color-outline-gray;
633
- border-radius: $radius-100;
634
- cursor: pointer;
635
- color: $color-black;
636
- &:hover,
637
- &:focus {
638
- border-color: $color-purple;
639
- }
640
- &::placeholder {
641
- color: $color-gray;
642
- }
643
- }
644
-
645
- &--error {
646
- .mx-input {
647
- border-color: $color-red !important;
648
- }
649
- }
650
- &--disabled {
651
- .mx-input {
652
- color: $color-outline-gray;
653
- cursor: not-allowed;
654
- background-color: $color-hover-gray;
655
- border-color: $color-outline-gray;
656
- box-shadow: none;
657
- &:hover,
658
- &:focus {
659
- border-color: $color-outline-gray;
660
- }
661
- }
662
- .mx-icon-calendar {
663
- color: $color-outline-gray;
664
- }
665
- }
666
- &__icon-calendar {
667
- position: absolute;
668
- z-index: 1;
669
- }
670
- &__date-picker {
671
- .mx-icon-calendar {
672
- display: none;
673
- }
674
- }
675
- }
676
-
677
- .mx-datepicker {
678
- width: 100%;
679
- svg {
680
- @include size($space-300);
681
- }
682
- &-inline {
683
- width: auto;
684
- }
685
- }
686
- .mx-icon-calendar {
687
- right: unset;
688
- left: $space-100;
689
- color: $color-black;
690
- }
691
-
692
- .mx-icon-clear {
693
- svg {
694
- width: $space-200;
695
- height: $space-200;
696
- }
697
- }
698
-
699
- //Фикс Бага пакета, при клике на время сначала отрабатывает ховер с появлением скроллбара
700
- //Из-за этого на айфоне требуется даблклик для выбора времени
701
- .mx-scrollbar-track {
702
- @media #{$media-mobile} {
703
- opacity: 1 !important;
704
- }
705
- }
706
-
707
- .mx-input-wrapper:hover .mx-icon-clear + .mx-icon-calendar {
708
- display: block;
709
- }
710
- .datepicker-popup {
711
- font-family: $font-family-main;
712
- border-radius: $radius-150;
713
- box-shadow: $shadow-s;
714
- z-index: 12222;
715
-
716
- @media #{$media-query-s-down} {
717
- left: $space-200 !important;
718
- right: $space-200;
719
- width: fit-content;
720
- }
721
-
722
- .mx-calendar + .mx-calendar {
723
- border-left: none;
724
- }
725
-
726
- .mx-calendar {
727
- width: 256px;
728
- padding: $space-200;
729
- font-size: $font-size-200;
730
-
731
- &-panel-date {
732
- .cell {
733
- @include size($size-400);
734
- }
735
- .mx-calendar-header {
736
- .mx-icon {
737
- &-double-right,
738
- &-double-left {
739
- display: none;
740
- }
741
- }
742
- }
743
- }
744
- &-header {
745
- line-height: $line-height-300;
746
- height: auto;
747
- margin-bottom: $space-200;
748
- > .mx-btn-text {
749
- min-width: $size-300;
750
- }
751
- &-label {
752
- font-size: $font-size-200;
753
- line-height: $line-height-200;
754
- font-weight: $font-weight-semi-bold;
755
- color: $color-black;
756
- .mx-btn-text {
757
- font-size: $font-size-200;
758
- line-height: $line-height-200;
759
- font-weight: $font-weight-semi-bold;
760
- }
761
- }
762
- .mx-btn-text {
763
- color: $color-black;
764
- &:hover {
765
- color: $color-purple;
766
- }
767
- }
768
- .mx-icon {
769
- &-left:before,
770
- &-right:before {
771
- @include size($size-150);
772
- border-width: 3px 0 0 3px;
773
- }
774
- }
775
- }
776
- &-content {
777
- height: auto;
778
- th {
779
- font-size: $font-size-200;
780
- font-weight: $font-weight-normal;
781
- color: $color-dark-gray;
782
- }
783
- }
784
- }
785
-
786
- .mx-datepicker-footer {
787
- padding: $space-150 0 $space-200 0;
788
- margin: 0 $space-200;
789
- .mc-datepicker__footer-popup {
790
- display: flex;
791
- justify-content: space-between;
792
- align-items: center;
793
- @include child-indent-right($space-200);
794
- > * {
795
- @include child-indent-right($space-300);
796
- }
797
- .mc-button {
798
- @include child-indent-right($space-zero);
799
- }
800
- }
801
- .mx-btn.mx-datepicker-btn-confirm {
802
- display: none;
803
- }
804
- }
805
-
806
- .cell {
807
- height: $space-500;
808
- color: $color-black;
809
- font-size: $font-size-200;
810
- line-height: $line-height-200;
811
- div {
812
- height: 100%;
813
- display: flex;
814
- align-items: center;
815
- justify-content: center;
816
- border-radius: $radius-100;
817
- }
818
- &:hover {
819
- color: $color-purple;
820
- background-color: fade-out($color-purple, 0.9);
821
- border-radius: $radius-100;
822
- }
823
- &.today {
824
- color: $color-purple;
825
- }
826
- &.active {
827
- color: $color-white;
828
- background-color: $color-white;
829
-
830
- div {
831
- background-color: $color-purple;
832
- height: 100%;
833
- display: flex;
834
- align-items: center;
835
- justify-content: center;
836
- box-shadow: $shadow-s;
837
- }
838
- }
839
- &.hover-in-range {
840
- background-color: rgba($color-purple, 0.1);
841
- }
842
- &.in-range {
843
- background-color: rgba($color-purple, 0.1);
844
- color: $color-black;
845
- border-radius: 0;
846
-
847
- &:hover {
848
- div {
849
- color: $color-purple;
850
- background-color: fade-out($color-purple, 0.9);
851
- border-radius: $radius-100;
852
- }
853
- }
854
-
855
- //+ .cell.active {
856
- // background-color: rgba(37, 120, 244, 0.1);
857
- // border-radius: 0 $radius-100 $radius-100 0;
858
- //}
859
- }
860
- &.not-current-month {
861
- user-select: none;
862
- pointer-events: none;
863
- color: $color-hover-gray !important;
864
- &.hover-in-range {
865
- background-color: unset;
866
- }
867
- }
868
- &.disabled {
869
- color: $color-outline-gray;
870
- border-radius: 0;
871
- background-color: $color-hover-gray;
872
- &.today {
873
- color: $color-purple;
874
- }
875
- }
876
- }
877
-
878
- .mx-time-column {
879
- .mx-time-list::after {
880
- height: 0;
881
- }
882
- }
883
-
884
- .mx-calendar-decade-separator:after {
885
- content: '-';
886
- }
887
- @at-root {
888
- html[dir='rtl'] {
889
- .mx-icon {
890
- &-double {
891
- &-right:after {
892
- left: $space-100;
893
- }
894
- &-left:before {
895
- left: -$space-100;
896
- }
897
- }
898
- }
899
- }
900
- }
901
- }
902
- </style>