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

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

    function AdminUsuarioCtrl($scope, $http, $q, $mdDialog, API_ENDPOINT,
        Usuario, GrupoUsuarios, localize, FileUploader) {

            /**
             * @method NovoUsuarioCtrl
             * 
             * @param {*} $scope 
             * @param {*} $http 
             * @param {*} Usuario 
             * @param {*} $mdDialog 
             * @param {*} fim 
             * @param {*} localize 
             * @param {*} FileUploader 
             */
        function NovoUsuarioCtrl($scope, $http, Usuario, $mdDialog, fim, localize, FileUploader) {

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

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

            $scope.cancelar = function () {
                $mdDialog.hide();
            };

            /**
             * @method criar
             * @memberof NovoUsuarioCtrl
             */
            $scope.criar = function () {
                Usuario.salvar($scope.user).then(function (u) {
                    enviarArquivo(u);
                    $mdDialog
                        .show($mdDialog.alert()
                            .title('Sucesso.')
                            .content('O Usuário foi salvo com sucesso.')
                            .ok('OK'));
                    fim();
                    $mdDialog.hide(u);
                });
            };

            $scope.user = {};


            var uploader = $scope.uploader = new FileUploader(),
                uploadCallbackQueue = [];

            uploader.clearQueue();

            $scope.uploader.filters.push({
                'name': 'enforceMaxFileSize',
                'fn': function (item, evt) {
                    var megaByte = parseInt(item.size / 1000000) + "MB";
                    if (item.size <= 26214400) {
                        return item.size <= 26214400
                    } else {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title('Tamanho de arquivo ultrapassado')
                                .content('O limite do tamanho de arquivos para upload é de 25MB. Seu arquivo possui ' + megaByte + ' - limite ultrapassado!')
                                .ok('OK'))
                        return item.size <= 26214400
                    }
                }
            });

            $scope.uploader.onCompleteItem = function (item, response) {
                $scope.mensagem = response;
            };

            $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
                item.novoNome = item.file.name;
                //enviarArquivo(item.file.name);
            }

            function ext(filename) {
                var index = _.lastIndexOf(filename, '.');
                return filename.substring(index, filename.length);
            }

            $scope.uploader.onBeforeUploadItem = function (item) {
                item.url = uploader.url;
                var token = window.sessionStorage.getItem('s4cToken');
                var tokenObj = JSON.parse(token);
                item.headers = {
                    'Authorization': 'Bearer ' + tokenObj.access_token
                };
                item.file.name = item.novoNome + ext(item.file.name);
            };

            $scope.uploader.onProgressItem = function (fileItem, progress) {
                console.info('onProgressItem', fileItem, progress);
                //listaEquals = [];
            };

            $scope.uploader.onCompleteAll = function (result) {
                _.each(uploadCallbackQueue, function (callback) {
                    callback();
                });
            };

            function enviarArquivo(_usuario) {
                $scope.isUploading = true;

                uploader.url = '/usuarios/' + _usuario.id;
                uploader.uploadAll();
                uploadCallbackQueue.push(function () {
                    $scope.isUploading = false;
                    $scope.arquivosPraSubir = false;
                });
            }

            $scope.uploader.alias = 'arquivo';
            $scope.uploader.removeAfterUpload = true;
            setTimeout(function () {
                $scope.input = angular.element('input.uploadArquivo');
            }, 1000);

            $scope.abrirUpload = function () {
                $scope.input.click();
            }

        }

        /**
         * @method NovoGrupoUsuariosCtrl
         * 
         * @param {*} $scope 
         * @param {*} GrupoUsuarios 
         * @param {*} $mdDialog 
         * @param {*} fim 
         */
        function NovoGrupoUsuariosCtrl($scope, GrupoUsuarios, $mdDialog, fim) {

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

            $scope.cancelar = function () {
                $mdDialog.hide();
            };
            $scope.criar = function () {
                GrupoUsuarios.save($scope.grupo).$promise.then(function () {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title('Sucesso.')
                            .content('O Grupo de Usuários foi salvo com sucesso.')
                            .ok('OK'));
                    fim();
                    $mdDialog.hide();
                });
            };

            $scope.grupo = {};
        }

        /**
         * @method novoUsuario
         * @param {*} event 
         */
        function novoUsuario(event) {
            $mdDialog.show({
                templateUrl: 'NovoUsuario.html',
                controller: NovoUsuarioCtrl,
                targetEvent: event,
                locals: {
                    fim: popularUsuarios
                }
            });
        }

        /**
         * @method novoGrupoUsuarios
         * @param {*} event 
         */
        function novoGrupoUsuarios(event) {
            $mdDialog.show({
                templateUrl: 'NovoGrupoUsuarios.html',
                controller: NovoGrupoUsuariosCtrl,
                targetEvent: event,
                locals: {
                    fim: popularGruposUsuarios,
                    fim2: function () {
                        var grupo = $scope.gruposUsuario[0];
                        GrupoUsuarios.get({
                            id: grupo.id
                        })
                            .$promise.then(function (grupo) {
                            });
                    }
                }
            });
        }

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

            $mdDialog.show(confirm).then(function () {
                GrupoUsuarios.delete({
                    id: grupo.id
                })
                    .$promise.then(function () {
                        popularGruposUsuarios();
                    });
            }, function () {
            });
        }

        /**
         * @method editGrupoUsuarios
         * 
         * @param {*} event 
         * @param {*} grupo 
         */
        function editGrupoUsuarios(event, grupo) {
            $mdDialog.show({
                templateUrl: 'EditGrupoUsuarios.html',
                controller: EditGrupoUsuariosCtrl,
                targetEvent: event,
                locals: {
                    grupo: grupo
                }
            }).then(function (_grupo) {
                grupo.nome = _grupo.nome;
                $mdDialog
                    .show($mdDialog.alert()
                        .title('Sucesso.')
                        .content('O Grupo de Usuários foi salvo com sucesso.')
                        .ok('OK'));
            });
        }

        /**
         * @method EditGrupoUsuariosCtrl
         * 
         * @param {*} $scope 
         * @param {*} GrupoUsuarios 
         * @param {*} $mdDialog 
         * @param {*} grupo 
         */
        function EditGrupoUsuariosCtrl($scope, GrupoUsuarios, $mdDialog, grupo) {

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

            $scope.grupo = _.clone(grupo);

            /**
             * @method salvar
             * @memberof EditGrupoUsuariosCtrl
             */
            function salvar() {
                GrupoUsuarios.save($scope.grupo)
                    .$promise.then(function (grupo) {
                        $mdDialog.hide(grupo);
                        console.log(grupo);
                    });
            }

            function cancelar() {
                $mdDialog.hide();
            }

            angular.extend($scope, {
                salvar: salvar,
                cancelar: cancelar,
                grupo: _.clone(grupo)
            });
        }

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

            $http.get(API_ENDPOINT + 'grupo_usuarios/')
                .then(function (response) {
                    console.log(response.data);
                    if (typeof response.data === 'object') {
                        $scope.gruposUsuario = _.map(response.data, function (grupoUsuarios) {
                            return {
                                id: grupoUsuarios.id,
                                nome: grupoUsuarios.nome,
                                val: false,
                                usuarios: _.filter(grupoUsuarios.Usuarios, function (usuario) {
                                    return usuario.ativo;
                                })
                            };
                        });

                        if ($scope.gruposUsuario.length > 0) {
                            selecionarGrupo($scope.gruposUsuario[0]);
                        }

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

            return deferred.promise;
        }

        /**
         * @method popularUsuarios
         */
        function popularUsuarios() {
            Usuario.obterShortUsers().then(function (usuarios) {
                $scope.usuarios = _.map(usuarios, function (usuario) {
                    return {
                        nome: usuario.nome,
                        val: false,
                        id: usuario.id
                    };
                });

                organizarUsuarios();
            });
        }

        var salvarGrupoUsuarios = _.debounce(function (grupoUsuarios) {

            $http.post(API_ENDPOINT + 'grupo_usuarios/' + grupoUsuarios.id + '/usuarios', {
                usuarios: grupoUsuarios.usuarios
            });

        }, 800);

        /**
         * @method removerUsuarioGrupo
         * 
         * @param {*} usuario 
         * @param {*} grupo 
         */
        function removerUsuarioGrupo(usuario, grupo) {
            _.remove(grupo.usuarios, { 'id': usuario.id });
            salvarGrupoUsuarios(grupo);
        }

        /**
         * @method escolherUsuarios
         */
        function escolherUsuarios() {
            $scope.grupoSelecionado.usuarios = [];
            var usuariosEscolhidos = _.filter($scope.usuarios, 'val');
            $scope.grupoSelecionado.usuarios = usuariosEscolhidos;

            _.each(usuariosEscolhidos, function (usuario) {
                usuario.valG = true;
            });

            salvarGrupoUsuarios($scope.grupoSelecionado);
        }

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

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

            organizarUsuarios();
        }

        /**
         * @method organizarUsuarios
         */
        function organizarUsuarios() {
            $scope.usuarios = _.map($scope.usuarios, function (usuario) {
                if (_.find($scope.grupoSelecionado.usuarios, {
                    'nome': usuario.nome
                })) {
                    usuario.val = true;
                    usuario.valG = true;
                } else {
                    usuario.val = false;
                    usuario.valG = false;
                }
                return usuario;
            });
        }

        angular.extend($scope, {
            selecionarGrupo: selecionarGrupo,
            escolherUsuarios: escolherUsuarios,
            novoUsuario: novoUsuario,
            novoGrupoUsuarios: novoGrupoUsuarios,
            editGrupoUsuarios: editGrupoUsuarios,
            deleteGrupoUsuarios: deleteGrupoUsuarios,
            removerUsuarioGrupo: removerUsuarioGrupo,
            grupoUsuarios: [],
            usuarios: [],
            departamentos: []
        });

        popularGruposUsuarios()
            .then(function () {
                popularUsuarios();
            });
    }

    AdminUsuarioCtrl.$inject = [
        '$scope',
        '$http',
        '$q',
        '$mdDialog',
        'API_ENDPOINT',
        'Usuario',
        'GrupoUsuarios',
        'localize',
        'FileUploader'
    ];

    angular.module('s4c.controllers.AdminUsuarioCtrl', [
        'ngMaterial',
        's4c.services.Usuario',
        's4c.services.GrupoUsuarios'
    ])
        .controller('AdminUsuarioCtrl', AdminUsuarioCtrl);

}());