Skip to content

Commit 12e54f1

Browse files
authored
1053 pagination doesnt update on deleting files in a dataset (#1060)
* update reducer * delete file should work now * update dataset use effect to listen to dataset change * update dataset delete * delete groups * metadata deletion * fix delete api keys * add a delete button right next to group
1 parent 875dfe8 commit 12e54f1

File tree

10 files changed

+91
-68
lines changed

10 files changed

+91
-68
lines changed

frontend/src/components/Explore.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ export const Explore = (): JSX.Element => {
3131
const datasets = useSelector(
3232
(state: RootState) => state.dataset.datasets.data
3333
);
34+
const deletedDataset = useSelector(
35+
(state: RootState) => state.dataset.deletedDataset
36+
);
3437
const pageMetadata = useSelector(
3538
(state: RootState) => state.dataset.datasets.metadata
3639
);
@@ -44,15 +47,10 @@ export const Explore = (): JSX.Element => {
4447
const [selectedTabIndex, setSelectedTabIndex] = useState(0);
4548
const [errorOpen, setErrorOpen] = useState(false);
4649

47-
// component did mount
48-
useEffect(() => {
49-
listDatasets(0, limit, mine);
50-
}, []);
51-
5250
// Admin mode will fetch all datasets
5351
useEffect(() => {
54-
listDatasets(0, limit, mine);
55-
}, [adminMode]);
52+
listDatasets((currPageNum - 1) * limit, limit, mine);
53+
}, [adminMode, deletedDataset]);
5654

5755
// switch tabs
5856
const handleTabChange = (

frontend/src/components/apikeys/ApiKey.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ export function ApiKeys() {
3434
const pageMetadata = useSelector(
3535
(state: RootState) => state.user.apiKeys.metadata
3636
);
37+
const deletedApiKey = useSelector(
38+
(state: RootState) => state.user.deletedApiKey
39+
);
40+
const hashedKey = useSelector((state: RootState) => state.user.hashedKey);
3741

3842
// TODO add option to determine limit number; default show 5 tokens each time
3943
const [currPageNum, setCurrPageNum] = useState<number>(1);
@@ -44,8 +48,8 @@ export function ApiKeys() {
4448

4549
// component did mount
4650
useEffect(() => {
47-
listApiKeys(0, limit);
48-
}, []);
51+
listApiKeys((currPageNum - 1) * limit, limit);
52+
}, [deletedApiKey, hashedKey]);
4953

5054
const handlePageChange = (_: ChangeEvent<unknown>, value: number) => {
5155
const newSkip = (value - 1) * limit;

frontend/src/components/datasets/Dataset.tsx

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ import React, { ChangeEvent, useEffect, useState } from "react";
33
import {
44
Box,
55
Button,
6+
Dialog,
7+
DialogContent,
8+
DialogTitle,
69
Grid,
10+
IconButton,
11+
Link,
712
Pagination,
813
Stack,
914
Tab,
1015
Tabs,
1116
Typography,
12-
Link,
13-
IconButton,
14-
DialogTitle,
15-
DialogContent,
16-
Dialog,
1717
} from "@mui/material";
1818
import EditIcon from "@mui/icons-material/Edit";
1919
import { useParams, useSearchParams } from "react-router-dom";
@@ -28,7 +28,7 @@ import { fetchFolderPath } from "../../actions/folder";
2828

2929
import { a11yProps, TabPanel } from "../tabs/TabComponent";
3030
import FilesTable from "../files/FilesTable";
31-
import { LicenseOption, MetadataIn } from "../../openapi/v2";
31+
import { MetadataIn } from "../../openapi/v2";
3232
import { DisplayMetadata } from "../metadata/DisplayMetadata";
3333
import { DisplayListenerMetadata } from "../metadata/DisplayListenerMetadata";
3434
import { EditMetadata } from "../metadata/EditMetadata";
@@ -51,18 +51,13 @@ import ShareIcon from "@mui/icons-material/Share";
5151
import BuildIcon from "@mui/icons-material/Build";
5252
import { ExtractionHistoryTab } from "../listeners/ExtractionHistoryTab";
5353
import { SharingTab } from "../sharing/SharingTab";
54-
import RoleChip from "../auth/RoleChip";
5554
import { TabStyle } from "../../styles/Styles";
5655
import { ErrorModal } from "../errors/ErrorModal";
5756
import { Visualization } from "../visualizations/Visualization";
5857
import VisibilityIcon from "@mui/icons-material/Visibility";
5958
import config from "../../app.config";
6059
import { EditLicenseModal } from "./EditLicenseModal";
61-
import { V2 } from "../../openapi";
62-
import {
63-
fetchStandardLicenses,
64-
fetchStandardLicenseUrl,
65-
} from "../../utils/licenses";
60+
import { fetchStandardLicenseUrl } from "../../utils/licenses";
6661
import { authCheck } from "../../utils/common";
6762

6863
export const Dataset = (): JSX.Element => {
@@ -143,6 +138,13 @@ export const Dataset = (): JSX.Element => {
143138
);
144139
const adminMode = useSelector((state: RootState) => state.user.adminMode);
145140
const license = useSelector((state: RootState) => state.dataset.license);
141+
const deletedFile = useSelector(
142+
(state: RootState) => state.dataset.deletedFile
143+
);
144+
const deletedFolder = useSelector(
145+
(state: RootState) => state.dataset.deletedFolder
146+
);
147+
146148
const [standardLicenseUrl, setStandardLicenseUrl] = useState<string>("");
147149
const fetchStandardLicenseUrlData = async (license_id: string) => {
148150
try {
@@ -170,6 +172,16 @@ export const Dataset = (): JSX.Element => {
170172
getMetadatDefinitions(null, 0, 100);
171173
}, [searchParams, adminMode, about.license_id]);
172174

175+
useEffect(() => {
176+
fetchFoldersFilesInDataset(
177+
datasetId,
178+
folderId,
179+
(currPageNum - 1) * limit,
180+
limit
181+
);
182+
listDatasetAbout(datasetId);
183+
}, [deletedFile, deletedFolder]);
184+
173185
// for breadcrumb
174186
useEffect(() => {
175187
// for breadcrumb

frontend/src/components/groups/Groups.tsx

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
DialogContent,
77
DialogTitle,
88
Grid,
9+
IconButton,
910
Link as MuiLink,
1011
Pagination,
1112
} from "@mui/material";
@@ -30,6 +31,8 @@ import { CreateGroup } from "./CreateGroup";
3031
import { ErrorModal } from "../errors/ErrorModal";
3132
import { GenericSearchBox } from "../search/GenericSearchBox";
3233
import config from "../../app.config";
34+
import DeleteIcon from "@mui/icons-material/Delete";
35+
import DeleteGroupModal from "./DeleteGroupModal";
3336

3437
export function Groups() {
3538
// Redux connect equivalent
@@ -46,6 +49,9 @@ export function Groups() {
4649
const pageMetadata = useSelector(
4750
(state: RootState) => state.group.groups.metadata
4851
);
52+
const deletedGroup = useSelector(
53+
(state: RootState) => state.group.deletedGroup
54+
);
4955
const adminMode = useSelector((state: RootState) => state.user.adminMode);
5056

5157
// TODO add option to determine limit number; default show 5 groups each time
@@ -54,11 +60,13 @@ export function Groups() {
5460
const [searchTerm, setSearchTerm] = useState<string>("");
5561
const [createGroupOpen, setCreateGroupOpen] = useState<boolean>(false);
5662
const [errorOpen, setErrorOpen] = useState(false);
63+
const [deleteGroupConfirmOpen, setDeleteGroupConfirmOpen] = useState(false);
64+
const [selectedGroupId, setSelectedGroupId] = useState("");
5765

5866
// component did mount
5967
useEffect(() => {
6068
listGroups((currPageNum - 1) * limit, limit);
61-
}, [adminMode]);
69+
}, [adminMode, deletedGroup]);
6270

6371
// search while typing
6472
useEffect(() => {
@@ -79,6 +87,11 @@ export function Groups() {
7987
<Layout>
8088
{/*Error Message dialogue*/}
8189
<ErrorModal errorOpen={errorOpen} setErrorOpen={setErrorOpen} />
90+
<DeleteGroupModal
91+
deleteGroupConfirmOpen={deleteGroupConfirmOpen}
92+
setDeleteGroupConfirmOpen={setDeleteGroupConfirmOpen}
93+
groupId={selectedGroupId}
94+
/>
8295
<div className="outer-container">
8396
{/*create new group*/}
8497
<Dialog
@@ -150,6 +163,7 @@ export function Groups() {
150163
>
151164
<GroupsIcon />
152165
</TableCell>
166+
<TableCell align="left" />
153167
</TableRow>
154168
</TableHead>
155169
<TableBody>
@@ -176,6 +190,22 @@ export function Groups() {
176190
<TableCell scope="row" key={group.id} align="left">
177191
{group.users !== undefined ? group.users.length : 0}
178192
</TableCell>
193+
<TableCell
194+
scope="row"
195+
key={`${group.id}-delete`}
196+
align="left"
197+
>
198+
<IconButton
199+
aria-label="delete"
200+
size="small"
201+
onClick={() => {
202+
setSelectedGroupId(group.id);
203+
setDeleteGroupConfirmOpen(true);
204+
}}
205+
>
206+
<DeleteIcon fontSize="small" />
207+
</IconButton>
208+
</TableCell>
179209
</TableRow>
180210
);
181211
})}

frontend/src/components/metadata/MetadataDefinitions.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ export function MetadataDefinitions() {
5353
const pageMetadata = useSelector(
5454
(state: RootState) => state.metadata.metadataDefinitionList.metadata
5555
);
56+
const deletedMetadataDefinition = useSelector(
57+
(state: RootState) => state.metadata.deletedMetadataDefinition
58+
);
5659
const adminMode = useSelector((state: RootState) => state.user.adminMode);
5760

5861
// TODO add option to determine limit number; default show 5 metadata definitions each time
@@ -75,15 +78,10 @@ export function MetadataDefinitions() {
7578
// Error msg dialog
7679
const [errorOpen, setErrorOpen] = useState(false);
7780

78-
// component did mount
79-
useEffect(() => {
80-
listMetadataDefinitions(null, 0, limit);
81-
}, []);
82-
8381
// Admin mode will fetch all datasets
8482
useEffect(() => {
8583
listMetadataDefinitions(null, (currPageNum - 1) * limit, limit);
86-
}, [adminMode]);
84+
}, [adminMode, deletedMetadataDefinition]);
8785

8886
// search
8987
useEffect(() => {

frontend/src/reducers/dataset.ts

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
FOLDER_UPDATED,
66
RECEIVE_DATASET_ABOUT,
77
RECEIVE_DATASET_LICENSE,
8-
UPDATE_DATASET_LICENSE,
98
RECEIVE_DATASET_ROLES,
109
RECEIVE_DATASETS,
1110
RECEIVE_FOLDERS_FILES_IN_DATASET,
@@ -15,6 +14,7 @@ import {
1514
SET_DATASET_GROUP_ROLE,
1615
SET_DATASET_USER_ROLE,
1716
UPDATE_DATASET,
17+
UPDATE_DATASET_LICENSE,
1818
} from "../actions/dataset";
1919
import {
2020
CREATE_FILE,
@@ -29,7 +29,6 @@ import { DataAction } from "../types/action";
2929
import { DatasetState } from "../types/data";
3030
import {
3131
AuthorizationBase,
32-
DatasetOut,
3332
DatasetOut as Dataset,
3433
DatasetRoles,
3534
FileOut,
@@ -46,6 +45,9 @@ const defaultState: DatasetState = {
4645
metadata: <PageMetadata>{},
4746
data: <FileOut | FolderOut[]>[],
4847
},
48+
deletedDataset: <Dataset>{},
49+
deletedFolder: <FolderOut>{},
50+
deletedFile: <FileOut>{},
4951
about: <Dataset>{ creator: <UserOut>{} },
5052
datasetRole: <AuthorizationBase>{},
5153
datasets: <Paged>{ metadata: <PageMetadata>{}, data: <Dataset[]>[] },
@@ -65,12 +67,7 @@ const dataset = (state = defaultState, action: DataAction) => {
6567
});
6668
case DELETE_FILE:
6769
return Object.assign({}, state, {
68-
foldersAndFiles: {
69-
...state.foldersAndFiles,
70-
data: state.foldersAndFiles.data.filter(
71-
(item: FileOut | FolderOut) => item.id !== action.file.id
72-
),
73-
},
70+
deletedFile: action.file,
7471
});
7572
case CREATE_FILE:
7673
return Object.assign({}, state, {
@@ -121,21 +118,11 @@ const dataset = (state = defaultState, action: DataAction) => {
121118
return Object.assign({}, state, { newDataset: {} });
122119
case DELETE_DATASET:
123120
return Object.assign({}, state, {
124-
datasets: {
125-
...state.datasets,
126-
data: state.datasets.data.filter(
127-
(dataset: DatasetOut) => dataset.id !== action.dataset.id
128-
),
129-
},
121+
deletedDataset: action.dataset,
130122
});
131123
case FOLDER_DELETED:
132124
return Object.assign({}, state, {
133-
foldersAndFiles: {
134-
...state.foldersAndFiles,
135-
data: state.foldersAndFiles.data.filter(
136-
(item: FileOut | FolderOut) => item.id !== action.folder.id
137-
),
138-
},
125+
deletedFolder: action.folder,
139126
});
140127
case FOLDER_ADDED:
141128
return Object.assign({}, state, { newFolder: action.folder });

frontend/src/reducers/group.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
const defaultState: GroupState = {
3131
groups: <Paged>{ metadata: <PageMetadata>{}, data: <GroupOut[]>[] },
3232
newGroup: <GroupOut>{},
33+
deletedGroup: <GroupOut>{},
3334
about: <GroupOut>{},
3435
role: <RoleType>{},
3536
users: <Paged>{ metadata: <PageMetadata>{}, data: <UserOut[]>[] },
@@ -50,7 +51,7 @@ const group = (state = defaultState, action: DataAction) => {
5051
case RECEIVE_GROUP_ROLE:
5152
return Object.assign({}, state, { role: action.role });
5253
case DELETE_GROUP_MEMBER:
53-
return Object.assign({}, state, { about: action.about });
54+
return Object.assign({}, state, { deletedGroup: action.about });
5455
case UPDATE_GROUP:
5556
return Object.assign({}, state, { about: action.about });
5657
case ADD_GROUP_MEMBER:
@@ -81,12 +82,7 @@ const group = (state = defaultState, action: DataAction) => {
8182
return Object.assign({}, state, { about: action.about });
8283
case DELETE_GROUP:
8384
return Object.assign({}, state, {
84-
groups: {
85-
...state.groups,
86-
data: state.groups.data.filter(
87-
(group: GroupOut) => group.id !== action.about.id
88-
),
89-
},
85+
deletedGroup: action.about,
9086
});
9187
default:
9288
return state;

frontend/src/reducers/metadata.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const defaultState: MetadataState = {
3333
publicMetadataDefinitionList: [],
3434
metadataDefinition: <MetadataDefinitionOut>{},
3535
newMetadataDefinition: <MetadataDefinitionOut>{},
36+
deletedMetadataDefinition: <MetadataDefinitionOut>{},
3637
};
3738

3839
const metadata = (state = defaultState, action: DataAction) => {
@@ -55,13 +56,7 @@ const metadata = (state = defaultState, action: DataAction) => {
5556
});
5657
case DELETE_METADATA_DEFINITION:
5758
return Object.assign({}, state, {
58-
metadataDefinitionList: {
59-
...state.metadataDefinitionList,
60-
data: state.metadataDefinitionList.data.filter(
61-
(metadataDefinition: MetadataDefinitionOut) =>
62-
metadataDefinition.id !== action.metadataDefinition.id
63-
),
64-
},
59+
deletedMetadataDefinition: action.metadataDefinition,
6560
});
6661
case SAVE_METADATA_DEFINITION:
6762
return Object.assign({}, state, {

frontend/src/reducers/user.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const defaultState: UserState = {
2323
errorMsg: "",
2424
hashedKey: "",
2525
apiKeys: <Paged>{ metadata: <PageMetadata>{}, data: <UserAPIKeyOut[]>[] },
26+
deletedApiKey: <UserAPIKeyOut>{},
2627
profile: <UserOut>{},
2728
};
2829

@@ -63,12 +64,7 @@ const user = (state = defaultState, action: DataAction) => {
6364
return Object.assign({}, state, { apiKeys: action.apiKeys });
6465
case DELETE_API_KEY:
6566
return Object.assign({}, state, {
66-
apiKeys: {
67-
...state.apiKeys,
68-
data: state.apiKeys.data.filter(
69-
(apiKey: UserAPIKeyOut) => apiKey.id !== action.apiKey.id
70-
),
71-
},
67+
deletedApiKey: action.apiKey,
7268
});
7369
case GENERATE_API_KEY:
7470
return Object.assign({}, state, { hashedKey: action.hashedKey });

0 commit comments

Comments
 (0)