@eturnity/eturnity_reusable_components 7.24.1 → 7.24.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/babel.config.js +3 -1
- package/package.json +2 -1
- package/src/assets/svgIcons/anchor.svg +18 -0
- package/src/assets/svgIcons/consumption_tariffs.svg +43 -0
- package/src/assets/svgIcons/electricity_tariff.svg +3 -0
- package/src/assets/svgIcons/flatten_roof.svg +20 -0
- package/src/assets/svgIcons/handle.svg +5 -0
- package/src/assets/svgIcons/house_3d-1.svg +8 -0
- package/src/assets/svgIcons/house_3d.svg +8 -0
- package/src/assets/svgIcons/split.svg +6 -88
- package/src/assets/svgIcons/summer.svg +3 -0
- package/src/components/banner/actionBanner/index.vue +65 -0
- package/src/components/banner/banner/banner.stories.js +31 -0
- package/src/components/banner/banner/index.vue +188 -0
- package/src/components/banner/infoBanner/index.vue +69 -0
- package/src/components/buttons/mainButton/index.vue +30 -2
- package/src/components/collapsableInfoText/index.vue +125 -0
- package/src/components/filter/filterSettings.vue +2 -0
- package/src/components/icon/index.vue +1 -1
- package/src/components/iconWrapper/index.vue +23 -3
- package/src/components/inputs/checkbox/index.vue +5 -0
- package/src/components/inputs/inputText/index.vue +20 -4
- package/src/components/inputs/radioButton/index.vue +5 -2
- package/src/components/inputs/select/index.vue +34 -11
- package/src/components/modals/actionModal/index.vue +64 -0
- package/src/components/modals/infoModal/index.vue +49 -0
- package/src/components/modals/modal/index.vue +1 -1
- package/src/components/rangeSlider/Slider.vue +547 -0
- package/src/components/rangeSlider/index.vue +517 -0
- package/src/components/rangeSlider/utils/dom.js +49 -0
- package/src/components/rangeSlider/utils/fns.js +26 -0
- package/src/components/threeDots/index.vue +22 -8
- package/src/helpers/currencyMapping.js +28 -0
- package/src/mixins/inputValidations.js +97 -0
@@ -8,8 +8,12 @@
|
|
8
8
|
:customColor="customColor"
|
9
9
|
:noWrap="noWrap"
|
10
10
|
:data-id="dataId"
|
11
|
+
:fontColor="fontColor"
|
11
12
|
>
|
12
|
-
|
13
|
+
<Label :hasIcon="Boolean(icon)">
|
14
|
+
<icon v-if="icon" :name="icon" size="14px" />
|
15
|
+
{{ text }}
|
16
|
+
</Label>
|
13
17
|
</button-container>
|
14
18
|
</page-container>
|
15
19
|
</template>
|
@@ -21,12 +25,14 @@
|
|
21
25
|
// text="Click Me"
|
22
26
|
// customColor="#ab5348"
|
23
27
|
// type="secondary" // primary, secondary, cancel
|
28
|
+
// icon="icon-name" // icon name from icon component
|
24
29
|
// :isDisabled="true"
|
25
30
|
// :minWidth="minWidth"
|
26
31
|
// :data-id="test_data_id"
|
27
32
|
// />
|
28
33
|
|
29
34
|
import styled from 'vue3-styled-components'
|
35
|
+
import Icon from '../../icon'
|
30
36
|
|
31
37
|
const PageContainer = styled.div``
|
32
38
|
|
@@ -35,12 +41,14 @@ const ButtonAttrs = {
|
|
35
41
|
isDisabled: Boolean,
|
36
42
|
minWidth: String,
|
37
43
|
customColor: String,
|
44
|
+
fontColor: String,
|
38
45
|
noWrap: Boolean
|
39
46
|
}
|
40
47
|
const ButtonContainer = styled('div', ButtonAttrs)`
|
41
48
|
padding: 7px 15px;
|
42
49
|
font-size: 13px;
|
43
|
-
color: ${(props) =>
|
50
|
+
color: ${(props) =>
|
51
|
+
props.fontColor ? props.fontColor : props.theme.colors.white};
|
44
52
|
background-color: ${(props) =>
|
45
53
|
props.isDisabled
|
46
54
|
? props.theme.colors.disabled
|
@@ -69,9 +77,22 @@ const ButtonContainer = styled('div', ButtonAttrs)`
|
|
69
77
|
}
|
70
78
|
`
|
71
79
|
|
80
|
+
const LabelAttrs = {
|
81
|
+
hasIcon: Boolean
|
82
|
+
}
|
83
|
+
|
84
|
+
const Label = styled('span', LabelAttrs)`
|
85
|
+
display: flex;
|
86
|
+
align-items: center;
|
87
|
+
justify-content: center;
|
88
|
+
gap: ${(props) => (props.hasIcon ? '5px' : '0')};
|
89
|
+
`
|
90
|
+
|
72
91
|
export default {
|
73
92
|
name: 'main-button',
|
74
93
|
components: {
|
94
|
+
Icon,
|
95
|
+
Label,
|
75
96
|
PageContainer,
|
76
97
|
ButtonContainer
|
77
98
|
},
|
@@ -84,6 +105,10 @@ export default {
|
|
84
105
|
required: false,
|
85
106
|
default: false
|
86
107
|
},
|
108
|
+
icon: {
|
109
|
+
required: false,
|
110
|
+
default: null
|
111
|
+
},
|
87
112
|
text: {
|
88
113
|
required: true
|
89
114
|
},
|
@@ -91,6 +116,9 @@ export default {
|
|
91
116
|
required: false,
|
92
117
|
default: null
|
93
118
|
},
|
119
|
+
fontColor: {
|
120
|
+
required: false
|
121
|
+
},
|
94
122
|
noWrap: {
|
95
123
|
required: false,
|
96
124
|
default: false
|
@@ -0,0 +1,125 @@
|
|
1
|
+
<template>
|
2
|
+
<div>
|
3
|
+
<Text :expand="showButton && showAll" :fontSize="fontSize">{{ text }}</Text>
|
4
|
+
<ToggleContainer>
|
5
|
+
<ToggleButton
|
6
|
+
@click="toggleHandler"
|
7
|
+
v-if="showButton && !showAll"
|
8
|
+
:fontSize="fontSize"
|
9
|
+
>
|
10
|
+
{{ $gettext('Show more') }}
|
11
|
+
</ToggleButton>
|
12
|
+
<ToggleButton
|
13
|
+
@click="toggleHandler"
|
14
|
+
v-if="showButton && showAll"
|
15
|
+
:fontSize="fontSize"
|
16
|
+
>
|
17
|
+
{{ $gettext('Show less') }}
|
18
|
+
</ToggleButton>
|
19
|
+
</ToggleContainer>
|
20
|
+
</div>
|
21
|
+
</template>
|
22
|
+
|
23
|
+
<script>
|
24
|
+
import styled from 'vue3-styled-components'
|
25
|
+
import theme from '@/assets/theme.js'
|
26
|
+
|
27
|
+
const TextAttrs = {
|
28
|
+
expand: Boolean,
|
29
|
+
fontSize: String
|
30
|
+
}
|
31
|
+
const Text = styled('p', TextAttrs)`
|
32
|
+
display: block;
|
33
|
+
display: -webkit-box;
|
34
|
+
line-height: 1.3em;
|
35
|
+
-webkit-line-clamp: ${(props) => (props.expand ? 'unset' : '4')};
|
36
|
+
-webkit-box-orient: vertical;
|
37
|
+
overflow: hidden;
|
38
|
+
font-size: ${(props) => props.fontSize}px;
|
39
|
+
text-overflow: ellipsis;
|
40
|
+
`
|
41
|
+
|
42
|
+
const ToggleContainer = styled.div`
|
43
|
+
display: flex;
|
44
|
+
width: 100%;
|
45
|
+
`
|
46
|
+
|
47
|
+
const ToggleButton = styled('p', TextAttrs)`
|
48
|
+
font-size: ${(props) => props.fontSize}px;
|
49
|
+
cursor: pointer;
|
50
|
+
color: ${(props) => props.theme.colors.blue};
|
51
|
+
`
|
52
|
+
|
53
|
+
export default {
|
54
|
+
name: 'collapsable-info-text',
|
55
|
+
props: {
|
56
|
+
text: {
|
57
|
+
type: String,
|
58
|
+
required: true
|
59
|
+
},
|
60
|
+
fontSize: {
|
61
|
+
type: String,
|
62
|
+
default: '16px'
|
63
|
+
},
|
64
|
+
lineCount: {
|
65
|
+
type: Number,
|
66
|
+
default: 3
|
67
|
+
},
|
68
|
+
minWidth: {
|
69
|
+
type: String,
|
70
|
+
default: '100%'
|
71
|
+
}
|
72
|
+
},
|
73
|
+
components: {
|
74
|
+
Text,
|
75
|
+
ToggleButton,
|
76
|
+
ToggleContainer
|
77
|
+
},
|
78
|
+
data() {
|
79
|
+
return {
|
80
|
+
showButton: true,
|
81
|
+
showAll: false,
|
82
|
+
lineBreaks: []
|
83
|
+
}
|
84
|
+
},
|
85
|
+
computed: {
|
86
|
+
theme() {
|
87
|
+
return theme
|
88
|
+
}
|
89
|
+
},
|
90
|
+
methods: {
|
91
|
+
displayText() {
|
92
|
+
if (!this.showButton) {
|
93
|
+
return this.text
|
94
|
+
}
|
95
|
+
if (!this.showAll) {
|
96
|
+
let countIndex = 0
|
97
|
+
this.lineBreaks.forEach((el, index) => {
|
98
|
+
if (index < this.lineCount) {
|
99
|
+
countIndex += el.length
|
100
|
+
}
|
101
|
+
})
|
102
|
+
|
103
|
+
return this.text.slice(0, countIndex + 2) + '...'
|
104
|
+
} else {
|
105
|
+
return this.text
|
106
|
+
}
|
107
|
+
},
|
108
|
+
toggleHandler() {
|
109
|
+
this.showAll = !this.showAll
|
110
|
+
}
|
111
|
+
},
|
112
|
+
created() {
|
113
|
+
// TODO: this should divide the text into lines based on with. Currently it's just splitting by line breaks
|
114
|
+
// this.lineBreaks = this.text.split('\n')
|
115
|
+
|
116
|
+
// if (this.lineBreaks.length <= this.lineCount) {
|
117
|
+
// this.showButton = false
|
118
|
+
// }
|
119
|
+
|
120
|
+
if (this.text.length <= 170) {
|
121
|
+
this.showButton = false
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
</script>
|
@@ -92,6 +92,7 @@
|
|
92
92
|
fontSize="13px"
|
93
93
|
:label="filter.label"
|
94
94
|
:labelDataId="filter.dataId"
|
95
|
+
:isSearchable="filter.choices.length > 7"
|
95
96
|
alignItems="vertical"
|
96
97
|
:disabled="!filter.choices.length"
|
97
98
|
:minOptionLength="1"
|
@@ -225,6 +226,7 @@
|
|
225
226
|
fontSize="13px"
|
226
227
|
:label="filter.label"
|
227
228
|
alignItems="vertical"
|
229
|
+
:isSearchable="filter.choices.length > 7"
|
228
230
|
:disabled="!filter.choices.length"
|
229
231
|
>
|
230
232
|
<template #selector="{ selectedValue }">
|
@@ -115,7 +115,7 @@ const IconImage = styled('div', {
|
|
115
115
|
${({ theme, color }) => color && `fill: ${theme.colors[color] || color};`}
|
116
116
|
}
|
117
117
|
&:hover > svg path {
|
118
|
-
${
|
118
|
+
${props.hoveredColor && `fill: ${props.hoveredColor};`}
|
119
119
|
}
|
120
120
|
&:hover + div {
|
121
121
|
background-color: ${(props) => props.hoveredColor};
|
@@ -9,6 +9,7 @@
|
|
9
9
|
:hoveredBackgroundColor="hoveredBackgroundColor"
|
10
10
|
:isHovered="isHovered"
|
11
11
|
:data-id="dataId"
|
12
|
+
:noCursor="noCursor"
|
12
13
|
>
|
13
14
|
<icon
|
14
15
|
:disabled="disabled"
|
@@ -30,6 +31,9 @@
|
|
30
31
|
borderRadius="1px"
|
31
32
|
/>
|
32
33
|
</caret>
|
34
|
+
<lockContainer v-if="hasLock">
|
35
|
+
<icon size="9px" name="lock" color="yellow" />
|
36
|
+
</lockContainer>
|
33
37
|
</Wrapper>
|
34
38
|
</template>
|
35
39
|
|
@@ -54,8 +58,14 @@ const wrapperAttrs = {
|
|
54
58
|
size: String,
|
55
59
|
backgroundColor: String,
|
56
60
|
hoveredBackgroundColor: String,
|
57
|
-
hasBorder: Boolean
|
61
|
+
hasBorder: Boolean,
|
62
|
+
noCursor: Boolean
|
58
63
|
}
|
64
|
+
const lockContainer = styled.div`
|
65
|
+
position: absolute;
|
66
|
+
bottom: 6px;
|
67
|
+
right: 6px;
|
68
|
+
`
|
59
69
|
const Wrapper = styled('div', wrapperAttrs)`
|
60
70
|
position: relative;
|
61
71
|
display: inline-flex;
|
@@ -67,7 +77,8 @@ const Wrapper = styled('div', wrapperAttrs)`
|
|
67
77
|
: ''};
|
68
78
|
justify-content: center;
|
69
79
|
align-items: center;
|
70
|
-
cursor: ${(props) =>
|
80
|
+
cursor: ${(props) =>
|
81
|
+
props.noCursor ? 'auto' : props.disabled ? 'not-allowed' : 'pointer'};
|
71
82
|
background-color: ${(props) =>
|
72
83
|
props.theme.colors[props.backgroundColor] || props.backgroundColor};
|
73
84
|
border-radius: ${(props) => props.borderRadius};
|
@@ -95,7 +106,8 @@ export default {
|
|
95
106
|
components: {
|
96
107
|
Wrapper,
|
97
108
|
icon,
|
98
|
-
caret
|
109
|
+
caret,
|
110
|
+
lockContainer
|
99
111
|
},
|
100
112
|
props: {
|
101
113
|
disabled: {
|
@@ -153,6 +165,14 @@ export default {
|
|
153
165
|
isLoading: {
|
154
166
|
required: false,
|
155
167
|
default: false
|
168
|
+
},
|
169
|
+
noCursor: {
|
170
|
+
required: false,
|
171
|
+
default: false
|
172
|
+
},
|
173
|
+
hasLock: {
|
174
|
+
required: false,
|
175
|
+
default: false
|
156
176
|
}
|
157
177
|
}
|
158
178
|
}
|
@@ -26,7 +26,7 @@
|
|
26
26
|
<input-container
|
27
27
|
ref="inputElement"
|
28
28
|
:placeholder="placeholder"
|
29
|
-
:isError="
|
29
|
+
:isError="hasError"
|
30
30
|
:inputWidth="inputWidth"
|
31
31
|
:minWidth="minWidth"
|
32
32
|
:inputHeight="inputHeight"
|
@@ -53,12 +53,12 @@
|
|
53
53
|
>
|
54
54
|
<icon name="current_variant" size="20px" />
|
55
55
|
</icon-wrapper>
|
56
|
-
<icon-wrapper v-if="
|
56
|
+
<icon-wrapper v-if="hasError" size="16px">
|
57
57
|
<icon name="warning" size="16px" cursor="default" />
|
58
58
|
</icon-wrapper>
|
59
59
|
</icon-container>
|
60
|
-
<error-message v-if="
|
61
|
-
|
60
|
+
<error-message v-if="hasError && hasErrorMessage">{{
|
61
|
+
dynamicErrorMessage
|
62
62
|
}}</error-message>
|
63
63
|
</input-error-wrapper>
|
64
64
|
</input-wrapper>
|
@@ -70,6 +70,7 @@ import styled from 'vue3-styled-components'
|
|
70
70
|
import InfoText from '../../infoText'
|
71
71
|
import Icon from '../../icon'
|
72
72
|
import ErrorMessage from '../../errorMessage'
|
73
|
+
import InputValidations from '../../../mixins/inputValidations.js'
|
73
74
|
|
74
75
|
const Container = styled.div`
|
75
76
|
width: 100%;
|
@@ -229,11 +230,25 @@ export default {
|
|
229
230
|
InputErrorWrapper,
|
230
231
|
optionalLabel
|
231
232
|
},
|
233
|
+
mixins: [InputValidations],
|
232
234
|
data() {
|
233
235
|
return {
|
234
236
|
inputTypeData: 'text'
|
235
237
|
}
|
236
238
|
},
|
239
|
+
computed: {
|
240
|
+
hasError() {
|
241
|
+
return this.isError || this.error
|
242
|
+
},
|
243
|
+
hasErrorMessage() {
|
244
|
+
return (
|
245
|
+
(this.errorMessage && this.errorMessage.length > 0) || this.errMessage
|
246
|
+
)
|
247
|
+
},
|
248
|
+
dynamicErrorMessage() {
|
249
|
+
return this.errMessage || this.errorMessage
|
250
|
+
}
|
251
|
+
},
|
237
252
|
props: {
|
238
253
|
placeholder: {
|
239
254
|
required: false,
|
@@ -336,6 +351,7 @@ export default {
|
|
336
351
|
this.$emit('input-change', event.target.value)
|
337
352
|
},
|
338
353
|
onInputBlur($event) {
|
354
|
+
this.validateInput($event.target.value)
|
339
355
|
this.$emit('input-blur', $event.target.value)
|
340
356
|
},
|
341
357
|
toggleShowPassword() {
|
@@ -3,6 +3,7 @@
|
|
3
3
|
<radio-wrapper v-for="(item, index) in options" :key="item.value">
|
4
4
|
<label-container
|
5
5
|
:size="size"
|
6
|
+
:hasLabel="item.label"
|
6
7
|
:isDisabled="item.disabled"
|
7
8
|
:isChecked="selectedOption === item.value"
|
8
9
|
:checkmarkColor="checkmarkColor"
|
@@ -17,7 +18,7 @@
|
|
17
18
|
:data-id="`radio_button_${dataId}_option_${item.value}`"
|
18
19
|
/>
|
19
20
|
<span class="checkmark"></span>
|
20
|
-
<label-text :isDisabled="item.disabled">{{ item.label }}</label-text>
|
21
|
+
<label-text :isDisabled="item.disabled" v-if="item.label">{{ item.label }}</label-text>
|
21
22
|
<info-text v-if="item.infoText" :text="item.infoText" size="16px" />
|
22
23
|
</label-container>
|
23
24
|
<image-container v-if="item.img">
|
@@ -98,7 +99,9 @@ const containerProps = {
|
|
98
99
|
const LabelContainer = styled('label', containerProps)`
|
99
100
|
display: grid;
|
100
101
|
grid-template-columns: auto 1fr auto;
|
101
|
-
grid-gap:
|
102
|
+
grid-gap: ${(props) =>
|
103
|
+
props.hasLabel
|
104
|
+
? '15px' : 0 };
|
102
105
|
align-items: center;
|
103
106
|
color: ${(props) =>
|
104
107
|
props.isDisabled ? props.theme.colors.grey2 : props.theme.colors.black};
|
@@ -42,6 +42,7 @@
|
|
42
42
|
:fontColor="
|
43
43
|
buttonFontColor || colorMode == 'dark' ? 'white' : 'black'
|
44
44
|
"
|
45
|
+
:fontSize="fontSize"
|
45
46
|
:hasError="hasError"
|
46
47
|
:hasNoPadding="isSearchBarVisible || !hasSelectButtonPadding"
|
47
48
|
:disabled="disabled"
|
@@ -69,6 +70,7 @@
|
|
69
70
|
buttonFontColor || colorMode == 'dark' ? 'white' : 'black'
|
70
71
|
"
|
71
72
|
:value="textSearch"
|
73
|
+
:inputWidth="computedWidth"
|
72
74
|
@keydown.stop="onKeyDown"
|
73
75
|
@input-change="searchChange"
|
74
76
|
@click.stop
|
@@ -145,6 +147,7 @@
|
|
145
147
|
// <Select
|
146
148
|
// hoverDropdown="true"
|
147
149
|
// selectWidth="100%"
|
150
|
+
// minWidth="220px"
|
148
151
|
// optionWidth="50%"
|
149
152
|
// label="that is a label"
|
150
153
|
// alignItems="vertical"
|
@@ -376,6 +379,8 @@ const inputAttrs = {
|
|
376
379
|
const InputWrapper = styled('div', inputAttrs)`
|
377
380
|
position: ${(props) => (props.noRelative ? 'static' : 'relative')};
|
378
381
|
display: grid;
|
382
|
+
width: 100%;
|
383
|
+
min-width: ${(props) => (props.minWidth ? props.minWidth : '150px')};
|
379
384
|
align-items: center;
|
380
385
|
gap: 8px;
|
381
386
|
grid-template-columns: ${(props) =>
|
@@ -426,6 +431,12 @@ export default {
|
|
426
431
|
required: false,
|
427
432
|
default: '100%'
|
428
433
|
},
|
434
|
+
minWidth: {
|
435
|
+
required: false
|
436
|
+
},
|
437
|
+
maxWidth: {
|
438
|
+
required: false
|
439
|
+
},
|
429
440
|
selectHeight: {
|
430
441
|
type: String,
|
431
442
|
required: false,
|
@@ -439,9 +450,6 @@ export default {
|
|
439
450
|
required: false,
|
440
451
|
default: '36px'
|
441
452
|
},
|
442
|
-
minWidth: {
|
443
|
-
required: false
|
444
|
-
},
|
445
453
|
optionWidth: {
|
446
454
|
required: false,
|
447
455
|
default: null
|
@@ -471,6 +479,10 @@ export default {
|
|
471
479
|
dropdownFontColor: {
|
472
480
|
required: false
|
473
481
|
},
|
482
|
+
dropDownArrowVisible: {
|
483
|
+
required: false,
|
484
|
+
default: true
|
485
|
+
},
|
474
486
|
caretColor: {
|
475
487
|
required: false
|
476
488
|
},
|
@@ -517,6 +529,10 @@ export default {
|
|
517
529
|
type: Boolean,
|
518
530
|
default: false
|
519
531
|
},
|
532
|
+
leftPadding: {
|
533
|
+
type: String,
|
534
|
+
default: '15px'
|
535
|
+
},
|
520
536
|
tablePaddingLeft: {
|
521
537
|
required: false
|
522
538
|
},
|
@@ -556,7 +572,7 @@ export default {
|
|
556
572
|
data() {
|
557
573
|
return {
|
558
574
|
selectedValue: null,
|
559
|
-
paddingLeft: this.isDraggable ? '30px' :
|
575
|
+
paddingLeft: this.isDraggable ? '30px' : this.leftPadding,
|
560
576
|
isDropdownOpen: false,
|
561
577
|
isActive: false,
|
562
578
|
textSearch: '',
|
@@ -600,16 +616,14 @@ export default {
|
|
600
616
|
toggleCaretDropdown() {
|
601
617
|
this.isDropdownOpen = !this.isDropdownOpen
|
602
618
|
},
|
603
|
-
openDropdown() {
|
604
|
-
this.focus()
|
605
|
-
this.isDropdownOpen = true
|
606
|
-
},
|
607
619
|
closeDropdown() {
|
608
620
|
this.blur()
|
621
|
+
this.clearSearch()
|
609
622
|
this.isDropdownOpen = false
|
610
623
|
},
|
611
624
|
clearSearch() {
|
612
625
|
this.textSearch = ''
|
626
|
+
this.searchChange('')
|
613
627
|
},
|
614
628
|
optionSelected(e) {
|
615
629
|
this.selectedValue = e
|
@@ -646,6 +660,7 @@ export default {
|
|
646
660
|
|
647
661
|
return
|
648
662
|
}
|
663
|
+
|
649
664
|
el.style.display = 'inherit'
|
650
665
|
})
|
651
666
|
},
|
@@ -757,6 +772,7 @@ export default {
|
|
757
772
|
observeSelectWidth() {
|
758
773
|
if (!this.$refs.select) return
|
759
774
|
this.selectResizeObserver = new ResizeObserver(() =>
|
775
|
+
// eslint-disable-next-line vue/valid-next-tick
|
760
776
|
this.$nextTick(() => this.getDropdownWidth())
|
761
777
|
)
|
762
778
|
this.selectResizeObserver.observe(this.$refs.dropdown.$el)
|
@@ -783,9 +799,6 @@ export default {
|
|
783
799
|
this.$refs.dropdown.$el.scrollTop = topPos
|
784
800
|
}
|
785
801
|
}
|
786
|
-
},
|
787
|
-
clearSearch() {
|
788
|
-
this.textSearch = ''
|
789
802
|
}
|
790
803
|
},
|
791
804
|
computed: {
|
@@ -805,6 +818,15 @@ export default {
|
|
805
818
|
this.isDropdownOpen
|
806
819
|
)
|
807
820
|
},
|
821
|
+
computedWidth() {
|
822
|
+
function removePX(item) {
|
823
|
+
return Number(item.replace('px', ''))
|
824
|
+
}
|
825
|
+
|
826
|
+
return this.selectWidth === '100%'
|
827
|
+
? '100%'
|
828
|
+
: removePX(this.selectWidth) - removePX(CARET_WIDTH) + 'px'
|
829
|
+
},
|
808
830
|
getOptionWidth() {
|
809
831
|
if (this.optionWidth) return this.optionWidth
|
810
832
|
|
@@ -838,6 +860,7 @@ export default {
|
|
838
860
|
},
|
839
861
|
async isDropdownOpen(val) {
|
840
862
|
if (val) {
|
863
|
+
this.$emit('on-dropdown-open')
|
841
864
|
setTimeout(() => {
|
842
865
|
this.isClickOutsideActive = true
|
843
866
|
}, 10)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
<template>
|
2
|
+
<Modal :is-open="isOpen" @on-close="closeModal">
|
3
|
+
<modalContainer>
|
4
|
+
<modalTitle v-if="$slots.title">
|
5
|
+
<slot name="title"></slot>
|
6
|
+
</modalTitle>
|
7
|
+
<textContainer v-if="$slots.body">
|
8
|
+
<slot name="body"></slot>
|
9
|
+
</textContainer>
|
10
|
+
<buttonContainer v-if="$slots.buttons">
|
11
|
+
<slot name="buttons"></slot>
|
12
|
+
</buttonContainer>
|
13
|
+
</modalContainer>
|
14
|
+
</Modal>
|
15
|
+
</template>
|
16
|
+
<script>
|
17
|
+
import styled from 'vue3-styled-components'
|
18
|
+
import Modal from '../modal'
|
19
|
+
const modalContainer = styled.div`
|
20
|
+
width: 450px;
|
21
|
+
min-height: 205px;
|
22
|
+
padding: 40px 40px 30px 40px;
|
23
|
+
`
|
24
|
+
const modalTitle = styled.div`
|
25
|
+
color: ${(props) => props.theme.colors.black};
|
26
|
+
font-family: ${(props) => props.theme.fonts.mainFont};
|
27
|
+
font-size: 18px;
|
28
|
+
font-style: normal;
|
29
|
+
font-weight: 700;
|
30
|
+
line-height: 120%;
|
31
|
+
text-transform: uppercase;
|
32
|
+
`
|
33
|
+
const buttonContainer = styled.div`
|
34
|
+
display: inline-flex;
|
35
|
+
align-items: flex-start;
|
36
|
+
gap: 20px;
|
37
|
+
`
|
38
|
+
const textContainer = styled.div`
|
39
|
+
color: ${(props) => props.theme.colors.black};
|
40
|
+
font-family: ${(props) => props.theme.fonts.mainFont};
|
41
|
+
font-size: 13px;
|
42
|
+
font-style: normal;
|
43
|
+
font-weight: 400;
|
44
|
+
line-height: normal;
|
45
|
+
padding: 30px 0px;
|
46
|
+
white-space: pre-wrap;
|
47
|
+
`
|
48
|
+
export default {
|
49
|
+
name: 'actionModal',
|
50
|
+
props: ['isOpen'],
|
51
|
+
components: {
|
52
|
+
Modal,
|
53
|
+
modalContainer,
|
54
|
+
modalTitle,
|
55
|
+
buttonContainer,
|
56
|
+
textContainer
|
57
|
+
},
|
58
|
+
methods: {
|
59
|
+
closeModal() {
|
60
|
+
this.$emit('on-close')
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
</script>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<template>
|
2
|
+
<ActionModal :is-open="isOpen" @on-close="closeModal">
|
3
|
+
<modalContainer>
|
4
|
+
<template #title>
|
5
|
+
<slot name="title" />
|
6
|
+
</template>
|
7
|
+
<template #body>
|
8
|
+
<slot name="body" />
|
9
|
+
</template>
|
10
|
+
<template #buttons>
|
11
|
+
<buttonContainer>
|
12
|
+
<Button type="primary" :text="$gettext('Got it')" minWidth="150px" @click="closeModal" />
|
13
|
+
</buttonContainer>
|
14
|
+
</template>
|
15
|
+
|
16
|
+
</modalContainer>
|
17
|
+
</ActionModal>
|
18
|
+
</template>
|
19
|
+
<script>
|
20
|
+
|
21
|
+
import styled from 'vue3-styled-components'
|
22
|
+
import ActionModal from '../actionModal'
|
23
|
+
import Button from '../../buttons/mainButton'
|
24
|
+
const modalContainer = styled.div`
|
25
|
+
width: 450px;
|
26
|
+
min-height: 205px;
|
27
|
+
padding: 40px 40px 30px 40px;
|
28
|
+
`
|
29
|
+
const buttonContainer = styled.div`
|
30
|
+
display: inline-flex;
|
31
|
+
align-items: flex-start;
|
32
|
+
gap: 20px;
|
33
|
+
`
|
34
|
+
export default {
|
35
|
+
name: 'InfoModal',
|
36
|
+
props: ['isOpen'],
|
37
|
+
components: {
|
38
|
+
modalContainer,
|
39
|
+
buttonContainer,
|
40
|
+
ActionModal,
|
41
|
+
Button
|
42
|
+
},
|
43
|
+
methods: {
|
44
|
+
closeModal() {
|
45
|
+
this.$emit('on-close')
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
</script>
|