FN-5932: fix research settings containment layout
Keep research settings controls inside their containment wrappers so inputs stay onscreen across breakpoints. - wrap advanced provider controls in a dedicated research settings body container - tighten research grid and field min-width behavior in desktop and mobile styles - add regression coverage for global and project research sections on desktop and mobile Files changed: packages/dashboard/app/components/SettingsModal.css | 37 +++++++- packages/dashboard/app/components/SettingsModal.tsx | 104 +++++++++++---------- packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 65 +++++++++++++ packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 48 ++++++++++ 4 files changed, 201 insertions(+), 53 deletions(-) Fusion-Task-Id: FN-5932 Fusion-Task-Lineage: 22dff41f-b563-40d0-97ea-1ca6d1e09466
This commit is contained in:
@@ -5615,57 +5615,59 @@ export function SettingsModal({
|
||||
</small>
|
||||
<details className="settings-option-details settings-research-provider-advanced-details">
|
||||
<summary>Advanced — external search providers</summary>
|
||||
<div className="form-group">
|
||||
<label htmlFor="research-global-search-provider-advanced">Search Provider</label>
|
||||
<select
|
||||
id="research-global-search-provider-advanced"
|
||||
className="input"
|
||||
value={externalProvider ? resolvedProvider : "searxng"}
|
||||
onChange={(event) =>
|
||||
setSearchProvider(event.target.value as Settings["researchGlobalWebSearchProvider"])
|
||||
}
|
||||
>
|
||||
<option value="searxng">SearXNG</option>
|
||||
<option value="brave">Brave</option>
|
||||
<option value="google">Google Custom Search</option>
|
||||
<option value="tavily">Tavily</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<label htmlFor="research-global-searxng-url">SearXNG URL</label>
|
||||
<input
|
||||
id="research-global-searxng-url"
|
||||
className="input"
|
||||
value={form.researchGlobalSearxngUrl ?? ""}
|
||||
onChange={(event) =>
|
||||
setForm((current) => ({
|
||||
...current,
|
||||
researchGlobalSearxngUrl: event.target.value || undefined,
|
||||
}))
|
||||
}
|
||||
placeholder="https://searx.example.com"
|
||||
/>
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<label htmlFor="research-global-google-cx">Google Search CX</label>
|
||||
<input
|
||||
id="research-global-google-cx"
|
||||
className="input"
|
||||
value={form.researchGlobalGoogleSearchCx ?? ""}
|
||||
onChange={(event) =>
|
||||
setForm((current) => ({
|
||||
...current,
|
||||
researchGlobalGoogleSearchCx: event.target.value || undefined,
|
||||
}))
|
||||
}
|
||||
placeholder="custom-search-engine-id"
|
||||
/>
|
||||
</div>
|
||||
<div className="settings-empty-state settings-research-empty-state" role="note">
|
||||
Configure Brave, Tavily, and Google API keys in Authentication.
|
||||
<button type="button" className="btn btn-sm" onClick={() => setActiveSection("authentication")}>
|
||||
Open Authentication Settings
|
||||
</button>
|
||||
<div className="settings-research-provider-advanced-body">
|
||||
<div className="form-group">
|
||||
<label htmlFor="research-global-search-provider-advanced">Search Provider</label>
|
||||
<select
|
||||
id="research-global-search-provider-advanced"
|
||||
className="input"
|
||||
value={externalProvider ? resolvedProvider : "searxng"}
|
||||
onChange={(event) =>
|
||||
setSearchProvider(event.target.value as Settings["researchGlobalWebSearchProvider"])
|
||||
}
|
||||
>
|
||||
<option value="searxng">SearXNG</option>
|
||||
<option value="brave">Brave</option>
|
||||
<option value="google">Google Custom Search</option>
|
||||
<option value="tavily">Tavily</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<label htmlFor="research-global-searxng-url">SearXNG URL</label>
|
||||
<input
|
||||
id="research-global-searxng-url"
|
||||
className="input"
|
||||
value={form.researchGlobalSearxngUrl ?? ""}
|
||||
onChange={(event) =>
|
||||
setForm((current) => ({
|
||||
...current,
|
||||
researchGlobalSearxngUrl: event.target.value || undefined,
|
||||
}))
|
||||
}
|
||||
placeholder="https://searx.example.com"
|
||||
/>
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<label htmlFor="research-global-google-cx">Google Search CX</label>
|
||||
<input
|
||||
id="research-global-google-cx"
|
||||
className="input"
|
||||
value={form.researchGlobalGoogleSearchCx ?? ""}
|
||||
onChange={(event) =>
|
||||
setForm((current) => ({
|
||||
...current,
|
||||
researchGlobalGoogleSearchCx: event.target.value || undefined,
|
||||
}))
|
||||
}
|
||||
placeholder="custom-search-engine-id"
|
||||
/>
|
||||
</div>
|
||||
<div className="settings-empty-state settings-research-empty-state" role="note">
|
||||
Configure Brave, Tavily, and Google API keys in Authentication.
|
||||
<button type="button" className="btn btn-sm" onClick={() => setActiveSection("authentication")}>
|
||||
Open Authentication Settings
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user