]> code.citadel.org Git - citadel.git/blob - webcit-ng/static/js/view_mail.js
Add a web API command for the server STAT command. This will allow us to implement...
[citadel.git] / webcit-ng / static / js / view_mail.js
1 // This module handles the view for "mailbox" rooms.
2 //
3 // Copyright (c) 2016-2022 by the citadel.org team
4 //
5 // This program is open source software.  Use, duplication, or
6 // disclosure are subject to the GNU General Public License v3.
7
8
9 var selected_message = 0;                                                       // Remember the last message that was selected
10 var RefreshMailboxInterval;                                                     // We store our refresh timer here
11 var last_mtime;                                                                 // Watch this mailbox using the room's mtime
12
13
14 // Render a message into the mailbox view
15 function mail_render_one(msg, target_div) {
16         let div = "FIXME";
17         try {
18                 outmsg =
19                   "<div class=\"ctdl-mmsg-wrapper\">"                           // begin message wrapper
20                 + "<div class=\"ctdl-avatar\" onClick=\"javascript:user_profile('" + msg.from + "');\">"
21                 + "<img src=\"/ctdl/u/" + msg.from + "/userpic\" width=\"32\" "
22                 + "onerror=\"this.parentNode.innerHTML='&lt;i class=&quot;fa fa-user-circle fa-2x&quot;&gt;&lt;/i&gt; '\">"
23                 + "</div>"                                                      // end avatar
24                 + "<div class=\"ctdl-mmsg-content\">"                           // begin content
25                 + "<div class=\"ctdl-msg-header\">"                             // begin header
26                 + "<span class=\"ctdl-msg-header-info\">"                       // begin header info on left side
27                 + "<span class=\"ctdl-username\" onClick=\"javascript:user_profile('" + msg.from + "');\">"
28                 + msg.from
29                 + "</a></span>"                                                 // end username
30                 + "<span class=\"ctdl-msgdate\">"
31                 + convertTimestamp(msg.time)
32                 + "</span>"                                                     // end msgdate
33                 + "</span>"                                                     // end header info on left side
34                 + "<span class=\"ctdl-msg-header-buttons\">"                    // begin buttons on right side
35         
36                 + "<span class=\"ctdl-msg-button\">"                            // Reply
37                 + "<a href=\"javascript:open_reply_box('"+div+"',false,'"+msg.wefw+"','"+msg.msgn+"');\">"
38                 + "<i class=\"fa fa-reply\"></i> " 
39                 + _("Reply")
40                 + "</a></span>"
41         
42                 + "<span class=\"ctdl-msg-button\">"                            // ReplyQuoted
43                 + "<a href=\"javascript:open_reply_box('"+div+"',true,'"+msg.wefw+"','"+msg.msgn+"');\">"
44                 + "<i class=\"fa fa-comment\"></i> " 
45                 + _("ReplyQuoted")
46                 + "</a></span>";
47         
48                 if (can_delete_messages) {
49                         outmsg +=
50                         "<span class=\"ctdl-msg-button\">"
51                         + "<a href=\"javascript:forum_delete_message('"+div+"','"+msg.msgnum+"');\">"
52                         + "<i class=\"fa fa-trash\"></i> " 
53                         + _("Delete")
54                         + "</a></span>";
55                 }
56         
57                 outmsg +=
58                   "</span>";                                                    // end buttons on right side
59                 if (msg.subj) {
60                         outmsg +=
61                         "<br><span class=\"ctdl-msgsubject\">" + msg.subj + "</span>";
62                 }
63                 outmsg +=
64                   "</div><br>"                                                  // end header
65                 + "<div class=\"ctdl-msg-body\" id=\"" + div + "_body\">"       // begin body
66                 + msg.text
67                 + "</div>"                                                      // end body
68                 + "</div>"                                                      // end content
69                 + "</div>"                                                      // end wrapper
70                 ;
71         }
72         catch(err) {
73                 outmsg = "<div class=\"ctdl-mmsg-wrapper\">" + err.message + "</div>";
74         }
75
76         target_div.innerHTML = outmsg;
77 }
78
79
80 // display an individual message
81 function mail_display_message(msgnum, target_div) {
82         url = "/ctdl/r/" + escapeHTMLURI(current_room) + "/" + msgnum + "/json";
83         mail_fetch_msg = async() => {
84                 response = await fetch(url);
85                 msg = await(response.json());
86                 if (response.ok) {
87                         mail_render_one(msg, target_div);
88                 }
89         }
90         mail_fetch_msg();
91 }
92
93
94 // A message has been selected...
95 function select_message(msgnum) {
96         // unhighlight any previously selected message
97         try {
98                 document.getElementById("ctdl-msgsum-" + selected_message).classList.remove("w3-blue");
99         }
100         catch {
101         }
102
103         // highlight the newly selected message
104         document.getElementById("ctdl-msgsum-" + msgnum).classList.add("w3-blue");
105         //document.getElementById("ctdl-msgsum-" + msgnum).scrollIntoView();
106
107         // display the message if it isn't already displayed
108         if (selected_message != msgnum) {
109                 selected_message = msgnum;
110                 mail_display_message(msgnum, document.getElementById("ctdl-reading-pane"));
111         }
112 }
113
114
115 // render one row in the mailbox table (this could be called from one of several places)
116 function mail_render_row(msg) {
117         row     = "<tr "
118                 + "id=\"ctdl-msgsum-" + msg["msgnum"] + "\" "
119                 + "onClick=\"select_message(" + msg["msgnum"] + ");\" "
120                 //+ "onmouseenter=\"console.log('mouse in');\" "
121                 //+ "onmouseleave=\"console.log('mouse out');\""
122                 + ">"
123                 + "<td>" + msg["subject"] + "</td>"
124                 + "<td>" + msg["author"] + " &lt;" + msg["addr"] + "&gt;</td>"
125                 + "<td>" + convertTimestamp(msg["time"]) + "</td>"
126                 + "<td>" + msg["msgnum"] + "</td>"
127                 + "</tr>";
128         return(row);
129 }
130
131
132 // Set up the mailbox view
133 function mail_display() {
134         document.getElementById("ctdl-stuffbar").style.display = "block";
135
136         document.getElementById("ctdl-stuffbar").innerHTML
137                 = "<div id=\"ctdl-mailbox-pane\" class=\"ctdl-mailbox-pane\"></div>"
138
139         document.getElementById("ctdl-main").innerHTML
140                 = "<div id=\"ctdl-reading-pane\" class=\"ctdl-reading-pane\"></div>"
141         ;
142
143         last_mtime = 0;                                         // Keep track of room's mod time so we know when to refresh
144         refresh_mail_display();
145         try {                                                   // if this was already set up, clear it so there aren't multiple
146                 clearInterval(RefreshMailboxInterval);
147         }
148         catch {
149         }
150         RefreshMailboxInterval = setInterval(refresh_mail_display, 10000);
151 }
152
153
154 // Display or refresh the mailbox
155 function refresh_mail_display() {
156
157         // If the "ctdl-mailbox-pane" no longer exists, the user has navigated to a different part of the site,
158         // so cancel the refresh.
159         try {
160                 document.getElementById("ctdl-mailbox-pane").innerHTML;
161         }
162         catch {
163                 console.log("ending refresh_mail_display()");
164                 clearInterval(RefreshMailboxInterval);
165                 document.getElementById("ctdl-stuffbar").style.display = "none";
166                 return;
167         }
168
169         if (last_mtime == 0) {
170                 last_mtime = room_mtime;
171         }
172         console.log("refresh_mail_display() last_mtime is " + last_mtime + " FIXME");
173
174         // Now go to the server.
175         url = "/ctdl/r/" + escapeHTMLURI(current_room) + "/mailbox";
176         fetch_mailbox = async() => {
177                 response = await fetch(url);
178                 msgs = await(response.json());
179                 if (response.ok) {
180
181                         box =   "<table class=\"w3-table-all w3-hoverable\" width=100%>"
182                                 + "<tr class=\"ctdl-mailbox-heading w3-blue\">"
183                                 + "<th>" + _("Subject") + "</th>"
184                                 + "<th>" + _("Sender") + "</th>"
185                                 + "<th>" + _("Date") + "</th>"
186                                 + "<th>#</th>"
187                                 + "</tr>";
188
189                         for (var i=0; i<msgs.length; ++i) {
190                                 box += mail_render_row(msgs[i]);
191                         }
192
193                         box +=  "</table>";
194                         document.getElementById("ctdl-mailbox-pane").innerHTML = box;
195
196                         if (selected_message > 0) {                     // if we had a message selected, keep it selected
197                                 select_message(selected_message);
198                         }
199                 }
200         }
201         fetch_mailbox();
202 }