@formio/js 5.0.0-rc.22 → 5.0.0-rc.23

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 (43) hide show
  1. package/dist/formio.builder.css +2 -0
  2. package/dist/formio.builder.min.css +1 -1
  3. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  4. package/dist/formio.form.css +2 -0
  5. package/dist/formio.form.js +8 -8
  6. package/dist/formio.form.min.css +1 -1
  7. package/dist/formio.form.min.js +1 -1
  8. package/dist/formio.form.min.js.LICENSE.txt +1 -1
  9. package/dist/formio.full.css +2 -0
  10. package/dist/formio.full.js +8 -8
  11. package/dist/formio.full.min.css +1 -1
  12. package/dist/formio.full.min.js +1 -1
  13. package/dist/formio.full.min.js.LICENSE.txt +1 -1
  14. package/dist/formio.js +1 -1
  15. package/dist/formio.min.js +1 -1
  16. package/dist/formio.min.js.LICENSE.txt +1 -1
  17. package/dist/formio.utils.js +1 -1
  18. package/dist/formio.utils.min.js.LICENSE.txt +1 -1
  19. package/lib/cjs/components/_classes/component/Component.js +3 -3
  20. package/lib/cjs/components/_classes/field/Field.d.ts +1 -0
  21. package/lib/cjs/components/_classes/field/Field.js +14 -0
  22. package/lib/cjs/components/_classes/multivalue/Multivalue.d.ts +0 -1
  23. package/lib/cjs/components/_classes/multivalue/Multivalue.js +0 -14
  24. package/lib/cjs/components/day/Day.d.ts +0 -1
  25. package/lib/cjs/components/day/Day.js +34 -14
  26. package/lib/cjs/components/day/fixtures/comp6.d.ts +81 -0
  27. package/lib/cjs/components/day/fixtures/comp6.js +76 -0
  28. package/lib/cjs/components/day/fixtures/index.d.ts +2 -1
  29. package/lib/cjs/components/day/fixtures/index.js +3 -1
  30. package/lib/cjs/utils/utils.js +3 -3
  31. package/lib/mjs/components/_classes/component/Component.js +3 -3
  32. package/lib/mjs/components/_classes/field/Field.d.ts +1 -0
  33. package/lib/mjs/components/_classes/field/Field.js +13 -0
  34. package/lib/mjs/components/_classes/multivalue/Multivalue.d.ts +0 -1
  35. package/lib/mjs/components/_classes/multivalue/Multivalue.js +0 -13
  36. package/lib/mjs/components/day/Day.d.ts +0 -1
  37. package/lib/mjs/components/day/Day.js +33 -14
  38. package/lib/mjs/components/day/fixtures/comp6.d.ts +81 -0
  39. package/lib/mjs/components/day/fixtures/comp6.js +74 -0
  40. package/lib/mjs/components/day/fixtures/index.d.ts +2 -1
  41. package/lib/mjs/components/day/fixtures/index.js +2 -1
  42. package/lib/mjs/utils/utils.js +3 -3
  43. package/package.json +2 -2
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ type: 'form',
5
+ display: 'form',
6
+ components: [
7
+ {
8
+ label: 'Text Field',
9
+ applyMaskOn: 'change',
10
+ tableView: true,
11
+ key: 'textField',
12
+ type: 'textfield',
13
+ input: true,
14
+ },
15
+ {
16
+ label: 'Day',
17
+ hideInputLabels: false,
18
+ inputsLabelPosition: 'top',
19
+ useLocaleSettings: false,
20
+ tableView: false,
21
+ fields: {
22
+ day: {
23
+ hide: true,
24
+ },
25
+ month: {
26
+ hide: false,
27
+ },
28
+ year: {
29
+ hide: false,
30
+ },
31
+ },
32
+ defaultValue: '00/00/0000',
33
+ key: 'day',
34
+ logic: [
35
+ {
36
+ name: 'Disable when Test is empty',
37
+ trigger: {
38
+ type: 'simple',
39
+ simple: {
40
+ show: true,
41
+ conjunction: 'all',
42
+ conditions: [
43
+ {
44
+ component: 'textField',
45
+ operator: 'isEmpty',
46
+ },
47
+ ],
48
+ },
49
+ },
50
+ actions: [
51
+ {
52
+ name: 'Disable',
53
+ type: 'property',
54
+ property: {
55
+ label: 'Disabled',
56
+ value: 'disabled',
57
+ type: 'boolean',
58
+ },
59
+ state: true,
60
+ },
61
+ ],
62
+ },
63
+ ],
64
+ type: 'day',
65
+ input: true,
66
+ },
67
+ {
68
+ type: 'button',
69
+ label: 'Submit',
70
+ key: 'submit',
71
+ disableOnInvalid: true,
72
+ input: true,
73
+ tableView: false,
74
+ },
75
+ ],
76
+ };
@@ -3,4 +3,5 @@ import comp2 from './comp2';
3
3
  import comp3 from './comp3';
4
4
  import comp4 from './comp4';
5
5
  import comp5 from './comp5';
6
- export { comp1, comp2, comp3, comp4, comp5 };
6
+ import comp6 from './comp6';
7
+ export { comp1, comp2, comp3, comp4, comp5, comp6 };
@@ -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.comp5 = exports.comp4 = exports.comp3 = exports.comp2 = exports.comp1 = void 0;
6
+ 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"));
@@ -14,3 +14,5 @@ const comp4_1 = __importDefault(require("./comp4"));
14
14
  exports.comp4 = comp4_1.default;
15
15
  const comp5_1 = __importDefault(require("./comp5"));
16
16
  exports.comp5 = comp5_1.default;
17
+ const comp6_1 = __importDefault(require("./comp6"));
18
+ exports.comp6 = comp6_1.default;
@@ -258,9 +258,9 @@ function checkSimpleConditional(component, condition, row, data, instance) {
258
258
  return true;
259
259
  }
260
260
  const value = getComponentActualValue(conditionComponentPath, data, row);
261
- const СonditionOperator = conditionOperators_1.default[operator];
262
- return СonditionOperator
263
- ? new СonditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
261
+ const ConditionOperator = conditionOperators_1.default[operator];
262
+ return ConditionOperator
263
+ ? new ConditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
264
264
  : true;
265
265
  });
266
266
  let result = false;
@@ -1506,16 +1506,16 @@ export default class Component extends Element {
1506
1506
  if (this.refs.input?.length) {
1507
1507
  const { selection, index } = this.root.currentSelection;
1508
1508
  let input = this.refs.input[index];
1509
- const isInputRangeSelectable = /text|search|password|tel|url/i.test(input.type || '');
1509
+ const isInputRangeSelectable = (i) => /text|search|password|tel|url/i.test(i?.type || '');
1510
1510
  if (input) {
1511
- if (isInputRangeSelectable) {
1511
+ if (isInputRangeSelectable(input)) {
1512
1512
  input.setSelectionRange(...selection);
1513
1513
  }
1514
1514
  }
1515
1515
  else {
1516
1516
  input = this.refs.input[this.refs.input.length];
1517
1517
  const lastCharacter = input.value?.length || 0;
1518
- if (isInputRangeSelectable) {
1518
+ if (isInputRangeSelectable(input)) {
1519
1519
  input.setSelectionRange(lastCharacter, lastCharacter);
1520
1520
  }
1521
1521
  }
@@ -1,4 +1,5 @@
1
1
  export default class Field extends Component {
2
2
  render(element: any): any;
3
+ saveCaretPosition(element: any, index: any): void;
3
4
  }
4
5
  import Component from '../component/Component';
@@ -18,4 +18,17 @@ export default class Field extends Component {
18
18
  }));
19
19
  }
20
20
  }
21
+ // Saves current caret position to restore it after the component is redrawn
22
+ saveCaretPosition(element, index) {
23
+ if (this.root?.focusedComponent?.path === this.path) {
24
+ try {
25
+ this.root.currentSelection = { selection: [element.selectionStart, element.selectionEnd], index };
26
+ }
27
+ catch (e) {
28
+ if (!(e instanceof DOMException)) {
29
+ console.debug(e);
30
+ }
31
+ }
32
+ }
33
+ }
21
34
  }
@@ -12,7 +12,6 @@ export default class Multivalue extends Field {
12
12
  * @param index
13
13
  */
14
14
  attachElement(element: any, index: any): void;
15
- saveCaretPosition(element: any, index: any): void;
16
15
  onSelectMaskHandler(event: any): void;
17
16
  getMaskPattern(maskName: any): any;
18
17
  multiMasks: {} | undefined;
@@ -177,19 +177,6 @@ export default class Multivalue extends Field {
177
177
  }
178
178
  }
179
179
  }
180
- // Saves current caret position to restore it after the component is redrawn
181
- saveCaretPosition(element, index) {
182
- if (this.root?.focusedComponent?.path === this.path) {
183
- try {
184
- this.root.currentSelection = { selection: [element.selectionStart, element.selectionEnd], index };
185
- }
186
- catch (e) {
187
- if (!(e instanceof DOMException)) {
188
- console.debug(e);
189
- }
190
- }
191
- }
192
- }
193
180
  onSelectMaskHandler(event) {
194
181
  this.updateMask(event.target.maskInput, this.getMaskPattern(event.target.value));
195
182
  }
@@ -157,7 +157,6 @@ export default class DayComponent extends Field {
157
157
  * @return {null}
158
158
  */
159
159
  getValueAsString(value: any): null;
160
- focus(): void;
161
160
  isPartialDay(value: any): boolean;
162
161
  getValidationFormat(): "DD-MM-YYYY" | "MM-DD-YYYY";
163
162
  }
@@ -1,7 +1,6 @@
1
1
  import _ from 'lodash';
2
2
  import moment from 'moment';
3
3
  import Field from '../_classes/field/Field';
4
- import Input from '../_classes/input/Input';
5
4
  import { boolValue, componentValueTypes, getComponentSavedTypes, getLocaleDateFormatInfo } from '../../utils/utils';
6
5
  export default class DayComponent extends Field {
7
6
  static schema(...extend) {
@@ -256,6 +255,17 @@ export default class DayComponent extends Field {
256
255
  attach(element) {
257
256
  this.loadRefs(element, { day: 'single', month: 'single', year: 'single', input: 'multiple' });
258
257
  const superAttach = super.attach(element);
258
+ const updateValueAndSaveFocus = (element, name) => () => {
259
+ try {
260
+ this.saveCaretPosition(element, name);
261
+ }
262
+ catch (err) {
263
+ console.warn('An error occurred while trying to save caret position', err);
264
+ }
265
+ this.updateValue(null, {
266
+ modified: true,
267
+ });
268
+ };
259
269
  if (this.shouldDisabled) {
260
270
  this.setDisabled(this.refs.day, true);
261
271
  this.setDisabled(this.refs.month, true);
@@ -265,9 +275,7 @@ export default class DayComponent extends Field {
265
275
  }
266
276
  }
267
277
  else {
268
- this.addEventListener(this.refs.day, 'input', () => this.updateValue(null, {
269
- modified: true
270
- }));
278
+ this.addEventListener(this.refs.day, 'input', updateValueAndSaveFocus(this.refs.day, 'day'));
271
279
  // TODO: Need to rework this to work with day select as well.
272
280
  // Change day max input when month changes.
273
281
  this.addEventListener(this.refs.month, 'input', () => {
@@ -280,18 +288,14 @@ export default class DayComponent extends Field {
280
288
  if (maxDay && day > maxDay) {
281
289
  this.refs.day.value = this.refs.day.max;
282
290
  }
283
- this.updateValue(null, {
284
- modified: true
285
- });
291
+ updateValueAndSaveFocus(this.refs.month, 'month')();
286
292
  });
287
- this.addEventListener(this.refs.year, 'input', () => this.updateValue(null, {
288
- modified: true
289
- }));
293
+ this.addEventListener(this.refs.year, 'input', updateValueAndSaveFocus(this.refs.year, 'year'));
290
294
  this.addEventListener(this.refs.input, this.info.changeEvent, () => this.updateValue(null, {
291
295
  modified: true
292
296
  }));
293
- [this.refs.day, this.refs.month, this.refs.year].forEach((element) => {
294
- Input.prototype.addFocusBlurEvents.call(this, element);
297
+ [this.refs.day, this.refs.month, this.refs.year].filter((element) => !!element).forEach((element) => {
298
+ super.addFocusBlurEvents(element);
295
299
  });
296
300
  }
297
301
  this.setValue(this.dataValue);
@@ -524,8 +528,11 @@ export default class DayComponent extends Field {
524
528
  getValueAsString(value) {
525
529
  return this.getDate(value) || '';
526
530
  }
527
- focus() {
528
- if (this.dayFirst && this.showDay || !this.dayFirst && !this.showMonth && this.showDay) {
531
+ focus(field) {
532
+ if (field && typeof field === 'string' && this.refs[field]) {
533
+ this.refs[field].focus();
534
+ }
535
+ else if (this.dayFirst && this.showDay || !this.dayFirst && !this.showMonth && this.showDay) {
529
536
  this.refs.day?.focus();
530
537
  }
531
538
  else if (this.dayFirst && !this.showDay && this.showMonth || !this.dayFirst && this.showMonth) {
@@ -535,6 +542,18 @@ export default class DayComponent extends Field {
535
542
  this.refs.year?.focus();
536
543
  }
537
544
  }
545
+ restoreCaretPosition() {
546
+ if (this.root?.currentSelection) {
547
+ const { selection, index } = this.root.currentSelection;
548
+ if (this.refs[index]) {
549
+ const input = this.refs[index];
550
+ const isInputRangeSelectable = (i) => /text|search|password|tel|url/i.test(i?.type || '');
551
+ if (isInputRangeSelectable(input)) {
552
+ input.setSelectionRange(...selection);
553
+ }
554
+ }
555
+ }
556
+ }
538
557
  isPartialDay(value) {
539
558
  if (!value) {
540
559
  return false;
@@ -0,0 +1,81 @@
1
+ declare namespace _default {
2
+ const type: string;
3
+ const display: string;
4
+ const components: ({
5
+ label: string;
6
+ applyMaskOn: string;
7
+ tableView: boolean;
8
+ key: string;
9
+ type: string;
10
+ input: boolean;
11
+ hideInputLabels?: undefined;
12
+ inputsLabelPosition?: undefined;
13
+ useLocaleSettings?: undefined;
14
+ fields?: undefined;
15
+ defaultValue?: undefined;
16
+ logic?: undefined;
17
+ disableOnInvalid?: undefined;
18
+ } | {
19
+ label: string;
20
+ hideInputLabels: boolean;
21
+ inputsLabelPosition: string;
22
+ useLocaleSettings: boolean;
23
+ tableView: boolean;
24
+ fields: {
25
+ day: {
26
+ hide: boolean;
27
+ };
28
+ month: {
29
+ hide: boolean;
30
+ };
31
+ year: {
32
+ hide: boolean;
33
+ };
34
+ };
35
+ defaultValue: string;
36
+ key: string;
37
+ logic: {
38
+ name: string;
39
+ trigger: {
40
+ type: string;
41
+ simple: {
42
+ show: boolean;
43
+ conjunction: string;
44
+ conditions: {
45
+ component: string;
46
+ operator: string;
47
+ }[];
48
+ };
49
+ };
50
+ actions: {
51
+ name: string;
52
+ type: string;
53
+ property: {
54
+ label: string;
55
+ value: string;
56
+ type: string;
57
+ };
58
+ state: boolean;
59
+ }[];
60
+ }[];
61
+ type: string;
62
+ input: boolean;
63
+ applyMaskOn?: undefined;
64
+ disableOnInvalid?: undefined;
65
+ } | {
66
+ type: string;
67
+ label: string;
68
+ key: string;
69
+ disableOnInvalid: boolean;
70
+ input: boolean;
71
+ tableView: boolean;
72
+ applyMaskOn?: undefined;
73
+ hideInputLabels?: undefined;
74
+ inputsLabelPosition?: undefined;
75
+ useLocaleSettings?: undefined;
76
+ fields?: undefined;
77
+ defaultValue?: undefined;
78
+ logic?: undefined;
79
+ })[];
80
+ }
81
+ export default _default;
@@ -0,0 +1,74 @@
1
+ export default {
2
+ type: 'form',
3
+ display: 'form',
4
+ components: [
5
+ {
6
+ label: 'Text Field',
7
+ applyMaskOn: 'change',
8
+ tableView: true,
9
+ key: 'textField',
10
+ type: 'textfield',
11
+ input: true,
12
+ },
13
+ {
14
+ label: 'Day',
15
+ hideInputLabels: false,
16
+ inputsLabelPosition: 'top',
17
+ useLocaleSettings: false,
18
+ tableView: false,
19
+ fields: {
20
+ day: {
21
+ hide: true,
22
+ },
23
+ month: {
24
+ hide: false,
25
+ },
26
+ year: {
27
+ hide: false,
28
+ },
29
+ },
30
+ defaultValue: '00/00/0000',
31
+ key: 'day',
32
+ logic: [
33
+ {
34
+ name: 'Disable when Test is empty',
35
+ trigger: {
36
+ type: 'simple',
37
+ simple: {
38
+ show: true,
39
+ conjunction: 'all',
40
+ conditions: [
41
+ {
42
+ component: 'textField',
43
+ operator: 'isEmpty',
44
+ },
45
+ ],
46
+ },
47
+ },
48
+ actions: [
49
+ {
50
+ name: 'Disable',
51
+ type: 'property',
52
+ property: {
53
+ label: 'Disabled',
54
+ value: 'disabled',
55
+ type: 'boolean',
56
+ },
57
+ state: true,
58
+ },
59
+ ],
60
+ },
61
+ ],
62
+ type: 'day',
63
+ input: true,
64
+ },
65
+ {
66
+ type: 'button',
67
+ label: 'Submit',
68
+ key: 'submit',
69
+ disableOnInvalid: true,
70
+ input: true,
71
+ tableView: false,
72
+ },
73
+ ],
74
+ };
@@ -3,4 +3,5 @@ import comp2 from './comp2';
3
3
  import comp3 from './comp3';
4
4
  import comp4 from './comp4';
5
5
  import comp5 from './comp5';
6
- export { comp1, comp2, comp3, comp4, comp5 };
6
+ import comp6 from './comp6';
7
+ export { comp1, comp2, comp3, comp4, comp5, comp6 };
@@ -3,4 +3,5 @@ import comp2 from './comp2';
3
3
  import comp3 from './comp3';
4
4
  import comp4 from './comp4';
5
5
  import comp5 from './comp5';
6
- export { comp1, comp2, comp3, comp4, comp5 };
6
+ import comp6 from './comp6';
7
+ export { comp1, comp2, comp3, comp4, comp5, comp6 };
@@ -214,9 +214,9 @@ export function checkSimpleConditional(component, condition, row, data, instance
214
214
  return true;
215
215
  }
216
216
  const value = getComponentActualValue(conditionComponentPath, data, row);
217
- const СonditionOperator = ConditionOperators[operator];
218
- return СonditionOperator
219
- ? new СonditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
217
+ const ConditionOperator = ConditionOperators[operator];
218
+ return ConditionOperator
219
+ ? new ConditionOperator().getResult({ value, comparedValue, instance, component, conditionComponentPath })
220
220
  : true;
221
221
  });
222
222
  let result = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formio/js",
3
- "version": "5.0.0-rc.22",
3
+ "version": "5.0.0-rc.23",
4
4
  "description": "JavaScript powered Forms with JSON Form Builder",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/mjs/index.js",
@@ -51,7 +51,7 @@
51
51
  "invalidate": "VERSION=$(yarn version);aws cloudfront create-invalidation --distribution-id E1MXNA5A4ZKRMZ --paths \"/$VERSION/*\"",
52
52
  "release": "yarn build-app && yarn deploy-s3",
53
53
  "tag": "VERSION=$(yarn version);git add -A; git commit -m \"Build $Version\";git push origin master;git tag v$VERSION;git push origin --tags;",
54
- "dopublish": "npm test;gulp build;yarn tag;npm publish lib --tag=rc;",
54
+ "dopublish": "npm run build && npm run tag && npm publish",
55
55
  "lint": "gulp eslint",
56
56
  "serve": "jekyll serve --config _config.yml,_config.dev.yml",
57
57
  "test": "mocha 'src/**/*.unit.js'",