]> code.citadel.org Git - citadel.git/blobdiff - webcit-ng/static/js/mail_folder_list.js
Grammar change in the license declaration.
[citadel.git] / webcit-ng / static / js / mail_folder_list.js
index 9f408f1a74feeda974ec48c6866e4860ae908f12..fff055d749385c43b58541680d291b40130d4232 100644 (file)
@@ -1,16 +1,16 @@
 // Display the mail folder list
 //
-// Copyright (c) 2016-2022 by the citadel.org team
+// Copyright (c) 2016-2023 by the citadel.org team
 //
 // This program is open source software.  Use, duplication, or
-// disclosure are subject to the GNU General Public License v3.
+// disclosure is subject to the GNU General Public License v3.
 
 
 // Display the mail folder list in the specified div
 function display_mail_folder_list(target_div) {
 
        display_mail_folder_list_async = async(target_div) => {
-               let rendered_list = "hi from display_mail_folder_list_async()";
+               let rendered_list = "";
 
                // load the room list from the Citadel Server
                response = await fetch("/ctdl/r/", { method: "GET" } );
@@ -33,11 +33,88 @@ function display_mail_folder_list(target_div) {
 
 // Given a JSON object containing the output of the `/ctdl/r` API call, return a rendered mail folder list.
 function render_mail_folder_list(roomlist_json) {
-       let rendered_list = "";
 
+       // Sort first by floor then by room order
+       roomlist_json.sort(function(a, b) {
+               if (a.floor > b.floor) return 1;
+               if (a.floor < b.floor) return -1;
+               if (a.name == "Mail") return -1;
+               if (b.name == "Mail") return 1;
+               if (a.rorder > b.rorder) return 1;
+               if (a.rorder < b.rorder) return -1;
+               return 0;
+       });
+
+       // Turn it into displayable markup
+       let rendered_list = "<ul class=\"ctdl_mail_folders\" id=\"ctdl_mail_folders\">\n";
        for (let i=0; i<roomlist_json.length; ++i) {
-               rendered_list += roomlist_json[i].name + "<br>";
+               if (roomlist_json[i].current_view == views.VIEW_MAILBOX) {
+                       rendered_list += "<li "
+                                       + "id=\"" + randomString() + "\" "
+                                       + "onclick=\"gotoroom('" + roomlist_json[i].name + "')\" "
+                                       + "ondragover=\"mail_folder_dragover(event)\" "
+                                       + "ondragleave=\"mail_folder_dragleave(event)\" "
+                                       + "ondrop=\"mail_folder_drop(event, '" + escapeJS(roomlist_json[i].name) + "')\" "
+                                       + ">"
+                                       + ((roomlist_json[i].name == "Mail") ? _("INBOX") : escapeHTML(roomlist_json[i].name))
+                                       + "</li>\n"
+                       ;
+               }
        }
-
+       rendered_list += "</ul>";
        return rendered_list;
 }
+
+
+// There MUST be a dragover handler, otherwise drop doesn't work.
+// This also seems to be more reliable than a dragStart handler.
+function mail_folder_dragover(event) {
+       event.preventDefault();
+       event.target.classList.toggle("ctdl_mail_folder_droppable", true);
+}
+
+
+// The user is no longer hovering over this folder.
+function mail_folder_dragleave(event) {
+       event.preventDefault();
+       event.target.classList.toggle("ctdl_mail_folder_droppable", false);
+}
+
+
+// Something has been dropped onto a folder.
+function mail_folder_drop(event, destination_room) {
+       event.preventDefault();
+       event.target.classList.toggle("ctdl_mail_folder_droppable", false);
+       var msgs = event.dataTransfer.getData("text").split(",");
+       for (var i=0; i<msgs.length; ++i) {
+               mail_move(msgs[i], destination_room);
+       }
+}
+
+
+// mail_folder_drop() calls this function for each message being moved
+mail_move = async(msgdivid, destination_room) => {
+       let msgdiv = document.getElementById(msgdivid);
+       let m = parseInt(msgdivid.substring(12));                               // derive msgnum from row id
+       let source = "/ctdl/r/" + escapeHTMLURI(current_room) + "/" + m;
+       let destination = "/ctdl/r/" + escapeHTMLURI(destination_room);
+
+       let response = await fetch(
+               source, {
+                       method: "MOVE",
+                       headers: {
+                               "Destination" : destination
+                       }
+               }
+       );
+
+       // If the server accepted the MOVE operation, delete the row from our screen.
+       if (response.ok) {
+               var table = document.getElementById("ctdl-onscreen-mailbox");
+               for (var i = 0, row; row = table.rows[i]; i++) {
+                       if (row.id == msgdivid) {
+                               table.deleteRow(i);
+                       }
+               }
+       }
+}