Patient Panel | Canvas Medical
nikola-milev-vicert/patient-panel
Patient Panel
Configurable patient dashboard plugin for Canvas Medical.
Info
This plugin was developed and contributed by Vicert.
Contact: engineering@vicert.com
What it does
Patient Panel adds a configurable, sortable, filterable view of a clinic's patient population inside Canvas. It is surfaced as a provider-menu Application that opens a full-page panel listing patients with configurable columns — demographics, care team, last/next visit, facility, open tasks, care gaps, insurance, observation values (e.g. A1C and BMI by LOINC), and custom metadata fields. Each row supports color-coded flagging, an inline clinical caption, and accordion detail views for tasks, gaps, conditions, medications, allergies, and referrals. Sorting and pagination stay fast on large panels via the denormalized PatientPanelStats table.
Problem it solves
Canvas has no built-in configurable population/panel view, and building one ad hoc does not scale. Patient Panel provides that view without leaving the EMR and keeps it performant through an indexed stats table kept fresh by event handlers and a reconciliation cron.
Who it's for
Care teams, care coordinators, and panel managers who need to triage and act on a patient population, and providers who want a fast roster from the provider menu or a note. Administrators configure the visible columns, flag labels, highlight thresholds, and custom metadata fields entirely through plugin secrets — no code changes required.
Screenshots or screen recordings
Default panel view — the patient roster with the filter bar (care team, insurance, facility, protocol), search, and per-column sorting.
Configurable columns — show, hide, and reorder columns from the column picker; the selection is driven by the PANEL_CONFIG secret.
Search and sort — filter the roster by patient name and sort by any sortable column (here, open tasks).
Detail accordions — expand a patient row to see tasks, gaps, conditions, medications, allergies, and referrals inline, including task comment threads.
Features
- Configurable columns via
PANEL_CONFIGJSON secret - Filter bar with multi-select dropdowns for care team, insurance, facility, and protocol
- Patient flagging with color-coded flags (green/yellow/red)
- Clinical caption with inline editing
- Tasks, gaps, conditions, medications, allergies, referrals with accordion detail views
- Pagination and sorting on key columns
- Indexed sort acceleration via the
PatientPanelStatstable
Entry Point
Launched as an Application (PatientPanelApp) accessible from the provider menu, opening the panel in a full-page modal.
Configuration
Set the PANEL_CONFIG secret to a JSON object to customize columns:
{
"columns": [
{"type": "built-in", "key": "patient", "visible": true},
{"type": "built-in", "key": "care_team", "visible": true},
{"type": "built-in", "key": "last_visit", "visible": true},
{"type": "built-in", "key": "facility", "visible": true},
{"type": "built-in", "key": "tasks", "visible": true},
{"type": "built-in", "key": "gaps", "visible": true},
{"type": "built-in", "key": "insurance", "visible": true},
{"type": "built-in", "key": "caption", "visible": true},
{"type": "built-in", "key": "next_visit", "visible": true},
{"type": "observation", "key": "a1c", "label": "A1C", "loinc": "4548-4", "visible": true, "format": "value_units"},
{"type": "observation", "key": "bmi", "label": "BMI", "loinc": "39156-5", "visible": true, "format": "value"},
{"type": "metadata", "key": "preferred_language", "label": "Language", "visible": true}
]
}
Available built-in column keys: patient, care_team, last_visit, next_visit, facility, room, tasks, gaps, insurance, caption, mrn, phone, email, address, default_provider, conditions, medications, allergies, referrals, active_status.
Secrets
| Secret | Required | Description |
|---|---|---|
PANEL_CONFIG |
No | JSON column configuration |
PAGE_SIZE |
No | Patients per page (default: 10) |
HIGHLIGHT_THRESHOLD_DAYS_GREEN |
No | Days threshold for green highlight |
HIGHLIGHT_THRESHOLD_DAYS_YELLOW |
No | Days threshold for yellow highlight |
HIGHLIGHT_THRESHOLD_DAYS_RED |
No | Days threshold for red highlight |
INSURANCES |
No | Insurance logo mappings |
FHIR_CLIENT_ID |
No | FHIR client ID for patient photos |
FHIR_CLIENT_SECRET |
No | FHIR client secret for patient photos |
CANVAS_INSTANCE_URL |
No | Canvas instance URL for FHIR API |
INSTANCE_TIMEZONE |
No | IANA TZ name |
FLAG_COLOR_LABELS |
No | JSON dict overriding the dropdown labels for the three flag colors |
METADATA_FIELDS |
No | JSON list of extra patient-profile fields |
Sort acceleration (PatientPanelStats)
PatientPanelStats is a per-patient denormalized table holding the stable, sortable derived values. The built-in sorts always order by this table instead of ordering the full patient population by subqueries.
Metadata columns: filtering, sorting, and rendering
Metadata columns in PANEL_CONFIG accept additional flags for filtering and sorting purposes.
Inline editing in the table
A metadata column renders an in-cell editable control when its key is declared editable: true in METADATA_FIELDS, allowing for inline edits without reloading the table.
Patient Flagging
Each patient avatar in the table doubles as a flag picker with None / Green / Yellow / Red options. Labels for flags can be customized via the FLAG_COLOR_LABELS secret.
Components
PatientPanelApp— Application providing the provider-menu entry pointPanelButton— ActionButton in the note headerPatientPanelAPI— API serving the dashboard UI and data endpointsWeeklyFlagCleanup— CronTask clearing stale flag metadata weekly
Installation
Installed with the Canvas CLI. After installing, it’s important to populate the stats table. Immediate population can be done using a specified JavaScript fetch request.
Testing
From the container directory:
uv run pytest tests/ # full suite
uv run pytest tests/api/ # API tests only
uv run pytest --cov=patient_panel # with coverage