Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Obsługa biblioteki chart.js

Podsumowanie:

W wersji nAxiom 1.12.0.0 obsługiwana jest biblioteka Chart.js w wersji 4.4.0 (licencja MIT). Kod biblioteki został włączony do platformy nAxiom, dzięki czemu można z niej korzystać jak z natywnej funkcjonalności.

Biblioteka umożliwia renderowanie wykresów różnego typu z użyciem JavaScript oraz zasilanie ich danymi pochodzącymi z bazy danych lub kontekstu formularza. Konfiguracja wykresów jest przedstawiona w dokumentacji projektu Chart.js na stronie projektu.

Wykresy można definiować w sekcjach HTML (na formularzach oraz widgetach typu sekcja HTML), w kontrolkach blok HTML oraz w kolumnie HTML w widoku listy.

W tym temacie

Wstęp

W tym temacie opisano sposób definiowania wykresu w sekcji HTML. Opis ten pozostaje właściwy także dla kontrolki blok HTML. W przypadku kolumny HTML w widoku listy dane do wykresu muszą pochodzić z bieżącego rekordu widoku listy (RowDataContext.NazwaKolumny, gdzie NazwaKolumny to właściwość Nazwa SQL); patrz także Zalecenia poniżej. Wykres jest generowany kodem JavaScript jako element HTML canvas. Konfiguracja wykresu w sekcji HTML obejmuje trzy części:

  • Zapytanie SQL: zwraca dane do wykresu, jeden rekord jest jedną serią danych, nazwy kolumn to etykiety wartości, a zwrócone dane to same wartosci.
  • Szablon HTML: musi zawierać deklarację elementu canvas z identyfikatorem, który zostanie użyty w kodzie JavaScript:
<canvas id="niepowtarzalny-identyfikator"></canvas>

Aby poprawnie wyświetlić kilka wykresów na stronie nAxiom, ich elementy canvas muszą mieć niepowtarzalne identyfikatory.

  • Kod JavaScript: definiuje podstawowe elementy wykresu, takie jak rodzaj wykresu, serie danych, opcje konfiguracyjne. W kodzie należy także zadeklarować zmienne, które będą uzywane w seriach danych jako etykiety i/lub wartości i powiązać je z danymi zwróconymi przez zapytanie, wskazując nazwę kolumny i numer rekordu (pierwszy rekord ma numer 0).

Ogólny przykład konfiguracji wykresu

Zapytanie SQL:

select 
     () as InProgress
    ,() as Delayed  

Szablon HTML:

<div> 
    <canvas id="chart1"></canvas>
</div>

Kod JavaScript:

W przykładzie zadeklarowano zmienne używane w seriach danych jako wartości. Za zmienne są podstawiane dane z zapytania SQL — wskazana kolumna i numer rekordu.

W przypadku sekcji HTML na formularzu, w tym na widżecie typu formularz, referencja do wyniku zapytania SQL wymaga użycia kodu formularza:

var DanaDoWykresu = window["KodFormularza_QueryModel"][indeksWierszaZapytaniaSQL].NazwaKolumnyZapytaniaSQL; 

W przypadku użycia widgetu typu sekcja HTML, należy użyć w referencji kodu pulpitu, na którym ma być używany widżet:

window["kodPulpitu_QueryModel"][indeksWierszaZapytaniaSQL].NazwaKolumnyZapytaniaSQL

Przykład kodu JavaScript dla wykresu

//deklaracja zmiennych i przypisywanie wartości
var val_InProgress = window["MyDashboardCode_QueryModel"][0].InProgress; 
var val_Delayed = window["MyDashboardCode_QueryModel"][0].Delayed; 

//deklarowanie wykresu
var ctx = document.getElementById('chart1').getContext('2d');

//definiowanie serii danych
var data = {
  // właściwa konfiguracja serii danych - tutaj używa się zmiennych zadeklarowanych na początku
};

//definiowanie konfiguracji wykresu
var config = {
      // właściwa konfiguracja wykresu
};

//utworzenie wykresu
new Chart(ctx, config);

Zalecenia

  1. W celu poprawnego renderowania kilku wykresów na stronie nAxiom, elementy canvas każdego wykresu muszą mieć niepowtarzalne wartości atrybutu id.
  2. Dla kolumny HTML zaleca się stosowanie automatycznej wysokości wykresu i definiowanie jedynie szerokości zgodnej z szerokością kolumny. Pozwoli to na indywidualne dostosowanie wysokości wykresu w każdym rekordzie.
  3. Kod HTML w kolumnie HTML musi zawierać co najmniej jeden element z atrybutem rowHtmlElement o dowolnej wartości, która jednak nie może zawierać cyfr. W przeciwnym razie kod Javascript nie zostanie wykonany.
  4. Aby kontrolować rozmieszczenie wykresów w obrębie sekcji zaleca się stosowanie techniki Flexbox Layout.

Przykład konfiguracji dwóch wykresów w jednej sekcji

Zapytanie SQL:

select 
     (select count(Id) from [dbo].[RecruitmentProcess] 
        where [RecruitmentDeadline] >= getdate() 
        and Worksite = {&HRDevelopment.Dictionaries.Worksite.Design}
        and Status != {&HRDevelopment.BusinessStatuses.RecruitmentProcess.Rec_Finished}
        ) as WorksiteDesignInTimeNotFinished
    ,(select count(Id) from [dbo].[RecruitmentProcess] 
        where [RecruitmentDeadline] < getdate() 
        and Worksite = {&HRDevelopment.Dictionaries.Worksite.Design}
        and Status != {&HRDevelopment.BusinessStatuses.RecruitmentProcess.Rec_Finished}
        ) as WorksiteDesignOutOfTimeNotFinished
    ,(select count(Id) from [dbo].[RecruitmentProcess] 
        where [RecruitmentDeadline] >= getdate() 
        and Worksite = {&HRDevelopment.Dictionaries.Worksite.RoadConstruction}
        and Status != {&HRDevelopment.BusinessStatuses.RecruitmentProcess.Rec_Finished}
        ) as WorksiteRoadConstructionInTimeNotFinished
    ,(select count(Id) from [dbo].[RecruitmentProcess] 
        where [RecruitmentDeadline] < getdate() 
        and Worksite = {&HRDevelopment.Dictionaries.Worksite.RoadConstruction}
        and Status != {&HRDevelopment.BusinessStatuses.RecruitmentProcess.Rec_Finished}
        ) as WorksiteRoadConstructionOutOfTimeNotFinished     

Szablon HTML:

<QueryRowTemplate>
    <div 
        class="widgetFullContainer" 
        style="display:flex; flex-wrap: wrap; flex-direction: row; align-items: center; justify-content: space-evenly; margin: 0.5rem;">
        <div 
            class="chart" 
            style="width: 40%">
            <canvas id="chart1"></canvas>
            <p style="text-align:center">Dział projektów</p>
        </div>
        <div 
            class="chart" 
            style="width: 40%">
            <canvas id="chart2"></canvas>
            <p style="text-align:center">Dział budowy dróg</p>
        </div>
    </div>
</QueryRowTemplate>

Kod JavaScript:

var ValueWorksiteDesignInTimeNotFinished = window["HRDDeadlinesByWorkstite_QueryModel"][0].WorksiteDesignInTimeNotFinished; 
var ValueWorksiteDesignOutOfTimeNotFinished = window["HRDDeadlinesByWorkstite_QueryModel"][0].WorksiteDesignOutOfTimeNotFinished; 
var ValueWorksiteRoadConstructionInTimeNotFinished = window["HRDDeadlinesByWorkstite_QueryModel"][0].WorksiteRoadConstructionInTimeNotFinished; 
var ValueWorksiteRoadConstructionOutOfTimeNotFinished = window["HRDDeadlinesByWorkstite_QueryModel"][0].WorksiteRoadConstructionOutOfTimeNotFinished;

var ctx = document.getElementById('chart1').getContext('2d');

var data = {
  labels: ['W terminie', 'Opóźnione'],
  datasets: [
    {
      label: 'Dataset 1',
      data: [ValueWorksiteDesignInTimeNotFinished, ValueWorksiteDesignOutOfTimeNotFinished],
      backgroundColor: [
        'rgba(0, 255, 34, 0.75)',
        'rgba(255, 183, 183, 0.75)',
      ],
    }
  ]
};

var config = {
  type: 'doughnut',
  data: data,
    options: {
        responsive: true,
        plugins: {
        legend: {
            position: 'bottom',
        },
        title: {
            display: false,
        }
        }
    },
    };
}
new Chart(ctx, config);

//

var ctx = document.getElementById('chart2').getContext('2d');

var dataWorksiteRoadConstruction = {
  labels: ['W terminie', 'Opóźnione'],
  datasets: [
    {
      label: 'Dataset 2',
      data: [ValueWorksiteRoadConstructionInTimeNotFinished, ValueWorksiteRoadConstructionOutOfTimeNotFinished],
      backgroundColor: [
        'rgba(0, 255, 34, 0.75)',
        'rgba(255, 183, 183, 0.75)',
      ],
    }
  ]
};

var configWorksiteRoadConstruction = {
  type: 'doughnut',
  data: data,
  options: {
    responsive: true,
    plugins: {
      legend: {
        position: 'bottom',
      },
      title: {
        display: false,
      }
    }
  },
};
new Chart(ctx, config);

Wynik końcowy:

Przykład wykresu
Przykład wykresu

Przykład wykresu liniowego w kolumnie HTML

Szablon HTML:

<div rowHtmlElement="thisChart" style="width: 300px;">
  <canvas id="doughnutChartForm_{@Id}"></canvas>
</div>

Kod Javascript:

var chartId = 'doughnutChartForm_' + RowDataContext.Id;
var ctx = document.getElementById(chartId).getContext('2d');
var data = {
  labels: ['Q1', 'Q2', 'Q3', 'Q4'],
  datasets: [
    {
      label: 'Sales by quater,
      data: [
        RowDataContext.Column1_SQLName,
        RowDataContext.Column2_SQLName,
        RowDataContext.Column3_SQLName,
        RowDataContext.Column4_SQLName
      ]
    }
  ]
};

var config = {
  type: 'line',
  data: data,
  options: {
    responsive: true,
    plugins: {
      legend: {
        position: 'top',
      },
      title: {
        display: true,
        text: 'Chart.js Chart'
      }
    }
  },
};

new Chart(ctx, config);
|← Widżety |↑ Do góry |→ Kontrolki |

Copyright © 2025 OPTEAM SA. Theme Copyright © 2017-2020 Patrick Marsceill. Distributed by an MIT license.