-
Notifications
You must be signed in to change notification settings - Fork 60
Expand file tree
/
Copy pathmulti_select_state_utils.js
More file actions
111 lines (97 loc) · 3.29 KB
/
Copy pathmulti_select_state_utils.js
File metadata and controls
111 lines (97 loc) · 3.29 KB
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
export const findItem = ({ id }, items) => items.find(item => id === item.id);
const shouldSelectItem = (item, itemsToSelect) =>
!item.disabled && findItem(item, itemsToSelect);
const getSourceItems = (itemsToSelect, selectedItems, items) =>
items.filter(
item =>
shouldSelectItem(item, itemsToSelect) || findItem(item, selectedItems)
);
const getDestinationItems = (itemsToSelect, selectedItems, items) =>
selectedItems.filter(
selectedItem =>
!findItem(selectedItem, itemsToSelect) && !findItem(selectedItem, items)
);
const notContainsId = (ids, item) =>
ids.find(id => id === item.id) === undefined;
export const filterUnselectedByIds = (items, ids, isLocked) =>
items.filter(item => notContainsId(ids, item) || isLocked(item));
export const getSelectedByAllItems = (itemsToSelect, selectedItems, items) => {
const sourceItems = getSourceItems(itemsToSelect, selectedItems, items);
const destinationItems = getDestinationItems(
itemsToSelect,
selectedItems,
items
);
return [...destinationItems, ...sourceItems];
};
export const getMinMaxIndexes = (
currentIndex,
firstItemShiftSelected,
items,
selectedItems,
maxSelected
) => {
const numberOfItemsOutsideSelected = getSelectedItemsOutsideInterval(
currentIndex,
firstItemShiftSelected,
items,
selectedItems
).length;
const sumItemsShouldBeSelect =
numberOfItemsOutsideSelected +
Math.abs(firstItemShiftSelected - currentIndex) +
1;
if (maxSelected && maxSelected <= sumItemsShouldBeSelect) {
return getIndexesWhenShiftSelected(
currentIndex,
firstItemShiftSelected,
maxSelected,
numberOfItemsOutsideSelected
);
}
return getInputInterval(currentIndex, firstItemShiftSelected);
};
const getIndexesWhenShiftSelected = (
currentIndex,
firstItemShiftSelected,
maxSelected,
numberOfItemsOutsideSelected
) => {
const sumItemsAllowToSelect = maxSelected - numberOfItemsOutsideSelected - 1;
return firstItemShiftSelected > currentIndex
? {
minIndex: firstItemShiftSelected - sumItemsAllowToSelect,
maxIndex: firstItemShiftSelected
}
: {
minIndex: firstItemShiftSelected,
maxIndex: firstItemShiftSelected + sumItemsAllowToSelect
};
};
const getInputInterval = (currentIndex, firstItemShiftSelected) =>
firstItemShiftSelected > currentIndex
? { minIndex: currentIndex, maxIndex: firstItemShiftSelected }
: { minIndex: firstItemShiftSelected, maxIndex: currentIndex };
export const getSelectedItemsOutsideInterval = (
currentIndex,
firstItemShiftSelected,
sourceItems,
selectedItems
) => {
const interval = getInputInterval(currentIndex, firstItemShiftSelected);
return selectedItems.filter(selectedItem => {
const index = sourceItems.findIndex(item => item.id === selectedItem.id);
return !isWithin(index, interval) || selectedItem.disabled;
});
};
export const isWithin = (index, { minIndex, maxIndex }) =>
index >= minIndex && index <= maxIndex;
export const getNewSelectedItems = (itemId, items, selectedItems) => {
const sourceItems = items.filter(
item => item.id === itemId || findItem(item, selectedItems)
);
const destinationItems = selectedItems.filter(
selectedItem => !findItem(selectedItem, items)
);
return [...destinationItems, ...sourceItems];
};