123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /* eslint-disable sonarjs/no-identical-functions */
- // Utilities
- import { toRaw } from 'vue';
- export const independentSelectStrategy = mandatory => {
- const strategy = {
- select: _ref => {
- let {
- id,
- value,
- selected
- } = _ref;
- id = toRaw(id);
- // When mandatory and we're trying to deselect when id
- // is the only currently selected item then do nothing
- if (mandatory && !value) {
- const on = Array.from(selected.entries()).reduce((arr, _ref2) => {
- let [key, value] = _ref2;
- return value === 'on' ? [...arr, key] : arr;
- }, []);
- if (on.length === 1 && on[0] === id) return selected;
- }
- selected.set(id, value ? 'on' : 'off');
- return selected;
- },
- in: (v, children, parents) => {
- let map = new Map();
- for (const id of v || []) {
- map = strategy.select({
- id,
- value: true,
- selected: new Map(map),
- children,
- parents
- });
- }
- return map;
- },
- out: v => {
- const arr = [];
- for (const [key, value] of v.entries()) {
- if (value === 'on') arr.push(key);
- }
- return arr;
- }
- };
- return strategy;
- };
- export const independentSingleSelectStrategy = mandatory => {
- const parentStrategy = independentSelectStrategy(mandatory);
- const strategy = {
- select: _ref3 => {
- let {
- selected,
- id,
- ...rest
- } = _ref3;
- id = toRaw(id);
- const singleSelected = selected.has(id) ? new Map([[id, selected.get(id)]]) : new Map();
- return parentStrategy.select({
- ...rest,
- id,
- selected: singleSelected
- });
- },
- in: (v, children, parents) => {
- let map = new Map();
- if (v?.length) {
- map = parentStrategy.in(v.slice(0, 1), children, parents);
- }
- return map;
- },
- out: (v, children, parents) => {
- return parentStrategy.out(v, children, parents);
- }
- };
- return strategy;
- };
- export const leafSelectStrategy = mandatory => {
- const parentStrategy = independentSelectStrategy(mandatory);
- const strategy = {
- select: _ref4 => {
- let {
- id,
- selected,
- children,
- ...rest
- } = _ref4;
- id = toRaw(id);
- if (children.has(id)) return selected;
- return parentStrategy.select({
- id,
- selected,
- children,
- ...rest
- });
- },
- in: parentStrategy.in,
- out: parentStrategy.out
- };
- return strategy;
- };
- export const leafSingleSelectStrategy = mandatory => {
- const parentStrategy = independentSingleSelectStrategy(mandatory);
- const strategy = {
- select: _ref5 => {
- let {
- id,
- selected,
- children,
- ...rest
- } = _ref5;
- id = toRaw(id);
- if (children.has(id)) return selected;
- return parentStrategy.select({
- id,
- selected,
- children,
- ...rest
- });
- },
- in: parentStrategy.in,
- out: parentStrategy.out
- };
- return strategy;
- };
- export const classicSelectStrategy = mandatory => {
- const strategy = {
- select: _ref6 => {
- let {
- id,
- value,
- selected,
- children,
- parents
- } = _ref6;
- id = toRaw(id);
- const original = new Map(selected);
- const items = [id];
- while (items.length) {
- const item = items.shift();
- selected.set(item, value ? 'on' : 'off');
- if (children.has(item)) {
- items.push(...children.get(item));
- }
- }
- let parent = parents.get(id);
- while (parent) {
- const childrenIds = children.get(parent);
- const everySelected = childrenIds.every(cid => selected.get(cid) === 'on');
- const noneSelected = childrenIds.every(cid => !selected.has(cid) || selected.get(cid) === 'off');
- selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
- parent = parents.get(parent);
- }
- // If mandatory and planned deselect results in no selected
- // items then we can't do it, so return original state
- if (mandatory && !value) {
- const on = Array.from(selected.entries()).reduce((arr, _ref7) => {
- let [key, value] = _ref7;
- return value === 'on' ? [...arr, key] : arr;
- }, []);
- if (on.length === 0) return original;
- }
- return selected;
- },
- in: (v, children, parents) => {
- let map = new Map();
- for (const id of v || []) {
- map = strategy.select({
- id,
- value: true,
- selected: new Map(map),
- children,
- parents
- });
- }
- return map;
- },
- out: (v, children) => {
- const arr = [];
- for (const [key, value] of v.entries()) {
- if (value === 'on' && !children.has(key)) arr.push(key);
- }
- return arr;
- }
- };
- return strategy;
- };
- //# sourceMappingURL=selectStrategies.mjs.map
|