1
+ import cx from 'classnames'
1
2
import * as React from 'react'
2
3
import * as M from '@material-ui/core'
3
4
import * as Lab from '@material-ui/lab'
5
+ import * as Icons from '@material-ui/icons'
4
6
5
7
import assertNever from 'utils/assertNever'
6
8
import JsonDisplay from 'components/JsonDisplay'
@@ -15,6 +17,82 @@ import type { Revision, RevisionResult } from '../useRevision'
15
17
import Change from './Diff'
16
18
import type { Dir , Side } from './Diff'
17
19
20
+ const useIntroducedStyles = M . makeStyles ( ( t ) => ( {
21
+ root : {
22
+ ...t . typography . body2 ,
23
+ } ,
24
+ cell : {
25
+ padding : t . spacing ( 1.5 , 1 ) ,
26
+ } ,
27
+ } ) )
28
+
29
+ interface IntroducedProps {
30
+ className : string
31
+ dir : Dir
32
+ logicalKey : string
33
+ }
34
+
35
+ function Introduced ( { className, dir, logicalKey } : IntroducedProps ) {
36
+ const classes = useIntroducedStyles ( )
37
+ return (
38
+ < GridRow className = { cx ( classes . root , className ) } >
39
+ < div className = { classes . cell } >
40
+ < Change dir = { dir } side = "left" >
41
+ { logicalKey }
42
+ </ Change >
43
+ </ div >
44
+ < div className = { classes . cell } >
45
+ < Change dir = { dir } side = "right" >
46
+ { logicalKey }
47
+ </ Change >
48
+ </ div >
49
+ </ GridRow >
50
+ )
51
+ }
52
+
53
+ const useUnmodifiedStyles = M . makeStyles ( ( t ) => ( {
54
+ root : {
55
+ ...t . typography . body2 ,
56
+ color : t . palette . text . secondary ,
57
+ padding : t . spacing ( 1.5 , 1 ) ,
58
+ } ,
59
+ label : {
60
+ paddingLeft : t . spacing ( 1 ) ,
61
+ } ,
62
+ } ) )
63
+
64
+ interface UnmodifiedProps {
65
+ className : string
66
+ logicalKey : string
67
+ }
68
+
69
+ function Unmodified ( { className, logicalKey } : UnmodifiedProps ) {
70
+ const classes = useUnmodifiedStyles ( )
71
+ return (
72
+ < GridRow className = { cx ( classes . root , className ) } >
73
+ < span > { logicalKey } </ span >
74
+ < i className = { classes . label } > Unmodified</ i >
75
+ </ GridRow >
76
+ )
77
+ }
78
+
79
+ const useGridRowStyles = M . makeStyles ( {
80
+ root : {
81
+ display : 'grid' ,
82
+ gridTemplateColumns : '1fr 1fr' ,
83
+ } ,
84
+ } )
85
+
86
+ interface GridRowProps {
87
+ className ?: string
88
+ children : React . ReactNode
89
+ }
90
+
91
+ function GridRow ( { className, children } : GridRowProps ) {
92
+ const classes = useGridRowStyles ( )
93
+ return < div className = { cx ( className , classes . root ) } > { children } </ div >
94
+ }
95
+
18
96
type Changes =
19
97
| { _tag : 'unmodified' ; logicalKey : string }
20
98
| { _tag : 'introduced' ; logicalKey : string ; entry : Model . PackageEntry ; dir : Dir }
@@ -29,82 +107,75 @@ const useEntrySideStyles = M.makeStyles((t) => ({
29
107
root : {
30
108
overflow : 'hidden' ,
31
109
padding : t . spacing ( 1 ) ,
32
- borderLeft : `1px solid ${ t . palette . divider } ` ,
33
- borderRight : `1px solid ${ t . palette . divider } ` ,
34
110
} ,
35
111
hash : {
36
112
fontFamily : t . typography . monospace . fontFamily ,
37
113
} ,
38
- hideOverflow : {
114
+ property : {
115
+ whiteSpace : 'nowrap' ,
116
+ display : 'flex' ,
117
+ alignItems : 'center' ,
118
+ marginTop : t . spacing ( 1 ) ,
119
+ } ,
120
+ value : {
39
121
overflow : 'hidden' ,
40
122
textOverflow : 'ellipsis' ,
41
- whiteSpace : 'nowrap' ,
123
+ } ,
124
+ icon : {
125
+ color : t . palette . text . secondary ,
126
+ marginRight : t . spacing ( 1 ) ,
42
127
} ,
43
128
} ) )
44
129
45
130
interface EntrySideProps {
131
+ className ?: string
46
132
logicalKey : string
47
133
side : Side
48
- changes : Partial < Model . PackageEntry > | 'introduced' | 'unmodified'
134
+ changes : Partial < Model . PackageEntry >
49
135
dir : Dir
50
136
}
51
137
52
- function EntrySide ( { changes, logicalKey, dir, side } : EntrySideProps ) {
138
+ function EntrySide ( { className , changes, logicalKey, dir, side } : EntrySideProps ) {
53
139
const classes = useEntrySideStyles ( )
54
- if ( changes === 'introduced' ) {
55
- return (
56
- < M . Typography className = { classes . root } variant = "subtitle2" color = "textSecondary" >
57
- < Change dir = { dir } side = { side } >
58
- { logicalKey }
59
- </ Change >
60
- </ M . Typography >
61
- )
62
- }
63
- if ( changes === 'unmodified' ) {
64
- return (
65
- < M . Typography className = { classes . root } variant = "subtitle2" color = "textSecondary" >
66
- { logicalKey }
67
- </ M . Typography >
68
- )
69
- }
70
140
return (
71
- < div className = { classes . root } >
141
+ < div className = { cx ( classes . root , className ) } >
72
142
< M . Typography variant = "subtitle2" color = "textSecondary" >
73
143
{ logicalKey }
74
144
</ M . Typography >
75
145
76
146
{ changes . physicalKey && (
77
- < M . Typography className = { classes . hideOverflow } >
78
- < M . Typography variant = "body2" component = "span" >
79
- < b > URL</ b > :{ ' ' }
80
- </ M . Typography >
81
- < Change dir = { dir } side = { side } >
147
+ < M . Typography className = { classes . property } >
148
+ < Icons . LinkOutlined className = { classes . icon } fontSize = "small" />
149
+ < Change dir = { dir } side = { side } className = { classes . value } >
82
150
< PhysicalKey url = { changes . physicalKey } />
83
151
</ Change >
84
152
</ M . Typography >
85
153
) }
86
154
87
155
{ changes . hash && (
88
- < M . Typography className = { classes . hideOverflow } >
89
- < M . Typography variant = "body2" component = "span" >
90
- < b > Hash</ b > :{ ' ' }
91
- </ M . Typography >
92
- < Change dir = { dir } side = { side } className = { classes . hash } >
156
+ < M . Typography className = { classes . property } >
157
+ < Icons . LockOutlined className = { classes . icon } fontSize = "small" />
158
+ < Change dir = { dir } side = { side } className = { cx ( classes . hash , classes . value ) } >
93
159
{ changes . hash . value }
94
160
</ Change >
95
161
</ M . Typography >
96
162
) }
97
163
98
164
{ changes . size && (
99
- < M . Typography variant = "body2" className = { classes . hideOverflow } >
100
- < b > Size </ b > : { ' ' }
101
- < Change dir = { dir } side = { side } >
165
+ < M . Typography variant = "body2" className = { classes . property } >
166
+ < Icons . InsertDriveFileOutlined className = { classes . icon } fontSize = "small" />
167
+ < Change dir = { dir } side = { side } className = { classes . value } >
102
168
{ readableBytes ( changes . size ) }
103
169
</ Change >
104
170
</ M . Typography >
105
171
) }
106
172
107
- { changes . meta && < JsonDisplay value = { changes . meta } /> }
173
+ { changes . meta && (
174
+ < div className = { classes . property } >
175
+ < Icons . Code className = { classes . icon } fontSize = "small" />
176
+ < JsonDisplay value = { changes . meta } />
177
+ </ div >
178
+ ) }
108
179
</ div >
109
180
)
110
181
}
@@ -168,11 +239,7 @@ function useChanges(
168
239
}
169
240
170
241
const useStyles = M . makeStyles ( ( t ) => ( {
171
- table : { } ,
172
242
entryRow : {
173
- display : 'grid' ,
174
- gridTemplateColumns : '1fr 1fr' ,
175
- borderTop : `1px solid ${ t . palette . divider } ` ,
176
243
borderBottom : `1px solid ${ t . palette . divider } ` ,
177
244
} ,
178
245
hash : {
@@ -181,57 +248,54 @@ const useStyles = M.makeStyles((t) => ({
181
248
colorInherit : {
182
249
color : 'inherit' ,
183
250
} ,
184
- entryCell : {
251
+ head : {
185
252
overflow : 'hidden' ,
186
253
padding : t . spacing ( 1 ) ,
187
- border : `1px solid ${ t . palette . divider } ` ,
254
+ background : t . palette . background . default ,
255
+ '& + &' : {
256
+ borderLeft : `1px solid ${ t . palette . divider } ` ,
257
+ } ,
258
+ } ,
259
+ side : {
260
+ borderLeft : `1px solid ${ t . palette . divider } ` ,
188
261
} ,
189
262
} ) )
190
263
191
264
interface EntriesRowProps {
265
+ className : string
192
266
logicalKey : string
193
267
left ?: Model . PackageEntry
194
268
right ?: Model . PackageEntry
195
269
dir : Dir
196
270
}
197
271
198
- function EntriesRow ( { dir, logicalKey, left, right } : EntriesRowProps ) {
272
+ function EntriesRow ( { className , dir, logicalKey, left, right } : EntriesRowProps ) {
199
273
const classes = useStyles ( )
200
274
201
275
const changes = useChanges ( dir , logicalKey , left , right )
202
276
203
277
switch ( changes . _tag ) {
204
278
case 'unmodified' :
205
- return (
206
- < div className = { classes . entryRow } >
207
- < M . Typography variant = "subtitle2" color = "textSecondary" >
208
- < M . Box p = { 1 } > { logicalKey } </ M . Box >
209
- </ M . Typography >
210
- < M . Typography variant = "subtitle2" color = "textSecondary" component = "i" >
211
- Unmodified
212
- </ M . Typography >
213
- </ div >
214
- )
279
+ return < Unmodified className = { className } logicalKey = { logicalKey } />
215
280
case 'introduced' :
216
- return (
217
- < EntrySide logicalKey = { logicalKey } side = "left" dir = { dir } changes = "introduced" />
218
- )
281
+ return < Introduced className = { className } dir = { dir } logicalKey = { logicalKey } />
219
282
case 'modified' :
220
283
return (
221
- < div className = { classes . entryRow } >
284
+ < GridRow className = { className } >
222
285
< EntrySide
223
286
logicalKey = { logicalKey }
224
287
side = "left"
225
288
dir = { dir }
226
289
changes = { changes . left }
227
290
/>
228
291
< EntrySide
292
+ className = { classes . side }
229
293
logicalKey = { logicalKey }
230
294
side = "right"
231
295
dir = { dir }
232
296
changes = { changes . right }
233
297
/>
234
- </ div >
298
+ </ GridRow >
235
299
)
236
300
default :
237
301
assertNever ( changes )
@@ -272,13 +336,14 @@ function EntriesDiff({ left, right }: EntriesDiffProps) {
272
336
}
273
337
274
338
return (
275
- < div className = { classes . table } >
276
- < div className = { classes . entryRow } >
277
- < div className = { classes . entryCell } > { left . hash } </ div >
278
- < div className = { classes . entryCell } > { right . hash } </ div >
279
- </ div >
339
+ < div >
340
+ < GridRow className = { classes . entryRow } >
341
+ < div className = { classes . head } > { left . hash } </ div >
342
+ < div className = { classes . head } > { right . hash } </ div >
343
+ </ GridRow >
280
344
{ entries . keys . map ( ( logicalKey ) => (
281
345
< EntriesRow
346
+ className = { classes . entryRow }
282
347
key = { logicalKey }
283
348
logicalKey = { logicalKey }
284
349
left = { entries . left [ logicalKey ] }
0 commit comments