Care plan
A React block (a whole screen) in Beamline's Clinic app.
A client's care plan composed beside what the client will see of it. Every field says who sees it (the care team only, or the client too) and the client's view beside the plan leaves out everything internal as it is edited, saying how many items it left out. Recommendations are filed by category, goals say how often in a sentence with a reminder in the client's time zone and keep done per occurrence (today's done never completes tomorrow's), and documents come from the client's files; each is added in a sheet that returns focus. A template is applied as a copy and the template stays as it was; a goal can start from a saved favourite (a copy) or be saved as one. Saving and making active are two steps: one plan per client is active, and making another active first shows the plan it replaces, what stays (goals and documents) and what leaves the client's view (its recommendations). A recommendation can be taken from one of the client's chart notes (never another client's): the field's words arrive as an editable copy that never writes back, its source (note, field, revision) is kept and the row says when the note has changed since. Journal and portal settings say whether each value comes from the practice, the client's group or this plan, an override resets to inherit, and the client view shows the effective result before saving. Deactivating is reversible and apart from deleting; notifying the client is its own action with its own receipt.
Use it for
- A practitioner writing or updating a client's plan (therapy, dietetics, coaching, physiotherapy) where some of it is for the team and some for the client.
- Any record whose fields have two audiences, where the author must see exactly what the other side will see before it goes live.
Not for
- The session note itself (session-notes).
- Booking appointments (appointment-book, client-booking).
- A client logging their own day (client-journal).
Anatomy
- header: Care plan for <client>, the plan chooser (title · Active, Draft, Inactive or Not saved yet) and its status badge; Apply a template; New plan
- lifecycle bar: what the plan's state means for the client, or Unsaved changes with Discard and Save; on a saved plan Delete plan (asked first) and Make active (a consequence preview); on the active plan Deactivate and Notify <client>, then the receipt
- plan: title and summary as text that edits in place, the summary with who sees it; Recommendations by category (each line with who sees it and one menu: Edit, Remove; Add recommendation); Goals (title, how often in words, the reminder with its zone, the next 7 days as one mark per occurrence; Add goal); Documents (name, detail, who sees it, a menu with Remove; Attach document)
- journal and portal: each setting a switch with where its value comes from (From the practice, From <group>, This plan) and Reset to <inherited value> on an override
- client view (a full column beside the plan): What <client> sees, what the plan's state means for them, the plan as their portal shows it (title, summary, recommendations by category, goals with how often, documents) and how many team-only items are left out
- sheets: a recommendation (Write it or From a chart note: the client's notes with their date and revision, then a field, the words as an editable copy; category, what to do, who sees it); a goal (Start from a favourite or new, title, how often as a sentence over the recurrence editor, Remind <client> at a time in their zone, who sees it, Save as a favourite); the client's files to attach
States
- draft, active, inactive, not saved yet
- a field for the team only (left out of the client view, counted) or for the client too
- template applied (copied, said; the template unchanged)
- goal from a favourite (a copy) and saved as a favourite
- occurrence done (that date only), a future occurrence not yet markable
- unsaved changes; saving; save refused (the reason, the edit kept)
- make active: replacing another plan (what is replaced, kept and leaves the client's view) or the first active plan
- deactivated (reversible, nothing deleted)
- delete asked, deleted
- notifying, notified (with the time), notification refused (the reason)
- nothing marked for the client yet
- narrow room: Plan and Client sees take turns; sheets from the bottom
- recommendation from a chart note (its source said; the note changed since, said)
- no chart notes for the client
- journal setting inherited from the practice or the group, overridden by this plan, reset to inherit; the effective result in the client view
Keyboard
- Tab through the header, the lifecycle bar, the plan and the client view
- who sees it is a toggle button (pressed: the client sees it)
- an occurrence mark is a toggle button for that date
- sheets trap focus, close with Escape and return focus to what opened them
Motion
Who sees it changes its colour in the fast duration; an occurrence fills in the same; the notification receipt opens and closes by its height (Linger). Sheets slide from the side (from the bottom on a phone). Reduced motion places at once. Nothing runs at rest.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
client (required) | PlanClient | — | |
plans | CarePlan[] | — | Every plan of this client. |
defaultPlans | CarePlan[] | — | |
onPlansChange | ((plans: CarePlan[]) => void) | — | The whole list after a save, an activation, a deactivation or a delete succeeds. |
defaultPlan | string | — | The plan open first. Default: the active one, else the first. |
onSave | ((plan: CarePlan, previous: CarePlan | null) => void | Promise<unknown>) | — | Saves a plan (`previous` null: a new one); reject with the reason to keep the edit. |
onActivate | ((plan: CarePlan, replaced: CarePlan | null) => void | Promise<unknown>) | — | Makes a saved plan the client's active one (`replaced`: the plan that was active); reject to keep things as they were. |
onDeactivate | ((plan: CarePlan) => void | Promise<unknown>) | — | |
onDelete | ((plan: CarePlan) => void | Promise<unknown>) | — | |
onNotify | ((plan: CarePlan) => void | Promise<unknown>) | — | Tells the client about the active plan; reject with the reason. |
onGoalDone | ((plan: CarePlan, goal: Goal, date: string, done: boolean) => void) | — | One occurrence of a goal marked done or not (only that date). |
templates | PlanTemplate[] | — | Practice templates, applied as copies. |
favourites | GoalFavourite[] | — | Saved goals to start from. |
defaultFavourites | GoalFavourite[] | — | |
onFavouritesChange | ((favourites: GoalFavourite[]) => void) | — | |
files | ClientFile[] | — | The client's files that can be attached. |
categories | string[] | — | Recommendation categories. |
today | string | — | Today, "2026-11-05". Default: today. |
locale | string | — | |
className | string | — | Classes on the documented visual root; no override by default. |
style | CSSProperties | — | Inline styles on the documented visual root; no overrides by default. |
ref | Ref<HTMLDivElement> | — | Receives the documented native target or imperative handle; omitted by default. |
notes | ChartNote[] | — | Chart notes a recommendation can be taken from; only this client's are offered. |
journalSettings | JournalSetting[] | — | The journal and portal settings a plan can set over the group and practice. |
practiceJournal | Record<string, boolean> | — | The practice's journal settings. |
group | PlanGroup | — | The client's group and its settings, over the practice's. |
Built from
- consequence-preview
- recurrence-editor
- sheet
- select
- input
- textarea
- switch
- checkbox
- time-picker
- segmented-control
- badge
- button
Dependencies
lucide-react
Import
import { CarePlan } from "@beamline/care-plan";
Get it
Care plan is part of Beamline UI. Install the parts you need in your React app as compiled packages or editable source. Get Beamline · Connect your agent
More in Clinic
- Appointment book: The desk's day with the appointment editor beside it. The appointment being edited is a block on the day like any other, drawn in the accent while it is…
- Book an appointment: A client books an appointment on the practice's own site: a service (length and price beside it), who gives it or anyone free, and where; a day with…
- Services and hours: A practice's services and the hours its practitioners can be booked, one relation seen from both ends. A service reads as values and changes on demand…
- Patient overview: One patient's record on a page. A search finds patients by name, chart number or birth date (recent patients when empty; same names told apart by birth…
- Patient chart: A clinic's chart for one client and their animals. The client's header (phone, email, contact preferences, the balance with what it means and as of when…
- Health questionnaire: A patient's medical history as a versioned questionnaire. Every question takes Yes, No or I don't know, and one not answered says so, never read as No; a…
- Case workspace: A patient's clinical cases and how cases work at the practice. A case shows its status, type, teeth, staff, location and start; its checklist counts…
- Treatment plan: A patient's treatment plan in named phases. Each procedure shows its tooth, status and fee beside the patient's and the insurer's estimate (not known…
- Plan templates: Reusable treatment-plan templates. A template reads as words at rest and changes on demand: its name edits in place; the status its procedures start as…
- Plan acceptance: A treatment plan presented for acceptance, from both sides. The practice chooses the agreement (the account's default or this location's own) and how…
- Plan follow-up: The practice's follow-up lists, for the person who turns accepted treatment into booked chairs. Treatment plans lead with what's at stake: the value…
- Session notes and tasks: A session's note beside its follow-up tasks, each task tied to the exact words it came from: choose a task and its words light in the note or the…
- Note templates: A practitioner's note templates in one library with three ways in. My templates lists their own by kind, favourites first, each with when it was last…
- Probing chart: A periodontal probing chart. Six sites per tooth (three buccal, three lingual) across both arches as you face the patient, each depth in its cell and…
- Procedure picker: Procedures, conditions and bundles put on a patient's teeth from the chair. The mode (existing, planned, completed) is chosen before adding and each…
- Results notebook: A notebook entry's structured results. The entry's text above a bounded results table with typed columns: a sample link, numbers in their unit with their…
- Insurance claims: Insurance claims as a queue: every claim at first, in the order a person works them (rejected by the clearinghouse, denied by the payer, partly paid, not…
- Account ledger: A patient's account. All transactions or the ones needing attention, each dated with its type in a word, its amount and the running balance; entries that…
- Dispensing: Dispensing from the shelf by lot. A product is found with its stock and prices (consumables left out unless asked); the quantity is drawn across its…
- Record sharing: Records sent out of a clinic. Several visits' records and their documents (record, invoice, plan, lab result, image) are chosen separately, with how much…
- Client journal: A client's journal from both ends. The client's side is their home, built around their day: today's goals with how many are done and a mark each, done…