@@ -2,9 +2,10 @@ import { Badge, CircularProgress, Dialog, DialogContent, DialogTitle, Divider, I
22import Button from '@mui/material/Button' ;
33import { Card , CardActions , CardContent , CardMedia , Typography } from "@mui/material" ;
44import { Ref } from "../Refs" ;
5- import { useState } from "react" ;
5+ import { useEffect , useState } from "react" ;
66import { 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" ;
89
910const iconSize = 16
1011
@@ -22,10 +23,20 @@ export interface CatalogItemWithName extends CatalogItem {
2223 name : string ;
2324}
2425
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+ }
2631 const [ isRegistering , setIsRegistering ] = useState ( false )
2732 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+
2940 return (
3041 < >
3142 < Dialog open = { showSecretDialog } onClose = { ( ) => setShowSecretDialog ( false ) } >
@@ -36,8 +47,16 @@ export function CatalogItemCard({ openUrl, item, canRegister, registered, regist
3647 </ DialogTitle >
3748 < DialogContent >
3849 < 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 >
4160 ) ) }
4261 </ Stack >
4362 </ DialogContent >
@@ -97,7 +116,7 @@ export function CatalogItemCard({ openUrl, item, canRegister, registered, regist
97116 </ Stack >
98117 } >
99118 < 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' } >
101120 < LockRounded sx = { { fontSize : iconSize } } />
102121 </ Badge >
103122 </ IconButton >
0 commit comments