feat: certificates, landing pages, ai tutor, website update, compliance

This commit is contained in:
Rotimi Best
2026-05-18 03:47:22 +01:00
parent c31ad63955
commit ac3a2c14a7
644 changed files with 56050 additions and 5439 deletions
@@ -1,10 +1,13 @@
import { CERTIFICATE_THEME_IDS, DEFAULT_CERTIFICATE_THEME_ID, type CertificateThemeId } from './constants';
const CERTIFICATE_THEME_ID_SET = new Set<string>(CERTIFICATE_THEME_IDS);
import { resolveTemplateId } from '@cio/certificates';
import { DEFAULT_CERTIFICATE_THEME_ID, type CertificateThemeId } from './constants';
/**
* Resolves a stored theme/template id. Maps legacy 6-theme ids onto the new
* 5 Atelier templates via `LEGACY_THEME_MAP`; unknown values fall back to
* `DEFAULT_CERTIFICATE_THEME_ID`.
*/
export function parseCertificateThemeId(raw: string | null | undefined): CertificateThemeId {
if (raw != null && raw !== '' && CERTIFICATE_THEME_ID_SET.has(raw)) {
return raw as CertificateThemeId;
}
return DEFAULT_CERTIFICATE_THEME_ID;
if (raw == null || raw === '') return DEFAULT_CERTIFICATE_THEME_ID;
return resolveTemplateId(raw);
}
@@ -37,18 +37,25 @@ export type CourseSortOrder = (typeof CourseSortOrder)[keyof typeof CourseSortOr
export const DEFAULT_SORT_ORDER: CourseSortOrder = CourseSortOrder.Desc;
export const CERTIFICATE_THEME_IDS = [
'professional',
'plain',
'purpleProfessionalBadge',
'blueProfessionalBadge',
'purpleBadgePattern',
'blueBadgePattern'
] as const;
import type { CertificateTemplateId } from '@cio/certificates';
export type CertificateThemeId = (typeof CERTIFICATE_THEME_IDS)[number];
export {
ACCENT_COLORS,
CERTIFICATE_TEMPLATE_IDS,
CERTIFICATE_TEMPLATES,
DEFAULT_ACCENT_COLOR,
DEFAULT_CERTIFICATE_DESIGN,
LEGACY_THEME_MAP
} from '@cio/certificates';
export type { CertificateTemplateId } from '@cio/certificates';
export const DEFAULT_CERTIFICATE_THEME_ID: CertificateThemeId = 'professional';
/**
* @deprecated Use `CertificateTemplateId` from `@cio/certificates`. Kept here so the
* existing `CertificateThemeId` import sites compile during the migration.
*/
export type CertificateThemeId = CertificateTemplateId;
export const DEFAULT_CERTIFICATE_THEME_ID: CertificateThemeId = 'classique';
const COURSE_SORT_ORDER_VALUES = new Set<string>(Object.values(CourseSortOrder));
@@ -30,6 +30,31 @@ export function getLessonsRoute(courseId, lessonId?: string) {
return `${path}/${lessonId}`;
}
export function getActiveCourseNavKey(pathname: string, courseId: string): string | null {
if (!courseId) return null;
const base = `/${ROUTES.COURSES}/${courseId}`;
if (!pathname.startsWith(base)) return null;
const rest = pathname.slice(base.length).replace(/^\//, '');
const segment = rest.split('/')[0];
if (!segment) return 'course.navItems.nav_news_feed';
if (segment === ROUTES.LESSONS || segment === 'exercises') return 'course.navItems.nav_content';
if (segment === 'analytics') return 'course.navItems.nav_analytics';
if (segment === 'attendance') return 'course.navItems.nav_attendance';
if (segment === 'submissions') return 'course.navItems.nav_submissions';
if (segment === 'marks') return 'course.navItems.nav_marks';
if (segment === 'compliance') return 'course.navItems.nav_compliance';
if (segment === 'certificates') return 'course.navItems.nav_certificates';
if (segment === 'landingpage') return 'course.navItems.nav_landing_page';
if (segment === 'people') return 'course.navItems.nav_people';
if (segment === 'ai-tutor') return 'course.navItems.nav_ai_tutor';
if (segment === 'settings') return 'course.navItems.nav_settings';
return null;
}
export function getLectureNo(index, initNo = '0') {
if (index <= 9) {
return `${initNo}${index}`;
@@ -24,9 +24,9 @@ export const settings = writable<CourseSettings>({
type: 'SELF_PACED' as TCourseType,
allowNewStudents: false,
tabs: [
{ id: 3, name: 'course.navItem.lessons.materials.tabs.video.title' },
{ id: 1, name: 'course.navItem.lessons.materials.tabs.note.title' },
{ id: 2, name: 'course.navItem.lessons.materials.tabs.slide.title' },
{ id: 3, name: 'course.navItem.lessons.materials.tabs.video.title' },
{ id: 4, name: 'course.navItem.lessons.materials.tabs.document.title' }
],
lessonDownload: false,