Skip to content

Commit b456efa

Browse files
committed
Select multiple objects with single tap
1 parent 9e843f4 commit b456efa

1 file changed

Lines changed: 50 additions & 19 deletions

File tree

  • portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ const ListObjects = ({
274274
const [loadingVersioning, setLoadingVersioning] = useState<boolean>(true);
275275
const [isVersioned, setIsVersioned] = useState<boolean>(false);
276276
const [rewindSelect, setRewindSelect] = useState<boolean>(false);
277+
const [previousSelection, setPreviousSelection] = useState<string|null>(null);
277278
const [selectedObjects, setSelectedObjects] = useState<string[]>([]);
278279
const [previewOpen, setPreviewOpen] = useState<boolean>(false);
279280
const [selectedPreview, setSelectedPreview] = useState<BucketObject | null>(
@@ -619,6 +620,7 @@ const ListObjects = ({
619620
if (refresh) {
620621
setSnackBarMessage(`Objects deleted successfully.`);
621622
setSelectedObjects([]);
623+
setPreviousSelection(null);
622624
setLoading(true);
623625
}
624626
};
@@ -960,25 +962,6 @@ const ListObjects = ({
960962
setSelectedPreview(null);
961963
};
962964

963-
const selectListObjects = (e: React.ChangeEvent<HTMLInputElement>) => {
964-
const targetD = e.target;
965-
const value = targetD.value;
966-
const checked = targetD.checked;
967-
968-
let elements: string[] = [...selectedObjects]; // We clone the selectedBuckets array
969-
970-
if (checked) {
971-
// If the user has checked this field we need to push this to selectedBucketsList
972-
elements.push(value);
973-
} else {
974-
// User has unchecked this field, we need to remove it from the list
975-
elements = elements.filter((element) => element !== value);
976-
}
977-
setSelectedObjects(elements);
978-
979-
return elements;
980-
};
981-
982965
const sortChange = (sortData: any) => {
983966
const newSortDirection = get(sortData, "sortDirection", "DESC");
984967
setCurrentSortField(sortData.sortBy);
@@ -1062,7 +1045,55 @@ const ListObjects = ({
10621045
payload = sortASC.reverse();
10631046
}
10641047

1048+
const selectListObjects = (e: React.ChangeEvent<HTMLInputElement>) => {
1049+
const targetD = e.target;
1050+
const value = targetD.value;
1051+
let checked = targetD.checked;
1052+
// @ts-ignore shiftKey is defined for click events
1053+
const shift: bool = e.nativeEvent.shiftKey;
1054+
1055+
let elements: string[] = [...selectedObjects]; // We clone the selectedBuckets array
1056+
1057+
let previous = value; // By default, start and end are one element
1058+
// Use the shift effect if different elements are selected
1059+
if (shift && previousSelection !== value) {
1060+
if (previousSelection === null) {
1061+
// There was no previous action, сhecked only first elements
1062+
checked = true;
1063+
previous = payload[0].name;
1064+
} else {
1065+
// Repeat the previous steps for everyone in the range
1066+
checked = elements.indexOf(previousSelection) !== -1;
1067+
previous = previousSelection;
1068+
}
1069+
}
1070+
1071+
const [min, max] = [
1072+
payload.findIndex(object => object.name === value),
1073+
payload.findIndex(object => object.name === previous),
1074+
].sort((a, b) => a - b); // correctly sort an array of numbers
1075+
for (let i = min; i <= max; i++) {
1076+
const current = payload[i].name;
1077+
if (checked) {
1078+
// If the user has checked this field we need to push this to selectedBucketsList
1079+
if (elements.indexOf(current) === -1) {
1080+
elements.push(current);
1081+
}
1082+
} else {
1083+
// User has unchecked this field, we need to remove it from the list
1084+
elements = elements.filter((element) => element !== current);
1085+
}
1086+
}
1087+
1088+
setSelectedObjects(elements);
1089+
setPreviousSelection(value);
1090+
1091+
return elements;
1092+
};
1093+
10651094
const selectAllItems = () => {
1095+
setPreviousSelection(null);
1096+
10661097
if (selectedObjects.length === payload.length) {
10671098
setSelectedObjects([]);
10681099
return;

0 commit comments

Comments
 (0)