Compare commits
1 Commits
copilot/su
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| f8c2788d86 |
@@ -1,5 +1,5 @@
|
|||||||
import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';
|
import { Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react';
|
||||||
import { CalendarDots, Export, FileCode, FilePng, Sidebar } from '@phosphor-icons/react';
|
import { CalendarDots, Export, FileCode, FilePng, FileText, Sidebar } from '@phosphor-icons/react';
|
||||||
import styles from '@views/components/calendar/CalendarHeader/CalendarHeader.module.scss';
|
import styles from '@views/components/calendar/CalendarHeader/CalendarHeader.module.scss';
|
||||||
import { Button } from '@views/components/common/Button';
|
import { Button } from '@views/components/common/Button';
|
||||||
import DialogProvider from '@views/components/common/DialogProvider/DialogProvider';
|
import DialogProvider from '@views/components/common/DialogProvider/DialogProvider';
|
||||||
@@ -11,7 +11,7 @@ import useSchedules from '@views/hooks/useSchedules';
|
|||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import { handleExportJson, saveAsCal, saveCalAsPng } from '../utils';
|
import { handleExportJson, saveAsCal, saveAsText, saveCalAsPng } from '../utils';
|
||||||
|
|
||||||
interface CalendarHeaderProps {
|
interface CalendarHeaderProps {
|
||||||
sidebarOpen?: boolean;
|
sidebarOpen?: boolean;
|
||||||
@@ -111,6 +111,18 @@ export default function CalendarHeader({ sidebarOpen, onSidebarToggle }: Calenda
|
|||||||
Save as .json
|
Save as .json
|
||||||
</Button>
|
</Button>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
<MenuItem>
|
||||||
|
<Button
|
||||||
|
className='w-full flex justify-start'
|
||||||
|
onClick={saveAsText}
|
||||||
|
color='ut-black'
|
||||||
|
size='small'
|
||||||
|
variant='minimal'
|
||||||
|
icon={FileText}
|
||||||
|
>
|
||||||
|
Save as .txt
|
||||||
|
</Button>
|
||||||
|
</MenuItem>
|
||||||
{/* <MenuItem>
|
{/* <MenuItem>
|
||||||
<Button color='ut-black' size='small' variant='minimal' icon={FileTxt}>
|
<Button color='ut-black' size='small' variant='minimal' icon={FileTxt}>
|
||||||
Export Unique IDs
|
Export Unique IDs
|
||||||
|
|||||||
@@ -245,6 +245,27 @@ export const scheduleToIcsString = (schedule: Serialized<UserSchedule>) => {
|
|||||||
return icsString;
|
return icsString;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the provided schedule in a human readable/copyable text format
|
||||||
|
* @param schedule - The schedule object
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export const scheduleToText = (schedule: Serialized<UserSchedule>) => {
|
||||||
|
const lines: string[] = [];
|
||||||
|
|
||||||
|
lines.push(`Schedule: ${schedule.name}`);
|
||||||
|
lines.push('');
|
||||||
|
|
||||||
|
for (const c of schedule.courses) {
|
||||||
|
lines.push(c.fullName);
|
||||||
|
lines.push(`${c.creditHours} Credit Hours`);
|
||||||
|
lines.push(`${c.uniqueId}`);
|
||||||
|
lines.push('');
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines.join('\n');
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the current schedule as a calendar file in the iCalendar format (ICS).
|
* Saves the current schedule as a calendar file in the iCalendar format (ICS).
|
||||||
* Fetches the current active schedule and converts it into an ICS string.
|
* Fetches the current active schedule and converts it into an ICS string.
|
||||||
@@ -262,6 +283,25 @@ export const saveAsCal = async () => {
|
|||||||
downloadBlob(icsString, 'CALENDAR', 'schedule.ics');
|
downloadBlob(icsString, 'CALENDAR', 'schedule.ics');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save current schedule as a plain text file consisting of
|
||||||
|
* Course Name - Course ID
|
||||||
|
* Course Time
|
||||||
|
* Unique Number
|
||||||
|
* Line Break
|
||||||
|
* Repeat
|
||||||
|
*/
|
||||||
|
export const saveAsText = async () => {
|
||||||
|
const schedule = await getSchedule();
|
||||||
|
|
||||||
|
if (!schedule) {
|
||||||
|
throw new Error('No schedule found');
|
||||||
|
}
|
||||||
|
|
||||||
|
const scheduleText = scheduleToText(schedule);
|
||||||
|
downloadBlob(scheduleText, 'TEXT', 'schedule.txt');
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves current schedule to JSON that can be imported on other devices.
|
* Saves current schedule to JSON that can be imported on other devices.
|
||||||
* @param id - Provided schedule ID to download
|
* @param id - Provided schedule ID to download
|
||||||
|
|||||||
Reference in New Issue
Block a user