File manager - Edit - /home/webtrixia/.trash/waybills.html.2
Back
<!DOCTYPE html> <html lang="bg"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Пътни листове — Webtrixia Hub</title> <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root{--bg:#f0f0f8;--sur:#fff;--sur2:#f5f5fc;--sur3:#eaeaf5;--brd:rgba(0,0,0,.08);--tx:#1a1a2e;--tx2:#4a4a6a;--tx3:#8888aa; --acc:#6c63ff;--grn:#22c55e;--gdim:rgba(34,197,94,.14);--red:#ef4444;--rdim:rgba(239,68,68,.14);--fn:'DM Sans',sans-serif} *{margin:0;padding:0;box-sizing:border-box} body{font-family:var(--fn);background:var(--bg);color:var(--tx);min-height:100vh;padding:22px 18px 60px} .wrap{max-width:1150px;margin:0 auto} .top{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:10px} h1{font-size:20px;font-weight:600} .sub{font-size:12px;color:var(--tx3);margin-top:2px} .lnk{color:var(--acc);text-decoration:none;font-size:12px} .panel{background:var(--sur);border:1px solid var(--brd);border-radius:16px;padding:18px} .ph{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;flex-wrap:wrap;gap:8px} .pt{font-size:14px;font-weight:600} .btn{padding:9px 15px;border-radius:9px;border:none;cursor:pointer;font-family:var(--fn);font-size:12.5px;font-weight:600} .btn.p{background:var(--acc);color:#fff} .btn.s{background:var(--sur2);color:var(--tx2);border:1px solid var(--brd)} .btn.d{background:var(--rdim);color:var(--red)} table{width:100%;border-collapse:collapse;font-size:12.5px} th{text-align:left;padding:9px 10px;color:var(--tx3);font-weight:500;border-bottom:1px solid var(--brd);white-space:nowrap} td{padding:10px;border-bottom:1px solid var(--brd)} .badge{padding:3px 10px;border-radius:20px;font-size:11px;font-weight:600;cursor:pointer} .badge.active{background:var(--gdim);color:#15803d} .badge.inactive{background:var(--sur3);color:var(--tx3)} .actions{display:flex;gap:6px} .iconbtn{background:var(--sur2);border:1px solid var(--brd);border-radius:7px;padding:5px 9px;cursor:pointer;font-size:12px} label{display:block;font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:.06em;margin:10px 0 5px} input,textarea{width:100%;background:var(--sur2);border:1px solid var(--brd);border-radius:9px;padding:10px 12px;font-family:var(--fn);font-size:13px;outline:none} input:focus,textarea:focus{border-color:var(--acc)} .row2{display:grid;grid-template-columns:1fr 1fr;gap:10px} .row3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px} .mo{position:fixed;inset:0;background:rgba(20,20,35,.5);display:none;align-items:flex-start;justify-content:center;z-index:999;padding:30px 14px;overflow:auto} .mo.show{display:flex} .mb{background:var(--sur);border-radius:16px;padding:22px;width:100%;max-width:640px;position:relative} .close{position:absolute;top:16px;right:20px;cursor:pointer;color:var(--tx3);font-size:20px} .toast{position:fixed;bottom:20px;right:20px;background:#1a1a2e;color:#fff;padding:12px 18px;border-radius:10px;font-size:13px;display:none;z-index:1200} #printArea{display:none} @media print{ body *{visibility:hidden} #printArea,#printArea *{visibility:visible} #printArea{display:block;position:absolute;top:0;left:0;width:100%;padding:20px 30px} } .pdoc h2{font-size:16px;text-align:center;margin-bottom:20px;text-transform:uppercase;letter-spacing:.05em} .pdoc table{margin-top:16px} .pdoc td,.pdoc th{border:1px solid #ccc;padding:8px} .pdoc .sig{display:flex;justify-content:space-between;margin-top:50px;font-size:12px} .pdoc .sig div{text-align:center} .pdoc .sig .line{border-top:1px solid #333;margin-top:34px;padding-top:4px;width:160px} </style> </head> <body> <div class="wrap"> <div class="top"> <div><h1>🚚 Пътни листове</h1><div class="sub">МПС, шофьори, маршрути, километраж, гориво</div></div> <a href="index.html" class="lnk">← Обратно към Hub</a> </div> <div class="panel"> <div class="ph"><div class="pt">Всички пътни листове</div><button class="btn p" onclick="openNew()">+ Нов пътен лист</button></div> <table id="tbl"><thead><tr><th>№</th><th>Дата</th><th>Шофьор</th><th>МПС</th><th>Маршрут</th><th>Км</th><th>Статус</th><th></th></tr></thead><tbody><tr><td>Зарежда…</td></tr></tbody></table> </div> </div> <div class="mo" id="wbModal"><div class="mb"> <span class="close" onclick="closeModal()">✕</span> <h3 id="modalTitle" style="margin-bottom:14px;font-size:15px">Нов пътен лист</h3> <div class="row2"><div><label>Номер</label><input id="w_number"></div><div><label>Дата</label><input id="w_date" type="date"></div></div> <div class="row2"><div><label>Шофьор</label><input id="w_driver"></div><div><label>Клиент/обект</label><input id="w_client"></div></div> <div class="row2"><div><label>Рег. номер на МПС</label><input id="w_plate"></div><div><label>Вид МПС</label><input id="w_vtype"></div></div> <div class="row2"><div><label>Маршрут — от</label><input id="w_from"></div><div><label>Маршрут — до</label><input id="w_to"></div></div> <div class="row3"> <div><label>Км начало</label><input id="w_kmstart" type="number" step="0.1"></div> <div><label>Км край</label><input id="w_kmend" type="number" step="0.1"></div> <div><label>Гориво (л)</label><input id="w_fuel" type="number" step="0.01"></div> </div> <div class="row2"><div><label>Разход гориво (лв./€)</label><input id="w_fuelcost" type="number" step="0.01"></div> <div><label>Статус</label><select id="w_status" style="width:100%;background:var(--sur2);border:1px solid var(--brd);border-radius:9px;padding:10px 12px;font-family:var(--fn);font-size:13px"><option value="active">Активен</option><option value="inactive">Неактивен</option><option value="completed">Приключен</option></select></div></div> <label>Товар / бележка</label><textarea id="w_cargo" rows="2"></textarea> <div style="display:flex;gap:8px;margin-top:14px"> <button class="btn p" onclick="saveWb()">💾 Запази</button> <button class="btn s" onclick="closeModal()">Отказ</button> </div> </div></div> <div id="printArea"></div> <div class="toast" id="toast"></div> <script> 'use strict'; var API=(function(){ var saved=localStorage.getItem('wt_api'); if(saved)return saved; var base=window.location.origin+window.location.pathname.replace(/waybills\.html$/,'').replace(/\/$/,''); return base+'/api.php'; })(); async function af(action,method,body,qs){ method=method||'GET';qs=qs||''; try{ var o={method:method,headers:{'Content-Type':'application/json'}}; if(body)o.body=JSON.stringify(body); var r=await fetch(API+'?action='+action+qs,o); var j=await r.json(); return j.ok?j.data:null; }catch(e){console.error(e);return null;} } function toast(msg){var t=document.getElementById('toast');t.textContent=msg;t.style.display='block';setTimeout(()=>t.style.display='none',2600);} function openModal(){document.getElementById('wbModal').classList.add('show');} function closeModal(){document.getElementById('wbModal').classList.remove('show');} var EDIT_ID=null; function openNew(){ EDIT_ID=null; document.getElementById('modalTitle').textContent='Нов пътен лист'; ['w_number','w_driver','w_client','w_plate','w_vtype','w_from','w_to','w_cargo'].forEach(id=>document.getElementById(id).value=''); document.getElementById('w_date').value=new Date().toISOString().slice(0,10); document.getElementById('w_kmstart').value=0; document.getElementById('w_kmend').value=0; document.getElementById('w_fuel').value=0; document.getElementById('w_fuelcost').value=0; document.getElementById('w_status').value='active'; openModal(); } function openEdit(w){ EDIT_ID=w.id; document.getElementById('modalTitle').textContent='Пътен лист № '+w.number; document.getElementById('w_number').value=w.number||''; document.getElementById('w_date').value=w.date||''; document.getElementById('w_driver').value=w.driver_name||''; document.getElementById('w_client').value=w.client||''; document.getElementById('w_plate').value=w.vehicle_plate||''; document.getElementById('w_vtype').value=w.vehicle_type||''; document.getElementById('w_from').value=w.route_from||''; document.getElementById('w_to').value=w.route_to||''; document.getElementById('w_kmstart').value=w.km_start||0; document.getElementById('w_kmend').value=w.km_end||0; document.getElementById('w_fuel').value=w.fuel_liters||0; document.getElementById('w_fuelcost').value=w.fuel_cost||0; document.getElementById('w_status').value=w.status||'active'; document.getElementById('w_cargo').value=w.cargo||''; openModal(); } async function saveWb(){ var payload={ id:EDIT_ID||undefined, number:document.getElementById('w_number').value, date:document.getElementById('w_date').value, driver_name:document.getElementById('w_driver').value, client:document.getElementById('w_client').value, vehicle_plate:document.getElementById('w_plate').value, vehicle_type:document.getElementById('w_vtype').value, route_from:document.getElementById('w_from').value, route_to:document.getElementById('w_to').value, km_start:parseFloat(document.getElementById('w_kmstart').value)||0, km_end:parseFloat(document.getElementById('w_kmend').value)||0, fuel_liters:parseFloat(document.getElementById('w_fuel').value)||0, fuel_cost:parseFloat(document.getElementById('w_fuelcost').value)||0, status:document.getElementById('w_status').value, cargo:document.getElementById('w_cargo').value }; var r=await af('waybills','POST',payload); if(r){ toast('Записано'); closeModal(); loadList(); } } async function deleteWb(id){ if(!confirm('Изтриване?'))return; await af('waybills','DELETE','', '&id='+id); loadList(); } async function toggleStatus(w){ var next = w.status==='active' ? 'inactive' : 'active'; await af('waybill_status','POST',{id:w.id,status:next}); loadList(); } var ALL=[]; async function loadList(){ ALL=await af('waybills')||[]; var tbl=document.getElementById('tbl'); if(!ALL.length){ tbl.querySelector('tbody').innerHTML='<tr><td colspan="8" style="color:var(--tx3)">Няма пътни листове</td></tr>'; return; } var html='<thead><tr><th>№</th><th>Дата</th><th>Шофьор</th><th>МПС</th><th>Маршрут</th><th>Км</th><th>Статус</th><th></th></tr></thead><tbody>'; ALL.forEach(w=>{ var km=(parseFloat(w.km_end||0)-parseFloat(w.km_start||0)).toFixed(1); html+='<tr><td>'+w.number+'</td><td>'+w.date+'</td><td>'+w.driver_name+'</td><td>'+w.vehicle_plate+'</td>'+ '<td>'+w.route_from+' → '+w.route_to+'</td><td>'+km+' км</td>'+ '<td><span class="badge '+w.status+'" onclick=\'toggleStatus('+JSON.stringify(w).replace(/'/g,"'")+')\'>'+(w.status==='active'?'Активен':(w.status==='inactive'?'Неактивен':'Приключен'))+'</span></td>'+ '<td class="actions"><span class="iconbtn" onclick=\'openEdit('+JSON.stringify(w).replace(/'/g,"'")+')\'>✎</span>'+ '<span class="iconbtn" onclick="printWb(\''+w.id+'\')">🖨</span>'+ '<span class="iconbtn" onclick="deleteWb(\''+w.id+'\')">🗑</span></td></tr>'; }); html+='</tbody>'; tbl.innerHTML=html; } function printWb(id){ var w=ALL.find(x=>x.id===id); if(!w)return; var km=(parseFloat(w.km_end||0)-parseFloat(w.km_start||0)).toFixed(1); var html='<div class="pdoc"><h2>Пътен лист № '+w.number+'</h2>'+ '<table><tr><th>Дата</th><td>'+w.date+'</td><th>Шофьор</th><td>'+w.driver_name+'</td></tr>'+ '<tr><th>Рег. № на МПС</th><td>'+w.vehicle_plate+'</td><th>Вид МПС</th><td>'+w.vehicle_type+'</td></tr>'+ '<tr><th>Маршрут</th><td colspan="3">'+w.route_from+' → '+w.route_to+'</td></tr>'+ '<tr><th>Км в началото</th><td>'+w.km_start+'</td><th>Км в края</th><td>'+w.km_end+'</td></tr>'+ '<tr><th>Изминати км</th><td>'+km+'</td><th>Гориво (л)</th><td>'+w.fuel_liters+'</td></tr>'+ '<tr><th>Клиент/обект</th><td colspan="3">'+w.client+'</td></tr>'+ '<tr><th>Товар/бележка</th><td colspan="3">'+(w.cargo||'')+'</td></tr></table>'+ '<div class="sig"><div><div class="line">Подпис на шофьора</div></div><div><div class="line">Подпис на отговорник</div></div></div></div>'; document.getElementById('printArea').innerHTML=html; window.print(); } async function moduleGuard(key,label){ try{ var r=await af('branding_settings'); if(r && (r.license_state==='locked'||r.license_state==='invalid')){ document.body.innerHTML='<div style="max-width:480px;margin:80px auto;text-align:center;font-family:sans-serif;color:#4a4a6a">'+ '<div style="font-size:40px;margin-bottom:12px">🔒</div><h2>Хъбът е заключен</h2>'+ '<p style="margin-top:8px;font-size:13px">'+(r.license_message||'Лицензът не е активен.')+'</p></div>'; return false; } if(r && r.modules_enabled && r.modules_enabled.hasOwnProperty(key) && !r.modules_enabled[key]){ document.body.innerHTML='<div style="max-width:480px;margin:80px auto;text-align:center;font-family:sans-serif;color:#4a4a6a">'+ '<div style="font-size:40px;margin-bottom:12px">🔒</div><h2>'+label+' е изключен</h2>'+ '<p style="margin-top:8px;font-size:13px">Този модул е изключен за тази инсталация. Свържи се с администратора.</p>'+ '<a href="index.html" style="display:inline-block;margin-top:16px;color:#6c63ff">← Обратно към Hub</a></div>'; return false; } }catch(e){} return true; } moduleGuard('waybills','Пътните листове').then(function(ok){ if(ok) loadList(); }); </script> </body> </html>
| ver. 1.4 |
Github
|
.
| PHP 8.2.31 | Generation time: 0 |
proxy
|
phpinfo
|
Settings