From ba494835767bd2db0265c8b1a472432ce1ee696d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Mon, 20 Nov 2017 19:10:23 +0100 Subject: Prevent import if no addressbook is available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add notify on contact import from addressbook Fix Groups update on enabling/disabling Changed default ab to first that is writtable instead of first of the list Signed-off-by: John Molakvoæ (skjnldsv) --- .../contactDetails/contactDetails_controller.js | 2 +- .../contactImport/contactImport_controller.js | 13 ++++++++-- js/models/contact_model.js | 1 - js/services/addressBook_service.js | 15 ++++++++--- js/services/contact_service.js | 29 ++++++++++++++++++---- templates/contactImport.html | 7 +++--- 6 files changed, 52 insertions(+), 15 deletions(-) diff --git a/js/components/contactDetails/contactDetails_controller.js b/js/components/contactDetails/contactDetails_controller.js index 2ae56181..3b728726 100644 --- a/js/components/contactDetails/contactDetails_controller.js +++ b/js/components/contactDetails/contactDetails_controller.js @@ -76,7 +76,7 @@ angular.module('contactsApp') }; ctrl.deleteContact = function() { - ContactService.delete(ctrl.contact); + ContactService.delete(ctrl.addressBook, ctrl.contact); }; ctrl.addField = function(field) { diff --git a/js/components/contactImport/contactImport_controller.js b/js/components/contactImport/contactImport_controller.js index 2d01a254..8901cf93 100644 --- a/js/components/contactImport/contactImport_controller.js +++ b/js/components/contactImport/contactImport_controller.js @@ -1,11 +1,12 @@ angular.module('contactsApp') -.controller('contactimportCtrl', function(ContactService, AddressBookService) { +.controller('contactimportCtrl', function(ContactService, AddressBookService, $timeout, $scope) { var ctrl = this; ctrl.t = { importText : t('contacts', 'Import into'), importingText : t('contacts', 'Importing...'), - selectAddressbook : t('contacts', 'Select your addressbook') + selectAddressbook : t('contacts', 'Select your addressbook'), + importdisabled : t('contacts', 'Import is disabled because no writable address book had been found.') }; ctrl.import = ContactService.import.bind(ContactService); @@ -20,6 +21,14 @@ angular.module('contactsApp') ctrl.selectedAddressBook = AddressBookService.getDefaultAddressBook(); }); + AddressBookService.registerObserverCallback(function() { + $timeout(function() { + $scope.$apply(function() { + ctrl.selectedAddressBook = AddressBookService.getDefaultAddressBook(); + }); + }); + }); + ctrl.stopHideMenu = function(isOpen) { if(isOpen) { // disabling settings bind diff --git a/js/models/contact_model.js b/js/models/contact_model.js index 4d418ad8..1adc88be 100644 --- a/js/models/contact_model.js +++ b/js/models/contact_model.js @@ -269,7 +269,6 @@ angular.module('contactsApp') this.data.url = addressBook.url + uid + '.vcf'; }, setAddressBook: function(addressBook) { - this.addressBook = addressBook; this.addressBookId = addressBook.displayName; this.data.url = addressBook.url + this.uid() + '.vcf'; }, diff --git a/js/services/addressBook_service.js b/js/services/addressBook_service.js index 23419e3e..f456866c 100644 --- a/js/services/addressBook_service.js +++ b/js/services/addressBook_service.js @@ -43,7 +43,7 @@ angular.module('contactsApp') }); }, - getGroups: function () { + getGroups: function() { return this.getAll().then(function(addressBooks) { return addressBooks.map(function (element) { return element.groups; @@ -53,8 +53,16 @@ angular.module('contactsApp') }); }, - getDefaultAddressBook: function() { - return addressBooks[0]; + getDefaultAddressBook: function(throwOC) { + var i = addressBooks.findIndex(function(addressBook) { + return addressBook.enabled && !addressBook.readOnly; + }); + if (i !== -1) { + return addressBooks[i]; + } else if(throwOC) { + OC.Notification.showTemporary(t('contacts', 'There is no address book available to create a contact.')); + } + return false; }, getAddressBook: function(displayName) { @@ -69,6 +77,7 @@ angular.module('contactsApp') resourcetype: res[0].props.resourcetype, syncToken: res[0].props.syncToken }); + notifyObservers('create', addressBook); return addressBook; }); }); diff --git a/js/services/contact_service.js b/js/services/contact_service.js index 977d168a..ffa0a30d 100644 --- a/js/services/contact_service.js +++ b/js/services/contact_service.js @@ -141,7 +141,6 @@ angular.module('contactsApp') groups[category] = groups[category] ? groups[category] + 1 : 1; }); }); - return _.keys(groups).map( function(key) { return new Group({ @@ -195,7 +194,13 @@ angular.module('contactsApp') }; this.create = function(newContact, addressBook, uid, fromImport) { - addressBook = addressBook || AddressBookService.getDefaultAddressBook(); + addressBook = addressBook || AddressBookService.getDefaultAddressBook(true); + + // No addressBook available + if(!addressBook) { + return; + } + if(addressBook.readOnly) { OC.Notification.showTemporary(t('contacts', 'You don\'t have permission to write to this addressbook.')); return; @@ -228,6 +233,7 @@ angular.module('contactsApp') ).then(function(xhr) { newContact.setETag(xhr.getResponseHeader('ETag')); contactsCache.put(newUid, newContact); + AddressBookService.addContact(addressBook, newContact); if (fromImport !== true) { notifyObservers('create', newUid); $('#details-fullName').select(); @@ -240,7 +246,12 @@ angular.module('contactsApp') }; this.import = function(data, type, addressBook, progressCallback) { - addressBook = addressBook || AddressBookService.getDefaultAddressBook(); + addressBook = addressBook || AddressBookService.getDefaultAddressBook(true); + + // No addressBook available + if(!addressBook) { + return; + } var regexp = /BEGIN:VCARD[\s\S]*?END:VCARD/mgi; var singleVCards = data.match(regexp); @@ -323,14 +334,18 @@ angular.module('contactsApp') }); }; - this.delete = function(contact) { + this.delete = function(addressBook, contact) { // delete contact from server return DavClient.deleteCard(contact.data).then(function() { contactsCache.remove(contact.uid()); + AddressBookService.removeContact(addressBook, contact); notifyObservers('delete', contact.uid()); }); }; + /* + * Delete all contacts present in the addressBook from the cache + */ this.removeContactsFromAddressbook = function(addressBook, callback) { angular.forEach(addressBook.contacts, function(contact) { contactsCache.remove(contact.uid()); @@ -339,6 +354,9 @@ angular.module('contactsApp') notifyObservers('groupsUpdate'); }; + /* + * Create and append contacts to the addressBook + */ this.appendContactsFromAddressbook = function(addressBook, callback) { // Addressbook has been initiated but contacts have not been fetched if (addressBook.objects === null) { @@ -350,13 +368,14 @@ angular.module('contactsApp') try { var contact = new Contact(addressBook, vcard); contactsCache.put(contact.uid(), contact); - addressBook.contacts.push(contact); + AddressBookService.addContact(addressBook, contact); } catch(error) { // eslint-disable-next-line no-console console.log('Invalid contact received: ', vcard, error); } }); } + notifyObservers('groupsUpdate'); if (typeof callback === 'function') { callback(); } diff --git a/templates/contactImport.html b/templates/contactImport.html index 4c24a3b8..f1220f6a 100644 --- a/templates/contactImport.html +++ b/templates/contactImport.html @@ -1,14 +1,15 @@ - {{$select.selected.displayName}} {{addressBook.displayName}} - \ No newline at end of file + +
{{ctrl.t.importdisabled}}
-- cgit v1.2.3