calendar/import-export/CalWeekPrinter.jsm
author Mozilla Releng Treescript <release+treescript@mozilla.org>
Mon, 01 Jun 2020 21:06:52 +0000
changeset 38423 a72e4d7908e0d4da3cfb13e0db7eee2d478269d3
parent 38270 39a884a7b19acd946dedf75a441f0d14631053eb
child 39075 18f27bc33168c576676908b2a9cdb34707fb89e2
permissions -rw-r--r--
no bug - Bumping Thunderbird l10n changesets r=release a=l10n-bump CLOSED TREE af -> removed ar -> 13f4e5c63aed ast -> 06238bcd1d71 be -> 2a2c4bfa536c bg -> b066986baad7 br -> 77130fec77d1 ca -> 05263001b4fb cak -> 34cffcb6f7ca cs -> 7d6080744017 cy -> 74a71abffa27 da -> d79d59042826 de -> 23f2aa4ae3de dsb -> c7548879c855 el -> e7b6bf516f62 en-GB -> 64789d6d3264 es-AR -> 44ce7b8a21f6 es-ES -> e131e33378bd et -> af1beec7a2c5 eu -> dff4a7c14438 fa -> removed fi -> b04da68482de fr -> 7e2320d07b94 fy-NL -> f43fd875b36b ga-IE -> 56b7bb91b552 gd -> 94b469991a3b gl -> 228a11d8ba8c he -> ed93e84e5416 hr -> 037459e37cc3 hsb -> 192b76cd4451 hu -> 92669fa62f5a hy-AM -> 49a2e6124917 id -> 240f090ba92f is -> 7cda20fa902a it -> ec692ed62c10 ja -> 5eed784b3cd9 ja-JP-mac -> e37f1ed0ff6d ka -> 4ce3c0e3feb7 kab -> 6ea74b301cc8 kk -> 95ec87f8788e ko -> ed50767d5b05 lt -> d71a8aa38738 ms -> ac99de934f0c nb-NO -> 4c42b2eb457c nl -> f31b19039101 nn-NO -> e2d68d6fd0eb pa-IN -> removed pl -> d6453ed2bb87 pt-BR -> ad22cae34261 pt-PT -> 693f4dace00c rm -> 80d37050607e ro -> a5af9f2e8f1d ru -> 3a82831ae1d9 si -> 55e501a4e096 sk -> d1c8c57d517d sl -> ecae5ba0d9b7 sq -> b9ad05079398 sr -> f15c2fb5fd90 sv-SE -> 21c851897e57 th -> removed tr -> dc70d34d90d1 uk -> bbfae865d18b uz -> 3a9d7e55dbe9 vi -> 20973eb20233 zh-CN -> d9fa062cd366 zh-TW -> 62ce156b3e49

/* 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/. */

var EXPORTED_SYMBOLS = ["CalWeekPrinter"];

var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm");

/**
 * Prints a two column view of a week of events, much like a paper day-planner
 */
function CalWeekPrinter() {
  this.wrappedJSObject = this;
}

CalWeekPrinter.prototype = {
  QueryInterface: ChromeUtils.generateQI([Ci.calIPrintFormatter]),
  classID: Components.ID("{2d6ec97b-9109-4b92-89c5-d4b4806619ce}"),

  get name() {
    return cal.l10n.getCalString("weekPrinterName");
  },

  formatToHtml(aStream, aStart, aEnd, aItems, aTitle) {
    let document = cal.xml.parseFile("chrome://calendar/content/printing/calWeekPrinter.html");
    let defaultTimezone = cal.dtz.defaultTimezone;

    // Set page title
    document.getElementById("title").textContent = aTitle;

    cal.view.colorTracker.addColorsToDocument(document);

    // Table that maps YYYY-MM-DD to the DOM node container where items are to be added
    let dayTable = {};
    let weekInfoService = cal.getWeekInfoService();

    // Make sure to create tables from start to end, if passed
    if (aStart && aEnd) {
      for (
        let current = weekInfoService.getStartOfWeek(aStart);
        current.compare(aEnd) < 0;
        current.day += 7
      ) {
        this.setupWeek(document, current, dayTable);
      }
    }

    for (let item of aItems) {
      let itemStartDate = item[cal.dtz.startDateProp(item)] || item[cal.dtz.endDateProp(item)];
      let itemEndDate = item[cal.dtz.endDateProp(item)] || item[cal.dtz.startDateProp(item)];

      if (!itemStartDate && !itemEndDate) {
        cal.print.addItemToDayboxNodate(document, item);
        continue;
      }
      itemStartDate = itemStartDate.getInTimezone(defaultTimezone);
      itemEndDate = itemEndDate.getInTimezone(defaultTimezone);

      let boxDate = itemStartDate.clone();
      boxDate.isDate = true;
      for (boxDate; boxDate.compare(itemEndDate) < (itemEndDate.isDate ? 0 : 1); boxDate.day++) {
        // Ignore items outside of the range, i.e tasks without start date
        // where the end date is somewhere else.
        if (
          aStart &&
          aEnd &&
          boxDate &&
          (boxDate.compare(aStart) < 0 || boxDate.compare(aEnd) >= 0)
        ) {
          continue;
        }

        let boxDateKey = cal.print.getDateKey(boxDate);

        if (!(boxDateKey in dayTable)) {
          // Doesn't exist, we need to create a new table for it
          let startOfWeek = weekInfoService.getStartOfWeek(boxDate);
          this.setupWeek(document, startOfWeek, dayTable);
        }

        cal.print.addItemToDaybox(document, item, boxDate, dayTable[boxDateKey]);
      }
    }

    // Remove templates from HTML, no longer needed
    let templates = document.getElementById("templates");
    templates.remove();

    // Stream out the resulting HTML
    let html = cal.xml.serializeDOM(document);
    let convStream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(
      Ci.nsIConverterOutputStream
    );
    convStream.init(aStream, "UTF-8");
    convStream.writeString(html);
  },

  setupWeek(document, startOfWeek, dayTable) {
    const weekdayMap = [
      "sunday",
      "monday",
      "tuesday",
      "wednesday",
      "thursday",
      "friday",
      "saturday",
    ];

    let weekTemplate = document.getElementById("week-template");
    let weekContainer = document.getElementById("week-container");
    let defaultTimezone = cal.dtz.defaultTimezone;

    // Clone the template week and make sure it doesn't have an id
    let currentPage = weekTemplate.cloneNode(true);
    currentPage.removeAttribute("id");
    currentPage.item = startOfWeek.clone();

    // Set up the week number title
    let weekInfo = cal.getWeekInfoService();
    let weekno = weekInfo.getWeekTitle(startOfWeek);
    let weekTitle = cal.l10n.getCalString("WeekTitle", [weekno]);
    currentPage.querySelector(".week-number").textContent = weekTitle;

    // Set up the day boxes
    let endOfWeek = weekInfo.getEndOfWeek(startOfWeek);
    for (
      let currentDate = startOfWeek.clone();
      currentDate.compare(endOfWeek) <= 0;
      currentDate.day++
    ) {
      let weekday = currentDate.weekday;
      let weekdayName = weekdayMap[weekday];
      let dayOffPrefName = "calendar.week.d" + weekday + weekdayName + "soff";
      dayTable[cal.print.getDateKey(currentDate)] = currentPage.querySelector(
        "." + weekdayName + "-container"
      );

      let titleNode = currentPage.querySelector("." + weekdayName + "-title");
      titleNode.textContent = cal.dtz.formatter.formatDateLong(
        currentDate.getInTimezone(defaultTimezone)
      );

      if (Services.prefs.getBoolPref(dayOffPrefName, false)) {
        let daysOffNode = currentPage.querySelector("." + weekdayName + "-box");
        daysOffNode.className += " day-off";
      }
    }

    // Now insert the week into the week container, sorting by date (and therefore week number)
    function compareDates(a, b) {
      return !a || !b ? -1 : a.compare(b);
    }

    cal.data.binaryInsertNode(weekContainer, currentPage, currentPage.item, compareDates);
  },
};