oglimmer/lunchy

View on GitHub
src/main/webapp/js/index/controllers/LunchyControllerListLocations.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

/* Controllers */

angular.module('LunchyApp.controllers').
controller('LunchyControllerListLocations', [ '$scope', '$location', 'LocationsDao', '$filter', 'NgTableParams', 'ListConfig', 'Comparator', 'OfficesDao', 'Authetication', 'UserDao', '$uibModal', '$cookies',
                                                function($scope, $location, LocationsDao, $filter, NgTableParams, ListConfig, Comparator, OfficesDao, Authetication, UserDao, $uibModal, $cookies) {
    
    
    // -- local functions
    
    function reloadTableData() {
        var currentOfficeId = $scope.selectedOffice != null ? $scope.selectedOffice.id : Authetication.fkBaseOffice;
        OfficesDao.locations({id: currentOfficeId}, function (data) {
            dataHolder = data;
            $scope.tableParams.reload();
        });
    }
    
    function setColVisibility() {
        var minColWidth = [46,83,83,83,83,83,77,77,100];
        var screenWidth=$(window).width();
        var usedWidth = 0;
        angular.forEach($scope.showColumnSettingsConfig, function(val) {
            usedWidth += minColWidth[val];
            $scope.showColumnSettings[val] = usedWidth < screenWidth;            
        });
    }
    
    function init(listViewColPrioString) {
        if(_.isUndefined(listViewColPrioString) || listViewColPrioString == "") {
            $scope.showColumnSettingsConfig = [0,1,8,3,5,2,4,6,7]; // default prios
        } else {
            $scope.showColumnSettingsConfig = listViewColPrioString.split(",");            
        }        
        setColVisibility();
    }

    // -- scope & local attributes    

    $scope.selectedOffice = null;
    var dataHolder = [];    
    var initPage = ListConfig.page;
    setColVisibility();
    $scope.showColumnSettings = [false,false,false,false,false,false,false,false,false];

    // -- initial queries
    
    OfficesDao.query(function(offices) {
        $scope.offices = offices;
        
        if($scope.selectedOffice==null) {
            $scope.selectedOffice = _.find($scope.offices, function(office) { return office.id == Authetication.fkBaseOffice; });
        }    
    });

    Authetication.checkLoggedIn().then(function(data) {
        if(data.loggedIn){
            UserDao.current(function(loadData) {    
                init(loadData.listViewColPrio);
            });
        } else {
            init($cookies.get("listViewColPrio"));
        }
    }, function() {
        init($cookies.get("listViewColPrio"));
    });


    // -- scope methods
    
    $scope.openConfig = function() {
        var modalInstance = $uibModal.open({
            templateUrl: 'partials/list-locations-config.html',
            controller: 'LunchyControllerListLocationsConfig',
            resolve: {
                showColumnSettingsConfig: function() {
                    return $scope.showColumnSettingsConfig;
                }
            }
        });
        modalInstance.result.then(function (result) {            
            init(result);
        }, function () {
            //console.log('Modal dismissed at: ' + new Date());
        });
    }
    
    $scope.rowclick = function(item) {
        $location.path('/view/'+item.id);
    };    
    
    $scope.tableParams = new NgTableParams(ListConfig, {
        total: dataHolder.length,
        getData: function($defer, params) {
            
            // HACK: seems like the first parameter of NgTableParams doesn't respect page 
            if(initPage!=null) {
                if(initPage!=params.page()){
                    console.log("assert failed."+initPage+"!="+params.page());
                }
                params.page(initPage);
                initPage=null;
            }
            
            ListConfig.copyParams(params);                
            
              var filterParams = angular.copy(params.filter());
              
              function flagIntegerSearch(attr, flagChar) {
                  if(typeof(filterParams[attr]) !== 'undefined') {
                      if(filterParams[attr] != "") {
                          filterParams[attr] = flagChar+filterParams[attr];
                      } else {
                          delete filterParams[attr];
                      }
                  }
              }
              
              var flags = {
                  turnAroundTime:'@',
                  numberOfReviews:'#',
                  avgRating:'#'
              }
              
              for(var key in filterParams) {
                  flagIntegerSearch(key, typeof(flags[key])!=='undefined'?flags[key]:'');
              }                 
              
              var filterData = $filter('filter')(dataHolder, filterParams, Comparator);
              
            var orderedData = $filter('orderBy')(filterData, params.orderBy());

            var pagedData = orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count());

            params.total(filterData.length);
            return $defer.resolve(pagedData);                
        }
    });
        
    $scope.$on('userLoggedIn', function(event) {
        reloadTableData();
    });
    
    $scope.$watch('selectedOffice', function() {
        $scope.tableParams.page(1);
        reloadTableData();
    });
        
    $(window).on("resize.doResize", function (){
        $scope.$apply(function(){
            setColVisibility();
        });
    });

    $scope.$on("$destroy",function (){
         $(window).off("resize.doResize");
    });
    
}]);