releases-comm-central/calendar/base/content/calendar-task-view.js

253 строки
11 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Sun Microsystems code.
*
* The Initial Developer of the Original Code is Sun Microsystems.
* Portions created by the Initial Developer are Copyright (C) 2006
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Michael Buettner <michael.buettner@sun.com>
* Philipp Kewisch <mozilla@kewis.ch>
* Berend Cornelius <berend.cornelius@sun.com>
* Fred Jendrzejewski <fred.jen@web.de>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
var taskDetailsView = {
/**
* Task Details Events
*
* XXXberend Please document this function, possibly also consolidate since
* its the only function in taskDetailsView.
*/
onSelect: function tDV_onSelect(event) {
var dateFormatter =
Components.classes["@mozilla.org/calendar/datetime-formatter;1"]
.getService(Components.interfaces.calIDateTimeFormatter);
function displayElement(id,flag) {
setBooleanAttribute(id, "hidden", !flag);
return flag;
}
var item = document.getElementById("calendar-task-tree").currentTask;
if (displayElement("calendar-task-details-container", item != null) &&
displayElement("calendar-task-view-splitter", item != null)) {
displayElement("calendar-task-details-title-row", true);
document.getElementById("calendar-task-details-title").value = item.title;
var organizer = item.organizer;
if (displayElement("calendar-task-details-organizer-row", organizer != null)) {
var name = organizer.commonName;
if (!name || name.length <= 0) {
if (organizer.id && organizer.id.length) {
name = organizer.id;
var re = new RegExp("^mailto:(.*)", "i");
var matches = re.exec(name);
if (matches) {
name = matches[1];
}
}
}
if (displayElement("calendar-task-details-organizer-row", name && name.length)) {
document.getElementById("calendar-task-details-organizer").value = name;
}
}
var priority = 0;
if (item.calendar.getProperty("capabilities.priority.supported") != false) {
priority = parseInt(item.priority);
}
if (displayElement("calendar-task-details-priority-row", priority > 0)) {
displayElement("calendar-task-details-priority-low", (priority >= 6 && priority <= 9));
displayElement("calendar-task-details-priority-normal", priority == 5);
displayElement("calendar-task-details-priority-high", (priority >= 1 && priority <= 4));
}
var status = item.getProperty("STATUS");
if (displayElement("calendar-task-details-status-row", status && status.length > 0)) {
var statusDetails = document.getElementById("calendar-task-details-status");
switch(status) {
case "NEEDS-ACTION":
statusDetails.value = calGetString(
"calendar",
"taskDetailsStatusNeedsAction");
break;
case "IN-PROCESS":
var percent = 0;
var property = item.getProperty("PERCENT-COMPLETE");
if (property != null) {
var percent = parseInt(property);
}
statusDetails.value = calGetString(
"calendar",
"taskDetailsStatusInProgress", [percent]);
break;
case "COMPLETED":
if (item.completedDate) {
var completedDate = item.completedDate.getInTimezone(
calendarDefaultTimezone());
statusDetails.value = calGetString(
"calendar",
"taskDetailsStatusCompletedOn",
[dateFormatter.formatDateTime(completedDate)]);
}
break;
case "CANCELLED":
statusDetails.value = calGetString(
"calendar",
"taskDetailsStatusCancelled");
break;
default:
displayElement("calendar-task-details-status-row", false);
break;
}
}
var categories = item.getCategories({});
if (displayElement("calendar-task-details-category-row", categories.length > 0)) {
document.getElementById("calendar-task-details-category").value = categories.join(", ");
}
document.getElementById("task-start-row").Item = item;
document.getElementById("task-due-row").Item = item;
var parentItem = item;
if (parentItem.parentItem != parentItem) {
// XXXdbo Didn't we want to get rid of these checks?
parentItem = parentItem.parentItem;
}
var recurrenceInfo = parentItem.recurrenceInfo;
var recurStart = parentItem.recurrenceStartDate;
if (displayElement("calendar-task-details-repeat-row", recurrenceInfo && recurStart)) {
var kDefaultTimezone = calendarDefaultTimezone();
var startDate = recurStart.getInTimezone(kDefaultTimezone);
var endDate = item.dueDate ? item.dueDate.getInTimezone(kDefaultTimezone) : null;
var detailsString = recurrenceRule2String(recurrenceInfo,startDate,endDate,startDate.isDate);
if (detailsString) {
document.getElementById("calendar-task-details-repeat").value = detailsString.split("\n").join(" ");
}
}
var textbox = document.getElementById("calendar-task-details-description");
var description = item.hasProperty("DESCRIPTION") ? item.getProperty("DESCRIPTION") : null;
textbox.value = description;
textbox.inputField.readOnly = true;
var gURL = item.getProperty("URL");
if (displayElement("calendar-task-details-attachment-row", gURL && gURL.length)) {
var urlLabel = document.getElementById("calendar-task-details-attachment");
urlLabel.value = gURL;
urlLabel.setAttribute("tooltiptext", gURL);
}
}
}
};
/**
* Updates the currently applied filter for the task view and refreshes the task
* tree.
*
* @param filter The filter name to set.
*/
function taskViewUpdate(filter) {
document.getElementById("filterBroadcaster").setAttribute("value", filter);
var tree = document.getElementById("calendar-task-tree");
// set the filters
tree.mFilter.propertyFilter = filter;
tree.mFilter.setDateFilter(filter);
tree.refresh();
}
/**
* Prepares a dialog to send an email to the organizer of the currently selected
* task in the task view.
*
* XXX We already have a function with this name in the event dialog. Either
* consolidate or make name more clear.
*/
function sendMailToOrganizer() {
var item = document.getElementById("calendar-task-tree").currentTask;
if (item != null) {
var organizer = item.organizer;
if (organizer) {
if (organizer.id && organizer.id.length) {
var email = organizer.id;
var re = new RegExp("^mailto:(.*)", "i");
if (email && email.length) {
if (re.test(email)) {
email = RegExp.$1;
} else {
email = email;
}
}
// Set up the subject
var emailSubject = calGetString("calendar-event-dialog",
"emailSubjectReply",
[item.title]);
sendMailTo(email, emailSubject);
}
}
}
}
/**
* Handler function to observe changing of the calendar display deck. Updates
* the task tree if the task view was selected.
*
* TODO Consolidate this function and anything connected, its still from times
* before we had view tabs.
*/
function taskViewObserveDisplayDeckChange(event) {
var deck = event.target;
// Bug 309505: The 'select' event also fires when we change the selected
// panel of calendar-view-box. Workaround with this check.
if (deck.id != "calendarDisplayDeck") {
return;
}
var id = null;
try {
id = deck.selectedPanel.id
}
catch (e) {}
// In case we find that the task view has been made visible, we refresh the view.
if (id == "calendar-task-box") {
taskViewUpdate(
document.getElementById("task-tree-filtergroup").value || "all");
}
}
// Install event listeners for the display deck change.
document.addEventListener("load", function () {
document.getElementById("calendarDisplayDeck").
addEventListener("select", taskViewObserveDisplayDeckChange, true);
}, true);