vueless 1.4.11 → 1.4.12-beta.0

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": "vueless",
3
- "version": "1.4.11",
3
+ "version": "1.4.12-beta.0",
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.0.0-rc.17",
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: (suffix?: string) => string | null;
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="getDataTest('period-menu')"
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="getDataTest('range-inputs')"
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 = withDefaults(defineProps<UDatePickerRangeInputsProps>(), {
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="`${dataTest}-from`"
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="`${dataTest}-to`"
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 = withDefaults(defineProps<UDatePickerRangePeriodMenuProps>(), {
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="dataTest">
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
- dataTest?: string | null;
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
- dataTest?: string | null;
77
+ getDataTest: GetDataTest;
78
78
  }
79
79
 
80
80
  export interface CustomRangeButton {
@@ -204,6 +204,7 @@ export async function buildTSFile(entryPath, configOutFile) {
204
204
  output: {
205
205
  file: configOutFile,
206
206
  format: "esm",
207
+ codeSplitting: false,
207
208
  },
208
209
  });
209
210
  }