Aura コンポーネントで Chart.js を使ってみる

今回は、 Lightning（Aura） コンポーネントから [Chart.js](https://www.chartjs.org/) ライブラリを読み込んでグラフを表示するコンポーネントを作ってみます。



## Chart.js ライブラリをアップロード
Aura フレームワークでサードパーティのライブラリを読み込む際は、必要なライブラリを全て静的リソースにアップロードしておく必要があります。

まずは以下の様に、Chart.min.js と Chart.min.css を抜き出し圧縮しておきます。
(必要であればその他のライブラリも全て追加しておきます)

<img width="320" alt="Screen Shot 2019-07-09 at 10.41.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/70e81330-eafb-b0dd-3701-ea9ca562d1a0.png">

その後、セールスフォース上で `設定 > カスタムコード > 静的リソース > 新規` から静的リソースをアップロードします。

<img width="320" alt="Screen Shot 2019-07-09 at 10.41.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/9999d38a-66da-0270-ee50-1359a0b534bb.png">
`ファイル` には上で作成した圧縮ファイルを指定します。

## Aura コンポーネントのサンプル

[Chart.js のドキュメント](https://www.chartjs.org/docs/latest/) にあるサンプルコードを Aura コンポーネントで再現してみました。
<img width="320" alt="Screen Shot 2019-07-09 at 10.41.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/eb8cf564-4a63-80a8-5144-dd2af71b1a2f.png">


```html:ChartjsExample.cmp
<aura:component access="global" implements="flexipage:availableForAllPageTypes" >
    
    <!-- External Libraries -->
    <!-- グラフの初期化処理には js ファイルの読み込み完了を待つ必要があるので、              -->
    <!-- js ファイルに対する ltng:require にのみ afterScriptsLoaded ハンドラーを指定する -->
    <ltng:require styles="{!$Resource.ChartJSAsset + '/css/Chart.min.css'}"  />
    <ltng:require scripts="{!$Resource.ChartJSAsset + '/js/Chart.min.js'}" 
                  afterScriptsLoaded="{!c.onAfterScriptsLoaded}"/>
    
    <!-- User Inteface -->
    <div>
        <div class="slds-box slds-theme_default">
            <div class="chart-container" >
                <canvas aura:id="canvas" ></canvas>
            </div>
        </div>
    </div>
</aura:component>
```

```js:ChartjsExampleController.js
({
    onAfterScriptsLoaded : function(c, e, h) {

        // cnavas 要素の取得には aura:id 属性をキーとして、コンポーネントに対し .find 関数を利用する
        const ctx = c.find('canvas').getElement().getContext('2d');

        const myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                datasets: [{
                    label: '# of Votes',
                    data: [12, 19, 3, 5, 2, 3],
                    backgroundColor: [
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(255, 206, 86, 0.2)',
                        'rgba(75, 192, 192, 0.2)',
                        'rgba(153, 102, 255, 0.2)',
                        'rgba(255, 159, 64, 0.2)'
                    ],
                    borderColor: [
                        'rgba(255, 99, 132, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(255, 206, 86, 1)',
                        'rgba(75, 192, 192, 1)',
                        'rgba(153, 102, 255, 1)',
                        'rgba(255, 159, 64, 1)'
                    ],
                    borderWidth: 1
                }]
            },
            options: {
                scales: {
                    yAxes: [{
                        ticks: {
                            beginAtZero: true
                        }
                    }]
                }
            }
        });
    }
})
```