PageSourceSearch

https://meetandeat.ch/js/app.js

js meetandeat.ch collected 2026-10-06 18:22:37 UTC 20,019 bytes, 615 lines download raw bytes

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.