diff options
Diffstat (limited to 'comm/calendar/base/content/calendar-invitation-display.js')
-rw-r--r-- | comm/calendar/base/content/calendar-invitation-display.js | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/comm/calendar/base/content/calendar-invitation-display.js b/comm/calendar/base/content/calendar-invitation-display.js new file mode 100644 index 0000000000..ed560d02ed --- /dev/null +++ b/comm/calendar/base/content/calendar-invitation-display.js @@ -0,0 +1,169 @@ +/* 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/. */ + +/* globals gMessageListeners, calImipBar */ + +// Wrap in a block to prevent leaking to window scope. +{ + const { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + + /** + * CalInvitationDisplay is the controller responsible for the display of the + * invitation panel when an email contains an embedded invitation. + */ + const CalInvitationDisplay = { + /** + * The itipItem currently displayed. + * + * @type {calIItipItem} + */ + currentItipItem: null, + + /** + * The XUL element that wraps the invitation. + * + * @type {XULElement} + */ + container: null, + + /** + * The node the invitation details are rendered into. + * + * @type {HTMLElement} + */ + display: null, + + /** + * The <browser> element that displays the message body. This is hidden + * when the invitation details are displayed. + */ + body: null, + + /** + * Creates a new instance and sets up listeners. + */ + init() { + this.container = document.getElementById("calendarInvitationDisplayContainer"); + this.display = document.getElementById("calendarInvitationDisplay"); + this.body = document.getElementById("messagepane"); + + window.addEventListener("onItipItemCreation", this); + window.addEventListener("onItipItemActionFinished", this); + window.addEventListener("messagepane-unloaded", this); + document.getElementById("msgHeaderView").addEventListener("message-header-pane-hidden", this); + gMessageListeners.push(this); + }, + + /** + * Renders the panel with invitation details when "onItipItemCreation" is + * received. + * + * @param {Event} evt + */ + handleEvent(evt) { + switch (evt.type) { + case "DOMContentLoaded": + this.init(); + break; + case "onItipItemCreation": + case "onItipItemActionFinished": + this.show(evt.detail); + break; + case "messagepane-unloaded": + case "message-header-pane-hidden": + this.hide(); + break; + case "calendar-invitation-panel-action": + if (evt.detail.type == "update") { + calImipBar.executeAction(); + } else { + calImipBar.executeAction(evt.detail.type.toUpperCase()); + } + break; + default: + break; + } + }, + + /** + * Hide the invitation display each time a new message to display is + * detected. If the message contains an invitation it will be displayed + * in the "onItipItemCreation" handler. + */ + onStartHeaders() { + this.hide(); + }, + + /** + * Called by messageHeaderSink. + */ + onEndHeaders() {}, + + /** + * Displays the invitation display with the data from the provided + * calIItipItem. + * + * @param {calIItipItem} itipItem + */ + async show(itipItem) { + this.currentItipItem = itipItem; + this.display.replaceChildren(); + + let [, rc, actionFunc, foundItems] = await new Promise(resolve => + cal.itip.processItipItem(itipItem, (targetItipItem, rc, actionFunc, foundItems) => + resolve([targetItipItem, rc, actionFunc, foundItems]) + ) + ); + + if (this.currentItipItem != itipItem || !Components.isSuccessCode(rc)) { + return; + } + + let [item] = itipItem.getItemList(); + let [foundItem] = foundItems; + let panel = document.createElement("calendar-invitation-panel"); + panel.addEventListener("calendar-invitation-panel-action", this); + + let method = actionFunc ? actionFunc.method : itipItem.receivedMethod; + switch (method) { + case "REQUEST:UPDATE": + panel.mode = panel.constructor.MODE_UPDATE_MAJOR; + break; + case "REQUEST:UPDATE-MINOR": + panel.mode = panel.constructor.MODE_UPDATE_MINOR; + break; + case "REQUEST": + panel.mode = foundItem + ? panel.constructor.MODE_ALREADY_PROCESSED + : panel.constructor.MODE_NEW; + break; + case "CANCEL": + panel.mode = foundItem + ? panel.constructor.MODE_CANCELLED + : panel.constructor.MODE_CANCELLED_NOT_FOUND; + break; + default: + panel.mode = panel.mode = panel.constructor.MODE_NEW; + break; + } + panel.foundItem = foundItem; + panel.item = item; + this.display.appendChild(panel); + this.body.hidden = true; + this.container.hidden = false; + }, + + /** + * Removes the invitation display from view, resetting any changes made + * to the container and message pane. + */ + hide() { + this.container.hidden = true; + this.display.replaceChildren(); + this.body.hidden = false; + }, + }; + + window.addEventListener("DOMContentLoaded", CalInvitationDisplay, { once: true }); +} |