Files
Web-Antrean/composables/useQueue.js
2025-10-21 08:31:00 +07:00

181 lines
5.0 KiB
JavaScript

// composables/useQueue.js
import { ref, computed } from 'vue';
import { useQueueStore } from '../stores/queueStore';
export const useQueue = (adminType = 'loket') => {
const queueStore = useQueueStore();
// Local state
const snackbar = ref(false);
const snackbarText = ref('');
const snackbarColor = ref('success');
// Dialog states
const showKlinikDialog = ref(false);
const showPenunjangDialog = ref(false);
const showChangeKlinikDialog = ref(false);
const klinikSearch = ref('');
const penunjangSearch = ref('');
const changeKlinikSearch = ref('');
const selectedPatientForPenunjang = ref(null);
// Computed from store - filtered by stage
const currentProcessingPatient = queueStore.getCurrentProcessing(adminType);
// Get patients based on admin type stage - ISOLATED PER ADMIN
const stagePatients = computed(() => {
return queueStore.getPatientsByStage(adminType).value;
});
// Tabel "Di Loket" - hanya untuk stage admin ini
const diLoketPatients = computed(() => stagePatients.value.diLoket);
// Tabel "Terlambat" - hanya untuk stage admin ini
const terlambatPatients = computed(() => stagePatients.value.terlambat);
// Tabel "Pending" - hanya untuk stage admin ini
const pendingPatients = computed(() => stagePatients.value.pending);
// Pasien waiting - hanya untuk stage admin ini
const waitingPatients = computed(() => stagePatients.value.waiting);
const nextPatient = computed(() => {
return waitingPatients.value[0] || null;
});
// Total pasien hanya untuk stage admin ini
const totalPasien = computed(() =>
queueStore.getTotalPasienByStage(adminType).value
);
const quotaUsed = computed(() => queueStore.quotaUsed);
// Filtered lists
const filteredKliniks = computed(() => {
if (!klinikSearch.value) return queueStore.kliniks;
return queueStore.kliniks.filter((k) =>
k.name.toLowerCase().includes(klinikSearch.value.toLowerCase())
);
});
const filteredPenunjangs = computed(() => {
if (!penunjangSearch.value) return queueStore.penunjangs;
return queueStore.penunjangs.filter((p) =>
p.name.toLowerCase().includes(penunjangSearch.value.toLowerCase())
);
});
const filteredChangeKliniks = computed(() => {
if (!changeKlinikSearch.value) return queueStore.kliniks;
return queueStore.kliniks.filter((k) =>
k.name.toLowerCase().includes(changeKlinikSearch.value.toLowerCase())
);
});
// Methods
const showSnackbar = (text, color = 'success') => {
snackbarText.value = text;
snackbarColor.value = color;
snackbar.value = true;
};
const callNext = () => {
const result = queueStore.callNext(adminType);
showSnackbar(result.message, result.success ? 'success' : 'warning');
};
const callMultiplePatients = (count) => {
const result = queueStore.callMultiplePatients(count, adminType);
showSnackbar(result.message, result.success ? 'success' : 'warning');
};
const processPatient = (patient, action) => {
const result = queueStore.processPatient(patient, action, adminType);
let color = 'success';
if (action === 'terlambat') color = 'warning';
else if (action === 'pending') color = 'info';
showSnackbar(result.message, color);
};
const selectKlinik = (klinik) => {
const result = queueStore.createAntreanKlinik(klinik, adminType);
showSnackbar(result.message, 'success');
showKlinikDialog.value = false;
};
const selectPenunjang = (penunjang) => {
const result = queueStore.createAntreanPenunjang(
penunjang,
selectedPatientForPenunjang.value,
adminType
);
showSnackbar(result.message, 'success');
showPenunjangDialog.value = false;
selectedPatientForPenunjang.value = null;
};
const openPenunjangDialog = (patient = null) => {
selectedPatientForPenunjang.value = patient;
showPenunjangDialog.value = true;
};
const changeKlinik = (klinik) => {
if (currentProcessingPatient.value) {
const result = queueStore.changeKlinik(
currentProcessingPatient.value,
klinik,
adminType
);
showSnackbar(result.message, result.success ? 'success' : 'error');
showChangeKlinikDialog.value = false;
}
};
const getRowClass = (item) => {
if (item.status === 'current') {
return 'text-success font-weight-bold';
}
return '';
};
return {
// State
snackbar,
snackbarText,
snackbarColor,
showKlinikDialog,
showPenunjangDialog,
showChangeKlinikDialog,
klinikSearch,
penunjangSearch,
changeKlinikSearch,
selectedPatientForPenunjang,
// Computed
currentProcessingPatient,
diLoketPatients,
terlambatPatients,
pendingPatients,
waitingPatients,
nextPatient,
totalPasien,
quotaUsed,
filteredKliniks,
filteredPenunjangs,
filteredChangeKliniks,
stagePatients,
// Methods
showSnackbar,
callNext,
callMultiplePatients,
processPatient,
selectKlinik,
selectPenunjang,
openPenunjangDialog,
changeKlinik,
getRowClass,
};
};