mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-17 17:14:18 +02:00
New: Project Aphrodite
This commit is contained in:
17
frontend/src/Utilities/Table/areAllSelected.js
Normal file
17
frontend/src/Utilities/Table/areAllSelected.js
Normal file
@@ -0,0 +1,17 @@
|
||||
export default function areAllSelected(selectedState) {
|
||||
let allSelected = true;
|
||||
let allUnselected = true;
|
||||
|
||||
Object.keys(selectedState).forEach((key) => {
|
||||
if (selectedState[key]) {
|
||||
allUnselected = false;
|
||||
} else {
|
||||
allSelected = false;
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
allSelected,
|
||||
allUnselected
|
||||
};
|
||||
}
|
15
frontend/src/Utilities/Table/getSelectedIds.js
Normal file
15
frontend/src/Utilities/Table/getSelectedIds.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import _ from 'lodash';
|
||||
|
||||
function getSelectedIds(selectedState, { parseIds = true } = {}) {
|
||||
return _.reduce(selectedState, (result, value, id) => {
|
||||
if (value) {
|
||||
const parsedId = parseIds ? parseInt(id) : id;
|
||||
|
||||
result.push(parsedId);
|
||||
}
|
||||
|
||||
return result;
|
||||
}, []);
|
||||
}
|
||||
|
||||
export default getSelectedIds;
|
23
frontend/src/Utilities/Table/getToggledRange.js
Normal file
23
frontend/src/Utilities/Table/getToggledRange.js
Normal file
@@ -0,0 +1,23 @@
|
||||
import _ from 'lodash';
|
||||
|
||||
function getToggledRange(items, id, lastToggled) {
|
||||
const lastToggledIndex = _.findIndex(items, { id: lastToggled });
|
||||
const changedIndex = _.findIndex(items, { id });
|
||||
let lower = 0;
|
||||
let upper = 0;
|
||||
|
||||
if (lastToggledIndex > changedIndex) {
|
||||
lower = changedIndex;
|
||||
upper = lastToggledIndex + 1;
|
||||
} else {
|
||||
lower = lastToggledIndex;
|
||||
upper = changedIndex;
|
||||
}
|
||||
|
||||
return {
|
||||
lower,
|
||||
upper
|
||||
};
|
||||
}
|
||||
|
||||
export default getToggledRange;
|
16
frontend/src/Utilities/Table/removeOldSelectedState.js
Normal file
16
frontend/src/Utilities/Table/removeOldSelectedState.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import areAllSelected from './areAllSelected';
|
||||
|
||||
export default function removeOldSelectedState(state, prevItems) {
|
||||
const selectedState = {
|
||||
...state.selectedState
|
||||
};
|
||||
|
||||
prevItems.forEach((item) => {
|
||||
delete selectedState[item.id];
|
||||
});
|
||||
|
||||
return {
|
||||
...areAllSelected(selectedState),
|
||||
selectedState
|
||||
};
|
||||
}
|
17
frontend/src/Utilities/Table/selectAll.js
Normal file
17
frontend/src/Utilities/Table/selectAll.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import _ from 'lodash';
|
||||
|
||||
function selectAll(selectedState, selected) {
|
||||
const newSelectedState = _.reduce(Object.keys(selectedState), (result, item) => {
|
||||
result[item] = selected;
|
||||
return result;
|
||||
}, {});
|
||||
|
||||
return {
|
||||
allSelected: selected,
|
||||
allUnselected: !selected,
|
||||
lastToggled: null,
|
||||
selectedState: newSelectedState
|
||||
};
|
||||
}
|
||||
|
||||
export default selectAll;
|
30
frontend/src/Utilities/Table/toggleSelected.js
Normal file
30
frontend/src/Utilities/Table/toggleSelected.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import areAllSelected from './areAllSelected';
|
||||
import getToggledRange from './getToggledRange';
|
||||
|
||||
function toggleSelected(state, items, id, selected, shiftKey) {
|
||||
const lastToggled = state.lastToggled;
|
||||
const selectedState = {
|
||||
...state.selectedState,
|
||||
[id]: selected
|
||||
};
|
||||
|
||||
if (selected == null) {
|
||||
delete selectedState[id];
|
||||
}
|
||||
|
||||
if (shiftKey && lastToggled) {
|
||||
const { lower, upper } = getToggledRange(items, id, lastToggled);
|
||||
|
||||
for (let i = lower; i < upper; i++) {
|
||||
selectedState[items[i].id] = selected;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
...areAllSelected(selectedState),
|
||||
lastToggled: id,
|
||||
selectedState
|
||||
};
|
||||
}
|
||||
|
||||
export default toggleSelected;
|
Reference in New Issue
Block a user