summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2017-11-20 19:10:23 +0100
committerJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2017-11-21 16:00:05 +0100
commitba494835767bd2db0265c8b1a472432ce1ee696d (patch)
tree1deee4a0347f96e40040dd1d420691dac2fa0f47
parent2bc57687a399cf143b8be56edd485c579d09e273 (diff)
Prevent import if no addressbook is available
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) <skjnldsv@protonmail.com>
-rw-r--r--js/components/contactDetails/contactDetails_controller.js2
-rw-r--r--js/components/contactImport/contactImport_controller.js13
-rw-r--r--js/models/contact_model.js1
-rw-r--r--js/services/addressBook_service.js15
-rw-r--r--js/services/contact_service.js29
-rw-r--r--templates/contactImport.html7
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 @@
<input type="file" id="contact-import" class="hidden-visually" multiple />
<label for="contact-import" class="button {{ctrl.loadingClass}}" ng-class="{'no-select': ctrl.addressBooks.length === 1}" id="upload"
- ng-if="!(ctrl.addressBooks.length===1 && ctrl.addressBooks[0].readOnly)">
+ ng-if="ctrl.addressBooks.length > 0 && ctrl.selectedAddressBook">
{{ctrl.importText}}
<span ng-if="ctrl.addressBooks.length === 1 && !ctrl.importing" ng-class="{'icon-loading-small': ctrl.loading}">{{ctrl.selectedAddressBook.displayName}}</span>
</label>
-<ui-select ng-model="ctrl.selectedAddressBook" ng-if="ctrl.addressBooks.length > 1" search-enabled="ctrl.addressBooks.length > 4"
+<ui-select ng-model="ctrl.selectedAddressBook" ng-if="ctrl.addressBooks.length > 1 && ctrl.selectedAddressBook" search-enabled="ctrl.addressBooks.length > 4"
theme="select2" class="form-control" title="{{ctrl.t.selectAddressbook}}"
uis-open-close="ctrl.stopHideMenu(isOpen)" ng-class="{'icon-loading-small': ctrl.loading}">
<ui-select-match placeholder="{{ctrl.t.selectAddressbook}}">{{$select.selected.displayName}}</ui-select-match>
<ui-select-choices repeat="addressBook in ctrl.addressBooks | filter: {readOnly: false} | filter: {displayName: $select.search}">
{{addressBook.displayName}}
</ui-select-choices>
-</ui-select> \ No newline at end of file
+</ui-select>
+<div ng-if="ctrl.addressBooks.length === 0 || !ctrl.selectedAddressBook">{{ctrl.t.importdisabled}}</div>