Grey-out completed rows and status-priority sort; fix week-window timezone
Browse files- 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(--
|
| 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=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[c]));
|
| 298 |
-
function addDays(iso,n){const d=new Date(iso+"T00:00:
|
| 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=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[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>
|