Source: directives/mensageria/mensagens/mensagens.js

/**
 * @ngdoc directives
 * @name Mensagens
 * @module s4c.directives.mensageria.mensagens.Mensagens
 *
 * @description
 * `MensageriaMensagens` Gerenciamento das mensagens do módulo de mensageria 
 * 
 */
(function () {
    angular.module('s4c.components.collaboration')
        .directive('mensageriaMensagens', MensageriaMensagens);

    MensageriaMensagens.$inject = [
        'ZonaObservacaoService',
        'MapaManager',
        'CamadasService',
        'DetalhamentoManager',
        'MensageriaService',
        'DetalhamentoService',
        'BaseConhecimentoService',
        'PlanejamentoService',
        'AuthService',
        'MensageriaChatUsuario',
        'MensageriaChatGrupo',
        '$mdDialog',
        '$http',
        '$rootScope',
        '$sce'
    ]

    function MensageriaMensagens(
        ZonaObservacaoService,
        MapaManager,
        CamadasService,
        DetalhamentoManager,
        MensageriaService,
        DetalhamentoService,
        BaseConhecimentoService,
        PlanejamentoService,
        AuthService,
        MensageriaChatUsuario,
        MensageriaChatGrupo,
        $mdDialog,
        $http,
        $rootScope,
        $sce
    ) {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/mensageria/mensagens/mensagens.html',
            replace: true,
            scope: {
                mensagens: '=',
                isGrupo: '=',
                scroll: '='
            },
            link: function ($scope, elem, attrs) {
                $scope.res = $scope.$root.res;
                verificaMensagensCarregadas();

                angular.extend($scope, {
                    acaoLink: acaoLink,
                    isRead: isRead,
                    lerTodasMensagens: lerTodasMensagens,
                    me: AuthService.user.info,
                    scrolled: scrolled,
                    scroll_glue: scroll_glue,
                    glued: true,
                    download: download,
                    apagarMensagem: apagarMensagem,
                    isHorizontal: isHorizontal
                });

                /**
                 * @method apagarMensagem
                 * @param {*} mensagem 
                 */
                function apagarMensagem(mensagem) {
                    MensageriaService.deletarMensagem(mensagem.id)
                        .then(function (response) {
                            MensageriaChatUsuario.trigger('mensagemApagada', mensagem);
                            MensageriaChatGrupo.trigger('mensagemApagada', mensagem);
                        });
                }

                $scope.toTrustedHTML = function (html) {
                    return $sce.trustAsHtml(html);
                }

                /**
                 * @method thumbnail
                 * @param {*} arquivo 
                 */
                function thumbnail(arquivo) {
                    return "/uploads/" + arquivo.thumbnail;
                }

                /**
                 * @method carregarAudio
                 */
                $scope.carregarAudio = function (mensagem) {
                    console.log(mensagem.arquivo);
                    mensagem.arquivo.exibe = true;
                    mensagem.arquivo.path = '/uploads/' + mensagem.arquivo.path
                }

                /**
                 * @method isHorizontal
                 * @param {*} nomeArquivo 
                 */
                function isHorizontal(nomeArquivo) {

                    if (nomeArquivo.indexOf('horiz') != -1) {
                        return true;
                    }

                    return false;
                }

                /**
                 * @method download
                 * @param {*} fileId 
                 * @param {*} fileName 
                 */
                function download(fileId, fileName) {

                    $http.get('/filemanager/checkexistence/' + fileId)
                        .then(function (response) {
                            if (response.data) {

                                MensageriaService.getAttachedFile(fileId)
                                    .then(function (data) {

                                        var a = document.createElement("a");
                                        document.body.appendChild(a);
                                        a.style = "display: none";

                                        var file = new Blob([data], { type: 'application/octet-stream' });
                                        var fileURL = URL.createObjectURL(file);

                                        a.href = fileURL;
                                        a.download = fileName;
                                        a.click();

                                    });
                            }
                            else {
                                $mdDialog
                                    .show($mdDialog.alert()
                                        .title($scope.res('COMUM_ERRO'))
                                        .content(response.data.message)
                                        .ok($scope.res('COMUM_OK')));
                            }
                        }, function (err) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content(err.data.message)
                                    .ok($scope.res('COMUM_OK')));
                        });

                }

                function verificaMensagensCarregadas() {
                    /*if($scope.mensagens ==null || $scope.mensagens.length==0 ){
                    	setTimeout(function(){ 
                    		verificaMensagensCarregadas();
                    	}, 500);
                    }else{
                    	$scope.glued = false;
                    }*/
                }

                /**
                 * @method scroll_glue
                 */
                function scroll_glue() {
                    $scope.glued = true;
                    setTimeout(function () {
                        $scope.glued = false;
                    }, 500);
                }

                $scope.hideMessage = {};
                $scope.toogleMessage = function (key) {
                    if ($scope.hideMessage[key]) {
                        $scope.hideMessage[key] = false;
                    } else {
                        $scope.hideMessage[key] = true;
                    }
                };

                $scope.toggleSelected = function (mensagem) {
                    mensagem.selected = !mensagem.selected;
                    $scope.glued = false;
                };

                /**
                 * @method $watch 
                 */
                $scope.$watch('mensagens', function () {
                    _.chain($scope.mensagens)
                        .reject('link')
                        .map(tratarMensagem)
                        .value();

                    $scope.selectedMessages = _getSelectedMessages($scope.mensagens);
                    if ($scope.selectedMessages == null || $scope.selectedMessages.length == 0) {
                        scroll_glue();
                    }
                }, true);

                $scope.$watch('selectedMessages', function (mensagens) {
                    MensageriaChatUsuario.trigger('mensagensSelecionadas', mensagens);
                });

                /**
                 * @method scrolled
                 */
                function scrolled() {
                    return $scope.glued;
                }

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

                    //$scope.scrolled = true;
                    angular.forEach($scope.mensagens, function (mensagem) {

                        if (mensagem.lida == null) {
                            mensagem.lida = [$scope.me.id];
                        } else {
                            mensagem.lida.push($scope.me.id);
                        }

                    });
                }

                /**
                 * @method isRead
                 * @param {*} mensagem 
                 */
                function isRead(mensagem) {

                    var messageRead = false;
                    angular.forEach(mensagem.lida, function (id) {

                        if (id == $scope.me.id) {
                            messageRead = true;
                        }
                    });

                    return messageRead;
                }

                /**
                 * @method _getSelectedMessages
                 * @param {*} mensagens 
                 */
                function _getSelectedMessages(mensagens) {
                    var selectedMessages = mensagens.filter(function (mensagem) {
                        if (mensagem.selected) return true;
                    });

                    return selectedMessages;
                }

                var tiposObjeto = {
                    incidente: 'incidente',
                    baseConhecimento: 'base de conhecimento',
                    planejamento: 'planejamento',
                    zonaObservacao: 'zona de observação',
                    rota: 'rota'
                };
                var tipos = {
                    'incidente': function (id) {
                        DetalhamentoService.pegarIncidente(id)
                            .then(function (incidente) {
                                incidente.geojson = JSON.parse(incidente.geojson);
                                CamadasService.reloadIncidentes(true);
                                MapaManager.voarParaObjeto(incidente);
                            }, function (err) {
                                $mdDialog.show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content($scope.res('LINK_COMPARTILHADO_NAO_ENCONTRADO'))
                                    .ok($scope.res('COMUM_OK')));
                            });

                    },
                    'baseConhecimento': function (id) {
                        BaseConhecimentoService.findById(id)
                            .then(function (bc) {
                                CamadasService.reloadBasesConhecimento(true);
                                DetalhamentoManager.voarParaObjeto(bc);
                            }, function (err) {
                                $mdDialog.show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content($scope.res('LINK_COMPARTILHADO_NAO_ENCONTRADO'))
                                    .ok($scope.res('COMUM_OK')));
                            });

                    },
                    'planejamento': function (id) {
                        PlanejamentoService.getPlanejamento(id)
                            .then(function (plan) {
                                CamadasService.reloadPlanejamentos(true);
                                DetalhamentoManager.voarParaObjeto(plan);
                            }, function (err) {
                                $mdDialog.show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content($scope.res('LINK_COMPARTILHADO_NAO_ENCONTRADO'))
                                    .ok($scope.res('COMUM_OK')));
                            });

                    },
                    'zonaObservacao': function (id) {
                        ZonaObservacaoService.pegarZona(id)
                            .then(function (zo) {
                                CamadasService.reloadZonasObservacao(true);
                                DetalhamentoManager.voarParaObjeto(zo);
                            }, function (err) {
                                $mdDialog.show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content($scope.res('LINK_COMPARTILHADO_NAO_ENCONTRADO'))
                                    .ok($scope.res('COMUM_OK')));
                            });
                    },
                    'rota': function (id) {

                    }
                };

                /**
                 * @method acaoLink
                 * @param {*} tipoObjeto 
                 * @param {*} id 
                 */
                function acaoLink(tipoObjeto, id) {
                    tipos[tipoObjeto](id);
                }

                /**
                 * @method tratarMensagem
                 * @param {*} mensagem 
                 */
                function tratarMensagem(mensagem) {
                    if (mensagem.mensagem && mensagem.mensagem.match(/\@@(.*)\@@/)) {
                        var labelAcessar = $scope.res('COMUM_ACESSAR');
                        var texto = mensagem.mensagem.match(/\@@(.*)\@@/)[1];
                        var partes = texto.split('|');
                        var tipoObjeto = partes[0];
                        var display = tiposObjeto[tipoObjeto];
                        var id = partes[1];
                        var linkTemplate = _.template('<a href="#" ng-click="acaoLink(\'${tipoObjeto}\', \'${id}\')"> ' + labelAcessar + ' ${display}</a>');
                        var link = linkTemplate({
                            tipoObjeto: tipoObjeto,
                            id: id,
                            display: display
                        });

                        mensagem.link = link;
                        mensagem.mensagem = mensagem.mensagem.replace('@@' + texto + '@@', '');

                        return mensagem;
                    }
                }
            }
        }
    }
}());