import { getRoot, types } from "mobx-state-tree";
|
import { StringOrNumber } from "../types";
|
|
export const TabSelectedItems = types
|
.model("TabSelectedItems", {
|
all: false,
|
list: types.optional(types.array(StringOrNumber), []),
|
})
|
.views((self) => ({
|
get snapshot() {
|
return {
|
all: self.all,
|
[self.listName]: Array.from(self.list),
|
};
|
},
|
|
get listName() {
|
return self.all ? "excluded" : "included";
|
},
|
|
get hasSelected() {
|
return self.isAllSelected || self.isIndeterminate;
|
},
|
|
get isAllSelected() {
|
return self.all && self.list.length === 0;
|
},
|
|
get isIndeterminate() {
|
return self.list.length > 0;
|
},
|
|
get length() {
|
return self.list.length;
|
},
|
|
get total() {
|
if (self.all) {
|
const totalCount = getRoot(self).dataStore.total ?? 0;
|
|
return totalCount - self.length;
|
}
|
return self.length;
|
},
|
|
isSelected(id) {
|
if (self.all) {
|
return !self.list.includes(id);
|
}
|
return self.list.includes(id);
|
},
|
}))
|
.actions((self) => ({
|
afterCreate() {
|
self._invokeChangeEvent();
|
},
|
|
toggleSelectedAll() {
|
if (!self.all || !(self.all && self.isIndeterminate)) {
|
self.all = !self.all;
|
}
|
|
self.list = [];
|
self._invokeChangeEvent();
|
},
|
|
addItem(id) {
|
self.list.push(id);
|
self._invokeChangeEvent();
|
},
|
|
removeItem(id) {
|
self.list.splice(self.list.indexOf(id), 1);
|
self._invokeChangeEvent();
|
},
|
|
toggleItem(id) {
|
if (self.list.includes(id)) {
|
self.list.splice(self.list.indexOf(id), 1);
|
} else {
|
self.list.push(id);
|
}
|
self._invokeChangeEvent();
|
},
|
|
update(data) {
|
self.all = data?.all ?? self.all;
|
self.list = data?.[self.listName] ?? self.list;
|
self._invokeChangeEvent();
|
},
|
|
clear() {
|
self.all = false;
|
self.list = [];
|
self._invokeChangeEvent();
|
},
|
|
_invokeChangeEvent() {
|
getRoot(self).SDK.invoke("taskSelectionChanged", self);
|
},
|
}))
|
.preProcessSnapshot((sn) => {
|
const { included, excluded, all } = sn ?? {};
|
const result = { all, list: sn.list ?? (all ? excluded : included) };
|
|
return result;
|
});
|