@@ -16,11 +16,14 @@
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pageTitle: E1('head title'),
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
loadToolbar: undefined /* the load-posts toolbar (dynamically created) */,
18 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputWrapper: E1("#chat-input-area"),
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
messagesWrapper: E1('#chat-messages-wrapper'),
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputForm: E1('#chat-form'),
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btnSubmit: E1('#chat-message-submit'),
21 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputSingle: E1('#chat-input-single'),
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inputMulti: E1('#chat-input-multi'),
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inputCurrent: undefined/*one of inputSingle or inputMulti*/,
22 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputFile: E1('#chat-input-file')
23 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
24 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
me: F.user.name,
25 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxMsg: F.config.chat.initSize ? -F.config.chat.initSize : -50,
26 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mnMsg: undefined/*lowest message ID we've seen so far (for history loading)*/,
@@ -38,21 +41,37 @@
38 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ajaxInflight: 0,
39 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Gets (no args) or sets (1 arg) the current input text field value,
40 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
taking into account single- vs multi-line input. The getter returns
41 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a string and the setter returns this object. */
42 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputValue: function(){
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const e = this.e.inputSingle;
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const e = this.inputElement();
44 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(arguments.length){
45 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
e.value = arguments[0];
46 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else {
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return e.value;
49 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return e.value;
50 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
51 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Asks the current user input field to take focus. Returns this. */
52 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inputFocus: function(){
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this.e.inputSingle.focus();
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.inputElement().focus();
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns the current message input element. */
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inputElement: function(){
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.e.inputCurrent;
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Toggles between single- and multi-line edit modes. Returns this. */
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inputToggleSingleMulti: function(){
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const old = this.e.inputCurrent;
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(this.e.inputCurrent === this.e.inputSingle){
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.inputCurrent = this.e.inputMulti;
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.inputCurrent = this.e.inputSingle;
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(old, 'hidden');
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.removeClass(this.e.inputCurrent, 'hidden');
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.inputCurrent.value = old.value;
54 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
55 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
56 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Enables (if yes is truthy) or disables all elements in
57 76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* this.disableDuringAjax. */
58 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
enableAjaxComponents: function(yes){
@@ -110,18 +129,23 @@
110 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
settings:{
111 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
get: (k,dflt)=>F.storage.get(k,dflt),
112 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
getBool: (k,dflt)=>F.storage.getBool(k,dflt),
113 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set: (k,v)=>F.storage.set(k,v),
114 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defaults:{
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "images-inline": !!F.config.chat.imagesInline
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "images-inline": !!F.config.chat.imagesInline,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "monospace-messages": false
116 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
117 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
118 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
119 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Object.keys(cs.settings.defaults).forEach(function f(k){
120 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const v = cs.settings.get(k,f);
121 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(f===v) cs.settings.set(k,cs.settings.defaults[k]);
122 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(cs.settings.getBool('monospace-messages',false)){
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.classList.add('monospace-messages');
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.e.inputCurrent = cs.e.inputSingle;
123 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.pageTitleOrig = cs.e.pageTitle.innerText;
124 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const qs = (e)=>document.querySelector(e);
125 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const argsToArray = function(args){
126 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return Array.prototype.slice.call(args,0);
127 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
@@ -280,26 +304,49 @@
280 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(k)=>Chat.e.inputFile.addEventListener(k, dropEvents[k], true)
281 305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
282 306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return bxs;
283 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})()/*drag/drop*/;
284 308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.e.inputForm.addEventListener('submit',(e)=>{
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- e.preventDefault();
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const fd = new FormData(Chat.e.inputForm);
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(BlobXferState.blob/*replace file content with this*/){
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fd.set("file", BlobXferState.blob);
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !!Chat.inputValue()
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || Chat.e.inputFile.value.length>0
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || BlobXferState.blob ){
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.submitMessage = function(){
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const fd = new FormData(this.e.inputForm)
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* ^^^^ we don't really want/need the FORM element, but when
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ FormData() is default-constructed here then the server
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ segfaults, and i have no clue why! */;
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const msg = this.inputValue();
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(msg) fd.set('msg',msg);
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const file = BlobXferState.blob || this.e.inputFile.files[0];
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(file) fd.set("file", file);
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( msg || file ){
294 319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fetch("chat-send",{
295 320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
method: 'POST',
296 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
body: fd
297 322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
298 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
299 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
BlobXferState.clear();
300 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.inputValue("").inputFocus();
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.inputSingle.addEventListener('keydown',function(ev){
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(13===ev.keyCode/*ENTER*/){
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ev.preventDefault();
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ev.stopPropagation();
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.submitMessage();
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return false;
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, false);
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.inputMulti.addEventListener('keydown',function(ev){
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(ev.ctrlKey && 13 === ev.keyCode){
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ev.preventDefault();
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ev.stopPropagation();
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.submitMessage();
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return false;
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, false);
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.e.btnSubmit.addEventListener('click',(e)=>{
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e.preventDefault();
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.submitMessage();
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return false;
301 348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
302 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
303 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Returns a new TEXT node with the given text content. */
304 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Returns the local time string of Date object d, defaulting
305 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
to the current time. */
@@ -391,10 +438,24 @@
391 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rect.top + rect.height + 2;
392 439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
393 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
394 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Settings menu entries... */
395 442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const settingsOps = [{
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ label: "Multi-line input",
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ boolValue: ()=>Chat.inputElement()===Chat.e.inputMulti,
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ callback: function(){
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.inputToggleSingleMulti();
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },{
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ label: "Monospace message font",
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ boolValue: ()=>document.body.classList.contains('monospace-messages'),
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ callback: function(){
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.classList.toggle('monospace-messages');
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.settings.set('monospace-messages',
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document.body.classList.contains('monospace-messages'));
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },{
396 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
label: "Chat-only mode",
397 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>!!document.body.classList.contains('chat-only-mode'),
398 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: function f(){
399 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(undefined === f.isHidden){
400 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.isHidden = false;
401 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!