Source: directives/mensageria/adicionar-grupo/adicionar-grupo.js

/**
 * @ngdoc directives
 * @name MensageriaAdicionarGrupo
 * @module s4c.directives.mensageria.adicionarGrupo.MensageriaAdicionarGrupo
 *
 * @description
 * `MensageriaAdicionarGrupo` Controller da funcionalidade de adicionar grupos no módulo de mensageria 
 * 
 * 
 */
(function () {
    angular.module('s4c.components.collaboration')
        .directive('mensageriaAdicionarGrupo', MensageriaAdicionarGrupo);

    MensageriaAdicionarGrupo.$inject = [
        'MainService',
        'AdicionarGrupoService',
        'MensageriaService',
        'AuthService',
        '$q',
        '$filter',
        '$mdDialog',
        'FileUploader',
        'localize',
        'MensageriaChatUsuario'
    ];

    function MensageriaAdicionarGrupo(MainService, AdicionarGrupoService, MensageriaService, AuthService, $q, $filter, $mdDialog, FileUploader, localize, MensageriaChatUsuario) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/mensageria/adicionar-grupo/adicionar-grupo.html',
            replace: true,
            scope: {
                isAddGrupo: '='
            },
            controller: function ($scope) {
                $scope.res = $scope.$root.res;

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

                uploader.clearQueue();

                 /**
                 * 
                 * 
                 * @method filters
                 * 
                 */ 
                $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();
                }

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

                 /**
                 * 
                 * 
                 * @method onBeforeUploadItem
                 * 
                 */ 
                $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);
                };

                /**
                 * 
                 * 
                 * @method onProgressItem
                 * 
                 */ 
                $scope.uploader.onProgressItem = function (fileItem, progress) {
                    console.info('onProgressItem', fileItem, progress);
                };

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

                 /**
                 * 
                 * 
                 * @method mostrarImagem
                 * 
                 */   
                $scope.mostrarImagem = function () {
                    $('#adicionar_grupo_arquivo').each(function (index) {
                        if ($('#adicionar_grupo_arquivo').eq(index).val() != "") {
                            $scope.readURL(this);
                        }
                    });
                }

                /**
                 * 
                 * 
                 * @method readURL
                 * 
                 */   
                $scope.readURL = function (input) {
                    if (input.files && input.files[0]) {
                        var reader = new FileReader();
                        reader.onload = function (e) {
                            $("#renderCropper").empty();
                            var img = $('<img />',
                                {
                                    id: 'image',
                                    src: e.target.result,
                                    style: 'width: 100%'
                                }).appendTo($('#renderCropper'));
                            var cropper = new Cropper(img[0], {
                                aspectRatio: 1,
                                crop: function (e) {
                                    document.getElementById('newGrupoX').value = e.detail.x;
                                    document.getElementById('newGrupoY').value = e.detail.y;
                                    document.getElementById('newGrupoWidth').value = e.detail.width;
                                    document.getElementById('newGrupoHeight').value = e.detail.height;
                                },
                                zoomable: true,
                                scalable: true,
                                movable: true,
                                background: false,
                                viewMode: 1
                            });
                        };
                        reader.readAsDataURL(input.files[0]);
                    }
                }


                /**
                 * 
                 * 
                 * @method enviarArquivo
                 * 
                 */                  
                function enviarArquivo() {
                    $scope.mostrarImagem();
                }

                $scope.uploader.alias = 'arquivo';
                $scope.uploader.removeAfterUpload = true;

            },
            link: function ($scope, $elem, $attrs) {

                angular.extend($scope, {
                    desativar: desativar,
                    buscarUsuarios: buscarUsuarios,
                    salvarGruposUsuarios: salvarGruposUsuarios,
                    selectCheckBox,
                    adicionarParticipanteGrupo: adicionarParticipanteGrupo,
                    usuarios: [],
                    usuariosParticipantes: [],
                    administrador: null,
                    res: $scope.$root.res,
                    checkboxSelected: false,
                    filters: {
                        texto: ''
                    }
                });

                MensageriaChatUsuario.on('obterContatos', function () {

                    _carregarDados();
                });

                 /**
                 * 
                 * 
                 * @method abrirUpload
                 * 
                 */ 
                $scope.abrirUpload = function () {
                    $("#adicionar_grupo_arquivo").click();
                }

                 /**
                 * 
                 * 
                 * @method toBlob
                 * 
                 * @param grupo {Object}
                 * 
                 */ 
                function toBlob(grupo) {
                    var canvas = document.createElement('canvas');

                    var ctx = canvas.getContext('2d');
                    canvas.height = document.getElementById('newGrupoHeight').value;
                    canvas.width = document.getElementById('newGrupoWidth').value;
                    ctx.drawImage(document.getElementById('image'), document.getElementById('newGrupoX').value, document.getElementById('newGrupoY').value, canvas.width, canvas.height, 10, 10, canvas.width, canvas.height);

                    if (canvas.toBlob) {
                        canvas.toBlob(function (blob) {
                            var formData = new FormData();

                            var token = window.sessionStorage.getItem('s4cToken');
                            var tokenObj = JSON.parse(token);

                            formData.append('arquivo', blob, "capagrupo.png");
                            $.ajax('/grupo_usuario_mensageria/imagem/' + grupo.id, {
                                method: "POST",
                                data: formData,
                                processData: false,
                                contentType: false,
                                headers: {
                                    'Authorization': 'Bearer ' + tokenObj.access_token
                                },
                                success: function (data) {
                                    console.log(data);
                                    console.log('Upload success');
                                },
                                error: function () {
                                    console.log('Upload error');
                                }
                            });
                        });
                    }
                }

                 /**
                 * 
                 * 
                 * @method _carregarDados
                 * 
                 * 
                 */ 
                function _carregarDados() {

                    $q.all([
                        MensageriaService.findContatos(true),
                        MensageriaService.findUsuarioById(AuthService.user.info.id)
                    ]).then(function (results) {

                        if ($scope.usuariosParticipantes != null) {
                            $scope.usuariosParticipantes = [];
                        }
                        $scope.usuarios = angular.copy(results[0]);
                        $scope.usuarios.push(results[1]);

                        $scope.usuarios = $filter('orderBy')($scope.usuarios, 'nome')

                        $scope.administrador = results[1];

                        $scope.usuariosParticipantes.push($scope.administrador);

                        $scope.filters.texto = '';
                    });
                }

                /**
                 * 
                 * 
                 * @method salvarGruposUsuarios
                 * 
                 * 
                 */ 
                function salvarGruposUsuarios() {
                    MensageriaService.findGruposUsuarios()
                        .then(function (gruposUsuarios) {
                            if (!$scope.grupoMensageria || _.includes(_.map(gruposUsuarios, 'nome'), $scope.grupoMensageria.nome) || _.isEmpty($scope.grupoMensageria.nome)) {
                                var confirm = $mdDialog.confirm()
                                    .title(localize.getLocalizedString('COMUM_AVISO'))
                                    .content(localize.getLocalizedString('MENSAGERIA_ERRONOMEGRUPO'))
                                    .ariaLabel(localize.getLocalizedString('COMUM_ERRO'))
                                    .ok(localize.getLocalizedString('COMUM_OK'));

                                $mdDialog.show(confirm);
                            }
                            else {

                                var participantesIds = [];
                                var participantesNomes = [];
                                angular.forEach($scope.usuariosParticipantes, function (participante) {
                                    participantesIds.push(participante.id);
                                    participantesNomes.push(participante.nome);
                                });

                                $scope.grupoMensageria.participantes = participantesIds;
                                $scope.grupoMensageria.nomeParticipantes = participantesNomes;

                                MensageriaService.adicionarGruposUsuarios($scope.grupoMensageria)
                                    .then(function (result) {
                                        if ($("#image").length > 0) {
                                            toBlob(result);
                                        }
                                        result.exibir = true;
                                        AdicionarGrupoService.trigger('adicionar', result);
                                        $scope.grupoMensageria.nome = '';
                                        desativar();
                                    });
                            }
                        });
                }

                 /**
                 * 
                 * 
                 * @method desativar
                 * 
                 * 
                 */
                function desativar() {
                    $scope.isAddGrupo = false;
                    $scope.checkboxSelected = false;
                    $scope.usuariosParticipantes = [];

                    angular.forEach($scope.usuarios, function (usuario) {
                        usuario.isAdded = false;
                    });

                    $scope.filters.texto = '';
                }

                $scope.lastText;
                $scope.usuariosFiltrados = $scope.usuarios;
                 /**
                 * 
                 * 
                 * @method buscarUsuarios
                 * 
                 * 
                 * @param texto {Object}
                 */
                function buscarUsuarios(texto) {

                    if (!texto) {
                        return $scope.usuarios;
                    }

                    texto = $filter('latinize')(texto.toLowerCase());

                    if (texto != $scope.lastText) {
                        $scope.checkboxSelected = false;
                    }

                    $scope.lastText = texto;

                    var items = _.filter($scope.usuarios, function (usuario) {
                        return _.includes($filter('latinize')(usuario.nome.toLowerCase()), texto);
                    });

                    items = $filter('orderBy')(items, 'nome');
                    $scope.usuariosFiltrados = items;
                }

                /**
                 * 
                 * 
                 * @method adicionarParticipanteGrupo
                 * 
                 * 
                 * @param participante {Object}
                 * 
                 */
                function adicionarParticipanteGrupo(participante) {

                    if (participante.id == $scope.administrador.id) {
                        return;
                    }

                    if (participante.isAdded) {

                        participante.isAdded = false;

                        var index = $scope.usuariosParticipantes.indexOf(participante);
                        $scope.usuariosParticipantes.splice(index, 1);
                        return;
                    }

                    participante.isAdded = true;
                    $scope.usuariosParticipantes.push(participante);

                    $scope.usuariosParticipantes = $filter('orderBy')($scope.usuariosParticipantes, 'nome');
                }

                /**
                 * 
                 * 
                 * @method selectCheckBox
                 * 
                 * 
                 */
                function selectCheckBox() {
                    if ($scope.checkboxSelected) {
                        $scope.checkboxSelected = false;
                        return;
                    }

                    $scope.checkboxSelected = true;
                }
            }
        }
    }
}());