@formio/js 5.1.0-dev.6030.abc8cfc → 5.1.0-dev.6036.0df1d6a
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.
- package/dist/formio.builder.css +15 -17
- package/dist/formio.builder.min.css +1 -1
- package/dist/formio.form.css +15 -17
- package/dist/formio.form.js +20 -20
- package/dist/formio.form.min.css +1 -1
- package/dist/formio.form.min.js +1 -1
- package/dist/formio.form.min.js.LICENSE.txt +2 -2
- package/dist/formio.full.css +15 -17
- package/dist/formio.full.js +21 -21
- package/dist/formio.full.min.css +1 -1
- package/dist/formio.full.min.js +1 -1
- package/dist/formio.full.min.js.LICENSE.txt +2 -2
- package/dist/formio.js +1 -1
- package/dist/formio.min.js +1 -1
- package/dist/formio.min.js.LICENSE.txt +1 -1
- package/dist/formio.utils.js +1 -1
- package/dist/formio.utils.min.js +1 -1
- package/dist/formio.utils.min.js.LICENSE.txt +1 -1
- package/lib/cjs/Form.d.ts +2 -4
- package/lib/cjs/WizardBuilder.js +14 -1
- package/lib/cjs/components/_classes/component/Component.d.ts +2 -7
- package/lib/cjs/components/_classes/component/Component.js +23 -17
- package/lib/cjs/components/_classes/nested/NestedComponent.js +2 -5
- package/lib/cjs/components/editgrid/EditGrid.js +0 -4
- package/lib/cjs/components/form/Form.d.ts +1 -1
- package/lib/cjs/components/form/Form.js +5 -1
- package/lib/cjs/components/html/HTML.js +1 -2
- package/lib/cjs/components/select/Select.d.ts +0 -1
- package/lib/cjs/components/select/Select.js +3 -23
- package/lib/cjs/components/tabs/Tabs.js +1 -0
- package/lib/cjs/components/tags/Tags.d.ts +1 -1
- package/lib/cjs/components/tags/Tags.js +2 -2
- package/lib/cjs/utils/ChoicesWrapper.d.ts +4 -25
- package/lib/cjs/utils/ChoicesWrapper.js +47 -124
- package/lib/mjs/Form.d.ts +2 -4
- package/lib/mjs/Form.js +1 -1
- package/lib/mjs/WizardBuilder.js +14 -1
- package/lib/mjs/components/_classes/component/Component.d.ts +2 -7
- package/lib/mjs/components/_classes/component/Component.js +23 -17
- package/lib/mjs/components/_classes/nested/NestedComponent.js +2 -5
- package/lib/mjs/components/editgrid/EditGrid.js +0 -4
- package/lib/mjs/components/form/Form.d.ts +1 -1
- package/lib/mjs/components/form/Form.js +4 -1
- package/lib/mjs/components/html/HTML.js +1 -2
- package/lib/mjs/components/select/Select.d.ts +0 -1
- package/lib/mjs/components/select/Select.js +3 -22
- package/lib/mjs/components/tabs/Tabs.js +1 -0
- package/lib/mjs/components/tags/Tags.d.ts +1 -1
- package/lib/mjs/components/tags/Tags.js +2 -2
- package/lib/mjs/utils/ChoicesWrapper.d.ts +4 -25
- package/lib/mjs/utils/ChoicesWrapper.js +26 -119
- package/package.json +2 -2
package/lib/mjs/Form.js
CHANGED
@@ -51,7 +51,7 @@ export default class Form extends Element {
|
|
51
51
|
* @property {number} [saveDraftThrottle] - The throttle for the save draft feature.
|
52
52
|
* @property {boolean} [readOnly] - Set this form to readOnly.
|
53
53
|
* @property {boolean} [noAlerts] - Disable the alerts dialog.
|
54
|
-
* @property {
|
54
|
+
* @property {Record<string, Record<string, string>>} [i18n] - The translation file for this rendering.
|
55
55
|
* @property {string} [template] - Custom logic for creation of elements.
|
56
56
|
* @property {boolean} [noDefaults] - Exclude default values from the settings.
|
57
57
|
* @property {any} [fileService] - The file service for this form.
|
package/lib/mjs/WizardBuilder.js
CHANGED
@@ -255,10 +255,23 @@ export default class WizardBuilder extends WebformBuilder {
|
|
255
255
|
if (component instanceof WizardBuilder) {
|
256
256
|
return;
|
257
257
|
}
|
258
|
+
if (!window.sessionStorage) {
|
259
|
+
return console.warn(this.t('sessionStorageSupportError'));
|
260
|
+
}
|
261
|
+
// If pasting after the Wizard's page, check if a full Wizard page was copied and pass it to addPage method
|
258
262
|
if (this._form.components.find(comp => _.isEqual(component.component, comp))) {
|
259
|
-
|
263
|
+
const data = window.sessionStorage.getItem('formio.clipboard');
|
264
|
+
if (data) {
|
265
|
+
const schema = JSON.parse(data);
|
266
|
+
// If the copied component is not a Wizard's page, do nothing since we can't paste outside the panel in Wizard
|
267
|
+
if (schema.type !== 'panel') {
|
268
|
+
return;
|
269
|
+
}
|
270
|
+
this.addPage(schema);
|
271
|
+
}
|
260
272
|
}
|
261
273
|
else {
|
274
|
+
// If we are not trying to paster after the current Wizard's page, just pass it to the WebformBuilder
|
262
275
|
return super.pasteComponent(component);
|
263
276
|
}
|
264
277
|
}
|
@@ -119,13 +119,6 @@ declare class Component extends Element {
|
|
119
119
|
*/
|
120
120
|
paths: import('@formio/core').ComponentPaths;
|
121
121
|
_path: string;
|
122
|
-
/**
|
123
|
-
* Determines if this component is conditionally hidden. Should generally not be set outside of conditional logic pipeline.
|
124
|
-
* This is necessary because of clearOnHide behavior that only clears when conditionally hidden - we need to track
|
125
|
-
* conditionallyHidden separately from "regular" visibility.
|
126
|
-
*/
|
127
|
-
_parentConditionallyHidden: any;
|
128
|
-
_conditionallyHidden: any;
|
129
122
|
/**
|
130
123
|
* Determines if this component is visible, or not.
|
131
124
|
*/
|
@@ -170,6 +163,7 @@ declare class Component extends Element {
|
|
170
163
|
*/
|
171
164
|
info: any;
|
172
165
|
get componentsMap(): object;
|
166
|
+
get parentConditionallyHidden(): any;
|
173
167
|
set data(value: any);
|
174
168
|
get data(): any;
|
175
169
|
mergeSchema(component?: {}): any;
|
@@ -239,6 +233,7 @@ declare class Component extends Element {
|
|
239
233
|
* @returns {boolean} - Whether the component is conditionally hidden.
|
240
234
|
*/
|
241
235
|
checkConditionallyHidden(data?: object, row?: object): boolean;
|
236
|
+
_conditionallyHidden: any;
|
242
237
|
set currentForm(instance: any);
|
243
238
|
get currentForm(): any;
|
244
239
|
_currentForm: any;
|
@@ -321,8 +321,7 @@ export default class Component extends Element {
|
|
321
321
|
* This is necessary because of clearOnHide behavior that only clears when conditionally hidden - we need to track
|
322
322
|
* conditionallyHidden separately from "regular" visibility.
|
323
323
|
*/
|
324
|
-
this.
|
325
|
-
this._conditionallyHidden = this.checkConditionallyHidden(null, data) || this._parentConditionallyHidden;
|
324
|
+
this.checkConditionallyHidden(null, data);
|
326
325
|
/**
|
327
326
|
* Determines if this component is visible, or not.
|
328
327
|
*/
|
@@ -429,6 +428,18 @@ export default class Component extends Element {
|
|
429
428
|
get componentsMap() {
|
430
429
|
return this.root?.childComponentsMap || {};
|
431
430
|
}
|
431
|
+
get parentConditionallyHidden() {
|
432
|
+
let parentHidden = false;
|
433
|
+
let currentParent = this.parent;
|
434
|
+
while (currentParent) {
|
435
|
+
parentHidden = parentHidden || currentParent._conditionallyHidden;
|
436
|
+
if (parentHidden) {
|
437
|
+
break;
|
438
|
+
}
|
439
|
+
currentParent = currentParent.parent;
|
440
|
+
}
|
441
|
+
return parentHidden;
|
442
|
+
}
|
432
443
|
get data() {
|
433
444
|
return this._data;
|
434
445
|
}
|
@@ -468,7 +479,7 @@ export default class Component extends Element {
|
|
468
479
|
}
|
469
480
|
init() {
|
470
481
|
this.disabled = this.shouldDisabled;
|
471
|
-
this.
|
482
|
+
this.checkConditionallyHidden();
|
472
483
|
this._visible = (this.hasCondition() ? !this.conditionallyHidden : !this.component.hidden);
|
473
484
|
if (this.component.addons?.length) {
|
474
485
|
this.component.addons.forEach((addon) => this.createAddon(addon));
|
@@ -636,7 +647,7 @@ export default class Component extends Element {
|
|
636
647
|
return this._visible && this._parentVisible;
|
637
648
|
}
|
638
649
|
get conditionallyHidden() {
|
639
|
-
return this._conditionallyHidden || this.
|
650
|
+
return this._conditionallyHidden || this.parentConditionallyHidden;
|
640
651
|
}
|
641
652
|
/**
|
642
653
|
* Evaluates whether the component is conditionally hidden (as opposed to intentionally hidden, e.g. via the `hidden` component schema property).
|
@@ -645,10 +656,13 @@ export default class Component extends Element {
|
|
645
656
|
* @returns {boolean} - Whether the component is conditionally hidden.
|
646
657
|
*/
|
647
658
|
checkConditionallyHidden(data = null, row = null) {
|
659
|
+
this._conditionallyHidden = false;
|
648
660
|
if (!this.hasCondition()) {
|
649
|
-
|
661
|
+
this._conditionallyHidden = this.parentConditionallyHidden;
|
662
|
+
return this._conditionallyHidden;
|
650
663
|
}
|
651
|
-
|
664
|
+
this._conditionallyHidden = !this.conditionallyVisible(data, row) || this.parentConditionallyHidden;
|
665
|
+
return this._conditionallyHidden;
|
652
666
|
}
|
653
667
|
get currentForm() {
|
654
668
|
return this._currentForm;
|
@@ -1917,12 +1931,7 @@ export default class Component extends Element {
|
|
1917
1931
|
this.redraw();
|
1918
1932
|
}
|
1919
1933
|
// Check advanced conditions (and cache the result)
|
1920
|
-
const
|
1921
|
-
let shouldClear = false;
|
1922
|
-
if (isConditionallyHidden !== this._conditionallyHidden) {
|
1923
|
-
this._conditionallyHidden = isConditionallyHidden;
|
1924
|
-
shouldClear = true;
|
1925
|
-
}
|
1934
|
+
const shouldClear = this.checkConditionallyHidden(data, row);
|
1926
1935
|
// Check visibility
|
1927
1936
|
const visible = (this.hasCondition() ? !this.conditionallyHidden : !this.component.hidden);
|
1928
1937
|
if (this.visible !== visible) {
|
@@ -2463,8 +2472,7 @@ export default class Component extends Element {
|
|
2463
2472
|
* @returns {*} - The value for this component.
|
2464
2473
|
*/
|
2465
2474
|
get dataValue() {
|
2466
|
-
if (!this.key
|
2467
|
-
(this.conditionallyHidden && this.component.clearOnHide && !this.rootPristine)) {
|
2475
|
+
if (!this.key) {
|
2468
2476
|
return this.emptyValue;
|
2469
2477
|
}
|
2470
2478
|
if (!this.hasValue() && this.shouldAddDefaultValue) {
|
@@ -2481,9 +2489,7 @@ export default class Component extends Element {
|
|
2481
2489
|
* @param {*} value - The value to set for this component.
|
2482
2490
|
*/
|
2483
2491
|
set dataValue(value) {
|
2484
|
-
if (!this.allowData ||
|
2485
|
-
!this.key ||
|
2486
|
-
(this.conditionallyHidden && this.component.clearOnHide && !this.rootPristine)) {
|
2492
|
+
if (!this.allowData || !this.key) {
|
2487
2493
|
return;
|
2488
2494
|
}
|
2489
2495
|
if ((value !== null) && (value !== undefined)) {
|
@@ -81,18 +81,16 @@ export default class NestedComponent extends Field {
|
|
81
81
|
const visibilityChanged = this._visible !== value;
|
82
82
|
this._visible = value;
|
83
83
|
const isVisible = this.visible;
|
84
|
-
|
84
|
+
this.checkConditionallyHidden();
|
85
85
|
const forceShow = this.shouldForceShow();
|
86
86
|
const forceHide = this.shouldForceHide();
|
87
87
|
this.components.forEach((component) => {
|
88
88
|
// Set the parent visibility first since we may have nested components within nested components
|
89
89
|
// and they need to be able to determine their visibility based on the parent visibility.
|
90
90
|
component.parentVisible = isVisible;
|
91
|
-
component._parentConditionallyHidden = isConditionallyHidden;
|
92
91
|
let visible;
|
93
92
|
if (component.hasCondition()) {
|
94
|
-
|
95
|
-
visible = !component.conditionallyHidden;
|
93
|
+
visible = !component.checkConditionallyHidden();
|
96
94
|
}
|
97
95
|
else {
|
98
96
|
visible = !component.component.hidden;
|
@@ -373,7 +371,6 @@ export default class NestedComponent extends Field {
|
|
373
371
|
data = data || this.data;
|
374
372
|
options.parent = this;
|
375
373
|
options.parentVisible = this.visible;
|
376
|
-
options.parentConditionallyHidden = this.conditionallyHidden;
|
377
374
|
options.root = options?.root || this.root || this;
|
378
375
|
options.localRoot = this.localRoot;
|
379
376
|
options.skipInit = true;
|
@@ -1150,9 +1150,6 @@ export default class EditGridComponent extends NestedArrayComponent {
|
|
1150
1150
|
}
|
1151
1151
|
}
|
1152
1152
|
const changed = this.hasChanged(value, this.dataValue);
|
1153
|
-
if (this.parent) {
|
1154
|
-
this.parent.checkComponentConditions();
|
1155
|
-
}
|
1156
1153
|
this.dataValue = value;
|
1157
1154
|
// Refresh editRow data when data changes.
|
1158
1155
|
this.dataValue.forEach((row, rowIndex) => {
|
@@ -1183,7 +1180,6 @@ export default class EditGridComponent extends NestedArrayComponent {
|
|
1183
1180
|
this.editRows = this.editRows.slice(0, dataLength);
|
1184
1181
|
this.openWhenEmpty();
|
1185
1182
|
this.updateOnChange(flags, changed);
|
1186
|
-
this.checkData();
|
1187
1183
|
this.changeState(changed, flags);
|
1188
1184
|
return changed;
|
1189
1185
|
}
|
@@ -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);
|
@@ -53,8 +53,7 @@ export default class HTMLComponent extends Component {
|
|
53
53
|
super.checkRefreshOn(changed);
|
54
54
|
let visible;
|
55
55
|
if (this.hasCondition()) {
|
56
|
-
|
57
|
-
visible = !this.conditionallyHidden;
|
56
|
+
visible = !this.checkConditionallyHidden();
|
58
57
|
}
|
59
58
|
else {
|
60
59
|
visible = !this.component.hidden;
|
@@ -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') {
|
@@ -138,6 +138,7 @@ export default class TabsComponent extends NestedComponent {
|
|
138
138
|
this.addClass(this.refs[this.tabLinkKey][index], 'active');
|
139
139
|
this.addClass(this.refs[this.tabLinkKey][index], 'formio-tab-link-active');
|
140
140
|
}
|
141
|
+
this.setValue(this.data);
|
141
142
|
this.triggerChange();
|
142
143
|
}
|
143
144
|
beforeFocus(component) {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { componentValueTypes, getComponentSavedTypes } from '../../utils/utils';
|
2
2
|
import Input from '../_classes/input/Input';
|
3
|
-
import Choices from '
|
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.
|
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(
|
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
|
-
|
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(
|
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 '
|
17
|
+
import Choices from 'choices.js';
|
@@ -1,41 +1,7 @@
|
|
1
|
-
import Choices from '
|
2
|
-
|
3
|
-
|
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
|
-
|
67
|
-
|
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 (
|
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(
|
98
|
-
if (
|
99
|
-
this._selectHighlightedChoice(
|
52
|
+
_onTabKey() {
|
53
|
+
if (this.dropdown.isActive) {
|
54
|
+
this._selectHighlightedChoice();
|
100
55
|
}
|
101
56
|
}
|
102
57
|
_selectHighlightedChoice() {
|
103
|
-
const highlightedChoice = this.dropdown.
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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(
|
81
|
+
onSelectValue(event, hasActiveDropdown) {
|
171
82
|
if (hasActiveDropdown) {
|
172
|
-
this._selectHighlightedChoice(
|
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
|
-
|
181
|
-
this.shouldOpenDropDown
|
182
|
-
|
183
|
-
|
184
|
-
|
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.
|
3
|
+
"version": "5.1.0-dev.6036.0df1d6a",
|
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",
|