@@ -43,10 +43,11 @@
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const iso8601ish = function(d){
44 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return d.toISOString()
45 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.replace('T',' ').replace(/\.\d+/,'')
46 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.replace('Z', ' zulu');
47 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const pad2 = (x)=>('0'+x).substr(-2);
48 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Returns the local time string of Date object d, defaulting
49 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
to the current time. */
50 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const localTimeString = function ff(d){
51 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
d || (d = new Date());
52 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return [
@@ -620,18 +621,21 @@
620 621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Reports an error in the form of a new message in the chat
621 622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
feed. All arguments are appended to the message's content area
622 623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
using fossil.dom.append(), so may be of any type supported by
623 624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
that function.
624 625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cs.reportErrorAsMessage = function(/*msg args*/){
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const args = argsToArray(arguments);
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.reportErrorAsMessage = function f(/*msg args*/){
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(undefined === f.$msgid) f.$msgid=0;
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const args = argsToArray(arguments).map(function(v){
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (v instanceof Error) ? v.message : v;
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
627 631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
console.error("chat error:",args);
628 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date().toISOString(),
629 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mw = new this.MessageWidget({
630 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isError: true,
631 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xfrom: null,
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- msgid: -1,
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ msgid: "error-"+(++f.$msgid),
633 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mtime: d,
634 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lmtime: d,
635 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xmsg: args
636 640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
637 641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.injectMessageElem(mw.e.body);
@@ -833,10 +837,20 @@
833 837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return false;
834 838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}, false);
835 839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return cs;
836 840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})()/*Chat initialization*/;
837 841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Returns the first .message-widget element in DOM element
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e's lineage. */
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const findMessageWidgetParent = function(e){
846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( e && !e.classList.contains('message-widget')){
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e = e.parentNode;
848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return e;
850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
838 852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
839 853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Custom widget type for rendering messages (one message per
840 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
instance). These are modelled after FIELDSET elements but we
841 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
don't use FIELDSET because of cross-browser inconsistencies in
842 856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
features of the FIELDSET/LEGEND combination, e.g. inability to
@@ -859,11 +873,10 @@
859 873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(arguments.length){
860 874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.setMessage(arguments[0]);
861 875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
862 876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
863 877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Left-zero-pad a number to at least 2 digits */
864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const pad2 = (x)=>(''+x).length>1 ? x : '0'+x;
865 878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const dowMap = {
866 879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Map of Date.getDay() values to weekday names. */
867 880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0: "Sunday", 1: "Monday", 2: "Tuesday",
868 881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
3: "Wednesday", 4: "Thursday", 5: "Friday",
869 882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
6: "Saturday"
@@ -877,10 +890,11 @@
877 890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
d.getHours(),":",
878 891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(d.getMinutes()+100).toString().slice(1,3),
879 892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
' ', dowMap[d.getDay()]
880 893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
].join('');
881 894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
882 896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cf.prototype = {
883 897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
scrollIntoView: function(){
884 898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.content.scrollIntoView();
885 899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
886 900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setMessage: function(m){
@@ -911,11 +925,11 @@
911 925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(m.isError){
912 926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.addClass([contentTarget, this.e.tab], 'error');
913 927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
914 928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(
915 929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.tab,
916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.text('notification @ ',theTime(d))
930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(D.code(), 'notification @ ',theTime(d))
917 931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
918 932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
919 933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.xfrom && m.fsize>0 ){
920 934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.fmime
921 935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& m.fmime.startsWith("image/")
@@ -948,11 +962,11 @@
948 962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// hyperlinks, but otherwise it will be markup-free. See the
949 963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// chat_format_to_html() routine in the server for details.
950 964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
//
951 965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Hence, even though innerHTML is normally frowned upon, it is
952 966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// perfectly safe to use in this context.
953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(m.xmsg instanceof Array){
967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(m.xmsg && 'string' !== typeof m.xmsg){
954 968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Used by Chat.reportErrorAsMessage()
955 969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(contentTarget, m.xmsg);
956 970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
957 971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
contentTarget.innerHTML = m.xmsg;
958 972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
contentTarget.querySelectorAll('a').forEach(addAnchorTargetBlank);
@@ -959,10 +973,12 @@
959 973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(F.pikchr){
960 974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.pikchr.addSrcView(contentTarget.querySelectorAll('svg.pikchr'));
961 975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
962 976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
963 977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.debug("tab",this.e.tab);
979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.debug("this.e.tab.firstElementChild",this.e.tab.firstElementChild);
964 980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.tab.firstElementChild.addEventListener('click', this._handleLegendClicked, false);
965 981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*if(eXFrom){
966 982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eXFrom.addEventListener('click', ()=>this.e.tab.click(), false);
967 983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}*/
968 984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
@@ -1099,14 +1115,11 @@
1099 1115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.$eMsg = tgtMsg;
1100 1116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.refresh();
1101 1117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1102 1118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*f.popup*/;
1103 1119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*end static init*/
1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- let theMsg = ev.target;
1105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( theMsg && !theMsg.classList.contains('message-widget')){
1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- theMsg = theMsg.parentNode;
1107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
1120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const theMsg = findMessageWidgetParent(ev.target);
1108 1121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(theMsg) f.popup.show(theMsg);
1109 1122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*_handleLegendClicked()*/
1110 1123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1111 1124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return cf;
1112 1125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})()/*MessageWidget*/;
@@ -1123,11 +1136,11 @@
1123 1136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1124 1137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1125 1138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/** Updates the paste/drop zone with details of the pasted/dropped
1126 1139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
data. The argument must be a Blob or Blob-like object (File) or
1127 1140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
it can be falsy to reset/clear that state.*/
1128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const updateDropZoneContent = function(blob){
1141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const updateDropZoneContent = bxs.updateDropZoneContent = function(blob){
1129 1142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
//console.debug("updateDropZoneContent()",blob);
1130 1143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const dd = bxs.dropDetails;
1131 1144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bxs.blob = blob;
1132 1145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(dd);
1133 1146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!blob){
@@ -1206,17 +1219,50 @@
1206 1219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1207 1220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const tzOffsetToString = function(off){
1208 1221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const hours = Math.round(off/60), min = Math.round(off % 30);
1209 1222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return ''+(hours + (min ? '.5' : ''));
1210 1223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const pad2 = (x)=>('0'+x).substr(-2);
1212 1224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const localTime8601 = function(d){
1213 1225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return [
1214 1226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
d.getYear()+1900, '-', pad2(d.getMonth()+1), '-', pad2(d.getDate()),
1215 1227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
'T', pad2(d.getHours()),':', pad2(d.getMinutes()),':',pad2(d.getSeconds())
1216 1228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
].join('');
1217 1229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
1232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Called by Chat.submitMessage() when message sending failed. Injects a fake message
1233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ containing the content and attachment of the failed message and gives the user buttons
1234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to discard it or edit and retry.
1235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const recoverFailedMessage = function(state){
1237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const w = D.addClass(D.div(), 'failed-message');
1238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(w, D.append(
1239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.span(),"This message was not successfully sent to the server:"
1240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ));
1241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(state.msg){
1242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const ta = D.textarea();
1243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ta.value = state.msg;
1244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(w,ta);
1245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(state.blob){
1247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(w,D.append(D.span(),"Attachment: ",(state.blob.name||"unnamed")));
1248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //console.debug("blob = ",state.blob);
1249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const buttons = D.addClass(D.div(), 'buttons');
1251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(w, buttons);
1252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(buttons, D.button("Discard message?", function(){
1253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let theMsg = findMessageWidgetParent(w);
1254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(theMsg) Chat.deleteMessageElem(theMsg);
1255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }));
1256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(buttons, D.button("Edit message and try again?", function(){
1257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(state.msg) Chat.inputValue(ta.value);
1258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(state.blob) BlobXferState.updateDropZoneContent(state.blob);
1259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ let theMsg = findMessageWidgetParent(w);
1260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(theMsg) Chat.deleteMessageElem(theMsg);
1261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }));
1262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.reportErrorAsMessage(w);
1263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
1218 1264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1219 1265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
1220 1266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Submits the contents of the message input field (if not empty)
1221 1267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
and/or the file attachment field to the server. If both are
1222 1268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
empty, this is a no-op.
@@ -1226,11 +1272,12 @@
1226 1272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.spaces = /\s+$/;
1227 1273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.markdownContinuation = /\\\s+$/;
1228 1274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1229 1275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.setCurrentView(this.e.viewMessages);
1230 1276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const fd = new FormData();
1231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- var msg = this.inputValue().trim();
1277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const fallback = {msg: this.inputValue()};
1278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var msg = fallback.msg.trim();
1232 1279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(msg && (msg.indexOf('\n')>0 || f.spaces.test(msg))){
1233 1280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Cosmetic: trim whitespace from the ends of lines to try to
1234 1281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
keep copy/paste from terminals, especially wide ones, from
1235 1282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
forcing a horizontal scrollbar on all clients. This breaks
1236 1283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
markdown's use of blackslash-space-space for paragraph
@@ -1249,25 +1296,29 @@
1249 1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1250 1297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(msg) fd.set('msg',msg);
1251 1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const file = BlobXferState.blob || this.e.inputFile.files[0];
1252 1299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(file) fd.set("file", file);
1253 1300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !msg && !file ) return;
1301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fallback.blob = file;
1254 1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const self = this;
1255 1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fd.set("lmtime", localTime8601(new Date()));
1256 1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.fetch("chat-send",{
1257 1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
payload: fd,
1258 1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
responseType: 'text',
1259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- onerror:(err)=>this.reportErrorAsMessage(err),
1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ onerror:function(err){
1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.reportErrorAsMessage(err);
1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ recoverFailedMessage(fallback);
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
1260 1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onload:function(txt){
1261 1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!txt) return/*success response*/;
1262 1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
try{
1263 1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const json = JSON.parse(txt);
1264 1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.newContent({msgs:[json]});
1265 1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}catch(e){
1266 1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
self.reportError(e);
1267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return;
1268 1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ recoverFailedMessage(fallback);
1269 1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1270 1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
1271 1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
BlobXferState.clear();
1272 1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.inputValue("").inputFocus();
1273 1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
1274 1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!