11import { Grid , MenuItem } from '@mui/material'
22import PaperLayout from 'layouts/Paper'
33import { LandingHeader } from 'components/LandingHeader'
4- import { Redirect , RouteComponentProps } from 'react-router-dom'
4+ import { Redirect , RouteComponentProps , useHistory , useLocation } from 'react-router-dom'
55import {
66 CreateSealedSecretApiResponse ,
77 useCreateSealedSecretMutation ,
@@ -26,6 +26,7 @@ import { useSession } from 'providers/Session'
2626import { useTranslation } from 'react-i18next'
2727import { mapObjectToKeyValueArray , valueArrayToObject } from 'utils/helpers'
2828import { useAppSelector } from 'redux/hooks'
29+ import InformationBanner from 'components/InformationBanner'
2930import { useStyles } from './create-edit-secrets.styles'
3031import { createSealedSecretApiResponseSchema , secretTypes } from './create-edit-secrets.validator'
3132import { SecretTypeFields } from './SecretTypeFields'
@@ -85,14 +86,21 @@ export default function SecretCreateEditPage({
8586 const { t } = useTranslation ( )
8687 const { classes } = useStyles ( )
8788 const { sealedSecretsPEM } = useSession ( )
89+ const history = useHistory ( )
90+ const location = useLocation ( )
91+ const locationState = location ?. state as any
92+ const isCoderepository = locationState ?. coderepository
93+ const prefilled = locationState ?. prefilled || { }
8894
89- const [ create , { isLoading : isLoadingCreate , isSuccess : isSuccessCreate } ] = useCreateSealedSecretMutation ( )
95+ const [ create , { isLoading : isLoadingCreate , isSuccess : isSuccessCreate , data : dataCreate } ] =
96+ useCreateSealedSecretMutation ( )
9097 const [ update , { isLoading : isLoadingUpdate , isSuccess : isSuccessUpdate } ] = useEditSealedSecretMutation ( )
9198 const [ del , { isLoading : isLoadingDelete , isSuccess : isSuccessDelete } ] = useDeleteSealedSecretMutation ( )
9299 const { data, isLoading, isFetching, isError, refetch } = useGetSealedSecretQuery (
93100 { teamId, sealedSecretName } ,
94101 { skip : ! sealedSecretName } ,
95102 )
103+ const isImmutable = data ?. immutable || false
96104
97105 const isDirty = useAppSelector ( ( { global : { isDirty } } ) => isDirty )
98106 useEffect ( ( ) => {
@@ -109,10 +117,8 @@ export default function SecretCreateEditPage({
109117 }
110118
111119 const mergedDefaultValues = createSealedSecretApiResponseSchema . cast ( formData )
112-
113120 const methods = useForm < SealedSecretFormData > ( {
114- // @ts -ignore
115- resolver : yupResolver ( createSealedSecretApiResponseSchema ) as Resolver < CreateSealedSecretApiResponse > ,
121+ resolver : yupResolver ( createSealedSecretApiResponseSchema ) as Resolver < SealedSecretFormData > ,
116122 defaultValues : mergedDefaultValues ,
117123 } )
118124
@@ -146,8 +152,14 @@ export default function SecretCreateEditPage({
146152 } , [ watch ( 'type' ) , sealedSecretName ] )
147153
148154 const mutating = isLoadingCreate || isLoadingUpdate || isLoadingDelete
149- if ( ! mutating && ( isSuccessUpdate || isSuccessDelete ) ) return < Redirect to = { `/teams/${ teamId } /secrets` } />
150- if ( ! mutating && isSuccessCreate ) return < Redirect to = { `/teams/${ teamId } /secrets` } />
155+ if ( ! mutating && ( isSuccessCreate || isSuccessUpdate || isSuccessDelete ) ) {
156+ if ( isCoderepository ) {
157+ history . push ( `/teams/${ teamId } /code-repositories/create` , {
158+ coderepository : false ,
159+ prefilled : { ...prefilled , secret : dataCreate . name } ,
160+ } )
161+ } else return < Redirect to = { `/teams/${ teamId } /secrets` } />
162+ }
151163
152164 const onSubmit = async ( ) => {
153165 const body = cloneDeep ( watch ( ) )
@@ -227,6 +239,12 @@ export default function SecretCreateEditPage({
227239 // hides the first two crumbs (e.g. /teams/teamName)
228240 hideCrumbX = { [ 0 , 1 ] }
229241 />
242+ { sealedSecretName && isImmutable && (
243+ < InformationBanner
244+ sx = { { my : '1rem' } }
245+ message = 'This secret is marked as immutable and therefore values cannot be changed, only deleted.'
246+ />
247+ ) }
230248 < FormProvider { ...methods } >
231249 < form onSubmit = { handleSubmit ( onSubmit ) } >
232250 < Section >
@@ -250,22 +268,27 @@ export default function SecretCreateEditPage({
250268 value = { watch ( 'type' ) || 'kubernetes.io/opaque' }
251269 disabled = { ! ! sealedSecretName }
252270 >
253- { /** default will be basic auth */ }
254- { /* <MenuItem key='select-a-secret'>Select a secret type</MenuItem> */ }
255271 { secretTypes . map ( ( t ) => (
256272 < MenuItem key = { t } value = { t } >
257273 { t }
258274 </ MenuItem >
259275 ) ) }
260276 </ TextField >
261- < SecretTypeFields />
262- < Divider />
277+ { sealedSecretName && ! isImmutable && (
278+ < InformationBanner
279+ sx = { { mt : '2rem' } }
280+ message = 'You can add new values to override existing values, but be aware that applications using this token might need to be adapted.'
281+ />
282+ ) }
283+ < SecretTypeFields immutable = { sealedSecretName && watch ( 'immutable' ) } />
284+ < Divider sx = { { mb : 1 } } />
263285 < ControlledCheckbox
264286 sx = { { my : 2 } }
265287 name = 'immutable'
266288 control = { control }
267289 label = 'Immutable'
268290 explainertext = 'If set to true, ensures that data stored in the Secret cannot be updated (only object metadata can be modified).'
291+ disabled = { sealedSecretName && isImmutable }
269292 />
270293 </ Section >
271294 < AdvancedSettings >
0 commit comments