Skip to content

Commit 30839ed

Browse files
guidooswaldDBclaude
andcommitted
Add local time tooltip on hover for epoch timestamps in JSON viewer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent d567876 commit 30839ed

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

app.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ def _find_list_key(data: dict) -> Optional[str]:
135135
".id-link{cursor:pointer;border-bottom:1px dashed currentColor;}"
136136
".id-link:hover{color:#00d4ff!important;border-bottom-color:#00d4ff;"
137137
"text-shadow:0 0 6px rgba(0,212,255,.5);}"
138+
".jts{position:relative;cursor:default;border-bottom:1px dotted #fbbf24;}"
139+
".jts:hover .ts-tip{visibility:visible;opacity:1;}"
140+
".ts-tip{visibility:hidden;opacity:0;position:absolute;bottom:calc(100% + 4px);left:50%;"
141+
"transform:translateX(-50%);background:#1e293b;color:#e2e8f0;font-size:11px;"
142+
"padding:3px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;"
143+
"border:1px solid rgba(0,212,255,.25);z-index:100;"
144+
"transition:opacity .15s;}"
138145
"::-webkit-scrollbar{width:6px;height:6px}"
139146
"::-webkit-scrollbar-thumb{background:rgba(255,255,255,.12);border-radius:3px}"
140147
"::-webkit-scrollbar-track{background:transparent}"
@@ -155,11 +162,14 @@ def _find_list_key(data: dict) -> Optional[str]:
155162
var currentDepth=INITIAL_DEPTH;
156163
function mkEl(tag,cls,txt){var e=document.createElement(tag);if(cls)e.className=cls;if(txt!==undefined)e.textContent=txt;return e;}
157164
function idLink(cls,display,gid,par,val,ext){var e=mkEl('span','id-link '+cls,display);e.dataset.gid=gid;e.dataset.par=par;e.dataset.val=val;if(ext)e.dataset.ext=JSON.stringify(ext);e.onclick=function(){var msg={type:'id-link',gid:e.dataset.gid,par:e.dataset.par,val:e.dataset.val};if(e.dataset.ext)msg.ext=JSON.parse(e.dataset.ext);window.parent.postMessage(msg,'*');};return e;}
165+
var TS_KEYS=/time$|_at$|timestamp$|_date$|expiration$|expired$|created$|updated$|deleted$|started$|finished$|modified$|deadline$|_ts$|start_time|end_time|creation_time|last_active_time|expiry_time/i;
166+
function isEpoch(val,pKey){if(typeof val!=='number'||!pKey||!TS_KEYS.test(pKey))return false;if(val>1e12&&val<2e13)return val;if(val>1e9&&val<2e10)return val*1000;return false;}
167+
function tsSpan(cls,display,ms){var w=mkEl('span','jts '+cls);w.textContent=display;var tip=mkEl('span','ts-tip');tip.textContent=new Date(ms).toLocaleString();w.appendChild(tip);return w;}
158168
function renderValue(val,pKey,depth){
159169
if(val===null)return mkEl('span','jbn','null');
160170
var t=typeof val;
161171
if(t==='boolean')return mkEl('span','jb',String(val));
162-
if(t==='number'){var c=pKey&&LOOKUP[pKey]&&LOOKUP[pKey][String(val)];return c?idLink('jn',String(val),c.gid,c.par,String(val),c.ext):mkEl('span','jn',String(val));}
172+
if(t==='number'){var ms=isEpoch(val,pKey);if(ms)return tsSpan('jn',String(val),ms);var c=pKey&&LOOKUP[pKey]&&LOOKUP[pKey][String(val)];return c?idLink('jn',String(val),c.gid,c.par,String(val),c.ext):mkEl('span','jn',String(val));}
163173
if(t==='string'){var c2=pKey&&LOOKUP[pKey]&&LOOKUP[pKey][val];return c2?idLink('jv','"'+val+'"',c2.gid,c2.par,val,c2.ext):mkEl('span','jv','"'+val+'"');}
164174
if(Array.isArray(val))return renderArray(val,depth);
165175
if(t==='object')return renderObject(val,depth);

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
385
1+
387

0 commit comments

Comments
 (0)