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.")}
-
-
${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;
}
}