diff --git a/src/lib/api/tests.js b/src/lib/api/tests.js index 7b3e7e6..41fa9af 100644 --- a/src/lib/api/tests.js +++ b/src/lib/api/tests.js @@ -20,7 +20,7 @@ import { get, post, patch } from './client.js'; */ export async function fetchTests(params = {}) { const query = new URLSearchParams(params).toString(); - return get(query ? `/api/tests?${query}` : '/api/tests'); + return get(query ? `/api/test?${query}` : '/api/test'); } /** @@ -29,7 +29,7 @@ export async function fetchTests(params = {}) { * @returns {Promise} API response with test detail */ export async function fetchTest(id) { - return get(`/api/tests/${id}`); + return get(`/api/test/${id}`); } /** @@ -157,7 +157,7 @@ function buildPayload(formData, isUpdate = false) { */ export async function createTest(formData) { const payload = buildPayload(formData, false); - return post('/api/tests', payload); + return post('/api/test', payload); } /** @@ -167,7 +167,7 @@ export async function createTest(formData) { */ export async function updateTest(formData) { const payload = buildPayload(formData, true); - return patch('/api/tests', payload); + return patch('/api/test', payload); } /** @@ -176,7 +176,7 @@ export async function updateTest(formData) { * @returns {Promise} API response */ export async function deleteTest(id) { - return patch('/api/tests', { +return patch('/api/test', { TestSiteID: id, IsActive: '0', }); diff --git a/src/routes/(app)/master-data/tests/+page.svelte b/src/routes/(app)/master-data/tests/+page.svelte index 92bbcc7..d889964 100644 --- a/src/routes/(app)/master-data/tests/+page.svelte +++ b/src/routes/(app)/master-data/tests/+page.svelte @@ -7,15 +7,15 @@ import Modal from '$lib/components/Modal.svelte'; import TestFormModal from './test-modal/TestFormModal.svelte'; import TestTypePickerModal from './test-modal/modals/TestTypePickerModal.svelte'; - import { Plus, Edit2, Trash2, ArrowLeft, Search, Microscope, Variable, Calculator, Box, Layers, Loader2, Users, ChevronLeft, ChevronRight } from 'lucide-svelte'; + import { Plus, Edit2, Trash2, ArrowLeft, Search, Microscope, Variable, Calculator, Box, Layers, Loader2, Users, ChevronLeft, ChevronRight, Hash, Type } from 'lucide-svelte'; // Pagination and search state let loading = $state(false); let tests = $state([]); let disciplines = $state([]); let departments = $state([]); - let searchQuery = $state(''); - let searchType = $state('all'); // 'all', 'code', 'name' + let searchCode = $state(''); + let searchName = $state(''); let currentPage = $state(1); let perPage = $state(25); let totalItems = $state(0); @@ -56,15 +56,13 @@ function getSearchParams() { const params = { page: currentPage, perPage }; - const query = searchQuery.trim(); - if (query) { - if (searchType === 'code') { - params.testCode = query; - } else if (searchType === 'name') { - params.testName = query; - } else { - params.search = query; - } + const testCode = searchCode.trim(); + const testName = searchName.trim(); + if (testCode) { + params.TestSiteCode = testCode; + } + if (testName) { + params.TestSiteName = testName; } return params; } @@ -80,22 +78,25 @@ } onMount(async () => { - await Promise.all([loadTests(), loadDisciplines(), loadDepartments()]); + await Promise.all([loadDisciplines(), loadDepartments()]); }); - function handleSearchInput() { - handleSearch(); - } - function handleSearchTypeChange(newType) { searchType = newType; - handleSearch(); } function clearSearch() { - searchQuery = ''; + searchCode = ''; + searchName = ''; currentPage = 1; - loadTests(); + tests = []; + totalItems = 0; + totalPages = 0; + hasMore = false; + } + + function hasSearchQuery() { + return searchCode.trim() || searchName.trim(); } async function loadTests(reset = false) { @@ -241,45 +242,55 @@
-
- - - -
-
-
{:else} diff --git a/src/routes/(app)/master-data/tests/test-modal/TestFormModal.svelte b/src/routes/(app)/master-data/tests/test-modal/TestFormModal.svelte index a185711..6b77659 100644 --- a/src/routes/(app)/master-data/tests/test-modal/TestFormModal.svelte +++ b/src/routes/(app)/master-data/tests/test-modal/TestFormModal.svelte @@ -1,6 +1,6 @@ -
+

Numeric Reference Ranges

-
- -
- Numeric Ranges: Define normal, critical, and validation ranges for numeric test results. -
-
+ +
+ {#if validationError} +
+ {validationError} +
+ {/if} - -
- {#if formData.refnum?.length === 0} - -
- {#if validationErrors.simple} -
- {validationErrors.simple} -
- {/if} + +
+ +
+ + +
- -
- {#if simpleRefNum.RangeType === 'THOLD'} - -
- -
- - -
-
-
- -
- - -
-
- {:else} - -
- - -
-
- - -
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ {#if isEditing} + {/if} -
- - -
-
- - Advanced Options - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - {#if simpleRefNum.RangeType === 'THOLD'} -
-
- - -
-
- - -
-
- {/if} -
-
-
- -
-
- {:else} - -
- {#each formData.refnum as ref, idx (idx)} -
-
- - {#if ref.RangeType === 'THOLD' && ref.LowSign} - {getSignLabel(ref.LowSign)} - {/if} - {ref.Low !== null && ref.Low !== '' ? ref.Low : '—'} - - - {#if ref.RangeType === 'THOLD' && ref.HighSign} - {getSignLabel(ref.HighSign)} - {/if} - {ref.High !== null && ref.High !== '' ? ref.High : '—'} - - - {getSexLabel(ref.Sex)} - {#if ref.AgeStart > 0 || ref.AgeEnd < 54750} - · {getAgeDisplay(ref.AgeStart)}-{getAgeDisplay(ref.AgeEnd)} - {/if} - -
- +
+ + +
+ +
+ + + {#if showAdvanced} +
+ +
+ +
+ +
- {/each} - - -
- {#if validationErrors.simple} -
- {validationErrors.simple} -
- {/if} - -
- {#if simpleRefNum.RangeType === 'THOLD'} - -
-
- -
- - -
-
-
- -
- - -
-
-
- {:else} - -
- - -
-
- - -
- {/if} -
- - -
- + + +
+ +
- - -
- - Advanced - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - {#if simpleRefNum.RangeType === 'THOLD'} -
-
- - -
-
- - -
-
- {/if} -
-
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ +
{/if}
+ + +
+

+ Current Ranges ({formData.refnum?.length || 0}) +

+ + {#if !formData.refnum || formData.refnum.length === 0} +
+ +

No numeric ranges defined

+

Add reference ranges using the form above

+
+ {:else} +
+ + + + + + + + + + + + + + + {#each formData.refnum as ref, idx (idx)} + + + + + + + + + + + {/each} + +
TypeRangeSexAgeSpecimenFlagDispActions
{getNumRefTypeLabel(ref.NumRefType)} + {ref.Low !== null && ref.Low !== '' ? ref.Low : '—'} + - + {ref.High !== null && ref.High !== '' ? ref.High : '—'} + {getSexLabel(ref.Sex)}{getAgeDisplay(ref.AgeStart)}-{getAgeDisplay(ref.AgeEnd)}{ref.SpcType || '—'}{ref.Flag || '—'}{getDisplayLabel(ref.Display)} +
+ + +
+
+
+ {/if} +
diff --git a/src/routes/(app)/master-data/tests/test-modal/tabs/RefTxtTab.svelte b/src/routes/(app)/master-data/tests/test-modal/tabs/RefTxtTab.svelte index 23ca865..6d0eb6c 100644 --- a/src/routes/(app)/master-data/tests/test-modal/tabs/RefTxtTab.svelte +++ b/src/routes/(app)/master-data/tests/test-modal/tabs/RefTxtTab.svelte @@ -1,17 +1,17 @@ -
+

Text Reference Ranges

@@ -142,14 +173,131 @@
-
-

Current Ranges ({formData.reftxt?.length || 0})

+ +
+

+ {isEditing ? 'Edit Reference' : 'Add New Reference'} +

+ + {#if validationError} +
+ {validationError} +
+ {/if} + + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + Age Range (Optional) + +
+
+
+ +
+ + {simpleRefTxt.AgeUnit} +
+
+
+ +
+ + {simpleRefTxt.AgeUnit} +
+
+
+
+ + +
+ +
+ Quick presets: +
+ + + +
+
+
+
+
+ + +
+ {#if isEditing} + + {/if} + +
+
+ + +
+

+ Current References ({formData.reftxt?.length || 0}) +

{#if !formData.reftxt || formData.reftxt.length === 0}
-

No text ranges defined

-

Add reference ranges for this test

+

No text references defined

+

Add reference text using the form above

{:else}
@@ -164,32 +312,32 @@ - {#each formData.reftxt as range, idx (idx)} + {#each formData.reftxt as ref, idx (idx)} - {getRefTypeLabel(range.TxtRefType)} + {getRefTypeLabel(ref.TxtRefType)} - {getSexLabel(range.Sex)} - {getAgeDisplay(range.AgeStart)}-{getAgeDisplay(range.AgeEnd)} - {range.RefTxt || '-'} + {getSexLabel(ref.Sex)} + {getAgeDisplay(ref.AgeStart)}-{getAgeDisplay(ref.AgeEnd)} + {ref.RefTxt || '-'}
@@ -202,98 +350,4 @@
{/if}
- -
- -
-
- - -
-
- - -
- -
- - -
- - -
-

Age Range

-
- -
- - - Both age values will use this unit -
- - -
-
- -
- - {editingRange.AgeUnit} -
-
-
- -
- - {editingRange.AgeUnit} -
-
-
- - -
- Quick presets: -
- - - - -
-
-
-
- -
- - -
-
- - {#snippet footer()} - - - {/snippet} -
+
\ No newline at end of file diff --git a/src/routes/(app)/master-data/tests/test-modal/tabs/TechDetailsTab.svelte b/src/routes/(app)/master-data/tests/test-modal/tabs/TechDetailsTab.svelte index 24a118e..656e4f5 100644 --- a/src/routes/(app)/master-data/tests/test-modal/tabs/TechDetailsTab.svelte +++ b/src/routes/(app)/master-data/tests/test-modal/tabs/TechDetailsTab.svelte @@ -1,46 +1,13 @@ + +
+

Threshold References

+ + +
+ {#if validationError} +
+ {validationError} +
+ {/if} + + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+ {#if isEditing} + + {/if} + +
+
+
+ + +
+ +
+ + + {#if showAdvanced} +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ + +
+
+ {/if} +
+ + +
+

+ Current Thresholds ({formData.refnum?.length || 0}) +

+ + {#if !formData.refnum || formData.refnum.length === 0} +
+ +

No threshold references defined

+

Add threshold references using the form above

+
+ {:else} +
+ + + + + + + + + + + + + + + {#each formData.refnum as ref, idx (idx)} + + + + + + + + + + + {/each} + +
TypeThresholdSexAgeSpecimenFlagDispActions
{getNumRefTypeLabel(ref.NumRefType)} + {#if ref.LowSign} + {getSignLabel(ref.LowSign)} + {/if} + {ref.Low !== null && ref.Low !== '' ? ref.Low : '—'} + - + {#if ref.HighSign} + {getSignLabel(ref.HighSign)} + {/if} + {ref.High !== null && ref.High !== '' ? ref.High : '—'} + {getSexLabel(ref.Sex)}{getAgeDisplay(ref.AgeStart)}-{getAgeDisplay(ref.AgeEnd)}{ref.SpcType || '—'}{ref.Flag || '—'}{getDisplayLabel(ref.Display)} +
+ + +
+
+
+ {/if} +
+