@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,384 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-C2viYwrR.js');
4
+ var index$1 = require('./index-CpENFzEo.js');
5
+ var index$2 = require('./index-BxB20_Vw.js');
6
+ var mgInput_conf = require('./mg-input.conf-BNpeATnq.js');
7
+
8
+ 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}`;
9
+
10
+ const allItemsAreFile = (items) => {
11
+ return Array.isArray(items) && items.every(item => index$1.isObject(item) && typeof item.name === 'string' && typeof item.size === 'number');
12
+ };
13
+ const MgInputFile = class {
14
+ constructor(hostRef) {
15
+ index.registerInstance(this, hostRef);
16
+ this.valueChange = index.createEvent(this, "value-change", 7);
17
+ this.inputValid = index.createEvent(this, "input-valid", 7);
18
+ // hasDisplayedError (triggered by blur event)
19
+ this.hasDisplayedError = false;
20
+ this.customErrorMessage = { lock: false };
21
+ /**
22
+ * Input name
23
+ * If not set the value equals the identifier
24
+ */
25
+ this.name = this.identifier;
26
+ /**
27
+ * Define if label is displayed on top
28
+ */
29
+ this.labelOnTop = false;
30
+ /**
31
+ * Define if label is visible
32
+ */
33
+ this.labelHide = false;
34
+ /**
35
+ * Define multiple files
36
+ * When the multiple Boolean attribute is specified, the file input allows the user to select more than one file.
37
+ * (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#multiple).
38
+ */
39
+ this.multiple = false;
40
+ /**
41
+ * Define if input is required
42
+ */
43
+ this.required = false;
44
+ /**
45
+ * Define if input is disabled
46
+ */
47
+ this.disabled = false;
48
+ /**
49
+ * Define tooltip position
50
+ */
51
+ this.tooltipPosition = 'input';
52
+ /**
53
+ * Component classes
54
+ */
55
+ this.classCollection = new index$1.ClassList(['mg-c-input--file']);
56
+ /**
57
+ * Files list
58
+ */
59
+ this.files = [];
60
+ /**
61
+ * Method to set validity values
62
+ * @param newValue - valid new value
63
+ */
64
+ this.setValidity = (newValue) => {
65
+ const oldValue = this.valid;
66
+ if (!this.customErrorMessage.lock || (this.customErrorMessage.message !== undefined && !newValue)) {
67
+ this.valid = newValue;
68
+ }
69
+ this.invalid = !this.valid;
70
+ // We need to send valid event even if it is the same value
71
+ if (this.handlerInProgress === undefined || (this.handlerInProgress === 'blur' && this.valid !== oldValue)) {
72
+ this.inputValid.emit(this.valid);
73
+ }
74
+ };
75
+ /**
76
+ * Handle change event
77
+ */
78
+ this.handleInputChange = (event) => {
79
+ this.checkValidity();
80
+ if (this.hasDisplayedError) {
81
+ this.setErrorMessage();
82
+ }
83
+ this.files = Array.from(event.target.files);
84
+ // Reset input focus to the button after file selection
85
+ this.fileButtonElement.focus();
86
+ };
87
+ /**
88
+ * Handle input focus event
89
+ */
90
+ this.handleInputFocus = () => {
91
+ this.fileButtonElement.dataset.focusVisible = '';
92
+ };
93
+ /**
94
+ * Handle input blur event
95
+ */
96
+ this.handleInputBlur = () => {
97
+ // Display Error
98
+ this.handlerInProgress = 'blur';
99
+ this.displayError().finally(() => {
100
+ // reset guard
101
+ this.handlerInProgress = undefined;
102
+ });
103
+ delete this.fileButtonElement.dataset.focusVisible;
104
+ };
105
+ /**
106
+ * Handle button blur event
107
+ */
108
+ this.handleButtonBlur = () => {
109
+ this.inputElement.blur();
110
+ };
111
+ /**
112
+ * Handle add file button click
113
+ */
114
+ this.handleButtonClick = () => {
115
+ this.inputElement.click();
116
+ };
117
+ /**
118
+ * Check if input is valid
119
+ */
120
+ this.checkValidity = () => {
121
+ this.setValidity(this.disabled || (!this.isMaxSizeExceeded() && this.inputElement.checkValidity()));
122
+ };
123
+ /**
124
+ * Handle delete file button click
125
+ */
126
+ this.handleDeleteFileClick = () => {
127
+ this.files = [];
128
+ // Reset input focus to the button after file selection
129
+ this.fileButtonElement.focus();
130
+ };
131
+ /**
132
+ * Set input error message
133
+ * @param fromSetErrorContext - context come from `setError` method
134
+ */
135
+ this.setErrorMessage = (fromSetErrorContext = false) => {
136
+ // Set error message
137
+ this.errorMessage = undefined;
138
+ if (!this.valid) {
139
+ // Does have a new custom error message OR does have a custom error message locked
140
+ if (fromSetErrorContext || (this.customErrorMessage.lock && this.customErrorMessage.message !== undefined)) {
141
+ this.errorMessage = this.customErrorMessage.message;
142
+ }
143
+ // Does not match max size
144
+ else if (this.isMaxSizeExceeded()) {
145
+ this.errorMessage = this.messages.input.file.errors.maxSize.replace('{{maxSize}}', index$2.localeByte(this.maxSize, this.locale));
146
+ }
147
+ // required
148
+ else if (this.inputElement.validity.valueMissing) {
149
+ this.errorMessage = this.messages.errors.required;
150
+ }
151
+ }
152
+ };
153
+ /**
154
+ * Check if max size is exceeded
155
+ * @returns boolean - true if max size is exceeded
156
+ */
157
+ this.isMaxSizeExceeded = () => {
158
+ return this.maxSize >= 0 && this.files.some(file => file.size > this.maxSize);
159
+ };
160
+ /**
161
+ * Render files
162
+ * @returns formated files.
163
+ */
164
+ this.renderFiles = () => {
165
+ const fileListId = `${this.identifier}-file-list`;
166
+ const renderFileName = (file) => (index.h("span", { class: "mg-c-input__file-item-name" }, file.name, file.size > 0 ? index.h("span", { class: "mg-c-input__file-item-size" }, ` ${index$2.localeByte(file.size, this.locale)}`) : undefined));
167
+ const renderDeleteButton = () => (index.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 }, index.h("mg-icon", { icon: "cross" })));
168
+ if (this.files.length === 0) {
169
+ return null;
170
+ }
171
+ else if (this.files.length === 1) {
172
+ return (index.h("div", { class: "mg-c-input__file-item" }, renderFileName(this.files[0]), renderDeleteButton()));
173
+ }
174
+ else {
175
+ return (index.h("div", { class: "mg-c-input__file-list-container" }, index.h("ul", { role: "list", class: "mg-c-input__file-list", id: fileListId }, Array.from(this.files).map((file, index$1) => (index.h("li", { class: "mg-c-input__file-item", key: `${file.name}-${index$1}` }, renderFileName(file))))), renderDeleteButton()));
176
+ }
177
+ };
178
+ }
179
+ watchValue(newValue) {
180
+ if (index$1.allItemsAreString(newValue)) {
181
+ this.files = this.value.map((fileName) => new File([], fileName));
182
+ }
183
+ else if (allItemsAreFile(newValue)) {
184
+ this.files = this.value;
185
+ }
186
+ else if (newValue !== undefined) {
187
+ throw new Error(`<mg-input-file> prop "value" must be an array of strings or File objects. Passed value: ${index$1.toString(newValue)}.`);
188
+ }
189
+ else {
190
+ this.files = [];
191
+ }
192
+ this.valueChange.emit(newValue);
193
+ }
194
+ watchMultiple() {
195
+ if (this.multiple === false && this.files.length > 1) {
196
+ throw new Error(`<mg-input-file> prop "value" must be a single file when prop "multiple" is set to false.`);
197
+ }
198
+ }
199
+ watchAccept(newValue) {
200
+ if (newValue !== undefined && !index$1.isValidString(newValue)) {
201
+ throw new Error(`<mg-input-file> prop "accept" must be a valid string.`);
202
+ }
203
+ }
204
+ handleValidityChange(newValue, _oldValue, prop) {
205
+ if (this.inputElement !== undefined) {
206
+ this.inputElement[prop] = newValue;
207
+ this.checkValidity();
208
+ if (this.hasDisplayedError) {
209
+ this.setErrorMessage();
210
+ this.hasDisplayedError = false;
211
+ }
212
+ }
213
+ }
214
+ watchDisabled(newValue) {
215
+ if (newValue) {
216
+ this.classCollection.add(mgInput_conf.classDisabled);
217
+ }
218
+ else {
219
+ this.classCollection.delete(mgInput_conf.classDisabled);
220
+ }
221
+ }
222
+ watchHelpText() {
223
+ if (!index$1.isValidString(this.helpText)) {
224
+ const helpText = [];
225
+ if (this.maxSize !== undefined) {
226
+ helpText.push(this.messages.input.file.helpText.maxSize.replace('{{maxSize}}', index$2.localeByte(this.maxSize, this.locale)));
227
+ }
228
+ if (this.accept !== undefined) {
229
+ helpText.push(this.messages.input.file.helpText.accept.replace('{{accept}}', this.accept));
230
+ }
231
+ this.helpText = helpText.join('. ');
232
+ }
233
+ }
234
+ watchFiles(newValue, oldValue) {
235
+ if (index$1.toString(newValue) !== index$1.toString(oldValue)) {
236
+ this.value = newValue.length > 0 ? newValue : undefined;
237
+ }
238
+ }
239
+ /**
240
+ * Set focus on input add file button
241
+ */
242
+ async setFocus() {
243
+ this.fileButtonElement.focus();
244
+ }
245
+ /**
246
+ * Display input error if it exists.
247
+ */
248
+ displayError() {
249
+ // Use `Promise` as requested for stencil method
250
+ // Use `requestAnimationFrame` to ensure:
251
+ // - DOM is fully updated before validation
252
+ // - Async operations are completed
253
+ // - No timing issues with Stencil's render cycle
254
+ // - Keep everything in sync both inside and outside the component
255
+ return new Promise(resolve => {
256
+ requestAnimationFrame(() => {
257
+ this.checkValidity();
258
+ this.setErrorMessage();
259
+ this.hasDisplayedError = this.invalid;
260
+ resolve();
261
+ });
262
+ });
263
+ }
264
+ /**
265
+ * Set an error and display a custom error message.
266
+ * This method can be used to set the component's error state from its context by passing a boolean value to the `valid` parameter.
267
+ * It must be paired with an error message to display for the given context.
268
+ * When used to set validity to `false`, you should use this method again to reset the validity to `true`.
269
+ * @param valid - value indicating the validity
270
+ * @param errorMessage - the error message to display
271
+ * @param errorMessageLock - lock the error message and validity state
272
+ */
273
+ async setError(valid, errorMessage, errorMessageLock = false) {
274
+ if (typeof valid !== 'boolean') {
275
+ throw new Error('<mg-input-file> method "setError()" param "valid" must be a boolean.');
276
+ }
277
+ else if (errorMessage !== undefined && !index$1.isValidString(errorMessage)) {
278
+ throw new Error('<mg-input-file> method "setError()" param "errorMessage" must be a string.');
279
+ }
280
+ else {
281
+ this.customErrorMessage = {
282
+ lock: valid ? false : errorMessageLock,
283
+ message: valid ? undefined : errorMessage,
284
+ };
285
+ this.setValidity(valid);
286
+ this.setErrorMessage(true);
287
+ this.hasDisplayedError = this.invalid;
288
+ }
289
+ }
290
+ /**
291
+ * Reset value, validity and error state
292
+ */
293
+ async reset() {
294
+ this.files = [];
295
+ // Use `Promise` as requested for stencil method
296
+ // Use `requestAnimationFrame` to ensure:
297
+ // - DOM is fully updated before validation
298
+ // - Async operations are completed
299
+ // - No timing issues with Stencil's render cycle
300
+ // - Keep everything in sync both inside and outside the component
301
+ return new Promise(resolve => {
302
+ requestAnimationFrame(() => {
303
+ // unlock validity check by resetting customErrorMessage
304
+ this.customErrorMessage = { lock: false };
305
+ this.checkValidity();
306
+ this.errorMessage = undefined;
307
+ this.hasDisplayedError = false;
308
+ resolve();
309
+ });
310
+ });
311
+ }
312
+ /*************
313
+ * Lifecycle *
314
+ *************/
315
+ /**
316
+ * Check if component props are well configured on init
317
+ * @returns timeout
318
+ */
319
+ componentWillLoad() {
320
+ // Get locales
321
+ const locales = index$2.initLocales(this.element);
322
+ this.locale = locales.locale;
323
+ this.messages = locales.messages;
324
+ // Validate
325
+ this.watchValue(this.value);
326
+ this.watchDisabled(this.disabled);
327
+ this.watchHelpText();
328
+ this.watchAccept(this.accept);
329
+ this.watchMultiple();
330
+ // Check validity when component is ready
331
+ // return a promise to process action only in the FIRST render().
332
+ // https://stenciljs.com/docs/component-lifecycle#componentwillload
333
+ return setTimeout(() => {
334
+ this.checkValidity();
335
+ }, 0);
336
+ }
337
+ /**
338
+ * Render
339
+ * @returns HTML Element
340
+ */
341
+ render() {
342
+ return (index.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 }, index.h("div", { key: 'b0a67412ce2a054ce84f001efe01156bfce001a1', class: "mg-c-input__file-container" }, index.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) => {
343
+ this.inputElement = el;
344
+ } }), index.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) => {
345
+ this.fileButtonElement = el;
346
+ } }, this.messages.input.file.browse), this.renderFiles())));
347
+ }
348
+ get element() { return index.getElement(this); }
349
+ static get watchers() { return {
350
+ "value": [{
351
+ "watchValue": 0
352
+ }, {
353
+ "watchMultiple": 0
354
+ }],
355
+ "multiple": [{
356
+ "watchMultiple": 0
357
+ }],
358
+ "accept": [{
359
+ "watchAccept": 0
360
+ }, {
361
+ "watchHelpText": 0
362
+ }],
363
+ "required": [{
364
+ "handleValidityChange": 0
365
+ }],
366
+ "disabled": [{
367
+ "handleValidityChange": 0
368
+ }, {
369
+ "watchDisabled": 0
370
+ }],
371
+ "helpText": [{
372
+ "watchHelpText": 0
373
+ }],
374
+ "maxSize": [{
375
+ "watchHelpText": 0
376
+ }],
377
+ "files": [{
378
+ "watchFiles": 0
379
+ }]
380
+ }; }
381
+ };
382
+ MgInputFile.style = mgInputFileCss();
383
+
384
+ exports.mg_input_file = MgInputFile;