From 16f33037b7c5c2246dfc27bd6a500e8828f452e9 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 30 Nov 2016 12:56:43 +0100 Subject: [PATCH] Cleaned JS export code --- .idea/workspace.xml | 117 ++++++++++-------- js/data/Actions.js | 225 +++++++++++++++++++++++++++++++++++ js/plugin.contactimporter.js | 50 +------- js/ui/ContextMenu.js | 49 +------- 4 files changed, 296 insertions(+), 145 deletions(-) create mode 100644 js/data/Actions.js diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 624f8a5..c07d8a8 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,9 @@ - - - - + + + @@ -26,36 +25,44 @@ - - + + - - - - - - - - - - - - - - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + - + + @@ -75,8 +82,6 @@ @@ -253,6 +261,11 @@ + + + + + @@ -314,12 +327,12 @@ - + - @@ -491,14 +504,6 @@ - - - - - - - - @@ -518,14 +523,6 @@ - - - - - - - - @@ -591,8 +588,8 @@ - - + + @@ -600,6 +597,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/data/Actions.js b/js/data/Actions.js new file mode 100644 index 0000000..adf703e --- /dev/null +++ b/js/data/Actions.js @@ -0,0 +1,225 @@ +/** + * Actions.js, Kopano Webapp contact to vcf im/exporter + * + * Author: Christoph Haas + * Copyright (C) 2012-2016 Christoph Haas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +Ext.namespace('Zarafa.plugins.contactimporter.data'); + +/** + * @class Zarafa.plugins.contactimporter.data.Actions + * Common actions which can be used within {@link Ext.Button buttons} + * or other {@link Ext.Component components} with action handlers. + * @singleton + */ +Zarafa.plugins.contactimporter.data.Actions = { + /** + * Generates a request to download the selected records as vCard. + * + * @param storeId + * @param recordIds + */ + exportToVCF: function (storeId, recordIds, recordFolder) { + if ((typeof recordIds != "undefined" && recordIds.length < 1) || (typeof recordFolder != "undefined" && recordFolder.get('content_count') < 1)) { + Zarafa.common.dialogs.MessageBox.show({ + title: dgettext('plugin_contactimporter', 'Error'), + msg: dgettext('plugin_contactimporter', 'No contacts found. Export skipped!'), + icon: Zarafa.common.dialogs.MessageBox.ERROR, + buttons: Zarafa.common.dialogs.MessageBox.OK + }); + } else { + + var responseHandler = new Zarafa.plugins.contactimporter.data.ResponseHandler({ + successCallback: Zarafa.plugins.contactimporter.data.Actions.downloadVCF + }); + + var recordcount = 0; + var exportPayload = { + storeid: storeId, + records: undefined, + folder: undefined + }; + + if (typeof recordIds != "undefined") { + exportPayload.records = recordIds; + recordcount = recordIds.length; + } + + if (typeof recordFolder != "undefined") { + exportPayload.folder = recordFolder.get("entryid"); + recordcount = recordFolder.get('content_count'); + } + + // Notify user + // # TRANSLATORS: {0} will be replaced by the number of contacts that will be exported + container.getNotifier().notify('info', dgettext('plugin_contactimporter', 'Contact Export'), String.format(dgettext('plugin_contactimporter', 'Exporting {0} contacts. Please wait...'), recordcount)); + + + // request attachment preperation + container.getRequest().singleRequest( + 'contactmodule', + 'export', + exportPayload, + responseHandler + ); + } + }, + + /** + * Callback for the export request. + * @param {Object} response + */ + downloadVCF: function (response) { + if (response.status == false) { + Zarafa.common.dialogs.MessageBox.show({ + title: dgettext('plugin_contactimporter', 'Warning'), + msg: response.message, + icon: Zarafa.common.dialogs.MessageBox.WARNING, + buttons: Zarafa.common.dialogs.MessageBox.OK + }); + } else { + var downloadFrame = Ext.getBody().createChild({ + tag: 'iframe', + cls: 'x-hidden' + }); + + var url = document.URL; + var link = url.substring(0, url.lastIndexOf('/') + 1); + + link += "index.php?sessionid=" + container.getUser().getSessionId() + "&load=custom&name=download_vcf"; + link = Ext.urlAppend(link, "token=" + encodeURIComponent(response.download_token)); + link = Ext.urlAppend(link, "filename=" + encodeURIComponent(response.filename)); + + downloadFrame.dom.contentWindow.location = link; + } + }, + + /** + * Get all calendar folders. + * @param {boolean} asDropdownStore If true, a simple array store will be returned. + * @returns {*} + */ + getAllCalendarFolders: function (asDropdownStore) { + asDropdownStore = Ext.isEmpty(asDropdownStore) ? false : asDropdownStore; + + var allFolders = []; + + var inbox = container.getHierarchyStore().getDefaultStore(); + var pub = container.getHierarchyStore().getPublicStore(); + + if (!Ext.isEmpty(inbox.subStores) && inbox.subStores.folders.totalLength > 0) { + for (var i = 0; i < inbox.subStores.folders.totalLength; i++) { + var folder = inbox.subStores.folders.getAt(i); + if (!Ext.isEmpty(folder) && folder.get("container_class") == "IPF.Appointment") { + if (asDropdownStore) { + allFolders.push([ + folder.get("entryid"), + folder.get("display_name") + ]); + } else { + allFolders.push({ + display_name: folder.get("display_name"), + entryid: folder.get("entryid"), + store_entryid: folder.get("store_entryid"), + is_public: false + }); + } + } + } + } + + if (!Ext.isEmpty(pub.subStores) && pub.subStores.folders.totalLength > 0) { + for (var j = 0; j < pub.subStores.folders.totalLength; j++) { + var folder = pub.subStores.folders.getAt(j); + if (!Ext.isEmpty(folder) && folder.get("container_class") == "IPF.Appointment") { + if (asDropdownStore) { + allFolders.push([ + folder.get("entryid"), + folder.get("display_name") + " (Public)" + ]); + } else { + allFolders.push({ + display_name: folder.get("display_name"), + entryid: folder.get("entryid"), + store_entryid: folder.get("store_entryid"), + is_public: true + }); + } + } + } + } + + if (asDropdownStore) { + return allFolders.sort(Zarafa.plugins.contactimporter.data.Actions.dynamicSort(1)); + } else { + return allFolders; + } + }, + + /** + * Return a calendar folder element by name. + * @param {string} name + * @returns {*} + */ + getCalendarFolderByName: function (name) { + var folders = Zarafa.plugins.contactimporter.data.Actions.getAllCalendarFolders(false); + + for (var i = 0; i < folders.length; i++) { + if (folders[i].display_name == name) { + return folders[i]; + } + } + + return container.getHierarchyStore().getDefaultFolder('calendar'); + }, + + /** + * Return a calendar folder element by entryid. + * @param {string} entryid + * @returns {*} + */ + getCalendarFolderByEntryid: function (entryid) { + var folders = Zarafa.plugins.contactimporter.data.Actions.getAllCalendarFolders(false); + + for (var i = 0; i < folders.length; i++) { + if (folders[i].entryid == entryid) { + return folders[i]; + } + } + + return container.getHierarchyStore().getDefaultFolder('calendar'); + }, + + /** + * Dynamic sort function, sorts by property name. + * @param {string|int} property + * @returns {Function} + */ + dynamicSort: function (property) { + var sortOrder = 1; + if (property[0] === "-") { + sortOrder = -1; + property = property.substr(1); + } + return function (a, b) { + var result = (a[property].toLowerCase() < b[property].toLowerCase()) ? -1 : (a[property].toLowerCase() > b[property].toLowerCase()) ? 1 : 0; + return result * sortOrder; + } + } +}; diff --git a/js/plugin.contactimporter.js b/js/plugin.contactimporter.js index 2956920..9570c61 100644 --- a/js/plugin.contactimporter.js +++ b/js/plugin.contactimporter.js @@ -83,55 +83,7 @@ Zarafa.plugins.contactimporter.ImportPlugin = Ext.extend(Zarafa.core.Plugin, { recordIds.push(btn.records[i].get("entryid")); } - var responseHandler = new Zarafa.plugins.contactimporter.data.ResponseHandler({ - successCallback: this.downloadVCF, - scope: this - }); - - // Notify user - // # TRANSLATORS: {0} will be replaced by the number of contacts that will be exported - container.getNotifier().notify('info', dgettext('plugin_contactimporter', 'Contact Export'), String.format(dgettext('plugin_contactimporter', 'Exporting {0} contacts. Please wait...'), recordIds.length)); - - - // request attachment preperation - container.getRequest().singleRequest( - 'contactmodule', - 'export', - { - storeid: btn.records[0].get("store_entryid"), - records: recordIds - }, - responseHandler - ); - }, - - /** - * Callback for the export request. - * @param {Object} response - */ - downloadVCF: function (response) { - if (response.status == false) { - Zarafa.common.dialogs.MessageBox.show({ - title: dgettext('plugin_contactimporter', 'Warning'), - msg: response.message, - icon: Zarafa.common.dialogs.MessageBox.WARNING, - buttons: Zarafa.common.dialogs.MessageBox.OK - }); - } else { - var downloadFrame = Ext.getBody().createChild({ - tag: 'iframe', - cls: 'x-hidden' - }); - - var url = document.URL; - var link = url.substring(0, url.lastIndexOf('/') + 1); - - link += "index.php?sessionid=" + container.getUser().getSessionId() + "&load=custom&name=download_vcf"; - link = Ext.urlAppend(link, "token=" + encodeURIComponent(response.download_token)); - link = Ext.urlAppend(link, "filename=" + encodeURIComponent(response.filename)); - - downloadFrame.dom.contentWindow.location = link; - } + Zarafa.plugins.contactimporter.data.Actions.exportToVCF(btn.records[0].get("store_entryid"), recordIds, undefined); }, /** diff --git a/js/ui/ContextMenu.js b/js/ui/ContextMenu.js index 1700995..b88b6e7 100644 --- a/js/ui/ContextMenu.js +++ b/js/ui/ContextMenu.js @@ -94,25 +94,7 @@ Zarafa.plugins.contactimporter.ui.ContextMenu = Ext.extend(Zarafa.hierarchy.ui.C * @private */ onContextItemExport: function () { - var responseHandler = new Zarafa.plugins.contactimporter.data.ResponseHandler({ - successCallback: this.downloadVCF, - scope: this - }); - - // Notify user - // # TRANSLATORS: {0} will be replaced by the number of contacts that will be exported - container.getNotifier().notify('info', dgettext('plugin_contactimporter', 'Contact Export'), String.format(dgettext('plugin_contactimporter', 'Exporting {0} contacts. Please wait...'), this.records.get('content_count'))); - - // request attachment preperation - container.getRequest().singleRequest( - 'contactmodule', - 'export', - { - storeid: this.records.get("store_entryid"), - folder: this.records.get("entryid") - }, - responseHandler - ); + Zarafa.plugins.contactimporter.data.Actions.exportToVCF(this.records.get("store_entryid"), undefined, this.records); }, /** @@ -127,35 +109,6 @@ Zarafa.plugins.contactimporter.ui.ContextMenu = Ext.extend(Zarafa.hierarchy.ui.C }; Zarafa.core.data.UIFactory.openLayerComponent(componentType, undefined, config); - }, - - /** - * Callback for the export request. - * @param {Object} response - */ - downloadVCF: function (response) { - if (response.status == false) { - Zarafa.common.dialogs.MessageBox.show({ - title: dgettext('plugin_contactimporter', 'Warning'), - msg: response.message, - icon: Zarafa.common.dialogs.MessageBox.WARNING, - buttons: Zarafa.common.dialogs.MessageBox.OK - }); - } else { - var downloadFrame = Ext.getBody().createChild({ - tag: 'iframe', - cls: 'x-hidden' - }); - - var url = document.URL; - var link = url.substring(0, url.lastIndexOf('/') + 1); - - link += "index.php?sessionid=" + container.getUser().getSessionId() + "&load=custom&name=download_vcf"; - link = Ext.urlAppend(link, "token=" + encodeURIComponent(response.download_token)); - link = Ext.urlAppend(link, "filename=" + encodeURIComponent(response.filename)); - - downloadFrame.dom.contentWindow.location = link; - } } });