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