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

/**
 * @ngdoc controllers
 * @name PermissaoAcesso
 * @module s4c.components.admin.controllers.PermissaoAcesso
 *
 * @description
 * `AdminPermissaoAcessoCtrl` Controller da tela de Permissão de Acesso do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    function AdminPermissaoAcessoCtrl($scope, $http, $q, $mdDialog, API_ENDPOINT, PermissaoAcesso, Perfil, localize) {

        $http.get(API_ENDPOINT + 'departamentos')
            .then(function (response) {
                if (typeof response.data === 'object') {
                    console.log(response.data);
                    $scope.departamentos = response.data;
                } else {
                    $scope.departamentos = [];
                }
            });

        //Permissoes de Acesso
        /**
         * @method NovaPermissaoAcessoCtrl
         * 
         * @param {*} $scope 
         * @param {*} $http 
         * @param {*} PermissaoAcesso 
         * @param {*} $mdDialog 
         * @param {*} fim 
         */
        function NovaPermissaoAcessoCtrl($scope, $http, PermissaoAcesso, $mdDialog, fim) {

            $scope.res = $scope.$root.res;

            $http.get(API_ENDPOINT + 'permissaoacesso')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        $scope.permissoesAcesso = response.data;
                    } else {
                        $scope.permissoesAcesso = [];
                    }
                });

            /**
             *
             * @method cancelar 
             */       
            $scope.cancelar = function () {
                $mdDialog.hide();
            };

            /**
             * @method criar
             */
            $scope.criar = function () {
                PermissaoAcesso.save($scope.permissaoAcesso).$promise.then(function (u) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title('Sucesso.')
                            .content('Permissão de Acesso salva com sucesso.')
                            .ok('OK'));
                    fim();
                    $mdDialog.hide(u);
                });
            };

            $scope.permissaoAcesso = {};
        }

        /**
         * @method popularPermissoesAcesso
         * @param {*} event 
         */
        function popularPermissoesAcesso(event) {
            PermissaoAcesso.query()
                .$promise
                .then(function (permissoesAcesso) {
                    $scope.permissoesAcesso = permissoesAcesso;
                })
                .then(function () {
                    organizarPermissoesAcesso();
                });
        }

        /**
         * @method novaPermissaoAcesso
         * @param {*} event 
         */
        function novaPermissaoAcesso(event) {
            $mdDialog.show({
                templateUrl: 'NovaPermissaoAcesso.html',
                controller: NovaPermissaoAcessoCtrl,
                targetEvent: event,
                scope: $scope,
                locals: {
                    fim: popularPermissoesAcesso
                }
            });
        }

        popularPermissoesAcesso();

        //Perfis
        /**
         * @method NovoPerfilCtrl
         * 
         * @param {*} $scope 
         * @param {*} $http 
         * @param {*} Perfil 
         * @param {*} $mdDialog 
         * @param {*} fim 
         */
        function NovoPerfilCtrl($scope, $http, Perfil, $mdDialog, fim) {

            $scope.res = $scope.$root.res;

            /**
             * @method cancelar
             */
            $scope.cancelar = function () {
                $mdDialog.hide();
            };

            /**
             * @method criar
             */
            $scope.criar = function () {
                Perfil.crud().save($scope.perfil).$promise.then(function (u) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title('Sucesso.')
                            .content('Perfil salvo com sucesso.')
                            .ok('OK'));
                    fim();
                    $mdDialog.hide(u);
                });
            };

            $scope.perfil = {};
        }

        /**
         * @method popularPerfis
         * @param {*} event 
         */
        function popularPerfis(event) {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'perfil/')
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        $scope.perfis = _.map(response.data, function (perfil) {
                            return {
                                id: perfil.id,
                                nome: perfil.nome,
                                val: false,
                                permissoesAcesso: perfil.PermissaoAcessos,
                                departamentoId: perfil.DepartamentoId
                            };
                        });

                        if ($scope.perfis.length > 0) {
                            selecionarPerfil($scope.perfis[0]);
                        }

                        deferred.resolve();
                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

        /**
         * @method novoPerfil
         * @param {*} event 
         */
        function novoPerfil(event) {
            $mdDialog.show({
                templateUrl: 'NovoPerfil.html',
                controller: NovoPerfilCtrl,
                scope: $scope,
                targetEvent: event,
                locals: {
                    fim: popularPerfis
                }
            });
        }

        var salvarPerfil = _.debounce(function (perfil) {

            $http.post(API_ENDPOINT + 'perfil/' + perfil.id + '/permissaoacessos', {
                permissoesAcesso: perfil.permissoesAcesso
            });

        }, 800);

        /**
         * @method deletePerfil
         * 
         * @param {*} event 
         * @param {*} perfil 
         */
        function deletePerfil(event, perfil) {
            var confirm = $mdDialog.confirm()
                .title('Tem certeza que deseja deletar o perfil ' + perfil.nome + ' ?')
                .content('Esta ação é irreversível.')
                .ariaLabel('Deletar Perfil')
                .ok('Sim')
                .cancel('Cancelar')
                .targetEvent(event);

            $mdDialog.show(confirm).then(function () {
                Perfil.crud().delete({
                    id: perfil.id
                })
                    .$promise.then(function () {
                        popularPerfis();
                    });
            }, function () {
            });
        }

        /**
         * @method escolherPermissoes
         */
        function escolherPermissoes() {
            $scope.perfilSelecionado.permissoesAcesso = [];
            var permissoesEscolhidas = _.filter($scope.permissoesAcesso, 'val');
            $scope.perfilSelecionado.permissoesAcesso = permissoesEscolhidas;

            _.each(permissoesEscolhidas, function (permissao) {
                //permissao.valG = true;
            });

            salvarPerfil($scope.perfilSelecionado);
        }

        /**
         * @method removerPermissaoPerfil
         * 
         * @param {*} permissao 
         * @param {*} perfil 
         */
        function removerPermissaoPerfil(permissao, perfil) {
            _.remove(perfil.permissoesAcesso, { 'id': permissao.id });
            salvarPerfil(perfil);
        }

        /**
         * @method selecionarPerfil
         * @param {*} perfil 
         */
        function selecionarPerfil(perfil) {
            if ($scope.perfilSelecionado === undefined) {
                $scope.perfilSelecionado = $scope.perfis[0];
                $scope.perfilSelecionado.val = true;
            }

            if (perfil !== $scope.perfilSelecionado) {
                $scope.perfilSelecionado.val = false;
                $scope.perfilSelecionado = perfil;
                perfil.val = true;
            }

            organizarPermissoesAcesso();
        }

        /**
         * @method organizarPermissoesAcesso
         */
        function organizarPermissoesAcesso() {
            $scope.permissoesAcesso = _.map($scope.permissoesAcesso, function (permissao) {
                if (_.find($scope.perfilSelecionado.permissoesAcesso,
                    {
                        'descricao': permissao.descricao
                    })) {
                    permissao.val = true;
                    //permissao.valG = true;
                } else {
                    permissao.val = false;
                    //permissao.valG = false;
                }
                return permissao;
            });
        }



        angular.extend($scope, {
            novaPermissaoAcesso: novaPermissaoAcesso,
            novoPerfil: novoPerfil,
            deletePerfil: deletePerfil,
            selecionarPerfil: selecionarPerfil,
            escolherPermissoes: escolherPermissoes,
            removerPermissaoPerfil: removerPermissaoPerfil,
            permissoesAcesso: [],
            perfis: [],
            departamentos: []
        });

        popularPerfis()
            .then(function () {
                popularPermissoesAcesso();
            });


    }

    angular.module('s4c.controllers.AdminPermissaoAcessoCtrl', [
        'ngMaterial',
        's4c.services.PermissaoAcesso',
        's4c.services.Perfil'
    ])
        .controller('AdminPermissaoAcessoCtrl', AdminPermissaoAcessoCtrl);

    AdminPermissaoAcessoCtrl.$inject = [
        '$scope',
        '$http',
        '$q',
        '$mdDialog',
        'API_ENDPOINT',
        'PermissaoAcesso',
        'Perfil',
        'localize'
    ];

}());