@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.
- package/dist/cjs/{index-TUElr4Wv.js → index-BxB20_Vw.js} +54 -0
- package/dist/cjs/{index-Bp6wZzau.js → index-C2viYwrR.js} +1761 -80
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/mg-action-more_37.cjs.entry.js +761 -371
- package/dist/cjs/mg-alert.cjs.entry.js +17 -9
- package/dist/cjs/mg-breadcrumb.cjs.entry.js +63 -0
- package/dist/cjs/mg-components.cjs.js +3 -3
- package/dist/cjs/mg-fieldset.cjs.entry.js +24 -7
- package/dist/cjs/mg-input-combobox.cjs.entry.js +49 -19
- package/dist/cjs/mg-input-file.cjs.entry.js +384 -0
- package/dist/cjs/mg-input-rich-text-editor.cjs.entry.js +40096 -15821
- package/dist/cjs/{mg-input.conf-D7jmj_lh.js → mg-input.conf-BNpeATnq.js} +7 -0
- package/dist/cjs/mg-loader.cjs.entry.js +8 -6
- package/dist/cjs/mg-progress.cjs.entry.js +19 -9
- package/dist/collection/assets/icons/index.js +1 -1
- package/dist/collection/collection-manifest.json +5 -3
- package/dist/collection/components/atoms/internals/mg-character-left/mg-character-left.js +1 -1
- package/dist/collection/components/atoms/internals/mg-input-title/mg-input-title.js +1 -1
- package/dist/collection/components/atoms/mg-card/mg-card.js +1 -1
- package/dist/collection/components/atoms/mg-divider/mg-divider.js +1 -1
- package/dist/collection/components/atoms/mg-icon/mg-icon.js +2 -2
- package/dist/collection/components/atoms/mg-tag/mg-tag.js +1 -1
- package/dist/collection/components/atoms/mg-tooltip/mg-tooltip-content/mg-tooltip-content.js +1 -1
- package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input/mg-input.conf.js +6 -0
- package/dist/collection/components/molecules/inputs/mg-input/mg-input.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-checkbox/MgInputCheckboxList.js +2 -2
- package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox-paginated/mg-input-checkbox-paginated.js +2 -2
- package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-combobox/mg-input-combobox.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-file/mg-input-file.js +877 -0
- package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.js +2 -2
- package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/custom-properties.scss +212 -0
- package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/editor.conf.js +1 -0
- package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/index.js +300 -94
- package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.conf.js +29 -0
- package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.js +163 -53
- package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.js +2 -2
- package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.js +1 -1
- package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.js +1 -1
- package/dist/collection/components/molecules/internals/mg-item-more/mg-item-more.js +3 -36
- package/dist/collection/components/molecules/menus/mg-menu/mg-menu.conf.js +0 -4
- package/dist/collection/components/molecules/menus/mg-menu/mg-menu.js +21 -43
- package/dist/collection/components/molecules/menus/mg-menu-item/mg-menu-item.js +65 -38
- package/dist/collection/components/molecules/mg-action-more/mg-action-more.js +2 -2
- package/dist/collection/components/molecules/mg-alert/mg-alert.js +1 -1
- package/dist/collection/components/molecules/mg-breadcrumb/mg-breadcrumb.conf.js +1 -0
- package/dist/collection/components/molecules/mg-breadcrumb/mg-breadcrumb.js +92 -0
- package/dist/collection/components/molecules/mg-details/mg-details.js +1 -1
- package/dist/collection/components/molecules/mg-fieldset/mg-fieldset.js +12 -3
- package/dist/collection/components/molecules/mg-form/mg-form.js +12 -2
- package/dist/collection/components/molecules/mg-illustrated-message/mg-illustrated-message.js +1 -1
- package/dist/collection/components/molecules/mg-loader/mg-loader.js +1 -1
- package/dist/collection/components/molecules/mg-message/mg-message.js +2 -2
- package/dist/collection/components/molecules/mg-modal/mg-modal.js +2 -2
- package/dist/collection/components/molecules/mg-panel/mg-panel.js +1 -1
- package/dist/collection/components/molecules/mg-popover/mg-popover-content/mg-popover-content.js +1 -1
- package/dist/collection/components/molecules/mg-popover/mg-popover.js +1 -1
- package/dist/collection/components/molecules/mg-progress/mg-progress.js +1 -1
- package/dist/collection/components/molecules/mg-skip-links/mg-skip-links.js +1 -1
- package/dist/collection/components/molecules/mg-table/mg-table.js +37 -0
- package/dist/collection/components/molecules/mg-tabs/mg-tabs.conf.js +0 -4
- package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +13 -33
- package/dist/collection/locales/en/messages.json +14 -0
- package/dist/collection/locales/fr/messages.json +14 -0
- package/dist/components/events.utils.js +1 -23
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +1 -1
- package/dist/components/index2.js +1 -408
- package/dist/components/index3.js +1 -476
- package/dist/components/mg-action-more.js +1 -254
- package/dist/components/mg-alert.js +1 -224
- package/dist/components/mg-badge.js +1 -6
- package/dist/components/mg-badge2.js +1 -113
- package/dist/components/mg-breadcrumb.d.ts +11 -0
- package/dist/components/mg-breadcrumb.js +1 -0
- package/dist/components/mg-button.js +1 -6
- package/dist/components/mg-button2.js +1 -275
- package/dist/components/mg-card.js +1 -6
- package/dist/components/mg-card2.js +1 -92
- package/dist/components/mg-character-left.js +1 -6
- package/dist/components/mg-character-left2.js +1 -75
- package/dist/components/mg-details.js +1 -104
- package/dist/components/mg-divider.js +1 -6
- package/dist/components/mg-divider2.js +1 -49
- package/dist/components/mg-fieldset.js +1 -209
- package/dist/components/mg-form.js +1 -302
- package/dist/components/mg-icon.js +1 -6
- package/dist/components/mg-icon2.js +1 -188
- package/dist/components/mg-illustrated-message.js +1 -129
- package/dist/components/mg-input-checkbox-paginated.js +1 -6
- package/dist/components/mg-input-checkbox-paginated2.js +1 -135
- package/dist/components/mg-input-checkbox.js +1 -762
- package/dist/components/mg-input-combobox.js +1 -940
- package/dist/components/mg-input-date.js +1 -463
- package/dist/components/mg-input-file.d.ts +11 -0
- package/dist/components/mg-input-file.js +1 -0
- package/dist/components/mg-input-numeric.js +1 -592
- package/dist/components/mg-input-password.js +1 -360
- package/dist/components/mg-input-radio.js +1 -392
- package/dist/components/mg-input-rich-text-editor.js +1663 -16797
- package/dist/components/mg-input-select.js +1 -6
- package/dist/components/mg-input-select2.js +1 -481
- package/dist/components/mg-input-text.js +1 -6
- package/dist/components/mg-input-text2.js +1 -514
- package/dist/components/mg-input-textarea.js +1 -412
- package/dist/components/mg-input-title.js +1 -6
- package/dist/components/mg-input-title2.js +1 -81
- package/dist/components/mg-input-toggle.js +1 -371
- package/dist/components/mg-input.conf.js +1 -0
- package/dist/components/mg-input.js +1 -6
- package/dist/components/mg-input2.js +1 -459
- package/dist/components/mg-item-more.js +1 -6
- package/dist/components/mg-item-more2.js +1 -505
- package/dist/components/mg-loader.js +1 -6
- package/dist/components/mg-loader2.js +1 -74
- package/dist/components/mg-menu-item.js +1 -6
- package/dist/components/mg-menu-item2.js +1 -485
- package/dist/components/mg-menu.js +1 -6
- package/dist/components/mg-message.js +1 -6
- package/dist/components/mg-message2.js +1 -146
- package/dist/components/mg-modal.js +1 -184
- package/dist/components/mg-pagination.js +1 -234
- package/dist/components/mg-panel.js +1 -350
- package/dist/components/mg-popover-content.js +1 -6
- package/dist/components/mg-popover-content2.js +1 -96
- package/dist/components/mg-popover.js +1 -6
- package/dist/components/mg-popover2.js +1 -312
- package/dist/components/mg-progress.js +1 -123
- package/dist/components/mg-skip-links.js +1 -78
- package/dist/components/mg-table.js +1 -319
- package/dist/components/mg-tabs.js +1 -6
- package/dist/components/mg-tabs2.js +1 -315
- package/dist/components/mg-tag.js +1 -133
- package/dist/components/mg-tooltip-content.js +1 -6
- package/dist/components/mg-tooltip-content2.js +1 -42
- package/dist/components/mg-tooltip.js +1 -6
- package/dist/components/mg-tooltip2.js +1 -421
- package/dist/components/popper.js +1 -1790
- package/dist/esm/{index-BluNKQ3L.js → index-DFwaH2hS.js} +1761 -80
- package/dist/esm/{index-CNX6lq0x.js → index-DSEloqPn.js} +54 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/mg-action-more_37.entry.js +761 -371
- package/dist/esm/mg-alert.entry.js +17 -9
- package/dist/esm/mg-breadcrumb.entry.js +61 -0
- package/dist/esm/mg-components.js +4 -4
- package/dist/esm/mg-fieldset.entry.js +24 -7
- package/dist/esm/mg-input-combobox.entry.js +49 -19
- package/dist/esm/mg-input-file.entry.js +382 -0
- package/dist/esm/mg-input-rich-text-editor.entry.js +40083 -15808
- package/dist/esm/{mg-input.conf-DDnrE1hD.js → mg-input.conf-C9rmNQIL.js} +7 -1
- package/dist/esm/mg-loader.entry.js +8 -6
- package/dist/esm/mg-progress.entry.js +19 -9
- package/dist/mg-components/locales/en/messages.json +14 -0
- package/dist/mg-components/locales/fr/messages.json +14 -0
- package/dist/mg-components/mg-components.esm.js +1 -1
- package/dist/mg-components/p-0482eb9f.entry.js +1 -0
- package/dist/mg-components/{p-7132bca1.entry.js → p-2ee92f38.entry.js} +1 -1
- package/dist/mg-components/{p-916dfb6d.entry.js → p-3b653226.entry.js} +1 -1
- package/dist/mg-components/p-5745fbea.entry.js +1 -0
- package/dist/mg-components/p-C9rmNQIL.js +1 -0
- package/dist/mg-components/p-DFwaH2hS.js +2 -0
- package/dist/mg-components/p-DSEloqPn.js +1 -0
- package/dist/mg-components/p-adec7fcc.entry.js +1 -0
- package/dist/mg-components/p-c63f97f0.entry.js +1658 -0
- package/dist/mg-components/p-c8c8cfc1.entry.js +1 -0
- package/dist/mg-components/p-cc793586.entry.js +1 -0
- package/dist/mg-components/p-d5e69c95.entry.js +1 -0
- package/dist/types/assets/icons/index.d.ts +2 -0
- package/dist/types/components/molecules/inputs/mg-input/mg-input.conf.d.ts +7 -1
- package/dist/types/components/molecules/inputs/mg-input-file/mg-input-file.d.ts +210 -0
- package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/editor/editor.conf.d.ts +17 -0
- package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/editor/index.d.ts +27 -19
- package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.conf.d.ts +3 -0
- package/dist/types/components/molecules/inputs/mg-input-rich-text-editor/mg-input-rich-text-editor.d.ts +50 -16
- package/dist/types/components/molecules/internals/mg-item-more/mg-item-more.conf.d.ts +0 -5
- package/dist/types/components/molecules/internals/mg-item-more/mg-item-more.d.ts +1 -6
- package/dist/types/components/molecules/menus/mg-menu/mg-menu.conf.d.ts +2 -10
- package/dist/types/components/molecules/menus/mg-menu/mg-menu.d.ts +7 -7
- package/dist/types/components/molecules/menus/mg-menu-item/mg-menu-item.d.ts +12 -8
- package/dist/types/components/molecules/mg-breadcrumb/mg-breadcrumb.conf.d.ts +18 -0
- package/dist/types/components/molecules/mg-breadcrumb/mg-breadcrumb.d.ts +34 -0
- package/dist/types/components/molecules/mg-table/mg-table.d.ts +6 -0
- package/dist/types/components/molecules/mg-tabs/mg-tabs.conf.d.ts +1 -9
- package/dist/types/components/molecules/mg-tabs/mg-tabs.d.ts +4 -4
- package/dist/types/components.d.ts +302 -46
- package/dist/types/stencil-public-runtime.d.ts +76 -12
- package/ide/intellij/web-types.json +483 -51
- package/ide/vscode/css-custom-data.json +10 -2
- package/ide/vscode/html-custom-data.json +445 -104
- package/package.json +24 -23
- package/dist/collection/components/molecules/inputs/mg-input-rich-text-editor/editor/editor.scss +0 -1
- package/dist/mg-components/p-016bd291.entry.js +0 -1
- package/dist/mg-components/p-186a6139.entry.js +0 -1
- package/dist/mg-components/p-BluNKQ3L.js +0 -2
- package/dist/mg-components/p-CNX6lq0x.js +0 -1
- package/dist/mg-components/p-DDnrE1hD.js +0 -1
- package/dist/mg-components/p-cd061b38.entry.js +0 -1
- package/dist/mg-components/p-d2c72f09.entry.js +0 -1
- package/dist/mg-components/p-d5a276eb.entry.js +0 -1
- 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;
|