@formio/js 5.0.0-rc.39 → 5.0.0-rc.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/dist/formio.builder.css +2 -2
  2. package/dist/formio.builder.min.css +1 -1
  3. package/dist/formio.embed.js +1 -1
  4. package/dist/formio.embed.min.js +1 -1
  5. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  6. package/dist/formio.form.css +2 -2
  7. package/dist/formio.form.js +5373 -2370
  8. package/dist/formio.form.min.css +1 -1
  9. package/dist/formio.form.min.js +1 -1
  10. package/dist/formio.form.min.js.LICENSE.txt +25 -7
  11. package/dist/formio.full.css +2 -2
  12. package/dist/formio.full.js +5715 -2704
  13. package/dist/formio.full.min.css +1 -1
  14. package/dist/formio.full.min.js +1 -1
  15. package/dist/formio.full.min.js.LICENSE.txt +25 -7
  16. package/dist/formio.js +143 -61
  17. package/dist/formio.min.js +1 -1
  18. package/dist/formio.min.js.LICENSE.txt +13 -1
  19. package/dist/formio.utils.js +149 -96
  20. package/dist/formio.utils.min.js +1 -1
  21. package/dist/formio.utils.min.js.LICENSE.txt +4 -4
  22. package/lib/cjs/Element.js +1 -0
  23. package/lib/cjs/Embed.js +121 -121
  24. package/lib/cjs/Webform.js +36 -13
  25. package/lib/cjs/WebformBuilder.js +4 -2
  26. package/lib/cjs/Wizard.js +6 -1
  27. package/lib/cjs/components/_classes/component/Component.js +33 -22
  28. package/lib/cjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
  29. package/lib/cjs/components/_classes/component/editForm/Component.edit.validation.js +8 -0
  30. package/lib/cjs/components/_classes/component/fixtures/comp5.js +2 -2
  31. package/lib/cjs/components/_classes/multivalue/Multivalue.js +2 -2
  32. package/lib/cjs/components/_classes/nested/NestedComponent.js +2 -2
  33. package/lib/cjs/components/address/fixtures/comp3.js +1 -1
  34. package/lib/cjs/components/builder.js +0 -2
  35. package/lib/cjs/components/button/Button.js +7 -1
  36. package/lib/cjs/components/datagrid/DataGrid.js +16 -3
  37. package/lib/cjs/components/datagrid/fixtures/comp-with-allow-calculate-override.js +68 -0
  38. package/lib/cjs/components/datagrid/fixtures/comp6.js +1 -1
  39. package/lib/cjs/components/datagrid/fixtures/index.js +5 -1
  40. package/lib/cjs/components/datagrid/fixtures/two-comp-with-allow-calculate-override.js +104 -0
  41. package/lib/cjs/components/editgrid/EditGrid.js +11 -4
  42. package/lib/cjs/components/editgrid/fixtures/formsWithEditGridAndConditions.js +923 -0
  43. package/lib/cjs/components/file/File.js +2 -2
  44. package/lib/cjs/components/file/editForm/File.edit.file.js +1 -1
  45. package/lib/cjs/components/form/Form.js +1 -1
  46. package/lib/cjs/components/html/HTML.js +11 -2
  47. package/lib/cjs/components/html/fixtures/index.js +1 -3
  48. package/lib/cjs/components/index.js +0 -2
  49. package/lib/cjs/components/recaptcha/ReCaptcha.js +46 -46
  50. package/lib/cjs/components/select/Select.js +3 -1
  51. package/lib/cjs/components/select/fixtures/comp20.js +46 -0
  52. package/lib/cjs/components/select/fixtures/comp21.js +106 -0
  53. package/lib/cjs/components/select/fixtures/index.js +5 -1
  54. package/lib/cjs/components/selectboxes/SelectBoxes.js +1 -1
  55. package/lib/cjs/components/textfield/TextField.js +63 -3
  56. package/lib/cjs/providers/storage/s3.js +5 -3
  57. package/lib/cjs/providers/storage/uploadAdapter.js +1 -1
  58. package/lib/cjs/providers/storage/url.js +19 -13
  59. package/lib/cjs/templates/Templates.js +4 -4
  60. package/lib/cjs/translations/en.js +10 -6
  61. package/lib/cjs/utils/Evaluator.js +1 -1
  62. package/lib/cjs/utils/conditionOperators/IsEqualTo.js +2 -2
  63. package/lib/cjs/utils/formUtils.js +3 -3
  64. package/lib/cjs/utils/utils.js +4 -19
  65. package/lib/cjs/widgets/CalendarWidget.js +1 -1
  66. package/lib/mjs/Element.js +1 -0
  67. package/lib/mjs/Embed.js +1 -2
  68. package/lib/mjs/FormBuilder.js +1 -2
  69. package/lib/mjs/Webform.js +36 -13
  70. package/lib/mjs/WebformBuilder.js +4 -2
  71. package/lib/mjs/Wizard.js +6 -1
  72. package/lib/mjs/builders/Builders.js +1 -2
  73. package/lib/mjs/components/Components.js +1 -2
  74. package/lib/mjs/components/_classes/component/Component.js +33 -24
  75. package/lib/mjs/components/_classes/component/editForm/Component.edit.logic.js +1 -1
  76. package/lib/mjs/components/_classes/component/editForm/Component.edit.validation.js +8 -0
  77. package/lib/mjs/components/_classes/component/fixtures/comp5.js +2 -2
  78. package/lib/mjs/components/_classes/multivalue/Multivalue.js +2 -2
  79. package/lib/mjs/components/_classes/nested/NestedComponent.js +2 -2
  80. package/lib/mjs/components/address/fixtures/comp3.js +1 -1
  81. package/lib/mjs/components/builder.js +0 -2
  82. package/lib/mjs/components/button/Button.js +7 -1
  83. package/lib/mjs/components/datagrid/DataGrid.js +15 -3
  84. package/lib/mjs/components/datagrid/fixtures/comp-with-allow-calculate-override.js +66 -0
  85. package/lib/mjs/components/datagrid/fixtures/comp6.js +1 -1
  86. package/lib/mjs/components/datagrid/fixtures/index.js +3 -1
  87. package/lib/mjs/components/datagrid/fixtures/two-comp-with-allow-calculate-override.js +102 -0
  88. package/lib/mjs/components/editgrid/EditGrid.js +11 -4
  89. package/lib/mjs/components/editgrid/fixtures/formsWithEditGridAndConditions.js +921 -0
  90. package/lib/mjs/components/file/File.js +2 -2
  91. package/lib/mjs/components/file/editForm/File.edit.file.js +1 -1
  92. package/lib/mjs/components/form/Form.js +1 -1
  93. package/lib/mjs/components/html/HTML.js +10 -2
  94. package/lib/mjs/components/html/fixtures/index.js +1 -2
  95. package/lib/mjs/components/index.js +0 -2
  96. package/lib/mjs/components/recaptcha/ReCaptcha.js +32 -43
  97. package/lib/mjs/components/select/Select.js +3 -1
  98. package/lib/mjs/components/select/fixtures/comp20.js +44 -0
  99. package/lib/mjs/components/select/fixtures/comp21.js +104 -0
  100. package/lib/mjs/components/select/fixtures/index.js +3 -1
  101. package/lib/mjs/components/selectboxes/SelectBoxes.js +1 -1
  102. package/lib/mjs/components/textfield/TextField.js +62 -3
  103. package/lib/mjs/displays/Displays.js +1 -2
  104. package/lib/mjs/licenses/Licenses.js +1 -2
  105. package/lib/mjs/providers/Providers.js +1 -2
  106. package/lib/mjs/providers/storage/s3.js +5 -3
  107. package/lib/mjs/providers/storage/uploadAdapter.js +1 -1
  108. package/lib/mjs/providers/storage/url.js +19 -13
  109. package/lib/mjs/templates/Templates.js +1 -1
  110. package/lib/mjs/translations/en.js +10 -6
  111. package/lib/mjs/utils/Evaluator.js +1 -1
  112. package/lib/mjs/utils/conditionOperators/IsEqualTo.js +2 -2
  113. package/lib/mjs/utils/formUtils.js +3 -3
  114. package/lib/mjs/utils/utils.js +2 -16
  115. package/lib/mjs/widgets/CalendarWidget.js +1 -1
  116. package/package.json +23 -22
  117. package/lib/cjs/components/html/fixtures/comp3.js +0 -31
  118. package/lib/cjs/components/resource/Resource.form.js +0 -16
  119. package/lib/cjs/components/resource/Resource.js +0 -39
  120. package/lib/cjs/components/resource/editForm/Resource.edit.display.js +0 -102
  121. package/lib/cjs/components/resource/fixtures/comp1.js +0 -30
  122. package/lib/cjs/components/resource/fixtures/comp2.js +0 -31
  123. package/lib/cjs/components/resource/fixtures/index.js +0 -10
  124. package/lib/mjs/components/html/fixtures/comp3.js +0 -29
  125. package/lib/mjs/components/resource/Resource.form.js +0 -10
  126. package/lib/mjs/components/resource/Resource.js +0 -33
  127. package/lib/mjs/components/resource/editForm/Resource.edit.display.js +0 -100
  128. package/lib/mjs/components/resource/fixtures/comp1.js +0 -28
  129. package/lib/mjs/components/resource/fixtures/comp2.js +0 -29
  130. package/lib/mjs/components/resource/fixtures/index.js +0 -3
@@ -580,8 +580,8 @@ class FileComponent extends Field_1.default {
580
580
  }
581
581
  valid = pattern.excludes.reduce((result, excludePattern) => {
582
582
  const exclude = new RegExp(excludePattern, 'i');
583
- return result && (lodash_1.default.isNil(file.type) || !exclude.test(file.type)) &&
584
- (lodash_1.default.isNil(file.name) || !exclude.test(file.name));
583
+ return result && (lodash_1.default.isNil(file.type) || exclude.test(file.type)) &&
584
+ (lodash_1.default.isNil(file.name) || exclude.test(file.name));
585
585
  }, valid);
586
586
  return valid;
587
587
  }
@@ -189,7 +189,7 @@ exports.default = [
189
189
  input: true,
190
190
  key: 'fileNameTemplate',
191
191
  label: 'File Name Template',
192
- placeholder: '(optional) { {name} }-{ {guid} }"',
192
+ placeholder: '(optional) { {name} }-{ {guid} }',
193
193
  tooltip: 'Specify template for name of uploaded file(s). Regular template variables are available (`data`, `component`, `user`, `value`, `moment` etc.), also `fileName`, `guid` variables are available. `guid` part must be present, if not found in template, will be added at the end.',
194
194
  weight: 25
195
195
  },
@@ -618,7 +618,7 @@ class FormComponent extends Component_1.default {
618
618
  }
619
619
  }
620
620
  isEmpty(value = this.dataValue) {
621
- return value === null || lodash_1.default.isEqual(value, this.emptyValue) || (this.areAllComponentsEmpty(value.data) && !value._id);
621
+ return value === null || lodash_1.default.isEqual(value, this.emptyValue) || (this.areAllComponentsEmpty(value === null || value === void 0 ? void 0 : value.data) && !(value === null || value === void 0 ? void 0 : value._id));
622
622
  }
623
623
  areAllComponentsEmpty(data) {
624
624
  let res = true;
@@ -43,13 +43,13 @@ class HTMLComponent extends Component_1.default {
43
43
  return ` ${this.component.content} `;
44
44
  }
45
45
  const submission = lodash_1.default.get(this.root, 'submission', {});
46
- const content = this.component.content ? this.interpolate(this.sanitize(this.component.content, this.shouldSanitizeValue), {
46
+ const content = this.component.content ? this.interpolate(this.component.content, {
47
47
  metadata: submission.metadata || {},
48
48
  submission: submission,
49
49
  data: this.rootValue,
50
50
  row: this.data
51
51
  }) : '';
52
- return content;
52
+ return this.sanitize(content, this.shouldSanitizeValue);
53
53
  }
54
54
  get singleTags() {
55
55
  return ['br', 'img', 'hr'];
@@ -85,8 +85,17 @@ class HTMLComponent extends Component_1.default {
85
85
  render() {
86
86
  return super.render(this.renderContent());
87
87
  }
88
+ get dataReady() {
89
+ var _a;
90
+ return ((_a = this.root) === null || _a === void 0 ? void 0 : _a.submissionReady) || Promise.resolve();
91
+ }
88
92
  attach(element) {
89
93
  this.loadRefs(element, { html: 'single' });
94
+ this.dataReady.then(() => {
95
+ if (this.element) {
96
+ this.setContent(this.elemet, this.content);
97
+ }
98
+ });
90
99
  return super.attach(element);
91
100
  }
92
101
  }
@@ -3,10 +3,8 @@ 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.comp3 = exports.comp2 = exports.comp1 = void 0;
6
+ 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"));
10
10
  exports.comp2 = comp2_1.default;
11
- const comp3_1 = __importDefault(require("./comp3"));
12
- exports.comp3 = comp3_1.default;
@@ -36,7 +36,6 @@ const Password_1 = __importDefault(require("./password/Password"));
36
36
  const PhoneNumber_1 = __importDefault(require("./phonenumber/PhoneNumber"));
37
37
  const Radio_1 = __importDefault(require("./radio/Radio"));
38
38
  const ReCaptcha_1 = __importDefault(require("./recaptcha/ReCaptcha"));
39
- const Resource_1 = __importDefault(require("./resource/Resource"));
40
39
  const SelectBoxes_1 = __importDefault(require("./selectboxes/SelectBoxes"));
41
40
  const Select_1 = __importDefault(require("./select/Select"));
42
41
  const Signature_1 = __importDefault(require("./signature/Signature"));
@@ -85,7 +84,6 @@ exports.default = {
85
84
  phoneNumber: PhoneNumber_1.default,
86
85
  radio: Radio_1.default,
87
86
  recaptcha: ReCaptcha_1.default,
88
- resource: Resource_1.default,
89
87
  select: Select_1.default,
90
88
  selectboxes: SelectBoxes_1.default,
91
89
  signature: Signature_1.default,
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -61,46 +70,42 @@ class ReCaptchaComponent extends Component_1.default {
61
70
  return true;
62
71
  }
63
72
  verify(actionName) {
64
- const siteKey = (0, get_1.default)(this.root.form, 'settings.recaptcha.siteKey');
65
- if (!siteKey) {
66
- console.warn('There is no Site Key specified in settings in form JSON');
67
- return;
68
- }
69
- if (!this.recaptchaApiReady) {
70
- const recaptchaApiScriptUrl = `https://www.google.com/recaptcha/api.js?render=${(0, get_1.default)(this.root.form, 'settings.recaptcha.siteKey')}`;
71
- this.recaptchaApiReady = Formio_1.Formio.requireLibrary('googleRecaptcha', 'grecaptcha', recaptchaApiScriptUrl, true);
72
- }
73
- if (this.recaptchaApiReady) {
74
- this.recaptchaVerifiedPromise = new Promise((resolve, reject) => {
75
- this.recaptchaApiReady
76
- .then(() => {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ const siteKey = (0, get_1.default)(this.root.form, 'settings.recaptcha.siteKey');
75
+ if (!siteKey) {
76
+ console.warn('There is no Site Key specified in settings in form JSON');
77
+ return;
78
+ }
79
+ if (!this.recaptchaApiReady) {
80
+ const recaptchaApiScriptUrl = `https://www.google.com/recaptcha/api.js?render=${(0, get_1.default)(this.root.form, 'settings.recaptcha.siteKey')}`;
81
+ this.recaptchaApiReady = Formio_1.Formio.requireLibrary('googleRecaptcha', 'grecaptcha', recaptchaApiScriptUrl, true);
82
+ }
83
+ try {
84
+ yield this.recaptchaApiReady;
85
+ this.recaptchaVerifiedPromise = new Promise((resolve, reject) => {
77
86
  if (!this.isLoading) {
78
87
  this.isLoading = true;
79
- grecaptcha.ready((0, debounce_1.default)(() => {
80
- grecaptcha
81
- .execute(siteKey, {
82
- action: actionName
83
- })
84
- .then((token) => {
85
- return this.sendVerificationRequest(token).then(({ verificationResult, token }) => {
86
- this.recaptchaResult = Object.assign(Object.assign({}, verificationResult), { token });
87
- this.updateValue(this.recaptchaResult);
88
- return resolve(verificationResult);
89
- });
90
- })
91
- .catch(() => {
88
+ grecaptcha.ready((0, debounce_1.default)(() => __awaiter(this, void 0, void 0, function* () {
89
+ try {
90
+ const token = yield grecaptcha.execute(siteKey, { action: actionName });
91
+ const verificationResult = yield this.sendVerificationRequest(token);
92
+ this.recaptchaResult = Object.assign(Object.assign({}, verificationResult), { token });
93
+ this.updateValue(this.recaptchaResult);
94
+ this.isLoading = false;
95
+ return resolve(verificationResult);
96
+ }
97
+ catch (err) {
92
98
  this.isLoading = false;
93
- });
94
- }, 1000));
99
+ reject(err);
100
+ }
101
+ }), 1000));
95
102
  }
96
- })
97
- .catch(() => {
98
- return reject();
99
103
  });
100
- }).then(() => {
101
- this.isLoading = false;
102
- });
103
- }
104
+ }
105
+ catch (err) {
106
+ this.loading = false;
107
+ }
108
+ });
104
109
  }
105
110
  beforeSubmit() {
106
111
  if (this.recaptchaVerifiedPromise) {
@@ -110,32 +115,27 @@ class ReCaptchaComponent extends Component_1.default {
110
115
  return super.beforeSubmit();
111
116
  }
112
117
  sendVerificationRequest(token) {
113
- return Formio_1.Formio.makeStaticRequest(`${Formio_1.Formio.projectUrl}/recaptcha?recaptchaToken=${token}`)
114
- .then((verificationResult) => ({ verificationResult, token }));
118
+ return Formio_1.Formio.makeStaticRequest(`${Formio_1.Formio.projectUrl}/recaptcha?recaptchaToken=${token}`);
115
119
  }
116
120
  checkComponentValidity(data, dirty, row, options = {}, errors = []) {
117
121
  data = data || this.rootValue;
118
122
  row = row || this.data;
119
123
  const { async = false } = options;
120
- // Verification could be async only
124
+ // Verification could be async only (which for now is only the case for server-side validation)
121
125
  if (!async) {
122
126
  return super.checkComponentValidity(data, dirty, row, options, errors);
123
127
  }
124
128
  const componentData = row[this.component.key];
125
129
  if (!componentData || !componentData.token) {
126
- this.setCustomValidity('ReCAPTCHA: Token is not specified in submission');
130
+ this.setCustomValidity(this.t('reCaptchaTokenNotSpecifiedError'));
127
131
  return Promise.resolve(false);
128
132
  }
129
133
  if (!componentData.success) {
130
- this.setCustomValidity('ReCAPTCHA: Token validation error');
134
+ this.setCustomValidity(this.t('reCaptchaTokenValidationError'));
131
135
  return Promise.resolve(false);
132
136
  }
133
- return this.hook('validateReCaptcha', componentData.token, () => Promise.resolve(true))
134
- .then((success) => success)
135
- .catch((err) => {
136
- this.setCustomValidity(err.message || err);
137
- return false;
138
- });
137
+ // Any further validation will 100% not run on the client
138
+ return Promise.resolve(true);
139
139
  }
140
140
  normalizeValue(newValue) {
141
141
  // If a recaptcha result has already been established, then do not allow it to be reset.
@@ -348,6 +348,7 @@ class SelectComponent extends ListComponent_1.default {
348
348
  /* eslint-disable max-statements */
349
349
  setItems(items, fromSearch) {
350
350
  var _a, _b;
351
+ this.selectItems = items;
351
352
  // If the items is a string, then parse as JSON.
352
353
  if (typeof items == 'string') {
353
354
  try {
@@ -788,7 +789,7 @@ class SelectComponent extends ListComponent_1.default {
788
789
  this.addFocusBlurEvents(input);
789
790
  this.triggerUpdate(null, true);
790
791
  if (this.visible) {
791
- this.setItems(this.selectOptions || []);
792
+ this.setItems(this.selectItems || []);
792
793
  }
793
794
  this.focusableElement = input;
794
795
  if (this.component.dataSrc === 'custom') {
@@ -1164,6 +1165,7 @@ class SelectComponent extends ListComponent_1.default {
1164
1165
  templateData[dataValueItemValue] = this.templateData[dataValueItemValue];
1165
1166
  });
1166
1167
  }
1168
+ templateData[value] = this.templateData[value];
1167
1169
  }
1168
1170
  lodash_1.default.set(submission.metadata.selectData, this.path, templateData);
1169
1171
  }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ _id: '659fa81f4a40147c0ffb949b',
5
+ title: '7724',
6
+ name: '7724',
7
+ path: '7724',
8
+ type: 'form',
9
+ display: 'form',
10
+ components: [
11
+ {
12
+ label: 'Select',
13
+ widget: 'choicesjs',
14
+ tableView: true,
15
+ multiple: true,
16
+ data: {
17
+ values: [
18
+ {
19
+ label: 'Apple',
20
+ value: 'apple'
21
+ },
22
+ {
23
+ label: 'Orange',
24
+ value: 'orange'
25
+ },
26
+ {
27
+ label: 'Pear',
28
+ value: 'pear'
29
+ }
30
+ ]
31
+ },
32
+ key: 'select',
33
+ type: 'select',
34
+ input: true
35
+ },
36
+ {
37
+ type: 'button',
38
+ label: 'Submit',
39
+ key: 'submit',
40
+ disableOnInvalid: true,
41
+ input: true,
42
+ tableView: false
43
+ }
44
+ ],
45
+ project: '63cead09be0090345b109e22'
46
+ };
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ title: 'FIO-7632',
5
+ name: 'fio7632',
6
+ path: 'fio7632',
7
+ type: 'form',
8
+ display: 'form',
9
+ components: [
10
+ {
11
+ collapsible: false,
12
+ key: 'panel',
13
+ type: 'panel',
14
+ label: 'Panel',
15
+ input: false,
16
+ tableView: false,
17
+ components: [
18
+ {
19
+ label: 'Animals',
20
+ widget: 'html5',
21
+ tableView: true,
22
+ data: {
23
+ values: [
24
+ {
25
+ label: 'Dog',
26
+ value: 'dog',
27
+ },
28
+ {
29
+ label: 'Cat',
30
+ value: 'cat',
31
+ },
32
+ {
33
+ label: 'Horse',
34
+ value: 'horse',
35
+ },
36
+ ],
37
+ },
38
+ key: 'animals',
39
+ type: 'select',
40
+ input: true,
41
+ },
42
+ {
43
+ label: 'Checkbox',
44
+ tableView: false,
45
+ key: 'checkbox',
46
+ type: 'checkbox',
47
+ input: true,
48
+ },
49
+ {
50
+ label: 'Animals2',
51
+ widget: 'html5',
52
+ tableView: true,
53
+ data: {
54
+ values: [
55
+ {
56
+ label: 'Dog',
57
+ value: 'dog',
58
+ },
59
+ {
60
+ label: 'Cat',
61
+ value: 'cat',
62
+ },
63
+ {
64
+ label: 'Horse',
65
+ value: 'horse',
66
+ },
67
+ ],
68
+ },
69
+ calculateValue: 'if (data.checkbox === true) {\n value = data.animals;\n}',
70
+ key: 'animals2',
71
+ logic: [
72
+ {
73
+ name: 'disable',
74
+ trigger: {
75
+ type: 'javascript',
76
+ javascript: 'result = row.checkbox === true;',
77
+ },
78
+ actions: [
79
+ {
80
+ name: 'disable',
81
+ type: 'property',
82
+ property: {
83
+ label: 'Disabled',
84
+ value: 'disabled',
85
+ type: 'boolean',
86
+ },
87
+ state: true,
88
+ },
89
+ ],
90
+ },
91
+ ],
92
+ type: 'select',
93
+ input: true,
94
+ },
95
+ {
96
+ type: 'button',
97
+ label: 'Submit',
98
+ key: 'submit',
99
+ disableOnInvalid: true,
100
+ input: true,
101
+ tableView: false,
102
+ },
103
+ ],
104
+ },
105
+ ],
106
+ };
@@ -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.comp19 = exports.comp18 = exports.comp17 = exports.comp16 = exports.comp15 = exports.comp14 = exports.comp13 = exports.comp12 = exports.comp11 = exports.comp10 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp2 = exports.comp1 = exports.multiSelectOptions = exports.multiSelect = void 0;
6
+ exports.comp21 = exports.comp20 = exports.comp19 = exports.comp18 = exports.comp17 = exports.comp16 = exports.comp15 = exports.comp14 = exports.comp13 = exports.comp12 = exports.comp11 = exports.comp10 = exports.comp9 = exports.comp8 = exports.comp7 = exports.comp6 = exports.comp5 = exports.comp4 = exports.comp2 = exports.comp1 = exports.multiSelectOptions = exports.multiSelect = 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"));
@@ -43,3 +43,7 @@ const comp18_1 = __importDefault(require("./comp18"));
43
43
  exports.comp18 = comp18_1.default;
44
44
  const comp19_1 = __importDefault(require("./comp19"));
45
45
  exports.comp19 = comp19_1.default;
46
+ const comp20_1 = __importDefault(require("./comp20"));
47
+ exports.comp20 = comp20_1.default;
48
+ const comp21_1 = __importDefault(require("./comp21"));
49
+ exports.comp21 = comp21_1.default;
@@ -34,7 +34,7 @@ class SelectBoxesComponent extends Radio_1.default {
34
34
  type: 'select',
35
35
  dataSrc: 'custom',
36
36
  valueProperty: 'value',
37
- valueType: 'string',
37
+ dataType: 'string',
38
38
  data: {
39
39
  custom: `values = ${classComp && classComp.values ? JSON.stringify(classComp.values) : []}`
40
40
  },
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const Input_1 = __importDefault(require("../_classes/input/Input"));
30
30
  const vanilla_text_mask_1 = require("@formio/vanilla-text-mask");
31
+ const inputmask_1 = __importDefault(require("inputmask"));
31
32
  const FormioUtils = __importStar(require("../../utils/utils"));
32
33
  const lodash_1 = __importDefault(require("lodash"));
33
34
  class TextFieldComponent extends Input_1.default {
@@ -164,8 +165,14 @@ class TextFieldComponent extends Input_1.default {
164
165
  const maskInput = this.refs.select ? this.refs.select[index] : null;
165
166
  const mask = this.getMaskPattern(value.maskName);
166
167
  if (textInput && maskInput && mask) {
167
- const placeholderChar = this.placeholderChar;
168
- textInput.value = (0, vanilla_text_mask_1.conformToMask)(textValue, FormioUtils.getInputMask(mask), { placeholderChar }).conformedValue;
168
+ if (textInput.inputmask) {
169
+ this.setInputMask(textInput, mask);
170
+ textInput.inputmask.setValue(textValue);
171
+ }
172
+ else {
173
+ const placeholderChar = this.placeholderChar;
174
+ textInput.value = (0, vanilla_text_mask_1.conformToMask)(textValue, FormioUtils.getInputMask(mask), { placeholderChar }).conformedValue;
175
+ }
169
176
  maskInput.value = value.maskName;
170
177
  }
171
178
  else {
@@ -197,7 +204,10 @@ class TextFieldComponent extends Input_1.default {
197
204
  if (displayMask && !valueMask) {
198
205
  return this.unmaskValue(value, displayMask);
199
206
  }
200
- if ((_a = this.refs.valueMaskInput) === null || _a === void 0 ? void 0 : _a.mask) {
207
+ if (displayMask && displayMask !== valueMask) {
208
+ return inputmask_1.default.format(inputmask_1.default.unmask(value, displayMask), valueMask);
209
+ }
210
+ if (((_a = this.refs.valueMaskInput) === null || _a === void 0 ? void 0 : _a.mask) && this.refs.valueMaskInput.mask.textMaskInputElement) {
201
211
  this.refs.valueMaskInput.mask.textMaskInputElement.update(value);
202
212
  return (_b = this.refs.valueMaskInput) === null || _b === void 0 ? void 0 : _b.value;
203
213
  }
@@ -210,6 +220,56 @@ class TextFieldComponent extends Input_1.default {
210
220
  maskName: maskInput ? maskInput.value : undefined
211
221
  };
212
222
  }
223
+ checkInputMaskValue(inputMask) {
224
+ let valid = true;
225
+ const maskValues = lodash_1.default.values(inputMask.split('').reduce((acc, el, i, mask) => {
226
+ var _a;
227
+ if (el === '{' || el === '}') {
228
+ if (mask[i + 1] === '{' || mask[i + 1] === '}') {
229
+ valid = false;
230
+ }
231
+ acc[el] = ((_a = acc[el]) !== null && _a !== void 0 ? _a : 0) + 1;
232
+ }
233
+ return acc;
234
+ }, {}));
235
+ if (maskValues[0] !== maskValues[1]) {
236
+ valid = false;
237
+ }
238
+ return valid;
239
+ }
240
+ setInputMask(input, inputMask, usePlaceholder) {
241
+ if (this.type !== 'textfield') {
242
+ super.setInputMask(input, inputMask, usePlaceholder);
243
+ return;
244
+ }
245
+ inputMask = inputMask || this.component.displayMask || this.component.inputMask;
246
+ const mask = FormioUtils.getInputMask(inputMask, this.placeholderChar);
247
+ this.defaultMask = mask;
248
+ if (input && inputMask) {
249
+ try {
250
+ //remove previous mask
251
+ if (input.mask) {
252
+ input.mask.remove();
253
+ }
254
+ if (this.checkInputMaskValue(inputMask)) {
255
+ input.mask = new inputmask_1.default(inputMask, {
256
+ clearMaskOnLostFocus: !!this.component.placeholder,
257
+ showMaskOnHover: !this.component.placeholder,
258
+ placeholder: this.placeholderChar || '',
259
+ }).mask(input);
260
+ }
261
+ }
262
+ catch (e) {
263
+ console.warn(e);
264
+ }
265
+ if (mask.numeric) {
266
+ input.setAttribute('pattern', '\\d*');
267
+ }
268
+ if (this.component.placeholder) {
269
+ input.setAttribute('placeholder', this.component.placeholder);
270
+ }
271
+ }
272
+ }
213
273
  isHtmlRenderMode() {
214
274
  return super.isHtmlRenderMode() ||
215
275
  ((this.options.readOnly || this.disabled) &&
@@ -46,9 +46,11 @@ function s3(formio) {
46
46
  else {
47
47
  xhr.openAndSetHeaders('PUT', response.signed);
48
48
  xhr.setRequestHeader('Content-Type', file.type);
49
- Object.keys(response.data.headers).forEach((key) => {
50
- xhr.setRequestHeader(key, response.data.headers[key]);
51
- });
49
+ if (response.data.headers) {
50
+ Object.keys(response.data.headers).forEach((key) => {
51
+ xhr.setRequestHeader(key, response.data.headers[key]);
52
+ });
53
+ }
52
54
  return file;
53
55
  }
54
56
  }
@@ -19,7 +19,7 @@ class FormioUploadAdapter {
19
19
  uploadStorage,
20
20
  file,
21
21
  (0, utils_1.uniqueName)(file.name),
22
- uploadDir || '',
22
+ uploadDir || '', //should pass empty string if undefined
23
23
  (evt) => this.onUploadProgress(evt),
24
24
  uploadUrl,
25
25
  uploadOptions,
@@ -1,6 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  function url(formio) {
4
+ function setOptions(options, xhr) {
5
+ const parsedOptions = typeof options === 'string' ? JSON.parse(options) : options;
6
+ for (const prop in parsedOptions) {
7
+ if (prop === 'headers') {
8
+ const headers = parsedOptions['headers'];
9
+ for (const header in headers) {
10
+ xhr.setRequestHeader(header, headers[header]);
11
+ }
12
+ }
13
+ else {
14
+ xhr[prop] = parsedOptions[prop];
15
+ }
16
+ }
17
+ }
4
18
  const xhrRequest = (url, name, query, data, options, progressCallback, abortCallback) => {
5
19
  return new Promise((resolve, reject) => {
6
20
  const xhr = new XMLHttpRequest();
@@ -59,18 +73,7 @@ function url(formio) {
59
73
  }
60
74
  //Overrides previous request props
61
75
  if (options) {
62
- const parsedOptions = typeof options === 'string' ? JSON.parse(options) : options;
63
- for (const prop in parsedOptions) {
64
- if (prop === 'headers') {
65
- const headers = parsedOptions['headers'];
66
- for (const header in headers) {
67
- xhr.setRequestHeader(header, headers[header]);
68
- }
69
- }
70
- else {
71
- xhr[prop] = parsedOptions[prop];
72
- }
73
- }
76
+ setOptions(options, xhr);
74
77
  }
75
78
  xhr.send(json ? data : fd);
76
79
  });
@@ -111,7 +114,7 @@ function url(formio) {
111
114
  return uploadRequest();
112
115
  }
113
116
  },
114
- deleteFile(fileInfo) {
117
+ deleteFile(fileInfo, options) {
115
118
  return new Promise((resolve, reject) => {
116
119
  const xhr = new XMLHttpRequest();
117
120
  xhr.open('DELETE', fileInfo.url, true);
@@ -123,6 +126,9 @@ function url(formio) {
123
126
  reject(xhr.response || 'Unable to delete file');
124
127
  }
125
128
  };
129
+ if (options) {
130
+ setOptions(options, xhr);
131
+ }
126
132
  xhr.send(null);
127
133
  });
128
134
  },
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const index_1 = __importDefault(require("./index"));
7
- const template_1 = require("@formio/core/template");
8
- template_1.Template.addTemplates(index_1.default);
9
- template_1.Template.defaultTemplates = index_1.default.bootstrap;
10
- exports.default = template_1.Template;
7
+ const experimental_1 = require("@formio/core/experimental");
8
+ experimental_1.Template.addTemplates(index_1.default);
9
+ experimental_1.Template.defaultTemplates = index_1.default.bootstrap;
10
+ exports.default = experimental_1.Template;