Fossil SCM
chat: added timestamps (browser-local time zone) to the chat messages.
Commit
99689132ca06a7019a6620a60adcd7bad262c32bd413885c042ac60573728656
Parent
896d7d44b048934…
1 file changed
+20
-2
+20
-2
| --- tools/chat.tcl | ||
| +++ tools/chat.tcl | ||
| @@ -169,10 +169,12 @@ | ||
| 169 | 169 | form.msg.focus(); |
| 170 | 170 | }); |
| 171 | 171 | const rxUrl = /\\b(?:https?|ftp):\\/\\/\[a-z0-9-+&@\#\\/%?=~_|!:,.;]*\[a-z0-9-+&@\#\\/%=~_|]/gim; |
| 172 | 172 | const rxAtName = /@\\w+/gmi; |
| 173 | 173 | // ^^^ achtung, extra backslashes needed for the outer TCL. |
| 174 | + const textNode = (T)=>document.createTextNode(T); | |
| 175 | + | |
| 174 | 176 | // Converts a message string to a message-containing DOM element |
| 175 | 177 | // and returns that element, which may contain child elements. |
| 176 | 178 | // If 2nd arg is passed, it must be a DOM element to which all |
| 177 | 179 | // child elements are appended. |
| 178 | 180 | const messageToDOM = function f(str, tgtElem){ |
| @@ -253,10 +255,24 @@ | ||
| 253 | 255 | if(f.injectPoint.nextSibling){ |
| 254 | 256 | f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling); |
| 255 | 257 | }else{ |
| 256 | 258 | f.injectPoint.parentNode.appendChild(e); |
| 257 | 259 | } |
| 260 | + }; | |
| 261 | + /** Returns the local time string of Date object d, defaulting | |
| 262 | + to the current time. */ | |
| 263 | + const localTimeString = function ff(d){ | |
| 264 | + if(!ff.pad){ | |
| 265 | + ff.pad = (x)=>(''+x).length>1 ? x : '0'+x; | |
| 266 | + } | |
| 267 | + d || (d = new Date()); | |
| 268 | + return [ | |
| 269 | + d.getFullYear(),'-',ff.pad(d.getMonth()+1/*sigh*/), | |
| 270 | + '-',ff.pad(d.getDate()), | |
| 271 | + ' ',ff.pad(d.getHours()),':',ff.pad(d.getMinutes()), | |
| 272 | + ':',ff.pad(d.getSeconds()) | |
| 273 | + ].join(''); | |
| 258 | 274 | }; |
| 259 | 275 | function newcontent(jx){ |
| 260 | 276 | var i; |
| 261 | 277 | for(i=0; i<jx.msgs.length; ++i){ |
| 262 | 278 | let m = jx.msgs[i]; |
| @@ -269,16 +285,18 @@ | ||
| 269 | 285 | row.appendChild(eWho); |
| 270 | 286 | eWho.classList.add('message-user'); |
| 271 | 287 | let whoName; |
| 272 | 288 | if( m.xfrom===_me ){ |
| 273 | 289 | whoName = 'me'; |
| 274 | - //eWho.classList.add('user-is-me'); | |
| 275 | 290 | row.classList.add('user-is-me'); |
| 276 | 291 | }else{ |
| 277 | 292 | whoName = m.xfrom; |
| 278 | 293 | } |
| 279 | - eWho.append(document.createTextNode(whoName)); | |
| 294 | + eWho.append(textNode( | |
| 295 | + whoName+' @ '+ | |
| 296 | + localTimeString(new Date(Date.parse(m.mtime+".000Z")))) | |
| 297 | + ); | |
| 280 | 298 | let span = document.createElement("div"); |
| 281 | 299 | span.classList.add('message-content'); |
| 282 | 300 | row.appendChild(span); |
| 283 | 301 | if( m.fsize>0 ){ |
| 284 | 302 | if( m.fmime && m.fmime.startsWith("image/") ){ |
| 285 | 303 |
| --- tools/chat.tcl | |
| +++ tools/chat.tcl | |
| @@ -169,10 +169,12 @@ | |
| 169 | form.msg.focus(); |
| 170 | }); |
| 171 | const rxUrl = /\\b(?:https?|ftp):\\/\\/\[a-z0-9-+&@\#\\/%?=~_|!:,.;]*\[a-z0-9-+&@\#\\/%=~_|]/gim; |
| 172 | const rxAtName = /@\\w+/gmi; |
| 173 | // ^^^ achtung, extra backslashes needed for the outer TCL. |
| 174 | // Converts a message string to a message-containing DOM element |
| 175 | // and returns that element, which may contain child elements. |
| 176 | // If 2nd arg is passed, it must be a DOM element to which all |
| 177 | // child elements are appended. |
| 178 | const messageToDOM = function f(str, tgtElem){ |
| @@ -253,10 +255,24 @@ | |
| 253 | if(f.injectPoint.nextSibling){ |
| 254 | f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling); |
| 255 | }else{ |
| 256 | f.injectPoint.parentNode.appendChild(e); |
| 257 | } |
| 258 | }; |
| 259 | function newcontent(jx){ |
| 260 | var i; |
| 261 | for(i=0; i<jx.msgs.length; ++i){ |
| 262 | let m = jx.msgs[i]; |
| @@ -269,16 +285,18 @@ | |
| 269 | row.appendChild(eWho); |
| 270 | eWho.classList.add('message-user'); |
| 271 | let whoName; |
| 272 | if( m.xfrom===_me ){ |
| 273 | whoName = 'me'; |
| 274 | //eWho.classList.add('user-is-me'); |
| 275 | row.classList.add('user-is-me'); |
| 276 | }else{ |
| 277 | whoName = m.xfrom; |
| 278 | } |
| 279 | eWho.append(document.createTextNode(whoName)); |
| 280 | let span = document.createElement("div"); |
| 281 | span.classList.add('message-content'); |
| 282 | row.appendChild(span); |
| 283 | if( m.fsize>0 ){ |
| 284 | if( m.fmime && m.fmime.startsWith("image/") ){ |
| 285 |
| --- tools/chat.tcl | |
| +++ tools/chat.tcl | |
| @@ -169,10 +169,12 @@ | |
| 169 | form.msg.focus(); |
| 170 | }); |
| 171 | const rxUrl = /\\b(?:https?|ftp):\\/\\/\[a-z0-9-+&@\#\\/%?=~_|!:,.;]*\[a-z0-9-+&@\#\\/%=~_|]/gim; |
| 172 | const rxAtName = /@\\w+/gmi; |
| 173 | // ^^^ achtung, extra backslashes needed for the outer TCL. |
| 174 | const textNode = (T)=>document.createTextNode(T); |
| 175 | |
| 176 | // Converts a message string to a message-containing DOM element |
| 177 | // and returns that element, which may contain child elements. |
| 178 | // If 2nd arg is passed, it must be a DOM element to which all |
| 179 | // child elements are appended. |
| 180 | const messageToDOM = function f(str, tgtElem){ |
| @@ -253,10 +255,24 @@ | |
| 255 | if(f.injectPoint.nextSibling){ |
| 256 | f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling); |
| 257 | }else{ |
| 258 | f.injectPoint.parentNode.appendChild(e); |
| 259 | } |
| 260 | }; |
| 261 | /** Returns the local time string of Date object d, defaulting |
| 262 | to the current time. */ |
| 263 | const localTimeString = function ff(d){ |
| 264 | if(!ff.pad){ |
| 265 | ff.pad = (x)=>(''+x).length>1 ? x : '0'+x; |
| 266 | } |
| 267 | d || (d = new Date()); |
| 268 | return [ |
| 269 | d.getFullYear(),'-',ff.pad(d.getMonth()+1/*sigh*/), |
| 270 | '-',ff.pad(d.getDate()), |
| 271 | ' ',ff.pad(d.getHours()),':',ff.pad(d.getMinutes()), |
| 272 | ':',ff.pad(d.getSeconds()) |
| 273 | ].join(''); |
| 274 | }; |
| 275 | function newcontent(jx){ |
| 276 | var i; |
| 277 | for(i=0; i<jx.msgs.length; ++i){ |
| 278 | let m = jx.msgs[i]; |
| @@ -269,16 +285,18 @@ | |
| 285 | row.appendChild(eWho); |
| 286 | eWho.classList.add('message-user'); |
| 287 | let whoName; |
| 288 | if( m.xfrom===_me ){ |
| 289 | whoName = 'me'; |
| 290 | row.classList.add('user-is-me'); |
| 291 | }else{ |
| 292 | whoName = m.xfrom; |
| 293 | } |
| 294 | eWho.append(textNode( |
| 295 | whoName+' @ '+ |
| 296 | localTimeString(new Date(Date.parse(m.mtime+".000Z")))) |
| 297 | ); |
| 298 | let span = document.createElement("div"); |
| 299 | span.classList.add('message-content'); |
| 300 | row.appendChild(span); |
| 301 | if( m.fsize>0 ){ |
| 302 | if( m.fmime && m.fmime.startsWith("image/") ){ |
| 303 |