{"version":3,"file":"selectStrategies.mjs","names":["toRaw","independentSelectStrategy","mandatory","strategy","select","_ref","id","value","selected","on","Array","from","entries","reduce","arr","_ref2","key","length","set","in","v","children","parents","map","Map","out","push","independentSingleSelectStrategy","parentStrategy","_ref3","rest","singleSelected","has","get","slice","leafSelectStrategy","_ref4","leafSingleSelectStrategy","_ref5","classicSelectStrategy","_ref6","original","items","item","shift","parent","childrenIds","everySelected","every","cid","noneSelected","_ref7"],"sources":["../../../src/composables/nested/selectStrategies.ts"],"sourcesContent":["/* eslint-disable sonarjs/no-identical-functions */\n// Utilities\nimport { toRaw } from 'vue'\n\nexport type SelectStrategyFn = (data: {\n id: unknown\n value: boolean\n selected: Map\n children: Map\n parents: Map\n event?: Event\n}) => Map\n\nexport type SelectStrategyTransformInFn = (\n v: readonly unknown[] | undefined,\n children: Map,\n parents: Map,\n) => Map\n\nexport type SelectStrategyTransformOutFn = (\n v: Map,\n children: Map,\n parents: Map,\n) => unknown[]\n\nexport type SelectStrategy = {\n select: SelectStrategyFn\n in: SelectStrategyTransformInFn\n out: SelectStrategyTransformOutFn\n}\n\nexport const independentSelectStrategy = (mandatory?: boolean): SelectStrategy => {\n const strategy: SelectStrategy = {\n select: ({ id, value, selected }) => {\n id = toRaw(id)\n\n // When mandatory and we're trying to deselect when id\n // is the only currently selected item then do nothing\n if (mandatory && !value) {\n const on = Array.from(selected.entries()).reduce((arr, [key, value]) => value === 'on' ? [...arr, key] : arr, [] as unknown[])\n if (on.length === 1 && on[0] === id) return selected\n }\n\n selected.set(id, value ? 'on' : 'off')\n\n return selected\n },\n in: (v, children, parents) => {\n let map = new Map()\n\n for (const id of (v || [])) {\n map = strategy.select({\n id,\n value: true,\n selected: new Map(map),\n children,\n parents,\n })\n }\n\n return map\n },\n out: v => {\n const arr = []\n\n for (const [key, value] of v.entries()) {\n if (value === 'on') arr.push(key)\n }\n\n return arr\n },\n }\n\n return strategy\n}\n\nexport const independentSingleSelectStrategy = (mandatory?: boolean): SelectStrategy => {\n const parentStrategy = independentSelectStrategy(mandatory)\n\n const strategy: SelectStrategy = {\n select: ({ selected, id, ...rest }) => {\n id = toRaw(id)\n const singleSelected = selected.has(id) ? new Map([[id, selected.get(id)!]]) : new Map()\n return parentStrategy.select({ ...rest, id, selected: singleSelected })\n },\n in: (v, children, parents) => {\n let map = new Map()\n\n if (v?.length) {\n map = parentStrategy.in(v.slice(0, 1), children, parents)\n }\n\n return map\n },\n out: (v, children, parents) => {\n return parentStrategy.out(v, children, parents)\n },\n }\n\n return strategy\n}\n\nexport const leafSelectStrategy = (mandatory?: boolean): SelectStrategy => {\n const parentStrategy = independentSelectStrategy(mandatory)\n\n const strategy: SelectStrategy = {\n select: ({ id, selected, children, ...rest }) => {\n id = toRaw(id)\n if (children.has(id)) return selected\n\n return parentStrategy.select({ id, selected, children, ...rest })\n },\n in: parentStrategy.in,\n out: parentStrategy.out,\n }\n\n return strategy\n}\n\nexport const leafSingleSelectStrategy = (mandatory?: boolean): SelectStrategy => {\n const parentStrategy = independentSingleSelectStrategy(mandatory)\n\n const strategy: SelectStrategy = {\n select: ({ id, selected, children, ...rest }) => {\n id = toRaw(id)\n if (children.has(id)) return selected\n\n return parentStrategy.select({ id, selected, children, ...rest })\n },\n in: parentStrategy.in,\n out: parentStrategy.out,\n }\n\n return strategy\n}\n\nexport const classicSelectStrategy = (mandatory?: boolean): SelectStrategy => {\n const strategy: SelectStrategy = {\n select: ({ id, value, selected, children, parents }) => {\n id = toRaw(id)\n const original = new Map(selected)\n\n const items = [id]\n\n while (items.length) {\n const item = items.shift()!\n\n selected.set(item, value ? 'on' : 'off')\n\n if (children.has(item)) {\n items.push(...children.get(item)!)\n }\n }\n\n let parent = parents.get(id)\n\n while (parent) {\n const childrenIds = children.get(parent)!\n const everySelected = childrenIds.every(cid => selected.get(cid) === 'on')\n const noneSelected = childrenIds.every(cid => !selected.has(cid) || selected.get(cid) === 'off')\n\n selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate')\n\n parent = parents.get(parent)\n }\n\n // If mandatory and planned deselect results in no selected\n // items then we can't do it, so return original state\n if (mandatory && !value) {\n const on = Array.from(selected.entries()).reduce((arr, [key, value]) => value === 'on' ? [...arr, key] : arr, [] as unknown[])\n if (on.length === 0) return original\n }\n\n return selected\n },\n in: (v, children, parents) => {\n let map = new Map()\n\n for (const id of (v || [])) {\n map = strategy.select({\n id,\n value: true,\n selected: new Map(map),\n children,\n parents,\n })\n }\n\n return map\n },\n out: (v, children) => {\n const arr = []\n\n for (const [key, value] of v.entries()) {\n if (value === 'on' && !children.has(key)) arr.push(key)\n }\n\n return arr\n },\n }\n\n return strategy\n}\n"],"mappings":"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"}