feat: live class sessions, CE workflow, and docs (#683)
Adds live-class session scheduling on lessons (join link, date/time, timezone) with automatic 24h and 1h reminder emails plus a calendar invite (.ics), a time-change notification with an updated invite, a teacher-authored welcome email and session invite on enrollment, and a "Notify students" quiz nudge. LMS gets an upcoming live-sessions card and Join buttons, plus a reusable live-session card component (3 states) in @cio/ui with a Storybook story. The sidebar content tree now reflects sequential progression locking like the content list, and the course-completion confetti regression is fixed. Org-based emails no longer reference ClassroomIO by name. Docs add live-class, welcome-email, and course-progression guides, expand the certificates guide (design, signatures, corrected labels), move plan-required callouts to the top, flatten how-to-guides to the docs root with redirects, and add screenshots. Includes an add-docs-image skill.
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
<script module>
|
||||
import { defineMeta } from '@storybook/addon-svelte-csf';
|
||||
import { LiveSessionCard } from '@cio/ui/custom/live-session-card';
|
||||
|
||||
const { Story } = defineMeta({
|
||||
title: 'Molecules/LiveSessionCard',
|
||||
component: LiveSessionCard,
|
||||
parameters: {
|
||||
layout: 'centered'
|
||||
},
|
||||
tags: ['autodocs']
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
const labels = {
|
||||
liveNow: 'Live now',
|
||||
liveSession: 'Live Session',
|
||||
providerFallback: 'Live session',
|
||||
started: 'Started',
|
||||
minAgo: 'min ago',
|
||||
joinNow: 'Join now',
|
||||
copyLink: 'Copy link',
|
||||
copy: 'Copy',
|
||||
addToCalendar: 'Add to calendar',
|
||||
addGoogle: 'Google Calendar',
|
||||
addOutlook: 'Outlook.com',
|
||||
addOffice365: 'Office 365',
|
||||
addYahoo: 'Yahoo Calendar',
|
||||
addApple: 'Apple Calendar (.ics)',
|
||||
startsIn: 'Starts in',
|
||||
sessionEnded: 'Session ended'
|
||||
};
|
||||
|
||||
const callUrl = 'https://zoom.us/j/1234567890';
|
||||
const day = 24 * 60 * 60 * 1000;
|
||||
const minute = 60 * 1000;
|
||||
|
||||
const upcomingAt = new Date(Date.now() + 2 * day).toISOString();
|
||||
const liveAt = new Date(Date.now() - 12 * minute).toISOString();
|
||||
const endedAt = new Date(Date.now() - 3 * day).toISOString();
|
||||
</script>
|
||||
|
||||
<Story name="Upcoming">
|
||||
{#snippet template()}
|
||||
<div class="w-[440px] p-8">
|
||||
<LiveSessionCard
|
||||
title="Compliance Essentials Webinar"
|
||||
{callUrl}
|
||||
lessonAt={upcomingAt}
|
||||
timezone="America/New_York"
|
||||
{labels}
|
||||
status="upcoming"
|
||||
/>
|
||||
</div>
|
||||
{/snippet}
|
||||
</Story>
|
||||
|
||||
<Story name="Live now">
|
||||
{#snippet template()}
|
||||
<div class="w-[440px] p-8">
|
||||
<LiveSessionCard
|
||||
title="Compliance Essentials Webinar"
|
||||
{callUrl}
|
||||
lessonAt={liveAt}
|
||||
timezone="America/New_York"
|
||||
{labels}
|
||||
status="live"
|
||||
/>
|
||||
</div>
|
||||
{/snippet}
|
||||
</Story>
|
||||
|
||||
<Story name="Ended">
|
||||
{#snippet template()}
|
||||
<div class="w-[440px] p-8">
|
||||
<LiveSessionCard
|
||||
title="Compliance Essentials Webinar"
|
||||
{callUrl}
|
||||
lessonAt={endedAt}
|
||||
timezone="America/New_York"
|
||||
{labels}
|
||||
status="ended"
|
||||
/>
|
||||
</div>
|
||||
{/snippet}
|
||||
</Story>
|
||||
Reference in New Issue
Block a user