feat: United/DentalHub + Tufts SCO pre-auth, cloud storage search & file thumbnails

- Add United/DentalHub pre-authorization Selenium worker, helpers, backend route/processor/client, and frontend OTP modal + wired button
- Add Tufts SCO pre-authorization Selenium worker, helpers, backend route/processor/client, and frontend OTP modal + wired button
- Fix btnSubmitAuthorization selector for UnitedDH preauth step2
- Fix Tufts SCO preauth step3 to target <span>pre-authorization</span> button
- Cloud storage search: default to "both" mode so patient folder names match on first search
- Cloud storage folder panel: auto-scroll to panel when opened from search results
- Cloud storage files: show inline image thumbnails and PDF badge in file grid

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ff
2026-06-13 00:03:58 -04:00
co-authored by Claude Sonnet 4.6
parent fd4feb3e76
commit 3978b16d7d
20 changed files with 4044 additions and 19 deletions
@@ -0,0 +1,26 @@
import axios from "axios";
const SELENIUM_BASE = process.env.SELENIUM_SERVICE_URL || "http://localhost:8000";
export async function forwardToSeleniumTuftsSCOPreAuthAgent(data: any) {
const response = await axios.post(`${SELENIUM_BASE}/tuftssco-preauth`, data, {
timeout: 30000,
});
return response.data;
}
export async function getSeleniumTuftsSCOPreAuthSessionStatus(sessionId: string) {
const response = await axios.get(`${SELENIUM_BASE}/session/${sessionId}/status`, {
timeout: 10000,
});
return response.data;
}
export async function forwardOtpToSeleniumTuftsSCOPreAuthAgent(sessionId: string, otp: string) {
const response = await axios.post(
`${SELENIUM_BASE}/submit-otp`,
{ session_id: sessionId, otp },
{ timeout: 10000 }
);
return response.data;
}
@@ -0,0 +1,35 @@
import axios from "axios";
const SELENIUM_BASE = process.env.SELENIUM_SERVICE_URL ?? "http://localhost:5002";
/**
* POST /uniteddh-preauth
* Returns { status: "started", session_id: "<uuid>" }
*/
export async function forwardToSeleniumUnitedDHPreAuthAgent(
data: Record<string, any>
): Promise<{ status: string; session_id: string }> {
const resp = await axios.post(`${SELENIUM_BASE}/uniteddh-preauth`, data);
return resp.data;
}
/**
* GET /session/{sid}/status
*/
export async function getSeleniumUnitedDHPreAuthSessionStatus(
sessionId: string
): Promise<Record<string, any>> {
const resp = await axios.get(`${SELENIUM_BASE}/session/${sessionId}/status`);
return resp.data;
}
/**
* POST /submit-otp
*/
export async function forwardOtpToSeleniumUnitedDHPreAuthAgent(
sessionId: string,
otp: string
): Promise<Record<string, any>> {
const resp = await axios.post(`${SELENIUM_BASE}/submit-otp`, { session_id: sessionId, otp });
return resp.data;
}