feat: add Calendar Component

This commit is contained in:
doprz
2024-03-06 15:09:01 -06:00
parent 152bc45776
commit e0212d5109
12 changed files with 141 additions and 84 deletions

View File

@@ -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<typeof Calendar>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {
args: {
},
};

View File

@@ -3,7 +3,7 @@ import { Meta, StoryObj } from '@storybook/react';
import { Course, Status } from '@shared/types/Course'; import { Course, Status } from '@shared/types/Course';
import Instructor from '@shared/types/Instructor'; import Instructor from '@shared/types/Instructor';
import { CalendarBottomBar } from 'src/views/components/calendar/CalendarBottomBar/CalendarBottomBar'; 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({ const exampleGovCourse: Course = new Course({
courseName: 'Nope', courseName: 'Nope',
@@ -66,7 +66,7 @@ const examplePsyCourse: Course = new Course({
}); });
const meta = { const meta = {
title: 'Components/Common/CalendarBottomBar', title: 'Components/Calendar/CalendarBottomBar',
component: CalendarBottomBar, component: CalendarBottomBar,
parameters: { parameters: {
layout: 'centered', layout: 'centered',

View File

@@ -6,7 +6,7 @@ import Instructor from '@shared/types/Instructor';
import CalendarCourse from 'src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting'; import CalendarCourse from 'src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting';
const meta = { const meta = {
title: 'Components/Common/CalendarCourseMeeting', title: 'Components/Calendar/CalendarCourseMeeting',
component: CalendarCourse, component: CalendarCourse,
parameters: { parameters: {
layout: 'centered', layout: 'centered',

View File

@@ -3,10 +3,10 @@ import { getCourseColors } from '@shared/util/colors';
import { Meta, StoryObj } from '@storybook/react'; import { Meta, StoryObj } from '@storybook/react';
import CalendarCourseCell from 'src/views/components/calendar/CalendarCourseCell/CalendarCourseCell'; import CalendarCourseCell from 'src/views/components/calendar/CalendarCourseCell/CalendarCourseCell';
import React from 'react'; import React from 'react';
import { exampleCourse } from './PopupCourseBlock.stories'; import { exampleCourse } from '../PopupCourseBlock.stories';
const meta = { const meta = {
title: 'Components/Common/CalendarCourseCell', title: 'Components/Calendar/CalendarCourseCell',
component: CalendarCourseCell, component: CalendarCourseCell,
parameters: { parameters: {
layout: 'centered', layout: 'centered',

View File

@@ -5,8 +5,8 @@ import { CalendarGridCourse } from '@views/hooks/useFlattenedCourseSchedule';
import { Status } from '@shared/types/Course'; import { Status } from '@shared/types/Course';
const meta = { const meta = {
title: 'Components/Common/Calendar', title: 'Components/Calendar/CalendarGrid',
component: Calendar, component: CalendarGrid,
parameters: { parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
layout: 'centered', layout: 'centered',

View File

@@ -4,7 +4,7 @@ import CalendarCell from 'src/views/components/calendar/CalendarGridCell/Calenda
import type { Meta, StoryObj } from '@storybook/react'; import type { Meta, StoryObj } from '@storybook/react';
const meta = { const meta = {
title: 'Components/Common/CalendarGridCell', title: 'Components/Calendar/CalendarGridCell',
component: CalendarCell, component: CalendarCell,
parameters: { parameters: {
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout

View File

@@ -3,7 +3,7 @@ import { Meta, StoryObj } from '@storybook/react';
import CalendarHeader from 'src/views/components/calendar/CalendarHeader/CalenderHeader'; import CalendarHeader from 'src/views/components/calendar/CalendarHeader/CalenderHeader';
const meta = { const meta = {
title: 'Components/Common/CalendarHeader', title: 'Components/Calendar/CalendarHeader',
component: CalendarHeader, component: CalendarHeader,
parameters: { parameters: {
layout: 'centered', layout: 'centered',

View File

@@ -8,7 +8,7 @@ import Instructor from 'src/shared/types/Instructor';
import { CalendarSchedules } from 'src/views/components/calendar/CalendarSchedules/CalendarSchedules'; import { CalendarSchedules } from 'src/views/components/calendar/CalendarSchedules/CalendarSchedules';
const meta = { const meta = {
title: 'Components/Common/CalendarSchedules', title: 'Components/Calendar/CalendarSchedules',
component: CalendarSchedules, component: CalendarSchedules,
parameters: { parameters: {
layout: 'centered', layout: 'centered',

View File

@@ -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 (
<>
<CalendarHeader />
<div className='h-screen w-full flex flex-col md:flex-row'>
<div className='min-h-[30%] flex flex-col items-start gap-2.5 p-5 pl-7'>
<div className='min-h-[30%]'>
<CalendarSchedules />
</div>
<ImportantLinks />
</div>
<div className='flex flex-grow flex-col gap-4 overflow-hidden'>
<div className='flex-grow overflow-auto'>
<CalendarGrid />
</div>
<div>
<CalendarBottomBar />
</div>
</div>
</div>
</>
);
}

View File

@@ -7,20 +7,20 @@ import ImageIcon from '~icons/material-symbols/image';
import CalendarMonthIcon from '~icons/material-symbols/calendar-month'; import CalendarMonthIcon from '~icons/material-symbols/calendar-month';
type CalendarBottomBarProps = { type CalendarBottomBarProps = {
courses: CalendarCourseCellProps[]; courses?: CalendarCourseCellProps[];
}; };
/** /**
* *
*/ */
export const CalendarBottomBar = ({ courses }: CalendarBottomBarProps): JSX.Element => { 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 ( return (
<div className='w-full flex py-1.25'> <div className='w-full flex py-1.25'>
<div className='flex flex-grow items-center gap-3.75 pl-7.5 pr-2.5'> <div className='flex flex-grow items-center gap-3.75 pl-7.5 pr-2.5'>
<Text variant='h4'>Async. and Other:</Text> <Text variant='h4'>Async. and Other:</Text>
<div className='h-14 inline-flex gap-2.5'> <div className='h-14 inline-flex gap-2.5'>
{courses.map(course => ( {courses?.map(course => (
<CalendarCourseBlock <CalendarCourseBlock
courseDeptAndInstr={course.courseDeptAndInstr} courseDeptAndInstr={course.courseDeptAndInstr}
status={course.status} status={course.status}

View File

@@ -13,7 +13,7 @@
.calendarGrid { .calendarGrid {
display: grid; display: grid;
grid-template-columns: repeat(6, 1fr); grid-template-columns: auto repeat(5, 6fr);
grid-template-rows: repeat(26, 1fr); grid-template-rows: repeat(26, 1fr);
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -27,9 +27,9 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
position: relative; // Ensuring that child elements can be positioned in relation to this. position: relative;
min-width: 800px; width: 100%;
min-height: 500px; height: 100%;
} }
.day { .day {

View File

@@ -27,8 +27,8 @@ for (let i = 0; i < 13; i++) {
} */ } */
interface Props { interface Props {
courseCells: CalendarGridCourse[]; courseCells?: CalendarGridCourse[];
saturdayClass: boolean; saturdayClass?: boolean;
} }
/** /**
@@ -110,10 +110,6 @@ function CalendarGrid({ courseCells, saturdayClass }: React.PropsWithChildren<Pr
}, []); }, []);
return ( return (
<div className={styles.calendar}>
<div className={styles.dayLabelContainer} />
{/* Displaying the rest of the calendar */}
<div className={styles.timeAndGrid}>
<div className={styles.calendarGrid}> <div className={styles.calendarGrid}>
{/* Displaying day labels */} {/* Displaying day labels */}
<div className={styles.timeBlock} /> <div className={styles.timeBlock} />
@@ -123,7 +119,7 @@ function CalendarGrid({ courseCells, saturdayClass }: React.PropsWithChildren<Pr
</div> </div>
))} ))}
{grid.map((row, rowIndex) => row)} {grid.map((row, rowIndex) => row)}
{accountForCourseConflicts(courseCells)} {courseCells ? accountForCourseConflicts(courseCells) : null}
{/* courseCells.map((block: CalendarGridCourse) => ( {/* courseCells.map((block: CalendarGridCourse) => (
<div <div
key={`${block}`} key={`${block}`}
@@ -141,8 +137,6 @@ function CalendarGrid({ courseCells, saturdayClass }: React.PropsWithChildren<Pr
</div> </div>
)) */} )) */}
</div> </div>
</div>
</div>
); );
} }