summaryrefslogtreecommitdiffstats
path: root/content/modules/manager.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 06:29:37 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 06:29:37 +0000
commit9355e23a909a7801b3ccdf68ee05b3480be42407 (patch)
tree78220623341b88bd42d16929e2acb3e5ef52e0c8 /content/modules/manager.js
parentInitial commit. (diff)
downloadtbsync-9355e23a909a7801b3ccdf68ee05b3480be42407.tar.xz
tbsync-9355e23a909a7801b3ccdf68ee05b3480be42407.zip
Adding upstream version 4.7.upstream/4.7
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--content/modules/manager.js392
1 files changed, 392 insertions, 0 deletions
diff --git a/content/modules/manager.js b/content/modules/manager.js
new file mode 100644
index 0000000..12ef4b2
--- /dev/null
+++ b/content/modules/manager.js
@@ -0,0 +1,392 @@
+/*
+ * This file is part of TbSync.
+ *
+ * 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/.
+ */
+
+ "use strict";
+
+var manager = {
+
+ prefWindowObj: null,
+
+ load: async function () {
+ },
+
+ unload: async function () {
+ //close window (if open)
+ if (this.prefWindowObj !== null) this.prefWindowObj.close();
+ },
+
+
+
+
+
+ openManagerWindow: function(event) {
+ if (!event.button) { //catches zero or undefined
+ if (TbSync.enabled) {
+ // check, if a window is already open and just put it in focus
+ if (this.prefWindowObj === null) {
+ this.prefWindowObj = TbSync.window.open("chrome://tbsync/content/manager/accountManager.xhtml", "TbSyncAccountManagerWindow", "chrome,centerscreen");
+ }
+ this.prefWindowObj.focus();
+ } else {
+ //this.popupNotEnabled();
+ }
+ }
+ },
+
+ popupNotEnabled: function () {
+ TbSync.dump("Oops", "Trying to open account manager, but init sequence not yet finished");
+ let msg = TbSync.getString("OopsMessage") + "\n\n";
+ let v = Services.appinfo.platformVersion;
+ if (TbSync.prefs.getIntPref("log.userdatalevel") == 0) {
+ if (TbSync.window.confirm(msg + TbSync.getString("UnableToTraceError"))) {
+ TbSync.prefs.setIntPref("log.userdatalevel", 1);
+ TbSync.window.alert(TbSync.getString("RestartThunderbirdAndTryAgain"));
+ }
+ } else {
+ if (TbSync.window.confirm(msg + TbSync.getString("HelpFixStartupError"))) {
+ this.createBugReport("john.bieling@gmx.de", msg, "");
+ }
+ }
+ },
+
+ openTBtab: function (url) {
+ let tabmail = TbSync.window.document.getElementById("tabmail");
+ if (TbSync.window && tabmail) {
+ TbSync.window.focus();
+ return tabmail.openTab("contentTab", {
+ url
+ });
+ }
+ return null;
+ },
+
+ openTranslatedLink: function (url) {
+ let googleCode = TbSync.getString("google.translate.code");
+ if (googleCode != "en" && googleCode != "google.translate.code") {
+ this.openLink("https://translate.google.com/translate?hl=en&sl=en&tl="+TbSync.getString("google.translate.code")+"&u="+url);
+ } else {
+ this.openLink(url);
+ }
+ },
+
+ openLink: function (url) {
+ let ioservice = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
+ let uriToOpen = ioservice.newURI(url, null, null);
+ let extps = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"].getService(Components.interfaces.nsIExternalProtocolService);
+ extps.loadURI(uriToOpen, null);
+ },
+
+ openBugReportWizard: function () {
+ if (!TbSync.debugMode) {
+ this.prefWindowObj.alert(TbSync.getString("NoDebugLog"));
+ } else {
+ this.prefWindowObj.openDialog("chrome://tbsync/content/manager/support-wizard/support-wizard.xhtml", "support-wizard", "dialog,centerscreen,chrome,resizable=no");
+ }
+ },
+
+ createBugReport: function (email, subject, description) {
+ let fields = Components.classes["@mozilla.org/messengercompose/composefields;1"].createInstance(Components.interfaces.nsIMsgCompFields);
+ let params = Components.classes["@mozilla.org/messengercompose/composeparams;1"].createInstance(Components.interfaces.nsIMsgComposeParams);
+
+ fields.to = email;
+ fields.subject = "TbSync " + TbSync.addon.version.toString() + " bug report: " + subject;
+ fields.body = "Hi,\n\n" +
+ "attached you find my debug.log for the following error:\n\n" +
+ description;
+
+ params.composeFields = fields;
+ params.format = Components.interfaces.nsIMsgCompFormat.PlainText;
+
+ let attachment = Components.classes["@mozilla.org/messengercompose/attachment;1"].createInstance(Components.interfaces.nsIMsgAttachment);
+ attachment.contentType = "text/plain";
+ attachment.url = 'file://' + TbSync.io.getAbsolutePath("debug.log");
+ attachment.name = "debug.log";
+ attachment.temporary = false;
+
+ params.composeFields.addAttachment(attachment);
+ MailServices.compose.OpenComposeWindowWithParams (null, params);
+ },
+
+ viewDebugLog: function() {
+
+ if (this.debugLogWindow && this.debugLogWindow.tabNode) {
+ let tabmail = TbSync.window.document.getElementById("tabmail");
+ try {
+ tabmail.closeTab(this.debugLogWindow);
+ } catch (e) {
+ // nope
+ }
+ this.debugLogWindow = null;
+ }
+ this.debugLogWindow = this.openTBtab('file://' + TbSync.io.getAbsolutePath("debug.log"));
+ },
+}
+
+
+
+/**
+ * Functions used by the folderlist in the main account settings tab
+ */
+manager.FolderList = class {
+ /**
+ * @param {string} provider Identifier for the provider this FolderListView is created for.
+ */
+ constructor(provider) {
+ this.provider = provider
+ }
+
+ /**
+ * Is called before the context menu of the folderlist is shown, allows to
+ * show/hide custom menu options based on selected folder
+ *
+ * @param document [in] document object of the account settings window - element.ownerDocument - menuentry?
+ * @param folderData [in] FolderData of the selected folder
+ */
+ onContextMenuShowing(window, folderData) {
+ return TbSync.providers[this.provider].StandardFolderList.onContextMenuShowing(window, folderData);
+ }
+
+
+ /**
+ * Returns an array of attribute objects, which define the number of columns
+ * and the look of the header
+ */
+ getHeader() {
+ return [
+ {style: "font-weight:bold;", label: "", width: "93"},
+ {style: "font-weight:bold;", label: TbSync.getString("manager.resource"), width:"150"},
+ {style: "font-weight:bold;", label: TbSync.getString("manager.status"), flex :"1"},
+ ]
+ }
+
+
+ /**
+ * Is called to add a row to the folderlist. After this call, updateRow is called as well.
+ *
+ * @param document [in] document object of the account settings window
+ * @param folderData [in] FolderData of the folder in the row
+ */
+ getRow(document, folderData) {
+ //create checkBox for select state
+ let itemSelCheckbox = document.createXULElement("checkbox");
+ itemSelCheckbox.setAttribute("updatefield", "selectbox");
+ itemSelCheckbox.setAttribute("style", "margin: 0px 0px 0px 3px;");
+ itemSelCheckbox.addEventListener("command", this.toggleFolder);
+
+ //icon
+ let itemType = document.createXULElement("image");
+ itemType.setAttribute("src", TbSync.providers[this.provider].StandardFolderList.getTypeImage(folderData));
+ itemType.setAttribute("style", "margin: 0px 9px 0px 3px;");
+
+ //ACL
+ let roAttributes = TbSync.providers[this.provider].StandardFolderList.getAttributesRoAcl(folderData);
+ let rwAttributes = TbSync.providers[this.provider].StandardFolderList.getAttributesRwAcl(folderData);
+ let itemACL = document.createXULElement("button");
+ itemACL.setAttribute("image", "chrome://tbsync/content/skin/acl_" + (folderData.getFolderProperty("downloadonly") ? "ro" : "rw") + ".png");
+ itemACL.setAttribute("class", "plain");
+ itemACL.setAttribute("style", "width: 35px; min-width: 35px; margin: 0; height:26px");
+ itemACL.setAttribute("updatefield", "acl");
+ if (roAttributes && rwAttributes) {
+ itemACL.setAttribute("type", "menu");
+ let menupopup = document.createXULElement("menupopup");
+ {
+ let menuitem = document.createXULElement("menuitem");
+ menuitem.downloadonly = false;
+ menuitem.setAttribute("class", "menuitem-iconic");
+ menuitem.setAttribute("image", "chrome://tbsync/content/skin/acl_rw2.png");
+ menuitem.addEventListener("command", this.updateReadOnly);
+ for (const [attr, value] of Object.entries(rwAttributes)) {
+ menuitem.setAttribute(attr, value);
+ }
+ menupopup.appendChild(menuitem);
+ }
+
+ {
+ let menuitem = document.createXULElement("menuitem");
+ menuitem.downloadonly = true;
+ menuitem.setAttribute("class", "menuitem-iconic");
+ menuitem.setAttribute("image", "chrome://tbsync/content/skin/acl_ro2.png");
+ menuitem.addEventListener("command", this.updateReadOnly);
+ for (const [attr, value] of Object.entries(roAttributes)) {
+ menuitem.setAttribute(attr, value);
+ }
+ menupopup.appendChild(menuitem);
+ }
+ itemACL.appendChild(menupopup);
+ }
+
+ //folder name
+ let itemLabel = document.createXULElement("description");
+ itemLabel.setAttribute("updatefield", "foldername");
+
+ //status
+ let itemStatus = document.createXULElement("description");
+ itemStatus.setAttribute("updatefield", "status");
+
+ //group1
+ let itemHGroup1 = document.createXULElement("hbox");
+ itemHGroup1.setAttribute("align", "center");
+ itemHGroup1.appendChild(itemSelCheckbox);
+ itemHGroup1.appendChild(itemType);
+ if (itemACL) itemHGroup1.appendChild(itemACL);
+
+ let itemVGroup1 = document.createXULElement("vbox");
+ //itemVGroup1.setAttribute("width", "93");
+ itemVGroup1.setAttribute("style", "width: 93px");
+ itemVGroup1.appendChild(itemHGroup1);
+
+ //group2
+ let itemHGroup2 = document.createXULElement("hbox");
+ itemHGroup2.setAttribute("align", "center");
+ itemHGroup2.setAttribute("style", "border: 1px center");
+ itemHGroup2.appendChild(itemLabel);
+
+ let itemVGroup2 = document.createXULElement("vbox");
+ //itemVGroup2.setAttribute("width", "150");
+ itemVGroup2.setAttribute("style", "padding: 3px; width: 150px");
+ itemVGroup2.appendChild(itemHGroup2);
+
+ //group3
+ let itemHGroup3 = document.createXULElement("hbox");
+ itemHGroup3.setAttribute("align", "center");
+ itemHGroup3.appendChild(itemStatus);
+
+ let itemVGroup3 = document.createXULElement("vbox");
+ //itemVGroup3.setAttribute("width", "250");
+ itemVGroup3.setAttribute("style", "padding: 3px; width: 250px");
+ itemVGroup3.appendChild(itemHGroup3);
+
+ //final row
+ let row = document.createXULElement("hbox");
+ row.setAttribute("style", "min-height: 24px;");
+ row.appendChild(itemVGroup1);
+ row.appendChild(itemVGroup2);
+ row.appendChild(itemVGroup3);
+ return row;
+ }
+
+
+ /**
+ * ToggleFolder event
+ */
+ toggleFolder(event) {
+ let element = event.target;
+ let folderList = element.ownerDocument.getElementById("tbsync.accountsettings.folderlist");
+ if (folderList.selectedItem !== null && !folderList.disabled) {
+ // the folderData obj of the selected folder is attached to its row entry
+ let folder = folderList.selectedItem.folderData;
+
+ if (!folder.accountData.isEnabled())
+ return;
+
+ if (folder.getFolderProperty("selected")) {
+ // hasTarget() can throw an error, ignore that here
+ try {
+ if (!folder.targetData.hasTarget() || element.ownerDocument.defaultView.confirm(TbSync.getString("prompt.Unsubscribe"))) {
+ folder.targetData.removeTarget();
+ folder.setFolderProperty("selected", false);
+ } else {
+ if (element) {
+ //undo users action
+ element.setAttribute("checked", true);
+ }
+ }
+ } catch (e) {
+ folder.setFolderProperty("selected", false);
+ Components.utils.reportError(e);
+ }
+ } else {
+ //select and update status
+ folder.setFolderProperty("selected", true);
+ folder.setFolderProperty("status", "aborted");
+ folder.accountData.setAccountProperty("status", "notsyncronized");
+ }
+ Services.obs.notifyObservers(null, "tbsync.observer.manager.updateSyncstate", folder.accountID);
+ }
+ }
+
+ /**
+ * updateReadOnly event
+ */
+ updateReadOnly(event) {
+ let element = event.target;
+ let folderList = element.ownerDocument.getElementById("tbsync.accountsettings.folderlist");
+ if (folderList.selectedItem !== null && !folderList.disabled) {
+ //the folderData obj of the selected folder is attached to its row entry
+ let folder = folderList.selectedItem.folderData;
+
+ //update value
+ let value = element.downloadonly;
+ folder.setFolderProperty("downloadonly", value);
+
+ //update icon
+ let button = element.parentNode.parentNode;
+ if (value) {
+ button.setAttribute('image','chrome://tbsync/content/skin/acl_ro.png');
+ } else {
+ button.setAttribute('image','chrome://tbsync/content/skin/acl_rw.png');
+ }
+
+ folder.targetData.setReadOnly(value);
+ }
+ }
+
+ /**
+ * Is called to update a row of the folderlist (the first cell is a select checkbox inserted by TbSync)
+ *
+ * @param document [in] document object of the account settings window
+ * @param listItem [in] the listitem of the row, which needs to be updated
+ * @param folderData [in] FolderData for that row
+ */
+ updateRow(document, listItem, folderData) {
+ let foldername = TbSync.providers[this.provider].StandardFolderList.getFolderDisplayName(folderData);
+ let status = folderData.getFolderStatus();
+ let selected = folderData.getFolderProperty("selected");
+
+ // get updatefields
+ let fields = {}
+ for (let f of listItem.querySelectorAll("[updatefield]")) {
+ fields[f.getAttribute("updatefield")] = f;
+ }
+
+ // update fields
+ fields.foldername.setAttribute("disabled", !selected);
+ fields.foldername.setAttribute("style", selected ? "" : "font-style:italic");
+ if (fields.foldername.textContent != foldername) {
+ fields.foldername.textContent = foldername;
+ fields.foldername.flex = "1";
+ }
+
+ fields.status.setAttribute("style", selected ? "" : "font-style:italic");
+ if (fields.status.textContent != status) {
+ fields.status.textContent = status;
+ fields.status.flex = "1";
+ }
+
+ if (fields.hasOwnProperty("acl")) {
+ fields.acl.setAttribute("image", "chrome://tbsync/content/skin/acl_" + (folderData.getFolderProperty("downloadonly") ? "ro" : "rw") + ".png");
+ fields.acl.setAttribute("disabled", folderData.accountData.isSyncing());
+ }
+
+ // update selectbox
+ let selbox = fields.selectbox;
+ if (selbox) {
+ if (folderData.getFolderProperty("selected")) {
+ selbox.setAttribute("checked", true);
+ } else {
+ selbox.removeAttribute("checked");
+ }
+
+ if (folderData.accountData.isSyncing()) {
+ selbox.setAttribute("disabled", true);
+ } else {
+ selbox.removeAttribute("disabled");
+ }
+ }
+ }
+}