@@ -24,10 +24,17 @@ interface AddGatewayScreenProps {
2424 onExit : ( ) => void ;
2525 existingGateways : string [ ] ;
2626 availableAgents : string [ ] ;
27+ unassignedTargets : string [ ] ;
2728}
2829
29- export function AddGatewayScreen ( { onComplete, onExit, existingGateways, availableAgents } : AddGatewayScreenProps ) {
30- const wizard = useAddGatewayWizard ( ) ;
30+ export function AddGatewayScreen ( {
31+ onComplete,
32+ onExit,
33+ existingGateways,
34+ availableAgents,
35+ unassignedTargets,
36+ } : AddGatewayScreenProps ) {
37+ const wizard = useAddGatewayWizard ( unassignedTargets . length ) ;
3138
3239 // JWT config sub-step tracking (0 = discoveryUrl, 1 = audience, 2 = clients)
3340 const [ jwtSubStep , setJwtSubStep ] = useState ( 0 ) ;
@@ -39,6 +46,11 @@ export function AddGatewayScreen({ onComplete, onExit, existingGateways, availab
3946 [ availableAgents ]
4047 ) ;
4148
49+ const unassignedTargetItems : SelectableItem [ ] = useMemo (
50+ ( ) => unassignedTargets . map ( name => ( { id : name , title : name } ) ) ,
51+ [ unassignedTargets ]
52+ ) ;
53+
4254 const authorizerItems : SelectableItem [ ] = useMemo (
4355 ( ) => AUTHORIZER_TYPE_OPTIONS . map ( o => ( { id : o . id , title : o . title , description : o . description } ) ) ,
4456 [ ]
@@ -48,6 +60,7 @@ export function AddGatewayScreen({ onComplete, onExit, existingGateways, availab
4860 const isAuthorizerStep = wizard . step === 'authorizer' ;
4961 const isJwtConfigStep = wizard . step === 'jwt-config' ;
5062 const isAgentsStep = wizard . step === 'agents' ;
63+ const isIncludeTargetsStep = wizard . step === 'include-targets' ;
5164 const isConfirmStep = wizard . step === 'confirm' ;
5265
5366 const authorizerNav = useListNavigation ( {
@@ -66,6 +79,15 @@ export function AddGatewayScreen({ onComplete, onExit, existingGateways, availab
6679 requireSelection : false ,
6780 } ) ;
6881
82+ const targetsNav = useMultiSelectNavigation ( {
83+ items : unassignedTargetItems ,
84+ getId : item => item . id ,
85+ onConfirm : ids => wizard . setSelectedTargets ( ids ) ,
86+ onExit : ( ) => wizard . goBack ( ) ,
87+ isActive : isIncludeTargetsStep ,
88+ requireSelection : false ,
89+ } ) ;
90+
6991 useListNavigation ( {
7092 items : [ { id : 'confirm' , title : 'Confirm' } ] ,
7193 onSelect : ( ) => onComplete ( wizard . config ) ,
@@ -113,13 +135,14 @@ export function AddGatewayScreen({ onComplete, onExit, existingGateways, availab
113135 }
114136 } ;
115137
116- const helpText = isAgentsStep
117- ? 'Space toggle · Enter confirm · Esc back'
118- : isConfirmStep
119- ? HELP_TEXT . CONFIRM_CANCEL
120- : isAuthorizerStep
121- ? HELP_TEXT . NAVIGATE_SELECT
122- : HELP_TEXT . TEXT_INPUT ;
138+ const helpText =
139+ isAgentsStep || isIncludeTargetsStep
140+ ? 'Space toggle · Enter confirm · Esc back'
141+ : isConfirmStep
142+ ? HELP_TEXT . CONFIRM_CANCEL
143+ : isAuthorizerStep
144+ ? HELP_TEXT . NAVIGATE_SELECT
145+ : HELP_TEXT . TEXT_INPUT ;
123146
124147 const headerContent = < StepIndicator steps = { wizard . steps } currentStep = { wizard . step } labels = { GATEWAY_STEP_LABELS } /> ;
125148
@@ -178,6 +201,18 @@ export function AddGatewayScreen({ onComplete, onExit, existingGateways, availab
178201 </ Text >
179202 ) ) }
180203
204+ { isIncludeTargetsStep &&
205+ ( unassignedTargetItems . length > 0 ? (
206+ < WizardMultiSelect
207+ title = "Select unassigned targets to include in this gateway"
208+ items = { unassignedTargetItems }
209+ cursorIndex = { targetsNav . cursorIndex }
210+ selectedIds = { targetsNav . selectedIds }
211+ />
212+ ) : (
213+ < Text dimColor > No unassigned targets available. Press Enter to continue.</ Text >
214+ ) ) }
215+
181216 { isConfirmStep && (
182217 < ConfirmReview
183218 fields = { [
@@ -192,6 +227,13 @@ export function AddGatewayScreen({ onComplete, onExit, existingGateways, availab
192227 ]
193228 : [ ] ) ,
194229 { label : 'Agents' , value : wizard . config . agents . length > 0 ? wizard . config . agents . join ( ', ' ) : '(none)' } ,
230+ {
231+ label : 'Targets' ,
232+ value :
233+ wizard . config . selectedTargets && wizard . config . selectedTargets . length > 0
234+ ? wizard . config . selectedTargets . join ( ', ' )
235+ : '(none)' ,
236+ } ,
195237 ] }
196238 />
197239 ) }
0 commit comments