Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | chat: added buttons to jump to top/bottom of message list. Added a huge margin under the input area because Safari demands it. Improved the div.content auto-resize calculation to get a more precise fit. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
24080827600388c6d8fb23d9d399dfe2 |
| User & Date: | stephan 2020-12-27 08:32:54.902 |
Context
|
2020-12-27
| ||
| 09:05 | chat: ARIA-related attribute changes suggested in the forum. ... (check-in: ca7aae80ad user: stephan tags: trunk) | |
| 08:32 | chat: added buttons to jump to top/bottom of message list. Added a huge margin under the input area because Safari demands it. Improved the div.content auto-resize calculation to get a more precise fit. ... (check-in: 2408082760 user: stephan tags: trunk) | |
| 07:45 | chat: auto-scrolling of other peoples' posts into view works based on a heuristic of whether the *previous* post is in view or not (else we assume the user is back in the history), with the notable caveat that posts with inlined images play havok with this, in part because loading of images is async and we race against it. Moved the #debugMsg element out of div.content to keep it from unduly influencing our layout. ... (check-in: 6c28d7d6cb user: stephan tags: trunk) | |
Changes
Changes to src/chat.c.
| ︙ | ︙ | |||
118 119 120 121 122 123 124 125 126 127 128 129 130 131 | @ <form accept-encoding="utf-8" id="chat-form" autocomplete="off"> @ <div id='chat-input-line'> @ <input type="text" name="msg" id="chat-input-single" \ @ placeholder="Type message here." autocomplete="off"> @ <textarea rows="8" id="chat-input-multi" \ @ placeholder="Type message here" class="hidden"></textarea> @ <input type="submit" value="Send" id="chat-message-submit"> @ <span id="chat-settings-button" class="settings-icon"></span> @ </div> @ <div id='chat-input-file-area'> @ <div class='file-selection-wrapper'> @ <div class='help-buttonlet'> @ Select a file to upload, drag/drop a file into this spot, @ or paste an image from the clipboard if supported by | > > | 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | @ <form accept-encoding="utf-8" id="chat-form" autocomplete="off"> @ <div id='chat-input-line'> @ <input type="text" name="msg" id="chat-input-single" \ @ placeholder="Type message here." autocomplete="off"> @ <textarea rows="8" id="chat-input-multi" \ @ placeholder="Type message here" class="hidden"></textarea> @ <input type="submit" value="Send" id="chat-message-submit"> @ <button id="chat-scroll-bottom">↓</button> @ <button id="chat-scroll-top">↑</button> @ <span id="chat-settings-button" class="settings-icon"></span> @ </div> @ <div id='chat-input-file-area'> @ <div class='file-selection-wrapper'> @ <div class='help-buttonlet'> @ Select a file to upload, drag/drop a file into this spot, @ or paste an image from the clipboard if supported by |
| ︙ | ︙ |
Changes to src/chat.js.
| ︙ | ︙ | |||
23 24 25 26 27 28 29 |
let dbg = document.querySelector('#debugMsg');
if(dbg){
/* This can inadvertently influence our flexbox layouts, so move
it out of the way. */
D.append(document.body,dbg);
}
})();
| | > > > > | > > > > > > > > | | > > > > > > > > | > > | > > > | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
let dbg = document.querySelector('#debugMsg');
if(dbg){
/* This can inadvertently influence our flexbox layouts, so move
it out of the way. */
D.append(document.body,dbg);
}
})();
const ForceResizeKludge = 0 ? function(){} : (function f(){
/* Workaround for Safari mayhem regarding use of vh CSS units....
We tried to use vh units to set the content area size for the
chat layout, but Safari chokes on that, so we calculate that
height here: 85% when in "normal" mode and 95% in chat-only
mode. Larger than ~95% is too big for Firefox on Android,
causing the input area to move off-screen. */
if(!f.eHead){
f.eHead = document.querySelector('body > div.header');
f.eMenu = document.querySelector('body > div.mainmenu');
f.eFoot = document.querySelector('body > div.footer');
f.contentArea = E1('div.content');
f.extra = 0;
f.measure = function(e){
if(e){
const m = window.getComputedStyle(e);
f.extra += parseFloat(m.height);
}
};
}
const bcl = document.body.classList;
const resized = function(){
const wh = window.innerHeight,
com = bcl.contains('chat-only-mode');
var ht;
if(com){
ht = wh - 10/*fudge value*/;
}else{
f.extra = 0;
[f.eHead, f.eMenu, f.eFoot].forEach(f.measure);
ht = wh - f.extra - 10/*fudge value*/;
}
f.contentArea.style.height =
f.contentArea.style.maxHeight = (ht>=100 ? ht : 100)+"px";
if(false){
console.debug("resized.",wh, f.extra, ht,
window.getComputedStyle(f.contentArea).maxHeight,
f.contentArea);
}
};
var doit;
window.addEventListener('resize',function(ev){
clearTimeout(doit);
doit = setTimeout(resized, 100);
}, false);
resized();
|
| ︙ | ︙ | |||
252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
document.body.scroll(0,document.body.height);
}else{
D.removeClass(f.elemsToToggle, 'hidden');
D.removeClass(document.body, 'chat-only-mode');
}
ForceResizeKludge();
return this;
},
toggleChatOnlyMode: function(){
return this.chatOnlyMode(!this.isChatOnlyMode());
},
settings:{
get: (k,dflt)=>F.storage.get(k,dflt),
getBool: (k,dflt)=>F.storage.getBool(k,dflt),
| > > > > > > > > > > > > > | 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
document.body.scroll(0,document.body.height);
}else{
D.removeClass(f.elemsToToggle, 'hidden');
D.removeClass(document.body, 'chat-only-mode');
}
ForceResizeKludge();
return this;
},
/** Tries to scroll the message area to...
<0 = top of the message list, >1 = bottom of the message list,
0 == the newest message (normally the same position as >1).
*/
scrollMessagesTo: function(where){
if(where<0){
Chat.e.messagesWrapper.scrollTop = 0;
}else if(where>0){
Chat.e.messagesWrapper.scrollTop = Chat.e.messagesWrapper.scrollHeight;
}else if(Chat.e.newestMessage){
Chat.e.newestMessage.scrollIntoView();
}
},
toggleChatOnlyMode: function(){
return this.chatOnlyMode(!this.isChatOnlyMode());
},
settings:{
get: (k,dflt)=>F.storage.get(k,dflt),
getBool: (k,dflt)=>F.storage.getBool(k,dflt),
|
| ︙ | ︙ | |||
811 812 813 814 815 816 817 818 819 820 821 822 823 824 |
};
settingsPopup.options.adjustY = function(y){
const rect = settingsButton.getBoundingClientRect();
return rect.top - popupSize.height -2;
};
})()/*#chat-settings-button setup*/;
/** Callback for poll() to inject new content into the page. jx ==
the response from /chat-poll. If atEnd is true, the message is
appended to the end of the chat list, else the beginning (the
default). */
const newcontent = function f(jx,atEnd){
if(!f.processPost){
| > > > > > > > > > > > > | 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 |
};
settingsPopup.options.adjustY = function(y){
const rect = settingsButton.getBoundingClientRect();
return rect.top - popupSize.height -2;
};
})()/*#chat-settings-button setup*/;
(function(){ /* buttons to scroll to the begin/end of the messages. */
E1('#chat-scroll-bottom').addEventListener('click',function(ev){
ev.preventDefault();
Chat.scrollMessagesTo(1);
return false;
});
E1('#chat-scroll-top').addEventListener('click',function(ev){
ev.preventDefault();
Chat.scrollMessagesTo(-1);
return false;
});
})();
/** Callback for poll() to inject new content into the page. jx ==
the response from /chat-poll. If atEnd is true, the message is
appended to the end of the chat list, else the beginning (the
default). */
const newcontent = function f(jx,atEnd){
if(!f.processPost){
|
| ︙ | ︙ |
Changes to src/default.css.
| ︙ | ︙ | |||
1659 1660 1661 1662 1663 1664 1665 |
/* Wrapper for /chat user input controls */
body.chat #chat-input-area {
display: flex;
flex-direction: column;
padding: 0.5em 1em;
border-bottom: none;
border-top: 1px solid black;
| < | > > > > > > > | > > > > > > > > | | 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 |
/* Wrapper for /chat user input controls */
body.chat #chat-input-area {
display: flex;
flex-direction: column;
padding: 0.5em 1em;
border-bottom: none;
border-top: 1px solid black;
margin: 0.5em 1em 0 1em;
position: initial /*sticky currently disabled due to scrolling-related issues*/;
bottom: 0;
}
body.chat:not(.chat-only-mode) #chat-input-area{
/* Safari user reports that 2em is necessary to keep the file selection
widget from overlapping the page footer, whereas a margin of 0 is fine
for FF/Chrome (and 2em is a *huge* waste of space for those). */
margin-bottom: 2em;
}
/* Widget holding the chat message input field, send button, and
settings button. */
body.chat #chat-input-line {
display: flex;
flex-direction: row;
margin-bottom: 0.25em;
align-items: flex-start;
}
body.chat #chat-input-line > input[type=submit],
body.chat #chat-input-line > #chat-settings-button,
body.chat #chat-input-line > button {
flex: 1 5 auto;
max-width: 6em;
margin: 0 0.25em;
}
body.chat #chat-input-line > button {
max-width: 4em;
}
body.chat #chat-input-line > #chat-settings-button{
margin: 0 0 0 0.25em;
}
body.chat #chat-input-line > input[type=text],
body.chat #chat-input-line > textarea {
flex: 5 1 auto;
}
/* Widget holding the file selection control and preview */
body.chat #chat-input-file-area {
|
| ︙ | ︙ |