svelte-ux
Version:
- Increment version in `package.json` and commit as `Version bump to x.y.z` - `npm run publish`
63 lines (62 loc) • 2.2 kB
JavaScript
import { derived, writable } from 'svelte/store';
import uniqueStore from './uniqueStore';
export default function selectionStore(props = {}) {
var _a, _b, _c;
const selected = uniqueStore((_a = props.initial) !== null && _a !== void 0 ? _a : []);
const all = writable((_b = props.all) !== null && _b !== void 0 ? _b : []);
const single = (_c = props.single) !== null && _c !== void 0 ? _c : false;
return derived([selected, all], ([$selected, $all]) => {
var _a;
function isSelected(value) {
return $selected.has(value);
}
function toggleSelected(value) {
selected.update(($selected) => {
if ($selected.has(value)) {
// Remove
return new Set([...$selected].filter((v) => v != value));
}
else if (single) {
// Replace
return new Set([value]);
}
else {
// Add
return $selected.add(value);
}
});
}
function isAllSelected() {
return $all.every((v) => $selected.has(v));
}
function isAnySelected() {
return $all.some((v) => $selected.has(v));
}
function toggleAll() {
let values;
if (isAllSelected()) {
// Deselect all (within current `all`, for example page/filtered result)
values = [...$selected].filter((v) => !$all.includes(v));
}
else {
// Select all (`new Set()` will dedupe)
values = [...$selected, ...$all];
}
selected.set(new Set(values));
}
function clear() {
selected.set(new Set());
}
const selectedArr = [...$selected.values()];
return {
selected: single ? (_a = selectedArr[0]) !== null && _a !== void 0 ? _a : null : selectedArr,
toggleSelected,
isSelected,
toggleAll,
isAllSelected,
isAnySelected,
clear,
all,
};
});
}