@lion/ui 0.3.2 → 0.3.4

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 (91) hide show
  1. package/components/calendar/src/LionCalendar.js +121 -65
  2. package/components/calendar/src/calendarStyle.js +25 -1
  3. package/components/calendar/src/utils/createDay.js +2 -0
  4. package/components/calendar/src/utils/dayTemplate.js +19 -32
  5. package/components/calendar/src/utils/getDayMonthYear.js +28 -0
  6. package/components/calendar/test/lion-calendar.test.js +118 -108
  7. package/components/calendar/test/utils/dayTemplate.test.js +8 -4
  8. package/components/calendar/test/utils/snapshots/monthTemplate_en-GB_Sunday_2018-12.js +210 -126
  9. package/components/calendar/test-helpers/DayObject.js +2 -2
  10. package/components/calendar/types/day.ts +1 -0
  11. package/components/input-datepicker/src/LionInputDatepicker.js +34 -2
  12. package/components/input-file/src/LionInputFile.js +9 -9
  13. package/components/input-file/test/lion-input-file.test.js +4 -0
  14. package/components/input-file/types/{input-file.d.ts → input-file.ts} +4 -4
  15. package/custom-elements.json +392 -32
  16. package/dist-types/components/calendar/src/LionCalendar.d.ts +22 -15
  17. package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
  18. package/dist-types/components/calendar/src/calendarStyle.d.ts.map +1 -1
  19. package/dist-types/components/calendar/src/utils/createDay.d.ts +2 -1
  20. package/dist-types/components/calendar/src/utils/createDay.d.ts.map +1 -1
  21. package/dist-types/components/calendar/src/utils/dayTemplate.d.ts.map +1 -1
  22. package/dist-types/components/calendar/src/utils/getDayMonthYear.d.ts +13 -0
  23. package/dist-types/components/calendar/src/utils/getDayMonthYear.d.ts.map +1 -0
  24. package/dist-types/components/calendar/types/day.d.ts +1 -0
  25. package/dist-types/components/calendar/types/day.d.ts.map +1 -1
  26. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +6 -0
  27. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
  28. package/dist-types/components/input-file/src/LionInputFile.d.ts +6 -0
  29. package/dist-types/components/input-file/src/LionInputFile.d.ts.map +1 -1
  30. package/dist-types/components/input-file/types/input-file.d.ts +28 -0
  31. package/dist-types/components/input-file/types/input-file.d.ts.map +1 -0
  32. package/dist-types/exports/types/form-core.d.ts +1 -2
  33. package/dist-types/exports/types/form-core.d.ts.map +1 -1
  34. package/dist-types/exports/types/input-file.d.ts +2 -0
  35. package/dist-types/exports/types/input-file.d.ts.map +1 -0
  36. package/dist-types/tsconfig.tsbuildinfo +1 -1
  37. package/docs/components/calendar/use-cases.md +39 -0
  38. package/docs/components/checkbox-group/overview.md +2 -2
  39. package/docs/components/collapsible/overview.md +1 -1
  40. package/docs/components/combobox/overview.md +1 -1
  41. package/docs/components/combobox/use-cases.md +1 -1
  42. package/docs/components/dialog/overview.md +1 -1
  43. package/docs/components/fieldset/overview.md +5 -5
  44. package/docs/components/form/overview.md +3 -3
  45. package/docs/components/icon/use-cases.md +1 -1
  46. package/docs/components/input/overview.md +1 -1
  47. package/docs/components/input-amount/overview.md +3 -3
  48. package/docs/components/input-date/overview.md +3 -3
  49. package/docs/components/input-datepicker/overview.md +5 -5
  50. package/docs/components/input-datepicker/use-cases.md +2 -0
  51. package/docs/components/input-email/overview.md +2 -2
  52. package/docs/components/input-file/overview.md +1 -1
  53. package/docs/components/input-iban/overview.md +2 -2
  54. package/docs/components/input-range/overview.md +2 -2
  55. package/docs/components/input-stepper/overview.md +1 -1
  56. package/docs/components/input-tel/overview.md +1 -1
  57. package/docs/components/input-tel/use-cases.md +6 -6
  58. package/docs/components/input-tel-dropdown/overview.md +1 -1
  59. package/docs/components/radio-group/overview.md +3 -3
  60. package/docs/components/select-rich/use-cases.md +1 -1
  61. package/docs/components/tabs/examples.md +1 -1
  62. package/docs/fundamentals/index.md +4 -4
  63. package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +1 -1
  64. package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +1 -1
  65. package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +1 -1
  66. package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +1 -1
  67. package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
  68. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  69. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  70. package/docs/fundamentals/rationales/accessibility.md +1 -1
  71. package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
  72. package/docs/fundamentals/systems/core/overview.md +1 -1
  73. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  74. package/docs/fundamentals/systems/form/model-value.md +1 -1
  75. package/docs/fundamentals/systems/form/overview.md +28 -28
  76. package/docs/fundamentals/systems/form/validate.md +1 -1
  77. package/docs/fundamentals/systems/localize/overview.md +4 -4
  78. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  79. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  80. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  81. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  82. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  83. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  84. package/docs/guides/how-to/create-a-form.md +4 -4
  85. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  86. package/docs/guides/index.md +8 -8
  87. package/docs/guides/principles/index.md +5 -5
  88. package/docs/guides/principles/styling.md +1 -1
  89. package/exports/types/form-core.ts +1 -2
  90. package/exports/types/input-file.ts +1 -0
  91. package/package.json +1 -1
@@ -34,7 +34,7 @@ export class DayObject {
34
34
  */
35
35
 
36
36
  get isDisabled() {
37
- return this.buttonEl.hasAttribute('disabled');
37
+ return this.buttonEl.getAttribute('aria-disabled') === 'true';
38
38
  }
39
39
 
40
40
  get isSelected() {
@@ -54,7 +54,7 @@ export class DayObject {
54
54
  }
55
55
 
56
56
  get monthday() {
57
- return Number(this.buttonEl.textContent);
57
+ return Number(this.buttonEl.children[0].textContent);
58
58
  }
59
59
 
60
60
  /**
@@ -14,6 +14,7 @@ export declare interface Day {
14
14
  tabindex?: string;
15
15
  ariaPressed?: string;
16
16
  ariaCurrent?: string | undefined;
17
+ disabledInfo?: string | undefined;
17
18
  }
18
19
 
19
20
  export declare interface Week {
@@ -96,10 +96,28 @@ export class LionInputDatepicker extends ScopedElementsMixin(
96
96
 
97
97
  __calendarDisableDates: {
98
98
  attribute: false,
99
+ type: Array,
99
100
  },
100
101
  };
101
102
  }
102
103
 
104
+ _inputFormatter = new Intl.DateTimeFormat('en-US', {
105
+ year: 'numeric',
106
+ month: '2-digit',
107
+ day: '2-digit',
108
+ }).formatToParts;
109
+
110
+ /**
111
+ * @param {Date} date
112
+ */
113
+ // eslint-disable-next-line class-methods-use-this
114
+ _formatDate(date) {
115
+ const day = String(date.getDate()).padStart(2, '0');
116
+ const month = String(date.getMonth() + 1).padStart(2, '0');
117
+ const year = String(date.getFullYear());
118
+ return `${day}/${month}/${year}`;
119
+ }
120
+
103
121
  get slots() {
104
122
  return {
105
123
  ...super.slots,
@@ -346,6 +364,7 @@ export class LionInputDatepicker extends ScopedElementsMixin(
346
364
  }
347
365
 
348
366
  /**
367
+ * Triggered when a user selects a date from the calendar overlay
349
368
  * @param {{ target: { selectedDate: Date }}} opts
350
369
  */
351
370
  _onCalendarUserSelectedChanged({ target: { selectedDate } }) {
@@ -355,8 +374,21 @@ export class LionInputDatepicker extends ScopedElementsMixin(
355
374
  if (this._syncOnUserSelect) {
356
375
  // Synchronize new selectedDate value to input
357
376
  this._isHandlingUserInput = true;
358
- this._isHandlingCalendarUserInput = true;
359
- this.modelValue = selectedDate;
377
+
378
+ if (
379
+ Array.isArray(this.__calendarDisableDates) &&
380
+ this.__calendarDisableDates.includes(selectedDate)
381
+ ) {
382
+ // If the selected date is disabled, reset the values
383
+ this.value = '';
384
+ this.formattedValue = '';
385
+ this.modelValue = undefined;
386
+ } else {
387
+ this.formattedValue = this._formatDate(selectedDate);
388
+ this.value = this.formattedValue;
389
+ this.modelValue = selectedDate;
390
+ }
391
+
360
392
  this._isHandlingUserInput = false;
361
393
  this._isHandlingCalendarUserInput = false;
362
394
  }
@@ -47,6 +47,7 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
47
47
  maxFileSize: { type: Number, attribute: 'max-file-size' },
48
48
  enableDropZone: { type: Boolean, attribute: 'enable-drop-zone' },
49
49
  uploadOnSelect: { type: Boolean, attribute: 'upload-on-select' },
50
+ isDragging: { type: Boolean, attribute: 'is-dragging', reflect: true },
50
51
  uploadResponse: { type: Array, state: false },
51
52
  _selectedFilesMetaData: { type: Array, state: true },
52
53
  };
@@ -300,11 +301,7 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
300
301
  (/** @type {Event} */ ev) => {
301
302
  ev.preventDefault();
302
303
  ev.stopPropagation();
303
- if (eventName !== 'dragleave') {
304
- this.setAttribute('is-dragging', '');
305
- } else {
306
- this.removeAttribute('is-dragging');
307
- }
304
+ this.isDragging = eventName !== 'dragleave';
308
305
  },
309
306
  false,
310
307
  );
@@ -316,7 +313,7 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
316
313
  if (ev.target === this._inputNode) {
317
314
  ev.preventDefault();
318
315
  }
319
- this.removeAttribute('is-dragging');
316
+ this.isDragging = false;
320
317
  },
321
318
  false,
322
319
  );
@@ -427,8 +424,11 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
427
424
  // eslint-disable-next-line no-param-reassign
428
425
  file.validationFeedback = [
429
426
  {
430
- type: response.errorMessage?.length > 0 ? 'error' : 'success',
431
- message: response.errorMessage,
427
+ type:
428
+ typeof response.errorMessage === 'string' && response.errorMessage?.length > 0
429
+ ? 'error'
430
+ : 'success',
431
+ message: response.errorMessage ?? '',
432
432
  },
433
433
  ];
434
434
  }
@@ -466,7 +466,7 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
466
466
  */
467
467
  _processDroppedFiles(ev) {
468
468
  ev.preventDefault();
469
- this.removeAttribute('is-dragging');
469
+ this.isDragging = false;
470
470
 
471
471
  const isDraggingMultipleWhileNotSupported =
472
472
  ev.dataTransfer && ev.dataTransfer.items.length > 1 && !this.multiple;
@@ -927,12 +927,14 @@ describe('lion-input-file', () => {
927
927
  it('should set "is-dragging" on dragenter', async () => {
928
928
  const dropzone = el.shadowRoot?.querySelector('.input-file__drop-zone');
929
929
  dropzone?.dispatchEvent(new Event('dragenter', { bubbles: true }));
930
+ await el.updateComplete;
930
931
  expect(el.hasAttribute('is-dragging')).to.equal(true);
931
932
  });
932
933
 
933
934
  it('should set "is-dragging" on dragover', async () => {
934
935
  const dropzone = el.shadowRoot?.querySelector('.input-file__drop-zone');
935
936
  dropzone?.dispatchEvent(new Event('dragover', { bubbles: true }));
937
+ await el.updateComplete;
936
938
  expect(el.hasAttribute('is-dragging')).to.equal(true);
937
939
  });
938
940
 
@@ -942,6 +944,7 @@ describe('lion-input-file', () => {
942
944
  await el.updateComplete;
943
945
 
944
946
  dropzone?.dispatchEvent(new Event('dragleave', { bubbles: true }));
947
+ await el.updateComplete;
945
948
  expect(el.hasAttribute('is-dragging')).to.equal(false);
946
949
  });
947
950
 
@@ -951,6 +954,7 @@ describe('lion-input-file', () => {
951
954
  await el.updateComplete;
952
955
 
953
956
  window.dispatchEvent(new Event('drop', { bubbles: true }));
957
+ await el.updateComplete;
954
958
  expect(el.hasAttribute('is-dragging')).to.equal(false);
955
959
  });
956
960
 
@@ -1,6 +1,6 @@
1
1
  import { FeedbackMessage } from "../../form-core/types/validate/ValidateMixinTypes.js";
2
2
 
3
- type FileBasics = {
3
+ export type FileBasics = {
4
4
  name: string;
5
5
  /** size in bytes */
6
6
  size: number;
@@ -10,7 +10,7 @@ type FileBasics = {
10
10
 
11
11
  export type InputFile = {
12
12
  downloadUrl?: string;
13
- errorMessage?: FeedbackMessage.message;
13
+ errorMessage?: FeedbackMessage["message"];
14
14
  failedProp?: Array<string|number>;
15
15
  response?: UploadResponse;
16
16
  systemFile: Partial<SystemFile>;
@@ -19,7 +19,7 @@ export type InputFile = {
19
19
 
20
20
  export type SystemFile = {
21
21
  downloadUrl?: string;
22
- errorMessage?: FeedbackMessage.message;
22
+ errorMessage?: FeedbackMessage["message"];
23
23
  failedProp?: Array<string|number>;
24
24
  response?: UploadResponse;
25
25
  } & FileBasics & Partial<File>;
@@ -27,6 +27,6 @@ export type SystemFile = {
27
27
 
28
28
  export type UploadResponse = {
29
29
  downloadUrl?: string;
30
- errorMessage?: FeedbackMessage.message;
30
+ errorMessage?: FeedbackMessage["message"];
31
31
  id?: string;
32
32
  } & Partial<FileBasics>;