Wizard-style, sectioned assessment composition and execution.
End-to-end assessment builder with type management, section and step orchestration, form/question composition, and optional question-to-task-template automation mapping.
import { useState } from 'react';
import { Wizard, Stepper, RadioButtonGroup, RadioBoxGroup, Slider, RangeSlider, BellCurve, RadarChart, Collapsible } from '@cleen/cleen-components';
import { useAssessment, useResponseSet } from '@/hooks/useAssessment';
export function AssessmentRunner({ assessmentId }) {
const { assessment, sections } = useAssessment(assessmentId);
const { responses, save, submit, results } = useResponseSet(assessmentId);
const [step, setStep] = useState(0);
if (!assessment) return null;
const section = sections[step];
return (
<Wizard
step={step}
onStepChange={setStep}
header={<Stepper steps={sections.map((s) => s.title)} current={step} />}
>
{section.questions.map((q) => (
<Collapsible key={q.id} title={q.title} defaultOpen>
{q.type === 'choice' && <RadioButtonGroup options={q.options} value={responses[q.id]} onChange={(v) => save(q.id, v)} />}
{q.type === 'card' && <RadioBoxGroup options={q.options} value={responses[q.id]} onChange={(v) => save(q.id, v)} />}
{q.type === 'scale' && <Slider min={1} max={10} value={responses[q.id]} onChange={(v) => save(q.id, v)} />}
{q.type === 'range' && <RangeSlider min={0} max={100} value={responses[q.id]} onChange={(v) => save(q.id, v)} />}
</Collapsible>
))}
{results && (
<section className="results">
<BellCurve data={results.distribution} value={results.score} />
<RadarChart data={results.factorScores} />
</section>
)}
</Wizard>
);
}Internal code areas in the licensed Full-Stack codebase that back this module.
ApiAssessmentA quick visual of how Assessments and Surveys participates across the CleenUI stack, alongside the named operations it adds to the API surface.
Each operation maps to an endpoint in the licensed C# Web API surface.