Skip to content

Commit 19fefa0

Browse files
committed
cleaner UI, show added/removed files and unmodified
1 parent 4fd2509 commit 19fefa0

File tree

3 files changed

+157
-82
lines changed

3 files changed

+157
-82
lines changed

catalog/app/containers/Bucket/PackageCompare/Diff/Diff.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const useStyles = M.makeStyles((t) => ({
1717
backgroundColor: M.fade(t.palette.success.light, 0.3),
1818
},
1919
removed: {
20+
textDecoration: 'line-through',
2021
backgroundColor: M.fade(t.palette.error.light, 0.3),
2122
},
2223
}))

catalog/app/containers/Bucket/PackageCompare/Diff/Entries.tsx

Lines changed: 129 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import cx from 'classnames'
12
import * as React from 'react'
23
import * as M from '@material-ui/core'
34
import * as Lab from '@material-ui/lab'
5+
import * as Icons from '@material-ui/icons'
46

57
import assertNever from 'utils/assertNever'
68
import JsonDisplay from 'components/JsonDisplay'
@@ -15,6 +17,82 @@ import type { Revision, RevisionResult } from '../useRevision'
1517
import Change from './Diff'
1618
import type { Dir, Side } from './Diff'
1719

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+
1896
type Changes =
1997
| { _tag: 'unmodified'; logicalKey: string }
2098
| { _tag: 'introduced'; logicalKey: string; entry: Model.PackageEntry; dir: Dir }
@@ -29,82 +107,75 @@ const useEntrySideStyles = M.makeStyles((t) => ({
29107
root: {
30108
overflow: 'hidden',
31109
padding: t.spacing(1),
32-
borderLeft: `1px solid ${t.palette.divider}`,
33-
borderRight: `1px solid ${t.palette.divider}`,
34110
},
35111
hash: {
36112
fontFamily: t.typography.monospace.fontFamily,
37113
},
38-
hideOverflow: {
114+
property: {
115+
whiteSpace: 'nowrap',
116+
display: 'flex',
117+
alignItems: 'center',
118+
marginTop: t.spacing(1),
119+
},
120+
value: {
39121
overflow: 'hidden',
40122
textOverflow: 'ellipsis',
41-
whiteSpace: 'nowrap',
123+
},
124+
icon: {
125+
color: t.palette.text.secondary,
126+
marginRight: t.spacing(1),
42127
},
43128
}))
44129

45130
interface EntrySideProps {
131+
className?: string
46132
logicalKey: string
47133
side: Side
48-
changes: Partial<Model.PackageEntry> | 'introduced' | 'unmodified'
134+
changes: Partial<Model.PackageEntry>
49135
dir: Dir
50136
}
51137

52-
function EntrySide({ changes, logicalKey, dir, side }: EntrySideProps) {
138+
function EntrySide({ className, changes, logicalKey, dir, side }: EntrySideProps) {
53139
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-
}
70140
return (
71-
<div className={classes.root}>
141+
<div className={cx(classes.root, className)}>
72142
<M.Typography variant="subtitle2" color="textSecondary">
73143
{logicalKey}
74144
</M.Typography>
75145

76146
{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}>
82150
<PhysicalKey url={changes.physicalKey} />
83151
</Change>
84152
</M.Typography>
85153
)}
86154

87155
{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)}>
93159
{changes.hash.value}
94160
</Change>
95161
</M.Typography>
96162
)}
97163

98164
{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}>
102168
{readableBytes(changes.size)}
103169
</Change>
104170
</M.Typography>
105171
)}
106172

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+
)}
108179
</div>
109180
)
110181
}
@@ -168,11 +239,7 @@ function useChanges(
168239
}
169240

170241
const useStyles = M.makeStyles((t) => ({
171-
table: {},
172242
entryRow: {
173-
display: 'grid',
174-
gridTemplateColumns: '1fr 1fr',
175-
borderTop: `1px solid ${t.palette.divider}`,
176243
borderBottom: `1px solid ${t.palette.divider}`,
177244
},
178245
hash: {
@@ -181,57 +248,54 @@ const useStyles = M.makeStyles((t) => ({
181248
colorInherit: {
182249
color: 'inherit',
183250
},
184-
entryCell: {
251+
head: {
185252
overflow: 'hidden',
186253
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}`,
188261
},
189262
}))
190263

191264
interface EntriesRowProps {
265+
className: string
192266
logicalKey: string
193267
left?: Model.PackageEntry
194268
right?: Model.PackageEntry
195269
dir: Dir
196270
}
197271

198-
function EntriesRow({ dir, logicalKey, left, right }: EntriesRowProps) {
272+
function EntriesRow({ className, dir, logicalKey, left, right }: EntriesRowProps) {
199273
const classes = useStyles()
200274

201275
const changes = useChanges(dir, logicalKey, left, right)
202276

203277
switch (changes._tag) {
204278
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} />
215280
case 'introduced':
216-
return (
217-
<EntrySide logicalKey={logicalKey} side="left" dir={dir} changes="introduced" />
218-
)
281+
return <Introduced className={className} dir={dir} logicalKey={logicalKey} />
219282
case 'modified':
220283
return (
221-
<div className={classes.entryRow}>
284+
<GridRow className={className}>
222285
<EntrySide
223286
logicalKey={logicalKey}
224287
side="left"
225288
dir={dir}
226289
changes={changes.left}
227290
/>
228291
<EntrySide
292+
className={classes.side}
229293
logicalKey={logicalKey}
230294
side="right"
231295
dir={dir}
232296
changes={changes.right}
233297
/>
234-
</div>
298+
</GridRow>
235299
)
236300
default:
237301
assertNever(changes)
@@ -272,13 +336,14 @@ function EntriesDiff({ left, right }: EntriesDiffProps) {
272336
}
273337

274338
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>
280344
{entries.keys.map((logicalKey) => (
281345
<EntriesRow
346+
className={classes.entryRow}
282347
key={logicalKey}
283348
logicalKey={logicalKey}
284349
left={entries.left[logicalKey]}

catalog/app/containers/Bucket/PackageCompare/PackageCompare.tsx

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,12 @@ function Header({ left, right, onLeftChange, onRightChange, onSwap }: HeaderProp
4949
onChange={onLeftChange}
5050
temporaryRemoveNone
5151
/>
52-
<M.IconButton onClick={onSwap} size="small" className={classes.swap}>
52+
<M.IconButton
53+
onClick={onSwap}
54+
size="small"
55+
className={classes.swap}
56+
disabled={!right}
57+
>
5358
<M.Icon>compare_arrows</M.Icon>
5459
</M.IconButton>
5560
<RevisionsList
@@ -116,23 +121,27 @@ export function RevisionsCompare({
116121
/>
117122
</M.Paper>
118123

119-
<div className={classes.userMeta}>
120-
<M.Typography variant="subtitle1" gutterBottom>
121-
User metadata
122-
</M.Typography>
123-
<M.Paper square variant="outlined">
124-
<MetadataDiff left={leftRevisionResult} right={rightRevisionResult} />
125-
</M.Paper>
126-
</div>
127-
128-
<div className={classes.entries}>
129-
<M.Typography variant="subtitle1" gutterBottom>
130-
Entries
131-
</M.Typography>
132-
<M.Paper square variant="outlined">
133-
<EntriesDiff left={leftRevisionResult} right={rightRevisionResult} />
134-
</M.Paper>
135-
</div>
124+
{right?.hash && (
125+
<div className={classes.userMeta}>
126+
<M.Typography variant="subtitle1" gutterBottom>
127+
User metadata
128+
</M.Typography>
129+
<M.Paper square variant="outlined">
130+
<MetadataDiff left={leftRevisionResult} right={rightRevisionResult} />
131+
</M.Paper>
132+
</div>
133+
)}
134+
135+
{right?.hash && (
136+
<div className={classes.entries}>
137+
<M.Typography variant="subtitle1" gutterBottom>
138+
Entries
139+
</M.Typography>
140+
<M.Paper square variant="outlined">
141+
<EntriesDiff left={leftRevisionResult} right={rightRevisionResult} />
142+
</M.Paper>
143+
</div>
144+
)}
136145
</div>
137146
)
138147
}

0 commit comments

Comments
 (0)