Source: directives/busca-usuarios-telegram/busca-usuarios-telegram.js

/**
 * @ngdoc directives
 * @name buscaUsuariosTelegram
 * @module s4c.directives.buscausuariostelegram.buscaUsuariosTelegram
 *
 * @description
 * `buscaUsuariosTelegram` Caixa de busca do sistema, gerencia os resultados da barra
 * de busca.
 *
 *@example
 *   <s4c-busca-usuarios-telegram>
 *   </s4c-busca-usuarios-telegram>
 */
(function () {
    'use strict';

    function buscaUsuariosTelegram($scope, $q, TelegramService, Departamento, Perfil, BuscaUsuariosTelegramManager) {
        $scope.res = $scope.$root.res;
        $scope.list = [];

        $scope.filters = {};
        $scope.filters.tipo = '';
        $scope.filters.departamento = 0;
        $scope.filters.perfil = 0;
        $scope.filters.nome = '';

       /**
        * Cancela o compartilhamento de mensagem com os usuários do Telegram  
        *
        * @method desativar
		*        
        * 
		*              
        */ 
        $scope.desativar = function () {
            $scope.ativo = false;
        };

       /**
        * Listener para o atributo ativo  
        *
        * @method watch
		*        
        * @param newVal {String} Novo Valor
		* @param newVal {String} Valor antigo              
        */ 
        $scope.$watch('ativo', function (newVal, oldVal) {

            if (oldVal === false && newVal === true) {
                var lists = $q.all([
                    TelegramService.getGroups(),
                    TelegramService.getUsers()
                ]);

                lists.then(function (list) {
                    var groups = filterLists(list[0], $scope.usuariosSelecionados);
                    var users = filterLists(list[1], $scope.usuariosSelecionados);

                    groups = _.filter(groups, function (o) {
                        return o.Usuarios.length > 0;
                    });

                    $scope.list = users.concat(groups);
                });
            }
        });


      /**
        * Abre a janela pra compartilhamento de mensagem com os usuários do Telegram  
        *
        * @method sendMessageOptional
		*        
        * 
        */ 
        $scope.sendMessageOptional = function () {
            $scope.isCompartilharActive = true;
        };

      /**
        * Fecha o componente  
        *
        * @method fechar
		*        
        * 
        */ 
        $scope.fechar = function () {
            $scope.isCompartilharActive = false;
            BuscaUsuariosTelegramManager['messageOptional'] = '';
        }

      /**
        * Salva os usuários do telegram na lista de usuários  
        *
        * @method saveMembers
		*        
        * 
        */ 
        $scope.saveMembers = function () {
            BuscaUsuariosTelegramManager['messageOptional'] = $scope.compartilharTexto || '';
            $scope.usuariosSelecionados = _.filter($scope.list, { selected: true, isUser: true });
            $scope.gruposSelecionados = _.filter($scope.list, { selected: true, isGroup: true });
            $scope.selecaoConcluida = true;
            $scope.isCompartilharActive = false;

            $scope.desativar();
        };

       /**
        * Faz um filtro na lista passada como parâmetro  
        *
        * @method filterLists
		*        
        * @param lists {Array} Lista
        * @param listBase {Array} Lista
        */ 
        function filterLists(lists, listBase) {
            _.forEach(lists, function (list) {

                list.isGroup = ((list.hasOwnProperty('Usuarios')) ? true : false);
                list.isUser = ((list.hasOwnProperty('GrupoMensageriaExternas')) ? true : false);

                var foundList = _.find(listBase, function (o) {
                    return o.id == list.id;
                });

                list.selected = ((foundList !== undefined) ? true : false);
            });

            if ($scope.filtrarUsuarios) {
                return _.filter(lists, function (usuario) {
                    return usuario.isGroup || $scope.filtrarUsuarios({ usuario: usuario });
                });
            }

            return lists;
        }

        $scope.tipos = [{
            label: 'Tipo',
            value: ''
        }, {
            label: 'Grupo',
            value: 'isGroup'
        }, {
            label: 'Usuário',
            value: 'isUser'
        }];

        Departamento.getAgencias().then(function (departamentos) {
            $scope.departamentos = _.map(departamentos, function (departamento) {
                return {
                    label: departamento.nome,
                    value: departamento.id
                }
            });
            $scope.departamentos.unshift({
                label: 'Deptos',
                value: 0
            })
        })

        Perfil.getPerfis().then(function (perfis) {
            $scope.perfis = _.map(perfis, function (perfil) {

                return {
                    label: perfil.nome,
                    value: perfil.id
                }
            });

            $scope.perfis.unshift({
                label: 'Perfis',
                value: 0
            });
        });


       /**
        * Executa o filtro nas lista  
        *
        * @method filterList
		*        
		*               
        */ 
        $scope.filterList = function () {

            return _.filter($scope.list, function (item) {
                return (!$scope.filters.tipo || item[$scope.filters.tipo])
                    && (!$scope.filters.departamento || item.DepartamentoId == $scope.filters.departamento)
                    && (!$scope.filters.perfil || _.chain(item.Perfils)
                        .map('id')
                        .includes($scope.filters.perfil)
                        .value())
            });
        }

    }

    buscaUsuariosTelegram.$inject = ['$scope', '$q', 'TelegramService', 'Departamento', 'Perfil', 'BuscaUsuariosTelegramManager'];

    angular.module('s4c.components.buscaUsuariosTelegram', [])
        .directive('s4cBuscaUsuariosTelegram', function () {
            return {
                restrict: 'EA',
                templateUrl: 'app/directives/busca-usuarios-telegram/busca-usuarios-telegram.html',
                replace: true,
                scope: {
                    'ativo': '=',
                    'usuariosSelecionados': '=',
                    'gruposSelecionados': '=',
                    'selecaoConcluida': '=',
                    'filtrarUsuarios': '&'
                },
                controller: buscaUsuariosTelegram
            };
        });

}());