trotl-table 1.0.95 → 1.0.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkOrderAnalyticsByClient.cjs.js","sources":["../src/components/WorkOrderAnalyticsByClient.jsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\r\n\r\nconst COMPLETED_STATUS_ID = \"3a861ce5-dfd5-451d-81f3-7e90788eff18\";\r\nconst MONTH_NAMES = [\r\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\r\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\r\n];\r\n\r\nfunction getDocuments(payload) {\r\n if (Array.isArray(payload)) return payload;\r\n if (Array.isArray(payload?.data)) return payload.data;\r\n if (Array.isArray(payload?.documents)) return payload.documents;\r\n if (Array.isArray(payload?.items)) return payload.items;\r\n if (Array.isArray(payload?.results)) return payload.results;\r\n return [];\r\n}\r\n\r\nfunction parseDateValue(raw) {\r\n if (raw === undefined || raw === null || raw === \"\") return null;\r\n const timestamp = typeof raw === \"number\"\r\n ? (raw >= 1e12 ? raw : raw * 1000)\r\n : (typeof raw === \"string\" && /^\\d+$/.test(raw.trim())\r\n ? (Number(raw) >= 1e12 ? Number(raw) : Number(raw) * 1000)\r\n : raw);\r\n const date = new Date(timestamp);\r\n return Number.isNaN(date.getTime()) ? null : date;\r\n}\r\n\r\nfunction getWorkOrderDate(document) {\r\n const value = document.completedAt || document.completedDate || document.createdAt\r\n || document.createdOn || document.creationDate || document.date || document.startDate || document.updatedAt;\r\n return parseDateValue(value);\r\n}\r\n\r\nfunction getClientName(document) {\r\n return document.clientLabel || document.clientName || document.clientId || \"Unknown client\";\r\n}\r\n\r\nfunction getTherapistName(document) {\r\n return document.therapistLabel || document.therapistName || document.therapistId || \"Unknown therapist\";\r\n}\r\n\r\nfunction isFutureCalendarDate(date, referenceDate) {\r\n const dateKey = date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\r\n const referenceKey = referenceDate.getFullYear() * 10000\r\n + (referenceDate.getMonth() + 1) * 100\r\n + referenceDate.getDate();\r\n return dateKey > referenceKey;\r\n}\r\n\r\nfunction countBy(items, getKey) {\r\n return items.reduce((counts, item) => {\r\n const key = getKey(item);\r\n counts[key] = (counts[key] || 0) + 1;\r\n return counts;\r\n }, {});\r\n}\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat().format(value);\r\n}\r\n\r\nfunction SummaryCard({ label, value, detail }) {\r\n return (\r\n <div className=\"analytics-summary-card\">\r\n <span className=\"analytics-summary-label\">{label}</span>\r\n <strong className=\"analytics-summary-value\">{value}</strong>\r\n {detail && <span className=\"analytics-summary-detail\">{detail}</span>}\r\n </div>\r\n );\r\n}\r\n\r\nfunction BarChart({ rows, labelKey, valueKey, color = \"#2995A3\" }) {\r\n const maximum = Math.max(...rows.map((row) => row[valueKey]), 1);\r\n return (\r\n <div className=\"analytics-bar-chart\">\r\n {rows.map((row) => (\r\n <div className=\"analytics-bar-row\" key={row.key || row[labelKey]}>\r\n <span className=\"analytics-bar-label\" title={row[labelKey]}>{row[labelKey]}</span>\r\n <span className=\"analytics-bar-track\">\r\n <span className=\"analytics-bar-fill\" style={{ width: `${(row[valueKey] / maximum) * 100}%`, backgroundColor: color }} />\r\n </span>\r\n <strong>{formatNumber(row[valueKey])}</strong>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction MonthlyChart({ rows, onMonthClick }) {\r\n const maximum = Math.max(...rows.map((row) => row.orders), 1);\r\n return (\r\n <div className=\"analytics-month-chart\" role=\"img\" aria-label=\"Completed WorkOrders by month\">\r\n {rows.map((row) => (\r\n <button type=\"button\" className=\"analytics-month-column\" key={row.key} onClick={() => onMonthClick(row)} title={`Open ${row.month} ${row.year} details`}>\r\n <span className=\"analytics-month-value\">{row.orders}</span>\r\n <span className=\"analytics-month-bar\" style={{ height: `${Math.max((row.orders / maximum) * 100, 3)}%` }} />\r\n <span className=\"analytics-month-label\">{row.month.slice(0, 3)} {row.year}</span>\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction AnalyticsTable({ columns, rows, emptyMessage = \"No completed WorkOrders found.\" }) {\r\n return (\r\n <div className=\"analytics-table-wrap\">\r\n <table className=\"analytics-table\">\r\n <thead>\r\n <tr>{columns.map((column) => <th key={column.key}>{column.label}</th>)}</tr>\r\n </thead>\r\n <tbody>\r\n {rows.length === 0 ? (\r\n <tr><td colSpan={columns.length} className=\"analytics-empty\">{emptyMessage}</td></tr>\r\n ) : rows.map((row, index) => (\r\n <tr key={row.key || index}>\r\n {columns.map((column) => <td key={column.key}>{column.render ? column.render(row) : row[column.key]}</td>)}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getWorkOrderLabel(order) {\r\n return order.workOrderLabel || order.documentNumber || order.orderNumber || order.name || order.id || \"WorkOrder\";\r\n}\r\n\r\nfunction getWorkOrderHref(order) {\r\n return order.url || order.link || order.href || (order.id ? `/work-orders/${order.id}` : null);\r\n}\r\n\r\nfunction MonthDetailsModal({ month, orders, onClose }) {\r\n if (!month) return null;\r\n return (\r\n <div className=\"analytics-modal-backdrop\" role=\"presentation\" onClick={onClose}>\r\n <div className=\"analytics-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"month-details-title\" onClick={(event) => event.stopPropagation()}>\r\n <div className=\"analytics-modal-header\">\r\n <h3 id=\"month-details-title\">{month.month} {month.year} WorkOrders</h3>\r\n <button type=\"button\" className=\"analytics-modal-close\" onClick={onClose} aria-label=\"Close\">×</button>\r\n </div>\r\n <p>{orders.length} completed WorkOrder{orders.length === 1 ? \"\" : \"s\"} in this month.</p>\r\n <div className=\"analytics-modal-list\">\r\n {orders.length === 0 ? <div className=\"analytics-empty\">No WorkOrders found.</div> : orders.map((order, index) => {\r\n const href = getWorkOrderHref(order);\r\n const label = getWorkOrderLabel(order);\r\n return (\r\n <div className=\"analytics-work-order-item\" key={order.id || `${label}-${index}`}>\r\n {href ? (\r\n <a href={href} target=\"_blank\" rel=\"noreferrer\">{label}</a>\r\n ) : (\r\n <strong>{label}</strong>\r\n )}\r\n <span>{order.client} · {order.therapist}</span>\r\n {order.date && <small>{order.date.toLocaleDateString()}</small>}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function WorkOrderAnalyticsByClient({\r\n endpoint = \"/api/documents?type=WorkOrder\",\r\n fetchDocuments,\r\n currentDate = new Date()\r\n}) {\r\n const [documents, setDocuments] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(\"\");\r\n const [refreshToken, setRefreshToken] = useState(0);\r\n const [selectedMonth, setSelectedMonth] = useState(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n const loadDocuments = async () => {\r\n setLoading(true);\r\n setError(\"\");\r\n try {\r\n const result = fetchDocuments\r\n ? await fetchDocuments()\r\n : await fetch(endpoint, { headers: { \"Content-Type\": \"application/json\" } }).then((response) => {\r\n if (!response.ok) throw new Error(`Request failed (${response.status})`);\r\n return response.json();\r\n });\r\n if (!cancelled) setDocuments(getDocuments(result));\r\n } catch (loadError) {\r\n if (!cancelled) setError(loadError.message || \"Unable to load WorkOrders.\");\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n };\r\n loadDocuments();\r\n return () => { cancelled = true; };\r\n }, [endpoint, fetchDocuments, refreshToken]);\r\n\r\n const completedOrders = useMemo(() => documents\r\n .filter((document) => document.type === \"WorkOrder\" || document.documentType === \"WorkOrder\" || !document.type)\r\n .filter((document) => document.statusId === COMPLETED_STATUS_ID)\r\n .map((document) => ({ ...document, date: getWorkOrderDate(document), client: getClientName(document), therapist: getTherapistName(document) }))\r\n .filter((document) => document.date && !isFutureCalendarDate(document.date, currentDate)), [documents, currentDate]);\r\n\r\n const currentYear = currentDate.getFullYear();\r\n const years = useMemo(() => [...new Set(completedOrders.map((order) => order.date.getFullYear()))].sort((a, b) => b - a), [completedOrders]);\r\n const yearRows = years.map((year) => ({\r\n key: year,\r\n year,\r\n orders: completedOrders.filter((order) => order.date.getFullYear() === year).length\r\n }));\r\n const monthRows = [...new Set(completedOrders.map((order) => `${order.date.getFullYear()}-${order.date.getMonth()}`))]\r\n .map((key) => {\r\n const [year, monthIndex] = key.split(\"-\").map(Number);\r\n return {\r\n key,\r\n year,\r\n month: MONTH_NAMES[monthIndex],\r\n monthIndex,\r\n orders: completedOrders.filter((order) => order.date.getFullYear() === year && order.date.getMonth() === monthIndex).length\r\n };\r\n })\r\n .sort((a, b) => b.year - a.year || MONTH_NAMES.indexOf(a.month) - MONTH_NAMES.indexOf(b.month));\r\n const clientCounts = countBy(completedOrders, (order) => order.client);\r\n const clientRows = Object.entries(clientCounts)\r\n .map(([client, orders]) => ({ key: client, client, orders, share: completedOrders.length ? `${Math.round((orders / completedOrders.length) * 100)}%` : \"0%\" }))\r\n .sort((a, b) => b.orders - a.orders || a.client.localeCompare(b.client));\r\n const clientYearRows = Object.entries(clientCounts)\r\n .map(([client]) => {\r\n const row = { key: client, client };\r\n years.forEach((year) => {\r\n row[year] = completedOrders.filter((order) => order.client === client && order.date.getFullYear() === year).length;\r\n });\r\n row.total = clientCounts[client];\r\n return row;\r\n })\r\n .sort((a, b) => b.total - a.total || a.client.localeCompare(b.client));\r\n const clientMonthRows = monthRows.flatMap((monthRow) => Object.entries(clientCounts)\r\n .map(([client]) => ({\r\n key: `${monthRow.key}-${client}`,\r\n year: monthRow.year,\r\n month: monthRow.month,\r\n client,\r\n orders: completedOrders.filter((order) => order.client === client\r\n && order.date.getFullYear() === monthRow.year\r\n && order.date.getMonth() === MONTH_NAMES.indexOf(monthRow.month)).length\r\n }))\r\n .filter((row) => row.orders > 0));\r\n const therapistCounts = countBy(completedOrders, (order) => order.therapist);\r\n const topTherapist = Object.entries(therapistCounts).sort((a, b) => b[1] - a[1])[0];\r\n const topClientRows = clientRows.slice(0, 8);\r\n\r\n return (\r\n <section className=\"analytics-by-client\">\r\n <div className=\"analytics-header\">\r\n <div>\r\n <h2>WorkOrder analytics by client</h2>\r\n <p>Completed WorkOrders grouped by client, year, and month.</p>\r\n <small className=\"analytics-source\">Source: <code>{endpoint}</code> · Completed status only</small>\r\n </div>\r\n <div className=\"analytics-header-actions\">\r\n {loading && <span className=\"analytics-status\">Loading...</span>}\r\n {!loading && <button type=\"button\" className=\"analytics-refresh\" onClick={() => setRefreshToken((value) => value + 1)}>Refresh data</button>}\r\n </div>\r\n </div>\r\n {error && <div className=\"analytics-error\" role=\"alert\">{error}</div>}\r\n {!loading && (\r\n <>\r\n <div className=\"analytics-summary-grid\">\r\n <SummaryCard label=\"Completed WorkOrders\" value={formatNumber(completedOrders.length)} />\r\n <SummaryCard label=\"Clients\" value={formatNumber(Object.keys(clientCounts).length)} />\r\n <SummaryCard label={`${currentYear} orders`} value={formatNumber(yearRows.find((row) => row.year === currentYear)?.orders || 0)} />\r\n <SummaryCard label=\"Top therapist\" value={topTherapist?.[0] || \"-\"} detail={topTherapist ? `${formatNumber(topTherapist[1])} orders` : \"\"} />\r\n </div>\r\n <div className=\"analytics-grid\">\r\n <div className=\"analytics-panel\">\r\n <h3>Completed orders by year</h3>\r\n <BarChart rows={yearRows} labelKey=\"year\" valueKey=\"orders\" />\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Top clients</h3>\r\n <BarChart rows={topClientRows} labelKey=\"client\" valueKey=\"orders\" color=\"#646cff\" />\r\n </div>\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Monthly trend</h3>\r\n {monthRows.length ? <MonthlyChart rows={monthRows} onMonthClick={setSelectedMonth} /> : <p className=\"analytics-empty\">No monthly data available.</p>}\r\n </div>\r\n <div className=\"analytics-grid\">\r\n <div className=\"analytics-panel\">\r\n <h3>Totals by year</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"year\", label: \"Year\" },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) }\r\n ]} rows={yearRows} />\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Totals by month</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"year\", label: \"Year\" },\r\n { key: \"month\", label: \"Month\", render: (row) => (\r\n <button type=\"button\" className=\"analytics-date-button\" onClick={() => setSelectedMonth(row)}>{row.month} {row.year}</button>\r\n ) },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) }\r\n ]} rows={monthRows} />\r\n </div>\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Totals by client</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"client\", label: \"Client\" },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) },\r\n { key: \"share\", label: \"Share of completed orders\" }\r\n ]} rows={clientRows} />\r\n </div>\r\n <div className=\"analytics-grid\">\r\n <div className=\"analytics-panel\">\r\n <h3>Work orders per client by year</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"client\", label: \"Client\" },\r\n ...years.map((year) => ({ key: year, label: String(year), render: (row) => formatNumber(row[year]) })),\r\n { key: \"total\", label: \"Total\", render: (row) => formatNumber(row.total) }\r\n ]} rows={clientYearRows} />\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Work orders per client by month</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"year\", label: \"Year\" },\r\n { key: \"month\", label: \"Month\" },\r\n { key: \"client\", label: \"Client\" },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) }\r\n ]} rows={clientMonthRows} />\r\n </div>\r\n </div>\r\n <MonthDetailsModal\r\n month={selectedMonth}\r\n orders={selectedMonth ? completedOrders.filter((order) => order.date.getFullYear() === selectedMonth.year && order.date.getMonth() === selectedMonth.monthIndex) : []}\r\n onClose={() => setSelectedMonth(null)}\r\n />\r\n </>\r\n )}\r\n </section>\r\n );\r\n}\r\n\r\nexport { COMPLETED_STATUS_ID };\r\n"],"names":["COMPLETED_STATUS_ID","MONTH_NAMES","getDocuments","payload","Array","isArray","data","documents","items","results","parseDateValue","raw","undefined","timestamp","test","trim","Number","date","Date","isNaN","getTime","getWorkOrderDate","document","value","completedAt","completedDate","createdAt","createdOn","creationDate","startDate","updatedAt","getClientName","clientLabel","clientName","clientId","getTherapistName","therapistLabel","therapistName","therapistId","isFutureCalendarDate","referenceDate","dateKey","getFullYear","getMonth","getDate","referenceKey","countBy","getKey","reduce","counts","item","key","formatNumber","Intl","NumberFormat","format","SummaryCard","label","detail","React","createElement","className","BarChart","rows","labelKey","valueKey","color","maximum","Math","max","map","row","title","style","width","backgroundColor","MonthlyChart","onMonthClick","orders","role","type","onClick","month","year","height","slice","AnalyticsTable","columns","emptyMessage","column","length","colSpan","index","render","getWorkOrderLabel","order","workOrderLabel","documentNumber","orderNumber","name","id","getWorkOrderHref","url","link","href","MonthDetailsModal","onClose","event","stopPropagation","target","rel","client","therapist","toLocaleDateString","WorkOrderAnalyticsByClient","endpoint","fetchDocuments","currentDate","setDocuments","useState","loading","setLoading","error","setError","refreshToken","setRefreshToken","selectedMonth","setSelectedMonth","useEffect","cancelled","loadDocuments","result","fetch","headers","then","response","ok","Error","status","json","loadError","message","completedOrders","useMemo","filter","documentType","statusId","currentYear","years","Set","sort","a","b","yearRows","monthRows","monthIndex","split","indexOf","clientCounts","clientRows","Object","entries","share","round","localeCompare","clientYearRows","forEach","total","clientMonthRows","flatMap","monthRow","therapistCounts","topTherapist","topClientRows","Fragment","keys","find","String"],"mappings":";;;;;;AAEA,MAAMA,mBAAmB,GAAG;AAC5B,MAAMC,WAAW,GAAG,CAClB,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CACjE;AAED,SAASC,YAAYA,CAACC,OAAO,EAAE;EAC7B,IAAIC,KAAK,CAACC,OAAO,CAACF,OAAO,CAAC,EAAE,OAAOA,OAAO;AAC1C,EAAA,IAAIC,KAAK,CAACC,OAAO,CAACF,OAAO,EAAEG,IAAI,CAAC,EAAE,OAAOH,OAAO,CAACG,IAAI;AACrD,EAAA,IAAIF,KAAK,CAACC,OAAO,CAACF,OAAO,EAAEI,SAAS,CAAC,EAAE,OAAOJ,OAAO,CAACI,SAAS;AAC/D,EAAA,IAAIH,KAAK,CAACC,OAAO,CAACF,OAAO,EAAEK,KAAK,CAAC,EAAE,OAAOL,OAAO,CAACK,KAAK;AACvD,EAAA,IAAIJ,KAAK,CAACC,OAAO,CAACF,OAAO,EAAEM,OAAO,CAAC,EAAE,OAAON,OAAO,CAACM,OAAO;AAC3D,EAAA,OAAO,EAAE;AACX;AAEA,SAASC,cAAcA,CAACC,GAAG,EAAE;AAC3B,EAAA,IAAIA,GAAG,KAAKC,SAAS,IAAID,GAAG,KAAK,IAAI,IAAIA,GAAG,KAAK,EAAE,EAAE,OAAO,IAAI;EAChE,MAAME,SAAS,GAAG,OAAOF,GAAG,KAAK,QAAQ,GACpCA,GAAG,IAAI,IAAI,GAAGA,GAAG,GAAGA,GAAG,GAAG,IAAI,GAC9B,OAAOA,GAAG,KAAK,QAAQ,IAAI,OAAO,CAACG,IAAI,CAACH,GAAG,CAACI,IAAI,EAAE,CAAC,GACjDC,MAAM,CAACL,GAAG,CAAC,IAAI,IAAI,GAAGK,MAAM,CAACL,GAAG,CAAC,GAAGK,MAAM,CAACL,GAAG,CAAC,GAAG,IAAI,GACvDA,GAAI;AACV,EAAA,MAAMM,IAAI,GAAG,IAAIC,IAAI,CAACL,SAAS,CAAC;AAChC,EAAA,OAAOG,MAAM,CAACG,KAAK,CAACF,IAAI,CAACG,OAAO,EAAE,CAAC,GAAG,IAAI,GAAGH,IAAI;AACnD;AAEA,SAASI,gBAAgBA,CAACC,QAAQ,EAAE;AAClC,EAAA,MAAMC,KAAK,GAAGD,QAAQ,CAACE,WAAW,IAAIF,QAAQ,CAACG,aAAa,IAAIH,QAAQ,CAACI,SAAS,IAC7EJ,QAAQ,CAACK,SAAS,IAAIL,QAAQ,CAACM,YAAY,IAAIN,QAAQ,CAACL,IAAI,IAAIK,QAAQ,CAACO,SAAS,IAAIP,QAAQ,CAACQ,SAAS;EAC7G,OAAOpB,cAAc,CAACa,KAAK,CAAC;AAC9B;AAEA,SAASQ,aAAaA,CAACT,QAAQ,EAAE;AAC/B,EAAA,OAAOA,QAAQ,CAACU,WAAW,IAAIV,QAAQ,CAACW,UAAU,IAAIX,QAAQ,CAACY,QAAQ,IAAI,gBAAgB;AAC7F;AAEA,SAASC,gBAAgBA,CAACb,QAAQ,EAAE;AAClC,EAAA,OAAOA,QAAQ,CAACc,cAAc,IAAId,QAAQ,CAACe,aAAa,IAAIf,QAAQ,CAACgB,WAAW,IAAI,mBAAmB;AACzG;AAEA,SAASC,oBAAoBA,CAACtB,IAAI,EAAEuB,aAAa,EAAE;EACjD,MAAMC,OAAO,GAAGxB,IAAI,CAACyB,WAAW,EAAE,GAAG,KAAK,GAAG,CAACzB,IAAI,CAAC0B,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG1B,IAAI,CAAC2B,OAAO,EAAE;EACzF,MAAMC,YAAY,GAAGL,aAAa,CAACE,WAAW,EAAE,GAAG,KAAK,GACpD,CAACF,aAAa,CAACG,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,GACpCH,aAAa,CAACI,OAAO,EAAE;EAC3B,OAAOH,OAAO,GAAGI,YAAY;AAC/B;AAEA,SAASC,OAAOA,CAACtC,KAAK,EAAEuC,MAAM,EAAE;EAC9B,OAAOvC,KAAK,CAACwC,MAAM,CAAC,CAACC,MAAM,EAAEC,IAAI,KAAK;AACpC,IAAA,MAAMC,GAAG,GAAGJ,MAAM,CAACG,IAAI,CAAC;AACxBD,IAAAA,MAAM,CAACE,GAAG,CAAC,GAAG,CAACF,MAAM,CAACE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,IAAA,OAAOF,MAAM;EACf,CAAC,EAAE,EAAE,CAAC;AACR;AAEA,SAASG,YAAYA,CAAC7B,KAAK,EAAE;EAC3B,OAAO,IAAI8B,IAAI,CAACC,YAAY,EAAE,CAACC,MAAM,CAAChC,KAAK,CAAC;AAC9C;AAEA,SAASiC,WAAWA,CAAC;EAAEC,KAAK;EAAElC,KAAK;AAAEmC,EAAAA;AAAO,CAAC,EAAE;EAC7C,oBACEC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAwB,eACrCF,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC;AAAyB,GAAA,EAAEJ,KAAY,CAAC,eACxDE,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQC,IAAAA,SAAS,EAAC;AAAyB,GAAA,EAAEtC,KAAc,CAAC,EAC3DmC,MAAM,iBAAIC,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC;GAA0B,EAAEH,MAAa,CACjE,CAAC;AAEV;AAEA,SAASI,QAAQA,CAAC;EAAEC,IAAI;EAAEC,QAAQ;EAAEC,QAAQ;AAAEC,EAAAA,KAAK,GAAG;AAAU,CAAC,EAAE;EACjE,MAAMC,OAAO,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAGN,IAAI,CAACO,GAAG,CAAEC,GAAG,IAAKA,GAAG,CAACN,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;EAChE,oBACEN,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAqB,EACjCE,IAAI,CAACO,GAAG,CAAEC,GAAG,iBACZZ,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,mBAAmB;AAACV,IAAAA,GAAG,EAAEoB,GAAG,CAACpB,GAAG,IAAIoB,GAAG,CAACP,QAAQ;GAAE,eAC/DL,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC,qBAAqB;IAACW,KAAK,EAAED,GAAG,CAACP,QAAQ;GAAE,EAAEO,GAAG,CAACP,QAAQ,CAAQ,CAAC,eAClFL,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC;GAAqB,eACnCF,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC,oBAAoB;AAACY,IAAAA,KAAK,EAAE;MAAEC,KAAK,EAAE,CAAA,EAAIH,GAAG,CAACN,QAAQ,CAAC,GAAGE,OAAO,GAAI,GAAG,CAAA,CAAA,CAAG;AAAEQ,MAAAA,eAAe,EAAET;AAAM;AAAE,GAAE,CACnH,CAAC,eACPP,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA,IAAA,EAASR,YAAY,CAACmB,GAAG,CAACN,QAAQ,CAAC,CAAU,CAC1C,CACN,CACE,CAAC;AAEV;AAEA,SAASW,YAAYA,CAAC;EAAEb,IAAI;AAAEc,EAAAA;AAAa,CAAC,EAAE;AAC5C,EAAA,MAAMV,OAAO,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAGN,IAAI,CAACO,GAAG,CAAEC,GAAG,IAAKA,GAAG,CAACO,MAAM,CAAC,EAAE,CAAC,CAAC;EAC7D,oBACEnB,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,uBAAuB;AAACkB,IAAAA,IAAI,EAAC,KAAK;IAAC,YAAA,EAAW;GAA+B,EACzFhB,IAAI,CAACO,GAAG,CAAEC,GAAG,iBACZZ,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQoB,IAAAA,IAAI,EAAC,QAAQ;AAACnB,IAAAA,SAAS,EAAC,wBAAwB;IAACV,GAAG,EAAEoB,GAAG,CAACpB,GAAI;AAAC8B,IAAAA,OAAO,EAAEA,MAAMJ,YAAY,CAACN,GAAG,CAAE;IAACC,KAAK,EAAE,QAAQD,GAAG,CAACW,KAAK,CAAA,CAAA,EAAIX,GAAG,CAACY,IAAI,CAAA,QAAA;GAAW,eACtJxB,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC;AAAuB,GAAA,EAAEU,GAAG,CAACO,MAAa,CAAC,eAC3DnB,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC,qBAAqB;AAACY,IAAAA,KAAK,EAAE;AAAEW,MAAAA,MAAM,EAAE,CAAA,EAAGhB,IAAI,CAACC,GAAG,CAAEE,GAAG,CAACO,MAAM,GAAGX,OAAO,GAAI,GAAG,EAAE,CAAC,CAAC,CAAA,CAAA;AAAI;AAAE,GAAE,CAAC,eAC5GR,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC;AAAuB,GAAA,EAAEU,GAAG,CAACW,KAAK,CAACG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,GAAC,EAACd,GAAG,CAACY,IAAW,CAC1E,CACT,CACE,CAAC;AAEV;AAEA,SAASG,cAAcA,CAAC;EAAEC,OAAO;EAAExB,IAAI;AAAEyB,EAAAA,YAAY,GAAG;AAAiC,CAAC,EAAE;EAC1F,oBACE7B,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAsB,eACnCF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAAiB,GAAA,eAChCF,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA,IAAA,eACED,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAK2B,OAAO,CAACjB,GAAG,CAAEmB,MAAM,iBAAK9B,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA;IAAIT,GAAG,EAAEsC,MAAM,CAACtC;GAAI,EAAEsC,MAAM,CAAChC,KAAU,CAAC,CAAM,CACtE,CAAC,eACRE,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA,IAAA,EACGG,IAAI,CAAC2B,MAAM,KAAK,CAAC,gBAChB/B,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,eAAID,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA;IAAI+B,OAAO,EAAEJ,OAAO,CAACG,MAAO;AAAC7B,IAAAA,SAAS,EAAC;AAAiB,GAAA,EAAE2B,YAAiB,CAAK,CAAC,GACnFzB,IAAI,CAACO,GAAG,CAAC,CAACC,GAAG,EAAEqB,KAAK,kBACtBjC,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA;AAAIT,IAAAA,GAAG,EAAEoB,GAAG,CAACpB,GAAG,IAAIyC;GAAM,EACvBL,OAAO,CAACjB,GAAG,CAAEmB,MAAM,iBAAK9B,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA;IAAIT,GAAG,EAAEsC,MAAM,CAACtC;GAAI,EAAEsC,MAAM,CAACI,MAAM,GAAGJ,MAAM,CAACI,MAAM,CAACtB,GAAG,CAAC,GAAGA,GAAG,CAACkB,MAAM,CAACtC,GAAG,CAAM,CAAC,CACvG,CACL,CACI,CACF,CACJ,CAAC;AAEV;AAEA,SAAS2C,iBAAiBA,CAACC,KAAK,EAAE;EAChC,OAAOA,KAAK,CAACC,cAAc,IAAID,KAAK,CAACE,cAAc,IAAIF,KAAK,CAACG,WAAW,IAAIH,KAAK,CAACI,IAAI,IAAIJ,KAAK,CAACK,EAAE,IAAI,WAAW;AACnH;AAEA,SAASC,gBAAgBA,CAACN,KAAK,EAAE;EAC/B,OAAOA,KAAK,CAACO,GAAG,IAAIP,KAAK,CAACQ,IAAI,IAAIR,KAAK,CAACS,IAAI,KAAKT,KAAK,CAACK,EAAE,GAAG,CAAA,aAAA,EAAgBL,KAAK,CAACK,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC;AAChG;AAEA,SAASK,iBAAiBA,CAAC;EAAEvB,KAAK;EAAEJ,MAAM;AAAE4B,EAAAA;AAAQ,CAAC,EAAE;AACrD,EAAA,IAAI,CAACxB,KAAK,EAAE,OAAO,IAAI;EACvB,oBACEvB,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,0BAA0B;AAACkB,IAAAA,IAAI,EAAC,cAAc;AAACE,IAAAA,OAAO,EAAEyB;GAAQ,eAC7E/C,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,iBAAiB;AAACkB,IAAAA,IAAI,EAAC,QAAQ;AAAC,IAAA,YAAA,EAAW,MAAM;AAAC,IAAA,iBAAA,EAAgB,qBAAqB;AAACE,IAAAA,OAAO,EAAG0B,KAAK,IAAKA,KAAK,CAACC,eAAe;GAAG,eACjJjD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAwB,eACrCF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA;AAAIwC,IAAAA,EAAE,EAAC;AAAqB,GAAA,EAAElB,KAAK,CAACA,KAAK,EAAC,GAAC,EAACA,KAAK,CAACC,IAAI,EAAC,aAAe,CAAC,eACvExB,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQoB,IAAAA,IAAI,EAAC,QAAQ;AAACnB,IAAAA,SAAS,EAAC,uBAAuB;AAACoB,IAAAA,OAAO,EAAEyB,OAAQ;IAAC,YAAA,EAAW;AAAO,GAAA,EAAC,MAAS,CACnG,CAAC,eACN/C,KAAA,CAAAC,aAAA,CAAA,GAAA,EAAA,IAAA,EAAIkB,MAAM,CAACY,MAAM,EAAC,sBAAoB,EAACZ,MAAM,CAACY,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAC,iBAAkB,CAAC,eACzF/B,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAsB,EAClCiB,MAAM,CAACY,MAAM,KAAK,CAAC,gBAAG/B,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,EAAC,sBAAyB,CAAC,GAAGiB,MAAM,CAACR,GAAG,CAAC,CAACyB,KAAK,EAAEH,KAAK,KAAK;AAChH,IAAA,MAAMY,IAAI,GAAGH,gBAAgB,CAACN,KAAK,CAAC;AACpC,IAAA,MAAMtC,KAAK,GAAGqC,iBAAiB,CAACC,KAAK,CAAC;IACtC,oBACEpC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,MAAAA,SAAS,EAAC,2BAA2B;MAACV,GAAG,EAAE4C,KAAK,CAACK,EAAE,IAAI,CAAA,EAAG3C,KAAK,IAAImC,KAAK,CAAA;AAAG,KAAA,EAC7EY,IAAI,gBACH7C,KAAA,CAAAC,aAAA,CAAA,GAAA,EAAA;AAAG4C,MAAAA,IAAI,EAAEA,IAAK;AAACK,MAAAA,MAAM,EAAC,QAAQ;AAACC,MAAAA,GAAG,EAAC;AAAY,KAAA,EAAErD,KAAS,CAAC,gBAE3DE,KAAA,CAAAC,aAAA,iBAASH,KAAc,CACxB,eACDE,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAOmC,KAAK,CAACgB,MAAM,EAAC,QAAG,EAAChB,KAAK,CAACiB,SAAgB,CAAC,EAC9CjB,KAAK,CAAC9E,IAAI,iBAAI0C,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA,IAAA,EAAQmC,KAAK,CAAC9E,IAAI,CAACgG,kBAAkB,EAAU,CAC3D,CAAC;EAEV,CAAC,CACE,CACF,CACF,CAAC;AAEV;AAEe,SAASC,0BAA0BA,CAAC;AACjDC,EAAAA,QAAQ,GAAG,+BAA+B;EAC1CC,cAAc;EACdC,WAAW,GAAG,IAAInG,IAAI;AACxB,CAAC,EAAE;EACD,MAAM,CAACX,SAAS,EAAE+G,YAAY,CAAC,GAAGC,cAAQ,CAAC,EAAE,CAAC;EAC9C,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGF,cAAQ,CAAC,IAAI,CAAC;EAC5C,MAAM,CAACG,KAAK,EAAEC,QAAQ,CAAC,GAAGJ,cAAQ,CAAC,EAAE,CAAC;EACtC,MAAM,CAACK,YAAY,EAAEC,eAAe,CAAC,GAAGN,cAAQ,CAAC,CAAC,CAAC;EACnD,MAAM,CAACO,aAAa,EAAEC,gBAAgB,CAAC,GAAGR,cAAQ,CAAC,IAAI,CAAC;AAExDS,EAAAA,eAAS,CAAC,MAAM;IACd,IAAIC,SAAS,GAAG,KAAK;AACrB,IAAA,MAAMC,aAAa,GAAG,YAAY;MAChCT,UAAU,CAAC,IAAI,CAAC;MAChBE,QAAQ,CAAC,EAAE,CAAC;MACZ,IAAI;AACF,QAAA,MAAMQ,MAAM,GAAGf,cAAc,GACzB,MAAMA,cAAc,EAAE,GACtB,MAAMgB,KAAK,CAACjB,QAAQ,EAAE;AAAEkB,UAAAA,OAAO,EAAE;AAAE,YAAA,cAAc,EAAE;AAAmB;AAAE,SAAC,CAAC,CAACC,IAAI,CAAEC,QAAQ,IAAK;AAC9F,UAAA,IAAI,CAACA,QAAQ,CAACC,EAAE,EAAE,MAAM,IAAIC,KAAK,CAAC,CAAA,gBAAA,EAAmBF,QAAQ,CAACG,MAAM,GAAG,CAAC;AACxE,UAAA,OAAOH,QAAQ,CAACI,IAAI,EAAE;AACxB,QAAA,CAAC,CAAC;QACJ,IAAI,CAACV,SAAS,EAAEX,YAAY,CAACpH,YAAY,CAACiI,MAAM,CAAC,CAAC;MACpD,CAAC,CAAC,OAAOS,SAAS,EAAE;QAClB,IAAI,CAACX,SAAS,EAAEN,QAAQ,CAACiB,SAAS,CAACC,OAAO,IAAI,4BAA4B,CAAC;AAC7E,MAAA,CAAC,SAAS;AACR,QAAA,IAAI,CAACZ,SAAS,EAAER,UAAU,CAAC,KAAK,CAAC;AACnC,MAAA;IACF,CAAC;AACDS,IAAAA,aAAa,EAAE;AACf,IAAA,OAAO,MAAM;AAAED,MAAAA,SAAS,GAAG,IAAI;IAAE,CAAC;EACpC,CAAC,EAAE,CAACd,QAAQ,EAAEC,cAAc,EAAEQ,YAAY,CAAC,CAAC;AAE5C,EAAA,MAAMkB,eAAe,GAAGC,aAAO,CAAC,MAAMxI,SAAS,CAC5CyI,MAAM,CAAE1H,QAAQ,IAAKA,QAAQ,CAAC0D,IAAI,KAAK,WAAW,IAAI1D,QAAQ,CAAC2H,YAAY,KAAK,WAAW,IAAI,CAAC3H,QAAQ,CAAC0D,IAAI,CAAC,CAC9GgE,MAAM,CAAE1H,QAAQ,IAAKA,QAAQ,CAAC4H,QAAQ,KAAKlJ,mBAAmB,CAAC,CAC/DsE,GAAG,CAAEhD,QAAQ,KAAM;AAAE,IAAA,GAAGA,QAAQ;AAAEL,IAAAA,IAAI,EAAEI,gBAAgB,CAACC,QAAQ,CAAC;AAAEyF,IAAAA,MAAM,EAAEhF,aAAa,CAACT,QAAQ,CAAC;IAAE0F,SAAS,EAAE7E,gBAAgB,CAACb,QAAQ;GAAG,CAAC,CAAC,CAC9I0H,MAAM,CAAE1H,QAAQ,IAAKA,QAAQ,CAACL,IAAI,IAAI,CAACsB,oBAAoB,CAACjB,QAAQ,CAACL,IAAI,EAAEoG,WAAW,CAAC,CAAC,EAAE,CAAC9G,SAAS,EAAE8G,WAAW,CAAC,CAAC;AAEtH,EAAA,MAAM8B,WAAW,GAAG9B,WAAW,CAAC3E,WAAW,EAAE;AAC7C,EAAA,MAAM0G,KAAK,GAAGL,aAAO,CAAC,MAAM,CAAC,GAAG,IAAIM,GAAG,CAACP,eAAe,CAACxE,GAAG,CAAEyB,KAAK,IAAKA,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC4G,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,GAAGD,CAAC,CAAC,EAAE,CAACT,eAAe,CAAC,CAAC;AAC5I,EAAA,MAAMW,QAAQ,GAAGL,KAAK,CAAC9E,GAAG,CAAEa,IAAI,KAAM;AACpChC,IAAAA,GAAG,EAAEgC,IAAI;IACTA,IAAI;AACJL,IAAAA,MAAM,EAAEgE,eAAe,CAACE,MAAM,CAAEjD,KAAK,IAAKA,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,KAAKyC,IAAI,CAAC,CAACO;AAC/E,GAAC,CAAC,CAAC;AACH,EAAA,MAAMgE,SAAS,GAAG,CAAC,GAAG,IAAIL,GAAG,CAACP,eAAe,CAACxE,GAAG,CAAEyB,KAAK,IAAK,CAAA,EAAGA,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,CAAA,CAAA,EAAIqD,KAAK,CAAC9E,IAAI,CAAC0B,QAAQ,EAAE,CAAA,CAAE,CAAC,CAAC,CAAC,CACnH2B,GAAG,CAAEnB,GAAG,IAAK;AACZ,IAAA,MAAM,CAACgC,IAAI,EAAEwE,UAAU,CAAC,GAAGxG,GAAG,CAACyG,KAAK,CAAC,GAAG,CAAC,CAACtF,GAAG,CAACtD,MAAM,CAAC;IACrD,OAAO;MACLmC,GAAG;MACHgC,IAAI;AACJD,MAAAA,KAAK,EAAEjF,WAAW,CAAC0J,UAAU,CAAC;MAC9BA,UAAU;MACV7E,MAAM,EAAEgE,eAAe,CAACE,MAAM,CAAEjD,KAAK,IAAKA,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,KAAKyC,IAAI,IAAIY,KAAK,CAAC9E,IAAI,CAAC0B,QAAQ,EAAE,KAAKgH,UAAU,CAAC,CAACjE;KACtH;AACH,EAAA,CAAC,CAAC,CACD4D,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACrE,IAAI,GAAGoE,CAAC,CAACpE,IAAI,IAAIlF,WAAW,CAAC4J,OAAO,CAACN,CAAC,CAACrE,KAAK,CAAC,GAAGjF,WAAW,CAAC4J,OAAO,CAACL,CAAC,CAACtE,KAAK,CAAC,CAAC;EACjG,MAAM4E,YAAY,GAAGhH,OAAO,CAACgG,eAAe,EAAG/C,KAAK,IAAKA,KAAK,CAACgB,MAAM,CAAC;AACtE,EAAA,MAAMgD,UAAU,GAAGC,MAAM,CAACC,OAAO,CAACH,YAAY,CAAC,CAC5CxF,GAAG,CAAC,CAAC,CAACyC,MAAM,EAAEjC,MAAM,CAAC,MAAM;AAAE3B,IAAAA,GAAG,EAAE4D,MAAM;IAAEA,MAAM;IAAEjC,MAAM;AAAEoF,IAAAA,KAAK,EAAEpB,eAAe,CAACpD,MAAM,GAAG,CAAA,EAAGtB,IAAI,CAAC+F,KAAK,CAAErF,MAAM,GAAGgE,eAAe,CAACpD,MAAM,GAAI,GAAG,CAAC,GAAG,GAAG;AAAK,GAAC,CAAC,CAAC,CAC9J4D,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAAC1E,MAAM,GAAGyE,CAAC,CAACzE,MAAM,IAAIyE,CAAC,CAACxC,MAAM,CAACqD,aAAa,CAACZ,CAAC,CAACzC,MAAM,CAAC,CAAC;AAC1E,EAAA,MAAMsD,cAAc,GAAGL,MAAM,CAACC,OAAO,CAACH,YAAY,CAAC,CAChDxF,GAAG,CAAC,CAAC,CAACyC,MAAM,CAAC,KAAK;AACjB,IAAA,MAAMxC,GAAG,GAAG;AAAEpB,MAAAA,GAAG,EAAE4D,MAAM;AAAEA,MAAAA;KAAQ;AACnCqC,IAAAA,KAAK,CAACkB,OAAO,CAAEnF,IAAI,IAAK;MACtBZ,GAAG,CAACY,IAAI,CAAC,GAAG2D,eAAe,CAACE,MAAM,CAAEjD,KAAK,IAAKA,KAAK,CAACgB,MAAM,KAAKA,MAAM,IAAIhB,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,KAAKyC,IAAI,CAAC,CAACO,MAAM;AACpH,IAAA,CAAC,CAAC;AACFnB,IAAAA,GAAG,CAACgG,KAAK,GAAGT,YAAY,CAAC/C,MAAM,CAAC;AAChC,IAAA,OAAOxC,GAAG;EACZ,CAAC,CAAC,CACD+E,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACe,KAAK,GAAGhB,CAAC,CAACgB,KAAK,IAAIhB,CAAC,CAACxC,MAAM,CAACqD,aAAa,CAACZ,CAAC,CAACzC,MAAM,CAAC,CAAC;EACxE,MAAMyD,eAAe,GAAGd,SAAS,CAACe,OAAO,CAAEC,QAAQ,IAAKV,MAAM,CAACC,OAAO,CAACH,YAAY,CAAC,CACjFxF,GAAG,CAAC,CAAC,CAACyC,MAAM,CAAC,MAAM;AAClB5D,IAAAA,GAAG,EAAE,CAAA,EAAGuH,QAAQ,CAACvH,GAAG,CAAA,CAAA,EAAI4D,MAAM,CAAA,CAAE;IAChC5B,IAAI,EAAEuF,QAAQ,CAACvF,IAAI;IACnBD,KAAK,EAAEwF,QAAQ,CAACxF,KAAK;IACrB6B,MAAM;AACNjC,IAAAA,MAAM,EAAEgE,eAAe,CAACE,MAAM,CAAEjD,KAAK,IAAKA,KAAK,CAACgB,MAAM,KAAKA,MAAM,IAC5DhB,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,KAAKgI,QAAQ,CAACvF,IAAI,IAC1CY,KAAK,CAAC9E,IAAI,CAAC0B,QAAQ,EAAE,KAAK1C,WAAW,CAAC4J,OAAO,CAACa,QAAQ,CAACxF,KAAK,CAAC,CAAC,CAACQ;AACtE,GAAC,CAAC,CAAC,CACFsD,MAAM,CAAEzE,GAAG,IAAKA,GAAG,CAACO,MAAM,GAAG,CAAC,CAAC,CAAC;EACnC,MAAM6F,eAAe,GAAG7H,OAAO,CAACgG,eAAe,EAAG/C,KAAK,IAAKA,KAAK,CAACiB,SAAS,CAAC;AAC5E,EAAA,MAAM4D,YAAY,GAAGZ,MAAM,CAACC,OAAO,CAACU,eAAe,CAAC,CAACrB,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAAC,CAAC,CAAC,GAAGD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACnF,MAAMsB,aAAa,GAAGd,UAAU,CAAC1E,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;EAE5C,oBACE1B,KAAA,CAAAC,aAAA,CAAA,SAAA,EAAA;AAASC,IAAAA,SAAS,EAAC;GAAqB,eACtCF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAkB,eAC/BF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA,IAAA,eACED,KAAA,CAAAC,aAAA,aAAI,+BAAiC,CAAC,eACtCD,KAAA,CAAAC,aAAA,CAAA,GAAA,EAAA,IAAA,EAAG,0DAA2D,CAAC,eAC/DD,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA;AAAOC,IAAAA,SAAS,EAAC;AAAkB,GAAA,EAAC,UAAQ,eAAAF,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAOuD,QAAe,CAAC,EAAA,6BAA+B,CAC/F,CAAC,eACNxD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAA0B,GAAA,EACtC2D,OAAO,iBAAI7D,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMC,IAAAA,SAAS,EAAC;GAAkB,EAAC,YAAgB,CAAC,EAC/D,CAAC2D,OAAO,iBAAI7D,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQoB,IAAAA,IAAI,EAAC,QAAQ;AAACnB,IAAAA,SAAS,EAAC,mBAAmB;IAACoB,OAAO,EAAEA,MAAM4C,eAAe,CAAEtG,KAAK,IAAKA,KAAK,GAAG,CAAC;GAAE,EAAC,cAAoB,CACxI,CACF,CAAC,EACLmG,KAAK,iBAAI/D,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC,iBAAiB;AAACkB,IAAAA,IAAI,EAAC;AAAO,GAAA,EAAE2C,KAAW,CAAC,EACpE,CAACF,OAAO,iBACP7D,KAAA,CAAAC,aAAA,CAAAD,KAAA,CAAAmH,QAAA,EAAA,IAAA,eACEnH,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAwB,GAAA,eACrCF,KAAA,CAAAC,aAAA,CAACJ,WAAW,EAAA;AAACC,IAAAA,KAAK,EAAC,sBAAsB;AAAClC,IAAAA,KAAK,EAAE6B,YAAY,CAAC0F,eAAe,CAACpD,MAAM;AAAE,GAAE,CAAC,eACzF/B,KAAA,CAAAC,aAAA,CAACJ,WAAW,EAAA;AAACC,IAAAA,KAAK,EAAC,SAAS;IAAClC,KAAK,EAAE6B,YAAY,CAAC4G,MAAM,CAACe,IAAI,CAACjB,YAAY,CAAC,CAACpE,MAAM;AAAE,GAAE,CAAC,eACtF/B,KAAA,CAAAC,aAAA,CAACJ,WAAW,EAAA;IAACC,KAAK,EAAE,CAAA,EAAG0F,WAAW,CAAA,OAAA,CAAU;AAAC5H,IAAAA,KAAK,EAAE6B,YAAY,CAACqG,QAAQ,CAACuB,IAAI,CAAEzG,GAAG,IAAKA,GAAG,CAACY,IAAI,KAAKgE,WAAW,CAAC,EAAErE,MAAM,IAAI,CAAC;AAAE,GAAE,CAAC,eACnInB,KAAA,CAAAC,aAAA,CAACJ,WAAW,EAAA;AAACC,IAAAA,KAAK,EAAC,eAAe;AAAClC,IAAAA,KAAK,EAAEqJ,YAAY,GAAG,CAAC,CAAC,IAAI,GAAI;AAAClH,IAAAA,MAAM,EAAEkH,YAAY,GAAG,CAAA,EAAGxH,YAAY,CAACwH,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA,OAAA,CAAS,GAAG;AAAG,GAAE,CACzI,CAAC,eACNjH,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAgB,eAC7BF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,0BAA4B,CAAC,eACjCD,KAAA,CAAAC,aAAA,CAACE,QAAQ,EAAA;AAACC,IAAAA,IAAI,EAAE0F,QAAS;AAACzF,IAAAA,QAAQ,EAAC,MAAM;AAACC,IAAAA,QAAQ,EAAC;AAAQ,GAAE,CAC1D,CAAC,eACNN,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,aAAe,CAAC,eACpBD,KAAA,CAAAC,aAAA,CAACE,QAAQ,EAAA;AAACC,IAAAA,IAAI,EAAE8G,aAAc;AAAC7G,IAAAA,QAAQ,EAAC,QAAQ;AAACC,IAAAA,QAAQ,EAAC,QAAQ;AAACC,IAAAA,KAAK,EAAC;AAAS,GAAE,CACjF,CACF,CAAC,eACNP,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;AAAiB,GAAA,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,eAAiB,CAAC,EACrB8F,SAAS,CAAChE,MAAM,gBAAG/B,KAAA,CAAAC,aAAA,CAACgB,YAAY,EAAA;AAACb,IAAAA,IAAI,EAAE2F,SAAU;AAAC7E,IAAAA,YAAY,EAAEkD;AAAiB,GAAE,CAAC,gBAAGpE,KAAA,CAAAC,aAAA,CAAA,GAAA,EAAA;AAAGC,IAAAA,SAAS,EAAC;AAAiB,GAAA,EAAC,4BAA6B,CACjJ,CAAC,eACNF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAgB,eAC7BF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,gBAAkB,CAAC,eACvBD,KAAA,CAAAC,aAAA,CAAC0B,cAAc,EAAA;AAACC,IAAAA,OAAO,EAAE,CACvB;AAAEpC,MAAAA,GAAG,EAAE,MAAM;AAAEM,MAAAA,KAAK,EAAE;AAAO,KAAC,EAC9B;AAAEN,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE,aAAa;AAAEoC,MAAAA,MAAM,EAAGtB,GAAG,IAAKnB,YAAY,CAACmB,GAAG,CAACO,MAAM;AAAE,KAAC,CAClF;AAACf,IAAAA,IAAI,EAAE0F;AAAS,GAAE,CACjB,CAAC,eACN9F,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,iBAAmB,CAAC,eACxBD,KAAA,CAAAC,aAAA,CAAC0B,cAAc,EAAA;AAACC,IAAAA,OAAO,EAAE,CACvB;AAAEpC,MAAAA,GAAG,EAAE,MAAM;AAAEM,MAAAA,KAAK,EAAE;AAAO,KAAC,EAC9B;AAAEN,MAAAA,GAAG,EAAE,OAAO;AAAEM,MAAAA,KAAK,EAAE,OAAO;AAAEoC,MAAAA,MAAM,EAAGtB,GAAG,iBAC1CZ,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQoB,QAAAA,IAAI,EAAC,QAAQ;AAACnB,QAAAA,SAAS,EAAC,uBAAuB;AAACoB,QAAAA,OAAO,EAAEA,MAAM8C,gBAAgB,CAACxD,GAAG;OAAE,EAAEA,GAAG,CAACW,KAAK,EAAC,GAAC,EAACX,GAAG,CAACY,IAAa;AAC5H,KAAC,EACH;AAAEhC,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE,aAAa;AAAEoC,MAAAA,MAAM,EAAGtB,GAAG,IAAKnB,YAAY,CAACmB,GAAG,CAACO,MAAM;AAAE,KAAC,CAClF;AAACf,IAAAA,IAAI,EAAE2F;AAAU,GAAE,CAClB,CACF,CAAC,eACN/F,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,kBAAoB,CAAC,eACzBD,KAAA,CAAAC,aAAA,CAAC0B,cAAc,EAAA;AAACC,IAAAA,OAAO,EAAE,CACvB;AAAEpC,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE;AAAS,KAAC,EAClC;AAAEN,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE,aAAa;AAAEoC,MAAAA,MAAM,EAAGtB,GAAG,IAAKnB,YAAY,CAACmB,GAAG,CAACO,MAAM;AAAE,KAAC,EAClF;AAAE3B,MAAAA,GAAG,EAAE,OAAO;AAAEM,MAAAA,KAAK,EAAE;AAA4B,KAAC,CACpD;AAACM,IAAAA,IAAI,EAAEgG;AAAW,GAAE,CACnB,CAAC,eACNpG,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAgB,eAC7BF,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,gCAAkC,CAAC,eACvCD,KAAA,CAAAC,aAAA,CAAC0B,cAAc,EAAA;AAACC,IAAAA,OAAO,EAAE,CACvB;AAAEpC,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE;AAAS,KAAC,EAClC,GAAG2F,KAAK,CAAC9E,GAAG,CAAEa,IAAI,KAAM;AAAEhC,MAAAA,GAAG,EAAEgC,IAAI;AAAE1B,MAAAA,KAAK,EAAEwH,MAAM,CAAC9F,IAAI,CAAC;MAAEU,MAAM,EAAGtB,GAAG,IAAKnB,YAAY,CAACmB,GAAG,CAACY,IAAI,CAAC;KAAG,CAAC,CAAC,EACtG;AAAEhC,MAAAA,GAAG,EAAE,OAAO;AAAEM,MAAAA,KAAK,EAAE,OAAO;AAAEoC,MAAAA,MAAM,EAAGtB,GAAG,IAAKnB,YAAY,CAACmB,GAAG,CAACgG,KAAK;AAAE,KAAC,CAC1E;AAACxG,IAAAA,IAAI,EAAEsG;AAAe,GAAE,CACvB,CAAC,eACN1G,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKC,IAAAA,SAAS,EAAC;GAAiB,eAC9BF,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAI,iCAAmC,CAAC,eACxCD,KAAA,CAAAC,aAAA,CAAC0B,cAAc,EAAA;AAACC,IAAAA,OAAO,EAAE,CACvB;AAAEpC,MAAAA,GAAG,EAAE,MAAM;AAAEM,MAAAA,KAAK,EAAE;AAAO,KAAC,EAC9B;AAAEN,MAAAA,GAAG,EAAE,OAAO;AAAEM,MAAAA,KAAK,EAAE;AAAQ,KAAC,EAChC;AAAEN,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE;AAAS,KAAC,EAClC;AAAEN,MAAAA,GAAG,EAAE,QAAQ;AAAEM,MAAAA,KAAK,EAAE,aAAa;AAAEoC,MAAAA,MAAM,EAAGtB,GAAG,IAAKnB,YAAY,CAACmB,GAAG,CAACO,MAAM;AAAE,KAAC,CAClF;AAACf,IAAAA,IAAI,EAAEyG;GAAkB,CACxB,CACF,CAAC,eACN7G,KAAA,CAAAC,aAAA,CAAC6C,iBAAiB,EAAA;AAChBvB,IAAAA,KAAK,EAAE4C,aAAc;AACrBhD,IAAAA,MAAM,EAAEgD,aAAa,GAAGgB,eAAe,CAACE,MAAM,CAAEjD,KAAK,IAAKA,KAAK,CAAC9E,IAAI,CAACyB,WAAW,EAAE,KAAKoF,aAAa,CAAC3C,IAAI,IAAIY,KAAK,CAAC9E,IAAI,CAAC0B,QAAQ,EAAE,KAAKmF,aAAa,CAAC6B,UAAU,CAAC,GAAG,EAAG;AACtKjD,IAAAA,OAAO,EAAEA,MAAMqB,gBAAgB,CAAC,IAAI;GACrC,CACD,CAEG,CAAC;AAEd;;;;;"}
@@ -1,412 +0,0 @@
1
- import React__default, { useState, useEffect, useMemo } from 'react';
2
-
3
- const COMPLETED_STATUS_ID = "3a861ce5-dfd5-451d-81f3-7e90788eff18";
4
- const MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
5
- function getDocuments(payload) {
6
- if (Array.isArray(payload)) return payload;
7
- if (Array.isArray(payload?.data)) return payload.data;
8
- if (Array.isArray(payload?.documents)) return payload.documents;
9
- if (Array.isArray(payload?.items)) return payload.items;
10
- if (Array.isArray(payload?.results)) return payload.results;
11
- return [];
12
- }
13
- function parseDateValue(raw) {
14
- if (raw === undefined || raw === null || raw === "") return null;
15
- const timestamp = typeof raw === "number" ? raw >= 1e12 ? raw : raw * 1000 : typeof raw === "string" && /^\d+$/.test(raw.trim()) ? Number(raw) >= 1e12 ? Number(raw) : Number(raw) * 1000 : raw;
16
- const date = new Date(timestamp);
17
- return Number.isNaN(date.getTime()) ? null : date;
18
- }
19
- function getWorkOrderDate(document) {
20
- const value = document.completedAt || document.completedDate || document.createdAt || document.createdOn || document.creationDate || document.date || document.startDate || document.updatedAt;
21
- return parseDateValue(value);
22
- }
23
- function getClientName(document) {
24
- return document.clientLabel || document.clientName || document.clientId || "Unknown client";
25
- }
26
- function getTherapistName(document) {
27
- return document.therapistLabel || document.therapistName || document.therapistId || "Unknown therapist";
28
- }
29
- function isFutureCalendarDate(date, referenceDate) {
30
- const dateKey = date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();
31
- const referenceKey = referenceDate.getFullYear() * 10000 + (referenceDate.getMonth() + 1) * 100 + referenceDate.getDate();
32
- return dateKey > referenceKey;
33
- }
34
- function countBy(items, getKey) {
35
- return items.reduce((counts, item) => {
36
- const key = getKey(item);
37
- counts[key] = (counts[key] || 0) + 1;
38
- return counts;
39
- }, {});
40
- }
41
- function formatNumber(value) {
42
- return new Intl.NumberFormat().format(value);
43
- }
44
- function SummaryCard({
45
- label,
46
- value,
47
- detail
48
- }) {
49
- return /*#__PURE__*/React__default.createElement("div", {
50
- className: "analytics-summary-card"
51
- }, /*#__PURE__*/React__default.createElement("span", {
52
- className: "analytics-summary-label"
53
- }, label), /*#__PURE__*/React__default.createElement("strong", {
54
- className: "analytics-summary-value"
55
- }, value), detail && /*#__PURE__*/React__default.createElement("span", {
56
- className: "analytics-summary-detail"
57
- }, detail));
58
- }
59
- function BarChart({
60
- rows,
61
- labelKey,
62
- valueKey,
63
- color = "#2995A3"
64
- }) {
65
- const maximum = Math.max(...rows.map(row => row[valueKey]), 1);
66
- return /*#__PURE__*/React__default.createElement("div", {
67
- className: "analytics-bar-chart"
68
- }, rows.map(row => /*#__PURE__*/React__default.createElement("div", {
69
- className: "analytics-bar-row",
70
- key: row.key || row[labelKey]
71
- }, /*#__PURE__*/React__default.createElement("span", {
72
- className: "analytics-bar-label",
73
- title: row[labelKey]
74
- }, row[labelKey]), /*#__PURE__*/React__default.createElement("span", {
75
- className: "analytics-bar-track"
76
- }, /*#__PURE__*/React__default.createElement("span", {
77
- className: "analytics-bar-fill",
78
- style: {
79
- width: `${row[valueKey] / maximum * 100}%`,
80
- backgroundColor: color
81
- }
82
- })), /*#__PURE__*/React__default.createElement("strong", null, formatNumber(row[valueKey])))));
83
- }
84
- function MonthlyChart({
85
- rows,
86
- onMonthClick
87
- }) {
88
- const maximum = Math.max(...rows.map(row => row.orders), 1);
89
- return /*#__PURE__*/React__default.createElement("div", {
90
- className: "analytics-month-chart",
91
- role: "img",
92
- "aria-label": "Completed WorkOrders by month"
93
- }, rows.map(row => /*#__PURE__*/React__default.createElement("button", {
94
- type: "button",
95
- className: "analytics-month-column",
96
- key: row.key,
97
- onClick: () => onMonthClick(row),
98
- title: `Open ${row.month} ${row.year} details`
99
- }, /*#__PURE__*/React__default.createElement("span", {
100
- className: "analytics-month-value"
101
- }, row.orders), /*#__PURE__*/React__default.createElement("span", {
102
- className: "analytics-month-bar",
103
- style: {
104
- height: `${Math.max(row.orders / maximum * 100, 3)}%`
105
- }
106
- }), /*#__PURE__*/React__default.createElement("span", {
107
- className: "analytics-month-label"
108
- }, row.month.slice(0, 3), " ", row.year))));
109
- }
110
- function AnalyticsTable({
111
- columns,
112
- rows,
113
- emptyMessage = "No completed WorkOrders found."
114
- }) {
115
- return /*#__PURE__*/React__default.createElement("div", {
116
- className: "analytics-table-wrap"
117
- }, /*#__PURE__*/React__default.createElement("table", {
118
- className: "analytics-table"
119
- }, /*#__PURE__*/React__default.createElement("thead", null, /*#__PURE__*/React__default.createElement("tr", null, columns.map(column => /*#__PURE__*/React__default.createElement("th", {
120
- key: column.key
121
- }, column.label)))), /*#__PURE__*/React__default.createElement("tbody", null, rows.length === 0 ? /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
122
- colSpan: columns.length,
123
- className: "analytics-empty"
124
- }, emptyMessage)) : rows.map((row, index) => /*#__PURE__*/React__default.createElement("tr", {
125
- key: row.key || index
126
- }, columns.map(column => /*#__PURE__*/React__default.createElement("td", {
127
- key: column.key
128
- }, column.render ? column.render(row) : row[column.key])))))));
129
- }
130
- function getWorkOrderLabel(order) {
131
- return order.workOrderLabel || order.documentNumber || order.orderNumber || order.name || order.id || "WorkOrder";
132
- }
133
- function getWorkOrderHref(order) {
134
- return order.url || order.link || order.href || (order.id ? `/work-orders/${order.id}` : null);
135
- }
136
- function MonthDetailsModal({
137
- month,
138
- orders,
139
- onClose
140
- }) {
141
- if (!month) return null;
142
- return /*#__PURE__*/React__default.createElement("div", {
143
- className: "analytics-modal-backdrop",
144
- role: "presentation",
145
- onClick: onClose
146
- }, /*#__PURE__*/React__default.createElement("div", {
147
- className: "analytics-modal",
148
- role: "dialog",
149
- "aria-modal": "true",
150
- "aria-labelledby": "month-details-title",
151
- onClick: event => event.stopPropagation()
152
- }, /*#__PURE__*/React__default.createElement("div", {
153
- className: "analytics-modal-header"
154
- }, /*#__PURE__*/React__default.createElement("h3", {
155
- id: "month-details-title"
156
- }, month.month, " ", month.year, " WorkOrders"), /*#__PURE__*/React__default.createElement("button", {
157
- type: "button",
158
- className: "analytics-modal-close",
159
- onClick: onClose,
160
- "aria-label": "Close"
161
- }, "\xD7")), /*#__PURE__*/React__default.createElement("p", null, orders.length, " completed WorkOrder", orders.length === 1 ? "" : "s", " in this month."), /*#__PURE__*/React__default.createElement("div", {
162
- className: "analytics-modal-list"
163
- }, orders.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
164
- className: "analytics-empty"
165
- }, "No WorkOrders found.") : orders.map((order, index) => {
166
- const href = getWorkOrderHref(order);
167
- const label = getWorkOrderLabel(order);
168
- return /*#__PURE__*/React__default.createElement("div", {
169
- className: "analytics-work-order-item",
170
- key: order.id || `${label}-${index}`
171
- }, href ? /*#__PURE__*/React__default.createElement("a", {
172
- href: href,
173
- target: "_blank",
174
- rel: "noreferrer"
175
- }, label) : /*#__PURE__*/React__default.createElement("strong", null, label), /*#__PURE__*/React__default.createElement("span", null, order.client, " \xB7 ", order.therapist), order.date && /*#__PURE__*/React__default.createElement("small", null, order.date.toLocaleDateString()));
176
- }))));
177
- }
178
- function WorkOrderAnalyticsByClient({
179
- endpoint = "/api/documents?type=WorkOrder",
180
- fetchDocuments,
181
- currentDate = new Date()
182
- }) {
183
- const [documents, setDocuments] = useState([]);
184
- const [loading, setLoading] = useState(true);
185
- const [error, setError] = useState("");
186
- const [refreshToken, setRefreshToken] = useState(0);
187
- const [selectedMonth, setSelectedMonth] = useState(null);
188
- useEffect(() => {
189
- let cancelled = false;
190
- const loadDocuments = async () => {
191
- setLoading(true);
192
- setError("");
193
- try {
194
- const result = fetchDocuments ? await fetchDocuments() : await fetch(endpoint, {
195
- headers: {
196
- "Content-Type": "application/json"
197
- }
198
- }).then(response => {
199
- if (!response.ok) throw new Error(`Request failed (${response.status})`);
200
- return response.json();
201
- });
202
- if (!cancelled) setDocuments(getDocuments(result));
203
- } catch (loadError) {
204
- if (!cancelled) setError(loadError.message || "Unable to load WorkOrders.");
205
- } finally {
206
- if (!cancelled) setLoading(false);
207
- }
208
- };
209
- loadDocuments();
210
- return () => {
211
- cancelled = true;
212
- };
213
- }, [endpoint, fetchDocuments, refreshToken]);
214
- const completedOrders = useMemo(() => documents.filter(document => document.type === "WorkOrder" || document.documentType === "WorkOrder" || !document.type).filter(document => document.statusId === COMPLETED_STATUS_ID).map(document => ({
215
- ...document,
216
- date: getWorkOrderDate(document),
217
- client: getClientName(document),
218
- therapist: getTherapistName(document)
219
- })).filter(document => document.date && !isFutureCalendarDate(document.date, currentDate)), [documents, currentDate]);
220
- const currentYear = currentDate.getFullYear();
221
- const years = useMemo(() => [...new Set(completedOrders.map(order => order.date.getFullYear()))].sort((a, b) => b - a), [completedOrders]);
222
- const yearRows = years.map(year => ({
223
- key: year,
224
- year,
225
- orders: completedOrders.filter(order => order.date.getFullYear() === year).length
226
- }));
227
- const monthRows = [...new Set(completedOrders.map(order => `${order.date.getFullYear()}-${order.date.getMonth()}`))].map(key => {
228
- const [year, monthIndex] = key.split("-").map(Number);
229
- return {
230
- key,
231
- year,
232
- month: MONTH_NAMES[monthIndex],
233
- monthIndex,
234
- orders: completedOrders.filter(order => order.date.getFullYear() === year && order.date.getMonth() === monthIndex).length
235
- };
236
- }).sort((a, b) => b.year - a.year || MONTH_NAMES.indexOf(a.month) - MONTH_NAMES.indexOf(b.month));
237
- const clientCounts = countBy(completedOrders, order => order.client);
238
- const clientRows = Object.entries(clientCounts).map(([client, orders]) => ({
239
- key: client,
240
- client,
241
- orders,
242
- share: completedOrders.length ? `${Math.round(orders / completedOrders.length * 100)}%` : "0%"
243
- })).sort((a, b) => b.orders - a.orders || a.client.localeCompare(b.client));
244
- const clientYearRows = Object.entries(clientCounts).map(([client]) => {
245
- const row = {
246
- key: client,
247
- client
248
- };
249
- years.forEach(year => {
250
- row[year] = completedOrders.filter(order => order.client === client && order.date.getFullYear() === year).length;
251
- });
252
- row.total = clientCounts[client];
253
- return row;
254
- }).sort((a, b) => b.total - a.total || a.client.localeCompare(b.client));
255
- const clientMonthRows = monthRows.flatMap(monthRow => Object.entries(clientCounts).map(([client]) => ({
256
- key: `${monthRow.key}-${client}`,
257
- year: monthRow.year,
258
- month: monthRow.month,
259
- client,
260
- orders: completedOrders.filter(order => order.client === client && order.date.getFullYear() === monthRow.year && order.date.getMonth() === MONTH_NAMES.indexOf(monthRow.month)).length
261
- })).filter(row => row.orders > 0));
262
- const therapistCounts = countBy(completedOrders, order => order.therapist);
263
- const topTherapist = Object.entries(therapistCounts).sort((a, b) => b[1] - a[1])[0];
264
- const topClientRows = clientRows.slice(0, 8);
265
- return /*#__PURE__*/React__default.createElement("section", {
266
- className: "analytics-by-client"
267
- }, /*#__PURE__*/React__default.createElement("div", {
268
- className: "analytics-header"
269
- }, /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement("h2", null, "WorkOrder analytics by client"), /*#__PURE__*/React__default.createElement("p", null, "Completed WorkOrders grouped by client, year, and month."), /*#__PURE__*/React__default.createElement("small", {
270
- className: "analytics-source"
271
- }, "Source: ", /*#__PURE__*/React__default.createElement("code", null, endpoint), " \xB7 Completed status only")), /*#__PURE__*/React__default.createElement("div", {
272
- className: "analytics-header-actions"
273
- }, loading && /*#__PURE__*/React__default.createElement("span", {
274
- className: "analytics-status"
275
- }, "Loading..."), !loading && /*#__PURE__*/React__default.createElement("button", {
276
- type: "button",
277
- className: "analytics-refresh",
278
- onClick: () => setRefreshToken(value => value + 1)
279
- }, "Refresh data"))), error && /*#__PURE__*/React__default.createElement("div", {
280
- className: "analytics-error",
281
- role: "alert"
282
- }, error), !loading && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
283
- className: "analytics-summary-grid"
284
- }, /*#__PURE__*/React__default.createElement(SummaryCard, {
285
- label: "Completed WorkOrders",
286
- value: formatNumber(completedOrders.length)
287
- }), /*#__PURE__*/React__default.createElement(SummaryCard, {
288
- label: "Clients",
289
- value: formatNumber(Object.keys(clientCounts).length)
290
- }), /*#__PURE__*/React__default.createElement(SummaryCard, {
291
- label: `${currentYear} orders`,
292
- value: formatNumber(yearRows.find(row => row.year === currentYear)?.orders || 0)
293
- }), /*#__PURE__*/React__default.createElement(SummaryCard, {
294
- label: "Top therapist",
295
- value: topTherapist?.[0] || "-",
296
- detail: topTherapist ? `${formatNumber(topTherapist[1])} orders` : ""
297
- })), /*#__PURE__*/React__default.createElement("div", {
298
- className: "analytics-grid"
299
- }, /*#__PURE__*/React__default.createElement("div", {
300
- className: "analytics-panel"
301
- }, /*#__PURE__*/React__default.createElement("h3", null, "Completed orders by year"), /*#__PURE__*/React__default.createElement(BarChart, {
302
- rows: yearRows,
303
- labelKey: "year",
304
- valueKey: "orders"
305
- })), /*#__PURE__*/React__default.createElement("div", {
306
- className: "analytics-panel"
307
- }, /*#__PURE__*/React__default.createElement("h3", null, "Top clients"), /*#__PURE__*/React__default.createElement(BarChart, {
308
- rows: topClientRows,
309
- labelKey: "client",
310
- valueKey: "orders",
311
- color: "#646cff"
312
- }))), /*#__PURE__*/React__default.createElement("div", {
313
- className: "analytics-panel"
314
- }, /*#__PURE__*/React__default.createElement("h3", null, "Monthly trend"), monthRows.length ? /*#__PURE__*/React__default.createElement(MonthlyChart, {
315
- rows: monthRows,
316
- onMonthClick: setSelectedMonth
317
- }) : /*#__PURE__*/React__default.createElement("p", {
318
- className: "analytics-empty"
319
- }, "No monthly data available.")), /*#__PURE__*/React__default.createElement("div", {
320
- className: "analytics-grid"
321
- }, /*#__PURE__*/React__default.createElement("div", {
322
- className: "analytics-panel"
323
- }, /*#__PURE__*/React__default.createElement("h3", null, "Totals by year"), /*#__PURE__*/React__default.createElement(AnalyticsTable, {
324
- columns: [{
325
- key: "year",
326
- label: "Year"
327
- }, {
328
- key: "orders",
329
- label: "Work orders",
330
- render: row => formatNumber(row.orders)
331
- }],
332
- rows: yearRows
333
- })), /*#__PURE__*/React__default.createElement("div", {
334
- className: "analytics-panel"
335
- }, /*#__PURE__*/React__default.createElement("h3", null, "Totals by month"), /*#__PURE__*/React__default.createElement(AnalyticsTable, {
336
- columns: [{
337
- key: "year",
338
- label: "Year"
339
- }, {
340
- key: "month",
341
- label: "Month",
342
- render: row => /*#__PURE__*/React__default.createElement("button", {
343
- type: "button",
344
- className: "analytics-date-button",
345
- onClick: () => setSelectedMonth(row)
346
- }, row.month, " ", row.year)
347
- }, {
348
- key: "orders",
349
- label: "Work orders",
350
- render: row => formatNumber(row.orders)
351
- }],
352
- rows: monthRows
353
- }))), /*#__PURE__*/React__default.createElement("div", {
354
- className: "analytics-panel"
355
- }, /*#__PURE__*/React__default.createElement("h3", null, "Totals by client"), /*#__PURE__*/React__default.createElement(AnalyticsTable, {
356
- columns: [{
357
- key: "client",
358
- label: "Client"
359
- }, {
360
- key: "orders",
361
- label: "Work orders",
362
- render: row => formatNumber(row.orders)
363
- }, {
364
- key: "share",
365
- label: "Share of completed orders"
366
- }],
367
- rows: clientRows
368
- })), /*#__PURE__*/React__default.createElement("div", {
369
- className: "analytics-grid"
370
- }, /*#__PURE__*/React__default.createElement("div", {
371
- className: "analytics-panel"
372
- }, /*#__PURE__*/React__default.createElement("h3", null, "Work orders per client by year"), /*#__PURE__*/React__default.createElement(AnalyticsTable, {
373
- columns: [{
374
- key: "client",
375
- label: "Client"
376
- }, ...years.map(year => ({
377
- key: year,
378
- label: String(year),
379
- render: row => formatNumber(row[year])
380
- })), {
381
- key: "total",
382
- label: "Total",
383
- render: row => formatNumber(row.total)
384
- }],
385
- rows: clientYearRows
386
- })), /*#__PURE__*/React__default.createElement("div", {
387
- className: "analytics-panel"
388
- }, /*#__PURE__*/React__default.createElement("h3", null, "Work orders per client by month"), /*#__PURE__*/React__default.createElement(AnalyticsTable, {
389
- columns: [{
390
- key: "year",
391
- label: "Year"
392
- }, {
393
- key: "month",
394
- label: "Month"
395
- }, {
396
- key: "client",
397
- label: "Client"
398
- }, {
399
- key: "orders",
400
- label: "Work orders",
401
- render: row => formatNumber(row.orders)
402
- }],
403
- rows: clientMonthRows
404
- }))), /*#__PURE__*/React__default.createElement(MonthDetailsModal, {
405
- month: selectedMonth,
406
- orders: selectedMonth ? completedOrders.filter(order => order.date.getFullYear() === selectedMonth.year && order.date.getMonth() === selectedMonth.monthIndex) : [],
407
- onClose: () => setSelectedMonth(null)
408
- })));
409
- }
410
-
411
- export { COMPLETED_STATUS_ID, WorkOrderAnalyticsByClient as default };
412
- //# sourceMappingURL=WorkOrderAnalyticsByClient.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkOrderAnalyticsByClient.esm.js","sources":["../src/components/WorkOrderAnalyticsByClient.jsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\r\n\r\nconst COMPLETED_STATUS_ID = \"3a861ce5-dfd5-451d-81f3-7e90788eff18\";\r\nconst MONTH_NAMES = [\r\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\r\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\r\n];\r\n\r\nfunction getDocuments(payload) {\r\n if (Array.isArray(payload)) return payload;\r\n if (Array.isArray(payload?.data)) return payload.data;\r\n if (Array.isArray(payload?.documents)) return payload.documents;\r\n if (Array.isArray(payload?.items)) return payload.items;\r\n if (Array.isArray(payload?.results)) return payload.results;\r\n return [];\r\n}\r\n\r\nfunction parseDateValue(raw) {\r\n if (raw === undefined || raw === null || raw === \"\") return null;\r\n const timestamp = typeof raw === \"number\"\r\n ? (raw >= 1e12 ? raw : raw * 1000)\r\n : (typeof raw === \"string\" && /^\\d+$/.test(raw.trim())\r\n ? (Number(raw) >= 1e12 ? Number(raw) : Number(raw) * 1000)\r\n : raw);\r\n const date = new Date(timestamp);\r\n return Number.isNaN(date.getTime()) ? null : date;\r\n}\r\n\r\nfunction getWorkOrderDate(document) {\r\n const value = document.completedAt || document.completedDate || document.createdAt\r\n || document.createdOn || document.creationDate || document.date || document.startDate || document.updatedAt;\r\n return parseDateValue(value);\r\n}\r\n\r\nfunction getClientName(document) {\r\n return document.clientLabel || document.clientName || document.clientId || \"Unknown client\";\r\n}\r\n\r\nfunction getTherapistName(document) {\r\n return document.therapistLabel || document.therapistName || document.therapistId || \"Unknown therapist\";\r\n}\r\n\r\nfunction isFutureCalendarDate(date, referenceDate) {\r\n const dateKey = date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\r\n const referenceKey = referenceDate.getFullYear() * 10000\r\n + (referenceDate.getMonth() + 1) * 100\r\n + referenceDate.getDate();\r\n return dateKey > referenceKey;\r\n}\r\n\r\nfunction countBy(items, getKey) {\r\n return items.reduce((counts, item) => {\r\n const key = getKey(item);\r\n counts[key] = (counts[key] || 0) + 1;\r\n return counts;\r\n }, {});\r\n}\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat().format(value);\r\n}\r\n\r\nfunction SummaryCard({ label, value, detail }) {\r\n return (\r\n <div className=\"analytics-summary-card\">\r\n <span className=\"analytics-summary-label\">{label}</span>\r\n <strong className=\"analytics-summary-value\">{value}</strong>\r\n {detail && <span className=\"analytics-summary-detail\">{detail}</span>}\r\n </div>\r\n );\r\n}\r\n\r\nfunction BarChart({ rows, labelKey, valueKey, color = \"#2995A3\" }) {\r\n const maximum = Math.max(...rows.map((row) => row[valueKey]), 1);\r\n return (\r\n <div className=\"analytics-bar-chart\">\r\n {rows.map((row) => (\r\n <div className=\"analytics-bar-row\" key={row.key || row[labelKey]}>\r\n <span className=\"analytics-bar-label\" title={row[labelKey]}>{row[labelKey]}</span>\r\n <span className=\"analytics-bar-track\">\r\n <span className=\"analytics-bar-fill\" style={{ width: `${(row[valueKey] / maximum) * 100}%`, backgroundColor: color }} />\r\n </span>\r\n <strong>{formatNumber(row[valueKey])}</strong>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction MonthlyChart({ rows, onMonthClick }) {\r\n const maximum = Math.max(...rows.map((row) => row.orders), 1);\r\n return (\r\n <div className=\"analytics-month-chart\" role=\"img\" aria-label=\"Completed WorkOrders by month\">\r\n {rows.map((row) => (\r\n <button type=\"button\" className=\"analytics-month-column\" key={row.key} onClick={() => onMonthClick(row)} title={`Open ${row.month} ${row.year} details`}>\r\n <span className=\"analytics-month-value\">{row.orders}</span>\r\n <span className=\"analytics-month-bar\" style={{ height: `${Math.max((row.orders / maximum) * 100, 3)}%` }} />\r\n <span className=\"analytics-month-label\">{row.month.slice(0, 3)} {row.year}</span>\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nfunction AnalyticsTable({ columns, rows, emptyMessage = \"No completed WorkOrders found.\" }) {\r\n return (\r\n <div className=\"analytics-table-wrap\">\r\n <table className=\"analytics-table\">\r\n <thead>\r\n <tr>{columns.map((column) => <th key={column.key}>{column.label}</th>)}</tr>\r\n </thead>\r\n <tbody>\r\n {rows.length === 0 ? (\r\n <tr><td colSpan={columns.length} className=\"analytics-empty\">{emptyMessage}</td></tr>\r\n ) : rows.map((row, index) => (\r\n <tr key={row.key || index}>\r\n {columns.map((column) => <td key={column.key}>{column.render ? column.render(row) : row[column.key]}</td>)}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getWorkOrderLabel(order) {\r\n return order.workOrderLabel || order.documentNumber || order.orderNumber || order.name || order.id || \"WorkOrder\";\r\n}\r\n\r\nfunction getWorkOrderHref(order) {\r\n return order.url || order.link || order.href || (order.id ? `/work-orders/${order.id}` : null);\r\n}\r\n\r\nfunction MonthDetailsModal({ month, orders, onClose }) {\r\n if (!month) return null;\r\n return (\r\n <div className=\"analytics-modal-backdrop\" role=\"presentation\" onClick={onClose}>\r\n <div className=\"analytics-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"month-details-title\" onClick={(event) => event.stopPropagation()}>\r\n <div className=\"analytics-modal-header\">\r\n <h3 id=\"month-details-title\">{month.month} {month.year} WorkOrders</h3>\r\n <button type=\"button\" className=\"analytics-modal-close\" onClick={onClose} aria-label=\"Close\">×</button>\r\n </div>\r\n <p>{orders.length} completed WorkOrder{orders.length === 1 ? \"\" : \"s\"} in this month.</p>\r\n <div className=\"analytics-modal-list\">\r\n {orders.length === 0 ? <div className=\"analytics-empty\">No WorkOrders found.</div> : orders.map((order, index) => {\r\n const href = getWorkOrderHref(order);\r\n const label = getWorkOrderLabel(order);\r\n return (\r\n <div className=\"analytics-work-order-item\" key={order.id || `${label}-${index}`}>\r\n {href ? (\r\n <a href={href} target=\"_blank\" rel=\"noreferrer\">{label}</a>\r\n ) : (\r\n <strong>{label}</strong>\r\n )}\r\n <span>{order.client} · {order.therapist}</span>\r\n {order.date && <small>{order.date.toLocaleDateString()}</small>}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default function WorkOrderAnalyticsByClient({\r\n endpoint = \"/api/documents?type=WorkOrder\",\r\n fetchDocuments,\r\n currentDate = new Date()\r\n}) {\r\n const [documents, setDocuments] = useState([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState(\"\");\r\n const [refreshToken, setRefreshToken] = useState(0);\r\n const [selectedMonth, setSelectedMonth] = useState(null);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n const loadDocuments = async () => {\r\n setLoading(true);\r\n setError(\"\");\r\n try {\r\n const result = fetchDocuments\r\n ? await fetchDocuments()\r\n : await fetch(endpoint, { headers: { \"Content-Type\": \"application/json\" } }).then((response) => {\r\n if (!response.ok) throw new Error(`Request failed (${response.status})`);\r\n return response.json();\r\n });\r\n if (!cancelled) setDocuments(getDocuments(result));\r\n } catch (loadError) {\r\n if (!cancelled) setError(loadError.message || \"Unable to load WorkOrders.\");\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n };\r\n loadDocuments();\r\n return () => { cancelled = true; };\r\n }, [endpoint, fetchDocuments, refreshToken]);\r\n\r\n const completedOrders = useMemo(() => documents\r\n .filter((document) => document.type === \"WorkOrder\" || document.documentType === \"WorkOrder\" || !document.type)\r\n .filter((document) => document.statusId === COMPLETED_STATUS_ID)\r\n .map((document) => ({ ...document, date: getWorkOrderDate(document), client: getClientName(document), therapist: getTherapistName(document) }))\r\n .filter((document) => document.date && !isFutureCalendarDate(document.date, currentDate)), [documents, currentDate]);\r\n\r\n const currentYear = currentDate.getFullYear();\r\n const years = useMemo(() => [...new Set(completedOrders.map((order) => order.date.getFullYear()))].sort((a, b) => b - a), [completedOrders]);\r\n const yearRows = years.map((year) => ({\r\n key: year,\r\n year,\r\n orders: completedOrders.filter((order) => order.date.getFullYear() === year).length\r\n }));\r\n const monthRows = [...new Set(completedOrders.map((order) => `${order.date.getFullYear()}-${order.date.getMonth()}`))]\r\n .map((key) => {\r\n const [year, monthIndex] = key.split(\"-\").map(Number);\r\n return {\r\n key,\r\n year,\r\n month: MONTH_NAMES[monthIndex],\r\n monthIndex,\r\n orders: completedOrders.filter((order) => order.date.getFullYear() === year && order.date.getMonth() === monthIndex).length\r\n };\r\n })\r\n .sort((a, b) => b.year - a.year || MONTH_NAMES.indexOf(a.month) - MONTH_NAMES.indexOf(b.month));\r\n const clientCounts = countBy(completedOrders, (order) => order.client);\r\n const clientRows = Object.entries(clientCounts)\r\n .map(([client, orders]) => ({ key: client, client, orders, share: completedOrders.length ? `${Math.round((orders / completedOrders.length) * 100)}%` : \"0%\" }))\r\n .sort((a, b) => b.orders - a.orders || a.client.localeCompare(b.client));\r\n const clientYearRows = Object.entries(clientCounts)\r\n .map(([client]) => {\r\n const row = { key: client, client };\r\n years.forEach((year) => {\r\n row[year] = completedOrders.filter((order) => order.client === client && order.date.getFullYear() === year).length;\r\n });\r\n row.total = clientCounts[client];\r\n return row;\r\n })\r\n .sort((a, b) => b.total - a.total || a.client.localeCompare(b.client));\r\n const clientMonthRows = monthRows.flatMap((monthRow) => Object.entries(clientCounts)\r\n .map(([client]) => ({\r\n key: `${monthRow.key}-${client}`,\r\n year: monthRow.year,\r\n month: monthRow.month,\r\n client,\r\n orders: completedOrders.filter((order) => order.client === client\r\n && order.date.getFullYear() === monthRow.year\r\n && order.date.getMonth() === MONTH_NAMES.indexOf(monthRow.month)).length\r\n }))\r\n .filter((row) => row.orders > 0));\r\n const therapistCounts = countBy(completedOrders, (order) => order.therapist);\r\n const topTherapist = Object.entries(therapistCounts).sort((a, b) => b[1] - a[1])[0];\r\n const topClientRows = clientRows.slice(0, 8);\r\n\r\n return (\r\n <section className=\"analytics-by-client\">\r\n <div className=\"analytics-header\">\r\n <div>\r\n <h2>WorkOrder analytics by client</h2>\r\n <p>Completed WorkOrders grouped by client, year, and month.</p>\r\n <small className=\"analytics-source\">Source: <code>{endpoint}</code> · Completed status only</small>\r\n </div>\r\n <div className=\"analytics-header-actions\">\r\n {loading && <span className=\"analytics-status\">Loading...</span>}\r\n {!loading && <button type=\"button\" className=\"analytics-refresh\" onClick={() => setRefreshToken((value) => value + 1)}>Refresh data</button>}\r\n </div>\r\n </div>\r\n {error && <div className=\"analytics-error\" role=\"alert\">{error}</div>}\r\n {!loading && (\r\n <>\r\n <div className=\"analytics-summary-grid\">\r\n <SummaryCard label=\"Completed WorkOrders\" value={formatNumber(completedOrders.length)} />\r\n <SummaryCard label=\"Clients\" value={formatNumber(Object.keys(clientCounts).length)} />\r\n <SummaryCard label={`${currentYear} orders`} value={formatNumber(yearRows.find((row) => row.year === currentYear)?.orders || 0)} />\r\n <SummaryCard label=\"Top therapist\" value={topTherapist?.[0] || \"-\"} detail={topTherapist ? `${formatNumber(topTherapist[1])} orders` : \"\"} />\r\n </div>\r\n <div className=\"analytics-grid\">\r\n <div className=\"analytics-panel\">\r\n <h3>Completed orders by year</h3>\r\n <BarChart rows={yearRows} labelKey=\"year\" valueKey=\"orders\" />\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Top clients</h3>\r\n <BarChart rows={topClientRows} labelKey=\"client\" valueKey=\"orders\" color=\"#646cff\" />\r\n </div>\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Monthly trend</h3>\r\n {monthRows.length ? <MonthlyChart rows={monthRows} onMonthClick={setSelectedMonth} /> : <p className=\"analytics-empty\">No monthly data available.</p>}\r\n </div>\r\n <div className=\"analytics-grid\">\r\n <div className=\"analytics-panel\">\r\n <h3>Totals by year</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"year\", label: \"Year\" },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) }\r\n ]} rows={yearRows} />\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Totals by month</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"year\", label: \"Year\" },\r\n { key: \"month\", label: \"Month\", render: (row) => (\r\n <button type=\"button\" className=\"analytics-date-button\" onClick={() => setSelectedMonth(row)}>{row.month} {row.year}</button>\r\n ) },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) }\r\n ]} rows={monthRows} />\r\n </div>\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Totals by client</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"client\", label: \"Client\" },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) },\r\n { key: \"share\", label: \"Share of completed orders\" }\r\n ]} rows={clientRows} />\r\n </div>\r\n <div className=\"analytics-grid\">\r\n <div className=\"analytics-panel\">\r\n <h3>Work orders per client by year</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"client\", label: \"Client\" },\r\n ...years.map((year) => ({ key: year, label: String(year), render: (row) => formatNumber(row[year]) })),\r\n { key: \"total\", label: \"Total\", render: (row) => formatNumber(row.total) }\r\n ]} rows={clientYearRows} />\r\n </div>\r\n <div className=\"analytics-panel\">\r\n <h3>Work orders per client by month</h3>\r\n <AnalyticsTable columns={[\r\n { key: \"year\", label: \"Year\" },\r\n { key: \"month\", label: \"Month\" },\r\n { key: \"client\", label: \"Client\" },\r\n { key: \"orders\", label: \"Work orders\", render: (row) => formatNumber(row.orders) }\r\n ]} rows={clientMonthRows} />\r\n </div>\r\n </div>\r\n <MonthDetailsModal\r\n month={selectedMonth}\r\n orders={selectedMonth ? completedOrders.filter((order) => order.date.getFullYear() === selectedMonth.year && order.date.getMonth() === selectedMonth.monthIndex) : []}\r\n onClose={() => setSelectedMonth(null)}\r\n />\r\n </>\r\n )}\r\n </section>\r\n );\r\n}\r\n\r\nexport { COMPLETED_STATUS_ID };\r\n"],"names":["COMPLETED_STATUS_ID","MONTH_NAMES","getDocuments","payload","Array","isArray","data","documents","items","results","parseDateValue","raw","undefined","timestamp","test","trim","Number","date","Date","isNaN","getTime","getWorkOrderDate","document","value","completedAt","completedDate","createdAt","createdOn","creationDate","startDate","updatedAt","getClientName","clientLabel","clientName","clientId","getTherapistName","therapistLabel","therapistName","therapistId","isFutureCalendarDate","referenceDate","dateKey","getFullYear","getMonth","getDate","referenceKey","countBy","getKey","reduce","counts","item","key","formatNumber","Intl","NumberFormat","format","SummaryCard","label","detail","React","createElement","className","BarChart","rows","labelKey","valueKey","color","maximum","Math","max","map","row","title","style","width","backgroundColor","MonthlyChart","onMonthClick","orders","role","type","onClick","month","year","height","slice","AnalyticsTable","columns","emptyMessage","column","length","colSpan","index","render","getWorkOrderLabel","order","workOrderLabel","documentNumber","orderNumber","name","id","getWorkOrderHref","url","link","href","MonthDetailsModal","onClose","event","stopPropagation","target","rel","client","therapist","toLocaleDateString","WorkOrderAnalyticsByClient","endpoint","fetchDocuments","currentDate","setDocuments","useState","loading","setLoading","error","setError","refreshToken","setRefreshToken","selectedMonth","setSelectedMonth","useEffect","cancelled","loadDocuments","result","fetch","headers","then","response","ok","Error","status","json","loadError","message","completedOrders","useMemo","filter","documentType","statusId","currentYear","years","Set","sort","a","b","yearRows","monthRows","monthIndex","split","indexOf","clientCounts","clientRows","Object","entries","share","round","localeCompare","clientYearRows","forEach","total","clientMonthRows","flatMap","monthRow","therapistCounts","topTherapist","topClientRows","Fragment","keys","find","String"],"mappings":"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"}