chore: finish workspace cleanup
This commit is contained in:
@@ -377,7 +377,7 @@ await database
|
||||
- Good: use one additive `care_tasks` table for MVP execution records instead of building a full recurring care-plan engine.
|
||||
- Good: preserve `/app/health` separation; care execution is operational and not the health admin settings page.
|
||||
- Base: `elderId` can be nullable for future public-area checks, but seeded MVP examples should use real elders.
|
||||
- Bad: render fake care metrics in `ModulePage` after the module becomes real.
|
||||
- Bad: render fake care metrics in a static placeholder after the module becomes real.
|
||||
- Bad: update task status by ID alone without `organizationId`.
|
||||
- Bad: only disable buttons in the UI while leaving Route Handlers on broad elder permissions.
|
||||
|
||||
|
||||
@@ -165,44 +165,17 @@ The project Dialog adapter must:
|
||||
|
||||
### Static Module Data Contract
|
||||
|
||||
Static or reserved module pages must not fabricate operational data. If a module does
|
||||
not have a Drizzle-backed query/API and real persisted records, render a clear empty or
|
||||
not-connected state instead of generated counters, fake workflows, sample records, or
|
||||
mock priority/status rows.
|
||||
Operational module pages must not fabricate data. If a module does not have a
|
||||
Drizzle-backed query/API and real persisted records, render a clear empty or
|
||||
not-connected state inside that module's own route/component instead of generated
|
||||
counters, fake workflows, sample records, or mock priority/status rows.
|
||||
|
||||
`modules/shared/components/ModulePage.tsx` is the shared placeholder for these modules.
|
||||
Its props should stay descriptive only:
|
||||
The old shared reserved-module placeholder components were removed after devices,
|
||||
notices, alerts, family, health, care, and emergency became real persisted workspaces.
|
||||
Do not reintroduce a generic `ReservedModulePages` layer for operational modules.
|
||||
|
||||
```typescript
|
||||
type ModulePageProps = {
|
||||
title: string;
|
||||
eyebrow: string;
|
||||
description: string;
|
||||
icon: LucideIcon;
|
||||
phase: "待接入" | "二期预留" | "三期预留";
|
||||
};
|
||||
```
|
||||
|
||||
```typescript
|
||||
// Bad: static pages pretending to have live business data.
|
||||
<ModulePage
|
||||
title="Care"
|
||||
metrics={[{ label: "Today", value: "184", detail: "142 done" }]}
|
||||
workflows={["Create plan", "Dispatch task"]}
|
||||
/>
|
||||
|
||||
// Good: no fabricated records until a real data source exists.
|
||||
<ModulePage
|
||||
title="Care"
|
||||
eyebrow="Plans and inspections"
|
||||
description="Pending connection to care plans, task dispatch, and execution records."
|
||||
icon={ClipboardCheck}
|
||||
phase="待接入"
|
||||
/>
|
||||
```
|
||||
|
||||
When a module becomes real, replace the placeholder with a Server Component that loads
|
||||
data from the server boundary and pass only persisted, permission-filtered data into
|
||||
When a module becomes real, implement the route as a Server Component that loads data
|
||||
from the server boundary and passes only persisted, permission-filtered data into
|
||||
client components.
|
||||
|
||||
### App Shell Tenant and Account Menu Contract
|
||||
|
||||
Reference in New Issue
Block a user