diff options
Diffstat (limited to '')
-rw-r--r-- | content/manager/editAccount.js | 391 |
1 files changed, 391 insertions, 0 deletions
diff --git a/content/manager/editAccount.js b/content/manager/editAccount.js new file mode 100644 index 0000000..ff4db50 --- /dev/null +++ b/content/manager/editAccount.js @@ -0,0 +1,391 @@ +/* + * 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 { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); +var { TbSync } = ChromeUtils.import("chrome://tbsync/content/tbsync.jsm"); + +var tbSyncAccountSettings = { + + accountID: null, + provider: null, + settings: null, + updateTimer: Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer), + + updateFolderListObserver: { + observe: function (aSubject, aTopic, aData) { + //only run if is request for this account and main frame is visible + let accountID = aData; + if (accountID == tbSyncAccountSettings.accountID && !document.getElementById('tbsync.accountsettings.frame').hidden) { + //make sure, folderlist is visible, otherwise our updates will be discarded (may cause errors) + tbSyncAccountSettings.updateFolderList(); + tbSyncAccountSettings.updateGui(); + } + } + }, + + reloadAccountSettingObserver: { + observe: function (aSubject, aTopic, aData) { + //only run if is request for this account and main frame is visible + let data = JSON.parse(aData); + if (data.accountID == tbSyncAccountSettings.accountID && !document.getElementById('tbsync.accountsettings.frame').hidden) { + tbSyncAccountSettings.reloadSetting(data.setting); + } + } + }, + + updateGuiObserver: { + observe: function (aSubject, aTopic, aData) { + //only run if is request for this account and main frame is visible + let accountID = aData; + if (accountID == tbSyncAccountSettings.accountID && !document.getElementById('tbsync.accountsettings.frame').hidden) { + tbSyncAccountSettings.updateGui(); + } + } + }, + + updateSyncstateObserver: { + observe: function (aSubject, aTopic, aData) { + //only run if is request for this account and main frame is visible + let accountID = aData; + if (accountID == tbSyncAccountSettings.accountID && !document.getElementById('tbsync.accountsettings.frame').hidden) { + let syncstate = TbSync.core.getSyncDataObject(accountID).getSyncState().state; + if (syncstate == "accountdone") { + tbSyncAccountSettings.updateGui(); + } else { + tbSyncAccountSettings.updateSyncstate(); + } + } + } + }, + + onload: function () { + //load observers + Services.obs.addObserver(tbSyncAccountSettings.updateFolderListObserver, "tbsync.observer.manager.updateFolderList", false); + Services.obs.addObserver(tbSyncAccountSettings.updateGuiObserver, "tbsync.observer.manager.updateAccountSettingsGui", false); + Services.obs.addObserver(tbSyncAccountSettings.reloadAccountSettingObserver, "tbsync.observer.manager.reloadAccountSetting", false); + Services.obs.addObserver(tbSyncAccountSettings.updateSyncstateObserver, "tbsync.observer.manager.updateSyncstate", false); + //get the selected account from the loaded URI + tbSyncAccountSettings.accountID = window.location.toString().split("id=")[1]; + tbSyncAccountSettings.accountData = new TbSync.AccountData(tbSyncAccountSettings.accountID); + + //get information for that acount + tbSyncAccountSettings.provider = TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, "provider"); + tbSyncAccountSettings.settings = Object.keys(TbSync.providers.getDefaultAccountEntries(tbSyncAccountSettings.provider)).sort(); + + //add header to folderlist + let header = TbSync.providers[tbSyncAccountSettings.provider].folderList.getHeader(); + let folderlistHeader = window.document.getElementById('tbsync.accountsettings.folderlist.header'); + for (let h=0; h < header.length; h++) { + let listheader = window.document.createXULElement("treecol"); + for (let a in header[h]) { + if (header[h].hasOwnProperty(a)) { + listheader.setAttribute(a, header[h][a]); + } + } + folderlistHeader.appendChild(listheader); + } + + //load overlays from the provider (if any) + TbSync.messenger.overlayManager.injectAllOverlays(window, "chrome://tbsync/content/manager/editAccount.xhtml?provider=" + tbSyncAccountSettings.provider); + if (window.tbSyncEditAccountOverlay && window.tbSyncEditAccountOverlay.hasOwnProperty("onload")) { + tbSyncEditAccountOverlay.onload(window, new TbSync.AccountData(tbSyncAccountSettings.accountID)); + } + tbSyncAccountSettings.loadSettings(); + + //done, folderlist must be updated while visible + document.getElementById('tbsync.accountsettings.frame').hidden = false; + tbSyncAccountSettings.updateFolderList(); + + if (Services.appinfo.OS == "Darwin") { //we might need to find a way to detect MacOS like styling, other themes move the header bar into the tabpanel as well + document.getElementById('manager.tabpanels').style["padding-top"] = "3ex"; + } + }, + + + onunload: function () { + tbSyncAccountSettings.updateTimer.cancel(); + if (!document.getElementById('tbsync.accountsettings.frame').hidden) { + Services.obs.removeObserver(tbSyncAccountSettings.updateFolderListObserver, "tbsync.observer.manager.updateFolderList"); + Services.obs.removeObserver(tbSyncAccountSettings.updateGuiObserver, "tbsync.observer.manager.updateAccountSettingsGui"); + Services.obs.removeObserver(tbSyncAccountSettings.reloadAccountSettingObserver, "tbsync.observer.manager.reloadAccountSetting"); + Services.obs.removeObserver(tbSyncAccountSettings.updateSyncstateObserver, "tbsync.observer.manager.updateSyncstate"); + } + }, + + + folderListVisible: function () { + let box = document.getElementById('tbsync.accountsettings.folderlist').getBoundingClientRect(); + let visible = box.width && box.height; + return visible; + }, + + + reloadSetting: function (setting) { + let pref = document.getElementById("tbsync.accountsettings.pref." + setting); + let label = document.getElementById("tbsync.accountsettings.label." + setting); + + if (pref) { + //is this a checkbox? + if ((pref.tagName == "checkbox") || ((pref.tagName == "input") && (pref.type == "checkbox"))) { + //BOOL + if (TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, setting)) pref.setAttribute("checked", true); + else pref.removeAttribute("checked"); + } else { + //Not BOOL + pref.value = TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, setting); + } + } + }, + + + /** + * Run through all defined TbSync settings and if there is a corresponding + * field in the settings dialog, fill it with the stored value. + */ + loadSettings: function () { + for (let i=0; i < tbSyncAccountSettings.settings.length; i++) { + let pref = document.getElementById("tbsync.accountsettings.pref." + tbSyncAccountSettings.settings[i]); + let label = document.getElementById("tbsync.accountsettings.label." + tbSyncAccountSettings.settings[i]); + + if (pref) { + //is this a checkbox? + let event = "blur"; + if ((pref.tagName == "checkbox") || ((pref.tagName == "input") && (pref.type == "checkbox"))) { + //BOOL + if (TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, tbSyncAccountSettings.settings[i])) pref.setAttribute("checked", true); + else pref.removeAttribute("checked"); + event = "command"; + } else { + //Not BOOL + if (pref.tagName == "menulist") { + pref.value = TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, tbSyncAccountSettings.settings[i]); + event = "command"; + } else { + pref.setAttribute("value", TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, tbSyncAccountSettings.settings[i])); + } + } + + pref.addEventListener(event, function() {tbSyncAccountSettings.instantSaveSetting(this)}); + } + } + + tbSyncAccountSettings.updateGui(); + }, + + updateGui: function () { + let status = TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, "status"); + + let isConnected = TbSync.core.isConnected(tbSyncAccountSettings.accountID); + let isEnabled = TbSync.core.isEnabled(tbSyncAccountSettings.accountID); + let isSyncing = TbSync.core.isSyncing(tbSyncAccountSettings.accountID); + + { //disable settings if connected or syncing + let items = document.getElementsByClassName("lockIfConnected"); + for (let i=0; i < items.length; i++) { + if (isConnected || isSyncing || items[i].getAttribute("alwaysDisabled") == "true") { + items[i].setAttribute("disabled", true); + items[i].style["color"] = "darkgrey"; + } else { + items[i].removeAttribute("disabled"); + items[i].style["color"] = "black"; + } + } + } + + document.getElementById('tbsync.accountsettings.connectbtn.container').hidden = !(isEnabled && !isConnected && !isSyncing); + //currently we use a fixed button which is hidden during sync + //document.getElementById('tbsync.accountsettings.connectbtn').label = TbSync.getString("manager." + (isSyncing ? "connecting" : "tryagain")); + + { //show elements if connected (this also hides/unhides the folderlist) + let items = document.getElementsByClassName("showIfConnected"); + for (let i=0; i < items.length; i++) { + items[i].hidden = !isConnected; + } + } + + { //show elements if enabled + let items = document.getElementsByClassName("showIfEnabled"); + for (let i=0; i < items.length; i++) { + items[i].hidden = !isEnabled; + } + } + + document.getElementById('tbsync.accountsettings.enabled').checked = isEnabled; + document.getElementById('tbsync.accountsettings.enabled').disabled = isSyncing; + document.getElementById('tbsync.accountsettings.folderlist').disabled = isSyncing; + document.getElementById('tbsync.accountsettings.syncbtn').disabled = isSyncing; + document.getElementById('tbsync.accountsettings.connectbtn').disabled = isSyncing; + + tbSyncAccountSettings.updateSyncstate(); + + //change color of syncstate according to status + let showEventLogButton = false; + switch (status) { + case "success": + case "disabled": + case "syncing": + document.getElementById("syncstate").removeAttribute("style"); + break; + + case "notsyncronized": + document.getElementById("syncstate").setAttribute("style","color: red"); + break; + + default: + document.getElementById("syncstate").setAttribute("style","color: red"); + showEventLogButton = TbSync.eventlog.get(tbSyncAccountSettings.accountID).length > 0; + } + document.getElementById('tbsync.accountsettings.eventlogbtn').hidden = !showEventLogButton; + }, + + updateSyncstate: function () { + tbSyncAccountSettings.updateTimer.cancel(); + + // if this account is beeing synced, display syncstate, otherwise print status + let status = TbSync.db.getAccountProperty(tbSyncAccountSettings.accountID, "status"); + let isSyncing = TbSync.core.isSyncing(tbSyncAccountSettings.accountID); + let isConnected = TbSync.core.isConnected(tbSyncAccountSettings.accountID); + let isEnabled = TbSync.core.isEnabled(tbSyncAccountSettings.accountID); + let syncdata = TbSync.core.getSyncDataObject(tbSyncAccountSettings.accountID); + + if (isSyncing) { + let accounts = TbSync.db.getAccounts().data; + + let s = syncdata.getSyncState(); + let syncstate = s.state; + let synctime = s.timestamp; + + let msg = TbSync.getString("syncstate." + syncstate, tbSyncAccountSettings.provider); + + if (syncstate.split(".")[0] == "send") { + // append timeout countdown + let diff = Date.now() - synctime; + if (diff > 2000) msg = msg + " (" + Math.round((TbSync.providers[tbSyncAccountSettings.provider].Base.getConnectionTimeout(tbSyncAccountSettings.accountData) - diff)/1000) + "s)"; + // re-schedule update, if this is a waiting syncstate + tbSyncAccountSettings.updateTimer.init(tbSyncAccountSettings.updateSyncstate, 1000, 0); + } + document.getElementById("syncstate").textContent = msg; + } else { + let localized = TbSync.getString("status." + (isEnabled ? status : "disabled"), tbSyncAccountSettings.provider); + document.getElementById("syncstate").textContent = localized; + } + + + if (tbSyncAccountSettings.folderListVisible()) { + //update syncstates of folders in folderlist, if visible - remove obsolete entries while we are here + let folderData = TbSync.providers[tbSyncAccountSettings.provider].Base.getSortedFolders(tbSyncAccountSettings.accountData); + let folderList = document.getElementById("tbsync.accountsettings.folderlist"); + + for (let i=folderList.getRowCount()-1; i>=0; i--) { + let item = folderList.getItemAtIndex(i); + if (folderData.filter(f => f.folderID == item.folderData.folderID).length == 0) { + item.remove(); + } else { + TbSync.providers[tbSyncAccountSettings.provider].folderList.updateRow(document, item, item.folderData); + } + } + } + }, + + updateFolderList: function () { + //get updated list of folderIDs + let folderData = TbSync.providers[tbSyncAccountSettings.provider].Base.getSortedFolders(tbSyncAccountSettings.accountData); + + //remove entries from folderlist, which no longer exists and build reference array with current elements + let folderList = document.getElementById("tbsync.accountsettings.folderlist"); + folderList.hidden=true; + + let foldersElements = {}; + for (let i=folderList.getRowCount()-1; i>=0; i--) { + if (folderData.filter(f => f.folderID == folderList.getItemAtIndex(i).folderData.folderID).length == 0) { + folderList.getItemAtIndex(i).remove(); + } else { + foldersElements[folderList.getItemAtIndex(i).folderData.folderID] = folderList.getItemAtIndex(i); + } + } + + //update folderlist + for (let i=0; i < folderData.length; i++) { + let nextItem = null; + + //if this entry does not exist, create it + if (foldersElements.hasOwnProperty(folderData[i].folderID)) { + //get reference to current element + nextItem = foldersElements[folderData[i].folderID]; + } else { + //add new entry, attach FolderData of this folder as folderData + nextItem = document.createXULElement("richlistitem"); + nextItem.folderData = folderData[i]; + + //add row + nextItem.appendChild(TbSync.providers[tbSyncAccountSettings.provider].folderList.getRow(document, folderData[i])); + } + + //add/move row and update its content + let addedItem = folderList.appendChild(nextItem); + TbSync.providers[tbSyncAccountSettings.provider].folderList.updateRow(document, addedItem, folderData[i]); + + //ensureElementIsVisible also forces internal update of rowCount, which sometimes is not updated automatically upon appendChild + folderList.ensureElementIsVisible(addedItem); + } + folderList.hidden = false; + }, + + + + + + instantSaveSetting: function (field) { + let setting = field.id.replace("tbsync.accountsettings.pref.",""); + let value = ""; + + if ((field.tagName == "checkbox") || ((field.tagName == "input") && (field.type == "checkbox"))) { + if (field.checked) value = true; + else value = false; + } else { + value = field.value; + } + TbSync.db.setAccountProperty(tbSyncAccountSettings.accountID, setting, value); + + if (setting == "accountname") { + Services.obs.notifyObservers(null, "tbsync.observer.manager.updateAccountName", tbSyncAccountSettings.accountID + ":" + field.value); + } + TbSync.db.saveAccounts(); //write modified accounts to disk + }, + + toggleEnableState: function (element) { + if (!TbSync.core.isConnected(tbSyncAccountSettings.accountID)) { + //if not connected, we can toggle without prompt + Services.obs.notifyObservers(null, "tbsync.observer.manager.toggleEnableState", tbSyncAccountSettings.accountID); + return; + } + + if (window.confirm(TbSync.getString("prompt.Disable"))) { + Services.obs.notifyObservers(null, "tbsync.observer.manager.toggleEnableState", tbSyncAccountSettings.accountID); + } else { + //invalid, toggle checkbox back + element.setAttribute("checked", true); + } + }, + + + onFolderListContextMenuShowing: function () { + let folderList = document.getElementById("tbsync.accountsettings.folderlist"); + let aFolderIsSelected = (!folderList.disabled && folderList.selectedItem !== null && folderList.selectedItem.value !== undefined); + let menupopup = document.getElementById("tbsync.accountsettings.FolderListContextMenu"); + + if (aFolderIsSelected) { + TbSync.providers[tbSyncAccountSettings.provider].folderList.onContextMenuShowing(window, folderList.selectedItem.folderData); + } else { + TbSync.providers[tbSyncAccountSettings.provider].folderList.onContextMenuShowing(window, null); + } + }, + +}; |