Problema com carregamento Amcharts

Código de formulário: FRM00000822800017320210901100648740305

Erro no console

Código do arquivo publico js:

//Função para referenciar arquivos externos
function loadScripts(urls, callback, index) {
    if (index === undefined) index = 0;
    $.getScript(urls[index])
        .done(function () {
            console.log("Script carregado:", urls[index]);
            if (index < urls.length - 1) {
                loadScripts(urls, callback, index + 1);
            } else if (callback) {
                console.log("Todos os scripts carregados");
                callback();
            }
        })
        .fail(function () {
            console.error("Falha ao carregar:", urls[index]);
        });
}


// *********************************** AmCharts ********************************************

$(window).on('load', function () {
    loadScripts([
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/amcharts.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/serial.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/funnel.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/pie.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/themes/light.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/gauge.js'
    ], drawAmCharts);

});


function drawAmCharts() {
    $('.drawChart').each(function () {
        drawAmChart(this);
    });
}


function drawAmChart(element) {
    var $el = $(element);
    $el.removeClass('drawChart'); // Evita desenhar duas vezes

    var scriptTag = $el.children('script');
    if (scriptTag.length === 0) return;

    var json;
    try {
        json = JSON.parse(scriptTag.text());
    } catch (e) {
        console.error("JSON inválido no gráfico:", e);
        return;
    }

    $el.empty();

    // Verifica se AmCharts existe antes de tentar usar
    if (typeof AmCharts === 'undefined') {
        console.error("AmCharts ainda não está disponível!");
        return;
    }

    try {
        AmCharts.makeChart(element, json);
        console.log("Gráfico criado!");
    } catch (e) {
        console.error("Erro ao criar gráfico:", e);
    }
}

// *********************************** AmCharts (END) ********************************************

// Carrega o plugin apenas se estiver na "Master Page"
if (document.getElementById('MasterWraper')) {
    let script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://static.latromi.com.br/plugins/CustomStatusBar/v2/custom-status-bar.js';
    script.addEventListener('load', function (ev) {
        // Este código será executado quando o arquivo for completamente carregado.
        var statusBar = new customStatusBar({ height: 22, alignment: 'left' });
        statusBar.addField('Usuário Logado: <b>{?SESSION LoginUsuario}</b>  Conta: <b>{?SESSION CampoLivre1}</b>');
    });
    
    document.head.appendChild(script);
}

Bom dia, @Gabriel!

O código apresentado parece estar OK, seguindo a lógica que esta sendo implementado estará carregando os gráficos que tiverem marcado com a classe drawChart.

O que podemos fazer é tentar limpar o cache do navegador e recarregar as configurações.

Outra ação que pode ser feito é no ponto que está chamando a função loadScripts utilizar a função presente na lib de métodos de extensão do Latromi:

latromiExtensions.loadScripts();

Esperamos que alguma dessas sugestões te auxilie na solução da questão apresentada, mas caso ainda persista estamos à disposição para continuar analisando uma possível solução :slightly_smiling_face:

Atualizei a função. Entretanto estou enfrentando problemas com a renderização, principalmente quando envolve atualização das consultas nativas. Existe algum método para identificar o evento de atualização e após completar executar a função de desenhar os gráficos?

Bom dia, @Gabriel!

Sim, é possível usar os callbacks presentes nos métodos dos formulários, sendo eles:

  • setOnFormCreatedCallback: callback responsável por informar o evento de Load do formulário, permitindo acessar os elementos assim que estão renderizados no DOM da página.

  • setOnEventFiringCallback: callback responsável por informar os eventos que estão sendo disparados no formulário.

  • setOnFieldValueChangedCallback: callback reponsável por informar os campos que estão sofrendo alteração de valor no formulário.


Exemplo de utilização

const myForm = (function () {

    // Adiciona Callbacks no Formulário
    latromi.formManager.setOnFormCreatedCallback(onFormCreated);
    latromi.formManager.setOnEventFiringCallback(onEventFiring);
    latromi.formManager.setOnFieldValueChangedCallback(onFieldValueChanged);

    // Ocorre logo após o form ser inicializado
    function onFormCreated(ev) { }

    // Ocorre quando um evento é disparado no Form
    function onEventFiring(ev) { }

    // Ocorre quando o valor de um campo é alterado no Form
    function onFieldValueChanged(ev) { }

    // Todas as funções acima são "privadas", e não podem ser chamadas externamente.
    // As únicas funções que podem ser chamadas externamente são as que compões o resultado a seguir:
    return {
        test: function() { }
    }
})();

Eu adicionei isso, porém não obtive o resultado esperado. O problema continua.

const myForm = (function () {
    const amchartsScripts = [
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/amcharts.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/serial.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/pie.js',
      'https://cdn.jsdelivr.net/npm/amcharts3/amcharts/themes/light.js',
      'https://www.amcharts.com/lib/3/amcharts.js',
      'https://cdn.amcharts.com/lib/3/gauge.js',
      'https://www.amcharts.com/lib/3/amcharts.js',
      'https://www.amcharts.com/lib/3/serial.js',
      'https://www.amcharts.com/lib/3/pie.js'
      
    ];

    // Adiciona Callbacks no Formulário
    latromi.formManager.setOnFormCreatedCallback(onFormCreated);
    latromi.formManager.setOnEventFiringCallback(onEventFiring);
    latromi.formManager.setOnFieldValueChangedCallback(onFieldValueChanged);

    // Ocorre logo após o form ser inicializado
    function onFormCreated(ev) 
    {
      latromiExtensions.loadScripts(amchartsScripts)
      drawAmCharts();
      
    }

    // Ocorre quando um evento é disparado no Form
    function onEventFiring(ev) { 
        drawAmCharts();
    }

    // Ocorre quando o valor de um campo é alterado no Form
    function onFieldValueChanged(ev) { 
        drawAmCharts();
    }

    // Todas as funções acima são "privadas", e não podem ser chamadas externamente.
    // As únicas funções que podem ser chamadas externamente são as que compões o resultado a seguir:
    return {
        test: function() { }
    }
})();

Dentro do método loadscript existe um parâmetro a mais de callback, que será executado ao terminar de carregar os scripts. Seguindo o código informado pode ser feito a seguinte alteração:

    function onFormCreated(ev) 
    {
        latromiExtensions.loadScripts(amchartsScripts, drawAmCharts);
    }

Eu conseguiria adaptar isso no arquivo publico ?

Sim, é possível adaptar esse código no Javascript público. No seguinte tópico da comunidade tem alguns exemplos legais que demonstram uma implementação de código.

1 curtida