17
17
import React from "react" ;
18
18
import get from "lodash/get" ;
19
19
import { createStyles , Theme , withStyles } from "@material-ui/core/styles" ;
20
+ import Paper from "@material-ui/core/Paper" ;
20
21
import Grid from "@material-ui/core/Grid" ;
22
+ import Tabs from "@material-ui/core/Tabs" ;
23
+ import Tab from "@material-ui/core/Tab" ;
21
24
import api from "../../../../common/api" ;
22
- import { BucketEvent , BucketEventList , BucketInfo } from "../types" ;
25
+ import { BucketEvent , BucketEventList , BucketInfo , BucketList } from "../types" ;
23
26
import { Button } from "@material-ui/core" ;
24
27
import Typography from "@material-ui/core/Typography" ;
25
28
import SetAccessPolicy from "./SetAccessPolicy" ;
@@ -28,6 +31,7 @@ import { CreateIcon } from "../../../../icons";
28
31
import AddEvent from "./AddEvent" ;
29
32
import DeleteEvent from "./DeleteEvent" ;
30
33
import TableWrapper from "../../Common/TableWrapper/TableWrapper" ;
34
+ import { niceBytes } from "../../../../common/utils" ;
31
35
32
36
const styles = ( theme : Theme ) =>
33
37
createStyles ( {
@@ -76,6 +80,42 @@ const styles = (theme: Theme) =>
76
80
textAlign : "center" ,
77
81
padding : "20px" ,
78
82
} ,
83
+ gridContainer : {
84
+ display : "grid" ,
85
+ gridTemplateColumns : "auto auto" ,
86
+ gridGap : 8 ,
87
+ justifyContent : "flex-start" ,
88
+ alignItems : "center" ,
89
+ "& div" : {
90
+ display : "flex" ,
91
+ alignItems : "center" ,
92
+ } ,
93
+ "& div:nth-child(odd)" : {
94
+ justifyContent : "flex-end" ,
95
+ fontWeight : 700 ,
96
+ } ,
97
+ "& div:nth-child(2n)" : {
98
+ minWidth : 150 ,
99
+ } ,
100
+ } ,
101
+ masterActions : {
102
+ width : "25%" ,
103
+ minWidth : "120px" ,
104
+ "& div" : {
105
+ margin : "5px 0px" ,
106
+ } ,
107
+ } ,
108
+ paperContainer : {
109
+ padding : 15 ,
110
+ paddingLeft : 23 ,
111
+ } ,
112
+ headerContainer : {
113
+ display : "flex" ,
114
+ justifyContent : "space-between"
115
+ } ,
116
+ capitalizeFirst : {
117
+ textTransform : "capitalize"
118
+ }
79
119
} ) ;
80
120
81
121
interface IViewBucketProps {
@@ -88,6 +128,7 @@ interface IViewBucketState {
88
128
records : BucketEvent [ ] ;
89
129
totalRecords : number ;
90
130
loading : boolean ;
131
+ loadingSize : boolean ;
91
132
error : string ;
92
133
deleteError : string ;
93
134
setAccessPolicyScreenOpen : boolean ;
@@ -97,6 +138,8 @@ interface IViewBucketState {
97
138
deleteOpen : boolean ;
98
139
selectedBucket : string ;
99
140
selectedEvent : BucketEvent | null ;
141
+ bucketSize : string ;
142
+ errorSize : string ;
100
143
}
101
144
102
145
class ViewBucket extends React . Component < IViewBucketProps , IViewBucketState > {
@@ -105,6 +148,7 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
105
148
records : [ ] ,
106
149
totalRecords : 0 ,
107
150
loading : false ,
151
+ loadingSize : false ,
108
152
error : "" ,
109
153
deleteError : "" ,
110
154
setAccessPolicyScreenOpen : false ,
@@ -114,6 +158,8 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
114
158
deleteOpen : false ,
115
159
selectedBucket : "" ,
116
160
selectedEvent : null ,
161
+ bucketSize : "0" ,
162
+ errorSize : "" ,
117
163
} ;
118
164
119
165
fetchEvents ( ) {
@@ -147,6 +193,28 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
147
193
} ) ;
148
194
}
149
195
196
+ fetchBucketsSize ( ) {
197
+ const { match } = this . props ;
198
+ const bucketName = match . params [ "bucketName" ] ;
199
+
200
+ this . setState ( { loadingSize : true } , ( ) => {
201
+ api
202
+ . invoke ( "GET" , `/api/v1/buckets` )
203
+ . then ( ( res : BucketList ) => {
204
+ const resBuckets = get ( res , "buckets" , [ ] ) ;
205
+
206
+ const bucketInfo = resBuckets . find ( bucket => bucket . name === bucketName ) ;
207
+
208
+ const size = get ( bucketInfo , "size" , "0" ) ;
209
+
210
+ this . setState ( { loadingSize : false , errorSize : "" , bucketSize : size } ) ;
211
+ } )
212
+ . catch ( ( err : any ) => {
213
+ this . setState ( { loadingSize : false , errorSize : err } ) ;
214
+ } ) ;
215
+ } ) ;
216
+ }
217
+
150
218
closeAddModalAndRefresh ( ) {
151
219
this . setState ( { setAccessPolicyScreenOpen : false } , ( ) => {
152
220
this . loadInfo ( ) ;
@@ -175,6 +243,7 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
175
243
componentDidMount ( ) : void {
176
244
this . loadInfo ( ) ;
177
245
this . fetchEvents ( ) ;
246
+ this . fetchBucketsSize ( ) ;
178
247
}
179
248
180
249
bucketFilter ( ) : void { }
@@ -192,6 +261,7 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
192
261
deleteOpen,
193
262
addScreenOpen,
194
263
selectedEvent,
264
+ bucketSize,
195
265
} = this . state ;
196
266
197
267
const offset = page * rowsPerPage ;
@@ -242,6 +312,7 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
242
312
< SetAccessPolicy
243
313
bucketName = { bucketName }
244
314
open = { setAccessPolicyScreenOpen }
315
+ actualPolicy = { accessPolicy }
245
316
closeModalAndRefresh = { ( ) => {
246
317
this . closeAddModalAndRefresh ( ) ;
247
318
} }
@@ -258,36 +329,53 @@ class ViewBucket extends React.Component<IViewBucketProps, IViewBucketState> {
258
329
< br />
259
330
</ Grid >
260
331
< Grid item xs = { 12 } >
261
- Access Policy: { accessPolicy }
262
- { " " }
263
- < Button
264
- variant = "contained"
265
- size = "small"
266
- color = "primary"
267
- onClick = { ( ) => {
268
- this . setState ( {
269
- setAccessPolicyScreenOpen : true ,
270
- } ) ;
271
- } }
272
- >
273
- Change Access Policy
274
- </ Button >
275
- < br />
276
- Reported Usage: 0 bytes
277
- < br />
332
+ < div className = { classes . headerContainer } >
333
+ < div > < Paper className = { classes . paperContainer } >
334
+ < div className = { classes . gridContainer } >
335
+ < div > Access Policy:</ div >
336
+ < div className = { classes . capitalizeFirst } > { accessPolicy . toLowerCase ( ) } </ div >
337
+ < div > Reported Usage:</ div >
338
+ < div > { niceBytes ( bucketSize ) } </ div >
339
+ </ div >
340
+ </ Paper > </ div >
341
+ < div className = { classes . masterActions } >
342
+ < div >
343
+ < Button
344
+ variant = "contained"
345
+ color = "primary"
346
+ fullWidth
347
+ size = "medium"
348
+ onClick = { ( ) => {
349
+ this . setState ( {
350
+ setAccessPolicyScreenOpen : true ,
351
+ } ) ;
352
+ } }
353
+ >
354
+ Change Access Policy
355
+ </ Button >
356
+ </ div >
357
+ </ div >
358
+ </ div >
278
359
</ Grid >
279
360
< Grid item xs = { 12 } >
280
361
< br />
281
362
</ Grid >
282
363
< Grid item xs = { 6 } >
283
- < Typography variant = "h6" > Events</ Typography >
364
+ < Tabs
365
+ value = { 0 }
366
+ indicatorColor = "primary"
367
+ textColor = "primary"
368
+ aria-label = "cluster-tabs"
369
+ >
370
+ < Tab label = "Events" />
371
+ </ Tabs >
284
372
</ Grid >
285
373
< Grid item xs = { 6 } className = { classes . actionsTray } >
286
374
< Button
287
375
variant = "contained"
288
376
color = "primary"
289
- size = "small"
290
377
startIcon = { < CreateIcon /> }
378
+ size = "medium"
291
379
onClick = { ( ) => {
292
380
this . setState ( {
293
381
addScreenOpen : true ,
0 commit comments