+
+ {/* basis-[70vh] is the preferred stage height; min-h-0 lets it shrink
+ instead of pushing the panel past its max-height on short viewports. */}
+
+ {isActualSize ? (
+ // min-w-max keeps the centred diagram from overflowing past the
+ // scroll container's start edge, which would make it unreachable.
+
+
+
+ ) : (
+ // Absolute inset-0 gives the image a definite box in both axes, so
+ // object-contain can scale the diagram down to fit rather than clip.
+
+
+
+ )}
+
+
+
+
{backgroundNotice}
+
+
+ );
+}
diff --git a/src/features/cases/components/CasesInfoDrawer.tsx b/src/features/cases/components/CasesInfoDrawer.tsx
index ea3120c..f49b281 100644
--- a/src/features/cases/components/CasesInfoDrawer.tsx
+++ b/src/features/cases/components/CasesInfoDrawer.tsx
@@ -1,7 +1,8 @@
import { useState } from 'react';
-import { Briefcase, FolderSync } from 'lucide-react';
+import { Briefcase, Database, FolderSync } from 'lucide-react';
import { DrawerFrame } from '@/components/modals/DrawerFrame';
import { InfoDrawerActionCard } from '@/components/modals/InfoDrawerActionCard';
+import { ModelViewDialog } from '@/components/modals/ModelViewDialog';
import { formatTableDate } from '@/utils/timeFormat';
import { useCaseSyncFromRedcapAutoHistoryModel } from '../api/cases.api';
// Manual case creation is temporarily unavailable because the Case Manager API
@@ -16,12 +17,16 @@ interface CasesInfoDrawerProps {
onClose: () => void;
}
+const CASE_MANAGER_SCHEMA_SVG_URL =
+ 'https://raw.githubusercontent.com/OrcaBus/service-case-manager/refs/heads/main/case-manager/docs/schema.drawio.svg';
+
export function CasesInfoDrawer({ isOpen, onClose }: CasesInfoDrawerProps) {
// Manual case creation is temporarily unavailable. Preserve this state for
// restoration alongside AddCaseModal when POST /case/ returns.
// const [showAddCaseModal, setShowAddCaseModal] = useState(false);
const [showAutoImportModal, setShowAutoImportModal] = useState(false);
const [showSyncHistoryModal, setShowSyncHistoryModal] = useState(false);
+ const [showSchemaPreviewModal, setShowSchemaPreviewModal] = useState(false);
const {
data: syncHistoryData,
@@ -78,6 +83,15 @@ export function CasesInfoDrawer({ isOpen, onClose }: CasesInfoDrawerProps) {
buttonIcon={}
variant='secondary'
/>
+ setShowSchemaPreviewModal(true)}
+ icon={}
+ buttonIcon={}
+ variant='secondary'
+ />
{/* Manual case creation is temporarily unavailable because the Case Manager API
no longer exposes POST /case/. Restore this card with AddCaseModal when
collection create support returns.
@@ -105,6 +119,17 @@ export function CasesInfoDrawer({ isOpen, onClose }: CasesInfoDrawerProps) {
isOpen={showAutoImportModal}
onClose={() => setShowAutoImportModal(false)}
/>
+
+ setShowSchemaPreviewModal(false)}
+ schemaUrl={CASE_MANAGER_SCHEMA_SVG_URL}
+ title='Case Manager Entity Schema'
+ description='Case Manager model entity diagram from service-case-manager.'
+ icon={}
+ previewSummary='SVG preview of the current Case Manager model schema.'
+ backgroundNotice='This source is theme-aware, so dark mode can render a dark canvas background.'
+ />
);
}
diff --git a/src/features/cases/components/__tests__/CaseDetailsOverviewCard.test.tsx b/src/features/cases/components/__tests__/CaseDetailsOverviewCard.test.tsx
index 9a1e078..1ae79d4 100644
--- a/src/features/cases/components/__tests__/CaseDetailsOverviewCard.test.tsx
+++ b/src/features/cases/components/__tests__/CaseDetailsOverviewCard.test.tsx
@@ -23,6 +23,7 @@ const caseDetail: CaseDetailModel = {
isNataAccredited: true,
alias: ['CASE-ALIAS'],
links: {},
+ redcapPayload: {},
dueDate: '2026-08-31',
externalEntitySet: [],
userSet: [],
diff --git a/src/features/cases/components/__tests__/EditCaseModal.test.tsx b/src/features/cases/components/__tests__/EditCaseModal.test.tsx
index ed5f04e..9c36488 100644
--- a/src/features/cases/components/__tests__/EditCaseModal.test.tsx
+++ b/src/features/cases/components/__tests__/EditCaseModal.test.tsx
@@ -41,6 +41,7 @@ const caseDetail: CaseDetailModel = {
isNataAccredited: false,
alias: ['CASE-ALIAS'],
links: { trello: 'https://example.com/card' },
+ redcapPayload: {},
dueDate: '2026-08-31',
externalEntitySet: [],
userSet: [],
diff --git a/src/features/lab/root/components/LabInfoDrawer.tsx b/src/features/lab/root/components/LabInfoDrawer.tsx
index 40e2430..166499f 100644
--- a/src/features/lab/root/components/LabInfoDrawer.tsx
+++ b/src/features/lab/root/components/LabInfoDrawer.tsx
@@ -1,7 +1,8 @@
import { useState } from 'react';
-import { LibraryBig, RefreshCw } from 'lucide-react';
+import { Database, LibraryBig, RefreshCw } from 'lucide-react';
import { DrawerFrame } from '@/components/modals/DrawerFrame';
import { InfoDrawerActionCard } from '@/components/modals/InfoDrawerActionCard';
+import { ModelViewDialog } from '@/components/modals/ModelViewDialog';
import { SyncMetadataModal } from './SyncMetadataModal';
interface LabInfoDrawerProps {
@@ -9,8 +10,12 @@ interface LabInfoDrawerProps {
onClose: () => void;
}
+const METADATA_MANAGER_SCHEMA_SVG_URL =
+ 'https://github.com/OrcaBus/service-metadata-manager/raw/refs/heads/main/metadata-manager/docs/schema.drawio.svg';
+
export function LabInfoDrawer({ isOpen, onClose }: LabInfoDrawerProps) {
const [showSyncModal, setShowSyncModal] = useState(false);
+ const [showModelViewModal, setShowModelViewModal] = useState(false);
return (
<>
@@ -32,7 +37,7 @@ export function LabInfoDrawer({ isOpen, onClose }: LabInfoDrawerProps) {