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

Sign up to get free protection for your applications and to get access to all the features.
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'",