From 0d7a1faa4421e8cfdbd8a3ee1d4ebda7ee930940 Mon Sep 17 00:00:00 2001 From: Jokoprasetio Date: Sun, 25 Jan 2026 23:49:15 +0700 Subject: [PATCH] progress --- .../masterPersetujuanController.php | 1 - public/js/masterPersetujuan/action.js | 357 +++++++++--------- public/js/masterPersetujuan/dt.js | 12 +- 3 files changed, 187 insertions(+), 183 deletions(-) diff --git a/app/Http/Controllers/masterPersetujuanController.php b/app/Http/Controllers/masterPersetujuanController.php index 8d40d6c..4ae8ae5 100644 --- a/app/Http/Controllers/masterPersetujuanController.php +++ b/app/Http/Controllers/masterPersetujuanController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers; use App\Models\masterPersetujuan; use App\Models\masterPersetujuanDetail; -use App\Models\UnitKerja; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use Carbon\Carbon; diff --git a/public/js/masterPersetujuan/action.js b/public/js/masterPersetujuan/action.js index f97573d..602c5a2 100644 --- a/public/js/masterPersetujuan/action.js +++ b/public/js/masterPersetujuan/action.js @@ -1,155 +1,176 @@ -formCreateMasterPersetujuan.on('submit', function(e){ +const csrfToken = document.querySelector('input[name="_token"]')?.value ?? ''; +const defaultSuccessMessage = 'Berhasil melakukan aksi!'; + +let isCreating = false; +let isEditing = false; +const deletingIds = new Set(); + +function showError(message) { + if (!message) return; + Swal.fire({ + icon: 'error', + title: 'Gagal', + text: message, + }); +} + +function handleModalSuccess(modalElement, message, afterAlert = () => {}) { + const handler = function () { + Swal.fire({ + icon: 'success', + title: 'Berhasil', + text: message || defaultSuccessMessage, + timer: 2000, + showConfirmButton: false, + backdrop: true, + }); + afterAlert(); + modalElement.removeEventListener('hidden.bs.modal', handler); + }; + + modalElement.addEventListener('hidden.bs.modal', handler); + bootstrap.Modal.getInstance(modalElement)?.hide(); +} + +formCreateMasterPersetujuan.on('submit', async function (e) { e.preventDefault(); - const form = this; - const formData = new FormData(form); + if (isCreating) return; // cegah submit berulang + isCreating = true; + + try { + const res = await fetch('/master-persetujuan', { + method: 'POST', + headers: { + 'X-CSRF-TOKEN': csrfToken, + }, + body: new FormData(this), + }); - fetch(`/master-persetujuan`, { - method: 'POST', - headers: { - 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, - }, - body: formData - }).then(async(res) => { const responseData = await res.json(); - if (responseData.status) { - const handler = function () { - Swal.fire({ - icon: 'success', - title: 'Berhasil', - text: responseData.message || 'Berhasil melakukan aksi!', - timer: 2000, - showConfirmButton: false, - backdrop: true, - }); - $("#col_add_master_persetujuan").html(''); - colCount = 1; // reset counter - formCreateMasterPersetujuan.find('select').val(null).trigger('change'); - datatableMasterPersetujuan.bootstrapTable('refresh'); - modalCreate.removeEventListener('hidden.bs.modal', handler); - }; - modalCreate.addEventListener('hidden.bs.modal', handler); - bootstrap.Modal.getInstance(modalCreate).hide(); - } else { + if (!responseData.status) { throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.'); } - }).catch(err => { - if (err.message) { - Swal.fire({ - icon: 'error', - title: 'Gagal', - text: err.message - }); - } - }); + handleModalSuccess(modalCreate, responseData.message, () => { + $('#col_add_master_persetujuan').html(''); + colCount = 1; + formCreateMasterPersetujuan.find('select').val(null).trigger('change'); + datatableMasterPersetujuan.bootstrapTable('refresh'); + }); + } catch (err) { + showError(err.message); + } finally { + isCreating = false; + } }); +async function deleteMasterPersetujuan(button) { + const { id, name } = $(button).data(); -function deleteAkses(e){ - let id =$(e).data('id') - Swal.fire({ - title: "Apakah kamu yakin ingin menghapus data master persetujuan?", - text : $(e).data('name'), - icon: "warning", + if (deletingIds.has(id)) return; // cegah klik berulang id sama + + const result = await Swal.fire({ + title: 'Apakah kamu yakin ingin menghapus data master persetujuan?', + text: name, + icon: 'warning', showCancelButton: true, backdrop: true, - }).then((result) => { - if(result.isConfirmed){ - fetch(`/master-persetujuan/${id}`, { - method:'DELETE', - headers: { - "X-CSRF-TOKEN": document.querySelector('input[name="_token"]').value, - "Content-Type": "application/json" - } - }).then((response) => { - if(!response.ok){ - throw new Error("Network response was not ok"); - } - return response.json(); - }) - .then((data) => { - if(data.status){ - Swal.fire({ - title: "Success", - text: "Data berhasil dihapus", - icon:"success", - showConfirmButton: false, - timer: 1000 - }).then(() => { - datatableMasterPersetujuan.bootstrapTable("refresh") - }) - }else{ - Swal.fire({ - title: "Error!", - text: data.message || "Failed to delete Item.", - icon: "error" - }); - } - }) - .catch(error => { - Swal.fire({ - title: "Error!", - text: "Something went wrong. Please try again later.", - icon: "error" - }); - }); + }); + + if (!result.isConfirmed) return; + + try { + deletingIds.add(id); + + const response = await fetch(`/master-persetujuan/${id}`, { + method: 'DELETE', + headers: { + 'X-CSRF-TOKEN': csrfToken, + 'Content-Type': 'application/json', + }, + }); + + const data = await response.json(); + if (!data.status) { + throw new Error(data.message || 'Failed to delete Item.'); } - }) + + Swal.fire({ + title: 'Success', + text: 'Data berhasil dihapus', + icon: 'success', + showConfirmButton: false, + timer: 1000, + }).then(() => datatableMasterPersetujuan.bootstrapTable('refresh')); + } catch (error) { + showError(error.message || 'Something went wrong. Please try again later.'); + } finally { + deletingIds.delete(id); + } } - -function editAkses(e){ - const data = $(e).data(); +async function editMasterPersetujuan(button) { + const data = $(button).data(); new bootstrap.Modal(modalEdit).show(); - formEditMasterPersetujuan.attr('action', `/master-persetujuan/${data.id}`) + formEditMasterPersetujuan.attr('action', `/master-persetujuan/${data.id}`); + + selectOptionPegawaiEdit(); + selectOptionUnitKerjaEdit(); + + resetEditSelections(); - selectOptionPegawaiEdit() - selectOptionUnitKerjaEdit() if (data.pegawai_id) { setOldSelect2Value('#pegawai_id_edit', data.pegawai_id, data.pegawai_nama); } - fetch(`/master-persetujuan/${data.id}`) - .then(async(res) => { - const responseData = await res.json(); - if (!responseData.status) { - throw new Error(responseData.message || 'Gagal memuat data akses.'); - } - const detail = responseData.data; - if (Array.isArray(detail.detail_units)) { - setOldSelect2Values('#unit_akses_edit', detail.detail_units); - } - }) - .catch((err) => { - console.log(err); - }); + try { + const res = await fetch(`/master-persetujuan/${data.id}`); + const responseData = await res.json(); + + if (!responseData.status) { + throw new Error(responseData.message || 'Gagal memuat data akses.'); + } + + const detailUnits = responseData.data?.detail_units; + if (Array.isArray(detailUnits)) { + setOldSelect2Values('#unit_akses_edit', detailUnits); + } + } catch (err) { + console.error(err); + showError(err.message); + } } - +function resetEditSelections() { + formEditMasterPersetujuan[0]?.reset(); + $('#pegawai_id_edit').val(null).trigger('change'); + $('#unit_akses_edit').empty().trigger('change'); +} function selectOptionPegawaiEdit() { - let selectPegawai = $(`#pegawai_id_edit`); - // inisialisasi select2 untuk Unit Kerja + const selectPegawai = $('#pegawai_id_edit'); + if (selectPegawai.data('select2')) return; + selectPegawai.select2({ placeholder: '-- Pilih Pegawai --', - allowClear:true, + allowClear: true, width: '100%', dropdownParent: selectPegawai.parent(), - ajax:{ - url : '/select-pegawai', + ajax: { + url: '/select-pegawai', dataType: 'json', delay: 250, - data: function(params){ - return { q: params.term } + data: function (params) { + return { q: params.term }; }, - processResults: function(data){ + processResults: function (data) { return { - results : data?.data.map(item => ({ + results: data?.data.map((item) => ({ id: item.id, text: item.nama, - })) - } + })), + }; }, cache: true, }, @@ -158,27 +179,28 @@ function selectOptionPegawaiEdit() { } function selectOptionUnitKerjaEdit() { - let selectUnit = $(`#unit_akses_edit`); + const selectUnit = $('#unit_akses_edit'); if (selectUnit.data('select2')) return; + selectUnit.select2({ placeholder: '-- Pilih Unit Kerja --', - allowClear:true, + allowClear: true, width: '100%', dropdownParent: selectUnit.parent(), - ajax:{ - url : '/select-unit-kerja', + ajax: { + url: '/select-unit-kerja', dataType: 'json', delay: 250, - data: function(params){ - return { q: params.term } + data: function (params) { + return { q: params.term }; }, - processResults: function(data){ + processResults: function (data) { return { - results : data?.data.map(item => ({ + results: data?.data.map((item) => ({ id: item.id, text: item.name, - })) - } + })), + }; }, cache: true, }, @@ -186,68 +208,55 @@ function selectOptionUnitKerjaEdit() { }); } - - function setOldSelect2Value(selector, id, text) { if (!id || !text) return; - let option = new Option(text, id, true, true); - $(selector).append(option).trigger('change') + const option = new Option(text, id, true, true); + $(selector).append(option).trigger('change'); } function setOldSelect2Values(selector, items) { if (!Array.isArray(items) || items.length === 0) return; - items.forEach(item => { + + items.forEach((item) => { if (!item?.id || !item?.text) return; - let option = new Option(item.text, item.id, true, true); + const option = new Option(item.text, item.id, true, true); $(selector).append(option); }); - $(selector).trigger('change') + + $(selector).trigger('change'); } - -formEditMasterPersetujuan.on('submit', function(e){ +formEditMasterPersetujuan.on('submit', async function (e) { e.preventDefault(); - const form = this; - const actionUrl = formEditMasterPersetujuan.attr('action'); - const formData = new FormData(form); - formData.append('_method', 'PUT') - fetch(actionUrl, { - method: 'POST', - headers: { - 'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value, - }, - body: formData - }).then(async(res) => { - const responseData = await res.json(); + if (isEditing) return; // cegah submit ganda + isEditing = true; - if (responseData.status) { - const handler = function () { - Swal.fire({ - icon: 'success', - title: 'Berhasil', - text: responseData.message || 'Berhasil melakukan aksi!', - timer: 2000, - showConfirmButton: false, - backdrop: true, - }); - formCreateMasterPersetujuan.find('select').val(null).trigger('change'); - datatableMasterPersetujuan.bootstrapTable('refresh'); - modalEdit.removeEventListener('hidden.bs.modal', handler); - }; - modalEdit.addEventListener('hidden.bs.modal', handler); - bootstrap.Modal.getInstance(modalEdit).hide(); - } else { + try { + const actionUrl = formEditMasterPersetujuan.attr('action'); + const formData = new FormData(this); + formData.append('_method', 'PUT'); + + const res = await fetch(actionUrl, { + method: 'POST', + headers: { + 'X-CSRF-TOKEN': csrfToken, + }, + body: formData, + }); + + const responseData = await res.json(); + if (!responseData.status) { throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.'); } - }).catch(err => { - if (err.message) { - Swal.fire({ - icon: 'error', - title: 'Gagal', - text: err.message - }); - } - }); + handleModalSuccess(modalEdit, responseData.message, () => { + formCreateMasterPersetujuan.find('select').val(null).trigger('change'); + datatableMasterPersetujuan.bootstrapTable('refresh'); + }); + } catch (err) { + showError(err.message); + } finally { + isEditing = false; + } }); diff --git a/public/js/masterPersetujuan/dt.js b/public/js/masterPersetujuan/dt.js index 3c1907e..ef5e695 100644 --- a/public/js/masterPersetujuan/dt.js +++ b/public/js/masterPersetujuan/dt.js @@ -18,22 +18,18 @@ { title:"Action", formatter: function(value, row){ - console.log(row); - let buttons = ''; - buttons += ` - ` buttons += ` - ` return `