ジャコ Lab

プログラミング関連のメモ帳的ブログです

【FullCalendar x React】ユーザーアクションをできるようにする

カレンダーに予定を入れる

FullCalendar の続きです

今日は React の FullCalendar で、カレンダーに予定を登録できるようにしていきます

カレンダーの日付を選択する方法

FullCalendar の Props に select というものがあるので、そこにイベントハンドラーを登録すれば良いのかと思いきや、やることが3個ありました。

  1. interaction プラグインを設定する
  2. selectable Props を true にする
  3. select Props でイベントをハンドリングする

fullcalendar.io

Selectable Calendar
Selectable Calendar

1. interaction プラグインを設定する

interaction プラグインを有効にするには、追加のモジュールが必要になります。

$ yarn add @fullcalendar/interaction
+ import interactionPlugin from '@fullcalendar/interaction'

  export const Calendar = () => {
    return (
      <Box sx={{ width: '100%' }}>
        <FullCalendar
-         plugins={[dayGridPlugin]}
+         plugins={[dayGridPlugin, interactionPlugin]}

2. selectable Props を true にする

  import interactionPlugin from '@fullcalendar/interaction'

  export const Calendar = () => {
    return (
      <Box sx={{ width: '100%' }}>
        <FullCalendar
          plugins={[dayGridPlugin, interactionPlugin]}
+         selectable={true}

3. select Props でイベントをハンドリングする

  import interactionPlugin from '@fullcalendar/interaction'

  export const Calendar = () => {
+   const handleDateSelect = (args: DateSelectArg) => {
+     alert(`START: ${args.start}\nEND: ${args.end}`)
+   }

    return (
      <Box sx={{ width: '100%' }}>
        <FullCalendar
          plugins={[dayGridPlugin, interactionPlugin]}
          selectable={true}
+         select={handleDateSelect}

イベントを登録する

handleDateSelectのメソッドを改造していきます。
  const handleDateSelect = (args: DateSelectArg) => {
-   alert(`START: ${args.start}\nEND: ${args.end}`)
+   const title = prompt('予定のタイトルを入力してください')
+   const calendarInstance= args.view.calendar
+
+   calendarInstance.unselect()
+   if (title) {
+     calendarInstance.addEvent({
+       title,
+       start: args.startStr,
+       end: args.endStr,
+       allDay: args.allDay,
+     })
+   }
  }

凄く簡易的ですが、window.prompt() を利用し、ユーザー入力値を得ます。

FullCalendar の calendar instance を用いてイベントの追加を行います。内容は「ユーザー入力値」に加え「選択した日付情報」を使います。

予定を登録する
予定を登録する

現時点での問題点を発見

一枠が長くなる
一枠が長くなる

これはこれで良いのかもしれませんが、なんとなく カレンダーの日付1枠は 4:3 などの綺麗な四角を保っていてほしい です。

まとめ

選択をハンドリングできてしまえばこっちのもんですね!独自のダイアログを出したりなんでもできそうです。明日は登録したイベントを消したり編集したりしたいですね。