Skip to content

Commit cd47b0c

Browse files
bexsoftBenjamin Perez
andauthored
Added sort functionality to ame, last modified & size columns in object browser list (#1151)
Signed-off-by: Benjamin Perez <[email protected]> Co-authored-by: Benjamin Perez <[email protected]>
1 parent 972ea65 commit cd47b0c

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

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

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import {
5757
Route,
5858
} from "../../../../ObjectBrowser/reducers";
5959
import CreateFolderModal from "./CreateFolderModal";
60-
import { download, extensionPreview } from "../utils";
60+
import { download, extensionPreview, sortListObjects } from "../utils";
6161
import {
6262
setErrorSnackMessage,
6363
setLoadingProgress,
@@ -265,6 +265,10 @@ const ListObjects = ({
265265
null
266266
);
267267
const [shareFileModalOpen, setShareFileModalOpen] = useState<boolean>(false);
268+
const [sortDirection, setSortDirection] = useState<
269+
"ASC" | "DESC" | undefined
270+
>("ASC");
271+
const [currentSortField, setCurrentSortField] = useState<string>("name");
268272

269273
const internalPaths = get(match.params, "subpaths", "");
270274
const bucketName = match.params["bucketName"];
@@ -842,17 +846,26 @@ const ListObjects = ({
842846
return elements;
843847
};
844848

849+
const sortChange = (sortData: any) => {
850+
const newSortDirection = get(sortData, "sortDirection", "DESC");
851+
setCurrentSortField(sortData.sortBy);
852+
setSortDirection(newSortDirection);
853+
setLoading(true);
854+
};
855+
845856
const listModeColumns = [
846857
{
847858
label: "Name",
848859
elementKey: "name",
849860
renderFunction: displayName,
861+
enableSort: true,
850862
},
851863
{
852864
label: "Last Modified",
853865
elementKey: "last_modified",
854866
renderFunction: displayParsedDate,
855867
renderFullObject: true,
868+
enableSort: true,
856869
},
857870
{
858871
label: "Size",
@@ -861,6 +874,7 @@ const ListObjects = ({
861874
renderFullObject: true,
862875
width: 60,
863876
contentTextAlign: "right",
877+
enableSort: true,
864878
},
865879
];
866880

@@ -869,12 +883,14 @@ const ListObjects = ({
869883
label: "Name",
870884
elementKey: "name",
871885
renderFunction: displayName,
886+
enableSort: true,
872887
},
873888
{
874889
label: "Object Date",
875890
elementKey: "last_modified",
876891
renderFunction: displayParsedDate,
877892
renderFullObject: true,
893+
enableSort: true,
878894
},
879895
{
880896
label: "Size",
@@ -883,6 +899,7 @@ const ListObjects = ({
883899
renderFullObject: true,
884900
width: 60,
885901
contentTextAlign: "right",
902+
enableSort: true,
886903
},
887904
{
888905
label: "Deleted",
@@ -896,6 +913,18 @@ const ListObjects = ({
896913
const pageTitle = decodeFileName(internalPaths);
897914
const currentPath = pageTitle.split("/").filter((i: string) => i !== "");
898915

916+
const plSelect = rewindEnabled ? rewind : filteredRecords;
917+
918+
const sortASC = plSelect.sort(sortListObjects(currentSortField));
919+
920+
let payload = [];
921+
922+
if (sortDirection === "ASC") {
923+
payload = sortASC;
924+
} else {
925+
payload = sortASC.reverse();
926+
}
927+
899928
return (
900929
<React.Fragment>
901930
{shareFileModalOpen && selectedPreview && (
@@ -1094,13 +1123,18 @@ const ListObjects = ({
10941123
loadingMessage={loadingMessage}
10951124
entityName="Objects"
10961125
idField="name"
1097-
records={rewindEnabled ? rewind : filteredRecords}
1126+
records={payload}
10981127
customPaperHeight={classes.browsePaper}
10991128
selectedItems={selectedObjects}
11001129
onSelect={selectListObjects}
11011130
customEmptyMessage={`This location is empty${
11021131
!rewindEnabled ? ", please try uploading a new file" : ""
11031132
}`}
1133+
sortConfig={{
1134+
currentSort: currentSortField,
1135+
currentDirection: sortDirection,
1136+
triggerSort: sortChange,
1137+
}}
11041138
/>
11051139
</Grid>
11061140
</Grid>

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/utils.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
// You should have received a copy of the GNU Affero General Public License
1515
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1616

17+
import { BucketObject, RewindObject } from "./ListObjects/types";
18+
1719
export const download = (
1820
bucketName: string,
1921
objectPath: string,
@@ -89,3 +91,18 @@ export const extensionPreview = (
8991

9092
return "none";
9193
};
94+
95+
export const sortListObjects = (fieldSort: string) => {
96+
switch (fieldSort) {
97+
case "name":
98+
return (a: BucketObject | RewindObject, b: BucketObject | RewindObject) =>
99+
a.name.localeCompare(b.name);
100+
case "last_modified":
101+
return (a: BucketObject | RewindObject, b: BucketObject | RewindObject) =>
102+
new Date(a.last_modified).getTime() -
103+
new Date(b.last_modified).getTime();
104+
case "size":
105+
return (a: BucketObject | RewindObject, b: BucketObject | RewindObject) =>
106+
(a.size || -1) - (b.size || -1);
107+
}
108+
};

portal-ui/src/screens/Console/Common/TableWrapper/TableWrapper.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,8 +692,9 @@ const TableWrapper = ({
692692
{hasSelect && (
693693
<Column
694694
headerRenderer={() => <Fragment>Select</Fragment>}
695-
dataKey={idField}
695+
dataKey={`select-${idField}`}
696696
width={selectWidth}
697+
disableSort
697698
cellRenderer={({ rowData }) => {
698699
const isSelected = selectedItems
699700
? selectedItems.includes(

0 commit comments

Comments
 (0)