diff --git a/orchestrator/package-lock.json b/orchestrator/package-lock.json index 27be8e0..8477c85 100644 --- a/orchestrator/package-lock.json +++ b/orchestrator/package-lock.json @@ -8,6 +8,7 @@ "name": "job-ops-orchestrator", "version": "1.0.0", "dependencies": { + "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-checkbox": "^1.3.2", "@radix-ui/react-dropdown-menu": "^2.1.15", @@ -1329,6 +1330,36 @@ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==" }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-alert-dialog": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", @@ -1424,6 +1455,35 @@ } } }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", diff --git a/orchestrator/package.json b/orchestrator/package.json index 9725965..e7c2d3d 100644 --- a/orchestrator/package.json +++ b/orchestrator/package.json @@ -18,6 +18,7 @@ "pipeline:run": "tsx src/server/pipeline/run.ts" }, "dependencies": { + "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-checkbox": "^1.3.2", "@radix-ui/react-dropdown-menu": "^2.1.15", diff --git a/orchestrator/src/client/pages/SettingsPage.tsx b/orchestrator/src/client/pages/SettingsPage.tsx index dabedf5..25f5c3c 100644 --- a/orchestrator/src/client/pages/SettingsPage.tsx +++ b/orchestrator/src/client/pages/SettingsPage.tsx @@ -17,6 +17,12 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog" +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Checkbox } from "@/components/ui/checkbox" @@ -299,437 +305,519 @@ export const SettingsPage: React.FC = () => {

Configure runtime behavior for this app.

- - - Model - - - -
-
Override model
- setModelDraft(event.target.value)} - placeholder={defaultModel || "openai/gpt-4o-mini"} - disabled={isLoading || isSaving} - /> -
- Leave blank to use the default from server env (`MODEL`). -
-
- - - -
-
-
Effective
-
{effectiveModel || "—"}
-
-
-
Default (env)
-
{defaultModel || "—"}
-
-
-
-
- - - - Pipeline Webhook - - - -
-
Pipeline status webhook URL
- setPipelineWebhookUrlDraft(event.target.value)} - placeholder={defaultPipelineWebhookUrl || "https://..."} - disabled={isLoading || isSaving} - /> -
- When set, the server sends a POST on pipeline completion/failure. Leave blank to disable. -
-
- - - -
-
-
Effective
-
{effectivePipelineWebhookUrl || "—"}
-
-
-
Default (env)
-
{defaultPipelineWebhookUrl || "—"}
-
-
-
-
- - - - Job Complete Webhook - - - -
-
Job completion webhook URL
- setJobCompleteWebhookUrlDraft(event.target.value)} - placeholder={defaultJobCompleteWebhookUrl || "https://..."} - disabled={isLoading || isSaving} - /> -
- When set, the server sends a POST when you mark a job as applied (includes the job description). -
-
- - - -
-
-
Effective
-
{effectiveJobCompleteWebhookUrl || "—"}
-
-
-
Default (env)
-
{defaultJobCompleteWebhookUrl || "—"}
-
-
-
-
- - - - UKVisaJobs Extractor - - - -
-
Max jobs to fetch
- { - const value = parseInt(event.target.value, 10) - if (Number.isNaN(value)) { - setUkvisajobsMaxJobsDraft(null) - } else { - setUkvisajobsMaxJobsDraft(Math.min(200, Math.max(1, value))) - } - }} - disabled={isLoading || isSaving} - /> -
- Maximum number of jobs to fetch from UKVisaJobs per pipeline run. Range: 1-200. -
-
- - - -
-
-
Effective
-
{effectiveUkvisajobsMaxJobs}
-
-
-
Default
-
{defaultUkvisajobsMaxJobs}
-
-
-
-
- - - - Search Terms - - - -
-
Global search terms
-