via pixabay.com
はじめに
みなさんは、SalesforceでLightning Web Components(以下LWC)を利用した開発を行ったことがありますか?
LWCでは一般的なHTMLを使用したウェブサイトのように、サードパーティのライブラリを利用して開発をすることも可能です。
今回は、Chart.jsというサードパーティのライブラリを利用して、LWCでグラフを描画する方法をご紹介したいと思います。
LWCでは一般的なHTMLを使用したウェブサイトのように、サードパーティのライブラリを利用して開発をすることも可能です。
今回は、Chart.jsというサードパーティのライブラリを利用して、LWCでグラフを描画する方法をご紹介したいと思います。
Chart.jsとは
Chart.jsは2013年に公開された、オープンソースのライブラリです。
円グラフや折れ線グラフ、棒グラフをはじめとしたさまざまなグラフをJavaScriptで簡易に作成することができます。
円グラフや折れ線グラフ、棒グラフをはじめとしたさまざまなグラフをJavaScriptで簡易に作成することができます。
Chart.js | Chart.js
Open source HTML5 Charts for your website
Chart.jsを利用するための準備
Chart.jsをLWCで利用するためには、ファイルを静的リソースに保存する必要があります。
その手順を確認していきましょう。
まずは、公式サイトからChart.jsのファイルを保存します。
その手順を確認していきましょう。
まずは、公式サイトからChart.jsのファイルを保存します。
JsDelivrのFilesタブにある一番上のファイルを、右クリックから保存します。
Installation | Chart.js
Open source HTML5 Charts for your website
次に、保存したファイルを静的リソースとしてSalesforceに保存します。
これで準備ができました。
LWCでグラフ描画処理を実装してみましょう!
LWCでグラフ描画処理を実装してみましょう!
グラフ描画処理の実装
今回は、売上高を表現する棒グラフを実装してみたいと思います。
LWCを新規作成して、HTMLにグラフを描画するために必要なcanvasを配置します。
LWCを新規作成して、HTMLにグラフを描画するために必要なcanvasを配置します。
<template> <lightning-card> <canvas width="600" height="300"></canvas> </lightning-card> </template>
chartComponent.html
js側では、先ほど追加したchart.jsファイルを静的リソースからimportします。
importしたchart.jsファイルをplatformResourceLoaderを使用して読み込むことで、グラフの描画ができるようになります。
drawChartメソッド内で、canvas要素を取得してグラフを描画します。
typeでグラフの種類(今回は棒グラフのためbarを指定)、labelsでグラフの横軸の表示ラベル、datasetsでグラフの数値や色を指定します。
今回は割愛しますが、マウスオーバー時のツールチップ表示やグラフの幅など、Chart.jsにはさまざまなプロパティが設定できるようになっているので興味のある方はぜひ調べてみてください。
importしたchart.jsファイルをplatformResourceLoaderを使用して読み込むことで、グラフの描画ができるようになります。
drawChartメソッド内で、canvas要素を取得してグラフを描画します。
typeでグラフの種類(今回は棒グラフのためbarを指定)、labelsでグラフの横軸の表示ラベル、datasetsでグラフの数値や色を指定します。
今回は割愛しますが、マウスオーバー時のツールチップ表示やグラフの幅など、Chart.jsにはさまざまなプロパティが設定できるようになっているので興味のある方はぜひ調べてみてください。
import { LightningElement } from "lwc"; import { loadScript } from "lightning/platformResourceLoader"; import chartjs from "@salesforce/resourceUrl/chartjsVer442"; //静的リソースからchart.jsファイルをimport export default class ChartComponent extends LightningElement { chart; connectedCallback() { //chart.jsファイルを読み込む loadScript(this, chartjs) .then(() => { this.drawChart(); }) .catch((error) => { console.log(error); }); } //グラフ描画メソッド drawChart() { //Canvasを取得 const ctx = this.template.querySelector("canvas").getContext("2d"); this.chart = new Chart(ctx, { type: "bar", //グラフデータ data: { labels: [ "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" ], datasets: [ { label: "売上高", backgroundColor: "rgb(255, 99, 132)", borderColor: "rgb(255, 99, 132)", data: [ 1000000, 900000, 1300000, 830000, 1000000, 1500000, 2000000, 1000000, 900000, 1300000, 1800000, 2300000 ] } ] } }); } }
chartComponent.js
上記のコードをデプロイして確認してみましょう。
縦軸が売上高、横軸が月の棒グラフを作成することができました。
レコードを用いたグラフの実装
無事グラフをLWCで実装することができました。
ただ、先ほどのグラフはjsに直接売上高の数値を記述してしまっています。
LWCでグラフを表示する場合は、レコードをもとにグラフを作成したいことの方が多いのではないでしょうか。
レコードからデータを取得して、グラフを描画する処理を実装してみましょう。
今回は売上高(AmountOfSales__c)というカスタムオブジェクトのデータを取得して、グラフデータを作成します。
以下の項目値で売上高オブジェクトにレコードを作成します。
ただ、先ほどのグラフはjsに直接売上高の数値を記述してしまっています。
LWCでグラフを表示する場合は、レコードをもとにグラフを作成したいことの方が多いのではないでしょうか。
レコードからデータを取得して、グラフを描画する処理を実装してみましょう。
今回は売上高(AmountOfSales__c)というカスタムオブジェクトのデータを取得して、グラフデータを作成します。
以下の項目値で売上高オブジェクトにレコードを作成します。
月数(Month__c) | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 |
売上高(AmountOfSales__c) | 1200000 | 700000 | 1300000 | 830000 | 1000000 | 1500000 | 2000000 | 1000000 |
9月 | 10月 | 11月 | 12月 | |||||
900000 | 1300000 | 1800000 | 2300000 |
次に、グラフデータの取得をするApexクラスを作成します。
getChartDataメソッドが呼び出されると、売上高レコード取得して、横軸のラベルと売上高の数値データを内部クラスの形でリターンします。
getChartDataメソッドが呼び出されると、売上高レコード取得して、横軸のラベルと売上高の数値データを内部クラスの形でリターンします。
public with sharing class ChartComponentController { //chartのラベルと数値のリストを持った内部クラス public class ChartData { @AuraEnabled public List<String> chartLabels = new List<String>(); @AuraEnabled public List<Decimal> chartDatasets = new List<Decimal>(); } @AuraEnabled public static ChartData getChartData() { ChartData chartData = new ChartData(); //売上高レコードを取得 List<AmountOfSales__c> records = getRecord(); //内部クラスにレコードの情報をセット for (AmountOfSales__c rec : records) { chartData.chartLabels.add(rec.Month__c); chartData.chartDatasets.add(rec.AmountOfSales__c); } return chartData; } private static List<AmountOfSales__c> getRecord() { return [ SELECT Id, AmountOfSales__c, Month__c FROM AmountOfSales__c ORDER BY Month__c ASC ]; } }
ChartComponentController.cls
Apexの作成が終わったら、LWCの修正をしていきます。
先ほど作成したLWCのjsから、新しくApexで作成したgetChartDataメソッドを呼び出すように修正します。
そしてApexから取得したラベル値をdata.labelsに、売上高の数値をdata.datasets.dataに変数としてセットします。
先ほど作成したLWCのjsから、新しくApexで作成したgetChartDataメソッドを呼び出すように修正します。
そしてApexから取得したラベル値をdata.labelsに、売上高の数値をdata.datasets.dataに変数としてセットします。
import { LightningElement } from "lwc"; import { loadScript } from "lightning/platformResourceLoader"; import chartjs from "@salesforce/resourceUrl/chartjsVer442"; //静的リソースからchart.jsファイルをimport import getChartData from "@salesforce/apex/ChartComponentController.getChartData"; export default class ChartComponent extends LightningElement { chart; labels = []; datasets = []; connectedCallback() { //chart.jsファイルを読み込む loadScript(this, chartjs) .then(() => { //Apexからグラフデータを取得 getChartData({}).then((result) => { this.labels = result.chartLabels; //ラベル値を変数に保持 this.datasets = result.chartDatasets; //売上高の数値を変数に保持 this.drawChart(); }); }) .catch((error) => { console.log(error); }); } //グラフ描画メソッド drawChart() { //Canvasを取得 const ctx = this.template.querySelector("canvas").getContext("2d"); this.chart = new Chart(ctx, { type: "bar", //グラフデータ data: { labels: this.labels, //変数を設定 datasets: [ { label: "売上高", backgroundColor: "rgb(255, 99, 132)", borderColor: "rgb(255, 99, 132)", data: this.datasets //変数を設定 } ] } }); } }
chartComponent.js
jsの修正が終わったらデプロイをして完了です。
レコードのデータからグラフが描画できるようになりました。
レコードのデータからグラフが描画できるようになりました。
確認のために、売上高レコードの数値を変更してみましょう。
12月の売上高を2300000 → 500000に変更してみます。
12月の売上高を2300000 → 500000に変更してみます。
グラフ画面を再読み込みすると、無事グラフが変更されていることが確認できました!
おわりに
いかがでしたでしょうか。
今回は単純な棒グラフのみ紹介させていただきましたが、Chart.jsにはまだまだたくさんの機能があります。
この記事がみなさんのChart.js活用の手助けになれば幸いです。
最後までお付き合いいただきありがとうございました。
今回は単純な棒グラフのみ紹介させていただきましたが、Chart.jsにはまだまだたくさんの機能があります。
この記事がみなさんのChart.js活用の手助けになれば幸いです。
最後までお付き合いいただきありがとうございました。
38 件