Skip to content

Instantly share code, notes, and snippets.

@leonardAlbert
Last active June 3, 2025 16:59
Show Gist options
  • Save leonardAlbert/f81f76d78df1d65f2c526d9f0ea24b80 to your computer and use it in GitHub Desktop.
Save leonardAlbert/f81f76d78df1d65f2c526d9f0ea24b80 to your computer and use it in GitHub Desktop.
Script for AMS CAP Workflow.
// ==UserScript==
// @name Custom CAP AMS Script
// @namespace custom-cap-ams-script
// @version 0.1
// @description
// @author Leonard A M Pedro
// @grant none
//
// @note Instructions:
// @note * Paste the script into the browser console to apply the changes.
// @note ** For best use, install the chrome extension for the timesheet domain.
// @chrome extension https://chromewebstore.google.com/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld
(function () {
'use strict';
const appV = {
// Run tasks.
run: function () {
appV.filterByColumn();
appV.pageDetailsStyle();
appV.findTicketByNumber();
},
// ============================================================
// === FUNCTIONS
// ============================================================
//
/**
* Tela: Pesquisa
*
* Organiza as colunas de resultados de acordo com os filtros aplicados.
*/
filterByColumn: function () {
if (!/Pages\/SearchRequests.aspx/.test(window.location.href)) return;
setInterval(function () {
let filters = $('#search-requests-filter-pills .search-requests-filter-pill');
let headerResults = $('#search-requests_table thead tr th');
let results = $('#search-requests_table tbody tr');
let noResults = $('#search-requests_table tbody tr.odd td.dataTables_empty');
if (noResults.length) return;
let formatFilters = [];
filters.each(function () {
let filter = $(this).text().split(':');
let key = filter[0].trim();
let values = filter[1].trim().slice(0, -1).split('|').map(item => item.trim());
formatFilters[key] = values;
});
headerResults.each(function (index) {
let headerText = $(this).text().trim();
for (let key in formatFilters) {
if (headerText !== key) continue;
results.each(function () {
let rowValues = $(this).find('td').eq(index).find('img').map(function () {
return $(this).attr('onclick');
}).get();
let allValuesPresent = formatFilters[key].every(function (value) {
return rowValues.some(s => s.includes(value))
});
if (!allValuesPresent) $(this).hide();
});
}
});
}, 500);
},
/**
* Tela: Detalhes da Solicitação
*
* Organiza o layout da pagina com base no Freshdesk.
*/
pageDetailsStyle: function () {
if (!/Pages\/RequestDetails.aspx/.test(window.location.href)) return;
setInterval(function () {
if ($('#custom-body-a').length && $('#custom-body-b').length)
return;
let mainContent = $('#request-body-container').parent();
let bodyContent = mainContent.find('#request-body-container');
let msgContent = mainContent.find('#request-message-board-container');
// bodyContent.children().hide();
let blockComentarios = bodyContent.find('.request-comments');
let blockSolicitante = bodyContent.find('#request-attributes-container .form-row').first().children().first();
let blockCliente = bodyContent.find('#request-attributes-container .card .form-row [internalname="Cliente"]').parent();
let blockQualOProjeto = bodyContent.find('#request-attributes-container .card .form-row [internalname="QualOProjeto"]').parent();
let blockTipoDoAtendimento = bodyContent.find('#request-attributes-container .card .form-row [internalname="TipoDoAtendimento"]').parent();
let blockUrgencia = bodyContent.find('#request-attributes-container .card .form-row [internalname="Urgencia"]').parent();
let blockImpacto = bodyContent.find('#request-attributes-container .card .form-row [internalname="Impacto"]').parent();
let blockTitulo = bodyContent.find('#request-attributes-container .card .form-row [internalname="Titulo"]').parent();
let blockDescricao = bodyContent.find('#request-attributes-container .card .form-row [internalname="Descricao"]').parent();
let blockUsuariosAfetados = bodyContent.find('#request-attributes-container .card .form-row [internalname="UsuariosAfetados"]').parent();
let blockFrequencia = bodyContent.find('#request-attributes-container .card .form-row [internalname="Frequencia"]').parent();
let blockEvidencias = bodyContent.find('#request-attributes-container .card .form-row [internalname="Evidencias"]').closest('.cap-form-control');
let blockCategoria = bodyContent.find('#request-attributes-container .card .form-row [internalname="Categoria"]').parent();
let blockNecessarioMaisInformacoesParaOAtendimento = bodyContent.find('#request-attributes-container .card .form-row [internalname="NecessarioMaisInformacoesParaOAtendimento"]').parent();
let blockSolicitacaoDoSuporte = bodyContent.find('#request-attributes-container .card .form-row [internalname="SolicitacaoDoSuporte"]').parent();
let blockNecessarioHomologacaoDoCliente = bodyContent.find('#request-attributes-container .card .form-row [internalname="NecessarioHomologacaoDoCliente"]').parent();
let blockEvidenciaSuporte = bodyContent.find('#request-attributes-container .card .form-row [internalname="EvidenciaSuporte"]').closest('.cap-form-control');
let blockHorasEstimadas = bodyContent.find('#request-attributes-container .card .form-row [internalname="HorasEstimadas"]').parent();
let blockAcaoDoSuporte = bodyContent.find('#request-attributes-container .card .form-row [internalname="AcaoDoSuporte"]').closest('.cap-form-control');
let blockEntregaAprovada = bodyContent.find('#request-attributes-container .card .form-row [internalname="EntregaAprovada"]').parent();
let blockHomologacaoReprovada = bodyContent.find('#request-attributes-container .card .form-row [internalname="HomologacaoReprovada"]').parent();
let blockChamadoSolucionado = bodyContent.find('#request-attributes-container .card .form-row [internalname="ChamadoSolucionado"]').parent();
let blockChamadoNaoSolucionado = bodyContent.find('#request-attributes-container .card .form-row [internalname="ChamadoNaoSolucionado"]').parent();
let blockComoVoceAvaliaSuaSatisfacaoComEsteAtendimento = bodyContent.find('#request-attributes-container .card .form-row [internalname="ComoVoceAvaliaSuaSatisfacaoComEsteAtendimento"]').parent();
let blockOQuePodemosMelhorar = bodyContent.find('#request-attributes-container .card .form-row [internalname="OQuePodemosMelhorar"]').parent();
let blockGostariaDeDeixarUmElogio = bodyContent.find('#request-attributes-container .card .form-row [internalname="GostariaDeDeixarUmElogio"]').parent();
let blockTotalDeHorasSemAdicional = bodyContent.find('#request-attributes-container .card .form-row [internalname="TotalDeHorasSemAdicional"]').parent();
let blockTotalDeHorasComAdicional = bodyContent.find('#request-attributes-container .card .form-row [internalname="TotalDeHorasComAdicional"]').parent();
mainContent.prepend(`
<div class="col-12">
<div class="row">
<div id="custom-body-a" class="col-8">
</div>
<div id="custom-body-b" class="col-4">
<h4 class="mr-3">Cliente</h4>
<hr class="mr-3">
<div class="d-client"></div>
<h4 class="mr-3 pt-4">Dados do Chamado</h4>
<hr class="mr-3">
<div class="d-infos"></div>
<h4 class="mr-3 pt-4">Detalhes</h4>
<hr class="mr-3">
<div class="d-details"></div>
</div>
</div>
<div class="row">
<div id="custom-body-c" class="col-12 mt-3 mb-5">
<h4 class="">Apontamentos</h4>
<hr class="">
<div class="custom-appointments row">
<div class="col-4 h-estimate"></div>
<div class="col-4 h-consumed"></div>
<div class="col-4 h-consumed-no-additional"></div>
</div>
</div>
</div>
</div>
`);
// Custom
$('<hr class="mb-4">').insertAfter($('.cap-navigation'));
let ticketTitle = blockTitulo.find('input').val();
$(`<h4 class="text-truncate"> > &nbsp; ${ticketTitle}</h4>`).insertAfter($('.cap-navigation'));
// Block A
if (blockTitulo.length) blockTitulo.appendTo('#custom-body-a');
if (blockDescricao.length) {
blockDescricao.find('textarea').css('height', '300px');
blockDescricao.appendTo('#custom-body-a');
}
if (blockComentarios.length) blockComentarios.appendTo('#custom-body-a');
if (msgContent.children().length) msgContent.children().appendTo('#custom-body-a');
// Block B
if (blockCliente.length) blockCliente.removeClass().addClass('mx-3 mb-3 cap-form-control').appendTo('#custom-body-b .d-client');
if (blockSolicitante) $(blockSolicitante).removeClass().addClass('mx-3 mb-3 cap-form-control').appendTo('#custom-body-b .d-client');
if (blockQualOProjeto.length) blockQualOProjeto.appendTo('#custom-body-b .d-client');
if (blockCategoria.length) blockCategoria.appendTo('#custom-body-b .d-infos');
if (blockTipoDoAtendimento.length) blockTipoDoAtendimento.appendTo('#custom-body-b .d-infos');
if (blockUrgencia.length) blockUrgencia.appendTo('#custom-body-b .d-infos');
if (blockImpacto.length) blockImpacto.appendTo('#custom-body-b .d-infos');
if (blockUsuariosAfetados.length) blockUsuariosAfetados.removeClass().addClass('mx-3 mb-3 cap-form-control').appendTo('#custom-body-b .d-infos');
if (blockFrequencia.length) blockFrequencia.removeClass().addClass('mx-3 mb-3 cap-form-control').appendTo('#custom-body-b .d-infos');
if (blockEvidencias.length) blockEvidencias.appendTo('#custom-body-b .d-infos');
if (blockNecessarioMaisInformacoesParaOAtendimento.length) blockNecessarioMaisInformacoesParaOAtendimento.appendTo('#custom-body-b .d-details');
if (blockNecessarioHomologacaoDoCliente.length) blockNecessarioHomologacaoDoCliente.appendTo('#custom-body-b .d-details');
if (blockEvidenciaSuporte.length) blockEvidenciaSuporte.appendTo('#custom-body-b .d-details');
// Block C
if (blockHorasEstimadas.length) blockHorasEstimadas.removeClass().addClass('mb-3 cap-form-control').appendTo('#custom-body-c .custom-appointments .h-estimate');
if (blockTotalDeHorasSemAdicional.length) blockTotalDeHorasSemAdicional.removeClass().addClass('mb-3 cap-form-control').appendTo('#custom-body-c .custom-appointments .h-consumed');
if (blockTotalDeHorasComAdicional.length) blockTotalDeHorasComAdicional.removeClass().addClass('mb-3 cap-form-control').appendTo('#custom-body-c .custom-appointments .h-consumed-no-additional');
if (blockAcaoDoSuporte.length) blockAcaoDoSuporte.removeClass().addClass('mb-3 cap-form-control').appendTo('#custom-body-c');
bodyContent.prev().hide();
}, 500);
},
/**
* Tela: Detalhes da Solicitação
*
* Abre a solicitação pelo número dela.
* Ex: /Pages/RequestDetails.aspx?params=58
*/
findTicketByNumber: function () {
if (!/Pages\/RequestDetails.aspx/.test(window.location.href)) return;
const urlParams = new URLSearchParams(window.location.search);
const params = urlParams.get('params').toString();
if (params !== null && Number.isInteger(parseInt(params))) {
const base64Params = btoa(`RequestId=${params}`);
const newUrl = `/Pages/RequestDetails.aspx?params=${base64Params}`;
window.location.href = newUrl;
}
},
};
$('document').ready(function () {
// Run script.
appV.run();
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment