@@ -34,6 +34,20 @@ interface AssignRoleWizardProps {
3434 roles ?: RoleMetadata [ ] ;
3535}
3636
37+ const parseUsers = ( input : string ) : string [ ] => input
38+ . split ( ',' )
39+ . map ( ( u ) => u . trim ( ) )
40+ . filter ( Boolean ) ;
41+
42+ const getInitialState = ( initialUsers : string ) => ( {
43+ activeStep : STEPS . SELECT_USERS_AND_ROLE as StepKey ,
44+ users : initialUsers ,
45+ selectedRole : null as string | null ,
46+ selectedScopes : new Set < string > ( ) ,
47+ invalidUsers : [ ] as string [ ] ,
48+ validatedUsers : [ ] as string [ ] ,
49+ } ) ;
50+
3751const AssignRoleWizard = ( { onClose, initialUsers = '' , roles = allRolesMetadata } : AssignRoleWizardProps ) => {
3852 const intl = useIntl ( ) ;
3953 const { showErrorToast } = useToastManager ( ) ;
@@ -42,7 +56,6 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
4256 const [ selectedRole , setSelectedRole ] = useState < string | null > ( null ) ;
4357 const [ selectedScopes , setSelectedScopes ] = useState < Set < string > > ( new Set ( ) ) ;
4458
45- const [ validationError , setValidationError ] = useState < string | null > ( null ) ;
4659 const [ invalidUsers , setInvalidUsers ] = useState < string [ ] > ( [ ] ) ;
4760 const [ validatedUsers , setValidatedUsers ] = useState < string [ ] > ( [ ] ) ;
4861
@@ -52,31 +65,25 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
5265
5366 const handleUsersChange = useCallback ( ( value : string ) => {
5467 setInvalidUsers ( ( prev ) => ( prev . length > 0 ? [ ] : prev ) ) ;
55- setValidationError ( null ) ;
5668 setUsers ( value ) ;
5769 } , [ ] ) ;
5870
5971 const handleClose = ( ) => {
60- setActiveStep ( STEPS . SELECT_USERS_AND_ROLE ) ;
61- setUsers ( '' ) ;
62- setSelectedRole ( null ) ;
63- setSelectedScopes ( new Set ( ) ) ;
64- setValidationError ( null ) ;
65- setInvalidUsers ( [ ] ) ;
66- setValidatedUsers ( [ ] ) ;
72+ const initialState = getInitialState ( initialUsers ) ;
73+ setActiveStep ( initialState . activeStep ) ;
74+ setUsers ( initialState . users ) ;
75+ setSelectedRole ( initialState . selectedRole ) ;
76+ setSelectedScopes ( initialState . selectedScopes ) ;
77+ setInvalidUsers ( initialState . invalidUsers ) ;
78+ setValidatedUsers ( initialState . validatedUsers ) ;
6779 onClose ( ) ;
6880 } ;
6981
70- const parseUsers = ( input : string ) : string [ ] => input
71- . split ( ',' )
72- . map ( ( u ) => u . trim ( ) )
73- . filter ( Boolean ) ;
74-
7582 const validateUsersAndProceed = async ( ) => {
83+ if ( validateUsersMutation . isPending ) { return ; }
7684 const usersList = parseUsers ( users ) ;
7785 if ( usersList . length === 0 || ! selectedRole ) { return ; }
7886
79- setValidationError ( null ) ;
8087 setInvalidUsers ( [ ] ) ;
8188
8289 try {
@@ -88,7 +95,6 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
8895 setActiveStep ( STEPS . DEFINE_APPLICATION_SCOPE ) ;
8996 }
9097 } catch ( error ) {
91- setValidationError ( intl . formatMessage ( messages [ 'wizard.validate.error' ] ) ) ;
9298 showErrorToast ( error , validateUsersAndProceed ) ;
9399 }
94100 } ;
@@ -107,15 +113,14 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
107113 handleClose ( ) ;
108114 } ;
109115
110- const isError = invalidUsers . length > 0 || ! ! validationError ;
111-
112116 useEffect ( ( ) => {
113- if ( isError && usersInputRef . current ) {
117+ if ( invalidUsers . length && usersInputRef . current ) {
114118 usersInputRef . current . scrollIntoView ( { behavior : 'smooth' , block : 'center' } ) ;
115119 }
116- } , [ isError ] ) ;
120+ } , [ invalidUsers ] ) ;
117121
118- const canProceed = ! ! users . trim ( ) && ! ! selectedRole ;
122+ const parsedUsers = parseUsers ( users ) ;
123+ const canProceed = parsedUsers . length > 0 && ! ! selectedRole ;
119124 const canSave = selectedScopes . size > 0 ;
120125
121126 return (
@@ -126,6 +131,9 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
126131 < Stepper . Step
127132 eventKey = { STEPS . SELECT_USERS_AND_ROLE }
128133 title = { intl . formatMessage ( messages [ 'wizard.step.selectUsersAndRole.title' ] ) }
134+ hasError = { invalidUsers . length > 0 }
135+ description = { invalidUsers . length > 0 ? intl . formatMessage ( messages [ 'wizard.step.selectUsersAndRole.error' ] ) : '' }
136+ index = { 0 }
129137 >
130138 < SelectUsersAndRoleStep
131139 users = { users }
@@ -141,6 +149,7 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
141149 < Stepper . Step
142150 eventKey = { STEPS . DEFINE_APPLICATION_SCOPE }
143151 title = { intl . formatMessage ( messages [ 'wizard.step.defineScope.title' ] ) }
152+ index = { 1 }
144153 >
145154 < DefineApplicationScopeStep
146155 selectedRole = { selectedRole }
@@ -162,7 +171,7 @@ const AssignRoleWizard = ({ onClose, initialUsers = '', roles = allRolesMetadata
162171 pending : intl . formatMessage ( messages [ 'wizard.button.next.pending' ] ) ,
163172 } }
164173 icons = { { pending : < Icon src = { SpinnerSimple } /> } }
165- variant = { isError ? 'danger' : 'primary' }
174+ variant = { invalidUsers . length ? 'danger' : 'primary' }
166175 state = { validateUsersMutation . isPending ? 'pending' : 'default' }
167176 onClick = { validateUsersAndProceed }
168177 disabled = { ! canProceed || validateUsersMutation . isPending }
0 commit comments