X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=app%2Fjs%2Fcontrollers.js;h=f336b513ef78d078039c3d31ee450d785406025c;hb=1e9833fc37565e466ab85d3d16be4cf7d777b896;hp=145275237da7ce6437325ac2559277f4b104aad1;hpb=85188d29d206bfec4aa0c147a6b4ed5ca32c066e;p=angular-drzb diff --git a/app/js/controllers.js b/app/js/controllers.js index 1452752..f336b51 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -2,16 +2,31 @@ /* Controllers */ - -function RegistrationCtrl($scope, $log, Registration, $routeParams, $location, $route, View) { +function RegistrationCtrl($scope, $log, Registration, $routeParams, $location, $route, View, ValidStates) { $scope.$routeParams = $routeParams; $scope.$location = $location; $scope.organizations = []; + View.getPromise('organizations?group=true;format=key_array').then(function(data) { + if ( angular.isArray(data.rows) ) { + $scope.organizations = data.rows; + $log.info('organizations promise ', $scope.organizations); + } else { + $log.info('no rows in', data); + } + }); + $scope.ValidStates = ValidStates(); - $scope.update = function(registration, state) { + $scope.info = { message: '', css_class: '' } ; // alert box - registration.state = state; + $scope.update = function(registration, state, info_message) { + + if ( $scope.ValidStates.indexOf( state ) > $scope.ValidStates.indexOf( registration.state ) ) { + registration.state = state; + $log.info( 'registration.state updated to ',state); + } else { + $log.info('registration.state NOT changed'); + } if ( ! $scope.has_work && registration.work ) { delete( registration.work ); @@ -19,10 +34,14 @@ function RegistrationCtrl($scope, $log, Registration, $routeParams, $location, $ } registration.$save( function(registration) { - $log.info("saved", registration); $log.info('id =', registration.id, 'state = ', registration.state); if ( registration.id && registration.state ) { - $location.path( '/' + registration.state + '/' + registration.id ); + $log.info( 'have id && state', $location.path(), registration.state, $routeParams ); + if ( $location.path().split(/\//)[1] != registration.state ) { + $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); } @@ -47,26 +66,7 @@ function RegistrationCtrl($scope, $log, Registration, $routeParams, $location, $ $log.info( $routeParams.registrationId ); - $scope.view = new View(); -if(0){//FIXME - $scope.view.$get({ view: 'organizations' }, function(result) { - $log.info('View organizations', result); - angular.forEach( result.rows, function(value, key) { - this.push( value.key ); // name of organization - }, $scope.organizations ); - $log.info('organizations', $scope.organizations); - }); -}else{//FIXME - $scope.view.$key_array({ view: 'organizations' }, function(result) { - $log.info('key_array', result); -// $scope.organizations = result.rows; // FIXME doesn't refresh bs-typeahead - angular.forEach( result.rows, function(o) { - this.push( o ); - }, $scope.organizations ); - $log.info('organizations', $scope.organizations); - }); } -}//FIXME $scope.$watch('user.registration_type', function( oldValue, newValue ) { $log.info("registration_type watch", oldValue, newValue ); @@ -83,6 +83,14 @@ if(0){//FIXME $scope.user.registration_type == 'symposium' || $scope.user.registration_type == 'round' ) { + if ( angular.isUndefined( $scope.registration.work ) ) { + $log.info('create empty work'); + $scope.registration.work = { persons: [ $scope.user ] }; + if ( angular.isUndefined( $scope.work ) ) + $scope.work = $scope.registration.work; + } + + $scope.work.type = $scope.user.registration_type; $scope.has_work = true; $log.info( $scope.user.registration_type, " type updated"); @@ -150,27 +158,73 @@ if(0){//FIXME } $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.show_submission_type = function() { + // FIXME check if all submission are allowed by date and allow them! + if ( angular.isUndefined( $scope.user ) || angular.isUndefined( $scope.registration ) ) return false; + return ( + angular.isUndefined( $scope.user.registration_type ) // new registration + || angular.isUndefined( $scope.registration.state ) // not saved yet + || $scope.registration.state == 'draft' + || $scope.registration.state == 'confirmation' + ) ? false : true; + } + $scope.show_registration_type = function() { + return true; + } + $scope.reset(); } -//RegistrationCtrl.$inject = [ '$scope', '$log' ]; +RegistrationCtrl.$inject = [ '$scope', '$log', 'Registration', '$routeParams', '$location', '$route', 'View', 'ValidStates' ]; -function ListCtrl($scope, $log, Registration, RegistrationTypes, $filter) { +function ListCtrl($scope, $log, Registration, RegistrationTypes, $filter, ValidStates ) { $scope.list = []; + $scope.list_results = 0; + $scope.pager = { + page: 1, + limit: 10, + results: 1, + last_page: 1, + show_all: false + }; $scope.search = {}; $scope.ready = false; - $scope.filters = [ 'student', 'hpd_member', 'reception', 'dinner' ]; + $scope.filters = [ + { select: 'user.student', label: 'student', name: 'filter_student' }, + { select: 'user.hpd_member', label: 'HPD', name: 'filter_hpd' }, + { select: 'user.reception', label: 'reception', name: 'filter_reception' }, + { select: 'user.dinner', label: 'dinner', name: 'filter_dinner' }, + { select: 'payment.received', label: 'payment', name: 'filter_payment' }, + { select: 'user.org_member', label: 'organisation', name: 'filter_org' } + ]; + $scope.show = { + registration_type: true, + filters: true, + search: true, + states: true, + pager_numeric: false + }; + $scope.ValidStates = ValidStates(); - $scope.all_registrations = Registration.query( function() { + $scope.create_counts = function( array ) { + $log.info('create_counts', array.length ); var Counts = {}; var inc_count = function(type) { if ( ! angular.isNumber( Counts[type] ) ) { @@ -179,54 +233,126 @@ function ListCtrl($scope, $log, Registration, RegistrationTypes, $filter) { Counts[type]++; } }; - angular.forEach( $scope.all_registrations, function(value, key) { + angular.forEach( array, function(value, key) { + if ( ! value.user ) { + $log.error("create_counts 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]; + angular.forEach( $scope.filters, function(filter) { + var s = filter.select.split(/\./); + var v = value[s[0]]; + if ( angular.isDefined( v ) ) { + v = v[s[1]]; + } if ( v === 'yes' || v === true ) { - inc_count( subtype ); - inc_count( type + '+' + subtype ); - inc_count( '+' + subtype ); // total + inc_count( filter.name ); + inc_count( type + '+' + filter.name ); + inc_count( '+' + filter.name ); // total + value[filter.name] = true; + } else { + value[filter.name] = false; } }); // 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] ); + // count registration state + inc_count( 'state+' + value.state ); + +// $log.info( key, value ); }); $log.info('Counts', Counts); $scope.Counts = Counts; + return Counts; + }; -// $scope.list = $scope.all_registrations; // FIXME show all registrations on page loadyy + $scope.all_registrations = Registration.query( function(result) { $scope.ready = true; - + $log.info('Reqistration.query callback', result); + $scope.reset(); }); $scope.filter_list = function(newVal, oldVal) { if ( newVal == oldVal ) return; $log.info('filter_list', newVal, oldVal, 'search', $scope.search); - $scope.list = $filter('filter')($scope.all_registrations, $scope.search); - $log.info('list', $scope.list); + var filtered = + $filter('filter')($scope.all_registrations, $scope.search); + + $scope.create_counts( filtered ); + + $log.info('pager before apply', $scope.pager); + + $scope.pager.results = filtered.length; + $scope.pager.last_page = Math.ceil( $scope.pager.results / $scope.pager.limit ); + if ( $scope.pager.page < 1 ) $scope.pager.page = 1; + if ( $scope.pager.page > $scope.pager.last_page ) $scope.pager.page = $scope.pager.last_page; + $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 || $scope.pager.show_all ) { + 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('search', $scope.filter_list, true); + $scope.$watch('search.$', $scope.filter_list); // FIXME not included in search true because of $ + $scope.$watch('pager', $scope.filter_list, true); $scope.RegistrationTypes = RegistrationTypes; $log.info( "RegistrationTypes", RegistrationTypes ); + + $scope.reset = function() { + $scope.search = { registration_type: '' }; + $log.info('reset', $scope.search ); + $scope.pager.page = 1; + } + + $scope.print = { + layout: false, + center: '', + bold: '', + toggle: function(v) { + $log.info('print_hide', v); + $scope.print.layout = ! $scope.print.layout; + if ( v ) { + $scope.print.center = 'print-center'; + $scope.print.bold = 'print-bold'; + } else { + $scope.print.center = ''; + $scope.print.bold = ''; + } + } + } } +ListCtrl.$inject = [ '$scope', '$log', 'Registration', 'RegistrationTypes', '$filter', 'ValidStates' ]; + -function MyCtrl2() { +function AuthorsCtrl($scope, $log, View ) { + $scope.message = 'Loading data...'; + $scope.ready = false; + View.getPromise('authors?format=key_distinct').then(function(data) { + if ( angular.isArray(data.rows) ) { + $scope.data = data; + $scope.authors = $scope.data.rows; + $scope.ready = true; + $log.info('authors promise ', data); + } else { + $log.info('no rows in', data); + $scope.message = 'No rows found'; + } + }); } -MyCtrl2.$inject = []; + +AuthorsCtrl.$inject = [ '$scope', '$log', 'View' ]; + +