@formio/js 5.1.0-dev.6040.debc859 → 5.1.0-dev.6042.6e62a7a

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 (150) hide show
  1. package/Changelog.md +140 -6
  2. package/dist/formio.form.js +591 -580
  3. package/dist/formio.form.min.js +1 -1
  4. package/dist/formio.full.js +613 -602
  5. package/dist/formio.full.min.js +1 -1
  6. package/dist/formio.js +47 -14
  7. package/dist/formio.min.js +1 -1
  8. package/dist/formio.utils.js +48 -15
  9. package/dist/formio.utils.min.js +1 -1
  10. package/lib/cjs/Element.d.ts +2 -1
  11. package/lib/cjs/Element.js +6 -4
  12. package/lib/cjs/Webform.d.ts +2 -2
  13. package/lib/cjs/Webform.js +9 -9
  14. package/lib/cjs/WebformBuilder.js +5 -1
  15. package/lib/cjs/Wizard.d.ts +1 -0
  16. package/lib/cjs/Wizard.js +23 -3
  17. package/lib/cjs/components/_classes/component/Component.d.ts +50 -15
  18. package/lib/cjs/components/_classes/component/Component.js +153 -69
  19. package/lib/cjs/components/_classes/component/editForm/Component.edit.data.js +19 -0
  20. package/lib/cjs/components/_classes/component/editForm/utils.js +1 -1
  21. package/lib/cjs/components/_classes/list/ListComponent.js +2 -2
  22. package/lib/cjs/components/_classes/nested/NestedComponent.d.ts +0 -1
  23. package/lib/cjs/components/_classes/nested/NestedComponent.form.js +13 -0
  24. package/lib/cjs/components/_classes/nested/NestedComponent.js +10 -18
  25. package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.d.ts +0 -2
  26. package/lib/cjs/components/_classes/nesteddata/NestedDataComponent.js +0 -11
  27. package/lib/cjs/components/address/Address.d.ts +9 -0
  28. package/lib/cjs/components/address/Address.js +31 -8
  29. package/lib/cjs/components/address/editForm/Address.edit.display.d.ts +4 -0
  30. package/lib/cjs/components/address/editForm/Address.edit.display.js +1 -0
  31. package/lib/cjs/components/address/editForm/Address.edit.provider.js +8 -8
  32. package/lib/cjs/components/content/editForm/Content.edit.display.js +8 -0
  33. package/lib/cjs/components/currency/editForm/Currency.edit.display.js +12 -0
  34. package/lib/cjs/components/datagrid/DataGrid.js +0 -3
  35. package/lib/cjs/components/datamap/DataMap.js +2 -6
  36. package/lib/cjs/components/datetime/editForm/DateTime.edit.validation.d.ts +66 -15
  37. package/lib/cjs/components/datetime/editForm/DateTime.edit.validation.js +68 -47
  38. package/lib/cjs/components/day/editForm/Day.edit.display.js +8 -0
  39. package/lib/cjs/components/editgrid/EditGrid.js +3 -13
  40. package/lib/cjs/components/email/editForm/Email.edit.display.js +12 -0
  41. package/lib/cjs/components/fieldset/editForm/Fieldset.edit.display.js +8 -0
  42. package/lib/cjs/components/file/File.js +7 -2
  43. package/lib/cjs/components/file/editForm/File.edit.file.d.ts +13 -0
  44. package/lib/cjs/components/file/editForm/File.edit.file.js +1 -0
  45. package/lib/cjs/components/form/Form.d.ts +0 -1
  46. package/lib/cjs/components/form/Form.js +18 -22
  47. package/lib/cjs/components/hidden/editForm/Hidden.edit.display.js +8 -0
  48. package/lib/cjs/components/html/HTML.js +1 -2
  49. package/lib/cjs/components/html/editForm/HTML.edit.display.js +8 -0
  50. package/lib/cjs/components/number/editForm/Number.edit.display.js +12 -0
  51. package/lib/cjs/components/password/editForm/Password.edit.display.js +13 -1
  52. package/lib/cjs/components/phonenumber/PhoneNumber.form.js +9 -1
  53. package/lib/cjs/components/radio/Radio.js +1 -1
  54. package/lib/cjs/components/select/Select.js +1 -1
  55. package/lib/cjs/components/select/editForm/Select.edit.data.d.ts +68 -110
  56. package/lib/cjs/components/select/editForm/Select.edit.data.js +2 -37
  57. package/lib/cjs/components/selectboxes/SelectBoxes.js +3 -0
  58. package/lib/cjs/components/survey/Survey.js +1 -1
  59. package/lib/cjs/components/tabs/Tabs.js +1 -0
  60. package/lib/cjs/components/tabs/editForm/Tabs.edit.display.js +8 -0
  61. package/lib/cjs/components/textarea/TextArea.js +9 -1
  62. package/lib/cjs/components/textarea/editForm/TextArea.edit.display.js +12 -0
  63. package/lib/cjs/components/textfield/TextField.js +2 -2
  64. package/lib/cjs/components/unknown/Unknown.form.d.ts +2 -1
  65. package/lib/cjs/components/unknown/Unknown.form.js +13 -9
  66. package/lib/cjs/components/url/editForm/Url.edit.display.js +12 -0
  67. package/lib/cjs/components/well/editForm/Well.edit.display.js +8 -0
  68. package/lib/cjs/formio.form.js +2 -2
  69. package/lib/cjs/providers/storage/uploadAdapter.js +5 -3
  70. package/lib/cjs/translations/en.d.ts +1 -234
  71. package/lib/cjs/translations/en.js +4 -2
  72. package/lib/cjs/utils/formUtils.d.ts +2 -2
  73. package/lib/cjs/utils/utils.d.ts +9 -8
  74. package/lib/cjs/utils/utils.js +18 -23
  75. package/lib/cjs/widgets/CalendarWidget.js +6 -1
  76. package/lib/mjs/Element.d.ts +2 -1
  77. package/lib/mjs/Element.js +6 -4
  78. package/lib/mjs/Webform.d.ts +2 -2
  79. package/lib/mjs/Webform.js +9 -9
  80. package/lib/mjs/WebformBuilder.js +5 -1
  81. package/lib/mjs/Wizard.d.ts +1 -0
  82. package/lib/mjs/Wizard.js +22 -2
  83. package/lib/mjs/components/_classes/component/Component.d.ts +50 -15
  84. package/lib/mjs/components/_classes/component/Component.js +154 -70
  85. package/lib/mjs/components/_classes/component/editForm/Component.edit.data.js +19 -0
  86. package/lib/mjs/components/_classes/component/editForm/utils.js +1 -1
  87. package/lib/mjs/components/_classes/list/ListComponent.js +2 -2
  88. package/lib/mjs/components/_classes/nested/NestedComponent.d.ts +0 -1
  89. package/lib/mjs/components/_classes/nested/NestedComponent.form.js +13 -0
  90. package/lib/mjs/components/_classes/nested/NestedComponent.js +10 -18
  91. package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.d.ts +0 -2
  92. package/lib/mjs/components/_classes/nesteddata/NestedDataComponent.js +0 -11
  93. package/lib/mjs/components/address/Address.d.ts +9 -0
  94. package/lib/mjs/components/address/Address.js +31 -8
  95. package/lib/mjs/components/address/editForm/Address.edit.display.d.ts +4 -0
  96. package/lib/mjs/components/address/editForm/Address.edit.display.js +1 -0
  97. package/lib/mjs/components/address/editForm/Address.edit.provider.js +8 -8
  98. package/lib/mjs/components/content/editForm/Content.edit.display.js +8 -0
  99. package/lib/mjs/components/currency/editForm/Currency.edit.display.js +12 -0
  100. package/lib/mjs/components/datagrid/DataGrid.js +0 -3
  101. package/lib/mjs/components/datamap/DataMap.js +2 -6
  102. package/lib/mjs/components/datetime/editForm/DateTime.edit.validation.d.ts +66 -15
  103. package/lib/mjs/components/datetime/editForm/DateTime.edit.validation.js +68 -47
  104. package/lib/mjs/components/day/editForm/Day.edit.display.js +8 -0
  105. package/lib/mjs/components/editgrid/EditGrid.js +3 -12
  106. package/lib/mjs/components/email/editForm/Email.edit.display.js +12 -0
  107. package/lib/mjs/components/fieldset/editForm/Fieldset.edit.display.js +8 -0
  108. package/lib/mjs/components/file/File.js +7 -2
  109. package/lib/mjs/components/file/editForm/File.edit.file.d.ts +13 -0
  110. package/lib/mjs/components/file/editForm/File.edit.file.js +1 -0
  111. package/lib/mjs/components/form/Form.d.ts +0 -1
  112. package/lib/mjs/components/form/Form.js +18 -22
  113. package/lib/mjs/components/hidden/editForm/Hidden.edit.display.js +8 -0
  114. package/lib/mjs/components/html/HTML.js +1 -2
  115. package/lib/mjs/components/html/editForm/HTML.edit.display.js +8 -0
  116. package/lib/mjs/components/number/editForm/Number.edit.display.js +12 -0
  117. package/lib/mjs/components/password/editForm/Password.edit.display.js +13 -1
  118. package/lib/mjs/components/phonenumber/PhoneNumber.form.js +9 -1
  119. package/lib/mjs/components/radio/Radio.js +1 -1
  120. package/lib/mjs/components/select/Select.js +1 -1
  121. package/lib/mjs/components/select/editForm/Select.edit.data.d.ts +68 -110
  122. package/lib/mjs/components/select/editForm/Select.edit.data.js +2 -37
  123. package/lib/mjs/components/selectboxes/SelectBoxes.js +3 -0
  124. package/lib/mjs/components/survey/Survey.js +1 -1
  125. package/lib/mjs/components/tabs/Tabs.js +1 -0
  126. package/lib/mjs/components/tabs/editForm/Tabs.edit.display.js +8 -0
  127. package/lib/mjs/components/textarea/TextArea.js +9 -1
  128. package/lib/mjs/components/textarea/editForm/TextArea.edit.display.js +12 -0
  129. package/lib/mjs/components/textfield/TextField.js +2 -2
  130. package/lib/mjs/components/unknown/Unknown.form.d.ts +2 -1
  131. package/lib/mjs/components/unknown/Unknown.form.js +13 -9
  132. package/lib/mjs/components/url/editForm/Url.edit.display.js +12 -0
  133. package/lib/mjs/components/well/editForm/Well.edit.display.js +8 -0
  134. package/lib/mjs/formio.form.js +1 -1
  135. package/lib/mjs/providers/storage/uploadAdapter.js +5 -3
  136. package/lib/mjs/translations/en.d.ts +1 -234
  137. package/lib/mjs/translations/en.js +5 -47
  138. package/lib/mjs/utils/formUtils.d.ts +2 -2
  139. package/lib/mjs/utils/utils.d.ts +9 -8
  140. package/lib/mjs/utils/utils.js +16 -21
  141. package/lib/mjs/widgets/CalendarWidget.js +7 -2
  142. package/package.json +2 -2
  143. package/lib/cjs/i18n.d.ts +0 -13
  144. package/lib/cjs/i18n.js +0 -19
  145. package/lib/cjs/utils/i18n.d.ts +0 -19
  146. package/lib/cjs/utils/i18n.js +0 -120
  147. package/lib/mjs/i18n.d.ts +0 -13
  148. package/lib/mjs/i18n.js +0 -14
  149. package/lib/mjs/utils/i18n.d.ts +0 -19
  150. package/lib/mjs/utils/i18n.js +0 -112
@@ -20,7 +20,6 @@ export default class AddressComponent extends ContainerComponent {
20
20
  key: 'address',
21
21
  switchToManualModeLabel: 'Can\'t find address? Switch to manual mode.',
22
22
  provider: '',
23
- providerOptions: {},
24
23
  manualModeViewString: '',
25
24
  hideLabel: false,
26
25
  disableClearIcon: false,
@@ -113,20 +112,33 @@ export default class AddressComponent extends ContainerComponent {
113
112
  NestedComponent.prototype.addComponents.call(this, this.manualMode ? this.address : {});
114
113
  }
115
114
  Field.prototype.init.call(this);
115
+ // Added for backwards compatibility
116
+ if (this.component.providerOptions) {
117
+ const { params, url, queryProperty, responseProperty, displayValueProperty } = this.component.providerOptions;
118
+ const key = params?.key;
119
+ const autocompleteOptions = params?.autocompleteOptions;
120
+ delete this.component.providerOptions;
121
+ this.component.url = url;
122
+ this.component.queryProperty = queryProperty;
123
+ this.component.responseProperty = responseProperty;
124
+ this.component.displayValueProperty = displayValueProperty;
125
+ this.component.apiKey = key;
126
+ this.component.autocompleteOptions = autocompleteOptions;
127
+ }
128
+ let provider = this.component.provider;
129
+ const providerOptions = this.providerOptions;
130
+ const map = this.component.map;
116
131
  if (!this.builderMode) {
117
- if (this.component.provider) {
118
- const { provider, providerOptions, } = this.component;
132
+ if (provider) {
119
133
  if (_.get(providerOptions, 'params.subscriptionKey')) {
120
134
  _.set(providerOptions, "params['subscription-key']", _.get(providerOptions, 'params.subscriptionKey'));
121
135
  _.unset(providerOptions, 'params.subscriptionKey');
122
136
  }
123
137
  this.provider = this.initializeProvider(provider, providerOptions);
124
138
  }
125
- else if (this.component.map) {
139
+ else if (map) {
126
140
  // Fallback to legacy version where Google Maps was the only provider.
127
- this.component.provider = GoogleAddressProvider.name;
128
- this.component.providerOptions = this.component.providerOptions || {};
129
- const { map, provider, providerOptions, } = this.component;
141
+ provider = this.component.provider = GoogleAddressProvider.name;
130
142
  const { key, region, } = map;
131
143
  if (key) {
132
144
  _.set(providerOptions, 'params.key', key);
@@ -258,6 +270,16 @@ export default class AddressComponent extends ContainerComponent {
258
270
  ? (this.refs[AddressComponent.modeSwitcherRef] || null)
259
271
  : null;
260
272
  }
273
+ get providerOptions() {
274
+ return {
275
+ params: { subscriptionKey: this.component.subscriptionKey, key: this.component.apiKey, ...this.component.params },
276
+ url: this.component.url,
277
+ queryProperty: this.component.queryProperty,
278
+ responseProperty: this.component.responseProperty,
279
+ displayValueProperty: this.component.displayValueProperty,
280
+ autocompleteOptions: this.component.autocompleteOptions
281
+ };
282
+ }
261
283
  get removeValueIcon() {
262
284
  return this.refs
263
285
  ? (this.refs[AddressComponent.removeValueIconRef] || null)
@@ -371,7 +393,8 @@ export default class AddressComponent extends ContainerComponent {
371
393
  const result = ((this.builderMode || this.manualMode) ? super.attach : Field.prototype.attach).call(this, element);
372
394
  if (!this.builderMode) {
373
395
  if (!this.provider && this.component.provider) {
374
- const { provider, providerOptions, } = this.component;
396
+ const provider = this.component.provider;
397
+ const providerOptions = this.providerOptions;
375
398
  this.provider = this.initializeProvider(provider, providerOptions);
376
399
  }
377
400
  }
@@ -8,6 +8,7 @@ declare const _default: ({
8
8
  customConditional: ({ data }: {
9
9
  data: any;
10
10
  }) => boolean;
11
+ defaultValue?: undefined;
11
12
  placeholder?: undefined;
12
13
  validate?: undefined;
13
14
  } | {
@@ -15,6 +16,7 @@ declare const _default: ({
15
16
  type: string;
16
17
  input: boolean;
17
18
  key: string;
19
+ defaultValue: string;
18
20
  label: string;
19
21
  placeholder: string;
20
22
  tooltip: string;
@@ -32,6 +34,7 @@ declare const _default: ({
32
34
  label: string;
33
35
  tooltip: string;
34
36
  customConditional?: undefined;
37
+ defaultValue?: undefined;
35
38
  placeholder?: undefined;
36
39
  validate?: undefined;
37
40
  } | {
@@ -45,6 +48,7 @@ declare const _default: ({
45
48
  customConditional: ({ data }: {
46
49
  data: any;
47
50
  }) => any;
51
+ defaultValue?: undefined;
48
52
  validate?: undefined;
49
53
  })[];
50
54
  export default _default;
@@ -13,6 +13,7 @@ export default [
13
13
  type: 'textfield',
14
14
  input: true,
15
15
  key: 'switchToManualModeLabel',
16
+ defaultValue: 'Can\'t find address? Switch to manual mode.',
16
17
  label: 'Switch To Manual Mode Label',
17
18
  placeholder: 'Switch To Manual Mode Label',
18
19
  tooltip: 'The label for the checkbox used to switch to manual mode.',
@@ -26,7 +26,7 @@ export default [
26
26
  {
27
27
  type: 'textfield',
28
28
  input: true,
29
- key: "providerOptions.params.subscriptionKey",
29
+ key: "subscriptionKey",
30
30
  label: 'Subscription Key',
31
31
  placeholder: 'Enter Subscription Key',
32
32
  weight: 10,
@@ -41,7 +41,7 @@ export default [
41
41
  {
42
42
  type: 'textfield',
43
43
  input: true,
44
- key: 'providerOptions.url',
44
+ key: 'url',
45
45
  label: 'Url',
46
46
  placeholder: 'Enter Url',
47
47
  weight: 10,
@@ -56,7 +56,7 @@ export default [
56
56
  {
57
57
  type: 'textfield',
58
58
  input: true,
59
- key: 'providerOptions.queryProperty',
59
+ key: 'queryProperty',
60
60
  label: 'Query Property',
61
61
  defaultValue: 'query',
62
62
  placeholder: 'Enter Query Property',
@@ -69,7 +69,7 @@ export default [
69
69
  {
70
70
  type: 'textfield',
71
71
  input: true,
72
- key: 'providerOptions.responseProperty',
72
+ key: 'responseProperty',
73
73
  label: 'Response Property',
74
74
  placeholder: 'Enter Response Property',
75
75
  weight: 30,
@@ -81,7 +81,7 @@ export default [
81
81
  {
82
82
  type: 'textfield',
83
83
  input: true,
84
- key: 'providerOptions.displayValueProperty',
84
+ key: 'displayValueProperty',
85
85
  label: 'Display Value Property',
86
86
  placeholder: 'Display Value Property',
87
87
  weight: 40,
@@ -93,7 +93,7 @@ export default [
93
93
  {
94
94
  type: 'textarea',
95
95
  input: true,
96
- key: 'providerOptions.params',
96
+ key: 'params',
97
97
  label: 'Params',
98
98
  placeholder: '{ ... }',
99
99
  weight: 50,
@@ -108,7 +108,7 @@ export default [
108
108
  {
109
109
  type: 'textfield',
110
110
  input: true,
111
- key: 'providerOptions.params.key',
111
+ key: 'apiKey',
112
112
  label: 'API Key',
113
113
  placeholder: 'Enter API Key',
114
114
  weight: 10,
@@ -123,7 +123,7 @@ export default [
123
123
  {
124
124
  type: 'textarea',
125
125
  input: true,
126
- key: 'providerOptions.params.autocompleteOptions',
126
+ key: 'autocompleteOptions',
127
127
  label: 'Provider options',
128
128
  placeholder: 'Enter provider options as JSON object',
129
129
  defaultValue: {},
@@ -3,6 +3,14 @@ export default [
3
3
  key: 'labelPosition',
4
4
  ignore: true
5
5
  },
6
+ {
7
+ key: 'labelWidth',
8
+ ignore: true
9
+ },
10
+ {
11
+ key: 'labelMargin',
12
+ ignore: true
13
+ },
6
14
  {
7
15
  key: 'placeholder',
8
16
  ignore: true
@@ -7,6 +7,18 @@ export default [
7
7
  key: 'allowMultipleMasks',
8
8
  ignore: true
9
9
  },
10
+ {
11
+ key: 'inputMasks',
12
+ ignore: true
13
+ },
14
+ {
15
+ key: 'widget.type',
16
+ ignore: true
17
+ },
18
+ {
19
+ key: 'widget',
20
+ ignore: true
21
+ },
10
22
  {
11
23
  key: 'showWordCount',
12
24
  ignore: true
@@ -609,9 +609,6 @@ export default class DataGridComponent extends NestedArrayComponent {
609
609
  this.updateOnChange(flags, changed);
610
610
  return changed;
611
611
  }
612
- restoreComponentsContext() {
613
- this.rows.forEach((row, index) => _.forIn(row, (component) => component.data = this.dataValue[index]));
614
- }
615
612
  toggleGroup(element, index) {
616
613
  element.classList.toggle('collapsed');
617
614
  _.each(this.refs.chunks[index], row => {
@@ -68,14 +68,10 @@ export default class DataMapComponent extends DataGridComponent {
68
68
  return {};
69
69
  }
70
70
  get dataValue() {
71
- if (!this.key ||
72
- (this.conditionallyHidden && this.component.clearOnHide)) {
71
+ if (!this.key) {
73
72
  return this.emptyValue;
74
73
  }
75
- if (!this.hasValue() && this.shouldAddDefaultValue) {
76
- this.dataValue = this.emptyValue;
77
- }
78
- return _.get(this.data, this.key);
74
+ return _.get(this.data, this.key, this.emptyValue);
79
75
  }
80
76
  set dataValue(value) {
81
77
  super.dataValue = value;
@@ -6,36 +6,87 @@ declare const _default: ({
6
6
  persistent: boolean;
7
7
  weight: number;
8
8
  tooltip: string;
9
+ applyMaskOn?: undefined;
10
+ logic?: undefined;
9
11
  skipMerge?: undefined;
10
- customConditional?: undefined;
12
+ tableView?: undefined;
13
+ validateWhenHidden?: undefined;
11
14
  enableTime?: undefined;
12
15
  } | {
16
+ label: string;
17
+ tooltip: string;
18
+ applyMaskOn: string;
19
+ key: string;
20
+ logic: ({
21
+ name: string;
22
+ trigger: {
23
+ type: string;
24
+ javascript: string;
25
+ event?: undefined;
26
+ };
27
+ actions: {
28
+ name: string;
29
+ type: string;
30
+ schemaDefinition: string;
31
+ }[];
32
+ } | {
33
+ name: string;
34
+ trigger: {
35
+ type: string;
36
+ event: string;
37
+ javascript?: undefined;
38
+ };
39
+ actions: {
40
+ name: string;
41
+ type: string;
42
+ customAction: string;
43
+ }[];
44
+ })[];
13
45
  type: string;
14
46
  input: boolean;
15
- key: string;
16
- label: string;
17
47
  skipMerge: boolean;
18
48
  weight: number;
19
- tooltip: string;
20
- customConditional({ data, component }: {
21
- data: any;
22
- component: any;
23
- }): boolean;
24
49
  persistent?: undefined;
50
+ tableView?: undefined;
51
+ validateWhenHidden?: undefined;
25
52
  enableTime?: undefined;
26
53
  } | {
54
+ label: string;
55
+ tooltip: string;
56
+ applyMaskOn: string;
57
+ tableView: boolean;
58
+ validateWhenHidden: boolean;
59
+ key: string;
60
+ logic: ({
61
+ name: string;
62
+ trigger: {
63
+ type: string;
64
+ javascript: string;
65
+ event?: undefined;
66
+ };
67
+ actions: {
68
+ name: string;
69
+ type: string;
70
+ schemaDefinition: string;
71
+ }[];
72
+ } | {
73
+ name: string;
74
+ trigger: {
75
+ type: string;
76
+ event: string;
77
+ javascript?: undefined;
78
+ };
79
+ actions: {
80
+ name: string;
81
+ type: string;
82
+ customAction: string;
83
+ }[];
84
+ })[];
27
85
  type: string;
28
86
  input: boolean;
29
87
  enableTime: boolean;
30
- key: string;
31
88
  skipMerge: boolean;
32
- label: string;
33
89
  weight: number;
34
- tooltip: string;
35
- customConditional({ data, component }: {
36
- data: any;
37
- component: any;
38
- }): any;
39
90
  persistent?: undefined;
40
91
  })[];
41
92
  export default _default;
@@ -9,35 +9,44 @@ export default [
9
9
  tooltip: 'Enables to use input for moment functions instead of calendar.'
10
10
  },
11
11
  {
12
- type: 'datetime',
13
- input: true,
12
+ label: 'Minimum Date',
13
+ tooltip: "The minimum date that can be picked. You can also use Moment.js functions. For example: moment().subtract(10, 'days')",
14
+ applyMaskOn: 'change',
14
15
  key: 'datePicker.minDate',
15
- label: 'Use calendar to set minDate',
16
- skipMerge: true,
17
- weight: 10,
18
- tooltip: 'Enables to use calendar to set date.',
19
- customConditional({ data, component }) {
20
- if (component.datePicker && component.datePicker.minDate && component.datePicker.minDate.indexOf('moment') !== -1) {
21
- return false;
22
- }
23
- return !data.enableMinDateInput;
24
- },
25
- },
26
- {
16
+ logic: [
17
+ {
18
+ name: 'check input mode',
19
+ trigger: {
20
+ type: 'javascript',
21
+ javascript: "if (component.datePicker && component.datePicker.minDate && component.datePicker.minDate.indexOf('moment') !== -1) {\r\n result = false;\r\n}\r\nelse {\r\n result = !data.enableMinDateInput;\r\n}",
22
+ },
23
+ actions: [
24
+ {
25
+ name: 'change component',
26
+ type: 'mergeComponentSchema',
27
+ schemaDefinition: "schema = {\n type: 'datetime',\n label: 'Use calendar to set minDate',\n enableDate: true,\n enableTime: true,\n tooltip: 'Enables to use calendar to set date.',\n widget: {\n type: 'calendar',\n displayInTimezone: 'viewer',\n locale: 'en',\n useLocaleSettings: false,\n allowInput: true,\n mode: 'single',\n enableTime: true,\n noCalendar: false,\n format: 'yyyy-MM-dd hh:mm a',\n hourIncrement: 1,\n minuteIncrement: 1,\n time_24hr: false,\n disableWeekends: false,\n disableWeekdays: false,\n maxDate: null,\n },\n};",
28
+ },
29
+ ],
30
+ },
31
+ {
32
+ name: 'clear value',
33
+ trigger: {
34
+ type: 'event',
35
+ event: 'componentChange',
36
+ },
37
+ actions: [
38
+ {
39
+ name: 'reset value',
40
+ type: 'customAction',
41
+ customAction: "var isDateInput = instance.component?.type === 'datetime';\nvar enableInput = data.enableMinDateInput;\nvar allowReset = result[0].component && result[0].component.key === 'enableMinDateInput' && !result[0].flags?.fromSubmission;\nif(((enableInput && isDateInput) || (!enableInput && !isDateInput)) && allowReset) {\n instance.resetValue()\n}\n",
42
+ },
43
+ ],
44
+ },
45
+ ],
27
46
  type: 'textfield',
28
47
  input: true,
29
- enableTime: false,
30
- key: 'datePicker.minDate',
31
48
  skipMerge: true,
32
- label: 'Minimum Date',
33
49
  weight: 10,
34
- tooltip: 'The minimum date that can be picked. You can also use Moment.js functions. For example: \n \n moment().subtract(10, \'days\')',
35
- customConditional({ data, component }) {
36
- if (component.datePicker && component.datePicker.minDate && component.datePicker.minDate.indexOf('moment') !== -1) {
37
- return true;
38
- }
39
- return data.enableMinDateInput;
40
- },
41
50
  },
42
51
  {
43
52
  type: 'checkbox',
@@ -49,34 +58,46 @@ export default [
49
58
  tooltip: 'Enables to use input for moment functions instead of calendar.'
50
59
  },
51
60
  {
52
- type: 'datetime',
53
- input: true,
61
+ label: 'Maximum Date',
62
+ tooltip: "The maximum date that can be picked. You can also use Moment.js functions. For example: moment().add(10, 'days')",
63
+ applyMaskOn: 'change',
64
+ tableView: true,
65
+ validateWhenHidden: false,
54
66
  key: 'datePicker.maxDate',
55
- skipMerge: true,
56
- label: 'Use calendar to set maxDate',
57
- weight: 20,
58
- tooltip: 'Enables to use calendar to set date.',
59
- customConditional({ data, component }) {
60
- if (component.datePicker && component.datePicker.maxDate && component.datePicker.maxDate.indexOf('moment') !== -1) {
61
- return false;
62
- }
63
- return !data.enableMaxDateInput;
64
- },
65
- },
66
- {
67
+ logic: [
68
+ {
69
+ name: 'check input mode',
70
+ trigger: {
71
+ type: 'javascript',
72
+ javascript: "if (component.datePicker && component.datePicker.maxDate && component.datePicker.maxDate.indexOf('moment') !== -1) {\r\n result = false;\r\n}\r\nelse {\r\n result = !data.enableMaxDateInput;\r\n}",
73
+ },
74
+ actions: [
75
+ {
76
+ name: 'change component',
77
+ type: 'mergeComponentSchema',
78
+ schemaDefinition: "schema = {\n type: 'datetime',\n label: 'Use calendar to set maxDate',\n enableDate: true,\n enableTime: true,\n tooltip: 'Enables to use calendar to set date.',\n widget: {\n type: 'calendar',\n displayInTimezone: 'viewer',\n locale: 'en',\n useLocaleSettings: false,\n allowInput: true,\n mode: 'single',\n enableTime: true,\n noCalendar: false,\n format: 'yyyy-MM-dd hh:mm a',\n hourIncrement: 1,\n minuteIncrement: 1,\n time_24hr: false,\n disableWeekends: false,\n disableWeekdays: false,\n maxDate: null,\n },\n};",
79
+ },
80
+ ],
81
+ },
82
+ {
83
+ name: 'clear value',
84
+ trigger: {
85
+ type: 'event',
86
+ event: 'componentChange',
87
+ },
88
+ actions: [
89
+ {
90
+ name: 'reset value',
91
+ type: 'customAction',
92
+ customAction: "var isDateInput = instance.component?.type === 'datetime';\nvar enableInput = data.enableMaxDateInput;\nvar allowReset = result[0].component && result[0].component.key === 'enableMaxDateInput' && !result[0].flags?.fromSubmission;\nif(((enableInput && isDateInput) || (!enableInput && !isDateInput)) && allowReset) {\n instance.resetValue()\n}\n",
93
+ },
94
+ ],
95
+ },
96
+ ],
67
97
  type: 'textfield',
68
98
  input: true,
69
99
  enableTime: false,
70
- key: 'datePicker.maxDate',
71
100
  skipMerge: true,
72
- label: 'Maximum Date',
73
- tooltip: 'The maximum date that can be picked. You can also use Moment.js functions. For example: \n \n moment().add(10, \'days\')',
74
101
  weight: 20,
75
- customConditional({ data, component }) {
76
- if (component.datePicker && component.datePicker.maxDate && component.datePicker.maxDate.indexOf('moment') !== -1) {
77
- return true;
78
- }
79
- return data.enableMaxDateInput;
80
- },
81
102
  }
82
103
  ];
@@ -3,6 +3,14 @@ export default [
3
3
  key: 'labelPosition',
4
4
  ignore: true
5
5
  },
6
+ {
7
+ key: 'labelWidth',
8
+ ignore: true
9
+ },
10
+ {
11
+ key: 'labelMargin',
12
+ ignore: true
13
+ },
6
14
  {
7
15
  weight: 15,
8
16
  type: 'checkbox',
@@ -546,13 +546,6 @@ export default class EditGridComponent extends NestedArrayComponent {
546
546
  }
547
547
  });
548
548
  }
549
- restoreComponentsContext() {
550
- this.getComponents().forEach((component) => {
551
- const rowData = this.dataValue[component.rowIndex];
552
- const editRowData = this.editRows[component.rowIndex]?.data;
553
- component.data = rowData || editRowData;
554
- });
555
- }
556
549
  flattenComponents(rowIndex) {
557
550
  const result = {};
558
551
  this.everyComponent((component) => {
@@ -1106,7 +1099,9 @@ export default class EditGridComponent extends NestedArrayComponent {
1106
1099
  errors.push(...this._errors);
1107
1100
  return false;
1108
1101
  }
1109
- const message = this.invalid || this.invalidMessage(data, dirty, false, row);
1102
+ // TODO: this is the only place invalidMessage gets called, and it's not clear why it's needed - we already validate the editGrid
1103
+ // component above with super.checkComponentValidity
1104
+ const message = this.invalid || this.invalidMessage(data, dirty, false, row, options);
1110
1105
  if (allRowErrors.length && this.root?.submitted && !message) {
1111
1106
  this._errors = this.setCustomValidity(message, dirty);
1112
1107
  errors.push(...this._errors);
@@ -1150,9 +1145,6 @@ export default class EditGridComponent extends NestedArrayComponent {
1150
1145
  }
1151
1146
  }
1152
1147
  const changed = this.hasChanged(value, this.dataValue);
1153
- if (this.parent) {
1154
- this.parent.checkComponentConditions();
1155
- }
1156
1148
  this.dataValue = value;
1157
1149
  // Refresh editRow data when data changes.
1158
1150
  this.dataValue.forEach((row, rowIndex) => {
@@ -1183,7 +1175,6 @@ export default class EditGridComponent extends NestedArrayComponent {
1183
1175
  this.editRows = this.editRows.slice(0, dataLength);
1184
1176
  this.openWhenEmpty();
1185
1177
  this.updateOnChange(flags, changed);
1186
- this.checkData();
1187
1178
  this.changeState(changed, flags);
1188
1179
  return changed;
1189
1180
  }
@@ -7,6 +7,18 @@ export default [
7
7
  key: 'allowMultipleMasks',
8
8
  ignore: true,
9
9
  },
10
+ {
11
+ key: 'inputMasks',
12
+ ignore: true
13
+ },
14
+ {
15
+ key: 'widget.type',
16
+ ignore: true
17
+ },
18
+ {
19
+ key: 'widget',
20
+ ignore: true
21
+ },
10
22
  {
11
23
  key: 'showWordCount',
12
24
  ignore: true
@@ -3,6 +3,14 @@ export default [
3
3
  key: 'labelPosition',
4
4
  ignore: true
5
5
  },
6
+ {
7
+ key: 'labelWidth',
8
+ ignore: true
9
+ },
10
+ {
11
+ key: 'labelMargin',
12
+ ignore: true
13
+ },
6
14
  {
7
15
  key: 'placeholder',
8
16
  ignore: true
@@ -903,14 +903,17 @@ export default class FileComponent extends Field {
903
903
  } : false;
904
904
  }
905
905
  async uploadFile(fileToSync) {
906
- return await this.fileService.uploadFile(fileToSync.storage, fileToSync.file, fileToSync.name, fileToSync.dir,
906
+ const filePromise = this.fileService.uploadFile(fileToSync.storage, fileToSync.file, fileToSync.name, fileToSync.dir,
907
907
  // Progress callback
908
- this.updateProgress.bind(this, fileToSync), fileToSync.url, fileToSync.options, fileToSync.fileKey, fileToSync.groupPermissions, fileToSync.groupResourceId, () => { },
908
+ this.updateProgress.bind(this, fileToSync), fileToSync.url, fileToSync.options, fileToSync.fileKey, fileToSync.groupPermissions, fileToSync.groupResourceId, () => {
909
+ this.emit('fileUploadingStart', filePromise);
910
+ },
909
911
  // Abort upload callback
910
912
  (abort) => this.abortUploads.push({
911
913
  id: fileToSync.id,
912
914
  abort,
913
915
  }), this.getMultipartOptions(fileToSync));
916
+ return await filePromise;
914
917
  }
915
918
  async upload() {
916
919
  if (!this.filesToSync.filesToUpload.length) {
@@ -930,6 +933,7 @@ export default class FileComponent extends Field {
930
933
  fileToSync.message = this.t('succefullyUploaded');
931
934
  fileInfo.originalName = fileToSync.originalName;
932
935
  fileInfo.hash = fileToSync.hash;
936
+ this.emit('fileUploadingEnd', Promise.resolve(fileInfo));
933
937
  }
934
938
  catch (response) {
935
939
  fileToSync.status = 'error';
@@ -939,6 +943,7 @@ export default class FileComponent extends Field {
939
943
  : response.type === 'abort'
940
944
  ? this.t('Request was aborted')
941
945
  : response.toString();
946
+ this.emit('fileUploadingEnd', Promise.reject(response));
942
947
  this.emit('fileUploadError', {
943
948
  fileToSync,
944
949
  response,