AmCharts 3 - Como interceptar o Click em um item do gráfico

Visão Geral

Neste tópico, vou mostrar uma maneira de inteceptar o evento “Click” na série de um gráfico da biblioteca amCharts v3.

Este exemplo foi projetado para ser usado no Formulário do Latromi.

Tecnologias utilizadas:

  • SQL
  • JavaScript

Definição do Gráfico

Você pode explorar os diferentes tipos de gráficos e configurações na página de demonstração do amCharts v3:

Para este exemplo, usaremos o gráfico de barras.

A estrutura abaixo será usada para montar o gráfico:

{
    "type": "serial",
    "categoryField": "category",
    "rotate": true,
    "startDuration": 1,
    "categoryAxis": {
        "gridPosition": "start"
    },
    "trendLines": [],
    "graphs": [
        {
            "balloonText": "[[title]] of [[category]]:[[value]]",
            "fillAlphas": 1,
            "id": "AmGraph-1",
            "title": "graph 1",
            "type": "column",
            "valueField": "column_1"
        },
        {
            "balloonText": "[[title]] of [[category]]:[[value]]",
            "fillAlphas": 1,
            "id": "AmGraph-2",
            "title": "graph 2",
            "type": "column",
            "valueField": "column_2"
        }
    ],
    "guides": [],
    "valueAxes": [
        {
            "id": "ValueAxis-1",
            "title": ""
        }
    ],
    "allLabels": [],
    "balloon": {},
    "legend": {
        "enabled": true,
        "useGraphSettings": true
    },
    "titles": [
        {
            "id": "Title-1",
            "size": 15,
            "text": "Chart Title"
        }
    ],
    "listeners": [
        {
            "event": "init",
            "method": "onChartInit"
        }
    ],
    "chartCursor": {
        "fullWidth": true,
        "cursorAlpha": 0.1,
        "listeners": [
            {
              "event": "changed",
              "method": "onChartCursorPositionChanged"
            }
        ]
    },
    "dataProvider": [
        {
            "category": "category 1",
            "column_1": 8,
            "column_2": 5
        },
        {
            "category": "category 2",
            "column_1": 6,
            "column_2": 7
        },
        {
            "category": "category 3",
            "column_1": 2,
            "column_2": 3
        }
    ]
}

Essa é uma estrutura padrão obtida dos exemplos fornecidos pelo amCharts. As únicas propriedades que foram adicionadas foram listeners e chartCursors, que são responsáveis pela manipulação de eventos do gráfico:

    //   ....
    "listeners": [
        {
            "event": "init",
            "method": "onChartInit"
        }
    ],
    "chartCursor": {
        "fullWidth": true,
        "cursorAlpha": 0.1,
        "listeners": [
            {
              "event": "changed",
              "method": "onChartCursorPositionChanged"
            }
        ]
    }
    //   ....

Formulário

O Formulário deste exemplo, terá apenas dois campos:

  • elmChart - Campo do tipo HTMLElement onde o gráfico será hospedado.

  • btnChartItem - Botão oculto que será usado como receptor do evento “Click” do gráfico. Quando o usuário clicar no gráfico, o evento “Click” do botão será disparado, recebendo as informações da série clicada.

Configurações do Formulário

Nas configurações do Formulário, adicione a classe CSS “amcharts-container”. Essa classe será usada para identificar o Formulário onde o gráfico será montado.

Comando SQL

No evento “Load” do Formulário, adicione uma ação do tipo “Criar Record”, e escreva um comando SQL capaz de retornar a seguinte estrutura:

<div style="width:100%;height:100%" class="chartplace">
    <script type="application/json">
        // JSON com as configurações do gráfico aqui
    </script>
</div>

Neste exemplo, estaremos usando o banco de dados PostgreSQL para isso:

WITh amcharts_settings AS (
    SELECT
    '{
        "type": "serial",
        "categoryField": "category",
        "rotate": true,
        "startDuration": 1,
        "categoryAxis": {
            "gridPosition": "start"
        },
        "trendLines": [],
        "graphs": [
            {
                "balloonText": "[[title]] of [[category]]:[[value]]",
                "fillAlphas": 1,
                "id": "AmGraph-1",
                "title": "graph 1",
                "type": "column",
                "valueField": "column_1"
            },
            {
                "balloonText": "[[title]] of [[category]]:[[value]]",
                "fillAlphas": 1,
                "id": "AmGraph-2",
                "title": "graph 2",
                "type": "column",
                "valueField": "column_2"
            }
        ],
        "guides": [],
        "valueAxes": [
            {
                "id": "ValueAxis-1",
                "title": ""
            }
        ],
        "allLabels": [],
        "balloon": {},
        "legend": {
            "enabled": true,
            "useGraphSettings": true
        },
        "titles": [
            {
                "id": "Title-1",
                "size": 15,
                "text": "Chart Title"
            }
        ],
        "listeners": [
            {
                "event": "init",
                "method": "onChartInit"
            }
        ],
        "chartCursor": {
            "fullWidth": true,
            "cursorAlpha": 0.1,
            "listeners": [
                {
                  "event": "changed",
                  "method": "onChartCursorPositionChanged"
                }
            ]
        },
        "dataProvider": [
            {
                "category": "category 1",
                "column_1": 8,
                "column_2": 5
            },
            {
                "category": "category 2",
                "column_1": 6,
                "column_2": 7
            },
            {
                "category": "category 3",
                "column_1": 2,
                "column_2": 3
            }
        ]
    }' AS json
)

SELECT 
    '<div style="width:100%;height:100%" class="chartplace">'||E'\r\n'
    || '<script type="application/json">'||E'\r\n'
    || json ||E'\r\n'
    || '</script>'||E'\r\n'
    '</div>' AS html
FROM amcharts_settings

Agora, adicione uma ação do tipo “Popular Campos e Variáveis”, e preencha o campo “elmChart” com o valor retornado no comando SQL.

Evento Click do Botão

Adicione um evento “Click” no botão “btnChartItem”, e adicione no procedimento os parâmetros referentes aos dados que você deseja receber quando clicar na série do gráfico.

Neste exemplo, estou adicionando todas as propriedades e exibindo o valor delas em uma mensagem:

image

Arquivos JavaScript

Por último, crie um arquivo JavaScript para o Formulário, e informe o script abaixo:

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) { 
        latromi.extensions.loadScripts(['https://static.latromi.com.br/adapters/amcharts.configurator-1.0.js'], amChartsInit);
    }

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

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

	// Bibliotecas amCharts carregadas
	function amChartsInit() {

		// AmCharts: https://www.amcharts.com
		var amChartsConfig = new amChartsConfigurator({
			containerCssClass: 'amcharts-container',
			chartCssClass: 'chartplace',
			drawInterval: 100
		});
		amChartsConfig.load();
	}
	
	// ■■■ Adicionado ■■■
	// Ocorre quando o usuário clica em uma série.
	// Os dados referentes a serie são recebidos no argumento "dataItem"
	function onChartSerieClick(dataItem) {
	   console.log(dataItem);
	   
	   // Obtém referencia do form
	   const form = latromi.formManager.getFormInstance();
	   
	   // Dispara o evento do botão que vai receber os dados da série clicada
	   form.raiseFieldEvent('btnChartItem', 'Click', dataItem);
	}

    // 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 {
        // ■■■ Adicionado ■■■
        // Callback de inicialização do gráfico
        onChartInit: function(ev) {
            // Adiciona o evento "Click" no gráfico
            ev.chart.chartDiv.addEventListener('click', function(clickEvent) {
                // Se a posição da última série selecionada pelo usuário
                // não estiver disponível, sai do processamento
                if (isNaN(ev.chart.lastCursorPosition)) return;
                
                // Chama a função que vai gerenciar o click em uma série do gráfico.
                // Envia por parâmetro os dados referentes à série clicada.
                onChartSerieClick(ev.chart.dataProvider[ev.chart.lastCursorPosition]);
                
            });
        },
        // ■■■ Adicionado ■■■
        // Callback de mudança na série selecionada do gráfico
        onChartCursorPositionChanged: function(ev) {
            // Armazena a posição da série selecionada pelo usuário
            ev.chart.lastCursorPosition = ev.index;
        },       
    }
})();

Observe que o código JavaScript é basicamente o mesmo gerado pelo Snippet:

Botão direito do Mouse → Adicionar Código → JavaScript para Formulário + AmCharts

Os pontos que foram adicionados, ou seja, que não foram gerados pelo Snippet, estão marcados dessa maneira no script:

// ■■■ Adicionado ■■■ 

Resultado

Implementando o Formulário desta maneira, quando você clicar em uma série do gráfico, o Click do botão será chamado recebendo os dados do gráfico:

Bom dia,
Acho que fiz algo de forma errada, pois não funcionou.
Tenho o meu primeiro gráfico, irei colocar o comando aqui

SELECT  '
{
    "type": "serial",
    "columnSpacing": 150,
    "categoryField": "cliente",
    "rotate": true,
    "autoMarginOffset": 100,
    "marginBottom": 10,
    "marginLeft": 200,
    "marginRight": 10,
    "marginTop": 45,
    "startDuration": 1,
    "startEffect": "easeOutSine",
    "decimalSeparator": ",",
    "fontSize": 12,
    "labelFontSize": 14,
    "precision": 2,
    "prefixesOfBigNumbers": [],
    "prefixesOfSmallNumbers": [],
    "thousandsSeparator": ".",
    "categoryAxis": {
        "gridPosition": "start"
    },
    "listeners": [
        {
            "event": "init",
            "method": "onChartInit"
        }],
    "chartCursor": {
        "enabled": true,
        "categoryBalloonEnabled": false,
        "cursorColor": "#BAEABA",
        "limitToGraph": "AmGraph-1"
    },
     "chartCursor": {
        "fullWidth": true,
        "cursorAlpha": 0.1,
        "listeners": [
            {
              "event": "changed",
              "method": "onChartCursorPositionChanged"
            }
        ]},
    "trendLines": [],
    "graphs": [
        {
            "balloonText": "[[value]]%",
            "bulletOffset": -2,
            "fillAlphas": 1,
            "id": "AmGraph-1",
            "labelText": "[[value]]%",
            "lineAlpha": 0,
            "lineThickness": 0,
            "title": "graph 1",
            "type": "column",
            "valueField": "perc",
            "colorField": "color"
        }
    ],
    "guides": [],
    "valueAxes": [
        {
            "id": "ValueAxis-1",
            "title": ""
        }
    ],
    "allLabels": [],
    "balloon": {},
    "titles": [
        {
            "id": "Title-1",
            "size": 12,
            "text": ""
        }
    ],
    "dataProvider": ['||ARRAY_TO_STRING(
    (SELECT ARRAY(   
        SELECT format('{ "cliente": "%s", "perc": %s, "color": "%s"}'
                , cliente
                , perc
                , (CASE 
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 1 THEN '#FF5733'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 2 THEN '#33FF57'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 3 THEN '#3357FF'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 4 THEN '#FFC300'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 5 THEN '#C70039'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 6 THEN '#900C3F'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 7 THEN '#DAF7A6'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 8 THEN '#581845'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 9 THEN '#28B463'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 10 THEN '#F1948A'
                    ELSE '#000000' END)
            )
        FROM q1
        ORDER BY perc desc
    ))
    , E',\r\n')||']}' AS jsondata
)
SELECT 
    '<div class="drawChart" style="box-sizing:border-box;width:100%;height:100%;margin-left:0;margin-right:auto;display:block;">' ||E'\r\n'
||E'\t<script type="application/json">\r\n'
|| jsondata
||E'\r\n\t</script>\r\n'
||'</div>'::VARCHAR AS htmlelement
FROM q_json

O qual ele possui filtros de filial , unidade ano e cliente,
Ao clicar na linha do cliente gostaria de abrir outro gráfico como uma janela / pop up,

Criei o outro formulário como você explicou
FRM00001113100049420241202095328350305

Dúvida como faço para passar os parâmetros para o comado do gráfico que irá abrir.
Preciso que pegue os parâmetros, filial / unidade e ano da seleção do gráfico 1 e o cliente preciso que pegue do clic do gráfico 1 ?

Porém, quando clico no primeiro gráfico não esta ocorrendo nada .

Gráfico principal

FRM00001113000049420241202090028890305

Poderias me auxiliar a fazer funcionar ?

@LindaBarichello boa tarde,

Para passar os valores dos parâmetros adicione-os no ‘dataProvider’

{
    ...,
    "dataProvider": [
        {
            ...,
            "parametroFormulario1": "<<valor do parametro 1>>",
            "parametroFormulario2": "<<valor do parametro 2>>",
            "parametroFormularioN": "<<valor do parametro N>>"
        },
        ...,
    ]
}

Para capturar os valores do ‘dataProvider’ é adicionado no evento click do botão

Para abrir um formulário pelo latromi, adicione a referência ao novo formulário nas janelas do formulário principal e no evento click do botão adicione o procedimento para ‘Abrir janela’

Boa tarde, Diego, tudo bem?

E no comando SQL?
No segundo formulário que abrirá no clic, antes de chegar na parte do JavaScript, tenho o comando SQL que alimenta o JavaScript. Como faço para passar os parâmetros do primeiro formulário, como Ano, filial e unidade, junto com o clique que seria o CNPJ do cliente? Por exemplo, o CNPJ correspondente ao clique no rank 1 do meu gráfico no formulário 1.

@LindaBarichello ao criar os dois formulários adicione as variáveis que você deseja enviar para o outro formulário e seus respectivos parâmetros, no novo formulário. Segue imagem de exemplo.

Em seguida, na sessão ‘Janelas’ do seu formulário principal adicione a referência ao novo formulário e preencha o valor dos parâmetros com o valor das variáveis criadas.

Para finalizar vamos adicionar no evento de ‘click’ do botão invisível criado no formulário principal os argumentos referentes aos campos existentes no ‘dataProvider’ do gráfico gerado, iremos usar esses argumentos para popular os campos das variáveis e em seguida adicionar o comando de ‘Abrir janelas’ para abrir o modal

Obs.: o comando sql é adicionado no evento load do formulário.

Diego, criei os parâmetros e chamei o outro gráfico via abertura de janela, como você explicou, mas é como se a funcionalidade do clique não estivesse funcionando. Incluí no comando do primeiro gráfico as instruções repassadas pelo Daniel.
Atualizei o arquivo javascrip para que foi incluso neste tópico .
Necessito adicionar mais alguma informação?

Poderia substituir o sql pelo seguinte:

SELECT  '
{
    "type": "serial",
    "columnSpacing": 150,
    "categoryField": "cliente",
    "rotate": true,
    "autoMarginOffset": 100,
    "marginBottom": 10,
    "marginLeft": 200,
    "marginRight": 10,
    "marginTop": 45,
    "startDuration": 1,
    "startEffect": "easeOutSine",
    "decimalSeparator": ",",
    "fontSize": 12,
    "labelFontSize": 14,
    "precision": 2,
    "prefixesOfBigNumbers": [],
    "prefixesOfSmallNumbers": [],
    "thousandsSeparator": ".",
    "categoryAxis": {
        "gridPosition": "start"
    },
    "listeners": [
        {
            "event": "init",
            "method": "onChartInit"
        }],
     "chartCursor": {
        "fullWidth": true,
        "cursorAlpha": 0.1,
        "listeners": [
            {
              "event": "changed",
              "method": "onChartCursorPositionChanged"
            }
        ]},
    "trendLines": [],
    "graphs": [
        {
            "balloonText": "[[value]]%",
            "bulletOffset": -2,
            "fillAlphas": 1,
            "id": "AmGraph-1",
            "labelText": "[[value]]%",
            "lineAlpha": 0,
            "lineThickness": 0,
            "title": "graph 1",
            "type": "column",
            "valueField": "perc",
            "colorField": "color"
        }
    ],
    "guides": [],
    "valueAxes": [
        {
            "id": "ValueAxis-1",
            "title": ""
        }
    ],
    "allLabels": [],
    "balloon": {},
    "titles": [
        {
            "id": "Title-1",
            "size": 12,
            "text": ""
        }
    ],
    "dataProvider": ['||ARRAY_TO_STRING(
    (SELECT ARRAY(   
        SELECT format('{ "cliente": "%s", "perc": %s, "color": "%s"}'
                , cliente
                , perc
                , (CASE 
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 1 THEN '#FF5733'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 2 THEN '#33FF57'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 3 THEN '#3357FF'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 4 THEN '#FFC300'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 5 THEN '#C70039'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 6 THEN '#900C3F'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 7 THEN '#DAF7A6'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 8 THEN '#581845'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 9 THEN '#28B463'
                    WHEN row_number() OVER (ORDER BY cliente DESC) = 10 THEN '#F1948A'
                    ELSE '#000000' END)
            )
        FROM q1
        ORDER BY perc desc
    ))
    , E',\r\n')||']}' AS jsondata
)
SELECT 
    '<div class="drawChart" style="box-sizing:border-box;width:100%;height:100%;margin-left:0;margin-right:auto;display:block;">' ||E'\r\n'
||E'\t<script type="application/json">\r\n'
|| jsondata
||E'\r\n\t</script>\r\n'
||'</div>'::VARCHAR AS htmlelement
FROM q_json

Adicionei, mas mudou nada aparentemente.

Poderia me mandar um print do console no inspecionar do navegador

Perfeito. Poderia trocar o código javascript para o seguinte:

const myFormChart = (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) { 
        latromi.extensions.loadScripts(['https://static.latromi.com.br/adapters/amcharts.configurator-1.0.js'], amChartsInit);
    }

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

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

    // Bibliotecas amCharts carregadas
    function amChartsInit() {

        // AmCharts: https://www.amcharts.com
        var amChartsConfig = new amChartsConfigurator({
            containerCssClass: 'amcharts-container',
            chartCssClass: 'chartplace',
            formName: 'myFormChart',
            drawInterval: 100
        });
        amChartsConfig.load();
    }
    
    // ■■■ Adicionado ■■■
    // Ocorre quando o usuário clica em uma série.
    // Os dados referentes a serie são recebidos no argumento "dataItem"
    function onChartSerieClick(dataItem) {
       console.log(dataItem);
       
       // Obtém referencia do form
       const form = latromi.formManager.getFormInstance();
       
       // Dispara o evento do botão que vai receber os dados da série clicada
       form.raiseFieldEvent('btnChartItem', 'Click', dataItem);
    }

    // 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 {
        // ■■■ Adicionado ■■■
        // Callback de inicialização do gráfico
        onChartInit: function(ev) {
            // Adiciona o evento "Click" no gráfico
            ev.chart.chartDiv.addEventListener('click', function(clickEvent) {
                // Se a posição da última série selecionada pelo usuário
                // não estiver disponível, sai do processamento
                if (isNaN(ev.chart.lastCursorPosition)) return;
                
                // Chama a função que vai gerenciar o click em uma série do gráfico.
                // Envia por parâmetro os dados referentes à série clicada.
                onChartSerieClick(ev.chart.dataProvider[ev.chart.lastCursorPosition]);
                
            });
        },
        // ■■■ Adicionado ■■■
        // Callback de mudança na série selecionada do gráfico
        onChartCursorPositionChanged: function(ev) {
            // Armazena a posição da série selecionada pelo usuário
            ev.chart.lastCursorPosition = ev.index;
        },       
    }
})();

No formulário que dou clic ou no formulário que deve abrir no clic?

O formulário principal, que é efetuado o clique

Adicionei e não acontece, quando cliquei, ele não aparece como se pudesse clicar.

Sabe me informar se tem algum outro JS aplicado que interage com o amcharts?

Sim, tem este
eu deixei vazio, não consigo excluir ele.
O que você passou é o que esta marcado.

Para deletar a referência de um script do formulário tu pode selecionar ele e clicar a tecla ‘delete’

Vamos testar deletá-lo. O erro que apareceu no console foi pelo gráfico já estar carregado, então quando ele tenta ler o script ele não localiza o formato JSON, pois já foi carregado o HTML dele.

Por isso o erro de strict mime type

Exclui o outro scrip mantendo somente o atualizado que você encaminhou.

@LindaBarichello eu acho que você deve estar usando uma versão mais antiga do amChartsConfigurator, que é uma função JavaScript que desenvolvemos para fazer a plotagem do gráfico AmCharts no Latromi.

Siga essas passos para atualizar:

  1. Primeiro, faça uma cópia do seu JavaScript Público para um arquivo .js separado (backup)

  2. Verifique se no JavaScript público, algum objeto com o nome “amChartsConfigurator” está sendo declarado. Você vai encontrar algo parecido com isso:

    var amChartsConfigurator = amChartsConfigurator || function(options) {
       var settings = $.extend({
          containerCssClass: 'amcharts-container',
          chartCssClass: 'chartplace',
          drawInterval: 100
       }, options);  
       // ...
       // ...
       // ...
       return {
           // ...
           // ...
           // ...
       }
    }
    
  3. Remova toda a declaração do amChartsConfigurator.

  4. Procure pelo carregamento da função amChartsConfigurator no JavaScript Público. Você vai encontrar algo parecido com isso:

    $(window).on('load', function() {
        // Inicializa AMCharts
        var chartConfigurator = new amChartsConfigurator({
            containerCssClass: 'amcharts-container',
            chartCssClass: 'drawChart'
        }).load();
    });
    
  5. Modifique este bloco, deixando dessa forma (mas mantenha o valor das propriedades):

    $(window).on('load', function() {
        // Inicializa AMCharts
        latromi.extensions.loadScripts(['https://static.latromi.com.br/adapters/amcharts.configurator-1.0.js'], function() {
            new amChartsConfigurator({
                containerCssClass: 'amcharts-container',
                chartCssClass: 'drawChart'
            }).load();
        });
    });
    
  6. Salve o arquivo JavaScript.

Com estes procedimentos, você passa a usar o objeto amChartsConfigurator na versão mais recente, em todos os seus gráficos.

Após modificar essa função, lembre-se de testar algum gráfico que já estivesse funcionando antes da alteração. Se precisa, restaure o backup do arquivo JavaScript Público.

Adicionalmente, faça as seguintes modificações:

  • Desmarque a checkbox “Assinc.” do Arquivo JavaScript do Formulário. Isso faz com que o arquivo seja carregado assincronamente, correndo o risco de executar alguma ação antes do Formulário estar devidamente carregado

  • Troque o nome da variável JavaScript que recebe o objeto do Form de myFormChart para myForm. Fazendo alguns testes, percebi que ocorre erro quando usamos um nome diferente. Vamos verificar isso.

Boa noite, Daniel. Realizei as alterações, testei um gráfico que já havia sido criado anteriormente e está funcionando.

O gráfico em questão, tentei novamente para verificar se a função de clique iria funcionar, mas não funcionou. Continua como se não tivesse a opção de clicar.