clqms-fe1/docs/frontend-implementation-plan.md

573 lines
16 KiB
Markdown
Raw Normal View History

# CLQMS Frontend Implementation Plan
## Project Overview
**CLQMS** (Clinical Laboratory Quality Management System) frontend built with SvelteKit using the KISS (Keep It Simple) principle.
## Architecture Decisions (KISS Principles)
- **No TypeScript** - Plain JavaScript to keep it simple
- **Tailwind CSS & DaisyUI** - Utility classes, minimal custom CSS
- **Simple Fetch API** - Manual wrapper functions, no codegen
- **SvelteKit File-based Routing** - Standard patterns
- **Server-side auth checking** - SvelteKit hooks for session validation
## Project Structure
```
src/
├── lib/
│ ├── api/ # API service functions
│ │ ├── client.js # Base fetch wrapper with auth
│ │ ├── auth.js # Auth endpoints
│ │ ├── valuesets.js # ValueSet endpoints
│ │ ├── masterdata.js # Master data endpoints
│ │ ├── patients.js # Patient endpoints
│ │ └── ...
│ ├── components/ # Reusable Svelte components
│ │ ├── FormInput.svelte
│ │ ├── DataTable.svelte
│ │ ├── SelectDropdown.svelte
│ │ └── Layout.svelte
│ └── stores/ # Svelte stores
│ ├── auth.js # Auth state
│ └── valuesets.js # Cached lookup values
├── routes/
│ ├── +layout.svelte # Root layout with nav
│ ├── +page.svelte # Dashboard (home)
│ ├── login/
│ │ └── +page.svelte
│ ├── (app)/ # Group: protected routes
│ │ ├── +layout.svelte # Auth check
│ │ ├── patients/
│ │ ├── valuesets/
│ │ ├── masterdata/
│ │ └── ...
│ └── api/ # Internal API routes (if needed)
└── app.html
```
## Implementation Phases
### Phase 0: Foundation ✅ COMPLETED
**Priority:** High | **Time Estimate:** 1-2 hours | **Status:** Done
- [x] Initialize SvelteKit project with Tailwind CSS
- [x] Configure API base URL and environment variables
- [x] Create base API client with JWT token handling
- [x] Implement login/logout flow
- [x] Create root layout with navigation
- [x] Set up protected route group with auth checks
- [x] Create dashboard homepage
**Key Files:**
- `src/lib/api/client.js` - Base fetch wrapper
- `src/lib/api/auth.js` - Auth endpoints
- `src/lib/stores/auth.js` - Auth state management
- `src/routes/+layout.svelte` - Root layout
- `src/routes/(app)/+layout.svelte` - Protected layout
- `src/routes/login/+page.svelte` - Login page
---
### Phase 1: Foundation Data
**Priority:** High | **Time Estimate:** 4-6 hours
**Why First:** These are prerequisites for all other modules. ValueSets provide dropdown options; Master Data provides reference entities.
#### 1a. ValueSets Module
- [ ] ValueSet definitions list page
- [ ] ValueSet definitions create/edit form
- [ ] ValueSet items management (CRUD)
- [ ] Cache frequently used value sets in stores
**API Endpoints:**
- `GET /api/valueset` - List value set definitions
- `POST /api/valuesetdef` - Create value set definition
- `PUT /api/valuesetdef/{id}` - Update value set definition
- `DELETE /api/valuesetdef/{id}` - Delete value set definition
- `GET /api/valueset/items` - List value set items
- `POST /api/valueset/items` - Create value set item
- `PUT /api/valueset/items/{id}` - Update value set item
- `DELETE /api/valueset/items/{id}` - Delete value set item
- `POST /api/valueset/refresh` - Refresh cache
#### 1b. Master Data - Locations & Contacts
- [ ] Locations list page with search
- [ ] Locations create/edit form
- [ ] Contacts (Physicians) list page
- [ ] Contacts create/edit form
**API Endpoints:**
- `GET /api/location` - List locations
- `POST /api/location` - Create location
- `PATCH /api/location` - Update location
- `DELETE /api/location` - Delete location
- `GET /api/location/{id}` - Get location details
- `GET /api/contact` - List contacts
- `POST /api/contact` - Create contact
- `PATCH /api/contact` - Update contact
- `DELETE /api/contact` - Delete contact
- `GET /api/contact/{id}` - Get contact details
#### 1c. Master Data - Supporting Entities
- [ ] Occupations management
- [ ] Medical Specialties management
- [ ] Counters management (for ID generation)
**API Endpoints:**
- `GET /api/occupation` - List occupations
- `POST /api/occupation` - Create occupation
- `PATCH /api/occupation` - Update occupation
- `GET /api/occupation/{id}` - Get occupation details
- `GET /api/medicalspecialty` - List specialties
- `POST /api/medicalspecialty` - Create specialty
- `PATCH /api/medicalspecialty` - Update specialty
- `GET /api/medicalspecialty/{id}` - Get specialty details
- `GET /api/counter` - List counters
- `POST /api/counter` - Create counter
- `PATCH /api/counter` - Update counter
- `DELETE /api/counter` - Delete counter
- `GET /api/counter/{id}` - Get counter details
#### 1d. Master Data - Geography
- [ ] Provinces list (read-only dropdown)
- [ ] Cities list with province filter
**API Endpoints:**
- `GET /api/areageo/provinces` - List provinces
- `GET /api/areageo/cities` - List cities (with province_id filter)
---
### Phase 2: Patient Management
**Priority:** High | **Time Estimate:** 3-4 hours
**Dependencies:** Master Data (locations, contacts, occupations, provinces/cities)
#### 2a. Patient CRUD
- [ ] Patients list page with pagination and search
- [ ] Patient create form with validation
- [ ] Patient edit form
- [ ] Patient detail view
- [ ] Patient delete with confirmation
**API Endpoints:**
- `GET /api/patient` - List patients (with pagination, search)
- `POST /api/patient` - Create patient
- `PATCH /api/patient` - Update patient
- `DELETE /api/patient` - Delete patient
- `GET /api/patient/{id}` - Get patient by ID
- `GET /api/patient/check` - Check if patient exists
#### 2b. Advanced Patient Features
- [ ] Patient identifier management (KTP, PASS, SSN, etc.)
- [ ] Patient linking (family relationships)
- [ ] Custodian/guardian assignment
- [ ] Patient address management
**Fields to Implement:**
- PatientID, AlternatePID
- Prefix, NameFirst, NameMiddle, NameLast, NameMaiden, Suffix
- Sex, Birthdate, PlaceOfBirth, Citizenship
- Address fields (Street_1/2/3, ZIP, Province, City, Country)
- Contact (Phone, MobilePhone, EmailAddress1/2)
- Identifiers (PatIdt - type and number)
- Demographics (Race, MaritalStatus, Religion, Ethnic)
- Linked patients (LinkTo)
- Custodian
- DeathIndicator, TimeOfDeath
- Comments (PatCom)
---
### Phase 3: Patient Visits
**Priority:** High | **Time Estimate:** 2-3 hours
**Dependencies:** Patients, Master Data (locations, contacts)
- [ ] Visits list page with filters
- [ ] Create visit form
- [ ] Edit visit form
- [ ] View visits by patient
- [ ] ADT workflow (Admit/Discharge/Transfer)
**API Endpoints:**
- `GET /api/patvisit` - List visits
- `POST /api/patvisit` - Create visit
- `PATCH /api/patvisit` - Update visit
- `DELETE /api/patvisit` - Delete visit
- `GET /api/patvisit/{id}` - Get visit by ID
- `GET /api/patvisit/patient/{patientId}` - Get visits by patient
- `POST /api/patvisitadt` - Create ADT visit
- `PATCH /api/patvisitadt` - Update ADT visit
**Fields:**
- VisitID, PatientID, VisitDate, VisitType
- SiteID, LocationID, DepartmentID
- AttendingPhysician, ReferringPhysician
---
### Phase 4: Specimen Management
**Priority:** Medium | **Time Estimate:** 2-3 hours
**Dependencies:** ValueSets (specimen types, collection methods, statuses)
- [ ] Specimens list page
- [ ] Specimen create/edit forms
- [ ] Container definitions management
- [ ] Specimen preparation methods
- [ ] Specimen statuses
- [ ] Collection methods
**API Endpoints:**
- `GET /api/specimen` - List specimens
- `POST /api/specimen` - Create specimen
- `PATCH /api/specimen` - Update specimen
- `GET /api/specimen/{id}` - Get specimen details
- `GET /api/specimen/container` - List containers
- `POST /api/specimen/container` - Create container
- `PATCH /api/specimen/container` - Update container
- `GET /api/specimen/container/{id}` - Get container details
- `GET /api/specimen/prep` - List preparations
- `POST /api/specimen/prep` - Create preparation
- `PATCH /api/specimen/prep` - Update preparation
- `GET /api/specimen/prep/{id}` - Get preparation details
- `GET /api/specimen/status` - List statuses
- `POST /api/specimen/status` - Create status
- `PATCH /api/specimen/status` - Update status
- `GET /api/specimen/status/{id}` - Get status details
- `GET /api/specimen/collection` - List collection methods
- `POST /api/specimen/collection` - Create collection method
- `PATCH /api/specimen/collection` - Update collection method
- `GET /api/specimen/collection/{id}` - Get collection method details
---
### Phase 5: Test Catalog
**Priority:** Medium | **Time Estimate:** 2-3 hours
**Dependencies:** Organization (disciplines, departments), ValueSets
- [ ] Test definitions list with filtering
- [ ] Create/edit test definitions
- [ ] Test mapping management (host/client codes)
**API Endpoints:**
- `GET /api/tests` - List tests (with filters)
- `POST /api/tests` - Create test
- `PATCH /api/tests` - Update test
- `GET /api/tests/{id}` - Get test details
**Test Types:** TEST, PARAM, CALC, GROUP, TITLE
---
### Phase 6: Orders
**Priority:** High | **Time Estimate:** 3-4 hours
**Dependencies:** Patients, Visits, Tests, Specimen, ValueSets (priorities, statuses)
- [ ] Orders list with status filtering
- [ ] Create order with test selection
- [ ] Order detail view
- [ ] Update order status
- [ ] Order items management
**API Endpoints:**
- `GET /api/ordertest` - List orders (with filters)
- `POST /api/ordertest` - Create order
- `PATCH /api/ordertest` - Update order
- `DELETE /api/ordertest` - Delete order
- `GET /api/ordertest/{id}` - Get order details
- `POST /api/ordertest/status` - Update order status
---
### Phase 7: Results & Dashboard
**Priority:** High | **Time Estimate:** 2-3 hours
**Dependencies:** Orders
- [ ] Dashboard with summary cards
- [ ] Results list with patient filtering
- [ ] Sample tracking view
**API Endpoints:**
- `GET /api/dashboard` - Get dashboard summary
- `GET /api/result` - Get patient results
- `GET /api/sample` - Get samples
**Dashboard Metrics:**
- pendingOrders
- todayResults
- criticalResults
- activePatients
---
### Phase 8: Organization Structure
**Priority:** Medium | **Time Estimate:** 2-3 hours
- [ ] Accounts management
- [ ] Sites management
- [ ] Disciplines management
- [ ] Departments management
- [ ] Workstations management
**API Endpoints:**
- `GET /api/organization/account` - List accounts
- `POST /api/organization/account` - Create account
- `PATCH /api/organization/account` - Update account
- `DELETE /api/organization/account` - Delete account
- `GET /api/organization/account/{id}` - Get account details
- `GET /api/organization/site` - List sites
- `POST /api/organization/site` - Create site
- `PATCH /api/organization/site` - Update site
- `DELETE /api/organization/site` - Delete site
- `GET /api/organization/site/{id}` - Get site details
- `GET /api/organization/discipline` - List disciplines
- `POST /api/organization/discipline` - Create discipline
- `PATCH /api/organization/discipline` - Update discipline
- `DELETE /api/organization/discipline` - Delete discipline
- `GET /api/organization/discipline/{id}` - Get discipline details
- `GET /api/organization/department` - List departments
- `POST /api/organization/department` - Create department
- `PATCH /api/organization/department` - Update department
- `DELETE /api/organization/department` - Delete department
- `GET /api/organization/department/{id}` - Get department details
- `GET /api/organization/workstation` - List workstations
- `POST /api/organization/workstation` - Create workstation
- `PATCH /api/organization/workstation` - Update workstation
- `DELETE /api/organization/workstation` - Delete workstation
- `GET /api/organization/workstation/{id}` - Get workstation details
---
### Phase 9: Edge API (Instrument Integration)
**Priority:** Low | **Time Estimate:** 2-3 hours
- [ ] Edge results viewer
- [ ] Pending orders for instruments
- [ ] Instrument status monitoring
**API Endpoints:**
- `GET /api/edge/orders` - Fetch pending orders
- `POST /api/edge/orders/{orderId}/ack` - Acknowledge order
- `POST /api/edge/status` - Log instrument status
---
## Reusable Components to Build
### 1. FormInput.svelte
Text input with label, validation, and error display.
```svelte
<FormInput
label="Patient ID"
name="patientId"
value={patientId}
required
pattern="[A-Za-z0-9]+"
/>
```
### 2. SelectDropdown.svelte
Dropdown populated from ValueSets or API data.
```svelte
<SelectDropdown
label="Gender"
name="sex"
value={sex}
options={genderOptions}
/>
```
### 3. DataTable.svelte
Sortable, paginated table with actions.
```svelte
<DataTable
columns={['ID', 'Name', 'Status']}
data={patients}
onEdit={handleEdit}
onDelete={handleDelete}
pagination={true}
/>
```
### 4. SearchBar.svelte
Search input with debounce.
### 5. Modal.svelte
Reusable modal for confirmations and forms.
---
## Code Patterns
### API Client Pattern
```javascript
// lib/api/client.js
const API_BASE = import.meta.env.VITE_API_URL || 'http://localhost/clqms01';
export async function apiFetch(endpoint, options = {}) {
const token = get(authToken);
const res = await fetch(`${API_BASE}${endpoint}`, {
...options,
headers: {
'Content-Type': 'application/json',
...(token && { 'Authorization': `Bearer ${token}` }),
...options.headers
}
});
if (res.status === 401) {
// Handle unauthorized
authToken.set(null);
goto('/login');
return;
}
return res.json();
}
```
### Form Handling Pattern
```svelte
<script>
let formData = { name: '', email: '' };
let errors = {};
let loading = false;
async function handleSubmit() {
loading = true;
errors = {};
const result = await createItem(formData);
if (result.status === 'error') {
errors = result.errors || { general: result.message };
} else {
// Success - redirect or show message
}
loading = false;
}
</script>
<form on:submit|preventDefault={handleSubmit}>
<FormInput
label="Name"
bind:value={formData.name}
error={errors.name}
/>
<button type="submit" disabled={loading}>
{loading ? 'Saving...' : 'Save'}
</button>
</form>
```
### Store Pattern for ValueSets
```javascript
// lib/stores/valuesets.js
import { writable } from 'svelte/store';
export const valueSets = writable({});
export async function loadValueSet(code) {
const res = await fetch(`/api/valueset?VSetCode=${code}`);
const data = await res.json();
valueSets.update(vs => ({
...vs,
[code]: data.data || []
}));
}
// Usage in component:
// onMount(() => loadValueSet('GENDER'));
```
---
## Environment Setup
Create `.env` file:
```
VITE_API_URL=http://localhost/clqms01
```
---
## Getting Started
1. **Initialize SvelteKit:**
```bash
npm create svelte@latest clqms-fe
cd clqms-fe
npm install
npx svelte-add@latest tailwindcss
npm install
```
2. **Configure tailwind.config.js:**
```javascript
export default {
content: ['./src/**/*.{html,js,svelte,ts}'],
theme: { extend: {} },
plugins: []
};
```
3. **Start with Phase 0:**
- Create API client
- Set up auth stores
- Build login page
- Create protected layout
---
## Navigation Structure
```
Dashboard (Home)
├── Master Data
│ ├── ValueSets
│ ├── Locations
│ ├── Contacts
│ ├── Occupations
│ ├── Medical Specialties
│ └── Counters
├── Organization
│ ├── Accounts
│ ├── Sites
│ ├── Disciplines
│ ├── Departments
│ └── Workstations
├── Patients
│ ├── All Patients
│ └── Patient Visits
├── Laboratory
│ ├── Specimens
│ ├── Tests
│ ├── Orders
│ └── Results
└── Edge
└── Instrument Status
```
---
## Notes
- Use `+layout.server.js` for server-side auth checks
- Use SvelteKit's `invalidateAll()` after mutations
- Cache ValueSets in localStorage for better UX
- Implement optimistic updates where appropriate
- Use loading states for all async operations
- Add toast notifications for success/error feedback