@@ -26,34 +26,65 @@
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.getMessageElemById = function(id){
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return qs('[data-msgid="'+id+'"]');
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cs.deleteMessageElemById = function(id){
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const e = this.getMessageElemById(id);
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(e) D.remove(e);
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LOCALLY deletes a message element by the message ID or passing
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the .message-row element. Returns true if it removes an element,
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else false.
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.deleteMessageElem = function(id){
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var e;
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(id instanceof HTMLElement){
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e = id;
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id = e.dataset.msgid;
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e = this.getMessageElemById(id);
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.debug("e && id ===",e&&id, e, id);
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(e && id){
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.remove(e);
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.toast.message("Deleted message "+id+".");
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
34 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return !!e;
35 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Given a .message-row element, this function returns whethe the
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ current user may, at least hypothetically, delete the message
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ globally. A user may always delete a local copy of a
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ post. The server may trump this, e.g. if the login has been
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cancelled after this page was loaded.
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.userMayDelete = function(eMsg){
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.me === eMsg.dataset.xfrom
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || F.user.isAdmin/*will be confirmed server-side*/;
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
36 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
38 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Removes the given message ID from the local chat record and, if
39 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the message was posted by this user OR this user in an
40 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
admin/setup, also submits it for removal on the remote.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id may optionally be a DOM element, in which case it must be a
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .message-row element.
41 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cs.deleteMessageById = function(id){
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const e = this.getMessageElemById(id);
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(!e) return;
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(this.me === e.dataset.xfrom
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || F.user.isAdmin/*will be confirmed server-side*/
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cs.deleteMessage = function(id){
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ var e;
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(id instanceof HTMLElement){
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e = id;
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ id = e.dataset.msgid;
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e = this.getMessageElemById(id);
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!(e instanceof HTMLElement)) return;
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(this.userMayDelete(e)){
48 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fetch("chat-delete?name=" + id)
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- .then(()=>D.remove(e))
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- .then(()=>F.toast.message("Deleted message "+id+"."))
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ .then(()=>this.deleteMessageElem(e))
51 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
.catch(err=>this.reportError(err))
52 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.remove(e);
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- F.toast.message("Locally removed message "+id+".");
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.deleteMessageElem(id);
55 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
56 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
57 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return cs;
59 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})();
@@ -198,29 +229,48 @@
198 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
timestamps. */
199 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const handleLegendClicked = function f(ev){
200 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!f.popup){
201 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Timestamp popup widget */
202 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup = new F.PopupWidget({
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cssClass: ['fossil-tooltip', 'chat-timestamp'],
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cssClass: ['fossil-tooltip', 'chat-message-popup'],
204 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
refresh:function(){
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const D = F.dom;
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const eMsg = this._eMsg;
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!eMsg) return;
206 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(this.e);
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const d = new Date(this._timestamp+"Z");
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const d = new Date(eMsg.dataset.timestamp+"Z");
208 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(d.getMinutes().toString()!=="NaN"){
209 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Date works, render informative timestamps
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.append(this.e, localTimeString(d)," client-local", D.br(),
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iso8601ish(d));
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(this.e,
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(D.span(), localTimeString(d)," client-local"),
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(D.span(), iso8601ish(d)));
212 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
213 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Date doesn't work, so dumb it down...
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.append(this.e, this._timestamp," GMT");
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(this.e, D.append(D.span(), eMsg.dataset.timestamp," GMT"));
215 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const toolbar = D.addClass(D.div(), 'toolbar');
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const btnDelete = D.button("Delete "+
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (Chat.userMayDelete(eMsg)
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? "globally" : "locally"));
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const self = this;
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ btnDelete.addEventListener('click', function(){
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self.hide();
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.deleteMessage(eMsg);
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(this.e, toolbar);
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(toolbar, btnDelete);
216 260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
217 261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
});
218 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup.installClickToHide();
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.popup.hide = function(){
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ delete this._eMsg;
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.clearElement(this.e);
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this.show(false);
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
219 268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
220 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const rect = ev.target.getBoundingClientRect();
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- f.popup._timestamp = ev.target.dataset.timestamp;
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const eMsg = ev.target.parentNode/*the owning fieldset element*/;
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.popup._eMsg = eMsg;
222 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
let x = rect.left, y = rect.top - 10;
223 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
f.popup.show(ev.target)/*so we can get its computed size*/;
224 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if('right'===ev.target.getAttribute('align')){
225 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Shift popup to the left for right-aligned messages to avoid
226 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// truncation off the right edge of the page.
@@ -235,19 +285,19 @@
235 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<jx.msgs.length; ++i){
236 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const m = jx.msgs[i];
237 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.msgid>Chat.mxMsg ) Chat.mxMsg = m.msgid;
238 288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.mdel ){
239 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* A record deletion notice. */
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Chat.deleteMessageElemById(m.mdel);
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.deleteMessageElem(m.mdel);
241 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
242 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
243 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const eWho = D.create('legend'),
244 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
row = D.addClass(D.fieldset(eWho), 'message-row');
245 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
row.dataset.msgid = m.msgid;
246 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
row.dataset.xfrom = m.xfrom;
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row.dataset.timestamp = m.mtime;
247 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
injectMessage(row);
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- eWho.dataset.timestamp = m.mtime;
249 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.addEventListener('click', handleLegendClicked, false);
250 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.xfrom==Chat.me && window.outerWidth<1000 ){
251 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eWho.setAttribute('align', 'right');
252 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
row.style.justifyContent = "flex-end";
253 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
254 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!