X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Fstatic%2Fsummaryview.js;h=f3964c053d423a1e0b8495531b68d422eacd254b;hp=ad08e53ceed23a70bb0086e3c502e4030ca6d27f;hb=d89c2995e621fb8f5cb4c2777277ebef023b14cf;hpb=a6a1482a100e354b24b5e4decff5c5b5db83cb78 diff --git a/webcit/static/summaryview.js b/webcit/static/summaryview.js index ad08e53ce..f3964c053 100644 --- a/webcit/static/summaryview.js +++ b/webcit/static/summaryview.js @@ -1,10 +1,19 @@ -/** +/* * Webcit Summary View v2 - * All comments, flowers and death threats to Mathew McBride - * / + * All comments, flowers and death threats to Mathew McBride + * / * Copyright 2009 The Citadel Team * Licensed under the GPL V3 + * + * QA reminders: because I keep forgetting / get cursed. + * After changing anything in here, make sure that you still can: + * 1. Resort messages in both normal and paged view. + * 2. Select a range with shift-click + * 3. Select messages with ctrl-click + * 4. Normal click will deselect everything done above + * 5. Move messages, and they will disappear */ + document.observe("dom:loaded", createMessageView); var msgs = null; @@ -20,11 +29,18 @@ var mlh_from = null; var currentSorterToggle = null; var query = ""; var currentlyMarkedRows = new Object(); -var markedRowId = null; +var markedRowIndex = null; +var currentlyHasRowsSelected = false; var mouseDownEvent = null; var exitedMouseDown = false; +var is_shift_pressed = false; +var is_ctrl_pressed = false; + +var originalMarkedRow = null; +var previousFinish = 0; +var markedFrom = 0; var trTemplate = new Array(11); trTemplate[0] = ""; trTemplate[12] = ""; trTemplate[14] = ""; + var currentPage = 0; var sortModes = { - "rdate" : sortRowsByDateDescending, - "date" : sortRowsByDateAscending, - "subj" : sortRowsBySubjectAscending, - "rsubj" : sortRowsBySubjectDescending, - "sender": sortRowsByFromAscending, - "rsender" : sortRowsByFromDescending + "rdate" : sortRowsByDateDescending, + "date" : sortRowsByDateAscending, + "subj" : sortRowsBySubjectAscending, + "rsubj" : sortRowsBySubjectDescending, + "sender": sortRowsByFromAscending, + "rsender" : sortRowsByFromDescending }; var toggles = {}; @@ -50,488 +67,581 @@ var nummsgs = 0; var startmsg = 0; function createMessageView() { - message_view = document.getElementById("message_list_body"); - loadingMsg = document.getElementById("loading"); - getMessages(); - mlh_date = $("mlh_date"); - mlh_subject = $('mlh_subject'); - mlh_from = $('mlh_from'); - toggles["rdate"] = mlh_date; - toggles["date"] = mlh_date; - toggles["subj"] = mlh_subject; - toggles["rsubj"] = mlh_subject; - toggles["sender"] = mlh_from; - toggles["rsender"] = mlh_from; - mlh_date.observe('click',ApplySort); - mlh_subject.observe('click',ApplySort); - mlh_from.observe('click',ApplySort); - $(document).observe('keyup',CtdlMessageListKeyUp,false); - $('resize_msglist').observe('mousedown', CtdlResizeMouseDown); - $('m_refresh').observe('click', getMessages); - document.getElementById('m_refresh').setAttribute("href","#"); - Event.observe(document.onresize ? document : window, "resize", normalizeHeaderTable); - Event.observe(document.onresize ? document : window, "resize", sizePreviewPane); - $('summpage').observe('change', getPage); - takeOverSearchOMatic(); - setupDragDrop(); // here for now + message_view = document.getElementById("message_list_body"); + loadingMsg = document.getElementById("loading"); + getMessages(); + mlh_date = $("mlh_date"); + mlh_subject = $('mlh_subject'); + mlh_from = $('mlh_from'); + toggles["rdate"] = mlh_date; + toggles["date"] = mlh_date; + toggles["subj"] = mlh_subject; + toggles["rsubj"] = mlh_subject; + toggles["sender"] = mlh_from; + toggles["rsender"] = mlh_from; + mlh_date.observe('click',ApplySort); + mlh_subject.observe('click',ApplySort); + mlh_from.observe('click',ApplySort); + $(document).observe('keydown',CtdlMessageListKeyDown,false); + $(document).observe('keyup',CtdlMessageListKeyUp,false); + $('resize_msglist').observe('mousedown', CtdlResizeMouseDown); + $('m_refresh').observe('click', getMessages); + document.getElementById('m_refresh').setAttribute("href","#"); + Event.observe(document.onresize ? document : window, "resize", normalizeHeaderTable); + Event.observe(document.onresize ? document : window, "resize", sizePreviewPane); + if ( $('summpage') ) { + $('summpage').observe('change', getPage); + } + else { + alert('error: summpage does not exist'); + } + takeOverSearchOMatic(); + setupDragDrop(); // here for now } + function getMessages() { - if (loadingMsg.parentNode == null) { - message_view.innerHTML = ""; - message_view.appendChild(loadingMsg); - } -roomName = getTextContent(document.getElementById("rmname")); - var parameters = {'room':roomName, 'startmsg': startmsg, 'stopmsg': -1}; - if (is_safe_mode) { - parameters['stopmsg'] = parseInt(startmsg)+499; - //parameters['maxmsgs'] = 500; - if (currentSortMode != null) { - var SortBy = currentSortMode[0]; - if (SortBy.charAt(0) == 'r') { - SortBy = SortBy.substr(1); - parameters["SortOrder"] = "0"; - } - parameters["SortBy"] = SortBy; - } - } - if (query.length > 0) { - parameters["query"] = query; - } -new Ajax.Request("roommsgs", { - method: 'get', - onSuccess: loadMessages, - parameters: parameters, - sanitize: false, - evalJSON: false, - onFailure: function(e) { alert("Failure: " + e);} + if (loadingMsg.parentNode == null) { + message_view.innerHTML = ""; + message_view.appendChild(loadingMsg); + } + roomName = getTextContent(document.getElementById("rmname")); + var parameters = {'room':roomName, 'startmsg': startmsg, 'stopmsg': -1}; + if (is_safe_mode) { + parameters['stopmsg'] = parseInt(startmsg)+499; + //parameters['maxmsgs'] = 500; + if (currentSortMode != null) { + var SortBy = currentSortMode[0]; + if (SortBy.charAt(0) == 'r') { + SortBy = SortBy.substr(1); + parameters["SortOrder"] = "0"; + } + parameters["SortBy"] = SortBy; + } + } + if (query.length > 0) { + parameters["query"] = query; + } + new Ajax.Request("roommsgs", { + method: 'get', + onSuccess: loadMessages, + parameters: parameters, + sanitize: false, + evalJSON: false, + onFailure: function(e) { alert("Failure: " + e);} }); } + function evalJSON(data) { - var jsonData = null; - if (typeof(JSON) === 'object' && typeof(JSON.parse) === 'function') { - try { - jsonData = JSON.parse(data); - } catch (e) { - // ignore - } - } - if (jsonData == null) { - return eval('('+data+')'); - } + var jsonData = null; + if (typeof(JSON) === 'object' && typeof(JSON.parse) === 'function') { + try { + jsonData = JSON.parse(data); + } catch (e) { + // ignore + } + } + if (jsonData == null) { + jsonData = eval('('+data+')'); + } + return jsonData; } function loadMessages(transport) { - try { - var data = evalJSON(transport.responseText); - if (!!data && transport.responseText.length < 2) { - alert("Message loading failed"); - } - nummsgs = data['nummsgs']; - msgs = data['msgs']; - var length = msgs.length; - rowArray = new Array(length); // store so they can be sorted - WCLog("Row array length: "+rowArray.length); - } catch (e) { - //window.alert(e+"|"+e.description); - } - if (currentSortMode == null) { - if (sortmode.length < 1) { - sortmode = "rdate"; - } - currentSortMode = [sortmode, sortModes[sortmode]]; - currentSorterToggle = toggles[sortmode]; - } - if (!is_safe_mode) { - resortAndDisplay(currentSortMode[1]); - } else { - setupPageSelector(); - resortAndDisplay(null); - } - if (loadingMsg.parentNode != null) { - loadingMsg.parentNode.removeChild(loadingMsg); - } - sizePreviewPane(); + try { + var data = evalJSON(transport.responseText); + if (!!data && transport.responseText.length < 2) { + alert("Message loading failed"); + } + nummsgs = data['nummsgs']; + msgs = data['msgs']; + var length = msgs.length; + rowArray = new Array(length); // store so they can be sorted + WCLog("Row array length: "+rowArray.length); + } catch (e) { + //window.alert(e+"|"+e.description); + } + if (currentSortMode == null) { + if (sortmode.length < 1) { + sortmode = "rdate"; + } + currentSortMode = [sortmode, sortModes[sortmode]]; + currentSorterToggle = toggles[sortmode]; + } + if (!is_safe_mode) { + resortAndDisplay(currentSortMode[1]); + } else { + setupPageSelector(); + resortAndDisplay(null); + } + if (loadingMsg.parentNode != null) { + loadingMsg.parentNode.removeChild(loadingMsg); + } + sizePreviewPane(); } function resortAndDisplay(sortMode) { - WCLog("Begin resortAndDisplay"); + WCLog("Begin resortAndDisplay"); - /* We used to try and clear out the message_view element, - but stupid IE doesn't even do that properly */ - var message_view_parent = message_view.parentNode; - message_view_parent.removeChild(message_view); - var startSort = new Date(); - if (sortMode != null) { - msgs.sort(sortMode); - } - var endSort = new Date(); - WCLog("Sort rowArray in " + (endSort-startSort)); - var start = new Date(); - var length = msgs.length; - var compiled = new Array(length+2); - compiled[0] = ""; - for(var x=0; x"; + for(var x=0; x markedRowId) { - startMarkingFrom = markedRowId+1; - finish = rowId; - } else if (rowId < markedRowId) { - startMarkingFrom = rowId+1; - finish = markedRowId; - } - for(var x = startMarkingFrom; x markedRowIndex) { + startMarkingFrom = markedRowIndex+1; + finish = rowIndex; + } else if (rowIndex < markedRowIndex) { + startMarkingFrom = rowIndex+1; + finish = markedRowIndex; + } + previousFinish = finish; + WCLog('startMarkingFrom=' + startMarkingFrom + ', finish=' + finish); + for(var x = startMarkingFrom; x 800) { + if (!room_is_trash) { + mvCommand = encodeURI("g_cmd=MOVE " + msgIds + "|_TRASH_|0"); + } + else { + mvCommand = encodeURI("g_cmd=DELE " + msgIds); + } + new Ajax.Request("ajax_servcmd", { + parameters: mvCommand, + method: 'post', + onSuccess: function(transport) { + WCLog(transport.responseText); + } + }); + msgIds = ""; + } + } + + if (!room_is_trash) { + mvCommand = encodeURI("g_cmd=MOVE " + msgIds + "|_TRASH_|0"); + } + else { + mvCommand = encodeURI("g_cmd=DELE " + msgIds); } + new Ajax.Request("ajax_servcmd", { + parameters: mvCommand, + method: 'post', + onSuccess: function(transport) { + WCLog(transport.responseText); + } + }); + document.getElementById("preview_pane").innerHTML = ""; deleteAllMarkedRows(); } + +function arrgggh() { + s = '.'; + if (is_shift_pressed) { + s = s + 'S'; + } + s = s + '.'; + if (is_ctrl_pressed) { + s = s + 'C'; + } + s = s + '.'; + $('ib_summary').innerHTML = s; + +} + +function CtdlMessageListKeyDown(event) { + var key = event.which || event.keyCode; + + if (key == 16) { /* SHIFT */ + is_shift_pressed = true; + } + else if ( (key == 17) || (key == 18) ) { /* CTRL or ALT */ + is_ctrl_pressed = true; + } + arrgggh(); +} + function CtdlMessageListKeyUp(event) { - var key = event.which; - if (key == 46) { // DELETE + var key = event.which || event.keyCode; + + if (key == 16) { /* SHIFT */ + is_shift_pressed = false; + } + else if ( (key == 17) || (key == 18) ) { /* CTRL or ALT */ + is_ctrl_pressed = false; + } + else if (key == 46) { /* DELETE */ deleteAllSelectedMessages(); } + arrgggh(); } function clearMessage(msgId) { - var row = document.getElementById('msg_'+msgId); - row.parentNode.removeChild(row); - delete currentlyMarkedRows[msgId]; + var row = document.getElementById('msg_'+msgId); + row.parentNode.removeChild(row); + delete currentlyMarkedRows[msgId]; } function summaryViewContextMenu() { - if (!exitedMouseDown) { - var contextSource = document.getElementById("listViewContextMenu"); - CtdlSpawnContextMenu(mouseDownEvent, contextSource); - } + if (!exitedMouseDown) { + var contextSource = document.getElementById("listViewContextMenu"); + CtdlSpawnContextMenu(mouseDownEvent, contextSource); + } } function summaryViewDragAndDropHandler() { - var element = document.createElement("div"); - var msgList = document.createElement("ul"); - element.appendChild(msgList); - for(msgId in currentlyMarkedRows) { - msgRow = currentlyMarkedRows[msgId]; - var subject = getTextContent(msgRow.getElementsByTagName("td")[0]); - var li = document.createElement("li"); - msgList.appendChild(li); - setTextContent(li, subject); - li.ctdlMsgId = msgId; - } - return element; + var element = document.createElement("div"); + var msgList = document.createElement("ul"); + element.appendChild(msgList); + for(msgId in currentlyMarkedRows) { + msgRow = currentlyMarkedRows[msgId]; + var subject = getTextContent(msgRow.getElementsByTagName("td")[0]); + var li = document.createElement("li"); + msgList.appendChild(li); + setTextContent(li, subject); + li.ctdlMsgId = msgId; + } + return element; } var saved_y = 0; function CtdlResizeMouseDown(event) { - $(document).observe('mousemove', CtdlResizeMouseMove); - $(document).observe('mouseup', CtdlResizeMouseUp); - saved_y = event.clientY; + $(document).observe('mousemove', CtdlResizeMouseMove); + $(document).observe('mouseup', CtdlResizeMouseUp); + saved_y = event.clientY; } function sizePreviewPane() { - var preview_pane = document.getElementById("preview_pane"); - var summary_view = document.getElementById("summary_view"); - var banner = document.getElementById("banner"); - var message_list_hdr = document.getElementById("message_list_hdr"); - var content = $('global'); // we'd like to use prototype methods here - var childElements = content.childElements(); - var sizeOfElementsAbove = 0; - var heightOfViewPort = document.viewport.getHeight() // prototypejs method - var bannerHeight = banner.offsetHeight; - var contentViewPortHeight = heightOfViewPort-banner.offsetHeight-message_list_hdr.offsetHeight; - contentViewPortHeight = 0.98 * contentViewPortHeight; // leave some error - // Set summary_view to 20%; - var summary_height = ctdlLocalPrefs.readPref("svheight"); - if (summary_height == null) { - summary_height = 0.20 * contentViewPortHeight; - } - // Set preview_pane to the remainder - var preview_height = contentViewPortHeight - summary_height; + var preview_pane = document.getElementById("preview_pane"); + var summary_view = document.getElementById("summary_view"); + var banner = document.getElementById("banner"); + var message_list_hdr = document.getElementById("message_list_hdr"); + var content = $('global'); // we'd like to use prototype methods here + var childElements = content.childElements(); + var sizeOfElementsAbove = 0; + var heightOfViewPort = document.viewport.getHeight() // prototypejs method + var bannerHeight = banner.offsetHeight; + var contentViewPortHeight = heightOfViewPort-banner.offsetHeight-message_list_hdr.offsetHeight; + contentViewPortHeight = 0.95 * contentViewPortHeight; // leave some error (especially for FF3!!) + // Set summary_view to 20%; + var summary_height = ctdlLocalPrefs.readPref("svheight"); + if (summary_height == null) { + summary_height = 0.20 * contentViewPortHeight; + } + // Set preview_pane to the remainder + var preview_height = contentViewPortHeight - summary_height; - summary_view.style.height = (summary_height)+"px"; - preview_pane.style.height = (preview_height)+"px"; + summary_view.style.height = (summary_height)+"px"; + preview_pane.style.height = (preview_height)+"px"; } function CtdlResizeMouseMove(event) { - var clientX = event.clientX; - var clientY = event.clientY; - var summary_view = document.getElementById("summary_view"); - var summaryViewHeight = summary_view.offsetHeight; - var increment = clientY-saved_y; - var summary_view_height = increment+summaryViewHeight; - summary_view.style.height = (summary_view_height)+"px"; - // store summary view height - ctdlLocalPrefs.setPref("svheight",summary_view_height); - var msglist = document.getElementById("preview_pane"); - var msgListHeight = msglist.offsetHeight; - msglist.style.height = (msgListHeight-increment)+"px"; - saved_y = clientY; - /* For some reason the grippy doesn't work without position: absolute - so we need to set its top pos manually all the time */ - var resize = document.getElementById("resize_msglist"); - var resizePos = resize.offsetTop; - resize.style.top = (resizePos+increment)+"px"; + var clientX = event.clientX; + var clientY = event.clientY; + var summary_view = document.getElementById("summary_view"); + var summaryViewHeight = summary_view.offsetHeight; + var increment = clientY-saved_y; + var summary_view_height = increment+summaryViewHeight; + summary_view.style.height = (summary_view_height)+"px"; + // store summary view height + ctdlLocalPrefs.setPref("svheight",summary_view_height); + var msglist = document.getElementById("preview_pane"); + var msgListHeight = msglist.offsetHeight; + msglist.style.height = (msgListHeight-increment)+"px"; + saved_y = clientY; + /* For some reason the grippy doesn't work without position: absolute + so we need to set its top pos manually all the time */ + var resize = document.getElementById("resize_msglist"); + var resizePos = resize.offsetTop; + resize.style.top = (resizePos+increment)+"px"; } function CtdlResizeMouseUp(event) { - $(document).stopObserving('mousemove', CtdlResizeMouseMove); - $(document).stopObserving('mouseup', CtdlResizeMouseUp); + $(document).stopObserving('mousemove', CtdlResizeMouseMove); + $(document).stopObserving('mouseup', CtdlResizeMouseUp); } function ApplySorterToggle() { - var className = currentSorterToggle.className; - className += " current_sort_mode"; - if (currentSortMode[1] == sortRowsByDateDescending || - currentSortMode[1] == sortRowsBySubjectDescending || - currentSortMode[1] == sortRowsByFromDescending) { - className += " sort_descending"; - } else { - className += " sort_ascending"; - } - currentSorterToggle.className = className; + var className = currentSorterToggle.className; + className += " current_sort_mode"; + if (currentSortMode[1] == sortRowsByDateDescending || + currentSortMode[1] == sortRowsBySubjectDescending || + currentSortMode[1] == sortRowsByFromDescending) { + className += " sort_descending"; + } else { + className += " sort_ascending"; + } + currentSorterToggle.className = className; } -/** Hack to make the header table line up with the data */ + +/* Hack to make the header table line up with the data */ function normalizeHeaderTable() { - var message_list_hdr = document.getElementById("message_list_hdr"); - var summary_view = document.getElementById("summary_view"); - var resize_msglist = document.getElementById("resize_msglist"); - var headerTable = message_list_hdr.getElementsByTagName("table")[0]; - var dataTable = summary_view.getElementsByTagName("table")[0]; - var dataTableWidth = dataTable.offsetWidth; - headerTable.style.width = dataTableWidth+"px"; + var message_list_hdr = document.getElementById("message_list_hdr"); + var summary_view = document.getElementById("summary_view"); + var resize_msglist = document.getElementById("resize_msglist"); + var headerTable = message_list_hdr.getElementsByTagName("table")[0]; + var dataTable = summary_view.getElementsByTagName("table")[0]; + var dataTableWidth = dataTable.offsetWidth; + headerTable.style.width = dataTableWidth+"px"; } function setupPageSelector() { - var summpage = document.getElementById("summpage"); - var select_page = document.getElementById("selectpage"); - summpage.innerHTML = ""; - if (is_safe_mode) { - WCLog("unhiding parent page"); - select_page.className = ""; - } else { - return; - } - var pages = nummsgs / 499; - for(var i=0; i