@mmlogic/components 0.1.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 (159) hide show
  1. package/README.md +221 -0
  2. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  3. package/dist/cjs/format-CDw-zie_.js +82 -0
  4. package/dist/cjs/index-OvnIRO4Y.js +1523 -0
  5. package/dist/cjs/index.cjs.js +32 -0
  6. package/dist/cjs/loader.cjs.js +13 -0
  7. package/dist/cjs/mosterdcomponents.cjs.js +25 -0
  8. package/dist/cjs/mrd-boolean-field_16.cjs.entry.js +1185 -0
  9. package/dist/cjs/mrd-table.cjs.entry.js +322 -0
  10. package/dist/cjs/quill-DmFfnC1f.js +16272 -0
  11. package/dist/collection/collection-manifest.json +29 -0
  12. package/dist/collection/components/mrd-boolean-field/mrd-boolean-field.js +199 -0
  13. package/dist/collection/components/mrd-boolean-field/mrd-boolean-field.scss +77 -0
  14. package/dist/collection/components/mrd-currency-field/mrd-currency-field.js +248 -0
  15. package/dist/collection/components/mrd-currency-field/mrd-currency-field.scss +100 -0
  16. package/dist/collection/components/mrd-date-field/mrd-date-field.js +206 -0
  17. package/dist/collection/components/mrd-date-field/mrd-date-field.scss +66 -0
  18. package/dist/collection/components/mrd-datetime-field/mrd-datetime-field.js +206 -0
  19. package/dist/collection/components/mrd-datetime-field/mrd-datetime-field.scss +66 -0
  20. package/dist/collection/components/mrd-email-field/mrd-email-field.js +230 -0
  21. package/dist/collection/components/mrd-email-field/mrd-email-field.scss +69 -0
  22. package/dist/collection/components/mrd-field/mrd-field.js +187 -0
  23. package/dist/collection/components/mrd-file-field/mrd-file-field.js +273 -0
  24. package/dist/collection/components/mrd-file-field/mrd-file-field.scss +140 -0
  25. package/dist/collection/components/mrd-form/mrd-form.js +245 -0
  26. package/dist/collection/components/mrd-form/mrd-form.scss +116 -0
  27. package/dist/collection/components/mrd-hyperlink-field/mrd-hyperlink-field.js +230 -0
  28. package/dist/collection/components/mrd-hyperlink-field/mrd-hyperlink-field.scss +69 -0
  29. package/dist/collection/components/mrd-image-field/mrd-image-field.js +287 -0
  30. package/dist/collection/components/mrd-image-field/mrd-image-field.scss +166 -0
  31. package/dist/collection/components/mrd-list-field/mrd-list-field.js +311 -0
  32. package/dist/collection/components/mrd-list-field/mrd-list-field.scss +109 -0
  33. package/dist/collection/components/mrd-number-field/mrd-number-field.js +316 -0
  34. package/dist/collection/components/mrd-number-field/mrd-number-field.scss +77 -0
  35. package/dist/collection/components/mrd-relation-field/mrd-relation-field.js +490 -0
  36. package/dist/collection/components/mrd-relation-field/mrd-relation-field.scss +266 -0
  37. package/dist/collection/components/mrd-table/mrd-table.js +522 -0
  38. package/dist/collection/components/mrd-table/mrd-table.scss +158 -0
  39. package/dist/collection/components/mrd-text-field/mrd-text-field.js +227 -0
  40. package/dist/collection/components/mrd-text-field/mrd-text-field.scss +69 -0
  41. package/dist/collection/components/mrd-textarea-field/mrd-textarea-field.js +267 -0
  42. package/dist/collection/components/mrd-textarea-field/mrd-textarea-field.scss +79 -0
  43. package/dist/collection/components/mrd-time-field/mrd-time-field.js +206 -0
  44. package/dist/collection/components/mrd-time-field/mrd-time-field.scss +66 -0
  45. package/dist/collection/index.js +1 -0
  46. package/dist/collection/types/client-layout.js +30 -0
  47. package/dist/collection/types/index.js +1 -0
  48. package/dist/collection/utils/cell-renderer.js +57 -0
  49. package/dist/collection/utils/format.js +72 -0
  50. package/dist/collection/utils/i18n.js +80 -0
  51. package/dist/collection/utils/validation.js +46 -0
  52. package/dist/components/client-layout.js +1 -0
  53. package/dist/components/format.js +1 -0
  54. package/dist/components/i18n.js +1 -0
  55. package/dist/components/index.d.ts +35 -0
  56. package/dist/components/index.js +1 -0
  57. package/dist/components/mrd-boolean-field.d.ts +11 -0
  58. package/dist/components/mrd-boolean-field.js +1 -0
  59. package/dist/components/mrd-boolean-field2.js +1 -0
  60. package/dist/components/mrd-currency-field.d.ts +11 -0
  61. package/dist/components/mrd-currency-field.js +1 -0
  62. package/dist/components/mrd-currency-field2.js +1 -0
  63. package/dist/components/mrd-date-field.d.ts +11 -0
  64. package/dist/components/mrd-date-field.js +1 -0
  65. package/dist/components/mrd-date-field2.js +1 -0
  66. package/dist/components/mrd-datetime-field.d.ts +11 -0
  67. package/dist/components/mrd-datetime-field.js +1 -0
  68. package/dist/components/mrd-datetime-field2.js +1 -0
  69. package/dist/components/mrd-email-field.d.ts +11 -0
  70. package/dist/components/mrd-email-field.js +1 -0
  71. package/dist/components/mrd-email-field2.js +1 -0
  72. package/dist/components/mrd-field.d.ts +11 -0
  73. package/dist/components/mrd-field.js +1 -0
  74. package/dist/components/mrd-field2.js +1 -0
  75. package/dist/components/mrd-file-field.d.ts +11 -0
  76. package/dist/components/mrd-file-field.js +1 -0
  77. package/dist/components/mrd-file-field2.js +1 -0
  78. package/dist/components/mrd-form.d.ts +11 -0
  79. package/dist/components/mrd-form.js +1 -0
  80. package/dist/components/mrd-hyperlink-field.d.ts +11 -0
  81. package/dist/components/mrd-hyperlink-field.js +1 -0
  82. package/dist/components/mrd-hyperlink-field2.js +1 -0
  83. package/dist/components/mrd-image-field.d.ts +11 -0
  84. package/dist/components/mrd-image-field.js +1 -0
  85. package/dist/components/mrd-image-field2.js +1 -0
  86. package/dist/components/mrd-list-field.d.ts +11 -0
  87. package/dist/components/mrd-list-field.js +1 -0
  88. package/dist/components/mrd-list-field2.js +1 -0
  89. package/dist/components/mrd-number-field.d.ts +11 -0
  90. package/dist/components/mrd-number-field.js +1 -0
  91. package/dist/components/mrd-number-field2.js +1 -0
  92. package/dist/components/mrd-relation-field.d.ts +11 -0
  93. package/dist/components/mrd-relation-field.js +1 -0
  94. package/dist/components/mrd-relation-field2.js +1 -0
  95. package/dist/components/mrd-table.d.ts +11 -0
  96. package/dist/components/mrd-table.js +1 -0
  97. package/dist/components/mrd-text-field.d.ts +11 -0
  98. package/dist/components/mrd-text-field.js +1 -0
  99. package/dist/components/mrd-text-field2.js +1 -0
  100. package/dist/components/mrd-textarea-field.d.ts +11 -0
  101. package/dist/components/mrd-textarea-field.js +1 -0
  102. package/dist/components/mrd-textarea-field2.js +1 -0
  103. package/dist/components/mrd-time-field.d.ts +11 -0
  104. package/dist/components/mrd-time-field.js +1 -0
  105. package/dist/components/mrd-time-field2.js +1 -0
  106. package/dist/components/quill.js +1 -0
  107. package/dist/components/validation.js +1 -0
  108. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  109. package/dist/esm/format-Dt-aHxkM.js +74 -0
  110. package/dist/esm/index-DQ_he8te.js +1514 -0
  111. package/dist/esm/index.js +32 -0
  112. package/dist/esm/loader.js +11 -0
  113. package/dist/esm/mosterdcomponents.js +21 -0
  114. package/dist/esm/mrd-boolean-field_16.entry.js +1168 -0
  115. package/dist/esm/mrd-table.entry.js +320 -0
  116. package/dist/esm/quill-CiuCgGz_.js +16266 -0
  117. package/dist/index.cjs.js +1 -0
  118. package/dist/index.js +1 -0
  119. package/dist/mosterdcomponents/index.esm.js +1 -0
  120. package/dist/mosterdcomponents/mosterdcomponents.css +1 -0
  121. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -0
  122. package/dist/mosterdcomponents/p-88cd0930.entry.js +1 -0
  123. package/dist/mosterdcomponents/p-926ed331.entry.js +1 -0
  124. package/dist/mosterdcomponents/p-CiuCgGz_.js +1 -0
  125. package/dist/mosterdcomponents/p-DQ_he8te.js +2 -0
  126. package/dist/mosterdcomponents/p-DQuL1Twl.js +1 -0
  127. package/dist/mosterdcomponents/p-Dt-aHxkM.js +1 -0
  128. package/dist/types/components/mrd-boolean-field/mrd-boolean-field.d.ts +22 -0
  129. package/dist/types/components/mrd-currency-field/mrd-currency-field.d.ts +26 -0
  130. package/dist/types/components/mrd-date-field/mrd-date-field.d.ts +21 -0
  131. package/dist/types/components/mrd-datetime-field/mrd-datetime-field.d.ts +21 -0
  132. package/dist/types/components/mrd-email-field/mrd-email-field.d.ts +22 -0
  133. package/dist/types/components/mrd-field/mrd-field.d.ts +23 -0
  134. package/dist/types/components/mrd-file-field/mrd-file-field.d.ts +30 -0
  135. package/dist/types/components/mrd-form/mrd-form.d.ts +24 -0
  136. package/dist/types/components/mrd-hyperlink-field/mrd-hyperlink-field.d.ts +22 -0
  137. package/dist/types/components/mrd-image-field/mrd-image-field.d.ts +31 -0
  138. package/dist/types/components/mrd-list-field/mrd-list-field.d.ts +28 -0
  139. package/dist/types/components/mrd-number-field/mrd-number-field.d.ts +29 -0
  140. package/dist/types/components/mrd-relation-field/mrd-relation-field.d.ts +44 -0
  141. package/dist/types/components/mrd-table/mrd-table.d.ts +72 -0
  142. package/dist/types/components/mrd-text-field/mrd-text-field.d.ts +22 -0
  143. package/dist/types/components/mrd-textarea-field/mrd-textarea-field.d.ts +25 -0
  144. package/dist/types/components/mrd-time-field/mrd-time-field.d.ts +21 -0
  145. package/dist/types/components.d.ts +1609 -0
  146. package/dist/types/index.d.ts +1 -0
  147. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  148. package/dist/types/types/client-layout.d.ts +76 -0
  149. package/dist/types/types/index.d.ts +1 -0
  150. package/dist/types/utils/cell-renderer.d.ts +14 -0
  151. package/dist/types/utils/format.d.ts +7 -0
  152. package/dist/types/utils/i18n.d.ts +1 -0
  153. package/dist/types/utils/validation.d.ts +5 -0
  154. package/loader/cdn.js +1 -0
  155. package/loader/index.cjs.js +1 -0
  156. package/loader/index.d.ts +24 -0
  157. package/loader/index.es2017.js +1 -0
  158. package/loader/index.js +2 -0
  159. package/package.json +54 -0
@@ -0,0 +1,273 @@
1
+ import { Host, h } from "@stencil/core";
2
+ import { t } from "../../utils/i18n";
3
+ export class MrdFileField {
4
+ constructor() {
5
+ this.name = '';
6
+ this.label = '';
7
+ this.required = false;
8
+ this.disabled = false;
9
+ this.locale = navigator.language;
10
+ this.accept = '';
11
+ this.maxSize = 0; // bytes, 0 = no limit
12
+ this.fileName = '';
13
+ this.isDragging = false;
14
+ this.error = '';
15
+ this.handleInputChange = (e) => {
16
+ var _a;
17
+ const files = e.target.files;
18
+ this.handleFile((_a = files === null || files === void 0 ? void 0 : files[0]) !== null && _a !== void 0 ? _a : null);
19
+ };
20
+ this.handleDragOver = (e) => {
21
+ e.preventDefault();
22
+ this.isDragging = true;
23
+ };
24
+ this.handleDragLeave = () => {
25
+ this.isDragging = false;
26
+ };
27
+ this.handleDrop = (e) => {
28
+ var _a, _b, _c;
29
+ e.preventDefault();
30
+ this.isDragging = false;
31
+ const file = (_c = (_b = (_a = e.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : null;
32
+ this.handleFile(file);
33
+ };
34
+ this.handleZoneClick = () => {
35
+ var _a;
36
+ if (!this.disabled) {
37
+ (_a = this.fileInputRef) === null || _a === void 0 ? void 0 : _a.click();
38
+ }
39
+ };
40
+ this.handleClear = (e) => {
41
+ e.stopPropagation();
42
+ this.fileName = '';
43
+ this.error = '';
44
+ if (this.fileInputRef)
45
+ this.fileInputRef.value = '';
46
+ this.mrdChange.emit({ name: this.name, value: null });
47
+ };
48
+ }
49
+ handleFile(file) {
50
+ if (!file) {
51
+ this.fileName = '';
52
+ this.mrdChange.emit({ name: this.name, value: null });
53
+ return;
54
+ }
55
+ if (this.maxSize > 0 && file.size > this.maxSize) {
56
+ this.error = t('file_too_large', this.locale);
57
+ return;
58
+ }
59
+ this.error = '';
60
+ this.fileName = file.name;
61
+ this.mrdChange.emit({ name: this.name, value: file });
62
+ }
63
+ render() {
64
+ const hasError = !!this.error;
65
+ return (h(Host, { key: '6617c70edaf193c204a951ff8116d54742592f84' }, h("div", { key: '69a45446da411c1cfdadd9ee7051e3ceea95a2d2', class: "mrd-file-field" }, this.label && (h("label", { key: 'ca415565514c5a3829b1e4a446493916bd1b5b17', class: `mrd-file-field__label${this.required ? ' mrd-file-field__label--required' : ''}` }, this.label)), h("div", { key: 'abee0fc6a53c9f1266e6ed2d0ec8ab85a20a81ca', class: `mrd-file-field__zone${this.isDragging ? ' mrd-file-field__zone--dragging' : ''}${hasError ? ' mrd-file-field__zone--error' : ''}${this.disabled ? ' mrd-file-field__zone--disabled' : ''}`, onClick: this.handleZoneClick, onDragOver: this.handleDragOver, onDragLeave: this.handleDragLeave, onDrop: this.handleDrop }, h("input", { key: 'c1dbca750d4115b7d8ea3dcd9ed3405ed11c93a2', ref: el => (this.fileInputRef = el), class: "mrd-file-field__input", type: "file", name: this.name, accept: this.accept, disabled: this.disabled, required: this.required && !this.fileName, onChange: this.handleInputChange }), this.fileName ? (h("div", { class: "mrd-file-field__selected" }, h("svg", { class: "mrd-file-field__icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), h("polyline", { points: "14 2 14 8 20 8" })), h("span", { class: "mrd-file-field__filename" }, this.fileName), h("button", { class: "mrd-file-field__clear", type: "button", onClick: this.handleClear, "aria-label": t('clear', this.locale) }, "\u2715"))) : (h("div", { class: "mrd-file-field__prompt" }, h("svg", { class: "mrd-file-field__upload-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("polyline", { points: "16 16 12 12 8 16" }), h("line", { x1: "12", y1: "12", x2: "12", y2: "21" }), h("path", { d: "M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3" })), h("span", null, t('drop_file_here', this.locale), ' ', h("span", { class: "mrd-file-field__browse" }, t('browse', this.locale)))))), hasError && h("span", { key: '91ef6a6240f139e161288cb812d17e13a619ec89', class: "mrd-file-field__error" }, this.error))));
66
+ }
67
+ static get is() { return "mrd-file-field"; }
68
+ static get encapsulation() { return "scoped"; }
69
+ static get originalStyleUrls() {
70
+ return {
71
+ "$": ["mrd-file-field.scss"]
72
+ };
73
+ }
74
+ static get styleUrls() {
75
+ return {
76
+ "$": ["mrd-file-field.css"]
77
+ };
78
+ }
79
+ static get properties() {
80
+ return {
81
+ "name": {
82
+ "type": "string",
83
+ "mutable": false,
84
+ "complexType": {
85
+ "original": "string",
86
+ "resolved": "string",
87
+ "references": {}
88
+ },
89
+ "required": false,
90
+ "optional": false,
91
+ "docs": {
92
+ "tags": [],
93
+ "text": ""
94
+ },
95
+ "getter": false,
96
+ "setter": false,
97
+ "reflect": false,
98
+ "attribute": "name",
99
+ "defaultValue": "''"
100
+ },
101
+ "label": {
102
+ "type": "string",
103
+ "mutable": false,
104
+ "complexType": {
105
+ "original": "string",
106
+ "resolved": "string",
107
+ "references": {}
108
+ },
109
+ "required": false,
110
+ "optional": false,
111
+ "docs": {
112
+ "tags": [],
113
+ "text": ""
114
+ },
115
+ "getter": false,
116
+ "setter": false,
117
+ "reflect": false,
118
+ "attribute": "label",
119
+ "defaultValue": "''"
120
+ },
121
+ "required": {
122
+ "type": "boolean",
123
+ "mutable": false,
124
+ "complexType": {
125
+ "original": "boolean",
126
+ "resolved": "boolean",
127
+ "references": {}
128
+ },
129
+ "required": false,
130
+ "optional": false,
131
+ "docs": {
132
+ "tags": [],
133
+ "text": ""
134
+ },
135
+ "getter": false,
136
+ "setter": false,
137
+ "reflect": false,
138
+ "attribute": "required",
139
+ "defaultValue": "false"
140
+ },
141
+ "disabled": {
142
+ "type": "boolean",
143
+ "mutable": false,
144
+ "complexType": {
145
+ "original": "boolean",
146
+ "resolved": "boolean",
147
+ "references": {}
148
+ },
149
+ "required": false,
150
+ "optional": false,
151
+ "docs": {
152
+ "tags": [],
153
+ "text": ""
154
+ },
155
+ "getter": false,
156
+ "setter": false,
157
+ "reflect": false,
158
+ "attribute": "disabled",
159
+ "defaultValue": "false"
160
+ },
161
+ "locale": {
162
+ "type": "string",
163
+ "mutable": false,
164
+ "complexType": {
165
+ "original": "string",
166
+ "resolved": "string",
167
+ "references": {}
168
+ },
169
+ "required": false,
170
+ "optional": false,
171
+ "docs": {
172
+ "tags": [],
173
+ "text": ""
174
+ },
175
+ "getter": false,
176
+ "setter": false,
177
+ "reflect": false,
178
+ "attribute": "locale",
179
+ "defaultValue": "navigator.language"
180
+ },
181
+ "accept": {
182
+ "type": "string",
183
+ "mutable": false,
184
+ "complexType": {
185
+ "original": "string",
186
+ "resolved": "string",
187
+ "references": {}
188
+ },
189
+ "required": false,
190
+ "optional": false,
191
+ "docs": {
192
+ "tags": [],
193
+ "text": ""
194
+ },
195
+ "getter": false,
196
+ "setter": false,
197
+ "reflect": false,
198
+ "attribute": "accept",
199
+ "defaultValue": "''"
200
+ },
201
+ "maxSize": {
202
+ "type": "number",
203
+ "mutable": false,
204
+ "complexType": {
205
+ "original": "number",
206
+ "resolved": "number",
207
+ "references": {}
208
+ },
209
+ "required": false,
210
+ "optional": false,
211
+ "docs": {
212
+ "tags": [],
213
+ "text": ""
214
+ },
215
+ "getter": false,
216
+ "setter": false,
217
+ "reflect": false,
218
+ "attribute": "max-size",
219
+ "defaultValue": "0"
220
+ }
221
+ };
222
+ }
223
+ static get states() {
224
+ return {
225
+ "fileName": {},
226
+ "isDragging": {},
227
+ "error": {}
228
+ };
229
+ }
230
+ static get events() {
231
+ return [{
232
+ "method": "mrdChange",
233
+ "name": "mrdChange",
234
+ "bubbles": true,
235
+ "cancelable": true,
236
+ "composed": true,
237
+ "docs": {
238
+ "tags": [],
239
+ "text": ""
240
+ },
241
+ "complexType": {
242
+ "original": "{ name: string; value: File | null }",
243
+ "resolved": "{ name: string; value: File | null; }",
244
+ "references": {
245
+ "File": {
246
+ "location": "global",
247
+ "id": "global::File"
248
+ }
249
+ }
250
+ }
251
+ }, {
252
+ "method": "mrdBlur",
253
+ "name": "mrdBlur",
254
+ "bubbles": true,
255
+ "cancelable": true,
256
+ "composed": true,
257
+ "docs": {
258
+ "tags": [],
259
+ "text": ""
260
+ },
261
+ "complexType": {
262
+ "original": "{ name: string; value: File | null }",
263
+ "resolved": "{ name: string; value: File | null; }",
264
+ "references": {
265
+ "File": {
266
+ "location": "global",
267
+ "id": "global::File"
268
+ }
269
+ }
270
+ }
271
+ }];
272
+ }
273
+ }
@@ -0,0 +1,140 @@
1
+ :host {
2
+ display: block;
3
+ }
4
+
5
+ .mrd-file-field {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--mrd-space-1);
9
+ width: 100%;
10
+ }
11
+
12
+ .mrd-file-field__label {
13
+ display: block;
14
+ font-family: var(--mrd-font-family);
15
+ font-size: var(--mrd-label-font-size);
16
+ font-weight: var(--mrd-label-font-weight);
17
+ color: var(--mrd-label-color);
18
+ }
19
+
20
+ .mrd-file-field__label--required::after {
21
+ content: ' *';
22
+ color: var(--mrd-color-danger);
23
+ }
24
+
25
+ .mrd-file-field__zone {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ padding: var(--mrd-space-6);
30
+ border: 2px dashed var(--mrd-border-color);
31
+ border-radius: var(--mrd-border-radius-md);
32
+ background-color: var(--mrd-color-neutral-50);
33
+ cursor: pointer;
34
+ transition: border-color var(--mrd-transition), background-color var(--mrd-transition);
35
+ min-height: 100px;
36
+ position: relative;
37
+ }
38
+
39
+ .mrd-file-field__zone:hover {
40
+ border-color: var(--mrd-color-primary);
41
+ background-color: var(--mrd-color-primary-light);
42
+ }
43
+
44
+ .mrd-file-field__zone--dragging {
45
+ border-color: var(--mrd-color-primary);
46
+ background-color: var(--mrd-color-primary-light);
47
+ }
48
+
49
+ .mrd-file-field__zone--error {
50
+ border-color: var(--mrd-border-color-error);
51
+ }
52
+
53
+ .mrd-file-field__zone--disabled {
54
+ opacity: 0.6;
55
+ cursor: not-allowed;
56
+ }
57
+
58
+ .mrd-file-field__zone--disabled:hover {
59
+ border-color: var(--mrd-border-color);
60
+ background-color: var(--mrd-color-neutral-50);
61
+ }
62
+
63
+ .mrd-file-field__input {
64
+ position: absolute;
65
+ inset: 0;
66
+ opacity: 0;
67
+ width: 100%;
68
+ height: 100%;
69
+ cursor: pointer;
70
+ pointer-events: none;
71
+ }
72
+
73
+ .mrd-file-field__prompt {
74
+ display: flex;
75
+ flex-direction: column;
76
+ align-items: center;
77
+ gap: var(--mrd-space-2);
78
+ font-family: var(--mrd-font-family);
79
+ font-size: var(--mrd-font-size-sm);
80
+ color: var(--mrd-color-neutral-500);
81
+ text-align: center;
82
+ }
83
+
84
+ .mrd-file-field__upload-icon {
85
+ width: 32px;
86
+ height: 32px;
87
+ color: var(--mrd-color-neutral-400);
88
+ }
89
+
90
+ .mrd-file-field__browse {
91
+ color: var(--mrd-color-primary);
92
+ font-weight: var(--mrd-font-weight-medium);
93
+ text-decoration: underline;
94
+ }
95
+
96
+ .mrd-file-field__selected {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: var(--mrd-space-2);
100
+ font-family: var(--mrd-font-family);
101
+ font-size: var(--mrd-font-size-sm);
102
+ color: var(--mrd-color-neutral-700);
103
+ }
104
+
105
+ .mrd-file-field__icon {
106
+ width: 20px;
107
+ height: 20px;
108
+ color: var(--mrd-color-primary);
109
+ flex-shrink: 0;
110
+ }
111
+
112
+ .mrd-file-field__filename {
113
+ flex: 1;
114
+ overflow: hidden;
115
+ text-overflow: ellipsis;
116
+ white-space: nowrap;
117
+ max-width: 200px;
118
+ }
119
+
120
+ .mrd-file-field__clear {
121
+ background: none;
122
+ border: none;
123
+ cursor: pointer;
124
+ color: var(--mrd-color-neutral-400);
125
+ font-size: var(--mrd-font-size-sm);
126
+ padding: var(--mrd-space-1);
127
+ border-radius: var(--mrd-border-radius-sm);
128
+ line-height: 1;
129
+ }
130
+
131
+ .mrd-file-field__clear:hover {
132
+ color: var(--mrd-color-danger);
133
+ background-color: var(--mrd-color-danger-light);
134
+ }
135
+
136
+ .mrd-file-field__error {
137
+ font-family: var(--mrd-font-family);
138
+ font-size: var(--mrd-error-font-size);
139
+ color: var(--mrd-error-color);
140
+ }
@@ -0,0 +1,245 @@
1
+ import { Host, h } from "@stencil/core";
2
+ import { ClientLayoutItemType } from "../../types";
3
+ import { t } from "../../utils/i18n";
4
+ import { validateRequired } from "../../utils/validation";
5
+ export class MrdForm {
6
+ constructor() {
7
+ this.locale = navigator.language;
8
+ this.values = {};
9
+ this.formValues = {};
10
+ this.errors = {};
11
+ this.submitted = false;
12
+ this.handleFieldChange = (e) => {
13
+ const { name, value } = e.detail;
14
+ this.formValues = Object.assign(Object.assign({}, this.formValues), { [name]: value });
15
+ if (this.errors[name]) {
16
+ this.errors = Object.assign(Object.assign({}, this.errors), { [name]: '' });
17
+ }
18
+ };
19
+ this.handleSearch = (e) => {
20
+ this.mrdSearch.emit(e.detail);
21
+ };
22
+ this.handleSubmit = (e) => {
23
+ e.preventDefault();
24
+ this.submitted = true;
25
+ if (this.validate()) {
26
+ this.mrdSubmit.emit(Object.assign({}, this.formValues));
27
+ }
28
+ };
29
+ }
30
+ componentWillLoad() {
31
+ var _a;
32
+ this.formValues = Object.assign({}, ((_a = this.values) !== null && _a !== void 0 ? _a : {}));
33
+ }
34
+ async setFieldValue(name, value) {
35
+ this.formValues = Object.assign(Object.assign({}, this.formValues), { [name]: value });
36
+ if (this.errors[name]) {
37
+ this.errors = Object.assign(Object.assign({}, this.errors), { [name]: '' });
38
+ }
39
+ }
40
+ collectFields(items) {
41
+ const fields = [];
42
+ for (const item of items) {
43
+ if (item.type === ClientLayoutItemType.FIELD || item.type === ClientLayoutItemType.RELATION) {
44
+ fields.push(item);
45
+ }
46
+ if (item.items) {
47
+ fields.push(...this.collectFields(item.items));
48
+ }
49
+ }
50
+ return fields;
51
+ }
52
+ validate() {
53
+ var _a, _b, _c;
54
+ const newErrors = {};
55
+ const allFields = this.collectFields((_b = (_a = this.layout) === null || _a === void 0 ? void 0 : _a.items) !== null && _b !== void 0 ? _b : []);
56
+ for (const item of allFields) {
57
+ const def = (_c = item.field) !== null && _c !== void 0 ? _c : item.relation;
58
+ if (!def)
59
+ continue;
60
+ if (def.required && !validateRequired(this.formValues[def.name])) {
61
+ newErrors[def.name] = t('required', this.locale);
62
+ }
63
+ }
64
+ this.errors = newErrors;
65
+ return Object.keys(newErrors).length === 0;
66
+ }
67
+ renderItems(items) {
68
+ return items.map(item => {
69
+ var _a, _b, _c, _d;
70
+ if (item.type === ClientLayoutItemType.SECTION) {
71
+ return (h("fieldset", { class: "mrd-form__section" }, item.label && h("legend", { class: "mrd-form__section-legend" }, item.label), h("div", { class: "mrd-form__section-body" }, item.items && this.renderItems(item.items))));
72
+ }
73
+ if (item.type === ClientLayoutItemType.GROUP) {
74
+ return (h("div", { class: "mrd-form__group" }, item.label && h("div", { class: "mrd-form__group-label" }, item.label), h("div", { class: "mrd-form__group-body" }, item.items && this.renderItems(item.items))));
75
+ }
76
+ const fieldName = (_d = (_b = (_a = item.field) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : (_c = item.relation) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : '';
77
+ const fieldValue = this.formValues[fieldName];
78
+ return (h("div", { class: "mrd-form__field" }, h("mrd-field", { item: item, locale: this.locale, value: fieldValue, onMrdChange: this.handleFieldChange, onMrdBlur: this.handleFieldChange, onMrdSearch: this.handleSearch }), this.errors[fieldName] && (h("span", { class: "mrd-form__field-error" }, this.errors[fieldName]))));
79
+ });
80
+ }
81
+ render() {
82
+ if (!this.layout) {
83
+ return h(Host, null);
84
+ }
85
+ const dir = this.locale.startsWith('ar') ? 'rtl' : 'ltr';
86
+ return (h(Host, null, h("form", { class: "mrd-form", dir: dir, onSubmit: this.handleSubmit, noValidate: true }, this.layout.title && h("h2", { class: "mrd-form__title" }, this.layout.title), h("div", { class: "mrd-form__body" }, this.renderItems(this.layout.items)), h("div", { class: "mrd-form__footer" }, h("button", { type: "submit", class: "mrd-form__submit" }, t('submit', this.locale))))));
87
+ }
88
+ static get is() { return "mrd-form"; }
89
+ static get encapsulation() { return "scoped"; }
90
+ static get originalStyleUrls() {
91
+ return {
92
+ "$": ["mrd-form.scss"]
93
+ };
94
+ }
95
+ static get styleUrls() {
96
+ return {
97
+ "$": ["mrd-form.css"]
98
+ };
99
+ }
100
+ static get properties() {
101
+ return {
102
+ "layout": {
103
+ "type": "unknown",
104
+ "mutable": false,
105
+ "complexType": {
106
+ "original": "ClientLayout",
107
+ "resolved": "ClientLayout",
108
+ "references": {
109
+ "ClientLayout": {
110
+ "location": "import",
111
+ "path": "../../types",
112
+ "id": "src/types/index.ts::ClientLayout",
113
+ "referenceLocation": "ClientLayout"
114
+ }
115
+ }
116
+ },
117
+ "required": true,
118
+ "optional": false,
119
+ "docs": {
120
+ "tags": [],
121
+ "text": ""
122
+ },
123
+ "getter": false,
124
+ "setter": false
125
+ },
126
+ "locale": {
127
+ "type": "string",
128
+ "mutable": false,
129
+ "complexType": {
130
+ "original": "string",
131
+ "resolved": "string",
132
+ "references": {}
133
+ },
134
+ "required": false,
135
+ "optional": false,
136
+ "docs": {
137
+ "tags": [],
138
+ "text": ""
139
+ },
140
+ "getter": false,
141
+ "setter": false,
142
+ "reflect": false,
143
+ "attribute": "locale",
144
+ "defaultValue": "navigator.language"
145
+ },
146
+ "values": {
147
+ "type": "unknown",
148
+ "mutable": false,
149
+ "complexType": {
150
+ "original": "Record<string, unknown>",
151
+ "resolved": "string | unknown",
152
+ "references": {
153
+ "Record": {
154
+ "location": "global",
155
+ "id": "global::Record"
156
+ }
157
+ }
158
+ },
159
+ "required": false,
160
+ "optional": false,
161
+ "docs": {
162
+ "tags": [],
163
+ "text": ""
164
+ },
165
+ "getter": false,
166
+ "setter": false,
167
+ "defaultValue": "{}"
168
+ }
169
+ };
170
+ }
171
+ static get states() {
172
+ return {
173
+ "formValues": {},
174
+ "errors": {},
175
+ "submitted": {}
176
+ };
177
+ }
178
+ static get events() {
179
+ return [{
180
+ "method": "mrdSubmit",
181
+ "name": "mrdSubmit",
182
+ "bubbles": true,
183
+ "cancelable": true,
184
+ "composed": true,
185
+ "docs": {
186
+ "tags": [],
187
+ "text": ""
188
+ },
189
+ "complexType": {
190
+ "original": "Record<string, unknown>",
191
+ "resolved": "string | unknown",
192
+ "references": {
193
+ "Record": {
194
+ "location": "global",
195
+ "id": "global::Record"
196
+ }
197
+ }
198
+ }
199
+ }, {
200
+ "method": "mrdSearch",
201
+ "name": "mrdSearch",
202
+ "bubbles": true,
203
+ "cancelable": true,
204
+ "composed": true,
205
+ "docs": {
206
+ "tags": [],
207
+ "text": ""
208
+ },
209
+ "complexType": {
210
+ "original": "{ query: string; relatedClass: string }",
211
+ "resolved": "{ query: string; relatedClass: string; }",
212
+ "references": {}
213
+ }
214
+ }];
215
+ }
216
+ static get methods() {
217
+ return {
218
+ "setFieldValue": {
219
+ "complexType": {
220
+ "signature": "(name: string, value: unknown) => Promise<void>",
221
+ "parameters": [{
222
+ "name": "name",
223
+ "type": "string",
224
+ "docs": ""
225
+ }, {
226
+ "name": "value",
227
+ "type": "unknown",
228
+ "docs": ""
229
+ }],
230
+ "references": {
231
+ "Promise": {
232
+ "location": "global",
233
+ "id": "global::Promise"
234
+ }
235
+ },
236
+ "return": "Promise<void>"
237
+ },
238
+ "docs": {
239
+ "text": "",
240
+ "tags": []
241
+ }
242
+ }
243
+ };
244
+ }
245
+ }