Skip to content

Commit 8008f22

Browse files
authored
Added Show deleted objects functionality in objects list (#1681)
Signed-off-by: Benjamin Perez <benjamin@bexsoft.net>
1 parent fbfc155 commit 8008f22

File tree

8 files changed

+106
-8
lines changed

8 files changed

+106
-8
lines changed

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import {
6262
resetRewind,
6363
setNewObject,
6464
setSearchObjects,
65+
setShowDeletedObjects,
6566
setVersionsModeEnabled,
6667
updateProgress,
6768
} from "../../../../ObjectBrowser/actions";
@@ -101,6 +102,7 @@ import RBIconButton from "../../../BucketDetails/SummaryItems/RBIconButton";
101102
import ActionsListSection from "./ActionsListSection";
102103
import { listModeColumns, rewindModeColumns } from "./ListObjectsHelpers";
103104
import VersionsNavigator from "../ObjectDetails/VersionsNavigator";
105+
import CheckboxWrapper from "../../../../Common/FormComponents/CheckboxWrapper/CheckboxWrapper";
104106

105107
const HistoryIcon = React.lazy(
106108
() => import("../../../../../../icons/HistoryIcon")
@@ -169,6 +171,10 @@ const styles = (theme: Theme) =>
169171
borderBottom: 0,
170172
padding: "0.8rem 15px 0",
171173
},
174+
labelStyle: {
175+
color: "#969FA8",
176+
fontSize: "12px",
177+
},
172178
...objectBrowserExtras,
173179
...objectBrowserCommon,
174180
...containerForHeader(theme.spacing(4)),
@@ -203,6 +209,7 @@ interface IListObjectsProps {
203209
rewindDate: any;
204210
bucketToRewind: string;
205211
searchObjects: string;
212+
showDeleted: boolean;
206213
setSnackBarMessage: typeof setSnackBarMessage;
207214
setErrorSnackMessage: typeof setErrorSnackMessage;
208215
resetRewind: typeof resetRewind;
@@ -217,6 +224,7 @@ interface IListObjectsProps {
217224
openList: typeof openList;
218225
setSearchObjects: typeof setSearchObjects;
219226
setVersionsModeEnabled: typeof setVersionsModeEnabled;
227+
setShowDeletedObjects: typeof setShowDeletedObjects;
220228
}
221229

222230
function useInterval(callback: any, delay: number) {
@@ -266,6 +274,8 @@ const ListObjects = ({
266274
versionsMode,
267275
openList,
268276
setVersionsModeEnabled,
277+
showDeleted,
278+
setShowDeletedObjects,
269279
}: IListObjectsProps) => {
270280
const [records, setRecords] = useState<BucketObject[]>([]);
271281
const [loading, setLoading] = useState<boolean>(true);
@@ -493,10 +503,20 @@ const ListObjects = ({
493503
let currentTimestamp = Date.now();
494504
setLoadingStartTime(currentTimestamp);
495505
setLoadingMessage(defLoading);
506+
507+
let urlTake = `/api/v1/buckets/${bucketName}/objects`;
508+
509+
if (showDeleted) {
510+
const currDate = new Date();
511+
const currDateISO = currDate.toISOString();
512+
513+
urlTake = `/api/v1/buckets/${bucketName}/rewind/${currDateISO}`;
514+
}
515+
496516
api
497517
.invoke(
498518
"GET",
499-
`/api/v1/buckets/${bucketName}/objects${
519+
`${urlTake}${
500520
pathPrefix ? `?prefix=${encodeFileName(pathPrefix)}` : ``
501521
}`
502522
)
@@ -622,6 +642,7 @@ const ListObjects = ({
622642
rewindDate,
623643
internalPaths,
624644
bucketInfo,
645+
showDeleted,
625646
displayListObjects,
626647
]);
627648

@@ -1054,6 +1075,11 @@ const ListObjects = ({
10541075
}
10551076
};
10561077

1078+
const setDeletedAction = () => {
1079+
setShowDeletedObjects(!showDeleted);
1080+
onClosePanel(true);
1081+
};
1082+
10571083
const tableActions: ItemActions[] = [
10581084
{
10591085
type: "view",
@@ -1264,6 +1290,22 @@ const ListObjects = ({
12641290
bucketName={bucketName}
12651291
internalPaths={pageTitle}
12661292
existingFiles={records || []}
1293+
additionalOptions={
1294+
!isVersioned || rewindEnabled ? null : (
1295+
<div>
1296+
<CheckboxWrapper
1297+
name={"deleted_objects"}
1298+
id={"showDeletedObjects"}
1299+
value={"deleted_on"}
1300+
label={"Show deleted objects on this bucket"}
1301+
onChange={setDeletedAction}
1302+
checked={showDeleted}
1303+
overrideLabelClasses={classes.labelStyle}
1304+
noTopMargin
1305+
/>
1306+
</div>
1307+
)
1308+
}
12671309
/>
12681310
</Grid>
12691311
<div
@@ -1309,6 +1351,13 @@ const ListObjects = ({
13091351
triggerSort: sortChange,
13101352
}}
13111353
onSelectAll={selectAllItems}
1354+
rowStyle={({ index }) => {
1355+
if (payload[index]?.delete_flag) {
1356+
return "deleted";
1357+
}
1358+
1359+
return "";
1360+
}}
13121361
/>
13131362
</SecureComponent>
13141363
)}
@@ -1355,6 +1404,7 @@ const mapStateToProps = ({ objectBrowser, buckets }: AppState) => ({
13551404
loadingBucket: buckets.bucketDetails.loadingBucket,
13561405
bucketInfo: buckets.bucketDetails.bucketInfo,
13571406
searchObjects: objectBrowser.searchObjects,
1407+
showDeleted: objectBrowser.showDeleted,
13581408
});
13591409

13601410
const mapDispatchToProps = {
@@ -1369,6 +1419,7 @@ const mapDispatchToProps = {
13691419
openList,
13701420
setSearchObjects,
13711421
setVersionsModeEnabled,
1422+
setShowDeletedObjects,
13721423
};
13731424

13741425
const connector = connect(mapStateToProps, mapDispatchToProps);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ export const displayParsedDate = (object: BucketObject) => {
3030
};
3131

3232
export const displayNiceBytes = (object: BucketObject) => {
33-
if (object.name.endsWith("/")) {
34-
return "";
33+
if (object.name.endsWith("/") || !object.size) {
34+
return "-";
3535
}
3636
return niceBytes(String(object.size));
3737
};
@@ -62,7 +62,7 @@ export const listModeColumns = [
6262
renderFunction: displayNiceBytes,
6363
renderFullObject: true,
6464
width: 60,
65-
contentTextAlign: "right",
65+
contentTextAlign: "center",
6666
enableSort: true,
6767
},
6868
];
@@ -87,7 +87,7 @@ export const rewindModeColumns = [
8787
renderFunction: displayNiceBytes,
8888
renderFullObject: true,
8989
width: 60,
90-
contentTextAlign: "right",
90+
contentTextAlign: "center",
9191
enableSort: true,
9292
},
9393
{

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface BucketObject {
2121
last_modified: Date;
2222
content_type: string;
2323
version_id: string;
24+
delete_flag?:boolean;
2425
}
2526

2627
export interface BucketObjectsList {

portal-ui/src/screens/Console/Common/FormComponents/CheckboxWrapper/CheckboxWrapper.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ interface CheckBoxProps {
3434
name: string;
3535
disabled?: boolean;
3636
tooltip?: string;
37+
overrideLabelClasses?: string;
3738
index?: number;
39+
noTopMargin?: boolean;
3840
checked: boolean;
3941
}
4042

@@ -52,6 +54,9 @@ const styles = (theme: Theme) =>
5254
marginBottom: 0,
5355
flexBasis: "initial",
5456
},
57+
noTopMargin: {
58+
marginTop: 0,
59+
},
5560
});
5661

5762
const CheckboxWrapper = ({
@@ -62,12 +67,20 @@ const CheckboxWrapper = ({
6267
name,
6368
checked = false,
6469
disabled = false,
70+
noTopMargin = false,
6571
tooltip = "",
72+
overrideLabelClasses = "",
6673
classes,
6774
}: CheckBoxProps) => {
6875
return (
6976
<React.Fragment>
70-
<Grid item xs={12} className={classes.fieldContainer}>
77+
<Grid
78+
item
79+
xs={12}
80+
className={`${classes.fieldContainer} ${
81+
noTopMargin ? classes.noTopMargin : ""
82+
}`}
83+
>
7184
<div>
7285
<Checkbox
7386
name={name}
@@ -83,7 +96,10 @@ const CheckboxWrapper = ({
8396
/>
8497
</div>
8598
{label !== "" && (
86-
<InputLabel htmlFor={id} className={classes.noMinWidthLabel}>
99+
<InputLabel
100+
htmlFor={id}
101+
className={`${classes.noMinWidthLabel} ${overrideLabelClasses}`}
102+
>
87103
<span>{label}</span>
88104
{tooltip !== "" && (
89105
<div className={classes.tooltipContainer}>

portal-ui/src/screens/Console/Common/FormComponents/common/styleLibrary.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,9 @@ export const objectBrowserCommon = {
383383
minWidth: 16,
384384
},
385385
},
386+
additionalOptions: {
387+
paddingRight: "10px"
388+
},
386389
smallLabel: {
387390
color: "#9C9C9C",
388391
fontSize: 15,

portal-ui/src/screens/Console/ObjectBrowser/BrowserBreadcrumbs.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ interface IObjectBrowser {
5252
versionsMode: boolean;
5353
versionedFile: string;
5454
existingFiles: BucketObject[];
55+
additionalOptions?: React.ReactNode;
5556
setVersionsModeEnabled: typeof setVersionsModeEnabled;
5657
}
5758

@@ -69,6 +70,7 @@ const BrowserBreadcrumbs = ({
6970
versionsMode,
7071
versionedFile,
7172
setVersionsModeEnabled,
73+
additionalOptions,
7274
}: IObjectBrowser) => {
7375
const [createFolderOpen, setCreateFolderOpen] = useState<boolean>(false);
7476

@@ -186,6 +188,9 @@ const BrowserBreadcrumbs = ({
186188
<div className={classes.breadcrumbsList} dir="rtl">
187189
{listBreadcrumbs}
188190
</div>
191+
{additionalOptions && (
192+
<div className={classes.additionalOptions}>{additionalOptions}</div>
193+
)}
189194
</Grid>
190195
</React.Fragment>
191196
);

portal-ui/src/screens/Console/ObjectBrowser/actions.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const BUCKET_BROWSER_VERSIONS_SET_SEARCH =
3838
"BUCKET_BROWSER/VERSIONS_SET_SEARCH";
3939
export const BUCKET_BROWSER_SET_SELECTED_VERSION =
4040
"BUCKET_BROWSER/SET_SELECTED_VERSION";
41+
export const BUCKET_BROWSER_SHOW_DELETED = "BUCKET_BROWSER/SHOW_DELETED";
4142

4243
interface RewindSetEnabled {
4344
type: typeof REWIND_SET_ENABLE;
@@ -108,6 +109,11 @@ interface SetSelectedversion {
108109
selectedVersion: string;
109110
}
110111

112+
interface SetShowDeletedObjects {
113+
type: typeof BUCKET_BROWSER_SHOW_DELETED;
114+
status: boolean;
115+
}
116+
111117
export type ObjectBrowserActionTypes =
112118
| RewindSetEnabled
113119
| RewindReset
@@ -122,7 +128,8 @@ export type ObjectBrowserActionTypes =
122128
| OMCloseList
123129
| SetSearchObjects
124130
| SetSearchVersions
125-
| SetSelectedversion;
131+
| SetSelectedversion
132+
| SetShowDeletedObjects;
126133

127134
export const setRewindEnable = (
128135
state: boolean,
@@ -227,3 +234,10 @@ export const setSelectedVersion = (selectedVersion: string) => {
227234
selectedVersion,
228235
};
229236
};
237+
238+
export const setShowDeletedObjects = (status: boolean) => {
239+
return {
240+
type: BUCKET_BROWSER_SHOW_DELETED,
241+
status
242+
}
243+
};

portal-ui/src/screens/Console/ObjectBrowser/reducers.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
OBJECT_MANAGER_SET_SEARCH_OBJECT,
3030
BUCKET_BROWSER_VERSIONS_SET_SEARCH,
3131
BUCKET_BROWSER_SET_SELECTED_VERSION,
32+
BUCKET_BROWSER_SHOW_DELETED,
3233
} from "./actions";
3334

3435
export interface Route {
@@ -51,6 +52,7 @@ export interface ObjectBrowserState {
5152
versionedFile: string;
5253
searchVersions: string;
5354
selectedVersion: string;
55+
showDeleted: boolean;
5456
}
5557

5658
export interface ObjectBrowserReducer {
@@ -91,6 +93,7 @@ const initialState: ObjectBrowserState = {
9193
versionedFile: "",
9294
searchVersions: "",
9395
selectedVersion: "",
96+
showDeleted: false,
9497
};
9598

9699
export function objectBrowserReducer(
@@ -245,6 +248,11 @@ export function objectBrowserReducer(
245248
...state,
246249
selectedVersion: action.selectedVersion,
247250
};
251+
case BUCKET_BROWSER_SHOW_DELETED:
252+
return {
253+
...state,
254+
showDeleted: action.status,
255+
};
248256
default:
249257
return state;
250258
}

0 commit comments

Comments
 (0)