vueless 1.4.11 → 1.4.12-beta.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/package.json +2 -2
- package/types.ts +3 -1
- package/ui.form-date-picker-range/UDatePickerRange.vue +6 -2
- package/ui.form-date-picker-range/UDatePickerRangeInputs.vue +3 -5
- package/ui.form-date-picker-range/UDatePickerRangePeriodMenu.vue +15 -5
- package/ui.form-date-picker-range/tests/UDatePickerRange.test.ts +59 -0
- package/ui.form-date-picker-range/types.ts +3 -3
- package/utils/node/helper.js +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vueless",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.12-beta.1",
|
|
4
4
|
"description": "Vue Styleless UI Component Library, powered by Tailwind CSS.",
|
|
5
5
|
"author": "Johnny Grid <hello@vueless.com> (https://vueless.com)",
|
|
6
6
|
"homepage": "https://vueless.com",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"@types/lodash-es": "^4.17.12",
|
|
38
38
|
"cva": "^1.0.0-beta.4",
|
|
39
39
|
"lodash-es": "^4.18.1",
|
|
40
|
-
"rolldown": "1.
|
|
40
|
+
"rolldown": "^1.1.5",
|
|
41
41
|
"svgo": "^4.0.1",
|
|
42
42
|
"tailwind-merge": "^3.5.0",
|
|
43
43
|
"tailwindcss": "^4.2.4",
|
package/types.ts
CHANGED
|
@@ -390,9 +390,11 @@ export interface CVACompoundVariants {
|
|
|
390
390
|
|
|
391
391
|
export type MutatedProps = ComputedRef<UnknownObject>;
|
|
392
392
|
|
|
393
|
+
export type GetDataTest = (suffix?: string) => string | null;
|
|
394
|
+
|
|
393
395
|
export type UseUI<T> = {
|
|
394
396
|
config: Ref<T & ComponentConfig<T>>;
|
|
395
|
-
getDataTest:
|
|
397
|
+
getDataTest: GetDataTest;
|
|
396
398
|
} & KeysAttrs<T>;
|
|
397
399
|
|
|
398
400
|
export interface ConfigDerivedData {
|
|
@@ -736,7 +736,9 @@ watchEffect(() => {
|
|
|
736
736
|
:min-date="minDate"
|
|
737
737
|
:max-date="maxDate"
|
|
738
738
|
:attrs="rangePeriodMenuAttrs as unknown as UDatePickerRangePeriodMenuAttrs"
|
|
739
|
-
:data-test="
|
|
739
|
+
:get-data-test="
|
|
740
|
+
(suffix?: string) => getDataTest(suffix ? `period-menu-${suffix}` : 'period-menu')
|
|
741
|
+
"
|
|
740
742
|
@toggle-menu="isShownMenu = !isShownMenu"
|
|
741
743
|
@close-menu="isShownMenu = false"
|
|
742
744
|
@click-prev="onClickShiftDatesList(ShiftAction.Prev)"
|
|
@@ -759,7 +761,9 @@ watchEffect(() => {
|
|
|
759
761
|
:date-format="dateFormat"
|
|
760
762
|
:config="config"
|
|
761
763
|
:attrs="rangeInputsAttrs as unknown as UDatePickerRangeInputsAttrs"
|
|
762
|
-
:data-test="
|
|
764
|
+
:get-data-test="
|
|
765
|
+
(suffix?: string) => getDataTest(suffix ? `range-inputs-${suffix}` : 'range-inputs')
|
|
766
|
+
"
|
|
763
767
|
/>
|
|
764
768
|
|
|
765
769
|
<div
|
|
@@ -16,9 +16,7 @@ type UInputRef = InstanceType<typeof UInput>;
|
|
|
16
16
|
|
|
17
17
|
defineOptions({ internal: true });
|
|
18
18
|
|
|
19
|
-
const props =
|
|
20
|
-
dataTest: null,
|
|
21
|
-
});
|
|
19
|
+
const props = defineProps<UDatePickerRangeInputsProps>();
|
|
22
20
|
|
|
23
21
|
const rangeInputStartRef = useTemplateRef<UInputRef>("range-input-start");
|
|
24
22
|
const rangeInputEndRef = useTemplateRef<UInputRef>("range-input-end");
|
|
@@ -142,7 +140,7 @@ defineExpose({
|
|
|
142
140
|
v-bind="attrs.rangeInputFirstAttrs.value"
|
|
143
141
|
:name="rangeInputName"
|
|
144
142
|
no-autocomplete
|
|
145
|
-
:data-test="
|
|
143
|
+
:data-test="getDataTest('from')"
|
|
146
144
|
@blur="updateDateValue(rangeStart, InputRangeType.Start)"
|
|
147
145
|
@keydown.enter="updateDateValue(rangeStart, InputRangeType.Start)"
|
|
148
146
|
@input="validateInput($event, InputRangeType.Start)"
|
|
@@ -156,7 +154,7 @@ defineExpose({
|
|
|
156
154
|
v-bind="attrs.rangeInputLastAttrs.value"
|
|
157
155
|
:name="rangeInputName"
|
|
158
156
|
no-autocomplete
|
|
159
|
-
:data-test="
|
|
157
|
+
:data-test="getDataTest('to')"
|
|
160
158
|
@blur="updateDateValue(rangeEnd, InputRangeType.End)"
|
|
161
159
|
@keydown.enter="updateDateValue(rangeEnd, InputRangeType.End)"
|
|
162
160
|
@input="validateInput($event, InputRangeType.End)"
|
|
@@ -22,9 +22,7 @@ import type { DatePeriodRange } from "./utilDateRange";
|
|
|
22
22
|
|
|
23
23
|
defineOptions({ internal: true });
|
|
24
24
|
|
|
25
|
-
const props =
|
|
26
|
-
dataTest: null,
|
|
27
|
-
});
|
|
25
|
+
const props = defineProps<UDatePickerRangePeriodMenuProps>();
|
|
28
26
|
|
|
29
27
|
const emit = defineEmits(["toggleMenu", "closeMenu", "clickPrev", "clickNext"]);
|
|
30
28
|
|
|
@@ -150,7 +148,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
150
148
|
</script>
|
|
151
149
|
|
|
152
150
|
<template>
|
|
153
|
-
<div v-bind="attrs.periodRowAttrs.value" :data-test="
|
|
151
|
+
<div v-bind="attrs.periodRowAttrs.value" :data-test="getDataTest()">
|
|
154
152
|
<template v-for="periodButton in periods" :key="periodButton.name">
|
|
155
153
|
<UButton
|
|
156
154
|
v-if="periodButton.name !== period"
|
|
@@ -159,6 +157,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
159
157
|
color="grayscale"
|
|
160
158
|
variant="soft"
|
|
161
159
|
:label="periodButton.title"
|
|
160
|
+
:data-test="getDataTest(`period-${periodButton.name}`)"
|
|
162
161
|
v-bind="attrs.periodButtonAttrs.value"
|
|
163
162
|
@click="onClickPeriodButton(periodButton.name)"
|
|
164
163
|
/>
|
|
@@ -170,6 +169,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
170
169
|
color="grayscale"
|
|
171
170
|
variant="soft"
|
|
172
171
|
:label="periodButton.title"
|
|
172
|
+
:data-test="getDataTest(`period-${periodButton.name}`)"
|
|
173
173
|
v-bind="attrs.periodButtonActiveAttrs.value"
|
|
174
174
|
@click="onClickPeriodButton(periodButton.name)"
|
|
175
175
|
/>
|
|
@@ -183,6 +183,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
183
183
|
size="xs"
|
|
184
184
|
color="grayscale"
|
|
185
185
|
variant="soft"
|
|
186
|
+
:data-test="getDataTest('custom-range')"
|
|
186
187
|
v-bind="attrs.customRangeButtonAttrs.value"
|
|
187
188
|
@click="onClickCustomRangeButton"
|
|
188
189
|
>
|
|
@@ -200,6 +201,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
200
201
|
size="xs"
|
|
201
202
|
color="grayscale"
|
|
202
203
|
variant="soft"
|
|
204
|
+
:data-test="getDataTest('custom-range')"
|
|
203
205
|
v-bind="attrs.customRangeButtonAttrs.value"
|
|
204
206
|
@click="onClickCustomRangeButton"
|
|
205
207
|
>
|
|
@@ -219,6 +221,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
219
221
|
variant="soft"
|
|
220
222
|
:label="locale.ownRange"
|
|
221
223
|
:left-icon="config.defaults?.ownRangeIcon"
|
|
224
|
+
:data-test="getDataTest('own-range')"
|
|
222
225
|
v-bind="attrs.periodButtonAttrs.value"
|
|
223
226
|
@click="onClickOwnRange"
|
|
224
227
|
/>
|
|
@@ -231,6 +234,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
231
234
|
variant="soft"
|
|
232
235
|
:label="locale.ownRange"
|
|
233
236
|
:left-icon="config.defaults?.ownRangeIcon"
|
|
237
|
+
:data-test="getDataTest('own-range')"
|
|
234
238
|
v-bind="attrs.periodButtonActiveAttrs.value"
|
|
235
239
|
@click="onClickOwnRange"
|
|
236
240
|
/>
|
|
@@ -244,6 +248,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
244
248
|
color="grayscale"
|
|
245
249
|
variant="ghost"
|
|
246
250
|
:icon="config.defaults?.prevIcon"
|
|
251
|
+
:data-test="getDataTest('range-switch-prev')"
|
|
247
252
|
v-bind="attrs.rangeSwitchButtonAttrs.value"
|
|
248
253
|
@click="emit('clickPrev')"
|
|
249
254
|
/>
|
|
@@ -258,6 +263,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
258
263
|
color="grayscale"
|
|
259
264
|
variant="ghost"
|
|
260
265
|
:icon="config.defaults?.nextIcon"
|
|
266
|
+
:data-test="getDataTest('range-switch-next')"
|
|
261
267
|
v-bind="attrs.rangeSwitchButtonAttrs.value"
|
|
262
268
|
@click="emit('clickNext')"
|
|
263
269
|
/>
|
|
@@ -265,7 +271,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
265
271
|
|
|
266
272
|
<div v-if="isDatePeriodOutOfRange" v-bind="attrs.periodDateListAttrs.value">
|
|
267
273
|
<template
|
|
268
|
-
v-for="date in periodDateList"
|
|
274
|
+
v-for="(date, index) in periodDateList"
|
|
269
275
|
:key="date.title + date.startRange.toISOString() + date.endRange.toISOString()"
|
|
270
276
|
>
|
|
271
277
|
<UButton
|
|
@@ -276,6 +282,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
276
282
|
:disabled="isDatePeriodOutOfRange(date)"
|
|
277
283
|
v-bind="attrs.periodDateCurrentSelectedAttrs.value"
|
|
278
284
|
:label="String(date.title)"
|
|
285
|
+
:data-test="getDataTest(`period-date-${index}`)"
|
|
279
286
|
@click="(selectDate(date), toggleMenu())"
|
|
280
287
|
/>
|
|
281
288
|
|
|
@@ -287,6 +294,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
287
294
|
:disabled="isDatePeriodOutOfRange(date)"
|
|
288
295
|
v-bind="attrs.periodDateSelectedAttrs.value"
|
|
289
296
|
:label="String(date.title)"
|
|
297
|
+
:data-test="getDataTest(`period-date-${index}`)"
|
|
290
298
|
@click="(selectDate(date), toggleMenu())"
|
|
291
299
|
/>
|
|
292
300
|
|
|
@@ -298,6 +306,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
298
306
|
:disabled="isDatePeriodOutOfRange(date)"
|
|
299
307
|
v-bind="attrs.periodDateCurrentAttrs.value"
|
|
300
308
|
:label="String(date.title)"
|
|
309
|
+
:data-test="getDataTest(`period-date-${index}`)"
|
|
301
310
|
@click="(selectDate(date), toggleMenu())"
|
|
302
311
|
/>
|
|
303
312
|
|
|
@@ -309,6 +318,7 @@ function getDatePeriodState(date: DatePeriodRange) {
|
|
|
309
318
|
:disabled="isDatePeriodOutOfRange(date)"
|
|
310
319
|
v-bind="attrs.periodDateAttrs.value"
|
|
311
320
|
:label="String(date.title)"
|
|
321
|
+
:data-test="getDataTest(`period-date-${index}`)"
|
|
312
322
|
@click="(selectDate(date), toggleMenu())"
|
|
313
323
|
/>
|
|
314
324
|
</template>
|
|
@@ -379,6 +379,65 @@ describe("UDatePickerRange.vue", () => {
|
|
|
379
379
|
expect(component.find(`[data-test="${dataTest}-button-prev"]`).exists()).toBe(true);
|
|
380
380
|
expect(component.find(`[data-test="${dataTest}-button-next"]`).exists()).toBe(true);
|
|
381
381
|
});
|
|
382
|
+
|
|
383
|
+
it("Data Test – applies data-test to period menu buttons when menu is open", async () => {
|
|
384
|
+
const dataTest = "date-picker-range";
|
|
385
|
+
const menuPrefix = `${dataTest}-period-menu`;
|
|
386
|
+
|
|
387
|
+
const component = mount(UDatePickerRange, {
|
|
388
|
+
props: {
|
|
389
|
+
variant: "input",
|
|
390
|
+
dataTest,
|
|
391
|
+
modelValue: { from: null, to: null },
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
const input = component.findComponent(UInput).find("input");
|
|
396
|
+
|
|
397
|
+
await input.trigger("focus");
|
|
398
|
+
|
|
399
|
+
const monthButton = component.find(`[data-test="${menuPrefix}-period-month"]`);
|
|
400
|
+
const quarterButton = component.find(`[data-test="${menuPrefix}-period-quarter"]`);
|
|
401
|
+
const yearButton = component.find(`[data-test="${menuPrefix}-period-year"]`);
|
|
402
|
+
const ownRangeButton = component.find(`[data-test="${menuPrefix}-own-range"]`);
|
|
403
|
+
|
|
404
|
+
expect(monthButton.exists()).toBe(true);
|
|
405
|
+
expect(quarterButton.exists()).toBe(true);
|
|
406
|
+
expect(yearButton.exists()).toBe(true);
|
|
407
|
+
expect(ownRangeButton.exists()).toBe(true);
|
|
408
|
+
|
|
409
|
+
await monthButton.trigger("click");
|
|
410
|
+
|
|
411
|
+
const gridButtons = component.findAll(`[data-test^="${menuPrefix}-period-date-"]`);
|
|
412
|
+
|
|
413
|
+
expect(gridButtons.length).toBeGreaterThan(0);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it("Data Test – period menu buttons have no data-test attribute when dataTest is not set", async () => {
|
|
417
|
+
const component = mount(UDatePickerRange, {
|
|
418
|
+
props: {
|
|
419
|
+
variant: "input",
|
|
420
|
+
modelValue: { from: null, to: null },
|
|
421
|
+
},
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
const input = component.findComponent(UInput).find("input");
|
|
425
|
+
|
|
426
|
+
await input.trigger("focus");
|
|
427
|
+
|
|
428
|
+
const periodMenu = component.findComponent(UDatePickerRangePeriodMenu);
|
|
429
|
+
|
|
430
|
+
expect(periodMenu.exists()).toBe(true);
|
|
431
|
+
expect(component.findAll('[data-test^="null-"]').length).toBe(0);
|
|
432
|
+
|
|
433
|
+
const monthButton = component.findAll("button").find((button) => button.text() !== "");
|
|
434
|
+
|
|
435
|
+
if (monthButton) {
|
|
436
|
+
await monthButton.trigger("click");
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
expect(component.findAll('[data-test^="null-"]').length).toBe(0);
|
|
440
|
+
});
|
|
382
441
|
});
|
|
383
442
|
|
|
384
443
|
describe("Menu", () => {
|
|
@@ -2,7 +2,7 @@ import defaultConfig from "./config";
|
|
|
2
2
|
import { ShiftAction } from "./constants";
|
|
3
3
|
|
|
4
4
|
import type { Ref } from "vue";
|
|
5
|
-
import type { UnknownObject, ComponentConfig } from "../types";
|
|
5
|
+
import type { UnknownObject, ComponentConfig, GetDataTest } from "../types";
|
|
6
6
|
import type { DatePeriodRange } from "./utilDateRange";
|
|
7
7
|
|
|
8
8
|
export type Locale = typeof defaultConfig.i18n;
|
|
@@ -56,7 +56,7 @@ export interface UDatePickerRangePeriodMenuProps {
|
|
|
56
56
|
maxDate: string | Date | undefined;
|
|
57
57
|
minDate: string | Date | undefined;
|
|
58
58
|
customRangeButton: CustomRangeButton;
|
|
59
|
-
|
|
59
|
+
getDataTest: GetDataTest;
|
|
60
60
|
config: Config;
|
|
61
61
|
attrs: UDatePickerRangePeriodMenuAttrs;
|
|
62
62
|
}
|
|
@@ -74,7 +74,7 @@ export interface UDatePickerRangeInputsProps {
|
|
|
74
74
|
minDate: string | Date | undefined;
|
|
75
75
|
config: Config;
|
|
76
76
|
attrs: UDatePickerRangeInputsAttrs;
|
|
77
|
-
|
|
77
|
+
getDataTest: GetDataTest;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export interface CustomRangeButton {
|