Files
classroomio/packages/ui/src/custom/exercise-question/renderer-contract.ts
T
Rotimi Best 3919ff6c2f Enhance audience management features with new components and API integrations
- Added `AssignCoursesModal`, `AudienceMemberRow`, `AudienceTable`, and related components for improved audience management UI.
- Implemented audience invite actions including resend and revoke functionality.
- Updated audience API to support importing members and assigning courses.
- Refactored audience data handling to include status and invite management.
- Improved overall user experience with pagination and selection features in the audience table.
2026-03-22 18:42:23 +01:00

169 lines
7.2 KiB
TypeScript

import {
QUESTION_TYPE_KEY,
getRendererForMode,
type ExerciseRendererDefinition,
type ExerciseRendererMode,
type ExerciseRendererRegistry,
type ExerciseQuestionRendererProps,
type ExerciseQuestionTypeKey
} from '@cio/question-types';
import type { Component } from 'svelte';
import { default as CheckboxEdit } from './renderers/checkbox/edit.svelte';
import { default as FileUploadEdit } from './renderers/file-upload/edit.svelte';
import { default as FillBlankEdit } from './renderers/fill-blank/edit.svelte';
import { default as HotspotEdit } from './renderers/hotspot/edit.svelte';
import { default as MatchingEdit } from './renderers/matching/edit.svelte';
import { default as NumericEdit } from './renderers/numeric/edit.svelte';
import { default as OrderingEdit } from './renderers/ordering/edit.svelte';
import { default as RadioEdit } from './renderers/radio/edit.svelte';
import { default as LinkEdit } from './renderers/link/edit.svelte';
import { default as ShortAnswerEdit } from './renderers/short-answer/edit.svelte';
import { default as TextareaEdit } from './renderers/textarea/edit.svelte';
import { default as TrueFalseEdit } from './renderers/true-false/edit.svelte';
import { default as CheckboxTake } from './renderers/checkbox/take.svelte';
import { default as FileUploadTake } from './renderers/file-upload/take.svelte';
import { default as FillBlankTake } from './renderers/fill-blank/take.svelte';
import { default as HotspotTake } from './renderers/hotspot/take.svelte';
import { default as MatchingTake } from './renderers/matching/take.svelte';
import { default as NumericTake } from './renderers/numeric/take.svelte';
import { default as OrderingTake } from './renderers/ordering/take.svelte';
import { default as RadioTake } from './renderers/radio/take.svelte';
import { default as LinkTake } from './renderers/link/take.svelte';
import { default as ShortAnswerTake } from './renderers/short-answer/take.svelte';
import { default as TextareaTake } from './renderers/textarea/take.svelte';
import { default as TrueFalseTake } from './renderers/true-false/take.svelte';
import { default as CheckboxPreview } from './renderers/checkbox/preview.svelte';
import { default as FileUploadPreview } from './renderers/file-upload/preview.svelte';
import { default as FillBlankPreview } from './renderers/fill-blank/preview.svelte';
import { default as HotspotPreview } from './renderers/hotspot/preview.svelte';
import { default as MatchingPreview } from './renderers/matching/preview.svelte';
import { default as NumericPreview } from './renderers/numeric/preview.svelte';
import { default as OrderingPreview } from './renderers/ordering/preview.svelte';
import { default as RadioPreview } from './renderers/radio/preview.svelte';
import { default as LinkPreview } from './renderers/link/preview.svelte';
import { default as ShortAnswerPreview } from './renderers/short-answer/preview.svelte';
import { default as TextareaPreview } from './renderers/textarea/preview.svelte';
import { default as TrueFalsePreview } from './renderers/true-false/preview.svelte';
import { default as CheckboxSubmission } from './renderers/checkbox/submission.svelte';
import { default as FileUploadSubmission } from './renderers/file-upload/submission.svelte';
import { default as FillBlankSubmission } from './renderers/fill-blank/submission.svelte';
import { default as HotspotSubmission } from './renderers/hotspot/submission.svelte';
import { default as MatchingSubmission } from './renderers/matching/submission.svelte';
import { default as NumericSubmission } from './renderers/numeric/submission.svelte';
import { default as OrderingSubmission } from './renderers/ordering/submission.svelte';
import { default as RadioSubmission } from './renderers/radio/submission.svelte';
import { default as LinkSubmission } from './renderers/link/submission.svelte';
import { default as ShortAnswerSubmission } from './renderers/short-answer/submission.svelte';
import { default as TextareaSubmission } from './renderers/textarea/submission.svelte';
import { default as TrueFalseSubmission } from './renderers/true-false/submission.svelte';
import { default as RadioReview } from './renderers/radio/review.svelte';
import { default as CheckboxReview } from './renderers/checkbox/review.svelte';
import { default as NumericReview } from './renderers/numeric/review.svelte';
import { default as ShortAnswerReview } from './renderers/short-answer/review.svelte';
import { default as FillBlankReview } from './renderers/fill-blank/review.svelte';
import { default as OrderingReview } from './renderers/ordering/review.svelte';
import { default as TrueFalseReview } from './renderers/true-false/review.svelte';
type SharedRendererComponent = Component<ExerciseQuestionRendererProps>;
export const EXERCISE_QUESTION_RENDERER_CONTRACT: ExerciseRendererRegistry<SharedRendererComponent> = {
[QUESTION_TYPE_KEY.RADIO]: {
edit: RadioEdit,
take: RadioTake,
preview: RadioPreview,
submission: RadioSubmission,
review: RadioReview
},
[QUESTION_TYPE_KEY.CHECKBOX]: {
edit: CheckboxEdit,
take: CheckboxTake,
preview: CheckboxPreview,
submission: CheckboxSubmission,
review: CheckboxReview
},
[QUESTION_TYPE_KEY.TEXTAREA]: {
edit: TextareaEdit,
take: TextareaTake,
preview: TextareaPreview,
submission: TextareaSubmission
},
[QUESTION_TYPE_KEY.TRUE_FALSE]: {
edit: TrueFalseEdit,
take: TrueFalseTake,
preview: TrueFalsePreview,
submission: TrueFalseSubmission,
review: TrueFalseReview
},
[QUESTION_TYPE_KEY.SHORT_ANSWER]: {
edit: ShortAnswerEdit,
take: ShortAnswerTake,
preview: ShortAnswerPreview,
submission: ShortAnswerSubmission,
review: ShortAnswerReview
},
[QUESTION_TYPE_KEY.NUMERIC]: {
edit: NumericEdit,
take: NumericTake,
preview: NumericPreview,
submission: NumericSubmission,
review: NumericReview
},
[QUESTION_TYPE_KEY.FILL_BLANK]: {
edit: FillBlankEdit,
take: FillBlankTake,
preview: FillBlankPreview,
submission: FillBlankSubmission,
review: FillBlankReview
},
[QUESTION_TYPE_KEY.FILE_UPLOAD]: {
edit: FileUploadEdit,
take: FileUploadTake,
preview: FileUploadPreview,
submission: FileUploadSubmission
},
[QUESTION_TYPE_KEY.MATCHING]: {
edit: MatchingEdit,
take: MatchingTake,
preview: MatchingPreview,
submission: MatchingSubmission
},
[QUESTION_TYPE_KEY.ORDERING]: {
edit: OrderingEdit,
take: OrderingTake,
preview: OrderingPreview,
submission: OrderingSubmission,
review: OrderingReview
},
[QUESTION_TYPE_KEY.HOTSPOT]: {
edit: HotspotEdit,
take: HotspotTake,
preview: HotspotPreview,
submission: HotspotSubmission
},
[QUESTION_TYPE_KEY.LINK]: {
edit: LinkEdit,
take: LinkTake,
preview: LinkPreview,
submission: LinkSubmission
}
};
const FALLBACK_RENDERER: ExerciseRendererDefinition<SharedRendererComponent> = {
edit: ShortAnswerEdit,
take: ShortAnswerTake,
preview: ShortAnswerPreview,
submission: ShortAnswerSubmission
};
export function getExerciseQuestionRenderer(
questionTypeKey: ExerciseQuestionTypeKey,
mode: ExerciseRendererMode
): SharedRendererComponent {
return getRendererForMode(EXERCISE_QUESTION_RENDERER_CONTRACT, questionTypeKey, mode, FALLBACK_RENDERER);
}