@@ -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