sogo/UI/WebServerResources/js/Contacts.js.map

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","onEnter","onEnterCard","onExit","onExitCard","card@app.addressbook","otherwise","AddressBook","$findAll","window","contactFolders","$q","$state","$stateParams","_","find","id","addressbookId","selectedCard","$reload","reject","Card","tag","contactType","pid","c_component","$cards","cardObject","cardId","go","stateMailbox","runBlock","$rootScope","$log","$on","event","toState","toParams","fromState","fromParams","error","current","previous","rejection","angular","module","config","run","$inject","AddressBookController","$scope","$window","$timeout","$mdDialog","Account","Dialog","Settings","selectCard","toggleCardSelection","$event","selected","vm","mode","multiple","preventDefault","stopPropagation","newComponent","ev","ComponentDialogController","scope","create","type","hide","show","parent","element","document","body","targetEvent","clickOutsideToClose","escapeToClose","l","join","locals","selectedFolder","unselectCards","forEach","confirmDeleteSelectedCards","confirm","ok","then","selectedCards","filter","$deleteCards","copySelectedCards","folder","$copyCards","selectAll","length","sort","field","$filter","sortedBy","$query","cancelSearch","search","newMessage","recipients","accounts","account","o","$getMailboxes","mailboxes","$newMessage","message","extend","editable","to","stateAccount","stateMessage","newMessageWithRecipient","recipient","fn","newMessageWithSelectedCards","promises","$isList","expandable","isDefined","refs","ref","email","push","$shortFormat","c_mail","all","uniq","this","service","AddressBooksController","$mdToast","$mdMedia","$mdSidenav","FileUploader","sgConstant","focus","User","select","params","editMode","value","close","newAddressbook","prompt","name","isEditable","isRemote","owner","UserLogin","$add","edit","originalAddressbook","$omit","revertEditing","save","$rename","data","status","alert","confirmDelete","isSubscription","$delete","response","statusText","importCards","CardsImportDialogController","filterByExtension","item","isTextFile","indexOf","test","position","hideDelay","uploader","ApplicationBaseURL","autoUpload","queueLimit","filters","onSuccessItem","headers","msg","imported","simple","content","onErrorItem","showLinks","LinksDialogController","showProperties","PropertiesDialogController","srcAddressBook","saveProperties","$save","init","cancel","share","$acl","$users","usersWithACL","users","subscribeToFolder","addressbookData","console","debug","$subscribe","activeUser","CardController","transformCategory","input","isString","addOrgUnit","i","$addOrgUnit","addBirthday","birthday","Date","addScreenName","$addScreenName","addEmail","$addEmail","addPhone","$addPhone","addUrl","$addUrl","addAddress","$addAddress","userFilter","excludedCards","dry","excludeLists","$$cards","form","$valid","map","copy","reset","$reset","isNew","$fullname","toggleRawSource","showRawSource","rawSource","$$resource","post","currentFolder","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', ['ngCookies', '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 onEnter: onEnterCard,\n onExit: onExitCard\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.selectedCard = false;\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 = ['$state', '$stateParams', 'stateAddressbook'];\n function stateCard($state, $stateParams, stateAddressbook) {\n var card;\n\n card = _.find(stateAddressbook.$cards, function(cardObject) {\n return (cardObject.id == $stateParams.cardId);\n });\n\n if (card) {\n return card.$reload();\n }\n else {\n // Card not found\n $state.go('app.addressbook');\n }\n }\n\n /**\n * @ngInject\n */\n onEnterCard.$inject = ['$stateParams', 'stateAddressbook'];\n function onEnterCard($stateParams, stateAddressbook) {\n stateAddressbook.selectedCard = $stateParams.cardId;\n }\n\n /**\n * @ngInject\n */\n onExitCard.$inject = ['stateAddressbook'];\n function onExitCard(stateMailbox) {\n delete stateAddressbook.selectedCard;\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', '$window', '$state', '$timeout', '$mdDialog', 'Account', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'stateAddressbooks', 'stateAddressbook'];\n function AddressBookController($scope, $q, $window, $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.unselectCards = unselectCards;\n vm.confirmDeleteSelectedCards = confirmDeleteSelectedCards;\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, multiple: 0 };\n \n function selectCard(card) {\n $state.go('app.addressbook.card.view', {cardId: card.id});\n }\n \n function toggleCardSelection($event, card) {\n card.selected = !card.selected;\n vm.mode.multiple += card.selected? 1 : -1;\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 unselectCards() {\n _.forEach(vm.selectedFolder.$cards, function(card) {\n card.selected = false;\n });\n vm.mode.multiple = 0;\n }\n \n function confirmDeleteSelectedCards() {\n Dialog.confirm(l('Warning'),\n l('Are you sure you want to delete the selected contacts?'),\n { ok: l('Delete') })\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 });\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 });\n }\n\n function selectAll() {\n _.forEach(vm.selectedFolder.$cards, function(card) {\n card.selected = true;\n });\n vm.mode.multiple = vm.selectedFolder.$cards.length;\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 = _.find(accounts, function(o) {\n if (o.id === 0)\n return o;\n });\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 angular.extend(message.editable, { to: recipients });\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 stateAccount: account,\n stateMessage: message\n }\n });\n });\n });\n });\n }\n\n function newMessageWithRecipient($event, recipient, fn) {\n var recipients = [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 _.forEach(selectedCards, function(card) {\n if (card.$isList({expandable: true})) {\n // If the list's members were already fetch, use them\n if (angular.isDefined(card.refs) && card.refs.length) {\n _.forEach(card.refs, function(ref) {\n if (ref.email.length)\n recipients.push(ref.$shortFormat());\n });\n }\n else {\n promises.push(card.$reload().then(function(card) {\n _.forEach(card.refs, function(ref) {\n if (ref.email.length)\n recipients.push(ref.$shortFormat());\n });\n }));\n }\n }\n else if (card.c_mail.length) {\n recipients.push(card.$shortFormat());\n }\n });\n\n $q.all(promises).then(function() {\n recipients = _.uniq(recipients);\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', '$window', '$mdDialog', '$mdToast', '$mdMedia', '$mdSidenav', 'FileUploader', 'sgConstant', 'sgFocus', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'User', 'stateAddressbooks'];\n function AddressBooksController($state, $scope, $rootScope, $stateParams, $timeout, $window, $mdDialog, $mdToast, $mdMedia, $mdSidenav, FileUploader, sgConstant, 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.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(sgConstant['gt-md']))\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 \"%{0}\"?',\n vm.service.selectedFolder.name),\n { ok: l('Delete') })\n .then(function() {\n return vm.service.selectedFolder.$delete();\n })\n .then(function() {\n vm.service.selectedFolder = null;\n $state.go('app.addressbook', { addressbookId: 'personal' });\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 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 });\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('Successfully 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', '$window', '$mdDialog', 'AddressBook', 'Card', 'Dialog', 'sgFocus', '$state', '$stateParams', 'stateCard'];\n function CardController($scope, $timeout, $window, $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.transformCategory = transformCategory;\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.userFilter = userFilter;\n vm.save = save;\n vm.close = close;\n vm.reset = reset;\n vm.cancel = cancel;\n vm.confirmDelete = confirmDelete;\n vm.toggleRawSource = toggleRawSource;\n vm.showRawSource = false;\n\n function transformCategory(input) {\n if (angular.isString(input))\n return { value: input };\n else\n return input;\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 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(_.map(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 }\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}?', '<b>' + card.$fullname() + '</b>'),\n { ok: l('Delete') })\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 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"]}