1
1
import { type Interpolation , type Theme , useTheme } from "@emotion/react" ;
2
- import Business from "@mui/icons-material/Business" ;
3
- import Person from "@mui/icons-material/Person" ;
2
+ import BusinessIcon from "@mui/icons-material/Business" ;
3
+ import PersonIcon from "@mui/icons-material/Person" ;
4
+ import TagIcon from "@mui/icons-material/Sell" ;
4
5
import Button from "@mui/material/Button" ;
5
6
import Link from "@mui/material/Link" ;
6
7
import Tooltip from "@mui/material/Tooltip" ;
@@ -21,6 +22,7 @@ import {
21
22
} from "components/Popover/Popover" ;
22
23
import { Stack } from "components/Stack/Stack" ;
23
24
import { StatusIndicator } from "components/StatusIndicator/StatusIndicator" ;
25
+ import isEqual from "lodash/isEqual" ;
24
26
import { type FC , useState } from "react" ;
25
27
import { createDayString } from "utils/createDayString" ;
26
28
import { docs } from "utils/docs" ;
@@ -30,14 +32,16 @@ type ProvisionerGroupType = "builtin" | "psk" | "key";
30
32
31
33
interface ProvisionerGroupProps {
32
34
readonly buildInfo ?: BuildInfoResponse ;
33
- readonly keyName ?: string ;
35
+ readonly keyName : string ;
36
+ readonly keyTags : Record < string , string > ;
34
37
readonly type : ProvisionerGroupType ;
35
38
readonly provisioners : readonly ProvisionerDaemon [ ] ;
36
39
}
37
40
38
41
export const ProvisionerGroup : FC < ProvisionerGroupProps > = ( {
39
42
buildInfo,
40
43
keyName,
44
+ keyTags,
41
45
type,
42
46
provisioners,
43
47
} ) => {
@@ -61,7 +65,7 @@ export const ProvisionerGroup: FC<ProvisionerGroupProps> = ({
61
65
provisioners . length === 1
62
66
? "1 provisioner"
63
67
: `${ provisioners . length } provisioners` ;
64
- const extraTags = Object . entries ( firstProvisioner . tags ) . filter (
68
+ const extraTags = Object . entries ( keyTags ) . filter (
65
69
( [ key ] ) => key !== "scope" && key !== "owner" ,
66
70
) ;
67
71
@@ -90,6 +94,10 @@ export const ProvisionerGroup: FC<ProvisionerGroupProps> = ({
90
94
? "1 provisioner"
91
95
: `${ provisionersWithWarnings } provisioners` ;
92
96
97
+ const hasMultipleTagVariants =
98
+ type === "psk" &&
99
+ provisioners . some ( ( it ) => ! isEqual ( it . tags , { scope : "organization" } ) ) ;
100
+
93
101
return (
94
102
< div
95
103
css = { [
@@ -153,14 +161,26 @@ export const ProvisionerGroup: FC<ProvisionerGroupProps> = ({
153
161
justifyContent : "right" ,
154
162
} }
155
163
>
156
- < Tooltip title = "Scope" >
157
- < Pill
158
- size = "lg"
159
- icon = { daemonScope === "organization" ? < Business /> : < Person /> }
160
- >
161
- < span css = { { textTransform : "capitalize" } } > { daemonScope } </ span >
164
+ { ! hasMultipleTagVariants ? (
165
+ < Tooltip title = "Scope" >
166
+ < Pill
167
+ size = "lg"
168
+ icon = {
169
+ daemonScope === "organization" ? (
170
+ < BusinessIcon />
171
+ ) : (
172
+ < PersonIcon />
173
+ )
174
+ }
175
+ >
176
+ < span css = { { textTransform : "capitalize" } } > { daemonScope } </ span >
177
+ </ Pill >
178
+ </ Tooltip >
179
+ ) : (
180
+ < Pill size = "lg" icon = { < TagIcon /> } >
181
+ Multiple tags
162
182
</ Pill >
163
- </ Tooltip >
183
+ ) }
164
184
{ type === "key" &&
165
185
extraTags . map ( ( [ key , value ] ) => (
166
186
< ProvisionerTag key = { key } tagName = { key } tagValue = { value } />
@@ -172,9 +192,9 @@ export const ProvisionerGroup: FC<ProvisionerGroupProps> = ({
172
192
< div
173
193
css = { {
174
194
padding : "0 24px 24px" ,
175
- display : "flex " ,
195
+ display : "grid " ,
176
196
gap : 12 ,
177
- flexWrap : "wrap " ,
197
+ gridTemplateColumns : "repeat(auto-fill, minmax(385px, 1fr)) " ,
178
198
} }
179
199
>
180
200
{ provisionersWithWarningInfo . map ( ( provisioner ) => (
@@ -186,7 +206,6 @@ export const ProvisionerGroup: FC<ProvisionerGroupProps> = ({
186
206
border : `1px solid ${ theme . palette . divider } ` ,
187
207
fontSize : 14 ,
188
208
padding : "14px 18px" ,
189
- width : 375 ,
190
209
} ,
191
210
provisioner . warningCount > 0 && styles . warningBorder ,
192
211
] }
@@ -222,7 +241,7 @@ export const ProvisionerGroup: FC<ProvisionerGroupProps> = ({
222
241
) }
223
242
</ span >
224
243
</ div >
225
- { type === "psk" && (
244
+ { hasMultipleTagVariants && (
226
245
< PskProvisionerTags tags = { provisioner . tags } />
227
246
) }
228
247
</ Stack >
@@ -317,7 +336,8 @@ interface PskProvisionerTagsProps {
317
336
318
337
const PskProvisionerTags : FC < PskProvisionerTagsProps > = ( { tags } ) => {
319
338
const daemonScope = tags . scope || "organization" ;
320
- const iconScope = daemonScope === "organization" ? < Business /> : < Person /> ;
339
+ const iconScope =
340
+ daemonScope === "organization" ? < BusinessIcon /> : < PersonIcon /> ;
321
341
322
342
const extraTags = Object . entries ( tags ) . filter (
323
343
( [ tag ] ) => tag !== "scope" && tag !== "owner" ,
@@ -343,6 +363,7 @@ const PskProvisionerTags: FC<PskProvisionerTagsProps> = ({ tags }) => {
343
363
css = { {
344
364
"& .MuiPaper-root" : {
345
365
padding : 20 ,
366
+ minWidth : "unset" ,
346
367
maxWidth : 340 ,
347
368
width : "fit-content" ,
348
369
} ,
0 commit comments