sogo/UI/WebServerResources/js/Scheduler.js.map
Francis Lachapelle 369060a52f (js/css) Update generated files
With Angular Material 0.11.3
2015-10-13 16:05:39 -04:00

1 line
55 KiB
Plaintext

{"version":3,"file":"Scheduler.js","sources":["Scheduler/Scheduler.app.js","Scheduler/CalendarController.js","Scheduler/CalendarListController.js","Scheduler/CalendarsController.js","Scheduler/ComponentController.js","Scheduler/sgCalendarDayBlock.directive.js","Scheduler/sgCalendarDayTable.directive.js","Scheduler/sgCalendarMonthDay.directive.js","Scheduler/sgCalendarMonthEvent.directive.js","Scheduler/sgCalendarTable.directive.js","Scheduler/sgDraggableBlock.directive.js"],"names":["configure","$stateProvider","$urlRouterProvider","state","url","views","calendars","templateUrl","controller","controllerAs","resolve","stateCalendars","sticky","deepStateRedirect","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","CalendarController","$scope","$timeout","$interval","focus","changeView","$event","date","element","currentTarget","attr","vm","this","data","CalendarListController","$mdDialog","Dialog","selectComponentType","type","options","reload","componentType","isUndefined","$filter","unselectComponents","saveSelectedList","each","component","selected","selectAll","toggleComponentSelection","preventDefault","stopPropagation","confirmDeleteSelectedComponents","confirm","l","components","filter","$deleteComponents","status","openEvent","viewable","openComponent","openTask","task","capitalize","show","parent","document","body","targetEvent","clickOutsideToClose","escapeToClose","locals","stateComponent","newComponent","pid","filterpopup","filteredBy","sort","field","sortedBy","cancelSearch","mode","search","value","selectedList","SelectedList","CalendarsController","$window","Settings","User","newCalendar","ev","prompt","isEditable","isRemote","owner","UserLogin","$add","addWebCalendar","inputType","$addWebCalendar","confirmDelete","folder","isSubscription","$delete","$broadcast","alert","showLinks","LinksDialogController","close","hide","showProperties","PropertiesDialogController","saveProperties","$save","init","$omit","editFolder","editMode","revertEditing","$reset","renameFolder","$rename","share","$acl","$users","usersWithACL","users","subscribeToFolder","calendarData","debug","$subscribe","today","fragments","location","hash","split","path","join","activeUser","service","$watch","union","map","o","pick","$subscriptions","$webcalendars","newList","oldList","ids","pluck","i","isEqual","$get","$setActivation","ComponentController","AddressBook","Alarm","cardFilter","$query","$filterAll","$cards","edit","editAllOccurrences","$getComponent","$futureComponentData","reply","c","$reply","getAlarms","replyAllOccurrences","delegatedTo","$hasAlarm","alarm","deleteOccurrence","remove","deleteAllOccurrences","viewRawSource","$$resource","post","ComponentRawSourceDialogController","scope","template","c_folder","c_name","c_recurrence_id","organizer","ComponentEditorController","Card","addAttachUrl","toggleRecurrenceEditor","showRecurrenceEditor","$hasCustomRepeat","toggleAttendeesEditor","showAttendeesEditor","addAttendee","card","isString","isValidEmail","emails","searchText","save","form","$valid","cancel","isNew","getDays","days","start","end","daysUpTo","stringWithSeparator","getHours","hours","push","toString","categories","isDefined","attendees","attendeesEditor","startDate","endDate","newStartDate","oldStartDate","addMinutes","delta","freebusy","updateFreeBusyCoverage","newEndDate","oldEndDate","Math","floor","abs","sgCalendarDayBlock","link","iElement","attrs","pc","block","siblings","left","position","right","css","addClass","restrict","clickBlock","directive","sgCalendarDayTable","blocks","sgCalendarMonthDay","sgCalendarMonthEvent","sgCalendarTable","blocksType","sgDraggableBlock","$mdGesture","onDragStart","console","srcElement","getBoundingClientRect","top","clientY","on"],"mappings":"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","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', ['ngSanitize', 'ui.router', 'SOGo.Common', 'SOGo.PreferencesUI', 'SOGo.ContactsUI', '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('calendars', {\n url: '/calendar',\n views: {\n calendars: {\n templateUrl: 'UIxCalMainFrame', // UI/Templates/SchedulerUI/UIxCalMainFrame.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 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 view = /(.+)view/.exec(Preferences.settings.Calendar.View);\n if (view) {\n $location.replace().url('/calendar/' + view[1]);\n }\n });\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 CalendarController.$inject = ['$scope', '$state', '$stateParams', '$timeout', '$interval', '$log', 'sgFocus', 'Calendar', 'Component', 'stateEventsBlocks'];\n function CalendarController($scope, $state, $stateParams, $timeout, $interval, $log, focus, Calendar, Component, stateEventsBlocks) {\n var vm = this;\n\n vm.views = stateEventsBlocks;\n vm.changeView = changeView;\n\n // Refresh current view when the list of calendars is modified\n $scope.$on('calendars:list', function() {\n // See stateEventsBlocks in Scheduler.app.js\n Component.$eventsBlocksForView($stateParams.view, $stateParams.day.asDate()).then(function(data) {\n vm.views = data;\n _.forEach(vm.views, function(view) {\n if (view.id) {\n view.calendar = new Calendar({ id: view.id, name: view.calendarName });\n }\n });\n });\n });\n\n // Change calendar's view\n function changeView($event) {\n var date = angular.element($event.currentTarget).attr('date');\n $state.go('calendars.view', { view: $stateParams.view, day: date });\n }\n }\n\n angular\n .module('SOGo.SchedulerUI') \n .controller('CalendarController', CalendarController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @ngInject\n */\n CalendarListController.$inject = ['$scope', '$timeout', '$state', '$mdDialog', 'Dialog', 'Preferences', 'Calendar', 'Component'];\n function CalendarListController($scope, $timeout, $state, $mdDialog, Dialog, Preferences, Calendar, Component) {\n var vm = this;\n\n vm.component = Component;\n vm.componentType = 'events';\n vm.selectedList = 0;\n vm.selectComponentType = selectComponentType;\n vm.unselectComponents = unselectComponents;\n vm.selectAll = selectAll;\n vm.toggleComponentSelection = toggleComponentSelection;\n vm.confirmDeleteSelectedComponents = confirmDeleteSelectedComponents;\n vm.openEvent = openEvent;\n vm.openTask = openTask;\n vm.newComponent = newComponent;\n vm.filter = filter;\n vm.filteredBy = filteredBy;\n vm.sort = sort;\n vm.sortedBy = sortedBy;\n vm.cancelSearch = cancelSearch;\n vm.mode = { search: false };\n\n // Select list based on user's settings\n Preferences.ready().then(function() {\n var type = 'events';\n if (Preferences.settings.Calendar.SelectedList == 'tasksListView') {\n vm.selectedList = 1;\n type = 'tasks';\n }\n selectComponentType(type, { reload: true });\n });\n\n // Refresh current list when the list of calendars is modified\n $scope.$on('calendars:list', function() {\n Component.$filter(vm.componentType, { reload: true });\n });\n\n // Switch between components tabs\n function selectComponentType(type, options) {\n if (options && options.reload || vm.componentType != type) {\n // TODO: save user settings (Calendar.SelectedList)\n if (angular.isUndefined(Component['$' + type]))\n Component.$filter(type);\n vm.unselectComponents();\n vm.componentType = type;\n Component.saveSelectedList(type);\n }\n }\n\n function unselectComponents() {\n _.each(Component['$' + vm.componentType], function(component) { component.selected = false; });\n }\n\n function selectAll() {\n _.each(Component['$' + vm.componentType], function(component) {\n component.selected = true;\n });\n }\n\n function toggleComponentSelection($event, component) {\n component.selected = !component.selected;\n $event.preventDefault();\n $event.stopPropagation();\n }\n\n function confirmDeleteSelectedComponents() {\n Dialog.confirm(l('Warning'),\n l('Are you sure you want to delete the selected components?'))\n .then(function() {\n // User confirmed the deletion\n var components = _.filter(Component['$' + vm.componentType], function(component) { return component.selected; });\n Calendar.$deleteComponents(components);\n }, function(data, status) {\n // Delete failed\n });\n }\n\n function openEvent($event, event) {\n if (event.viewable)\n openComponent($event, event, 'appointment');\n }\n\n function openTask($event, task) {\n if (task.viewable)\n openComponent($event, task, 'task');\n }\n\n function openComponent($event, component, type) {\n // UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox or\n // UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox\n var templateUrl = 'UIx' + type.capitalize() + 'ViewTemplate';\n $mdDialog.show({\n parent: angular.element(document.body),\n targetEvent: $event,\n clickOutsideToClose: true,\n escapeToClose: true,\n templateUrl: templateUrl,\n controller: 'ComponentController',\n controllerAs: 'editor',\n locals: {\n stateComponent: component\n }\n });\n }\n\n function newComponent($event) {\n var type = 'appointment', component;\n\n if (vm.componentType == 'tasks')\n type = 'task';\n component = new Component({ pid: 'personal', type: type });\n\n // UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox or\n // UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox\n var templateUrl = 'UIx' + type.capitalize() + 'EditorTemplate';\n $mdDialog.show({\n parent: angular.element(document.body),\n targetEvent: $event,\n clickOutsideToClose: true,\n escapeToClose: true,\n templateUrl: templateUrl,\n controller: 'ComponentEditorController',\n controllerAs: 'editor',\n locals: {\n stateComponent: component\n }\n });\n }\n\n function filter(filterpopup) {\n Component.$filter(vm.componentType, { filterpopup: filterpopup });\n }\n\n function filteredBy(filterpopup) {\n return Component['$query' + vm.componentType.capitalize()].filterpopup == filterpopup;\n }\n\n function sort(field) {\n Component.$filter(vm.componentType, { sort: field });\n }\n\n function sortedBy(field) {\n return Component['$query' + vm.componentType.capitalize()].sort == field;\n }\n\n function cancelSearch() {\n vm.mode.search = false;\n Component.$filter(vm.componentType, { value: '' });\n }\n }\n \n angular\n .module('SOGo.SchedulerUI')\n .controller('CalendarListController', CalendarListController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @ngInject\n */\n CalendarsController.$inject = ['$scope', '$window', '$mdDialog', '$log', 'sgFocus', 'Dialog', 'sgSettings', 'Calendar', 'User', 'stateCalendars'];\n function CalendarsController($scope, $window, $mdDialog, $log, focus, Dialog, Settings, Calendar, User, stateCalendars) {\n var vm = this;\n\n vm.activeUser = Settings.activeUser;\n vm.service = Calendar;\n vm.newCalendar = newCalendar;\n vm.addWebCalendar = addWebCalendar;\n vm.confirmDelete = confirmDelete;\n vm.editFolder = editFolder;\n vm.revertEditing = revertEditing;\n vm.renameFolder = renameFolder;\n vm.share = share;\n vm.showLinks = showLinks;\n vm.showProperties = showProperties;\n vm.subscribeToFolder = subscribeToFolder;\n vm.today = today;\n\n // Dispatch the event named 'calendars:list' when a calendar is activated or deactivated or\n // when the color of a calendar is changed\n $scope.$watch(\n function() {\n return _.union(\n _.map(Calendar.$calendars, function(o) { return _.pick(o, ['id', 'active', 'color']); }),\n _.map(Calendar.$subscriptions, function(o) { return _.pick(o, ['id', 'active', 'color']); }),\n _.map(Calendar.$webcalendars, function(o) { return _.pick(o, ['id', 'active', 'color']); })\n );\n },\n function(newList, oldList) {\n // Identify which calendar has changed\n var ids = _.pluck(_.filter(newList, function(o, i) { return !_.isEqual(o, oldList[i]); }), 'id');\n if (ids.length > 0) {\n $log.debug(ids.join(', ') + ' changed');\n _.each(ids, function(id) {\n var calendar = Calendar.$get(id);\n calendar.$setActivation().then(function() {\n $scope.$broadcast('calendars:list');\n });\n });\n }\n },\n true // compare for object equality\n );\n\n function newCalendar(ev) {\n Dialog.prompt(l('New calendar'), l('Name of the Calendar'))\n .then(function(name) {\n var calendar = new Calendar(\n {\n name: name,\n isEditable: true,\n isRemote: false,\n owner: UserLogin\n }\n );\n Calendar.$add(calendar);\n });\n }\n\n function addWebCalendar() {\n Dialog.prompt(l('Subscribe to a web calendar...'), l('URL of the Calendar'), {inputType: 'url'})\n .then(function(url) {\n Calendar.$addWebCalendar(url);\n });\n }\n\n function confirmDelete(folder) {\n if (folder.isSubscription) {\n // Unsubscribe without confirmation\n folder.$delete()\n .then(function() {\n $scope.$broadcast('calendars:list');\n }, function(data, status) {\n Dialog.alert(l('An error occured while deleting the calendar \"%{0}\".', folder.name),\n l(data.error));\n });\n }\n else {\n Dialog.confirm(l('Warning'), l('Are you sure you want to delete the calendar <em>%{0}</em>?', folder.name))\n .then(function() {\n folder.$delete()\n .then(function() {\n $scope.$broadcast('calendars:list');\n }, function(data, status) {\n Dialog.alert(l('An error occured while deleting the calendar \"%{0}\".', folder.name),\n l(data.error));\n });\n });\n }\n }\n\n function showLinks(calendar) {\n $mdDialog.show({\n parent: angular.element(document.body),\n clickOutsideToClose: true,\n escapeToClose: true,\n templateUrl: calendar.id + '/links',\n controller: LinksDialogController,\n controllerAs: 'links',\n locals: {\n calendar: calendar\n }\n });\n \n /**\n * @ngInject\n */\n LinksDialogController.$inject = ['$mdDialog', 'calendar'];\n function LinksDialogController($mdDialog, calendar) {\n var vm = this;\n vm.calendar = calendar;\n vm.close = close;\n\n function close() {\n $mdDialog.hide();\n }\n }\n }\n\n function showProperties(calendar) {\n $mdDialog.show({\n templateUrl: calendar.id + '/properties',\n controller: PropertiesDialogController,\n controllerAs: 'properties',\n clickOutsideToClose: true,\n escapeToClose: true,\n locals: {\n calendar: calendar\n }\n });\n \n /**\n * @ngInject\n */\n PropertiesDialogController.$inject = ['$mdDialog', 'calendar'];\n function PropertiesDialogController($mdDialog, calendar) {\n var vm = this;\n\n vm.calendar = new Calendar(calendar.$omit());\n vm.saveProperties = saveProperties;\n vm.close = close;\n\n function saveProperties() {\n vm.calendar.$save();\n // Refresh list instance\n calendar.init(vm.calendar.$omit());\n $mdDialog.hide();\n }\n\n function close() {\n $mdDialog.hide();\n }\n }\n }\n\n function editFolder(folder) {\n vm.calendarName = folder.name;\n vm.editMode = folder.id;\n focus('calendarName_' + folder.id);\n }\n\n function revertEditing(folder) {\n folder.$reset();\n vm.editMode = false;\n }\n\n function renameFolder(folder) {\n folder.$rename()\n .then(function(data) {\n vm.editMode = false;\n }, function(data, status) {\n Dialog.alert(l('Warning'), data);\n });\n }\n\n function share(calendar) {\n calendar.$acl.$users().then(function() {\n $mdDialog.show({\n templateUrl: calendar.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: calendar.$acl.users,\n User: User,\n folder: calendar\n }\n });\n });\n }\n\n // Callback of sgSubscribe directive\n function subscribeToFolder(calendarData) {\n $log.debug('subscribeToFolder ' + calendarData.owner + calendarData.name);\n Calendar.$subscribe(calendarData.owner, calendarData.name).catch(function(data) {\n Dialog.alert(l('Warning'), l('An error occured please try again.'));\n });\n }\n\n function today() {\n var fragments = $window.location.hash.split('/'),\n state = fragments[1],\n view = fragments[2],\n now = new Date(),\n path = ['#', state, view, now.getDayString()];\n $window.location = path.join('/');\n }\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .controller('CalendarsController', CalendarsController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /**\n * @ngInject\n */\n ComponentController.$inject = ['$rootScope', '$mdDialog', 'Calendar', 'AddressBook', 'Alarm', 'stateComponent'];\n function ComponentController($rootScope, $mdDialog, Calendar, AddressBook, Alarm, stateComponent) {\n var vm = this, component;\n\n vm.component = stateComponent;\n vm.close = close;\n vm.cardFilter = cardFilter;\n vm.edit = edit;\n vm.editAllOccurrences = editAllOccurrences;\n vm.reply = reply;\n vm.replyAllOccurrences = replyAllOccurrences;\n vm.deleteOccurrence = deleteOccurrence;\n vm.deleteAllOccurrences = deleteAllOccurrences;\n vm.viewRawSource = viewRawSource;\n\n // Load all attributes of component\n if (angular.isUndefined(vm.component.$futureComponentData)) {\n component = Calendar.$get(vm.component.c_folder).$getComponent(vm.component.c_name, vm.component.c_recurrence_id);\n component.$futureComponentData.then(function() {\n vm.component = component;\n vm.organizer = [vm.component.organizer];\n });\n }\n\n function close() {\n $mdDialog.hide();\n }\n\n // Autocomplete cards for attendees\n function cardFilter($query) {\n AddressBook.$filterAll($query);\n return AddressBook.$cards;\n }\n\n function edit() {\n var type = (vm.component.component == 'vevent')? 'Appointment':'Task';\n $mdDialog.hide().then(function() {\n // UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox or\n // UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox\n var templateUrl = 'UIx' + type + 'EditorTemplate';\n $mdDialog.show({\n parent: angular.element(document.body),\n clickOutsideToClose: true,\n escapeToClose: true,\n templateUrl: templateUrl,\n controller: 'ComponentEditorController',\n controllerAs: 'editor',\n locals: {\n stateComponent: vm.component\n }\n });\n });\n }\n\n function editAllOccurrences() {\n component = Calendar.$get(vm.component.pid).$getComponent(vm.component.id);\n component.$futureComponentData.then(function() {\n vm.component = component;\n edit();\n });\n }\n\n function reply(component) {\n var c = component || vm.component;\n\n c.$reply().then(function() {\n $rootScope.$broadcast('calendars:list');\n $mdDialog.hide();\n Alarm.getAlarms();\n });\n }\n\n function replyAllOccurrences() {\n // Retrieve master event\n component = Calendar.$get(vm.component.pid).$getComponent(vm.component.id);\n component.$futureComponentData.then(function() {\n // Propagate the participant status and alarm to the master event\n component.reply = vm.component.reply;\n component.delegatedTo = vm.component.delegatedTo;\n component.$hasAlarm = vm.component.$hasAlarm;\n component.alarm = vm.component.alarm;\n // Send reply to the server\n reply(component);\n });\n }\n\n function deleteOccurrence() {\n vm.component.remove(true).then(function() {\n $rootScope.$broadcast('calendars:list');\n $mdDialog.hide();\n });\n }\n\n function deleteAllOccurrences() {\n vm.component.remove().then(function() {\n $rootScope.$broadcast('calendars:list');\n $mdDialog.hide();\n });\n }\n\n function viewRawSource($event) {\n Calendar.$$resource.post(vm.component.pid + '/' + vm.component.id, \"raw\").then(function(data) {\n $mdDialog.show({\n parent: angular.element(document.body),\n targetEvent: $event,\n clickOutsideToClose: true,\n escapeToClose: true,\n template: [\n '<md-dialog flex=\"80\" flex-sm=\"100\" aria-label=\"' + l('View Raw Source') + '\">',\n ' <md-dialog-content>',\n ' <pre>',\n data,\n ' </pre>',\n ' </md-dialog-content>',\n ' <div class=\"md-actions\">',\n ' <md-button ng-click=\"close()\">' + l('Close') + '</md-button>',\n ' </div>',\n '</md-dialog>'\n ].join(''),\n controller: ComponentRawSourceDialogController\n });\n\n /**\n * @ngInject\n */\n ComponentRawSourceDialogController.$inject = ['scope', '$mdDialog'];\n function ComponentRawSourceDialogController(scope, $mdDialog) {\n scope.close = function() {\n $mdDialog.hide();\n };\n }\n });\n }\n }\n\n /**\n * @ngInject\n */\n ComponentEditorController.$inject = ['$rootScope', '$scope', '$log', '$timeout', '$mdDialog', 'User', 'Calendar', 'Component', 'AddressBook', 'Card', 'Alarm', 'stateComponent'];\n function ComponentEditorController($rootScope, $scope, $log, $timeout, $mdDialog, User, Calendar, Component, AddressBook, Card, Alarm, stateComponent) {\n var vm = this, component;\n\n vm.calendars = Calendar.$calendars;\n vm.component = stateComponent;\n vm.categories = {};\n vm.showRecurrenceEditor = vm.component.$hasCustomRepeat;\n vm.toggleRecurrenceEditor = toggleRecurrenceEditor;\n vm.showAttendeesEditor = angular.isDefined(vm.component.attendees);\n vm.toggleAttendeesEditor = toggleAttendeesEditor;\n //vm.searchText = null;\n vm.cardFilter = cardFilter;\n vm.addAttendee = addAttendee;\n vm.addAttachUrl = addAttachUrl;\n vm.cancel = cancel;\n vm.save = save;\n vm.attendeesEditor = {\n startDate: vm.component.startDate,\n endDate: vm.component.endDate,\n days: getDays(),\n hours: getHours()\n };\n\n $scope.$watch('editor.component.start', function(newStartDate, oldStartDate) {\n if (vm.component.type == 'appointment') {\n vm.component.end = new Date(vm.component.start);\n vm.component.end.addMinutes(vm.component.delta);\n vm.component.freebusy = vm.component.updateFreeBusyCoverage();\n vm.attendeesEditor.days = getDays();\n }\n });\n\n $scope.$watch('editor.component.end', function(newEndDate, oldEndDate) {\n if (newEndDate <= vm.component.start) {\n vm.component.end = oldEndDate;\n }\n else {\n vm.component.delta = Math.floor((Math.abs(vm.component.end-vm.component.start)/1000)/60);\n vm.component.freebusy = vm.component.updateFreeBusyCoverage();\n vm.attendeesEditor.days = getDays();\n }\n });\n\n function addAttachUrl() {\n var i = vm.component.addAttachUrl('');\n focus('attachUrl_' + i);\n }\n\n function toggleRecurrenceEditor() {\n vm.showRecurrenceEditor = !vm.showRecurrenceEditor;\n vm.component.$hasCustomRepeat = vm.showRecurrenceEditor;\n }\n\n function toggleAttendeesEditor() {\n vm.showAttendeesEditor = !vm.showAttendeesEditor;\n }\n\n // Autocomplete cards for attendees\n function cardFilter($query) {\n AddressBook.$filterAll($query);\n return AddressBook.$cards;\n }\n\n function addAttendee(card) {\n if (angular.isString(card)) {\n // User pressed \"Enter\" in search field, adding a non-matching card\n if (card.isValidEmail()) {\n vm.component.addAttendee(new Card({ emails: [{ value: card }] }));\n vm.searchText = '';\n }\n }\n else {\n vm.component.addAttendee(card);\n }\n }\n\n function save(form) {\n if (form.$valid) {\n vm.component.$save()\n .then(function(data) {\n $rootScope.$broadcast('calendars:list');\n $mdDialog.hide();\n Alarm.getAlarms();\n }, function(data, status) {\n $log.debug('failed');\n });\n }\n }\n\n function cancel() {\n vm.component.$reset();\n if (vm.component.isNew) {\n // Cancelling the creation of a component\n vm.component = null;\n }\n $mdDialog.hide();\n }\n\n function getDays() {\n var days = [];\n\n if (vm.component.start && vm.component.end)\n days = vm.component.start.daysUpTo(vm.component.end);\n\n return _.map(days, function(date) {\n return { stringWithSeparator: date.stringWithSeparator(),\n getDayString: date.getDayString() };\n });\n }\n\n function getHours() {\n var hours = [];\n for (var i = 0; i <= 23; i++) {\n //hours.push(Component.timeFormat.formatTime(i, 0));\n hours.push(i.toString());\n }\n return hours;\n }\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .controller('ComponentController', ComponentController)\n .controller('ComponentEditorController', ComponentEditorController);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCalendarDayBlock - An event block to be displayed in a week\n * @memberof SOGo.Common\n * @restrict element\n * @param {object} sgBlock - the event block definition\n * @param {function} sgClick - the function to call when clicking on a block.\n * Two variables are available: clickEvent (the event that triggered the mouse click),\n * and clickComponent (a Component object)\n *\n * @example:\n\n <sg-calendar-day-block\n ng-repeat=\"block in blocks[day]\"\n sg-block=\"block\"\n sg-click=\"open(clickEvent, clickComponent)\" />\n */\n function sgCalendarDayBlock() {\n return {\n restrict: 'E',\n scope: {\n block: '=sgBlock',\n clickBlock: '&sgClick'\n },\n replace: true,\n template: [\n '<div class=\"sg-event sg-draggable\">',\n ' <div class=\"eventInside\" ng-click=\"clickBlock({clickEvent: $event, clickComponent: block.component})\">',\n ' <div class=\"gradient\">',\n ' </div>',\n ' <div class=\"text\">{{ block.component.c_title }}',\n ' <span class=\"icons\">',\n // Component has an alarm\n ' <md-icon ng-if=\"block.component.c_nextalarm\" class=\"material-icons icon-alarm\"></md-icon>',\n // Component is confidential\n ' <md-icon ng-if=\"block.component.c_classification == 1\" class=\"material-icons icon-visibility-off\"></md-icon>',\n // Component is private\n ' <md-icon ng-if=\"block.component.c_classification == 2\" class=\"material-icons icon-vpn-key\"></md-icon>',\n ' </span></div>',\n ' </div>',\n ' <div class=\"topDragGrip\"></div>',\n ' <div class=\"bottomDragGrip\"></div>',\n '</div>'\n ].join(''),\n link: link\n };\n\n function link(scope, iElement, attrs) {\n // Compute overlapping (2%)\n var pc = 100 / scope.block.siblings,\n left = scope.block.position * pc,\n right = 100 - (scope.block.position + 1) * pc;\n\n if (pc < 100) {\n if (left > 0)\n left -= 2;\n if (right > 0)\n right -= 2;\n }\n\n // Add some padding (2%)\n if (left === 0)\n left = 2;\n if (right === 0)\n right = 2;\n\n // Set position\n iElement.css('left', left + '%');\n iElement.css('right', right + '%');\n iElement.addClass('starts' + scope.block.start);\n iElement.addClass('lasts' + scope.block.length);\n iElement.addClass('bg-folder' + scope.block.component.c_folder);\n }\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .directive('sgCalendarDayBlock', sgCalendarDayBlock);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCalendarDayTable - Build list of blocks for a specific day\n * @memberof SOGo.Common\n * @restrict element\n * @param {object} sgBlocks - the events blocks definitions for the current view\n * @param {string} sgDay - the day of the events to display\n * @param {function} sgClick - the function to call when clicking on a block.\n * Two variables are available: event (the event that triggered the mouse click),\n * and component (a Component object)\n *\n * @example:\n\n <sg-calendar-day-table\n sg-blocks=\"calendar.blocks\"\n sg-day=\"20150330\"\n sg-click=\"open({ event: clickEvent, component: clickComponent })\"/>\n */\n function sgCalendarDayTable() {\n return {\n restrict: 'E',\n scope: {\n blocks: '=sgBlocks',\n day: '@sgDay',\n clickBlock: '&sgClick'\n },\n template: [\n '<sg-calendar-day-block class=\"sg-event draggable\"',\n ' ng-repeat=\"block in blocks[day]\"',\n ' sg-block=\"block\"',\n ' sg-click=\"clickBlock({event: clickEvent, component: clickComponent})\"/>'\n ].join('')\n };\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .directive('sgCalendarDayTable', sgCalendarDayTable);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCalendarMonthDay - Build list of blocks for a specific day in a month\n * @memberof SOGo.Common\n * @restrict element\n * @param {object} sgBlocks - the events blocks definitions for the current view\n * @param {string} sgDay - the day of the events to display\n * @ngInject\n * @example:\n\n <sg-calendar-monh-day\n sg-blocks=\"calendar.blocks\"\n sg-day=\"20150408\"\n sg-click=\"open({ event: clickEvent, component: clickComponent })\"/>\n */\n function sgCalendarMonthDay() {\n return {\n restrict: 'E',\n scope: {\n blocks: '=sgBlocks',\n day: '@sgDay',\n clickBlock: '&sgClick'\n },\n template: [\n '<sg-calendar-month-event',\n ' ng-repeat=\"block in blocks[day]\"',\n ' sg-block=\"block\"',\n ' sg-click=\"clickBlock({event: clickEvent, component: clickComponent})\"/>'\n ].join('')\n };\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .directive('sgCalendarMonthDay', sgCalendarMonthDay);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCalendarMonthEvent - An event block to be displayed in a month\n * @memberof SOGo.Common\n * @restrict element\n * @param {object} sgBlock - the event block definition\n * @ngInject\n * @example:\n\n <sg-calendar-month-event\n ng-repeat=\"block in blocks[day]\"\n sg-block=\"block\"/>\n */\n function sgCalendarMonthEvent() {\n return {\n restrict: 'E',\n scope: {\n block: '=sgBlock',\n clickBlock: '&sgClick'\n },\n replace: true,\n template: [\n '<div class=\"sg-event sg-draggable\" ng-click=\"clickBlock({clickEvent: $event, clickComponent: block.component})\">',\n ' <span ng-if=\"!block.component.c_isallday\">{{ block.starthour }} - </span>',\n ' {{ block.component.c_title }}',\n ' <span class=\"icons\">',\n ' <md-icon ng-if=\"block.component.c_nextalarm\" class=\"material-icons icon-alarm\"></md-icon>',\n ' <md-icon ng-if=\"block.component.c_classification == 1\" class=\"material-icons icon-visibility-off\"></md-icon>',\n ' <md-icon ng-if=\"block.component.c_classification == 2\" class=\"material-icons icon-vpn-key\"></md-icon>',\n ' </span>',\n ' <div class=\"leftDragGrip\"></div>',\n ' <div class=\"rightDragGrip\"></div>',\n '</div>'\n ].join(''),\n link: link\n };\n\n function link(scope, iElement, attrs) {\n iElement.addClass('bg-folder' + scope.block.component.c_folder);\n }\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .directive('sgCalendarMonthEvent', sgCalendarMonthEvent);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCalendarDayTable - Build list of blocks for a specific day\n * @memberof SOGo.Common\n * @restrict element\n * @param {object} sgBlocks - the events blocks definitions for the current view\n * @param {string} sgDay - the day of the events to display\n * @param {function} sgClick - the function to call when clicking on a block.\n * Two variables are available: event (the event that triggered the mouse click),\n * and component (a Component object)\n *\n * @example:\n\n <sg-calendar-day-table\n sg-blocks=\"calendar.blocks\"\n sg-day=\"20150330\"\n sg-click=\"open({ event: clickEvent, component: clickComponent })\"/>\n */\n function sgCalendarTable() {\n return {\n restrict: 'E',\n scope: {\n calendars: '=sgCalendars',\n calendar: '@sgCalendar',\n blocksType: '@sgBlocksType',\n day: '@sgDay',\n clickBlock: '&sgClick'\n },\n template: [\n '<sg-calendar-day-table',\n ' sg-blocks=\"calendars[calendar][blocksType]\"',\n ' sg-day=\"day\"',\n ' sg-click=\"clickBlock({event: clickEvent, component: clickComponent})\"/>'\n ].join('')\n };\n }\n\n angular\n .module('SOGo.SchedulerUI')\n .directive('sgCalendarTable', sgCalendarTable);\n})();\n","/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n\n(function() {\n 'use strict';\n\n /*\n * sgCalendarDayTable - Build list of blocks for a specific day\n * @memberof SOGo.Common\n * @restrict element\n * @param {object} sgBlocks - the events blocks definitions for the current view\n * @param {string} sgDay - the day of the events to display\n * @param {function} sgClick - the function to call when clicking on a block.\n * Two variables are available: event (the event that triggered the mouse click),\n * and component (a Component object)\n *\n * @example:\n\n http://www.html5rocks.com/en/tutorials/dnd/basics/\n https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_and_drop\n\n <sg-calendar-day-table\n sg-blocks=\"calendar.blocks\"\n sg-day=\"20150330\"\n sg-click=\"open({ event: clickEvent, component: clickComponent })\"/>\n */\n sgDraggableBlock.$inject = ['$mdGesture'];\n function sgDraggableBlock($mdGesture) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs, controller) {\n angular.element(element).attr('draggable', 'true');\n\n // var id = angular.element(el).attr(\"id\");\n\n // if (!id) {\n // id = uuid.new()\n // angular.element(el).attr(\"id\", id);\n // }\n // console.log(id);\n\n // $mdGesture.register(element, 'drag');\n // element\n // .on('$md.dragstart', onDragStart)\n // .on('$md.drag', onDrag)\n // .on('$md.dragend', onDragEnd);\n\n element.on('dragstart', onDragStart);\n \n // el.bind(\"dragstart\", function (e) {\n // e.originalEvent.dataTransfer.setData('text', id);\n // console.log('drag');\n // $rootScope.$emit(\"LVL-DRAG-START\");\n // });\n\n // el.bind(\"dragend\", function (e) {\n // $rootScope.$emit(\"LVL-DRAG-END\");\n // });\n\n function onDragStart(ev) {\n console.debug('start ' + ev.srcElement.getBoundingClientRect().top);\n console.debug(ev.clientY);\n }\n\n function onDrag(ev) {\n console.debug('dragging');\n }\n\n function onDragEnd(ev) {\n console.debug('end');\n }\n }\n };\n }\n \n angular\n .module('SOGo.SchedulerUI')\n .directive('sgDraggableBlock', sgDraggableBlock);\n})();\n"]}