Skip to content

Commit 6c4b6ea

Browse files
committed
fix: show perfusions as "terminal surgery"
1 parent 5fa9d91 commit 6c4b6ea

5 files changed

Lines changed: 54 additions & 3 deletions

File tree

web/src/__tests__/subject-parsers.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,18 @@ describe('parseProcedure', () => {
114114
expect(ev.details).toContain('Brain injection');
115115
});
116116

117+
it('labels surgery as Terminal Surgery when perfusion is present', () => {
118+
const ev = parseProcedure({
119+
object_type: 'Surgery',
120+
start_date: '2025-03-01',
121+
procedures: [
122+
{ object_type: 'Perfusion' },
123+
],
124+
});
125+
expect(ev.type).toBe('Surgery');
126+
expect(ev.event).toBe('Terminal Surgery');
127+
});
128+
117129
it('uses end_date when provided', () => {
118130
const ev = parseProcedure({
119131
object_type: 'Headframe',

web/src/__tests__/subject-view-dom.test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,40 @@ describe('createSubjectView — timeline click', () => {
100100
expect(bubbles[0].classList.contains('tl-bubble--selected')).toBe(false);
101101
expect(bubbles[1].classList.contains('tl-bubble--selected')).toBe(true);
102102
});
103+
104+
it('shows Terminal Surgery label when surgery contains perfusion', async () => {
105+
queryDocDb.mockResolvedValue([
106+
{
107+
...MINIMAL_RECORD('42', 'my-asset_42'),
108+
procedures: {
109+
subject_procedures: [
110+
{
111+
object_type: 'Surgery',
112+
start_date: '2024-01-02',
113+
procedures: [{ object_type: 'Perfusion' }],
114+
},
115+
],
116+
specimen_procedures: [],
117+
},
118+
},
119+
]);
120+
121+
const view = createSubjectView({ subjectId: '42' });
122+
document.body.appendChild(view);
123+
await flushPromises();
124+
125+
const labels = [...view.querySelectorAll('.tl-bubble-type')].map((el) => el.textContent);
126+
expect(labels).toContain('Terminal Surgery');
127+
128+
const surgeryBubble = [...view.querySelectorAll('.tl-bubble')].find((el) =>
129+
el.querySelector('.tl-bubble-type')?.textContent === 'Terminal Surgery'
130+
);
131+
expect(surgeryBubble).toBeDefined();
132+
133+
surgeryBubble.click();
134+
const heading = view.querySelector('.subject-detail-container .detail-card h4');
135+
expect(heading?.textContent).toBe('Terminal Surgery');
136+
});
103137
});
104138

105139
describe('organizeSubjectData — unique procedures', () => {

web/src/subject/details.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ function createTabWidget(tabs) {
232232

233233
function buildSurgeryOverviewHtml(event) {
234234
const { start, details, data = {} } = event;
235+
const title = event.event === 'Terminal Surgery' ? 'Terminal Surgery' : 'Surgery Overview';
235236
const anaes = data.anaesthesia;
236237
const extra = [
237238
anaes
@@ -252,7 +253,7 @@ function buildSurgeryOverviewHtml(event) {
252253
].join('');
253254
return `
254255
<div class="detail-card">
255-
<h4>Surgery Overview</h4>
256+
<h4>${title}</h4>
256257
<dl>
257258
<dt>Date</dt><dd>${fmtDate(start)}</dd>
258259
<dt>Procedures</dt><dd>${details ?? ''}</dd>

web/src/subject/parsers.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,19 @@ export function parseProcedure(proc) {
113113
: new Date(start.getTime() + NO_END_DATE_DURATION_MS);
114114

115115
let detailStr;
116+
let eventLabel = procType;
116117
if (procType === 'Surgery') {
117118
const subProcs = (proc.procedures ?? []).filter(Boolean);
118119
const parts = subProcs.map((sp) => sp.object_type ?? 'Unknown');
120+
if (subProcs.some((sp) => sp?.object_type === 'Perfusion')) {
121+
eventLabel = 'Terminal Surgery';
122+
}
119123
detailStr = parts.length ? parts.join(', ') : 'Surgery';
120124
} else {
121125
detailStr = procType;
122126
}
123127

124-
return { start, end, event: procType, type: procType, details: detailStr, data: proc, dateOnly: true };
128+
return { start, end, event: eventLabel, type: procType, details: detailStr, data: proc, dateOnly: true };
125129
}
126130

127131
/**

web/src/subject/timeline.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export function createSubjectTimeline(events, opts = {}) {
199199

200200
const typeEl = document.createElement('span');
201201
typeEl.className = 'tl-bubble-type';
202-
typeEl.textContent = ev.type;
202+
typeEl.textContent = ev.type === 'Surgery' ? (ev.event ?? ev.type) : ev.type;
203203

204204
const dateEl = document.createElement('span');
205205
dateEl.className = 'tl-bubble-date';

0 commit comments

Comments
 (0)