Bug 1877390 - Reduce code duplication in about3pane.js and threadPane.js. r=aleca

In threadPane.js exists similar code as in about3pane.js, to convert the
sort type of the current sort column into a columnId.
This patch moves these functions as an additional getter into
DBViewWrapper.jsm.

To avoid circular dependencies, this patch moves OUTGOING_FOLDER_FLAGS
from DBViewWrapper.jsm to FolderUtils.jsm.

Differential Revision: https://phabricator.services.mozilla.com/D200242

--HG--
extra : rebase_source : 1e47ef7b626915999d743915cd842d55fc3bb7d9
This commit is contained in:
John Bieling 2024-03-27 09:05:51 +02:00
Родитель ff677d05c9
Коммит efd02ab3e8
6 изменённых файлов: 112 добавлений и 188 удалений

Просмотреть файл

@ -4775,7 +4775,7 @@ var threadPane = {
if (!gDBView) { if (!gDBView) {
return; return;
} }
this.updateSortIndicator(sortController.getCurrentSortColumnId()); this.updateSortIndicator(gViewWrapper.primarySortColumnId);
}, },
/** /**
@ -5079,7 +5079,7 @@ var threadPane = {
* @param {object} data - The detail of the custom event. * @param {object} data - The detail of the custom event.
*/ */
onSortChanged(data) { onSortChanged(data) {
const curSortColumnId = sortController.getCurrentSortColumnId(); const curSortColumnId = gViewWrapper.primarySortColumnId;
const newSortColumnId = data.column; const newSortColumnId = data.column;
// A click happened on the column that is already used to sort the list. // A click happened on the column that is already used to sort the list.
@ -6208,91 +6208,6 @@ var sortController = {
threadPane.ensureThreadStateForQuickSearchView(); threadPane.ensureThreadStateForQuickSearchView();
threadTree.style.scrollBehavior = null; threadTree.style.scrollBehavior = null;
}, },
getCurrentSortColumnId() {
const sortKey = gViewWrapper.primarySortType;
let columnID;
switch (sortKey) {
// In the case of None, we default to the date column. This appears to be
// the case in such instances as Global search, so don't complain about
// it.
case Ci.nsMsgViewSortType.byNone:
case Ci.nsMsgViewSortType.byDate:
columnID = "dateCol";
break;
case Ci.nsMsgViewSortType.byReceived:
columnID = "receivedCol";
break;
case Ci.nsMsgViewSortType.byAuthor:
columnID = "senderCol";
break;
case Ci.nsMsgViewSortType.byRecipient:
columnID = "recipientCol";
break;
case Ci.nsMsgViewSortType.bySubject:
columnID = "subjectCol";
break;
case Ci.nsMsgViewSortType.byLocation:
columnID = "locationCol";
break;
case Ci.nsMsgViewSortType.byAccount:
columnID = "accountCol";
break;
case Ci.nsMsgViewSortType.byUnread:
columnID = "unreadButtonColHeader";
break;
case Ci.nsMsgViewSortType.byStatus:
columnID = "statusCol";
break;
case Ci.nsMsgViewSortType.byTags:
columnID = "tagsCol";
break;
case Ci.nsMsgViewSortType.bySize:
columnID = "sizeCol";
break;
case Ci.nsMsgViewSortType.byPriority:
columnID = "priorityCol";
break;
case Ci.nsMsgViewSortType.byFlagged:
columnID = "flaggedCol";
break;
case Ci.nsMsgViewSortType.byThread:
columnID = "threadCol";
break;
case Ci.nsMsgViewSortType.byId:
columnID = "idCol";
break;
case Ci.nsMsgViewSortType.byJunkStatus:
columnID = "junkStatusCol";
break;
case Ci.nsMsgViewSortType.byAttachments:
columnID = "attachmentCol";
break;
case Ci.nsMsgViewSortType.byCustom:
{
const curCustomColumn = gDBView.curCustomColumn;
if (threadPane.columns.some(c => c.id == curCustomColumn)) {
columnID = curCustomColumn;
} else {
dump(
"getCurrentSortColumnId: custom sort key but no handler for column '" +
columnID +
"'\n"
);
columnID = "dateCol";
}
}
break;
case Ci.nsMsgViewSortType.byCorrespondent:
columnID = "correspondentCol";
break;
default:
dump("unsupported sort key: " + sortKey + "\n");
columnID = "dateCol";
break;
}
return columnID;
},
}; };
commandController.registerCallback( commandController.registerCallback(

Просмотреть файл

@ -368,7 +368,10 @@ FolderDisplayWidget.prototype = {
* will not get this notification if the view was re-created, for example. * will not get this notification if the view was re-created, for example.
*/ */
onSortChanged() { onSortChanged() {
UpdateSortIndicators(this.view.primarySortType, this.view.primarySortOrder); UpdateSortIndicators(
this.view.primarySortColumnId,
this.view.primarySortOrder
);
}, },
/** /**

Просмотреть файл

@ -15,8 +15,8 @@ XPCOMUtils.defineLazyPreferenceGetter(
); );
ChromeUtils.defineESModuleGetters(lazy, { ChromeUtils.defineESModuleGetters(lazy, {
DBViewWrapper: "resource:///modules/DBViewWrapper.sys.mjs",
FeedUtils: "resource:///modules/FeedUtils.sys.mjs", FeedUtils: "resource:///modules/FeedUtils.sys.mjs",
FolderUtils: "resource:///modules/FolderUtils.sys.mjs",
}); });
/** /**
@ -290,10 +290,7 @@ const DEFAULT_COLUMNS = [
* @returns {boolean} True if the folder is Outgoing. * @returns {boolean} True if the folder is Outgoing.
*/ */
const isOutgoing = folder => { const isOutgoing = folder => {
return folder.isSpecialFolder( return folder.isSpecialFolder(lazy.FolderUtils.OUTGOING_FOLDER_FLAGS, true);
lazy.DBViewWrapper.prototype.OUTGOING_FOLDER_FLAGS,
true
);
}; };
/** /**

Просмотреть файл

@ -340,7 +340,7 @@ function MsgReverseSortThreadPane() {
// XXX this should probably migrate into FolderDisplayWidget, or whatever // XXX this should probably migrate into FolderDisplayWidget, or whatever
// FolderDisplayWidget ends up using if it refactors column management out. // FolderDisplayWidget ends up using if it refactors column management out.
function UpdateSortIndicators(sortType, sortOrder) { function UpdateSortIndicators(colID, sortOrder) {
// Remove the sort indicator from all the columns // Remove the sort indicator from all the columns
const treeColumns = document.getElementById("threadCols").children; const treeColumns = document.getElementById("threadCols").children;
for (let i = 0; i < treeColumns.length; i++) { for (let i = 0; i < treeColumns.length; i++) {
@ -349,7 +349,6 @@ function UpdateSortIndicators(sortType, sortOrder) {
let sortedColumn; let sortedColumn;
// set the sort indicator on the column we are sorted by // set the sort indicator on the column we are sorted by
const colID = ConvertSortTypeToColumnID(sortType);
if (colID) { if (colID) {
sortedColumn = document.getElementById(colID); sortedColumn = document.getElementById(colID);
} }
@ -414,91 +413,4 @@ function UpdateSelectCol() {
} }
} }
function ConvertSortTypeToColumnID(sortKey) {
var columnID;
// Hack to turn this into an integer, if it was a string.
// It would be a string if it came from XULStore.json.
sortKey = sortKey - 0;
switch (sortKey) {
// In the case of None, we default to the date column
// This appears to be the case in such instances as
// Global search, so don't complain about it.
case Ci.nsMsgViewSortType.byNone:
case Ci.nsMsgViewSortType.byDate:
columnID = "dateCol";
break;
case Ci.nsMsgViewSortType.byReceived:
columnID = "receivedCol";
break;
case Ci.nsMsgViewSortType.byAuthor:
columnID = "senderCol";
break;
case Ci.nsMsgViewSortType.byRecipient:
columnID = "recipientCol";
break;
case Ci.nsMsgViewSortType.bySubject:
columnID = "subjectCol";
break;
case Ci.nsMsgViewSortType.byLocation:
columnID = "locationCol";
break;
case Ci.nsMsgViewSortType.byAccount:
columnID = "accountCol";
break;
case Ci.nsMsgViewSortType.byUnread:
columnID = "unreadButtonColHeader";
break;
case Ci.nsMsgViewSortType.byStatus:
columnID = "statusCol";
break;
case Ci.nsMsgViewSortType.byTags:
columnID = "tagsCol";
break;
case Ci.nsMsgViewSortType.bySize:
columnID = "sizeCol";
break;
case Ci.nsMsgViewSortType.byPriority:
columnID = "priorityCol";
break;
case Ci.nsMsgViewSortType.byFlagged:
columnID = "flaggedCol";
break;
case Ci.nsMsgViewSortType.byId:
columnID = "idCol";
break;
case Ci.nsMsgViewSortType.byJunkStatus:
columnID = "junkStatusCol";
break;
case Ci.nsMsgViewSortType.byAttachments:
columnID = "attachmentCol";
break;
case Ci.nsMsgViewSortType.byCustom:
// TODO: either change try() catch to if (property exists) or restore the getColumnHandler() check
try {
// getColumnHandler throws an error when the ID is not handled
columnID = window.gDBView.curCustomColumn;
} catch (err) {
// error - means no handler
dump(
"ConvertSortTypeToColumnID: custom sort key but no handler for column '" +
columnID +
"'\n"
);
columnID = "dateCol";
}
break;
case Ci.nsMsgViewSortType.byCorrespondent:
columnID = "correspondentCol";
break;
default:
dump("unsupported sort key: " + sortKey + "\n");
columnID = "dateCol";
break;
}
return columnID;
}
addEventListener("load", ThreadPaneOnLoad, true); addEventListener("load", ThreadPaneOnLoad, true);

Просмотреть файл

@ -9,6 +9,8 @@ import {
MailViewManager, MailViewManager,
} from "resource:///modules/MailViewManager.sys.mjs"; } from "resource:///modules/MailViewManager.sys.mjs";
import { SearchSpec } from "resource:///modules/SearchSpec.sys.mjs"; import { SearchSpec } from "resource:///modules/SearchSpec.sys.mjs";
import { ThreadPaneColumns } from "chrome://messenger/content/thread-pane-columns.mjs";
import { FolderUtils } from "resource:///modules/FolderUtils.sys.mjs";
import { VirtualFolderHelper } from "resource:///modules/VirtualFolderWrapper.sys.mjs"; import { VirtualFolderHelper } from "resource:///modules/VirtualFolderWrapper.sys.mjs";
@ -1537,11 +1539,6 @@ DBViewWrapper.prototype = {
); );
}, },
OUTGOING_FOLDER_FLAGS:
Ci.nsMsgFolderFlags.SentMail |
Ci.nsMsgFolderFlags.Drafts |
Ci.nsMsgFolderFlags.Queue |
Ci.nsMsgFolderFlags.Templates,
/** /**
* @returns true if the folder is an outgoing folder by virtue of being a * @returns true if the folder is an outgoing folder by virtue of being a
* sent mail folder, drafts folder, queue folder, or template folder, * sent mail folder, drafts folder, queue folder, or template folder,
@ -1550,7 +1547,10 @@ DBViewWrapper.prototype = {
get isOutgoingFolder() { get isOutgoingFolder() {
return ( return (
this.displayedFolder && this.displayedFolder &&
this.displayedFolder.isSpecialFolder(this.OUTGOING_FOLDER_FLAGS, true) this.displayedFolder.isSpecialFolder(
FolderUtils.OUTGOING_FOLDER_FLAGS,
true
)
); );
}, },
/** /**
@ -1598,6 +1598,96 @@ DBViewWrapper.prototype = {
} }
}, },
get primarySortColumnId() {
const sortKey = this.primarySortType;
let columnID;
switch (sortKey) {
// In the case of None, we default to the date column. This appears to be
// the case in such instances as Global search, so don't complain about
// it.
case Ci.nsMsgViewSortType.byNone:
case Ci.nsMsgViewSortType.byDate:
columnID = "dateCol";
break;
case Ci.nsMsgViewSortType.byReceived:
columnID = "receivedCol";
break;
case Ci.nsMsgViewSortType.byAuthor:
columnID = "senderCol";
break;
case Ci.nsMsgViewSortType.byRecipient:
columnID = "recipientCol";
break;
case Ci.nsMsgViewSortType.bySubject:
columnID = "subjectCol";
break;
case Ci.nsMsgViewSortType.byLocation:
columnID = "locationCol";
break;
case Ci.nsMsgViewSortType.byAccount:
columnID = "accountCol";
break;
case Ci.nsMsgViewSortType.byUnread:
columnID = "unreadButtonColHeader";
break;
case Ci.nsMsgViewSortType.byStatus:
columnID = "statusCol";
break;
case Ci.nsMsgViewSortType.byTags:
columnID = "tagsCol";
break;
case Ci.nsMsgViewSortType.bySize:
columnID = "sizeCol";
break;
case Ci.nsMsgViewSortType.byPriority:
columnID = "priorityCol";
break;
case Ci.nsMsgViewSortType.byFlagged:
columnID = "flaggedCol";
break;
case Ci.nsMsgViewSortType.byThread:
columnID = "threadCol";
break;
case Ci.nsMsgViewSortType.byId:
columnID = "idCol";
break;
case Ci.nsMsgViewSortType.byJunkStatus:
columnID = "junkStatusCol";
break;
case Ci.nsMsgViewSortType.byAttachments:
columnID = "attachmentCol";
break;
case Ci.nsMsgViewSortType.byCustom:
{
const curCustomColumn = this.dbView.curCustomColumn;
if (
ThreadPaneColumns.getCustomColumns().some(
c => c.id == curCustomColumn
)
) {
columnID = curCustomColumn;
} else {
dump(
"getCurrentSortColumnId: custom sort key but no handler for column '" +
columnID +
"'\n"
);
columnID = "dateCol";
}
}
break;
case Ci.nsMsgViewSortType.byCorrespondent:
columnID = "correspondentCol";
break;
default:
dump("unsupported sort key: " + sortKey + "\n");
columnID = "dateCol";
break;
}
return columnID;
},
/** /**
* @returns the primary sort type (as one of the numeric constants from * @returns the primary sort type (as one of the numeric constants from
* nsMsgViewSortType). * nsMsgViewSortType).

Просмотреть файл

@ -6,6 +6,12 @@
* This file contains helper methods for dealing with nsIMsgFolders. * This file contains helper methods for dealing with nsIMsgFolders.
*/ */
const OUTGOING_FOLDER_FLAGS =
Ci.nsMsgFolderFlags.SentMail |
Ci.nsMsgFolderFlags.Drafts |
Ci.nsMsgFolderFlags.Queue |
Ci.nsMsgFolderFlags.Templates;
export var FolderUtils = { export var FolderUtils = {
allAccountsSorted, allAccountsSorted,
compareAccounts, compareAccounts,
@ -17,6 +23,7 @@ export var FolderUtils = {
canRenameDeleteJunkMail, canRenameDeleteJunkMail,
isSmartTagsFolder, isSmartTagsFolder,
isSmartVirtualFolder, isSmartVirtualFolder,
OUTGOING_FOLDER_FLAGS,
}; };
import { MailServices } from "resource:///modules/MailServices.sys.mjs"; import { MailServices } from "resource:///modules/MailServices.sys.mjs";