(function () { if (window.__sub2apiAccountHotfixLoaded) return; window.__sub2apiAccountHotfixLoaded = true; var routeAttrName = "data-sub2api-route"; var mobileTableStyleId = "sub2api-admin-accounts-mobile-scroll-hotfix"; var originalFetch = window.fetch ? window.fetch.bind(window) : null; if (!originalFetch) return; function ensureMobileTableHotfixStyle() { if (document.getElementById(mobileTableStyleId)) return; var style = document.createElement("style"); style.id = mobileTableStyleId; style.textContent = [ "@media (max-width: 1024px), (hover: none) and (pointer: coarse) {", " html[" + routeAttrName + "=\"admin-accounts\"] .table-wrapper {", " overflow-x: auto !important;", " overflow-y: auto !important;", " -webkit-overflow-scrolling: touch;", " touch-action: pan-x pan-y pinch-zoom;", " overscroll-behavior-x: contain;", " }", " html[" + routeAttrName + "=\"admin-accounts\"] .table-wrapper table {", " min-width: max-content;", " }", " html[" + routeAttrName + "=\"admin-accounts\"] .table-wrapper .sticky-col,", " html[" + routeAttrName + "=\"admin-accounts\"] .table-wrapper .sticky-header-cell {", " position: static !important;", " left: auto !important;", " right: auto !important;", " z-index: auto !important;", " box-shadow: none !important;", " }", "}" ].join("\n"); document.head.appendChild(style); } function updateRouteFlag() { var root = document.documentElement; if (!root) return; if (window.location.pathname.indexOf("/admin/accounts") === 0) { root.setAttribute(routeAttrName, "admin-accounts"); } else { root.removeAttribute(routeAttrName); } } function installRouteWatchers() { updateRouteFlag(); var originalPushState = history.pushState; var originalReplaceState = history.replaceState; history.pushState = function () { var result = originalPushState.apply(history, arguments); updateRouteFlag(); return result; }; history.replaceState = function () { var result = originalReplaceState.apply(history, arguments); updateRouteFlag(); return result; }; window.addEventListener("popstate", updateRouteFlag); document.addEventListener("visibilitychange", updateRouteFlag); } ensureMobileTableHotfixStyle(); installRouteWatchers(); function sameOrigin(url) { try { var parsed = new URL(url, window.location.origin); return parsed.origin === window.location.origin; } catch (error) { return false; } } function normalizePath(url) { try { return new URL(url, window.location.origin).pathname; } catch (error) { return ""; } } function hasSensitiveFields(account) { if (!account || typeof account !== "object") return false; var credentials = account.credentials; if (!credentials || typeof credentials !== "object") return false; var apiKey = credentials.api_key; var modelMapping = credentials.model_mapping; return Boolean(apiKey) || Boolean(modelMapping && Object.keys(modelMapping).length); } function mergeAccount(listItem, detail) { if (!detail || typeof detail !== "object") return listItem; var merged = Object.assign({}, listItem, detail); if (listItem && typeof listItem === "object" && detail && typeof detail === "object") { merged.credentials = Object.assign({}, listItem.credentials || {}, detail.credentials || {}); merged.extra = Object.assign({}, listItem.extra || {}, detail.extra || {}); } return merged; } async function hydrateAccounts(payload) { if (!payload || !Array.isArray(payload.items) || !payload.items.length) return payload; var items = payload.items.slice(); var detailRequests = items.map(async function (item, index) { if (!item || !item.id || hasSensitiveFields(item)) return; try { var response = await originalFetch("/admin/accounts/" + encodeURIComponent(item.id), { credentials: "same-origin", headers: { Accept: "application/json" } }); if (!response.ok) return; var detail = await response.json(); items[index] = mergeAccount(item, detail); } catch (error) { } }); await Promise.all(detailRequests); return Object.assign({}, payload, { items: items }); } window.fetch = async function (input, init) { var response = await originalFetch(input, init); var method = ((init && init.method) || (input && input.method) || "GET").toUpperCase(); var url = typeof input === "string" ? input : input && input.url; if (!url || method !== "GET" || !sameOrigin(url)) return response; var path = normalizePath(url); if (path !== "/admin/accounts") return response; try { var contentType = response.headers.get("content-type") || ""; if (contentType.indexOf("application/json") === -1) return response; var payload = await response.clone().json(); if (!payload || !Array.isArray(payload.items)) return response; var hydrated = await hydrateAccounts(payload); return new Response(JSON.stringify(hydrated), { status: response.status, statusText: response.statusText, headers: response.headers }); } catch (error) { return response; } }; })();