Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | /chat: replaced input-related buttons with span elements in an attempt to get more consistent cross-browser results. Renamed some internal element IDs for naming consistency's sake. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
98b2cbe69b2e8a31c06b043bcb1fa00f |
| User & Date: | stephan 2021-10-04 19:01:29.023 |
Context
|
2021-10-04
| ||
| 19:13 | /chat: shrunk compact mode toolbar just a tick. Replaced non-portable on-hover button effect with something portable. ... (check-in: 7755c6482b user: stephan tags: trunk) | |
| 19:01 | /chat: replaced input-related buttons with span elements in an attempt to get more consistent cross-browser results. Renamed some internal element IDs for naming consistency's sake. ... (check-in: 98b2cbe69b user: stephan tags: trunk) | |
| 11:39 | Update the built-in SQLite sources to the latest 3.37.0 alpha, for testing. ... (check-in: ae433763ae user: drh tags: trunk) | |
Changes
Changes to src/chat.c.
| ︙ | ︙ | |||
177 178 179 180 181 182 183 |
style_header("Chat");
@ <div id='chat-input-area'>
@ <div id='chat-input-line' class='single-line'>
@ <div contenteditable id="chat-input-field" \
@ data-placeholder0="%h(zInputPlaceholder0)" \
@ data-placeholder="%h(zInputPlaceholder0)" \
@ class=""></div>
| | | | | | | | | | | 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
style_header("Chat");
@ <div id='chat-input-area'>
@ <div id='chat-input-line' class='single-line'>
@ <div contenteditable id="chat-input-field" \
@ data-placeholder0="%h(zInputPlaceholder0)" \
@ data-placeholder="%h(zInputPlaceholder0)" \
@ class=""></div>
@ <div id='chat-buttons-wrapper'>
@ <span class='cbutton' id="chat-button-preview" \
@ title="Preview message (Shift-Enter)">👁</span>
@ <span class='cbutton' id="chat-button-attach" \
@ title="Attach file to message">%s(zPaperclip)</span>
@ <span class='cbutton' id="chat-button-settings" \
@ title="Configure chat">⚙</span>
@ <span class='cbutton' id="chat-button-submit" \
@ title="Send message (Ctrl-Enter)">📤</span>
@ </div>
@ </div>
@ <div id='chat-input-file-area'>
@ <div class='file-selection-wrapper hidden'>
@ <input type="file" name="file" id="chat-input-file">
@ </div>
@ <div id="chat-drop-details"></div>
|
| ︙ | ︙ |
Changes to src/fossil.page.chat.js.
| ︙ | ︙ | |||
124 125 126 127 128 129 130 |
messageInjectPoint: E1('#message-inject-point'),
pageTitle: E1('head title'),
loadOlderToolbar: undefined /* the load-posts toolbar (dynamically created) */,
inputWrapper: E1("#chat-input-area"),
inputLine: E1('#chat-input-line'),
fileSelectWrapper: E1('#chat-input-file-area'),
viewMessages: E1('#chat-messages-wrapper'),
| | | | | 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
messageInjectPoint: E1('#message-inject-point'),
pageTitle: E1('head title'),
loadOlderToolbar: undefined /* the load-posts toolbar (dynamically created) */,
inputWrapper: E1("#chat-input-area"),
inputLine: E1('#chat-input-line'),
fileSelectWrapper: E1('#chat-input-file-area'),
viewMessages: E1('#chat-messages-wrapper'),
btnSubmit: E1('#chat-button-submit'),
btnAttach: E1('#chat-button-attach'),
inputField: E1('#chat-input-field'),
inputFile: E1('#chat-input-file'),
contentDiv: E1('div.content'),
viewConfig: E1('#chat-config'),
viewPreview: E1('#chat-preview'),
previewContent: E1('#chat-preview-content'),
btnPreview: E1('#chat-button-preview'),
views: document.querySelectorAll('.chat-view'),
activeUserListWrapper: E1('#chat-user-list-wrapper'),
activeUserList: E1('#chat-user-list')
},
me: F.user.name,
mxMsg: F.config.chat.initSize ? -F.config.chat.initSize : -50,
mnMsg: undefined/*lowest message ID we've seen so far (for history loading)*/,
|
| ︙ | ︙ | |||
1288 1289 1290 1291 1292 1293 1294 |
e.preventDefault();
Chat.submitMessage();
return false;
});
Chat.e.btnAttach.addEventListener(
'click', ()=>Chat.e.inputFile.click(), false);
| | | | 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 |
e.preventDefault();
Chat.submitMessage();
return false;
});
Chat.e.btnAttach.addEventListener(
'click', ()=>Chat.e.inputFile.click(), false);
(function(){/*Set up #chat-button-settings and related bits */
if(window.innerWidth<window.innerHeight){
// Must be set up before config view is...
/* Alignment of 'my' messages: right alignment is conventional
for mobile chat apps but can be difficult to read in wide
windows (desktop/tablet landscape mode), so we default to a
layout based on the apparent "orientation" of the window:
tall vs wide. Can be toggled via settings. */
document.body.classList.add('my-messages-right');
}
const settingsButton = document.querySelector('#chat-button-settings');
const optionsMenu = E1('#chat-config-options');
const cbToggle = function(ev){
ev.preventDefault();
ev.stopPropagation();
Chat.setCurrentView(Chat.e.currentView===Chat.e.viewConfig
? Chat.e.viewMessages : Chat.e.viewConfig);
return false;
|
| ︙ | ︙ | |||
1443 1444 1445 1446 1447 1448 1449 |
boolValue: 'alert-own-messages'
});
/**
Build UI for config options...
*/
settingsOps.forEach(function f(op){
const line = D.addClass(D.div(), 'menu-entry');
| | < | | 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 |
boolValue: 'alert-own-messages'
});
/**
Build UI for config options...
*/
settingsOps.forEach(function f(op){
const line = D.addClass(D.div(), 'menu-entry');
const label = op.label
? D.append(D.label(),op.label) : undefined;
const labelWrapper = D.addClass(D.div(), 'label-wrapper');
var hint;
const col0 = D.span();
if(op.hint){
hint = D.append(D.addClass(D.span(),'hint'),op.hint);
}
if(op.hasOwnProperty('select')){
|
| ︙ | ︙ | |||
1508 1509 1510 1511 1512 1513 1514 |
Chat.settings.set(op.persistentSetting, op.checkbox.checked)
}, false);
}
}else if(op.callback && op.checkbox){
op.checkbox.addEventListener('change', (ev)=>op.callback(ev), false);
}
});
| | | | 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 |
Chat.settings.set(op.persistentSetting, op.checkbox.checked)
}, false);
}
}else if(op.callback && op.checkbox){
op.checkbox.addEventListener('change', (ev)=>op.callback(ev), false);
}
});
})()/*#chat-button-settings setup*/;
(function(){
/* Install default settings... must come after
chat-button-settings setup so that the listeners which that
installs are notified via the properties getting initialized
here. */
Chat.settings.addListener('monospace-messages',function(s){
document.body.classList[s.value ? 'add' : 'remove']('monospace-messages');
})
Chat.settings.addListener('active-user-list',function(s){
Chat.showActiveUserList(s.value);
|
| ︙ | ︙ | |||
1800 1801 1802 1803 1804 1805 1806 |
Chat._gotServerError = poll.running = false;
if( window.fossil.config.chat.fromcli ){
Chat.chatOnlyMode(true);
}
Chat.intervalTimer = setInterval(poll, 1000);
if(0){
const flip = (ev)=>Chat.animate(ev.target,'anim-flip-h');
| | | 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 |
Chat._gotServerError = poll.running = false;
if( window.fossil.config.chat.fromcli ){
Chat.chatOnlyMode(true);
}
Chat.intervalTimer = setInterval(poll, 1000);
if(0){
const flip = (ev)=>Chat.animate(ev.target,'anim-flip-h');
document.querySelectorAll('#chat-buttons-wrapper .cbutton').forEach(function(e){
e.addEventListener('click',flip, false);
});
}
setTimeout( ()=>Chat.inputFocus(), 0 );
Chat.animate.$disabled = false;
F.page.chat = Chat/* enables testing the APIs via the dev tools */;
});
|
Changes to src/style.chat.css.
| ︙ | ︙ | |||
130 131 132 133 134 135 136 |
}
body.chat #load-msg-toolbar > div > button {
flex: 1 1 auto;
}
/* "Chat-only mode" hides the site header/footer, showing only
the chat app. */
body.chat.chat-only-mode{}
| | | 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
}
body.chat #load-msg-toolbar > div > button {
flex: 1 1 auto;
}
/* "Chat-only mode" hides the site header/footer, showing only
the chat app. */
body.chat.chat-only-mode{}
body.chat #chat-button-settings {}
/** Popup widget for the /chat settings. */
body.chat .chat-settings-popup {
font-size: 0.8em;
text-align: left;
display: flex;
flex-direction: column;
align-items: stretch;
|
| ︙ | ︙ | |||
236 237 238 239 240 241 242 |
get truncated in very narrow windows and (B) that they keep
stable positions.
*/
}
body.chat #chat-input-line.compact #chat-input-field {
}
| | | | | | | | > > > > > > > > > > > > > | > | | | | | > > | | 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 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 |
get truncated in very narrow windows and (B) that they keep
stable positions.
*/
}
body.chat #chat-input-line.compact #chat-input-field {
}
body.chat #chat-buttons-wrapper {
flex: 0 1 auto;
display: flex;
flex-direction: column;
align-items: center;
min-width: 4em;
min-height: 1.5em;
align-self: flex-end
/*keep buttons stable at bottom/right even when input field
resizes */;
}
body.chat #chat-input-line.compact #chat-buttons-wrapper {
flex-direction: row;
flex: 1 1 auto;
align-self: stretch;
justify-content: flex-end;
/*flex-wrap: wrap;*/
/* Wrapping would be ideal except that the edit widget
grows in width as the user types, moving the buttons
around */
}
body.chat #chat-buttons-wrapper > .cbutton {
padding: 0;
display: inline-block;
border-width: 1px;
border-style: solid;
border-radius: 0.25em;
min-width: 4ex;
max-width: 4ex;
min-height: 4ex;
max-height: 4ex;
margin: 0.125em;
display: inline-flex;
justify-content: center;
align-items: center;
cursor: pointer;
font-size: 150%;
}
body.chat #chat-buttons-wrapper > .cbutton:hover {
backdrop-filter: contrast(0.5);
}
body.chat #chat-input-line.compact #chat-buttons-wrapper > .cbutton {
margin: 2px 0.125em 0 0.125em;
min-width: 8ex;
max-width: 8ex;
min-height: 2.3ex;
max-height: 2.3ex;
font-size: 130%;
}
body.chat #chat-input-line.compact #chat-buttons-wrapper #chat-button-submit {
min-width: 16ex;
}
body.chat #chat-input-line:not(.compact) #chat-input-field {
/*border-left-style: double;
border-left-width: 3px;
border-right-style: double;
border-right-width: 3px;*/
min-height: 4rem;
/*max-height: 50rem;*/
|
| ︙ | ︙ | |||
297 298 299 300 301 302 303 | cannot manually expanded by the user. The lesser of the two evils seems to be to rely on the browser feature that a manual resize of the element will pin its sits. */ } | < < < < < < < < < < < | | 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
cannot manually expanded by the user.
The lesser of the two evils seems to be to rely on the browser
feature that a manual resize of the element will pin its sits.
*/
}
body.chat #chat-input-line > #chat-button-settings{
margin: 0 0 0 0.25em;
max-width: 2em;
}
body.chat #chat-input-line > input[type=text],
body.chat #chat-input-line > textarea {
flex: 20 1 auto;
max-width: revert;
|
| ︙ | ︙ | |||
499 500 501 502 503 504 505 |
display: none;
}
body.chat #chat-user-list .chat-user.selected {
font-weight: bold;
text-decoration: underline;
}
| | | | 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 |
display: none;
}
body.chat #chat-user-list .chat-user.selected {
font-weight: bold;
text-decoration: underline;
}
body.chat.fossil-dark-style #chat-button-attach > svg {
/* The black paperclip is barely visible in dark-mode
skins when they have dark buttons */
filter: invert(0.8);
}
body.chat .anim-rotate-360 {
animation: rotate-360 750ms linear;
}
@keyframes rotate-360 {
from { transform: rotate(0deg); }
|
| ︙ | ︙ |