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

/**
 * @ngdoc directive
 * @name BuscaUsuariosTelegram
 * @module s4c.directives.avisoOperacional.BuscaUsuariosTelegram
 *
 * @description
 * `buscaUsuariosTelegram` Responsável pelas funções de busca de usuário do telegram que são usados no aviso operacional 
 *
 */
(function () {
    'use strict';

    function buscaUsuariosTelegram($scope, $q, TelegramService, Departamento, Perfil) {

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

        $scope.list = [];

 	  /**
        * Fecha a diretiva
        *
        * @method desativar
        * 
        */
        $scope.desativar = function () {
            $scope.ativo = false;
        };

       /**
        * Listener para verificar se há alteração no atributo ativo
        *
        * @method watch
		*        
        * @param newVal {Boolean} Novo valor
        * @param oldVal {Boolean} 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);
                });
            }
        });

       /**
        * Mantem numa lista temporária os usuários selecionados
        *
        * @method saveMembers
		*        
        */ 
        $scope.saveMembers = function () {
            $scope.usuariosSelecionados = _.filter($scope.list, 'selected');
            $scope.desativar();
        };

       /**
        * Filtra as listas
        *
        * @method filterLists
		*        
        * @param lists {Array} Listas
        * @param listBase {Array} Lista Base
        */ 
        function filterLists(lists, listBase) {
            _.forEach(lists, function (list) {

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

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

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

            return lists;
        }

        $scope.tipos = [{
            label: $scope.res('COMUM_TODOS'),
            value: ''
        }, {
            label: $scope.res('COMUM_GRUPO'),
            value: 'isGroup'
        }, {
            label: $scope.res('USUARIO_USUARIO'),
            value: 'isUser'
        }];

       /**
        * Obtém a lista de Agências
        *
        * @method getAgencias
		*        
        * @param departamentos {Array} Lista de departamentos
        * 
        */ 
        Departamento.getAgencias().then(function (departamentos) {
            $scope.departamentos = _.map(departamentos, function (departamento) {
                return {
                    label: departamento.nome,
                    value: departamento.id
                }
            });

            $scope.departamentos.unshift({
                label: $scope.res('COMUM_TODOS'),
                value: 0
            })
        })

       /**
        * Obtém a lista de perfis
        *
        * @method getPerfis
		*        
        * @param perfis {Array} Lista de perfis
        * 
        */ 
        Perfil.getPerfis().then(function (perfis) {

            perfis = perfis.filter(function (p) {
                return p.DepartamentoId;
            });

            $scope.perfis = _.map(perfis, function (perfil) {
                return {
                    label: perfil.nome,
                    value: perfil.id
                }
            });

            $scope.perfis.unshift({
                label: $scope.res('COMUM_TODOS'),
                value: 0
            })
        })


        $scope.filters = {
            tipo: '',
            departamento: 0,
            perfil: 0
        }

       /**
        * Lista de filtros
        *
        * @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'];

    angular.module('s4c.components.avisoOperacional')
        .directive('s4cAoBuscaUsuariosTelegram', function () {
            return {
                restrict: 'EA',
                templateUrl: 'app/directives/aviso-operacional/busca-usuarios-telegram/busca-usuarios-telegram.html',
                replace: true,
                scope: {
                    'ativo': '=',
                    'usuariosSelecionados': '='
                },
                controller: buscaUsuariosTelegram
            };
        });

}());