Source: components/admin/controllers/grupo_usuarios.controller.js

/**
 * @ngdoc controllers
 * @name GrupoUsuarios      
 * @module s4c.components.admin.controllers.GrupoUsuarios
 *
 * @description
 * `AdminGrupoUsuariosCtrl` Controller da tela de Grupos de Usuários do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    function AdminGrupoUsuariosCtrl($scope, $http, $q, API_ENDPOINT, GrupoUsuarios, MainState, CamadasService, Menu) {

        /**
         * @method popularGrupos
         */
        function popularGrupos() {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'grupos/')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        $scope.grupos = _.map(response.data, function (grupo) {
                            return {
                                id: grupo.id,
                                nome: grupo.nome,
                                acervos: _.map(grupo.Acervos, function (acervo) {
                                    acervo.AcervoGrupoUsuarios = {
                                        administrador: false
                                    };
                                    return acervo;
                                })
                            };
                        });
                        deferred.resolve();
                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

        /**
         * @method popularAtivosMoveis
         */
        function popularAtivosMoveis() {
            var deferred = $q.defer();
            /* Módulos */
            $http.get(API_ENDPOINT + 'viaturas/permissoes')
                .then(function (response) {
                    $scope.ativosMoveis = response.data


                    deferred.resolve();
                });

            return deferred.promise;
        }

        /**
         * @method isNotInABlackList
         * @param {*} modulo 
         */
        function isNotInABlackList(modulo) {
            if (modulo.template == 'app/components/modulos/modulo-zonas-de-observacao.html' && !MainState.isToShow('zona_mapa')) {
                return false;
            }
            if (modulo.template == 'app/components/modulos/modulo-msi.html' && !MainState.isToShow('incidentes_mapa')) {
                return false;
            }
            if (modulo.template == 'app/components/modulos/modulo-cameras.html' && !MainState.isToShow('camera_mapa')) {
                return false;
            }
            if (modulo.template == 'app/components/modulos/modulo-rotas-unificadas.html' && !MainState.isToShow('rota_mapa')) {
                return false;
            }
            return true;
        }

        /**
         * @method popularFaces
         */
        function popularFaces() {
            /* Módulos */
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'faces/')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        response.data = _.filter(response.data, function (modulo) {
                            return isNotInABlackList(modulo);
                        });

                        $scope.faces = _.map(response.data, function (faces) {
                            return {
                                id: faces.id,
                                name: faces.name,
                                val: false,
                                FaceGrupoUsuarios: {
                                    administrador: false
                                }
                            };
                        });
                        deferred.resolve();
                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

        /**
         * @method popularGruposUsuarios
         */
        function popularGruposUsuarios() {
            var deferred = $q.defer();
            GrupoUsuarios.query().$promise
                .then(function (_gruposUsuarios) {
                    $scope.gruposUsuarios = _.map(_gruposUsuarios, function (grupoUsuarios) {
                        return {
                            id: grupoUsuarios.id,
                            nome: grupoUsuarios.nome,
                            val: false,
                            faces: grupoUsuarios.Faces,
                            acervos: grupoUsuarios.Acervos,
                            ativosMoveis: grupoUsuarios.OrganizacaoViaturas
                        };
                    });
                    deferred.resolve();
                });

            return deferred.promise;
        }

        /**
         * @method selecionarGrupo
         * @param {*} grupo 
         */
        function selecionarGrupo(grupo) {
            if ($scope.grupoSelecionado === undefined) {
                $scope.grupoSelecionado = $scope.gruposUsuarios[0];
                $scope.grupoSelecionado.val = true;
            }

            if (grupo !== $scope.grupoSelecionado) {
                $scope.grupoSelecionado.val = false;
                $scope.grupoSelecionado = grupo;
                grupo.val = true;
            }

            organizarFacesAcervos();
        }

        /**
         * @method organizarFacesAcervos
         */
        function organizarFacesAcervos() {
            $scope.faces = _.map($scope.faces, function (face) {
                if (_.find($scope.grupoSelecionado.faces, {
                    'id': face.id
                })) {
                    face.val = true;
                    face.valG = true;
                } else {
                    face.val = false;
                    face.valG = false;
                }
                return face;
            });

            $scope.grupos = _.map($scope.grupos, function (grupo) {
                _.each(grupo.acervos, function (acervo) {
                    if (_.find($scope.grupoSelecionado.acervos, {
                        'id': acervo.id
                    })) {
                        acervo.val = true;
                        acervo.valG = true;
                    } else {
                        acervo.val = false;
                        acervo.valG = false;
                    }
                });
                return grupo;
            });

            $scope.ativosMoveisSelecionados = $scope.grupoSelecionado.ativosMoveis;
            tratarArvoreAtivosMoveis($scope.ativosMoveis);
        }

        /**
         * @method escolherFacesAcervos
         */
        function escolherFacesAcervos() {
            $scope.grupoSelecionado.faces = [];

            var facesEscolhidas = _.filter($scope.faces, 'val');

            _.each($scope.grupos, function (grupo) {
                _.each(grupo.acervos, function (acervo) {
                    if (acervo.val && !acervo.valG) {
                        acervo.valG = true;

                        if (!$scope.grupoSelecionado.acervos) {
                            $scope.grupoSelecionado.acervos = [];
                        }

                        $scope.grupoSelecionado.acervos.push(acervo);
                    }
                });
            });

            $scope.grupoSelecionado.faces = facesEscolhidas;
            $scope.grupoSelecionado.ativosMoveis = $scope.ativosMoveisSelecionados;

            _.each(facesEscolhidas, function (face) {
                face.valG = true;
            });

            savePermissions().then(function () {
                Menu.clearPromise();
                CamadasService.getInstance('camadas-service').trigger('reloadMenuCamada');
            });
        }

        /**
         * @method savePermissions
         */
        function savePermissions() {
            var deferred = $q.defer();
            $http.post(API_ENDPOINT + 'grupo_usuarios/savePermissions', {
                grupoUsuarios: $scope.grupoSelecionado
            })
                .then(function (response) {
                    deferred.resolve(response);
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method atualizarAcervo
         */
        function atualizarAcervo() {
            savePermissions();
        }

        /**
         * @method atualizarFace
         */
        function atualizarFace() {
            savePermissions();
        }

        /**
         * @method removerAcervo
         * @param {*} acervo 
         */
        function removerAcervo(acervo) {
            var _acervo = _.find($scope.grupoSelecionado.acervos, {
                id: acervo.id
            });
            if (_acervo) {
                var index = $scope.grupoSelecionado.acervos.indexOf(_acervo);
                $scope.grupoSelecionado.acervos.splice(index, 1);
                savePermissions();
            }
        }

        /**
         * @method removerFace
         * @param {*} face 
         */
        function removerFace(face) {
            var _face = _.find($scope.grupoSelecionado.faces, {
                id: face.id
            });
            if (_face) {
                var index = $scope.grupoSelecionado.faces.indexOf(_face);
                $scope.grupoSelecionado.faces.splice(index, 1);
                savePermissions();
            }
        }

        /**
         * @method removerAtivoMovel
         * @param {*} ativo 
         */
        function removerAtivoMovel(ativo) {
            var _ativo = _.find($scope.grupoSelecionado.ativosMoveis, {
                id: ativo.id
            });
            if (_ativo) {
                var index = $scope.grupoSelecionado.ativosMoveis.indexOf(_ativo);
                $scope.grupoSelecionado.ativosMoveis.splice(index, 1);
                savePermissions();
            }
        }

        /**
         * @method toggleAtivo
         * @param {*} ativo 
         */
        function toggleAtivo(ativo) {

            _.remove($scope.ativosMoveisSelecionados, { chave_estrangeira: ativo.chave_estrangeira });

            if (ativo.ativo) {
                $scope.ativosMoveisSelecionados.push(ativo);
            }

            _.each(ativo.subOrganizacoes, function (subOrganizacao) {
                subOrganizacao.ativo = ativo.ativo;
                toggleAtivo(subOrganizacao);
            });
        }

        /**
         * @method tratarArvoreAtivosMoveis
         * @param {*} ativos 
         */
        function tratarArvoreAtivosMoveis(ativos) {
            _.each(ativos, function (ativoMovel) {
                if (ativoMovel.subOrganizacoes.length) {
                    tratarArvoreAtivosMoveis(ativoMovel.subOrganizacoes);
                }

                var ativoSelecionado = _.find($scope.grupoSelecionado.ativosMoveis,
                    { chave_estrangeira: ativoMovel.chave_estrangeira });

                if (ativoSelecionado) {
                    ativoMovel.ativo = true;
                } else {
                    ativoMovel.ativo = false;
                }
            })
        }

        popularAtivosMoveis().then(function () {
            popularFaces().then(function () {
                popularGrupos().then(function () {
                    popularGruposUsuarios().then(function () {
                        selecionarGrupo($scope.gruposUsuarios[0]);
                    });
                });
            });
        });

        $scope.faces = [];
        $scope.grupos = [];
        $scope.gruposUsuarios = [];
        $scope.ativosMoveisSelecionados = [];

        $scope.selecionarGrupo = selecionarGrupo;
        $scope.escolherFacesAcervos = escolherFacesAcervos;
        $scope.atualizarAcervo = atualizarAcervo;
        $scope.removerAcervo = removerAcervo;
        $scope.atualizarFace = atualizarFace;
        $scope.removerFace = removerFace;
        $scope.removerAtivoMovel = removerAtivoMovel;
        $scope.toggleAtivo = toggleAtivo;
        $scope.treeOptions = {
            nodeChildren: 'subOrganizacoes',
            defaultCollapsed: false
        }

    }

    AdminGrupoUsuariosCtrl.$inject = ['$scope', '$http', '$q', 'API_ENDPOINT', 'GrupoUsuarios', 'MainState',
        'CamadasService', 'Menu'];

    angular.module('s4c.controllers.AdminGrupoUsuariosCtrl', ['ngMaterial'])
        .controller('AdminGrupoUsuariosCtrl', AdminGrupoUsuariosCtrl);

}());