@formio/js 5.0.0-rc.34 → 5.0.0-rc.35
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/fonts/bootstrap-icons.woff +0 -0
- package/dist/fonts/bootstrap-icons.woff2 +0 -0
- package/dist/formio.builder.css +19 -15
- package/dist/formio.builder.min.css +1 -1
- package/dist/formio.embed.js +1 -1
- package/dist/formio.embed.min.js +1 -1
- package/dist/formio.form.css +19 -15
- package/dist/formio.form.js +19 -19
- package/dist/formio.form.min.css +1 -1
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.form.min.js.LICENSE.txt +1 -1
- package/dist/formio.full.css +363 -19
- package/dist/formio.full.js +20 -20
- package/dist/formio.full.min.css +3 -3
- package/dist/formio.full.min.js +1 -1
- package/dist/formio.full.min.js.LICENSE.txt +1 -1
- package/dist/formio.js +8 -8
- package/dist/formio.min.js +1 -1
- package/lib/cjs/CDN.js +12 -6
- package/lib/cjs/Webform.js +4 -1
- package/lib/cjs/Wizard.js +6 -9
- package/lib/cjs/components/_classes/component/Component.js +6 -1
- package/lib/cjs/components/_classes/nested/NestedComponent.js +1 -1
- package/lib/cjs/components/container/fixtures/comp4.js +45 -0
- package/lib/cjs/components/container/fixtures/index.js +3 -1
- package/lib/cjs/components/datetime/DateTime.js +6 -0
- package/lib/cjs/components/file/File.js +465 -215
- package/lib/cjs/components/file/editForm/File.edit.display.js +17 -0
- package/lib/cjs/components/textarea/TextArea.js +2 -2
- package/lib/cjs/components/textfield/TextField.js +3 -1
- package/lib/cjs/components/time/Time.js +3 -0
- package/lib/cjs/providers/storage/azure.js +6 -1
- package/lib/cjs/providers/storage/base64.js +1 -1
- package/lib/cjs/providers/storage/googleDrive.js +5 -1
- package/lib/cjs/providers/storage/indexeddb.js +1 -1
- package/lib/cjs/providers/storage/s3.js +5 -1
- package/lib/cjs/providers/storage/xhr.js +10 -0
- package/lib/mjs/CDN.js +12 -6
- package/lib/mjs/Webform.js +4 -1
- package/lib/mjs/Wizard.js +6 -9
- package/lib/mjs/components/_classes/component/Component.js +6 -1
- package/lib/mjs/components/_classes/nested/NestedComponent.js +1 -1
- package/lib/mjs/components/container/fixtures/comp4.js +43 -0
- package/lib/mjs/components/container/fixtures/index.js +2 -1
- package/lib/mjs/components/datetime/DateTime.js +6 -0
- package/lib/mjs/components/file/File.js +463 -224
- package/lib/mjs/components/file/editForm/File.edit.display.js +17 -0
- package/lib/mjs/components/textarea/TextArea.js +2 -2
- package/lib/mjs/components/textfield/TextField.js +6 -0
- package/lib/mjs/components/time/Time.js +3 -0
- package/lib/mjs/providers/storage/azure.js +6 -1
- package/lib/mjs/providers/storage/base64.js +1 -1
- package/lib/mjs/providers/storage/googleDrive.js +5 -1
- package/lib/mjs/providers/storage/indexeddb.js +1 -1
- package/lib/mjs/providers/storage/s3.js +5 -1
- package/lib/mjs/providers/storage/xhr.js +10 -0
- package/package.json +2 -2
@@ -5,4 +5,21 @@ exports.default = [
|
|
5
5
|
key: 'placeholder',
|
6
6
|
ignore: true
|
7
7
|
},
|
8
|
+
{
|
9
|
+
type: 'checkbox',
|
10
|
+
label: 'Files Synchronization feature',
|
11
|
+
tooltip: 'Enable ability to control files synchronization. Files will be auto synced before submit.',
|
12
|
+
key: 'autoSync',
|
13
|
+
input: true,
|
14
|
+
conditional: {
|
15
|
+
json: {
|
16
|
+
in: [
|
17
|
+
{
|
18
|
+
var: 'data.storage'
|
19
|
+
},
|
20
|
+
['s3', 'azure', 'googledrive']
|
21
|
+
],
|
22
|
+
}
|
23
|
+
}
|
24
|
+
},
|
8
25
|
];
|
@@ -298,10 +298,10 @@ class TextAreaComponent extends TextField_1.default {
|
|
298
298
|
if (this.options.readOnly || this.disabled) {
|
299
299
|
if (this.refs.input && this.refs.input[index]) {
|
300
300
|
if (this.component.inputFormat === 'plain') {
|
301
|
-
this.refs.input[index].innerText = this.interpolate(value, {}, { noeval: true });
|
301
|
+
this.refs.input[index].innerText = this.isPlain ? value : this.interpolate(value, {}, { noeval: true });
|
302
302
|
}
|
303
303
|
else {
|
304
|
-
this.setContent(this.refs.input[index], this.interpolate(value, {}, { noeval: true }), this.shouldSanitizeValue);
|
304
|
+
this.setContent(this.refs.input[index], this.isPlain ? value : this.interpolate(value, {}, { noeval: true }), this.shouldSanitizeValue);
|
305
305
|
}
|
306
306
|
}
|
307
307
|
}
|
@@ -65,7 +65,9 @@ class TextFieldComponent extends Input_1.default {
|
|
65
65
|
return TextFieldComponent.conditionOperatorsSettings;
|
66
66
|
}
|
67
67
|
static get conditionOperatorsSettings() {
|
68
|
-
return Object.assign(Object.assign({}, super.conditionOperatorsSettings), { operators: [...super.conditionOperatorsSettings.operators, 'includes', 'notIncludes', 'endsWith', 'startsWith']
|
68
|
+
return Object.assign(Object.assign({}, super.conditionOperatorsSettings), { operators: [...super.conditionOperatorsSettings.operators, 'includes', 'notIncludes', 'endsWith', 'startsWith'], valueComponent(classComp) {
|
69
|
+
return Object.assign(Object.assign({}, classComp), { type: 'textfield' });
|
70
|
+
} });
|
69
71
|
}
|
70
72
|
static savedValueTypes(schema) {
|
71
73
|
return FormioUtils.getComponentSavedTypes(schema) || [FormioUtils.componentValueTypes.string];
|
@@ -125,6 +125,9 @@ class TimeComponent extends TextField_1.default {
|
|
125
125
|
return view ? (0, moment_1.default)(view, this.component.format).format(this.component.dataFormat) : view;
|
126
126
|
}
|
127
127
|
getValueAsString(value) {
|
128
|
+
if (Array.isArray(value) && this.component.multiple) {
|
129
|
+
return value.map(item => (0, moment_1.default)(item, this.component.dataFormat).format(this.component.format)).join(', ');
|
130
|
+
}
|
128
131
|
return (value ? (0, moment_1.default)(value, this.component.dataFormat).format(this.component.format) : value) || '';
|
129
132
|
}
|
130
133
|
getInputMaskFromFormat(format) {
|
@@ -12,7 +12,7 @@ function azure(formio) {
|
|
12
12
|
xhr.setRequestHeader('Content-Type', file.type);
|
13
13
|
xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');
|
14
14
|
return file;
|
15
|
-
}, file, fileName, dir, progressCallback, groupPermissions, groupId, abortCallback).then(() => {
|
15
|
+
}, file, fileName, dir, progressCallback, groupPermissions, groupId, abortCallback).then((response) => {
|
16
16
|
return {
|
17
17
|
storage: 'azure',
|
18
18
|
name: xhr_1.default.path([dir, fileName]),
|
@@ -20,11 +20,16 @@ function azure(formio) {
|
|
20
20
|
type: file.type,
|
21
21
|
groupPermissions,
|
22
22
|
groupId,
|
23
|
+
key: response.key,
|
23
24
|
};
|
24
25
|
});
|
25
26
|
},
|
26
27
|
downloadFile(file) {
|
27
28
|
return formio.makeRequest('file', `${formio.formUrl}/storage/azure?name=${xhr_1.default.trim(file.name)}`, 'GET');
|
29
|
+
},
|
30
|
+
deleteFile: function deleteFile(fileInfo) {
|
31
|
+
var url = `${formio.formUrl}/storage/azure?name=${xhr_1.default.trim(fileInfo.name)}&key=${xhr_1.default.trim(fileInfo.key)}`;
|
32
|
+
return formio.makeRequest('', url, 'delete');
|
28
33
|
}
|
29
34
|
};
|
30
35
|
}
|
@@ -51,7 +51,11 @@ function googledrive(formio) {
|
|
51
51
|
file.url =
|
52
52
|
`${formio.formUrl}/storage/gdrive?fileId=${file.id}&fileName=${file.originalName}${token ? `&x-jwt-token=${token}` : ''}`;
|
53
53
|
return Promise.resolve(file);
|
54
|
-
}
|
54
|
+
},
|
55
|
+
deleteFile: function deleteFile(fileInfo) {
|
56
|
+
var url = ''.concat(formio.formUrl, `/storage/gdrive?id=${fileInfo.id}&name=${fileInfo.originalName}`);
|
57
|
+
return formio.makeRequest('', url, 'delete');
|
58
|
+
},
|
55
59
|
};
|
56
60
|
}
|
57
61
|
googledrive.title = 'Google Drive';
|
@@ -142,7 +142,11 @@ function s3(formio) {
|
|
142
142
|
else {
|
143
143
|
return Promise.resolve(file);
|
144
144
|
}
|
145
|
-
}
|
145
|
+
},
|
146
|
+
deleteFile(fileInfo) {
|
147
|
+
const url = `${formio.formUrl}/storage/s3?bucket=${xhr_1.default.trim(fileInfo.bucket)}&key=${xhr_1.default.trim(fileInfo.key)}`;
|
148
|
+
return formio.makeRequest('', url, 'delete');
|
149
|
+
},
|
146
150
|
};
|
147
151
|
}
|
148
152
|
s3.title = 'S3';
|
@@ -61,6 +61,11 @@ const XHR = {
|
|
61
61
|
throw err;
|
62
62
|
}
|
63
63
|
if (!response.ok) {
|
64
|
+
if (response.status === 504) {
|
65
|
+
const error = new Error('Network request failed');
|
66
|
+
error.networkError = true;
|
67
|
+
throw error;
|
68
|
+
}
|
64
69
|
const message = yield response.text();
|
65
70
|
throw new Error(message || 'Unable to sign file.');
|
66
71
|
}
|
@@ -104,6 +109,11 @@ const XHR = {
|
|
104
109
|
if (xhr.status >= 200 && xhr.status < 300) {
|
105
110
|
resolve(serverResponse);
|
106
111
|
}
|
112
|
+
else if (xhr.status === 504) {
|
113
|
+
const error = new Error('Network request failed');
|
114
|
+
error.networkError = true;
|
115
|
+
reject(error);
|
116
|
+
}
|
107
117
|
else {
|
108
118
|
reject(xhr.response || 'Unable to upload file');
|
109
119
|
}
|
package/lib/mjs/CDN.js
CHANGED
@@ -56,19 +56,25 @@ class CDN {
|
|
56
56
|
this.updateUrls();
|
57
57
|
}
|
58
58
|
buildUrl(cdnUrl, lib, version) {
|
59
|
-
let url;
|
60
|
-
if (
|
61
|
-
url
|
59
|
+
let url = cdnUrl;
|
60
|
+
if (lib) {
|
61
|
+
url += `/${lib}`;
|
62
62
|
}
|
63
|
-
|
64
|
-
url
|
63
|
+
if (version && version !== 'latest') {
|
64
|
+
url += `/${version}`;
|
65
65
|
}
|
66
66
|
return url;
|
67
67
|
}
|
68
68
|
updateUrls() {
|
69
69
|
for (const lib in this.libs) {
|
70
70
|
if (lib in this.overrides) {
|
71
|
-
|
71
|
+
if (typeof this.overrides[lib] === 'string') {
|
72
|
+
this[lib] = this.buildUrl(this.overrides[lib], lib, this.libs[lib]);
|
73
|
+
}
|
74
|
+
else {
|
75
|
+
const override = this.overrides[lib];
|
76
|
+
this[lib] = this.buildUrl(override.cdn, override.lib || '', override.version || '');
|
77
|
+
}
|
72
78
|
}
|
73
79
|
else {
|
74
80
|
this[lib] = this.buildUrl(this.baseUrl, lib, this.libs[lib]);
|
package/lib/mjs/Webform.js
CHANGED
@@ -778,7 +778,10 @@ export default class Webform extends NestedDataComponent {
|
|
778
778
|
this.component.input = false;
|
779
779
|
this.addComponents();
|
780
780
|
this.on('submitButton', options => {
|
781
|
-
this.submit(false, options).catch(e =>
|
781
|
+
this.submit(false, options).catch(e => {
|
782
|
+
options.instance.loading = false;
|
783
|
+
return e !== false && e !== undefined && console.log(e);
|
784
|
+
});
|
782
785
|
}, true);
|
783
786
|
this.on('checkValidity', (data) => this.validate(data, { dirty: true, process: 'change' }), true);
|
784
787
|
this.on('requestUrl', (args) => (this.submitUrl(args.url, args.headers)), true);
|
package/lib/mjs/Wizard.js
CHANGED
@@ -777,21 +777,18 @@ export default class Wizard extends Webform {
|
|
777
777
|
}
|
778
778
|
}
|
779
779
|
setValue(submission, flags = {}, ignoreEstablishment) {
|
780
|
-
this._submission = submission;
|
781
|
-
if ((flags && flags.fromSubmission && (this.options.readOnly || this.editMode) && !this.isHtmlRenderMode()) ||
|
782
|
-
(flags && flags.fromSubmission && (this.prefixComps.length || this.suffixComps.length) && submission._id) ||
|
783
|
-
(this.options.server && (this.prefixComps.length || this.suffixComps.length))) {
|
784
|
-
this._data = submission.data;
|
785
|
-
}
|
786
|
-
if (!ignoreEstablishment) {
|
787
|
-
this.establishPages(submission.data);
|
788
|
-
}
|
789
780
|
const changed = this.getPages({ all: true }).reduce((changed, page) => {
|
790
781
|
return this.setNestedValue(page, submission.data, flags, changed) || changed;
|
791
782
|
}, false);
|
783
|
+
this.mergeData(this.data, submission.data);
|
792
784
|
if (changed) {
|
793
785
|
this.pageFieldLogic(this.page);
|
794
786
|
}
|
787
|
+
submission.data = this.data;
|
788
|
+
this._submission = submission;
|
789
|
+
if (!ignoreEstablishment) {
|
790
|
+
this.establishPages(submission.data);
|
791
|
+
}
|
795
792
|
this.setEditMode(submission);
|
796
793
|
return changed;
|
797
794
|
}
|
@@ -173,7 +173,12 @@ export default class Component extends Element {
|
|
173
173
|
return {
|
174
174
|
operators: ['isEqual', 'isNotEqual', 'isEmpty', 'isNotEmpty'],
|
175
175
|
valueComponent() {
|
176
|
-
return {
|
176
|
+
return {
|
177
|
+
type: 'textfield',
|
178
|
+
widget: {
|
179
|
+
type: 'input'
|
180
|
+
}
|
181
|
+
};
|
177
182
|
}
|
178
183
|
};
|
179
184
|
}
|
@@ -520,7 +520,7 @@ export default class NestedComponent extends Field {
|
|
520
520
|
clearOnHide(show) {
|
521
521
|
super.clearOnHide(show);
|
522
522
|
if (this.component.clearOnHide) {
|
523
|
-
if (this.allowData && !this.hasValue()) {
|
523
|
+
if (this.allowData && !this.hasValue() && !(this.options.server && !this.visible)) {
|
524
524
|
this.dataValue = this.defaultValue;
|
525
525
|
}
|
526
526
|
if (this.hasValue()) {
|
@@ -0,0 +1,43 @@
|
|
1
|
+
export default {
|
2
|
+
type: 'form',
|
3
|
+
display: 'form',
|
4
|
+
components: [
|
5
|
+
{
|
6
|
+
label: 'Checkbox',
|
7
|
+
tableView: false,
|
8
|
+
key: 'checkbox',
|
9
|
+
type: 'checkbox',
|
10
|
+
input: true,
|
11
|
+
},
|
12
|
+
{
|
13
|
+
label: 'Container',
|
14
|
+
tableView: false,
|
15
|
+
key: 'container',
|
16
|
+
conditional: {
|
17
|
+
show: true,
|
18
|
+
when: 'checkbox',
|
19
|
+
eq: 'true',
|
20
|
+
},
|
21
|
+
type: 'container',
|
22
|
+
input: true,
|
23
|
+
components: [
|
24
|
+
{
|
25
|
+
label: 'Text Field',
|
26
|
+
applyMaskOn: 'change',
|
27
|
+
tableView: true,
|
28
|
+
key: 'textField',
|
29
|
+
type: 'textfield',
|
30
|
+
input: true,
|
31
|
+
},
|
32
|
+
],
|
33
|
+
},
|
34
|
+
{
|
35
|
+
type: 'button',
|
36
|
+
label: 'Submit',
|
37
|
+
key: 'submit',
|
38
|
+
disableOnInvalid: true,
|
39
|
+
input: true,
|
40
|
+
tableView: false,
|
41
|
+
},
|
42
|
+
],
|
43
|
+
};
|
@@ -178,8 +178,14 @@ export default class DateTimeComponent extends Input {
|
|
178
178
|
format += format.match(/z$/) ? '' : ' z';
|
179
179
|
const timezone = this.timezone;
|
180
180
|
if (value && !this.attached && timezone) {
|
181
|
+
if (Array.isArray(value) && this.component.multiple) {
|
182
|
+
return value.map(item => _.trim(FormioUtils.momentDate(item, format, timezone).format(format))).join(', ');
|
183
|
+
}
|
181
184
|
return _.trim(FormioUtils.momentDate(value, format, timezone).format(format));
|
182
185
|
}
|
186
|
+
if (Array.isArray(value) && this.component.multiple) {
|
187
|
+
return value.map(item => _.trim(moment(item).format(format))).join(', ');
|
188
|
+
}
|
183
189
|
return (value ? _.trim(moment(value).format(format)) : value) || '';
|
184
190
|
}
|
185
191
|
}
|