From e3b8e4c2709049d6263e3b2533a9ef52bb2de92c Mon Sep 17 00:00:00 2001 From: Razboy20 Date: Sat, 17 Feb 2024 12:53:50 -0600 Subject: [PATCH] fix calendar course cell colors --- src/shared/util/colors.ts | 6 +- .../components/CalendarCourseCell.stories.tsx | 81 +++++++++---------- .../components/PopupCourseBlock.stories.tsx | 6 +- .../CalendarCourseCell/CalendarCourseCell.tsx | 38 ++++++--- 4 files changed, 72 insertions(+), 59 deletions(-) diff --git a/src/shared/util/colors.ts b/src/shared/util/colors.ts index 807a2c16..d6f7fdd6 100644 --- a/src/shared/util/colors.ts +++ b/src/shared/util/colors.ts @@ -42,9 +42,9 @@ export function pickFontColor(bgColor: string): 'text-white' | 'text-black' { * Get primary and secondary colors from a tailwind colorway * @param colorway the tailwind colorway ex. "emerald" */ -export function getCourseColors(colorway: keyof typeof theme.colors): CourseColors { +export function getCourseColors(colorway: keyof typeof theme.colors, index = 600, offset = 200): CourseColors { return { - primaryColor: theme.colors[colorway][600] as string, - secondaryColor: theme.colors[colorway][800] as string, + primaryColor: theme.colors[colorway][index] as string, + secondaryColor: theme.colors[colorway][index + offset] as string, }; } diff --git a/src/stories/components/CalendarCourseCell.stories.tsx b/src/stories/components/CalendarCourseCell.stories.tsx index 8203d74a..19c1908e 100644 --- a/src/stories/components/CalendarCourseCell.stories.tsx +++ b/src/stories/components/CalendarCourseCell.stories.tsx @@ -1,10 +1,9 @@ +import { Course, Status } from '@shared/types/Course'; +import { getCourseColors } from '@shared/util/colors'; import { Meta, StoryObj } from '@storybook/react'; +import CalendarCourseCell from '@views/components/common/CalendarCourseCell/CalendarCourseCell'; import React from 'react'; -import { Course, Status } from 'src/shared/types/Course'; -import { CourseMeeting, DAY_MAP } from 'src/shared/types/CourseMeeting'; -import { CourseSchedule } from 'src/shared/types/CourseSchedule'; -import Instructor from 'src/shared/types/Instructor'; -import CalendarCourseCell from 'src/views/components/common/CalendarCourseCell/CalendarCourseCell'; +import { exampleCourse } from './PopupCourseBlock.stories'; const meta = { title: 'Components/Common/CalendarCourseCell', @@ -16,52 +15,48 @@ const meta = { argTypes: { course: { control: 'object' }, meetingIdx: { control: 'number' }, - color: { control: 'color' }, + colors: { control: 'object' }, }, render: (args: any) => ( -
+
), + args: { + course: exampleCourse, + meetingIdx: 0, + colors: getCourseColors('emerald', 500), + }, } satisfies Meta; export default meta; type Story = StoryObj; -export const Default: Story = { - args: { - course: new Course({ - uniqueId: 123, - number: '311C', - fullName: "311C - Bevo's Default Course", - courseName: "Bevo's Default Course", - department: 'BVO', - creditHours: 3, - status: Status.WAITLISTED, - instructors: [new Instructor({ firstName: '', lastName: 'Bevo', fullName: 'Bevo' })], - isReserved: false, - url: '', - flags: [], - schedule: new CourseSchedule({ - meetings: [ - new CourseMeeting({ - days: [DAY_MAP.MON, DAY_MAP.WED, DAY_MAP.FRI], - startTime: 480, - endTime: 570, - location: { - building: 'UTC', - room: '123', - }, - }), - ], - }), - instructionMode: 'In Person', - semester: { - year: 2024, - season: 'Spring', - }, - }), - meetingIdx: 0, - color: 'red', - }, +export const Default: Story = {}; + +export const Variants: Story = { + render: props => ( +
+ + + + +
+ ), }; diff --git a/src/stories/components/PopupCourseBlock.stories.tsx b/src/stories/components/PopupCourseBlock.stories.tsx index adda6062..0e60f9fe 100644 --- a/src/stories/components/PopupCourseBlock.stories.tsx +++ b/src/stories/components/PopupCourseBlock.stories.tsx @@ -1,13 +1,13 @@ import type { Meta, StoryObj } from '@storybook/react'; +import PopupCourseBlock from '@views/components/common/PopupCourseBlock/PopupCourseBlock'; import React from 'react'; import { Course, Status } from 'src/shared/types/Course'; import { CourseMeeting } from 'src/shared/types/CourseMeeting'; import Instructor from 'src/shared/types/Instructor'; -import PopupCourseBlock from '@views/components/common/PopupCourseBlock/PopupCourseBlock'; import { getCourseColors } from 'src/shared/util/colors'; import { theme } from 'unocss/preset-mini'; -const exampleCourse: Course = new Course({ +export const exampleCourse: Course = new Course({ courseName: 'ELEMS OF COMPTRS/PROGRAMMNG-WB', creditHours: 3, department: 'C S', @@ -103,7 +103,7 @@ export const test_colors = Object.keys(theme.colors) export const AllColors: Story = { render: props => ( -
+
{test_colors.map((color, i) => ( ))} diff --git a/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx b/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx index 27b2519e..f8e7eb12 100644 --- a/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx +++ b/src/views/components/common/CalendarCourseCell/CalendarCourseCell.tsx @@ -1,6 +1,7 @@ +import { Course, Status } from '@shared/types/Course'; +import { CourseMeeting } from '@shared/types/CourseMeeting'; import React from 'react'; -import { Course, Status } from 'src/shared/types/Course'; -import { CourseMeeting } from 'src/shared/types/CourseMeeting'; +import { CourseColors, pickFontColor } from 'src/shared/util/colors'; import ClosedIcon from '~icons/material-symbols/lock'; import WaitlistIcon from '~icons/material-symbols/timelapse'; import CancelledIcon from '~icons/material-symbols/warning'; @@ -11,11 +12,14 @@ export interface CalendarCourseBlockProps { course: Course; /* index into course meeting array to display */ meetingIdx?: number; - /** The background color for the course. */ - color: string; + colors: CourseColors; } -const CalendarCourseBlock: React.FC = ({ course, meetingIdx }: CalendarCourseBlockProps) => { +const CalendarCourseBlock: React.FC = ({ + course, + meetingIdx, + colors, +}: CalendarCourseBlockProps) => { let meeting: CourseMeeting | null = meetingIdx !== undefined ? course.schedule.meetings[meetingIdx] : null; let rightIcon: React.ReactNode | null = null; if (course.status === Status.WAITLISTED) { @@ -26,20 +30,34 @@ const CalendarCourseBlock: React.FC = ({ course, meeti rightIcon = ; } + // whiteText based on secondaryColor + const fontColor = pickFontColor(colors.primaryColor); + return ( -
+
{course.department} {course.number} - {course.instructors[0].lastName} - {`${meeting.getTimeString({ separator: '–', capitalize: true })}${ - meeting.location ? ` – ${meeting.location.building}` : '' - }`} + {meeting && + `${meeting.getTimeString({ separator: '–', capitalize: true })}${ + meeting.location ? ` – ${meeting.location.building}` : '' + }`}
{rightIcon && ( -
+
{rightIcon}
)}