@eturnity/eturnity_reusable_components 9.19.4 → 9.19.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 (53) hide show
  1. package/package.json +25 -20
  2. package/src/DemoChart.vue +16 -16
  3. package/src/assets/svgIcons/3d_house.svg +3 -0
  4. package/src/assets/svgIcons/activities_app.svg +3 -0
  5. package/src/assets/svgIcons/apps_navigation.svg +3 -0
  6. package/src/assets/svgIcons/chevron_down.svg +3 -0
  7. package/src/assets/svgIcons/chevron_up.svg +3 -0
  8. package/src/assets/svgIcons/collapse_sidebar.svg +3 -0
  9. package/src/assets/svgIcons/consumption_profile.svg +3 -0
  10. package/src/assets/svgIcons/cross_filled.svg +3 -0
  11. package/src/assets/svgIcons/data_transfer.svg +2 -2
  12. package/src/assets/svgIcons/esdec.svg +3 -0
  13. package/src/assets/svgIcons/expand_sidebar.svg +3 -0
  14. package/src/assets/svgIcons/external_link.svg +3 -0
  15. package/src/assets/svgIcons/folder_unfilled.svg +3 -0
  16. package/src/assets/svgIcons/leads_app.svg +9 -0
  17. package/src/assets/svgIcons/library_app.svg +3 -0
  18. package/src/assets/svgIcons/mail.svg +3 -0
  19. package/src/assets/svgIcons/mounting_system.svg +2 -2
  20. package/src/assets/svgIcons/portal.svg +3 -0
  21. package/src/assets/svgIcons/projects_app.svg +9 -0
  22. package/src/assets/svgIcons/question_mark.svg +2 -2
  23. package/src/assets/svgIcons/recurring_costs.svg +3 -0
  24. package/src/assets/svgIcons/settings.svg +8 -2
  25. package/src/assets/svgIcons/shading_snow.svg +3 -0
  26. package/src/assets/svgIcons/signature.svg +3 -0
  27. package/src/assets/svgIcons/tariff_menu.svg +3 -0
  28. package/src/assets/svgIcons/zev_community_solar.svg +3 -0
  29. package/src/components/banner/actionBanner/index.vue +1 -1
  30. package/src/components/barchart/BottomFields.vue +5 -2
  31. package/src/components/barchart/ChartControls.vue +5 -5
  32. package/src/components/barchart/index.vue +7 -2
  33. package/src/components/buttons/buttonIcon/index.vue +9 -0
  34. package/src/components/buttons/mainButton/index.vue +26 -26
  35. package/src/components/buttons/splitButtons/index.vue +1 -1
  36. package/src/components/card/index.vue +35 -5
  37. package/src/components/dropdown/index.vue +7 -7
  38. package/src/components/infoCard/index.vue +30 -4
  39. package/src/components/inputs/searchInput/SearchInput.stories.js +1 -1
  40. package/src/components/inputs/searchInput/searchInput.spec.js +1 -1
  41. package/src/components/inputs/select/index.vue +406 -79
  42. package/src/components/inputs/select/option/index.vue +9 -1
  43. package/src/components/modals/cookieConsent/CookieConsent.vue +4 -4
  44. package/src/components/navigationSideMenu/index.vue +1098 -0
  45. package/src/components/pageSubtitle/index.vue +1 -1
  46. package/src/components/progressStep/index.vue +82 -18
  47. package/src/components/progressStep/progressStep.stories.js +8 -0
  48. package/src/components/projectMarker/ProjectMarker.stories.js +26 -36
  49. package/src/components/projectMarker/index.vue +172 -93
  50. package/src/components/tabsHeader/index.vue +9 -1
  51. package/src/components/videoThumbnail/index.vue +1 -1
  52. package/src/helpers/cookieHelper.js +23 -13
  53. package/src/helpers/dateTimeFormatting.js +0 -1
@@ -1,13 +1,13 @@
1
1
  <template>
2
2
  <Container>
3
- <LegendAndControlsWrapper :leftMargin="yAxisWidth">
3
+ <LegendAndControlsWrapper :left-margin="yAxisWidth">
4
4
  <LeftSection>
5
5
  <SplitButtonsContainer
6
6
  v-if="splitButtonOptions.length"
7
7
  :position="position"
8
8
  >
9
9
  <SplitButtons
10
- :modelValue="selectedSplitButton"
10
+ :model-value="selectedSplitButton"
11
11
  :options="splitButtonOptions"
12
12
  @click="handleSplitButtonClick"
13
13
  />
@@ -18,14 +18,14 @@
18
18
  <LegendRow
19
19
  v-for="(row, rowIndex) in groupedSeries"
20
20
  :key="rowIndex"
21
- :rowIndex="rowIndex"
21
+ :row-index="rowIndex"
22
22
  >
23
23
  <LegendItem v-for="(series, index) in row" :key="series.name">
24
24
  <LegendColor
25
- :gradientFrom="
25
+ :gradient-from="
26
26
  reversedColors[rowIndex * legendsItemPerRow + index].from
27
27
  "
28
- :gradientTo="
28
+ :gradient-to="
29
29
  reversedColors[rowIndex * legendsItemPerRow + index].to
30
30
  "
31
31
  />
@@ -1,5 +1,10 @@
1
1
  <template>
2
- <Container :data-id="`${dataId}_chart`" :data-qa-id="`${dataQaId}_chart`" :class="`barchart-${chartId}`" :width="width">
2
+ <Container
3
+ :class="`barchart-${chartId}`"
4
+ :data-id="`${dataId}_chart`"
5
+ :data-qa-id="`${dataQaId}_chart`"
6
+ :width="width"
7
+ >
3
8
  <ChartControlsWrapper
4
9
  v-if="isChartControlsShown('top')"
5
10
  :position="chartControlsPosition"
@@ -164,11 +169,11 @@
164
169
  :data-id="dataId"
165
170
  :data-qa-id="dataQaId"
166
171
  :field-mode="fieldMode"
172
+ :input-error-message="inputErrorMessage"
167
173
  :is-chart-controls-shown-in-bottom="isChartControlsShown('bottom')"
168
174
  :is-inputs-disabled="isLoading"
169
175
  :is-scrollable="isScrollable"
170
176
  :percentage-error-message="percentageErrorMessage"
171
- :input-error-message="inputErrorMessage"
172
177
  :series="series"
173
178
  :y-axis-width="yAxisWidth"
174
179
  @input-blur="handleInputBlur"
@@ -11,6 +11,7 @@
11
11
  :is-active="isActive"
12
12
  :is-disabled="isDisabled"
13
13
  :is-hovered="isHovered"
14
+ :is-transparent="isTransparent"
14
15
  :min-width="minWidth"
15
16
  :type="type"
16
17
  :variant="variant"
@@ -43,6 +44,7 @@
43
44
  />
44
45
  </IconContainer>
45
46
  <ButtonContainer
47
+ v-if="text"
46
48
  :button-size="buttonSize"
47
49
  data-test-id="button-icon-text"
48
50
  :height="height"
@@ -118,6 +120,7 @@
118
120
  isActive: Boolean,
119
121
  isHovered: Boolean,
120
122
  height: String,
123
+ isTransparent: Boolean,
121
124
  }
122
125
  const ButtonWrapper = styled('div', ButtonAttrs)`
123
126
  position: relative;
@@ -138,6 +141,8 @@
138
141
  props.isDisabled
139
142
  ? props.theme.mainButton[props.appTheme][props.type][props.variant]
140
143
  .disabled.backgroundColor
144
+ : props.isTransparent
145
+ ? 'transparent'
141
146
  : props.customColor
142
147
  ? props.customColor
143
148
  : props.isActive
@@ -403,6 +408,10 @@
403
408
  type: String,
404
409
  default: '',
405
410
  },
411
+ isTransparent: {
412
+ type: Boolean,
413
+ default: false,
414
+ },
406
415
  isFirstLetterCapitalized: {
407
416
  required: false,
408
417
  default: false,
@@ -4,13 +4,16 @@
4
4
  :id="id"
5
5
  :app-theme="appTheme"
6
6
  :button-size="buttonSize"
7
+ :custom-text-color="customTextColor"
7
8
  :data-id="dataId"
8
9
  :data-qa-id="dataQaId"
9
10
  :height="height"
10
11
  :is-active="isActive"
11
12
  :is-disabled="isDisabled"
12
13
  :min-width="minWidth"
14
+ :no-background-color="noBackgroundColor"
13
15
  :no-wrap="noWrap"
16
+ :opacity-level="opacityLevel"
14
17
  :type="type"
15
18
  :variant="variant"
16
19
  :width="width"
@@ -67,6 +70,9 @@
67
70
  buttonSize: String,
68
71
  appTheme: String,
69
72
  isActive: Boolean,
73
+ noBackgroundColor: Boolean,
74
+ customTextColor: String,
75
+ opacityLevel: String,
70
76
  }
71
77
  const ButtonContainer = styled('div', ButtonAttrs)`
72
78
  display: flex;
@@ -77,13 +83,17 @@
77
83
  font-size: ${(props) =>
78
84
  props.theme?.mainButton?.size?.[props.buttonSize]?.fontSize};
79
85
  color: ${(props) =>
80
- props.isDisabled
86
+ props.customTextColor
87
+ ? props.customTextColor
88
+ : props.isDisabled
81
89
  ? props.theme.mainButton[props.appTheme][props.type][props.variant]
82
90
  .disabled.textColor
83
91
  : props.theme.mainButton[props.appTheme][props.type][props.variant]
84
92
  .default.textColor};
85
93
  background-color: ${(props) =>
86
- props.isDisabled
94
+ props.noBackgroundColor
95
+ ? 'transparent'
96
+ : props.isDisabled
87
97
  ? props.theme.mainButton[props.appTheme][props.type][props.variant]
88
98
  .disabled.backgroundColor
89
99
  : props.isActive
@@ -108,6 +118,7 @@
108
118
  height: ${(props) => props.height};
109
119
  line-height: 1;
110
120
  width: ${(props) => props.width};
121
+ opacity: ${(props) => props.opacityLevel};
111
122
 
112
123
  @media (hover: hover) and (pointer: fine) {
113
124
  &:hover {
@@ -130,30 +141,6 @@
130
141
  }
131
142
  `
132
143
 
133
- const AltAttrs = {
134
- altStyle: Boolean,
135
- color: String,
136
- }
137
-
138
- const IconContainer = styled('div', AltAttrs)`
139
- background-color: ${(props) =>
140
- props.color ? props.color : props.theme.colors.transparentWhite1};
141
- padding: 7px;
142
- height: 100%;
143
- width: 30%;
144
- justify-content: center;
145
- display: flex;
146
- align-items: center;
147
- border-radius: 4px 0 0 4px;
148
- color: ${(props) => props.theme.colors.white};
149
- all: ${(props) => (props.altStyle ? '' : 'unset')};
150
- `
151
-
152
- const TextContainer = styled('span', AltAttrs)`
153
- padding: ${(props) => (props.altStyle ? '7px' : '0')};
154
- all: ${(props) => (props.altStyle ? '' : 'unset')};
155
- `
156
-
157
144
  const LabelAttrs = {
158
145
  hasIcon: Boolean,
159
146
  reverseDirection: Boolean,
@@ -305,6 +292,19 @@
305
292
  type: Boolean,
306
293
  default: false,
307
294
  },
295
+ noBackgroundColor: {
296
+ type: Boolean,
297
+ default: false,
298
+ },
299
+ customTextColor: {
300
+ required: false,
301
+ default: null,
302
+ },
303
+ opacityLevel: {
304
+ required: false,
305
+ default: '100%',
306
+ type: String,
307
+ },
308
308
  },
309
309
  computed: {
310
310
  theme() {
@@ -2,8 +2,8 @@
2
2
  <Container>
3
3
  <SplitButton
4
4
  v-for="(option, index) in options"
5
- :data-id-key="`${dataIdKey}_${option.value}`"
6
5
  :key="index"
6
+ :data-id-key="`${dataIdKey}_${option.value}`"
7
7
  :length="options.length"
8
8
  :position="getButtonPosition(index)"
9
9
  :selected="modelValue === option.value"
@@ -1,9 +1,12 @@
1
1
  <template>
2
2
  <Wrapper
3
3
  v-show="!isLoading"
4
+ :border="border"
5
+ :box-shadow="boxShadow"
4
6
  :class="viewCardClass"
5
7
  data-test-id="card_main_wrapper"
6
8
  :min-width="minWidth"
9
+ :padding="padding"
7
10
  :width="width"
8
11
  >
9
12
  <Spinner
@@ -13,7 +16,11 @@
13
16
  size="50px"
14
17
  />
15
18
  <CardWrapper v-else>
16
- <CardTitle :class="titleClass" data-test-id="card_title">
19
+ <CardTitle
20
+ v-if="title && title.length > 0"
21
+ :class="titleClass"
22
+ data-test-id="card_title"
23
+ >
17
24
  {{ $gettext(title) }}
18
25
  <InfoText
19
26
  v-if="showPopover && popoverText !== ''"
@@ -44,16 +51,24 @@
44
51
  import Spinner from '../spinner'
45
52
  import InfoText from '../infoText'
46
53
 
47
- const WrapperProps = { width: [Number, String], minWidth: [Number, String] }
54
+ const WrapperProps = {
55
+ width: [Number, String],
56
+ minWidth: [Number, String],
57
+ boxShadow: String,
58
+ border: String,
59
+ padding: String,
60
+ }
48
61
  const Wrapper = styled('div', WrapperProps)`
49
62
  max-width: ${(props) => props.width};
50
63
  min-width: ${(props) => props.minWidth};
51
- padding: 20px;
52
- box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2),
53
- 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
64
+ padding: ${(props) => props.padding};
65
+ box-shadow: ${(props) =>
66
+ props.boxShadow ||
67
+ '0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12)'};
54
68
  border-radius: 4px;
55
69
  background-color: ${(props) => props.theme.colors.white};
56
70
  height: 100%;
71
+ ${(props) => props.border && `border: ${props.border};`}
57
72
  `
58
73
 
59
74
  const CardWrapper = styled('div')`
@@ -113,6 +128,21 @@
113
128
  type: Boolean,
114
129
  default: false,
115
130
  },
131
+ boxShadow: {
132
+ type: String,
133
+ required: false,
134
+ default: null,
135
+ },
136
+ border: {
137
+ type: String,
138
+ required: false,
139
+ default: null,
140
+ },
141
+ padding: {
142
+ type: String,
143
+ required: false,
144
+ default: '20px',
145
+ },
116
146
  },
117
147
  }
118
148
  </script>
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <Wrapper
3
- data-test-id="dropdown_wrapper"
4
3
  ref="dropdown"
4
+ data-test-id="dropdown_wrapper"
5
5
  :opening-mode="openingMode"
6
6
  >
7
7
  <WrapperButton
@@ -115,10 +115,15 @@
115
115
  isOpenByClick: false,
116
116
  }
117
117
  },
118
+ watch: {
119
+ isOpenByClick(newVal) {
120
+ this.$emit('on-dropdown-toggle', newVal)
121
+ },
122
+ },
118
123
  mounted() {
119
124
  document.addEventListener('click', this.clickOutside)
120
125
  },
121
- beforeDestroy() {
126
+ beforeUnmount() {
122
127
  document.removeEventListener('click', this.clickOutside)
123
128
  },
124
129
  methods: {
@@ -138,10 +143,5 @@
138
143
  }
139
144
  },
140
145
  },
141
- watch: {
142
- isOpenByClick(newVal) {
143
- this.$emit('on-dropdown-toggle', newVal)
144
- },
145
- },
146
146
  }
147
147
  </script>
@@ -2,15 +2,20 @@
2
2
  <InfoContainer
3
3
  :align-items="alignItems"
4
4
  :border-color="borderColor"
5
+ :border-radius="borderRadius"
5
6
  :border-style="borderStyle"
6
7
  :color="color"
7
8
  data-test-id="info_card_wrapper"
9
+ :hide-default-icon="hideDefaultIcon"
8
10
  :min-height="minHeight"
9
11
  :min-width="minWidth"
10
12
  :padding="padding"
11
13
  :preset-styles="presetStyles"
12
14
  >
13
- <IconWrapper :size="iconWrapperSize ? iconWrapperSize : iconSize">
15
+ <IconWrapper
16
+ v-if="!hideDefaultIcon"
17
+ :size="iconWrapperSize ? iconWrapperSize : iconSize"
18
+ >
14
19
  <RCIcon
15
20
  :color="iconColor ? iconColor : presetStyles.iconColor"
16
21
  data-test-id="info_card_icon"
@@ -19,7 +24,10 @@
19
24
  :size="iconSize"
20
25
  />
21
26
  </IconWrapper>
22
- <TextContainer data-test-id="info_card_text_container">
27
+ <TextContainer
28
+ data-test-id="info_card_text_container"
29
+ :hide-default-icon="hideDefaultIcon"
30
+ >
23
31
  <slot></slot>
24
32
  </TextContainer>
25
33
  </InfoContainer>
@@ -35,11 +43,13 @@
35
43
  minWidth: String,
36
44
  color: String,
37
45
  alignItems: String,
46
+ hideDefaultIcon: Boolean,
38
47
  padding: String,
39
48
  borderColor: String,
40
49
  borderStyle: String,
41
50
  presetStyles: Object,
42
51
  }
52
+
43
53
  const InfoContainer = styled('div', infoContainerAttrs)`
44
54
  display: flex;
45
55
  align-items: ${(props) =>
@@ -50,7 +60,7 @@
50
60
  padding: ${(props) =>
51
61
  props.padding ? props.padding : props.presetStyles.padding};
52
62
  color: ${(props) => (props.color ? props.color : props.presetStyles.color)};
53
- border-radius: 4px;
63
+ border-radius: ${(props) => props.borderRadius};
54
64
  background-color: ${(props) =>
55
65
  props.backgroundColor
56
66
  ? props.backgroundColor
@@ -62,9 +72,14 @@
62
72
  props.borderColor ? props.borderColor : props.presetStyles.borderColor};
63
73
  `
64
74
 
65
- const TextContainer = styled.div`
75
+ const TextContainer = styled('div', {
76
+ hideDefaultIcon: Boolean,
77
+ })`
66
78
  font-size: 14px;
79
+ flex: ${(props) => (props.hideDefaultIcon ? '1' : '0 1 auto')};
67
80
  width: 100%;
81
+ max-width: none;
82
+ min-width: 0;
68
83
  `
69
84
 
70
85
  const IconWrapper = styled('div', {
@@ -75,6 +90,7 @@
75
90
  display: flex;
76
91
  align-items: center;
77
92
  justify-content: center;
93
+ flex-shrink: 0;
78
94
  `
79
95
 
80
96
  export default {
@@ -121,6 +137,11 @@
121
137
  type: String,
122
138
  default: '',
123
139
  },
140
+ /** When true, the leading icon is omitted and the slot spans the full row width. */
141
+ hideDefaultIcon: {
142
+ type: Boolean,
143
+ default: false,
144
+ },
124
145
  padding: {
125
146
  required: false,
126
147
  type: String,
@@ -136,6 +157,11 @@
136
157
  type: String,
137
158
  default: '',
138
159
  },
160
+ borderRadius: {
161
+ required: false,
162
+ type: String,
163
+ default: '4px',
164
+ },
139
165
  iconName: {
140
166
  required: false,
141
167
  type: String,
@@ -64,4 +64,4 @@ Sizes.args = {
64
64
  ...defaultProps,
65
65
  'input-width': '250px',
66
66
  'is-filter': true,
67
- }
67
+ }
@@ -62,4 +62,4 @@ describe('SearchInput.vue', () => {
62
62
  // Check that the focus method was called
63
63
  expect(focusSpy).toHaveBeenCalled()
64
64
  })
65
- })
65
+ })