@farm-investimentos/front-mfe-components 15.3.6 → 15.4.1
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/dist/front-mfe-components.common.js +1107 -142
- package/dist/front-mfe-components.common.js.map +1 -1
- package/dist/front-mfe-components.css +1 -1
- package/dist/front-mfe-components.umd.js +1107 -142
- package/dist/front-mfe-components.umd.js.map +1 -1
- package/dist/front-mfe-components.umd.min.js +1 -1
- package/dist/front-mfe-components.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/DatePicker/DatePicker.stories.js +13 -4
- package/src/components/DatePicker/DatePicker.vue +18 -1
- package/src/components/RangeDatePicker/RangeDatePicker.vue +14 -0
- package/src/components/SelectAutoComplete/SelectAutoComplete.scss +49 -0
- package/src/components/SelectAutoComplete/SelectAutoComplete.stories.js +328 -0
- package/src/components/SelectAutoComplete/SelectAutoComplete.vue +532 -0
- package/src/components/SelectAutoComplete/__tests__/SelectAutoComplete.spec.js +130 -0
- package/src/components/SelectAutoComplete/__tests__/useSelectAutoComplete.spec.js +28 -0
- package/src/components/SelectAutoComplete/composables/index.ts +3 -0
- package/src/components/SelectAutoComplete/composables/useSelectAutoComplete.ts +37 -0
- package/src/components/SelectAutoComplete/index.ts +4 -0
- package/src/main.ts +1 -1
package/package.json
CHANGED
|
@@ -77,14 +77,23 @@ export const IsNull = () => ({
|
|
|
77
77
|
</div>`,
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
-
export const
|
|
80
|
+
export const OnlyAllowedDates = () => ({
|
|
81
81
|
data() {
|
|
82
82
|
return {
|
|
83
|
-
date: '
|
|
83
|
+
date: '',
|
|
84
84
|
};
|
|
85
85
|
},
|
|
86
|
-
|
|
86
|
+
props: {
|
|
87
|
+
allowedDates: {
|
|
88
|
+
default: () => (value) => {
|
|
89
|
+
const day = parseInt(value.split('-')[2], 10);
|
|
90
|
+
return [5, 10, 15, 20, 25].includes(day);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
template: `<div style='max-width: 320px'><farm-input-datepicker position="bottom" :allowed-dates="allowedDates" inputId="input-custom-id-1" v-model="date" /></div>`,
|
|
87
95
|
});
|
|
96
|
+
|
|
88
97
|
export const TopPositioned = () => ({
|
|
89
98
|
data() {
|
|
90
99
|
return {
|
|
@@ -107,4 +116,4 @@ export const CenterPositioned = () => ({
|
|
|
107
116
|
<farm-input-datepicker inputId="input-custom-id-0" v-model="date" position="center" />
|
|
108
117
|
{{ date }}
|
|
109
118
|
</div>`,
|
|
110
|
-
});
|
|
119
|
+
});
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
:header-date-format="formatDatePickerHeader"
|
|
20
20
|
:max="max"
|
|
21
21
|
:min="min"
|
|
22
|
+
:allowed-dates="allowedDates"
|
|
22
23
|
>
|
|
23
24
|
<farm-btn plain title="Limpar" color="primary" :disabled="isDisabled" @click="clear">
|
|
24
25
|
Limpar
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
:readonly="readonly"
|
|
46
47
|
:mask="`${readonly ? '' : '##/##/####'}`"
|
|
47
48
|
:id="inputId"
|
|
48
|
-
:rules="[checkDateValid, checkMax, checkMin, checkRequire]"
|
|
49
|
+
:rules="[checkDateValid, checkMax, checkMin, checkRequire, checkIsInAllowedDates]"
|
|
49
50
|
@keyup="keyUpInput"
|
|
50
51
|
/>
|
|
51
52
|
</template>
|
|
@@ -104,6 +105,13 @@ export default defineComponent({
|
|
|
104
105
|
type: String as PropType<'top' | 'bottom' | 'center'>,
|
|
105
106
|
default: 'bottom',
|
|
106
107
|
},
|
|
108
|
+
/**
|
|
109
|
+
* Allowed dates to be selected and validated
|
|
110
|
+
*/
|
|
111
|
+
allowedDates: {
|
|
112
|
+
type: Function,
|
|
113
|
+
default: () => {},
|
|
114
|
+
},
|
|
107
115
|
/**
|
|
108
116
|
* Required field (inside form)
|
|
109
117
|
*/
|
|
@@ -154,6 +162,15 @@ export default defineComponent({
|
|
|
154
162
|
}
|
|
155
163
|
return true;
|
|
156
164
|
},
|
|
165
|
+
checkIsInAllowedDates: value => {
|
|
166
|
+
const dateSelected = convertDate(value);
|
|
167
|
+
|
|
168
|
+
if (!this.required && value.length === 0) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return this.allowedDates(dateSelected) || 'Data inválida';
|
|
173
|
+
},
|
|
157
174
|
};
|
|
158
175
|
},
|
|
159
176
|
watch: {
|
|
@@ -152,6 +152,19 @@ export default defineComponent({
|
|
|
152
152
|
this.menuField = false;
|
|
153
153
|
this.$refs.contextmenu.inputValue = false;
|
|
154
154
|
},
|
|
155
|
+
sortDates(dates) {
|
|
156
|
+
if(dates?.length !== 2) {
|
|
157
|
+
return dates;
|
|
158
|
+
}
|
|
159
|
+
const firstDate = new Date(dates[0]);
|
|
160
|
+
const secondDate = new Date(dates[1]);
|
|
161
|
+
|
|
162
|
+
if (firstDate.getTime() < secondDate.getTime()) {
|
|
163
|
+
return [dates[0], dates[1]];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return [dates[1], dates[0]];
|
|
167
|
+
},
|
|
155
168
|
formatDatePickerHeader,
|
|
156
169
|
},
|
|
157
170
|
computed: {
|
|
@@ -160,6 +173,7 @@ export default defineComponent({
|
|
|
160
173
|
return this.value;
|
|
161
174
|
},
|
|
162
175
|
set(val) {
|
|
176
|
+
val = this.sortDates(val);
|
|
163
177
|
this.$emit('input', val);
|
|
164
178
|
},
|
|
165
179
|
},
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
@import '../TextFieldV2/TextFieldV2.scss';
|
|
2
|
+
@import '../../configurations/mixins';
|
|
3
|
+
|
|
4
|
+
.farm-select {
|
|
5
|
+
&__hint-text {
|
|
6
|
+
@include hintText;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.farm-listitem--selected {
|
|
11
|
+
background-color: var(--farm-neutral-lighten);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.farm-contextmenu {
|
|
15
|
+
width: 100%;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.farm-icon {
|
|
19
|
+
transition: all ease 0.3s;
|
|
20
|
+
cursor: pointer;
|
|
21
|
+
|
|
22
|
+
&--rotate {
|
|
23
|
+
transform: rotate(180deg);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.farm-select__checkbox {
|
|
28
|
+
margin-right: 8px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
:deep(.farm-listitem:hover .farm-typography) {
|
|
32
|
+
color: var(--farm-primary-base);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:deep(.farm-listitem:focus .farm-typography) {
|
|
36
|
+
color: var(--farm-primary-base);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:deep(.farm-listitem:hover .farm-checkbox .farm-icon) {
|
|
40
|
+
color: var(--farm-primary-lighten);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:deep(.farm-listitem:focus .farm-checkbox .farm-icon) {
|
|
44
|
+
color: var(--farm-primary-lighten);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:deep(.farm-listitem:hover .farm-checkbox.farm-checkbox--checked .farm-icon) {
|
|
48
|
+
color: white;
|
|
49
|
+
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import SelectAutoComplete from './SelectAutoComplete.vue';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
title: 'Form/SelectAutoComplete',
|
|
5
|
+
component: SelectAutoComplete,
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const Primary = () => ({
|
|
9
|
+
data() {
|
|
10
|
+
return {
|
|
11
|
+
v: null,
|
|
12
|
+
items: [
|
|
13
|
+
{ value: 0, text: 'value 0' },
|
|
14
|
+
{ value: 1, text: 'value 1' },
|
|
15
|
+
{ value: 2, text: 'value 2' },
|
|
16
|
+
{ value: 3, text: 'value 3' },
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
template: `<div style="width: 120px;">
|
|
21
|
+
<farm-label for="select_id">
|
|
22
|
+
label
|
|
23
|
+
</farm-label>
|
|
24
|
+
<farm-select-auto-complete id="select_id" v-model="v" :items="items" />
|
|
25
|
+
v-model: {{ v }}
|
|
26
|
+
|
|
27
|
+
</div>`,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export const InitialValue = () => ({
|
|
31
|
+
data() {
|
|
32
|
+
return {
|
|
33
|
+
v: 1,
|
|
34
|
+
items: [
|
|
35
|
+
{ value: 1, text: ' value 1' },
|
|
36
|
+
{ value: 2, text: ' value 2' },
|
|
37
|
+
{ value: 3, text: ' value 3' },
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
template: `<div style="width: 480px">
|
|
42
|
+
<farm-select-auto-complete v-model="v" :items="items" />
|
|
43
|
+
v-model: {{ v }}
|
|
44
|
+
</div>`,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export const Readonly = () => ({
|
|
48
|
+
data() {
|
|
49
|
+
return {
|
|
50
|
+
v: 1,
|
|
51
|
+
items: [
|
|
52
|
+
{ value: 1, text: ' value 1' },
|
|
53
|
+
{ value: 2, text: ' value 2' },
|
|
54
|
+
{ value: 3, text: ' value 3' },
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
template: `<div style="width: 480px">
|
|
59
|
+
<farm-select-auto-complete v-model="v" :items="items" readonly />
|
|
60
|
+
v-model: {{ v }}
|
|
61
|
+
</div>`,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
export const HintText = () => ({
|
|
65
|
+
data() {
|
|
66
|
+
return {
|
|
67
|
+
v: null,
|
|
68
|
+
items: [
|
|
69
|
+
{ value: 1, text: ' value 1' },
|
|
70
|
+
{ value: 2, text: ' value 2' },
|
|
71
|
+
{ value: 3, text: ' value 3' },
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
template: `<div style="width: 480px">
|
|
76
|
+
<farm-select-auto-complete v-model="v" :items="items" hint="Hint Text" :persistent-hint="false" />
|
|
77
|
+
v-model: {{ v }}
|
|
78
|
+
</div>`,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
export const PersistentHintText = () => ({
|
|
82
|
+
data() {
|
|
83
|
+
return {
|
|
84
|
+
v: null,
|
|
85
|
+
items: [
|
|
86
|
+
{ value: 1, text: ' value 1' },
|
|
87
|
+
{ value: 2, text: ' value 2' },
|
|
88
|
+
{ value: 3, text: ' value 3' },
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
template: `<div style="width: 480px">
|
|
93
|
+
<farm-select-auto-complete v-model="v" :items="items" hint="Hint Text" />
|
|
94
|
+
v-model: {{ v }}
|
|
95
|
+
</div>`,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
export const Disabled = () => ({
|
|
99
|
+
data() {
|
|
100
|
+
return {
|
|
101
|
+
v: 1,
|
|
102
|
+
items: [
|
|
103
|
+
{ value: 1, text: ' value 1' },
|
|
104
|
+
{ value: 2, text: ' value 2' },
|
|
105
|
+
{ value: 3, text: ' value 3' },
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
template: `<div style="width: 480px">
|
|
110
|
+
<farm-select-auto-complete v-model="v" :items="items" disabled />
|
|
111
|
+
v-model: {{ v }}
|
|
112
|
+
</div>`,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
export const Validate = () => ({
|
|
116
|
+
data() {
|
|
117
|
+
return {
|
|
118
|
+
v: null,
|
|
119
|
+
items: [
|
|
120
|
+
{ value: 1, text: ' value 1' },
|
|
121
|
+
{ value: 2, text: ' value 2' },
|
|
122
|
+
{ value: 3, text: ' value 3' },
|
|
123
|
+
],
|
|
124
|
+
rules: {
|
|
125
|
+
required: value => !!value || 'Required field',
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
template: `<div style="width: 480px">
|
|
130
|
+
<farm-label required>Required</farm-label>
|
|
131
|
+
<farm-select-auto-complete v-model="v" :items="items" :rules="[rules.required]" />
|
|
132
|
+
v-model: {{ v }}
|
|
133
|
+
</div>`,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
export const Reset = () => ({
|
|
137
|
+
data() {
|
|
138
|
+
return {
|
|
139
|
+
v: null,
|
|
140
|
+
items: [
|
|
141
|
+
{ value: 1, text: ' value 1' },
|
|
142
|
+
{ value: 2, text: ' value 2' },
|
|
143
|
+
{ value: 3, text: ' value 3' },
|
|
144
|
+
],
|
|
145
|
+
rules: {
|
|
146
|
+
required: value => !!value || 'Required field',
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
methods: {
|
|
151
|
+
click() {
|
|
152
|
+
this.$refs.select.reset();
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
template: `<div style="width: 480px">
|
|
156
|
+
<farm-select-auto-complete v-model="v" :items="items" ref="select" :rules="[rules.required]" />
|
|
157
|
+
v-model: {{ v }}
|
|
158
|
+
<farm-btn @click="click">
|
|
159
|
+
reset
|
|
160
|
+
</farm-btn>
|
|
161
|
+
</div>`,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
export const CustomKeys = () => ({
|
|
165
|
+
data() {
|
|
166
|
+
return {
|
|
167
|
+
v: null,
|
|
168
|
+
items: [
|
|
169
|
+
{ id: 1, label: ' value 1' },
|
|
170
|
+
{ id: 2, label: ' value 2' },
|
|
171
|
+
{ id: 3, label: ' value 3' },
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
template: `<div style="width: 480px">
|
|
176
|
+
<farm-select-auto-complete v-model="v" :items="items" item-text="label" item-value="id" />
|
|
177
|
+
v-model: {{ v }}
|
|
178
|
+
</div>`,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
export const OutsideChangeVmodel = () => ({
|
|
182
|
+
data() {
|
|
183
|
+
return {
|
|
184
|
+
v: null,
|
|
185
|
+
items: [
|
|
186
|
+
{ value: 1, text: 'value 1' },
|
|
187
|
+
{ value: 2, text: 'value 2' },
|
|
188
|
+
{ value: 3, text: 'value 3' },
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
},
|
|
192
|
+
methods: {
|
|
193
|
+
onClick() {
|
|
194
|
+
this.v = 2;
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
template: `<div style="width: 120px">
|
|
198
|
+
<farm-select-auto-complete v-model="v" :items="items" />
|
|
199
|
+
v-model: {{ v }}
|
|
200
|
+
<farm-btn @click="onClick">
|
|
201
|
+
change value
|
|
202
|
+
</farm-btn>
|
|
203
|
+
</div>`,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
export const NoItems = () => ({
|
|
207
|
+
data() {
|
|
208
|
+
return {
|
|
209
|
+
v: null,
|
|
210
|
+
items: [],
|
|
211
|
+
};
|
|
212
|
+
},
|
|
213
|
+
template: `<div style="width: 120px">
|
|
214
|
+
<farm-select-auto-complete v-model="v" :items="items" />
|
|
215
|
+
v-model: {{ v }}
|
|
216
|
+
</div>`,
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
export const Multiple = () => ({
|
|
220
|
+
data() {
|
|
221
|
+
return {
|
|
222
|
+
v: null,
|
|
223
|
+
items: [
|
|
224
|
+
{ value: 0, text: 'value 0' },
|
|
225
|
+
{ value: 1, text: 'value 1' },
|
|
226
|
+
{ value: 2, text: 'value 2' },
|
|
227
|
+
{ value: 3, text: 'value 3' },
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
},
|
|
231
|
+
template: `<div style="width: 400px">
|
|
232
|
+
<farm-select-auto-complete v-model="v" :items="items" multiple />
|
|
233
|
+
v-model: {{ v }}
|
|
234
|
+
</div>`,
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
export const MultipleInitValue = () => ({
|
|
238
|
+
data() {
|
|
239
|
+
return {
|
|
240
|
+
v: [2, 3],
|
|
241
|
+
items: [
|
|
242
|
+
{ id: 0, label: 'value 0' },
|
|
243
|
+
{ id: 1, label: 'value 1' },
|
|
244
|
+
{ id: 2, label: 'value 2' },
|
|
245
|
+
{ id: 3, label: 'value 3' },
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
},
|
|
249
|
+
methods: {
|
|
250
|
+
click() {
|
|
251
|
+
this.$refs.select.reset();
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
template: `<div style="width: 400px">
|
|
255
|
+
<farm-select-auto-complete
|
|
256
|
+
v-model="v"
|
|
257
|
+
item-value="id"
|
|
258
|
+
item-text="label"
|
|
259
|
+
ref="select"
|
|
260
|
+
multiple
|
|
261
|
+
:items="items"
|
|
262
|
+
/>
|
|
263
|
+
v-model: {{ v }}
|
|
264
|
+
<farm-btn @click="click">
|
|
265
|
+
reset
|
|
266
|
+
</farm-btn>
|
|
267
|
+
</div>`,
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
export const MultipleResetByValue = () => ({
|
|
271
|
+
data() {
|
|
272
|
+
return {
|
|
273
|
+
filters: {
|
|
274
|
+
v: null,
|
|
275
|
+
},
|
|
276
|
+
items: [
|
|
277
|
+
{ id: 1, label: 'value 1' },
|
|
278
|
+
{ id: 2, label: 'value 2' },
|
|
279
|
+
{ id: 3, label: 'value 3' },
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
},
|
|
283
|
+
methods: {
|
|
284
|
+
click() {
|
|
285
|
+
this.filters.v = [1];
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
template: `<div style="width: 400px">
|
|
289
|
+
<farm-select-auto-complete
|
|
290
|
+
v-model="filters.v"
|
|
291
|
+
item-value="id"
|
|
292
|
+
item-text="label"
|
|
293
|
+
ref="select"
|
|
294
|
+
multiple
|
|
295
|
+
:items="items"
|
|
296
|
+
/>
|
|
297
|
+
v-model: {{ filters.v }}
|
|
298
|
+
<farm-btn @click="click">
|
|
299
|
+
reset
|
|
300
|
+
</farm-btn>
|
|
301
|
+
</div>`,
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
export const ChangeEvent = () => ({
|
|
305
|
+
data() {
|
|
306
|
+
return {
|
|
307
|
+
v: null,
|
|
308
|
+
items: [
|
|
309
|
+
{ value: 0, text: 'value 0' },
|
|
310
|
+
{ value: 1, text: 'value 1' },
|
|
311
|
+
{ value: 2, text: 'value 2' },
|
|
312
|
+
{ value: 3, text: 'value 3' },
|
|
313
|
+
],
|
|
314
|
+
};
|
|
315
|
+
},
|
|
316
|
+
methods: {
|
|
317
|
+
onChange(value) {
|
|
318
|
+
alert('Selected value: ' + value);
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
template: `<div style="width: 120px;">
|
|
322
|
+
<farm-label for="select_id">
|
|
323
|
+
label
|
|
324
|
+
</farm-label>
|
|
325
|
+
<farm-select-auto-complete id="select_id" v-model="v" :items="items" @change="onChange" />
|
|
326
|
+
|
|
327
|
+
</div>`,
|
|
328
|
+
});
|