diff --git a/pages/verifikasiAkun/DetailAkun.vue b/pages/verifikasiAkun/DetailAkun.vue index ba0d5fc..32da722 100644 --- a/pages/verifikasiAkun/DetailAkun.vue +++ b/pages/verifikasiAkun/DetailAkun.vue @@ -20,16 +20,13 @@ const profileData = reactive({ registrationNumber: 'RM-2023-8812', nim: '3573230897851332', phone: '+62 812-3456-7890', - verified: true + verified: true, + birthDate: '10 Juni 1970', + address: 'Jalan Soekarno Hatta, no 1A, Lowokwaru, Kota Malang' }); // Family members data const familyMembers = reactive([ - { - id: 1, - name: 'Andi Pratama', - status: 'PENDING' - }, { id: 2, name: 'Siti Aminah', @@ -81,54 +78,179 @@ const modalData = reactive({ alamat: '' }); -const genderOptions = ['Laki-laki', 'Perempuan']; -const relationshipOptions = ['Orang tua', 'Suami/Istri', 'Anak', 'Saudara', 'Lainnya']; -const openModal = (member) => { - selectedMember.value = member; - // Reset form - modalData.namaLengkap = member.name; - modalData.tanggalLahir = ''; - modalData.nik = ''; - modalData.jenisKelamin = ''; - modalData.hubungan = ''; - modalData.nomorTelepon = ''; - modalData.alamat = ''; - isModalOpen.value = true; +/** Opsi hubungan anggota keluarga */ +const relationshipOptions = [ + 'Anak Kandung', + 'Anak Tiri', + 'Anak Angkat', + 'Suami', + 'Istri', + 'Orang Tua', + 'Saudara Kandung', + 'Wali', + 'Kerabat', + 'Lainnya' +]; + +// ── State Modal Tambah Anggota ────────────────────────────────────────────── + +/** Mode modal: 'add' untuk tambah baru, 'edit' untuk edit data yang ada */ +const memberModalMode = ref('add'); + +/** Apakah modal tambah/edit anggota terbuka */ +const isAddMemberModalOpen = ref(false); + +/** Judul modal yang ditampilkan sesuai mode */ +const memberModalTitle = computed(() => { + if (memberModalMode.value === 'editProfile') return 'Edit Profil'; + if (memberModalMode.value === 'edit') return 'Edit Peserta'; + return 'Tambah Peserta'; +}); + +/** Label tombol submit modal sesuai mode */ +const memberModalSubmitLabel = computed(() => + memberModalMode.value === 'add' ? 'Tambah' : 'Simpan' +); + +/** True jika tombol submit harus disabled */ +const memberModalSubmitDisabled = computed(() => { + if (!searchResult.value) return true; + // Mode editProfile: cukup ada searchResult (tidak perlu hubungan) + if (memberModalMode.value === 'editProfile') return false; + // Mode tambah/edit anggota: wajib pilih hubungan + return !addMemberForm.hubungan; +}); + +/** Teks pencarian pasien (nomor RM atau NIK) */ +const searchQuery = ref(''); + +/** Loading saat sedang mencari pasien */ +const isSearching = ref(false); + +/** Hasil pencarian / data pasien yang sedang diedit; null = belum ada data */ +const searchResult = ref(null); + +/** Form data tambah/edit anggota — hanya hubungan & alamat yang dapat diisi */ +const addMemberForm = reactive({ + hubungan: '', + alamat: '' +}); + +/** + * Membuka modal dalam mode TAMBAH dan mereset semua state pencarian. + */ +const openAddMemberModal = () => { + memberModalMode.value = 'add'; + searchQuery.value = ''; + searchResult.value = null; + addMemberForm.hubungan = ''; + addMemberForm.alamat = ''; + isAddMemberModalOpen.value = true; }; -const closeModal = () => { - isModalOpen.value = false; - selectedMember.value = null; -}; - -const handleApprove = () => { - snackbar.value = { - show: true, - message: 'Pengajuan anggota baru disetujui.', - color: 'success' +/** + * Membuka modal dalam mode EDIT PROFIL, mengisi data dari profileData. + * Section pencarian dan field Hubungan disembunyikan. + * Field Nomor Telepon & Alamat menjadi enabled. + */ +const openEditProfileModal = () => { + memberModalMode.value = 'editProfile'; + searchResult.value = { + namaLengkap: profileData.name, + nomorRM: profileData.registrationNumber, + tanggalLahir: profileData.birthDate, + nik: profileData.nim, + jenisKelamin: 'Laki-laki', + // Nomor Telepon dimasukkan ke field yang dapat diedit + nomorTelepon: profileData.phone }; - closeModal(); + // Alamat profil dimasukkan ke addMemberForm.alamat agar bisa diedit + addMemberForm.alamat = profileData.address; + addMemberForm.hubungan = ''; + isAddMemberModalOpen.value = true; }; -const handleReject = () => { - snackbar.value = { - show: true, - message: 'Pengajuan anggota baru ditolak.', - color: 'error' +/** + * Membuka modal dalam mode EDIT, langsung mengisi data pasien. + * Section pencarian disembunyikan saat mode ini. + * @param {object} member - Data anggota yang akan diedit + */ +const openEditMemberModal = (member) => { + memberModalMode.value = 'edit'; + // Isi langsung data dari member ke searchResult (sama strukturnya) + searchResult.value = { + namaLengkap: member.name, + nomorRM: member.registrationNumber ?? '-', + tanggalLahir: member.birthDate ?? '-', + nik: member.nik ?? '-', + jenisKelamin: member.jenisKelamin ?? '-', + nomorTelepon: member.phone ?? '-' }; - closeModal(); + addMemberForm.hubungan = member.hubungan ?? ''; + addMemberForm.alamat = member.address ?? ''; + isAddMemberModalOpen.value = true; }; + +/** + * Menutup modal tambah/edit anggota. + */ +const closeAddMemberModal = () => { + isAddMemberModalOpen.value = false; +}; + +/** + * Mensimulasikan pencarian pasien berdasarkan nomor RM atau NIK. + * Pada implementasi nyata, ini akan memanggil API backend. + */ +const handleSearchPatient = async () => { + if (!searchQuery.value.trim()) return; + + isSearching.value = true; + searchResult.value = null; + + // Simulasi delay network request + await new Promise(resolve => setTimeout(resolve, 800)); + + // Data dummy hasil pencarian pasien + searchResult.value = { + namaLengkap: 'Andi Pratama', + nomorRM: searchQuery.value, + tanggalLahir: '12 Maret 1970', + nik: '197054478954315', + jenisKelamin: 'Laki-laki', + nomorTelepon: '0812-3456-7890' + }; + + isSearching.value = false; +}; + +/** + * Menangani submit form tambah/edit anggota / edit profil. + * Pesan snackbar menyesuaikan mode yang aktif. + */ +const handleAddMember = () => { + const nama = searchResult.value?.namaLengkap; + let message = ''; + if (memberModalMode.value === 'editProfile') { + // Update profileData langsung dengan nilai yang sudah diubah user + profileData.phone = searchResult.value.nomorTelepon; + profileData.address = addMemberForm.alamat; + message = 'Profil berhasil diperbarui.'; + } else if (memberModalMode.value === 'edit') { + message = `Data anggota ${nama} berhasil diperbarui.`; + } else { + message = `Anggota keluarga ${nama} berhasil ditambahkan.`; + } + snackbar.value = { show: true, message, color: 'success' }; + closeAddMemberModal(); +}; +