1var app = angular.module('meetandeat', ['ui.bootstrap', 'ngRoute', 'ngStorage', 'btford.socket-io', 'frapontillo.bootstrap-switch', 'angular-growl', 'summernote', 'ngSanitize', 'angularMoment', 'angulartics', 'angulartics.piwik']) 2app.controller('MeCtrl', function ($scope, $rootScope, $socket, $moment, $modal) { 3 $socket.emit('user:get') 4 $socket.emit('me:info') 5 $socket.emit('assignments:get') 6 $socket.emit('sections:get') 7 var watcher = function () {} 8 $socket.on('user:update', function (user) { 9 watcher() 10 $scope.user = user 11 watcher = $scope.$watch('user', function () { 12 $socket.emit('user:update', $scope.user) 13 }, true) 14 }) 15 $socket.on('me:info', function (data) { 16 $scope.organization = data 17 }) 18 $scope.validator = validator 19 $socket.on('assignments:update', function (data) { 20 $scope.events = data 21 }) 22 $socket.on('sections:update', function (data) { 23 $scope.sections = data 24 }) 25 $scope.deleteSelf = function () { 26 $modal.open({ 27 templateUrl: '/parts/confirm_delete', 28 controller: function ($scope, $modalInstance, $socket, $localStorage, $location) { 29 $scope.deleteSelf = function () { 30 $socket.emit('me:delete') 31 delete $localStorage.token 32 $location.path('/'); 33 $modalInstance.close(); 34 }; 35 }, 36 }); 37 } 38}) 39app.controller('MainCtrl', function ($scope, $socket, $growl, $localStorage, $location, $route) { 40 $socket.on('general:error', function (error) { 41 $growl.error(error.message, { title: 'Fehler', disableIcons: true }) 42 }) 43 $socket.on('general:success', function (message) { 44 $growl.success(message.message, { title: 'Erfolg!', disableIcons: true }) 45 }) 46 $socket.on('token:update', function (token) { 47 $localStorage.token = token 48 if ($localStorage.token) $socket.emit('user:get') 49 }) 50 $socket.on('token:delete', function () { 51 delete $localStorage.token 52 }) 53 $socket.on('general:authenticate', function () { 54 if ($localStorage.token) $socket.emit('general:authenticate', $localStorage.token) 55 }) 56 if ($localStorage.token) $socket.emit('user:get') 57 $socket.on('user:update', function (user) { 58 $scope.user = user 59 }) 60 $scope.isLoggedIn = function () { 61 return typeof $localStorage.token != 'undefined' 62 } 63 $scope.gotoProfile = function () { 64 $location.path('/me') 65 } 66 $scope.logout = function () { 67 $socket.emit('user:logout') 68 delete $localStorage.token 69 $location.path('/') 70 } 71 $scope.switchOrg = function (newOrg) { 72 $socket.emit('super:switchOrg', newOrg) 73 $route.reload() 74 } 75 $socket.emit('organizations:get') 76 $socket.on('organizations:update', function (organizations) { 77 $scope.organizations = organizations 78 }) 79}) 80app.controller('HomeCtrl', function ($scope, $socket) { 81 $socket.emit('organizations:get') 82 $socket.on('organizations:update', function (organizations) { 83 $scope.organizations = organizations 84 }) 85 $scope.register = function () { 86 $scope.registration.status = 'processing' 87 $socket.emit('user:add', { 88 organizationId: $scope.registration.organizationId, 89 email: $scope.registration.email, 90 password: $scope.registration.password 91 }) 92 } 93 $socket.on('user:add:success', function () { 94 $scope.registration.status = 'successful' 95 $scope.registration.email = '' 96 $scope.registration.password = '' 97 }) 98 $socket.on('user:add:error', function (errorMessage) { 99 $scope.registration.status = 'failed' 100 $scope.registration.error = errorMessage 101 }) 102}) 103app.controller('LoginCtrl', function ($scope, $location, $socket, $localStorage, $modal) { 104 $scope.login = function () { 105 $socket.emit('user:login', { email: $scope.email, password: $scope.password }) 106 $socket.on('token:update', function (token) { 107 $location.path('/me') 108 }) 109 } 110 $scope.forgotPassword = function () { 111 $modal.open({ 112 templateUrl: '/parts/reset_password_modal', 113 controller: 'PasswordResetCtrl' 114 }) 115 } 116}) 117app.controller('ContactCtrl', function ($scope, $socket) { 118 $scope.send = function () { 119 $socket.emit('contact:send', { email: $scope.email, subject: $scope.subject, content: $scope.message, type: $scope.type }) 120 } 121 $socket.on('contact:successful', function (data) { 122 $scope.email = '' 123 $scope.subject = '' 124 $scope.message = '' 125 $scope.status = 'Vielen Dank für Ihre Nachricht!' 126 }) 127}) 128app.controller('LogCtrl', function ($scope, $socket) {
129 $socket.emit('logs:get') 130 $socket.on('logs:update', function (data) { 131 $scope.logs = data 132 }) 133}) 134app.controller('EditTemplateCtrl', function ($scope, $socket, $routeParams, $location) { 135 $socket.emit('template:get', $routeParams.template) 136 $socket.on('template:update', function (template) { 137 $scope.template = template 138 }) 139 $scope.abort = function () { 140 $location.path('/admin/organization') 141 } 142 $scope.save = function () { 143 var data = $scope.template 144 data.id = $routeParams.template 145 $socket.emit('template:update', data) 146 $location.path('/admin/organization') 147 } 148}) 149app.controller('UserCtrl', function ($scope, $socket) { 150 $socket.emit('users:get') 151 $socket.emit('sections:get') 152 $socket.on('sections:update', function (sections) { 153 $scope.sections = sections 154 $scope.sectionMap = {} 155 $scope.sections.forEach(function (section) { 156 $scope.sectionMap[section.id] = section.name 157 }) 158 }) 159 $socket.on('users:update', function (users) { 160 if (!Array.isArray($scope.sections)) { 161 $scope.$watch('sections', function () { 162 $scope.users = users 163 }) 164 } else { 165 $scope.users = users 166 } 167 }) 168 $scope.remove = function (user) { 169 $scope.users.splice($scope.users.indexOf(user), 1) 170 $socket.emit('user:delete', user.id) 171 } 172}) 173app.controller('AdminUserCtrl', function ($scope, $socket) { 174 $scope.$watch('user', function (newUser, oldUser) { 175 if (!angular.equals(newUser, oldUser)) 176 $socket.emit('user:adminUpdate', newUser) 177 }, true) 178 $scope.remove = $scope.$parent.remove 179}) 180app.controller('TokenCtrl', function ($scope, $socket, $routeParams, $location) { 181 $socket.emit('token:use', $routeParams.token) 182 $socket.emit('sections:get', { token: $routeParams.token }) 183 $socket.on('sections:update', function (data) { 184 $scope.sections = data 185 }) 186 $socket.on('token:use', function (data) { 187 var mappingTable = { 188 'passwordReset': { 189 'controller': 'PasswordResetCtrl', 190 'templateUrl': '/parts/reset_password' 191 }, 192 'activation': { 193 'controller': 'AccountConfirmCtrl', 194 'templateUrl': '/parts/confirm_account' 195 } 196 } 197 $scope.user = { workdaysFull: [], name: '', 'phone': '', 'section': '' } 198 $scope.formUrl = mappingTable[data.type].templateUrl 199 }) 200 $scope.confirm = function () { 201 $scope.error = false 202 $scope.user.token = $routeParams.token 203 var map = { 204 'Montag': 'Mo', 205 'Dienstag': 'Di', 206 'Mittwoch': 'Mi', 207 'Donnerstag': 'Do', 208 'Freitag': 'Fr' 209 } 210 $scope.user.workdays = $scope.user.workdaysFull.map(function (o) { return map[o] }) 211 $socket.emit('user:confirm', $scope.user) 212 } 213 $socket.on('user:confirm:failed', function (message) { 214 $scope.error = message 215 }) 216 $socket.on('user:confirm:successful', function () { 217 $location.path('/login') 218 }) 219 $scope.rpw = {} 220 $scope.resetPassword = function () { 221 if ($scope.rpw.password1 != $scope.rpw.password2) { 222 $scope.error = 'Die Passwörter sind nicht gleich!' 223 } else { 224 $socket.emit('user:resetPassword', { token: $routeParams.token, password: $scope.rpw.password1 }) 225 } 226 } 227 $socket.on('user:resetPassword:failed', function (message) { 228 $scope.error = message 229 }) 230 $socket.on('user:resetPassword:successful', function () { 231 $location.path('/login') 232 }) 233}) 234app.controller('EventsCtrl', function ($scope, $socket, $sce, $location, $modal) { 235 $scope.now = new Date() 236 $socket.emit('events:get') 237 $socket.emit('me:info') 238 $socket.on('me:info', function (data) { 239 $scope.organization = data; 240 }); 241 $socket.on('events:updatePeople', function (people) { 242 $scope.people = people.join(' | '); 243 }); 244 $scope.statusMap = { 245 scheduled: $sce.trustAsHtml('<span class="label label-info"><i class="fa fa-clock-o"></i> Geplant</span>'), 246 running: $sce.trustAsHtml('<span class="label label-default"><i class="fa fa-spinner fa-spin"></i> Verarbeite...</span>'), 247 done: $sce.trustAsHtml('<span class="label label-success"><i class="fa fa-check"></i> Fertig</span>'), 248 failed: $sce.trustAsHtml('<span class="label label-danger"><i class="fa fa-times"></i> Fehlgeschlagen</span>') 249 } 250 $scope.loadPeople = function (event) { 251 $socket.emit("events:getPeople", event.id); 252 } 253 $scope.simulate = function (event) { 254 $socket.emit("events:simulate", event.id); 255 } 256 $scope.hasLog = function (event) { 257 var statusList = ['done', 'failed'] 258 return statusList.indexOf(event.status) != -1 259 } 260 $scope.hasError = function (event) { 261 var statusList = ['failed'] 262 return statusList.indexOf(event.status) != -1 263 } 264 $scope.isDone = function (event) { 265 var statusList = ['done'] 266 return statusList.indexOf(event.status) != -1 267 } 268 $scope.cancellable = function (event) { 269 var statusList = ['scheduled'] 270 return statusList.indexOf(event.status) != -1 271 } 272 $scope.addEvent = function () { 273 $modal.open({ 274 templateUrl: '/parts/admin/add_event', 275 controller: 'AddEventCtrl' 276 }) 277 } 278 $scope.deleteEvent = function (eventData) { 279 $socket.emit('events:delete', eventData) 280 } 281 $scope.showEvent = function (eventData) { 282 $location.path('/admin/events/' + eventData) 283 } 284 $socket.on('events:update', function (events) { 285 events = events.map(function (event) { 286 event.date = new Date(event.date) 287 return event 288 }) 289 $scope.events = events 290 }) 291}) 292function isValidDate(date) { 293 return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date); 294} 295app.controller('AddEventCtrl', function ($scope, $socket, $modalInstance) { 296 $scope.now = new Date() 297 $scope.add = function (date) { 298 if (isValidDate(date)) { 299 $socket.emit('events:add', { date: date }) 300 $modalInstance.close() 301 } 302 } 303 $scope.cancel = function () { 304 $modalInstance.dismiss() 305 } 306}) 307app.controller('AdminCtrl', function ($scope, $socket, $location) { 308 $socket.emit('dashboard:info') 309 $socket.on('dashboard:info', function (data) { 310 $scope.activeUsers = data.activeUsers 311 $scope.nextEvent = data.nextEvent 312 $scope.newsletters = data.newsletters 313 $scope.logs = data.logs 314 }) 315 $scope.gotoEvents = function () { 316 $location.path('/admin/events') 317 } 318 $scope.gotoUsers = function () { 319 $location.path('/admin/users') 320 } 321 $scope.gotoNewsletters = function () { 322 $location.path('/admin/newsletters') 323 } 324}) 325app.controller('OrganizationCtrl', function ($scope, $socket, $location) { 326 $socket.emit('templates:get') 327 $socket.emit('organization:getSettings') 328 $socket.on('templates:update', function (templates) { 329 $scope.templates = templates 330 }) 331 $socket.on('organization:updateSettings', function (data) { 332 $scope.enforceSections = data.enforceSections || false 333 $scope.experimentalGroups = data.experimentalGroups || false 334 }) 335 $scope.$watch('enforceSections', function () { 336 $socket.emit('organization:setEnforceSections', $scope.enforceSections) 337 }) 338 $scope.$watch('experimentalGroups', function () { 339 $socket.emit('organization:setExperimentalGroups', $scope.experimentalGroups) 340 }) 341 $scope.edit = function (template) { 342 $location.path('/admin/templates/' + template.id) 343 } 344}) 345app.controller('OrganizationsCtrl', function ($scope, $socket) {}) 346app.controller('HelpCtrl', function ($scope) {}) 347app.controller('NewslettersCtrl', function ($scope, $socket, $location, $sce) {
348 $socket.emit('newsletters:get') 349 $scope.statusMap = { 350 scheduled: $sce.trustAsHtml('<span class="label label-info"><i class="fa fa-clock-o"></i> Geplant</span>'), 351 running: $sce.trustAsHtml('<span class="label label-default"><i class="fa fa-spinner fa-spin"></i> Verarbeite...</span>'), 352 done: $sce.trustAsHtml('<span class="label label-success"><i class="fa fa-check"></i> Fertig</span>'), 353 failed: $sce.trustAsHtml('<span class="label label-danger"><i class="fa fa-times"></i> Fehlgeschlagen</span>') 354 } 355 $socket.on('newsletters:update', function (data) { 356 $scope.newsletters = data 357 }) 358 $scope.addNewsletter = function () { 359 $location.path('/admin/newsletters/add') 360 } 361 $scope.asTemplate = function (id) { 362 $location.path('/admin/newsletters/add') 363 $location.search('base', id) 364 } 365}) 366app.controller('AddNewsletterCtrl', function ($scope, $socket, $location, $routeParams) { 367 if (typeof $routeParams['base'] === 'string') { 368 $socket.emit('newsletter:get', $routeParams['base']); 369 } 370 $socket.on('newsletter:update', function (newsletter) { 371 $scope.newsletter = {} 372 $scope.newsletter.subject = newsletter.subject 373 $scope.newsletter.content = newsletter.content 374 }); 375 $scope.abort = function () { 376 $location.path('/admin/newsletters') 377 } 378 $scope.save = function () { 379 $socket.emit('newsletters:add', $scope.newsletter) 380 $location.path('/admin/newsletters') 381 } 382}) 383app.controller('LegalCtrl', function ($scope) {}) 384app.controller('PasswordResetCtrl', function ($scope, $socket, $modalInstance, $growl) { 385 $scope.request = function () { 386 $socket.emit('user:resetPassword:request', { email: $scope.email }) 387 } 388 $socket.on('user:resetPassword:failed', function (message) { 389 $scope.error = message 390 }) 391 $socket.on('user:resetPassword:successful', function () { 392 $growl.success('Passwort-Reset angefordert! Klicke den Link im E-Mail, um den Vorgang abzuschliessen!', { title: 'Erfolg!', disableIcons: true }) 393 $modalInstance.close() 394 }) 395}) 396app.controller('SectionsCtrl', function ($scope, $socket) { 397 $socket.emit('sections:get') 398 $socket.on('sections:update', function (sections) { 399 sections.sort(function (a,b) { 400 if(typeof a !== "object" || typeof b !== "object" || typeof a.name !== "string" || typeof b.name !== "string") { 401 return 0; 402 } 403 return a.name.localeCompare(b.name); 404 }); 405 $scope.sections = sections 406 }) 407 $scope.deleteSection = function (section, index) { 408 $socket.emit('sections:remove', section) 409 $scope.sections.splice(index, 1) 410 } 411 $scope.addSection = function (section) { 412 $socket.emit('sections:add', section) 413 $socket.emit('sections:get') 414 $scope.newSection.name = '' 415 } 416 $scope.patchSection = function (section) { 417 $socket.emit('sections:patch', section); 418 $socket.emit('sections:get'); 419 } 420}) 421app.directive('editableText', function () { 422 return { 423 restrict: 'E', 424 require: '^ngModel', 425 controller: function ($scope) { 426 $scope.editableValue = $scope.ngModel 427 $scope.beginEdit = function () { 428 $scope.editableValue = $scope.ngModel 429 $scope.edit = true 430 } 431 $scope.$watch('editableValue', function () { 432 if (typeof $scope.ngValidator == 'function') 433 $scope.error = $scope.ngValidator($scope.editableValue) ? undefined : 'Ungültiger Wert' 434 }) 435 $scope.endEdit = function () { 436 if (typeof $scope.error != 'undefined') return 437 $scope.ngModel = $scope.editableValue 438 $scope.edit = false 439 $scope.$apply(); 440 if (typeof $scope.ngChange === "function") 441 $scope.ngChange(); 442 } 443 }, 444 templateUrl: '/parts/drivers/text', 445 scope: { 446 ngModel: '=', 447 ngValidator: '=', 448 ngChange: '&', 449 } 450 } 451}) 452app.directive('editableBoolean', function () { 453 return { 454 restrict: 'E', 455 require: '^ngModel', 456 templateUrl: '/parts/drivers/boolean', 457 scope: { 458 ngModel: '=' 459 } 460 } 461}) 462app.directive('editableSet', function () { 463 return { 464 restrict: 'E', 465 require: ['^ngModel', '^ngSet'], 466 templateUrl: '/parts/drivers/set', 467 scope: { 468 ngModel: '=', 469 ngSet: '=' 470 } 471 } 472}) 473app.directive('editablePassword', function () { 474 return { 475 restrict: 'E', 476 templateUrl: '/parts/drivers/password', 477 scope: { 478 ngModel: '=' 479 } 480 } 481}) 482app.directive('navigation', function ($location) { 483 return { 484 restrict: 'A', 485 scope: {}, 486 link: function (scope, element) { 487 var classSelected, navLinks 488 scope.location = $location 489 classSelected = 'active' 490 navLinks = element.find('a') 491 scope.$watch('location.path()', function (newPath) { 492 var el 493 el = navLinks.filter('[href="' + newPath + '"]') 494 navLinks.not(el).closest('li').removeClass(classSelected) 495 return el.closest('li').addClass(classSelected) 496 }) 497 } 498 } 499}) 500app.directive('workButton', function ($scope) { 501 return { 502 restrict: 'A', 503 scope: {} 504 } 505}) 506app.filter('slice', function () { 507 return function (arr, start, end) { 508 return (arr || []).slice(start, end) 509 } 510}) 511app.filter('htmlToPlaintext', function () { 512 return function (text) { 513 return String(text).replace(/<[^>]+>/gm, ' ') 514 } 515} 516) 517app.factory('$socket', function (socketFactory, $localStorage) {
518 var myIoSocket = io.connect('/', { query: 'token=' + $localStorage.token }) 519 520 mySocket = socketFactory({ 521 ioSocket: myIoSocket 522 }) 523 524 return mySocket 525}) 526app.factory('$growl', function (growl) { 527 return growl 528}) 529app.factory('$moment', function (amMoment) { 530 amMoment.changeLocale('de') 531 return amMoment 532}) 533var loginResolver = function ($q, $location, $localStorage) { 534 var deferred = $q.defer() 535 if (typeof $localStorage.token != 'undefined') 536 $location.path('/login') 537 else deferred.resolve() 538 return deferred.promise 539} 540var loggedInResolver = function ($q, $location, $localStorage) { 541 var deferred = $q.defer() 542 if (typeof $localStorage.token == 'undefined') 543 $location.path('/me') 544 else deferred.resolve() 545 return deferred.promise 546} 547app.config(function ($locationProvider, $routeProvider) { 548 $locationProvider.html5Mode(true) 549 $routeProvider.when('/', { 550 templateUrl: '/parts/home', 551 controller: 'HomeCtrl' 552 }).when('/me', { 553 templateUrl: '/parts/me', 554 controller: 'MeCtrl', 555 resolve: loginResolver 556 }).when('/organizations', { 557 templateUrl: '/parts/organizations', 558 controller: 'OrganizationsCtrl' 559 }).when('/login', { 560 templateUrl: '/parts/login', 561 controller: 'LoginCtrl', 562 resolver: loggedInResolver 563 }).when('/contact', { 564 templateUrl: '/parts/contact', 565 controller: 'ContactCtrl' 566 }).when('/admin/dashboard', { 567 templateUrl: '/parts/admin/dashboard', 568 controller: 'AdminCtrl' 569 }).when('/admin/logs', { 570 templateUrl: '/parts/admin/log', 571 controller: 'LogCtrl' 572 }).when('/admin/organization', { 573 templateUrl: '/parts/admin/organization', 574 controller: 'OrganizationCtrl' 575 }).when('/admin/templates', { 576 templateUrl: '/parts/admin/templates', 577 controller: 'TemplatesCtrl' 578 }).when('/admin/templates/:template', { 579 templateUrl: '/parts/admin/edit_template', 580 controller: 'EditTemplateCtrl' 581 }).when('/admin/events', { 582 templateUrl: '/parts/admin/events', 583 controller: 'EventsCtrl' 584 }).when('/admin/events/add', { 585 templateUrl: '/parts/admin/add_event', 586 controller: 'AddEventCtrl' 587 }).when('/admin/users', { 588 templateUrl: '/parts/admin/users', 589 controller: 'UserCtrl' 590 }).when('/admin/newsletters', { 591 templateUrl: '/parts/admin/newsletters', 592 controller: 'NewslettersCtrl' 593 }).when('/admin/newsletters/add', { 594 templateUrl: '/parts/admin/add_newsletter', 595 controller: 'AddNewsletterCtrl' 596 }).when('/admin/sections', { 597 templateUrl: '/parts/admin/sections', 598 controller: 'SectionsCtrl' 599 }) 600 .when('/admin/help', { 601 templateUrl: '/parts/admin/help', 602 controller: 'HelpCtrl' 603 }) 604 .when('/token/:token', { 605 template: '<div ng-include="formUrl"></div>', 606 controller: 'TokenCtrl' 607 }) 608 .when('/legal', { 609 templateUrl: '/parts/legal', 610 controller: 'LegalCtrl' 611 }) 612 .otherwise({ 613 redirectTo: '/' 614 }) 615})
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.