540co/epa-rfi

View on GitHub
src/app/facility/facilityList.controller.js

Summary

Maintainability
A
3 hrs
Test Coverage
(function() {
  'use strict';

  angular
    .module('app.facility')
    .controller('FacilityListController', FacilityListController);

  FacilityListController.$inject = ['DataService', '$location', 'NgMap', '$google', '$timeout'];

  /** @ngInject */

  function FacilityListController(DataService, $location, NgMap, $google, $timeout) {
    var vm = this,
      params = $location.search(),
      google = $google;

    vm.mapReady = false;

    vm.query = {
      total: 0,
      limit: 25,
      page: 1
    };

    vm.pageOptions = [25, 50, 100];

    vm.params = params;

    NgMap.getMap({id: 'facilityListMap'}).then(function(map) {
     vm.map = map;
    });

    vm.onPaginationChange = function(page, limit) {
      vm.query.page = page;
      vm.query.limit = limit;

      return loadFacilities();
    }

    vm.showFacilityInfoWindow = function(event, facility) {
      vm.currentFacility = facility;

      vm.map.showInfoWindow('facilityInfoWindow', 'facility_' + facility.id);
    };

    loadFacilities();

    function loadFacilities() {
      return getFacilities(params, function(response) {
        vm.facilities = response.data;
        vm.query.total = response.meta.total;

        fitBoundsToFacilities(vm.facilities);

        vm.mapReady = true;

      }, function() {
        vm.facilities = {};
      });
    }

    function fitBoundsToFacilities(facilities) {
      var bounds = new google.maps.LatLngBounds();
      for (var i=0; i<facilities.length; i++) {
        if (facilities[i].latitude && facilities[i].longitude) {
          var latlng = new google.maps.LatLng(facilities[i].latitude, facilities[i].longitude);
          bounds.extend(latlng);
        }
      }

      NgMap.getMap({id: 'facilityListMap'}).then(function(map) {
        map.setCenter(bounds.getCenter());
        map.fitBounds(bounds);
        $timeout(function() {
          $google.maps.event.trigger(map, 'resize');
        });
      });
    }

    function getFacilities(params, successCallback, errorCallback) {
      var paramMap = {
          'zipcode': 'facility.address.zipcode',
          'state': 'facility.address.state'
        },
        filters = [],
        queryParams = {};

      angular.forEach(params, function(value, key) {
        if (typeof paramMap[key] !== 'undefined') {
          filters.push(paramMap[key] + ":" + value);
        }
      });

      if (filters.length) {
        queryParams.filters = filters.join(' AND ');
      }

      queryParams.offset = (vm.query.page - 1) * vm.query.limit;
      queryParams.limit = vm.query.limit;

      return DataService.Facilities.query(queryParams, function(response) {
        successCallback(response);
      }, errorCallback).$promise;
    }

  }

})();