From 54db81a5b9d0519982606e9700817e927f9bdeba Mon Sep 17 00:00:00 2001 From: Khafid Prayoga Date: Tue, 28 Oct 2025 15:03:49 +0700 Subject: [PATCH] feat(installation): implement detail view and navigation for installations - Replace direct detail display with navigation to dedicated detail page - Add new installation detail components and configuration - Remove unused entry.ts file - Create new route for installation detail view --- .../app/installation/detail/index.vue | 34 +++ .../app/installation/detail/list.cfg.ts | 65 +++++ .../app/installation/detail/list.vue | 35 +++ .../installation/{list-cfg.ts => list.cfg.ts} | 11 +- app/components/app/installation/list.vue | 7 +- .../content/installation/detail.vue | 235 ++++++++++++++++++ app/components/content/installation/entry.ts | 37 --- app/components/content/installation/list.vue | 10 +- .../org-src/installation/[id]/index.vue | 42 ++++ 9 files changed, 425 insertions(+), 51 deletions(-) create mode 100644 app/components/app/installation/detail/index.vue create mode 100644 app/components/app/installation/detail/list.cfg.ts create mode 100644 app/components/app/installation/detail/list.vue rename app/components/app/installation/{list-cfg.ts => list.cfg.ts} (83%) create mode 100644 app/components/content/installation/detail.vue delete mode 100644 app/components/content/installation/entry.ts create mode 100644 app/pages/(features)/org-src/installation/[id]/index.vue diff --git a/app/components/app/installation/detail/index.vue b/app/components/app/installation/detail/index.vue new file mode 100644 index 00000000..8a668d1c --- /dev/null +++ b/app/components/app/installation/detail/index.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/app/components/app/installation/detail/list.cfg.ts b/app/components/app/installation/detail/list.cfg.ts new file mode 100644 index 00000000..bf341ff9 --- /dev/null +++ b/app/components/app/installation/detail/list.cfg.ts @@ -0,0 +1,65 @@ +import type { Config, RecComponent } from '~/components/pub/my-ui/data-table' +import { defineAsyncComponent } from 'vue' +import type { DivisionPosition } from '~/models/division-position' + +type SmallDetailDto = any + +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue')) + +export const config: Config = { + cols: [{}, {}, {}, {}, {}, { width: 50 }], + + headers: [ + [ + { label: '#' }, + { label: 'Kode Posisi' }, + { label: 'Nama Posisi' }, + { label: 'Karyawan' }, + { label: 'Status Kepala' }, + { label: '' }, + ], + ], + + keys: ['index', 'code', 'name', 'employee', 'head', 'action'], + + delKeyNames: [ + { key: 'code', label: 'Kode' }, + { key: 'name', label: 'Nama' }, + ], + + parses: { + division: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.division?.name || '-' + }, + employee: (rec: unknown): unknown => { + const recX = rec as DivisionPosition + const fullName = [recX.employee?.person.frontTitle, recX.employee?.person.name, recX.employee?.person.endTitle] + .filter(Boolean) + .join(' ') + .trim() + + return fullName || '-' + }, + head: (rec: unknown): unknown => { + const recX = rec as SmallDetailDto + return recX.headStatus ? 'Ya' : 'Tidak' + }, + }, + + components: { + action(rec, idx) { + const res: RecComponent = { + idx, + rec: rec as object, + component: action, + props: { + size: 'sm', + }, + } + return res + }, + }, + + htmls: {}, +} diff --git a/app/components/app/installation/detail/list.vue b/app/components/app/installation/detail/list.vue new file mode 100644 index 00000000..d6e760b5 --- /dev/null +++ b/app/components/app/installation/detail/list.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/app/installation/list-cfg.ts b/app/components/app/installation/list.cfg.ts similarity index 83% rename from app/components/app/installation/list-cfg.ts rename to app/components/app/installation/list.cfg.ts index f64ecea8..e2a39d80 100644 --- a/app/components/app/installation/list-cfg.ts +++ b/app/components/app/installation/list.cfg.ts @@ -3,19 +3,12 @@ import { defineAsyncComponent } from 'vue' type SmallDetailDto = any -const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-ud.vue')) +const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue')) export const config: Config = { cols: [{}, {}, {}, { width: 50 }], - headers: [ - [ - { label: 'Kode' }, - { label: 'Nama' }, - { label: 'Encounter Class' }, - { label: '' }, - ], - ], + headers: [[{ label: 'Kode' }, { label: 'Nama' }, { label: 'Encounter Class' }, { label: '' }]], keys: ['code', 'name', 'encounterClass_code', 'action'], diff --git a/app/components/app/installation/list.vue b/app/components/app/installation/list.vue index 1be60a60..6ad7dd81 100644 --- a/app/components/app/installation/list.vue +++ b/app/components/app/installation/list.vue @@ -6,7 +6,7 @@ import PaginationView from '~/components/pub/my-ui/pagination/pagination-view.vu import type { PaginationMeta } from '~/components/pub/my-ui/pagination/pagination.type' // Configs -import { config } from './list-cfg' +import { config } from './list.cfg' interface Props { data: any[] @@ -31,6 +31,9 @@ function handlePageChange(page: number) { :rows="data" :skeleton-size="paginationMeta?.pageSize" /> - + diff --git a/app/components/content/installation/detail.vue b/app/components/content/installation/detail.vue new file mode 100644 index 00000000..e9721a5b --- /dev/null +++ b/app/components/content/installation/detail.vue @@ -0,0 +1,235 @@ + + + diff --git a/app/components/content/installation/entry.ts b/app/components/content/installation/entry.ts deleted file mode 100644 index c003a029..00000000 --- a/app/components/content/installation/entry.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as z from 'zod' - -export const installationConf = { - msg: { - placeholder: '---pilih encounter class (fhir7)', - }, - items: [ - { value: '1', label: 'Ambulatory', code: 'AMB' }, - { value: '2', label: 'Inpatient', code: 'IMP' }, - { value: '3', label: 'Emergency', code: 'EMER' }, - { value: '4', label: 'Observation', code: 'OBSENC' }, - { value: '5', label: 'Pre-admission', code: 'PRENC' }, - { value: '6', label: 'Short Stay', code: 'SS' }, - { value: '7', label: 'Virtual', code: 'VR' }, - { value: '8', label: 'Home Health', code: 'HH' }, - ], -} - -export const schemaConf = z.object({ - name: z - .string({ - required_error: 'Nama instalasi harus diisi', - }) - .min(3, 'Nama instalasi minimal 3 karakter'), - - code: z - .string({ - required_error: 'Kode instalasi harus diisi', - }) - .min(3, 'Kode instalasi minimal 3 karakter'), - - encounterClassCode: z - .string({ - required_error: 'Kelompok encounter class harus dipilih', - }) - .min(1, 'Kelompok encounter class harus dipilih'), -}) diff --git a/app/components/content/installation/list.vue b/app/components/content/installation/list.vue index 31486097..dc5cf4e8 100644 --- a/app/components/content/installation/list.vue +++ b/app/components/content/installation/list.vue @@ -102,9 +102,13 @@ const getCurrentInstallationDetail = async (id: number | string) => { watch([recId, recAction], () => { switch (recAction.value) { case ActionEvents.showDetail: - getCurrentInstallationDetail(recId.value) - title.value = 'Detail Instalasi' - isReadonly.value = true + navigateTo({ + name: 'org-src-installation-id', + params: { + id: recId.value, + }, + }) + break case ActionEvents.showEdit: getCurrentInstallationDetail(recId.value) diff --git a/app/pages/(features)/org-src/installation/[id]/index.vue b/app/pages/(features)/org-src/installation/[id]/index.vue new file mode 100644 index 00000000..5d9c3302 --- /dev/null +++ b/app/pages/(features)/org-src/installation/[id]/index.vue @@ -0,0 +1,42 @@ + + +