@formio/js 5.0.0-dev.5723.99bf27e → 5.0.0-dev.5727.73c63c0

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 (36) hide show
  1. package/Changelog.md +3 -0
  2. package/dist/formio.form.js +4 -4
  3. package/dist/formio.form.min.js +1 -1
  4. package/dist/formio.full.js +5 -5
  5. package/dist/formio.full.min.js +1 -1
  6. package/lib/cjs/WebformBuilder.js +6 -1
  7. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -0
  8. package/lib/cjs/components/_classes/nestedarray/NestedArrayComponent.js +50 -29
  9. package/lib/cjs/components/editgrid/fixtures/comp17.d.ts +80 -0
  10. package/lib/cjs/components/editgrid/fixtures/comp17.js +99 -0
  11. package/lib/cjs/components/editgrid/fixtures/index.d.ts +2 -1
  12. package/lib/cjs/components/editgrid/fixtures/index.js +3 -1
  13. package/lib/cjs/components/panel/Panel.d.ts +1 -0
  14. package/lib/cjs/components/panel/Panel.js +1 -0
  15. package/lib/cjs/components/radio/Radio.js +7 -6
  16. package/lib/cjs/components/radio/fixtures/comp12.d.ts +29 -0
  17. package/lib/cjs/components/radio/fixtures/comp12.js +36 -0
  18. package/lib/cjs/components/radio/fixtures/index.d.ts +2 -1
  19. package/lib/cjs/components/radio/fixtures/index.js +3 -1
  20. package/lib/cjs/templates/Templates.js +1 -1
  21. package/lib/mjs/WebformBuilder.js +5 -1
  22. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.d.ts +2 -0
  23. package/lib/mjs/components/_classes/nestedarray/NestedArrayComponent.js +51 -29
  24. package/lib/mjs/components/editgrid/fixtures/comp17.d.ts +80 -0
  25. package/lib/mjs/components/editgrid/fixtures/comp17.js +97 -0
  26. package/lib/mjs/components/editgrid/fixtures/index.d.ts +2 -1
  27. package/lib/mjs/components/editgrid/fixtures/index.js +2 -1
  28. package/lib/mjs/components/panel/Panel.d.ts +1 -0
  29. package/lib/mjs/components/panel/Panel.js +1 -0
  30. package/lib/mjs/components/radio/Radio.js +7 -6
  31. package/lib/mjs/components/radio/fixtures/comp12.d.ts +29 -0
  32. package/lib/mjs/components/radio/fixtures/comp12.js +34 -0
  33. package/lib/mjs/components/radio/fixtures/index.d.ts +2 -1
  34. package/lib/mjs/components/radio/fixtures/index.js +2 -1
  35. package/lib/mjs/templates/Templates.js +1 -1
  36. package/package.json +1 -1
@@ -1064,7 +1064,10 @@ class WebformBuilder extends Component_1.default {
1064
1064
  'calculateValue',
1065
1065
  'conditional',
1066
1066
  'customConditional',
1067
- 'id'
1067
+ 'id',
1068
+ 'fields.day.required',
1069
+ 'fields.month.required',
1070
+ 'fields.year.required',
1068
1071
  ]));
1069
1072
  const parentComponent = defaultValueComponent.parent;
1070
1073
  let tabIndex = -1;
@@ -1240,6 +1243,7 @@ class WebformBuilder extends Component_1.default {
1240
1243
  const previewButtons = this.componentEdit.querySelectorAll(`[${this._referenceAttributeName}="previewButton"]`);
1241
1244
  previewButtons.forEach((previewButton) => {
1242
1245
  this.editForm.addEventListener(previewButton, 'click', (event) => {
1246
+ var _a;
1243
1247
  event.preventDefault();
1244
1248
  this.showPreview = !this.showPreview;
1245
1249
  this.editForm.detach();
@@ -1251,6 +1255,7 @@ class WebformBuilder extends Component_1.default {
1251
1255
  helplinks: this.helplinks,
1252
1256
  }));
1253
1257
  this.editForm.attach(this.componentEdit.querySelector(`[${this._referenceAttributeName}="editForm"]`));
1258
+ this.updateComponent((_a = this.editForm.submission.data) !== null && _a !== void 0 ? _a : component);
1254
1259
  this.attachEditComponentControls(component, parent, isNew, original, ComponentClass);
1255
1260
  });
1256
1261
  });
@@ -12,6 +12,8 @@ export default class NestedArrayComponent extends NestedDataComponent {
12
12
  hasAddButton(): any;
13
13
  getComponent(path: any, fn: any, originalPath: any): any;
14
14
  everyComponent(fn: any, rowIndex: any, options?: {}): void;
15
+ _getEmailTableHeader(options: any): string;
16
+ _getEmailTableBody(options: any): string;
15
17
  getComponents(rowIndex: any): any;
16
18
  }
17
19
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
@@ -149,39 +149,60 @@ class NestedArrayComponent extends NestedDataComponent_1.default {
149
149
  }
150
150
  });
151
151
  }
152
+ _getEmailTableHeader(options) {
153
+ let row = '';
154
+ const getHeaderCell = (component) => {
155
+ if (!component.isInputComponent || !component.visible || component.skipInEmail) {
156
+ return '';
157
+ }
158
+ const label = component.label || component.key;
159
+ return `<th style="padding: 5px 10px;">${label}</th>`;
160
+ };
161
+ const components = this.getComponents(0);
162
+ for (const component of components) {
163
+ if (component.isInputComponent) {
164
+ row += getHeaderCell(component);
165
+ }
166
+ else if ((0, utils_1.isLayoutComponent)(component) && typeof component.everyComponent === 'function') {
167
+ component.everyComponent((comp) => {
168
+ row += getHeaderCell(comp);
169
+ }, options);
170
+ }
171
+ }
172
+ return `<thead><tr>${row}</tr></thead>`;
173
+ }
174
+ _getEmailTableBody(options) {
175
+ const getBodyCell = (component) => {
176
+ if (!component.isInputComponent || !component.visible || component.skipInEmail) {
177
+ return '';
178
+ }
179
+ return `<td style="padding: 5px 10px;">${component.getView(component.dataValue, options)}</td>`;
180
+ };
181
+ const rows = [];
182
+ for (const { components } of this.iteratableRows) {
183
+ let row = '';
184
+ for (const component of components) {
185
+ if (component.isInputComponent) {
186
+ row += getBodyCell(component);
187
+ }
188
+ else if ((0, utils_1.isLayoutComponent)(component) && typeof component.everyComponent === 'function') {
189
+ component.everyComponent((comp) => {
190
+ row += getBodyCell(comp);
191
+ }, options);
192
+ }
193
+ }
194
+ rows.push(`<tr>${row}</tr>`);
195
+ }
196
+ return `<tbody>${rows.join('')}</tbody>`;
197
+ }
152
198
  getValueAsString(value, options) {
153
- var _a;
154
199
  if (options === null || options === void 0 ? void 0 : options.email) {
155
- let result = (`
200
+ return `
156
201
  <table border="1" style="width:100%">
157
- <thead>
158
- <tr>
159
- `);
160
- (_a = this.component.components) === null || _a === void 0 ? void 0 : _a.forEach((component) => {
161
- const label = component.label || component.key;
162
- result += `<th style="padding: 5px 10px;">${label}</th>`;
163
- });
164
- result += (`
165
- </tr>
166
- </thead>
167
- <tbody>
168
- `);
169
- this.iteratableRows.forEach(({ components }) => {
170
- result += '<tr>';
171
- lodash_1.default.each(components, (component) => {
172
- result += '<td style="padding:5px 10px;">';
173
- if (component.isInputComponent && component.visible && !component.skipInEmail) {
174
- result += component.getView(component.dataValue, options);
175
- }
176
- result += '</td>';
177
- });
178
- result += '</tr>';
179
- });
180
- result += (`
181
- </tbody>
202
+ ${this._getEmailTableHeader(options)}
203
+ ${this._getEmailTableBody(options)}
182
204
  </table>
183
- `);
184
- return result;
205
+ `;
185
206
  }
186
207
  if (!value || !value.length) {
187
208
  return '';
@@ -0,0 +1,80 @@
1
+ declare namespace _default {
2
+ let type: string;
3
+ let display: string;
4
+ let components: ({
5
+ label: string;
6
+ tableView: boolean;
7
+ rowDrafts: boolean;
8
+ key: string;
9
+ type: string;
10
+ input: boolean;
11
+ components: {
12
+ collapsible: boolean;
13
+ key: string;
14
+ type: string;
15
+ label: string;
16
+ input: boolean;
17
+ tableView: boolean;
18
+ components: {
19
+ label: string;
20
+ columns: ({
21
+ components: {
22
+ label: string;
23
+ optionsLabelPosition: string;
24
+ inline: boolean;
25
+ tableView: boolean;
26
+ values: {
27
+ label: string;
28
+ value: string;
29
+ shortcut: string;
30
+ }[];
31
+ key: string;
32
+ type: string;
33
+ input: boolean;
34
+ }[];
35
+ width: number;
36
+ offset: number;
37
+ push: number;
38
+ pull: number;
39
+ size: string;
40
+ currentWidth: number;
41
+ } | {
42
+ components: {
43
+ label: string;
44
+ applyMaskOn: string;
45
+ autoExpand: boolean;
46
+ tableView: boolean;
47
+ key: string;
48
+ conditional: {
49
+ show: boolean;
50
+ conjunction: string;
51
+ };
52
+ type: string;
53
+ input: boolean;
54
+ }[];
55
+ width: number;
56
+ offset: number;
57
+ push: number;
58
+ pull: number;
59
+ size: string;
60
+ currentWidth: number;
61
+ })[];
62
+ key: string;
63
+ type: string;
64
+ input: boolean;
65
+ tableView: boolean;
66
+ }[];
67
+ }[];
68
+ disableOnInvalid?: undefined;
69
+ } | {
70
+ type: string;
71
+ label: string;
72
+ key: string;
73
+ disableOnInvalid: boolean;
74
+ input: boolean;
75
+ tableView: boolean;
76
+ rowDrafts?: undefined;
77
+ components?: undefined;
78
+ })[];
79
+ }
80
+ export default _default;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ type: 'form',
5
+ display: 'form',
6
+ components: [
7
+ {
8
+ label: 'Edit Grid',
9
+ tableView: false,
10
+ rowDrafts: false,
11
+ key: 'editGrid',
12
+ type: 'editgrid',
13
+ input: true,
14
+ components: [
15
+ {
16
+ collapsible: false,
17
+ key: 'panel',
18
+ type: 'panel',
19
+ label: 'Panel',
20
+ input: false,
21
+ tableView: false,
22
+ components: [
23
+ {
24
+ label: 'Columns',
25
+ columns: [
26
+ {
27
+ components: [
28
+ {
29
+ label: 'Radio',
30
+ optionsLabelPosition: 'right',
31
+ inline: false,
32
+ tableView: true,
33
+ values: [
34
+ {
35
+ label: 'yes',
36
+ value: 'yes',
37
+ shortcut: ''
38
+ },
39
+ {
40
+ label: 'no',
41
+ value: 'no',
42
+ shortcut: ''
43
+ }
44
+ ],
45
+ key: 'radio',
46
+ type: 'radio',
47
+ input: true
48
+ }
49
+ ],
50
+ width: 6,
51
+ offset: 0,
52
+ push: 0,
53
+ pull: 0,
54
+ size: 'md',
55
+ currentWidth: 6
56
+ },
57
+ {
58
+ components: [
59
+ {
60
+ label: 'Text Area',
61
+ applyMaskOn: 'change',
62
+ autoExpand: false,
63
+ tableView: true,
64
+ key: 'textArea',
65
+ conditional: {
66
+ show: true,
67
+ conjunction: 'all'
68
+ },
69
+ type: 'textarea',
70
+ input: true
71
+ }
72
+ ],
73
+ width: 6,
74
+ offset: 0,
75
+ push: 0,
76
+ pull: 0,
77
+ size: 'md',
78
+ currentWidth: 6
79
+ }
80
+ ],
81
+ key: 'columns',
82
+ type: 'columns',
83
+ input: false,
84
+ tableView: false
85
+ }
86
+ ]
87
+ }
88
+ ]
89
+ },
90
+ {
91
+ type: 'button',
92
+ label: 'Submit',
93
+ key: 'submit',
94
+ disableOnInvalid: true,
95
+ input: true,
96
+ tableView: false
97
+ }
98
+ ]
99
+ };
@@ -14,8 +14,9 @@ import comp7 from './comp7';
14
14
  import comp8 from './comp8';
15
15
  import comp9 from './comp9';
16
16
  import comp16 from './comp16';
17
+ import comp17 from './comp17';
17
18
  import compOpenWhenEmpty from './comp-openWhenEmpty';
18
19
  import withOpenWhenEmptyAndConditions from './comp-with-conditions-and-openWhenEmpty';
19
20
  import compWithCustomDefaultValue from './comp-with-custom-default-value';
20
21
  import compTestEvents from './comp-test-events';
21
- export { comp1, comp2, comp3, comp10, comp11, comp12, comp13, comp14, comp15, comp4, comp5, comp6, comp7, comp8, comp9, comp16, compOpenWhenEmpty, withOpenWhenEmptyAndConditions, compWithCustomDefaultValue, compTestEvents };
22
+ export { comp1, comp2, comp3, comp10, comp11, comp12, comp13, comp14, comp15, comp4, comp5, comp6, comp7, comp8, comp9, comp16, comp17, compOpenWhenEmpty, withOpenWhenEmptyAndConditions, compWithCustomDefaultValue, compTestEvents };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.compTestEvents = exports.compWithCustomDefaultValue = exports.withOpenWhenEmptyAndConditions = exports.compOpenWhenEmpty = exports.comp16 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp15 = exports.comp14 = exports.comp13 = exports.comp12 = exports.comp11 = exports.comp10 = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
6
+ exports.compTestEvents = exports.compWithCustomDefaultValue = exports.withOpenWhenEmptyAndConditions = exports.compOpenWhenEmpty = exports.comp17 = exports.comp16 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp15 = exports.comp14 = exports.comp13 = exports.comp12 = exports.comp11 = exports.comp10 = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
7
7
  const comp1_1 = __importDefault(require("./comp1"));
8
8
  exports.comp1 = comp1_1.default;
9
9
  const comp2_1 = __importDefault(require("./comp2"));
@@ -36,6 +36,8 @@ const comp15_1 = __importDefault(require("./comp15"));
36
36
  exports.comp15 = comp15_1.default;
37
37
  const comp16_1 = __importDefault(require("./comp16"));
38
38
  exports.comp16 = comp16_1.default;
39
+ const comp17_1 = __importDefault(require("./comp17"));
40
+ exports.comp17 = comp17_1.default;
39
41
  const comp_with_conditions_and_openWhenEmpty_1 = __importDefault(require("./comp-with-conditions-and-openWhenEmpty"));
40
42
  exports.withOpenWhenEmptyAndConditions = comp_with_conditions_and_openWhenEmpty_1.default;
41
43
  const comp_openWhenEmpty_1 = __importDefault(require("./comp-openWhenEmpty"));
@@ -4,6 +4,7 @@ export default class PanelComponent extends NestedComponent {
4
4
  icon: string;
5
5
  group: string;
6
6
  documentation: string;
7
+ showPreview: boolean;
7
8
  weight: number;
8
9
  schema: any;
9
10
  };
@@ -27,6 +27,7 @@ class PanelComponent extends NestedComponent_1.default {
27
27
  icon: 'list-alt',
28
28
  group: 'layout',
29
29
  documentation: '/userguide/form-building/layout-components#panel',
30
+ showPreview: false,
30
31
  weight: 30,
31
32
  schema: PanelComponent.schema()
32
33
  };
@@ -295,14 +295,15 @@ class RadioComponent extends ListComponent_1.default {
295
295
  setItems(items) {
296
296
  const listData = [];
297
297
  items === null || items === void 0 ? void 0 : items.forEach((item, i) => {
298
+ const valueAtProperty = lodash_1.default.get(item, this.component.valueProperty);
298
299
  this.loadedOptions[i] = {
299
- value: this.component.valueProperty ? item[this.component.valueProperty] : item,
300
- label: this.component.valueProperty ? this.itemTemplate(item, item[this.component.valueProperty]) : this.itemTemplate(item, item, i)
300
+ value: this.component.valueProperty ? valueAtProperty : item,
301
+ label: this.component.valueProperty ? this.itemTemplate(item, valueAtProperty) : this.itemTemplate(item, item, i)
301
302
  };
302
- listData.push(this.templateData[this.component.valueProperty ? item[this.component.valueProperty] : i]);
303
- if ((this.component.valueProperty || !this.isRadio) && (lodash_1.default.isUndefined(item[this.component.valueProperty]) ||
304
- (!this.isRadio && lodash_1.default.isObject(item[this.component.valueProperty])) ||
305
- (!this.isRadio && lodash_1.default.isBoolean(item[this.component.valueProperty])))) {
303
+ listData.push(this.templateData[this.component.valueProperty ? valueAtProperty : i]);
304
+ if ((this.component.valueProperty || !this.isRadio) && (lodash_1.default.isUndefined(valueAtProperty) ||
305
+ (!this.isRadio && lodash_1.default.isObject(valueAtProperty)) ||
306
+ (!this.isRadio && lodash_1.default.isBoolean(valueAtProperty)))) {
306
307
  this.loadedOptions[i].invalid = true;
307
308
  }
308
309
  });
@@ -0,0 +1,29 @@
1
+ declare namespace _default {
2
+ let components: {
3
+ label: string;
4
+ optionsLabelPosition: string;
5
+ tableView: boolean;
6
+ dataSrc: string;
7
+ values: {
8
+ label: string;
9
+ value: string;
10
+ shortcut: string;
11
+ }[];
12
+ valueProperty: string;
13
+ validateWhenHidden: boolean;
14
+ key: string;
15
+ type: string;
16
+ data: {
17
+ url: string;
18
+ headers: {
19
+ key: string;
20
+ value: string;
21
+ }[];
22
+ };
23
+ template: string;
24
+ authenticate: boolean;
25
+ input: boolean;
26
+ inputType: string;
27
+ }[];
28
+ }
29
+ export default _default;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ components: [
5
+ {
6
+ "label": "Select Boxes",
7
+ "optionsLabelPosition": "right",
8
+ "tableView": false,
9
+ "dataSrc": "url",
10
+ "values": [
11
+ {
12
+ "label": "",
13
+ "value": "",
14
+ "shortcut": ""
15
+ }
16
+ ],
17
+ "valueProperty": "data.name",
18
+ "validateWhenHidden": false,
19
+ "key": "selectBoxes",
20
+ "type": "selectboxes",
21
+ "data": {
22
+ "url": "https://remote-dev.form.io/projectId/name/submission",
23
+ "headers": [
24
+ {
25
+ "key": "",
26
+ "value": ""
27
+ }
28
+ ]
29
+ },
30
+ "template": "<span>{{ item.data.name }}</span>",
31
+ "authenticate": true,
32
+ "input": true,
33
+ "inputType": "checkbox"
34
+ }
35
+ ]
36
+ };
@@ -9,4 +9,5 @@ import comp8 from './comp8';
9
9
  import comp9 from './comp9';
10
10
  import comp10 from './comp10';
11
11
  import comp11 from './comp11';
12
- export { comp1, comp2, comp3, comp4, comp5, comp6, comp7, comp8, comp9, comp10, comp11 };
12
+ import comp12 from './comp12';
13
+ export { comp1, comp2, comp3, comp4, comp5, comp6, comp7, comp8, comp9, comp10, comp11, comp12 };
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.comp11 = exports.comp10 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
6
+ exports.comp12 = exports.comp11 = exports.comp10 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
7
7
  const comp1_1 = __importDefault(require("./comp1"));
8
8
  exports.comp1 = comp1_1.default;
9
9
  const comp2_1 = __importDefault(require("./comp2"));
@@ -26,3 +26,5 @@ const comp10_1 = __importDefault(require("./comp10"));
26
26
  exports.comp10 = comp10_1.default;
27
27
  const comp11_1 = __importDefault(require("./comp11"));
28
28
  exports.comp11 = comp11_1.default;
29
+ const comp12_1 = __importDefault(require("./comp12"));
30
+ exports.comp12 = comp12_1.default;
@@ -6,5 +6,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const index_1 = __importDefault(require("./index"));
7
7
  const experimental_1 = require("@formio/core/experimental");
8
8
  experimental_1.Template.addTemplates(index_1.default);
9
- experimental_1.Template.defaultTemplates = index_1.default.bootstrap;
9
+ experimental_1.Template.defaultTemplates = experimental_1.Template.templates.bootstrap;
10
10
  exports.default = experimental_1.Template;
@@ -1048,7 +1048,10 @@ export default class WebformBuilder extends Component {
1048
1048
  'calculateValue',
1049
1049
  'conditional',
1050
1050
  'customConditional',
1051
- 'id'
1051
+ 'id',
1052
+ 'fields.day.required',
1053
+ 'fields.month.required',
1054
+ 'fields.year.required',
1052
1055
  ]));
1053
1056
  const parentComponent = defaultValueComponent.parent;
1054
1057
  let tabIndex = -1;
@@ -1235,6 +1238,7 @@ export default class WebformBuilder extends Component {
1235
1238
  helplinks: this.helplinks,
1236
1239
  }));
1237
1240
  this.editForm.attach(this.componentEdit.querySelector(`[${this._referenceAttributeName}="editForm"]`));
1241
+ this.updateComponent(this.editForm.submission.data ?? component);
1238
1242
  this.attachEditComponentControls(component, parent, isNew, original, ComponentClass);
1239
1243
  });
1240
1244
  });
@@ -12,6 +12,8 @@ export default class NestedArrayComponent extends NestedDataComponent {
12
12
  hasAddButton(): any;
13
13
  getComponent(path: any, fn: any, originalPath: any): any;
14
14
  everyComponent(fn: any, rowIndex: any, options?: {}): void;
15
+ _getEmailTableHeader(options: any): string;
16
+ _getEmailTableBody(options: any): string;
15
17
  getComponents(rowIndex: any): any;
16
18
  }
17
19
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  import _ from 'lodash';
3
- import { componentValueTypes, getStringFromComponentPath } from '../../../utils/utils';
3
+ import { componentValueTypes, getStringFromComponentPath, isLayoutComponent } from '../../../utils/utils';
4
4
  import Component from '../component/Component';
5
5
  import NestedDataComponent from '../nesteddata/NestedDataComponent';
6
6
  export default class NestedArrayComponent extends NestedDataComponent {
@@ -145,38 +145,60 @@ export default class NestedArrayComponent extends NestedDataComponent {
145
145
  }
146
146
  });
147
147
  }
148
+ _getEmailTableHeader(options) {
149
+ let row = '';
150
+ const getHeaderCell = (component) => {
151
+ if (!component.isInputComponent || !component.visible || component.skipInEmail) {
152
+ return '';
153
+ }
154
+ const label = component.label || component.key;
155
+ return `<th style="padding: 5px 10px;">${label}</th>`;
156
+ };
157
+ const components = this.getComponents(0);
158
+ for (const component of components) {
159
+ if (component.isInputComponent) {
160
+ row += getHeaderCell(component);
161
+ }
162
+ else if (isLayoutComponent(component) && typeof component.everyComponent === 'function') {
163
+ component.everyComponent((comp) => {
164
+ row += getHeaderCell(comp);
165
+ }, options);
166
+ }
167
+ }
168
+ return `<thead><tr>${row}</tr></thead>`;
169
+ }
170
+ _getEmailTableBody(options) {
171
+ const getBodyCell = (component) => {
172
+ if (!component.isInputComponent || !component.visible || component.skipInEmail) {
173
+ return '';
174
+ }
175
+ return `<td style="padding: 5px 10px;">${component.getView(component.dataValue, options)}</td>`;
176
+ };
177
+ const rows = [];
178
+ for (const { components } of this.iteratableRows) {
179
+ let row = '';
180
+ for (const component of components) {
181
+ if (component.isInputComponent) {
182
+ row += getBodyCell(component);
183
+ }
184
+ else if (isLayoutComponent(component) && typeof component.everyComponent === 'function') {
185
+ component.everyComponent((comp) => {
186
+ row += getBodyCell(comp);
187
+ }, options);
188
+ }
189
+ }
190
+ rows.push(`<tr>${row}</tr>`);
191
+ }
192
+ return `<tbody>${rows.join('')}</tbody>`;
193
+ }
148
194
  getValueAsString(value, options) {
149
195
  if (options?.email) {
150
- let result = (`
196
+ return `
151
197
  <table border="1" style="width:100%">
152
- <thead>
153
- <tr>
154
- `);
155
- this.component.components?.forEach((component) => {
156
- const label = component.label || component.key;
157
- result += `<th style="padding: 5px 10px;">${label}</th>`;
158
- });
159
- result += (`
160
- </tr>
161
- </thead>
162
- <tbody>
163
- `);
164
- this.iteratableRows.forEach(({ components }) => {
165
- result += '<tr>';
166
- _.each(components, (component) => {
167
- result += '<td style="padding:5px 10px;">';
168
- if (component.isInputComponent && component.visible && !component.skipInEmail) {
169
- result += component.getView(component.dataValue, options);
170
- }
171
- result += '</td>';
172
- });
173
- result += '</tr>';
174
- });
175
- result += (`
176
- </tbody>
198
+ ${this._getEmailTableHeader(options)}
199
+ ${this._getEmailTableBody(options)}
177
200
  </table>
178
- `);
179
- return result;
201
+ `;
180
202
  }
181
203
  if (!value || !value.length) {
182
204
  return '';