Source: directives/mensageria/mensageria.js

/**
 * @ngdoc directives
 * @name mensageria
 * @module s4c.directives.mensageria.mensageria
 * 
 * @description `SalaBriefingCtrl` Controller da funcão de Sala de Briefing
 *              
 *
 */

(function () {
    'use strict';
    angular.module('s4c.components.collaboration')
        .directive('s4cCompile', ['$compile', function ($compile) {
            return function (scope, element, attrs) {
                scope.$watch(
                    function (scope) {
                        return scope.$eval(attrs.link);
                    },
                    function (value) {
                        element.html(value);
                        $compile(element.contents())(scope);
                    }
                )
            };
        }]);
}());

(function () {
    'use strict';

    mensageriaCtrl.$inject = [
        '$scope',
        '$timeout',
        'MensageriaService',
        '$mdDialog',
        'MainState',
        'MainManager',
        'MensageriaManager',
        'localize',
        'MensageriaChatUsuario',
        'Base',
        'DetalhamentoService'
    ];

    function mensageriaCtrl(
        $scope,
        $timeout,
        MensageriaService,
        $mdDialog,
        MainState,
        MainManager,
        MensageriaManager,
        localize,
        MensageriaChatUsuario,
        Base,
        DetalhamentoService) {

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

        var tiposObjeto = {
            incidente: 'incidente',
            baseConhecimento: 'base de conhecimento',
            planejamento: 'planejamento',
            zonaObservacao: 'zona de observação',
            rota: 'rota'
        };

        $scope.state = MensageriaService.state;

        $scope.filters = {
            texto: '',
            status: -1,
            listStatus: [{
                value: -1,
                label: 'Todos'
            }, {
                value: 0,
                label: 'Offline'
            }, {
                value: 1,
                label: 'Online'
            }],
            departamento: null,
            listDepartamentos: [],
            perfil: null,
            listPerfil: []
        };

        /**
         * @method fechar
         */
        function fechar() {
            MensageriaManager.fechar();
            $scope.chat = {
                usuario: null,
                ativo: false,
                canal: {},
                mensagens: []
            };
        }

        /**
         * @method enviarMensagem
         * @param {*} usuario 
         * @param {*} mensagem 
         */
        function enviarMensagem(usuario, mensagem) {
            // Verificação de mensagem vazia:
            mensagem = mensagem.replace(/^\s+|\s+$/g, '');
            if (mensagem.length > 0) {
                MensageriaService.enviarMensagem(usuario.id, mensagem)
                    .then(function (res) {
                        //refreshMensagens();
                    });
                $scope.msg.texto = '';
            }
        }


        /**
         * @method enviarMensagemGrupo
         * @param {*} grupo 
         * @param {*} mensagem 
         */
        function enviarMensagemGrupo(grupo, mensagem) {
            // Verificação de mensagem vazia:
            mensagem = mensagem.replace(/^\s+|\s+$/g, '');
            if (mensagem.length > 0) {
                MensageriaService.enviarMensagemGrupo(grupo.id, mensagem)
                    .then(function (res) {
                        //refreshMensagens();
                    });
                $scope.msg.texto = '';
            }
        }

        /**
         * @method enviarMensagemGrupoUsuario
         * @param {*} grupo 
         * @param {*} mensagem 
         */
        function enviarMensagemGrupoUsuario(grupo, mensagem) {
            // Verificação de mensagem vazia:
            mensagem = mensagem.replace(/^\s+|\s+$/g, '');
            if (mensagem.length > 0) {
                MensageriaService.enviarMensagemGrupoUsuario(grupo.id, mensagem)
                    .then(function (res) {
                        //refreshMensagens();
                    });
                $scope.msg.texto = '';
            }
        }

        /**
         * @method voltarSelecao
         */
        function voltarSelecao() {
            $scope.chat = {
                usuario: null,
                ativo: false,
                canal: {},
                mensagens: []
            };

            abrir();
        }

        /**
         * @method abrirChat
         * @param {*} canal 
         * @param {*} isGrupo 
         * @param {*} isGrupoUsuario 
         */
        function abrirChat(canal, isGrupo, isGrupoUsuario) {

            $scope.isAddGrupo = false;
            $scope.isAddUsuarioGrupo = false;

            if ($scope.compartilhando) {
                $mdDialog.show({
                    controller: function ($scope, detalhes) {

                        $scope.informacoes = 'Nome ' + tiposObjeto[detalhes.tipoObjeto] + ': ' + detalhes.nome + '\n';
                        detalhes.status ? $scope.informacoes += 'Status: ' + detalhes.status : '';

                        $scope.ok = function () {
                            if ($scope.textoMensagem) {
                                $mdDialog.hide($scope.textoMensagem + '\n' + $scope.informacoes);
                            }
                            else {
                                $mdDialog.hide($scope.informacoes);
                            }

                        };

                        $scope.cancelar = function () {
                            $mdDialog.cancel();
                        }
                    },
                    templateUrl: "app/directives/mensageria/compartilhamentoDialog.html",
                    locals: {
                        detalhes: $scope.detalhes
                    }
                })
                    .then(
                        function (textoMensagem) {
                            var mensagem = textoMensagem + '\n';
                            mensagem += '@@' + $scope.detalhes.tipoObjeto + '|' + $scope.detalhes.id + '@@';

                            if (isGrupo) {
                                enviarMensagemGrupo(canal, mensagem);
                            } else if (isGrupoUsuario) {
                                enviarMensagemGrupoUsuario(canal, mensagem);
                            } else {
                                enviarMensagem(canal, mensagem);
                            }
                        },
                        function (data) {

                        });

                $scope.compartilhando = false;
            }

            if (isGrupo) {
                $scope.chat.canal = canal;
                //updateHistoricoGrupo(canal.id);
            } else if (isGrupoUsuario) {
                $scope.chat.canal = canal;
                //updateHistoricoGrupoUsuario(canal.id);
                if ($scope.chat.canal.participantes === null || $scope.chat.canal.participantes.length === 0) {
                    $scope.usuariosToAddGrupo = _.map(angular.copy($scope.usuarios), function (usuario) {
                        usuario.isAdded = false;
                        return usuario;
                    });
                } else {
                    $scope.usuariosToAddGrupo = _.chain(angular.copy($scope.usuarios))
                        .map(function (usuario) {
                            if (_.includes(canal.participantes, usuario.id)) {
                                usuario.isAdded = true;
                            } else {
                                usuario.isAdded = false;
                            }
                            return usuario;
                        })
                        .value();
                }
            } else {
                $scope.chat.canal = canal;
                MensageriaService.getHistorico(canal.id)
                    .then(function (mensagens) {
                        $scope.chat.ativo = true;
                        $scope.chat.isGrupo = false;
                        $scope.chat.mensagens = _.each(mensagens, function (mensagem) {
                            detectAndCompileLinkInMessage(mensagem)
                        });

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

        /**
         * @method abrir
         * @param {*} compartilhamento 
         * @param {*} data 
         * @param {*} tipo 
         */
        function abrir(compartilhamento, data, tipo) {
            $scope.chat = {
                usuario: null,
                ativo: false,
                canal: {},
                mensagens: []
            };

            $scope.state.chatUsuarioAtivo = false;
            $scope.state.chatGrupoAtivo = false;

            $scope.compartilhando = compartilhamento;
            $scope.compartilhamentoDetalhes = data;
            $scope.tipo = tipo;

            if ($scope.compartilhamentoDetalhes != null && $scope.compartilhamentoDetalhes.GruposUsuarios != null) {
                var grupos = [];
                _.each($scope.compartilhamentoDetalhes.GruposUsuarios, function (gp) {
                    grupos.push(gp.id);
                });
                if (grupos.length > 0) {
                    Base.obter('grupo_usuarios/usuarios', { ids: grupos }).then(function (retorno) {
                        if (retorno != null) {
                            $scope.compartilhamentoDetalhes.GruposUsuarios.Usuarios = retorno;

                            MensageriaChatUsuario.trigger('obterUsuarios');
                        }
                    });
                }
            } else if ($scope.compartilhamentoDetalhes != null && $scope.compartilhamentoDetalhes.GruposUsuariosParticipantes != null) {
                var grupos = [];
                _.each($scope.compartilhamentoDetalhes.GruposUsuariosParticipantes, function (gp) {
                    grupos.push(gp.id);
                });
                if (grupos.length > 0) {
                    Base.obter('grupo_usuarios/usuarios', { ids: grupos }).then(function (retorno) {
                        if (retorno != null) {
                            $scope.compartilhamentoDetalhes.GruposUsuariosParticipantes.Usuarios = retorno;

                            MensageriaChatUsuario.trigger('obterUsuarios');
                        }
                    });
                }
            } else {
                MensageriaChatUsuario.trigger('obterInformacoes');
                MensageriaChatUsuario.trigger('obterUsuarios');
            }
            if ($scope.compartilhamentoDetalhes != null) {
                MensageriaChatUsuario.trigger('ocultarContatos');
                DetalhamentoService.trigger('openOptionShare');
            }
        }

        /*-----------------frame add grupo ---------------*/
        $scope.isAddGrupo = false;
        $scope.isAddUsuarioGrupo = false;
        $scope.grupoMensageria = {
            nome: "",
            participantes: []
        };
        $scope.usuariosToAddGrupo = [];

        $scope.openAddUsuarioGrupo = function () {
            $scope.isAddUsuarioGrupo = !$scope.isAddUsuarioGrupo;
        };

        $scope.salvarGruposUsuarios = function () {
            MensageriaService.adicionarGruposUsuarios($scope.grupoMensageria)
                .then(function (result) {
                    $scope.grupoMensageria = "";
                    result.isShow = true;
                    $scope.gruposUsuarios.push(result);
                    $scope.openAddGrupo();
                });
        };

        /**
         * @method adicionarParticipanteGrupo
         * @param {*} participante 
         */
        function adicionarParticipanteGrupo(participante) {
            MensageriaService.adicionarParticipanteGrupo($scope.chat.canal.id, participante.id)
                .then(function (result) {
                    $scope.chat.canal.participantes = result;
                    participante.isAdded = true;
                });
        }

        /**
         * @method removerParticipanteGrupo
         * @param {*} participante 
         */
        function removerParticipanteGrupo(participante) {
            MensageriaService.deleteParticipanteGrupo($scope.chat.canal.id, participante.id, participante.nome)
                .then(function (result) {
                    $scope.chat.canal.participantes = result;
                    participante.isAdded = false;
                });
        }

        /**
         * @method detectAndCompileLinkInMessage
         * @param {*} mensagem 
         */
        function detectAndCompileLinkInMessage(mensagem) {
            var stringToSplit = mensagem.mensagem.match(/\@@(.*)\@@/)[1];
            if (stringToSplit) {
                var args = "'" + stringToSplit.split('|')[0] + "'," + stringToSplit.split('|')[1];
                var link = '<a href="#" ng-click="voarEAbrirObjeto(' + args + ')">Acessar ' + tiposObjeto[stringToSplit.split('|')[0]] + '</a>';
                mensagem.mensagem = mensagem.mensagem.replace('@@' + stringToSplit + '@@', '');
                mensagem.link = link;
            }
        }


        angular.extend($scope, {
            fechar: fechar,
            abrirChat: abrirChat,
            voltarSelecao: voltarSelecao,
            enviarMensagem: enviarMensagem,
            enviarMensagemGrupo: enviarMensagemGrupo,
            enviarMensagemGrupoUsuario: enviarMensagemGrupoUsuario,
            adicionarParticipanteGrupo: adicionarParticipanteGrupo,
            removerParticipanteGrupo: removerParticipanteGrupo,
            usuarioAtivo: MainManager.usuarioAtivo,
            msg: {
                texto: ''
            },
            usuarios: [],
            ultimasMensagens: [],
            chat: {
                usuario: null,
                ativo: false,
                mensagens: []
            },
            $api: {
                abrir: abrir,
                abrirChat: abrirChat
            }
        });

        MainState.registerDirective('mensageria', $scope.$api);
        $scope.$on('$destroy', function () {
            MainState.unregisterDirective('mensageria');
        });
    }

    /**
     * @ngdoc directive
     * @name s4c-mensageria
     * @module s4c.components.collaboration.s4cMensageria
     *
     * @description
     * `s4cMensageria` é uma mensageria interna do sistema, entre dois
     * usuários cadastrados. Permite receber notificações fora do sistema quando
     * uma mensagem é recebida.
     *
     * @example
     *    <s4c-mensageria></s4c-mensageria>
     */
    function s4cMensageria() {
        return {
            restrict: 'EA',
            templateUrl: 'app/directives/mensageria/mensageria.html',
            replace: true,
            scope: {},
            controller: mensageriaCtrl
        };
    }

    angular.module('s4c.components.collaboration')
        .directive('s4cMensageria', s4cMensageria)
        .filter('mensagem', function () {
            var regex = /.*\$\$<(.*)>\$\$/g;

            return function (message) {
                var results = regex.exec(message);
                if (results === null) {
                    return message;
                } else {
                    return window.location.protocol + '//' + window.location.hostname + '/#/' + results[1];
                }
            };
        });
}());