Skip to content

Commit 40c0e4f

Browse files
committed
Make it ever so slightly worse
1 parent 785368f commit 40c0e4f

15 files changed

Lines changed: 546 additions & 13 deletions

File tree

deployments/palliative/intro.mdx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
sidebar_position: 1
3+
slug: /
4+
---
5+
6+
# Palliative playbooks
7+
8+
Palliative care playbooks wire **flows** into home-based and facility palliative programs. Each playbook lists the flows involved, the care team path, and edge cases specific to palliative deployments.
9+
10+
## How playbooks relate to core docs
11+
12+
| Layer | Location | Example |
13+
| --- | --- | --- |
14+
| Concept | [Core docs](/docs/concepts/clinical/patient) | What is a patient? |
15+
| Flow | [Core docs](/docs/flows/clinical/create-patient) | How do I create a patient? |
16+
| Playbook | Here | Enrolling a patient in community palliative care |
17+
18+
Start from the [documentation home](/docs/intro) if you are new to this structure.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"label": "Playbooks",
3+
"position": 2,
4+
"link": {
5+
"type": "generated-index",
6+
"title": "Palliative playbooks",
7+
"description": "Use cases that combine Care flows with palliative program configuration and community care edge cases."
8+
}
9+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
sidebar_position: 1
3+
---
4+
5+
# Palliative patient enrollment
6+
7+
Enroll a patient into a community or facility-based palliative program. This playbook combines the [create patient](/docs/flows/clinical/create-patient) flow with palliative-specific intake, caregiver capture, and program assignment.
8+
9+
## Flows involved
10+
11+
| Order | Flow | Purpose |
12+
| --- | --- | --- |
13+
| 1 | [Create a patient](/docs/flows/clinical/create-patient) | New patient with no existing record |
14+
| 2 | Patient search | Match returning patients before creating duplicates |
15+
| 3 | Palliative program enrollment *(coming soon)* | Assign program, care team, and visit cadence |
16+
17+
## Happy path
18+
19+
1. Community nurse or intake coordinator searches by phone, national ID, or name.
20+
2. No match → **Register new patient** → complete demographics and primary diagnosis.
21+
3. Record primary caregiver name, phone, and relationship.
22+
4. Assign palliative program (home-based, facility, or hybrid).
23+
5. Schedule first assessment visit and document consent for palliative care.
24+
25+
## Edge cases
26+
27+
### Referred from hospital IP
28+
29+
**Symptom:** Discharge summary lists patient; family requests home palliative follow-up.
30+
31+
**Action:**
32+
33+
1. Search by hospital MRN or phone from referral slip.
34+
2. If patient exists → open record and add palliative program enrollment; do not create a duplicate.
35+
3. Import or attach discharge summary and active medication list.
36+
4. Flag **transition of care** for the assigned community nurse.
37+
38+
### Patient already in HMIS
39+
40+
**Symptom:** Same person registered at hospital OPD; palliative program runs on a shared Care instance.
41+
42+
**Action:**
43+
44+
1. Search existing HMIS record.
45+
2. Enroll in palliative program without duplicating demographics.
46+
3. Document palliative-specific goals of care separately from acute encounter notes.
47+
48+
### Caregiver-only contact at intake
49+
50+
**Symptom:** Family member calls; patient is bed-bound and cannot attend facility.
51+
52+
**Action:**
53+
54+
1. Register patient with available demographics.
55+
2. Add caregiver as related contact with callback number.
56+
3. Mark intake as **pending patient verification** until first home visit.
57+
4. Schedule home visit as first clinical contact.
58+
59+
### Limited demographics (rural outreach)
60+
61+
**Symptom:** Camp intake collects phone and village only.
62+
63+
**Action:**
64+
65+
1. Register with minimum fields allowed by facility questionnaire.
66+
2. Flag **incomplete demographics**.
67+
3. Complete address and ID verification on first home visit.
68+
69+
## Roles
70+
71+
| Role | Can |
72+
| --- | --- |
73+
| Palliative intake coordinator | Search, create, enroll in program |
74+
| Community nurse | Update care plan, document home visits |
75+
| Palliative physician | Approve program enrollment, adjust care goals |
76+
| Registration clerk (shared HMIS) | Search and link existing hospital records |
77+
78+
## Related
79+
80+
- Concept: [Patient](/docs/concepts/clinical/patient)
81+
- Flow: [Create a patient](/docs/flows/clinical/create-patient)
82+
- HMIS playbook: [Outpatient registration](/deployments/hmis/playbooks/outpatient-registration)

docusaurus.config.js

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,23 @@ import {themes as prismThemes} from 'prism-react-renderer';
88

99
const EDIT_URL = 'https://github.com/ohcnetwork/docs/tree/main/';
1010

11-
/** @type {Array<{id: string, label: string, path: string, routeBasePath: string}>} */
11+
/** @type {Array<{id: string, label: string, path: string, routeBasePath: string, sidebarPath: string, sidebarId: string}>} */
1212
const CARE_DEPLOYMENTS = [
1313
{
1414
id: 'hmis',
1515
label: 'HMIS',
1616
path: 'deployments/hmis',
1717
routeBasePath: 'deployments/hmis',
18+
sidebarPath: './sidebarsHmis.js',
19+
sidebarId: 'hmisSidebar',
20+
},
21+
{
22+
id: 'palliative',
23+
label: 'Palliative',
24+
path: 'deployments/palliative',
25+
routeBasePath: 'deployments/palliative',
26+
sidebarPath: './sidebarsPalliative.js',
27+
sidebarId: 'palliativeSidebar',
1828
},
1929
];
2030

@@ -38,6 +48,14 @@ const config = {
3848
organizationName: 'ohcnetwork',
3949
projectName: 'docs',
4050

51+
customFields: {
52+
playbookDeployments: CARE_DEPLOYMENTS.map(({id, label, routeBasePath}) => ({
53+
id,
54+
label,
55+
routeBasePath,
56+
})),
57+
},
58+
4159
onBrokenLinks: 'throw',
4260
onBrokenMarkdownLinks: 'warn',
4361

@@ -99,7 +117,7 @@ const config = {
99117
id: deployment.id,
100118
path: deployment.path,
101119
routeBasePath: deployment.routeBasePath,
102-
sidebarPath: './sidebarsHmis.js',
120+
sidebarPath: deployment.sidebarPath,
103121
editUrl: EDIT_URL,
104122
},
105123
]),
@@ -127,11 +145,15 @@ const config = {
127145
docsPluginId: 'default',
128146
},
129147
{
130-
type: 'docSidebar',
131-
sidebarId: 'hmisSidebar',
132-
position: 'left',
148+
type: 'dropdown',
133149
label: 'Playbooks',
134-
docsPluginId: 'hmis',
150+
position: 'left',
151+
items: CARE_DEPLOYMENTS.map((deployment) => ({
152+
type: 'docSidebar',
153+
sidebarId: deployment.sidebarId,
154+
label: deployment.label,
155+
docsPluginId: deployment.id,
156+
})),
135157
},
136158
{
137159
type: 'docsVersionDropdown',
@@ -143,9 +165,7 @@ const config = {
143165
],
144166
},
145167
footer: {
146-
style: 'dark',
147-
links: [
148-
],
168+
links: [],
149169
copyright: `Copyright © ${new Date().getFullYear()} Open Healthcare Network Foundation. Built with Docusaurus.`,
150170
},
151171
prism: {

sidebarsPalliative.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @ts-check
2+
3+
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
4+
const sidebars = {
5+
palliativeSidebar: [{type: 'autogenerated', dirName: '.'}],
6+
};
7+
8+
export default sidebars;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React from 'react';
2+
import Link from '@docusaurus/Link';
3+
import styles from './styles.module.css';
4+
5+
export default function PlaybookNavbarBack({deployment, onNavigate}) {
6+
return (
7+
<div className={styles.playbookNav}>
8+
<Link
9+
className={styles.playbookBack}
10+
to="/intro"
11+
onClick={onNavigate}
12+
aria-label="Back to documentation">
13+
<span className={styles.playbookBackIcon} aria-hidden="true">
14+
15+
</span>
16+
Documentation
17+
</Link>
18+
<span className={styles.playbookBadge}>{deployment.label} playbook</span>
19+
</div>
20+
);
21+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
.playbookNav {
2+
display: flex;
3+
align-items: center;
4+
gap: 0.75rem;
5+
margin-left: 0.5rem;
6+
}
7+
8+
.playbookBack {
9+
display: inline-flex;
10+
align-items: center;
11+
gap: 0.35rem;
12+
padding: 0.35rem 0.85rem;
13+
font-weight: 600;
14+
font-size: 0.9rem;
15+
color: var(--care-primary);
16+
background: var(--care-soft-background);
17+
border: 1px solid var(--care-border);
18+
border-radius: var(--care-radius);
19+
text-decoration: none;
20+
transition: background 0.15s ease, border-color 0.15s ease;
21+
}
22+
23+
.playbookBack:hover {
24+
color: var(--care-primary);
25+
text-decoration: none;
26+
background: var(--care-accent);
27+
border-color: var(--care-primary);
28+
}
29+
30+
.playbookBackIcon {
31+
font-size: 1rem;
32+
line-height: 1;
33+
}
34+
35+
.playbookBadge {
36+
font-size: 0.85rem;
37+
font-weight: 600;
38+
color: var(--care-muted-foreground);
39+
white-space: nowrap;
40+
}
41+
42+
@media (max-width: 996px) {
43+
.playbookBadge {
44+
display: none;
45+
}
46+
}

src/css/custom.css

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,11 @@
2626

2727
--ifm-navbar-background-color: var(--care-background);
2828
--ifm-navbar-shadow: 0 1px 0 var(--care-border);
29-
--ifm-footer-background-color: var(--care-neutral-950);
30-
--ifm-footer-color: var(--care-neutral-200);
31-
--ifm-footer-link-color: var(--care-neutral-400);
32-
--ifm-footer-title-color: var(--care-white);
29+
30+
--ifm-footer-background-color: transparent;
31+
--ifm-footer-color: var(--care-muted-foreground);
32+
--ifm-footer-link-color: var(--care-soft-foreground);
33+
--ifm-footer-title-color: var(--care-foreground);
3334

3435
--ifm-code-font-size: 95%;
3536
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.06);
@@ -48,6 +49,11 @@
4849
--ifm-color-primary-lightest: var(--care-emerald-100);
4950

5051
--ifm-navbar-shadow: 0 1px 0 var(--care-border);
52+
53+
--ifm-footer-color: var(--care-muted-foreground);
54+
--ifm-footer-link-color: var(--care-soft-foreground);
55+
--ifm-footer-title-color: var(--care-foreground);
56+
5157
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
5258
}
5359

@@ -92,3 +98,50 @@ html {
9298
border-color: var(--care-strong-border);
9399
color: var(--care-accent-foreground);
94100
}
101+
102+
/* Footer */
103+
.footer {
104+
position: relative;
105+
border-top: 1px solid var(--care-border);
106+
background: var(--care-background);
107+
padding-top: 1.75rem;
108+
padding-bottom: 1.5rem;
109+
}
110+
111+
.footer__copyright {
112+
position: relative;
113+
z-index: 1;
114+
font-size: 0.875rem;
115+
color: var(--care-soft-foreground);
116+
}
117+
118+
.footer--dark {
119+
--ifm-footer-background-color: transparent;
120+
}
121+
122+
/* Doc pages — carry sidebar edge into footer so the cutoff looks intentional */
123+
@media (min-width: 997px) {
124+
:global(#__docusaurus:has(.theme-doc-sidebar-container)) .footer::before {
125+
content: '';
126+
position: absolute;
127+
top: 0;
128+
left: var(--doc-sidebar-width);
129+
height: 100%;
130+
border-left: 1px solid var(--care-border);
131+
pointer-events: none;
132+
}
133+
134+
:global(#__docusaurus:has(.theme-doc-sidebar-container)) .footer::after {
135+
content: '';
136+
position: absolute;
137+
inset: 0 auto 0 0;
138+
width: var(--doc-sidebar-width);
139+
background: color-mix(
140+
in oklab,
141+
var(--care-background) 94%,
142+
var(--care-soft-background)
143+
);
144+
pointer-events: none;
145+
z-index: 0;
146+
}
147+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
:root {
9+
--doc-sidebar-width: 300px;
10+
--doc-sidebar-hidden-width: 30px;
11+
}
12+
13+
.docSidebarContainer {
14+
display: none;
15+
}
16+
17+
@media (min-width: 997px) {
18+
.docSidebarContainer {
19+
display: block;
20+
width: var(--doc-sidebar-width);
21+
margin-top: calc(-1 * var(--ifm-navbar-height));
22+
border-right: 1px solid var(--ifm-toc-border-color);
23+
will-change: width;
24+
transition: width var(--ifm-transition-fast) ease;
25+
clip-path: inset(0);
26+
}
27+
28+
.docSidebarContainerHidden {
29+
width: var(--doc-sidebar-hidden-width);
30+
cursor: pointer;
31+
}
32+
33+
.sidebarViewport {
34+
top: 0;
35+
position: sticky;
36+
height: 100%;
37+
max-height: 100vh;
38+
}
39+
}

0 commit comments

Comments
 (0)