Add addressbook subscriptions widget

This commit is contained in:
Francis Lachapelle
2015-06-11 15:38:14 -04:00
parent 4016fdd430
commit 25b0d872c0
9 changed files with 194 additions and 65 deletions
+2 -2
View File
@@ -27,8 +27,8 @@
* @return a new Resource object
*/
Resource.$factory = ['$http', '$q', function($http, $q) {
return function(path, options) {
return new Resource($http, $q, path, options);
return function(path, activeUser, options) {
return new Resource($http, $q, path, activeUser, options);
};
}];
+27 -2
View File
@@ -19,7 +19,7 @@
User.factory = ['$q', 'sgSettings', 'sgResource', function($q, Settings, Resource) {
angular.extend(User, {
$q: $q,
$$resource: new Resource(Settings.baseURL)
$$resource: new Resource(Settings.baseURL, Settings.activeUser)
});
return User;
@@ -91,7 +91,7 @@
return data;
});
}
return deferred;
return deferred.promise;
};
/**
@@ -169,6 +169,31 @@
}
};
/**
* @function $folders
* @memberof User.prototype
* @desc Retrive the list of folders of a specific type
* @param {String} type - either 'contact' or 'calendar'
* @return a promise of the HTTP query result or the cached result
*/
User.prototype.$folders = function(type) {
var _this = this,
deferred = User.$q.defer(),
param = {type: type};
if (this.$$folders) {
deferred.resolve(this.$$folders);
}
else {
User.$$resource.userResource(this.uid).fetch(null, 'foldersSearch', param).then(function(data) {
_this.$$folders = data;
deferred.resolve(data);
console.debug(JSON.stringify(data, undefined, 2));
return data;
});
}
return deferred.promise;
};
/**
* @function $omit
* @memberof User.prototype
@@ -36,7 +36,7 @@
angular.extend(AddressBook, {
$q: $q,
$timeout: $timeout,
$$resource: new Resource(Settings.baseURL),
$$resource: new Resource(Settings.baseURL, Settings.activeUser),
$Card: Card,
$$Acl: Acl,
activeUser: Settings.activeUser
@@ -58,8 +58,11 @@
// Insert new addressbook at proper index
var sibling, i;
addressbook.isOwned = this.activeUser.isSuperUser || addressbook.owner == this.activeUser.login;
sibling = _.find(this.$addressbooks, function(o) {
return (o.isRemote || (o.id != 'personal' && o.name.localeCompare(addressbook.name) === 1));
return (o.isRemote || (o.id != 'personal'
&& o.isOwned == addressbook.isOwned
&& o.name.localeCompare(addressbook.name) === 1));
});
i = sibling ? _.indexOf(_.pluck(this.$addressbooks, 'id'), sibling.id) : 1;
this.$addressbooks.splice(i, 0, addressbook);
@@ -88,7 +91,7 @@
/**
* @memberOf AddressBook
* @desc Fetch list of cards and return an AddressBook instance
* @desc Fetch list of cards and return an AddressBook instance.
* @param {string} addressbookId - the addressbook identifier
* @returns an AddressBook object instance
*/
@@ -98,8 +101,32 @@
return new AddressBook(futureAddressBookData);
};
/* Instance methods */
/**
* @memberOf AddressBook
* @desc Subscribe to another user's addressbook and add it to the list of addressbooks.
* @param {String} uid - user id
* @param {String} path - path of folder for specified user
* @returns a promise of the HTTP query result
*/
AddressBook.$subscribe = function(uid, path) {
var _this = this;
return AddressBook.$$resource.userResource(uid).fetch(path, 'subscribe').then(function(addressbookData) {
var addressbook = new AddressBook(addressbookData);
if (!_.find(_this.$addressbooks, function(o) {
return o.id == addressbookData.id;
})) {
AddressBook.$add(addressbook);
}
return addressbook;
});
};
/**
* @function $id
* @memberof AddressBook.prototype
* @desc Resolve the addressbook id.
* @returns a promise of the addressbook id
*/
AddressBook.prototype.$id = function() {
return this.$futureAddressBookData.then(function(data) {
return data.id;
@@ -166,15 +193,21 @@
AddressBook.prototype.$delete = function() {
var _this = this,
d = AddressBook.$q.defer();
AddressBook.$$resource.remove(this.id)
.then(function() {
var i = _.indexOf(_.pluck(AddressBook.$addressbooks, 'id'), _this.id);
AddressBook.$addressbooks.splice(i, 1);
d.resolve(true);
}, function(data, status) {
d.reject(data);
});
d = AddressBook.$q.defer(),
promise;
if (this.isOwned)
promise = AddressBook.$$resource.remove(this.id);
else
promise = AddressBook.$$resource.fetch(this.id, 'unsubscribe');
promise.then(function() {
var i = _.indexOf(_.pluck(AddressBook.$addressbooks, 'id'), _this.id);
AddressBook.$addressbooks.splice(i, 1);
d.resolve(true);
}, function(data, status) {
d.reject(data);
});
return d.promise;
};
+41 -16
View File
@@ -131,7 +131,8 @@
{
name: name,
isEditable: true,
isRemote: false
isRemote: false,
owner: UserLogin
}
);
AddressBook.$add(addressbook);
@@ -164,20 +165,34 @@
}
};
$scope.confirmDelete = function() {
Dialog.confirm(l('Warning'), l('Are you sure you want to delete the addressbook <em>%{0}</em>?',
$rootScope.addressbook.name))
.then(function(res) {
if (res) {
$rootScope.addressbook.$delete()
.then(function() {
$rootScope.addressbook = null;
}, function(data, status) {
Dialog.alert(l('An error occured while deleting the addressbook "%{0}".',
$rootScope.addressbook.name),
l(data.error));
});
}
});
if ($scope.addressbook.isOwned) {
Dialog.confirm(l('Warning'), l('Are you sure you want to delete the addressbook <em>%{0}</em>?',
$scope.addressbook.name))
.then(function(res) {
if (res) {
$rootScope.addressbook.$delete()
.then(function() {
$rootScope.addressbook = null;
}, function(data, status) {
Dialog.alert(l('An error occured while deleting the addressbook "%{0}".',
$rootScope.addressbook.name),
l(data.error));
});
}
});
}
else {
// Unsubscribe without confirmation
$rootScope.addressbook.$delete()
.then(function() {
$rootScope.addressbook = null;
}, function(data, status) {
Dialog.alert(l('An error occured while deleting the addressbook "%{0}".',
$rootScope.addressbook.name),
l(data.error));
});
}
};
$scope.importCards = function() {
@@ -187,7 +202,7 @@
};
$scope.share = function() {
var modal = $modal.open({
templateUrl: stateAddressbook.id + '/aclsTemplate',
templateUrl: stateAddressbook.id + '/aclsTemplate', // UI/Templates/UIxAclEditor.wox
resolve: {
modalUsers: function() {
return stateAddressbook.$acl.$users();
@@ -266,6 +281,16 @@
}
$scope.search.lastFilter = $scope.search.filter;
};
/**
* subscribeToFolder - Callback of sgSubscribe directive
*/
$scope.subscribeToFolder = function(addressbookData) {
console.debug('subscribeToFolder ' + addressbookData.owner + addressbookData.name);
AddressBook.$subscribe(addressbookData.owner, addressbookData.name).catch(function(data) {
Dialog.alert(l('Warning'), l('An error occured please try again.'));
});
};
}])
/**
+10 -4
View File
@@ -9,7 +9,13 @@
angular.module('SOGo.ContactsUI', ['ionic', 'SOGo.Common', 'SOGo.UIMobile'])
.constant('sgSettings', {
baseURL: ApplicationBaseURL
baseURL: ApplicationBaseURL,
activeUser: {
login: UserLogin,
language: UserLanguage,
folderURL: UserFolderURL,
isSuperUser: IsSuperUser
}
})
.run(function($ionicPlatform) {
@@ -52,9 +58,9 @@
templateUrl: 'addressbook.html',
controller: 'AddressBookCtrl',
resolve: {
stateAddressbook: function($stateParams, sgAddressBook) {
return sgAddressBook.$find($stateParams.addressbookId);
}
stateAddressbook: ['$stateParams', 'sgAddressBook', function($stateParams, AddressBook) {
return AddressBook.$find($stateParams.addressbookId);
}]
}
}
}