X-Git-Url: http://git.rot13.org/?p=angular-drzb;a=blobdiff_plain;f=app%2Fjs%2Fcontrollers.js;h=c3f74b702f32242dcaf50b07bac225c920c4b056;hp=e40a3568de5034e1624a697a684092cc9ec4bdc6;hb=3f5d2c7d2fe0cba785815bbe15490761c9dd3cf4;hpb=11e1695154127e28964687149bd24a8922bc38b6 diff --git a/app/js/controllers.js b/app/js/controllers.js index e40a356..c3f74b7 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -2,11 +2,259 @@ /* Controllers */ +function RegistrationCtrl($scope, $log, Registration, $routeParams, $location, $route, Organizations, RegistrationState) { -function MyCtrl1() {} -MyCtrl1.$inject = []; + $scope.$routeParams = $routeParams; + $scope.$location = $location; + $scope.organizations = []; + Organizations.getArrayPromise().then(function(data) { + $scope.organizations = data; + $log.info('organizations promise ', $scope.organizations); + }); + $scope.RegistrationState = RegistrationState; + $scope.info = { message: '', css_class: '' } ; // alert box -function MyCtrl2() { + $scope.update = function(registration, state, info_message) { + + registration.state = state; + + if ( ! $scope.has_work && registration.work ) { + delete( registration.work ); + $log.info("removed work"); + } + + registration.$save( function(registration) { + $log.info('id =', registration.id, 'state = ', registration.state); + if ( registration.id && registration.state ) { + if ( ! info_message ) { + $location.path( '/' + registration.state + '/' + registration.id ); + } else { + $scope.info = { message: info_message, css_class: 'alert-success' }; + } + } else { + $log.error("can't find id in ", registration); + } + }); + } + + $scope.reset = function() { + if ( $routeParams.registrationId ) { + $scope.registration = new Registration(); + $scope.registration.$get({ registrationId: $routeParams.registrationId }, function(registration) { + $log.info("get Registration", registration); + $scope.user = registration.user; + $scope.work = registration.work; + }); + } else { + $scope.registration = new Registration({ user: {}, work: { persons: [] } }); + $scope.user = $scope.registration.user; + $scope.work = $scope.registration.work; + $scope.work.persons = [ $scope.user ]; // first author is person submitting work + $log.info("new Registration", $scope.registration); + } + + $log.info( $routeParams.registrationId ); + + } + + $scope.$watch('user.registration_type', function( oldValue, newValue ) { + $log.info("registration_type watch", oldValue, newValue ); + + if ( oldValue === newValue ) return; // triggers on resource, so ignore it + if ( ! $scope.user ) { // resource triggers watch before loading json + $log.error("no user in scope"); + return; + } + + if ( + $scope.user.registration_type == 'lecture' || + $scope.user.registration_type == 'poster' || + $scope.user.registration_type == 'symposium' || + $scope.user.registration_type == 'round' + ) { + $scope.work.type = $scope.user.registration_type; + $scope.has_work = true; + $log.info( $scope.user.registration_type, " type updated"); + + if ( $scope.user.registration_type == 'symposium' && ! $scope.work.symposium_works ) { + // create 4 empty symposium works + $scope.work.symposium_works = [ + { persons: [{}] }, + { persons: [{}] }, + { persons: [{}] }, + { persons: [{}] } + ]; + $log.info('created symposium_works'); + } + + } else { + $log.info( $scope.user.registration_type, "NO work" ); + $scope.has_work = false; + } + }); + + $scope.change_student = function() { + if ( $scope.user.student ) { + $scope.user.hpd_member = false; + $scope.user.dinner = false; + } + } + + $scope.addPerson = function(persons) { + $log.info('addPerson', persons); + persons.push({ firstname: '' }); + }; + + $scope.removePerson = function(persons,person) { + for (var i = 0, ii = persons.length; i < ii; i++) { + if (person === persons[i]) { + persons.splice(i, 1); + $log.info('removePerson', i, person); + } + } + }; + + $scope.add_symposium_work = function(works) { + works.push({ persons: [{}] }); + } + + $scope.symposium_work_remove = function(work_index) { + if ( ! angular.isNumber(work_index) ) { + $log.error("work_index", work_index); + return; + } + var works = $scope.work.symposium_works; + $log.info('symposium_work_remove', works, work_index); + var removed = works.splice( work_index, 1 ); + if ( angular.isArray(removed) && removed[0] ) { + removed = removed[0]; + removed.deleted = true; + if ( ! angular.isArray( $scope.work.symposium_works_deleted ) ) + $scope.work.symposium_works_deleted = []; + $scope.work.symposium_works_deleted.push( removed ); + $log.info("work deleted", works); + } else { + $log.warn("symposium_work_remove no work to remove", works, work); + } + } + + $scope.abstract_class = function(work) { + if ( work === undefined ) return; + var abstract = work.abstract; + return angular.isString(abstract) && abstract.length <= 2000 ? 'ok' : 'ng-invalid'; + } + $scope.abstract_length = function(work) { + if ( work === undefined ) return; + var abstract = work.abstract; + if ( ! abstract ) return 0; + return abstract.length <= 2000 ? abstract.length : 2000 - abstract.length; + } + + $scope.change_state = function(new_state) { + if ( new_state == $scope.registration.state ) return; + $scope.info = { css_class: 'alert-warning', message: 'Changed state from "'+$scope.registration.state+'" to "'+new_state+'"' }; + $scope.registration.state = new_state; + } + + $scope.reset(); +} +RegistrationCtrl.$inject = [ '$scope', '$log', 'Registration', '$routeParams', '$location', '$route', 'Organizations', 'RegistrationState' ]; + +function ListCtrl($scope, $log, Registration, RegistrationTypes, $filter) { + + $scope.list = []; + $scope.list_results = 0; + $scope.pager = { + page: 1, + limit: 10, + results: 0, + last_page: 0 + }; + $scope.search = {}; + $scope.ready = false; + $scope.filters = [ 'student', 'hpd_member', 'reception', 'dinner' ]; + + $scope.all_registrations = Registration.query( function() { + var Counts = {}; + var inc_count = function(type) { + if ( ! angular.isNumber( Counts[type] ) ) { + Counts[type] = 1; + } else { + Counts[type]++; + } + }; + angular.forEach( $scope.all_registrations, function(value, key) { + if ( ! value.user ) { + $log.error("all_registrations user corrupted for registration", key, value); + return; + } + + var type = value.user.registration_type; + inc_count( type ); + inc_count( '' ); // total + angular.forEach( $scope.filters, function(subtype) { + var v = value.user[subtype]; + if ( v === 'yes' || v === true ) { + inc_count( subtype ); + inc_count( type + '+' + subtype ); + inc_count( '+' + subtype ); // total + } + }); + + // for filter + value.registration_type = type; + angular.forEach( $scope.filters, function(f) { + var v = value.user[f]; + value[f] = v == true || v == 'yes' ? true : false; + }); + +// $log.info( key, value, Counts[type] ); + }); + $log.info('Counts', Counts); + $scope.Counts = Counts; + +// $scope.list = $scope.all_registrations; // FIXME show all registrations on page loadyy + $scope.ready = true; + + }); + + $scope.filter_list = function(newVal, oldVal) { + if ( newVal == oldVal ) return; + $log.info('filter_list', newVal, oldVal, 'search', $scope.search); + var filtered = + $filter('filter')($scope.all_registrations, $scope.search); + +// $scope.pager.page = 1; + $scope.pager.results = filtered.length; + $scope.pager.last_page = Math.ceil( $scope.pager.results / $scope.pager.limit ); + if ( $scope.pager.page > $scope.pager.last_page ) { + $scope.pager.page = 1; + } + $log.info('pager', $scope.pager); + + var from = ( $scope.pager.page - 1 ) * $scope.pager.limit; + $scope.list = []; + angular.forEach( filtered, function(v,k) { + if ( k >= from && k < from + $scope.pager.limit ) { + v.nr = k + 1; + this.push(v); + } + }, $scope.list ); + $log.info('list length=', $scope.list.length, "offset=", from); + }; + angular.forEach( $scope.filters, function(f) { + $scope.$watch('search.'+f, $scope.filter_list); + $log.info('watch search.'+f); + }); + $scope.$watch('search.registration_type', $scope.filter_list); + $scope.$watch('search.$', $scope.filter_list); + $scope.$watch('pager.page', $scope.filter_list); + $scope.$watch('pager.limit', $scope.filter_list); + + $scope.RegistrationTypes = RegistrationTypes; + $log.info( "RegistrationTypes", RegistrationTypes ); } -MyCtrl2.$inject = []; + + +ListCtrl.$inject = [ '$scope', '$log', 'Registration', 'RegistrationTypes', '$filter' ];