HMVL commited on
Commit
5a7f1be
·
verified ·
1 Parent(s): 2329762

Grey-out completed rows and status-priority sort; fix week-window timezone

Browse files
Files changed (1) hide show
  1. index.html +6 -4
index.html CHANGED
@@ -96,12 +96,13 @@ th.num,td.num{text-align:right;font-variant-numeric:tabular-nums}
96
  tbody td{padding:9px 13px;border-bottom:1px solid var(--line);vertical-align:top}
97
  tbody tr:last-child td{border-bottom:0}
98
  tbody tr:hover td{background:var(--amber-wash)}
 
99
  .mono{font-size:13.5px}
100
  .blocker{display:block;margin-top:3px;font-size:12.5px;color:var(--red)}
101
  .chip{display:inline-flex;align-items:center;font-size:12px;padding:2px 8px;border:1px solid var(--line-2);color:var(--ink-2);white-space:nowrap}
102
  .pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:2px 9px;border:1px solid;white-space:nowrap}
103
  .pill .dot{width:6px;height:6px;border-radius:50%}
104
- .st-done{color:var(--green);border-color:rgba(95,217,122,.4)} .st-done .dot{background:var(--green);box-shadow:0 0 5px var(--green)}
105
  .st-prog{color:var(--amber);border-color:rgba(255,176,0,.4)} .st-prog .dot{background:var(--amber);box-shadow:var(--glow)}
106
  .st-block{color:var(--red);border-color:rgba(255,92,71,.45)} .st-block .dot{background:var(--red);box-shadow:0 0 5px var(--red)}
107
  .st-defer{color:var(--defer);border-color:var(--line-2)} .st-defer .dot{background:var(--defer)}
@@ -258,6 +259,7 @@ const CATEGORIES=["Feature","Bugfix","Architecture","Code Review","DevOps","Supp
258
  const STATUSES=["Done","In Progress","Blocked","Deferred"];
259
  const BASE_PROJECTS=["Body Exteriors","Battery Enclosure","Seating Systems","Powertrain","ADAS Cameras","Exterior Mirrors","Internal"];
260
  const STATUS_CLASS={"Done":"st-done","In Progress":"st-prog","Blocked":"st-block","Deferred":"st-defer"};
 
261
  const LS_KEY="eng-tracker-state-v3";
262
  const TODAY="2026-08-31";
263
 
@@ -295,7 +297,7 @@ const $$=(s,r=document)=>[...r.querySelectorAll(s)];
295
  const fmtH=n=>(Math.round(n*100)/100).toFixed(2);
296
  const money=n=>"$"+n.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2});
297
  const esc=s=>String(s).replace(/[&<>"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c]));
298
- function addDays(iso,n){const d=new Date(iso+"T00:00:00");d.setDate(d.getDate()+n);return d.toISOString().slice(0,10);}
299
  function logIdFor(e){const stamp=e.date.replaceAll("-","");const same=state.entries.filter(x=>x.date===e.date);return `ENG-${stamp}-${String(same.indexOf(e)+1).padStart(4,"0")}`;}
300
  function allProjects(){const s=new Set(BASE_PROJECTS);state.entries.forEach(e=>s.add(e.project));state.parts.forEach(p=>s.add(p.proj));return[...s].sort();}
301
 
@@ -350,10 +352,10 @@ function renderMonth(m){
350
 
351
  function renderLog(){
352
  const q=$("#search").value.trim().toLowerCase(),fc=$("#fCat").value,fp=$("#fProj").value,fs=$("#fStatus").value;
353
- const rows=[...state.entries].map((e,idx)=>({e,idx})).filter(({e})=>(!fc||e.category===fc)&&(!fp||e.project===fp)&&(!fs||e.status===fs)&&(!q||(e.description+" "+e.engineer+" "+e.ticket+" "+e.project).toLowerCase().includes(q))).sort((a,b)=>a.e.date<b.e.date?1:a.e.date>b.e.date?-1:b.idx-a.idx);
354
  const body=$("#logBody");
355
  if(!rows.length){body.innerHTML=`<tr><td colspan="9" class="empty">No entries match these filters.</td></tr>`;return;}
356
- body.innerHTML=rows.map(({e,idx})=>`<tr>
357
  <td class="mono">${esc(logIdFor(e))}</td><td class="mono" style="color:var(--ink-2)">${esc(e.date)}</td><td>${esc(e.engineer)}</td><td>${esc(e.project)}</td>
358
  <td><span class="chip">${esc(e.category)}</span></td>
359
  <td>${esc(e.description)}${e.ticket?` <span class="mono" style="color:var(--muted)">[${esc(e.ticket)}]</span>`:""}${e.status==="Blocked"&&e.blocker?`<span class="blocker">Blocker: ${esc(e.blocker)}</span>`:""}</td>
 
96
  tbody td{padding:9px 13px;border-bottom:1px solid var(--line);vertical-align:top}
97
  tbody tr:last-child td{border-bottom:0}
98
  tbody tr:hover td{background:var(--amber-wash)}
99
+ tbody tr.r-done{opacity:.5} tbody tr.r-done:hover{opacity:.72}
100
  .mono{font-size:13.5px}
101
  .blocker{display:block;margin-top:3px;font-size:12.5px;color:var(--red)}
102
  .chip{display:inline-flex;align-items:center;font-size:12px;padding:2px 8px;border:1px solid var(--line-2);color:var(--ink-2);white-space:nowrap}
103
  .pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;padding:2px 9px;border:1px solid;white-space:nowrap}
104
  .pill .dot{width:6px;height:6px;border-radius:50%}
105
+ .st-done{color:var(--defer);border-color:var(--line-2)} .st-done .dot{background:var(--defer);box-shadow:none}
106
  .st-prog{color:var(--amber);border-color:rgba(255,176,0,.4)} .st-prog .dot{background:var(--amber);box-shadow:var(--glow)}
107
  .st-block{color:var(--red);border-color:rgba(255,92,71,.45)} .st-block .dot{background:var(--red);box-shadow:0 0 5px var(--red)}
108
  .st-defer{color:var(--defer);border-color:var(--line-2)} .st-defer .dot{background:var(--defer)}
 
259
  const STATUSES=["Done","In Progress","Blocked","Deferred"];
260
  const BASE_PROJECTS=["Body Exteriors","Battery Enclosure","Seating Systems","Powertrain","ADAS Cameras","Exterior Mirrors","Internal"];
261
  const STATUS_CLASS={"Done":"st-done","In Progress":"st-prog","Blocked":"st-block","Deferred":"st-defer"};
262
+ const STATUS_PRIORITY={"Blocked":0,"In Progress":1,"Deferred":2,"Done":3};
263
  const LS_KEY="eng-tracker-state-v3";
264
  const TODAY="2026-08-31";
265
 
 
297
  const fmtH=n=>(Math.round(n*100)/100).toFixed(2);
298
  const money=n=>"$"+n.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2});
299
  const esc=s=>String(s).replace(/[&<>"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c]));
300
+ function addDays(iso,n){const d=new Date(iso+"T00:00:00Z");d.setUTCDate(d.getUTCDate()+n);return d.toISOString().slice(0,10);}
301
  function logIdFor(e){const stamp=e.date.replaceAll("-","");const same=state.entries.filter(x=>x.date===e.date);return `ENG-${stamp}-${String(same.indexOf(e)+1).padStart(4,"0")}`;}
302
  function allProjects(){const s=new Set(BASE_PROJECTS);state.entries.forEach(e=>s.add(e.project));state.parts.forEach(p=>s.add(p.proj));return[...s].sort();}
303
 
 
352
 
353
  function renderLog(){
354
  const q=$("#search").value.trim().toLowerCase(),fc=$("#fCat").value,fp=$("#fProj").value,fs=$("#fStatus").value;
355
+ const rows=[...state.entries].map((e,idx)=>({e,idx})).filter(({e})=>(!fc||e.category===fc)&&(!fp||e.project===fp)&&(!fs||e.status===fs)&&(!q||(e.description+" "+e.engineer+" "+e.ticket+" "+e.project).toLowerCase().includes(q))).sort((a,b)=>{const pa=STATUS_PRIORITY[a.e.status]??2,pb=STATUS_PRIORITY[b.e.status]??2;if(pa!==pb)return pa-pb;return a.e.date<b.e.date?1:a.e.date>b.e.date?-1:b.idx-a.idx;});
356
  const body=$("#logBody");
357
  if(!rows.length){body.innerHTML=`<tr><td colspan="9" class="empty">No entries match these filters.</td></tr>`;return;}
358
+ body.innerHTML=rows.map(({e,idx})=>`<tr class="${e.status==='Done'?'r-done':''}">
359
  <td class="mono">${esc(logIdFor(e))}</td><td class="mono" style="color:var(--ink-2)">${esc(e.date)}</td><td>${esc(e.engineer)}</td><td>${esc(e.project)}</td>
360
  <td><span class="chip">${esc(e.category)}</span></td>
361
  <td>${esc(e.description)}${e.ticket?` <span class="mono" style="color:var(--muted)">[${esc(e.ticket)}]</span>`:""}${e.status==="Blocked"&&e.blocker?`<span class="blocker">Blocker: ${esc(e.blocker)}</span>`:""}</td>