🗓️

カレンダーアプリを作る(フロントエンド編③)

に公開

こちらの記事は前回の続きになります。
機能要件最後の

  • 削除ボタンを押すと予定が削除される

を実装していきます。

実装

実装1 削除ボタンを作成する。

まず、どのタイミングで削除するかですが、このアプリケーションでは、編集フォームを開くと、そこに削除ボタンがあり、編集OR削除ができるようにしたいと思います。
そうすることで、編集フォームを開く(=カレンダー上で登録済みのスケジュールを選択する)時にスケジュールのIDを取得することができます。

export const EditScheduleForm = (props: any) => {
  ...

  const onDeleteEvent = () =>{
   console.log(eventsId)
  }
  return (
    <div>
      <ScheduleForm
        allDay={{ isAllDay, setIsAllDay }}
        title={{ eventsTitle, setEventsTitle }}
        startDate={{ eventsStartDate, setEventsStartDate }}
        startTime={{ eventsStartTime, setEventsStartTime }}
        endDate={{ eventsEndDate, setEventsEndDate }}
        endTime={{ eventsEndTime, setEventsEndTime }}
        format={format}
        clickEvent={onEditEvent}
      />
      <Button onClick={onDeleteEvent}>削除</Button>
    </div>
  );
};

削除ボタンを押すと選択しているスケジュールのIDを取得できるようになりました。

実装2 スケジュールを削除する機能を実装する

最後にスケジュールをカレンダーから削除する機能を実装します。
こちらは簡単で、filterメソッドを使い、消したいスケジュールのIDと一致しないものを残してらたな配列を作成し、setMyEventsを更新します。

export const EditScheduleForm = (props: any) => {
  ...

  const onDeleteEvent = () =>{
    setMyEvents((prevEvent: any) =>
      prevEvent.filter((event: any) => event.id !== eventsId)
    );
  }
  return (
    <div>
      <ScheduleForm
      ...
  );
};

これで要件にあった機能は全て実装しました。

実装3 型定義

最後に型を定義していきます。
カスタムフック内で使う型と、フォームコンポーネント内で使う型を定義しました。
それぞれの型をセットすれば完了です。

// /src/components/Calendar/types/hooks.ts
import { EventImpl } from "@fullcalendar/core/internal";

export type MyEventsType = {
  id: string;
  title: string;
  allDay: boolean;
  start: Date | undefined;
  end: Date | undefined;
};

export type SelectEventType = {
  start: Date;
  end: Date;
  startStr: string;
  endStr: string;
  allDay: boolean;
  jsEvent: MouseEvent | null;
  view: unknown;
};

export type EventClickArg = {
  el: HTMLElement;
  event: EventImpl;
  jsEvent: MouseEvent;
  view: unknown;
};
// /src/components/Calendar/types/form.ts

import { Dispatch, SetStateAction } from "react";

export type ScheduleFormProps = {
  clickEvent: () => void;
  title: {
    eventsTitle: string;
    setEventsTitle: Dispatch<SetStateAction<string>>;
  };
  allDay: {
    isAllDay: boolean;
    setIsAllDay: Dispatch<SetStateAction<boolean>>;
  };
  startDate: {
    eventsStartDate: Date | undefined;
    setEventsStartDate: Dispatch<SetStateAction<Date | undefined>>;
  };
  startTime: {
    eventsStartTime: string;
    setEventsStartTime: Dispatch<SetStateAction<string>>;
  };
  endDate: {
    eventsEndDate: Date | undefined;
    setEventsEndDate: Dispatch<SetStateAction<Date | undefined>>;
  };
  endTime: {
    eventsEndTime: string;
    setEventsEndTime: Dispatch<SetStateAction<string>>;
  };
  format: (date: Date | undefined) => string | undefined;
};

export type EditScheduleFormProps = {
  title: {
    eventsTitle: string;
    setEventsTitle: Dispatch<SetStateAction<string>>;
  };
  allDay: {
    isAllDay: boolean;
    setIsAllDay: Dispatch<SetStateAction<boolean>>;
  };
  startDate: {
    eventsStartDate: Date | undefined;
    setEventsStartDate: Dispatch<SetStateAction<Date | undefined>>;
  };
  startTime: {
    eventsStartTime: string;
    setEventsStartTime: Dispatch<SetStateAction<string>>;
  };
  endDate: {
    eventsEndDate: Date | undefined;
    setEventsEndDate: Dispatch<SetStateAction<Date | undefined>>;
  };
  endTime: {
    eventsEndTime: string;
    setEventsEndTime: Dispatch<SetStateAction<string>>;
  };
  format: (date: Date | undefined) => string | undefined;
  onEditEvent: () => void;
  onDeleteEvent: () => void;
};

完成

デザイン等を整えて最終的には以下のようになりました。

これにてフロントエンドの実装は一旦以上になります。
ですが、現状のままだとデータを保持しておくことができないため、バックエンドを構築し、データCRUD処理をできるようにしていきます。
カレンダーアプリを作る(バックエンド編)では、DockerでNest.js+Prisma+MySQLの環境構築をし、カレンダーデータの保存をできるようにしたいと思います。

Create Quest.Inc Tech Blog

Discussion