Subversion Repositories SmartDukaan

Rev

Rev 37038 | Rev 37044 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 37038 Rev 37039
Line 178... Line 178...
178
  .img-x:hover{background:rgba(255,255,255,.3)}
178
  .img-x:hover{background:rgba(255,255,255,.3)}
179
  .modal-back.show{display:flex}
179
  .modal-back.show{display:flex}
180
  .modal{background:#fff;border-radius:14px;max-width:780px;width:100%;padding:20px 22px;box-shadow:0 20px 60px rgba(10,20,50,.3);position:relative}
180
  .modal{background:#fff;border-radius:14px;max-width:780px;width:100%;padding:20px 22px;box-shadow:0 20px 60px rgba(10,20,50,.3);position:relative}
181
  .modal h3{margin:0 0 2px;font-size:17px;text-align:center}
181
  .modal h3{margin:0 0 2px;font-size:17px;text-align:center}
182
  .modal > .desc{text-align:center}
182
  .modal > .desc{text-align:center}
183
  .modal .x,.rh-panel .x{position:absolute;top:14px;right:16px;cursor:pointer;color:var(--soft);font-size:22px;line-height:1;border:0;background:none}
183
  .modal .x,.rh-panel .x,.od-panel .x{position:absolute;top:14px;right:16px;cursor:pointer;color:var(--soft);font-size:22px;line-height:1;border:0;background:none}
184
  /* journey totals bar */
184
  /* journey totals bar */
185
  .jstats{display:flex;gap:9px;margin:12px 0 2px;flex-wrap:wrap}
185
  .jstats{display:flex;gap:9px;margin:12px 0 2px;flex-wrap:wrap}
186
  .js{flex:1;min-width:104px;background:#f8f9fc;border:1px solid var(--line2);border-radius:10px;padding:9px 10px;text-align:center}
186
  .js{flex:1;min-width:104px;background:#f8f9fc;border:1px solid var(--line2);border-radius:10px;padding:9px 10px;text-align:center}
187
  .js .jv{font-size:15.5px;font-weight:760;color:var(--ink);font-variant-numeric:tabular-nums}
187
  .js .jv{font-size:15.5px;font-weight:760;color:var(--ink);font-variant-numeric:tabular-nums}
188
  .js .jl{font-size:10px;color:var(--soft);text-transform:uppercase;letter-spacing:.04em;margin-top:3px;font-weight:600}
188
  .js .jl{font-size:10px;color:var(--soft);text-transform:uppercase;letter-spacing:.04em;margin-top:3px;font-weight:600}
Line 225... Line 225...
225
  .rhexec{font-size:10px;color:var(--soft);font-weight:600;margin:3px 0 4px}
225
  .rhexec{font-size:10px;color:var(--soft);font-weight:600;margin:3px 0 4px}
226
  .rhtext{font-size:12px;color:#4a5468;line-height:1.45;word-break:break-word;white-space:pre-wrap}
226
  .rhtext{font-size:12px;color:#4a5468;line-height:1.45;word-break:break-word;white-space:pre-wrap}
227
  .rhloading,.rhempty{color:var(--soft);font-size:12px;text-align:center;padding:24px 8px}
227
  .rhloading,.rhempty{color:var(--soft);font-size:12px;text-align:center;padding:24px 8px}
228
  .rh-more{margin-top:10px;background:var(--brand);color:#fff;border:0;border-radius:8px;padding:9px;font-weight:650;font-size:12.5px;cursor:pointer;display:none}
228
  .rh-more{margin-top:10px;background:var(--brand);color:#fff;border:0;border-radius:8px;padding:9px;font-weight:650;font-size:12.5px;cursor:pointer;display:none}
229
  .rh-more:disabled{opacity:.6;cursor:default}
229
  .rh-more:disabled{opacity:.6;cursor:default}
-
 
230
  /* order-details drawer (stacks above the remark drawer) */
-
 
231
  .od-back{position:fixed;inset:0;background:rgba(15,22,40,.42);z-index:1300;display:none}
-
 
232
  .od-back.show{display:block}
-
 
233
  .od-panel{position:absolute;top:0;right:0;height:100%;width:min(440px,94vw);background:#fff;box-shadow:-8px 0 30px rgba(20,30,60,.18);display:flex;flex-direction:column;padding:18px 18px 14px;transform:translateX(100%);transition:transform .22s ease}
-
 
234
  .od-back.show .od-panel{transform:translateX(0)}
-
 
235
  .od-panel h3{margin:0 0 2px;font-size:15px;color:var(--ink)}
-
 
236
  .od-panel .desc{margin:0;font-size:12px;color:var(--soft)}
-
 
237
  .od-body{flex:1;overflow-y:auto;margin-top:12px}
-
 
238
  .odsum{display:flex;flex-wrap:wrap;gap:8px 18px;padding:10px 12px;background:#fbfcfe;border:1px solid var(--line2);border-radius:9px;margin-bottom:12px}
-
 
239
  .odsum .k{font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--soft);font-weight:700}
-
 
240
  .odsum .v{font-size:13px;font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums}
-
 
241
  .odtable{width:100%;border-collapse:collapse;font-size:11.5px}
-
 
242
  .odtable th{text-align:left;color:var(--soft);font-weight:700;font-size:9px;text-transform:uppercase;letter-spacing:.03em;padding:5px 6px;border-bottom:1px solid var(--line2)}
-
 
243
  .odtable td{padding:6px;border-bottom:1px solid #eef1f7;color:#4a5468;vertical-align:top}
-
 
244
  .odtable td.num{text-align:right;font-variant-numeric:tabular-nums}
-
 
245
  .odloading,.odempty{color:var(--soft);font-size:12px;text-align:center;padding:24px 8px}
230
  .tlcard .tm{flex:none;width:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;font-weight:750;font-size:13px;padding:6px 4px;line-height:1.05}
246
  .tlcard .tm{flex:none;width:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;font-weight:750;font-size:13px;padding:6px 4px;line-height:1.05}
231
  .tlcard .tm small{font-weight:600;font-size:8.5px;opacity:.9;text-transform:uppercase;letter-spacing:.04em;margin-top:3px}
247
  .tlcard .tm small{font-weight:600;font-size:8.5px;opacity:.9;text-transform:uppercase;letter-spacing:.04em;margin-top:3px}
232
  .tlcard .bd{padding:8px 11px;flex:1;min-width:0}
248
  .tlcard .bd{padding:8px 11px;flex:1;min-width:0}
233
  .tlcard .bd .ti{font-size:12.5px;font-weight:700;color:var(--ink);line-height:1.25;word-break:break-word}
249
  .tlcard .bd .ti{font-size:12.5px;font-weight:700;color:var(--ink);line-height:1.25;word-break:break-word}
234
  .tlcard .bd .stt{display:inline-block;font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;padding:1px 6px;border-radius:5px;margin-top:5px;color:#fff}
250
  .tlcard .bd .stt{display:inline-block;font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;padding:1px 6px;border-radius:5px;margin-top:5px;color:#fff}
Line 238... Line 254...
238
  .tlrow.left .tlextra{justify-content:flex-end}
254
  .tlrow.left .tlextra{justify-content:flex-end}
239
  .tlrow.right .tlextra{justify-content:flex-start}
255
  .tlrow.right .tlextra{justify-content:flex-start}
240
  .tlthumb{width:46px;height:46px;border-radius:8px;object-fit:cover;border:1px solid var(--line);cursor:pointer;background:#f1f3f9}
256
  .tlthumb{width:46px;height:46px;border-radius:8px;object-fit:cover;border:1px solid var(--line);cursor:pointer;background:#f1f3f9}
241
  .tlph{width:46px;height:46px;border-radius:8px;border:1px dashed #cfd6e6;background:#f4f6fb;display:flex;align-items:center;justify-content:center;color:#b3bcce;font-size:18px}
257
  .tlph{width:46px;height:46px;border-radius:8px;border:1px dashed #cfd6e6;background:#f4f6fb;display:flex;align-items:center;justify-content:center;color:#b3bcce;font-size:18px}
242
  .tlchip{font-size:10.5px;font-weight:600;color:var(--muted);background:#f1f3f9;border-radius:6px;padding:2px 7px;white-space:nowrap}
258
  .tlchip{font-size:10.5px;font-weight:600;color:var(--muted);background:#f1f3f9;border-radius:6px;padding:2px 7px;white-space:nowrap}
-
 
259
  .tlbadge{font-size:10.5px;font-weight:700;border:0;border-radius:6px;padding:2px 8px;white-space:nowrap;cursor:pointer;line-height:1.5}
-
 
260
  .tlbadge.ord{background:#e7f0ff;color:#1c56c9}
-
 
261
  .tlbadge.ord:hover{background:#d4e4ff}
-
 
262
  .tlbadge.sch{background:#fff4e6;color:#c25709;cursor:default}
243
  .exectabs{display:flex;gap:6px;justify-content:center;margin:12px 0 4px}
263
  .exectabs{display:flex;gap:6px;justify-content:center;margin:12px 0 4px}
244
  .exectab{padding:6px 14px;border-radius:8px;font-size:12.5px;font-weight:650;color:var(--muted);cursor:pointer;border:1px solid var(--line);background:#fff}
264
  .exectab{padding:6px 14px;border-radius:8px;font-size:12.5px;font-weight:650;color:var(--muted);cursor:pointer;border:1px solid var(--line);background:#fff}
245
  .exectab.active{background:var(--brand);color:#fff;border-color:var(--brand)}
265
  .exectab.active{background:var(--brand);color:#fff;border-color:var(--brand)}
246
  #bjMap{width:100%;height:460px;border-radius:12px;border:1px solid var(--line);margin-top:10px;background:#eef1f7;overflow:hidden}
266
  #bjMap{width:100%;height:460px;border-radius:12px;border:1px solid var(--line);margin-top:10px;background:#eef1f7;overflow:hidden}
247
  .bjlegend{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#f8f9fc;font-size:12.5px;min-height:20px}
267
  .bjlegend{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#f8f9fc;font-size:12.5px;min-height:20px}
Line 312... Line 332...
312
    <div class="rh-list" id="bj-rh-list"></div>
332
    <div class="rh-list" id="bj-rh-list"></div>
313
    <button class="rh-more" id="bj-rh-more" onclick="bjLoadRemarkHistory()">Load more</button>
333
    <button class="rh-more" id="bj-rh-more" onclick="bjLoadRemarkHistory()">Load more</button>
314
  </div>
334
  </div>
315
</div>
335
</div>
316
 
336
 
-
 
337
<!-- order-details drawer — slides in from the right, above the remark drawer -->
-
 
338
<div class="od-back" id="bj-od-back" onclick="if(event.target===this)closeOrderDetail()">
-
 
339
  <div class="od-panel" id="bj-od-panel">
-
 
340
    <button class="x" onclick="closeOrderDetail()">&times;</button>
-
 
341
    <h3 id="bj-od-title"></h3>
-
 
342
    <p class="desc" id="bj-od-sub"></p>
-
 
343
    <div class="od-body" id="bj-od-body"></div>
-
 
344
  </div>
-
 
345
</div>
-
 
346
 
317
<script>
347
<script>
318
var CTX = '${rc.contextPath}';
348
var CTX = '${rc.contextPath}';
319
var BASE = CTX + '/beat-journey';
349
var BASE = CTX + '/beat-journey';
320
var LENS = 'today';
350
var LENS = 'today';
321
var TODAY = '$today';
351
var TODAY = '$today';
Line 1477... Line 1507...
1477
function tlSecs(t){ if(!t) return 1e9; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
1507
function tlSecs(t){ if(!t) return 1e9; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
1478
function toSec(t){ if(!t||t==='00:00:00') return 0; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
1508
function toSec(t){ if(!t||t==='00:00:00') return 0; var p=t.split(':'); return (+p[0])*3600+(+(p[1]||0))*60+(+(p[2]||0)); }
1479
function fmtSec(s){ s=Math.max(0,Math.round(s)); var h=Math.floor(s/3600), m=Math.floor((s%3600)/60), ss=s%60; function z(n){return (n<10?'0':'')+n;} return z(h)+':'+z(m)+':'+z(ss); }
1509
function fmtSec(s){ s=Math.max(0,Math.round(s)); var h=Math.floor(s/3600), m=Math.floor((s%3600)/60), ss=s%60; function z(n){return (n<10?'0':'')+n;} return z(h)+':'+z(m)+':'+z(ss); }
1480
function jstat(v,l){ return '<div class="js"><div class="jv">'+v+'</div><div class="jl">'+l+'</div></div>'; }
1510
function jstat(v,l){ return '<div class="js"><div class="jv">'+v+'</div><div class="jl">'+l+'</div></div>'; }
1481
function hhmm(t){ return t? t.slice(0,5):''; }
1511
function hhmm(t){ return t? t.slice(0,5):''; }
-
 
1512
// Best-effort: pull a "when will they order" hint out of a free-text remark.
-
 
1513
// English + Hinglish. Display-only; returns '' when nothing recognizable is found.
-
 
1514
function bjScheduledFromRemark(remark){
-
 
1515
  if(!remark) return '';
-
 
1516
  var t = String(remark).toLowerCase();
-
 
1517
  // day-after (before tomorrow/kal, since "parso" is distinct)
-
 
1518
  if(/\b(day[\s-]?after(\s+tomorrow)?|parso)\b/.test(t)) return 'day after';
-
 
1519
  if(/\b(tomorrow|kal|tmrw|tmr)\b/.test(t)) return 'tomorrow';
-
 
1520
  if(/\b(today|aaj|abhi)\b/.test(t)) return 'today';
-
 
1521
  // range "N-M days" / "N-M din" (check before single N)
-
 
1522
  var range = t.match(/\b(\d{1,2})\s*[-–to]+\s*(\d{1,2})\s*(days?|din)\b/);
-
 
1523
  if(range) return 'in '+range[1]+'–'+range[2]+' days';
-
 
1524
  var nd = t.match(/\b(?:in\s+)?(\d{1,2})\s*(days?|din)\b/);
-
 
1525
  if(nd) return 'in '+nd[1]+' day'+(nd[1]==='1'?'':'s');
-
 
1526
  if(/\b(this\s*week|is\s*week|is\s*haft[ae])\b/.test(t)) return 'this week';
-
 
1527
  if(/\b(next\s*week|agle\s*haft[ae]|agla\s*week)\b/.test(t)) return 'next week';
-
 
1528
  // explicit "DD Mon" / "DD Month"
-
 
1529
  var mon = t.match(/\b(\d{1,2})\s+(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\b/);
-
 
1530
  if(mon){
-
 
1531
    var M={jan:'Jan',feb:'Feb',mar:'Mar',apr:'Apr',may:'May',jun:'Jun',jul:'Jul',aug:'Aug',sep:'Sep',oct:'Oct',nov:'Nov',dec:'Dec'};
-
 
1532
    return parseInt(mon[1],10)+' '+M[mon[2]];
-
 
1533
  }
-
 
1534
  // "DD/MM" or "DD-MM" (reject year-like / out-of-range month)
-
 
1535
  var dm = t.match(/\b(\d{1,2})[\/\-](\d{1,2})\b(?!\d)/);
-
 
1536
  if(dm && parseInt(dm[2],10)>=1 && parseInt(dm[2],10)<=12){
-
 
1537
    var mo=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
-
 
1538
    return parseInt(dm[1],10)+' '+mo[parseInt(dm[2],10)-1];
-
 
1539
  }
-
 
1540
  // weekday names (English + common Hinglish)
-
 
1541
  var wk = t.match(/\b(monday|tuesday|wednesday|thursday|friday|saturday|sunday|somwar|mangalwar|budhwar|guruwar|shukrawar|shaniwar|raviwar|itwar)\b/);
-
 
1542
  if(wk){
-
 
1543
    var W={monday:'Mon',somwar:'Mon',tuesday:'Tue',mangalwar:'Tue',wednesday:'Wed',budhwar:'Wed',
-
 
1544
           thursday:'Thu',guruwar:'Thu',friday:'Fri',shukrawar:'Fri',saturday:'Sat',shaniwar:'Sat',
-
 
1545
           sunday:'Sun',raviwar:'Sun',itwar:'Sun'};
-
 
1546
    return W[wk[1]];
-
 
1547
  }
-
 
1548
  return '';
-
 
1549
}
1482
function tlThumb(att){
1550
function tlThumb(att){
1483
  if(att && window._mediaUrl) return '<img class="tlthumb" src="'+esc(window._mediaUrl+att)+'" onclick="bjOpenImage(this.src)" onerror="tlImgErr(this)">';
1551
  if(att && window._mediaUrl) return '<img class="tlthumb" src="'+esc(window._mediaUrl+att)+'" onclick="bjOpenImage(this.src)" onerror="tlImgErr(this)">';
1484
  return '<div class="tlph" title="No photo">&#128247;</div>';
1552
  return '<div class="tlph" title="No photo">&#128247;</div>';
1485
}
1553
}
1486
function tlImgErr(im){ var d=document.createElement('div'); d.className='tlph'; d.title='Photo unavailable'; d.innerHTML='&#128247;'; if(im.parentNode) im.parentNode.replaceChild(d, im); }
1554
function tlImgErr(im){ var d=document.createElement('div'); d.className='tlph'; d.title='Photo unavailable'; d.innerHTML='&#128247;'; if(im.parentNode) im.parentNode.replaceChild(d, im); }
Line 1523... Line 1591...
1523
  var extra='';
1591
  var extra='';
1524
  if(!x._punch){
1592
  if(!x._punch){
1525
    var chips='';
1593
    var chips='';
1526
    if(x.battery!=null) chips += '<span class="tlchip">&#128267; '+x.battery+'%</span>';
1594
    if(x.battery!=null) chips += '<span class="tlchip">&#128267; '+x.battery+'%</span>';
1527
    if(x.locOff!=null) chips += '<span class="tlchip">&#128244; '+x.locOff+'</span>';
1595
    if(x.locOff!=null) chips += '<span class="tlchip">&#128244; '+x.locOff+'</span>';
-
 
1596
    // billing-agenda partner stop: order badge(s) win; else a parsed "scheduled" chip
-
 
1597
    if(x.billingAgenda){
-
 
1598
      if(x.orders && x.orders.length){
-
 
1599
        x.orders.slice(0,2).forEach(function(o){
-
 
1600
          var label = o.invoice ? ('#'+o.invoice) : ('#'+o.orderId);
-
 
1601
          chips += '<button type="button" class="tlbadge ord" title="View order details"'
-
 
1602
                 + ' onclick="bjOpenOrderDetail('+o.orderId+','+x.taskId+')">&#129534; '+esc(label)+'</button>';
-
 
1603
        });
-
 
1604
        if(x.orders.length>2) chips += '<span class="tlchip">+'+(x.orders.length-2)+'</span>';
-
 
1605
      } else {
-
 
1606
        var sch = bjScheduledFromRemark(x.remarks);
-
 
1607
        if(sch) chips += '<span class="tlbadge sch" title="Scheduled (from remark)">&#128197; '+esc(sch)+'</span>';
-
 
1608
      }
-
 
1609
    }
1528
    extra = '<div class="tlextra">'+tlThumb(x.attachment)+chips+'</div>';
1610
    extra = '<div class="tlextra">'+tlThumb(x.attachment)+chips+'</div>';
1529
  }
1611
  }
1530
  var card='<div class="tlcard">'+
1612
  var card='<div class="tlcard">'+
1531
        '<div class="tm" style="background:'+s.c+'">'+timeTop+'<small>'+tlabel+'</small></div>'+
1613
        '<div class="tm" style="background:'+s.c+'">'+timeTop+'<small>'+tlabel+'</small></div>'+
1532
        '<div class="bd"><div class="ti">'+esc(tlTitle(x))+'</div>'+
1614
        '<div class="bd"><div class="ti">'+esc(tlTitle(x))+'</div>'+
Line 1614... Line 1696...
1614
  var more=el('bj-rh-more');
1696
  var more=el('bj-rh-more');
1615
  more.disabled=false; more.textContent='Load more';
1697
  more.disabled=false; more.textContent='Load more';
1616
  more.style.display = hasMore ? 'block' : 'none';
1698
  more.style.display = hasMore ? 'block' : 'none';
1617
}
1699
}
1618
 
1700
 
-
 
1701
/* ===================== ORDER DETAILS DRAWER ===================== */
-
 
1702
// Header + line items for one retail order a partner placed on the visit day.
-
 
1703
function bjOpenOrderDetail(orderId, fofoId){
-
 
1704
  if(!orderId || !fofoId) return;
-
 
1705
  window._od = { orderId:orderId, fofoId:fofoId };
-
 
1706
  el('bj-od-title').innerHTML='&#129534; Order #'+esc(orderId);
-
 
1707
  el('bj-od-sub').textContent='Retail order placed on the visit day';
-
 
1708
  el('bj-od-body').innerHTML='<div class="odloading"><div class="spinner"></div>Loading&hellip;</div>';
-
 
1709
  el('bj-od-back').classList.add('show');
-
 
1710
  fetch(CTX+'/beat-journey/order-detail?orderId='+encodeURIComponent(orderId)+'&fofoId='+encodeURIComponent(fofoId),
-
 
1711
        {headers:{'Accept':'application/json'}})
-
 
1712
    .then(function(r){ return r.json(); })
-
 
1713
    .then(function(d){
-
 
1714
      var st=window._od; if(!st || st.orderId!==orderId) return;   // drawer changed mid-flight
-
 
1715
      bjRenderOrderDetail(d);
-
 
1716
    })
-
 
1717
    .catch(function(){ el('bj-od-body').innerHTML='<div class="odempty">Could not load order details.</div>'; });
-
 
1718
}
-
 
1719
function closeOrderDetail(){ el('bj-od-back').classList.remove('show'); window._od=null; }
-
 
1720
function bjRenderOrderDetail(d){
-
 
1721
  var hd=d.header;
-
 
1722
  if(!hd){ el('bj-od-body').innerHTML='<div class="odempty">Order not found.</div>'; return; }
-
 
1723
  var money=function(n){ return '₹'+(Math.round(Number(n)||0)).toLocaleString(); };
-
 
1724
  var h='<div class="odsum">'
-
 
1725
    +'<div><div class="k">Invoice</div><div class="v">'+esc(hd.invoice||('#'+hd.orderId))+'</div></div>'
-
 
1726
    +'<div><div class="k">Amount</div><div class="v">'+money(hd.amount)+'</div></div>'
-
 
1727
    +'<div><div class="k">Date</div><div class="v">'+esc((hd.date||'')+(hd.time?' '+hhmm(hd.time):''))+'</div></div>'
-
 
1728
    +'</div>';
-
 
1729
  var items=d.items||[];
-
 
1730
  if(!items.length){ h+='<div class="odempty">No line items on this order.</div>'; el('bj-od-body').innerHTML=h; return; }
-
 
1731
  h+='<table class="odtable"><thead><tr><th>Item</th><th class="num">Qty</th><th class="num">MOP</th></tr></thead><tbody>';
-
 
1732
  items.forEach(function(it){
-
 
1733
    var name=[it.brand,it.model,it.color].filter(function(s){return s;}).map(esc).join(' &middot; ');
-
 
1734
    h+='<tr><td>'+(name||'&mdash;')+'</td><td class="num">'+(it.qty||0)+'</td><td class="num">'+money(it.mop)+'</td></tr>';
-
 
1735
  });
-
 
1736
  h+='</tbody></table>';
-
 
1737
  el('bj-od-body').innerHTML=h;
-
 
1738
}
-
 
1739
 
1619
/* ============================ APPROVAL ============================ */
1740
/* ============================ APPROVAL ============================ */
1620
function loadApproval(){
1741
function loadApproval(){
1621
  spinner();
1742
  spinner();
1622
  var from=el('bj-start').value, to=el('bj-end').value;
1743
  var from=el('bj-start').value, to=el('bj-end').value;
1623
  var u=CTX+'/beat-report/approval/data?fromDate='+encodeURIComponent(from)+'&toDate='+encodeURIComponent(to)+qs();
1744
  var u=CTX+'/beat-report/approval/data?fromDate='+encodeURIComponent(from)+'&toDate='+encodeURIComponent(to)+qs();