@@ -2,9 +2,10 @@ import { Badge, CircularProgress, Dialog, DialogContent, DialogTitle, Divider, I
2
2
import Button from '@mui/material/Button' ;
3
3
import { Card , CardActions , CardContent , CardMedia , Typography } from "@mui/material" ;
4
4
import { Ref } from "../Refs" ;
5
- import { useState } from "react" ;
5
+ import { useEffect , useState } from "react" ;
6
6
import { trackEvent } from "../Usage" ;
7
- import { Article , AttachFile , Build , CheckBox , LockRounded } from "@mui/icons-material" ;
7
+ import { Article , AttachFile , Build , CheckBox , Delete , LockReset , LockRounded , Save } from "@mui/icons-material" ;
8
+ import Secrets from "../Secrets" ;
8
9
9
10
const iconSize = 16
10
11
@@ -22,10 +23,20 @@ export interface CatalogItemWithName extends CatalogItem {
22
23
name : string ;
23
24
}
24
25
25
- export function CatalogItemCard ( { openUrl, item, canRegister, registered, register, unregister } : { openUrl : ( ) => void , item : CatalogItemWithName , canRegister : boolean , registered : boolean , register : ( item : CatalogItemWithName ) => Promise < void > , unregister : ( item : CatalogItemWithName ) => Promise < void > } ) {
26
+ export function CatalogItemCard ( { openUrl, item, canRegister, registered, register, unregister, onSecretChange, secrets } : { openUrl : ( ) => void , item : CatalogItemWithName , canRegister : boolean , registered : boolean , register : ( item : CatalogItemWithName ) => Promise < void > , unregister : ( item : CatalogItemWithName ) => Promise < void > , onSecretChange : ( secret : { name : string , value : string } ) => void , secrets : Secrets . Secret [ ] } ) {
27
+ const loadAssignedSecrets = ( ) => {
28
+ const assignedSecrets = Secrets . getAssignedSecrets ( item , secrets ) ;
29
+ setAssignedSecrets ( assignedSecrets )
30
+ }
26
31
const [ isRegistering , setIsRegistering ] = useState ( false )
27
32
const [ showSecretDialog , setShowSecretDialog ] = useState ( false )
28
- const [ secrets , setSecrets ] = useState < { name : string , value : string } [ ] > ( item . secrets ?. map ( secret => ( { name : secret . name , value : '' } ) ) || [ ] )
33
+ const [ assignedSecrets , setAssignedSecrets ] = useState < { name : string , assigned : boolean } [ ] > ( [ ] )
34
+ const [ changedSecrets , setChangedSecrets ] = useState < { [ key : string ] : string | undefined } > ( { } )
35
+
36
+ useEffect ( ( ) => {
37
+ loadAssignedSecrets ( )
38
+ } , [ secrets ] )
39
+
29
40
return (
30
41
< >
31
42
< Dialog open = { showSecretDialog } onClose = { ( ) => setShowSecretDialog ( false ) } >
@@ -36,8 +47,16 @@ export function CatalogItemCard({ openUrl, item, canRegister, registered, regist
36
47
</ DialogTitle >
37
48
< DialogContent >
38
49
< Stack direction = "column" spacing = { 2 } >
39
- { item . secrets ?. map ( secret => (
40
- < TextField type = "password" key = { secret . name } label = { secret . name } value = { secrets . find ( s => s . name === secret . name ) ?. value || '' } onChange = { ( event ) => setSecrets ( secrets . map ( s => s . name === secret . name ? { ...s , value : event . target . value } : s ) ) } />
50
+ { assignedSecrets ?. map ( secret => (
51
+ < Stack key = { secret . name } direction = "row" spacing = { 2 } alignItems = "center" >
52
+ < TextField placeholder = { assignedSecrets . find ( s => s . name === secret . name ) ?. assigned ? '********' : 'Enter secret value' } type = "password" key = { secret . name } label = { secret . name } value = { changedSecrets [ secret . name ] || '' } onChange = { ( event ) => setChangedSecrets ( { ...changedSecrets , [ secret . name ] : event . target . value } ) } />
53
+ { assignedSecrets . find ( s => s . name === secret . name ) ?. assigned && changedSecrets [ secret . name ] && < IconButton onClick = { ( ) => setChangedSecrets ( { ...changedSecrets , [ secret . name ] : undefined } ) } >
54
+ < LockReset />
55
+ </ IconButton > }
56
+ { changedSecrets [ secret . name ] && < IconButton onClick = { ( ) => onSecretChange ( { name : secret . name , value : changedSecrets [ secret . name ] || '' } ) } >
57
+ < Save />
58
+ </ IconButton > }
59
+ </ Stack >
41
60
) ) }
42
61
</ Stack >
43
62
</ DialogContent >
@@ -97,7 +116,7 @@ export function CatalogItemCard({ openUrl, item, canRegister, registered, regist
97
116
</ Stack >
98
117
} >
99
118
< IconButton onClick = { ( ) => setShowSecretDialog ( ! showSecretDialog ) } >
100
- < Badge badgeContent = { item . secrets ?. length || "0" } color = " warning" >
119
+ < Badge badgeContent = { item . secrets ?. length || "0" } color = { assignedSecrets ?. every ( s => s . assigned ) ? 'success' : ' warning' } >
101
120
< LockRounded sx = { { fontSize : iconSize } } />
102
121
</ Badge >
103
122
</ IconButton >
0 commit comments