1
+ import Collapse from "@material-ui/core/Collapse"
1
2
import { makeStyles } from "@material-ui/core/styles"
2
3
import Table from "@material-ui/core/Table"
3
4
import TableBody from "@material-ui/core/TableBody"
@@ -7,16 +8,102 @@ import TableHead from "@material-ui/core/TableHead"
7
8
import TableRow from "@material-ui/core/TableRow"
8
9
import { AuditLog } from "api/api"
9
10
import { CodeExample } from "components/CodeExample/CodeExample"
11
+ import { CloseDropdown , OpenDropdown } from "components/DropdownArrows/DropdownArrows"
10
12
import { Margins } from "components/Margins/Margins"
11
13
import { PageHeader , PageHeaderSubtitle , PageHeaderTitle } from "components/PageHeader/PageHeader"
12
14
import { Pill } from "components/Pill/Pill"
13
15
import { Stack } from "components/Stack/Stack"
14
16
import { TableLoader } from "components/TableLoader/TableLoader"
15
17
import { AuditHelpTooltip } from "components/Tooltips"
16
18
import { UserAvatar } from "components/UserAvatar/UserAvatar"
17
- import { FC } from "react"
19
+ import { FC , useState } from "react"
18
20
import { createDayString } from "util/createDayString"
19
21
22
+ const AuditDiff = ( ) => {
23
+ const styles = useStyles ( )
24
+
25
+ return (
26
+ < div className = { styles . diff } >
27
+ < div className = { styles . diffOld } >
28
+ < div className = { styles . diffRow } >
29
+ < div className = { styles . diffLine } > 1</ div >
30
+ < div className = { styles . diffIcon } > -</ div >
31
+ < div className = { styles . diffContent } >
32
+ workspace_name: < span > alice-workspace</ span >
33
+ </ div >
34
+ </ div >
35
+ </ div >
36
+ < div className = { styles . diffNew } >
37
+ < div className = { styles . diffRow } >
38
+ < div className = { styles . diffLine } > 1</ div >
39
+ < div className = { styles . diffIcon } > +</ div >
40
+ < div className = { styles . diffContent } >
41
+ workspace_name: < span > bruno-workspace</ span >
42
+ </ div >
43
+ </ div >
44
+ </ div >
45
+ </ div >
46
+ )
47
+ }
48
+
49
+ const AuditLogRow : React . FC < { auditLog : AuditLog } > = ( { auditLog } ) => {
50
+ const styles = useStyles ( )
51
+ const [ isDiffOpen , setIsDiffOpen ] = useState ( false )
52
+
53
+ return (
54
+ < >
55
+ < Stack
56
+ direction = "row"
57
+ alignItems = "center"
58
+ className = { styles . auditLogRow }
59
+ tabIndex = { 0 }
60
+ onClick = { ( ) => setIsDiffOpen ( ( v ) => ! v ) }
61
+ onKeyDown = { ( event ) => {
62
+ if ( event . key === "Enter" ) {
63
+ setIsDiffOpen ( ( v ) => ! v )
64
+ }
65
+ } }
66
+ >
67
+ < Stack
68
+ direction = "row"
69
+ alignItems = "center"
70
+ justifyContent = "space-between"
71
+ className = { styles . auditLogRowInfo }
72
+ >
73
+ < Stack direction = "row" alignItems = "center" >
74
+ < UserAvatar username = { auditLog . user ?. username ?? "" } />
75
+ < div >
76
+ < span className = { styles . auditLogResume } >
77
+ < strong > { auditLog . user ?. username } </ strong > { auditLog . action } { " " }
78
+ < strong > { auditLog . resource . name } </ strong >
79
+ </ span >
80
+ < span className = { styles . auditLogTime } > { createDayString ( auditLog . time ) } </ span >
81
+ </ div >
82
+ </ Stack >
83
+
84
+ < Stack direction = "column" alignItems = "flex-end" spacing = { 1 } >
85
+ < Pill type = "success" text = { auditLog . status_code . toString ( ) } />
86
+ < Stack direction = "row" alignItems = "center" className = { styles . auditLogExtraInfo } >
87
+ < div >
88
+ < strong > IP</ strong > { auditLog . ip }
89
+ </ div >
90
+ < div >
91
+ < strong > Agent</ strong > { auditLog . user_agent }
92
+ </ div >
93
+ </ Stack >
94
+ </ Stack >
95
+ </ Stack >
96
+
97
+ { isDiffOpen ? < CloseDropdown /> : < OpenDropdown /> }
98
+ </ Stack >
99
+
100
+ < Collapse in = { isDiffOpen } >
101
+ < AuditDiff />
102
+ </ Collapse >
103
+ </ >
104
+ )
105
+ }
106
+
20
107
export const Language = {
21
108
title : "Audit" ,
22
109
subtitle : "View events in your audit log." ,
@@ -51,37 +138,10 @@ export const AuditPageView: FC<{ auditLogs?: AuditLog[] }> = ({ auditLogs }) =>
51
138
</ TableHead >
52
139
< TableBody >
53
140
{ auditLogs ? (
54
- auditLogs . map ( ( log ) => (
55
- < TableRow key = { log . id } >
56
- < TableCell >
57
- < Stack direction = "row" alignItems = "center" justifyContent = "space-between" >
58
- < Stack direction = "row" alignItems = "center" >
59
- < UserAvatar username = { log . user ?. username ?? "" } />
60
- < div >
61
- < span className = { styles . auditLogResume } >
62
- < strong > { log . user ?. username } </ strong > { log . action } { " " }
63
- < strong > { log . resource . name } </ strong >
64
- </ span >
65
- < span className = { styles . auditLogTime } > { createDayString ( log . time ) } </ span >
66
- </ div >
67
- </ Stack >
68
-
69
- < Stack direction = "column" alignItems = "flex-end" spacing = { 1 } >
70
- < Pill type = "success" text = { log . status_code . toString ( ) } />
71
- < Stack
72
- direction = "row"
73
- alignItems = "center"
74
- className = { styles . auditLogExtraInfo }
75
- >
76
- < div >
77
- < strong > IP</ strong > { log . ip }
78
- </ div >
79
- < div >
80
- < strong > Agent</ strong > { log . user_agent }
81
- </ div >
82
- </ Stack >
83
- </ Stack >
84
- </ Stack >
141
+ auditLogs . map ( ( auditLog ) => (
142
+ < TableRow key = { auditLog . id } hover >
143
+ < TableCell className = { styles . auditLogCell } >
144
+ < AuditLogRow auditLog = { auditLog } />
85
145
</ TableCell >
86
146
</ TableRow >
87
147
) )
@@ -96,6 +156,19 @@ export const AuditPageView: FC<{ auditLogs?: AuditLog[] }> = ({ auditLogs }) =>
96
156
}
97
157
98
158
const useStyles = makeStyles ( ( theme ) => ( {
159
+ auditLogCell : {
160
+ padding : "0 !important" ,
161
+ } ,
162
+
163
+ auditLogRow : {
164
+ padding : theme . spacing ( 2 , 4 ) ,
165
+ cursor : "pointer" ,
166
+ } ,
167
+
168
+ auditLogRowInfo : {
169
+ flex : 1 ,
170
+ } ,
171
+
99
172
auditLogResume : {
100
173
...theme . typography . body1 ,
101
174
fontFamily : "inherit" ,
@@ -114,4 +187,48 @@ const useStyles = makeStyles((theme) => ({
114
187
fontFamily : "inherit" ,
115
188
color : theme . palette . text . secondary ,
116
189
} ,
190
+
191
+ diff : {
192
+ display : "flex" ,
193
+ alignItems : "flex-start" ,
194
+ fontSize : theme . typography . body2 . fontSize ,
195
+ borderTop : `1px solid ${ theme . palette . divider } ` ,
196
+ } ,
197
+
198
+ diffOld : {
199
+ backgroundColor : theme . palette . error . dark ,
200
+ color : theme . palette . error . contrastText ,
201
+ flex : 1 ,
202
+ paddingTop : theme . spacing ( 1 ) ,
203
+ paddingBottom : theme . spacing ( 1 ) ,
204
+ } ,
205
+
206
+ diffRow : {
207
+ display : "flex" ,
208
+ alignItems : "baseline" ,
209
+ } ,
210
+
211
+ diffLine : {
212
+ opacity : 0.5 ,
213
+ padding : theme . spacing ( 1 ) ,
214
+ width : theme . spacing ( 8 ) ,
215
+ textAlign : "right" ,
216
+ } ,
217
+
218
+ diffIcon : {
219
+ padding : theme . spacing ( 1 ) ,
220
+ width : theme . spacing ( 4 ) ,
221
+ textAlign : "center" ,
222
+ fontSize : theme . typography . body1 . fontSize ,
223
+ } ,
224
+
225
+ diffContent : { } ,
226
+
227
+ diffNew : {
228
+ backgroundColor : theme . palette . success . dark ,
229
+ color : theme . palette . success . contrastText ,
230
+ flex : 1 ,
231
+ paddingTop : theme . spacing ( 1 ) ,
232
+ paddingBottom : theme . spacing ( 1 ) ,
233
+ } ,
117
234
} ) )
0 commit comments