Files
Media.JoshHeaps.Net/Media.JoshHeaps.Net/wwwroot/js/medical-docs/state.js
T
2026-02-13 10:11:44 -07:00

84 lines
3.5 KiB
JavaScript

window.MedDocs = {
API: '/api/medical-docs',
state: {
people: [],
doctors: [],
currentDocuments: [],
currentPrescriptions: [],
selectedPersonId: null,
activeTab: 'doctors',
searchDebounceTimer: null,
currentProviders: []
},
escapeHtml(str) {
const div = document.createElement('div');
div.textContent = str;
return div.innerHTML;
},
escapeAttr(str) {
return str.replace(/'/g, "\\'").replace(/"/g, '\\"');
},
formatDate(dateStr) {
const d = new Date(dateStr);
return d.toLocaleDateString();
},
formatSize(bytes) {
if (bytes < 1024) return bytes + ' B';
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
},
formatCurrency(amount) {
return '$' + parseFloat(amount).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
},
formatLabel(str) {
return str.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
},
formatClassification(c) {
return c.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
},
truncate(str, max) {
return str.length > max ? str.substring(0, max) + '...' : str;
},
getDocIcon(doc) {
if (doc.documentType === 'note') {
return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line></svg>';
}
const mime = (doc.mimeType || '').toLowerCase();
if (mime.startsWith('image/')) {
return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><polyline points="21 15 16 10 5 21"></polyline></svg>';
}
if (mime === 'application/pdf') {
return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline></svg>';
}
return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline></svg>';
},
getAiStatusBadge(doc) {
if (doc.aiProcessed) {
return '<span class="ai-badge ai-done" title="AI processed">AI</span>';
}
return '<span class="ai-badge ai-pending" title="Not yet processed">No AI</span>';
},
updateSummaryCount(id, count) {
const el = document.getElementById(id);
if (el) el.textContent = count;
},
personBadge(personId) {
if (this.state.selectedPersonId) return '';
const person = this.state.people.find(p => p.id === personId);
return person ? `<span class="person-badge">${this.escapeHtml(person.name)}</span>` : '';
}
};