@eturnity/eturnity_reusable_components 8.16.2--EPDM-14330.5 → 8.16.2--EPDM-14330.6

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 (102) hide show
  1. package/package.json +1 -1
  2. package/src/assets/svgIcons/ac_power.svg +4 -0
  3. package/src/assets/svgIcons/arrow_long_left.svg +3 -0
  4. package/src/assets/svgIcons/arrow_long_right.svg +3 -0
  5. package/src/assets/svgIcons/chassis_ground_symbol.svg +27 -0
  6. package/src/assets/svgIcons/dc_power.svg +8 -0
  7. package/src/assets/svgIcons/double_arrow_long.svg +4 -0
  8. package/src/assets/svgIcons/ed_ac.svg +3 -0
  9. package/src/assets/svgIcons/ed_acgrid.svg +4 -0
  10. package/src/assets/svgIcons/ed_arrow_both.svg +7 -0
  11. package/src/assets/svgIcons/ed_arrow_left.svg +7 -0
  12. package/src/assets/svgIcons/ed_arrow_right.svg +7 -0
  13. package/src/assets/svgIcons/ed_battery.svg +10 -0
  14. package/src/assets/svgIcons/ed_batteryacinverter.svg +16 -0
  15. package/src/assets/svgIcons/ed_batteryintegratedinverter.svg +19 -0
  16. package/src/assets/svgIcons/ed_cirquitbreaker.svg +4 -0
  17. package/src/assets/svgIcons/ed_cirquitbreaker_magnetic.svg +6 -0
  18. package/src/assets/svgIcons/ed_cirquitbreaker_thermal.svg +4 -0
  19. package/src/assets/svgIcons/ed_cirquitbreaker_thermal_magnetic.svg +5 -0
  20. package/src/assets/svgIcons/ed_consumption.svg +3 -0
  21. package/src/assets/svgIcons/ed_dc.svg +6 -0
  22. package/src/assets/svgIcons/ed_disconnector.svg +4 -0
  23. package/src/assets/svgIcons/ed_disconnector_fuse.svg +4 -0
  24. package/src/assets/svgIcons/ed_disconnector_fuse_switch.svg +4 -0
  25. package/src/assets/svgIcons/ed_disconnector_loadbreak switch.svg +4 -0
  26. package/src/assets/svgIcons/ed_disconnector_switch.svg +4 -0
  27. package/src/assets/svgIcons/ed_disconnector_switch_auto_release.svg +5 -0
  28. package/src/assets/svgIcons/ed_energymanagement_rectangle.svg +3 -0
  29. package/src/assets/svgIcons/ed_evcharger.svg +19 -0
  30. package/src/assets/svgIcons/ed_flexiblecomponent_circle.svg +3 -0
  31. package/src/assets/svgIcons/ed_flexiblecomponent_square.svg +3 -0
  32. package/src/assets/svgIcons/ed_fuse.svg +3 -0
  33. package/src/assets/svgIcons/ed_ground.svg +5 -0
  34. package/src/assets/svgIcons/ed_heatpump.svg +4 -0
  35. package/src/assets/svgIcons/ed_icon_battery.svg +9 -0
  36. package/src/assets/svgIcons/ed_icon_circle.svg +3 -0
  37. package/src/assets/svgIcons/ed_icon_heatpump.svg +3 -0
  38. package/src/assets/svgIcons/ed_icon_inverter.svg +8 -0
  39. package/src/assets/svgIcons/ed_icon_optimizer.svg +11 -0
  40. package/src/assets/svgIcons/ed_integratedbatteryinverter.svg +10 -0
  41. package/src/assets/svgIcons/ed_inverter-blank.svg +3 -0
  42. package/src/assets/svgIcons/ed_mainsconnection.svg +3 -0
  43. package/src/assets/svgIcons/ed_meter_arrowleft.svg +4 -0
  44. package/src/assets/svgIcons/ed_meter_arrowright.svg +4 -0
  45. package/src/assets/svgIcons/ed_meter_bidirectional.svg +5 -0
  46. package/src/assets/svgIcons/ed_networkandsystemprotection_double.svg +14 -0
  47. package/src/assets/svgIcons/ed_networkandsystemprotection_single.svg +7 -0
  48. package/src/assets/svgIcons/ed_pvpanel.svg +7 -0
  49. package/src/assets/svgIcons/ed_rcd.svg +5 -0
  50. package/src/assets/svgIcons/ed_rcd_simple.svg +3 -0
  51. package/src/assets/svgIcons/ed_spd.svg +6 -0
  52. package/src/assets/svgIcons/ed_stringwithoptimizer.svg +33 -0
  53. package/src/assets/svgIcons/ed_stringwithoutoptimizer.svg +17 -0
  54. package/src/assets/svgIcons/ed_transformer.svg +3 -0
  55. package/src/assets/svgIcons/filter.svg +3 -0
  56. package/src/assets/svgIcons/ground_symbol.svg +28 -0
  57. package/src/assets/svgIcons/move_left.svg +3 -0
  58. package/src/assets/svgIcons/move_right.svg +3 -0
  59. package/src/assets/svgIcons/rectangle.svg +3 -0
  60. package/src/assets/svgIcons/refresh.svg +3 -0
  61. package/src/assets/svgIcons/text_icon.svg +3 -0
  62. package/src/assets/theme.js +17 -1
  63. package/src/components/banner/infoBanner/InfoBanner.spec.js +29 -42
  64. package/src/components/barchart/BottomFields.vue +253 -0
  65. package/src/components/barchart/ChartControls.vue +113 -0
  66. package/src/components/barchart/SelectionBox.vue +150 -0
  67. package/src/components/barchart/composables/index.js +5 -0
  68. package/src/components/barchart/composables/useAxisCalculations.js +104 -0
  69. package/src/components/barchart/composables/useChartData.js +114 -0
  70. package/src/components/barchart/composables/useChartScroll.js +61 -0
  71. package/src/components/barchart/composables/useSelection.js +75 -0
  72. package/src/components/barchart/composables/useTooltip.js +100 -0
  73. package/src/components/barchart/index.vue +385 -0
  74. package/src/components/barchart/styles/bottomFields.js +66 -0
  75. package/src/components/barchart/styles/chart.js +272 -0
  76. package/src/components/barchart/styles/chartControls.js +59 -0
  77. package/src/components/buttons/buttonIcon/index.vue +5 -0
  78. package/src/components/buttons/splitButtons/index.vue +86 -0
  79. package/src/components/collapsableInfoText/index.vue +2 -2
  80. package/src/components/errorMessage/errorMessage.spec.js +34 -0
  81. package/src/components/errorMessage/errorMessage.stories.js +35 -0
  82. package/src/components/filter/filterSettings.vue +2 -0
  83. package/src/components/filterComponent/viewFilter.vue +577 -0
  84. package/src/components/filterComponent/viewSort.vue +10 -5
  85. package/src/components/icon/index.vue +32 -9
  86. package/src/components/infoText/index.vue +2 -2
  87. package/src/components/infoText/infoText.spec.js +6 -1
  88. package/src/components/inputs/inputNumber/index.vue +14 -2
  89. package/src/components/inputs/searchInput/index.vue +18 -2
  90. package/src/components/inputs/select/index.vue +108 -19
  91. package/src/components/inputs/select/option/index.vue +5 -0
  92. package/src/components/modals/actionModal/actionModal.spec.js +52 -0
  93. package/src/components/modals/actionModal/actionModal.stories.js +53 -0
  94. package/src/components/modals/actionModal/index.vue +6 -6
  95. package/src/components/modals/infoModal/index.vue +49 -19
  96. package/src/components/modals/infoModal/infoModal.spec.js +55 -0
  97. package/src/components/modals/infoModal/infoModal.stories.js +47 -0
  98. package/src/components/modals/modal/index.vue +16 -5
  99. package/src/components/pageSubtitle/PageSubtitle.stories.js +0 -1
  100. package/src/helpers/isObjectEqual.js +22 -0
  101. package/src/helpers/translateLang.js +95 -24
  102. package/src/main.js +1 -0
@@ -0,0 +1,577 @@
1
+ <template>
2
+ <PageContainer>
3
+ <ButtonIcon
4
+ ref="buttonIcon"
5
+ class="button-icon"
6
+ fill-type="stroke"
7
+ icon-name="filter"
8
+ :text="$gettext('filter')"
9
+ type="filter"
10
+ @click="toggleOptions"
11
+ />
12
+ <ButtonWrapper v-if="isOptionsVisible">
13
+ <BoxContainer ref="boxContainer" class="box-container">
14
+ <BoxTitle>{{ $gettext('filter') }}</BoxTitle>
15
+ <SortOptionsContainer>
16
+ <template v-if="selectedSort.length > 0">
17
+ <SortDropdownContainer
18
+ v-for="(item, index) in selectedSort"
19
+ :key="index"
20
+ >
21
+ <LeadingText>{{ $gettext('where') }}</LeadingText>
22
+ <SelectComponent
23
+ ref="selectSortDropdown"
24
+ align-items="vertical"
25
+ class="sort-dropdown"
26
+ :dropdown-auto-close="false"
27
+ select-height="40px"
28
+ @click.stop
29
+ @input-change="
30
+ onSelectFilter({
31
+ type: 'column',
32
+ value: $event,
33
+ index: index,
34
+ })
35
+ "
36
+ >
37
+ <template #selector>
38
+ <SelectedText>{{
39
+ getSelectedLabel({
40
+ type: 'column',
41
+ value: item.column,
42
+ index,
43
+ }) || $gettext('category')
44
+ }}</SelectedText>
45
+ </template>
46
+ <template #dropdown>
47
+ <SelectOption
48
+ v-for="category in filterCategories"
49
+ :key="category.name"
50
+ :value="category.name"
51
+ >
52
+ {{ $gettext(category.text) }}
53
+ </SelectOption>
54
+ </template>
55
+ </SelectComponent>
56
+ <SelectComponent
57
+ ref="selectSortDropdown"
58
+ align-items="vertical"
59
+ class="sort-dropdown"
60
+ :disabled="!item.column"
61
+ :dropdown-auto-close="false"
62
+ select-height="40px"
63
+ @click.stop
64
+ @input-change="
65
+ onSelectFilter({
66
+ type: 'constraint',
67
+ value: $event,
68
+ index: index,
69
+ })
70
+ "
71
+ >
72
+ <template #selector>
73
+ <SelectedText>{{
74
+ getSelectedLabel({
75
+ type: 'constraint',
76
+ value: item.constraint,
77
+ index,
78
+ }) || $gettext('constraint')
79
+ }}</SelectedText>
80
+ </template>
81
+ <template #dropdown>
82
+ <SelectOption
83
+ v-for="(item, index) in constraintOptions(index)"
84
+ :key="item.value"
85
+ :value="item.value"
86
+ >
87
+ {{ item.label }}
88
+ </SelectOption>
89
+ </template>
90
+ </SelectComponent>
91
+ <template v-if="item.column === 'updated'">
92
+ <DatePickerContainer>
93
+ <VueDatePicker
94
+ :auto-apply="true"
95
+ :clearable="true"
96
+ :disabled="!item.constraint"
97
+ :enable-time-picker="false"
98
+ :format="datePickerFormat"
99
+ :input-class-name="'dp-input'"
100
+ :locale="datePickerLocale"
101
+ model-type="format"
102
+ :model-value="item.selectedDate"
103
+ :placeholder="$gettext('Select')"
104
+ :range="false"
105
+ :single-picker="true"
106
+ text-input
107
+ @update:model-value="
108
+ onSelectFilter({
109
+ type: 'selectedDate',
110
+ value: $event,
111
+ index: index,
112
+ constraint: item.constraint,
113
+ })
114
+ "
115
+ />
116
+ </DatePickerContainer>
117
+ </template>
118
+ <SelectComponent
119
+ v-else
120
+ ref="selectSortDropdown"
121
+ align-items="vertical"
122
+ class="sort-dropdown"
123
+ :disabled="!item.column || !item.constraint"
124
+ :dropdown-auto-close="false"
125
+ :is-searchable="false"
126
+ option-width="max-content"
127
+ select-height="40px"
128
+ @click.stop
129
+ @input-change="
130
+ onSelectFilter({
131
+ type: 'selectedOptions',
132
+ value: $event,
133
+ index: index,
134
+ })
135
+ "
136
+ >
137
+ <template #selector>
138
+ <SelectedText>{{
139
+ getSelectedLabel({
140
+ type: 'selectedOptions',
141
+ value: item.constraint,
142
+ index,
143
+ }) || $gettext('Options')
144
+ }}</SelectedText>
145
+ </template>
146
+ <template #dropdown>
147
+ <OptionsContainer class="options-container">
148
+ <SelectOption
149
+ v-for="option in optionsList(index)"
150
+ :key="option.value"
151
+ :value="option.value"
152
+ @click="
153
+ onSelectFilter({
154
+ type: 'selectedOptions',
155
+ value: option.value,
156
+ index: index,
157
+ })
158
+ "
159
+ >
160
+ <RcCheckbox
161
+ :is-checked="
162
+ selectedSort[index].selectedOptions?.includes(
163
+ option.value
164
+ )
165
+ "
166
+ :label="$gettext(option.label)"
167
+ size="small"
168
+ @on-event-handler="
169
+ onSelectFilter({
170
+ type: 'selectedOptions',
171
+ value: option.value,
172
+ index: index,
173
+ })
174
+ "
175
+ />
176
+ </SelectOption>
177
+ </OptionsContainer>
178
+ </template>
179
+ </SelectComponent>
180
+ <IconContainer>
181
+ <RCIcon
182
+ :color="theme.semanticColors.teal[800]"
183
+ cursor="pointer"
184
+ name="close"
185
+ size="14px"
186
+ @click.stop="removeItem(index)"
187
+ />
188
+ </IconContainer>
189
+ </SortDropdownContainer>
190
+ </template>
191
+ <template v-else>
192
+ <SortDropdownContainer>
193
+ <LeadingText>{{ $gettext('where') }}</LeadingText>
194
+ <SelectComponent
195
+ ref="selectSortDropdown"
196
+ align-items="vertical"
197
+ class="sort-dropdown"
198
+ :dropdown-auto-close="false"
199
+ select-height="40px"
200
+ @click.stop
201
+ @input-change="
202
+ onSelectFilter({
203
+ type: 'column',
204
+ value: $event,
205
+ index: 0,
206
+ })
207
+ "
208
+ >
209
+ <template #selector>
210
+ <SelectedText>{{ $gettext('category') }}</SelectedText>
211
+ </template>
212
+ <template #dropdown>
213
+ <SelectOption
214
+ v-for="item in filterCategories"
215
+ :key="item.name"
216
+ :value="item.name"
217
+ >
218
+ {{ $gettext(item.text) }}
219
+ </SelectOption>
220
+ </template>
221
+ </SelectComponent>
222
+ <SelectComponent
223
+ ref="selectSortDropdown"
224
+ align-items="vertical"
225
+ class="sort-dropdown"
226
+ :disabled="true"
227
+ :dropdown-auto-close="false"
228
+ select-height="40px"
229
+ @click.stop
230
+ >
231
+ <template #selector>
232
+ <SelectedText>{{ $gettext('constraint') }}</SelectedText>
233
+ </template>
234
+ </SelectComponent>
235
+ <SelectComponent
236
+ ref="selectSortDropdown"
237
+ align-items="vertical"
238
+ class="sort-dropdown"
239
+ :disabled="true"
240
+ :dropdown-auto-close="false"
241
+ select-height="40px"
242
+ @click.stop
243
+ >
244
+ <template #selector>
245
+ <SelectedText>{{ $gettext('Options') }}</SelectedText>
246
+ </template>
247
+ </SelectComponent>
248
+ </SortDropdownContainer>
249
+ </template>
250
+ </SortOptionsContainer>
251
+ <BottomContainer>
252
+ <PlaceholderText>{{ $gettext('where') }}</PlaceholderText>
253
+ <ButtonIcon
254
+ icon-name="plus_button"
255
+ :text="$gettext('add_filter')"
256
+ type="ghost"
257
+ @click="onAddFilter"
258
+ />
259
+ </BottomContainer>
260
+ </BoxContainer>
261
+ </ButtonWrapper>
262
+ </PageContainer>
263
+ </template>
264
+
265
+ <script>
266
+ import styled from 'vue3-styled-components'
267
+ import theme from '../../assets/theme'
268
+ import ButtonIcon from '../buttons/buttonIcon/index.vue'
269
+ import SelectComponent from '../inputs/select/index.vue'
270
+ import SelectOption from '../inputs/select/option/index.vue'
271
+ import RcCheckbox from '../inputs/checkbox/index.vue'
272
+ import RCIcon from '../icon'
273
+ import VueDatePicker from '@vuepic/vue-datepicker'
274
+ import { datePickerLang, getDateFormat } from '../../helpers/translateLang'
275
+
276
+ const PageContainer = styled.div``
277
+
278
+ const ButtonWrapper = styled.div`
279
+ position: relative;
280
+ `
281
+
282
+ const BoxContainer = styled.div`
283
+ position: absolute;
284
+ z-index: 99;
285
+ top: 8px;
286
+ left: 50%;
287
+ transform: translateX(-50%);
288
+ width: max-content;
289
+ max-width: calc(100vw - 32px);
290
+ background-color: ${(props) => props.theme.colors.white};
291
+ border: 1px solid ${(props) => props.theme.semanticColors.grey[300]};
292
+ border-radius: 4px;
293
+ padding: 24px;
294
+ `
295
+
296
+ const BoxTitle = styled.div`
297
+ font-size: 14px;
298
+ font-weight: 500;
299
+ color: ${(props) => props.theme.semanticColors.teal[800]};
300
+ margin-bottom: 16px;
301
+ `
302
+
303
+ const SortOptionsContainer = styled.div`
304
+ display: flex;
305
+ flex-direction: column;
306
+ gap: 16px;
307
+ white-space: nowrap;
308
+ `
309
+
310
+ const SortDropdownContainer = styled.div`
311
+ display: grid;
312
+ grid-template-columns: auto repeat(3, 1fr) auto;
313
+ grid-gap: 8px;
314
+ align-items: center;
315
+ `
316
+
317
+ const SelectedText = styled.div`
318
+ font-size: 14px;
319
+ font-weight: 400;
320
+ color: ${(props) => props.theme.semanticColors.grey[800]};
321
+ `
322
+
323
+ const IconContainer = styled.div`
324
+ margin-left: 12px;
325
+ `
326
+
327
+ const LeadingText = styled.div`
328
+ font-size: 14px;
329
+ font-weight: 400;
330
+ color: ${(props) => props.theme.semanticColors.teal[800]};
331
+ `
332
+
333
+ const BottomContainer = styled.div`
334
+ display: flex;
335
+ margin-top: 16px;
336
+ `
337
+
338
+ const PlaceholderText = styled.div`
339
+ visibility: hidden;
340
+ `
341
+
342
+ const OptionsContainer = styled.div`
343
+ width: max-content;
344
+ display: flex;
345
+ flex-direction: column;
346
+ `
347
+
348
+ const DatePickerContainer = styled.div`
349
+ height: 40px;
350
+ display: flex;
351
+ align-items: center;
352
+ min-width: 150px;
353
+ `
354
+
355
+ export default {
356
+ name: 'ViewSettings',
357
+ components: {
358
+ PageContainer,
359
+ ButtonIcon,
360
+ ButtonWrapper,
361
+ BoxContainer,
362
+ BoxTitle,
363
+ SortOptionsContainer,
364
+ SortDropdownContainer,
365
+ SelectComponent,
366
+ SelectOption,
367
+ SelectedText,
368
+ RCIcon,
369
+ IconContainer,
370
+ LeadingText,
371
+ BottomContainer,
372
+ PlaceholderText,
373
+ RcCheckbox,
374
+ OptionsContainer,
375
+ VueDatePicker,
376
+ DatePickerContainer,
377
+ },
378
+ props: {
379
+ sortOptions: {
380
+ type: Array,
381
+ required: true,
382
+ },
383
+ selectedSort: {
384
+ type: Array,
385
+ required: true,
386
+ },
387
+ filterCategories: {
388
+ type: Array,
389
+ required: true,
390
+ },
391
+ activeLanguage: {
392
+ type: String,
393
+ required: false,
394
+ default: 'en-us',
395
+ },
396
+ },
397
+ data() {
398
+ return {
399
+ isOptionsVisible: false,
400
+ }
401
+ },
402
+ computed: {
403
+ theme() {
404
+ return theme
405
+ },
406
+ datePickerLocale() {
407
+ return datePickerLang(this.activeLanguage)
408
+ },
409
+ datePickerFormat() {
410
+ return getDateFormat(this.activeLanguage)
411
+ },
412
+ },
413
+ beforeUnmount() {
414
+ document.removeEventListener('click', this.handleClickOutside)
415
+ },
416
+ methods: {
417
+ handleClickOutside(event) {
418
+ const isClickInSelect =
419
+ event.target.closest('.sort-dropdown') ||
420
+ event.target.closest('.rc-select-dropdown') ||
421
+ event.target.closest('.select-button') ||
422
+ event.target.closest('.caret_dropdown')
423
+
424
+ if (
425
+ !this.$refs.buttonIcon.$el.contains(event.target) &&
426
+ !this.$refs.boxContainer.$el.contains(event.target) &&
427
+ !isClickInSelect
428
+ ) {
429
+ this.isOptionsVisible = false
430
+ document.removeEventListener('click', this.handleClickOutside)
431
+ }
432
+ },
433
+ toggleOptions() {
434
+ this.isOptionsVisible = !this.isOptionsVisible
435
+ if (this.isOptionsVisible) {
436
+ document.addEventListener('click', this.handleClickOutside)
437
+ } else {
438
+ document.removeEventListener('click', this.handleClickOutside)
439
+ }
440
+ },
441
+ constraintOptions(index) {
442
+ const generalOptions = [
443
+ {
444
+ value: 'contains_any',
445
+ label: this.$gettext('contains_any'),
446
+ },
447
+ {
448
+ value: 'contains_all',
449
+ label: this.$gettext('contains_all'),
450
+ },
451
+ {
452
+ value: 'contains_none',
453
+ label: this.$gettext('contains_none'),
454
+ },
455
+ ]
456
+
457
+ const dateOptions = [
458
+ {
459
+ value: 'is_before',
460
+ label: this.$gettext('is_before'),
461
+ },
462
+ {
463
+ value: 'is_before_or_on',
464
+ label: this.$gettext('is_before_or_on'),
465
+ },
466
+ {
467
+ value: 'is_after',
468
+ label: this.$gettext('is_after'),
469
+ },
470
+ {
471
+ value: 'is_after_or_on',
472
+ label: this.$gettext('is_after_or_on'),
473
+ },
474
+ ]
475
+ if (this.selectedSort?.[index]?.column === 'updated') {
476
+ return dateOptions
477
+ }
478
+
479
+ return generalOptions
480
+ },
481
+ getSelectedLabel({ type, value, index }) {
482
+ if (!value) return
483
+ if (type === 'column') {
484
+ const categoryName = this.filterCategories.find(
485
+ (option) => option.name === value
486
+ ).text
487
+ return this.$gettext(categoryName) || '-'
488
+ } else if (type === 'constraint') {
489
+ return this.constraintOptions(index).find(
490
+ (option) => option.value === value
491
+ ).label
492
+ } else if (type === 'selectedOptions') {
493
+ const selectedOptions =
494
+ this.selectedSort[index]?.selectedOptions || []
495
+ if (selectedOptions.length === 0) return this.$gettext('Options')
496
+
497
+ const optionsList = this.optionsList(index)
498
+ const selectedLabels = selectedOptions
499
+ .map((optionValue) => {
500
+ const option = optionsList.find(
501
+ (opt) => opt.value === optionValue
502
+ )
503
+ return option ? option.label : optionValue
504
+ })
505
+ .join(', ')
506
+
507
+ return selectedLabels.length > 15
508
+ ? `${selectedLabels.substring(0, 15)}...`
509
+ : selectedLabels
510
+ }
511
+ },
512
+ onSelectFilter({ type, value, index, constraint }) {
513
+ if (
514
+ type === 'constraint' &&
515
+ (value === 'contains_all' || value === 'contains_none')
516
+ ) {
517
+ const options = this.optionsList(index)
518
+ const allValues = options.map((option) => option.value)
519
+
520
+ this.$emit('on-filter-change', {
521
+ type: 'selectedOptions',
522
+ value: value === 'contains_all' ? allValues : [],
523
+ index,
524
+ })
525
+ }
526
+
527
+ this.$emit('on-filter-change', {
528
+ type,
529
+ value,
530
+ index,
531
+ constraint,
532
+ })
533
+ if (type === 'column') {
534
+ this.$emit('on-filter-change', {
535
+ type: 'constraint',
536
+ value: '',
537
+ index,
538
+ })
539
+ }
540
+ this.isOptionsVisible = true
541
+ },
542
+ removeItem(index) {
543
+ this.$emit('on-filter-change', {
544
+ type: 'remove',
545
+ index,
546
+ })
547
+ },
548
+ onAddFilter() {
549
+ this.$emit('on-add-filter', {
550
+ type: 'add',
551
+ index: this.selectedSort.length,
552
+ })
553
+ },
554
+ optionsList(index) {
555
+ if (!this.selectedSort[index].column) return []
556
+ const findIndex = this.filterCategories.findIndex(
557
+ (category) => category.name === this.selectedSort[index].column
558
+ )
559
+ const selectedItem = this.filterCategories[findIndex]
560
+ return this.filterCategories[findIndex].options.choices.map(
561
+ (option) => ({
562
+ ...option,
563
+ value: option[selectedItem.valueSelector],
564
+ label: option[selectedItem.labelSelector],
565
+ })
566
+ )
567
+ },
568
+ },
569
+ }
570
+ </script>
571
+
572
+ <style>
573
+ .dp-input {
574
+ height: 40px !important;
575
+ min-width: 150px !important;
576
+ }
577
+ </style>
@@ -22,6 +22,7 @@
22
22
  class="sort-dropdown"
23
23
  :dropdown-auto-close="false"
24
24
  select-height="40px"
25
+ @click.stop
25
26
  @input-change="
26
27
  onSelectSort({
27
28
  type: 'column',
@@ -52,6 +53,7 @@
52
53
  class="sort-dropdown"
53
54
  :dropdown-auto-close="false"
54
55
  select-height="40px"
56
+ @click.stop
55
57
  @input-change="
56
58
  onSelectSort({
57
59
  type: 'direction',
@@ -97,6 +99,7 @@
97
99
  class="sort-dropdown"
98
100
  :dropdown-auto-close="false"
99
101
  select-height="40px"
102
+ @click.stop
100
103
  @input-change="
101
104
  onSelectSort({
102
105
  type: 'column',
@@ -124,6 +127,7 @@
124
127
  class="sort-dropdown"
125
128
  :dropdown-auto-close="false"
126
129
  select-height="40px"
130
+ @click.stop
127
131
  @input-change="
128
132
  onSelectSort({
129
133
  type: 'direction',
@@ -267,12 +271,16 @@
267
271
  handleClickOutside(event) {
268
272
  const buttonIcon = this.$el.querySelector('.button-icon')
269
273
  const boxContainer = this.$el.querySelector('.box-container')
270
- const isClickInDropdown = event.target.closest('.sort-dropdown')
274
+ const isClickInSelect =
275
+ event.target.closest('.sort-dropdown') ||
276
+ event.target.closest('.rc-select-dropdown') ||
277
+ event.target.closest('.select-button') ||
278
+ event.target.closest('.caret_dropdown')
271
279
 
272
280
  if (
273
281
  !buttonIcon.contains(event.target) &&
274
282
  !boxContainer.contains(event.target) &&
275
- !isClickInDropdown
283
+ !isClickInSelect
276
284
  ) {
277
285
  this.isOptionsVisible = false
278
286
  document.removeEventListener('click', this.handleClickOutside)
@@ -287,7 +295,6 @@
287
295
  }
288
296
  },
289
297
  getSelectedLabel({ type, value }) {
290
- // debugger
291
298
  if (!value) return
292
299
  if (type === 'column') {
293
300
  return this.sortOptions.find((option) => option.value === value).label
@@ -297,8 +304,6 @@
297
304
  }
298
305
  },
299
306
  onSelectSort({ type, value, index }) {
300
- console.log(type, value, index)
301
-
302
307
  this.$emit('on-sort-change', {
303
308
  type,
304
309
  value,