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

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

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