From 88db9639b0ef7eac88d097ccc6975fe55abceede Mon Sep 17 00:00:00 2001
From: Xon <635541+Xon@users.noreply.github.com>
Date: Mon, 12 Aug 2024 17:34:43 +0800
Subject: [PATCH] Remove redux store in replace for hand-rolled replacement
design for in-place updates of the state. Avoids a lot of data copying, and
reduces bundle size
---
README.md | 2 +-
package-lock.json | 14 +-
package.json | 3 +-
public/assets/scripts/choices.js | 650 ++++--------------
public/assets/scripts/choices.min.js | 2 +-
public/assets/scripts/choices.min.mjs | 2 +-
public/assets/scripts/choices.mjs | 650 ++++--------------
public/assets/scripts/choices.search-basic.js | 650 ++++--------------
.../scripts/choices.search-basic.min.js | 2 +-
.../scripts/choices.search-basic.min.mjs | 2 +-
.../assets/scripts/choices.search-basic.mjs | 650 ++++--------------
.../assets/scripts/choices.search-prefix.js | 650 ++++--------------
.../scripts/choices.search-prefix.min.js | 2 +-
.../scripts/choices.search-prefix.min.mjs | 2 +-
.../assets/scripts/choices.search-prefix.mjs | 650 ++++--------------
public/types/src/scripts/actions/choices.d.ts | 17 +-
public/types/src/scripts/actions/groups.d.ts | 5 +-
public/types/src/scripts/actions/items.d.ts | 11 +-
public/types/src/scripts/actions/misc.d.ts | 10 -
public/types/src/scripts/choices.d.ts | 8 +-
.../src/scripts/interfaces/action-type.d.ts | 4 +-
.../types/src/scripts/interfaces/state.d.ts | 4 +-
.../types/src/scripts/interfaces/store.d.ts | 17 +-
.../types/src/scripts/reducers/choices.d.ts | 12 +-
public/types/src/scripts/reducers/groups.d.ts | 11 +-
public/types/src/scripts/reducers/index.d.ts | 5 -
public/types/src/scripts/reducers/items.d.ts | 11 +-
public/types/src/scripts/reducers/txn.d.ts | 5 -
public/types/src/scripts/store/store.d.ts | 24 +-
src/scripts/actions/choices.ts | 28 +-
src/scripts/actions/groups.ts | 6 +-
src/scripts/actions/items.ts | 16 +-
src/scripts/actions/misc.ts | 19 -
src/scripts/choices.ts | 39 +-
src/scripts/interfaces/action-type.ts | 2 -
src/scripts/interfaces/state.ts | 5 +-
src/scripts/interfaces/store.ts | 24 +-
src/scripts/reducers/choices.ts | 85 +--
src/scripts/reducers/groups.ts | 35 +-
src/scripts/reducers/index.ts | 39 --
src/scripts/reducers/items.ts | 103 ++-
src/scripts/reducers/txn.ts | 23 -
src/scripts/store/store.ts | 118 +++-
test/scripts/actions/misc.test.ts | 39 --
test/scripts/choices.test.ts | 39 +-
test/scripts/reducers/choices.test.ts | 93 +--
test/scripts/reducers/groups.test.ts | 49 +-
test/scripts/reducers/index.test.ts | 43 --
test/scripts/reducers/items.test.ts | 58 +-
test/scripts/reducers/txn.test.ts | 23 -
test/scripts/store/store.test.ts | 40 +-
51 files changed, 1308 insertions(+), 3693 deletions(-)
delete mode 100644 public/types/src/scripts/actions/misc.d.ts
delete mode 100644 public/types/src/scripts/reducers/index.d.ts
delete mode 100644 public/types/src/scripts/reducers/txn.d.ts
delete mode 100644 src/scripts/actions/misc.ts
delete mode 100644 src/scripts/reducers/index.ts
delete mode 100644 src/scripts/reducers/txn.ts
delete mode 100644 test/scripts/actions/misc.test.ts
delete mode 100644 test/scripts/reducers/index.test.ts
delete mode 100644 test/scripts/reducers/txn.test.ts
diff --git a/README.md b/README.md
index 6597b42a..bd7603bf 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Choices.js [](https://github.com/jshjohnson/Choices/actions) [](https://github.com/jshjohnson/Choices/actions) [](https://www.npmjs.com/package/choices.js)
-A vanilla, lightweight (~20.8kb gzipped 🎉), configurable select box/text input plugin. Similar to Select2 and Selectize but without the jQuery dependency.
+A vanilla, lightweight (~19.9kb gzipped 🎉), configurable select box/text input plugin. Similar to Select2 and Selectize but without the jQuery dependency.
[Demo](https://choices-js.github.io/Choices/)
diff --git a/package-lock.json b/package-lock.json
index 04ef2a84..4e6db4ee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,8 +9,7 @@
"version": "11.0.0-rc5",
"license": "MIT",
"dependencies": {
- "fuse.js": "^7.0.0",
- "redux": "^4.2.0"
+ "fuse.js": "^7.0.0"
},
"devDependencies": {
"@babel/cli": "^7.24.8",
@@ -1887,6 +1886,7 @@
"version": "7.25.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz",
"integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -12241,15 +12241,6 @@
"node": ">=8.10.0"
}
},
- "node_modules/redux": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
- "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.9.2"
- }
- },
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -12274,6 +12265,7 @@
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/regenerator-transform": {
diff --git a/package.json b/package.json
index 88ff66b9..4ca9dcf4 100644
--- a/package.json
+++ b/package.json
@@ -131,8 +131,7 @@
"vitest": "^2.0.5"
},
"dependencies": {
- "fuse.js": "^7.0.0",
- "redux": "^4.2.0"
+ "fuse.js": "^7.0.0"
},
"npmName": "choices.js",
"npmFileMap": [
diff --git a/public/assets/scripts/choices.js b/public/assets/scripts/choices.js
index b4cc7f5e..f837f450 100644
--- a/public/assets/scripts/choices.js
+++ b/public/assets/scripts/choices.js
@@ -105,14 +105,6 @@
highlighted: highlighted,
}); };
- var clearAll = function () { return ({
- type: "CLEAR_ALL" /* ActionType.CLEAR_ALL */,
- }); };
- var setTxn = function (txn) { return ({
- type: "SET_TRANSACTION" /* ActionType.SET_TRANSACTION */,
- txn: txn,
- }); };
-
/* eslint-disable @typescript-eslint/no-explicit-any */
var getRandomNumber = function (min, max) {
return Math.floor(Math.random() * (max - min) + min);
@@ -240,9 +232,6 @@
});
return element.dispatchEvent(event);
};
- var cloneObject = function (obj) {
- return obj !== undefined ? JSON.parse(JSON.stringify(obj)) : undefined;
- };
/**
* Returns an array of keys present on the first but missing on the second object
*/
@@ -980,447 +969,85 @@
var ObjectsInConfig = ['fuseOptions', 'classNames'];
- /**
- * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js
- *
- * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes
- * during build.
- * @param {number} code
- */
- function formatProdErrorMessage(code) {
- return "Minified Redux error #" + code + "; visit https://redux.js.org/Errors?code=" + code + " for the full message or " + 'use the non-minified dev environment for full errors. ';
- }
-
- // Inlined version of the `symbol-observable` polyfill
- var $$observable = function () {
- return typeof Symbol === 'function' && Symbol.observable || '@@observable';
- }();
-
- /**
- * These are private action types reserved by Redux.
- * For any unknown actions, you must return the current state.
- * If the current state is undefined, you must return the initial state.
- * Do not reference these action types directly in your code.
- */
- var randomString = function randomString() {
- return Math.random().toString(36).substring(7).split('').join('.');
- };
- var ActionTypes = {
- INIT: "@@redux/INIT" + randomString(),
- REPLACE: "@@redux/REPLACE" + randomString(),
- PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {
- return "@@redux/PROBE_UNKNOWN_ACTION" + randomString();
- }
- };
-
- /**
- * @param {any} obj The object to inspect.
- * @returns {boolean} True if the argument appears to be a plain object.
- */
- function isPlainObject(obj) {
- if (typeof obj !== 'object' || obj === null) return false;
- var proto = obj;
- while (Object.getPrototypeOf(proto) !== null) {
- proto = Object.getPrototypeOf(proto);
- }
- return Object.getPrototypeOf(obj) === proto;
- }
-
- /**
- * @deprecated
- *
- * **We recommend using the `configureStore` method
- * of the `@reduxjs/toolkit` package**, which replaces `createStore`.
- *
- * Redux Toolkit is our recommended approach for writing Redux logic today,
- * including store setup, reducers, data fetching, and more.
- *
- * **For more details, please read this Redux docs page:**
- * **https://redux.js.org/introduction/why-rtk-is-redux-today**
- *
- * `configureStore` from Redux Toolkit is an improved version of `createStore` that
- * simplifies setup and helps avoid common bugs.
- *
- * You should not be using the `redux` core package by itself today, except for learning purposes.
- * The `createStore` method from the core `redux` package will not be removed, but we encourage
- * all users to migrate to using Redux Toolkit for all Redux code.
- *
- * If you want to use `createStore` without this visual deprecation warning, use
- * the `legacy_createStore` import instead:
- *
- * `import { legacy_createStore as createStore} from 'redux'`
- *
- */
-
- function createStore(reducer, preloadedState, enhancer) {
- var _ref2;
- if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {
- throw new Error(formatProdErrorMessage(0) );
- }
- if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
- enhancer = preloadedState;
- preloadedState = undefined;
- }
- if (typeof enhancer !== 'undefined') {
- if (typeof enhancer !== 'function') {
- throw new Error(formatProdErrorMessage(1) );
- }
- return enhancer(createStore)(reducer, preloadedState);
- }
- if (typeof reducer !== 'function') {
- throw new Error(formatProdErrorMessage(2) );
- }
- var currentReducer = reducer;
- var currentState = preloadedState;
- var currentListeners = [];
- var nextListeners = currentListeners;
- var isDispatching = false;
- /**
- * This makes a shallow copy of currentListeners so we can use
- * nextListeners as a temporary list while dispatching.
- *
- * This prevents any bugs around consumers calling
- * subscribe/unsubscribe in the middle of a dispatch.
- */
-
- function ensureCanMutateNextListeners() {
- if (nextListeners === currentListeners) {
- nextListeners = currentListeners.slice();
- }
- }
- /**
- * Reads the state tree managed by the store.
- *
- * @returns {any} The current state tree of your application.
- */
-
- function getState() {
- if (isDispatching) {
- throw new Error(formatProdErrorMessage(3) );
- }
- return currentState;
- }
- /**
- * Adds a change listener. It will be called any time an action is dispatched,
- * and some part of the state tree may potentially have changed. You may then
- * call `getState()` to read the current state tree inside the callback.
- *
- * You may call `dispatch()` from a change listener, with the following
- * caveats:
- *
- * 1. The subscriptions are snapshotted just before every `dispatch()` call.
- * If you subscribe or unsubscribe while the listeners are being invoked, this
- * will not have any effect on the `dispatch()` that is currently in progress.
- * However, the next `dispatch()` call, whether nested or not, will use a more
- * recent snapshot of the subscription list.
- *
- * 2. The listener should not expect to see all state changes, as the state
- * might have been updated multiple times during a nested `dispatch()` before
- * the listener is called. It is, however, guaranteed that all subscribers
- * registered before the `dispatch()` started will be called with the latest
- * state by the time it exits.
- *
- * @param {Function} listener A callback to be invoked on every dispatch.
- * @returns {Function} A function to remove this change listener.
- */
-
- function subscribe(listener) {
- if (typeof listener !== 'function') {
- throw new Error(formatProdErrorMessage(4) );
- }
- if (isDispatching) {
- throw new Error(formatProdErrorMessage(5) );
- }
- var isSubscribed = true;
- ensureCanMutateNextListeners();
- nextListeners.push(listener);
- return function unsubscribe() {
- if (!isSubscribed) {
- return;
- }
- if (isDispatching) {
- throw new Error(formatProdErrorMessage(6) );
- }
- isSubscribed = false;
- ensureCanMutateNextListeners();
- var index = nextListeners.indexOf(listener);
- nextListeners.splice(index, 1);
- currentListeners = null;
- };
- }
- /**
- * Dispatches an action. It is the only way to trigger a state change.
- *
- * The `reducer` function, used to create the store, will be called with the
- * current state tree and the given `action`. Its return value will
- * be considered the **next** state of the tree, and the change listeners
- * will be notified.
- *
- * The base implementation only supports plain object actions. If you want to
- * dispatch a Promise, an Observable, a thunk, or something else, you need to
- * wrap your store creating function into the corresponding middleware. For
- * example, see the documentation for the `redux-thunk` package. Even the
- * middleware will eventually dispatch plain object actions using this method.
- *
- * @param {Object} action A plain object representing “what changed”. It is
- * a good idea to keep actions serializable so you can record and replay user
- * sessions, or use the time travelling `redux-devtools`. An action must have
- * a `type` property which may not be `undefined`. It is a good idea to use
- * string constants for action types.
- *
- * @returns {Object} For convenience, the same action object you dispatched.
- *
- * Note that, if you use a custom middleware, it may wrap `dispatch()` to
- * return something else (for example, a Promise you can await).
- */
-
- function dispatch(action) {
- if (!isPlainObject(action)) {
- throw new Error(formatProdErrorMessage(7) );
- }
- if (typeof action.type === 'undefined') {
- throw new Error(formatProdErrorMessage(8) );
- }
- if (isDispatching) {
- throw new Error(formatProdErrorMessage(9) );
- }
- try {
- isDispatching = true;
- currentState = currentReducer(currentState, action);
- } finally {
- isDispatching = false;
- }
- var listeners = currentListeners = nextListeners;
- for (var i = 0; i < listeners.length; i++) {
- var listener = listeners[i];
- listener();
- }
- return action;
- }
- /**
- * Replaces the reducer currently used by the store to calculate the state.
- *
- * You might need this if your app implements code splitting and you want to
- * load some of the reducers dynamically. You might also need this if you
- * implement a hot reloading mechanism for Redux.
- *
- * @param {Function} nextReducer The reducer for the store to use instead.
- * @returns {void}
- */
-
- function replaceReducer(nextReducer) {
- if (typeof nextReducer !== 'function') {
- throw new Error(formatProdErrorMessage(10) );
- }
- currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.
- // Any reducers that existed in both the new and old rootReducer
- // will receive the previous state. This effectively populates
- // the new state tree with any relevant data from the old one.
-
- dispatch({
- type: ActionTypes.REPLACE
- });
- }
- /**
- * Interoperability point for observable/reactive libraries.
- * @returns {observable} A minimal observable of state changes.
- * For more information, see the observable proposal:
- * https://github.com/tc39/proposal-observable
- */
-
- function observable() {
- var _ref;
- var outerSubscribe = subscribe;
- return _ref = {
- /**
- * The minimal observable subscription method.
- * @param {Object} observer Any object that can be used as an observer.
- * The observer object should have a `next` method.
- * @returns {subscription} An object with an `unsubscribe` method that can
- * be used to unsubscribe the observable from the store, and prevent further
- * emission of values from the observable.
- */
- subscribe: function subscribe(observer) {
- if (typeof observer !== 'object' || observer === null) {
- throw new Error(formatProdErrorMessage(11) );
- }
- function observeState() {
- if (observer.next) {
- observer.next(getState());
- }
- }
- observeState();
- var unsubscribe = outerSubscribe(observeState);
- return {
- unsubscribe: unsubscribe
- };
- }
- }, _ref[$$observable] = function () {
- return this;
- }, _ref;
- } // When a store is created, an "INIT" action is dispatched so that every
- // reducer returns their initial state. This effectively populates
- // the initial state tree.
-
- dispatch({
- type: ActionTypes.INIT
- });
- return _ref2 = {
- dispatch: dispatch,
- subscribe: subscribe,
- getState: getState,
- replaceReducer: replaceReducer
- }, _ref2[$$observable] = observable, _ref2;
- }
- function assertReducerShape(reducers) {
- Object.keys(reducers).forEach(function (key) {
- var reducer = reducers[key];
- var initialState = reducer(undefined, {
- type: ActionTypes.INIT
- });
- if (typeof initialState === 'undefined') {
- throw new Error(formatProdErrorMessage(12) );
- }
- if (typeof reducer(undefined, {
- type: ActionTypes.PROBE_UNKNOWN_ACTION()
- }) === 'undefined') {
- throw new Error(formatProdErrorMessage(13) );
- }
- });
- }
- /**
- * Turns an object whose values are different reducer functions, into a single
- * reducer function. It will call every child reducer, and gather their results
- * into a single state object, whose keys correspond to the keys of the passed
- * reducer functions.
- *
- * @param {Object} reducers An object whose values correspond to different
- * reducer functions that need to be combined into one. One handy way to obtain
- * it is to use ES6 `import * as reducers` syntax. The reducers may never return
- * undefined for any action. Instead, they should return their initial state
- * if the state passed to them was undefined, and the current state for any
- * unrecognized action.
- *
- * @returns {Function} A reducer function that invokes every reducer inside the
- * passed object, and builds a state object with the same shape.
- */
-
- function combineReducers(reducers) {
- var reducerKeys = Object.keys(reducers);
- var finalReducers = {};
- for (var i = 0; i < reducerKeys.length; i++) {
- var key = reducerKeys[i];
- if (typeof reducers[key] === 'function') {
- finalReducers[key] = reducers[key];
- }
- }
- var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same
- var shapeAssertionError;
- try {
- assertReducerShape(finalReducers);
- } catch (e) {
- shapeAssertionError = e;
- }
- return function combination(state, action) {
- if (state === void 0) {
- state = {};
- }
- if (shapeAssertionError) {
- throw shapeAssertionError;
- }
- var hasChanged = false;
- var nextState = {};
- for (var _i = 0; _i < finalReducerKeys.length; _i++) {
- var _key = finalReducerKeys[_i];
- var reducer = finalReducers[_key];
- var previousStateForKey = state[_key];
- var nextStateForKey = reducer(previousStateForKey, action);
- if (typeof nextStateForKey === 'undefined') {
- action && action.type;
- throw new Error(formatProdErrorMessage(14) );
- }
- nextState[_key] = nextStateForKey;
- hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
- }
- hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;
- return hasChanged ? nextState : state;
- };
- }
-
- function items(state, action) {
- if (state === void 0) { state = []; }
- if (action === void 0) { action = {}; }
+ function items(s, action) {
+ var state = s;
+ var update = false;
switch (action.type) {
case "ADD_ITEM" /* ActionType.ADD_ITEM */: {
var item = action.item;
- if (!item.id) {
- return state;
+ if (item.id) {
+ item.selected = true;
+ var el = item.element;
+ if (el) {
+ el.selected = true;
+ el.setAttribute('selected', '');
+ }
+ update = true;
+ state.push(item);
+ state.forEach(function (obj) {
+ // eslint-disable-next-line no-param-reassign
+ obj.highlighted = false;
+ });
}
- item.selected = true;
- var el = item.element;
- if (el) {
- el.selected = true;
- el.setAttribute('selected', '');
- }
- return __spreadArray(__spreadArray([], state, true), [item], false).map(function (obj) {
- var choice = obj;
- choice.highlighted = false;
- return choice;
- });
+ break;
}
case "REMOVE_ITEM" /* ActionType.REMOVE_ITEM */: {
var item_1 = action.item;
- if (!item_1.id) {
- return state;
+ if (item_1.id) {
+ item_1.selected = false;
+ var el = item_1.element;
+ if (el) {
+ el.selected = false;
+ el.removeAttribute('selected');
+ }
+ update = true;
+ state = state.filter(function (choice) { return choice.id !== item_1.id; });
}
- item_1.selected = false;
- var el = item_1.element;
- if (el) {
- el.selected = false;
- el.removeAttribute('selected');
- }
- return state.filter(function (choice) { return choice.id !== item_1.id; });
+ break;
}
case "REMOVE_CHOICE" /* ActionType.REMOVE_CHOICE */: {
var choice_1 = action.choice;
- return state.filter(function (item) { return item.id !== choice_1.id; });
+ update = true;
+ state = state.filter(function (item) { return item.id !== choice_1.id; });
+ break;
}
case "HIGHLIGHT_ITEM" /* ActionType.HIGHLIGHT_ITEM */: {
var highlightItemAction_1 = action;
- return state.map(function (obj) {
+ update = true;
+ state.forEach(function (obj) {
var item = obj;
if (item.id === highlightItemAction_1.item.id) {
item.highlighted = highlightItemAction_1.highlighted;
}
- return item;
});
- }
- default: {
- return state;
+ break;
}
}
+ return { state: state, update: update };
}
- function groups(state, action) {
- if (state === void 0) { state = []; }
- if (action === void 0) { action = {}; }
+ function groups(s, action) {
+ var state = s;
+ var update = false;
switch (action.type) {
case "ADD_GROUP" /* ActionType.ADD_GROUP */: {
var addGroupAction = action;
- return __spreadArray(__spreadArray([], state, true), [addGroupAction.group], false);
+ update = true;
+ state.push(addGroupAction.group);
+ break;
}
case "CLEAR_CHOICES" /* ActionType.CLEAR_CHOICES */: {
- return [];
- }
- default: {
- return state;
+ update = true;
+ state = [];
+ break;
}
}
+ return { state: state, update: update };
}
- function choices(state, action) {
- if (state === void 0) { state = []; }
- if (action === void 0) { action = {}; }
+ function choices(s, action) {
+ var state = s;
+ var update = false;
switch (action.type) {
case "ADD_CHOICE" /* ActionType.ADD_CHOICE */: {
var choice = action.choice;
@@ -1429,36 +1056,41 @@
A selected choice has been added to the passed input's value (added as an item)
An active choice appears within the choice dropdown
*/
- return __spreadArray(__spreadArray([], state, true), [choice], false);
+ state.push(choice);
+ update = true;
+ break;
}
case "REMOVE_CHOICE" /* ActionType.REMOVE_CHOICE */: {
var choice_1 = action.choice;
- return state.filter(function (obj) { return obj.id !== choice_1.id; });
+ update = true;
+ state = state.filter(function (obj) { return obj.id !== choice_1.id; });
+ break;
}
case "ADD_ITEM" /* ActionType.ADD_ITEM */: {
var item = action.item;
// trigger a rebuild of the choices list as the item can not be added multiple times
if (item.id && item.selected) {
- return __spreadArray([], state, true);
+ update = true;
}
- return state;
+ break;
}
case "REMOVE_ITEM" /* ActionType.REMOVE_ITEM */: {
var item = action.item;
// trigger a rebuild of the choices list as the item can be added
if (item.id && !item.selected) {
- return __spreadArray([], state, true);
+ update = true;
}
- return state;
+ break;
}
case "FILTER_CHOICES" /* ActionType.FILTER_CHOICES */: {
var results = action.results;
+ update = true;
// avoid O(n^2) algorithm complexity when searching/filtering choices
var scoreLookup_1 = [];
results.forEach(function (result) {
scoreLookup_1[result.item.id] = result;
});
- return state.map(function (obj) {
+ state.forEach(function (obj) {
var choice = obj;
var result = scoreLookup_1[choice.id];
if (result !== undefined) {
@@ -1471,102 +1103,110 @@
choice.rank = 0;
choice.active = false;
}
- return choice;
});
+ break;
}
case "ACTIVATE_CHOICES" /* ActionType.ACTIVATE_CHOICES */: {
var active_1 = action.active;
- return state.map(function (obj) {
+ update = true;
+ state.forEach(function (obj) {
var choice = obj;
choice.active = active_1;
return choice;
});
+ break;
}
case "CLEAR_CHOICES" /* ActionType.CLEAR_CHOICES */: {
- return [];
- }
- default: {
- return state;
+ update = true;
+ state = [];
+ break;
}
}
+ return { state: state, update: update };
}
- var general = function (state, action) {
- if (state === void 0) { state = 0; }
- if (action === void 0) { action = {}; }
- switch (action.type) {
- case "SET_TRANSACTION" /* ActionType.SET_TRANSACTION */: {
- if (action.txn) {
- return state + 1;
- }
- return Math.max(0, state - 1);
- }
- default: {
- return state;
- }
- }
- };
-
- var defaultState = {
- groups: [],
- items: [],
- choices: [],
- txn: 0,
- };
- var appReducer = combineReducers({
- items: items,
+ var reducers = {
groups: groups,
+ items: items,
choices: choices,
- txn: general,
- });
- var rootReducer = function (passedState, action) {
- var state = passedState;
- // If we are clearing all items, groups and options we reassign
- // state and then pass that state to our proper reducer. This isn't
- // mutating our actual state
- // See: http://stackoverflow.com/a/35641992
- if (action.type === "CLEAR_ALL" /* ActionType.CLEAR_ALL */) {
- // preserve the txn state as to allow withTxn to work
- var paused = state.txn;
- state = cloneObject(defaultState);
- state.txn = paused;
- }
- return appReducer(state, action);
};
-
- /* eslint-disable @typescript-eslint/no-explicit-any */
var Store = /** @class */ (function () {
function Store() {
- this._store = createStore(rootReducer, window.__REDUX_DEVTOOLS_EXTENSION__ &&
- window.__REDUX_DEVTOOLS_EXTENSION__());
+ this._store = this.defaultState;
+ this._listeners = [];
+ this._txn = 0;
}
- /**
- * Subscribe store to function call (wrapped Redux method)
- */
- Store.prototype.subscribe = function (onChange) {
- this._store.subscribe(onChange);
+ Object.defineProperty(Store.prototype, "defaultState", {
+ // eslint-disable-next-line class-methods-use-this
+ get: function () {
+ return {
+ groups: [],
+ items: [],
+ choices: [],
+ };
+ },
+ enumerable: false,
+ configurable: true
+ });
+ // eslint-disable-next-line class-methods-use-this
+ Store.prototype.changeSet = function (init) {
+ return {
+ groups: init,
+ items: init,
+ choices: init,
+ };
+ };
+ Store.prototype.resetStore = function () {
+ this._store = this.defaultState;
+ var changes = this.changeSet(true);
+ this._listeners.forEach(function (l) { return l(changes); });
+ };
+ Store.prototype.subscribe = function (onChange) {
+ this._listeners.push(onChange);
};
- /**
- * Dispatch event to store (wrapped Redux method)
- */
Store.prototype.dispatch = function (action) {
- this._store.dispatch(action);
+ var state = this._store;
+ var hasChanges = false;
+ var changes = this._outstandingChanges || this.changeSet(false);
+ Object.keys(reducers).forEach(function (key) {
+ var stateUpdate = reducers[key](state[key], action);
+ if (stateUpdate.update) {
+ hasChanges = true;
+ changes[key] = true;
+ state[key] = stateUpdate.state;
+ }
+ });
+ if (hasChanges) {
+ if (this._txn) {
+ this._outstandingChanges = changes;
+ }
+ else {
+ this._listeners.forEach(function (l) { return l(changes); });
+ }
+ }
};
Store.prototype.withTxn = function (func) {
- this._store.dispatch(setTxn(true));
+ this._txn++;
try {
func();
}
finally {
- this._store.dispatch(setTxn(false));
+ this._txn = Math.max(0, this._txn - 1);
+ if (!this._txn) {
+ var changeSet_1 = this._outstandingChanges;
+ if (changeSet_1) {
+ this._outstandingChanges = undefined;
+ this._listeners.forEach(function (l) { return l(changeSet_1); });
+ }
+ }
}
};
Object.defineProperty(Store.prototype, "state", {
/**
- * Get store object (wrapping Redux method)
+ * Get store object
*/
get: function () {
- return this._store.getState();
+ return this._store;
},
enumerable: false,
configurable: true
@@ -1636,10 +1276,10 @@
* Get active groups from store
*/
get: function () {
- var _a = this, groups = _a.groups, choices = _a.choices;
- return groups.filter(function (group) {
+ var _this = this;
+ return this.state.groups.filter(function (group) {
var isActive = group.active && !group.disabled;
- var hasActiveOptions = choices.some(function (choice) { return choice.active && !choice.disabled; });
+ var hasActiveOptions = _this.state.choices.some(function (choice) { return choice.active && !choice.disabled; });
return isActive && hasActiveOptions;
}, []);
},
@@ -1647,7 +1287,7 @@
configurable: true
});
Store.prototype.inTxn = function () {
- return this.state.txn > 0;
+ return this._txn > 0;
};
/**
* Get single choice by it's ID
@@ -3734,9 +3374,6 @@
}
this.initialised = false;
this._store = new Store();
- this._initialState = defaultState;
- this._currentState = defaultState;
- this._prevState = defaultState;
this._currentValue = '';
this.config.searchEnabled =
(!this._isTextElement && this.config.searchEnabled) ||
@@ -3819,8 +3456,7 @@
this._createTemplates();
this._createElements();
this._createStructure();
- this._store.subscribe(this._render);
- this._render();
+ this._initStore();
this._addEventListeners();
var shouldDisable = (this._isTextElement && !this.config.addItems) ||
this.passedElement.element.hasAttribute('disabled') ||
@@ -3844,6 +3480,7 @@
this.passedElement.reveal();
this.containerOuter.unwrap(this.passedElement.element);
this.clearStore();
+ this._store._listeners = [];
this._stopSearch();
this._templates = templates;
this.initialised = false;
@@ -4249,7 +3886,7 @@
return this;
};
Choices.prototype.clearStore = function () {
- this._store.dispatch(clearAll());
+ this._store.resetStore();
this._lastAddedChoiceId = 0;
this._lastAddedGroupId = 0;
// @todo integrate with Store
@@ -4278,15 +3915,12 @@
}
}
};
- Choices.prototype._render = function () {
+ Choices.prototype._render = function (changes) {
if (this._store.inTxn()) {
return;
}
- this._currentState = this._store.state;
- var shouldRenderItems = this._currentState.items !== this._prevState.items;
- var stateChanged = this._currentState.choices !== this._prevState.choices ||
- this._currentState.groups !== this._prevState.groups ||
- shouldRenderItems;
+ var shouldRenderItems = changes === null || changes === void 0 ? void 0 : changes.items;
+ var stateChanged = (changes === null || changes === void 0 ? void 0 : changes.choices) || (changes === null || changes === void 0 ? void 0 : changes.groups) || shouldRenderItems;
if (!stateChanged) {
return;
}
@@ -4296,7 +3930,6 @@
if (shouldRenderItems) {
this._renderItems();
}
- this._prevState = this._currentState;
};
Choices.prototype._renderChoices = function () {
var _this = this;
@@ -5515,7 +5148,6 @@
});
};
Choices.prototype._createStructure = function () {
- var _this = this;
// Hide original element
this.passedElement.conceal();
// Wrap input in container preserving DOM ordering
@@ -5543,6 +5175,10 @@
}
this._highlightPosition = 0;
this._isSearching = false;
+ };
+ Choices.prototype._initStore = function () {
+ var _this = this;
+ this._store.subscribe(this._render);
this._store.withTxn(function () {
_this._addPredefinedChoices(_this._presetChoices, _this._isSelectOneElement && !_this._hasNonChoicePlaceholder, false);
});
diff --git a/public/assets/scripts/choices.min.js b/public/assets/scripts/choices.min.js
index 06216ec2..462b4e4f 100644
--- a/public/assets/scripts/choices.min.js
+++ b/public/assets/scripts/choices.min.js
@@ -1,2 +1,2 @@
/*! choices.js v11.0.0-rc5 | © 2024 Josh Johnson | https://github.com/jshjohnson/Choices#readme */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Choices=t()}(this,(function(){"use strict";var e=function(t,i){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},e(t,i)};function t(t,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}var i=function(){return i=Object.assign||function(e){for(var t,i=1,n=arguments.length;i/g,">").replace(/0?this.element.scrollTop+r-s:e.offsetTop;requestAnimationFrame((function(){i._animateScroll(c,t)}))}},e.prototype._scrollDown=function(e,t,i){var n=(i-e)/t,s=n>1?n:1;this.element.scrollTop=e+s},e.prototype._scrollUp=function(e,t,i){var n=(e-i)/t,s=n>1?n:1;this.element.scrollTop=e-s},e.prototype._animateScroll=function(e,t){var i=this,n=this.element.scrollTop,s=!1;t>0?(this._scrollDown(n,4,e),ne&&(s=!0)),s&&requestAnimationFrame((function(){i._animateScroll(e,t)}))},e}(),C=function(){function e(e){var t=e.element,i=e.classNames;this.element=t,this.classNames=i,this.isDisabled=!1}return Object.defineProperty(e.prototype,"isActive",{get:function(){return"active"===this.element.dataset.choice},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"dir",{get:function(){return this.element.dir},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this.element.value},set:function(e){this.element.setAttribute("value",e),this.element.value=e},enumerable:!1,configurable:!0}),e.prototype.conceal=function(){var e;(e=this.element.classList).add.apply(e,d(this.classNames.input)),this.element.hidden=!0,this.element.tabIndex=-1;var t=this.element.getAttribute("style");t&&this.element.setAttribute("data-choice-orig-style",t),this.element.setAttribute("data-choice","active")},e.prototype.reveal=function(){var e;(e=this.element.classList).remove.apply(e,d(this.classNames.input)),this.element.hidden=!1,this.element.removeAttribute("tabindex");var t=this.element.getAttribute("data-choice-orig-style");t?(this.element.removeAttribute("data-choice-orig-style"),this.element.setAttribute("style",t)):this.element.removeAttribute("style"),this.element.removeAttribute("data-choice"),this.element.value=this.element.value},e.prototype.enable=function(){this.element.removeAttribute("disabled"),this.element.disabled=!1,this.isDisabled=!1},e.prototype.disable=function(){this.element.setAttribute("disabled",""),this.element.disabled=!0,this.isDisabled=!0},e.prototype.triggerEvent=function(e,t){!function(e,t,i){void 0===i&&(i=null);var n=new CustomEvent(t,{detail:i,bubbles:!0,cancelable:!0});e.dispatchEvent(n)}(this.element,e,t||{})},e}(),w=function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return t(i,e),i}(C),I=function(e,t){return void 0===t&&(t=!0),void 0===e?t:!!e},S=function(e){if("string"==typeof e&&(e=e.split(" ").filter((function(e){return 0!==e.length}))),Array.isArray(e)&&0!==e.length)return e},O=function(e,t){if("string"==typeof e)return O({value:e,label:e},!1);var i=e;if("choices"in i){if(!t)throw new TypeError("optGroup is not allowed");var n=i,s=n.choices.map((function(e){return O(e,!1)}));return{id:0,label:l(n.label)||n.value,active:0!==s.length,disabled:!!n.disabled,choices:s}}var o=i;return{id:0,groupId:0,score:0,rank:0,value:o.value,label:o.label||o.value,active:I(o.active),selected:I(o.selected,!1),disabled:I(o.disabled,!1),placeholder:I(o.placeholder,!1),highlighted:!1,labelClass:S(o.labelClass),labelDescription:o.labelDescription,customProperties:o.customProperties}},A=function(e){function i(t){var i=t.element,n=t.classNames,s=t.template,o=t.extractPlaceholder,r=e.call(this,{element:i,classNames:n})||this;return r.template=s,r.extractPlaceholder=o,r}return t(i,e),Object.defineProperty(i.prototype,"placeholderOption",{get:function(){return this.element.querySelector('option[value=""]')||this.element.querySelector("option[placeholder]")},enumerable:!1,configurable:!0}),i.prototype.addOptions=function(e){var t=this;e.forEach((function(e){var i=e;if(!i.element){var n=t.template(i);t.element.appendChild(n),i.element=n}}))},i.prototype.optionsAsChoices=function(){var e=this,t=[];return this.element.querySelectorAll(":scope > option, :scope > optgroup").forEach((function(i){!function(e){return"OPTION"===e.tagName}(i)?function(e){return"OPTGROUP"===e.tagName}(i)&&t.push(e._optgroupToChoice(i)):t.push(e._optionToChoice(i))})),t},i.prototype._optionToChoice=function(e){return{id:0,groupId:0,score:0,rank:0,value:e.value,label:e.innerHTML,element:e,active:!0,selected:this.extractPlaceholder?e.selected:e.hasAttribute("selected"),disabled:e.disabled,highlighted:!1,placeholder:this.extractPlaceholder&&(""===e.value||e.hasAttribute("placeholder")),labelClass:void 0!==e.dataset.labelClass?S(e.dataset.labelClass):void 0,labelDescription:void 0!==e.dataset.labelDescription?e.dataset.labelDescription:void 0,customProperties:f(e.dataset.customProperties)}},i.prototype._optgroupToChoice=function(e){var t=this,i=e.querySelectorAll("option"),n=Array.from(i).map((function(e){return t._optionToChoice(e)}));return{id:0,label:e.label||"",element:e,active:0!==n.length,disabled:e.disabled,choices:n}},i}(C),x={items:[],choices:[],silent:!1,renderChoiceLimit:-1,maxItemCount:-1,singleModeForMultiSelect:!1,addChoices:!1,addItems:!0,addItemFilter:function(e){return!!e&&""!==e},removeItems:!0,removeItemButton:!1,removeItemButtonAlignLeft:!1,editItems:!1,allowHTML:!1,allowHtmlUserInput:!1,duplicateItemsAllowed:!0,delimiter:",",paste:!0,searchEnabled:!0,searchChoices:!0,searchFloor:1,searchResultLimit:4,searchFields:["label","value"],position:"auto",resetScrollPosition:!0,shouldSort:!0,shouldSortItems:!1,sorter:function(e,t){var i=e.value,n=e.label,s=void 0===n?i:n,o=t.value,r=t.label,c=void 0===r?o:r;return l(s).localeCompare(l(c),[],{sensitivity:"base",ignorePunctuation:!0,numeric:!0})},shadowRoot:null,placeholder:!0,placeholderValue:null,searchPlaceholderValue:null,prependValue:null,appendValue:null,renderSelectedChoices:"auto",loadingText:"Loading...",noResultsText:"No results found",noChoicesText:"No choices to choose from",itemSelectText:"Press to select",uniqueItemText:"Only unique values can be added",customAddItemText:"Only values matching specific conditions can be added",addItemText:function(e){return'Press Enter to add "'.concat(e,'"')},removeItemIconText:function(){return"Remove item"},removeItemLabelText:function(e){return"Remove item: ".concat(e)},maxItemText:function(e){return"Only ".concat(e," values can be added")},valueComparer:function(e,t){return e===t},fuseOptions:{includeScore:!0},labelId:"",callbackOnInit:null,callbackOnCreateTemplates:null,classNames:{containerOuter:["choices"],containerInner:["choices__inner"],input:["choices__input"],inputCloned:["choices__input--cloned"],list:["choices__list"],listItems:["choices__list--multiple"],listSingle:["choices__list--single"],listDropdown:["choices__list--dropdown"],item:["choices__item"],itemSelectable:["choices__item--selectable"],itemDisabled:["choices__item--disabled"],itemChoice:["choices__item--choice"],description:["choices__description"],placeholder:["choices__placeholder"],group:["choices__group"],groupHeading:["choices__heading"],button:["choices__button"],activeState:["is-active"],focusState:["is-focused"],openState:["is-open"],disabledState:["is-disabled"],highlightedState:["is-highlighted"],selectedState:["is-selected"],flippedState:["is-flipped"],loadingState:["is-loading"],addChoice:["choices__item","choices__item--selectable","add-choice"],noResults:["has-no-results"],noChoices:["has-no-choices"]},appendGroupInSearch:!1},L=["fuseOptions","classNames"];function T(e){return"Minified Redux error #"+e+"; visit https://redux.js.org/Errors?code="+e+" for the full message or use the non-minified dev environment for full errors. "}var M="function"==typeof Symbol&&Symbol.observable||"@@observable",N=function(){return Math.random().toString(36).substring(7).split("").join(".")},F={INIT:"@@redux/INIT"+N(),REPLACE:"@@redux/REPLACE"+N(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+N()}};function j(e,t,i){var n;if("function"==typeof t&&"function"==typeof i||"function"==typeof i&&"function"==typeof arguments[3])throw new Error(T(0));if("function"==typeof t&&void 0===i&&(i=t,t=void 0),void 0!==i){if("function"!=typeof i)throw new Error(T(1));return i(j)(e,t)}if("function"!=typeof e)throw new Error(T(2));var s=e,o=t,r=[],c=r,a=!1;function h(){c===r&&(c=r.slice())}function l(){if(a)throw new Error(T(3));return o}function u(e){if("function"!=typeof e)throw new Error(T(4));if(a)throw new Error(T(5));var t=!0;return h(),c.push(e),function(){if(t){if(a)throw new Error(T(6));t=!1,h();var i=c.indexOf(e);c.splice(i,1),r=null}}}function d(e){if(!function(e){if("object"!=typeof e||null===e)return!1;for(var t=e;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}(e))throw new Error(T(7));if(void 0===e.type)throw new Error(T(8));if(a)throw new Error(T(9));try{a=!0,o=s(o,e)}finally{a=!1}for(var t=r=c,i=0;i0},e.prototype.getChoiceById=function(e){return this.activeChoices.find((function(t){return t.id===e}))},e.prototype.getGroupById=function(e){return this.groups.find((function(t){return t.id===e}))},e}(),H=function(e,t){return e?function(e){if("string"==typeof e)return e;if("object"==typeof e){if("escaped"in e)return e.escaped;if("trusted"in e)return e.trusted}return""}(t):a(t)},K=function(e,t){if(t){var i=e.dataset;"string"==typeof t?i.customProperties=t:"object"!=typeof t||function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}(t)||(i.customProperties=JSON.stringify(t))}},V={containerOuter:function(e,t,i,n,s,o,r){var c=e.classNames.containerOuter,a=Object.assign(document.createElement("div"),{className:d(c).join(" ")});return a.dataset.type=o,t&&(a.dir=t),n&&(a.tabIndex=0),i&&(a.setAttribute("role",s?"combobox":"listbox"),s&&a.setAttribute("aria-autocomplete","list")),a.setAttribute("aria-haspopup","true"),a.setAttribute("aria-expanded","false"),r&&a.setAttribute("aria-labelledby",r),a},containerInner:function(e){var t=e.classNames.containerInner;return Object.assign(document.createElement("div"),{className:d(t).join(" ")})},itemList:function(e,t){var i=e.classNames,n=i.list,s=i.listSingle,o=i.listItems;return Object.assign(document.createElement("div"),{className:"".concat(d(n).join(" ")," ").concat(t?d(s).join(" "):d(o).join(" "))})},placeholder:function(e,t){var i=e.allowHTML,n=e.classNames.placeholder;return Object.assign(document.createElement("div"),{className:d(n).join(" "),innerHTML:H(i,t)})},item:function(e,t,i){var n,s,o,r=e.allowHTML,c=e.removeItemButtonAlignLeft,h=e.classNames,l=h.item,u=h.button,p=h.highlightedState,f=h.itemSelectable,m=h.placeholder,g=t.id,v=t.value,_=t.label,y=t.labelClass,b=t.labelDescription,E=t.customProperties,C=t.active,w=t.disabled,I=t.highlighted,S=t.placeholder,O=Object.assign(document.createElement("div"),{className:d(l).join(" ")});if(y){var A=Object.assign(document.createElement("span"),{innerHTML:H(r,_),className:d(y).join(" ")});O.appendChild(A)}else O.innerHTML=H(r,_);if(Object.assign(O.dataset,{item:"",id:g,value:v}),y&&(O.dataset.labelClass=d(y).join(" ")),b&&(O.dataset.labelDescription=b),K(O,E),C&&O.setAttribute("aria-selected","true"),w&&O.setAttribute("aria-disabled","true"),S&&((n=O.classList).add.apply(n,d(m)),O.dataset.placeholder=""),(s=O.classList).add.apply(s,d(I?p:f)),i){w&&(o=O.classList).remove.apply(o,d(f)),O.dataset.deletable="";var x="function"==typeof this.config.removeItemIconText?this.config.removeItemIconText(a(v),v):this.config.removeItemIconText,L="function"==typeof this.config.removeItemLabelText?this.config.removeItemLabelText(a(v),v):this.config.removeItemLabelText,T=Object.assign(document.createElement("button"),{type:"button",className:d(u).join(" "),innerHTML:x});L&&T.setAttribute("aria-label",L),T.dataset.button="",c?O.insertAdjacentElement("afterbegin",T):O.appendChild(T)}return O},choiceList:function(e,t){var i=e.classNames.list,n=Object.assign(document.createElement("div"),{className:d(i).join(" ")});return t||n.setAttribute("aria-multiselectable","true"),n.setAttribute("role","listbox"),n},choiceGroup:function(e,t){var i=e.allowHTML,n=e.classNames,s=n.group,o=n.groupHeading,r=n.itemDisabled,c=t.id,a=t.label,h=t.disabled,l=Object.assign(document.createElement("div"),{className:"".concat(d(s).join(" ")," ").concat(h?d(r).join(" "):"")});return l.setAttribute("role","group"),Object.assign(l.dataset,{group:"",id:c,value:a}),h&&l.setAttribute("aria-disabled","true"),l.appendChild(Object.assign(document.createElement("div"),{className:d(o).join(" "),innerHTML:H(i,a)})),l},choice:function(e,t,i){var n,s,o,r,c,a=e.allowHTML,h=e.classNames,l=h.item,u=h.itemChoice,p=h.itemSelectable,f=h.selectedState,m=h.itemDisabled,g=h.description,v=h.placeholder,_=t.id,y=t.value,b=t.label,E=t.groupId,C=t.elementId,w=t.labelClass,I=t.labelDescription,S=t.disabled,O=t.selected,A=t.placeholder,x=Object.assign(document.createElement("div"),{id:C,className:"".concat(d(l).join(" ")," ").concat(d(u).join(" "))}),L=x;if(w){var T=Object.assign(document.createElement("span"),{innerHTML:H(a,b),className:d(w).join(" ")});L=T,x.appendChild(T)}else x.innerHTML=H(a,b);if(I){var M="".concat(C,"-description");L.setAttribute("aria-describedby",M);var N=Object.assign(document.createElement("span"),{innerHTML:H(a,I),id:M});(n=N.classList).add.apply(n,d(g)),x.appendChild(N)}return O&&(s=x.classList).add.apply(s,d(f)),A&&(o=x.classList).add.apply(o,d(v)),x.setAttribute("role",E&&E>0?"treeitem":"option"),Object.assign(x.dataset,{choice:"",id:_,value:y,selectText:i}),w&&(x.dataset.labelClass=d(w).join(" ")),I&&(x.dataset.labelDescription=I),S?((r=x.classList).add.apply(r,d(m)),x.dataset.choiceDisabled="",x.setAttribute("aria-disabled","true")):((c=x.classList).add.apply(c,d(p)),x.dataset.choiceSelectable=""),x},input:function(e,t){var i=e.classNames,n=i.input,s=i.inputCloned,o=Object.assign(document.createElement("input"),{type:"search",className:"".concat(d(n).join(" ")," ").concat(d(s).join(" ")),autocomplete:"off",autocapitalize:"off",spellcheck:!1});return o.setAttribute("role","textbox"),o.setAttribute("aria-autocomplete","list"),t&&o.setAttribute("aria-label",t),o},dropdown:function(e){var t,i,n=e.classNames,s=n.list,o=n.listDropdown,r=document.createElement("div");return(t=r.classList).add.apply(t,d(s)),(i=r.classList).add.apply(i,d(o)),r.setAttribute("aria-expanded","false"),r},notice:function(e,t,i){var s=e.allowHTML,o=e.classNames,r=o.item,c=o.itemChoice,a=o.addChoice,h=o.noResults,l=o.noChoices;void 0===i&&(i="");var u=n(n([],d(r),!0),d(c),!0);switch(i){case"add-choice":u.push.apply(u,d(a));break;case"no-results":u.push.apply(u,d(h));break;case"no-choices":u.push.apply(u,d(l))}var p=Object.assign(document.createElement("div"),{innerHTML:H(s,t),className:u.join(" ")});return"add-choice"===i&&(p.dataset.choiceSelectable="",p.dataset.choice=""),p},option:function(e){var t=e.label,i=e.value,n=e.labelClass,s=e.labelDescription,o=e.customProperties,r=e.active,c=e.disabled,a=l(t),h=new Option(a,i,!1,r);return n&&(h.dataset.labelClass=d(n).join(" ")),s&&(h.dataset.labelDescription=s),K(h,o),h.disabled=c,h}};function B(e,t,i){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var i=e[Symbol.toPrimitive];if(void 0!==i){var n=i.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function $(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function U(e){for(var t=1;t`Missing ${e} property in key`,ie=e=>`Property 'weight' in key '${e}' must be a positive integer`,ne=Object.prototype.hasOwnProperty;class se{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach((e=>{let i=oe(e);this._keys.push(i),this._keyMap[i.id]=i,t+=i.weight})),this._keys.forEach((e=>{e.weight/=t}))}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function oe(e){let t=null,i=null,n=null,s=1,o=null;if(X(e)||q(e))n=e,t=re(e),i=ce(e);else{if(!ne.call(e,"name"))throw new Error(te("name"));const r=e.name;if(n=r,ne.call(e,"weight")&&(s=e.weight,s<=0))throw new Error(ie(r));t=re(r),i=ce(r),o=e.getFn}return{path:t,id:i,weight:s,src:n,getFn:o}}function re(e){return q(e)?e:e.split(".")}function ce(e){return q(e)?e.join("."):e}const ae={useExtendedSearch:!1,getFn:function(e,t){let i=[],n=!1;const s=(e,t,o)=>{if(Y(e))if(t[o]){const r=e[t[o]];if(!Y(r))return;if(o===t.length-1&&(X(r)||J(r)||z(r)))i.push(G(r));else if(q(r)){n=!0;for(let e=0,i=r.length;ee.score===t.score?e.idx{this._keysMap[e.id]=t}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,X(this.docs[0])?this.docs.forEach(((e,t)=>{this._addString(e,t)})):this.docs.forEach(((e,t)=>{this._addObject(e,t)})),this.norm.clear())}add(e){const t=this.size();X(e)?this._addString(e,t):this._addObject(e,t)}removeAt(e){this.records.splice(e,1);for(let t=e,i=this.size();t{let s=t.getFn?t.getFn(e):this.getFn(e,t.path);if(Y(s))if(q(s)){let e=[];const t=[{nestedArrIndex:-1,value:s}];for(;t.length;){const{nestedArrIndex:i,value:n}=t.pop();if(Y(n))if(X(n)&&!Z(n)){let t={v:n,i:i,n:this.norm.get(n)};e.push(t)}else q(n)&&n.forEach(((e,i)=>{t.push({nestedArrIndex:i,value:e})}))}i.$[n]=e}else if(X(s)&&!Z(s)){let e={v:s,n:this.norm.get(s)};i.$[n]=e}})),this.records.push(i)}toJSON(){return{keys:this.keys,records:this.records}}}function de(e,t,{getFn:i=he.getFn,fieldNormWeight:n=he.fieldNormWeight}={}){const s=new ue({getFn:i,fieldNormWeight:n});return s.setKeys(e.map(oe)),s.setSources(t),s.create(),s}function pe(e,{errors:t=0,currentLocation:i=0,expectedLocation:n=0,distance:s=he.distance,ignoreLocation:o=he.ignoreLocation}={}){const r=t/e.length;if(o)return r;const c=Math.abs(n-i);return s?r+c/s:c?1:r}const fe=32;function me(e,t,i,{location:n=he.location,distance:s=he.distance,threshold:o=he.threshold,findAllMatches:r=he.findAllMatches,minMatchCharLength:c=he.minMatchCharLength,includeMatches:a=he.includeMatches,ignoreLocation:h=he.ignoreLocation}={}){if(t.length>fe)throw new Error(`Pattern length exceeds max of ${fe}.`);const l=t.length,u=e.length,d=Math.max(0,Math.min(n,u));let p=o,f=d;const m=c>1||a,g=m?Array(u):[];let v;for(;(v=e.indexOf(t,f))>-1;){let e=pe(t,{currentLocation:v,expectedLocation:d,distance:s,ignoreLocation:h});if(p=Math.min(e,p),f=v+l,m){let e=0;for(;e=a;o-=1){let r=o-1,c=i[e.charAt(r)];if(m&&(g[r]=+!!c),C[o]=(C[o+1]<<1|1)&c,n&&(C[o]|=(_[o+1]|_[o])<<1|1|_[o+1]),C[o]&E&&(y=pe(t,{errors:n,currentLocation:r,expectedLocation:d,distance:s,ignoreLocation:h}),y<=p)){if(p=y,f=r,f<=d)break;a=Math.max(1,2*d-f)}}if(pe(t,{errors:n+1,currentLocation:d,expectedLocation:d,distance:s,ignoreLocation:h})>p)break;_=C}const C={isMatch:f>=0,score:Math.max(.001,y)};if(m){const e=function(e=[],t=he.minMatchCharLength){let i=[],n=-1,s=-1,o=0;for(let r=e.length;o=t&&i.push([n,s]),n=-1)}return e[o-1]&&o-n>=t&&i.push([n,o-1]),i}(g,c);e.length?a&&(C.indices=e):C.isMatch=!1}return C}function ge(e){let t={};for(let i=0,n=e.length;i{this.chunks.push({pattern:e,alphabet:ge(e),startIndex:t})},l=this.pattern.length;if(l>fe){let e=0;const t=l%fe,i=l-t;for(;e{const{isMatch:f,score:m,indices:g}=me(e,t,d,{location:n+p,distance:s,threshold:o,findAllMatches:r,minMatchCharLength:c,includeMatches:i,ignoreLocation:a});f&&(u=!0),l+=m,f&&g&&(h=[...h,...g])}));let d={isMatch:u,score:u?l/this.chunks.length:1};return u&&i&&(d.indices=h),d}}class _e{constructor(e){this.pattern=e}static isMultiMatch(e){return ye(e,this.multiRegex)}static isSingleMatch(e){return ye(e,this.singleRegex)}search(){}}function ye(e,t){const i=e.match(t);return i?i[1]:null}class be extends _e{constructor(e,{location:t=he.location,threshold:i=he.threshold,distance:n=he.distance,includeMatches:s=he.includeMatches,findAllMatches:o=he.findAllMatches,minMatchCharLength:r=he.minMatchCharLength,isCaseSensitive:c=he.isCaseSensitive,ignoreLocation:a=he.ignoreLocation}={}){super(e),this._bitapSearch=new ve(e,{location:t,threshold:i,distance:n,includeMatches:s,findAllMatches:o,minMatchCharLength:r,isCaseSensitive:c,ignoreLocation:a})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(e){return this._bitapSearch.searchIn(e)}}class Ee extends _e{constructor(e){super(e)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(e){let t,i=0;const n=[],s=this.pattern.length;for(;(t=e.indexOf(this.pattern,i))>-1;)i=t+s,n.push([t,i-1]);const o=!!n.length;return{isMatch:o,score:o?0:1,indices:n}}}const Ce=[class extends _e{constructor(e){super(e)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(e){const t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},Ee,class extends _e{constructor(e){super(e)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(e){const t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},class extends _e{constructor(e){super(e)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(e){const t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends _e{constructor(e){super(e)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(e){const t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends _e{constructor(e){super(e)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(e){const t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}},class extends _e{constructor(e){super(e)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(e){const t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},be],we=Ce.length,Ie=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;const Se=new Set([be.type,Ee.type]);class Oe{constructor(e,{isCaseSensitive:t=he.isCaseSensitive,includeMatches:i=he.includeMatches,minMatchCharLength:n=he.minMatchCharLength,ignoreLocation:s=he.ignoreLocation,findAllMatches:o=he.findAllMatches,location:r=he.location,threshold:c=he.threshold,distance:a=he.distance}={}){this.query=null,this.options={isCaseSensitive:t,includeMatches:i,minMatchCharLength:n,findAllMatches:o,ignoreLocation:s,location:r,threshold:c,distance:a},this.pattern=t?e:e.toLowerCase(),this.query=function(e,t={}){return e.split("|").map((e=>{let i=e.trim().split(Ie).filter((e=>e&&!!e.trim())),n=[];for(let e=0,s=i.length;e!(!e[Le]&&!e[Te]),je=e=>({[Le]:Object.keys(e).map((t=>({[t]:e[t]})))});function De(e,t,{auto:i=!0}={}){const n=e=>{let s=Object.keys(e);const o=(e=>!!e[Me])(e);if(!o&&s.length>1&&!Fe(e))return n(je(e));if((e=>!q(e)&&Q(e)&&!Fe(e))(e)){const n=o?e[Me]:s[0],r=o?e[Ne]:e[n];if(!X(r))throw new Error((e=>`Invalid value for key ${e}`)(n));const c={keyId:ce(n),pattern:r};return i&&(c.searcher=xe(r,t)),c}let r={children:[],operator:s[0]};return s.forEach((t=>{const i=e[t];q(i)&&i.forEach((e=>{r.children.push(n(e))}))})),r};return Fe(e)||(e=je(e)),n(e)}function Pe(e,t){const i=e.matches;t.matches=[],Y(i)&&i.forEach((e=>{if(!Y(e.indices)||!e.indices.length)return;const{indices:i,value:n}=e;let s={indices:i,value:n};e.key&&(s.key=e.key.src),e.idx>-1&&(s.refIndex=e.idx),t.matches.push(s)}))}function ke(e,t){t.score=e.score}class Re{constructor(e,t={},i){this.options=U(U({},he),t),this.options.useExtendedSearch,this._keyStore=new se(this.options.keys),this.setCollection(e,i)}setCollection(e,t){if(this._docs=e,t&&!(t instanceof ue))throw new Error("Incorrect 'index' type");this._myIndex=t||de(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){Y(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=()=>!1){const t=[];for(let i=0,n=this._docs.length;i{let i=1;e.matches.forEach((({key:e,norm:n,score:s})=>{const o=e?e.weight:null;i*=Math.pow(0===s&&o?Number.EPSILON:s,(o||1)*(t?1:n))})),e.score=i}))}(c,{ignoreFieldNorm:r}),s&&c.sort(o),J(t)&&t>-1&&(c=c.slice(0,t)),function(e,t,{includeMatches:i=he.includeMatches,includeScore:n=he.includeScore}={}){const s=[];return i&&s.push(Pe),n&&s.push(ke),e.map((e=>{const{idx:i}=e,n={item:t[i],refIndex:i};return s.length&&s.forEach((t=>{t(e,n)})),n}))}(c,this._docs,{includeMatches:i,includeScore:n})}_searchStringList(e){const t=xe(e,this.options),{records:i}=this._myIndex,n=[];return i.forEach((({v:e,i:i,n:s})=>{if(!Y(e))return;const{isMatch:o,score:r,indices:c}=t.searchIn(e);o&&n.push({item:e,idx:i,matches:[{score:r,value:e,norm:s,indices:c}]})})),n}_searchLogical(e){const t=De(e,this.options),i=(e,t,n)=>{if(!e.children){const{keyId:i,searcher:s}=e,o=this._findMatches({key:this._keyStore.get(i),value:this._myIndex.getValueForItemAtKeyId(t,i),searcher:s});return o&&o.length?[{idx:n,item:t,matches:o}]:[]}const s=[];for(let o=0,r=e.children.length;o{if(Y(e)){let r=i(t,e,n);r.length&&(s[n]||(s[n]={idx:n,item:e,matches:[]},o.push(s[n])),r.forEach((({matches:e})=>{s[n].matches.push(...e)})))}})),o}_searchObjectList(e){const t=xe(e,this.options),{keys:i,records:n}=this._myIndex,s=[];return n.forEach((({$:e,i:n})=>{if(!Y(e))return;let o=[];i.forEach(((i,n)=>{o.push(...this._findMatches({key:i,value:e[n],searcher:t}))})),o.length&&s.push({idx:n,item:e,matches:o})})),s}_findMatches({key:e,value:t,searcher:i}){if(!Y(t))return[];let n=[];if(q(t))t.forEach((({v:t,i:s,n:o})=>{if(!Y(t))return;const{isMatch:r,score:c,indices:a}=i.searchIn(t);r&&n.push({score:c,key:e,value:t,idx:s,norm:o,indices:a})}));else{const{v:s,n:o}=t,{isMatch:r,score:c,indices:a}=i.searchIn(s);r&&n.push({score:c,key:e,value:s,norm:o,indices:a})}return n}}Re.version="7.0.0",Re.createIndex=de,Re.parseIndex=function(e,{getFn:t=he.getFn,fieldNormWeight:i=he.fieldNormWeight}={}){const{keys:n,records:s}=e,o=new ue({getFn:t,fieldNormWeight:i});return o.setKeys(n),o.setIndexRecords(s),o},Re.config=he,Re.parseQuery=De,function(...e){Ae.push(...e)}(Oe);var He=function(){function e(e){this._haystack=[],this._fuseOptions=i(i({},e.fuseOptions),{keys:n([],e.searchFields,!0),includeMatches:!0})}return e.prototype.index=function(e){this._haystack=e,this._fuse&&this._fuse.setCollection(e)},e.prototype.reset=function(){this._haystack=[],this._fuse=void 0},e.prototype.isEmptyIndex=function(){return 0===this._haystack.length},e.prototype.search=function(e){return this._fuse||(this._fuse=new Re(this._haystack,this._fuseOptions)),this._fuse.search(e).map((function(e,t){return{item:e.item,score:e.score||0,rank:t}}))},e}();var Ke="-ms-scroll-limit"in document.documentElement.style&&"-ms-ime-align"in document.documentElement.style,Ve={},Be=function(e){if(e){var t=e.dataset.id;return t?parseInt(t,10):void 0}},$e=function(){function e(t,n){void 0===t&&(t="[data-choice]"),void 0===n&&(n={});var s=this;this.initialisedOK=void 0,this._hasNonChoicePlaceholder=!1,this._lastAddedChoiceId=0,this._lastAddedGroupId=0,this.config=i(i(i({},e.defaults.allOptions),e.defaults.options),n),L.forEach((function(t){s.config[t]=i(i(i({},e.defaults.allOptions[t]),e.defaults.options[t]),n[t])})),this.config.silent||this._validateConfig();var o=this.config.shadowRoot||document.documentElement,r="string"==typeof t?o.querySelector(t):t;if(!r||"object"!=typeof r||"INPUT"!==r.tagName&&!function(e){return"SELECT"===e.tagName}(r)){if(!r&&"string"==typeof t)throw TypeError("Selector ".concat(t," failed to find an element"));throw TypeError("Expected one of the following types text|select-one|select-multiple")}if(this._elementType=r.type,this._isTextElement=this._elementType===g,(this._isTextElement||1!==this.config.maxItemCount)&&(this.config.singleModeForMultiSelect=!1),this.config.singleModeForMultiSelect&&(this._elementType=_),this._isSelectOneElement=this._elementType===v,this._isSelectMultipleElement=this._elementType===_,this._isSelectElement=this._isSelectOneElement||this._isSelectMultipleElement,this._canAddUserChoices=this._isTextElement&&this.config.addItems||this._isSelectElement&&this.config.addChoices,["auto","always"].includes("".concat(this.config.renderSelectedChoices))||(this.config.renderSelectedChoices="auto"),this.config.placeholder&&(this.config.placeholderValue?this._hasNonChoicePlaceholder=!0:r.dataset.placeholder&&(this._hasNonChoicePlaceholder=!0,this.config.placeholderValue=r.dataset.placeholder)),n.addItemFilter&&"function"!=typeof n.addItemFilter){var a=n.addItemFilter instanceof RegExp?n.addItemFilter:new RegExp(n.addItemFilter);this.config.addItemFilter=a.test.bind(a)}if(this._isTextElement)this.passedElement=new w({element:r,classNames:this.config.classNames});else{var h=r;this.passedElement=new A({element:h,classNames:this.config.classNames,template:function(e){return s._templates.option(e)},extractPlaceholder:this.config.placeholder&&!this._hasNonChoicePlaceholder})}if(this.initialised=!1,this._store=new R,this._initialState=D,this._currentState=D,this._prevState=D,this._currentValue="",this.config.searchEnabled=!this._isTextElement&&this.config.searchEnabled||this._elementType===_,this._canSearch=this.config.searchEnabled,this._isScrollingOnIe=!1,this._highlightPosition=0,this._wasTap=!0,this._placeholderValue=this._generatePlaceholderValue(),this._baseId=function(e,t){var i=e.id||e.name&&"".concat(e.name,"-").concat(c(2))||c(4);return i=i.replace(/(:|\.|\[|\]|,)/g,""),"".concat(t,"-").concat(i)}(this.passedElement.element,"choices-"),this._direction=this.passedElement.dir,!this._direction){var l=window.getComputedStyle(this.passedElement.element).direction;l!==window.getComputedStyle(document.documentElement).direction&&(this._direction=l)}if(this._idNames={itemChoice:"item-choice"},this._render=this._render.bind(this),this._onFocus=this._onFocus.bind(this),this._onBlur=this._onBlur.bind(this),this._onKeyUp=this._onKeyUp.bind(this),this._onKeyDown=this._onKeyDown.bind(this),this._onInput=this._onInput.bind(this),this._onClick=this._onClick.bind(this),this._onTouchMove=this._onTouchMove.bind(this),this._onTouchEnd=this._onTouchEnd.bind(this),this._onMouseDown=this._onMouseDown.bind(this),this._onMouseOver=this._onMouseOver.bind(this),this._onFormReset=this._onFormReset.bind(this),this._onSelectKey=this._onSelectKey.bind(this),this._onEnterKey=this._onEnterKey.bind(this),this._onEscapeKey=this._onEscapeKey.bind(this),this._onDirectionKey=this._onDirectionKey.bind(this),this._onDeleteKey=this._onDeleteKey.bind(this),this.passedElement.isActive)return this.config.silent||console.warn("Trying to initialise Choices on element already initialised",{element:t}),this.initialised=!0,void(this.initialisedOK=!1);this.init(),this._initialItems=this._store.items.map((function(e){return e.value}))}return Object.defineProperty(e,"defaults",{get:function(){return Object.preventExtensions({get options(){return Ve},get allOptions(){return x},get templates(){return V}})},enumerable:!1,configurable:!0}),e.prototype.init=function(){if(!this.initialised&&void 0===this.initialisedOK){var e;this._searcher=(e=this.config,new He(e)),this._loadChoices(),this._createTemplates(),this._createElements(),this._createStructure(),this._store.subscribe(this._render),this._render(),this._addEventListeners(),(this._isTextElement&&!this.config.addItems||this.passedElement.element.hasAttribute("disabled")||!!this.passedElement.element.closest("fieldset:disabled"))&&this.disable(),this.initialised=!0,this.initialisedOK=!0;var t=this.config.callbackOnInit;t&&"function"==typeof t&&t.call(this)}},e.prototype.destroy=function(){this.initialised&&(this._removeEventListeners(),this.passedElement.reveal(),this.containerOuter.unwrap(this.passedElement.element),this.clearStore(),this._stopSearch(),this._templates=V,this.initialised=!1,this.initialisedOK=void 0)},e.prototype.enable=function(){return this.passedElement.isDisabled&&this.passedElement.enable(),this.containerOuter.isDisabled&&(this._addEventListeners(),this.input.enable(),this.containerOuter.enable()),this},e.prototype.disable=function(){return this.passedElement.isDisabled||this.passedElement.disable(),this.containerOuter.isDisabled||(this._removeEventListeners(),this.input.disable(),this.containerOuter.disable()),this},e.prototype.highlightItem=function(e,t){if(void 0===t&&(t=!0),!e||!e.id)return this;var i=this._store.choices.find((function(t){return t.id===e.id}));return!i||i.highlighted||(this._store.dispatch(o(i,!0)),t&&this.passedElement.triggerEvent("highlightItem",this._getChoiceForOutput(i))),this},e.prototype.unhighlightItem=function(e,t){if(void 0===t&&(t=!0),!e||!e.id)return this;var i=this._store.choices.find((function(t){return t.id===e.id}));return i&&i.highlighted?(this._store.dispatch(o(i,!1)),t&&this.passedElement.triggerEvent("highlightItem",this._getChoiceForOutput(i)),this):this},e.prototype.highlightAll=function(){var e=this;return this._store.withTxn((function(){e._store.items.forEach((function(t){return e.highlightItem(t)}))})),this},e.prototype.unhighlightAll=function(){var e=this;return this._store.withTxn((function(){e._store.items.forEach((function(t){return e.unhighlightItem(t)}))})),this},e.prototype.removeActiveItemsByValue=function(e){var t=this;return this._store.withTxn((function(){t._store.items.filter((function(t){return t.value===e})).forEach((function(e){return t._removeItem(e)}))})),this},e.prototype.removeActiveItems=function(e){var t=this;return this._store.withTxn((function(){t._store.items.filter((function(t){return t.id!==e})).forEach((function(e){return t._removeItem(e)}))})),this},e.prototype.removeHighlightedItems=function(e){var t=this;return void 0===e&&(e=!1),this._store.withTxn((function(){t._store.highlightedActiveItems.forEach((function(i){t._removeItem(i),e&&t._triggerChange(i.value)}))})),this},e.prototype.showDropdown=function(e){var t=this;return this.dropdown.isActive||requestAnimationFrame((function(){t.dropdown.show(),t.containerOuter.open(t.dropdown.distanceFromTopWindow),!e&&t._canSearch&&t.input.focus(),t.passedElement.triggerEvent("showDropdown")})),this},e.prototype.hideDropdown=function(e){var t=this;return this.dropdown.isActive?(requestAnimationFrame((function(){t.dropdown.hide(),t.containerOuter.close(),!e&&t._canSearch&&(t.input.removeActiveDescendant(),t.input.blur()),t.passedElement.triggerEvent("hideDropdown")})),this):this},e.prototype.getValue=function(e){var t=this;void 0===e&&(e=!1);var i=this._store.items.reduce((function(i,n){var s=e?n.value:t._getChoiceForOutput(n);return i.push(s),i}),[]);return this._isSelectOneElement||this.config.singleModeForMultiSelect?i[0]:i},e.prototype.setValue=function(e){var t=this;return this.initialisedOK?(this._store.withTxn((function(){e.forEach((function(e){e&&t._addChoice(O(e,!1))}))})),this._searcher.reset(),this):(this._warnChoicesInitFailed("setValue"),this)},e.prototype.setChoiceByValue=function(e){var t=this;return this.initialisedOK?(this._isTextElement||(this._store.withTxn((function(){(Array.isArray(e)?e:[e]).forEach((function(e){return t._findAndSelectChoiceByValue(e)}))})),this._searcher.reset()),this):(this._warnChoicesInitFailed("setChoiceByValue"),this)},e.prototype.setChoices=function(e,t,n,s){var o=this;if(void 0===e&&(e=[]),void 0===t&&(t="value"),void 0===n&&(n="label"),void 0===s&&(s=!1),!this.initialisedOK)return this._warnChoicesInitFailed("setChoices"),this;if(!this._isSelectElement)throw new TypeError("setChoices can't be used with INPUT based Choices");if("string"!=typeof t||!t)throw new TypeError("value parameter must be a name of 'value' field in passed objects");if(s&&this.clearChoices(),"function"==typeof e){var r=e(this);if("function"==typeof Promise&&r instanceof Promise)return new Promise((function(e){return requestAnimationFrame(e)})).then((function(){return o._handleLoadingState(!0)})).then((function(){return r})).then((function(e){return o.setChoices(e,t,n,s)})).catch((function(e){o.config.silent||console.error(e)})).then((function(){return o._handleLoadingState(!1)})).then((function(){return o}));if(!Array.isArray(r))throw new TypeError(".setChoices first argument function must return either array of choices or Promise, got: ".concat(typeof r));return this.setChoices(r,t,n,!1)}if(!Array.isArray(e))throw new TypeError(".setChoices must be called either with array of choices with a function resulting into Promise of array of choices");return this.containerOuter.removeLoadingState(),this._store.withTxn((function(){var s="value"===t,r="label"===n;e.forEach((function(e){if("choices"in e){var c=e;r||(c=i(i({},c),{label:c[n]})),o._addGroup(O(c,!0))}else{var a=e;r&&s||(a=i(i({},a),{value:a[t],label:a[n]})),o._addChoice(O(a,!1))}}))})),this._searcher.reset(),this},e.prototype.refresh=function(e,t,i){var n=this;return void 0===e&&(e=!1),void 0===t&&(t=!1),void 0===i&&(i=!1),this._isSelectElement?(this._store.withTxn((function(){var s=n.passedElement.optionsAsChoices(),o=n._store.items,r={};i||o.forEach((function(e){e.id&&e.active&&e.selected&&!e.disabled&&(r[e.value]=!0)})),s.forEach((function(e){if(!("choices"in e)){var t=e;i?t.selected=!1:r[t.value]&&(t.selected=!0)}})),n.clearStore(),n._addPredefinedChoices(s,t,e),n._isSearching&&n._searchChoices(n.input.value)})),this):(this.config.silent||console.warn("refresh method can only be used on choices backed by a