perbaikan bug global loading HR dan Payroll

This commit is contained in:
Wian Drs
2026-09-14 12:05:53 +07:00
parent 63993ee76e
commit 5e1fd11410
9 changed files with 153 additions and 66 deletions
@@ -20,7 +20,7 @@
</div>
</section>
<div class="modal fade" id="manualModal" tabindex="-1" data-bs-backdrop="static"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><div><small class="text-muted">DRAFT ABSENSI</small><h5 class="modal-title">Tambah Absen Manual</h5></div><button class="btn-close" data-bs-dismiss="modal"></button></div><form id="manualForm"><div class="modal-body"><div class="mb-3"><label class="form-label">Karyawan <span class="text-danger">*</span></label><select class="form-select select-search" name="employee_id" required><option value="">Pilih karyawan</option><?php foreach($employees as$e):?><option value="<?=$e->id?>"><?=html_escape($e->employee_code.' - '.$e->full_name)?></option><?php endforeach?></select></div><div class="row g-3"><div class="col-6"><label class="form-label">Tanggal <span class="text-danger">*</span></label><input class="form-control" type="date" name="attendance_date" value="<?=date('Y-m-d')?>" required></div><div class="col-6"><label class="form-label">Jam <span class="text-danger">*</span></label><input class="form-control" type="time" name="attendance_time" value="<?=date('H:i')?>" required></div><div class="col-12"><label class="form-label">Jenis Absen <span class="text-danger">*</span></label><select class="form-select" name="attendance_action" required><option value="check_in">Absen Masuk</option><option value="check_out">Absen Pulang</option></select></div><div class="col-12"><label class="form-label">Alasan / Keterangan <span class="text-danger">*</span></label><textarea class="form-control" name="reason" rows="3" maxlength="1000" placeholder="Jelaskan alasan pencatatan manual agar approver dapat memeriksa." required></textarea></div></div><div class="alert alert-warning mt-3 mb-0 small"><i class="bi bi-shield-check"></i> Data belum mengubah absensi sampai pengajuan disetujui.</div></div><div class="modal-footer"><button type="button" class="btn btn-light" data-bs-dismiss="modal">Batal</button><button class="btn btn-warning"><i class="bi bi-save"></i> Simpan Draft</button></div></form></div></div></div>
<div class="modal fade" id="manualModal" tabindex="-1" data-bs-backdrop="static"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><div><small class="text-muted">DRAFT ABSENSI</small><h5 class="modal-title">Tambah Absen Manual</h5></div><button class="btn-close" data-bs-dismiss="modal"></button></div><form id="manualForm" data-ajax="true"><div class="modal-body"><div class="mb-3"><label class="form-label">Karyawan <span class="text-danger">*</span></label><select class="form-select select-search" name="employee_id" required><option value="">Pilih karyawan</option><?php foreach($employees as$e):?><option value="<?=$e->id?>"><?=html_escape($e->employee_code.' - '.$e->full_name)?></option><?php endforeach?></select></div><div class="row g-3"><div class="col-6"><label class="form-label">Tanggal <span class="text-danger">*</span></label><input class="form-control" type="date" name="attendance_date" value="<?=date('Y-m-d')?>" required></div><div class="col-6"><label class="form-label">Jam <span class="text-danger">*</span></label><input class="form-control" type="time" name="attendance_time" value="<?=date('H:i')?>" required></div><div class="col-12"><label class="form-label">Jenis Absen <span class="text-danger">*</span></label><select class="form-select" name="attendance_action" required><option value="check_in">Absen Masuk</option><option value="check_out">Absen Pulang</option></select></div><div class="col-12"><label class="form-label">Alasan / Keterangan <span class="text-danger">*</span></label><textarea class="form-control" name="reason" rows="3" maxlength="1000" placeholder="Jelaskan alasan pencatatan manual agar approver dapat memeriksa." required></textarea></div></div><div class="alert alert-warning mt-3 mb-0 small"><i class="bi bi-shield-check"></i> Data belum mengubah absensi sampai pengajuan disetujui.</div></div><div class="modal-footer"><button type="button" class="btn btn-light" data-bs-dismiss="modal">Batal</button><button type="submit" class="btn btn-warning"><i class="bi bi-save"></i> Simpan Draft</button></div></form></div></div></div>
<script>
$(function(){
@@ -31,7 +31,7 @@ $(function(){
$('#filterDate').on('change',()=>daily.ajax.reload());$('#manualStatus').on('change',()=>manual.ajax.reload());$('#addManual').on('click',()=>{document.getElementById('manualForm').reset();modal.show();});
function refresh(){manual.ajax.reload(null,false);daily.ajax.reload(null,false)}
function request(url,data){return $.ajax({url:base+url,type:'POST',data:data||{}}).done(r=>{if(r.status){AppAlert.toast(r.message,'success');refresh()}else AppAlert.toast(r.message,'error')}).fail(x=>AppAlert.toast(x.responseJSON?.message||'Proses gagal.','error'));}
$('#manualForm').on('submit',function(e){e.preventDefault();request('attendancemonitoring/save_manual',$(this).serialize()).done(r=>{if(r.status)modal.hide()});});
$('#manualForm').on('submit',function(e){e.preventDefault();const form=this,button=form.querySelector('button[type="submit"]'),original=button.innerHTML;button.disabled=true;button.innerHTML='<span class="spinner-border spinner-border-sm"></span> Menyimpan';request('attendancemonitoring/save_manual',$(form).serialize()).done(r=>{if(r.status){modal.hide();form.reset();}}).always(()=>{button.disabled=false;button.innerHTML=original;if(window.AppLoading)AppLoading.hide();});});
$(document).on('click','.manual-submit',function(){const id=this.dataset.id;AppAlert.confirm({title:'Ajukan absensi manual?',text:'Dokumen akan dikirim kepada approver HR.'}).then(x=>{if(x.isConfirmed)request('attendancemonitoring/submit_manual/'+id)});});
$(document).on('click','.manual-approve',function(){const id=this.dataset.id;AppAlert.confirm({title:'Setujui absensi manual?',text:'Setelah disetujui, waktu akan langsung diterapkan ke daftar absensi.',confirmButtonText:'Approve'}).then(x=>{if(x.isConfirmed)request('attendancemonitoring/approve_manual/'+id)});});
$(document).on('click','.manual-reject',function(){const id=this.dataset.id;AppAlert.prompt({title:'Tolak pengajuan',input:'textarea',inputLabel:'Alasan penolakan',inputValidator:v=>!v?.trim()?'Alasan wajib diisi.':undefined,confirmButtonText:'Reject'}).then(x=>{if(x.isConfirmed)request('attendancemonitoring/reject_manual/'+id,{reason:x.value})});});
+55 -14
View File
@@ -401,6 +401,16 @@
</div>
<div class="col-md-4 mb-3">
<label>Tanggal Resign <span class="text-muted">(opsional)</span></label>
<input type="date"
id="resign_date"
class="form-control">
</div>
<?php if($can_manage_all_salary):?>
<div class="col-12 mb-3">
<div class="form-check salary-restricted-note">
@@ -566,6 +576,23 @@ const base_url = "<?= base_url(); ?>";
$(function(){
let action = 'add';
const employeeModal = bootstrap.Modal.getOrCreateInstance(document.getElementById('modalEmployee'));
const employeeDetailModal = bootstrap.Modal.getOrCreateInstance(document.getElementById('modalDetail'));
function addCsrf(formData){
if(window.APP_CSRF && window.APP_CSRF.name && !formData.has(window.APP_CSRF.name)){
formData.append(window.APP_CSRF.name, window.APP_CSRF.value);
}
return formData;
}
function ajaxError(xhr){
let message = 'Permintaan tidak dapat diproses.';
if(xhr && xhr.responseJSON && xhr.responseJSON.message) message = xhr.responseJSON.message;
else if(xhr && xhr.status === 403) message = 'Anda tidak memiliki izin untuk tindakan ini.';
else if(xhr && xhr.status === 401) message = 'Sesi telah berakhir. Silakan login kembali.';
Swal.fire('Error', message, 'error');
}
// =========================================
// DATATABLE
@@ -723,7 +750,7 @@ $(function(){
action = 'add';
$('#modalEmployee').modal('show');
employeeModal.show();
});
@@ -801,11 +828,11 @@ $(function(){
action = 'edit';
$('#modalEmployee').modal('show');
employeeModal.show();
},
'json'
);
).fail(ajaxError);
});
@@ -830,7 +857,7 @@ $(function(){
formData.append('address', $('#address').val());
formData.append('join_date', $('#join_date').val());
formData.append('resign_date', $('#resign_date').val());
formData.append('resign_date', $('#resign_date').val() || '');
formData.append('employment_status', $('#employment_status').val());
formData.append('marital_status', $('#marital_status').val());
@@ -860,6 +887,8 @@ $(function(){
formData.append('photo_file', photo);
}
addCsrf(formData);
if(
!$('#full_name').val() ||
!$('#join_date').val()
@@ -878,6 +907,9 @@ $(function(){
? base_url + 'employees/store'
: base_url + 'employees/update/' + $('#id').val();
const saveButton = $('#btnSimpan');
saveButton.prop('disabled', true);
$.ajax({
url:url,
@@ -891,7 +923,7 @@ $(function(){
if(res.status){
$('#modalEmployee').modal('hide');
employeeModal.hide();
table.ajax.reload(null,false);
@@ -910,7 +942,9 @@ $(function(){
);
}
}
},
error:ajaxError,
complete:function(){ saveButton.prop('disabled', false); }
});
@@ -1279,11 +1313,11 @@ $(function(){
`);
$('#modalDetail').modal('show');
employeeDetailModal.show();
},
'json'
);
).fail(ajaxError);
});
@@ -1305,9 +1339,16 @@ $(function(){
if(r.isConfirmed){
$.get(
base_url + 'employees/delete/' + id,
function(res){
const deleteData = new FormData();
addCsrf(deleteData);
$.ajax({
url:base_url + 'employees/delete/' + id,
type:'POST',
data:deleteData,
processData:false,
contentType:false,
dataType:'json',
success:function(res){
if(res.status){
@@ -1329,8 +1370,8 @@ $(function(){
}
},
'json'
);
error:ajaxError
});
}