sogo/UI/WebServerResources/js/Contacts.js.map
2017-03-01 09:49:36 -05:00

1 line
58 KiB
Plaintext

{"version":3,"file":"Contacts.js","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","$mdToast","Account","focus","Dialog","Settings","sgHotkeys","_registerHotkeys","keys","push","createHotkey","key","l","description","callback","searchMode","bind","vm","newComponent","toggleCardSelection","_nextCard","_previousCard","_addNextCardToSelection","_addPreviousCardToSelection","confirmDeleteSelectedCards","forEach","registerHotkey","selectCard","$event","selectedIndex","nextSelectedIndex","i","folder","selectedFolder","$selectedCard","selected","mode","multiple","shiftKey","$selectedCount","idsMap","getLength","Math","min","max","preventDefault","stopPropagation","type","unselectCards","index","$selectedCardIndex","isDefined","$topIndex","length","hasSelectedCard","selectedCards","$selectedCards","size","confirm","ok","then","$deleteCards","_selectedCardsOperation","operation","dstId","srcFolder","allCards","cards","ids","clearCardView","promise","success","filter","$isCard","show","simple","content","position","hideDelay","$copyCards","$moveCards","map","indexOf","copySelectedCards","moveSelectedCards","selectAll","sort","field","$filter","sortedBy","$query","search","cancelSearch","newMessage","recipients","recipientsField","accounts","account","o","$getMailboxes","mailboxes","$newMessage","message","editable","parent","element","document","body","targetEvent","clickOutsideToClose","escapeToClose","locals","stateAccount","stateMessage","newMessageWithRecipient","recipient","fn","newMessageWithSelectedCards","promises","$isList","expandable","refs","ref","email","$shortFormat","c_mail","all","uniq","this","hotkeys","service","deregisterHotkey","AddressBooksController","$mdMedia","$mdSidenav","FileUploader","sgConstant","User","confirmDelete","select","params","editMode","value","close","newAddressbook","prompt","name","isEditable","isRemote","owner","UserLogin","$add","edit","originalAddressbook","extend","$omit","revertEditing","save","$rename","data","status","alert","isSubscription","$delete","response","statusText","importCards","CardsImportDialogController","scope","filterByExtension","item","isTextFile","test","join","uploader","ApplicationBaseURL","autoUpload","queueLimit","filters","onSuccessItem","headers","msg","hide","imported","onErrorItem","showLinks","LinksDialogController","urls","when","$reloadAll","showProperties","PropertiesDialogController","srcAddressBook","saveProperties","$save","init","cancel","share","$acl","$users","usersWithACL","users","subscribeToFolder","addressbookData","console","debug","$subscribe","isDroppableFolder","dstFolder","isOwned","acls","objectCreator","dragSelectedCards","activeUser","CardController","sgSettings","currentFolder","transformCategory","input","isString","addOrgUnit","$addOrgUnit","addBirthday","birthday","Date","addScreenName","$addScreenName","addEmail","$addEmail","addPhone","$addPhone","addUrl","$addUrl","addAddress","$addAddress","userFilter","excludedCards","minimumSearchLength","dry","excludeLists","form","$valid","copy","reset","$reset","$setPristine","isNew","$fullname","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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","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 delete addressbook.selectedCard;\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', '$mdToast', 'Account', 'Card', 'AddressBook', 'sgFocus', 'Dialog', 'sgSettings', 'sgHotkeys', 'stateAddressbooks', 'stateAddressbook'];\n function AddressBookController($scope, $q, $window, $state, $timeout, $mdDialog, $mdToast, Account, Card, AddressBook, focus, Dialog, Settings, sgHotkeys, stateAddressbooks, stateAddressbook) {\n var vm = this, hotkeys = [];\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.moveSelectedCards = moveSelectedCards;\n vm.selectAll = selectAll;\n vm.sort = sort;\n vm.sortedBy = sortedBy;\n vm.searchMode = searchMode;\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\n _registerHotkeys(hotkeys);\n\n $scope.$on('$destroy', function() {\n // Deregister hotkeys\n _.forEach(hotkeys, function(key) {\n sgHotkeys.deregisterHotkey(key);\n });\n });\n\n\n function _registerHotkeys(keys) {\n keys.push(sgHotkeys.createHotkey({\n key: l('hotkey_search'),\n description: l('Search'),\n callback: searchMode\n }));\n keys.push(sgHotkeys.createHotkey({\n key: l('key_create_card'),\n description: l('Create a new address book card'),\n callback: angular.bind(vm, newComponent, 'card')\n }));\n keys.push(sgHotkeys.createHotkey({\n key: l('key_create_list'),\n description: l('Create a new list'),\n callback: angular.bind(vm, newComponent, 'list')\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'space',\n description: l('Toggle item'),\n callback: toggleCardSelection\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'shift+space',\n description: l('Toggle range of items'),\n callback: toggleCardSelection\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'up',\n description: l('View next item'),\n callback: _nextCard\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'down',\n description: l('View previous item'),\n callback: _previousCard\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'shift+up',\n description: l('Add next item to selection'),\n callback: _addNextCardToSelection\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'shift+down',\n description: l('Add previous item to selection'),\n callback: _addPreviousCardToSelection\n }));\n keys.push(sgHotkeys.createHotkey({\n key: 'backspace',\n description: l('Delete selected card or address book'),\n callback: confirmDeleteSelectedCards\n }));\n\n // Register the hotkeys\n _.forEach(keys, function(key) {\n sgHotkeys.registerHotkey(key);\n });\n }\n\n function selectCard(card) {\n $state.go('app.addressbook.card.view', {cardId: card.id});\n }\n\n function toggleCardSelection($event, card) {\n var folder = vm.selectedFolder,\n selectedIndex, nextSelectedIndex, i;\n\n if (!card)\n card = folder.$selectedCard();\n card.selected = !card.selected;\n vm.mode.multiple += card.selected? 1 : -1;\n\n // Select closest range of cards when shift key is pressed\n if ($event.shiftKey && folder.$selectedCount() > 1) {\n selectedIndex = folder.idsMap[card.id];\n // Search for next selected card above\n nextSelectedIndex = selectedIndex - 2;\n while (nextSelectedIndex >= 0 &&\n !folder.$cards[nextSelectedIndex].selected)\n nextSelectedIndex--;\n if (nextSelectedIndex < 0) {\n // Search for next selected card bellow\n nextSelectedIndex = selectedIndex + 2;\n while (nextSelectedIndex < folder.getLength() &&\n !folder.$cards[nextSelectedIndex].selected)\n nextSelectedIndex++;\n }\n if (nextSelectedIndex >= 0 && nextSelectedIndex < folder.getLength()) {\n for (i = Math.min(selectedIndex, nextSelectedIndex);\n i <= Math.max(selectedIndex, nextSelectedIndex);\n i++)\n folder.$cards[i].selected = true;\n }\n }\n\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n function newComponent(type) {\n $state.go('app.addressbook.new', { contactType: type });\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 /**\n * User has pressed up arrow key\n */\n function _nextCard($event) {\n var index = vm.selectedFolder.$selectedCardIndex();\n\n if (angular.isDefined(index)) {\n index--;\n if (vm.selectedFolder.$topIndex > 0)\n vm.selectedFolder.$topIndex--;\n }\n else {\n // No card is selected, show oldest card\n index = vm.selectedFolder.$cards.length() - 1;\n vm.selectedFolder.$topIndex = vm.selectedFolder.getLength();\n }\n\n if (index > -1)\n selectCard(vm.selectedFolder.$cards[index]);\n\n $event.preventDefault();\n\n return index;\n }\n\n /**\n * User has pressed the down arrow key\n */\n function _previousCard($event) {\n var index = vm.selectedFolder.$selectedCardIndex();\n\n if (angular.isDefined(index)) {\n index++;\n if (vm.selectedFolder.$topIndex < vm.selectedFolder.$cards.length)\n vm.selectedFolder.$topIndex++;\n }\n else\n // No card is selected, show newest\n index = 0;\n\n if (index < vm.selectedFolder.$cards.length)\n selectCard(vm.selectedFolder.$cards[index]);\n else\n index = -1;\n\n $event.preventDefault();\n\n return index;\n }\n\n function _addNextCardToSelection($event) {\n var index;\n\n if (vm.selectedFolder.hasSelectedCard()) {\n index = _nextCard($event);\n if (index >= 0)\n toggleCardSelection($event, vm.selectedFolder.$cards[index]);\n }\n }\n\n function _addPreviousCardToSelection($event) {\n var index;\n\n if (vm.selectedFolder.hasSelectedCard()) {\n index = _previousCard($event);\n if (index >= 0)\n toggleCardSelection($event, vm.selectedFolder.$cards[index]);\n }\n }\n\n function confirmDeleteSelectedCards($event) {\n var selectedCards = vm.selectedFolder.$selectedCards();\n\n if (_.size(selectedCards) > 0)\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 vm.selectedFolder.$deleteCards(selectedCards).then(function() {\n vm.mode.multiple = 0;\n if (!vm.selectedFolder.selectedCard)\n $state.go('app.addressbook');\n });\n });\n\n $event.preventDefault();\n }\n\n /**\n * @see AddressBooksController.dragSelectedCards\n */\n function _selectedCardsOperation(operation, dstId) {\n var srcFolder, allCards, cards, ids, clearCardView, promise, success;\n\n srcFolder = vm.selectedFolder;\n clearCardView = false;\n allCards = srcFolder.$selectedCards();\n cards = _.filter(allCards, function(card) {\n return card.$isCard();\n });\n\n if (cards.length != allCards.length)\n $mdToast.show(\n $mdToast.simple()\n .content(l(\"Lists can't be moved or copied.\"))\n .position('top right')\n .hideDelay(2000));\n\n if (cards.length) {\n if (operation == 'copy') {\n promise = srcFolder.$copyCards(cards, dstId);\n success = l('%{0} card(s) copied', cards.length);\n }\n else {\n promise = srcFolder.$moveCards(cards, dstId);\n success = l('%{0} card(s) moved', cards.length);\n // Check if currently displayed card will be moved\n ids = _.map(cards, 'id');\n clearCardView = (srcFolder.selectedCard && ids.indexOf(srcFolder.selectedCard) >= 0);\n }\n\n // Show success toast when action succeeds\n promise.then(function() {\n if (clearCardView)\n $state.go('app.addressbook');\n $mdToast.show(\n $mdToast.simple()\n .content(success)\n .position('top right')\n .hideDelay(2000));\n });\n }\n }\n\n function copySelectedCards(folder) {\n _selectedCardsOperation('copy', folder);\n }\n\n function moveSelectedCards(folder) {\n _selectedCardsOperation('move', folder);\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 searchMode() {\n vm.mode.search = true;\n focus('search');\n }\n\n function cancelSearch() {\n vm.mode.search = false;\n vm.selectedFolder.$filter('');\n }\n\n function newMessage($event, recipients, recipientsField) {\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 message.editable[recipientsField] = 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, 'to');\n $event.stopPropagation();\n $event.preventDefault();\n }\n\n function newMessageWithSelectedCards($event, recipientsField) {\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, recipientsField);\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 = ['$q', '$state', '$scope', '$rootScope', '$stateParams', '$timeout', '$window', '$mdDialog', '$mdToast', '$mdMedia', '$mdSidenav', 'FileUploader', 'sgConstant', 'sgHotkeys', 'sgFocus', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'User', 'stateAddressbooks'];\n function AddressBooksController($q, $state, $scope, $rootScope, $stateParams, $timeout, $window, $mdDialog, $mdToast, $mdMedia, $mdSidenav, FileUploader, sgConstant, sgHotkeys, focus, Card, AddressBook, Dialog, Settings, User, stateAddressbooks) {\n var vm = this, hotkeys = [];\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 vm.isDroppableFolder = isDroppableFolder;\n vm.dragSelectedCards = dragSelectedCards;\n\n\n _registerHotkeys(hotkeys);\n\n $scope.$on('$destroy', function() {\n // Deregister hotkeys\n _.forEach(hotkeys, function(key) {\n sgHotkeys.deregisterHotkey(key);\n });\n });\n\n\n function _registerHotkeys(keys) {\n keys.push(sgHotkeys.createHotkey({\n key: 'backspace',\n description: l('Delete selected card or address book'),\n callback: function() {\n if (AddressBook.selectedFolder && !AddressBook.selectedFolder.hasSelectedCard())\n confirmDelete();\n }\n }));\n\n // Register the hotkeys\n _.forEach(keys, function(key) {\n sgHotkeys.registerHotkey(key);\n });\n }\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 the Address Book'))\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 if (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\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 var promise;\n if (addressbook.urls)\n promise = $q.when();\n else\n // Refresh list of addressbooks to fetch links associated to addressbook\n promise = AddressBook.$reloadAll();\n promise.then(function() {\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 /**\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 function isDroppableFolder(srcFolder, dstFolder) {\n return (dstFolder.id != srcFolder.id) && (dstFolder.isOwned || dstFolder.acls.objectCreator);\n }\n\n /**\n * @see AddressBookController._selectedCardsOperation\n */\n function dragSelectedCards(srcFolder, dstFolder, mode) {\n var dstId, allCards, cards, ids, clearCardView, promise, success;\n\n dstId = dstFolder.id;\n clearCardView = false;\n allCards = srcFolder.$selectedCards();\n if (allCards.length === 0)\n allCards = [srcFolder.$selectedCard()];\n cards = _.filter(allCards, function(card) {\n return card.$isCard();\n });\n\n if (cards.length != allCards.length)\n $mdToast.show(\n $mdToast.simple()\n .content(l(\"Lists can't be moved or copied.\"))\n .position('top right')\n .hideDelay(2000));\n\n if (cards.length) {\n if (mode == 'copy') {\n promise = srcFolder.$copyCards(cards, dstId);\n success = l('%{0} card(s) copied', cards.length);\n }\n else {\n promise = srcFolder.$moveCards(cards, dstId);\n success = l('%{0} card(s) moved', cards.length);\n // Check if currently displayed card will be moved\n ids = _.map(cards, 'id');\n clearCardView = (srcFolder.selectedCard && ids.indexOf(srcFolder.selectedCard) >= 0);\n }\n\n // Show success toast when action succeeds\n promise.then(function() {\n if (clearCardView)\n $state.go('app.addressbook');\n $mdToast.show(\n $mdToast.simple()\n .content(success)\n .position('top right')\n .hideDelay(2000));\n });\n }\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', 'sgSettings', 'AddressBook', 'Card', 'Dialog', 'sgHotkeys', 'sgFocus', '$state', '$stateParams', 'stateCard'];\n function CardController($scope, $timeout, $window, $mdDialog, sgSettings, AddressBook, Card, Dialog, sgHotkeys, focus, $state, $stateParams, stateCard) {\n var vm = this, hotkeys = [];\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\n _registerHotkeys(hotkeys);\n\n $scope.$on('$destroy', function() {\n // Deregister hotkeys\n _.forEach(hotkeys, function(key) {\n sgHotkeys.deregisterHotkey(key);\n });\n });\n\n\n function _registerHotkeys(keys) {\n keys.push(sgHotkeys.createHotkey({\n key: 'backspace',\n description: l('Delete'),\n callback: function($event) {\n if (vm.currentFolder.$selectedCount() === 0)\n confirmDelete();\n $event.preventDefault();\n }\n }));\n\n // Register the hotkeys\n _.forEach(keys, function(key) {\n sgHotkeys.registerHotkey(key);\n });\n }\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 if ($query.length < sgSettings.minimumSearchLength())\n return [];\n\n return AddressBook.selectedFolder.$filter($query, {dry: true, excludeLists: true}, excludedCards).then(function(cards) {\n return cards;\n });\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').then(function() {\n vm.card = null;\n delete AddressBook.selectedFolder.selectedCard;\n });\n }\n function reset(form) {\n vm.card.$reset();\n form.$setPristine();\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() {\n var card = stateCard;\n\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 AddressBook.selectedFolder.$deleteCards([card])\n .then(function() {\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"]}