React + FullCalendarでカレンダーアプリを作るためのカスタマイズ例

こんにちは。今回はReactとFullCalendarでカレンダーアプリを作っていく際のカスタマイズ方法を紹介していきます。
前回もFullCalendarに関する[記事](https://qiita.com/riki_ykgw/items/c3f7d27aefd136381139)を書いているので併せて読んでいただけるととてもうれしいです。

# 環境
fullCalendar v5.8.0
React v17.0.1

# 今回紹介するプロパティ

* [titleFormat](https://fullcalendar.io/docs/titleFormat)
* [headerToolbar](https://fullcalendar.io/docs/headerToolbar)
* [buttonText](https://fullcalendar.io/docs/buttonText)
* [customButtons](https://fullcalendar.io/docs/customButtons)
* [stickyHeaderDates](https://fullcalendar.io/docs/stickyHeaderDates)

# titleFormat
titleFormatは左上に表示されている日付の表記の設定をすることができます。
locateに日本語を設定している場合デフォルトではこのような状態です。
titleFortamtにはこのような設定が当たっています。
`titleFormat={{year: 'numeric', month: 'short', day: 'numeric'}}`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/5d0e294d-8913-5d34-d991-45b5f66f4545.png)


早速変更してみたいと思いますが、`year`、`mounth`、`day`にはあらかじめ設定できる表記が決まっています。
yearとdayは`numeric`か`2-digit`のみ設定することが可能です。
2-digitとは2桁という意味です。

```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  titleFormat={{year: '2-digit', month: 'short', day: '2-digit'}}
/>
```
上記のように記述すると以下のようになります。
年が2桁表記になり、日付が1桁の場合も0埋めされて2桁表記となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/5e12936b-3fb2-2724-d232-93abbedebdaf.png)

続いて`month`です。monthには以下の設定をすることが可能です。

* short
* 2-digit
* long
* numeric
* narrow

デフォルトはshortです。また、2-digitは先ほどの日付と同じく0埋めされて表示されます。

`long`は以下のようになります。
英語表記だと省略されずに`June`と表記されます。shortだと3文字表記の`Jun`になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/f310ba6b-b5dd-96fc-3f40-3c8b47c77189.png)

`numeric`は以下のようになります。六月が英語ではなく数字の「6」で表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/2e5f3730-09f0-f761-cc0f-85b85287782a.png)

`narrow`だと以下のようになります。1文字表記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/cacfa5bf-909a-e9c0-83a7-7ed5b3d8551c.png)

# headerToolbar
headerToolbarはカレンダーの上部にあるボタンとタイトルを定義することができます。
デフォルトでは以下のようになっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/f9842347-5713-e72e-ec38-83c277f0b0ca.png)


コード上は以下の設定が反映されており、画面上左からstart,center,endに設定した内容が表示されていきます。
なので年月日を真ん中に表示したい場合はcenterに`title`を設定すれば真ん中に表示されます。
また、ここはleft,center,rightと書くこともできます。
そして、スペースで区切ると間が空き、カンマで区切るとボタンが接続して表示されます。
todayボタンと「<>」ボタンの関係性が参考になると思います。


```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  titleFormat={{year: 'numeric', month: 'short', day: 'numeric'}}
  // 以下headerToolbarの設定
  headerToolbar={{
      start: 'title', // leftと書いてもよい
      center: '',
      end: 'today prev,next' 
  }}
/>
```

headerToolbarの表示をしたくない場合は`false`を設定するとheaderToolbar自体が表示されなくなります。
```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  titleFormat={{year: '2-digit', month: 'short', day: '2-digit'}}
  // 以下headerToolbarの設定
  headerToolbar={false}
/>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/8d875ebc-9145-ef47-17ae-87c6b7d9eda7.png)

# buttonText
buttonTextはheaderToolbarのボタンに表示されるテキストを設定することができます。今回は紹介していませんがfooterToolbarのボタンに表示されるテキストにも反映されます。
デフォルトでは以下のようになっていますので、例えば`today:'today'`となっているのを`today:'今日'`とするとボタンのテキストが`今日`と表示されます。
```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  titleFormat={{year: '2-digit', month: 'short', day: '2-digit'}}
  // 以下headerToolbarの設定
  headerToolbar={false}
  // 以下buttonTextの設定
  buttonText={{
      today:'today',
      month:'month',
      week:'week',
      day:'day',
  }}
/>
```

```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  titleFormat={{year: '2-digit', month: 'short', day: '2-digit'}}
  // 以下headerToolbarの設定
  headerToolbar={false}
  // 以下buttonTextの設定
  buttonText={{
      today:'今日', // 「今日」に変更
      month:'month',
      week:'week',
      day:'day',
  }}
/>
```
上記のように記載するとこのようにボタンのテキストを変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/5db6ab35-c979-5dca-2b66-27af11f1ce26.png)

# customButtons
customButtonsはheaderToolbar/footerToolbarで使用できるオリジナルのボタンを定義することができます。
customButtonsを設定するには以下のように書きます。`text`に画面に表示するテキストを設定し、`click`にonclickのイベントを設定することができます。
そして設定したカスタムボタンをheaderToolbarに設定し画面に表示させます。


```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  titleFormat={{year: '2-digit', month: 'short', day: '2-digit'}}
  // 以下headerToolbarの設定
  headerToolbar={{
      start: 'title', // leftと書いてもよい
      center: 'myCustomButton', // 下で定義したカスタムボタンを設定する
      end: 'today prev,next' 
  }}
  // 以下buttonTextの設定
  buttonText={{
      today:'今日', // 「今日」に変更
      month:'month',
      week:'week',
      day:'day',
  }}
  // 以下customButtonsの設定
  customButtons={{
      myCustomButton: { // カスタムボタンの名前
          text: 'カスタムボタン!', // 画面に表示されるテキスト
          click: function() { // クリックイベントを設定できる
              alert('clicked the custom button!');
          }
      }
  }}
/>
```
以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/c09b5227-dfd5-bcff-b641-00102df4f2db.png)

カスタムボタン！を押下すると、設定したイベントが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/0a0e9be4-0a78-f74f-5462-ff15df9fd462.png)

# stickyHeaderDates
最後にstickyHeaderDatesです。これはスクロール中にカレンダーの上部にある日付ヘッダーを固定するかどうかの設定をすることができます。
以下のように設定します。

```React:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
  stickyHeaderDates={true} // stickyHeaderDatesにtrueを設定する
/>
```
このようにスクロールしても日付欄が固定で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/5e1095bb-8f57-d2cd-2e90-daa11a717ba8.png)