Files
2026-09-14 12:05:53 +07:00

24 lines
8.0 KiB
JavaScript

(function(){'use strict';var d=document,q=function(s,c){return Array.prototype.slice.call((c||d).querySelectorAll(s));};
function loadingElement(){return d.getElementById('globalLoading');}
function resetFormLoading(f){if(!f||f.dataset.globalLoading!=='1')return;delete f.dataset.submitting;delete f.dataset.globalLoading;q('[aria-busy="true"]',f).forEach(function(b){b.disabled=false;b.removeAttribute('aria-busy');});}
function hideGlobalLoading(f){var l=loadingElement();if(l)l.hidden=true;if(f)resetFormLoading(f);else q('form[data-global-loading="1"]').forEach(resetFormLoading);}
function showGlobalLoading(f){var l=loadingElement();if(l)l.hidden=false;if(f)f.dataset.globalLoading='1';}
window.AppLoading={show:showGlobalLoading,hide:hideGlobalLoading};
window.cleanNumber=function(v){if(v===null||v===undefined)return'';var s=String(v).trim().replace(/\s|Rp/gi,'');if(!s)return'';var neg=s.charAt(0)==='-';s=s.replace(/-/g,'');var comma=s.lastIndexOf(','),dot=s.lastIndexOf('.');if(comma>=0&&dot>=0){if(comma>dot)s=s.replace(/\./g,'').replace(',','.');else s=s.replace(/,/g,'');}else if(comma>=0){var ca=s.split(',');s=(ca.length===2&&ca[1].length>0&&ca[1].length<=2)?ca[0].replace(/,/g,'')+'.'+ca[1]:s.replace(/,/g,'');}else if(dot>=0){var da=s.split('.');s=(da.length===2&&da[1].length>0&&da[1].length<=2)?s:s.replace(/\./g,'');}s=s.replace(/[^0-9.]/g,'');return(neg?'-':'')+s;};
window.parseMoney=function(v){var n=Number(window.cleanNumber(v));return Number.isFinite(n)?n:0;};
window.formatNumber=function(v){if(v===null||v===undefined)return'';var raw=String(v).trim().replace(/\s|Rp/gi,''),neg=raw.charAt(0)==='-';raw=raw.replace(/-/g,'').replace(/[^0-9.,]/g,'');if(raw==='')return'';var comma=raw.lastIndexOf(','),dot=raw.lastIndexOf('.'),integer=raw,decimal='',hasDecimal=false;if(comma>=0&&dot>=0){var sep=comma>dot?',':'.',at=Math.max(comma,dot);integer=raw.substring(0,at).replace(/[.,]/g,'');decimal=raw.substring(at+1).replace(/\D/g,'').substring(0,2);hasDecimal=true;}else if(comma>=0){var ctail=raw.length-comma-1;if(ctail<=2){integer=raw.substring(0,comma).replace(/\D/g,'');decimal=raw.substring(comma+1).replace(/\D/g,'').substring(0,2);hasDecimal=true;}else integer=raw.replace(/,/g,'');}else if(dot>=0){var dtail=raw.length-dot-1;if(raw.split('.').length===2&&dtail>0&&dtail<=2){integer=raw.substring(0,dot).replace(/\D/g,'');decimal=raw.substring(dot+1).replace(/\D/g,'').substring(0,2);hasDecimal=true;}else integer=raw.replace(/\./g,'');}integer=(integer||'0').replace(/^0+(?=\d)/,'').replace(/\B(?=(\d{3})+(?!\d))/g,'.');return(neg?'-':'')+integer+(hasDecimal?','+decimal:'');};
window.formatRupiah=function(v){return'Rp '+new Intl.NumberFormat('id-ID').format(Number(v)||0);};
window.formatTglIndo=function(v){if(!v)return'-';var x=String(v).split(' ')[0].split('-');if(x.length!==3)return v;var b=['Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember'];return Number(x[2])+' '+b[Number(x[1])-1]+' '+x[0];};
function filter(v){v=(v||'').toLowerCase();q('.app-menu-item').forEach(function(x){x.hidden=!!v&&x.dataset.menuLabel.indexOf(v)<0;if(v&&x.tagName==='DETAILS'&&!x.hidden)x.open=true;});var box=d.querySelector('.search-menu-results');if(!box)return;box.innerHTML='';q('.app-sidebar .app-menu-item:not([hidden]) a[href]').slice(0,16).forEach(function(a){var n=a.cloneNode(true);n.className='d-block p-2 border-bottom text-decoration-none';box.appendChild(n);});if(!box.children.length){var empty=d.createElement('div');empty.className='empty-state';empty.textContent='Menu tidak ditemukan';box.appendChild(empty);}}
q('.menu-filter').forEach(function(x){x.addEventListener('input',function(){filter(x.value);});});
function moneyFields(scope){q('input[name],input.format-rupiah',scope||d).forEach(function(x){var n=String(x.name||x.id||'').replace(/\[[^\]]*\]/g,'').toLowerCase();var money=/^(amount|debit|kredit|nominal|jumlah|harga|price|unit_price|estimated_price|discount_amount|opening_balance|statement_balance|outstanding_receipts|outstanding_payments|charge|credit_limit|nilai|nilai_perolehan|nilai_residu|biaya|budget|basic_salary|salary|fixed_amount|installment_amount|principal|residual_value|proceeds)$/.test(n)||/(^|_)(amount|nominal|harga|salary|balance|cost|budget|price|proceeds)$/.test(n);if(!money)return;x.classList.add('format-rupiah');if(String(x.type).toLowerCase()==='number')x.type='text';x.setAttribute('inputmode','decimal');if(x.value)x.value=window.formatNumber(x.value);});}
moneyFields(d);q('input[type=number],.format-rupiah').forEach(function(x){x.setAttribute('inputmode',x.step&&String(x.step).indexOf('.')>=0?'decimal':'numeric');});
q('img:not([loading])').forEach(function(x){x.loading='lazy';x.decoding='async';});
q('.table-responsive table').forEach(function(t){t.classList.add('table-hover','responsive-detail-table');var heads=q('thead th',t).map(function(h){return h.textContent.trim();});q('tbody tr',t).forEach(function(r){q('td',r).forEach(function(c,i){if(!c.dataset.label)c.dataset.label=heads[i]||'';});});});
q('form').forEach(function(f){f.addEventListener('submit',function(e){if(e.defaultPrevented||f.dataset.ajax==='true'||String(f.target).toLowerCase()==='_blank')return;if(f.dataset.submitting==='1'){e.preventDefault();return;}if(!navigator.onLine&&String(f.method).toLowerCase()==='post'){e.preventDefault();alert('Posting transaksi offline tidak diizinkan. Sambungkan internet lalu coba kembali.');return;}f.dataset.submitting='1';q('button[type=submit],input[type=submit]',f).forEach(function(b){b.disabled=true;b.setAttribute('aria-busy','true');});showGlobalLoading(f);window.setTimeout(function(){if(e.defaultPrevented)hideGlobalLoading(f);},0);});});
q('input[type=file][accept*="image"]:not([multiple])').forEach(function(input){input.addEventListener('change',function(){var file=input.files&&input.files[0];if(!file||file.size<350000)return;var img=new Image(),url=URL.createObjectURL(file);img.onload=function(){var scale=Math.min(1,1600/Math.max(img.width,img.height)),canvas=d.createElement('canvas');canvas.width=Math.round(img.width*scale);canvas.height=Math.round(img.height*scale);canvas.getContext('2d').drawImage(img,0,0,canvas.width,canvas.height);canvas.toBlob(function(blob){if(blob&&blob.size<file.size&&window.DataTransfer){var dt=new DataTransfer();dt.items.add(new File([blob],file.name.replace(/\.[^.]+$/,'.jpg'),{type:'image/jpeg'}));input.files=dt.files;}URL.revokeObjectURL(url);},'image/jpeg',.82);};img.src=url;});});
if(window.jQuery){jQuery(d).on('input','.format-rupiah',function(){this.value=window.formatNumber(this.value);}).on('submit','form',function(){jQuery(this).find('.format-rupiah').each(function(){this.value=window.cleanNumber(this.value);});});var initSelect=function(scope){if(!jQuery.fn.select2)return;jQuery(scope||d).find('select.select-search').each(function(){var x=jQuery(this);if(x.hasClass('select2-hidden-accessible'))return;var p=x.closest('.modal'),lookup=x.data('lookup'),options={width:'100%',placeholder:x.data('placeholder')||x.attr('placeholder')||'-- Pilih --',allowClear:true,dropdownParent:p.length?p:jQuery(document.body)};if(lookup)options.ajax={url:(window.APP_BASE_URL||'/')+'lookups/search/'+lookup,dataType:'json',delay:300,cache:true,data:function(params){return{q:params.term||'',page:params.page||1,limit:20}},processResults:function(data){return data}};x.select2(options);});};initSelect(d);if(window.MutationObserver)new MutationObserver(function(ms){ms.forEach(function(m){Array.prototype.forEach.call(m.addedNodes,function(n){if(n.nodeType===1){moneyFields(n);initSelect(n);}});});}).observe(d.body,{childList:true,subtree:true});}
window.addEventListener('pageshow',function(){hideGlobalLoading();q('form').forEach(function(f){delete f.dataset.submitting;delete f.dataset.globalLoading;q('[aria-busy]',f).forEach(function(b){b.disabled=false;b.removeAttribute('aria-busy');});});});
window.addEventListener('error',function(){hideGlobalLoading();});window.addEventListener('unhandledrejection',function(){hideGlobalLoading();});
if('serviceWorker'in navigator)window.addEventListener('load',function(){navigator.serviceWorker.register((window.APP_BASE_URL||'/')+'service-worker.js');});}());