@mgdis/mg-components 6.20.0 → 6.22.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.
Files changed (205) hide show
  1. package/dist/cjs/{index-TUElr4Wv.js → index-BxB20_Vw.js} +54 -0
  2. package/dist/cjs/{index-Bp6wZzau.js → index-C2viYwrR.js} +1761 -80
  3. package/dist/cjs/loader.cjs.js +2 -2
  4. package/dist/cjs/mg-action-more_37.cjs.entry.js +761 -371
  5. package/dist/cjs/mg-alert.cjs.entry.js +17 -9
  6. package/dist/cjs/mg-breadcrumb.cjs.entry.js +63 -0
  7. package/dist/cjs/mg-components.cjs.js +3 -3
  8. package/dist/cjs/mg-fieldset.cjs.entry.js +24 -7
  9. package/dist/cjs/mg-input-combobox.cjs.entry.js +49 -19
  10. package/dist/cjs/mg-input-file.cjs.entry.js +384 -0
  11. package/dist/cjs/mg-input-rich-text-editor.cjs.entry.js +40096 -15821
  12. package/dist/cjs/{mg-input.conf-D7jmj_lh.js → mg-input.conf-BNpeATnq.js} +7 -0
  13. package/dist/cjs/mg-loader.cjs.entry.js +8 -6
  14. package/dist/cjs/mg-progress.cjs.entry.js +19 -9
  15. package/dist/collection/assets/icons/index.js +1 -1
  16. package/dist/collection/collection-manifest.json +5 -3
  17. package/dist/collection/components/atoms/internals/mg-character-left/mg-character-left.js +1 -1
  18. package/dist/collection/components/atoms/internals/mg-input-title/mg-input-title.js +1 -1
  19. package/dist/collection/components/atoms/mg-card/mg-card.js +1 -1
  20. package/dist/collection/components/atoms/mg-divider/mg-divider.js +1 -1
  21. package/dist/collection/components/atoms/mg-icon/mg-icon.js +2 -2
  22. package/dist/collection/components/atoms/mg-tag/mg-tag.js +1 -1
  23. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip-content/mg-tooltip-content.js +1 -1
  24. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +1 -1
  25. package/dist/collection/components/molecules/inputs/mg-input/mg-input.conf.js +6 -0
  26. package/dist/collection/components/molecules/inputs/mg-input/mg-input.js +1 -1
  27. package/dist/collection/components/molecules/inputs/mg-input-checkbox/MgInputCheckboxList.js +2 -2
  28. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox-paginated/mg-input-checkbox-paginated.js +2 -2
  29. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.js +1 -1
  30. package/dist/collection/components/molecules/inputs/mg-input-combobox/mg-input-combobox.js +1 -1
  31. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js +1 -1
  32. package/dist/collection/components/molecules/inputs/mg-input-file/mg-input-file.js +877 -0
  33. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.js +1 -1
  34. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.js +2 -2
  35. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.js +1 -1
  36. package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/custom-properties.scss +212 -0
  37. package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/editor.conf.js +1 -0
  38. package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/index.js +300 -94
  39. package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.conf.js +29 -0
  40. package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.js +163 -53
  41. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +1 -1
  42. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.js +2 -2
  43. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.js +1 -1
  44. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.js +1 -1
  45. package/dist/collection/components/molecules/internals/mg-item-more/mg-item-more.js +3 -36
  46. package/dist/collection/components/molecules/menus/mg-menu/mg-menu.conf.js +0 -4
  47. package/dist/collection/components/molecules/menus/mg-menu/mg-menu.js +21 -43
  48. package/dist/collection/components/molecules/menus/mg-menu-item/mg-menu-item.js +65 -38
  49. package/dist/collection/components/molecules/mg-action-more/mg-action-more.js +2 -2
  50. package/dist/collection/components/molecules/mg-alert/mg-alert.js +1 -1
  51. package/dist/collection/components/molecules/mg-breadcrumb/mg-breadcrumb.conf.js +1 -0
  52. package/dist/collection/components/molecules/mg-breadcrumb/mg-breadcrumb.js +92 -0
  53. package/dist/collection/components/molecules/mg-details/mg-details.js +1 -1
  54. package/dist/collection/components/molecules/mg-fieldset/mg-fieldset.js +12 -3
  55. package/dist/collection/components/molecules/mg-form/mg-form.js +12 -2
  56. package/dist/collection/components/molecules/mg-illustrated-message/mg-illustrated-message.js +1 -1
  57. package/dist/collection/components/molecules/mg-loader/mg-loader.js +1 -1
  58. package/dist/collection/components/molecules/mg-message/mg-message.js +2 -2
  59. package/dist/collection/components/molecules/mg-modal/mg-modal.js +2 -2
  60. package/dist/collection/components/molecules/mg-panel/mg-panel.js +1 -1
  61. package/dist/collection/components/molecules/mg-popover/mg-popover-content/mg-popover-content.js +1 -1
  62. package/dist/collection/components/molecules/mg-popover/mg-popover.js +1 -1
  63. package/dist/collection/components/molecules/mg-progress/mg-progress.js +1 -1
  64. package/dist/collection/components/molecules/mg-skip-links/mg-skip-links.js +1 -1
  65. package/dist/collection/components/molecules/mg-table/mg-table.js +37 -0
  66. package/dist/collection/components/molecules/mg-tabs/mg-tabs.conf.js +0 -4
  67. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +13 -33
  68. package/dist/collection/locales/en/messages.json +14 -0
  69. package/dist/collection/locales/fr/messages.json +14 -0
  70. package/dist/components/events.utils.js +1 -23
  71. package/dist/components/index.d.ts +2 -0
  72. package/dist/components/index.js +1 -1
  73. package/dist/components/index2.js +1 -408
  74. package/dist/components/index3.js +1 -476
  75. package/dist/components/mg-action-more.js +1 -254
  76. package/dist/components/mg-alert.js +1 -224
  77. package/dist/components/mg-badge.js +1 -6
  78. package/dist/components/mg-badge2.js +1 -113
  79. package/dist/components/mg-breadcrumb.d.ts +11 -0
  80. package/dist/components/mg-breadcrumb.js +1 -0
  81. package/dist/components/mg-button.js +1 -6
  82. package/dist/components/mg-button2.js +1 -275
  83. package/dist/components/mg-card.js +1 -6
  84. package/dist/components/mg-card2.js +1 -92
  85. package/dist/components/mg-character-left.js +1 -6
  86. package/dist/components/mg-character-left2.js +1 -75
  87. package/dist/components/mg-details.js +1 -104
  88. package/dist/components/mg-divider.js +1 -6
  89. package/dist/components/mg-divider2.js +1 -49
  90. package/dist/components/mg-fieldset.js +1 -209
  91. package/dist/components/mg-form.js +1 -302
  92. package/dist/components/mg-icon.js +1 -6
  93. package/dist/components/mg-icon2.js +1 -188
  94. package/dist/components/mg-illustrated-message.js +1 -129
  95. package/dist/components/mg-input-checkbox-paginated.js +1 -6
  96. package/dist/components/mg-input-checkbox-paginated2.js +1 -135
  97. package/dist/components/mg-input-checkbox.js +1 -762
  98. package/dist/components/mg-input-combobox.js +1 -940
  99. package/dist/components/mg-input-date.js +1 -463
  100. package/dist/components/mg-input-file.d.ts +11 -0
  101. package/dist/components/mg-input-file.js +1 -0
  102. package/dist/components/mg-input-numeric.js +1 -592
  103. package/dist/components/mg-input-password.js +1 -360
  104. package/dist/components/mg-input-radio.js +1 -392
  105. package/dist/components/mg-input-rich-text-editor.js +1663 -16797
  106. package/dist/components/mg-input-select.js +1 -6
  107. package/dist/components/mg-input-select2.js +1 -481
  108. package/dist/components/mg-input-text.js +1 -6
  109. package/dist/components/mg-input-text2.js +1 -514
  110. package/dist/components/mg-input-textarea.js +1 -412
  111. package/dist/components/mg-input-title.js +1 -6
  112. package/dist/components/mg-input-title2.js +1 -81
  113. package/dist/components/mg-input-toggle.js +1 -371
  114. package/dist/components/mg-input.conf.js +1 -0
  115. package/dist/components/mg-input.js +1 -6
  116. package/dist/components/mg-input2.js +1 -459
  117. package/dist/components/mg-item-more.js +1 -6
  118. package/dist/components/mg-item-more2.js +1 -505
  119. package/dist/components/mg-loader.js +1 -6
  120. package/dist/components/mg-loader2.js +1 -74
  121. package/dist/components/mg-menu-item.js +1 -6
  122. package/dist/components/mg-menu-item2.js +1 -485
  123. package/dist/components/mg-menu.js +1 -6
  124. package/dist/components/mg-message.js +1 -6
  125. package/dist/components/mg-message2.js +1 -146
  126. package/dist/components/mg-modal.js +1 -184
  127. package/dist/components/mg-pagination.js +1 -234
  128. package/dist/components/mg-panel.js +1 -350
  129. package/dist/components/mg-popover-content.js +1 -6
  130. package/dist/components/mg-popover-content2.js +1 -96
  131. package/dist/components/mg-popover.js +1 -6
  132. package/dist/components/mg-popover2.js +1 -312
  133. package/dist/components/mg-progress.js +1 -123
  134. package/dist/components/mg-skip-links.js +1 -78
  135. package/dist/components/mg-table.js +1 -319
  136. package/dist/components/mg-tabs.js +1 -6
  137. package/dist/components/mg-tabs2.js +1 -315
  138. package/dist/components/mg-tag.js +1 -133
  139. package/dist/components/mg-tooltip-content.js +1 -6
  140. package/dist/components/mg-tooltip-content2.js +1 -42
  141. package/dist/components/mg-tooltip.js +1 -6
  142. package/dist/components/mg-tooltip2.js +1 -421
  143. package/dist/components/popper.js +1 -1790
  144. package/dist/esm/{index-BluNKQ3L.js → index-DFwaH2hS.js} +1761 -80
  145. package/dist/esm/{index-CNX6lq0x.js → index-DSEloqPn.js} +54 -1
  146. package/dist/esm/loader.js +3 -3
  147. package/dist/esm/mg-action-more_37.entry.js +761 -371
  148. package/dist/esm/mg-alert.entry.js +17 -9
  149. package/dist/esm/mg-breadcrumb.entry.js +61 -0
  150. package/dist/esm/mg-components.js +4 -4
  151. package/dist/esm/mg-fieldset.entry.js +24 -7
  152. package/dist/esm/mg-input-combobox.entry.js +49 -19
  153. package/dist/esm/mg-input-file.entry.js +382 -0
  154. package/dist/esm/mg-input-rich-text-editor.entry.js +40083 -15808
  155. package/dist/esm/{mg-input.conf-DDnrE1hD.js → mg-input.conf-C9rmNQIL.js} +7 -1
  156. package/dist/esm/mg-loader.entry.js +8 -6
  157. package/dist/esm/mg-progress.entry.js +19 -9
  158. package/dist/mg-components/locales/en/messages.json +14 -0
  159. package/dist/mg-components/locales/fr/messages.json +14 -0
  160. package/dist/mg-components/mg-components.esm.js +1 -1
  161. package/dist/mg-components/p-0482eb9f.entry.js +1 -0
  162. package/dist/mg-components/{p-7132bca1.entry.js → p-2ee92f38.entry.js} +1 -1
  163. package/dist/mg-components/{p-916dfb6d.entry.js → p-3b653226.entry.js} +1 -1
  164. package/dist/mg-components/p-5745fbea.entry.js +1 -0
  165. package/dist/mg-components/p-C9rmNQIL.js +1 -0
  166. package/dist/mg-components/p-DFwaH2hS.js +2 -0
  167. package/dist/mg-components/p-DSEloqPn.js +1 -0
  168. package/dist/mg-components/p-adec7fcc.entry.js +1 -0
  169. package/dist/mg-components/p-c63f97f0.entry.js +1658 -0
  170. package/dist/mg-components/p-c8c8cfc1.entry.js +1 -0
  171. package/dist/mg-components/p-cc793586.entry.js +1 -0
  172. package/dist/mg-components/p-d5e69c95.entry.js +1 -0
  173. package/dist/types/assets/icons/index.d.ts +2 -0
  174. package/dist/types/components/molecules/inputs/mg-input/mg-input.conf.d.ts +7 -1
  175. package/dist/types/components/molecules/inputs/mg-input-file/mg-input-file.d.ts +210 -0
  176. package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/editor/editor.conf.d.ts +17 -0
  177. package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/editor/index.d.ts +27 -19
  178. package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.conf.d.ts +3 -0
  179. package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.d.ts +50 -16
  180. package/dist/types/components/molecules/internals/mg-item-more/mg-item-more.conf.d.ts +0 -5
  181. package/dist/types/components/molecules/internals/mg-item-more/mg-item-more.d.ts +1 -6
  182. package/dist/types/components/molecules/menus/mg-menu/mg-menu.conf.d.ts +2 -10
  183. package/dist/types/components/molecules/menus/mg-menu/mg-menu.d.ts +7 -7
  184. package/dist/types/components/molecules/menus/mg-menu-item/mg-menu-item.d.ts +12 -8
  185. package/dist/types/components/molecules/mg-breadcrumb/mg-breadcrumb.conf.d.ts +18 -0
  186. package/dist/types/components/molecules/mg-breadcrumb/mg-breadcrumb.d.ts +34 -0
  187. package/dist/types/components/molecules/mg-table/mg-table.d.ts +6 -0
  188. package/dist/types/components/molecules/mg-tabs/mg-tabs.conf.d.ts +1 -9
  189. package/dist/types/components/molecules/mg-tabs/mg-tabs.d.ts +4 -4
  190. package/dist/types/components.d.ts +302 -46
  191. package/dist/types/stencil-public-runtime.d.ts +76 -12
  192. package/ide/intellij/web-types.json +483 -51
  193. package/ide/vscode/css-custom-data.json +10 -2
  194. package/ide/vscode/html-custom-data.json +445 -104
  195. package/package.json +24 -23
  196. package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/editor.scss +0 -1
  197. package/dist/mg-components/p-016bd291.entry.js +0 -1
  198. package/dist/mg-components/p-186a6139.entry.js +0 -1
  199. package/dist/mg-components/p-BluNKQ3L.js +0 -2
  200. package/dist/mg-components/p-CNX6lq0x.js +0 -1
  201. package/dist/mg-components/p-DDnrE1hD.js +0 -1
  202. package/dist/mg-components/p-cd061b38.entry.js +0 -1
  203. package/dist/mg-components/p-d2c72f09.entry.js +0 -1
  204. package/dist/mg-components/p-d5a276eb.entry.js +0 -1
  205. package/ide/vscode/custom.css-data.json +0 -425
@@ -0,0 +1,382 @@
1
+ import { r as registerInstance, c as createEvent, h, a as getElement } from './index-DFwaH2hS.js';
2
+ import { C as ClassList, b as allItemsAreString, t as toString, i as isValidString, c as isObject } from './index-C7xjtdiw.js';
3
+ import { l as localeByte, i as initLocales } from './index-DSEloqPn.js';
4
+ import { a as classDisabled } from './mg-input.conf-C9rmNQIL.js';
5
+
6
+ const mgInputFileCss = () => `.mg-c-input__readonly-value{min-height:var(--mg-b-font-size);align-self:flex-start;margin-top:calc((var(--mg-b-size-min-height) - var(--mg-b-font-size)*var(--mg-b-line-height))/2);overflow-wrap:anywhere}.mg-c-input__box{height:var(--mg-b-size-min-height);box-sizing:border-box;padding:calc((var(--mg-b-size-min-height) - var(--mg-b-font-size)*var(--mg-b-line-height))/2) var(--mg-b-size-8);border-width:var(--mg-c-input-border-width);border-style:solid;border-color:var(--mg-c-input-color-border);border-radius:var(--mg-c-input-border-radius);background-color:var(--mg-b-color-light);color:var(--mg-b-color-dark);font-family:inherit;font-size:var(--mg-b-font-size);text-align:var(--mg-c-input-text-align, left)}.mg-c-input__box::placeholder{color:var(--mg-c-input-placeholder-color-text);font-style:italic}.mg-c-input__box:focus{box-shadow:0 0 var(--mg-b-size-4) var(--mg-c-input-color-box-shadow-focus)}.mg-c-input__box:disabled{opacity:var(--mg-b-opacity-element-disabled)}.mg-c-input.mg-c-input--has-error .mg-c-input__box{border-color:var(--mg-b-color-danger)}.mg-c-input.mg-c-input--is-input-group-append{--mg-c-button-border-radius-top-left:0;--mg-c-button-border-radius-bottom-left:0}.mg-c-input.mg-c-input--is-input-group-append .mg-c-input__box{margin-right:calc(-1*var(--mg-b-size-border));border-bottom-right-radius:0;border-top-right-radius:0}.mg-c-input.mg-c-input--is-input-group-append .mg-c-input__box:focus-visible{outline-offset:-0.2rem;outline-style:solid;outline-width:.2rem}.mg-c-input.mg-c-input--has-buttons-group-append ::slotted([slot=append-input]){--mg-c-button-border-radius-top-right:0;--mg-c-button-border-radius-bottom-right:0}.mg-c-input.mg-c-input--has-buttons-group-append ::slotted([slot=append-input]:not(:last-of-type)){--mg-c-button-border-right-width:0}.mg-c-input.mg-c-input--has-buttons-group-append ::slotted([slot=append-input]:last-of-type){--mg-c-button-border-radius-top-right:var(--mg-c-input-border-radius);--mg-c-button-border-radius-bottom-right:var(--mg-c-input-border-radius)}.mg-c-input.mg-c-input--is-append-input-slot-content:not(.mg-c-input--readonly) ::slotted([slot=append-input]){align-self:start;padding-top:calc((var(--mg-b-size-min-height) - var(--mg-b-size-16))/2)}.mg-c-input.mg-c-input--has-icon .mg-c-input__input-group-container{position:relative}.mg-c-input.mg-c-input--has-icon .mg-c-input__input-group-container>mg-icon:first-of-type{position:absolute;top:50%;left:var(--mg-b-size-8);color:var(--mg-c-input-color-icon);transform:translateY(-50%)}.mg-c-input.mg-c-input--has-icon .mg-c-input__input-group-container .mg-c-input__box{padding-left:calc(var(--mg-b-size-16) + var(--mg-b-size-8)*2)}.mg-u-visually-hidden{position:absolute !important;overflow:hidden !important;width:.1rem !important;height:.1rem !important;padding:0 !important;border:0 !important;margin:-0.1rem !important;clip:rect(0.1rem, 0.1rem, 0.1rem, 0.1rem) !important;clip-path:inset(50%) !important;white-space:nowrap !important}*:focus:not(:focus-visible){outline:none}@media (prefers-reduced-motion){*{animation:none !important;transition:none !important}}.mg-c-input__file-container{display:flex;flex-direction:column;gap:var(--mg-b-size-8)}.mg-c-input__file-item{display:inline-flex;min-height:var(--mg-b-size-min-height);align-items:center;padding-left:var(--mg-b-size-8);background-color:var(--mg-b-color-neutral-10);font-weight:600;gap:var(--mg-b-size-8)}.mg-c-input__file-item-name{word-break:break-all}.mg-c-input__file-item-size{color:var(--mg-b-color-neutral-90);font-weight:400;word-break:normal}.mg-c-input__file-delete-button{align-self:flex-start}.mg-c-input__file-list{display:flex;flex-direction:column;padding:0;margin:0;gap:var(--mg-b-size-4);list-style:none}.mg-c-input__file-list .mg-c-input__file-item{min-height:unset;padding:var(--mg-b-size-8)}.mg-c-input__file-list-container{position:relative;padding:var(--mg-b-size-8) calc(var(--mg-b-size-8) + var(--mg-b-size-min-height)) var(--mg-b-size-8) var(--mg-b-size-8);border:var(--mg-b-size-border) solid var(--mg-b-color-neutral-30);border-radius:var(--mg-b-size-4)}.mg-c-input__file-list-container .mg-c-input__file-delete-button{position:absolute;top:0;right:0}`;
7
+
8
+ const allItemsAreFile = (items) => {
9
+ return Array.isArray(items) && items.every(item => isObject(item) && typeof item.name === 'string' && typeof item.size === 'number');
10
+ };
11
+ const MgInputFile = class {
12
+ constructor(hostRef) {
13
+ registerInstance(this, hostRef);
14
+ this.valueChange = createEvent(this, "value-change", 7);
15
+ this.inputValid = createEvent(this, "input-valid", 7);
16
+ // hasDisplayedError (triggered by blur event)
17
+ this.hasDisplayedError = false;
18
+ this.customErrorMessage = { lock: false };
19
+ /**
20
+ * Input name
21
+ * If not set the value equals the identifier
22
+ */
23
+ this.name = this.identifier;
24
+ /**
25
+ * Define if label is displayed on top
26
+ */
27
+ this.labelOnTop = false;
28
+ /**
29
+ * Define if label is visible
30
+ */
31
+ this.labelHide = false;
32
+ /**
33
+ * Define multiple files
34
+ * When the multiple Boolean attribute is specified, the file input allows the user to select more than one file.
35
+ * (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#multiple).
36
+ */
37
+ this.multiple = false;
38
+ /**
39
+ * Define if input is required
40
+ */
41
+ this.required = false;
42
+ /**
43
+ * Define if input is disabled
44
+ */
45
+ this.disabled = false;
46
+ /**
47
+ * Define tooltip position
48
+ */
49
+ this.tooltipPosition = 'input';
50
+ /**
51
+ * Component classes
52
+ */
53
+ this.classCollection = new ClassList(['mg-c-input--file']);
54
+ /**
55
+ * Files list
56
+ */
57
+ this.files = [];
58
+ /**
59
+ * Method to set validity values
60
+ * @param newValue - valid new value
61
+ */
62
+ this.setValidity = (newValue) => {
63
+ const oldValue = this.valid;
64
+ if (!this.customErrorMessage.lock || (this.customErrorMessage.message !== undefined && !newValue)) {
65
+ this.valid = newValue;
66
+ }
67
+ this.invalid = !this.valid;
68
+ // We need to send valid event even if it is the same value
69
+ if (this.handlerInProgress === undefined || (this.handlerInProgress === 'blur' && this.valid !== oldValue)) {
70
+ this.inputValid.emit(this.valid);
71
+ }
72
+ };
73
+ /**
74
+ * Handle change event
75
+ */
76
+ this.handleInputChange = (event) => {
77
+ this.checkValidity();
78
+ if (this.hasDisplayedError) {
79
+ this.setErrorMessage();
80
+ }
81
+ this.files = Array.from(event.target.files);
82
+ // Reset input focus to the button after file selection
83
+ this.fileButtonElement.focus();
84
+ };
85
+ /**
86
+ * Handle input focus event
87
+ */
88
+ this.handleInputFocus = () => {
89
+ this.fileButtonElement.dataset.focusVisible = '';
90
+ };
91
+ /**
92
+ * Handle input blur event
93
+ */
94
+ this.handleInputBlur = () => {
95
+ // Display Error
96
+ this.handlerInProgress = 'blur';
97
+ this.displayError().finally(() => {
98
+ // reset guard
99
+ this.handlerInProgress = undefined;
100
+ });
101
+ delete this.fileButtonElement.dataset.focusVisible;
102
+ };
103
+ /**
104
+ * Handle button blur event
105
+ */
106
+ this.handleButtonBlur = () => {
107
+ this.inputElement.blur();
108
+ };
109
+ /**
110
+ * Handle add file button click
111
+ */
112
+ this.handleButtonClick = () => {
113
+ this.inputElement.click();
114
+ };
115
+ /**
116
+ * Check if input is valid
117
+ */
118
+ this.checkValidity = () => {
119
+ this.setValidity(this.disabled || (!this.isMaxSizeExceeded() && this.inputElement.checkValidity()));
120
+ };
121
+ /**
122
+ * Handle delete file button click
123
+ */
124
+ this.handleDeleteFileClick = () => {
125
+ this.files = [];
126
+ // Reset input focus to the button after file selection
127
+ this.fileButtonElement.focus();
128
+ };
129
+ /**
130
+ * Set input error message
131
+ * @param fromSetErrorContext - context come from `setError` method
132
+ */
133
+ this.setErrorMessage = (fromSetErrorContext = false) => {
134
+ // Set error message
135
+ this.errorMessage = undefined;
136
+ if (!this.valid) {
137
+ // Does have a new custom error message OR does have a custom error message locked
138
+ if (fromSetErrorContext || (this.customErrorMessage.lock && this.customErrorMessage.message !== undefined)) {
139
+ this.errorMessage = this.customErrorMessage.message;
140
+ }
141
+ // Does not match max size
142
+ else if (this.isMaxSizeExceeded()) {
143
+ this.errorMessage = this.messages.input.file.errors.maxSize.replace('{{maxSize}}', localeByte(this.maxSize, this.locale));
144
+ }
145
+ // required
146
+ else if (this.inputElement.validity.valueMissing) {
147
+ this.errorMessage = this.messages.errors.required;
148
+ }
149
+ }
150
+ };
151
+ /**
152
+ * Check if max size is exceeded
153
+ * @returns boolean - true if max size is exceeded
154
+ */
155
+ this.isMaxSizeExceeded = () => {
156
+ return this.maxSize >= 0 && this.files.some(file => file.size > this.maxSize);
157
+ };
158
+ /**
159
+ * Render files
160
+ * @returns formated files.
161
+ */
162
+ this.renderFiles = () => {
163
+ const fileListId = `${this.identifier}-file-list`;
164
+ const renderFileName = (file) => (h("span", { class: "mg-c-input__file-item-name" }, file.name, file.size > 0 ? h("span", { class: "mg-c-input__file-item-size" }, ` ${localeByte(file.size, this.locale)}`) : undefined));
165
+ const renderDeleteButton = () => (h("mg-button", { variant: "flat", class: "mg-c-input__file-delete-button", "is-icon": true, label: this.messages.input.file.deleteButton, type: "button", disabled: this.disabled, "aria-controls": [this.identifier, fileListId].join(' '), onClick: this.handleDeleteFileClick }, h("mg-icon", { icon: "cross" })));
166
+ if (this.files.length === 0) {
167
+ return null;
168
+ }
169
+ else if (this.files.length === 1) {
170
+ return (h("div", { class: "mg-c-input__file-item" }, renderFileName(this.files[0]), renderDeleteButton()));
171
+ }
172
+ else {
173
+ return (h("div", { class: "mg-c-input__file-list-container" }, h("ul", { role: "list", class: "mg-c-input__file-list", id: fileListId }, Array.from(this.files).map((file, index) => (h("li", { class: "mg-c-input__file-item", key: `${file.name}-${index}` }, renderFileName(file))))), renderDeleteButton()));
174
+ }
175
+ };
176
+ }
177
+ watchValue(newValue) {
178
+ if (allItemsAreString(newValue)) {
179
+ this.files = this.value.map((fileName) => new File([], fileName));
180
+ }
181
+ else if (allItemsAreFile(newValue)) {
182
+ this.files = this.value;
183
+ }
184
+ else if (newValue !== undefined) {
185
+ throw new Error(`<mg-input-file> prop "value" must be an array of strings or File objects. Passed value: ${toString(newValue)}.`);
186
+ }
187
+ else {
188
+ this.files = [];
189
+ }
190
+ this.valueChange.emit(newValue);
191
+ }
192
+ watchMultiple() {
193
+ if (this.multiple === false && this.files.length > 1) {
194
+ throw new Error(`<mg-input-file> prop "value" must be a single file when prop "multiple" is set to false.`);
195
+ }
196
+ }
197
+ watchAccept(newValue) {
198
+ if (newValue !== undefined && !isValidString(newValue)) {
199
+ throw new Error(`<mg-input-file> prop "accept" must be a valid string.`);
200
+ }
201
+ }
202
+ handleValidityChange(newValue, _oldValue, prop) {
203
+ if (this.inputElement !== undefined) {
204
+ this.inputElement[prop] = newValue;
205
+ this.checkValidity();
206
+ if (this.hasDisplayedError) {
207
+ this.setErrorMessage();
208
+ this.hasDisplayedError = false;
209
+ }
210
+ }
211
+ }
212
+ watchDisabled(newValue) {
213
+ if (newValue) {
214
+ this.classCollection.add(classDisabled);
215
+ }
216
+ else {
217
+ this.classCollection.delete(classDisabled);
218
+ }
219
+ }
220
+ watchHelpText() {
221
+ if (!isValidString(this.helpText)) {
222
+ const helpText = [];
223
+ if (this.maxSize !== undefined) {
224
+ helpText.push(this.messages.input.file.helpText.maxSize.replace('{{maxSize}}', localeByte(this.maxSize, this.locale)));
225
+ }
226
+ if (this.accept !== undefined) {
227
+ helpText.push(this.messages.input.file.helpText.accept.replace('{{accept}}', this.accept));
228
+ }
229
+ this.helpText = helpText.join('. ');
230
+ }
231
+ }
232
+ watchFiles(newValue, oldValue) {
233
+ if (toString(newValue) !== toString(oldValue)) {
234
+ this.value = newValue.length > 0 ? newValue : undefined;
235
+ }
236
+ }
237
+ /**
238
+ * Set focus on input add file button
239
+ */
240
+ async setFocus() {
241
+ this.fileButtonElement.focus();
242
+ }
243
+ /**
244
+ * Display input error if it exists.
245
+ */
246
+ displayError() {
247
+ // Use `Promise` as requested for stencil method
248
+ // Use `requestAnimationFrame` to ensure:
249
+ // - DOM is fully updated before validation
250
+ // - Async operations are completed
251
+ // - No timing issues with Stencil's render cycle
252
+ // - Keep everything in sync both inside and outside the component
253
+ return new Promise(resolve => {
254
+ requestAnimationFrame(() => {
255
+ this.checkValidity();
256
+ this.setErrorMessage();
257
+ this.hasDisplayedError = this.invalid;
258
+ resolve();
259
+ });
260
+ });
261
+ }
262
+ /**
263
+ * Set an error and display a custom error message.
264
+ * This method can be used to set the component's error state from its context by passing a boolean value to the `valid` parameter.
265
+ * It must be paired with an error message to display for the given context.
266
+ * When used to set validity to `false`, you should use this method again to reset the validity to `true`.
267
+ * @param valid - value indicating the validity
268
+ * @param errorMessage - the error message to display
269
+ * @param errorMessageLock - lock the error message and validity state
270
+ */
271
+ async setError(valid, errorMessage, errorMessageLock = false) {
272
+ if (typeof valid !== 'boolean') {
273
+ throw new Error('<mg-input-file> method "setError()" param "valid" must be a boolean.');
274
+ }
275
+ else if (errorMessage !== undefined && !isValidString(errorMessage)) {
276
+ throw new Error('<mg-input-file> method "setError()" param "errorMessage" must be a string.');
277
+ }
278
+ else {
279
+ this.customErrorMessage = {
280
+ lock: valid ? false : errorMessageLock,
281
+ message: valid ? undefined : errorMessage,
282
+ };
283
+ this.setValidity(valid);
284
+ this.setErrorMessage(true);
285
+ this.hasDisplayedError = this.invalid;
286
+ }
287
+ }
288
+ /**
289
+ * Reset value, validity and error state
290
+ */
291
+ async reset() {
292
+ this.files = [];
293
+ // Use `Promise` as requested for stencil method
294
+ // Use `requestAnimationFrame` to ensure:
295
+ // - DOM is fully updated before validation
296
+ // - Async operations are completed
297
+ // - No timing issues with Stencil's render cycle
298
+ // - Keep everything in sync both inside and outside the component
299
+ return new Promise(resolve => {
300
+ requestAnimationFrame(() => {
301
+ // unlock validity check by resetting customErrorMessage
302
+ this.customErrorMessage = { lock: false };
303
+ this.checkValidity();
304
+ this.errorMessage = undefined;
305
+ this.hasDisplayedError = false;
306
+ resolve();
307
+ });
308
+ });
309
+ }
310
+ /*************
311
+ * Lifecycle *
312
+ *************/
313
+ /**
314
+ * Check if component props are well configured on init
315
+ * @returns timeout
316
+ */
317
+ componentWillLoad() {
318
+ // Get locales
319
+ const locales = initLocales(this.element);
320
+ this.locale = locales.locale;
321
+ this.messages = locales.messages;
322
+ // Validate
323
+ this.watchValue(this.value);
324
+ this.watchDisabled(this.disabled);
325
+ this.watchHelpText();
326
+ this.watchAccept(this.accept);
327
+ this.watchMultiple();
328
+ // Check validity when component is ready
329
+ // return a promise to process action only in the FIRST render().
330
+ // https://stenciljs.com/docs/component-lifecycle#componentwillload
331
+ return setTimeout(() => {
332
+ this.checkValidity();
333
+ }, 0);
334
+ }
335
+ /**
336
+ * Render
337
+ * @returns HTML Element
338
+ */
339
+ render() {
340
+ return (h("mg-input", { key: '48337d8e0a059dbea60c4bfa152468429b37b897', label: this.label, identifier: this.identifier, class: this.classCollection.join(), labelOnTop: this.labelOnTop, labelHide: this.labelHide, required: this.required, tooltip: this.tooltip, tooltipPosition: this.tooltipPosition, helpText: this.helpText, errorMessage: this.errorMessage }, h("div", { key: 'b0a67412ce2a054ce84f001efe01156bfce001a1', class: "mg-c-input__file-container" }, h("input", { key: '0585b37ac4da8e5b29b94c04a298cfd8451016c9', name: this.name, id: this.identifier, class: "mg-u-visually-hidden", type: "file", multiple: this.multiple === true, capture: this.capture, accept: this.accept, disabled: this.disabled, required: this.files.length === 0 && this.required, onFocus: this.handleInputFocus, onBlur: this.handleInputBlur, onChange: this.handleInputChange, "aria-invalid": (this.invalid === true).toString(), ref: (el) => {
341
+ this.inputElement = el;
342
+ } }), h("mg-button", { key: '0c71ea34375f60a357ad2aa38353c7acafc1091a', variant: "secondary", class: "mg-c-input__file-button", type: "button", disabled: this.disabled, onClick: this.handleButtonClick, onBlur: this.handleButtonBlur, tabindex: "-1", ref: (el) => {
343
+ this.fileButtonElement = el;
344
+ } }, this.messages.input.file.browse), this.renderFiles())));
345
+ }
346
+ get element() { return getElement(this); }
347
+ static get watchers() { return {
348
+ "value": [{
349
+ "watchValue": 0
350
+ }, {
351
+ "watchMultiple": 0
352
+ }],
353
+ "multiple": [{
354
+ "watchMultiple": 0
355
+ }],
356
+ "accept": [{
357
+ "watchAccept": 0
358
+ }, {
359
+ "watchHelpText": 0
360
+ }],
361
+ "required": [{
362
+ "handleValidityChange": 0
363
+ }],
364
+ "disabled": [{
365
+ "handleValidityChange": 0
366
+ }, {
367
+ "watchDisabled": 0
368
+ }],
369
+ "helpText": [{
370
+ "watchHelpText": 0
371
+ }],
372
+ "maxSize": [{
373
+ "watchHelpText": 0
374
+ }],
375
+ "files": [{
376
+ "watchFiles": 0
377
+ }]
378
+ }; }
379
+ };
380
+ MgInputFile.style = mgInputFileCss();
381
+
382
+ export { MgInputFile as mg_input_file };