@formio/js 5.1.0-dev.6026.929ea40 → 5.1.0-dev.6035.9508dc1

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 (48) hide show
  1. package/dist/formio.builder.css +15 -17
  2. package/dist/formio.builder.min.css +1 -1
  3. package/dist/formio.form.css +15 -17
  4. package/dist/formio.form.js +17 -17
  5. package/dist/formio.form.min.css +1 -1
  6. package/dist/formio.form.min.js +1 -1
  7. package/dist/formio.form.min.js.LICENSE.txt +2 -2
  8. package/dist/formio.full.css +15 -17
  9. package/dist/formio.full.js +18 -18
  10. package/dist/formio.full.min.css +1 -1
  11. package/dist/formio.full.min.js +1 -1
  12. package/dist/formio.full.min.js.LICENSE.txt +2 -2
  13. package/dist/formio.js +1 -1
  14. package/dist/formio.min.js +1 -1
  15. package/dist/formio.min.js.LICENSE.txt +1 -1
  16. package/dist/formio.utils.js +1 -1
  17. package/dist/formio.utils.min.js +1 -1
  18. package/dist/formio.utils.min.js.LICENSE.txt +1 -1
  19. package/lib/cjs/Form.d.ts +2 -4
  20. package/lib/cjs/Webform.d.ts +1 -1
  21. package/lib/cjs/Webform.js +5 -3
  22. package/lib/cjs/Wizard.js +1 -0
  23. package/lib/cjs/WizardBuilder.d.ts +0 -1
  24. package/lib/cjs/WizardBuilder.js +7 -9
  25. package/lib/cjs/components/form/Form.d.ts +1 -1
  26. package/lib/cjs/components/form/Form.js +5 -1
  27. package/lib/cjs/components/select/Select.d.ts +0 -1
  28. package/lib/cjs/components/select/Select.js +3 -23
  29. package/lib/cjs/components/tags/Tags.d.ts +1 -1
  30. package/lib/cjs/components/tags/Tags.js +2 -2
  31. package/lib/cjs/utils/ChoicesWrapper.d.ts +4 -25
  32. package/lib/cjs/utils/ChoicesWrapper.js +47 -124
  33. package/lib/mjs/Form.d.ts +2 -4
  34. package/lib/mjs/Form.js +1 -1
  35. package/lib/mjs/Webform.d.ts +1 -1
  36. package/lib/mjs/Webform.js +5 -3
  37. package/lib/mjs/Wizard.js +1 -0
  38. package/lib/mjs/WizardBuilder.d.ts +0 -1
  39. package/lib/mjs/WizardBuilder.js +7 -9
  40. package/lib/mjs/components/form/Form.d.ts +1 -1
  41. package/lib/mjs/components/form/Form.js +4 -1
  42. package/lib/mjs/components/select/Select.d.ts +0 -1
  43. package/lib/mjs/components/select/Select.js +3 -22
  44. package/lib/mjs/components/tags/Tags.d.ts +1 -1
  45. package/lib/mjs/components/tags/Tags.js +2 -2
  46. package/lib/mjs/utils/ChoicesWrapper.d.ts +4 -25
  47. package/lib/mjs/utils/ChoicesWrapper.js +26 -119
  48. package/package.json +2 -2
@@ -97,7 +97,7 @@ export default class FormComponent extends Component {
97
97
  return this.createSubForm();
98
98
  }
99
99
  get dataReady() {
100
- return this.subFormReady || Promise.resolve();
100
+ return this.subForm?.dataReady || this.subFormReady || Promise.resolve();
101
101
  }
102
102
  get defaultValue() {
103
103
  // Not not provide a default value unless the subform is ready so that it will initialize correctly.
@@ -663,6 +663,9 @@ export default class FormComponent extends Component {
663
663
  */
664
664
  onSetSubFormValue(submission, flags) {
665
665
  this.subForm.setValue(submission, flags);
666
+ if (flags?.fromSubmission) {
667
+ this.subForm.submissionReadyResolve(submission);
668
+ }
666
669
  }
667
670
  isEmpty(value = this.dataValue) {
668
671
  return value === null || _.isEqual(value, this.emptyValue) || (this.areAllComponentsEmpty(value?.data) && !value?._id);
@@ -126,7 +126,6 @@ export default class SelectComponent extends ListComponent {
126
126
  get isLoadingAvailable(): any;
127
127
  onScroll(): void;
128
128
  attachRefreshOnBlur(): void;
129
- addPlaceholderItem(placeholderValue: any): void;
130
129
  update(): void;
131
130
  addCurrentChoices(values: any, items: any, keyValue: any): any;
132
131
  getValueAsString(data: any, options: any): any;
@@ -772,8 +772,8 @@ export default class SelectComponent extends ListComponent {
772
772
  removeItemButton: this.component.disabled ? false : _.get(this.component, 'removeItemButton', true),
773
773
  itemSelectText: '',
774
774
  classNames: {
775
- containerOuter: 'choices form-group formio-choices',
776
- containerInner: this.transform('class', 'form-control ui fluid selection dropdown')
775
+ containerOuter: ['choices', 'form-group', 'formio-choices'],
776
+ containerInner: this.transform('class', 'form-control ui fluid selection dropdown').split(' '),
777
777
  },
778
778
  addItemText: false,
779
779
  allowHTML: true,
@@ -801,6 +801,7 @@ export default class SelectComponent extends ListComponent {
801
801
  }),
802
802
  valueComparer: _.isEqual,
803
803
  resetScrollPosition: false,
804
+ duplicateItemsAllowed: false,
804
805
  ...customOptions,
805
806
  };
806
807
  }
@@ -933,12 +934,6 @@ export default class SelectComponent extends ListComponent {
933
934
  this.positionDropdown();
934
935
  });
935
936
  }
936
- if (this.choices && choicesOptions.placeholderValue && this.choices._isSelectOneElement) {
937
- this.addPlaceholderItem(choicesOptions.placeholderValue);
938
- this.addEventListener(input, 'removeItem', () => {
939
- this.addPlaceholderItem(choicesOptions.placeholderValue);
940
- });
941
- }
942
937
  // Add value options.
943
938
  this.addValueOptions();
944
939
  this.setChoicesValue(this.dataValue);
@@ -1024,20 +1019,6 @@ export default class SelectComponent extends ListComponent {
1024
1019
  });
1025
1020
  }
1026
1021
  }
1027
- addPlaceholderItem(placeholderValue) {
1028
- const items = this.choices._store.activeItems;
1029
- if (!items.length) {
1030
- this.choices._addItem({
1031
- value: '',
1032
- label: placeholderValue,
1033
- choiceId: 0,
1034
- groupId: -1,
1035
- customProperties: null,
1036
- placeholder: true,
1037
- keyCode: null
1038
- });
1039
- }
1040
- }
1041
1022
  /* eslint-enable max-statements */
1042
1023
  update() {
1043
1024
  if (this.component.dataSrc === 'custom') {
@@ -24,4 +24,4 @@ export default class TagsComponent extends Input {
24
24
  getValueAsString(value: any): any;
25
25
  }
26
26
  import Input from '../_classes/input/Input';
27
- import Choices from '@formio/choices.js';
27
+ import Choices from 'choices.js';
@@ -1,6 +1,6 @@
1
1
  import { componentValueTypes, getComponentSavedTypes } from '../../utils/utils';
2
2
  import Input from '../_classes/input/Input';
3
- import Choices from '@formio/choices.js';
3
+ import Choices from 'choices.js';
4
4
  export default class TagsComponent extends Input {
5
5
  static schema(...extend) {
6
6
  return Input.schema({
@@ -127,7 +127,7 @@ export default class TagsComponent extends Input {
127
127
  const changed = super.setValue(value, flags);
128
128
  if (this.choices) {
129
129
  let dataValue = this.dataValue;
130
- this.choices.removeActiveItems();
130
+ this.choices.clearStore();
131
131
  if (dataValue) {
132
132
  if (typeof dataValue === 'string') {
133
133
  dataValue = dataValue.split(this.delimiter).filter(result => result);
@@ -1,38 +1,17 @@
1
- export namespace KEY_CODES {
2
- let BACK_KEY: number;
3
- let DELETE_KEY: number;
4
- let TAB_KEY: number;
5
- let ENTER_KEY: number;
6
- let A_KEY: number;
7
- let ESC_KEY: number;
8
- let UP_KEY: number;
9
- let DOWN_KEY: number;
10
- let PAGE_UP_KEY: number;
11
- let PAGE_DOWN_KEY: number;
12
- }
13
1
  export default ChoicesWrapper;
14
2
  declare class ChoicesWrapper extends Choices {
15
3
  constructor(...args: any[]);
16
- _onTabKey({ activeItems, hasActiveDropdown }: {
17
- activeItems: any;
18
- hasActiveDropdown: any;
19
- }): void;
4
+ _onTabKey(): void;
20
5
  isDirectionUsing: boolean;
21
6
  shouldOpenDropDown: boolean;
22
7
  _onTouchEnd(event: any): void;
23
- _handleButtonAction(activeItems: any, element: any): void;
24
- _onEnterKey(args: any): void;
8
+ _onEnterKey(...args: any[]): void;
25
9
  _onDirectionKey(...args: any[]): void;
26
10
  timeout: NodeJS.Timeout | undefined;
27
11
  _selectHighlightedChoice(): void;
28
12
  _onKeyDown(event: any): void;
29
- onSelectValue({ event, activeItems, hasActiveDropdown }: {
30
- event: any;
31
- activeItems: any;
32
- hasActiveDropdown: any;
33
- }): void;
13
+ onSelectValue(event: any, hasActiveDropdown: any): void;
34
14
  showDropdown(...args: any[]): void;
35
15
  hideDropdown(...args: any[]): void;
36
- _onBlur(...args: any[]): void;
37
16
  }
38
- import Choices from '@formio/choices.js';
17
+ import Choices from 'choices.js';
@@ -1,41 +1,7 @@
1
- import Choices from '@formio/choices.js';
2
- /**
3
- * TODO: REMOVE THIS ONCE THE PULL REQUEST HAS BEEN RESOLVED.
4
- *
5
- * https://github.com/jshjohnson/Choices/pull/788
6
- *
7
- * This is intentionally not part of the extended class, since other components use Choices and need this fix as well.
8
- * @type {Choices._generatePlaceholderValue}
9
- * @private
10
- */
11
- Choices.prototype._generatePlaceholderValue = function () {
12
- if (this._isSelectElement && this.passedElement.placeholderOption) {
13
- const { placeholderOption } = this.passedElement;
14
- return placeholderOption ? placeholderOption.text : false;
15
- }
16
- const { placeholder, placeholderValue } = this.config;
17
- const { element: { dataset }, } = this.passedElement;
18
- if (placeholder) {
19
- if (placeholderValue) {
20
- return placeholderValue;
21
- }
22
- if (dataset.placeholder) {
23
- return dataset.placeholder;
24
- }
25
- }
26
- return false;
27
- };
28
- export const KEY_CODES = {
29
- BACK_KEY: 46,
30
- DELETE_KEY: 8,
1
+ import Choices, { KeyCodeMap } from 'choices.js';
2
+ const ExtendedKeyCodeMap = {
3
+ ...KeyCodeMap,
31
4
  TAB_KEY: 9,
32
- ENTER_KEY: 13,
33
- A_KEY: 65,
34
- ESC_KEY: 27,
35
- UP_KEY: 38,
36
- DOWN_KEY: 40,
37
- PAGE_UP_KEY: 33,
38
- PAGE_DOWN_KEY: 34,
39
5
  };
40
6
  class ChoicesWrapper extends Choices {
41
7
  constructor(...args) {
@@ -63,24 +29,13 @@ class ChoicesWrapper extends Choices {
63
29
  }
64
30
  this._wasTap = true;
65
31
  }
66
- _handleButtonAction(activeItems, element) {
67
- if (!this._isSelectOneElement) {
68
- return super._handleButtonAction(activeItems, element);
69
- }
70
- if (!activeItems ||
71
- !element ||
72
- !this.config.removeItems ||
73
- !this.config.removeItemButton) {
74
- return;
75
- }
76
- super._handleButtonAction(activeItems, element);
77
- }
78
- _onEnterKey(args) {
32
+ _onEnterKey(...args) {
33
+ const [event] = args;
79
34
  // Prevent dropdown form opening when removeItemButton was pressed using 'Enter' on keyboard
80
- if (args.event.target.className === 'choices__button') {
35
+ if (event.target.className === 'choices__button') {
81
36
  this.shouldOpenDropDown = false;
82
37
  }
83
- super._onEnterKey(args);
38
+ super._onEnterKey(...args);
84
39
  }
85
40
  _onDirectionKey(...args) {
86
41
  if (!this._isSelectOneElement) {
@@ -94,17 +49,18 @@ class ChoicesWrapper extends Choices {
94
49
  this.isDirectionUsing = false;
95
50
  }, 250);
96
51
  }
97
- _onTabKey({ activeItems, hasActiveDropdown }) {
98
- if (hasActiveDropdown) {
99
- this._selectHighlightedChoice(activeItems);
52
+ _onTabKey() {
53
+ if (this.dropdown.isActive) {
54
+ this._selectHighlightedChoice();
100
55
  }
101
56
  }
102
57
  _selectHighlightedChoice() {
103
- const highlightedChoice = this.dropdown.getChild(`.${this.config.classNames.highlightedState}`);
58
+ const highlightedChoice = this.dropdown.element.querySelector(`.${this.config.classNames.highlightedState}`);
104
59
  if (highlightedChoice) {
105
60
  const id = highlightedChoice.dataset.id;
106
- const choice = id && this._store.getChoiceById(id);
61
+ const choice = id && this._store.getChoiceById(Number(id));
107
62
  this._addItem({
63
+ id: choice.id,
108
64
  value: choice.value,
109
65
  label: choice.label,
110
66
  choiceId: choice.id,
@@ -115,61 +71,16 @@ class ChoicesWrapper extends Choices {
115
71
  });
116
72
  this._triggerChange(choice.value);
117
73
  }
118
- event.preventDefault();
119
74
  }
120
75
  _onKeyDown(event) {
121
- if (!this._isSelectOneElement) {
122
- return super._onKeyDown(event);
123
- }
124
- const { target, keyCode, ctrlKey, metaKey } = event;
125
- if (target !== this.input.element &&
126
- !this.containerOuter.element.contains(target)) {
127
- return;
128
- }
129
- const activeItems = this._store.activeItems;
130
- const hasFocusedInput = this.input.isFocussed;
131
- const hasActiveDropdown = this.dropdown.isActive;
132
- const hasItems = this.itemList.hasChildren;
133
- const keyString = String.fromCharCode(keyCode);
134
- const { BACK_KEY, DELETE_KEY, TAB_KEY, ENTER_KEY, A_KEY, ESC_KEY, UP_KEY, DOWN_KEY, PAGE_UP_KEY, PAGE_DOWN_KEY, } = KEY_CODES;
135
- const hasCtrlDownKeyPressed = ctrlKey || metaKey;
136
- // If a user is typing and the dropdown is not active
137
- if (!hasActiveDropdown && !this._isTextElement && /[a-zA-Z0-9-_ ]/.test(keyString)) {
138
- const currentValue = this.input.element.value;
139
- this.input.element.value = currentValue ? `${currentValue}${keyString}` : keyString;
140
- this.showDropdown();
141
- }
142
- // Map keys to key actions
143
- const keyDownActions = {
144
- [A_KEY]: this._onAKey,
145
- [TAB_KEY]: this._onTabKey,
146
- [ENTER_KEY]: this._onEnterKey,
147
- [ESC_KEY]: this._onEscapeKey,
148
- [UP_KEY]: this._onDirectionKey,
149
- [PAGE_UP_KEY]: this._onDirectionKey,
150
- [DOWN_KEY]: this._onDirectionKey,
151
- [PAGE_DOWN_KEY]: this._onDirectionKey,
152
- [DELETE_KEY]: this._onDeleteKey,
153
- [BACK_KEY]: this._onDeleteKey,
154
- };
155
- // If keycode has a function, run it
156
- if (keyDownActions[keyCode]) {
157
- keyDownActions[keyCode]({
158
- event,
159
- target,
160
- keyCode,
161
- metaKey,
162
- activeItems,
163
- hasFocusedInput,
164
- hasActiveDropdown,
165
- hasItems,
166
- hasCtrlDownKeyPressed,
167
- });
168
- }
76
+ const keyCode = event.keyCode;
77
+ return this._isSelectOneElement && keyCode === ExtendedKeyCodeMap.TAB_KEY
78
+ ? this._onTabKey()
79
+ : super._onKeyDown(event);
169
80
  }
170
- onSelectValue({ event, activeItems, hasActiveDropdown }) {
81
+ onSelectValue(event, hasActiveDropdown) {
171
82
  if (hasActiveDropdown) {
172
- this._selectHighlightedChoice(activeItems);
83
+ this._selectHighlightedChoice();
173
84
  }
174
85
  else if (this._isSelectOneElement) {
175
86
  this.showDropdown();
@@ -177,11 +88,13 @@ class ChoicesWrapper extends Choices {
177
88
  }
178
89
  }
179
90
  showDropdown(...args) {
180
- if (!this.shouldOpenDropDown) {
181
- this.shouldOpenDropDown = true;
182
- return;
183
- }
184
- super.showDropdown(...args);
91
+ setTimeout(() => {
92
+ if (!this.shouldOpenDropDown) {
93
+ this.shouldOpenDropDown = true;
94
+ return;
95
+ }
96
+ super.showDropdown(...args);
97
+ }, 0);
185
98
  }
186
99
  hideDropdown(...args) {
187
100
  if (this.isDirectionUsing) {
@@ -189,11 +102,5 @@ class ChoicesWrapper extends Choices {
189
102
  }
190
103
  super.hideDropdown(...args);
191
104
  }
192
- _onBlur(...args) {
193
- if (this._isScrollingOnIe) {
194
- return;
195
- }
196
- super._onBlur(...args);
197
- }
198
105
  }
199
106
  export default ChoicesWrapper;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formio/js",
3
- "version": "5.1.0-dev.6026.929ea40",
3
+ "version": "5.1.0-dev.6035.9508dc1",
4
4
  "description": "JavaScript powered Forms with JSON Form Builder",
5
5
  "main": "lib/cjs/index.js",
6
6
  "exports": {
@@ -81,7 +81,6 @@
81
81
  "homepage": "https://github.com/formio/formio.js#readme",
82
82
  "dependencies": {
83
83
  "@formio/bootstrap": "v3.0.0-dev.121.085d187",
84
- "@formio/choices.js": "^10.2.1",
85
84
  "@formio/core": "v2.4.0-dev.2",
86
85
  "@formio/text-mask-addons": "3.8.0-formio.4",
87
86
  "@formio/vanilla-text-mask": "^5.1.1-formio.1",
@@ -90,6 +89,7 @@
90
89
  "bootstrap": "^5.3.3",
91
90
  "browser-cookies": "^1.2.0",
92
91
  "browser-md5-file": "^1.1.1",
92
+ "choices.js": "^11.0.6",
93
93
  "compare-versions": "^6.1.1",
94
94
  "core-js": "^3.37.1",
95
95
  "dialog-polyfill": "^0.5.6",