2026-02-10 06:43:07 +07:00
|
|
|
# AGENTS.md - Coding Guidelines for CLQMS Frontend
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
SvelteKit frontend for Clinical Laboratory Quality Management System. Uses Svelte 5 runes, TailwindCSS 4, DaisyUI, and Lucide icons.
|
2026-02-10 06:43:07 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## Commands
|
2026-02-10 06:43:07 +07:00
|
|
|
|
|
|
|
|
```bash
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
# Development
|
|
|
|
|
pnpm run dev # Start development server
|
|
|
|
|
pnpm run build # Production build (outputs to build/)
|
2026-02-24 06:12:17 +07:00
|
|
|
pnpm run preview # Preview production build
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
pnpm run prepare # Sync SvelteKit (runs on install)
|
|
|
|
|
|
|
|
|
|
# Package management
|
|
|
|
|
pnpm install # Install dependencies (use pnpm, not npm/yarn)
|
|
|
|
|
|
|
|
|
|
# Testing (not configured yet - add when needed)
|
|
|
|
|
# vitest run src/path/to/test.js # Run single test
|
|
|
|
|
# vitest # Run tests in watch mode
|
|
|
|
|
# npx playwright test # E2E tests
|
2026-02-24 06:12:17 +07:00
|
|
|
```
|
2026-02-10 06:43:07 +07:00
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
**No ESLint/Prettier configured yet.** When adding: configure in `vite.config.js` or separate config files.
|
2026-02-10 06:43:07 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## Code Style
|
2026-02-10 06:43:07 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
- **ES Modules**: `import`/`export` (type: "module")
|
|
|
|
|
- **Semicolons**: Required
|
|
|
|
|
- **Quotes**: Single quotes
|
|
|
|
|
- **Indentation**: 2 spaces
|
|
|
|
|
- **Trailing commas**: In multi-line objects/arrays
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
- **JSDoc**: Document all exported functions with `@param` and `@returns`
|
2026-02-10 06:43:07 +07:00
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
### Imports Order
|
2026-02-10 06:43:07 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
1. Svelte (`svelte`, `$app/*`)
|
|
|
|
|
2. `$lib/*` (stores, api, components, utils)
|
|
|
|
|
3. External libraries (`lucide-svelte`)
|
|
|
|
|
4. Relative imports (minimize, prefer `$lib`)
|
2026-02-10 06:43:07 +07:00
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
## Naming Conventions
|
|
|
|
|
|
|
|
|
|
- **Components**: PascalCase (`LoginForm.svelte`, `PatientFormModal.svelte`)
|
|
|
|
|
- **Files/Routes**: lowercase with hyphens (`+page.svelte`, `user-profile/`)
|
|
|
|
|
- **Variables**: camelCase (`isLoading`, `userName`)
|
|
|
|
|
- **Constants**: UPPER_SNAKE_CASE (`API_URL`, `STORAGE_KEY`)
|
|
|
|
|
- **Stores**: camelCase, descriptive (`auth`, `config`, `userStore`)
|
|
|
|
|
- **Event handlers**: prefix with `handle` (`handleSubmit`, `handleClick`)
|
|
|
|
|
- **Form state**: `formLoading`, `formError`, `deleteConfirmOpen`
|
|
|
|
|
|
|
|
|
|
## Svelte 5 Component Structure
|
2026-02-10 06:43:07 +07:00
|
|
|
|
|
|
|
|
```svelte
|
|
|
|
|
<script>
|
2026-02-24 06:12:17 +07:00
|
|
|
// 1. Imports
|
2026-02-10 06:43:07 +07:00
|
|
|
import { onMount } from 'svelte';
|
|
|
|
|
import { goto } from '$app/navigation';
|
|
|
|
|
import { auth } from '$lib/stores/auth.js';
|
2026-02-24 06:12:17 +07:00
|
|
|
import { User } from 'lucide-svelte';
|
2026-02-20 13:51:54 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
// 2. Props with $bindable
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
let { open = $bindable(false), title = '', children, footer } = $props();
|
2026-02-20 13:51:54 +07:00
|
|
|
|
2026-02-10 06:43:07 +07:00
|
|
|
// 3. State
|
|
|
|
|
let loading = $state(false);
|
2026-02-24 06:12:17 +07:00
|
|
|
let formData = $state({ name: '' });
|
2026-02-20 13:51:54 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
// 4. Derived
|
|
|
|
|
let isValid = $derived(formData.name.length > 0);
|
2026-02-20 13:51:54 +07:00
|
|
|
|
2026-02-10 06:43:07 +07:00
|
|
|
// 5. Effects
|
2026-02-20 13:51:54 +07:00
|
|
|
$effect(() => { /* side effects */ });
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
// 6. Handlers
|
|
|
|
|
function handleSubmit() { /* impl */ }
|
2026-02-10 06:43:07 +07:00
|
|
|
</script>
|
|
|
|
|
```
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## API Patterns
|
2026-02-10 06:43:07 +07:00
|
|
|
|
|
|
|
|
```javascript
|
2026-02-24 06:12:17 +07:00
|
|
|
// src/lib/api/client.js - Use these helpers
|
|
|
|
|
import { get, post, put, patch, del } from '$lib/api/client.js';
|
2026-02-10 06:43:07 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
// Feature endpoints (with JSDoc)
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
/** @param {Object} params - Query parameters */
|
2026-02-20 13:51:54 +07:00
|
|
|
export async function fetchItems(params = {}) {
|
|
|
|
|
const query = new URLSearchParams(params).toString();
|
|
|
|
|
return get(query ? `/api/items?${query}` : '/api/items');
|
2026-02-10 06:43:07 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function createItem(data) {
|
|
|
|
|
return post('/api/items', data);
|
|
|
|
|
}
|
2026-02-20 13:51:54 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
export async function updateItem(id, data) {
|
|
|
|
|
return patch(`/api/items/${id}`, data);
|
2026-02-20 13:51:54 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function deleteItem(id) {
|
|
|
|
|
return del(`/api/items/${id}`);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## Store Patterns
|
2026-02-20 13:51:54 +07:00
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
import { writable } from 'svelte/store';
|
|
|
|
|
import { browser } from '$app/environment';
|
|
|
|
|
|
|
|
|
|
function createStore() {
|
|
|
|
|
const getInitialState = () => {
|
|
|
|
|
if (!browser) return { data: null };
|
2026-02-24 06:12:17 +07:00
|
|
|
return JSON.parse(localStorage.getItem('key'));
|
2026-02-20 13:51:54 +07:00
|
|
|
};
|
|
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
const { subscribe, set, update } = writable(getInitialState());
|
2026-02-20 13:51:54 +07:00
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
subscribe,
|
|
|
|
|
setData: (data) => {
|
|
|
|
|
if (browser) localStorage.setItem('key', JSON.stringify(data));
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
set({ data });
|
2026-02-20 13:51:54 +07:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## Component Patterns
|
2026-02-20 13:51:54 +07:00
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
### Modal with Snippets
|
|
|
|
|
|
2026-02-20 13:51:54 +07:00
|
|
|
```svelte
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
<Modal bind:open={showModal} title="Edit Item" size="lg">
|
2026-02-24 06:12:17 +07:00
|
|
|
{#snippet children()}
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
<form onsubmit={handleSubmit}>
|
|
|
|
|
<input class="input input-bordered" bind:value={formData.name} />
|
|
|
|
|
</form>
|
2026-02-24 06:12:17 +07:00
|
|
|
{/snippet}
|
|
|
|
|
{#snippet footer()}
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
<button class="btn btn-ghost" onclick={() => showModal = false}>Cancel</button>
|
|
|
|
|
<button class="btn btn-primary" onclick={handleSubmit}>Save</button>
|
2026-02-24 06:12:17 +07:00
|
|
|
{/snippet}
|
|
|
|
|
</Modal>
|
2026-02-10 06:43:07 +07:00
|
|
|
```
|
|
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
### Form with Validation
|
2026-02-20 13:51:54 +07:00
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
let formLoading = $state(false);
|
|
|
|
|
let formError = $state('');
|
|
|
|
|
let formData = $state({ username: '', password: '' });
|
|
|
|
|
|
|
|
|
|
function validateForm() {
|
|
|
|
|
formError = '';
|
|
|
|
|
if (!formData.username.trim()) {
|
|
|
|
|
formError = 'Username is required';
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleSubmit() {
|
|
|
|
|
if (!validateForm()) return;
|
|
|
|
|
formLoading = true;
|
|
|
|
|
try {
|
|
|
|
|
await api.submit(formData);
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
toastSuccess('Success');
|
2026-02-20 13:51:54 +07:00
|
|
|
} catch (err) {
|
|
|
|
|
formError = err.message;
|
|
|
|
|
} finally {
|
|
|
|
|
formLoading = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
## Error Handling
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
try {
|
|
|
|
|
const result = await api.fetchData();
|
|
|
|
|
toastSuccess('Operation successful');
|
|
|
|
|
} catch (err) {
|
|
|
|
|
const message = err.message || 'An unexpected error occurred';
|
|
|
|
|
toastError(message);
|
|
|
|
|
console.error('Operation failed:', err);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## Styling (DaisyUI + Tailwind)
|
2026-02-20 13:51:54 +07:00
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
- **Components**: `btn`, `card`, `alert`, `input`, `navbar`, `modal`, `dropdown`, `menu`
|
2026-02-24 06:12:17 +07:00
|
|
|
- **Colors**: `primary` (emerald), `secondary` (dark blue), `accent` (royal blue)
|
|
|
|
|
- **Sizes**: `btn-sm`, `input-sm`, `select-sm` for compact forms
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
- **Custom**: `.compact-y`, `.compact-p`, `.compact-input`, `.compact-btn`, `.compact-card`
|
2026-02-16 15:58:06 +07:00
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
## Project Structure
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
src/
|
|
|
|
|
lib/
|
|
|
|
|
api/ # API clients per feature
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
stores/ # Svelte stores (auth, config, valuesets)
|
|
|
|
|
components/ # Reusable components (Modal, DataTable, Sidebar)
|
2026-02-24 06:12:17 +07:00
|
|
|
utils/ # Utilities (toast, helpers)
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
types/ # TypeScript type definitions
|
2026-02-24 06:12:17 +07:00
|
|
|
routes/ # SvelteKit routes
|
|
|
|
|
(app)/ # Route groups (protected)
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
dashboard/
|
|
|
|
|
patients/
|
|
|
|
|
master-data/
|
|
|
|
|
login/ # Public routes
|
2026-02-24 06:12:17 +07:00
|
|
|
```
|
2026-02-16 15:58:06 +07:00
|
|
|
|
feat(equipment,organization): add equipment API client and complete organization module structure
- Add equipment.js API client with full CRUD operations
- Add organization sub-routes: account, department, discipline, instrument, site, workstation
- Create EquipmentModal and DeleteConfirmModal components
- Update master-data navigation and sidebar
- Update tests, containers, counters, geography, locations, occupations, specialties, testmap, and valuesets pages
- Add COMPONENT_ORGANIZATION.md documentation
2026-02-24 16:53:04 +07:00
|
|
|
## Authentication
|
|
|
|
|
|
|
|
|
|
- Check `$auth.isAuthenticated` in layout `onMount`
|
|
|
|
|
- Redirect to `/login` if unauthenticated using `goto('/login')`
|
|
|
|
|
- API client auto-redirects on 401
|
|
|
|
|
|
|
|
|
|
## LocalStorage
|
|
|
|
|
|
|
|
|
|
- Only access in browser: check `browser` from `$app/environment`
|
|
|
|
|
- Use descriptive keys: `clqms_username`, `clqms_remember`, `auth_token`
|
|
|
|
|
|
2026-02-10 06:43:07 +07:00
|
|
|
## Important Notes
|
|
|
|
|
|
2026-02-24 06:12:17 +07:00
|
|
|
- Uses Svelte 5: `$props`, `$state`, `$derived`, `$effect`, `$bindable`
|
2026-02-20 13:51:54 +07:00
|
|
|
- Static adapter configured for static export
|
|
|
|
|
- Runtime config allows API URL changes without rebuild
|
2026-02-24 06:12:17 +07:00
|
|
|
- API proxy: `/api` → `http://localhost:8000` (dev)
|
|
|
|
|
- API Docs: https://clqms01-api.services-summit.my.id/swagger/
|