@mgdis/mg-components 3.1.0 → 3.2.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 (225) hide show
  1. package/dist/cjs/css-shim-629916b0.js +6 -0
  2. package/dist/cjs/index-369388eb.js +146 -0
  3. package/dist/cjs/{index-85a4a0b6.js → index-bead7dbd.js} +78 -2
  4. package/dist/cjs/loader.cjs.js +4 -4
  5. package/dist/cjs/mg-badge_21.cjs.entry.js +3313 -0
  6. package/dist/cjs/mg-components.cjs.js +3 -3
  7. package/dist/cjs/mg-modal.cjs.entry.js +111 -0
  8. package/dist/cjs/mg-popover.cjs.entry.js +165 -0
  9. package/dist/cjs/popper-0c3964e7.js +1786 -0
  10. package/dist/cjs/{shadow-css-8940f82d.js → shadow-css-546083ef.js} +1 -1
  11. package/dist/collection/collection-manifest.json +4 -1
  12. package/dist/collection/components/atoms/mg-badge/mg-badge.conf.js +1 -1
  13. package/dist/collection/components/atoms/mg-badge/mg-badge.js +11 -7
  14. package/dist/collection/components/atoms/mg-badge/mg-badge.stories.js +3 -0
  15. package/dist/collection/components/atoms/mg-button/mg-button.css +26 -17
  16. package/dist/collection/components/atoms/mg-button/mg-button.js +71 -2
  17. package/dist/collection/components/atoms/mg-button/mg-button.stories.js +5 -0
  18. package/dist/collection/components/atoms/mg-character-left/mg-character-left.js +12 -1
  19. package/dist/collection/components/atoms/mg-character-left/mg-character-left.stories.js +8 -0
  20. package/dist/collection/components/atoms/mg-icon/mg-icon.conf.js +8 -0
  21. package/dist/collection/components/atoms/mg-icon/mg-icon.css +5 -7
  22. package/dist/collection/components/atoms/mg-icon/mg-icon.js +11 -1
  23. package/dist/collection/components/atoms/mg-input-title/mg-input-title.css +4 -4
  24. package/dist/collection/components/atoms/mg-input-title/mg-input-title.js +14 -3
  25. package/dist/collection/components/atoms/mg-tag/mg-tag.js +10 -3
  26. package/dist/collection/components/atoms/mg-tag/mg-tag.stories.js +3 -0
  27. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +9 -0
  28. package/dist/collection/components/molecules/inputs/MgInput.js +20 -14
  29. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.css +9 -1
  30. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.js +103 -40
  31. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.stories.js +6 -1
  32. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.css +27 -0
  33. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js +125 -56
  34. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.stories.js +6 -1
  35. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.css +27 -0
  36. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.js +144 -68
  37. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.stories.js +6 -1
  38. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.css +27 -0
  39. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.js +101 -35
  40. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.stories.js +6 -1
  41. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.css +9 -1
  42. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.js +115 -37
  43. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.stories.js +6 -1
  44. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.css +28 -1
  45. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +132 -51
  46. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.stories.js +14 -1
  47. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.css +27 -0
  48. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.js +155 -53
  49. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.stories.js +7 -2
  50. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.css +27 -0
  51. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.js +108 -42
  52. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.stories.js +7 -2
  53. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.css +4 -1
  54. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.js +60 -31
  55. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.stories.js +6 -1
  56. package/dist/collection/components/molecules/mg-form/mg-form.css +15 -0
  57. package/dist/collection/components/molecules/mg-form/mg-form.js +269 -0
  58. package/dist/collection/components/molecules/mg-form/mg-form.stories.js +58 -0
  59. package/dist/collection/components/molecules/mg-message/mg-message.css +1 -1
  60. package/dist/collection/components/molecules/mg-message/mg-message.js +11 -4
  61. package/dist/collection/components/molecules/mg-message/mg-message.stories.js +5 -1
  62. package/dist/collection/components/molecules/mg-modal/mg-modal.css +54 -0
  63. package/dist/collection/components/molecules/mg-modal/mg-modal.js +233 -0
  64. package/dist/collection/components/molecules/mg-modal/mg-modal.stories.js +51 -0
  65. package/dist/collection/components/molecules/mg-pagination/mg-pagination.js +32 -12
  66. package/dist/collection/components/molecules/mg-pagination/mg-pagination.stories.js +1 -0
  67. package/dist/collection/components/molecules/mg-panel/mg-panel.css +42 -0
  68. package/dist/collection/components/molecules/mg-panel/mg-panel.js +255 -0
  69. package/dist/collection/components/molecules/mg-panel/mg-panel.stories.js +31 -0
  70. package/dist/collection/components/molecules/mg-popover/mg-popover.css +2 -2
  71. package/dist/collection/components/molecules/mg-popover/mg-popover.js +19 -4
  72. package/dist/collection/components/molecules/mg-tabs/mg-tabs.conf.js +4 -1
  73. package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +14 -3
  74. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +68 -20
  75. package/dist/collection/components/molecules/mg-tabs/mg-tabs.stories.js +10 -1
  76. package/dist/collection/stories/messages.stories.js +1 -1
  77. package/dist/collection/utils/components.utils.js +16 -9
  78. package/dist/collection/utils/locale.utils.js +6 -3
  79. package/dist/collection/utils/test.utils.js +27 -15
  80. package/dist/collection/variables.css +30 -1
  81. package/dist/collection/variables.scss +30 -1
  82. package/dist/components/MgInput.js +20 -14
  83. package/dist/components/components.utils.js +16 -9
  84. package/dist/components/index.d.ts +1 -1
  85. package/dist/components/index2.js +22 -12
  86. package/dist/components/locale.utils.js +6 -3
  87. package/dist/components/mg-badge2.js +9 -5
  88. package/dist/components/mg-button2.js +21 -2
  89. package/dist/components/mg-character-left2.js +12 -1
  90. package/dist/components/mg-form.d.ts +11 -0
  91. package/dist/components/mg-form.js +146 -0
  92. package/dist/components/mg-icon2.js +20 -2
  93. package/dist/components/mg-input-checkbox.js +65 -36
  94. package/dist/components/mg-input-date.js +87 -52
  95. package/dist/components/mg-input-numeric.js +105 -63
  96. package/dist/components/mg-input-password.js +60 -29
  97. package/dist/components/mg-input-radio.js +74 -34
  98. package/dist/components/mg-input-select2.js +89 -46
  99. package/dist/components/mg-input-text.js +1 -237
  100. package/dist/components/mg-input-text2.js +288 -0
  101. package/dist/components/mg-input-textarea.js +67 -36
  102. package/dist/components/mg-input-title2.js +13 -4
  103. package/dist/components/mg-input-toggle.js +30 -22
  104. package/dist/components/mg-message.js +10 -3
  105. package/dist/components/mg-modal.d.ts +11 -0
  106. package/dist/components/mg-modal.js +147 -0
  107. package/dist/components/mg-pagination.js +31 -11
  108. package/dist/components/mg-panel.d.ts +11 -0
  109. package/dist/components/mg-panel.js +210 -0
  110. package/dist/components/mg-popover.js +20 -5
  111. package/dist/components/mg-tabs.js +43 -11
  112. package/dist/components/mg-tag.js +8 -1
  113. package/dist/components/mg-tooltip2.js +9 -0
  114. package/dist/esm/css-shim-0993aa3b.js +4 -0
  115. package/dist/esm/{index-e3e84606.js → index-9e877561.js} +78 -2
  116. package/dist/esm/index-c346f52d.js +139 -0
  117. package/dist/esm/loader.js +4 -4
  118. package/dist/esm/mg-badge_21.entry.js +3289 -0
  119. package/dist/esm/mg-components.js +3 -3
  120. package/dist/esm/mg-modal.entry.js +107 -0
  121. package/dist/esm/mg-popover.entry.js +161 -0
  122. package/dist/esm/polyfills/css-shim.js +1 -1
  123. package/dist/esm/popper-8874fd6c.js +1784 -0
  124. package/dist/esm/{shadow-css-5d2d01ce.js → shadow-css-dfa0587f.js} +1 -1
  125. package/dist/esm-es5/css-shim-0993aa3b.js +1 -0
  126. package/dist/esm-es5/index-9e877561.js +1 -0
  127. package/dist/esm-es5/index-c346f52d.js +1 -0
  128. package/dist/esm-es5/loader.js +1 -1
  129. package/dist/esm-es5/mg-badge_21.entry.js +2 -0
  130. package/dist/esm-es5/mg-components.js +1 -1
  131. package/dist/esm-es5/mg-modal.entry.js +1 -0
  132. package/dist/esm-es5/mg-popover.entry.js +1 -0
  133. package/dist/esm-es5/popper-8874fd6c.js +1 -0
  134. package/dist/esm-es5/{shadow-css-5d2d01ce.js → shadow-css-dfa0587f.js} +0 -0
  135. package/dist/mg-components/mg-components.css +1 -1
  136. package/dist/mg-components/mg-components.esm.js +1 -1
  137. package/dist/mg-components/mg-components.js +2 -2
  138. package/dist/mg-components/p-3633e9e1.system.entry.js +2 -0
  139. package/dist/mg-components/p-3c14153d.js +1 -0
  140. package/dist/mg-components/p-55a22b35.system.js +1 -0
  141. package/dist/mg-components/{p-f6455ab3.js → p-5e796581.js} +0 -0
  142. package/dist/mg-components/p-656b5efb.system.js +1 -0
  143. package/dist/mg-components/p-68d6f104.js +1 -0
  144. package/dist/mg-components/{p-366a224e.js → p-6d49ed95.js} +1 -1
  145. package/dist/mg-components/p-70177194.entry.js +1 -0
  146. package/dist/mg-components/{p-71d57b8b.system.js → p-8b2d8a2a.system.js} +0 -0
  147. package/dist/mg-components/p-8cb61c3f.system.js +1 -0
  148. package/dist/mg-components/p-ace173b1.js +1 -0
  149. package/dist/mg-components/p-c46fbd54.entry.js +1 -0
  150. package/dist/mg-components/p-c90cc4bf.system.js +1 -0
  151. package/dist/mg-components/p-cd2a4acc.system.entry.js +1 -0
  152. package/dist/mg-components/p-de1164fa.system.entry.js +1 -0
  153. package/dist/mg-components/p-dfe25da3.entry.js +1 -0
  154. package/dist/mg-components/p-e4a502b5.system.js +1 -0
  155. package/dist/mg-components/variables.css +30 -1
  156. package/dist/mg-components/variables.scss +30 -1
  157. package/dist/types/components/atoms/mg-badge/mg-badge.d.ts +8 -4
  158. package/dist/types/components/atoms/mg-badge/mg-badge.stories.d.ts +5 -0
  159. package/dist/types/components/atoms/mg-button/mg-button.d.ts +22 -2
  160. package/dist/types/components/atoms/mg-button/mg-button.stories.d.ts +5 -0
  161. package/dist/types/components/atoms/mg-character-left/mg-character-left.d.ts +13 -2
  162. package/dist/types/components/atoms/mg-character-left/mg-character-left.stories.d.ts +9 -0
  163. package/dist/types/components/atoms/mg-icon/mg-icon.conf.d.ts +1 -1
  164. package/dist/types/components/atoms/mg-icon/mg-icon.d.ts +11 -1
  165. package/dist/types/components/atoms/mg-input-title/mg-input-title.d.ts +11 -1
  166. package/dist/types/components/atoms/mg-tag/mg-tag.d.ts +10 -3
  167. package/dist/types/components/atoms/mg-tag/mg-tag.stories.d.ts +5 -0
  168. package/dist/types/components/atoms/mg-tooltip/mg-tooltip.d.ts +11 -2
  169. package/dist/types/components/molecules/inputs/MgInput.conf.d.ts +8 -0
  170. package/dist/types/components/molecules/inputs/MgInput.d.ts +5 -4
  171. package/dist/types/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.d.ts +31 -11
  172. package/dist/types/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.stories.d.ts +5 -0
  173. package/dist/types/components/molecules/inputs/mg-input-date/mg-input-date.d.ts +39 -14
  174. package/dist/types/components/molecules/inputs/mg-input-date/mg-input-date.stories.d.ts +5 -0
  175. package/dist/types/components/molecules/inputs/mg-input-numeric/mg-input-numeric.d.ts +53 -14
  176. package/dist/types/components/molecules/inputs/mg-input-numeric/mg-input-numeric.stories.d.ts +5 -0
  177. package/dist/types/components/molecules/inputs/mg-input-password/mg-input-password.d.ts +28 -9
  178. package/dist/types/components/molecules/inputs/mg-input-password/mg-input-password.stories.d.ts +5 -0
  179. package/dist/types/components/molecules/inputs/mg-input-radio/mg-input-radio.conf.d.ts +1 -1
  180. package/dist/types/components/molecules/inputs/mg-input-radio/mg-input-radio.d.ts +37 -8
  181. package/dist/types/components/molecules/inputs/mg-input-radio/mg-input-radio.stories.d.ts +5 -0
  182. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.conf.d.ts +1 -1
  183. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.d.ts +30 -7
  184. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.stories.d.ts +14 -0
  185. package/dist/types/components/molecules/inputs/mg-input-text/mg-input-text.d.ts +46 -10
  186. package/dist/types/components/molecules/inputs/mg-input-text/mg-input-text.stories.d.ts +5 -0
  187. package/dist/types/components/molecules/inputs/mg-input-textarea/mg-input-textarea.d.ts +30 -10
  188. package/dist/types/components/molecules/inputs/mg-input-textarea/mg-input-textarea.stories.d.ts +5 -0
  189. package/dist/types/components/molecules/inputs/mg-input-toggle/mg-input-toggle.conf.d.ts +1 -1
  190. package/dist/types/components/molecules/inputs/mg-input-toggle/mg-input-toggle.d.ts +27 -12
  191. package/dist/types/components/molecules/inputs/mg-input-toggle/mg-input-toggle.stories.d.ts +5 -0
  192. package/dist/types/components/molecules/mg-form/mg-form.d.ts +82 -0
  193. package/dist/types/components/molecules/mg-form/mg-form.stories.d.ts +11 -0
  194. package/dist/types/components/molecules/mg-message/mg-message.d.ts +11 -4
  195. package/dist/types/components/molecules/mg-message/mg-message.stories.d.ts +10 -0
  196. package/dist/types/components/molecules/mg-modal/mg-modal.d.ts +83 -0
  197. package/dist/types/components/molecules/mg-modal/mg-modal.stories.d.ts +13 -0
  198. package/dist/types/components/molecules/mg-pagination/mg-pagination.d.ts +23 -7
  199. package/dist/types/components/molecules/mg-pagination/mg-pagination.stories.d.ts +5 -0
  200. package/dist/types/components/molecules/mg-panel/mg-panel.d.ts +110 -0
  201. package/dist/types/components/molecules/mg-panel/mg-panel.stories.d.ts +6 -0
  202. package/dist/types/components/molecules/mg-popover/mg-popover.d.ts +18 -3
  203. package/dist/types/components/molecules/mg-tabs/mg-tabs.conf.d.ts +5 -0
  204. package/dist/types/components/molecules/mg-tabs/mg-tabs.d.ts +21 -6
  205. package/dist/types/components/molecules/mg-tabs/mg-tabs.stories.d.ts +8 -0
  206. package/dist/types/components.d.ts +365 -78
  207. package/dist/types/locales/index.d.ts +15 -8
  208. package/dist/types/utils/components.utils.d.ts +16 -9
  209. package/dist/types/utils/locale.utils.d.ts +6 -3
  210. package/dist/types/utils/test.utils.d.ts +13 -1
  211. package/package.json +13 -9
  212. package/readme.md +3 -0
  213. package/dist/cjs/css-shim-a22512c4.js +0 -6
  214. package/dist/cjs/mg-badge_20.cjs.entry.js +0 -4661
  215. package/dist/esm/css-shim-7c240feb.js +0 -4
  216. package/dist/esm/mg-badge_20.entry.js +0 -4638
  217. package/dist/esm-es5/css-shim-7c240feb.js +0 -1
  218. package/dist/esm-es5/index-e3e84606.js +0 -1
  219. package/dist/esm-es5/mg-badge_20.entry.js +0 -2
  220. package/dist/mg-components/p-1cd24462.system.js +0 -1
  221. package/dist/mg-components/p-2e2f6b27.system.entry.js +0 -2
  222. package/dist/mg-components/p-422c429b.system.js +0 -1
  223. package/dist/mg-components/p-62fa3797.js +0 -1
  224. package/dist/mg-components/p-9a215712.system.js +0 -1
  225. package/dist/mg-components/p-cbf0464b.entry.js +0 -1
@@ -0,0 +1,269 @@
1
+ import { Component, Element, Event, h, Method, Prop, State } from '@stencil/core';
2
+ import { createID, ClassList } from '../../../utils/components.utils';
3
+ import { messages } from '../../../locales';
4
+ export class MgForm {
5
+ constructor() {
6
+ /**
7
+ * Identifier is used for the element ID (id is a reserved prop in Stencil.js)
8
+ * If not set, it will be created.
9
+ */
10
+ this.identifier = createID('mg-form');
11
+ /**
12
+ * Input name
13
+ * If not set the value equals the identifier
14
+ */
15
+ this.name = this.identifier;
16
+ /**
17
+ * Define if form is readonly
18
+ */
19
+ this.readonly = false;
20
+ /**
21
+ * Define if form is disabled
22
+ */
23
+ this.disabled = false;
24
+ /**
25
+ * Component classes
26
+ */
27
+ this.classList = new ClassList(['mg-form']);
28
+ /**
29
+ * Define required message based on mg-inputs required elements
30
+ * Also
31
+ *
32
+ * @returns {void}
33
+ */
34
+ this.setRequiredMessage = () => {
35
+ // Get required fields
36
+ const requiredInputs = this.mgInputs.filter(input => input.required && !input.disabled && !this.disabled);
37
+ // All fields are required
38
+ // mg-input-toggle can not be required
39
+ if (requiredInputs.length > 0 && requiredInputs.length === this.mgInputs.filter(input => input.nodeName !== 'MG-INPUT-TOGGLE').length) {
40
+ this.requiredMessage = messages.form.allRequired;
41
+ this.classList.add('mg-form--all-required');
42
+ }
43
+ // Some fields are required
44
+ else if (requiredInputs.length > 0) {
45
+ this.requiredMessage = messages.form.required;
46
+ }
47
+ };
48
+ /**
49
+ * Check if form is valid
50
+ *
51
+ * @returns {void}
52
+ */
53
+ this.checkValidity = () => {
54
+ const validity = !this.mgInputs.some(input => input.invalid);
55
+ this.valid = validity;
56
+ this.invalid = !validity;
57
+ this.formValid.emit(validity);
58
+ };
59
+ }
60
+ /**
61
+ * Public method to display errors
62
+ *
63
+ * @returns {Promise<void>}
64
+ */
65
+ async displayError() {
66
+ if (!this.readonly) {
67
+ this.mgInputs.forEach(input => {
68
+ input.displayError && input.displayError();
69
+ });
70
+ this.checkValidity();
71
+ }
72
+ }
73
+ /*************
74
+ * Lifecycle *
75
+ *************/
76
+ /**
77
+ * Check if component props are well configured on init
78
+ *
79
+ * @returns {void}
80
+ */
81
+ componentWillLoad() {
82
+ // Get slotted mgIputs
83
+ this.mgInputs = Array.from(this.element.querySelectorAll('*')).filter((node) => node.nodeName.startsWith('MG-INPUT-'));
84
+ // Define required message
85
+ this.setRequiredMessage();
86
+ // Check validity when slotted mgImputs are ready
87
+ Promise.all(this.mgInputs.map(async (input) => {
88
+ // Set inputs readonly or disabled based on form configuration
89
+ // Othewise listen to events
90
+ if (this.readonly)
91
+ input.readonly = true;
92
+ else if (this.disabled)
93
+ input.disabled = true;
94
+ else
95
+ input.addEventListener('input-valid', this.checkValidity);
96
+ await input.componentOnReady();
97
+ })).then(() => {
98
+ this.checkValidity();
99
+ });
100
+ }
101
+ /**
102
+ * Render
103
+ *
104
+ * @returns {HTMLElement} HTML Element
105
+ */
106
+ render() {
107
+ return (h("form", { class: this.classList.join(), id: this.identifier, name: this.name },
108
+ this.requiredMessage && h("p", { innerHTML: this.requiredMessage }),
109
+ h("slot", null),
110
+ !this.readonly && !this.disabled && h("slot", { name: "actions" })));
111
+ }
112
+ static get is() { return "mg-form"; }
113
+ static get encapsulation() { return "shadow"; }
114
+ static get originalStyleUrls() { return {
115
+ "$": ["mg-form.scss"]
116
+ }; }
117
+ static get styleUrls() { return {
118
+ "$": ["mg-form.css"]
119
+ }; }
120
+ static get properties() { return {
121
+ "identifier": {
122
+ "type": "string",
123
+ "mutable": false,
124
+ "complexType": {
125
+ "original": "string",
126
+ "resolved": "string",
127
+ "references": {}
128
+ },
129
+ "required": false,
130
+ "optional": false,
131
+ "docs": {
132
+ "tags": [],
133
+ "text": "Identifier is used for the element ID (id is a reserved prop in Stencil.js)\nIf not set, it will be created."
134
+ },
135
+ "attribute": "identifier",
136
+ "reflect": false,
137
+ "defaultValue": "createID('mg-form')"
138
+ },
139
+ "name": {
140
+ "type": "string",
141
+ "mutable": false,
142
+ "complexType": {
143
+ "original": "string",
144
+ "resolved": "string",
145
+ "references": {}
146
+ },
147
+ "required": false,
148
+ "optional": false,
149
+ "docs": {
150
+ "tags": [],
151
+ "text": "Input name\nIf not set the value equals the identifier"
152
+ },
153
+ "attribute": "name",
154
+ "reflect": false,
155
+ "defaultValue": "this.identifier"
156
+ },
157
+ "readonly": {
158
+ "type": "boolean",
159
+ "mutable": false,
160
+ "complexType": {
161
+ "original": "boolean",
162
+ "resolved": "boolean",
163
+ "references": {}
164
+ },
165
+ "required": false,
166
+ "optional": false,
167
+ "docs": {
168
+ "tags": [],
169
+ "text": "Define if form is readonly"
170
+ },
171
+ "attribute": "readonly",
172
+ "reflect": false,
173
+ "defaultValue": "false"
174
+ },
175
+ "disabled": {
176
+ "type": "boolean",
177
+ "mutable": false,
178
+ "complexType": {
179
+ "original": "boolean",
180
+ "resolved": "boolean",
181
+ "references": {}
182
+ },
183
+ "required": false,
184
+ "optional": false,
185
+ "docs": {
186
+ "tags": [],
187
+ "text": "Define if form is disabled"
188
+ },
189
+ "attribute": "disabled",
190
+ "reflect": false,
191
+ "defaultValue": "false"
192
+ },
193
+ "valid": {
194
+ "type": "boolean",
195
+ "mutable": true,
196
+ "complexType": {
197
+ "original": "boolean",
198
+ "resolved": "boolean",
199
+ "references": {}
200
+ },
201
+ "required": false,
202
+ "optional": false,
203
+ "docs": {
204
+ "tags": [],
205
+ "text": "Define form valid state"
206
+ },
207
+ "attribute": "valid",
208
+ "reflect": false
209
+ },
210
+ "invalid": {
211
+ "type": "boolean",
212
+ "mutable": true,
213
+ "complexType": {
214
+ "original": "boolean",
215
+ "resolved": "boolean",
216
+ "references": {}
217
+ },
218
+ "required": false,
219
+ "optional": false,
220
+ "docs": {
221
+ "tags": [],
222
+ "text": "Define form invalid state"
223
+ },
224
+ "attribute": "invalid",
225
+ "reflect": false
226
+ }
227
+ }; }
228
+ static get states() { return {
229
+ "classList": {}
230
+ }; }
231
+ static get events() { return [{
232
+ "method": "formValid",
233
+ "name": "form-valid",
234
+ "bubbles": true,
235
+ "cancelable": true,
236
+ "composed": true,
237
+ "docs": {
238
+ "tags": [],
239
+ "text": "Emitted event on form validity check\nTells if form is valid or not"
240
+ },
241
+ "complexType": {
242
+ "original": "boolean",
243
+ "resolved": "boolean",
244
+ "references": {}
245
+ }
246
+ }]; }
247
+ static get methods() { return {
248
+ "displayError": {
249
+ "complexType": {
250
+ "signature": "() => Promise<void>",
251
+ "parameters": [],
252
+ "references": {
253
+ "Promise": {
254
+ "location": "global"
255
+ }
256
+ },
257
+ "return": "Promise<void>"
258
+ },
259
+ "docs": {
260
+ "text": "Public method to display errors",
261
+ "tags": [{
262
+ "name": "returns",
263
+ "text": undefined
264
+ }]
265
+ }
266
+ }
267
+ }; }
268
+ static get elementRef() { return "element"; }
269
+ }
@@ -0,0 +1,58 @@
1
+ import { h } from '@stencil/core';
2
+ export default {
3
+ component: 'mg-form',
4
+ title: 'Molecules/mg-form',
5
+ parameters: { actions: { handles: ['form-valid'] } },
6
+ };
7
+ const args = {
8
+ identifier: 'identifier',
9
+ name: 'input-name',
10
+ readonly: false,
11
+ disabled: false,
12
+ };
13
+ /**
14
+ * 1. camelCase arguments must be written in the template, for exemple labelOnTop must be placed in the template as label-on-top={args.labelOnTop}
15
+ * 2. boolean arguments with a default true value must be added like display-character-left={args.displayCharacterLeft ? 'true' : 'false'}
16
+ *
17
+ * @param {any} args component arguments
18
+ * @returns {HTMLElement} HTMLElement
19
+ */
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const Template = (args) => {
22
+ let form;
23
+ let submit;
24
+ return (h("mg-form", Object.assign({}, args, { ref: el => {
25
+ form = el;
26
+ form.addEventListener('form-valid', e => {
27
+ submit.disabled = !e.detail;
28
+ });
29
+ } }),
30
+ h("mg-input-checkbox", { identifier: "mg-input-checkbox", label: "mg-input-checkbox label", value: [
31
+ { title: 'oui', value: false },
32
+ { title: 'non', value: false },
33
+ ] }),
34
+ h("mg-input-date", { required: true, identifier: "mg-input-date", label: "mg-input-date label" }),
35
+ h("mg-input-numeric", { identifier: "mg-input-numeric", label: "mg-input-numeric label" }),
36
+ h("mg-input-password", { identifier: "mg-input-password", label: "mg-input-password label" }),
37
+ h("mg-input-radio", { identifier: "mg-input-radio", label: "mg-input-radio label", items: ['blu', 'bli', 'bla', 'blo'] }),
38
+ h("mg-input-select", { identifier: "mg-input-select", label: "mg-input-select label", items: ['blu', 'bli', 'bla', 'blo'] }),
39
+ h("mg-input-text", { identifier: "mg-input-text", label: "mg-input-text label" }),
40
+ h("mg-input-textarea", { identifier: "mg-input-textarea", label: "mg-input-textarea label" }),
41
+ h("mg-input-toggle", { identifier: "mg-input-toggle", label: "mg-input-toggle label", items: [
42
+ { title: 'non', value: false },
43
+ { title: 'oui', value: true },
44
+ ] },
45
+ h("span", { slot: "item-1" }, "non"),
46
+ h("span", { slot: "item-2" }, "oui")),
47
+ h("div", { slot: "actions", class: "mg-group-elements mg-group-elements--align-right" },
48
+ h("mg-button", { id: "can-submit", disabled: true, ref: e => {
49
+ submit = e;
50
+ } }, "Submit"),
51
+ h("mg-button", { variant: "secondary",
52
+ // eslint-disable-next-line react/jsx-no-bind
53
+ onClick: () => {
54
+ form.displayError();
55
+ } }, "Display errors"))));
56
+ };
57
+ export const MgForm = Template.bind({});
58
+ MgForm.args = Object.assign({}, args);
@@ -6,7 +6,7 @@
6
6
  overflow: hidden;
7
7
  background-color: white;
8
8
  border-radius: var(--mg-message-border-radius);
9
- box-shadow: 0 0.3rem 0.8rem 0 hsla(var(--color-dark), 0.1);
9
+ box-shadow: var(--box-shadow);
10
10
  }
11
11
  .mg-message::before {
12
12
  content: "";
@@ -18,7 +18,7 @@ export class MgMessage {
18
18
  /**
19
19
  * Message variant
20
20
  */
21
- this.variant = variants[0];
21
+ this.variant = variants[0]; // info
22
22
  /**
23
23
  * Define if message has a cross button
24
24
  * RG 01: https://jira.mgdis.fr/browse/PDA9-140
@@ -55,6 +55,8 @@ export class MgMessage {
55
55
  };
56
56
  /**
57
57
  * Get icon corresponding to variant
58
+ *
59
+ * @returns {string} icon
58
60
  */
59
61
  this.getIcon = () => {
60
62
  switch (this.variant) {
@@ -120,6 +122,11 @@ export class MgMessage {
120
122
  this.validateDelay(this.delay);
121
123
  this.validateHide(this.hide);
122
124
  }
125
+ /**
126
+ * Render
127
+ *
128
+ * @returns {HTMLElement} HTML Element
129
+ */
123
130
  render() {
124
131
  return (h("div", { id: this.identifier, class: this.classList.join(), role: this.variant === 'info' ? 'status' : 'alert' },
125
132
  h("span", { class: "mg-message__icon" },
@@ -198,7 +205,7 @@ export class MgMessage {
198
205
  },
199
206
  "closeButton": {
200
207
  "type": "boolean",
201
- "mutable": false,
208
+ "mutable": true,
202
209
  "complexType": {
203
210
  "original": "boolean",
204
211
  "resolved": "boolean",
@@ -245,7 +252,7 @@ export class MgMessage {
245
252
  "composed": true,
246
253
  "docs": {
247
254
  "tags": [],
248
- "text": "Emmited event when message is diplayed"
255
+ "text": "Emited event when message is diplayed"
249
256
  },
250
257
  "complexType": {
251
258
  "original": "string",
@@ -260,7 +267,7 @@ export class MgMessage {
260
267
  "composed": true,
261
268
  "docs": {
262
269
  "tags": [],
263
- "text": "Emmited event when message is hidden"
270
+ "text": "Emited event when message is hidden"
264
271
  },
265
272
  "complexType": {
266
273
  "original": "string",
@@ -7,8 +7,12 @@ export default {
7
7
  variant: {
8
8
  options: variants,
9
9
  control: { type: 'select' },
10
+ table: {
11
+ defaultValue: { summary: variants[0] },
12
+ },
10
13
  },
11
14
  },
15
+ parameters: { actions: { handles: ['component-show', 'component-hide'] } },
12
16
  };
13
17
  /**
14
18
  * 1. camelCase arguments must be written in the template, for exemple labelOnTop must be placed in the template as label-on-top={args.labelOnTop}
@@ -40,4 +44,4 @@ MgMessage.args = {
40
44
  export const WithCloseButton = Template.bind({});
41
45
  WithCloseButton.args = Object.assign(Object.assign({}, MgMessage.args), { variant: 'danger', closeButton: true });
42
46
  export const WithActions = Template.bind({});
43
- WithActions.args = Object.assign(Object.assign({}, MgMessage.args), { variant: 'warning', slotActions: `<div slot="actions" class="mg-group-elements mg-group-elements--align-right"><mg-button>Primary</mg-button><mg-button variant="secondary">Secondary</mg-button></div>` });
47
+ WithActions.args = Object.assign(Object.assign({}, MgMessage.args), { variant: 'warning', slotActions: `<div class="mg-group-elements mg-group-elements--align-right"><mg-button>Primary</mg-button><mg-button variant="secondary">Secondary</mg-button></div>` });
@@ -0,0 +1,54 @@
1
+ .mg-modal {
2
+ display: flex;
3
+ justify-content: center;
4
+ align-items: center;
5
+ position: fixed;
6
+ top: 0;
7
+ right: 0;
8
+ bottom: 0;
9
+ left: 0;
10
+ z-index: 1000;
11
+ padding: 2rem 0;
12
+ background-color: hsla(var(--color-dark), 50%);
13
+ }
14
+ .mg-modal__dialog {
15
+ display: flex;
16
+ flex-direction: column;
17
+ flex: none;
18
+ /* IE FIX */
19
+ align-self: center;
20
+ row-gap: 3rem;
21
+ padding: 1.5rem 2.5rem;
22
+ width: 60rem;
23
+ height: fit-content;
24
+ max-width: 100%;
25
+ max-height: 100%;
26
+ box-sizing: border-box;
27
+ background-color: hsl(var(--color-light));
28
+ box-shadow: var(--box-shadow);
29
+ border-radius: var(--mg-modal-border-radius);
30
+ }
31
+ .mg-modal__header {
32
+ margin-bottom: 0.5rem;
33
+ }
34
+ .mg-modal__title {
35
+ margin: 0;
36
+ font-family: var(--font-family-heading);
37
+ font-size: var(--mg-modal-title-font-size);
38
+ font-weight: 600;
39
+ }
40
+ .mg-modal__content {
41
+ overflow-y: auto;
42
+ }
43
+ .mg-modal__close-button {
44
+ float: right;
45
+ height: var(--mg-modal-title-font-size);
46
+ margin-top: calc((var(--default-size) - var(--mg-modal-title-font-size) * var(--line-height)) / 2 * -1);
47
+ margin-right: calc((var(--default-size) - var(--mg-icon-regular-size)) / 2 * -1);
48
+ }
49
+ .mg-modal .mg-modal__content ::slotted(*) {
50
+ font-size: var(--mg-modal-content-font-size);
51
+ }
52
+ .mg-modal.mg-modal--hide {
53
+ display: none;
54
+ }
@@ -0,0 +1,233 @@
1
+ import { Component, h, Prop, State, Watch, Element, Event, Listen } from '@stencil/core';
2
+ import { createID, ClassList } from '../../../utils/components.utils';
3
+ import { messages } from '../../../locales';
4
+ export class MgModal {
5
+ constructor() {
6
+ /************
7
+ * Internal *
8
+ ************/
9
+ this.closeButtonId = '';
10
+ this.titleId = '';
11
+ /**
12
+ * Identifier is used for the element ID (id is a reserved prop in Stencil.js)
13
+ * If not set, it will be created.
14
+ */
15
+ this.identifier = createID('mg-modal');
16
+ /**
17
+ * Define if modal has a cross button
18
+ */
19
+ this.closeButton = false;
20
+ /**
21
+ * Define if modal is hidden
22
+ */
23
+ this.hide = false;
24
+ /**
25
+ * Define if component is using actions slot
26
+ */
27
+ this.hasActions = false;
28
+ /**
29
+ * Define if component is using content slot
30
+ */
31
+ this.hasContent = false;
32
+ /**
33
+ * Component classes
34
+ */
35
+ this.classList = new ClassList(['mg-modal']);
36
+ /*************
37
+ * Handlers *
38
+ *************/
39
+ /**
40
+ * Handle close button
41
+ *
42
+ * @returns {void}
43
+ */
44
+ this.handleClose = () => {
45
+ this.hide = true;
46
+ };
47
+ }
48
+ validateHide(newValue) {
49
+ if (newValue) {
50
+ this.componentHide.emit();
51
+ this.classList.add('mg-modal--hide');
52
+ }
53
+ else {
54
+ this.componentShow.emit();
55
+ this.classList.delete('mg-modal--hide');
56
+ }
57
+ }
58
+ /**
59
+ * Handle 'escape' key down
60
+ *
61
+ * @param {KeyboardEvent} event keydown event
62
+ * @returns {void}
63
+ */
64
+ handleKeyDown(event) {
65
+ // we can use 'Escape button" when this not a blocking modal, induced by closeButton value.
66
+ if (this.closeButton && event.key === 'Escape') {
67
+ this.hide = true;
68
+ }
69
+ }
70
+ /*************
71
+ * Lifecycle *
72
+ *************/
73
+ /**
74
+ * Check if component props are well configured on init
75
+ *
76
+ * @returns {void}
77
+ */
78
+ componentWillLoad() {
79
+ this.hasActions = this.element.querySelector('[slot="actions"]') !== null;
80
+ this.hasContent = this.element.querySelector('[slot="content"]') !== null;
81
+ if (this.closeButton) {
82
+ this.closeButtonId = `${this.identifier}-close-button`;
83
+ }
84
+ this.titleId = `${this.identifier}-title`;
85
+ this.validateHide(this.hide);
86
+ }
87
+ /**
88
+ * Render
89
+ *
90
+ * @returns {HTMLElement} HTML Element
91
+ */
92
+ render() {
93
+ return (h("section", { role: "dialog", id: this.identifier, class: this.classList.join(), tabindex: "-1", "aria-labelledby": this.titleId, "aria-modal": "true", "aria-hidden": this.hide },
94
+ h("article", { class: "mg-modal__dialog" },
95
+ h("header", { class: "mg-modal__header" },
96
+ this.closeButton && (h("mg-button", { identifier: this.closeButtonId, "is-icon": true, variant: "flat", label: messages.modal.closeButton, onClick: this.handleClose, class: "mg-modal__close-button" },
97
+ h("mg-icon", { icon: "cross" }))),
98
+ h("h1", { class: "mg-modal__title", id: this.titleId }, this.modalTitle)),
99
+ this.hasContent && (h("article", { class: "mg-modal__content" },
100
+ h("slot", { name: "content" }))),
101
+ this.hasActions && (h("footer", { class: "mg-modal__footer" },
102
+ h("slot", { name: "actions" }))))));
103
+ }
104
+ static get is() { return "mg-modal"; }
105
+ static get encapsulation() { return "shadow"; }
106
+ static get originalStyleUrls() { return {
107
+ "$": ["mg-modal.scss"]
108
+ }; }
109
+ static get styleUrls() { return {
110
+ "$": ["mg-modal.css"]
111
+ }; }
112
+ static get properties() { return {
113
+ "identifier": {
114
+ "type": "string",
115
+ "mutable": false,
116
+ "complexType": {
117
+ "original": "string",
118
+ "resolved": "string",
119
+ "references": {}
120
+ },
121
+ "required": false,
122
+ "optional": false,
123
+ "docs": {
124
+ "tags": [],
125
+ "text": "Identifier is used for the element ID (id is a reserved prop in Stencil.js)\nIf not set, it will be created."
126
+ },
127
+ "attribute": "identifier",
128
+ "reflect": false,
129
+ "defaultValue": "createID('mg-modal')"
130
+ },
131
+ "modalTitle": {
132
+ "type": "string",
133
+ "mutable": false,
134
+ "complexType": {
135
+ "original": "string",
136
+ "resolved": "string",
137
+ "references": {}
138
+ },
139
+ "required": true,
140
+ "optional": false,
141
+ "docs": {
142
+ "tags": [],
143
+ "text": "Displayed modal title\nrequired"
144
+ },
145
+ "attribute": "modal-title",
146
+ "reflect": false
147
+ },
148
+ "closeButton": {
149
+ "type": "boolean",
150
+ "mutable": true,
151
+ "complexType": {
152
+ "original": "boolean",
153
+ "resolved": "boolean",
154
+ "references": {}
155
+ },
156
+ "required": false,
157
+ "optional": false,
158
+ "docs": {
159
+ "tags": [],
160
+ "text": "Define if modal has a cross button"
161
+ },
162
+ "attribute": "close-button",
163
+ "reflect": false,
164
+ "defaultValue": "false"
165
+ },
166
+ "hide": {
167
+ "type": "boolean",
168
+ "mutable": true,
169
+ "complexType": {
170
+ "original": "boolean",
171
+ "resolved": "boolean",
172
+ "references": {}
173
+ },
174
+ "required": false,
175
+ "optional": false,
176
+ "docs": {
177
+ "tags": [],
178
+ "text": "Define if modal is hidden"
179
+ },
180
+ "attribute": "hide",
181
+ "reflect": false,
182
+ "defaultValue": "false"
183
+ }
184
+ }; }
185
+ static get states() { return {
186
+ "hasActions": {},
187
+ "hasContent": {},
188
+ "classList": {}
189
+ }; }
190
+ static get events() { return [{
191
+ "method": "componentShow",
192
+ "name": "component-show",
193
+ "bubbles": true,
194
+ "cancelable": true,
195
+ "composed": true,
196
+ "docs": {
197
+ "tags": [],
198
+ "text": "Emmited event when modal is diplayed"
199
+ },
200
+ "complexType": {
201
+ "original": "string",
202
+ "resolved": "string",
203
+ "references": {}
204
+ }
205
+ }, {
206
+ "method": "componentHide",
207
+ "name": "component-hide",
208
+ "bubbles": true,
209
+ "cancelable": true,
210
+ "composed": true,
211
+ "docs": {
212
+ "tags": [],
213
+ "text": "Emmited event when modal is hidden"
214
+ },
215
+ "complexType": {
216
+ "original": "string",
217
+ "resolved": "string",
218
+ "references": {}
219
+ }
220
+ }]; }
221
+ static get elementRef() { return "element"; }
222
+ static get watchers() { return [{
223
+ "propName": "hide",
224
+ "methodName": "validateHide"
225
+ }]; }
226
+ static get listeners() { return [{
227
+ "name": "keydown",
228
+ "method": "handleKeyDown",
229
+ "target": "window",
230
+ "capture": false,
231
+ "passive": false
232
+ }]; }
233
+ }