summaryrefslogtreecommitdiffstats
path: root/comm/calendar/base/content/item-editing/calendar-task-editing.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/calendar/base/content/item-editing/calendar-task-editing.js')
-rw-r--r--comm/calendar/base/content/item-editing/calendar-task-editing.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/comm/calendar/base/content/item-editing/calendar-task-editing.js b/comm/calendar/base/content/item-editing/calendar-task-editing.js
new file mode 100644
index 0000000000..33f67f81d7
--- /dev/null
+++ b/comm/calendar/base/content/item-editing/calendar-task-editing.js
@@ -0,0 +1,181 @@
+/* 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/. */
+
+/* import-globals-from ../calendar-management.js */
+/* import-globals-from ../calendar-ui-utils.js */
+/* import-globals-from calendar-item-editing.js */
+
+var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm");
+
+var { XPCOMUtils } = ChromeUtils.importESModule("resource://gre/modules/XPCOMUtils.sys.mjs");
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ CalTodo: "resource:///modules/CalTodo.jsm",
+});
+
+/**
+ * Used by the "quick add" feature for tasks, for example in the task view or
+ * the uniinder-todo.
+ *
+ * NOTE: many of the following methods are called without taskEdit being the
+ * |this| object.
+ */
+
+var taskEdit = {
+ /**
+ * Helper function to set readonly and aria-disabled states and the value
+ * for a given target.
+ *
+ * @param aTarget The ID or XUL node to set the value
+ * @param aDisable A boolean if the target should be disabled.
+ * @param aValue The value that should be set on the target.
+ */
+ setupTaskField(aTarget, aDisable, aValue) {
+ aTarget.value = aValue;
+ aTarget.readOnly = aDisable;
+ aTarget.ariaDisabled = aDisable;
+ },
+
+ /**
+ * Handler function to call when the quick-add input gains focus.
+ *
+ * @param aEvent The DOM focus event
+ */
+ onFocus(aEvent) {
+ let edit = aEvent.target;
+ let calendar = getSelectedCalendar();
+ edit.showsInstructions = true;
+
+ if (calendar.getProperty("capabilities.tasks.supported") === false) {
+ taskEdit.setupTaskField(edit, true, cal.l10n.getCalString("taskEditInstructionsCapability"));
+ } else if (cal.acl.isCalendarWritable(calendar)) {
+ edit.showsInstructions = false;
+ taskEdit.setupTaskField(edit, false, edit.savedValue || "");
+ } else {
+ taskEdit.setupTaskField(edit, true, cal.l10n.getCalString("taskEditInstructionsReadonly"));
+ }
+ },
+
+ /**
+ * Handler function to call when the quick-add input loses focus.
+ *
+ * @param aEvent The DOM blur event
+ */
+ onBlur(aEvent) {
+ let edit = aEvent.target;
+ let calendar = getSelectedCalendar();
+ if (!calendar) {
+ // this must be a first run, we don't have a calendar yet
+ return;
+ }
+
+ if (calendar.getProperty("capabilities.tasks.supported") === false) {
+ taskEdit.setupTaskField(edit, true, cal.l10n.getCalString("taskEditInstructionsCapability"));
+ } else if (cal.acl.isCalendarWritable(calendar)) {
+ if (!edit.showsInstructions) {
+ edit.savedValue = edit.value || "";
+ }
+ taskEdit.setupTaskField(edit, false, cal.l10n.getCalString("taskEditInstructions"));
+ } else {
+ taskEdit.setupTaskField(edit, true, cal.l10n.getCalString("taskEditInstructionsReadonly"));
+ }
+
+ edit.showsInstructions = true;
+ },
+
+ /**
+ * Handler function to call on keypress for the quick-add input.
+ *
+ * @param aEvent The DOM keypress event
+ */
+ onKeyPress(aEvent) {
+ if (aEvent.key == "Enter") {
+ let edit = aEvent.target;
+ if (edit.value && edit.value.length > 0) {
+ let item = new CalTodo();
+ setDefaultItemValues(item);
+ item.title = edit.value;
+
+ edit.value = "";
+ doTransaction("add", item, item.calendar, null, null);
+ }
+ }
+ },
+
+ /**
+ * Helper function to call onBlur for all fields with class name
+ * "task-edit-field".
+ */
+ callOnBlurForAllTaskFields() {
+ let taskEditFields = document.getElementsByClassName("task-edit-field");
+ for (let i = 0; i < taskEditFields.length; i++) {
+ taskEdit.onBlur({ target: taskEditFields[i] });
+ }
+ },
+
+ /**
+ * Load function to set up all quick-add inputs. The input must
+ * have the class "task-edit-field".
+ */
+ onLoad(aEvent) {
+ cal.view.getCompositeCalendar(window).addObserver(taskEdit.compositeObserver);
+ taskEdit.callOnBlurForAllTaskFields();
+ },
+
+ /**
+ * Window load function to clean up all quick-add fields.
+ */
+ onUnload() {
+ cal.view.getCompositeCalendar(window).removeObserver(taskEdit.compositeObserver);
+ },
+
+ /**
+ * Observer to watch for changes to the selected calendar.
+ *
+ * @see calIObserver
+ * @see calICompositeObserver
+ */
+ compositeObserver: {
+ QueryInterface: ChromeUtils.generateQI(["calIObserver", "calICompositeObserver"]),
+
+ // calIObserver:
+ onStartBatch() {},
+ onEndBatch() {},
+ onLoad(aCalendar) {},
+ onAddItem(aItem) {},
+ onModifyItem(aNewItem, aOldItem) {},
+ onDeleteItem(aDeletedItem) {},
+ onError(aCalendar, aErrNo, aMessage) {},
+
+ onPropertyChanged(aCalendar, aName, aValue, aOldValue) {
+ if (aCalendar.id != getSelectedCalendar().id) {
+ // Optimization: if the given calendar isn't the selected calendar,
+ // then we don't need to change any readonly/disabled states.
+ return;
+ }
+
+ switch (aName) {
+ case "readOnly":
+ case "disabled": {
+ taskEdit.callOnBlurForAllTaskFields();
+ break;
+ }
+ }
+ },
+
+ onPropertyDeleting(aCalendar, aName) {
+ // Since the old value is not used directly in onPropertyChanged,
+ // but should not be the same as the value, set it to a different
+ // value.
+ this.onPropertyChanged(aCalendar, aName, null, null);
+ },
+
+ // calICompositeObserver:
+ onCalendarAdded(aCalendar) {},
+ onCalendarRemoved(aCalendar) {},
+ onDefaultCalendarChanged(aNewDefault) {
+ taskEdit.callOnBlurForAllTaskFields();
+ },
+ },
+};