@webitel/ui-sdk 24.12.120 → 24.12.122

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 (76) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/ui-sdk.js +1 -1
  3. package/dist/ui-sdk.umd.cjs +1 -1
  4. package/package.json +1 -1
  5. package/src/api/clients/caseCloseReasonGroups/caseCloseReasonGroups.js +130 -0
  6. package/src/api/clients/caseCloseReasons/caseCloseReasons.js +130 -0
  7. package/src/api/clients/casePriorities/casePriorities.js +130 -0
  8. package/src/api/clients/caseServiceCatalogs/service-catalogs.js +198 -0
  9. package/src/api/clients/caseServices/services.js +174 -0
  10. package/src/api/clients/caseSources/caseSources.js +138 -0
  11. package/src/api/clients/caseStatusConditions/caseStatusConditions.js +167 -0
  12. package/src/api/clients/caseStatuses/caseStatuses.js +121 -0
  13. package/src/api/clients/contactGroups/contactGroups.js +162 -0
  14. package/src/api/clients/index.js +16 -0
  15. package/src/api/clients/slaConditions/slaConditions.js +167 -0
  16. package/src/api/clients/slas/slas.js +129 -0
  17. package/src/locale/en/en.js +104 -30
  18. package/src/locale/ru/ru.js +105 -31
  19. package/src/locale/ua/ua.js +105 -31
  20. package/src/modules/Filters/v2/filters/components/config/dynamic-filter-config-form.vue +3 -2
  21. package/src/modules/Filters/v2/filters/components/dynamic-filter-search.vue +69 -0
  22. package/src/modules/Filters/v2/filters/components/values/_shared/date-time-filter/date-time-filter-value-field.vue +53 -0
  23. package/src/modules/Filters/v2/filters/components/values/actual-reaction-time/actual-reaction-time-filter-value-field.vue +18 -0
  24. package/src/modules/Filters/v2/filters/components/values/actual-reaction-time/actual-reaction-time-filter-value-preview.vue +42 -0
  25. package/src/modules/Filters/v2/filters/components/values/actual-resolution-time/actual-resolution-time-filter-value-field.vue +18 -0
  26. package/src/modules/Filters/v2/filters/components/values/actual-resolution-time/actual-resolution-time-filter-value-preview.vue +42 -0
  27. package/src/modules/Filters/v2/filters/components/values/assignee/assignee-filter-value-field.vue +74 -0
  28. package/src/modules/Filters/v2/filters/components/values/assignee/assignee-filter-value-preview.vue +40 -0
  29. package/src/modules/Filters/v2/filters/components/values/assignee/config.js +4 -0
  30. package/src/modules/Filters/v2/filters/components/values/author/author-filter-value-field.vue +56 -0
  31. package/src/modules/Filters/v2/filters/components/values/author/author-filter-value-preview.vue +32 -0
  32. package/src/modules/Filters/v2/filters/components/values/author/config.js +4 -0
  33. package/src/modules/Filters/v2/filters/components/values/close-reason-groups-case/close-reason-groups-case-filter-value-field.vue +99 -0
  34. package/src/modules/Filters/v2/filters/components/values/close-reason-groups-case/close-reason-groups-case-filter-value-preview.vue +32 -0
  35. package/src/modules/Filters/v2/filters/components/values/close-reason-groups-case/config.js +6 -0
  36. package/src/modules/Filters/v2/filters/components/values/contact-group/config.js +4 -0
  37. package/src/modules/Filters/v2/filters/components/values/contact-group/contact-group-filter-value-field.vue +74 -0
  38. package/src/modules/Filters/v2/filters/components/values/contact-group/contact-group-filter-value-preview.vue +43 -0
  39. package/src/modules/Filters/v2/filters/components/values/has-attachment/has-attachment-filter-value-field.vue +43 -0
  40. package/src/modules/Filters/v2/filters/components/values/has-attachment/has-attachment-filter-value-preview.vue +22 -0
  41. package/src/modules/Filters/v2/filters/components/values/has-file/has-file-filter-value-field.vue +1 -1
  42. package/src/modules/Filters/v2/filters/components/values/has-transcription/has-transcription-filter-value-field.vue +1 -1
  43. package/src/modules/Filters/v2/filters/components/values/impacted/config.js +4 -0
  44. package/src/modules/Filters/v2/filters/components/values/impacted/impacted-filter-value-field.vue +56 -0
  45. package/src/modules/Filters/v2/filters/components/values/impacted/impacted-filter-value-preview.vue +32 -0
  46. package/src/modules/Filters/v2/filters/components/values/index.js +77 -5
  47. package/src/modules/Filters/v2/filters/components/values/priority-case/config.js +5 -0
  48. package/src/modules/Filters/v2/filters/components/values/priority-case/priority-case-filter-value-field.vue +57 -0
  49. package/src/modules/Filters/v2/filters/components/values/priority-case/priority-case-filter-value-preview.vue +32 -0
  50. package/src/modules/Filters/v2/filters/components/values/rated/rated-filter-value-field.vue +1 -1
  51. package/src/modules/Filters/v2/filters/components/values/rating/rating-from-to-filter-value-field.vue +89 -0
  52. package/src/modules/Filters/v2/filters/components/values/rating/rating-from-to-filter-value-preview.vue +37 -0
  53. package/src/modules/Filters/v2/filters/components/values/reaction-time/reaction-time-filter-value-field.vue +18 -0
  54. package/src/modules/Filters/v2/filters/components/values/reaction-time/reaction-time-filter-value-preview.vue +42 -0
  55. package/src/modules/Filters/v2/filters/components/values/reporter/config.js +4 -0
  56. package/src/modules/Filters/v2/filters/components/values/reporter/reporter-filter-value-field.vue +56 -0
  57. package/src/modules/Filters/v2/filters/components/values/reporter/reporter-filter-value-preview.vue +32 -0
  58. package/src/modules/Filters/v2/filters/components/values/resolution-time/resolution-time-filter-value-field.vue +18 -0
  59. package/src/modules/Filters/v2/filters/components/values/resolution-time/resolution-time-filter-value-preview.vue +42 -0
  60. package/src/modules/Filters/v2/filters/components/values/service-case/config.js +6 -0
  61. package/src/modules/Filters/v2/filters/components/values/service-case/service-case-filter-value-field.vue +113 -0
  62. package/src/modules/Filters/v2/filters/components/values/service-case/service-case-filter-value-preview.vue +15 -0
  63. package/src/modules/Filters/v2/filters/components/values/sla/config.js +4 -0
  64. package/src/modules/Filters/v2/filters/components/values/sla/sla-filter-value-field.vue +57 -0
  65. package/src/modules/Filters/v2/filters/components/values/sla/sla-filter-value-preview.vue +32 -0
  66. package/src/modules/Filters/v2/filters/components/values/sla-condition/config.js +6 -0
  67. package/src/modules/Filters/v2/filters/components/values/sla-condition/sla-condition-filter-value-field.vue +98 -0
  68. package/src/modules/Filters/v2/filters/components/values/sla-condition/sla-condition-filter-value-preview.vue +37 -0
  69. package/src/modules/Filters/v2/filters/components/values/source-case/config.js +5 -0
  70. package/src/modules/Filters/v2/filters/components/values/source-case/source-case-filter-value-field.vue +57 -0
  71. package/src/modules/Filters/v2/filters/components/values/source-case/source-case-filter-value-preview.vue +32 -0
  72. package/src/modules/Filters/v2/filters/components/values/status-case/config.js +6 -0
  73. package/src/modules/Filters/v2/filters/components/values/status-case/status-case-filter-value-field.vue +99 -0
  74. package/src/modules/Filters/v2/filters/components/values/status-case/status-case-filter-value-preview.vue +37 -0
  75. package/src/modules/Filters/v2/filters/components/values/talk-duration/talk-duration-filter-value-field.vue +1 -1
  76. package/src/modules/Filters/v2/filters/components/values/total-duration/total-duration-filter-value-field.vue +1 -1
@@ -80,6 +80,8 @@ export default {
80
80
  read: 'Читать',
81
81
  create: 'Создать',
82
82
  draggable: 'Перетащить',
83
+ unassigned: 'Неназначенные',
84
+ showUnassigned: 'Показать неназначенные',
83
85
  },
84
86
  vocabulary: {
85
87
  apply: 'Применить',
@@ -151,11 +153,11 @@ export default {
151
153
  hasOption: 'Has option',
152
154
  hasRecording: 'Запись разговора',
153
155
  amdResult: 'AMD результат',
154
- evaluation: 'Оценивание',
155
156
  ratedBy: 'Оценено кем',
156
157
  talkDuration: 'Длительность разговора',
157
158
  totalDuration: 'Общая длительность',
158
159
  transcription: 'Транскрипция',
160
+ attachment: 'Вложение | Вложения',
159
161
  queue: {
160
162
  queue: 'Очередь | Очереди',
161
163
  type: {
@@ -219,6 +221,24 @@ export default {
219
221
  [ChannelType.Job]: 'Задача',
220
222
  },
221
223
  },
224
+ cases: {
225
+ status: 'Статус',
226
+ source: 'Источник',
227
+ author: 'Автор',
228
+ reporter: 'Инициатор',
229
+ impacted: 'Влияет на',
230
+ assignee: 'Исполнитель',
231
+ group: 'Группа исполнителей',
232
+ reason: 'Причина | Причины',
233
+ rating: 'Оценка',
234
+ service: 'Сервисы | Сервисы',
235
+ appliedSLA: 'Примененный SLA',
236
+ appliedCondition: 'Примененное условие',
237
+ reactionTime: 'Плановое время реакции',
238
+ resolutionTime: 'Плановое время решения',
239
+ actualReactionTime: 'Фактическое время реакции',
240
+ actualResolutionTime: 'Фактическое время решения',
241
+ },
222
242
  calls: {
223
243
  direction: {
224
244
  [CallDirection.Inbound]: 'Входящий | Входящие',
@@ -475,67 +495,121 @@ export default {
475
495
  filterLabel: ({ linked }) => {
476
496
  return linked('vocabulary.labels');
477
497
  },
478
- agent: ({ linked }) => {
498
+ actualReactionTime: ({ linked }) => {
499
+ return linked('cases.actualReactionTime');
500
+ },
501
+ actualResolutionTime: ({ linked }) => {
502
+ return linked('cases.actualResolutionTime');
503
+ },
504
+ agent : ({ linked }) => {
479
505
  return linked('objects.agent.agent');
480
506
  },
481
- amdResult: ({ linked }) => {
507
+ amdResult : ({ linked }) => {
482
508
  return linked('objects.amdResult');
483
509
  },
484
- contact: ({ linked }) => {
510
+ assignee: ({ linked }) => {
511
+ return linked('cases.assignee');
512
+ },
513
+ author: ({ linked }) => {
514
+ return linked('cases.author');
515
+ },
516
+ cause : ({ linked }) => {
517
+ return linked('objects.hangupCause');
518
+ },
519
+ closeReasonGroupsCase: ({ linked }) => {
520
+ return linked('cases.reason');
521
+ },
522
+ contact : ({ linked }) => {
485
523
  return linked('vocabulary.contact');
486
524
  },
487
- createdAtFrom: ({ linked }) => {
525
+ contactGroup: ({ linked }) => {
526
+ return linked('cases.group');
527
+ },
528
+ createdAtFrom : ({ linked }) => {
488
529
  return linked('reusable.from');
489
530
  },
490
- createdAtTo: ({ linked }) => {
531
+ createdAtTo : ({ linked }) => {
491
532
  return linked('reusable.to');
492
533
  },
493
- direction: ({ linked }) => {
494
- return linked('objects.direction');
534
+ direction : ({ linked }) => {
535
+ return linked('calls.direction');
495
536
  },
496
- rated: ({ linked }) => {
497
- return linked('objects.evaluation');
498
- },
499
- gateway: ({ linked }) => {
500
- return linked('objects.gateway');
537
+ gateway : ({ linked }) => {
538
+ return linked('vocabulary.gateway');
501
539
  },
502
- grantee: ({ linked }) => {
540
+ grantee : ({ linked }) => {
503
541
  return linked('objects.grantee');
504
542
  },
505
- cause: ({ linked }) => {
506
- return linked('objects.hangupCause');
543
+ hasAttachment: ({ linked }) => {
544
+ return linked('objects.attachment');
545
+ },
546
+ hasFile: ({ linked }) => {
547
+ return linked('objects.hasRecording');
548
+ },
549
+ hasTranscription: ({ linked }) => {
550
+ return linked('objects.transcription');
507
551
  },
508
- hasOption: ({ linked }) => {
509
- return linked('objects.hasOption'); ////
552
+ impacted: ({ linked }) => {
553
+ return linked('cases.impacted');
510
554
  },
511
- queue: ({ linked }) => {
555
+ priorityCase: ({ linked }) => {
556
+ return linked('vocabulary.priority');
557
+ },
558
+ queue : ({ linked }) => {
512
559
  return linked('objects.queue.queue');
513
560
  },
514
- hasFile: ({ linked }) => {
515
- return linked('objects.hasRecording');
561
+ rated: ({ linked }) => {
562
+ return linked('objects.rated');
563
+ },
564
+ ratedBy : ({ linked }) => {
565
+ return linked('objects.ratedBy');
566
+ },
567
+ rating: ({ linked }) => {
568
+ return linked('cases.rating');
569
+ },
570
+ reactionTime: ({ linked }) => {
571
+ return linked('cases.reactionTime');
572
+ },
573
+ reporter: ({ linked }) => {
574
+ return linked('cases.reporter');
575
+ },
576
+ resolutionTime: ({ linked }) => {
577
+ return linked('cases.resolutionTime');
516
578
  },
517
- score: ({ linked }) => {
579
+ score : ({ linked }) => {
518
580
  return linked('webitelUI.auditForm.score');
519
581
  },
520
- tags: ({ linked }) => {
582
+ serviceCase: ({ linked }) => {
583
+ return linked('cases.service');
584
+ },
585
+ sla: ({ linked }) => {
586
+ return linked('cases.appliedSLA');
587
+ },
588
+ slaCondition: ({ linked }) => {
589
+ return linked('cases.appliedCondition');
590
+ },
591
+ sourceCase: ({ linked }) => {
592
+ return linked('cases.source');
593
+ },
594
+ statusCase: ({ linked }) => {
595
+ return linked('cases.status');
596
+ },
597
+ tag : ({ linked }) => {
521
598
  return linked('vocabulary.tag');
522
599
  },
523
- talkSec: ({ linked }) => {
600
+ talkDuration: ({ linked }) => {
524
601
  return linked('objects.talkDuration');
525
602
  },
526
- team: ({ linked }) => {
603
+ team : ({ linked }) => {
527
604
  return linked('objects.team');
528
605
  },
529
- duration: ({ linked }) => {
606
+ totalDuration: ({ linked }) => {
530
607
  return linked('objects.totalDuration');
531
608
  },
532
- hasTranscription: ({ linked }) => {
533
- return linked('objects.transcription');
534
- },
535
- user: ({ linked }) => {
609
+ user : ({ linked }) => {
536
610
  return linked('objects.user');
537
611
  },
538
- variable: ({ linked }) => {
612
+ variable : ({ linked }) => {
539
613
  return linked('vocabulary.variables');
540
614
  },
541
615
  },
@@ -81,6 +81,8 @@ export default {
81
81
  read: 'Читати',
82
82
  create: 'Створити',
83
83
  draggable: 'Перетягнути',
84
+ unassigned: 'Непризначені',
85
+ showUnassigned: 'Показати непризначені',
84
86
  },
85
87
  vocabulary: {
86
88
  apply: 'Застосувати',
@@ -151,11 +153,11 @@ export default {
151
153
  hasOption: 'Has option',
152
154
  hasRecording: 'Запис розмови',
153
155
  amdResult: 'AMD результат',
154
- evaluation: 'Оцінювання',
155
156
  ratedBy: 'Оцінено ким',
156
157
  talkDuration: 'Тривалість розмови',
157
158
  totalDuration: 'Загальна тривалість',
158
159
  transcription: 'Транскрипція',
160
+ attachment: 'Додаток | Додатки',
159
161
  queue: {
160
162
  queue: 'Черга | Черги',
161
163
  type: {
@@ -225,6 +227,24 @@ export default {
225
227
  [CallDirection.Outbound]: 'Вихідний | Вихідні',
226
228
  },
227
229
  },
230
+ cases: {
231
+ status: 'Статус',
232
+ source: 'Джерело',
233
+ author: 'Автор',
234
+ reporter: 'Ініціатор',
235
+ impacted: 'Впливає на',
236
+ assignee: 'Виконавець',
237
+ group: 'Група виконавців',
238
+ reason: 'Причина | Причини',
239
+ rating: 'Оцінка',
240
+ service: 'Cервіси | Cервіси',
241
+ appliedSLA: 'Застосований SLA',
242
+ appliedCondition: 'Застосована умова',
243
+ reactionTime: 'Плановий час реакції',
244
+ resolutionTime: 'Плановий час вирішення',
245
+ actualReactionTime: 'Фактичний час реакції',
246
+ actualResolutionTime: 'Фактичний час вирішення',
247
+ },
228
248
  // describes Webitel FRONTEND applications + their navs
229
249
  WebitelApplications: {
230
250
  [WebitelApplications.AGENT]: { name: 'Agent Workspace' },
@@ -475,67 +495,121 @@ export default {
475
495
  filterLabel: ({ linked }) => {
476
496
  return linked('vocabulary.labels');
477
497
  },
478
- agent: ({ linked }) => {
498
+ actualReactionTime: ({ linked }) => {
499
+ return linked('cases.actualReactionTime');
500
+ },
501
+ actualResolutionTime: ({ linked }) => {
502
+ return linked('cases.actualResolutionTime');
503
+ },
504
+ agent : ({ linked }) => {
479
505
  return linked('objects.agent.agent');
480
506
  },
481
- amdResult: ({ linked }) => {
507
+ amdResult : ({ linked }) => {
482
508
  return linked('objects.amdResult');
483
509
  },
484
- contact: ({ linked }) => {
510
+ assignee: ({ linked }) => {
511
+ return linked('cases.assignee');
512
+ },
513
+ author: ({ linked }) => {
514
+ return linked('cases.author');
515
+ },
516
+ cause : ({ linked }) => {
517
+ return linked('objects.hangupCause');
518
+ },
519
+ closeReasonGroupsCase: ({ linked }) => {
520
+ return linked('cases.reason');
521
+ },
522
+ contact : ({ linked }) => {
485
523
  return linked('vocabulary.contact');
486
524
  },
487
- createdAtFrom: ({ linked }) => {
525
+ contactGroup: ({ linked }) => {
526
+ return linked('cases.group');
527
+ },
528
+ createdAtFrom : ({ linked }) => {
488
529
  return linked('reusable.from');
489
530
  },
490
- createdAtTo: ({ linked }) => {
531
+ createdAtTo : ({ linked }) => {
491
532
  return linked('reusable.to');
492
533
  },
493
- direction: ({ linked }) => {
494
- return linked('objects.direction');
534
+ direction : ({ linked }) => {
535
+ return linked('calls.direction');
495
536
  },
496
- rated: ({ linked }) => {
497
- return linked('objects.evaluation');
498
- },
499
- gateway: ({ linked }) => {
500
- return linked('objects.gateway');
537
+ gateway : ({ linked }) => {
538
+ return linked('vocabulary.gateway');
501
539
  },
502
- grantee: ({ linked }) => {
540
+ grantee : ({ linked }) => {
503
541
  return linked('objects.grantee');
504
542
  },
505
- cause: ({ linked }) => {
506
- return linked('objects.hangupCause');
543
+ hasAttachment: ({ linked }) => {
544
+ return linked('objects.attachment');
545
+ },
546
+ hasFile: ({ linked }) => {
547
+ return linked('objects.hasRecording');
548
+ },
549
+ hasTranscription: ({ linked }) => {
550
+ return linked('objects.transcription');
507
551
  },
508
- hasOption: ({ linked }) => {
509
- return linked('objects.hasOption'); ////
552
+ impacted: ({ linked }) => {
553
+ return linked('cases.impacted');
510
554
  },
511
- queue: ({ linked }) => {
555
+ priorityCase: ({ linked }) => {
556
+ return linked('vocabulary.priority');
557
+ },
558
+ queue : ({ linked }) => {
512
559
  return linked('objects.queue.queue');
513
560
  },
514
- hasFile: ({ linked }) => {
515
- return linked('objects.hasRecording');
561
+ rated: ({ linked }) => {
562
+ return linked('objects.rated');
563
+ },
564
+ ratedBy : ({ linked }) => {
565
+ return linked('objects.ratedBy');
566
+ },
567
+ rating: ({ linked }) => {
568
+ return linked('cases.rating');
569
+ },
570
+ reactionTime: ({ linked }) => {
571
+ return linked('cases.reactionTime');
572
+ },
573
+ reporter: ({ linked }) => {
574
+ return linked('cases.reporter');
575
+ },
576
+ resolutionTime: ({ linked }) => {
577
+ return linked('cases.resolutionTime');
516
578
  },
517
- score: ({ linked }) => {
579
+ score : ({ linked }) => {
518
580
  return linked('webitelUI.auditForm.score');
519
581
  },
520
- tags: ({ linked }) => {
582
+ serviceCase: ({ linked }) => {
583
+ return linked('cases.service');
584
+ },
585
+ sla: ({ linked }) => {
586
+ return linked('cases.appliedSLA');
587
+ },
588
+ slaCondition: ({ linked }) => {
589
+ return linked('cases.appliedCondition');
590
+ },
591
+ sourceCase: ({ linked }) => {
592
+ return linked('cases.source');
593
+ },
594
+ statusCase: ({ linked }) => {
595
+ return linked('cases.status');
596
+ },
597
+ tag : ({ linked }) => {
521
598
  return linked('vocabulary.tag');
522
599
  },
523
- talkSec: ({ linked }) => {
600
+ talkDuration: ({ linked }) => {
524
601
  return linked('objects.talkDuration');
525
602
  },
526
- team: ({ linked }) => {
603
+ team : ({ linked }) => {
527
604
  return linked('objects.team');
528
605
  },
529
- duration: ({ linked }) => {
606
+ totalDuration: ({ linked }) => {
530
607
  return linked('objects.totalDuration');
531
608
  },
532
- hasTranscription: ({ linked }) => {
533
- return linked('objects.transcription');
534
- },
535
- user: ({ linked }) => {
609
+ user : ({ linked }) => {
536
610
  return linked('objects.user');
537
611
  },
538
- variable: ({ linked }) => {
612
+ variable : ({ linked }) => {
539
613
  return linked('vocabulary.variables');
540
614
  },
541
615
  },
@@ -1,11 +1,11 @@
1
1
  <template>
2
2
  <form class="dynamic-filter-config-form">
3
3
  <wt-select
4
+ :clearable="false"
4
5
  :disabled="editMode"
5
6
  :label="t('webitelUI.filters.filterName')"
6
7
  :options="options"
7
8
  :value="filterName"
8
- :clearable="false"
9
9
  track-by="value"
10
10
  use-value-from-options-by-prop="value"
11
11
  @input="onFilterNameUpdate($event)"
@@ -101,6 +101,7 @@ const onLabelValueUpdate = (val: string) => {
101
101
  const onFilterNameUpdate = (val: string) => {
102
102
  filterName.value = val;
103
103
  filterValue.value = null;
104
+ filterLabel.value = t(`webitelUI.filters.${val}`);
104
105
  };
105
106
 
106
107
  const submit = () => {
@@ -119,7 +120,7 @@ if (props.options) {
119
120
  filterValue.value = null;
120
121
 
121
122
  if (!touchedLabel.value) {
122
- filterLabel.value = filterName.value;
123
+ filterLabel.value = t(`webitelUI.filters.${filterName.value}`);
123
124
  }
124
125
  },
125
126
  { immediate: true },
@@ -0,0 +1,69 @@
1
+ <template>
2
+ <wt-search-bar
3
+ :placeholder="t('reusable.search')"
4
+ :search-mode="props.searchMode"
5
+ :search-mode-options="searchModeOptions"
6
+ :value="model"
7
+ :v="v$.model"
8
+ @input="model = $event"
9
+ @search="handleSearch"
10
+ @update:search-mode="emit('update:search-mode', $event.value)"
11
+ >
12
+ <template
13
+ v-if="props.showTextSearchIcon"
14
+ #search-icon
15
+ >
16
+ <wt-icon icon="stt-search" />
17
+ </template>
18
+ </wt-search-bar>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import { useVuelidate } from '@vuelidate/core';
23
+ import { required } from '@vuelidate/validators';
24
+ import { computed } from 'vue';
25
+ import { useI18n } from 'vue-i18n';
26
+
27
+ import WtSearchBar from '../../../../../components/wt-search-bar/wt-search-bar.vue';
28
+
29
+ type ModelValue = string;
30
+ const model = defineModel<ModelValue>();
31
+
32
+ const props = defineProps<{
33
+ searchMode: string;
34
+ searchModeOptions: Record<string, string>;
35
+ showTextSearchIcon: boolean;
36
+ }>();
37
+
38
+ const emit = defineEmits<{
39
+ 'update:search-mode': [string];
40
+ 'handle-search': [string];
41
+ }>();
42
+
43
+ const { t } = useI18n();
44
+
45
+ const v$ = useVuelidate(
46
+ computed(() => ({
47
+ model: {
48
+ required,
49
+ },
50
+ })),
51
+ { model },
52
+ { $autoDirty: true },
53
+ );
54
+
55
+ const handleSearch = () => {
56
+ emit('handle-search', model.value);
57
+ };
58
+
59
+ const searchModeOptions = computed(() =>
60
+ Object.values(props.searchModeOptions).map((mode) => {
61
+ return {
62
+ value: mode,
63
+ text: t(`filters.search.${mode}`),
64
+ };
65
+ }),
66
+ );
67
+ </script>
68
+
69
+ <style lang="scss" scoped></style>
@@ -0,0 +1,53 @@
1
+ <template>
2
+ <div class="date-time-filter-value-field">
3
+ <wt-datepicker
4
+ :label="`${t('webitelUI.filters.createdAtFrom')}:`"
5
+ :value="model?.from"
6
+ class="date-time-filter-value-field__picker"
7
+ mode="datetime"
8
+ @input="handleInput('from', $event)"
9
+ />
10
+
11
+ <wt-datepicker
12
+ :label="`${t('webitelUI.filters.createdAtTo')}:`"
13
+ :value="model?.to"
14
+ class="date-time-filter-value-field__picker"
15
+ mode="datetime"
16
+ @input="handleInput('to', $event)"
17
+ />
18
+ </div>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import {endOfToday, startOfToday} from 'date-fns';
23
+ import {useI18n} from 'vue-i18n';
24
+ import {onMounted} from 'vue';
25
+
26
+ type ModelValue = {
27
+ from: number;
28
+ to: number;
29
+ };
30
+
31
+ const model = defineModel<ModelValue>();
32
+ const {t} = useI18n();
33
+
34
+ const handleInput = (key: keyof ModelValue, value: number) => {
35
+ model.value = { ...model.value, [key]: value};
36
+ };
37
+
38
+ const initModel = () => {
39
+ if (!model.value) {
40
+ model.value = {from: startOfToday().getTime(), to: endOfToday().getTime()};
41
+ }
42
+ };
43
+
44
+ onMounted(() => initModel());
45
+ </script>
46
+
47
+ <style lang="scss" scoped>
48
+ .date-time-filter-value-field {
49
+ display: flex;
50
+ flex-direction: column;
51
+ grid-gap: var(--spacing-xs);
52
+ }
53
+ </style>
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <date-time-filter-value-field
3
+ :model-value="model"
4
+ @update:model-value="model = $event"
5
+ />
6
+ </template>
7
+
8
+ <script lang="ts" setup>
9
+ import DateTimeFilterValueField from '../_shared/date-time-filter/date-time-filter-value-field.vue';
10
+
11
+ type ModelValue = {
12
+ from: number;
13
+ to: number;
14
+ };
15
+ const model = defineModel<ModelValue>();
16
+ </script>
17
+
18
+ <style lang="scss" scoped></style>
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <div class="actual-reaction-time-filter-value-preview">
3
+ <div v-if="props.value.from">
4
+ <p class="actual-reaction-time-filter-value-preview__title">
5
+ {{t('reusable.from')}}
6
+ </p>
7
+
8
+ <span>{{convertTimestampToDate(props.value.from)}}</span>
9
+ </div>
10
+
11
+ <div v-if="props.value.to">
12
+ <p class="actual-reaction-time-filter-value-preview__title">
13
+ {{t('reusable.to')}}
14
+ </p>
15
+
16
+ <span>{{convertTimestampToDate(props.value.to)}}</span>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import {useI18n} from "vue-i18n";
23
+ import { format } from "date-fns";
24
+
25
+ const props = defineProps<{
26
+ value: number[];
27
+ }>();
28
+
29
+ const { t } = useI18n();
30
+
31
+ function convertTimestampToDate(value) {
32
+ return format(new Date(value), 'dd.MM.yyyy HH:mm');
33
+ }
34
+ </script>
35
+
36
+ <style lang="scss" scoped>
37
+ .actual-reaction-time-filter-value-preview {
38
+ &__title {
39
+ @extend %typo-subtitle-1;
40
+ }
41
+ }
42
+ </style>
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <date-time-filter-value-field
3
+ :model-value="model"
4
+ @update:model-value="model = $event"
5
+ />
6
+ </template>
7
+
8
+ <script lang="ts" setup>
9
+ import DateTimeFilterValueField from '../_shared/date-time-filter/date-time-filter-value-field.vue';
10
+
11
+ type ModelValue = {
12
+ from: number;
13
+ to: number;
14
+ };
15
+ const model = defineModel<ModelValue>();
16
+ </script>
17
+
18
+ <style lang="scss" scoped></style>
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <div class="actual-resolution-time-filter-value-preview">
3
+ <div v-if="props.value.from">
4
+ <p class="actual-resolution-time-filter-value-preview__title">
5
+ {{t('reusable.from')}}
6
+ </p>
7
+
8
+ <span>{{convertTimestampToDate(props.value.from)}}</span>
9
+ </div>
10
+
11
+ <div v-if="props.value.to">
12
+ <p class="actual-resolution-time-filter-value-preview__title">
13
+ {{t('reusable.to')}}
14
+ </p>
15
+
16
+ <span>{{convertTimestampToDate(props.value.to)}}</span>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import {useI18n} from "vue-i18n";
23
+ import {format} from "date-fns";
24
+
25
+ const props = defineProps<{
26
+ value: number[];
27
+ }>();
28
+
29
+ const { t } = useI18n();
30
+
31
+ function convertTimestampToDate(value) {
32
+ return format(new Date(value), 'dd.MM.yyyy HH:mm');
33
+ }
34
+ </script>
35
+
36
+ <style lang="scss" scoped>
37
+ .actual-resolution-time-filter-value-preview {
38
+ &__title {
39
+ @extend %typo-subtitle-1;
40
+ }
41
+ }
42
+ </style>