summaryrefslogtreecommitdiffstats
path: root/comm/mail/base/content/modules/thread-pane-columns.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/base/content/modules/thread-pane-columns.mjs')
-rw-r--r--comm/mail/base/content/modules/thread-pane-columns.mjs385
1 files changed, 385 insertions, 0 deletions
diff --git a/comm/mail/base/content/modules/thread-pane-columns.mjs b/comm/mail/base/content/modules/thread-pane-columns.mjs
new file mode 100644
index 0000000000..2361379509
--- /dev/null
+++ b/comm/mail/base/content/modules/thread-pane-columns.mjs
@@ -0,0 +1,385 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, you can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const { XPCOMUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/XPCOMUtils.sys.mjs"
+);
+
+const lazy = {};
+XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "USE_CORRESPONDENTS",
+ "mail.threadpane.use_correspondents",
+ true
+);
+XPCOMUtils.defineLazyModuleGetters(lazy, {
+ FeedUtils: "resource:///modules/FeedUtils.jsm",
+ DBViewWrapper: "resource:///modules/DBViewWrapper.jsm",
+});
+
+/**
+ * The array of columns for the table layout. This must be kept in sync with
+ * the row template #threadPaneRowTemplate in about3Pane.xhtml.
+ *
+ * @type {Array}
+ */
+const DEFAULT_COLUMNS = [
+ {
+ id: "selectCol",
+ l10n: {
+ header: "threadpane-column-header-select",
+ menuitem: "threadpane-column-label-select",
+ },
+ ordinal: 1,
+ select: true,
+ icon: true,
+ resizable: false,
+ sortable: false,
+ hidden: true,
+ },
+ {
+ id: "threadCol",
+ l10n: {
+ header: "threadpane-column-header-thread",
+ menuitem: "threadpane-column-label-thread",
+ },
+ ordinal: 2,
+ thread: true,
+ icon: true,
+ resizable: false,
+ sortable: false,
+ },
+ {
+ id: "flaggedCol",
+ l10n: {
+ header: "threadpane-column-header-flagged",
+ menuitem: "threadpane-column-label-flagged",
+ },
+ ordinal: 3,
+ sortKey: "byFlagged",
+ star: true,
+ icon: true,
+ resizable: false,
+ },
+ {
+ id: "attachmentCol",
+ l10n: {
+ header: "threadpane-column-header-attachments",
+ menuitem: "threadpane-column-label-attachments",
+ },
+ ordinal: 4,
+ sortKey: "byAttachments",
+ icon: true,
+ resizable: false,
+ },
+ {
+ id: "subjectCol",
+ l10n: {
+ header: "threadpane-column-header-subject",
+ menuitem: "threadpane-column-label-subject",
+ },
+ ordinal: 5,
+ picker: false,
+ sortKey: "bySubject",
+ },
+ {
+ id: "unreadButtonColHeader",
+ l10n: {
+ header: "threadpane-column-header-unread-button",
+ menuitem: "threadpane-column-label-unread-button",
+ },
+ ordinal: 6,
+ sortKey: "byUnread",
+ icon: true,
+ resizable: false,
+ unread: true,
+ },
+ {
+ id: "senderCol",
+ l10n: {
+ header: "threadpane-column-header-sender",
+ menuitem: "threadpane-column-label-sender",
+ },
+ ordinal: 7,
+ sortKey: "byAuthor",
+ hidden: true,
+ },
+ {
+ id: "recipientCol",
+ l10n: {
+ header: "threadpane-column-header-recipient",
+ menuitem: "threadpane-column-label-recipient",
+ },
+ ordinal: 8,
+ sortKey: "byRecipient",
+ hidden: true,
+ },
+ {
+ id: "correspondentCol",
+ l10n: {
+ header: "threadpane-column-header-correspondents",
+ menuitem: "threadpane-column-label-correspondents",
+ },
+ ordinal: 9,
+ sortKey: "byCorrespondent",
+ },
+ {
+ id: "junkStatusCol",
+ l10n: {
+ header: "threadpane-column-header-spam",
+ menuitem: "threadpane-column-label-spam",
+ },
+ ordinal: 10,
+ sortKey: "byJunkStatus",
+ spam: true,
+ icon: true,
+ resizable: false,
+ },
+ {
+ id: "dateCol",
+ l10n: {
+ header: "threadpane-column-header-date",
+ menuitem: "threadpane-column-label-date",
+ },
+ ordinal: 11,
+ sortKey: "byDate",
+ },
+ {
+ id: "receivedCol",
+ l10n: {
+ header: "threadpane-column-header-received",
+ menuitem: "threadpane-column-label-received",
+ },
+ ordinal: 12,
+ sortKey: "byReceived",
+ hidden: true,
+ },
+ {
+ id: "statusCol",
+ l10n: {
+ header: "threadpane-column-header-status",
+ menuitem: "threadpane-column-label-status",
+ },
+ ordinal: 13,
+ sortKey: "byStatus",
+ hidden: true,
+ },
+ {
+ id: "sizeCol",
+ l10n: {
+ header: "threadpane-column-header-size",
+ menuitem: "threadpane-column-label-size",
+ },
+ ordinal: 14,
+ sortKey: "bySize",
+ hidden: true,
+ },
+ {
+ id: "tagsCol",
+ l10n: {
+ header: "threadpane-column-header-tags",
+ menuitem: "threadpane-column-label-tags",
+ },
+ ordinal: 15,
+ sortKey: "byTags",
+ hidden: true,
+ },
+ {
+ id: "accountCol",
+ l10n: {
+ header: "threadpane-column-header-account",
+ menuitem: "threadpane-column-label-account",
+ },
+ ordinal: 16,
+ sortKey: "byAccount",
+ hidden: true,
+ },
+ {
+ id: "priorityCol",
+ l10n: {
+ header: "threadpane-column-header-priority",
+ menuitem: "threadpane-column-label-priority",
+ },
+ ordinal: 17,
+ sortKey: "byPriority",
+ hidden: true,
+ },
+ {
+ id: "unreadCol",
+ l10n: {
+ header: "threadpane-column-header-unread",
+ menuitem: "threadpane-column-label-unread",
+ },
+ ordinal: 18,
+ sortable: false,
+ hidden: true,
+ },
+ {
+ id: "totalCol",
+ l10n: {
+ header: "threadpane-column-header-total",
+ menuitem: "threadpane-column-label-total",
+ },
+ ordinal: 19,
+ sortable: false,
+ hidden: true,
+ },
+ {
+ id: "locationCol",
+ l10n: {
+ header: "threadpane-column-header-location",
+ menuitem: "threadpane-column-label-location",
+ },
+ ordinal: 20,
+ sortKey: "byLocation",
+ hidden: true,
+ },
+ {
+ id: "idCol",
+ l10n: {
+ header: "threadpane-column-header-id",
+ menuitem: "threadpane-column-label-id",
+ },
+ ordinal: 21,
+ sortKey: "byId",
+ hidden: true,
+ },
+ {
+ id: "deleteCol",
+ l10n: {
+ header: "threadpane-column-header-delete",
+ menuitem: "threadpane-column-label-delete",
+ },
+ ordinal: 22,
+ delete: true,
+ icon: true,
+ resizable: false,
+ sortable: false,
+ hidden: true,
+ },
+];
+
+/**
+ * Check if the current folder is a special Outgoing folder.
+ *
+ * @param {nsIMsgFolder} folder - The message folder.
+ * @returns {boolean} True if the folder is Outgoing.
+ */
+export const isOutgoing = folder => {
+ return folder.isSpecialFolder(
+ lazy.DBViewWrapper.prototype.OUTGOING_FOLDER_FLAGS,
+ true
+ );
+};
+
+/**
+ * Generate the correct default array of columns, accounting for different views
+ * and folder states.
+ *
+ * @param {?nsIMsgFolder} folder - The currently viewed folder if available.
+ * @param {boolean} [isSynthetic=false] - If the current view is synthetic,
+ * meaning we are not visualizing a real folder, but rather
+ * the gloda results list.
+ * @returns {object[]}
+ */
+export function getDefaultColumns(folder, isSynthetic = false) {
+ // Create a clone we can edit.
+ let updatedColumns = DEFAULT_COLUMNS.map(column => ({ ...column }));
+
+ if (isSynthetic) {
+ // Synthetic views usually can contain messages from multiple folders.
+ // Folder for the selected message will still be set.
+ for (let c of updatedColumns) {
+ switch (c.id) {
+ case "correspondentCol":
+ // Don't show the correspondent if is not wanted.
+ c.hidden = !lazy.USE_CORRESPONDENTS;
+ break;
+ case "senderCol":
+ // Hide the sender if correspondent is enabled.
+ c.hidden = lazy.USE_CORRESPONDENTS;
+ break;
+ case "attachmentCol":
+ case "unreadButtonColHeader":
+ case "junkStatusCol":
+ // Hide all the columns we don't want in a default gloda view.
+ c.hidden = true;
+ break;
+ case "locationCol":
+ // Always show the location by default in a gloda view.
+ c.hidden = false;
+ break;
+ }
+ }
+ return updatedColumns;
+ }
+
+ if (!folder) {
+ // We don't have a folder yet. Use defaults.
+ return updatedColumns;
+ }
+
+ for (let c of updatedColumns) {
+ switch (c.id) {
+ case "correspondentCol":
+ // Don't show the correspondent for news or RSS.
+ c.hidden = lazy.USE_CORRESPONDENTS
+ ? !folder.getFlag(Ci.nsMsgFolderFlags.Mail) ||
+ lazy.FeedUtils.isFeedFolder(folder)
+ : true;
+ break;
+ case "senderCol":
+ // Show the sender even if correspondent is enabled for news and feeds.
+ c.hidden = lazy.USE_CORRESPONDENTS
+ ? !folder.getFlag(Ci.nsMsgFolderFlags.Newsgroup) &&
+ !lazy.FeedUtils.isFeedFolder(folder)
+ : isOutgoing(folder);
+ break;
+ case "recipientCol":
+ // No recipient column if we use correspondent. Otherwise hide it if is
+ // not an outgoing folder.
+ c.hidden = lazy.USE_CORRESPONDENTS ? true : !isOutgoing(folder);
+ break;
+ case "junkStatusCol":
+ // No ability to mark newsgroup or feed messages as spam.
+ c.hidden =
+ folder.getFlag(Ci.nsMsgFolderFlags.Newsgroup) ||
+ lazy.FeedUtils.isFeedFolder(folder);
+ break;
+ }
+ }
+ return updatedColumns;
+}
+
+/**
+ * Find the proper column to use as sender field for the cards view.
+ *
+ * @param {?nsIMsgFolder} folder - The currently viewed folder if available.
+ * @returns {string} - The name of the column to use as sender field.
+ */
+function getProperSenderForCardsView(folder) {
+ // Default to correspondent as it's the safest choice most of the times.
+ if (!folder) {
+ return "correspondentCol";
+ }
+
+ // Show the recipient for outgoing folders.
+ if (isOutgoing(folder)) {
+ return "recipientCol";
+ }
+
+ // Show the sender for any other scenario, including news and feeds folders.
+ return "senderCol";
+}
+
+/**
+ * Get the default array of columns to fetch data for the cards view.
+ *
+ * @param {?nsIMsgFolder} folder - The currently viewed folder if available.
+ * @returns {string[]}
+ */
+export function getDefaultColumnsForCardsView(folder) {
+ const sender = getProperSenderForCardsView(folder);
+ return ["subjectCol", sender, "dateCol", "tagsCol"];
+}