Files
sogo/UI/WebServerResources/js/Contacts/addressbook-model.js
2015-06-11 15:19:21 -04:00

136 lines
4.6 KiB
JavaScript

(function() {
'use strict';
function AddressBook(futureAddressBookData) {
/* DATA IS IMMEDIATELY AVAILABLE */
if (typeof futureAddressBookData.then !== 'function') {
angular.extend(this, futureAddressBookData);
return;
}
/* THE PROMISE WILL BE UNWRAPPED FIRST */
this.$unwrap(futureAddressBookData);
}
/* THE FACTORY WE'LL USE TO REGISTER WITH ANGULAR */
AddressBook.$factory = ['$timeout', 'sgSettings', 'sgResource', 'sgContact', function($timeout, Settings, Resource, Contact) {
angular.extend(AddressBook, {
$$resource: new Resource(Settings.baseURL),
$timeout: $timeout,
$Contact: Contact
});
return AddressBook; // return constructor
}];
/* ANGULAR MODULE REGISTRATION */
angular.module('SOGo').factory('sgAddressBook', AddressBook.$factory);
// AddressBook.$selectedId = function(addressbook_id) {
// if (addressbook_id) angular.extend(AddressBook, { $selected_id: addressbook_id });
// console.debug("selected id = " + AddressBook.$selected_id);
// return AddressBook.$selected_id;
// };
/* Fetch list of contacts */
AddressBook.$find = function(addressbook_id) {
var futureAddressBookData = this.$$resource.find(addressbook_id); // should return attributes of addressbook +
// AddressBook.$selectedId(addressbook_id);
return new AddressBook(futureAddressBookData);
};
// Instance methods
AddressBook.prototype.$id = function() {
var self = this;
return this.$futureAddressBookData.then(function(data) {
return data.id;
});
};
AddressBook.prototype.$getContact = function(contact_id) {
var self = this;
// return this.$futureAddressBookData.then(function(data) {
// return data.id;
// }).then(function(addressbook_id) {
return this.$id().then(function(addressbook_id) {
var contact = AddressBook.$Contact.$find(addressbook_id, contact_id);
AddressBook.$timeout(function() {
self.contact = contact;
});
return contact.$futureContactData.then(function() {
return self.contact;
});
});
};
AddressBook.prototype.$resetContact = function() {
this.$getContact(this.contact.id);
};
AddressBook.prototype.$viewerIsActive = function(editMode) {
return (typeof this.contact != "undefined" && !editMode);
};
// AddressBook.prototype.$getContacts = function() {
// var self = this;
// return AddressBook.$timeout(function() {
// var contacts = [];
// angular.forEach(self.contacts, function(addressBookContact, index) {
// var contact = AddressBook.$Contact.$find(addressBookContact.c_name);
// angular.extend(contact, addressBookContact); // useless?
// this.push(contact);
// }, contacts);
// AddressBook.$timeout(function() {
// self.contacts = contacts;
// });
// var futureContactData = [];
// angular.forEach(contacts, function(contact, index) {
// this.push(contact.$futureContactData);
// }, futureContactData);
// return this._q.all(futureContactData).then(function() {
// //self.$$emitter.emit('update');
// return self.contacts;
// });
// });
// };
// Unwrap a promise
AddressBook.prototype.$unwrap = function(futureAddressBookData) {
var self = this;
this.$futureAddressBookData = futureAddressBookData;
this.$futureAddressBookData.then(function(data) {
// The success callback. Calling _.extend from $timeout will wrap it into a try/catch call
// and return a promise.
AddressBook.$timeout(function() { angular.extend(self, data); });
});
};
// $omit returns a sanitized object used to send to the server
AddressBook.prototype.$omit = function() {
var addressbook = {};
angular.forEach(this, function(value, key) {
if (key != 'constructor' &&
key != 'contact' &&
key != 'contacts' &&
key[0] != '$') {
addressbook[key] = value;
}
});
console.debug(angular.toJson(addressbook));
return addressbook;
};
AddressBook.prototype.$save = function() {
return AddressBook.$$resource.set(this.id, this.$omit()).then(function (data) {
return data;
});
};
})();