From 05b65b5c7abdfafe6b5c02bdd86d56c775c26303 Mon Sep 17 00:00:00 2001 From: "sas.fajri" Date: Mon, 13 Apr 2026 15:53:21 +0700 Subject: [PATCH] Refine dashboard and pending results --- server.js | 101 +++++++++++++++++++----------------------------------- 1 file changed, 36 insertions(+), 65 deletions(-) diff --git a/server.js b/server.js index a247140..51f69d2 100644 --- a/server.js +++ b/server.js @@ -267,26 +267,17 @@ function panelHeader(title, text, action = "") { } async function dashboardPage(session) { - const [orders, results, fpp] = await Promise.all([ + const [orders, results] = await Promise.all([ loadOrders(session, "", "All"), loadResults(session, ""), - loadFpp(session, "All"), ]); const stats = [ - { label: "Orders today", value: String(orders.length), trend: "Live", hint: "From API response" }, - { label: "Results pending", value: String(results.filter((item) => item.status !== "Released").length), trend: "Live", hint: "From API response" }, - { label: "FPP items", value: String(fpp.items.length), trend: "Live", hint: "From API response" }, - { label: "Special messages", value: String(orders.filter((item) => Boolean(item.message)).length), trend: "Live", hint: "From API response" }, - ]; - const shortcuts = [ - { title: "New order", desc: "Start registration flow", href: "/orders/new" }, - { title: "Pending results", desc: "Review unreleased items", href: "/results/pending" }, - { title: "FPP catalog", desc: "Inspect lab groups", href: "/fpp" }, - { title: "Change password", desc: "Update account security", href: "/settings/change-password" }, + { label: "Orders today", value: String(orders.length), trend: "Live", hint: "" }, + { label: "Results pending", value: String(results.filter((item) => item.status !== "Released").length), trend: "Live", hint: "" }, ]; return `
-
+
${stats .map( (item) => ` @@ -296,28 +287,12 @@ async function dashboardPage(session) { ${escapeHtml(item.trend)}
${escapeHtml(item.value)} - ${escapeHtml(item.hint)} + ${item.hint ? `${escapeHtml(item.hint)}` : ""} - `, + `, ) .join("")} -
- ${panelHeader("Quick actions", "Jump into the common flows without digging through nested screens.")} -
- ${shortcuts - .map( - (item) => ` - - ${escapeHtml(item.title)} -

${escapeHtml(item.desc)}

- ${icon("arrow")} Open -
- `, - ) - .join("")} -
-
${panelHeader("Recent orders", "A compact snapshot of the latest patient orders and their state.", 'View all')} @@ -346,28 +321,6 @@ async function dashboardPage(session) {
-
- ${panelHeader("Today’s notes", "Items that need attention now, not later.")} -
- ${[ - ["FPP ready for release", "Review Hematology group before rounding."], - ["Pending sample", "One fasting sample still waiting in the queue."], - ["Password rotation", "Prompt user to refresh credentials after 90 days."], - ] - .map( - ([title, text]) => ` -
-
- ${escapeHtml(title)} -

${escapeHtml(text)}

-
- ${icon("arrow")} -
- `, - ) - .join("")} -
-
`; @@ -713,10 +666,11 @@ function renderResultDetail(result) { @@ -1222,16 +1176,31 @@ function normalizeOrder(raw, index = 0) { } function normalizeResult(raw, index = 0) { - const status = raw?.status || raw?.result_status || "Released"; + const status = raw?.status || raw?.result_status || raw?.order_status || "Pending"; + const detailsSource = raw?.details || raw?.items || raw?.order_details || []; + const details = Array.isArray(detailsSource) + ? detailsSource + .map((item) => { + if (typeof item === "string") return item; + return item?.test_name || item?.name || item?.detail_name || item?.exam || item?.label || ""; + }) + .filter(Boolean) + : []; return { id: raw?.result_id || raw?.order_id || raw?.id || raw?.hasil_id || "", - patient: raw?.patient_name || raw?.name || raw?.patient || "", - test: raw?.test_name || raw?.item_name || raw?.test || "", + patient: raw?.order_name || raw?.patient_name || raw?.name || raw?.patient || "", + test: details.join(", ") || raw?.test_name || raw?.item_name || raw?.test || "", status, tone: statusClass(status), - date: raw?.date || raw?.created_at || raw?.updated_at || "", - summary: raw?.summary || raw?.note || raw?.result_summary || "", - value: raw?.value || raw?.result_value || raw?.result || "", + date: raw?.order_date || raw?.date || raw?.created_at || raw?.updated_at || "", + summary: raw?.order_diagnosa || raw?.summary || raw?.note || raw?.result_summary || "", + value: raw?.order_note || raw?.value || raw?.result_value || raw?.result || "", + details, + orderCode: raw?.order_qrcode || "", + orderDob: raw?.order_dob || "", + orderAddress: raw?.order_address || "", + orderNik: raw?.order_nik || "", + orderHp: raw?.order_hp || "", }; } @@ -1274,8 +1243,8 @@ async function loadResults(session, search = "") { { token: session.token, order_id: orderId }, session.token, ); - const rows = extractArray(payload) || []; - return rows.map((row, index) => normalizeResult(row, index)).filter((item) => { + const rawRows = extractArray(payload) || (payload?.data ? [payload.data] : []); + return rawRows.map((row, index) => normalizeResult(row, index)).filter((item) => { if (!item.id) return false; if (!term) return true; return [item.id, item.patient, item.test, item.status, item.summary].some((value) => @@ -1301,11 +1270,13 @@ async function loadResultDetail(session, resultId) { ); const rows = extractArray(payload); if (rows?.length) return normalizeResult(rows[0], 0); + if (payload?.data && typeof payload.data === "object") return normalizeResult(payload.data, 0); if (payload && typeof payload === "object") return normalizeResult(payload, 0); const related = await loadResults(session, resultId); return related.find((item) => item.id === resultId) || null; } catch { - return null; + const related = await loadResults(session, resultId); + return related.find((item) => item.id === resultId) || related[0] || null; } }