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

/**
 * @ngdoc directives
 * @name ChatGrupo
 * @module s4c.directives.chatUsuario.chatGrupo
 *
 * @description
 * `MensageriaChatGrupo` Controller da funcionalidade de conversas em grupos no módulo de mensageria 
 * 
 * 
 */
(function () {
    angular.module('s4c.components.collaboration')
        .directive('mensageriaChatGrupo', MensageriaChatGrupo);

    MensageriaChatGrupo.$inject = [
        'MensageriaService',
        'AuthService',
        '$q',
        '$filter',
        'MensageriaFilter',
        'MensageriaChatGrupo',
        '$mdDialog',
        'FileUploader',
        'localize',
        'MensageriaChatUsuario',
        '$sce'
    ]

    function MensageriaChatGrupo(MensageriaService, AuthService, $q, $filter, MensageriaFilter, MensageriaChatGrupo, $mdDialog, FileUploader, localize, MensageriaChatUsuario, $sce) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/mensageria/chat-grupo/chat-grupo.html',
            replace: true,
            scope: {
                grupo: '=',
                ativo: '='

            },
            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
                        }
                    }
                });

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

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


                /**
                 * @method ext
                 * 
                 * 
                 */
                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);
                    //listaEquals = [];
                };

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

                 /**
                 * @method enviarArquivo
                 * 
                 * @param nomeArquivo {String}
                 * 
                 */
                function enviarArquivo(nomeArquivo) {
                    $scope.isUploading = true;
                    uploader.url = '/mensagem/grupousuario/' + $scope.grupo.id;
                    uploader.uploadAll();
                    uploadCallbackQueue.push(function () {
                        $scope.isUploading = false;
                        $scope.arquivosPraSubir = false;
                        $scope.mensagem = ''
                    });
                }

                $scope.uploader.alias = 'arquivo';
                $scope.uploader.removeAfterUpload = true;
            },
            link: function ($scope, $elem, $attrs) {
                $scope.res = $scope.$root.res;
                angular.extend($scope, {
                    desativar: desativar,
                    enviarMensagem: enviarMensagem,
                    openAddUsuarioGrupo: openAddUsuarioGrupo,
                    openInformacoesGrupo: openInformacoesGrupo,
                    openEditarGrupo: openEditarGrupo,
                    adicionarParticipanteGrupo: adicionarParticipanteGrupo,
                    deletarGrupo: deletarGrupo,
                    buscarUsuarios: buscarUsuarios,
                    isInformacoesActive: false,
                    isEditarActive: false,
                    administrador: AuthService.user.info.id,
                    mensagem: '',
                    mensagens: [],
                    usuarios: [],
                    filters: {
                        texto: ''
                    },
                    me: AuthService.user.info,
                    abrirUpload: abrirUpload,
                    res: $scope.$root.res
                });

                /**
                 * @method toTrustedHTML
                 * 
                 * 
                 */
                $scope.toTrustedHTML = function (html) {
                    return $sce.trustAsHtml(html);
                }

                $scope.input = $elem.find('input.uploadArquivo');

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

                /**
                 * @method removerArquivo
                 * 
                 * 
                 */
                function removerArquivo() {
                    $scope.mensagem.arquivo = {};
                }


                 /**
                 * @method trigger
                 * 
                 * 
                 * @param nomeEvento {String}
                 * @param args {args}
                 * 
                 */
                function trigger(nomeEvento, args) {
                    _.each(service._eventos[nomeEvento], function (callback) {
                        callback(args);
                    });
                }

                /**
                 * @method watch
                 * 
                 * 
                 */                
                $scope.$watch('grupo', function () {
                    if ($scope.grupo && $scope.grupo.id) {
                        _carregarDados();
                    }
                });

                 /**
                 * @method filterChanged
                 * 
                 * 
                 */  
                MensageriaFilter.getInstance('mensageria-filter-grupo').on('filterChanged', _filtrarUsuarios);

                /**
                 * @method novaMensagem
                 * 
                 * 
                 */  
                MensageriaChatGrupo.on('novaMensagem', function (mensagem) {

                    if ($scope.grupo) {
                        if ($scope.grupo.id != mensagem.GrupoUsuarioMensageriumId) {
                            return;
                        }
                    }

                    if (mensagem.participanteRemovido != null) {
                        angular.forEach($scope.usuarios, function (usr) {

                            if (usr.id == mensagem.participanteRemovido) {
                                usr.isAdded = false;
                                MensageriaChatGrupo.trigger('usuarioRemovido', usr);
                            }
                        });
                    }

                    mensagem.groupDate = moment(mensagem.createdAt).format('YYYY-MM-DD');
                    mensagem.createdAt = moment(new Date(mensagem.dataCriacaoMensagem)).format('HH:mm');

                    var hasMessage = false;
                    angular.forEach($scope.mensagens, function (msg) {

                        if (msg.id == mensagem.id) {
                            hasMessage = true;
                        }
                    })

                    if (hasMessage) {
                        return;
                    }

                    //if($scope.ativo){
                    //	mensagem.lida.push(AuthService.user.info.id);
                    //}
                    $scope.mensagens.push(mensagem);

                    $('#mensagens').animate({
                        scrollTop: $('#mensagens')[0].scrollHeight + 100
                    }, 800);

                });

                /**
                 * @method openInformacoesGrupo
                 * 
                 * 
                 */  
                function openInformacoesGrupo() {
                    $scope.isInformacoesActive = !$scope.isInformacoesActive;
                }

                /**
                 * @method openEditarGrupo
                 * 
                 * 
                 */                  
                function openEditarGrupo() {
                    $scope.isEditarActive = true;
                    $("#renderCropperEditGroup").empty();
                }

                // insere um delimitador de tempo
                $scope.addMarkers = function () {
                    $scope.mensagens.forEach(function (obj) {
                        obj.groupDate = moment(obj.createdAt).format('YYYY-MM-DD');
                        obj.createdAt = moment(obj.createdAt).format('HH:mm');
                    });
                };


                 /**
                 * @method obterUsuarios
                 * 
                 * 
                 */  
                MensageriaChatUsuario.on('obterUsuarios', function (ocultarContatos) {

                    $q.all([
                        _obterUsuarios()

                    ]).then(function (results) {
                        var usuarios = results[0];

                        _.each(usuarios, function (usuario) {
                            usuario.exibir = true;

                            if ($scope.grupo) {
                                if (_.some($scope.grupo.participantes, function (id) {
                                    return id === usuario.id;
                                })) {
                                    usuario.isAdded = true;
                                }
                            }
                        });

                        $scope.usuarios = usuarios;
                    });
                });


                /**
                 * @method _carregarDados
                 * 
                 * 
                 */                 
                function _carregarDados() {
                    $q.all([

                        _obterMensagens()

                    ]).then(function (results) {
                        $scope.mensagens = results[0];
                        $scope.addMarkers();
                    });
                }

                 /**
                 * @method mensagemApagada
                 * 
                 * 
                 */  
                MensageriaChatGrupo.on('mensagemApagada', function (mensagem) {
                    var indexMsg = _.findIndex($scope.mensagens, function (msg) {
                        return msg.id === mensagem.id;
                    });

                    if (indexMsg > -1) {
                        $scope.mensagens.splice(indexMsg, 1);
                    }
                });

                /**
                 * @method _obterMensagens
                 * 
                 * 
                 */ 
                function _obterMensagens() {
                    return MensageriaService.obterMensagensDoGrupoUsarios($scope.grupo.id);
                }

                /**
                 * @method _obterUsuarios
                 * 
                 * 
                 */ 
                function _obterUsuarios() {
                    return MensageriaService.findUsuarios();
                }

                /**
                 * @method _obterUsuariosOnline
                 * 
                 * 
                 */ 
                function _obterUsuariosOnline() {
                    return MensageriaService.pegarUsuariosOnline();
                }

                 /**
                 * @method _filtrarUsuarios
                 * 
                 * 
                 */ 
                function _filtrarUsuarios() {
                    _.each($scope.usuarios, function (usuario) {
                        usuario.exibir = false;

                        if (usuario.nome != null && usuario.nome.indexOf($scope.filters.texto) > -1 &&
                            MensageriaFilter.getInstance('mensageria-filter-grupo').filtrar(usuario)) {
                            usuario.exibir = true;
                        } else {
                            usuario.exibir = false;
                        }
                    })
                }

                $scope.lastText;
                $scope.usuariosFiltrados = $scope.usuarios;
                /**
                 * @method buscarUsuarios
                 * 
                 * 
                 */ 
                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 desativar
                 * 
                 * 
                 */ 
                function desativar() {
                    $scope.ativo = false;
                }

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

                    // Verificação de mensagem vazia:
                    $scope.mensagem = $scope.mensagem.replace(/^\s+|\s+$/g, '');
                    if ($scope.mensagem.length > 0) {
                        MensageriaChatGrupo.enviarMensagem($scope.grupo, $scope.mensagem);
                        $scope.mensagem = '';
                    }
                }

                 /**
                 * @method openAddUsuarioGrupo
                 * 
                 * 
                 */ 
                function openAddUsuarioGrupo() {
                    $scope.isInformacoesActive = false;
                    $scope.isAddUsuarioGrupo = !$scope.isAddUsuarioGrupo;
                }

                 /**
                 * @method adicionarParticipanteGrupo
                 * 
                 * 
                 * @param participante {Object}
                 */ 
                function adicionarParticipanteGrupo(participante) {
                    if (participante.isAdded) {
                        MensageriaService.deleteParticipanteGrupo($scope.grupo.id, participante.id, participante.nome)
                            .then(function (result) {
                                $scope.grupo.participantes = result;
                                participante.isAdded = false;
                            });
                        return;
                    }
                    MensageriaService.adicionarParticipanteGrupo($scope.grupo.id, participante.id)
                        .then(function (result) {
                            $scope.grupo.participantes = result;
                            participante.isAdded = true;
                        });
                }

                 /**
                 * @method deletarGrupo
                 * 
                 * 
                 */ 
                function deletarGrupo() {
                    var parentScope = $scope.$parent.$parent;

                    $mdDialog
                        .show($mdDialog.confirm({
                            title: $scope.res('EXCLUIR_GRUPO'),
                            ok: $scope.res('COMUM_OK'),
                            cancel: $scope.res('COMUM_CANCELAR'),
                            content: $scope.res('PERGUNTA_DELETAR_GRUPO')
                        }))
                        .then(function () {
                            MensageriaService.deleteGrupo($scope.grupo.id)
                                .then(function () {
                                    $scope.isInformacoesActive = false;
                                    parentScope.state.chatGrupoAtivo = false;

                                    _.remove(parentScope.usuarios, function (n) {
                                        return n.id === $scope.grupo.id;
                                    });

                                    _.remove(parentScope.selecionados, function (n) {
                                        return n.id === $scope.grupo.id;
                                    });
                                });
                        });
                }
            }
        }
    }
}());