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