Commit bd437915 by Alfiro Pratama

usulan dana numeric full angka

parent 6929b02f
...@@ -88,10 +88,10 @@ ...@@ -88,10 +88,10 @@
<div class="col-sm-10 col-lg-10"> <div class="col-sm-10 col-lg-10">
<div class="input-group"> <div class="input-group">
<span class="input-group-text">Rp</span> <span class="input-group-text">Rp</span>
<input class="form-control" type="text" id="usulan_dana" name="usulan_dana" value="{{ old('usulan_dana') }}" placeholder="Dana yang ingin diajukan (cth: 950000 atau 950000.50 | tanda (.) hanya untuk nominal desimal)" required onkeypress="return isNumberKey(event)" onkeyup="formatRupiah(this)"> <input class="form-control" type="text" id="usulan_dana" name="usulan_dana" value="{{ old('usulan_dana') }}" placeholder="Dana yang ingin diajukan (cth: 950000)" required onkeypress="return isNumberKey(event)" onkeyup="formatRupiah(this)">
</div> </div>
<small id="invalidInput" class="text-danger" style="display: none;">Harap masukkan angka atau desimal (contoh: 950000 atau 950000.50)</small> <small id="invalidInput" class="text-danger" style="display: none;">Harap masukkan angka (contoh: 950000)</small>
<small id="dotWarning" style="display: none; color: red;">Simbol titik (.) tidak boleh diinputkan lebih dari 1</small> {{-- <small id="dotWarning" style="display: none; color: red;">Simbol titik (.) tidak boleh diinputkan lebih dari 1</small> --}}
</div> </div>
</div> </div>
<div class="mb-0 d-flex justify-content-end"> <div class="mb-0 d-flex justify-content-end">
...@@ -147,7 +147,7 @@ ...@@ -147,7 +147,7 @@
var url = window.URL.createObjectURL(this.files[0]); var url = window.URL.createObjectURL(this.files[0]);
$('#pdfViewer').attr('src', url); $('#pdfViewer').attr('src', url);
}); });
// Reset iframe saat modal ditutup // Reset iframe saat modal ditutup
$('#pdfModal').on('hidden.bs.modal', function (e) { $('#pdfModal').on('hidden.bs.modal', function (e) {
$('#pdfViewer').attr('src', ''); $('#pdfViewer').attr('src', '');
...@@ -165,7 +165,7 @@ ...@@ -165,7 +165,7 @@
// Munculkan modal // Munculkan modal
$('#pdfModal').modal('show'); $('#pdfModal').modal('show');
}); });
// Reset iframe saat modal ditutup // Reset iframe saat modal ditutup
$('#pdfModal').on('hidden.bs.modal', function (e) { $('#pdfModal').on('hidden.bs.modal', function (e) {
$('#view-pdf').attr('src', ''); $('#view-pdf').attr('src', '');
...@@ -177,13 +177,13 @@ ...@@ -177,13 +177,13 @@
$(document).ready(function () { $(document).ready(function () {
$('#input-file').on('change', function (e) { $('#input-file').on('change', function (e) {
var fileInput = e.target.files[0]; var fileInput = e.target.files[0];
// Periksa apakah ada file yang dipilih // Periksa apakah ada file yang dipilih
if (!fileInput) { if (!fileInput) {
alert('Silakan pilih file PDF terlebih dahulu.'); alert('Silakan pilih file PDF terlebih dahulu.');
return; return;
} }
// Periksa tipe file (harus PDF) // Periksa tipe file (harus PDF)
if (fileInput.type !== 'application/pdf') { if (fileInput.type !== 'application/pdf') {
alert('File harus berupa PDF.'); alert('File harus berupa PDF.');
...@@ -191,7 +191,7 @@ ...@@ -191,7 +191,7 @@
$('#input-file').val(''); $('#input-file').val('');
return; return;
} }
// Periksa ukuran file (maksimal 5MB) // Periksa ukuran file (maksimal 5MB)
if (fileInput.size > 5 * 1024 * 1024) { if (fileInput.size > 5 * 1024 * 1024) {
alert('Ukuran file maksimal adalah 5MB.'); alert('Ukuran file maksimal adalah 5MB.');
...@@ -200,23 +200,23 @@ ...@@ -200,23 +200,23 @@
return; return;
} }
}); });
// Fungsi untuk tombol "Preview" // Fungsi untuk tombol "Preview"
$('#btnPreview').click(function() { $('#btnPreview').click(function() {
var fileInput = $('#input-file')[0].files[0]; var fileInput = $('#input-file')[0].files[0];
// Periksa apakah ada file yang dipilih // Periksa apakah ada file yang dipilih
if (!fileInput) { if (!fileInput) {
alert('Silakan pilih file PDF terlebih dahulu.'); alert('Silakan pilih file PDF terlebih dahulu.');
return; return;
} }
// Tampilkan pratinjau PDF di dalam modal jika file memenuhi syarat // Tampilkan pratinjau PDF di dalam modal jika file memenuhi syarat
var url = URL.createObjectURL(fileInput); var url = URL.createObjectURL(fileInput);
$('#view-pdf').attr('src', url); $('#view-pdf').attr('src', url);
$('#pdfModal').modal('show'); $('#pdfModal').modal('show');
}); });
// Reset iframe saat modal ditutup // Reset iframe saat modal ditutup
$('#pdfModal').on('hidden.bs.modal', function (e) { $('#pdfModal').on('hidden.bs.modal', function (e) {
$('#view-pdf').attr('src', ''); $('#view-pdf').attr('src', '');
...@@ -224,60 +224,68 @@ ...@@ -224,60 +224,68 @@
}); });
</script> </script>
<script> <script>
var rpAdded = false; // Flag untuk menandai apakah 'Rp' sudah ditambahkan // Hanya izinkan input angka untuk usulan_dana.
var dotCount = 0; // Menghitung jumlah titik (.) yang sudah dimasukkan // Jika ada karakter non-angka (huruf, simbol, spasi, koma, titik, dll),
// maka akan muncul pesan error #invalidInput dan karakter tersebut dibersihkan.
// Dipanggil dari atribut onkeypress untuk memblokir sebagian besar input non-angka.
function isNumberKey(evt) { function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode; var e = evt || window.event;
var charCode = e.which ? e.which : e.keyCode;
// Cek apakah karakter yang dimasukkan adalah angka atau titik (.) dan batasi jumlah titik menjadi 1 // Izinkan tombol kontrol: backspace, tab, enter, esc
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) { if (charCode === 8 || charCode === 9 || charCode === 13 || charCode === 27) {
document.getElementById('invalidInput').style.display = 'block'; document.getElementById('invalidInput').style.display = 'none';
document.getElementById('dotWarning').style.display = 'none'; // Sembunyikan peringatan titik (.) berlebihan return true;
return false;
} }
document.getElementById('invalidInput').style.display = 'none'; // Izinkan tombol panah
return true; if (charCode >= 37 && charCode <= 40) {
} document.getElementById('invalidInput').style.display = 'none';
return true;
function formatRupiah(el) {
var val = el.value.trim();
// Jika input kosong, reset flag 'rpAdded' dan hitungan titik
if (val === '') {
rpAdded = false;
dotCount = 0;
return;
} }
// Tambahkan 'Rp0.' jika input diawali dengan titik (.) dan 'Rp' belum ditambahkan sebelumnya // Izinkan hanya angka 0–9
if (val.startsWith('.') && !rpAdded) { if (charCode >= 48 && charCode <= 57) {
val = '0.'; document.getElementById('invalidInput').style.display = 'none';
rpAdded = true; // Set flag 'rpAdded' menjadi true return true;
dotCount = 1; // Tambahkan satu titik
} else if (!rpAdded) {
// Tambahkan 'Rp' jika 'Rp' belum ditambahkan sebelumnya
val;
rpAdded = true; // Set flag 'rpAdded' menjadi true
} }
// Hitung jumlah titik (.) dalam input // Selain itu dianggap tidak valid
dotCount = (val.match(/\./g) || []).length; document.getElementById('invalidInput').style.display = 'block';
return false;
}
// Tampilkan peringatan jika terdapat lebih dari satu titik (.) dan sembunyikan peringatan input tidak valid // Dipanggil dari onkeyup dan juga di-binding pada event input
if (dotCount > 1) { // untuk membersihkan semua karakter non-angka (termasuk hasil paste).
document.getElementById('dotWarning').style.display = 'block'; function formatRupiah(el) {
document.getElementById('invalidInput').style.display = 'none'; // Sembunyikan peringatan input tidak valid if (!el) return;
var secondDotIndex = val.indexOf('.', val.indexOf('.') + 1); var cleaned = (el.value || '').replace(/\D+/g, ''); // hapus semua non-digit
val = val.slice(0, secondDotIndex) + val.slice(secondDotIndex + 1); // Hapus titik (.) yang berlebihan dari input if (cleaned !== el.value) {
dotCount = 1; // Set jumlah titik kembali menjadi 1 document.getElementById('invalidInput').style.display = 'block';
} else {
document.getElementById('dotWarning').style.display = 'none'; // Sembunyikan peringatan titik (.) berlebihan
} }
el.value = cleaned;
el.value = val;
} }
// Pastikan validasi juga berjalan saat user melakukan paste atau input lainnya.
(function () {
document.addEventListener('DOMContentLoaded', function () {
var field = document.getElementById('usulan_dana');
var invalid = document.getElementById('invalidInput');
if (!field || !invalid) return;
field.addEventListener('input', function () {
var before = field.value;
var cleaned = before.replace(/\D+/g, '');
field.value = cleaned;
if (before !== cleaned) {
invalid.style.display = 'block';
} else {
invalid.style.display = 'none';
}
});
});
})();
</script> </script>
@endsection @endsection
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment