@eturnity/eturnity_reusable_components 8.40.1 → 8.40.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eturnity/eturnity_reusable_components",
3
- "version": "8.40.1",
3
+ "version": "8.40.3",
4
4
  "files": [
5
5
  "dist",
6
6
  "src"
@@ -16,6 +16,9 @@
16
16
  :width="width"
17
17
  >
18
18
  <LabelComponent :has-icon="Boolean(icon)" :reverse-direction="iconLast">
19
+ <FlexSpinner v-if="isLoading">
20
+ <RCSpinner size="tiny" />
21
+ </FlexSpinner>
19
22
  <Icon
20
23
  v-if="icon"
21
24
  :color="getIconColor"
@@ -44,6 +47,7 @@
44
47
  // />
45
48
 
46
49
  import styled from 'vue3-styled-components'
50
+ import RCSpinner from '../../spinner'
47
51
  import Icon from '../../icon'
48
52
  import theme from '../../../assets/theme'
49
53
 
@@ -174,6 +178,10 @@
174
178
  transform: rotate(20deg);
175
179
  cursor: ${(props) => (props.isDisabled ? 'not-allowed' : 'pointer')};
176
180
  `
181
+ const FlexSpinner = styled('div')`
182
+ flex: 0;
183
+ margin-right: 8px;
184
+ `
177
185
 
178
186
  export default {
179
187
  name: 'MainButton',
@@ -183,6 +191,8 @@
183
191
  PageContainer,
184
192
  ButtonContainer,
185
193
  BetaTag,
194
+ RCSpinner,
195
+ FlexSpinner,
186
196
  },
187
197
  props: {
188
198
  type: {
@@ -285,6 +295,10 @@
285
295
  type: Boolean,
286
296
  default: false,
287
297
  },
298
+ isLoading: {
299
+ type: Boolean,
300
+ default: false,
301
+ },
288
302
  },
289
303
  computed: {
290
304
  theme() {
@@ -3,6 +3,7 @@
3
3
  <ParentDropdown
4
4
  :dropdown-text="dropdownText ? dropdownText : 'Default view'"
5
5
  :is-open="isDropdownOpen"
6
+ :number-of-filters-applied="numberOfFiltersApplied"
6
7
  @on-toggle="onToggleDropdown()"
7
8
  />
8
9
  <FilterSettings
@@ -74,6 +75,11 @@
74
75
  closeDropdown: {
75
76
  required: false,
76
77
  },
78
+ activeFilterView: {
79
+ type: Object,
80
+ default: null,
81
+ required: false,
82
+ },
77
83
  },
78
84
  data() {
79
85
  return {
@@ -82,6 +88,14 @@
82
88
  preventOutsideClick: false,
83
89
  }
84
90
  },
91
+ computed: {
92
+ numberOfFiltersApplied() {
93
+ const filterColumns = this.activeFilterView?.columns?.filter(
94
+ (column) => column.custom_view_filter !== null
95
+ )
96
+ return filterColumns?.length > 0 ? filterColumns.length : 0
97
+ },
98
+ },
85
99
  watch: {
86
100
  closeDropdown(newVal) {
87
101
  if (newVal) {
@@ -6,6 +6,9 @@
6
6
  <TitleWrapper :is-open="isOpen">
7
7
  <TitleText>
8
8
  {{ dropdownText }}
9
+ <Counter v-if="numberOfFiltersApplied">
10
+ {{ numberOfFiltersApplied }}
11
+ </Counter>
9
12
  </TitleText>
10
13
  <ArrowWrapper>
11
14
  <Icon
@@ -43,18 +46,32 @@
43
46
  grid-template-columns: auto auto;
44
47
  align-items: center;
45
48
  justify-items: center;
46
- grid-gap: 10px;
49
+ grid-gap: 8px;
47
50
  border: 1px solid ${(props) => props.theme.colors.grey4};
48
51
  background-color: ${(props) =>
49
52
  props.isOpen ? props.theme.colors.grey5 : props.theme.colors.white};
50
53
  border-left: none;
51
54
  border-radius: 0px 4px 4px 0px;
52
- padding: 6px 14px;
55
+ padding: 6px 10px;
53
56
  user-select: none;
54
57
  `
55
58
 
56
59
  const TitleText = styled.div`
57
60
  font-size: 13px;
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 8px;
64
+ `
65
+
66
+ const Counter = styled.div`
67
+ line-height: 18px;
68
+ border-radius: 8px;
69
+ padding: 0 8px;
70
+ background: ${(props) => props.theme.semanticColors.purple['100']};
71
+ color: ${(props) => props.theme.colors.primary};
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
58
75
  `
59
76
 
60
77
  const ArrowWrapper = styled.div`
@@ -75,6 +92,7 @@
75
92
  IconWrapper,
76
93
  TitleWrapper,
77
94
  TitleText,
95
+ Counter,
78
96
  ArrowWrapper,
79
97
  },
80
98
  props: {
@@ -86,6 +104,11 @@
86
104
  required: true,
87
105
  default: 'View',
88
106
  },
107
+ numberOfFiltersApplied: {
108
+ required: false,
109
+ default: 0,
110
+ type: Number,
111
+ },
89
112
  },
90
113
  }
91
114
  </script>
@@ -179,7 +179,7 @@
179
179
  }
180
180
  const LabelText = styled('div', LabelTextAttrs)`
181
181
  font-size: 13px;
182
- display: grid;
182
+ display: flex;
183
183
  align-items: center;
184
184
  min-height: 16px;
185
185
  color: ${(props) =>
@@ -93,7 +93,7 @@
93
93
  v-if="hasError && hasErrorMessage"
94
94
  data-test-id="error_message_wrapper"
95
95
  >
96
- {{ dynamicErrorMessage }}
96
+ {{ errorMessage }}
97
97
  </ErrorMessage>
98
98
  </InputErrorWrapper>
99
99
  </InputWrapper>
@@ -444,9 +444,6 @@
444
444
  hasErrorMessage() {
445
445
  return this.errorMessage && this.errorMessage.length > 0
446
446
  },
447
- dynamicErrorMessage() {
448
- return this.errorMessage
449
- },
450
447
  },
451
448
  watch: {
452
449
  hasFocus(newVal) {
@@ -1,77 +1,85 @@
1
1
  <template>
2
- <ComponentWrapper :color-mode="colorMode" :layout="layout">
3
- <RadioWrapper
4
- v-for="(item, index) in options"
5
- :key="item.value"
6
- :data-test-id="'radioWrapper_' + item.value"
7
- >
8
- <LabelContainer
9
- :checkmark-color="checkmarkColor"
10
- :color-mode="colorMode"
11
- :has-label="!!item.label"
12
- :has-slots="!!$slots[`input-${item.value}`]"
13
- :is-checked="selectedOption === item.value"
14
- :is-disabled="isItemDisabled(item)"
15
- :size="size"
2
+ <FlexRadioContainer>
3
+ <ComponentWrapper :color-mode="colorMode" :layout="layout">
4
+ <RadioWrapper
5
+ v-for="(item, index) in options"
6
+ :key="item.value"
7
+ :data-test-id="'radioWrapper_' + item.value"
16
8
  >
17
- <Radio
18
- :checked="selectedOption === item.value"
19
- :data-id="`radio_button_${dataId}_option_${item.value}`"
20
- :data-qa-id="dataQaId"
21
- :data-test-id="'radioInput_' + item.value"
22
- :disabled="isItemDisabled(item)"
23
- :name="'radioButtons_' + radioName"
24
- type="radio"
25
- :value="selectedOption"
26
- @click="onInputHandler(item.value)"
27
- />
28
- <span class="checkmark"></span>
29
- <LabelText
30
- v-if="item.label"
9
+ <LabelContainer
10
+ :checkmark-color="checkmarkColor"
31
11
  :color-mode="colorMode"
32
- :data-test-id="'radioLabel_' + item.value"
12
+ :has-label="!!item.label"
13
+ :has-slots="!!$slots[`input-${item.value}`]"
14
+ :is-checked="selectedOption === item.value"
33
15
  :is-disabled="isItemDisabled(item)"
16
+ :size="size"
34
17
  >
35
- {{ item.label }}
36
- <IsRequiredLabelStar v-if="isRequiredLabel" />
37
- </LabelText>
38
- <InfoText
39
- v-if="item.infoText"
40
- :data-test-id="'radioInfo_' + item.value"
41
- size="16px"
42
- :text="item.infoText"
43
- />
44
- <slot :name="`input-${item.value}`"></slot>
45
- </LabelContainer>
46
- <ImageContainer v-if="item.img">
47
- <RadioImage
48
- :data-test-id="'radioImage_' + item.value"
49
- :src="item.img"
50
- />
51
- <div
52
- class="search-icn-container"
53
- :data-test-id="'radioOpenImage_' + item.value"
54
- @click="toggleImageModal(index)"
55
- >
56
- <img
57
- alt=""
58
- class="search-icn"
59
- :src="require('../../../assets/icons/search_icon.png')"
18
+ <Radio
19
+ :checked="selectedOption === item.value"
20
+ :data-id="`radio_button_${dataId}_option_${item.value}`"
21
+ :data-qa-id="dataQaId"
22
+ :data-test-id="'radioInput_' + item.value"
23
+ :disabled="isItemDisabled(item)"
24
+ :name="'radioButtons_' + radioName"
25
+ type="radio"
26
+ :value="selectedOption"
27
+ @click="onInputHandler(item.value)"
60
28
  />
61
- </div>
62
- </ImageContainer>
63
- <Modal
64
- v-if="item.img"
65
- :data-test-id="'radioModal_' + item.value"
66
- :is-open="isImageOpen(index)"
67
- @on-close="toggleImageModal(null)"
68
- >
69
- <ModalImageContainer>
70
- <ModalImage :src="item.img" />
71
- </ModalImageContainer>
72
- </Modal>
73
- </RadioWrapper>
74
- </ComponentWrapper>
29
+ <span class="checkmark"></span>
30
+ <LabelText
31
+ v-if="item.label"
32
+ :color-mode="colorMode"
33
+ :data-test-id="'radioLabel_' + item.value"
34
+ :is-disabled="isItemDisabled(item)"
35
+ >
36
+ {{ item.label }}
37
+ <IsRequiredLabelStar v-if="isRequiredLabel" />
38
+ </LabelText>
39
+ <InfoText
40
+ v-if="item.infoText"
41
+ :data-test-id="'radioInfo_' + item.value"
42
+ size="16px"
43
+ :text="item.infoText"
44
+ />
45
+ <slot :name="`input-${item.value}`"></slot>
46
+ </LabelContainer>
47
+ <ImageContainer v-if="item.img">
48
+ <RadioImage
49
+ :data-test-id="'radioImage_' + item.value"
50
+ :src="item.img"
51
+ />
52
+ <div
53
+ class="search-icn-container"
54
+ :data-test-id="'radioOpenImage_' + item.value"
55
+ @click="toggleImageModal(index)"
56
+ >
57
+ <img
58
+ alt=""
59
+ class="search-icn"
60
+ :src="require('../../../assets/icons/search_icon.png')"
61
+ />
62
+ </div>
63
+ </ImageContainer>
64
+ <Modal
65
+ v-if="item.img"
66
+ :data-test-id="'radioModal_' + item.value"
67
+ :is-open="isImageOpen(index)"
68
+ @on-close="toggleImageModal(null)"
69
+ >
70
+ <ModalImageContainer>
71
+ <ModalImage :src="item.img" />
72
+ </ModalImageContainer>
73
+ </Modal>
74
+ </RadioWrapper>
75
+ </ComponentWrapper>
76
+ <ErrorMessage
77
+ v-if="hasError && errorMessage"
78
+ data-test-id="error_message_wrapper"
79
+ >
80
+ {{ errorMessage }}
81
+ </ErrorMessage>
82
+ </FlexRadioContainer>
75
83
  </template>
76
84
 
77
85
  <script>
@@ -99,6 +107,7 @@
99
107
  import Modal from '../../modals/modal'
100
108
  import InfoText from '../../infoText'
101
109
  import IsRequiredLabelStar from '../isRequiredLabelStar'
110
+ import ErrorMessage from '../../errorMessage'
102
111
 
103
112
  const wrapperProps = {
104
113
  layout: String,
@@ -246,7 +255,11 @@
246
255
  const ModalImageContainer = styled.div`
247
256
  padding: 40px;
248
257
  `
249
-
258
+ const FlexRadioContainer = styled.div`
259
+ display: flex;
260
+ flex-direction: column;
261
+ position: relative;
262
+ `
250
263
  export default {
251
264
  name: 'RadioButton',
252
265
  components: {
@@ -262,6 +275,8 @@
262
275
  InfoText,
263
276
  LabelText,
264
277
  IsRequiredLabelStar,
278
+ ErrorMessage,
279
+ FlexRadioContainer,
265
280
  },
266
281
  props: {
267
282
  disabled: {
@@ -320,6 +335,16 @@
320
335
  default: false,
321
336
  type: Boolean,
322
337
  },
338
+ hasError: {
339
+ required: false,
340
+ default: false,
341
+ type: Boolean,
342
+ },
343
+ errorMessage: {
344
+ required: false,
345
+ default: '',
346
+ type: String,
347
+ },
323
348
  },
324
349
  emits: ['on-radio-change'],
325
350
  data() {
@@ -201,6 +201,12 @@
201
201
  </SelectDropdown>
202
202
  </Component>
203
203
  </DropdownWrapper>
204
+ <ErrorMessage
205
+ v-if="hasError && hasErrorMessage"
206
+ data-test-id="error_message_wrapper"
207
+ >
208
+ {{ errorMessage }}
209
+ </ErrorMessage>
204
210
  </SelectButtonWrapper>
205
211
  </InputWrapper>
206
212
  </Container>
@@ -233,6 +239,7 @@
233
239
  import { Teleport, inject } from 'vue'
234
240
  import styled from 'vue3-styled-components'
235
241
  import InfoText from '../../infoText'
242
+ import ErrorMessage from '../../errorMessage'
236
243
  import Icon from '../../icon'
237
244
  import InputText from '../inputText'
238
245
  import DraggableInputHandle from '../../draggableInputHandle'
@@ -302,7 +309,6 @@
302
309
  const Container = styled('div', inputProps)`
303
310
  width: ${(props) => props.selectWidth};
304
311
  position: ${(props) => (props.noRelative ? 'static' : 'relative')};
305
- display: inline-block;
306
312
  text-align: ${(props) => (props.textCenter ? 'center' : 'left')};
307
313
  `
308
314
 
@@ -514,6 +520,7 @@
514
520
  Teleport,
515
521
  DraggableInputHandle,
516
522
  IsRequiredLabelStar,
523
+ ErrorMessage,
517
524
  },
518
525
 
519
526
  props: {
@@ -620,9 +627,14 @@
620
627
  default: true,
621
628
  },
622
629
  hasError: {
630
+ type: Boolean,
623
631
  required: false,
624
632
  default: false,
625
633
  },
634
+ errorMessage: {
635
+ type: String,
636
+ default: '',
637
+ },
626
638
  disabled: {
627
639
  required: false,
628
640
  type: Boolean,
@@ -735,6 +747,9 @@
735
747
  }
736
748
  },
737
749
  computed: {
750
+ hasErrorMessage() {
751
+ return this.errorMessage && this.errorMessage.length > 0
752
+ },
738
753
  optionLength() {
739
754
  if (this.isDropdownOpen) {
740
755
  return this.$refs.dropdown.$el.childElementCount > 1
@@ -25,6 +25,8 @@
25
25
  :resize="resize"
26
26
  :rows="rowHeight"
27
27
  :value="value"
28
+ @blur="onInputBlur"
29
+ @focus="onInputFocus"
28
30
  @input="onChangeHandler"
29
31
  ></textarea>
30
32
  </InputContainer>
@@ -208,6 +210,12 @@
208
210
  }
209
211
  this.$emit('input-change', $event.target.value)
210
212
  },
213
+ onInputBlur($event) {
214
+ this.$emit('input-blur', $event.target.value)
215
+ },
216
+ onInputFocus($event) {
217
+ this.$emit('input-focus', $event.target.value)
218
+ },
211
219
  },
212
220
  }
213
221
  </script>
@@ -59,6 +59,8 @@
59
59
 
60
60
  const getSpinnerSize = (size) => {
61
61
  switch (size) {
62
+ case 'tiny':
63
+ return '16px'
62
64
  case 'small':
63
65
  return '24px'
64
66
  case 'large':