PageSourceSearch

https://www.ufsm.br/app/mu-plugins/ufsm-sie/widgets/ramais/assets/ramais.js?ver=1787850422

js ufsm.br collected 2026-09-24 08:40:25 UTC 5,837 bytes, 153 lines download raw bytes

1;ufsm.ramais = (function(){
2    let ESTADO = {
3        itensCarregados: [],
4        itensFiltrados: [],
5        paginaAtual: 1,
6        itensPorPagina: (window.ufsmRamaisData && ufsmRamaisData.itensPagina) || 15
7    };
8
9    let ELEMENTOS = {
10        CAMPUS: document.querySelector('#ramais-filtro-campus'),
11        PREDIO: document.querySelector('#ramais-filtro-predio'),
12        SETOR: document.querySelector('#ramais-filtro-setor'),
13        SALA: document.querySelector('#ramais-filtro-sala'),
14        BUSCA: document.querySelector('#ramais-busca-geral'),
15        TBODY: document.querySelector('#ramais-resultados'),
16        NAV: document.querySelector('#ramais-nav')
17    };
18
19    let NAO_INFORMADO = '-';
20    let TIMEOUT_BUSCA_LIVRE = null;
21
22    function normalizar(texto){
23        return (texto || '').toString().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
24    }
25
26    function celulaTelefone(telefone){
27        if(!telefone) return NAO_INFORMADO;
28
29        let numeroLimpo = telefone.toString().replace(/[^\d+]/g, '');
30
31        return {tag: 'a', properties: {href: `tel:${numeroLimpo}`}, content: telefone};
32    }
33
34    function buscaServidor(e = null, pagina = 1){
35        if(e) e.preventDefault();
36
37        ufsm.utils.overlay({targetSelector: '#ramais-resultados-container'});
38
39        let corpo = new URLSearchParams({
40            action: 'ufsm_ramais_busca',
41            nonce: ufsmRamaisData.nonce,
42            widget_number: ufsmRamaisData.widgetNumber || '',
43            campus: ELEMENTOS.CAMPUS ? ELEMENTOS.CAMPUS.value : '',
44            predio: ELEMENTOS.PREDIO ? ELEMENTOS.PREDIO.value : '',
45            setor: ELEMENTOS.SETOR ? ELEMENTOS.SETOR.value : '',
46            sala: ELEMENTOS.SALA ? ELEMENTOS.SALA.value : ''
47        });
48
49        fetch(ufsmRamaisData.ajax_url, {method: 'POST', body: corpo})
50            .then(resposta => resposta.json())
51            .then(dados => {
52                if(dados.success){
53                    ESTADO.itensCarregados = dados.data.itens;
54                    aplicaBuscaLivre(pagina);
55                }else exibeErro();
56            })
57            .catch(exibeErro)
58            .finally(() => ufsm.utils.overlay({targetSelector: '#ramais-resultados-container'}));
59    }
60
61    function aplicaBuscaLivre(pagina = 1){
62        let termo = normalizar(ELEMENTOS.BUSCA ? ELEMENTOS.BUSCA.value : '');
63
64        ESTADO.itensFiltrados = !termo
65            ? ESTADO.itensCarregados
66            : ESTADO.itensCarregados.filter(item =>
67                normalizar(item.ramal).includes(termo)
68                || normalizar(item.campus).includes(termo)
69                || normalizar(item.predio).includes(termo)
70                || normalizar(item.setor).includes(termo)
71                || normalizar(item.sala).includes(termo)
72            );
73
74        renderiza(pagina);
75    }
76
77    function filtraLocal(){
78        clearTimeout(TIMEOUT_BUSCA_LIVRE);
79        TIMEOUT_BUSCA_LIVRE = setTimeout(() => aplicaBuscaLivre(1), 200);
80    }
81
82    function renderiza(pagina){
83        ESTADO.paginaAtual = pagina;
84
85        let total = ESTADO.itensFiltrados.length;
86
87        ufsm.utils.dom.removeAllChilds({element: ELEMENTOS.TBODY});
88
89        if(!total){
90            ufsm.utils.dom.appendChild({element: ELEMENTOS.NAV, content: 'Nenhum ramal encontrado para os filtros selecionados.', clearBeforeAppend: true});
91            ELEMENTOS.TBODY.appendChild(ufsm.utils.dom.createElement({
92                tag: 'tr',
93                content: {tag: 'td', properties: {colspan: 6}, classes: 'text-center', content: 'Nenhum ramal encontrado para os filtros selecionados.'}
94            }));
95            return;
96        }
97
98        let inicio = (pagina - 1) * ESTADO.itensPorPagina;
99        let itensPagina = ESTADO.itensFiltrados.slice(inicio, inicio + ESTADO.itensPorPagina);
100
101        itensPagina.forEach(item => {
102            ELEMENTOS.TBODY.appendChild(ufsm.utils.bs.tr({
103                fields: [
104                    item.ramal || NAO_INFORMADO,
105                    celulaTelefone(item.telefone_externo),
106                    item.setor || NAO_INFORMADO,
107                    item.sala || NAO_INFORMADO,
108                    item.predio || NAO_INFORMADO,
109                    item.campus || NAO_INFORMADO
110                ]
111            }));
112        });
113
114        let paginacao = ufsm.utils.bs.paginationRow({
115            target_page: pagina,
116            max_results: ESTADO.itensPorPagina,
117            result_count: total,
118            action_function_select: 'ufsm.ramais.irParaPagina',
119            action_function_pagination: (link, indice) => link.setAttribute('onclick', `ufsm.ramais.irParaPagina(null, ${indice})`),
120            text_function: (inicial, final, totalItens) => `Exibindo do ${inicial} ao ${final} de ${totalItens} ramais`
121        });
122
123        ufsm.utils.dom.appendChild({element: ELEMENTOS.NAV, content: paginacao, clearBeforeAppend: true});
124    }
125
126    function irParaPagina(e = null, pagina = null){
127        pagina = pagina || (e && e.target ? parseInt(e.target.value, 10) : 1);
128        renderiza(pagina);
129    }
130
131    function exibeErro(){
132        ufsm.utils.dom.removeAllChilds({element: ELEMENTOS.TBODY});
133        ufsm.utils.dom.appendChild({element: ELEMENTOS.NAV, content: 'Erro ao buscar os ramais.', clearBeforeAppend: true});
134        ELEMENTOS.TBODY.appendChild(ufsm.utils.dom.createElement({
135            tag: 'tr',
136            content: {tag: 'td', properties: {colspan: 6}, content: ufsm.utils.bs.alertError()}
137        }));
138    }
139
140    function inicializa(){
141        if(ELEMENTOS.BUSCA) ELEMENTOS.BUSCA.addEventListener('input', filtraLocal);
142
143        buscaServidor(null, 1);
144    }
145
146    return {
147        busca: buscaServidor,
148        filtrar: filtraLocal,
149        irParaPagina: irParaPagina,
150        inicializa: inicializa
151    };
152})();
153ufsm.utils.dom.ready({callback: ufsm.ramais.inicializa});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.