feat(webstatement): tambah field password untuk proteksi PDF statement
Perubahan yang dilakukan: - Menambahkan kolom password (nullable) pada tabel print_statement_logs melalui migrasi baru. - Menambahkan field password di model PrintStatementLog dengan atribut hidden untuk keamanan serialisasi. - Menambahkan input password pada form request print statement. - Menambahkan validasi sisi klien agar password minimal 6 karakter. - Menambahkan konfirmasi melalui SweetAlert untuk pengisian password dan email tujuan. - Menambahkan index pada kolom password untuk optimasi pencarian jika dibutuhkan. - Menggunakan field password untuk proteksi file PDF melalui PDFPasswordProtect. - Menambahkan helper text dan placeholder pada form untuk meningkatkan pengalaman pengguna. - Menambahkan atribut autocomplete="new-password" untuk menghindari autofill browser yang tidak aman. - Menjaga kompatibilitas ke belakang dengan membuat field bersifat opsional (nullable). Tujuan perubahan: - Memberikan opsi proteksi file PDF dengan password yang diatur oleh pengguna. - Meningkatkan keamanan distribusi file statement melalui email. - Memastikan pengalaman pengguna tetap aman dan nyaman saat mengatur proteksi.
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
@endif
|
||||
|
||||
<div class="grid grid-cols-1 gap-5">
|
||||
@if ($multiBranch)
|
||||
@if (!$multiBranch)
|
||||
<div class="form-group">
|
||||
<label class="form-label required" for="branch_code">Branch/Cabang</label>
|
||||
<select
|
||||
@@ -107,6 +107,22 @@
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<!-- Tambahan field password -->
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="password">PDF Password</label>
|
||||
<input type="password"
|
||||
class="input form-control @error('password') border-danger bg-danger-light @enderror"
|
||||
id="password" name="password" value="{{ old('password', $statement->password ?? '') }}"
|
||||
placeholder="Optional password untuk proteksi PDF statement" autocomplete="new-password">
|
||||
<div class="mt-1 text-xs text-primary">
|
||||
<i class="text-sm ki-outline ki-information-5"></i>
|
||||
Jika dikosongkan password default statement akan diberlakukan
|
||||
</div>
|
||||
@error('password')
|
||||
<div class="text-sm alert text-danger">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label required" for="start_date">Start Date</label>
|
||||
|
||||
@@ -141,7 +157,8 @@
|
||||
</div>
|
||||
<div class="col-span-6">
|
||||
<div class="min-w-full card card-grid" data-datatable="false" data-datatable-page-size="10"
|
||||
data-datatable-state-save="false" id="statement-table" data-api-url="{{ route('statements.datatables') }}">
|
||||
data-datatable-state-save="false" id="statement-table"
|
||||
data-api-url="{{ route('statements.datatables') }}">
|
||||
<div class="flex-wrap py-5 card-header">
|
||||
<div class="min-w-full card card-grid" data-datatable="false" data-datatable-page-size="10"
|
||||
data-datatable-state-save="false" id="statement-table"
|
||||
@@ -218,9 +235,6 @@
|
||||
<select class="w-16 select select-sm" data-datatable-size="true"
|
||||
name="perpage"> </select>
|
||||
per page
|
||||
<select class="w-16 select select-sm" data-datatable-size="true"
|
||||
name="perpage"> </select>
|
||||
per page
|
||||
</div>
|
||||
<div class="flex gap-4 items-center">
|
||||
<div class="flex gap-4 items-center">
|
||||
@@ -273,51 +287,76 @@
|
||||
}
|
||||
|
||||
/**
|
||||
* Konfirmasi email sebelum submit form
|
||||
* Menampilkan SweetAlert jika email diisi untuk konfirmasi pengiriman
|
||||
* Konfirmasi password dan email sebelum submit form
|
||||
* Menampilkan SweetAlert jika password atau email diisi untuk konfirmasi
|
||||
*/
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const form = document.querySelector('form');
|
||||
const emailInput = document.getElementById('email');
|
||||
const passwordInput = document.getElementById('password');
|
||||
|
||||
// Log: Inisialisasi event listener untuk konfirmasi email
|
||||
console.log('Email confirmation listener initialized');
|
||||
// Log: Inisialisasi event listener untuk konfirmasi
|
||||
console.log('Form confirmation listener initialized');
|
||||
|
||||
form.addEventListener('submit', function(e) {
|
||||
const emailValue = emailInput.value.trim();
|
||||
const passwordValue = passwordInput.value.trim();
|
||||
|
||||
// Jika email diisi, tampilkan konfirmasi
|
||||
let confirmationNeeded = false;
|
||||
let confirmationMessage = '';
|
||||
|
||||
// Jika email diisi
|
||||
if (emailValue) {
|
||||
confirmationNeeded = true;
|
||||
confirmationMessage += `• Statement akan dikirim ke email: ${emailValue}\n`;
|
||||
}
|
||||
|
||||
// Jika password diisi
|
||||
if (passwordValue) {
|
||||
confirmationNeeded = true;
|
||||
confirmationMessage += `• PDF akan diproteksi dengan password\n`;
|
||||
}
|
||||
|
||||
// Jika ada yang perlu dikonfirmasi
|
||||
if (confirmationNeeded) {
|
||||
e.preventDefault(); // Hentikan submit form sementara
|
||||
|
||||
// Log: Email terdeteksi, menampilkan konfirmasi
|
||||
console.log('Email detected:', emailValue);
|
||||
// Log: Konfirmasi diperlukan
|
||||
console.log('Confirmation needed:', {
|
||||
email: emailValue,
|
||||
hasPassword: !!passwordValue
|
||||
});
|
||||
|
||||
Swal.fire({
|
||||
title: 'Konfirmasi Pengiriman Email',
|
||||
text: `Apakah Anda yakin ingin mengirimkan statement ke email: ${emailValue}?`,
|
||||
title: 'Konfirmasi Request Statement',
|
||||
text: `Mohon konfirmasi pengaturan berikut:\n\n${confirmationMessage}\nApakah Anda yakin ingin melanjutkan?`,
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Ya, Kirim Email',
|
||||
confirmButtonText: 'Ya, Lanjutkan',
|
||||
cancelButtonText: 'Batal',
|
||||
reverseButtons: true
|
||||
reverseButtons: true,
|
||||
preConfirm: () => {
|
||||
// Validasi password jika diisi
|
||||
if (passwordValue && passwordValue.length < 6) {
|
||||
Swal.showValidationMessage('Password minimal 6 karakter');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
// Log: User konfirmasi pengiriman email
|
||||
console.log('User confirmed email sending');
|
||||
// Log: User konfirmasi
|
||||
console.log('User confirmed form submission');
|
||||
|
||||
// Submit form setelah konfirmasi
|
||||
form.submit();
|
||||
} else {
|
||||
// Log: User membatalkan pengiriman email
|
||||
console.log('User cancelled email sending');
|
||||
// Log: User membatalkan
|
||||
console.log('User cancelled form submission');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Log: Tidak ada email, submit form normal
|
||||
console.log('No email provided, submitting form normally');
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -351,7 +390,7 @@
|
||||
account_number: {
|
||||
title: 'Account Number',
|
||||
render: (item, data) => {
|
||||
if(data.request_type=="multi_account"){
|
||||
if (data.request_type == "multi_account") {
|
||||
return data.stmt_sent_type ?? 'N/A';
|
||||
}
|
||||
return data.account_number ?? '';
|
||||
|
||||
Reference in New Issue
Block a user