eHealthAfrica/direct-delivery-dashboard

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

Summary

Maintainability
D
2 days
Test Coverage
'use strict'

angular.module('facility')
  .controller('FacilityAllCtrl', function (facilityService, log, $scope, authService) {
    var vm = this
    vm.facilityStatus = {}
    vm.selected = {
      zone: '',
      lga: '',
      ward: ''
    }
    vm.list = {}

    vm.updateLocation = function (name, type) {
      vm.selected[type] = name
      vm.selected.name = name
      resetLocations(type)
      getSelectedLocation()
    }

    function resetLocations (type) {
      if (type === 'zone') {
        vm.selected.lga = ''
      }

      if (type === 'zone' || type === 'lga') {
        vm.selected.ward = ''
      }

      if (!type) {
        vm.selected.zone = ''
        vm.selected.lga = ''
        vm.selected.ward = ''
        vm.list.zone = []
        vm.list.lga = []
        vm.list.ward = []
        vm.selectedLocation = {}
      }
    }

    function getSelectedLocation () {
      if (vm.selected.ward) {
        vm.selectedLocation = vm.nestedFacilities.ward[vm.selected.zone][vm.selected.lga][vm.selected.ward]
        vm.selected.type = 'Ward'
        buildLocationList()
      } else if (vm.selected.lga) {
        vm.selectedLocation = vm.nestedFacilities.lga[vm.selected.zone][vm.selected.lga]
        vm.selected.type = 'LGA'
        buildLocationList()
      } else if (vm.selected.zone) {
        vm.selectedLocation = vm.nestedFacilities.zone[vm.selected.zone]
        vm.selected.type = 'Zone'
        buildLocationList()
      } else {
        buildLocationList()
        vm.nestedFacilities.zone = vm.nestedFacilities.zone || {}
        vm.selectedLocation = vm.nestedFacilities.zone[vm.selected.zone]
        vm.selected.type = 'Zone'
        vm.selected.name = vm.selected.zone
      }
    }

    function buildLocationList () {
      vm.list.zone = Object.keys(vm.nestedFacilities.zone || {}).sort()
      vm.selected.zone = vm.selected.zone || vm.list.zone[0]
      vm.nestedFacilities.lga = vm.nestedFacilities.lga || {}
      vm.list.lga = Object.keys(vm.nestedFacilities.lga[vm.selected.zone] || {}).sort()
      vm.list.ward = vm.selected.lga ? Object.keys(vm.nestedFacilities.ward[vm.selected.zone][vm.selected.lga]).sort() : []
    }

    vm.updateStatus = function (report) {
      var facility = vm.locations.facility[report._id]
      facility.cceStatus = facility.cceStatus || []
      var status = {
        status: !vm.facilityStatus[report._id].status,
        date: new Date().toJSON()
      }
      facility.cceStatus.push(status)
      facilityService.save(facility)
        .then(function () {
          vm.facilityStatus[report._id].status = status.status
          vm.facilityStatus[report._id].date = status.date
        })
        .catch(function (reason) {
          console.log(reason)
        })
    }

    loadFacilities()

    function loadFacilities () {
      authService.getUserSelectedState(true)
        .then(function (state) {
          facilityService.getStateLocations(state)
            .then(function (response) {
              vm.facilities = response.facilities
              vm.locations = response.locations
              vm.nestedFacilities = response.nestedFacilities
              vm.zones = Object.keys(vm.nestedFacilities.zone || {})
              vm.selected.zone = vm.selected.zone || vm.zones[0]
              resetLocations()
              getSelectedLocation()
              setStatus(response.facilities)
            })
            .catch(function (reason) {
              log('unknownError', reason)
            })
        })
    }

    function setStatus (facilities) {
      var i = facilities.length
      while (i--) {
        vm.facilityStatus[facilities[i]._id] = facilities[i].status
      }
    }

    $scope.$on('stateChanged', function (event, data) {
      loadFacilities()
    })
  })