React + FullCalendarでデフォルト状態から各種プロパティを使ってカスタマイズしていく


はじめまして。GxPのよこがわ（@riki_ykgw）と申します。
この記事は、[グロースエクスパートナーズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/gxp) 17日目の記事です。

私が所属している部では個人の成長を目的とした「GrowthUs」という活動があります。
そこで私が所属しているチームでは[React](https://ja.reactjs.org/docs/getting-started.html)とカレンダーライブラリである[fullCalendar](https://fullcalendar.io/docs/getting-started)を使って1週間の予定を確認できるビューアーを作っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/6ebd6a05-6e4c-1952-3fe4-7bcb598b578c.png)


今回は活動を通じて学んだFullCalendarをReactで使用する場合の各種プロパティの設定方法を紹介していこうと思います。

【追記】FullCalendarに関する新しい[記事](https://qiita.com/riki_ykgw/items/f31e01212e48b70771ec)を公開しました。
こちらも併せて読んでいただけるととてもうれしいです。


# 環境
* fullCalendar v5.8.0
* React v17.0.1

# デフォルトの状態
デフォルトの状態だと以下の状態になります。
英語表記でまっさらな感じですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/ec7d393b-064a-7ffe-9ef6-6c92086d3edc.png)

コード上ではこんな感じ

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
/>
```

# プロパティについて

ここから様々なプロパティについてご紹介していこうと思います。プロパティを追加で設定することで表示のカスタマイズを行うことができます。
今回は以下について触れていきます

* [locale](https://fullcalendar.io/docs/locale)
* [allDayText](https://fullcalendar.io/docs/v4/allDayText)
* [allDaySlot](https://fullcalendar.io/docs/allDaySlot)
* [businessHours](https://fullcalendar.io/docs/businessHours)
* [slotMinTime](https://fullcalendar.io/docs/slotMinTime)
* [slotMaxTime](https://fullcalendar.io/docs/slotMaxTime)
* [contentHeight](https://fullcalendar.io/docs/contentHeight)


## locale
まずは言語の設定。`locale="XX"`と指定します。
日本語の場合は以下。もし韓国語にしたい場合は`locale="ko"`としてください。

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語 
/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/604b9627-c876-b491-acd3-3677d1bb738c.png)

## allDayText
上記では終日予定を表示する「all-day」という項目が英語のままですよね。
ここのテキストを変更したい場合は以下。

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語
  allDayText="終日" //ここに表示させたいテキストを記載する
/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/54146da3-ec77-8d71-2f41-cdb2f17d094c.png)

「all-day」が「終日」に変わりましたね。

## allDaySlot
もし終日予定の表示自体いらない場合は以下
`allDaySlot={false} `と指定します。

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語
  allDaySlot={false} // alldayの表示設定。trueとすれば表示される
/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/142e7b82-f856-b4cf-ec56-107aca107081.png)
終日予定の項目がなくなりましたね。

## businessHours
次に例えば土日や朝早くの時間はグレーアウトさせたいというときです。
そんな時は`businessHours`を使います。`businessHours`では指定した日時以外がグレーアウトで表示されます。

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語
  allDaySlot={false} // alldayの表示設定。trueとすれば表示される
  businessHours={{
   daysOfWeek: [1, 2, 3, 4, 5],
   startTime: "07:00",
   endTime: "22:00",
  }} 
/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/9b2883e9-bc84-e1e1-f5a6-dc91ab51a80a.png)
指定した日時以外がグレーアウトされました。

`businessHours`の中の設定を簡単に説明します。
まずは日にちの指定を`daysOfWeek`で行います。
`daysOfWeek: [1, 2, 3, 4, 5]`
表示されている左端の日付が0となっているため、平日を指定したい場合は上記のようになります。

時間の指定は以下のように`startTime`と`endTime`で設定します。
`startTime: "07:00", endTime: "22:00"`
上記で指定した時間以外がグレーアウトされます。


## slotMinTimeとslotMaxTime
`businessHours`の設定をしたら、もはやグレーアウトにしている時間は表示する必要ないのでは？と思った方へ。

そんな時は`slotMinTime`と`slotMaxTime`を使います。
`slotMinTime`には表示範囲の開始時間を、`slotMaxTime`には終了時間を設定します。

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語
  allDaySlot={false} // alldayの表示設定。trueとすれば表示される
  businessHours={{
   daysOfWeek: [1, 2, 3, 4, 5],
   startTime: "07:00",
   endTime: "22:00",
  }}
  slotMinTime="06:00:00" //時間の表示範囲start
  slotMaxTime="23:00:00" //時間の表示範囲end
/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/add4f888-9e3e-b9ba-fc2a-aef909153cdb.png)
表示が6時から23時までになりましたね。
しかし画面の大きさによっては私のように表示下部が大きく余ってしまいます。

## contentHeight
そんな時は`contentHeight={'auto'}`を設定します。こうすることでカレンダーの高さをいい感じで調整してくれます。

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語
  allDaySlot={false} // alldayの表示設定。trueとすれば表示される
  businessHours={{
   daysOfWeek: [1, 2, 3, 4, 5],
   startTime: "07:00",
   endTime: "22:00",
  }}
  slotMinTime="06:00:00" //時間の表示範囲start
  slotMaxTime="23:00:00" //時間の表示範囲end
  contentHeight={'auto'} //カレンダーの高さ指定、下部の余りがなくなる
/>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/bf7e1d57-428c-4813-05db-9e0df901ade4.png)
下部の表示が余っていた部分がなくなりました。

高さを任意の値で指定した場合は以下のように指定します。
800pxの場合
`contentHeight={'800px'}`

```react:App.js
<FullCalendar
  plugins={[timeGridPlugin]}
  locale="ja" // 日本語
  allDaySlot={false} // alldayの表示設定。trueとすれば表示される
  businessHours={{
   daysOfWeek: [1, 2, 3, 4, 5],
   startTime: "07:00",
   endTime: "22:00",
  }}
  slotMinTime="06:00:00" //時間の表示範囲start
  slotMaxTime="23:00:00" //時間の表示範囲end
  contentHeight={'800px'} //任意の高さに設定
/>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357426/0afa6f4d-1b4c-6fb4-8c05-9bdb1725d500.png)

800pxにすると高さが低くなりスクロールバーが表示されるようになりました。



# さいごに
今回はカレンダーの土台となる部分の表示についてご紹介しました。今回紹介した設定だけでもだいぶカレンダーらしい感じになったと個人的には感じます。
ほかにも様々なカスタマイズが可能ですので、今後は今回の続き＋イベントの登録やイベントをクリックしたときの処理などに関する記事が書ければと思っております。

# 参考資料
[公式ドキュメント](https://fullcalendar.io/docs#toc)