diff --git a/frontend/src/pages/settings/GeneralTab.tsx b/frontend/src/pages/settings/GeneralTab.tsx
index df7a3f395..2c1ae840d 100644
--- a/frontend/src/pages/settings/GeneralTab.tsx
+++ b/frontend/src/pages/settings/GeneralTab.tsx
@@ -170,7 +170,7 @@ export default function GeneralTab({ allSetting, updateSetting }: GeneralTabProp
updateSetting({ webPort: Number(v) || 0 })} />
+ onChange={(v) => { if (v != null) updateSetting({ webPort: v }); }} />
@@ -308,7 +308,7 @@ export default function GeneralTab({ allSetting, updateSetting }: GeneralTabProp
updateSetting({ ldapPort: Number(v) || 0 })} />
+ onChange={(v) => { if (v != null) updateSetting({ ldapPort: v }); }} />
updateSetting({ ldapUseTLS: v })} />
diff --git a/frontend/src/pages/settings/SubscriptionGeneralTab.tsx b/frontend/src/pages/settings/SubscriptionGeneralTab.tsx
index e94c8a877..c2ba1f833 100644
--- a/frontend/src/pages/settings/SubscriptionGeneralTab.tsx
+++ b/frontend/src/pages/settings/SubscriptionGeneralTab.tsx
@@ -57,7 +57,7 @@ export default function SubscriptionGeneralTab({ allSetting, updateSetting }: Su
updateSetting({ subPort: Number(v) || 0 })} />
+ onChange={(v) => { if (v != null) updateSetting({ subPort: v }); }} />
{
+ it('keeps the stored subscription port when the field is cleared', () => {
+ const updateSetting = vi.fn();
+
+ renderWithProviders(
+
+
+ ,
+ );
+
+ const portInput = screen.getByDisplayValue('2096');
+ fireEvent.change(portInput, { target: { value: '' } });
+ fireEvent.blur(portInput);
+
+ expect(updateSetting).not.toHaveBeenCalled();
+ });
+
+ it('forwards typed subscription ports unchanged', () => {
+ const updateSetting = vi.fn();
+
+ renderWithProviders(
+
+
+ ,
+ );
+
+ fireEvent.change(screen.getByDisplayValue('2096'), { target: { value: '8443' } });
+
+ expect(updateSetting).toHaveBeenCalledWith({ subPort: 8443 });
+ });
+
it('uses router navigation to open subscription format settings', () => {
const allSetting = new AllSetting({ subClashEnable: true });