Bin
2025-12-17 262fecaa75b2909ad244f12c3b079ed3ff4ae329
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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;