sogo/UI/WebServerResources/js/Contacts.js.map
2016-01-04 15:59:01 -05:00

1 line
44 KiB
Plaintext

{"version":3,"sources":["Contacts/Contacts.app.js","Contacts/AddressBookController.js","Contacts/AddressBooksController.js","Contacts/CardController.js","Contacts/sgAddress.directive.js"],"names":["configure","$stateProvider","$urlRouterProvider","state","url","abstract","views","addressbooks","templateUrl","controller","controllerAs","resolve","stateAddressbooks","addressbook","stateAddressbook","card","stateCard","stateNewCard","template","card@app.addressbook","otherwise","AddressBook","$findAll","window","contactFolders","$q","$state","$stateParams","_","find","id","addressbookId","$reload","reject","Card","tag","contactType","pid","c_component","selectedCard","cardId","$getCard","runBlock","$rootScope","$log","$on","event","toState","toParams","fromState","fromParams","error","go","current","previous","rejection","angular","module","config","run","$inject","AddressBookController","$scope","$timeout","$mdDialog","Account","Dialog","Settings","selectCard","toggleCardSelection","$event","selected","preventDefault","stopPropagation","newComponent","ev","ComponentDialogController","scope","create","type","hide","show","parent","element","document","body","targetEvent","clickOutsideToClose","escapeToClose","l","join","locals","vm","selectedFolder","notSelectedComponent","currentCard","unselectCards","each","cards","confirmDeleteSelectedCards","confirm","then","selectedCards","filter","$deleteCards","data","status","saveSelectedCards","selectedUIDs","pluck","location","href","ApplicationBaseURL","copySelectedCards","folder","$copyCards","alert","selectAll","sort","field","$filter","sortedBy","$query","cancelSearch","mode","search","newMessage","recipients","accounts","account","o","$getMailboxes","mailboxes","$newMessage","message","stateAccounts","stateMessage","stateRecipients","newMessageWithRecipient","recipient","fn","full","newMessageWithSelectedCards","promises","c_mail","length","push","c_cn","isDefined","refs","ref","email","$futureCardData","all","this","service","AddressBooksController","$mdToast","$mdMedia","$mdSidenav","FileUploader","focus","User","select","params","editMode","value","close","newAddressbook","prompt","name","isEditable","isRemote","owner","UserLogin","$add","edit","originalAddressbook","extend","$omit","revertEditing","save","$rename","confirmDelete","isSubscription","$delete","response","statusText","importCards","CardsImportDialogController","filterByExtension","item","isTextFile","indexOf","test","position","hideDelay","uploader","autoUpload","queueLimit","filters","onSuccessItem","headers","msg","imported","simple","content","onErrorItem","exportCards","showLinks","LinksDialogController","showProperties","PropertiesDialogController","srcAddressBook","saveProperties","$save","init","cancel","share","$acl","$users","usersWithACL","users","subscribeToFolder","addressbookData","console","debug","$subscribe","activeUser","CardController","addOrgUnit","i","$addOrgUnit","addBirthday","birthday","Date","addScreenName","$addScreenName","addEmail","$addEmail","addPhone","$addPhone","addUrl","$addUrl","addAddress","$addAddress","addMember","$addMember","userFilter","excludedCards","dry","excludeLists","$cards","form","$valid","copy","err","log","reset","$reset","isNew","$fullname","ok","exportCard","currentFolder","toggleRawSource","showRawSource","rawSource","$$resource","post","allEmailTypes","$EMAIL_TYPES","allTelTypes","$TEL_TYPES","allUrlTypes","$URL_TYPES","allAddressTypes","$ADDRESS_TYPES","categories","userFilterResults","sgAddress","restrict","addressLines","lines","locality_region","street","street2","locality","region","country","postalcode","directive"],"mappings":"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","file":"Contacts.js","sourcesContent":["/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* JavaScript for SOGoContacts */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.ContactsUI', ['ui.router', 'angularFileUpload', 'ck', 'SOGo.Common', 'SOGo.PreferencesUI', 'SOGo.MailerUI'])\n .config(configure)\n .run(runBlock);\n\n /**\n * @ngInject\n */\n configure.$inject = ['$stateProvider', '$urlRouterProvider'];\n function configure($stateProvider, $urlRouterProvider) {\n $stateProvider\n .state('app', {\n url: '/addressbooks',\n abstract: true,\n views: {\n addressbooks: {\n templateUrl: 'UIxContactFoldersView', // UI/Templates/Contacts/UIxContactFoldersView.wox\n controller: 'AddressBooksController',\n controllerAs: 'app'\n }\n },\n resolve: {\n stateAddressbooks: stateAddressbooks\n }\n })\n .state('app.addressbook', {\n url: '/:addressbookId',\n views: {\n addressbook: {\n templateUrl: 'addressbook',\n controller: 'AddressBookController',\n controllerAs: 'addressbook'\n }\n },\n resolve: {\n stateAddressbook: stateAddressbook\n }\n })\n .state('app.addressbook.new', {\n url: '/{contactType:(?:card|list)}/new',\n views: {\n card: {\n templateUrl: 'UIxContactEditorTemplate', // UI/Templates/Contacts/UIxContactEditorTemplate.wox\n controller: 'CardController',\n controllerAs: 'editor'\n }\n },\n resolve: {\n stateCard: stateNewCard\n }\n })\n .state('app.addressbook.card', {\n url: '/:cardId',\n abstract: true,\n views: {\n card: {\n template: '<ui-view/>'\n }\n },\n resolve: {\n stateCard: stateCard\n }\n })\n .state('app.addressbook.card.view', {\n url: '/view',\n views: {\n 'card@app.addressbook': {\n templateUrl: 'UIxContactViewTemplate', // UI/Templates/Contacts/UIxContactViewTemplate.wox\n controller: 'CardController',\n controllerAs: 'editor'\n }\n }\n })\n .state('app.addressbook.card.editor', {\n url: '/edit',\n views: {\n 'card@app.addressbook': {\n templateUrl: 'UIxContactEditorTemplate', // UI/Templates/Contacts/UIxContactEditorTemplate.wox\n controller: 'CardController',\n controllerAs: 'editor'\n }\n }\n });\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/addressbooks/personal');\n }\n\n /**\n * @ngInject\n */\n stateAddressbooks.$inject = ['AddressBook'];\n function stateAddressbooks(AddressBook) {\n return AddressBook.$findAll(window.contactFolders);\n }\n\n /**\n * @ngInject\n */\n stateAddressbook.$inject = ['$q', '$state', '$stateParams', 'AddressBook'];\n function stateAddressbook($q, $state, $stateParams, AddressBook) {\n var addressbook = _.find(AddressBook.$findAll(), function(addressbook) {\n return addressbook.id == $stateParams.addressbookId;\n });\n if (addressbook) {\n addressbook.$reload();\n return addressbook;\n }\n return $q.reject('Addressbook ' + $stateParams.addressbookId + ' not found');\n }\n\n /**\n * @ngInject\n */\n stateNewCard.$inject = ['$stateParams', 'stateAddressbook', 'Card'];\n function stateNewCard($stateParams, stateAddressbook, Card) {\n var tag = 'v' + $stateParams.contactType,\n card = new Card({ pid: $stateParams.addressbookId, c_component: tag });\n stateAddressbook.selectedCard = true;\n return card;\n }\n\n /**\n * @ngInject\n */\n stateCard.$inject = ['$stateParams', 'stateAddressbook'];\n function stateCard($stateParams, stateAddressbook) {\n stateAddressbook.selectedCard = $stateParams.cardId;\n return stateAddressbook.$getCard($stateParams.cardId);\n }\n\n /**\n * @ngInject\n */\n runBlock.$inject = ['$rootScope', '$log', '$state'];\n function runBlock($rootScope, $log, $state) {\n $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {\n $log.error(error);\n $state.go('app.addressbook', { addressbookId: 'personal' });\n });\n $rootScope.$on('$routeChangeError', function(event, current, previous, rejection) {\n $log.error(event, current, previous, rejection);\n });\n }\n\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @ngInject\n */\n AddressBookController.$inject = ['$scope', '$q', '$state', '$timeout', '$mdDialog', 'Account', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'stateAddressbooks', 'stateAddressbook'];\n function AddressBookController($scope, $q, $state, $timeout, $mdDialog, Account, Card, AddressBook, Dialog, Settings, stateAddressbooks, stateAddressbook) {\n var vm = this;\n\n AddressBook.selectedFolder = stateAddressbook;\n\n vm.service = AddressBook;\n vm.selectedFolder = stateAddressbook;\n vm.selectCard = selectCard;\n vm.toggleCardSelection = toggleCardSelection;\n vm.newComponent = newComponent;\n vm.notSelectedComponent = notSelectedComponent;\n vm.unselectCards = unselectCards;\n vm.confirmDeleteSelectedCards = confirmDeleteSelectedCards;\n vm.saveSelectedCards = saveSelectedCards;\n vm.copySelectedCards = copySelectedCards;\n vm.selectAll = selectAll;\n vm.sort = sort;\n vm.sortedBy = sortedBy;\n vm.cancelSearch = cancelSearch;\n vm.newMessage = newMessage;\n vm.newMessageWithSelectedCards = newMessageWithSelectedCards;\n vm.newMessageWithRecipient = newMessageWithRecipient;\n vm.mode = { search: false };\n \n function selectCard(card) {\n $state.go('app.addressbook.card.view', {addressbookId: stateAddressbook.id, cardId: card.id});\n }\n \n function toggleCardSelection($event, card) {\n card.selected = !card.selected;\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n function newComponent(ev) {\n $mdDialog.show({\n parent: angular.element(document.body),\n targetEvent: ev,\n clickOutsideToClose: true,\n escapeToClose: true,\n template: [\n '<md-dialog aria-label=\"' + l('Create component') + '\">',\n ' <md-dialog-content>',\n ' <div layout=\"column\">',\n ' <md-button ng-click=\"create(\\'card\\')\">',\n ' ' + l('Contact'),\n ' </md-button>',\n ' <md-button ng-click=\"create(\\'list\\')\">',\n ' ' + l('List'),\n ' </md-button>',\n ' </div>',\n ' </md-dialog-content>',\n '</md-dialog>'\n ].join(''),\n locals: {\n addressbookId: vm.selectedFolder.id\n },\n controller: ComponentDialogController\n });\n \n /**\n * @ngInject\n */\n ComponentDialogController.$inject = ['scope', '$mdDialog', '$state', 'addressbookId'];\n function ComponentDialogController(scope, $mdDialog, $state, addressbookId) {\n scope.create = function(type) {\n $mdDialog.hide();\n $state.go('app.addressbook.new', { addressbookId: addressbookId, contactType: type });\n };\n }\n }\n\n function notSelectedComponent(currentCard, type) {\n return (currentCard && currentCard.c_component == type && !currentCard.selected);\n }\n\n function unselectCards() {\n _.each(vm.selectedFolder.cards, function(card) { card.selected = false; });\n }\n \n function confirmDeleteSelectedCards() {\n Dialog.confirm(l('Warning'),\n l('Are you sure you want to delete the selected contacts?'))\n .then(function() {\n // User confirmed the deletion\n var selectedCards = _.filter(vm.selectedFolder.cards, function(card) { return card.selected; });\n vm.selectedFolder.$deleteCards(selectedCards);\n delete vm.selectedFolder.selectedCard;\n }, function(data, status) {\n // Delete failed\n });\n }\n\n function saveSelectedCards() {\n var selectedCards = _.filter(vm.selectedFolder.cards, function(card) { return card.selected; });\n var selectedUIDs = _.pluck(selectedCards, 'id');\n window.location.href = ApplicationBaseURL + '/' + vm.selectedFolder.id + '/export?uid=' + selectedUIDs.join('&uid=');\n }\n\n function copySelectedCards(folder) {\n var selectedCards = _.filter(vm.selectedFolder.cards, function(card) { return card.selected; });\n vm.selectedFolder.$copyCards(selectedCards, folder).then(function() {\n // TODO: refresh target addressbook?\n }, function(error) {\n Dialog.alert(l('Error'), error);\n });\n }\n\n function selectAll() {\n _.each(vm.selectedFolder.cards, function(card) {\n card.selected = true;\n });\n }\n\n function sort(field) {\n vm.selectedFolder.$filter('', { sort: field });\n }\n\n function sortedBy(field) {\n return AddressBook.$query.sort == field;\n }\n\n function cancelSearch() {\n vm.mode.search = false;\n vm.selectedFolder.$filter('');\n }\n\n function newMessage($event, recipients) {\n Account.$findAll().then(function(accounts) {\n var account = _.filter(accounts, function(o) {\n if (o.id === 0)\n return o;\n })[0];\n\n // We must initialize the Account with its mailbox\n // list before proceeding with message's creation\n account.$getMailboxes().then(function(mailboxes) {\n account.$newMessage().then(function(message) {\n $mdDialog.show({\n parent: angular.element(document.body),\n targetEvent: $event,\n clickOutsideToClose: false,\n escapeToClose: false,\n templateUrl: '../Mail/UIxMailEditor',\n controller: 'MessageEditorController',\n controllerAs: 'editor',\n locals: {\n stateAccounts: accounts,\n stateMessage: message,\n stateRecipients: recipients\n }\n });\n });\n });\n });\n }\n\n function newMessageWithRecipient($event, recipient, fn) {\n var recipients = [{full: fn + ' <' + recipient + '>'}];\n vm.newMessage($event, recipients);\n $event.stopPropagation();\n $event.preventDefault();\n }\n\n function newMessageWithSelectedCards($event) {\n var selectedCards = _.filter(vm.selectedFolder.cards, function(card) { return card.selected; });\n var promises = [], recipients = [];\n\n _.each(selectedCards, function(card) {\n if (card.c_component == 'vcard' && card.c_mail.length) {\n recipients.push({full: card.c_cn + ' <' + card.c_mail + '>'});\n }\n else if (card.c_component == 'vlist') {\n // If the list's members were already fetch, use them\n if (angular.isDefined(card.refs) && card.refs.length) {\n _.each(card.refs, function(ref) {\n if (ref.email.length)\n recipients.push({full: ref.c_cn + ' <' + ref.email + '>'});\n });\n }\n else {\n promises.push(vm.selectedFolder.$getCard(card.id).then(function(card) {\n return card.$futureCardData.then(function(data) {\n _.each(data.refs, function(ref) {\n if (ref.email.length)\n recipients.push({full: ref.c_cn + ' <' + ref.email + '>'});\n });\n });\n }));\n }\n }\n });\n\n $q.all(promises).then(function() {\n if (recipients.length)\n vm.newMessage($event, recipients);\n });\n }\n }\n\n angular\n .module('SOGo.ContactsUI') \n .controller('AddressBookController', AddressBookController); \n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @ngInject\n */\n AddressBooksController.$inject = ['$state', '$scope', '$rootScope', '$stateParams', '$timeout', '$mdDialog', '$mdToast', '$mdMedia', '$mdSidenav', 'FileUploader', 'sgFocus', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'User', 'stateAddressbooks'];\n function AddressBooksController($state, $scope, $rootScope, $stateParams, $timeout, $mdDialog, $mdToast, $mdMedia, $mdSidenav, FileUploader, focus, Card, AddressBook, Dialog, Settings, User, stateAddressbooks) {\n var vm = this;\n\n vm.activeUser = Settings.activeUser;\n vm.service = AddressBook;\n vm.select = select;\n vm.newAddressbook = newAddressbook;\n vm.edit = edit;\n vm.revertEditing = revertEditing;\n vm.save = save;\n vm.confirmDelete = confirmDelete;\n vm.importCards = importCards;\n vm.exportCards = exportCards;\n vm.showLinks = showLinks;\n vm.showProperties = showProperties;\n vm.share = share;\n vm.subscribeToFolder = subscribeToFolder;\n\n function select($event, folder) {\n if ($state.params.addressbookId != folder.id &&\n vm.editMode != folder.id) {\n vm.editMode = false;\n AddressBook.$query.value = '';\n // Close sidenav on small devices\n if ($mdMedia('xs'))\n $mdSidenav('left').close();\n $state.go('app.addressbook', {addressbookId: folder.id});\n }\n else {\n $event.preventDefault();\n $event.stopPropagation();\n }\n }\n\n function newAddressbook() {\n Dialog.prompt(l('New addressbook'),\n l('Name of new addressbook'))\n .then(function(name) {\n var addressbook = new AddressBook(\n {\n name: name,\n isEditable: true,\n isRemote: false,\n owner: UserLogin\n }\n );\n AddressBook.$add(addressbook);\n });\n }\n\n function edit(folder) {\n if (!folder.isRemote) {\n vm.editMode = folder.id;\n vm.originalAddressbook = angular.extend({}, folder.$omit());\n focus('addressBookName_' + folder.id);\n }\n }\n\n function revertEditing(folder) {\n folder.name = vm.originalAddressbook.name;\n vm.editMode = false;\n }\n\n function save(folder) {\n var name = folder.name;\n if (name && name.length > 0 && name != vm.originalAddressbook.name) {\n folder.$rename(name)\n .then(function(data) {\n vm.editMode = false;\n }, function(data, status) {\n Dialog.alert(l('Warning'), data);\n });\n }\n }\n\n function confirmDelete() {\n if (vm.service.selectedFolder.isSubscription) {\n // Unsubscribe without confirmation\n vm.service.selectedFolder.$delete()\n .then(function() {\n vm.service.selectedFolder = null;\n $state.go('app.addressbook', { addressbookId: 'personal' });\n }, function(data, status) {\n Dialog.alert(l('An error occured while deleting the addressbook \"%{0}\".',\n vm.service.selectedFolder.name),\n l(data.error));\n });\n }\n else {\n Dialog.confirm(l('Warning'), l('Are you sure you want to delete the addressbook <em>%{0}</em>?',\n vm.service.selectedFolder.name))\n .then(function() {\n return vm.service.selectedFolder.$delete();\n })\n .then(function() {\n vm.service.selectedFolder = null;\n return true;\n })\n .catch(function(response) {\n var message = response.data.message || response.statusText;\n Dialog.alert(l('An error occured while deleting the addressbook \"%{0}\".',\n vm.service.selectedFolder.name),\n message);\n });\n }\n }\n\n function importCards($event, folder) {\n $mdDialog.show({\n parent: angular.element(document.body),\n targetEvent: $event,\n clickOutsideToClose: true,\n escapeToClose: true,\n templateUrl: 'UIxContactsImportDialog',\n controller: CardsImportDialogController,\n controllerAs: '$CardsImportDialogController',\n locals: {\n folder: folder\n }\n });\n\n /**\n * @ngInject\n */\n CardsImportDialogController.$inject = ['scope', '$mdDialog', 'folder'];\n function CardsImportDialogController(scope, $mdDialog, folder) {\n var vm = this;\n\n vm.uploader = new FileUploader({\n url: ApplicationBaseURL + [folder.id, 'import'].join('/'),\n autoUpload: true,\n queueLimit: 1,\n filters: [{ name: filterByExtension, fn: filterByExtension }],\n onSuccessItem: function(item, response, status, headers) {\n var msg;\n\n $mdDialog.hide();\n\n if (response.imported === 0)\n msg = l('No card was imported.');\n else {\n msg = l('A total of %{0} cards were imported in the addressbook.', response.imported);\n AddressBook.selectedFolder.$reload();\n }\n\n $mdToast.show(\n $mdToast.simple()\n .content(msg)\n .position('top right')\n .hideDelay(3000));\n },\n onErrorItem: function(item, response, status, headers) {\n $mdToast.show({\n template: [\n '<md-toast>',\n ' <div class=\"md-toast-content\">',\n ' <md-icon class=\"md-warn md-hue-1\">error_outline</md-icon>',\n ' <span>' + l('An error occured while importing contacts.') + '</span>',\n ' </div>',\n '</md-toast>'\n ].join(''),\n position: 'top right',\n hideDelay: 3000\n });\n }\n });\n\n vm.close = function() {\n $mdDialog.hide();\n };\n\n function filterByExtension(item) {\n var isTextFile = item.type.indexOf('text') === 0 ||\n /\\.(ldif|vcf|vcard)$/.test(item.name);\n\n if (!isTextFile)\n $mdToast.show({\n template: [\n '<md-toast>',\n ' <div class=\"md-toast-content\">',\n ' <md-icon class=\"md-warn md-hue-1\">error_outline</md-icon>',\n ' <span>' + l('Select a vCard or LDIF file.') + '</span>',\n ' </div>',\n '</md-toast>'\n ].join(''),\n position: 'top right',\n hideDelay: 3000\n });\n\n return isTextFile;\n }\n }\n }\n\n function exportCards() {\n window.location.href = ApplicationBaseURL + '/' + vm.service.selectedFolder.id + '/exportFolder';\n }\n\n function showLinks(addressbook) {\n $mdDialog.show({\n parent: angular.element(document.body),\n clickOutsideToClose: true,\n escapeToClose: true,\n templateUrl: addressbook.id + '/links',\n controller: LinksDialogController,\n controllerAs: 'links',\n locals: {\n addressbook: addressbook\n }\n });\n \n /**\n * @ngInject\n */\n LinksDialogController.$inject = ['$mdDialog', 'addressbook'];\n function LinksDialogController($mdDialog, addressbook) {\n var vm = this;\n this.addressbook = addressbook;\n this.close = close;\n\n function close() {\n $mdDialog.hide();\n }\n }\n }\n\n function showProperties(addressbook) {\n $mdDialog.show({\n templateUrl: addressbook.id + '/properties',\n controller: PropertiesDialogController,\n controllerAs: 'properties',\n clickOutsideToClose: true,\n escapeToClose: true,\n locals: {\n srcAddressBook: addressbook\n }\n }).catch(function() {\n // Do nothing\n });\n\n /**\n * @ngInject\n */\n PropertiesDialogController.$inject = ['$scope', '$mdDialog', 'srcAddressBook'];\n function PropertiesDialogController($scope, $mdDialog, srcAddressBook) {\n var vm = this;\n\n vm.addressbook = new AddressBook(srcAddressBook.$omit());\n vm.saveProperties = saveProperties;\n vm.close = close;\n\n function saveProperties() {\n vm.addressbook.$save().then(function() {\n // Refresh list instance\n srcAddressBook.init(vm.addressbook.$omit());\n $mdDialog.hide();\n }, function() {\n // TODO handle error\n });\n }\n\n function close() {\n $mdDialog.cancel();\n }\n }\n }\n\n function share(addressbook) {\n // Fetch list of ACL users\n addressbook.$acl.$users().then(function() {\n // Show ACL editor\n $mdDialog.show({\n templateUrl: addressbook.id + '/UIxAclEditor', // UI/Templates/UIxAclEditor.wox\n controller: 'AclController', // from the ng module SOGo.Common\n controllerAs: 'acl',\n clickOutsideToClose: true,\n escapeToClose: true,\n locals: {\n usersWithACL: addressbook.$acl.users,\n User: User,\n folder: addressbook\n }\n });\n });\n }\n\n /**\n * subscribeToFolder - Callback of sgSubscribe directive\n */\n function subscribeToFolder(addressbookData) {\n console.debug('subscribeToFolder ' + addressbookData.owner + addressbookData.name);\n AddressBook.$subscribe(addressbookData.owner, addressbookData.name).then(function(data) {\n $mdToast.show(\n $mdToast.simple()\n .content(l('Sucessfully subscribed to address book'))\n .position('top right')\n .hideDelay(3000));\n });\n }\n }\n\n angular\n .module('SOGo.ContactsUI')\n .controller('AddressBooksController', AddressBooksController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * Controller to view and edit a card\n * @ngInject\n */\n CardController.$inject = ['$scope', '$timeout', '$mdDialog', 'AddressBook', 'Card', 'Dialog', 'sgFocus', '$state', '$stateParams', 'stateCard'];\n function CardController($scope, $timeout, $mdDialog, AddressBook, Card, Dialog, focus, $state, $stateParams, stateCard) {\n var vm = this;\n\n vm.card = stateCard;\n\n vm.currentFolder = AddressBook.selectedFolder;\n vm.allEmailTypes = Card.$EMAIL_TYPES;\n vm.allTelTypes = Card.$TEL_TYPES;\n vm.allUrlTypes = Card.$URL_TYPES;\n vm.allAddressTypes = Card.$ADDRESS_TYPES;\n vm.categories = {};\n vm.userFilterResults = [];\n vm.addOrgUnit = addOrgUnit;\n vm.addBirthday = addBirthday;\n vm.addScreenName = addScreenName;\n vm.addEmail = addEmail;\n vm.addPhone = addPhone;\n vm.addUrl = addUrl;\n vm.addAddress = addAddress;\n vm.addMember = addMember;\n vm.userFilter = userFilter;\n vm.save = save;\n vm.close = close;\n vm.reset = reset;\n vm.cancel = cancel;\n vm.confirmDelete = confirmDelete;\n vm.exportCard = exportCard;\n vm.toggleRawSource = toggleRawSource;\n vm.showRawSource = false;\n\n function addOrgUnit() {\n var i = vm.card.$addOrgUnit('');\n focus('orgUnit_' + i);\n }\n function addBirthday() {\n vm.card.birthday = new Date();\n }\n function addScreenName() {\n vm.card.$addScreenName('');\n }\n function addEmail() {\n var i = vm.card.$addEmail('');\n focus('email_' + i);\n }\n function addPhone() {\n var i = vm.card.$addPhone('');\n focus('phone_' + i);\n }\n function addUrl() {\n var i = vm.card.$addUrl('', '');\n focus('url_' + i);\n }\n function addAddress() {\n var i = vm.card.$addAddress('', '', '', '', '', '', '', '');\n focus('address_' + i);\n }\n function addMember() {\n var i = vm.card.$addMember('');\n focus('ref_' + i);\n }\n function userFilter($query, excludedCards) {\n AddressBook.selectedFolder.$filter($query, {dry: true, excludeLists: true}, excludedCards);\n return AddressBook.selectedFolder.$cards;\n }\n function save(form) {\n if (form.$valid) {\n vm.card.$save()\n .then(function(data) {\n var i = _.indexOf(_.pluck(AddressBook.selectedFolder.cards, 'id'), vm.card.id);\n if (i < 0) {\n // New card; reload contacts list and show addressbook in which the card has been created\n AddressBook.selectedFolder.$reload();\n }\n else {\n // Update contacts list with new version of the Card object\n AddressBook.selectedFolder.cards[i] = angular.copy(vm.card);\n }\n $state.go('app.addressbook.card.view', { cardId: vm.card.id });\n })\n .catch(function(err) {\n console.log(err);\n });\n }\n }\n function close() {\n $state.go('app.addressbook', { addressbookId: AddressBook.selectedFolder.id }).then(function() {\n vm.card = null;\n delete AddressBook.selectedFolder.selectedCard;\n });\n }\n function reset() {\n vm.card.$reset();\n }\n function cancel() {\n vm.card.$reset();\n if (vm.card.isNew) {\n // Cancelling the creation of a card\n vm.card = null;\n delete AddressBook.selectedFolder.selectedCard;\n $state.go('app.addressbook', { addressbookId: AddressBook.selectedFolder.id });\n }\n else {\n // Cancelling the edition of an existing card\n $state.go('app.addressbook.card.view', { cardId: vm.card.id });\n }\n }\n function confirmDelete(card) {\n Dialog.confirm(l('Warning'),\n l('Are you sure you want to delete the card of %{0}?', card.$fullname()),\n {ok: l('Yes'), cancel: l('No')})\n .then(function() {\n // User confirmed the deletion\n card.$delete()\n .then(function() {\n // Remove card from addressbook\n AddressBook.selectedFolder.cards = _.reject(AddressBook.selectedFolder.cards, function(o) {\n return o.id == card.id;\n });\n close();\n }, function(data, status) {\n Dialog.alert(l('Warning'), l('An error occured while deleting the card \"%{0}\".',\n card.$fullname()));\n });\n });\n }\n\n function exportCard() {\n window.location.href = ApplicationBaseURL + '/' + vm.currentFolder.id + '/export?uid=' + vm.card.id;\n }\n\n function toggleRawSource($event) {\n if (!vm.showRawSource && !vm.rawSource) {\n Card.$$resource.post(vm.currentFolder.id + '/' + vm.card.id, \"raw\").then(function(data) {\n vm.rawSource = data;\n vm.showRawSource = true;\n });\n }\n else {\n vm.showRawSource = !vm.showRawSource;\n }\n }\n }\n\n angular\n .module('SOGo.ContactsUI')\n .controller('CardController', CardController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @name sgAddress\n * @memberof ContactsUI\n * @desc Directive to format a postal address.\n * @ngInject\n */\n function sgAddress() {\n return {\n restrict: 'A',\n scope: { data: '=sgAddress' },\n controller: ['$scope', function($scope) {\n $scope.addressLines = function(data) {\n var lines = [],\n locality_region = [];\n if (data.street) lines.push(data.street);\n if (data.street2) lines.push(data.street2);\n if (data.locality) locality_region.push(data.locality);\n if (data.region) locality_region.push(data.region);\n if (locality_region.length > 0) lines.push(locality_region.join(', '));\n if (data.country) lines.push(data.country);\n if (data.postalcode) lines.push(data.postalcode);\n return lines.join('<br>');\n };\n }],\n template: '<address ng-bind-html=\"addressLines(data)\"></address>'\n };\n }\n \n angular\n .module('SOGo.Common')\n .directive('sgAddress', sgAddress);\n})();\n"]}