UNPKG

2.58 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.deselectOptions = exports.selectOptions = void 0;
7
8var _dom = require("@testing-library/dom");
9
10var _click = require("./click");
11
12var _focus = require("./focus");
13
14function selectOptionsBase(newValue, select, values, init) {
15 if (!newValue && !select.multiple) {
16 throw (0, _dom.getConfig)().getElementError(`Unable to deselect an option in a non-multiple select. Use selectOptions to change the selection instead.`, select);
17 }
18
19 const valArray = Array.isArray(values) ? values : [values];
20 const allOptions = Array.from(select.querySelectorAll('option'));
21 const selectedOptions = valArray.map(val => {
22 if (allOptions.includes(val)) {
23 return val;
24 } else {
25 const matchingOption = allOptions.find(o => o.value === val);
26
27 if (matchingOption) {
28 return matchingOption;
29 } else {
30 throw (0, _dom.getConfig)().getElementError(`Value "${val}" not found in options`, select);
31 }
32 }
33 }).filter(option => !option.disabled);
34 if (select.disabled || !selectedOptions.length) return;
35
36 if (select.multiple) {
37 for (const option of selectedOptions) {
38 // events fired for multiple select are weird. Can't use hover...
39 _dom.fireEvent.pointerOver(option, init);
40
41 _dom.fireEvent.pointerEnter(select, init);
42
43 _dom.fireEvent.mouseOver(option);
44
45 _dom.fireEvent.mouseEnter(select);
46
47 _dom.fireEvent.pointerMove(option, init);
48
49 _dom.fireEvent.mouseMove(option, init);
50
51 _dom.fireEvent.pointerDown(option, init);
52
53 _dom.fireEvent.mouseDown(option, init);
54
55 (0, _focus.focus)(select, init);
56
57 _dom.fireEvent.pointerUp(option, init);
58
59 _dom.fireEvent.mouseUp(option, init);
60
61 selectOption(option);
62
63 _dom.fireEvent.click(option, init);
64 }
65 } else if (selectedOptions.length === 1) {
66 (0, _click.click)(select, init);
67 selectOption(selectedOptions[0]);
68 } else {
69 throw (0, _dom.getConfig)().getElementError(`Cannot select multiple options on a non-multiple select`, select);
70 }
71
72 function selectOption(option) {
73 option.selected = newValue;
74 (0, _dom.fireEvent)(select, (0, _dom.createEvent)('input', select, {
75 bubbles: true,
76 cancelable: false,
77 composed: true,
78 ...init
79 }));
80
81 _dom.fireEvent.change(select, init);
82 }
83}
84
85const selectOptions = selectOptionsBase.bind(null, true);
86exports.selectOptions = selectOptions;
87const deselectOptions = selectOptionsBase.bind(null, false);
88exports.deselectOptions = deselectOptions;
\No newline at end of file