diff --git a/UI/WebServerResources/js/Contacts.js b/UI/WebServerResources/js/Contacts.js index d21e85a3f..0b971c5a3 100644 --- a/UI/WebServerResources/js/Contacts.js +++ b/UI/WebServerResources/js/Contacts.js @@ -1,2 +1,2 @@ -!function(){"use strict";function a(a,f){a.state("app",{url:"/addressbooks","abstract":!0,views:{addressbooks:{templateUrl:"UIxContactFoldersView",controller:"AddressBooksController",controllerAs:"app"}},resolve:{stateAddressbooks:b}}).state("app.addressbook",{url:"/:addressbookId",views:{addressbook:{templateUrl:"addressbook",controller:"AddressBookController",controllerAs:"addressbook"}},resolve:{stateAddressbook:c}}).state("app.addressbook.new",{url:"/{contactType:(?:card|list)}/new",views:{card:{templateUrl:"UIxContactEditorTemplate",controller:"CardController",controllerAs:"editor"}},resolve:{stateCard:d}}).state("app.addressbook.card",{url:"/:cardId","abstract":!0,views:{card:{template:""}},resolve:{stateCard:e}}).state("app.addressbook.card.view",{url:"/view",views:{"card@app.addressbook":{templateUrl:"UIxContactViewTemplate",controller:"CardController",controllerAs:"editor"}}}).state("app.addressbook.card.editor",{url:"/edit",views:{"card@app.addressbook":{templateUrl:"UIxContactEditorTemplate",controller:"CardController",controllerAs:"editor"}}}),f.otherwise("/addressbooks/personal")}function b(a){return a.$findAll(window.contactFolders)}function c(a,b,c,d){var e=_.find(d.$findAll(),function(a){return a.id==c.addressbookId});return e?(e.selectedCard=!1,e.$reload(),e):a.reject("Addressbook "+c.addressbookId+" not found")}function d(a,b,c){var d="v"+a.contactType,e=new c({pid:a.addressbookId,c_component:d});return b.selectedCard=!0,e}function e(a,b){return b.selectedCard=a.cardId,b.$getCard(a.cardId)}function f(a,b,c){a.$on("$stateChangeError",function(a,d,e,f,g,h){b.error(h),c.go("app.addressbook",{addressbookId:"personal"})}),a.$on("$routeChangeError",function(a,c,d,e){b.error(a,c,d,e)})}angular.module("SOGo.ContactsUI",["ui.router","angularFileUpload","ck","SOGo.Common","SOGo.PreferencesUI","SOGo.MailerUI"]).config(a).run(f),a.$inject=["$stateProvider","$urlRouterProvider"],b.$inject=["AddressBook"],c.$inject=["$q","$state","$stateParams","AddressBook"],d.$inject=["$stateParams","stateAddressbook","Card"],e.$inject=["$stateParams","stateAddressbook"],f.$inject=["$rootScope","$log","$state"]}(),function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k,m,n){function o(a){d.go("app.addressbook.card.view",{addressbookId:n.id,cardId:a.id})}function p(a,b){b.selected=!b.selected,D.mode.multiple+=b.selected?1:-1,a.preventDefault(),a.stopPropagation()}function q(a){function b(a,b,c,d){a.create=function(a){b.hide(),c.go("app.addressbook.new",{addressbookId:d,contactType:a})}}f.show({parent:angular.element(document.body),targetEvent:a,clickOutsideToClose:!0,escapeToClose:!0,template:[''," ",'
'," "," "+l("Contact")," "," "," "+l("List")," ","
","
","
"].join(""),locals:{addressbookId:D.selectedFolder.id},controller:b}),b.$inject=["scope","$mdDialog","$state","addressbookId"]}function r(a,b){return a&&a.c_component==b&&!a.selected}function s(){_.forEach(D.selectedFolder.$cards,function(a){a.selected=!1}),D.mode.multiple=0}function t(){j.confirm(l("Warning"),l("Are you sure you want to delete the selected contacts?"),{ok:l("Delete")}).then(function(){var a=_.filter(D.selectedFolder.$cards,function(a){return a.selected});D.selectedFolder.$deleteCards(a),delete D.selectedFolder.selectedCard})}function u(){var a=_.filter(D.selectedFolder.$cards,function(a){return a.selected}),b=_.map(a,"id");c.location.href=ApplicationBaseURL+"/"+D.selectedFolder.id+"/export?uid="+b.join("&uid=")}function v(a){var b=_.filter(D.selectedFolder.$cards,function(a){return a.selected});D.selectedFolder.$copyCards(b,a).then(function(){})}function w(){_.forEach(D.selectedFolder.$cards,function(a){a.selected=!0}),D.mode.multiple=D.selectedFolder.$cards.length}function x(a){D.selectedFolder.$filter("",{sort:a})}function y(a){return i.$query.sort==a}function z(){D.mode.search=!1,D.selectedFolder.$filter("")}function A(a,b){g.$findAll().then(function(c){var d=_.filter(c,function(a){return 0===a.id?a:void 0})[0];d.$getMailboxes().then(function(e){d.$newMessage().then(function(d){f.show({parent:angular.element(document.body),targetEvent:a,clickOutsideToClose:!1,escapeToClose:!1,templateUrl:"../Mail/UIxMailEditor",controller:"MessageEditorController",controllerAs:"editor",locals:{stateAccounts:c,stateMessage:d,stateRecipients:b}})})})})}function B(a,b,c){var d=[{full:c+" <"+b+">"}];D.newMessage(a,d),a.stopPropagation(),a.preventDefault()}function C(a){var c=_.filter(D.selectedFolder.$cards,function(a){return a.selected}),d=[],e=[];_.forEach(c,function(a){"vcard"==a.c_component&&a.c_mail.length?e.push({full:a.c_cn+" <"+a.c_mail+">"}):a.$isList()&&(angular.isDefined(a.refs)&&a.refs.length?_.forEach(a.refs,function(a){a.email.length&&e.push({full:a.c_cn+" <"+a.email+">"})}):d.push(D.selectedFolder.$getCard(a.id).then(function(a){return a.$futureCardData.then(function(a){_.forEach(a.refs,function(a){a.email.length&&e.push({full:a.c_cn+" <"+a.email+">"})})})})))}),b.all(d).then(function(){e.length&&D.newMessage(a,e)})}var D=this;i.selectedFolder=n,D.service=i,D.selectedFolder=n,D.selectCard=o,D.toggleCardSelection=p,D.newComponent=q,D.notSelectedComponent=r,D.unselectCards=s,D.confirmDeleteSelectedCards=t,D.saveSelectedCards=u,D.copySelectedCards=v,D.selectAll=w,D.sort=x,D.sortedBy=y,D.cancelSearch=z,D.newMessage=A,D.newMessageWithSelectedCards=C,D.newMessageWithRecipient=B,D.mode={search:!1,multiple:0}}a.$inject=["$scope","$q","$window","$state","$timeout","$mdDialog","Account","Card","AddressBook","Dialog","sgSettings","stateAddressbooks","stateAddressbook"],angular.module("SOGo.ContactsUI").controller("AddressBookController",a)}(),function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k,m,n,o,p,q,r,s){function t(b,c){a.params.addressbookId!=c.id&&F.editMode!=c.id?(F.editMode=!1,o.$query.value="",i("xs")&&j("left").close(),a.go("app.addressbook",{addressbookId:c.id})):(b.preventDefault(),b.stopPropagation())}function u(){p.prompt(l("New addressbook"),l("Name of new addressbook")).then(function(a){var b=new o({name:a,isEditable:!0,isRemote:!1,owner:UserLogin});o.$add(b)})}function v(a){a.isRemote||(F.editMode=a.id,F.originalAddressbook=angular.extend({},a.$omit()),m("addressBookName_"+a.id))}function w(a){a.name=F.originalAddressbook.name,F.editMode=!1}function x(a){var b=a.name;b&&b.length>0&&b!=F.originalAddressbook.name&&a.$rename(b).then(function(a){F.editMode=!1},function(a,b){p.alert(l("Warning"),a)})}function y(){F.service.selectedFolder.isSubscription?F.service.selectedFolder.$delete().then(function(){F.service.selectedFolder=null,a.go("app.addressbook",{addressbookId:"personal"})},function(a,b){p.alert(l('An error occured while deleting the addressbook "%{0}".',F.service.selectedFolder.name),l(a.error))}):p.confirm(l("Warning"),l('Are you sure you want to delete the addressbook "%{0}"?',F.service.selectedFolder.name),{ok:l("Delete")}).then(function(){return F.service.selectedFolder.$delete()}).then(function(){return F.service.selectedFolder=null,a.go("app.addressbook",{addressbookId:"personal"}),!0})["catch"](function(a){var b=a.data.message||a.statusText;p.alert(l('An error occured while deleting the addressbook "%{0}".',F.service.selectedFolder.name),b)})}function z(a,b){function c(a,b,c){function d(a){var b=0===a.type.indexOf("text")||/\.(ldif|vcf|vcard)$/.test(a.name);return b||h.show({template:["",'
',' error_outline'," "+l("Select a vCard or LDIF file.")+"","
","
"].join(""),position:"top right",hideDelay:3e3}),b}var e=this;e.uploader=new k({url:ApplicationBaseURL+[c.id,"import"].join("/"),autoUpload:!0,queueLimit:1,filters:[{name:d,fn:d}],onSuccessItem:function(a,c,d,e){var f;b.hide(),0===c.imported?f=l("No card was imported."):(f=l("A total of %{0} cards were imported in the addressbook.",c.imported),o.selectedFolder.$reload()),h.show(h.simple().content(f).position("top right").hideDelay(3e3))},onErrorItem:function(a,b,c,d){h.show({template:["",'
',' error_outline'," "+l("An error occured while importing contacts.")+"","
","
"].join(""),position:"top right",hideDelay:3e3})}}),e.close=function(){b.hide()}}g.show({parent:angular.element(document.body),targetEvent:a,clickOutsideToClose:!0,escapeToClose:!0,templateUrl:"UIxContactsImportDialog",controller:c,controllerAs:"$CardsImportDialogController",locals:{folder:b}}),c.$inject=["scope","$mdDialog","folder"]}function A(){f.location.href=ApplicationBaseURL+"/"+F.service.selectedFolder.id+"/exportFolder"}function B(a){function b(a,b){function c(){a.hide()}this.addressbook=b,this.close=c}g.show({parent:angular.element(document.body),clickOutsideToClose:!0,escapeToClose:!0,templateUrl:a.id+"/links",controller:b,controllerAs:"links",locals:{addressbook:a}}),b.$inject=["$mdDialog","addressbook"]}function C(a){function b(a,b,c){function d(){f.addressbook.$save().then(function(){c.init(f.addressbook.$omit()),b.hide()})}function e(){b.cancel()}var f=this;f.addressbook=new o(c.$omit()),f.saveProperties=d,f.close=e}g.show({templateUrl:a.id+"/properties",controller:b,controllerAs:"properties",clickOutsideToClose:!0,escapeToClose:!0,locals:{srcAddressBook:a}})["catch"](function(){}),b.$inject=["$scope","$mdDialog","srcAddressBook"]}function D(a){a.$acl.$users().then(function(){g.show({templateUrl:a.id+"/UIxAclEditor",controller:"AclController",controllerAs:"acl",clickOutsideToClose:!0,escapeToClose:!0,locals:{usersWithACL:a.$acl.users,User:r,folder:a}})})}function E(a){console.debug("subscribeToFolder "+a.owner+a.name),o.$subscribe(a.owner,a.name).then(function(a){h.show(h.simple().content(l("Successfully subscribed to address book")).position("top right").hideDelay(3e3))})}var F=this;F.activeUser=q.activeUser,F.service=o,F.select=t,F.newAddressbook=u,F.edit=v,F.revertEditing=w,F.save=x,F.confirmDelete=y,F.importCards=z,F.exportCards=A,F.showLinks=B,F.showProperties=C,F.share=D,F.subscribeToFolder=E}a.$inject=["$state","$scope","$rootScope","$stateParams","$timeout","$window","$mdDialog","$mdToast","$mdMedia","$mdSidenav","FileUploader","sgFocus","Card","AddressBook","Dialog","sgSettings","User","stateAddressbooks"],angular.module("SOGo.ContactsUI").controller("AddressBooksController",a)}(),function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k){function m(a){return angular.isString(a)?{value:a}:a}function n(){var a=C.card.$addOrgUnit("");h("orgUnit_"+a)}function o(){C.card.birthday=new Date}function p(){C.card.$addScreenName("")}function q(){var a=C.card.$addEmail("");h("email_"+a)}function r(){var a=C.card.$addPhone("");h("phone_"+a)}function s(){var a=C.card.$addUrl("","");h("url_"+a)}function t(){var a=C.card.$addAddress("","","","","","","","");h("address_"+a)}function u(a,b){return e.selectedFolder.$filter(a,{dry:!0,excludeLists:!0},b),e.selectedFolder.$$cards}function v(a){a.$valid&&C.card.$save().then(function(a){var b=_.indexOf(_.map(e.selectedFolder.$cards,"id"),C.card.id);0>b?e.selectedFolder.$reload():e.selectedFolder.$cards[b]=angular.copy(C.card),i.go("app.addressbook.card.view",{cardId:C.card.id})})}function w(){i.go("app.addressbook",{addressbookId:e.selectedFolder.id}).then(function(){C.card=null,delete e.selectedFolder.selectedCard})}function x(){C.card.$reset()}function y(){C.card.$reset(),C.card.isNew?(C.card=null,delete e.selectedFolder.selectedCard,i.go("app.addressbook",{addressbookId:e.selectedFolder.id})):i.go("app.addressbook.card.view",{cardId:C.card.id})}function z(a){g.confirm(l("Warning"),l("Are you sure you want to delete the card of %{0}?",""+a.$fullname()+""),{ok:l("Delete")}).then(function(){a.$delete().then(function(){e.selectedFolder.$cards=_.reject(e.selectedFolder.$cards,function(b){return b.id==a.id}),w()},function(b,c){g.alert(l("Warning"),l('An error occured while deleting the card "%{0}".',a.$fullname()))})})}function A(){c.location.href=ApplicationBaseURL+"/"+C.currentFolder.id+"/export?uid="+C.card.id}function B(a){C.showRawSource||C.rawSource?C.showRawSource=!C.showRawSource:f.$$resource.post(C.currentFolder.id+"/"+C.card.id,"raw").then(function(a){C.rawSource=a,C.showRawSource=!0})}var C=this;C.card=k,C.currentFolder=e.selectedFolder,C.allEmailTypes=f.$EMAIL_TYPES,C.allTelTypes=f.$TEL_TYPES,C.allUrlTypes=f.$URL_TYPES,C.allAddressTypes=f.$ADDRESS_TYPES,C.categories={},C.userFilterResults=[],C.transformCategory=m,C.addOrgUnit=n,C.addBirthday=o,C.addScreenName=p,C.addEmail=q,C.addPhone=r,C.addUrl=s,C.addAddress=t,C.userFilter=u,C.save=v,C.close=w,C.reset=x,C.cancel=y,C.confirmDelete=z,C.exportCard=A,C.toggleRawSource=B,C.showRawSource=!1}a.$inject=["$scope","$timeout","$window","$mdDialog","AddressBook","Card","Dialog","sgFocus","$state","$stateParams","stateCard"],angular.module("SOGo.ContactsUI").controller("CardController",a)}(),function(){"use strict";function a(){return{restrict:"A",scope:{data:"=sgAddress"},controller:["$scope",function(a){a.addressLines=function(a){var b=[],c=[];return a.street&&b.push(a.street),a.street2&&b.push(a.street2),a.locality&&c.push(a.locality),a.region&&c.push(a.region),c.length>0&&b.push(c.join(", ")),a.country&&b.push(a.country),a.postalcode&&b.push(a.postalcode),b.join("
")}}],template:'
'}}angular.module("SOGo.Common").directive("sgAddress",a)}(); +!function(){"use strict";function a(a,f){a.state("app",{url:"/addressbooks","abstract":!0,views:{addressbooks:{templateUrl:"UIxContactFoldersView",controller:"AddressBooksController",controllerAs:"app"}},resolve:{stateAddressbooks:b}}).state("app.addressbook",{url:"/:addressbookId",views:{addressbook:{templateUrl:"addressbook",controller:"AddressBookController",controllerAs:"addressbook"}},resolve:{stateAddressbook:c}}).state("app.addressbook.new",{url:"/{contactType:(?:card|list)}/new",views:{card:{templateUrl:"UIxContactEditorTemplate",controller:"CardController",controllerAs:"editor"}},resolve:{stateCard:d}}).state("app.addressbook.card",{url:"/:cardId","abstract":!0,views:{card:{template:""}},resolve:{stateCard:e}}).state("app.addressbook.card.view",{url:"/view",views:{"card@app.addressbook":{templateUrl:"UIxContactViewTemplate",controller:"CardController",controllerAs:"editor"}}}).state("app.addressbook.card.editor",{url:"/edit",views:{"card@app.addressbook":{templateUrl:"UIxContactEditorTemplate",controller:"CardController",controllerAs:"editor"}}}),f.otherwise("/addressbooks/personal")}function b(a){return a.$findAll(window.contactFolders)}function c(a,b,c,d){var e=_.find(d.$findAll(),function(a){return a.id==c.addressbookId});return e?(e.selectedCard=!1,e.$reload(),e):a.reject("Addressbook "+c.addressbookId+" not found")}function d(a,b,c){var d="v"+a.contactType,e=new c({pid:a.addressbookId,c_component:d});return b.selectedCard=!0,e}function e(a,b){return b.selectedCard=a.cardId,b.$getCard(a.cardId)}function f(a,b,c){a.$on("$stateChangeError",function(a,d,e,f,g,h){b.error(h),c.go("app.addressbook",{addressbookId:"personal"})}),a.$on("$routeChangeError",function(a,c,d,e){b.error(a,c,d,e)})}angular.module("SOGo.ContactsUI",["ngCookies","ui.router","angularFileUpload","ck","SOGo.Common","SOGo.PreferencesUI","SOGo.MailerUI"]).config(a).run(f),a.$inject=["$stateProvider","$urlRouterProvider"],b.$inject=["AddressBook"],c.$inject=["$q","$state","$stateParams","AddressBook"],d.$inject=["$stateParams","stateAddressbook","Card"],e.$inject=["$stateParams","stateAddressbook"],f.$inject=["$rootScope","$log","$state"]}(),function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k,m,n){function o(a){d.go("app.addressbook.card.view",{addressbookId:n.id,cardId:a.id})}function p(a,b){b.selected=!b.selected,D.mode.multiple+=b.selected?1:-1,a.preventDefault(),a.stopPropagation()}function q(a){function b(a,b,c,d){a.create=function(a){b.hide(),c.go("app.addressbook.new",{addressbookId:d,contactType:a})}}f.show({parent:angular.element(document.body),targetEvent:a,clickOutsideToClose:!0,escapeToClose:!0,template:[''," ",'
'," "," "+l("Contact")," "," "," "+l("List")," ","
","
","
"].join(""),locals:{addressbookId:D.selectedFolder.id},controller:b}),b.$inject=["scope","$mdDialog","$state","addressbookId"]}function r(a,b){return a&&a.c_component==b&&!a.selected}function s(){_.forEach(D.selectedFolder.$cards,function(a){a.selected=!1}),D.mode.multiple=0}function t(){j.confirm(l("Warning"),l("Are you sure you want to delete the selected contacts?"),{ok:l("Delete")}).then(function(){var a=_.filter(D.selectedFolder.$cards,function(a){return a.selected});D.selectedFolder.$deleteCards(a),delete D.selectedFolder.selectedCard})}function u(){var a=_.filter(D.selectedFolder.$cards,function(a){return a.selected}),b=_.map(a,"id");c.location.href=ApplicationBaseURL+"/"+D.selectedFolder.id+"/export?uid="+b.join("&uid=")}function v(a){var b=_.filter(D.selectedFolder.$cards,function(a){return a.selected});D.selectedFolder.$copyCards(b,a).then(function(){})}function w(){_.forEach(D.selectedFolder.$cards,function(a){a.selected=!0}),D.mode.multiple=D.selectedFolder.$cards.length}function x(a){D.selectedFolder.$filter("",{sort:a})}function y(a){return i.$query.sort==a}function z(){D.mode.search=!1,D.selectedFolder.$filter("")}function A(a,b){g.$findAll().then(function(c){var d=_.filter(c,function(a){return 0===a.id?a:void 0})[0];d.$getMailboxes().then(function(e){d.$newMessage().then(function(d){f.show({parent:angular.element(document.body),targetEvent:a,clickOutsideToClose:!1,escapeToClose:!1,templateUrl:"../Mail/UIxMailEditor",controller:"MessageEditorController",controllerAs:"editor",locals:{stateAccounts:c,stateMessage:d,stateRecipients:b}})})})})}function B(a,b,c){var d=[{full:c+" <"+b+">"}];D.newMessage(a,d),a.stopPropagation(),a.preventDefault()}function C(a){var c=_.filter(D.selectedFolder.$cards,function(a){return a.selected}),d=[],e=[];_.forEach(c,function(a){"vcard"==a.c_component&&a.c_mail.length?e.push({full:a.c_cn+" <"+a.c_mail+">"}):a.$isList()&&(angular.isDefined(a.refs)&&a.refs.length?_.forEach(a.refs,function(a){a.email.length&&e.push({full:a.c_cn+" <"+a.email+">"})}):d.push(D.selectedFolder.$getCard(a.id).then(function(a){return a.$futureCardData.then(function(a){_.forEach(a.refs,function(a){a.email.length&&e.push({full:a.c_cn+" <"+a.email+">"})})})})))}),b.all(d).then(function(){e.length&&D.newMessage(a,e)})}var D=this;i.selectedFolder=n,D.service=i,D.selectedFolder=n,D.selectCard=o,D.toggleCardSelection=p,D.newComponent=q,D.notSelectedComponent=r,D.unselectCards=s,D.confirmDeleteSelectedCards=t,D.saveSelectedCards=u,D.copySelectedCards=v,D.selectAll=w,D.sort=x,D.sortedBy=y,D.cancelSearch=z,D.newMessage=A,D.newMessageWithSelectedCards=C,D.newMessageWithRecipient=B,D.mode={search:!1,multiple:0}}a.$inject=["$scope","$q","$window","$state","$timeout","$mdDialog","Account","Card","AddressBook","Dialog","sgSettings","stateAddressbooks","stateAddressbook"],angular.module("SOGo.ContactsUI").controller("AddressBookController",a)}(),function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k,m,n,o,p,q,r,s){function t(b,c){a.params.addressbookId!=c.id&&F.editMode!=c.id?(F.editMode=!1,o.$query.value="",i("xs")&&j("left").close(),a.go("app.addressbook",{addressbookId:c.id})):(b.preventDefault(),b.stopPropagation())}function u(){p.prompt(l("New addressbook"),l("Name of new addressbook")).then(function(a){var b=new o({name:a,isEditable:!0,isRemote:!1,owner:UserLogin});o.$add(b)})}function v(a){a.isRemote||(F.editMode=a.id,F.originalAddressbook=angular.extend({},a.$omit()),m("addressBookName_"+a.id))}function w(a){a.name=F.originalAddressbook.name,F.editMode=!1}function x(a){var b=a.name;b&&b.length>0&&b!=F.originalAddressbook.name&&a.$rename(b).then(function(a){F.editMode=!1},function(a,b){p.alert(l("Warning"),a)})}function y(){F.service.selectedFolder.isSubscription?F.service.selectedFolder.$delete().then(function(){F.service.selectedFolder=null,a.go("app.addressbook",{addressbookId:"personal"})},function(a,b){p.alert(l('An error occured while deleting the addressbook "%{0}".',F.service.selectedFolder.name),l(a.error))}):p.confirm(l("Warning"),l('Are you sure you want to delete the addressbook "%{0}"?',F.service.selectedFolder.name),{ok:l("Delete")}).then(function(){return F.service.selectedFolder.$delete()}).then(function(){return F.service.selectedFolder=null,a.go("app.addressbook",{addressbookId:"personal"}),!0})["catch"](function(a){var b=a.data.message||a.statusText;p.alert(l('An error occured while deleting the addressbook "%{0}".',F.service.selectedFolder.name),b)})}function z(a,b){function c(a,b,c){function d(a){var b=0===a.type.indexOf("text")||/\.(ldif|vcf|vcard)$/.test(a.name);return b||h.show({template:["",'
',' error_outline'," "+l("Select a vCard or LDIF file.")+"","
","
"].join(""),position:"top right",hideDelay:3e3}),b}var e=this;e.uploader=new k({url:ApplicationBaseURL+[c.id,"import"].join("/"),autoUpload:!0,queueLimit:1,filters:[{name:d,fn:d}],onSuccessItem:function(a,c,d,e){var f;b.hide(),0===c.imported?f=l("No card was imported."):(f=l("A total of %{0} cards were imported in the addressbook.",c.imported),o.selectedFolder.$reload()),h.show(h.simple().content(f).position("top right").hideDelay(3e3))},onErrorItem:function(a,b,c,d){h.show({template:["",'
',' error_outline'," "+l("An error occured while importing contacts.")+"","
","
"].join(""),position:"top right",hideDelay:3e3})}}),e.close=function(){b.hide()}}g.show({parent:angular.element(document.body),targetEvent:a,clickOutsideToClose:!0,escapeToClose:!0,templateUrl:"UIxContactsImportDialog",controller:c,controllerAs:"$CardsImportDialogController",locals:{folder:b}}),c.$inject=["scope","$mdDialog","folder"]}function A(){f.location.href=ApplicationBaseURL+"/"+F.service.selectedFolder.id+"/exportFolder"}function B(a){function b(a,b){function c(){a.hide()}this.addressbook=b,this.close=c}g.show({parent:angular.element(document.body),clickOutsideToClose:!0,escapeToClose:!0,templateUrl:a.id+"/links",controller:b,controllerAs:"links",locals:{addressbook:a}}),b.$inject=["$mdDialog","addressbook"]}function C(a){function b(a,b,c){function d(){f.addressbook.$save().then(function(){c.init(f.addressbook.$omit()),b.hide()})}function e(){b.cancel()}var f=this;f.addressbook=new o(c.$omit()),f.saveProperties=d,f.close=e}g.show({templateUrl:a.id+"/properties",controller:b,controllerAs:"properties",clickOutsideToClose:!0,escapeToClose:!0,locals:{srcAddressBook:a}})["catch"](function(){}),b.$inject=["$scope","$mdDialog","srcAddressBook"]}function D(a){a.$acl.$users().then(function(){g.show({templateUrl:a.id+"/UIxAclEditor",controller:"AclController",controllerAs:"acl",clickOutsideToClose:!0,escapeToClose:!0,locals:{usersWithACL:a.$acl.users,User:r,folder:a}})})}function E(a){console.debug("subscribeToFolder "+a.owner+a.name),o.$subscribe(a.owner,a.name).then(function(a){h.show(h.simple().content(l("Successfully subscribed to address book")).position("top right").hideDelay(3e3))})}var F=this;F.activeUser=q.activeUser,F.service=o,F.select=t,F.newAddressbook=u,F.edit=v,F.revertEditing=w,F.save=x,F.confirmDelete=y,F.importCards=z,F.exportCards=A,F.showLinks=B,F.showProperties=C,F.share=D,F.subscribeToFolder=E}a.$inject=["$state","$scope","$rootScope","$stateParams","$timeout","$window","$mdDialog","$mdToast","$mdMedia","$mdSidenav","FileUploader","sgFocus","Card","AddressBook","Dialog","sgSettings","User","stateAddressbooks"],angular.module("SOGo.ContactsUI").controller("AddressBooksController",a)}(),function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k){function m(a){return angular.isString(a)?{value:a}:a}function n(){var a=C.card.$addOrgUnit("");h("orgUnit_"+a)}function o(){C.card.birthday=new Date}function p(){C.card.$addScreenName("")}function q(){var a=C.card.$addEmail("");h("email_"+a)}function r(){var a=C.card.$addPhone("");h("phone_"+a)}function s(){var a=C.card.$addUrl("","");h("url_"+a)}function t(){var a=C.card.$addAddress("","","","","","","","");h("address_"+a)}function u(a,b){return e.selectedFolder.$filter(a,{dry:!0,excludeLists:!0},b),e.selectedFolder.$$cards}function v(a){a.$valid&&C.card.$save().then(function(a){var b=_.indexOf(_.map(e.selectedFolder.$cards,"id"),C.card.id);0>b?e.selectedFolder.$reload():e.selectedFolder.$cards[b]=angular.copy(C.card),i.go("app.addressbook.card.view",{cardId:C.card.id})})}function w(){i.go("app.addressbook",{addressbookId:e.selectedFolder.id}).then(function(){C.card=null,delete e.selectedFolder.selectedCard})}function x(){C.card.$reset()}function y(){C.card.$reset(),C.card.isNew?(C.card=null,delete e.selectedFolder.selectedCard,i.go("app.addressbook",{addressbookId:e.selectedFolder.id})):i.go("app.addressbook.card.view",{cardId:C.card.id})}function z(a){g.confirm(l("Warning"),l("Are you sure you want to delete the card of %{0}?",""+a.$fullname()+""),{ok:l("Delete")}).then(function(){a.$delete().then(function(){e.selectedFolder.$cards=_.reject(e.selectedFolder.$cards,function(b){return b.id==a.id}),w()},function(b,c){g.alert(l("Warning"),l('An error occured while deleting the card "%{0}".',a.$fullname()))})})}function A(){c.location.href=ApplicationBaseURL+"/"+C.currentFolder.id+"/export?uid="+C.card.id}function B(a){C.showRawSource||C.rawSource?C.showRawSource=!C.showRawSource:f.$$resource.post(C.currentFolder.id+"/"+C.card.id,"raw").then(function(a){C.rawSource=a,C.showRawSource=!0})}var C=this;C.card=k,C.currentFolder=e.selectedFolder,C.allEmailTypes=f.$EMAIL_TYPES,C.allTelTypes=f.$TEL_TYPES,C.allUrlTypes=f.$URL_TYPES,C.allAddressTypes=f.$ADDRESS_TYPES,C.categories={},C.userFilterResults=[],C.transformCategory=m,C.addOrgUnit=n,C.addBirthday=o,C.addScreenName=p,C.addEmail=q,C.addPhone=r,C.addUrl=s,C.addAddress=t,C.userFilter=u,C.save=v,C.close=w,C.reset=x,C.cancel=y,C.confirmDelete=z,C.exportCard=A,C.toggleRawSource=B,C.showRawSource=!1}a.$inject=["$scope","$timeout","$window","$mdDialog","AddressBook","Card","Dialog","sgFocus","$state","$stateParams","stateCard"],angular.module("SOGo.ContactsUI").controller("CardController",a)}(),function(){"use strict";function a(){return{restrict:"A",scope:{data:"=sgAddress"},controller:["$scope",function(a){a.addressLines=function(a){var b=[],c=[];return a.street&&b.push(a.street),a.street2&&b.push(a.street2),a.locality&&c.push(a.locality),a.region&&c.push(a.region),c.length>0&&b.push(c.join(", ")),a.country&&b.push(a.country),a.postalcode&&b.push(a.postalcode),b.join("
")}}],template:'
'}}angular.module("SOGo.Common").directive("sgAddress",a)}(); //# sourceMappingURL=Contacts.js.map \ No newline at end of file diff --git a/UI/WebServerResources/js/Contacts.js.map b/UI/WebServerResources/js/Contacts.js.map index 489bcf674..776f6c5a7 100644 --- a/UI/WebServerResources/js/Contacts.js.map +++ b/UI/WebServerResources/js/Contacts.js.map @@ -1 +1 @@ -{"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","selectedCard","$reload","reject","Card","tag","contactType","pid","c_component","cardId","$getCard","runBlock","$rootScope","$log","$on","event","toState","toParams","fromState","fromParams","error","go","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","notSelectedComponent","currentCard","unselectCards","forEach","$cards","confirmDeleteSelectedCards","confirm","ok","then","selectedCards","filter","$deleteCards","saveSelectedCards","selectedUIDs","map","location","href","ApplicationBaseURL","copySelectedCards","folder","$copyCards","selectAll","length","sort","field","$filter","sortedBy","$query","cancelSearch","search","newMessage","recipients","accounts","account","o","$getMailboxes","mailboxes","$newMessage","message","stateAccounts","stateMessage","stateRecipients","newMessageWithRecipient","recipient","fn","full","newMessageWithSelectedCards","promises","c_mail","push","c_cn","$isList","isDefined","refs","ref","email","$futureCardData","data","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","status","alert","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","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","copy","reset","$reset","isNew","$fullname","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: ''\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.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 = ['$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', '$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.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, multiple: 0 };\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 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 '',\n ' ',\n '
',\n ' ',\n ' ' + l('Contact'),\n ' ',\n ' ',\n ' ' + l('List'),\n ' ',\n '
',\n '
',\n '
'\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 _.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 saveSelectedCards() {\n var selectedCards = _.filter(vm.selectedFolder.$cards, function(card) { return card.selected; });\n var selectedUIDs = _.map(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 });\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 = _.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 _.forEach(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.$isList()) {\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({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 _.forEach(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', '$window', '$mdDialog', '$mdToast', '$mdMedia', '$mdSidenav', 'FileUploader', 'sgFocus', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'User', 'stateAddressbooks'];\n function AddressBooksController($state, $scope, $rootScope, $stateParams, $timeout, $window, $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 \"%{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 '',\n '
',\n ' error_outline',\n ' ' + l('An error occured while importing contacts.') + '',\n '
',\n '
'\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 '',\n '
',\n ' error_outline',\n ' ' + l('Select a vCard or LDIF file.') + '',\n '
',\n '
'\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 });\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.exportCard = exportCard;\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}?', '' + card.$fullname() + ''),\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 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('
');\n };\n }],\n template: '
'\n };\n }\n \n angular\n .module('SOGo.Common')\n .directive('sgAddress', sgAddress);\n})();\n"]} \ No newline at end of file +{"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","selectedCard","$reload","reject","Card","tag","contactType","pid","c_component","cardId","$getCard","runBlock","$rootScope","$log","$on","event","toState","toParams","fromState","fromParams","error","go","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","notSelectedComponent","currentCard","unselectCards","forEach","$cards","confirmDeleteSelectedCards","confirm","ok","then","selectedCards","filter","$deleteCards","saveSelectedCards","selectedUIDs","map","location","href","ApplicationBaseURL","copySelectedCards","folder","$copyCards","selectAll","length","sort","field","$filter","sortedBy","$query","cancelSearch","search","newMessage","recipients","accounts","account","o","$getMailboxes","mailboxes","$newMessage","message","stateAccounts","stateMessage","stateRecipients","newMessageWithRecipient","recipient","fn","full","newMessageWithSelectedCards","promises","c_mail","push","c_cn","$isList","isDefined","refs","ref","email","$futureCardData","data","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","status","alert","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","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","copy","reset","$reset","isNew","$fullname","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', ['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: ''\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.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 = ['$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', '$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.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, multiple: 0 };\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 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 '',\n ' ',\n '
',\n ' ',\n ' ' + l('Contact'),\n ' ',\n ' ',\n ' ' + l('List'),\n ' ',\n '
',\n '
',\n '
'\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 _.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 saveSelectedCards() {\n var selectedCards = _.filter(vm.selectedFolder.$cards, function(card) { return card.selected; });\n var selectedUIDs = _.map(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 });\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 = _.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 _.forEach(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.$isList()) {\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({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 _.forEach(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', '$window', '$mdDialog', '$mdToast', '$mdMedia', '$mdSidenav', 'FileUploader', 'sgFocus', 'Card', 'AddressBook', 'Dialog', 'sgSettings', 'User', 'stateAddressbooks'];\n function AddressBooksController($state, $scope, $rootScope, $stateParams, $timeout, $window, $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 \"%{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 '',\n '
',\n ' error_outline',\n ' ' + l('An error occured while importing contacts.') + '',\n '
',\n '
'\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 '',\n '
',\n ' error_outline',\n ' ' + l('Select a vCard or LDIF file.') + '',\n '
',\n '
'\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 });\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.exportCard = exportCard;\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}?', '' + card.$fullname() + ''),\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 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('
');\n };\n }],\n template: '
'\n };\n }\n \n angular\n .module('SOGo.Common')\n .directive('sgAddress', sgAddress);\n})();\n"]} \ No newline at end of file diff --git a/UI/WebServerResources/js/Mailer.js b/UI/WebServerResources/js/Mailer.js index 0753ebee1..fa0ad52ae 100644 --- a/UI/WebServerResources/js/Mailer.js +++ b/UI/WebServerResources/js/Mailer.js @@ -1,2 +1,2 @@ -!function(){"use strict";function a(a,l){a.state("mail",{url:"/Mail",views:{mailboxes:{templateUrl:"UIxMailMainFrame",controller:"MailboxesController",controllerAs:"app"}},resolve:{stateAccounts:b}}).state("mail.account",{url:"/:accountId","abstract":!0,views:{mailbox:{template:""}},resolve:{stateAccount:c}}).state("mail.account.virtualMailbox",{url:"/virtual",views:{"mailbox@mail":{templateUrl:"UIxMailFolderTemplate",controller:"MailboxController",controllerAs:"mailbox"}},resolve:{stateMailbox:g}}).state("mail.account.virtualMailbox.message",{url:"/:mailboxId/:messageId",views:{message:{templateUrl:"UIxMailViewTemplate",controller:"MessageController",controllerAs:"viewer"}},resolve:{stateMailbox:h,stateMessages:f,stateMessage:i}}).state("mail.account.inbox",{url:"/inbox",onEnter:e}).state("mail.account.mailbox",{url:"/:mailboxId",views:{"mailbox@mail":{templateUrl:"UIxMailFolderTemplate",controller:"MailboxController",controllerAs:"mailbox"}},resolve:{stateMailbox:d,stateMessages:f}}).state("mail.account.mailbox.message",{url:"/:messageId",views:{message:{templateUrl:"UIxMailViewTemplate",controller:"MessageController",controllerAs:"viewer"}},onEnter:j,onExit:k,resolve:{stateMessage:i}}),l.otherwise("/Mail/0/inbox")}function b(a,b){var c=b.$findAll(window.mailAccounts),d=[];return angular.forEach(c,function(a,b){var c=a.$getMailboxes();d.push(c.then(function(b){return a}))}),a.all(d)}function c(a,b){return _.find(b,function(b){return b.id==a.accountId})}function d(a,b,c,d,e,f){var g,h,i=e(c.mailboxId);return h=function(a){var b=_.find(a,function(a){return a.path==i});return b||angular.forEach(a,function(a){!b&&a.children&&a.children.length>0&&(b=h(a.children))}),b},f.selectedFolder&&(f.selectedFolder.$isLoading=!0),g=h(d.$mailboxes),g?(g.$topIndex=0,g):b.go("mail.account.inbox")}function e(a,b,c,d){a.location.hash=b.href("mail.account.mailbox",{accountId:d.id,mailboxId:c(d.$mailboxes[0].path)})}function f(a,b){return a.$virtualMode?[]:b.$filter()}function g(a,b){return b.$virtualMode?b.selectedFolder:a.reject("No virtual mailbox defined")}function h(a,b,c,d){var e=c(d.mailboxId);return b.$virtualMode?(b.selectedFolder.resetSelectedMessage(),_.find(b.selectedFolder.$mailboxes,function(a){return a.path==e})):a.reject("No virtual mailbox defined for message")}function i(a,b,c,d,e,f){var g;return(g=_.find(e.$messages,function(a){return a.uid==parseInt(c.messageId)}))?g.$reload():void d.go("mail.account.mailbox",{accountId:e.$account.id,mailboxId:b(e.path)})}function j(a,b){b.selectedMessage=parseInt(a.messageId)}function k(a){a.selectedMessage=-1}function l(a,b,c){a.$on("$stateChangeError",function(a,d,e,f,g,h){b.error(h),a.preventDefault(),"mail.account.inbox"!=d.name?c.go("mail.account.inbox"):c.go("mail")}),a.$on("$routeChangeError",function(a,c,d,e){b.error(a,c,d,e)})}angular.module("SOGo.MailerUI",["ui.router","ck","angularFileUpload","SOGo.Common","SOGo.ContactsUI","SOGo.SchedulerUI","ngAnimate","SOGo.PreferencesUI"]).config(a).run(l),a.$inject=["$stateProvider","$urlRouterProvider"],b.$inject=["$q","Account"],c.$inject=["$stateParams","stateAccounts"],d.$inject=["$q","$state","$stateParams","stateAccount","decodeUriFilter","Mailbox"],e.$inject=["$window","$state","encodeUriFilter","stateAccount"],f.$inject=["Mailbox","stateMailbox"],g.$inject=["$q","Mailbox"],h.$inject=["$q","Mailbox","decodeUriFilter","$stateParams"],i.$inject=["Mailbox","encodeUriFilter","$stateParams","$state","stateMailbox","stateMessages"],j.$inject=["$stateParams","stateMailbox"],k.$inject=["stateMailbox"],l.$inject=["$rootScope","$log","$state"]}(); +!function(){"use strict";function a(a,l){a.state("mail",{url:"/Mail",views:{mailboxes:{templateUrl:"UIxMailMainFrame",controller:"MailboxesController",controllerAs:"app"}},resolve:{stateAccounts:b}}).state("mail.account",{url:"/:accountId","abstract":!0,views:{mailbox:{template:""}},resolve:{stateAccount:c}}).state("mail.account.virtualMailbox",{url:"/virtual",views:{"mailbox@mail":{templateUrl:"UIxMailFolderTemplate",controller:"MailboxController",controllerAs:"mailbox"}},resolve:{stateMailbox:g}}).state("mail.account.virtualMailbox.message",{url:"/:mailboxId/:messageId",views:{message:{templateUrl:"UIxMailViewTemplate",controller:"MessageController",controllerAs:"viewer"}},resolve:{stateMailbox:h,stateMessages:f,stateMessage:i}}).state("mail.account.inbox",{url:"/inbox",onEnter:e}).state("mail.account.mailbox",{url:"/:mailboxId",views:{"mailbox@mail":{templateUrl:"UIxMailFolderTemplate",controller:"MailboxController",controllerAs:"mailbox"}},resolve:{stateMailbox:d,stateMessages:f}}).state("mail.account.mailbox.message",{url:"/:messageId",views:{message:{templateUrl:"UIxMailViewTemplate",controller:"MessageController",controllerAs:"viewer"}},onEnter:j,onExit:k,resolve:{stateMessage:i}}),l.otherwise("/Mail/0/inbox")}function b(a,b){var c=b.$findAll(window.mailAccounts),d=[];return angular.forEach(c,function(a,b){var c=a.$getMailboxes();d.push(c.then(function(b){return a}))}),a.all(d)}function c(a,b){return _.find(b,function(b){return b.id==a.accountId})}function d(a,b,c,d,e,f){var g,h,i=e(c.mailboxId);return h=function(a){var b=_.find(a,function(a){return a.path==i});return b||angular.forEach(a,function(a){!b&&a.children&&a.children.length>0&&(b=h(a.children))}),b},f.selectedFolder&&(f.selectedFolder.$isLoading=!0),g=h(d.$mailboxes),g?(g.$topIndex=0,g):b.go("mail.account.inbox")}function e(a,b,c,d){a.location.hash=b.href("mail.account.mailbox",{accountId:d.id,mailboxId:c(d.$mailboxes[0].path)})}function f(a,b){return a.$virtualMode?[]:b.$filter()}function g(a,b){return b.$virtualMode?b.selectedFolder:a.reject("No virtual mailbox defined")}function h(a,b,c,d){var e=c(d.mailboxId);return b.$virtualMode?(b.selectedFolder.resetSelectedMessage(),_.find(b.selectedFolder.$mailboxes,function(a){return a.path==e})):a.reject("No virtual mailbox defined for message")}function i(a,b,c,d,e,f){var g;return(g=_.find(e.$messages,function(a){return a.uid==parseInt(c.messageId)}))?g.$reload():void d.go("mail.account.mailbox",{accountId:e.$account.id,mailboxId:b(e.path)})}function j(a,b){b.selectedMessage=parseInt(a.messageId)}function k(a){a.selectedMessage=-1}function l(a,b,c){a.$on("$stateChangeError",function(a,d,e,f,g,h){b.error(h),a.preventDefault(),"mail.account.inbox"!=d.name?c.go("mail.account.inbox"):c.go("mail")}),a.$on("$routeChangeError",function(a,c,d,e){b.error(a,c,d,e)})}angular.module("SOGo.MailerUI",["ngCookies","ui.router","ck","angularFileUpload","SOGo.Common","SOGo.ContactsUI","SOGo.SchedulerUI","ngAnimate","SOGo.PreferencesUI"]).config(a).run(l),a.$inject=["$stateProvider","$urlRouterProvider"],b.$inject=["$q","Account"],c.$inject=["$stateParams","stateAccounts"],d.$inject=["$q","$state","$stateParams","stateAccount","decodeUriFilter","Mailbox"],e.$inject=["$window","$state","encodeUriFilter","stateAccount"],f.$inject=["Mailbox","stateMailbox"],g.$inject=["$q","Mailbox"],h.$inject=["$q","Mailbox","decodeUriFilter","$stateParams"],i.$inject=["Mailbox","encodeUriFilter","$stateParams","$state","stateMailbox","stateMessages"],j.$inject=["$stateParams","stateMailbox"],k.$inject=["stateMailbox"],l.$inject=["$rootScope","$log","$state"]}(); //# sourceMappingURL=Mailer.js.map \ No newline at end of file diff --git a/UI/WebServerResources/js/Mailer.js.map b/UI/WebServerResources/js/Mailer.js.map index 886b337b4..77de71a54 100644 --- a/UI/WebServerResources/js/Mailer.js.map +++ b/UI/WebServerResources/js/Mailer.js.map @@ -1 +1 @@ -{"version":3,"sources":["Mailer/Mailer.app.js"],"names":["configure","$stateProvider","$urlRouterProvider","state","url","views","mailboxes","templateUrl","controller","controllerAs","resolve","stateAccounts","abstract","mailbox","template","stateAccount","mailbox@mail","stateMailbox","stateVirtualMailbox","message","stateVirtualMailboxOfMessage","stateMessages","stateMessage","onEnter","onEnterInbox","onEnterMessage","onExit","onExitMessage","otherwise","$q","Account","accounts","$findAll","window","mailAccounts","promises","angular","forEach","account","i","$getMailboxes","push","then","objects","all","$stateParams","_","find","id","accountId","$state","decodeUriFilter","Mailbox","_find","mailboxId","o","path","children","length","selectedFolder","$isLoading","$mailboxes","$topIndex","go","$window","encodeUriFilter","location","hash","href","$virtualMode","$filter","reject","resetSelectedMessage","mailboxObject","$messages","messageObject","uid","parseInt","messageId","$reload","$account","selectedMessage","runBlock","$rootScope","$log","$on","event","toState","toParams","fromState","fromParams","error","preventDefault","name","current","previous","rejection","module","config","run","$inject"],"mappings":"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","file":"Mailer.js","sourcesContent":["/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* JavaScript for SOGo.MailerUI module */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.MailerUI', ['ui.router', 'ck', 'angularFileUpload', 'SOGo.Common', 'SOGo.ContactsUI', 'SOGo.SchedulerUI', 'ngAnimate', 'SOGo.PreferencesUI'])\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('mail', {\n url: '/Mail',\n views: {\n mailboxes: {\n templateUrl: 'UIxMailMainFrame', // UI/Templates/MailerUI/UIxMailMainFrame.wox\n controller: 'MailboxesController',\n controllerAs: 'app'\n }\n },\n resolve: {\n stateAccounts: stateAccounts\n }\n })\n .state('mail.account', {\n url: '/:accountId',\n abstract: true,\n views: {\n mailbox: {\n template: ''\n }\n },\n resolve: {\n stateAccount: stateAccount\n }\n })\n .state('mail.account.virtualMailbox', {\n url: '/virtual',\n views: {\n 'mailbox@mail': {\n templateUrl: 'UIxMailFolderTemplate', // UI/Templates/MailerUI/UIxMailFolderTemplate.wox\n controller: 'MailboxController',\n controllerAs: 'mailbox'\n }\n },\n resolve: {\n stateMailbox: stateVirtualMailbox\n }\n })\n .state('mail.account.virtualMailbox.message', {\n url: '/:mailboxId/:messageId',\n views: {\n message: {\n templateUrl: 'UIxMailViewTemplate', // UI/Templates/MailerUI/UIxMailViewTemplate.wox\n controller: 'MessageController',\n controllerAs: 'viewer'\n }\n },\n resolve: {\n stateMailbox: stateVirtualMailboxOfMessage,\n stateMessages: stateMessages,\n stateMessage: stateMessage\n }\n })\n .state('mail.account.inbox', {\n url: '/inbox',\n onEnter: onEnterInbox\n })\n .state('mail.account.mailbox', {\n url: '/:mailboxId',\n views: {\n 'mailbox@mail': {\n templateUrl: 'UIxMailFolderTemplate', // UI/Templates/MailerUI/UIxMailFolderTemplate.wox\n controller: 'MailboxController',\n controllerAs: 'mailbox'\n }\n },\n resolve: {\n stateMailbox: stateMailbox,\n stateMessages: stateMessages\n }\n })\n // .state('mail.account.mailbox.newMessage', {\n // url: '/new',\n // views: {\n // 'mailbox@mail': {\n // templateUrl: 'UIxMailEditor', // UI/Templates/MailerUI/UIxMailEditor.wox\n // controller: 'MessageEditorController',\n // controllerAs: 'editor'\n // }\n // },\n // resolve: {\n // stateMessage: stateNewMessage\n // }\n // })\n .state('mail.account.mailbox.message', {\n url: '/:messageId',\n views: {\n message: {\n templateUrl: 'UIxMailViewTemplate', // UI/Templates/MailerUI/UIxMailViewTemplate.wox\n controller: 'MessageController',\n controllerAs: 'viewer'\n }\n },\n onEnter: onEnterMessage,\n onExit: onExitMessage,\n resolve: {\n stateMessage: stateMessage\n }\n });\n // .state('mail.account.mailbox.message.edit', {\n // url: '/edit',\n // views: {\n // 'mailbox@mail': {\n // templateUrl: 'UIxMailEditor', // UI/Templates/MailerUI/UIxMailEditor.wox\n // controller: 'MessageEditorController',\n // controllerAs: 'editor'\n // }\n // },\n // resolve: {\n // stateContent: stateContent\n // }\n // })\n // .state('mail.account.mailbox.message.action', {\n // url: '/{actionName:(?:reply|replyall|forward)}',\n // views: {\n // 'mailbox@mail': {\n // templateUrl: 'UIxMailEditor', // UI/Templates/MailerUI/UIxMailEditor.wox\n // controller: 'MessageEditorController',\n // controllerAs: 'editor'\n // }\n // }\n // });\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/Mail/0/inbox');\n }\n\n /**\n * @ngInject\n */\n stateAccounts.$inject = ['$q', 'Account'];\n function stateAccounts($q, Account) {\n var accounts = Account.$findAll(window.mailAccounts),\n promises = [];\n // Fetch list of mailboxes for each account\n angular.forEach(accounts, function(account, i) {\n var mailboxes = account.$getMailboxes();\n promises.push(mailboxes.then(function(objects) {\n return account;\n }));\n });\n return $q.all(promises);\n }\n\n /**\n * @ngInject\n */\n stateAccount.$inject = ['$stateParams', 'stateAccounts'];\n function stateAccount($stateParams, stateAccounts) {\n return _.find(stateAccounts, function(account) {\n return account.id == $stateParams.accountId;\n });\n }\n\n /**\n * @ngInject\n */\n stateMailbox.$inject = ['$q', '$state', '$stateParams', 'stateAccount', 'decodeUriFilter', 'Mailbox'];\n function stateMailbox($q, $state, $stateParams, stateAccount, decodeUriFilter, Mailbox) {\n var mailbox,\n mailboxId = decodeUriFilter($stateParams.mailboxId),\n _find;\n\n // Recursive find function\n _find = function(mailboxes) {\n var mailbox = _.find(mailboxes, function(o) {\n return o.path == mailboxId;\n });\n if (!mailbox) {\n angular.forEach(mailboxes, function(o) {\n if (!mailbox && o.children && o.children.length > 0) {\n mailbox = _find(o.children);\n }\n });\n }\n return mailbox;\n };\n\n if (Mailbox.selectedFolder)\n Mailbox.selectedFolder.$isLoading = true;\n\n mailbox = _find(stateAccount.$mailboxes);\n\n if (mailbox) {\n mailbox.$topIndex = 0;\n return mailbox;\n }\n else\n // Mailbox not found\n return $state.go('mail.account.inbox');\n }\n\n /**\n * @ngInject\n */\n onEnterInbox.$inject = ['$window', '$state', 'encodeUriFilter', 'stateAccount'];\n function onEnterInbox($window, $state, encodeUriFilter, stateAccount) {\n $window.location.hash = $state.href('mail.account.mailbox',\n {accountId: stateAccount.id,\n mailboxId: encodeUriFilter(stateAccount.$mailboxes[0].path)});\n }\n\n /**\n * @ngInject\n */\n stateMessages.$inject = ['Mailbox', 'stateMailbox'];\n function stateMessages(Mailbox, stateMailbox) {\n if (Mailbox.$virtualMode)\n return [];\n\n return stateMailbox.$filter();\n }\n\n /**\n * @ngInject\n */\n // stateNewMessage.$inject = ['stateAccount'];\n // function stateNewMessage(stateAccount) {\n // return stateAccount.$newMessage();\n // }\n\n /**\n * Return a VirtualMailbox instance\n * @ngInject\n */\n stateVirtualMailbox.$inject = ['$q', 'Mailbox'];\n function stateVirtualMailbox($q, Mailbox) {\n if (Mailbox.$virtualMode)\n return Mailbox.selectedFolder;\n else\n return $q.reject(\"No virtual mailbox defined\");\n }\n\n /**\n * Return a Mailbox instance from a VirtualMailbox instance\n * @ngInject\n */\n stateVirtualMailboxOfMessage.$inject = ['$q', 'Mailbox', 'decodeUriFilter', '$stateParams'];\n function stateVirtualMailboxOfMessage($q, Mailbox, decodeUriFilter, $stateParams) {\n var mailboxId = decodeUriFilter($stateParams.mailboxId);\n\n if (Mailbox.$virtualMode) {\n Mailbox.selectedFolder.resetSelectedMessage();\n return _.find(Mailbox.selectedFolder.$mailboxes, function(mailboxObject) {\n return mailboxObject.path == mailboxId;\n });\n }\n else\n return $q.reject(\"No virtual mailbox defined for message\");\n }\n\n /**\n * @ngInject\n */\n stateMessage.$inject = ['Mailbox', 'encodeUriFilter', '$stateParams', '$state', 'stateMailbox', 'stateMessages'];\n function stateMessage(Mailbox, encodeUriFilter, $stateParams, $state, stateMailbox, stateMessages) {\n var message;\n\n message = _.find(stateMailbox.$messages, function(messageObject) {\n return messageObject.uid == parseInt($stateParams.messageId);\n });\n\n if (message) {\n return message.$reload();\n }\n else {\n // Message not found\n $state.go('mail.account.mailbox', { accountId: stateMailbox.$account.id, mailboxId: encodeUriFilter(stateMailbox.path) });\n }\n }\n\n /**\n * @ngInject\n */\n onEnterMessage.$inject = ['$stateParams', 'stateMailbox'];\n function onEnterMessage($stateParams, stateMailbox) {\n stateMailbox.selectedMessage = parseInt($stateParams.messageId);\n }\n\n /**\n * @ngInject\n */\n onExitMessage.$inject = ['stateMailbox'];\n function onExitMessage(stateMailbox) {\n stateMailbox.selectedMessage = -1;\n }\n\n /**\n * @ngInject\n */\n // stateContent.$inject = ['stateMessage'];\n // function stateContent(stateMessage) {\n // return stateMessage.$editableContent();\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 event.preventDefault();\n if (toState.name != 'mail.account.inbox')\n $state.go('mail.account.inbox');\n else\n $state.go('mail');\n });\n $rootScope.$on('$routeChangeError', function(event, current, previous, rejection) {\n $log.error(event, current, previous, rejection);\n });\n }\n\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["Mailer/Mailer.app.js"],"names":["configure","$stateProvider","$urlRouterProvider","state","url","views","mailboxes","templateUrl","controller","controllerAs","resolve","stateAccounts","abstract","mailbox","template","stateAccount","mailbox@mail","stateMailbox","stateVirtualMailbox","message","stateVirtualMailboxOfMessage","stateMessages","stateMessage","onEnter","onEnterInbox","onEnterMessage","onExit","onExitMessage","otherwise","$q","Account","accounts","$findAll","window","mailAccounts","promises","angular","forEach","account","i","$getMailboxes","push","then","objects","all","$stateParams","_","find","id","accountId","$state","decodeUriFilter","Mailbox","_find","mailboxId","o","path","children","length","selectedFolder","$isLoading","$mailboxes","$topIndex","go","$window","encodeUriFilter","location","hash","href","$virtualMode","$filter","reject","resetSelectedMessage","mailboxObject","$messages","messageObject","uid","parseInt","messageId","$reload","$account","selectedMessage","runBlock","$rootScope","$log","$on","event","toState","toParams","fromState","fromParams","error","preventDefault","name","current","previous","rejection","module","config","run","$inject"],"mappings":"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","file":"Mailer.js","sourcesContent":["/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* JavaScript for SOGo.MailerUI module */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.MailerUI', ['ngCookies', 'ui.router', 'ck', 'angularFileUpload', 'SOGo.Common', 'SOGo.ContactsUI', 'SOGo.SchedulerUI', 'ngAnimate', 'SOGo.PreferencesUI'])\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('mail', {\n url: '/Mail',\n views: {\n mailboxes: {\n templateUrl: 'UIxMailMainFrame', // UI/Templates/MailerUI/UIxMailMainFrame.wox\n controller: 'MailboxesController',\n controllerAs: 'app'\n }\n },\n resolve: {\n stateAccounts: stateAccounts\n }\n })\n .state('mail.account', {\n url: '/:accountId',\n abstract: true,\n views: {\n mailbox: {\n template: ''\n }\n },\n resolve: {\n stateAccount: stateAccount\n }\n })\n .state('mail.account.virtualMailbox', {\n url: '/virtual',\n views: {\n 'mailbox@mail': {\n templateUrl: 'UIxMailFolderTemplate', // UI/Templates/MailerUI/UIxMailFolderTemplate.wox\n controller: 'MailboxController',\n controllerAs: 'mailbox'\n }\n },\n resolve: {\n stateMailbox: stateVirtualMailbox\n }\n })\n .state('mail.account.virtualMailbox.message', {\n url: '/:mailboxId/:messageId',\n views: {\n message: {\n templateUrl: 'UIxMailViewTemplate', // UI/Templates/MailerUI/UIxMailViewTemplate.wox\n controller: 'MessageController',\n controllerAs: 'viewer'\n }\n },\n resolve: {\n stateMailbox: stateVirtualMailboxOfMessage,\n stateMessages: stateMessages,\n stateMessage: stateMessage\n }\n })\n .state('mail.account.inbox', {\n url: '/inbox',\n onEnter: onEnterInbox\n })\n .state('mail.account.mailbox', {\n url: '/:mailboxId',\n views: {\n 'mailbox@mail': {\n templateUrl: 'UIxMailFolderTemplate', // UI/Templates/MailerUI/UIxMailFolderTemplate.wox\n controller: 'MailboxController',\n controllerAs: 'mailbox'\n }\n },\n resolve: {\n stateMailbox: stateMailbox,\n stateMessages: stateMessages\n }\n })\n // .state('mail.account.mailbox.newMessage', {\n // url: '/new',\n // views: {\n // 'mailbox@mail': {\n // templateUrl: 'UIxMailEditor', // UI/Templates/MailerUI/UIxMailEditor.wox\n // controller: 'MessageEditorController',\n // controllerAs: 'editor'\n // }\n // },\n // resolve: {\n // stateMessage: stateNewMessage\n // }\n // })\n .state('mail.account.mailbox.message', {\n url: '/:messageId',\n views: {\n message: {\n templateUrl: 'UIxMailViewTemplate', // UI/Templates/MailerUI/UIxMailViewTemplate.wox\n controller: 'MessageController',\n controllerAs: 'viewer'\n }\n },\n onEnter: onEnterMessage,\n onExit: onExitMessage,\n resolve: {\n stateMessage: stateMessage\n }\n });\n // .state('mail.account.mailbox.message.edit', {\n // url: '/edit',\n // views: {\n // 'mailbox@mail': {\n // templateUrl: 'UIxMailEditor', // UI/Templates/MailerUI/UIxMailEditor.wox\n // controller: 'MessageEditorController',\n // controllerAs: 'editor'\n // }\n // },\n // resolve: {\n // stateContent: stateContent\n // }\n // })\n // .state('mail.account.mailbox.message.action', {\n // url: '/{actionName:(?:reply|replyall|forward)}',\n // views: {\n // 'mailbox@mail': {\n // templateUrl: 'UIxMailEditor', // UI/Templates/MailerUI/UIxMailEditor.wox\n // controller: 'MessageEditorController',\n // controllerAs: 'editor'\n // }\n // }\n // });\n\n // if none of the above states are matched, use this as the fallback\n $urlRouterProvider.otherwise('/Mail/0/inbox');\n }\n\n /**\n * @ngInject\n */\n stateAccounts.$inject = ['$q', 'Account'];\n function stateAccounts($q, Account) {\n var accounts = Account.$findAll(window.mailAccounts),\n promises = [];\n // Fetch list of mailboxes for each account\n angular.forEach(accounts, function(account, i) {\n var mailboxes = account.$getMailboxes();\n promises.push(mailboxes.then(function(objects) {\n return account;\n }));\n });\n return $q.all(promises);\n }\n\n /**\n * @ngInject\n */\n stateAccount.$inject = ['$stateParams', 'stateAccounts'];\n function stateAccount($stateParams, stateAccounts) {\n return _.find(stateAccounts, function(account) {\n return account.id == $stateParams.accountId;\n });\n }\n\n /**\n * @ngInject\n */\n stateMailbox.$inject = ['$q', '$state', '$stateParams', 'stateAccount', 'decodeUriFilter', 'Mailbox'];\n function stateMailbox($q, $state, $stateParams, stateAccount, decodeUriFilter, Mailbox) {\n var mailbox,\n mailboxId = decodeUriFilter($stateParams.mailboxId),\n _find;\n\n // Recursive find function\n _find = function(mailboxes) {\n var mailbox = _.find(mailboxes, function(o) {\n return o.path == mailboxId;\n });\n if (!mailbox) {\n angular.forEach(mailboxes, function(o) {\n if (!mailbox && o.children && o.children.length > 0) {\n mailbox = _find(o.children);\n }\n });\n }\n return mailbox;\n };\n\n if (Mailbox.selectedFolder)\n Mailbox.selectedFolder.$isLoading = true;\n\n mailbox = _find(stateAccount.$mailboxes);\n\n if (mailbox) {\n mailbox.$topIndex = 0;\n return mailbox;\n }\n else\n // Mailbox not found\n return $state.go('mail.account.inbox');\n }\n\n /**\n * @ngInject\n */\n onEnterInbox.$inject = ['$window', '$state', 'encodeUriFilter', 'stateAccount'];\n function onEnterInbox($window, $state, encodeUriFilter, stateAccount) {\n $window.location.hash = $state.href('mail.account.mailbox',\n {accountId: stateAccount.id,\n mailboxId: encodeUriFilter(stateAccount.$mailboxes[0].path)});\n }\n\n /**\n * @ngInject\n */\n stateMessages.$inject = ['Mailbox', 'stateMailbox'];\n function stateMessages(Mailbox, stateMailbox) {\n if (Mailbox.$virtualMode)\n return [];\n\n return stateMailbox.$filter();\n }\n\n /**\n * @ngInject\n */\n // stateNewMessage.$inject = ['stateAccount'];\n // function stateNewMessage(stateAccount) {\n // return stateAccount.$newMessage();\n // }\n\n /**\n * Return a VirtualMailbox instance\n * @ngInject\n */\n stateVirtualMailbox.$inject = ['$q', 'Mailbox'];\n function stateVirtualMailbox($q, Mailbox) {\n if (Mailbox.$virtualMode)\n return Mailbox.selectedFolder;\n else\n return $q.reject(\"No virtual mailbox defined\");\n }\n\n /**\n * Return a Mailbox instance from a VirtualMailbox instance\n * @ngInject\n */\n stateVirtualMailboxOfMessage.$inject = ['$q', 'Mailbox', 'decodeUriFilter', '$stateParams'];\n function stateVirtualMailboxOfMessage($q, Mailbox, decodeUriFilter, $stateParams) {\n var mailboxId = decodeUriFilter($stateParams.mailboxId);\n\n if (Mailbox.$virtualMode) {\n Mailbox.selectedFolder.resetSelectedMessage();\n return _.find(Mailbox.selectedFolder.$mailboxes, function(mailboxObject) {\n return mailboxObject.path == mailboxId;\n });\n }\n else\n return $q.reject(\"No virtual mailbox defined for message\");\n }\n\n /**\n * @ngInject\n */\n stateMessage.$inject = ['Mailbox', 'encodeUriFilter', '$stateParams', '$state', 'stateMailbox', 'stateMessages'];\n function stateMessage(Mailbox, encodeUriFilter, $stateParams, $state, stateMailbox, stateMessages) {\n var message;\n\n message = _.find(stateMailbox.$messages, function(messageObject) {\n return messageObject.uid == parseInt($stateParams.messageId);\n });\n\n if (message) {\n return message.$reload();\n }\n else {\n // Message not found\n $state.go('mail.account.mailbox', { accountId: stateMailbox.$account.id, mailboxId: encodeUriFilter(stateMailbox.path) });\n }\n }\n\n /**\n * @ngInject\n */\n onEnterMessage.$inject = ['$stateParams', 'stateMailbox'];\n function onEnterMessage($stateParams, stateMailbox) {\n stateMailbox.selectedMessage = parseInt($stateParams.messageId);\n }\n\n /**\n * @ngInject\n */\n onExitMessage.$inject = ['stateMailbox'];\n function onExitMessage(stateMailbox) {\n stateMailbox.selectedMessage = -1;\n }\n\n /**\n * @ngInject\n */\n // stateContent.$inject = ['stateMessage'];\n // function stateContent(stateMessage) {\n // return stateMessage.$editableContent();\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 event.preventDefault();\n if (toState.name != 'mail.account.inbox')\n $state.go('mail.account.inbox');\n else\n $state.go('mail');\n });\n $rootScope.$on('$routeChangeError', function(event, current, previous, rejection) {\n $log.error(event, current, previous, rejection);\n });\n }\n\n})();\n"]} \ No newline at end of file diff --git a/UI/WebServerResources/js/Scheduler.js b/UI/WebServerResources/js/Scheduler.js index 0985fa58f..a09a26aa9 100644 --- a/UI/WebServerResources/js/Scheduler.js +++ b/UI/WebServerResources/js/Scheduler.js @@ -1,2 +1,2 @@ -!function(){"use strict";function a(a,d){a.state("calendars",{url:"/calendar",views:{calendars:{templateUrl:"UIxCalMainView",controller:"CalendarsController",controllerAs:"app"}},resolve:{stateCalendars:b}}).state("calendars.view",{url:"/{view:(?:day|week|month|multicolumnday)}/:day",views:{calendarView:{templateUrl:function(a){return a.view+"view?day="+a.day},controller:"CalendarController",controllerAs:"calendar"}},resolve:{stateEventsBlocks:c}}),d.when("/calendar/day",function(){var a=new Date;return"/calendar/day/"+a.getDayString()}),d.when("/calendar/multicolumnday",function(){var a=new Date;return"/calendar/multicolumnday/"+a.getDayString()}),d.when("/calendar/week",function(){var a=new Date;return"/calendar/week/"+a.getDayString()}),d.when("/calendar/month",function(){var a=new Date;return"/calendar/month/"+a.getDayString()}),d.otherwise("/calendar")}function b(a){return a.$calendars||a.$findAll(window.calendarsData)}function c(a,b,c){return b.$eventsBlocksForView(a.view,a.day.asDate()).then(function(a){return _.forEach(a,function(a){a.id&&(a.calendar=new c({id:a.id,name:a.calendarName}))}),a})}function d(a,b,c,d,e){a.$on("$stateChangeError",function(a,c,e,f,g,h){b.error(h),d.go("calendar")}),a.$on("$routeChangeError",function(a,c,d,e){b.error(a,c,d,e)}),0===c.url().length&&e.ready().then(function(){var a="/calendar/",b=/(.+)view/.exec(e.settings.Calendar.View);a+=b?b[1]:"week",c.replace().url(a)})}angular.module("SOGo.SchedulerUI",["ui.router","angularFileUpload","SOGo.Common","SOGo.PreferencesUI","SOGo.ContactsUI","SOGo.MailerUI","ng-sortable"]).config(a).run(d),a.$inject=["$stateProvider","$urlRouterProvider"],b.$inject=["Calendar"],c.$inject=["$stateParams","Component","Calendar"],d.$inject=["$rootScope","$log","$location","$state","Preferences"]}(); +!function(){"use strict";function a(a,d){a.state("calendars",{url:"/calendar",views:{calendars:{templateUrl:"UIxCalMainView",controller:"CalendarsController",controllerAs:"app"}},resolve:{stateCalendars:b}}).state("calendars.view",{url:"/{view:(?:day|week|month|multicolumnday)}/:day",views:{calendarView:{templateUrl:function(a){return a.view+"view?day="+a.day},controller:"CalendarController",controllerAs:"calendar"}},resolve:{stateEventsBlocks:c}}),d.when("/calendar/day",function(){var a=new Date;return"/calendar/day/"+a.getDayString()}),d.when("/calendar/multicolumnday",function(){var a=new Date;return"/calendar/multicolumnday/"+a.getDayString()}),d.when("/calendar/week",function(){var a=new Date;return"/calendar/week/"+a.getDayString()}),d.when("/calendar/month",function(){var a=new Date;return"/calendar/month/"+a.getDayString()}),d.otherwise("/calendar")}function b(a){return a.$calendars||a.$findAll(window.calendarsData)}function c(a,b,c){return b.$eventsBlocksForView(a.view,a.day.asDate()).then(function(a){return _.forEach(a,function(a){a.id&&(a.calendar=new c({id:a.id,name:a.calendarName}))}),a})}function d(a,b,c,d,e){a.$on("$stateChangeError",function(a,c,e,f,g,h){b.error(h),d.go("calendar")}),a.$on("$routeChangeError",function(a,c,d,e){b.error(a,c,d,e)}),0===c.url().length&&e.ready().then(function(){var a="/calendar/",b=/(.+)view/.exec(e.settings.Calendar.View);a+=b?b[1]:"week",c.replace().url(a)})}angular.module("SOGo.SchedulerUI",["ngCookies","ui.router","angularFileUpload","SOGo.Common","SOGo.PreferencesUI","SOGo.ContactsUI","SOGo.MailerUI","ng-sortable"]).config(a).run(d),a.$inject=["$stateProvider","$urlRouterProvider"],b.$inject=["Calendar"],c.$inject=["$stateParams","Component","Calendar"],d.$inject=["$rootScope","$log","$location","$state","Preferences"]}(); //# sourceMappingURL=Scheduler.js.map \ No newline at end of file diff --git a/UI/WebServerResources/js/Scheduler.js.map b/UI/WebServerResources/js/Scheduler.js.map index 4ead3adfc..3dd5f30eb 100644 --- a/UI/WebServerResources/js/Scheduler.js.map +++ b/UI/WebServerResources/js/Scheduler.js.map @@ -1 +1 @@ -{"version":3,"sources":["Scheduler/Scheduler.app.js"],"names":["configure","$stateProvider","$urlRouterProvider","state","url","views","calendars","templateUrl","controller","controllerAs","resolve","stateCalendars","calendarView","$stateParams","view","day","stateEventsBlocks","when","now","Date","getDayString","otherwise","Calendar","$calendars","$findAll","window","calendarsData","Component","$eventsBlocksForView","asDate","then","_","forEach","id","calendar","name","calendarName","runBlock","$rootScope","$log","$location","$state","Preferences","$on","event","toState","toParams","fromState","fromParams","error","go","current","previous","rejection","length","ready","exec","settings","View","replace","angular","module","config","run","$inject"],"mappings":"CAGA,WACE,YAUA,SAASA,GAAUC,EAAgBC,GACjCD,EACGE,MAAM,aACLC,IAAK,YACLC,OACEC,WACEC,YAAa,iBACbC,WAAY,sBACZC,aAAc,QAGlBC,SACEC,eAAgBA,KAGnBR,MAAM,kBACLC,IAAK,iDAGLC,OACEO,cACEL,YAAa,SAASM,GAKpB,MAAOA,GAAaC,KAAO,YAAcD,EAAaE,KAExDP,WAAY,qBACZC,aAAc,aAGlBC,SACEM,kBAAmBA,KAIzBd,EAAmBe,KAAK,gBAAiB,WAEvC,GAAIC,GAAM,GAAIC,KACd,OAAO,iBAAmBD,EAAIE,iBAEhClB,EAAmBe,KAAK,2BAA4B,WAElD,GAAIC,GAAM,GAAIC,KACd,OAAO,4BAA8BD,EAAIE,iBAE3ClB,EAAmBe,KAAK,iBAAkB,WAExC,GAAIC,GAAM,GAAIC,KACd,OAAO,kBAAoBD,EAAIE,iBAEjClB,EAAmBe,KAAK,kBAAmB,WAEzC,GAAIC,GAAM,GAAIC,KACd,OAAO,mBAAqBD,EAAIE,iBAKlClB,EAAmBmB,UAAU,aAO/B,QAASV,GAAeW,GACtB,MAAOA,GAASC,YAAcD,EAASE,SAASC,OAAOC,eAOzD,QAASV,GAAkBH,EAAcc,EAAWL,GAElD,MAAOK,GAAUC,qBAAqBf,EAAaC,KAAMD,EAAaE,IAAIc,UACvEC,KAAK,SAASzB,GAQb,MAPA0B,GAAEC,QAAQ3B,EAAO,SAASS,GACpBA,EAAKmB,KAGPnB,EAAKoB,SAAW,GAAIZ,IAAWW,GAAInB,EAAKmB,GAAIE,KAAMrB,EAAKsB,kBAGpD/B,IAQb,QAASgC,GAASC,EAAYC,EAAMC,EAAWC,EAAQC,GACrDJ,EAAWK,IAAI,oBAAqB,SAASC,EAAOC,EAASC,EAAUC,EAAWC,EAAYC,GAC5FV,EAAKU,MAAMA,GACXR,EAAOS,GAAG,cAEZZ,EAAWK,IAAI,oBAAqB,SAASC,EAAOO,EAASC,EAAUC,GACrEd,EAAKU,MAAML,EAAOO,EAASC,EAAUC,KAER,IAA3Bb,EAAUpC,MAAMkD,QAElBZ,EAAYa,QAAQzB,KAAK,WACvB,GAAI1B,GAAM,aACNU,EAAO,WAAW0C,KAAKd,EAAYe,SAASnC,SAASoC,KAEvDtD,IADEU,EACKA,EAAK,GAEL,OACT0B,EAAUmB,UAAUvD,IAAIA,KAvH9BwD,QAAQC,OAAO,oBAAqB,YAAa,oBAAqB,cAAe,qBAAsB,kBAAmB,gBAAiB,gBAC5IC,OAAO9D,GACP+D,IAAI1B,GAKPrC,EAAUgE,SAAW,iBAAkB,sBAmEvCrD,EAAeqD,SAAW,YAQ1BhD,EAAkBgD,SAAW,eAAgB,YAAa,YAmB1D3B,EAAS2B,SAAW,aAAc,OAAQ,YAAa,SAAU","file":"Scheduler.js","sourcesContent":["/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* JavaScript for SOGo.SchedulerUI module */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.SchedulerUI', ['ui.router', 'angularFileUpload', 'SOGo.Common', 'SOGo.PreferencesUI', 'SOGo.ContactsUI', 'SOGo.MailerUI', 'ng-sortable'])\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('calendars', {\n url: '/calendar',\n views: {\n calendars: {\n templateUrl: 'UIxCalMainView', // UI/Templates/SchedulerUI/UIxCalMainView.wox\n controller: 'CalendarsController',\n controllerAs: 'app'\n }\n },\n resolve: {\n stateCalendars: stateCalendars\n }\n })\n .state('calendars.view', {\n url: '/{view:(?:day|week|month|multicolumnday)}/:day',\n //sticky: true,\n //deepStateRedirect: true,\n views: {\n calendarView: {\n templateUrl: function($stateParams) {\n // UI/Templates/SchedulerUI/UIxCalDayView.wox or\n // UI/Templates/SchedulerUI/UIxCalWeekView.wox or\n // UI/Templates/SchedulerUI/UIxCalMonthView.wox or\n // UI/Templates/SchedulerUI/UIxCalMulticolumnDayView.wox\n return $stateParams.view + 'view?day=' + $stateParams.day;\n },\n controller: 'CalendarController',\n controllerAs: 'calendar'\n }\n },\n resolve: {\n stateEventsBlocks: stateEventsBlocks\n }\n });\n\n $urlRouterProvider.when('/calendar/day', function() {\n // If no date is specified, show today\n var now = new Date();\n return '/calendar/day/' + now.getDayString();\n });\n $urlRouterProvider.when('/calendar/multicolumnday', function() {\n // If no date is specified, show today\n var now = new Date();\n return '/calendar/multicolumnday/' + now.getDayString();\n });\n $urlRouterProvider.when('/calendar/week', function() {\n // If no date is specified, show today's week\n var now = new Date();\n return '/calendar/week/' + now.getDayString();\n });\n $urlRouterProvider.when('/calendar/month', function() {\n // If no date is specified, show today's month\n var now = new Date();\n return '/calendar/month/' + now.getDayString();\n });\n\n // If none of the above states are matched, use this as the fallback.\n // runBlock will also act as a fallback by looking at user's settings\n $urlRouterProvider.otherwise('/calendar');\n }\n\n /**\n * @ngInject\n */\n stateCalendars.$inject = ['Calendar'];\n function stateCalendars(Calendar) {\n return Calendar.$calendars || Calendar.$findAll(window.calendarsData);\n }\n\n /**\n * @ngInject\n */\n stateEventsBlocks.$inject = ['$stateParams', 'Component', 'Calendar'];\n function stateEventsBlocks($stateParams, Component, Calendar) {\n // See CalendarController.js\n return Component.$eventsBlocksForView($stateParams.view, $stateParams.day.asDate())\n .then(function(views) {\n _.forEach(views, function(view) {\n if (view.id) {\n // Note: this can't be done in Component service since it would make Component dependent on\n // the Calendar service and create a circular dependency\n view.calendar = new Calendar({ id: view.id, name: view.calendarName });\n }\n });\n return views;\n });\n }\n\n /**\n * @ngInject\n */\n runBlock.$inject = ['$rootScope', '$log', '$location', '$state', 'Preferences'];\n function runBlock($rootScope, $log, $location, $state, Preferences) {\n $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {\n $log.error(error);\n $state.go('calendar');\n });\n $rootScope.$on('$routeChangeError', function(event, current, previous, rejection) {\n $log.error(event, current, previous, rejection);\n });\n if ($location.url().length === 0) {\n // Restore user's last view\n Preferences.ready().then(function() {\n var url = '/calendar/',\n view = /(.+)view/.exec(Preferences.settings.Calendar.View);\n if (view)\n url += view[1];\n else\n url += 'week';\n $location.replace().url(url);\n });\n }\n }\n\n})();\n"]} \ No newline at end of file +{"version":3,"sources":["Scheduler/Scheduler.app.js"],"names":["configure","$stateProvider","$urlRouterProvider","state","url","views","calendars","templateUrl","controller","controllerAs","resolve","stateCalendars","calendarView","$stateParams","view","day","stateEventsBlocks","when","now","Date","getDayString","otherwise","Calendar","$calendars","$findAll","window","calendarsData","Component","$eventsBlocksForView","asDate","then","_","forEach","id","calendar","name","calendarName","runBlock","$rootScope","$log","$location","$state","Preferences","$on","event","toState","toParams","fromState","fromParams","error","go","current","previous","rejection","length","ready","exec","settings","View","replace","angular","module","config","run","$inject"],"mappings":"CAGA,WACE,YAUA,SAASA,GAAUC,EAAgBC,GACjCD,EACGE,MAAM,aACLC,IAAK,YACLC,OACEC,WACEC,YAAa,iBACbC,WAAY,sBACZC,aAAc,QAGlBC,SACEC,eAAgBA,KAGnBR,MAAM,kBACLC,IAAK,iDAGLC,OACEO,cACEL,YAAa,SAASM,GAKpB,MAAOA,GAAaC,KAAO,YAAcD,EAAaE,KAExDP,WAAY,qBACZC,aAAc,aAGlBC,SACEM,kBAAmBA,KAIzBd,EAAmBe,KAAK,gBAAiB,WAEvC,GAAIC,GAAM,GAAIC,KACd,OAAO,iBAAmBD,EAAIE,iBAEhClB,EAAmBe,KAAK,2BAA4B,WAElD,GAAIC,GAAM,GAAIC,KACd,OAAO,4BAA8BD,EAAIE,iBAE3ClB,EAAmBe,KAAK,iBAAkB,WAExC,GAAIC,GAAM,GAAIC,KACd,OAAO,kBAAoBD,EAAIE,iBAEjClB,EAAmBe,KAAK,kBAAmB,WAEzC,GAAIC,GAAM,GAAIC,KACd,OAAO,mBAAqBD,EAAIE,iBAKlClB,EAAmBmB,UAAU,aAO/B,QAASV,GAAeW,GACtB,MAAOA,GAASC,YAAcD,EAASE,SAASC,OAAOC,eAOzD,QAASV,GAAkBH,EAAcc,EAAWL,GAElD,MAAOK,GAAUC,qBAAqBf,EAAaC,KAAMD,EAAaE,IAAIc,UACvEC,KAAK,SAASzB,GAQb,MAPA0B,GAAEC,QAAQ3B,EAAO,SAASS,GACpBA,EAAKmB,KAGPnB,EAAKoB,SAAW,GAAIZ,IAAWW,GAAInB,EAAKmB,GAAIE,KAAMrB,EAAKsB,kBAGpD/B,IAQb,QAASgC,GAASC,EAAYC,EAAMC,EAAWC,EAAQC,GACrDJ,EAAWK,IAAI,oBAAqB,SAASC,EAAOC,EAASC,EAAUC,EAAWC,EAAYC,GAC5FV,EAAKU,MAAMA,GACXR,EAAOS,GAAG,cAEZZ,EAAWK,IAAI,oBAAqB,SAASC,EAAOO,EAASC,EAAUC,GACrEd,EAAKU,MAAML,EAAOO,EAASC,EAAUC,KAER,IAA3Bb,EAAUpC,MAAMkD,QAElBZ,EAAYa,QAAQzB,KAAK,WACvB,GAAI1B,GAAM,aACNU,EAAO,WAAW0C,KAAKd,EAAYe,SAASnC,SAASoC,KAEvDtD,IADEU,EACKA,EAAK,GAEL,OACT0B,EAAUmB,UAAUvD,IAAIA,KAvH9BwD,QAAQC,OAAO,oBAAqB,YAAa,YAAa,oBAAqB,cAAe,qBAAsB,kBAAmB,gBAAiB,gBACzJC,OAAO9D,GACP+D,IAAI1B,GAKPrC,EAAUgE,SAAW,iBAAkB,sBAmEvCrD,EAAeqD,SAAW,YAQ1BhD,EAAkBgD,SAAW,eAAgB,YAAa,YAmB1D3B,EAAS2B,SAAW,aAAc,OAAQ,YAAa,SAAU","file":"Scheduler.js","sourcesContent":["/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* JavaScript for SOGo.SchedulerUI module */\n\n(function() {\n 'use strict';\n\n angular.module('SOGo.SchedulerUI', ['ngCookies', 'ui.router', 'angularFileUpload', 'SOGo.Common', 'SOGo.PreferencesUI', 'SOGo.ContactsUI', 'SOGo.MailerUI', 'ng-sortable'])\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('calendars', {\n url: '/calendar',\n views: {\n calendars: {\n templateUrl: 'UIxCalMainView', // UI/Templates/SchedulerUI/UIxCalMainView.wox\n controller: 'CalendarsController',\n controllerAs: 'app'\n }\n },\n resolve: {\n stateCalendars: stateCalendars\n }\n })\n .state('calendars.view', {\n url: '/{view:(?:day|week|month|multicolumnday)}/:day',\n //sticky: true,\n //deepStateRedirect: true,\n views: {\n calendarView: {\n templateUrl: function($stateParams) {\n // UI/Templates/SchedulerUI/UIxCalDayView.wox or\n // UI/Templates/SchedulerUI/UIxCalWeekView.wox or\n // UI/Templates/SchedulerUI/UIxCalMonthView.wox or\n // UI/Templates/SchedulerUI/UIxCalMulticolumnDayView.wox\n return $stateParams.view + 'view?day=' + $stateParams.day;\n },\n controller: 'CalendarController',\n controllerAs: 'calendar'\n }\n },\n resolve: {\n stateEventsBlocks: stateEventsBlocks\n }\n });\n\n $urlRouterProvider.when('/calendar/day', function() {\n // If no date is specified, show today\n var now = new Date();\n return '/calendar/day/' + now.getDayString();\n });\n $urlRouterProvider.when('/calendar/multicolumnday', function() {\n // If no date is specified, show today\n var now = new Date();\n return '/calendar/multicolumnday/' + now.getDayString();\n });\n $urlRouterProvider.when('/calendar/week', function() {\n // If no date is specified, show today's week\n var now = new Date();\n return '/calendar/week/' + now.getDayString();\n });\n $urlRouterProvider.when('/calendar/month', function() {\n // If no date is specified, show today's month\n var now = new Date();\n return '/calendar/month/' + now.getDayString();\n });\n\n // If none of the above states are matched, use this as the fallback.\n // runBlock will also act as a fallback by looking at user's settings\n $urlRouterProvider.otherwise('/calendar');\n }\n\n /**\n * @ngInject\n */\n stateCalendars.$inject = ['Calendar'];\n function stateCalendars(Calendar) {\n return Calendar.$calendars || Calendar.$findAll(window.calendarsData);\n }\n\n /**\n * @ngInject\n */\n stateEventsBlocks.$inject = ['$stateParams', 'Component', 'Calendar'];\n function stateEventsBlocks($stateParams, Component, Calendar) {\n // See CalendarController.js\n return Component.$eventsBlocksForView($stateParams.view, $stateParams.day.asDate())\n .then(function(views) {\n _.forEach(views, function(view) {\n if (view.id) {\n // Note: this can't be done in Component service since it would make Component dependent on\n // the Calendar service and create a circular dependency\n view.calendar = new Calendar({ id: view.id, name: view.calendarName });\n }\n });\n return views;\n });\n }\n\n /**\n * @ngInject\n */\n runBlock.$inject = ['$rootScope', '$log', '$location', '$state', 'Preferences'];\n function runBlock($rootScope, $log, $location, $state, Preferences) {\n $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {\n $log.error(error);\n $state.go('calendar');\n });\n $rootScope.$on('$routeChangeError', function(event, current, previous, rejection) {\n $log.error(event, current, previous, rejection);\n });\n if ($location.url().length === 0) {\n // Restore user's last view\n Preferences.ready().then(function() {\n var url = '/calendar/',\n view = /(.+)view/.exec(Preferences.settings.Calendar.View);\n if (view)\n url += view[1];\n else\n url += 'week';\n $location.replace().url(url);\n });\n }\n }\n\n})();\n"]} \ No newline at end of file diff --git a/UI/WebServerResources/js/vendor/angular-file-upload.min.js b/UI/WebServerResources/js/vendor/angular-file-upload.min.js index b810251b8..a706f9ce0 100644 --- a/UI/WebServerResources/js/vendor/angular-file-upload.min.js +++ b/UI/WebServerResources/js/vendor/angular-file-upload.min.js @@ -1,2 +1,2 @@ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports["angular-file-upload"]=b():a["angular-file-upload"]=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";var d=function(a){return a&&a.__esModule?a["default"]:a},e=d(c(1)),f=d(c(2)),g=d(c(3)),h=d(c(4)),i=d(c(5)),j=d(c(6)),k=d(c(7)),l=d(c(8)),m=d(c(9)),n=d(c(10)),o=d(c(11)),p=d(c(12));angular.module(e.name,[]).value("fileUploaderOptions",f).factory("FileUploader",g).factory("FileLikeObject",h).factory("FileItem",i).factory("FileDirective",j).factory("FileSelect",k).factory("FileDrop",l).factory("FileOver",m).directive("nvFileSelect",n).directive("nvFileDrop",o).directive("nvFileOver",p).run(["FileUploader","FileLikeObject","FileItem","FileDirective","FileSelect","FileDrop","FileOver",function(a,b,c,d,e,f,g){a.FileLikeObject=b,a.FileItem=c,a.FileDirective=d,a.FileSelect=e,a.FileDrop=f,a.FileOver=g}])},function(a,b){a.exports={name:"angularFileUpload"}},function(a,b){"use strict";a.exports={url:"/",alias:"file",headers:{},queue:[],progress:0,autoUpload:!1,removeAfterUpload:!1,method:"POST",filters:[],formData:[],queueLimit:Number.MAX_VALUE,withCredentials:!1}},function(a,b,c){"use strict";var d=function(a){return a&&a.__esModule?a["default"]:a},e=function(){function a(a,b){for(var c in b){var d=b[c];d.configurable=!0,d.value&&(d.writable=!0)}Object.defineProperties(a,b)}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),f=function(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")},g=(d(c(1)),angular.copy),h=angular.extend,i=angular.forEach,j=angular.isObject,k=angular.isNumber,l=angular.isDefined,m=angular.isArray,n=angular.element;a.exports=function(a,b,c,d,o,p){var q=d.File,r=d.FormData,s=function(){function d(b){f(this,d);var c=g(a);h(this,c,b,{isUploading:!1,_nextIndex:0,_failFilterIndex:-1,_directives:{select:[],drop:[],over:[]}}),this.filters.unshift({name:"queueLimit",fn:this._queueLimitFilter}),this.filters.unshift({name:"folder",fn:this._folderFilter})}return e(d,{addToQueue:{value:function(a,b,c){var d=this,e=this.isArrayLikeObject(a)?a:[a],f=this._getFilters(c),g=this.queue.length,h=[];i(e,function(a){var c=new o(a);if(d._isValidFile(c,f,b)){var e=new p(d,a,b);h.push(e),d.queue.push(e),d._onAfterAddingFile(e)}else{var g=f[d._failFilterIndex];d._onWhenAddingFileFailed(c,g,b)}}),this.queue.length!==g&&(this._onAfterAddingAll(h),this.progress=this._getTotalProgress()),this._render(),this.autoUpload&&this.uploadAll()}},removeFromQueue:{value:function(a){var b=this.getIndexOfItem(a),c=this.queue[b];c.isUploading&&c.cancel(),this.queue.splice(b,1),c._destroy(),this.progress=this._getTotalProgress()}},clearQueue:{value:function(){for(;this.queue.length;)this.queue[0].remove();this.progress=0}},uploadItem:{value:function(a){var b=this.getIndexOfItem(a),c=this.queue[b],d=this.isHTML5?"_xhrTransport":"_iframeTransport";c._prepareToUploading(),this.isUploading||(this.isUploading=!0,this[d](c))}},cancelItem:{value:function(a){var b=this.getIndexOfItem(a),c=this.queue[b],d=this.isHTML5?"_xhr":"_form";c&&c.isUploading&&c[d].abort()}},uploadAll:{value:function(){var a=this.getNotUploadedItems().filter(function(a){return!a.isUploading});a.length&&(i(a,function(a){return a._prepareToUploading()}),a[0].upload())}},cancelAll:{value:function(){var a=this.getNotUploadedItems();i(a,function(a){return a.cancel()})}},isFile:{value:function(a){return this.constructor.isFile(a)}},isFileLikeObject:{value:function(a){return this.constructor.isFileLikeObject(a)}},isArrayLikeObject:{value:function(a){return this.constructor.isArrayLikeObject(a)}},getIndexOfItem:{value:function(a){return k(a)?a:this.queue.indexOf(a)}},getNotUploadedItems:{value:function(){return this.queue.filter(function(a){return!a.isUploaded})}},getReadyItems:{value:function(){return this.queue.filter(function(a){return a.isReady&&!a.isUploading}).sort(function(a,b){return a.index-b.index})}},destroy:{value:function(){var a=this;i(this._directives,function(b){i(a._directives[b],function(a){a.destroy()})})}},onAfterAddingAll:{value:function(a){}},onAfterAddingFile:{value:function(a){}},onWhenAddingFileFailed:{value:function(a,b,c){}},onBeforeUploadItem:{value:function(a){}},onProgressItem:{value:function(a,b){}},onProgressAll:{value:function(a){}},onSuccessItem:{value:function(a,b,c,d){}},onErrorItem:{value:function(a,b,c,d){}},onCancelItem:{value:function(a,b,c,d){}},onCompleteItem:{value:function(a,b,c,d){}},onCompleteAll:{value:function(){}},_getTotalProgress:{value:function(a){if(this.removeAfterUpload)return a||0;var b=this.getNotUploadedItems().length,c=b?this.queue.length-b:this.queue.length,d=100/this.queue.length,e=(a||0)*d/100;return Math.round(c*d+e)}},_getFilters:{value:function(a){if(!a)return this.filters;if(m(a))return a;var b=a.match(/[^\s,]+/g);return this.filters.filter(function(a){return-1!==b.indexOf(a.name)})}},_render:{value:function(){b.$$phase||b.$apply()}},_folderFilter:{value:function(a){return!(!a.size&&!a.type)}},_queueLimitFilter:{value:function(){return this.queue.length=200&&300>a||304===a}},_transformResponse:{value:function(a,b){var d=this._headersGetter(b);return i(c.defaults.transformResponse,function(b){a=b(a,d)}),a}},_parseHeaders:{value:function(a){var b,c,d,e={};return a?(i(a.split("\n"),function(a){d=a.indexOf(":"),b=a.slice(0,d).trim().toLowerCase(),c=a.slice(d+1).trim(),b&&(e[b]=e[b]?e[b]+", "+c:c)}),e):e}},_headersGetter:{value:function(a){return function(b){return b?a[b.toLowerCase()]||null:a}}},_xhrTransport:{value:function(a){var b=this,c=a._xhr=new XMLHttpRequest,d=new r;if(this._onBeforeUploadItem(a),i(a.formData,function(a){i(a,function(a,b){d.append(b,a)})}),"number"!=typeof a._file.size)throw new TypeError("The file specified is no longer valid");d.append(a.alias,a._file,a.file.name),c.upload.onprogress=function(c){var d=Math.round(c.lengthComputable?100*c.loaded/c.total:0);b._onProgressItem(a,d)},c.onload=function(){var d=b._parseHeaders(c.getAllResponseHeaders()),e=b._transformResponse(c.response,d),f=b._isSuccessCode(c.status)?"Success":"Error",g="_on"+f+"Item";b[g](a,e,c.status,d),b._onCompleteItem(a,e,c.status,d)},c.onerror=function(){var d=b._parseHeaders(c.getAllResponseHeaders()),e=b._transformResponse(c.response,d);b._onErrorItem(a,e,c.status,d),b._onCompleteItem(a,e,c.status,d)},c.onabort=function(){var d=b._parseHeaders(c.getAllResponseHeaders()),e=b._transformResponse(c.response,d);b._onCancelItem(a,e,c.status,d),b._onCompleteItem(a,e,c.status,d)},c.open(a.method,a.url,!0),c.withCredentials=a.withCredentials,i(a.headers,function(a,b){c.setRequestHeader(b,a)}),c.send(d),this._render()}},_iframeTransport:{value:function(a){var b=this,c=n('
'),d=n('