Skip to content

Commit 2088237

Browse files
committed
refactor(FR-2889): move resourceGroup selection onto antd Form instance
1 parent bf658de commit 2088237

5 files changed

Lines changed: 49 additions & 24 deletions

File tree

react/src/components/DeploymentAddRevisionCustomContent.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,10 @@ export const DeploymentAddRevisionCustomContent: React.FC<
11251125
stays visible during resource-group re-fetch.
11261126
*/}
11271127
<Suspense fallback={<Skeleton active paragraph={{ rows: 4 }} />}>
1128-
<ResourceAllocationFormItems enableResourcePresets />
1128+
<ResourceAllocationFormItems
1129+
enableResourcePresets
1130+
autoSelectFirstResourceGroup
1131+
/>
11291132
</Suspense>
11301133

11311134
<Collapse

react/src/components/DeploymentAddRevisionPresetContent.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export const DeploymentAddRevisionPresetContent: React.FC<
264264
>
265265
<BAIProjectResourceGroupSelect
266266
projectName={projectName ?? ''}
267+
autoSelectDefault
267268
style={{ width: '100%' }}
268269
/>
269270
</Form.Item>

react/src/components/ModelCardDeployModal.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,13 @@ const ModelCardDeployModalContent: React.FC<
105105
userSelectedPresetId ??
106106
(availablePresets[0]?.id ? toLocalId(availablePresets[0].id) : undefined);
107107

108-
const [userSelectedResourceGroup, setUserSelectedResourceGroup] = useState<
109-
string | undefined
110-
>(undefined);
111-
const effectiveResourceGroup =
112-
userSelectedResourceGroup ?? resourceGroups[0]?.name;
108+
// The resource-group selection is held in an antd Form. `Form.useWatch`
109+
// subscribes to changes on the `resourceGroup` field so the Deploy button's
110+
// `disabled` prop reflects the current selection, and `form.getFieldValue`
111+
// reads it at submit time. `BAIProjectResourceGroupSelect` auto-fills the
112+
// "default" (or first available) group via its `autoSelectDefault` prop.
113+
const [form] = Form.useForm<{ resourceGroup?: string }>();
114+
const selectedResourceGroup = Form.useWatch('resourceGroup', form);
113115

114116
const handleDeploy = (): Promise<void> => {
115117
if (!modelCardRowId || !projectId) return Promise.resolve();
@@ -119,7 +121,7 @@ const ModelCardDeployModalContent: React.FC<
119121
: effectivePresetId;
120122
const resourceGroup = isAutoDeployScenario
121123
? resourceGroups[0]?.name
122-
: effectiveResourceGroup;
124+
: form.getFieldValue('resourceGroup');
123125

124126
if (!presetId || !resourceGroup) return Promise.resolve();
125127

@@ -225,7 +227,7 @@ const ModelCardDeployModalContent: React.FC<
225227
footer={null}
226228
width={480}
227229
>
228-
<Form layout="vertical">
230+
<Form form={form} layout="vertical">
229231
<Form.Item
230232
label={t('modelStore.Preset')}
231233
tooltip={t('modelStore.PresetTooltip')}
@@ -268,14 +270,14 @@ const ModelCardDeployModalContent: React.FC<
268270
</BAIFlex>
269271
</Form.Item>
270272
<Form.Item
273+
name="resourceGroup"
271274
label={t('modelStore.ResourceGroup')}
272275
tooltip={t('modelStore.ResourceGroupTooltip')}
273-
required
276+
rules={[{ required: true }]}
274277
>
275278
<BAIProjectResourceGroupSelect
276279
projectName={projectName ?? ''}
277-
value={effectiveResourceGroup}
278-
onChange={(value: string) => setUserSelectedResourceGroup(value)}
280+
autoSelectDefault
279281
style={{ width: '100%' }}
280282
/>
281283
</Form.Item>
@@ -301,7 +303,7 @@ const ModelCardDeployModalContent: React.FC<
301303
!modelCardRowId ||
302304
!projectId ||
303305
!effectivePresetId ||
304-
!effectiveResourceGroup
306+
!selectedResourceGroup
305307
}
306308
>
307309
{t('modelStore.Deploy')}

react/src/components/SessionFormItems/ResourceAllocationFormItems.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,15 @@ interface ResourceAllocationFormItemsProps {
8888
showRemainingWarning?: boolean;
8989
forceImageMinValues?: boolean;
9090
hideClusterFormItems?: boolean;
91+
/**
92+
* Opt-in: when the form field has no value, auto-select the project's
93+
* "default" resource group (or the first available one). Forwarded to
94+
* `BAIProjectResourceGroupSelect`'s `autoSelectDefault` prop. Off by
95+
* default to preserve existing behavior for shared callers like
96+
* `SessionLauncherPage` / `ServiceLauncherPageContent` that pre-fill
97+
* the form themselves.
98+
*/
99+
autoSelectFirstResourceGroup?: boolean;
91100
extraAcceleratorRules?: Array<{
92101
warningOnly?: boolean;
93102
validator: (rule: unknown, value: number) => Promise<void>;
@@ -102,6 +111,7 @@ const ResourceAllocationFormItems: React.FC<
102111
forceImageMinValues = false,
103112
showRemainingWarning = false,
104113
hideClusterFormItems = false,
114+
autoSelectFirstResourceGroup = false,
105115
extraAcceleratorRules,
106116
}) => {
107117
const form = Form.useFormInstance<MergedResourceAllocationFormValue>();
@@ -534,6 +544,7 @@ const ResourceAllocationFormItems: React.FC<
534544
>
535545
<BAIProjectResourceGroupSelect
536546
projectName={currentProject.name}
547+
autoSelectDefault={autoSelectFirstResourceGroup}
537548
showSearch
538549
/>
539550
</Form.Item>

react/src/components/VFolderDeployModal.tsx

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,17 +148,25 @@ const VFolderDeployModalContent: React.FC<VFolderDeployModalContentProps> = ({
148148
userSelectedPresetId ??
149149
(availablePresets[0]?.id ? toLocalId(availablePresets[0].id) : undefined);
150150

151-
const [userSelectedResourceGroup, setUserSelectedResourceGroup] = useState<
152-
string | undefined
153-
>(undefined);
154-
const effectiveResourceGroup =
155-
userSelectedResourceGroup ?? resourceGroups[0]?.name;
151+
// Hold the resource-group selection on the antd Form. `Form.useWatch`
152+
// subscribes to changes so the Deploy button's `disabled` prop updates
153+
// immediately, and `form.getFieldValue` reads it at submit time.
154+
// `BAIProjectResourceGroupSelect` auto-fills the "default" (or first
155+
// available) group via its `autoSelectDefault` prop.
156+
const [form] = Form.useForm<{ resourceGroup?: string }>();
157+
const selectedResourceGroup = Form.useWatch('resourceGroup', form);
156158

157159
const handleDeploy = (): Promise<void> => {
158160
if (!vfolderId || !projectId) return Promise.resolve();
159161

160162
const presetId = effectivePresetId;
161-
const resourceGroup = effectiveResourceGroup;
163+
// In `isAutoDeployScenario`, `BAIProjectResourceGroupSelect` is never
164+
// mounted (the component returns `null` before reaching the form), so
165+
// its `autoSelectDefault` cannot populate the form value. Fall back to
166+
// the sole resource group here — same pattern as `ModelCardDeployModal`.
167+
const resourceGroup = isAutoDeployScenario
168+
? resourceGroups[0]?.name
169+
: form.getFieldValue('resourceGroup');
162170

163171
if (!presetId || !resourceGroup) return Promise.resolve();
164172

@@ -266,7 +274,7 @@ const VFolderDeployModalContent: React.FC<VFolderDeployModalContentProps> = ({
266274
footer={null}
267275
width={480}
268276
>
269-
<Form layout="vertical">
277+
<Form form={form} layout="vertical">
270278
<Form.Item
271279
label={t('modelStore.Preset')}
272280
tooltip={t('modelStore.PresetTooltip')}
@@ -301,14 +309,14 @@ const VFolderDeployModalContent: React.FC<VFolderDeployModalContentProps> = ({
301309
</BAIFlex>
302310
</Form.Item>
303311
<Form.Item
312+
name="resourceGroup"
304313
label={t('modelStore.ResourceGroup')}
305314
tooltip={t('modelStore.ResourceGroupTooltip')}
306-
required
315+
rules={[{ required: true }]}
307316
>
308317
<BAIProjectResourceGroupSelect
309318
projectName={projectName ?? ''}
310-
value={effectiveResourceGroup}
311-
onChange={(value: string) => setUserSelectedResourceGroup(value)}
319+
autoSelectDefault
312320
style={{ width: '100%' }}
313321
/>
314322
</Form.Item>
@@ -339,7 +347,7 @@ const VFolderDeployModalContent: React.FC<VFolderDeployModalContentProps> = ({
339347
!vfolderId ||
340348
!projectId ||
341349
!effectivePresetId ||
342-
!effectiveResourceGroup ||
350+
!selectedResourceGroup ||
343351
hasNoPresets
344352
}
345353
>
@@ -353,7 +361,7 @@ const VFolderDeployModalContent: React.FC<VFolderDeployModalContentProps> = ({
353361
!vfolderId ||
354362
!projectId ||
355363
!effectivePresetId ||
356-
!effectiveResourceGroup ||
364+
!selectedResourceGroup ||
357365
hasNoPresets
358366
}
359367
>

0 commit comments

Comments
 (0)