From e0212d510928e5e95d3ba75e391c34714f1bb035 Mon Sep 17 00:00:00 2001 From: doprz <52579214+doprz@users.noreply.github.com> Date: Wed, 6 Mar 2024 15:09:01 -0600 Subject: [PATCH] feat: add Calendar Component --- .../components/calendar/Calendar.stories.tsx | 23 +++++ .../CalendarBottomBar.stories.tsx | 4 +- .../{ => calendar}/CalendarCourse.stories.tsx | 2 +- .../CalendarCourseCell.stories.tsx | 4 +- .../{ => calendar}/CalendarGrid.stories.tsx | 92 +++++++++---------- .../CalendarGridCell.stories.tsx | 2 +- .../{ => calendar}/CalendarHeader.stories.tsx | 2 +- .../CalendarSchedules.stories.tsx | 2 +- .../components/calendar/Calendar/Calendar.tsx | 40 ++++++++ .../CalendarBottomBar/CalendarBottomBar.tsx | 6 +- .../CalendarGrid/CalendarGrid.module.scss | 12 +-- .../calendar/CalendarGrid/CalendarGrid.tsx | 36 +++----- 12 files changed, 141 insertions(+), 84 deletions(-) create mode 100644 src/stories/components/calendar/Calendar.stories.tsx rename src/stories/components/{ => calendar}/CalendarBottomBar.stories.tsx (96%) rename src/stories/components/{ => calendar}/CalendarCourse.stories.tsx (97%) rename src/stories/components/{ => calendar}/CalendarCourseCell.stories.tsx (97%) rename src/stories/components/{ => calendar}/CalendarGrid.stories.tsx (57%) rename src/stories/components/{ => calendar}/CalendarGridCell.stories.tsx (92%) rename src/stories/components/{ => calendar}/CalendarHeader.stories.tsx (89%) rename src/stories/components/{ => calendar}/CalendarSchedules.stories.tsx (98%) create mode 100644 src/views/components/calendar/Calendar/Calendar.tsx diff --git a/src/stories/components/calendar/Calendar.stories.tsx b/src/stories/components/calendar/Calendar.stories.tsx new file mode 100644 index 000000000..beda65e2c --- /dev/null +++ b/src/stories/components/calendar/Calendar.stories.tsx @@ -0,0 +1,23 @@ +import { Meta, StoryObj } from '@storybook/react'; +import { Calendar } from 'src/views/components/calendar/Calendar/Calendar'; + +const meta = { + title: 'Components/Calendar/Calendar', + component: Calendar, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], + argTypes: { + + }, +} satisfies Meta; +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + + }, +}; \ No newline at end of file diff --git a/src/stories/components/CalendarBottomBar.stories.tsx b/src/stories/components/calendar/CalendarBottomBar.stories.tsx similarity index 96% rename from src/stories/components/CalendarBottomBar.stories.tsx rename to src/stories/components/calendar/CalendarBottomBar.stories.tsx index 1ee78750a..e75f941df 100644 --- a/src/stories/components/CalendarBottomBar.stories.tsx +++ b/src/stories/components/calendar/CalendarBottomBar.stories.tsx @@ -3,7 +3,7 @@ import { Meta, StoryObj } from '@storybook/react'; import { Course, Status } from '@shared/types/Course'; import Instructor from '@shared/types/Instructor'; import { CalendarBottomBar } from 'src/views/components/calendar/CalendarBottomBar/CalendarBottomBar'; -import { getCourseColors } from '../../shared/util/colors'; +import { getCourseColors } from '../../../shared/util/colors'; const exampleGovCourse: Course = new Course({ courseName: 'Nope', @@ -66,7 +66,7 @@ const examplePsyCourse: Course = new Course({ }); const meta = { - title: 'Components/Common/CalendarBottomBar', + title: 'Components/Calendar/CalendarBottomBar', component: CalendarBottomBar, parameters: { layout: 'centered', diff --git a/src/stories/components/CalendarCourse.stories.tsx b/src/stories/components/calendar/CalendarCourse.stories.tsx similarity index 97% rename from src/stories/components/CalendarCourse.stories.tsx rename to src/stories/components/calendar/CalendarCourse.stories.tsx index 43cd032eb..430663031 100644 --- a/src/stories/components/CalendarCourse.stories.tsx +++ b/src/stories/components/calendar/CalendarCourse.stories.tsx @@ -6,7 +6,7 @@ import Instructor from '@shared/types/Instructor'; import CalendarCourse from 'src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting'; const meta = { - title: 'Components/Common/CalendarCourseMeeting', + title: 'Components/Calendar/CalendarCourseMeeting', component: CalendarCourse, parameters: { layout: 'centered', diff --git a/src/stories/components/CalendarCourseCell.stories.tsx b/src/stories/components/calendar/CalendarCourseCell.stories.tsx similarity index 97% rename from src/stories/components/CalendarCourseCell.stories.tsx rename to src/stories/components/calendar/CalendarCourseCell.stories.tsx index cc3ae3aa4..8df4d9fd1 100644 --- a/src/stories/components/CalendarCourseCell.stories.tsx +++ b/src/stories/components/calendar/CalendarCourseCell.stories.tsx @@ -3,10 +3,10 @@ import { getCourseColors } from '@shared/util/colors'; import { Meta, StoryObj } from '@storybook/react'; import CalendarCourseCell from 'src/views/components/calendar/CalendarCourseCell/CalendarCourseCell'; import React from 'react'; -import { exampleCourse } from './PopupCourseBlock.stories'; +import { exampleCourse } from '../PopupCourseBlock.stories'; const meta = { - title: 'Components/Common/CalendarCourseCell', + title: 'Components/Calendar/CalendarCourseCell', component: CalendarCourseCell, parameters: { layout: 'centered', diff --git a/src/stories/components/CalendarGrid.stories.tsx b/src/stories/components/calendar/CalendarGrid.stories.tsx similarity index 57% rename from src/stories/components/CalendarGrid.stories.tsx rename to src/stories/components/calendar/CalendarGrid.stories.tsx index 4a8a3cfa5..638d816be 100644 --- a/src/stories/components/CalendarGrid.stories.tsx +++ b/src/stories/components/calendar/CalendarGrid.stories.tsx @@ -5,8 +5,8 @@ import { CalendarGridCourse } from '@views/hooks/useFlattenedCourseSchedule'; import { Status } from '@shared/types/Course'; const meta = { - title: 'Components/Common/Calendar', - component: Calendar, + title: 'Components/Calendar/CalendarGrid', + component: CalendarGrid, parameters: { // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout layout: 'centered', @@ -60,56 +60,56 @@ const testData: CalendarGridCourse[] = [ }, }, { - calendarGridPoint: { - dayIndex: 4, - startIndex: 10, - endIndex: 11, - }, - componentProps: { - courseDeptAndInstr: 'Course 1', - timeAndLocation: '9:00 AM - 10:00 AM, Room 101', - status: Status.OPEN, - colors: getCourseColors('emerald', 500), - }, + calendarGridPoint: { + dayIndex: 4, + startIndex: 10, + endIndex: 11, + }, + componentProps: { + courseDeptAndInstr: 'Course 1', + timeAndLocation: '9:00 AM - 10:00 AM, Room 101', + status: Status.OPEN, + colors: getCourseColors('emerald', 500), + }, }, { - calendarGridPoint: { - dayIndex: 1, - startIndex: 10, - endIndex: 12, - }, - componentProps: { - courseDeptAndInstr: 'Course 2', - timeAndLocation: '10:00 AM - 11:00 AM, Room 102', - status: Status.CLOSED, - colors: getCourseColors('emerald', 500), - }, + calendarGridPoint: { + dayIndex: 1, + startIndex: 10, + endIndex: 12, + }, + componentProps: { + courseDeptAndInstr: 'Course 2', + timeAndLocation: '10:00 AM - 11:00 AM, Room 102', + status: Status.CLOSED, + colors: getCourseColors('emerald', 500), + }, }, { - calendarGridPoint: { - dayIndex: 1, - startIndex: 10, - endIndex: 12, - }, - componentProps: { - courseDeptAndInstr: 'Course 3', - timeAndLocation: '10:00 AM - 11:00 AM, Room 102', - status: Status.CLOSED, - colors: getCourseColors('emerald', 500), - }, + calendarGridPoint: { + dayIndex: 1, + startIndex: 10, + endIndex: 12, + }, + componentProps: { + courseDeptAndInstr: 'Course 3', + timeAndLocation: '10:00 AM - 11:00 AM, Room 102', + status: Status.CLOSED, + colors: getCourseColors('emerald', 500), + }, }, { - calendarGridPoint: { - dayIndex: 1, - startIndex: 10, - endIndex: 12, - }, - componentProps: { - courseDeptAndInstr: 'Course 4', - timeAndLocation: '10:00 AM - 11:00 AM, Room 102', - status: Status.CLOSED, - colors: getCourseColors('emerald', 500), - }, + calendarGridPoint: { + dayIndex: 1, + startIndex: 10, + endIndex: 12, + }, + componentProps: { + courseDeptAndInstr: 'Course 4', + timeAndLocation: '10:00 AM - 11:00 AM, Room 102', + status: Status.CLOSED, + colors: getCourseColors('emerald', 500), + }, }, ]; diff --git a/src/stories/components/CalendarGridCell.stories.tsx b/src/stories/components/calendar/CalendarGridCell.stories.tsx similarity index 92% rename from src/stories/components/CalendarGridCell.stories.tsx rename to src/stories/components/calendar/CalendarGridCell.stories.tsx index 1b1cbbfcc..067e134e7 100644 --- a/src/stories/components/CalendarGridCell.stories.tsx +++ b/src/stories/components/calendar/CalendarGridCell.stories.tsx @@ -4,7 +4,7 @@ import CalendarCell from 'src/views/components/calendar/CalendarGridCell/Calenda import type { Meta, StoryObj } from '@storybook/react'; const meta = { - title: 'Components/Common/CalendarGridCell', + title: 'Components/Calendar/CalendarGridCell', component: CalendarCell, parameters: { // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout diff --git a/src/stories/components/CalendarHeader.stories.tsx b/src/stories/components/calendar/CalendarHeader.stories.tsx similarity index 89% rename from src/stories/components/CalendarHeader.stories.tsx rename to src/stories/components/calendar/CalendarHeader.stories.tsx index cd715035d..1a2a71319 100644 --- a/src/stories/components/CalendarHeader.stories.tsx +++ b/src/stories/components/calendar/CalendarHeader.stories.tsx @@ -3,7 +3,7 @@ import { Meta, StoryObj } from '@storybook/react'; import CalendarHeader from 'src/views/components/calendar/CalendarHeader/CalenderHeader'; const meta = { - title: 'Components/Common/CalendarHeader', + title: 'Components/Calendar/CalendarHeader', component: CalendarHeader, parameters: { layout: 'centered', diff --git a/src/stories/components/CalendarSchedules.stories.tsx b/src/stories/components/calendar/CalendarSchedules.stories.tsx similarity index 98% rename from src/stories/components/CalendarSchedules.stories.tsx rename to src/stories/components/calendar/CalendarSchedules.stories.tsx index ccd13b4c0..86b018268 100644 --- a/src/stories/components/CalendarSchedules.stories.tsx +++ b/src/stories/components/calendar/CalendarSchedules.stories.tsx @@ -8,7 +8,7 @@ import Instructor from 'src/shared/types/Instructor'; import { CalendarSchedules } from 'src/views/components/calendar/CalendarSchedules/CalendarSchedules'; const meta = { - title: 'Components/Common/CalendarSchedules', + title: 'Components/Calendar/CalendarSchedules', component: CalendarSchedules, parameters: { layout: 'centered', diff --git a/src/views/components/calendar/Calendar/Calendar.tsx b/src/views/components/calendar/Calendar/Calendar.tsx new file mode 100644 index 000000000..bc6411887 --- /dev/null +++ b/src/views/components/calendar/Calendar/Calendar.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import CalendarHeader from 'src/views/components/calendar/CalendarHeader/CalenderHeader'; +import { CalendarBottomBar } from '../CalendarBottomBar/CalendarBottomBar'; +import { CalendarSchedules } from '../CalendarSchedules/CalendarSchedules'; +import ImportantLinks from '../ImportantLinks'; +import CalendarGrid from '../CalendarGrid/CalendarGrid'; + +export const flags = ['WR', 'QR', 'GC', 'CD', 'E', 'II']; + +interface Props { + label: string; +} + +/** + * A reusable chip component that follows the design system of the extension. + * @returns + */ +export function Calendar(): JSX.Element { + return ( + <> + +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+
+ + ); +} diff --git a/src/views/components/calendar/CalendarBottomBar/CalendarBottomBar.tsx b/src/views/components/calendar/CalendarBottomBar/CalendarBottomBar.tsx index 8bf5962b9..d80aa3d7f 100644 --- a/src/views/components/calendar/CalendarBottomBar/CalendarBottomBar.tsx +++ b/src/views/components/calendar/CalendarBottomBar/CalendarBottomBar.tsx @@ -7,20 +7,20 @@ import ImageIcon from '~icons/material-symbols/image'; import CalendarMonthIcon from '~icons/material-symbols/calendar-month'; type CalendarBottomBarProps = { - courses: CalendarCourseCellProps[]; + courses?: CalendarCourseCellProps[]; }; /** * */ export const CalendarBottomBar = ({ courses }: CalendarBottomBarProps): JSX.Element => { - if (courses.length === -1) console.log('foo'); // dumb line to make eslint happy + if (courses?.length === -1) console.log('foo'); // dumb line to make eslint happy return (
Async. and Other:
- {courses.map(course => ( + {courses?.map(course => ( -
- {/* Displaying the rest of the calendar */} -
-
- {/* Displaying day labels */} -
- {daysOfWeek.map(day => ( -
- {day} -
- ))} - {grid.map((row, rowIndex) => row)} - {accountForCourseConflicts(courseCells)} - {/* courseCells.map((block: CalendarGridCourse) => ( +
+ {/* Displaying day labels */} +
+ {daysOfWeek.map(day => ( +
+ {day} +
+ ))} + {grid.map((row, rowIndex) => row)} + {courseCells ? accountForCourseConflicts(courseCells) : null} + {/* courseCells.map((block: CalendarGridCourse) => (
)) */} -
-
); } @@ -195,8 +189,8 @@ function accountForCourseConflicts(courseCells: CalendarGridCourse[]): JSX.Eleme style={{ gridColumn: `${block.calendarGridPoint.dayIndex + 1}`, gridRow: `${block.calendarGridPoint.startIndex + 1} / ${block.calendarGridPoint.endIndex + 1}`, - width: `calc(100% / ${block.totalColumns})`, - marginLeft: `calc(100% * ${(block.gridColumnStart - 1) / block.totalColumns})`, + width: `calc(100% / ${block.totalColumns})`, + marginLeft: `calc(100% * ${(block.gridColumnStart - 1) / block.totalColumns})`, padding: '0px 10px 4px 0px', }} >