import { types } from "mobx-state-tree";
|
|
import Tree from "../core/Tree";
|
import { isDefined } from "../utils/utilities";
|
|
const SelectedModelMixin = types
|
.model()
|
.volatile(() => {
|
return {
|
isSeparated: false,
|
};
|
})
|
.views((self) => ({
|
get tiedChildren() {
|
return Tree.filterChildrenOfType(self, self._child);
|
},
|
|
get selectedLabels() {
|
return self.tiedChildren.filter((c) => c.selected === true);
|
},
|
|
getSelectedColor() {
|
// return first selected label color
|
const sel = self.tiedChildren.find((c) => c.selected === true);
|
|
return sel && sel.background;
|
},
|
|
get selectedColor() {
|
// return first selected label color
|
const sel = self.tiedChildren.find((c) => c.selected === true);
|
|
return sel && sel.background;
|
},
|
|
get isSelected() {
|
return self.selectedLabels.length > 0;
|
},
|
|
// right now this is duplicate code from the above and it's done for clarity
|
get holdsState() {
|
return self.selectedLabels.length > 0;
|
},
|
|
selectedValues() {
|
return self.selectedLabels.map((c) => (c.alias ? c.alias : c.value)).filter((val) => isDefined(val));
|
},
|
|
getResultValue() {
|
return {
|
[self.valueType]: self.selectedValues(),
|
};
|
},
|
|
// return labels that are selected and have an alias only
|
get selectedAliases() {
|
return self.selectedLabels.filter((c) => c.alias).map((c) => c.alias);
|
},
|
|
getSelectedString(joinstr = " ") {
|
return self.selectedValues().join(joinstr);
|
},
|
|
findLabel(value) {
|
return self.tiedChildren.find(
|
(c) =>
|
(c.alias === value && isDefined(value)) || c.value === value || (!isDefined(c.value) && !isDefined(value)),
|
);
|
},
|
|
get emptyLabel() {
|
return self.allowempty ? self.findLabel(null) : null;
|
},
|
}))
|
.actions((self) => ({
|
/**
|
* Get current color from Label settings
|
*/
|
unselectAll() {
|
self.tiedChildren.forEach((c) => c.setSelected(false));
|
},
|
|
checkMaxUsages() {
|
return self.tiedChildren.filter((c) => !c.canBeUsed());
|
},
|
|
selectFirstVisible() {
|
const f = self.tiedChildren.find((c) => c.visible);
|
|
f && f.toggleSelected();
|
|
return f;
|
},
|
|
/**
|
* Change states of tags according to values from result
|
* @param {string|string[]} value
|
*/
|
updateFromResult(value) {
|
self.unselectAll();
|
const values = Array.isArray(value) ? (value.length ? value : [null]) : [value];
|
|
if (values.length) {
|
values.map((v) => self.findLabel(v)).forEach((label) => label?.setSelected(true));
|
} else if (self.allowempty) {
|
self.findLabel(null)?.setSelected(true);
|
}
|
},
|
}));
|
|
export default SelectedModelMixin;
|