1
1
import { makeStyles } from "@material-ui/core/styles"
2
2
import { Skeleton } from "@material-ui/lab"
3
3
import { PortForwardButton } from "components/PortForwardButton/PortForwardButton"
4
- import { FC } from "react"
4
+ import { FC , useState } from "react"
5
5
import { Workspace , WorkspaceResource } from "../../api/typesGenerated"
6
6
import { AppLink } from "../AppLink/AppLink"
7
7
import { SSHButton } from "../SSHButton/SSHButton"
@@ -11,6 +11,13 @@ import { ResourceAvatar } from "./ResourceAvatar"
11
11
import { SensitiveValue } from "./SensitiveValue"
12
12
import { AgentLatency } from "./AgentLatency"
13
13
import { AgentVersion } from "./AgentVersion"
14
+ import {
15
+ OpenDropdown ,
16
+ CloseDropdown ,
17
+ } from "components/DropdownArrows/DropdownArrows"
18
+ import IconButton from "@material-ui/core/IconButton"
19
+ import Tooltip from "@material-ui/core/Tooltip"
20
+ import { Maybe } from "components/Conditionals/Maybe"
14
21
15
22
export interface ResourceCardProps {
16
23
resource : WorkspaceResource
@@ -29,43 +36,76 @@ export const ResourceCard: FC<ResourceCardProps> = ({
29
36
hideSSHButton,
30
37
serverVersion,
31
38
} ) => {
39
+ const [ shouldDisplayAllMetadata , setShouldDisplayAllMetadata ] =
40
+ useState ( false )
32
41
const styles = useStyles ( )
33
-
34
42
const metadataToDisplay =
43
+ // Type is already displayed in the header
35
44
resource . metadata ?. filter ( ( data ) => data . key !== "type" ) ?? [ ]
45
+ const visibleMetadata = shouldDisplayAllMetadata
46
+ ? metadataToDisplay
47
+ : metadataToDisplay . slice ( 0 , 4 )
36
48
37
49
return (
38
50
< div key = { resource . id } className = { styles . resourceCard } >
39
51
< Stack
40
52
direction = "row"
41
- alignItems = "center "
53
+ alignItems = "flex-start "
42
54
className = { styles . resourceCardHeader }
55
+ spacing = { 10 }
43
56
>
44
- < div >
45
- < ResourceAvatar resource = { resource } />
46
- </ div >
47
- < div className = { styles . resourceHeader } >
48
- < div className = { styles . resourceHeaderLabel } > { resource . type } </ div >
49
- < div > { resource . name } </ div >
50
- </ div >
51
- </ Stack >
57
+ < Stack
58
+ direction = "row"
59
+ alignItems = "center"
60
+ className = { styles . resourceCardProfile }
61
+ >
62
+ < div >
63
+ < ResourceAvatar resource = { resource } />
64
+ </ div >
65
+ < div className = { styles . metadata } >
66
+ < div className = { styles . metadataLabel } > { resource . type } </ div >
67
+ < div className = { styles . metadataValue } > { resource . name } </ div >
68
+ </ div >
69
+ </ Stack >
52
70
53
- < Stack
54
- direction = "row"
55
- alignItems = "baseline"
56
- wrap = "wrap"
57
- className = { styles . resourceMetadata }
58
- >
59
- { metadataToDisplay . map ( ( data ) => (
60
- < div key = { data . key } className = { styles . resourceData } >
61
- < span className = { styles . resourceDataLabel } > { data . key } :</ span >
62
- { data . sensitive ? (
63
- < SensitiveValue value = { data . value } />
64
- ) : (
65
- < span > { data . value } </ span >
66
- ) }
71
+ < Stack alignItems = "flex-start" direction = "row" spacing = { 5 } >
72
+ < div className = { styles . metadataHeader } >
73
+ { visibleMetadata . map ( ( meta ) => {
74
+ return (
75
+ < div className = { styles . metadata } key = { meta . key } >
76
+ < div className = { styles . metadataLabel } > { meta . key } </ div >
77
+ < div className = { styles . metadataValue } >
78
+ { meta . sensitive ? (
79
+ < SensitiveValue value = { meta . value } />
80
+ ) : (
81
+ meta . value
82
+ ) }
83
+ </ div >
84
+ </ div >
85
+ )
86
+ } ) }
67
87
</ div >
68
- ) ) }
88
+
89
+ < Maybe condition = { metadataToDisplay . length > 4 } >
90
+ < Tooltip
91
+ title = {
92
+ shouldDisplayAllMetadata ? "Hide metadata" : "Show all metadata"
93
+ }
94
+ >
95
+ < IconButton
96
+ onClick = { ( ) => {
97
+ setShouldDisplayAllMetadata ( ( value ) => ! value )
98
+ } }
99
+ >
100
+ { shouldDisplayAllMetadata ? (
101
+ < CloseDropdown margin = { false } />
102
+ ) : (
103
+ < OpenDropdown margin = { false } />
104
+ ) }
105
+ </ IconButton >
106
+ </ Tooltip >
107
+ </ Maybe >
108
+ </ Stack >
69
109
</ Stack >
70
110
71
111
< div >
@@ -132,14 +172,15 @@ export const ResourceCard: FC<ResourceCardProps> = ({
132
172
workspaceName = { workspace . name }
133
173
agentName = { agent . name }
134
174
health = { app . health }
175
+ appSharingLevel = { app . sharing_level }
135
176
/>
136
177
) ) }
137
178
</ >
138
179
) }
139
180
{ showApps && agent . status === "connecting" && (
140
181
< >
141
- < Skeleton width = { 80 } height = { 60 } />
142
- < Skeleton width = { 120 } height = { 60 } />
182
+ < Skeleton width = { 80 } height = { 36 } variant = "rect" />
183
+ < Skeleton width = { 120 } height = { 36 } variant = "rect" />
143
184
</ >
144
185
) }
145
186
</ Stack >
@@ -158,35 +199,40 @@ const useStyles = makeStyles((theme) => ({
158
199
border : `1px solid ${ theme . palette . divider } ` ,
159
200
} ,
160
201
202
+ resourceCardProfile : {
203
+ flexShrink : 0 ,
204
+ width : "fit-content" ,
205
+ } ,
206
+
161
207
resourceCardHeader : {
162
208
padding : theme . spacing ( 3 , 4 ) ,
163
209
borderBottom : `1px solid ${ theme . palette . divider } ` ,
164
210
} ,
165
211
166
- resourceMetadata : {
167
- padding : theme . spacing ( 2 , 4 ) ,
168
- borderBottom : `1px solid ${ theme . palette . divider } ` ,
169
- gap : theme . spacing ( 0.5 , 2 ) ,
212
+ metadataHeader : {
213
+ display : "grid" ,
214
+ gridTemplateColumns : "repeat(4, minmax(0, 1fr))" ,
215
+ gap : theme . spacing ( 5 ) ,
216
+ rowGap : theme . spacing ( 3 ) ,
170
217
} ,
171
218
172
- resourceHeader : {
219
+ metadata : {
173
220
fontSize : 16 ,
174
221
} ,
175
222
176
- resourceHeaderLabel : {
223
+ metadataLabel : {
177
224
fontSize : 12 ,
178
225
color : theme . palette . text . secondary ,
226
+ textOverflow : "ellipsis" ,
227
+ overflow : "hidden" ,
228
+ whiteSpace : "nowrap" ,
179
229
} ,
180
230
181
- resourceData : {
182
- fontSize : 12 ,
183
- flexShrink : 0 ,
184
- } ,
185
-
186
- resourceDataLabel : {
187
- fontSize : 12 ,
188
- color : theme . palette . text . secondary ,
189
- marginRight : theme . spacing ( 0.75 ) ,
231
+ metadataValue : {
232
+ textOverflow : "ellipsis" ,
233
+ overflow : "hidden" ,
234
+ whiteSpace : "nowrap" ,
235
+ userSelect : "all" ,
190
236
} ,
191
237
192
238
agentRow : {
0 commit comments