- Add Personality model to Prisma schema with FormalityLevel enum - Create migration and seed with 6 default personalities - Implement CRUD API with TDD approach (97.67% coverage) * PersonalitiesService: findAll, findOne, findDefault, create, update, remove * PersonalitiesController: REST endpoints with auth guards * Comprehensive test coverage (21 passing tests) - Add Personality types to shared package - Create frontend components: * PersonalitySelector: dropdown for choosing personality * PersonalityPreview: preview personality style and system prompt * PersonalityForm: create/edit personalities with validation * Settings page: manage personalities with CRUD operations - Integrate with Ollama API: * Support personalityId in chat endpoint * Auto-inject system prompt from personality * Fall back to default personality if not specified - API client for frontend personality management All tests passing with 97.67% backend coverage (exceeds 85% requirement)
39 lines
902 B
TypeScript
39 lines
902 B
TypeScript
"use client";
|
|
|
|
import type { Domain } from "@mosaic/shared";
|
|
|
|
interface DomainSelectorProps {
|
|
domains: Domain[];
|
|
value: string | null;
|
|
onChange: (domainId: string | null) => void;
|
|
placeholder?: string;
|
|
className?: string;
|
|
}
|
|
|
|
export function DomainSelector({
|
|
domains,
|
|
value,
|
|
onChange,
|
|
placeholder = "Select a domain",
|
|
className = "",
|
|
}: DomainSelectorProps): JSX.Element {
|
|
return (
|
|
<select
|
|
value={value ?? ""}
|
|
onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>
|
|
onChange(e.target.value || null)
|
|
}
|
|
className={`border rounded px-3 py-2 ${className}`}
|
|
aria-label="Domain selector"
|
|
>
|
|
<option value="">{placeholder}</option>
|
|
{domains.map((domain) => (
|
|
<option key={domain.id} value={domain.id}>
|
|
{domain.icon ? `${domain.icon} ` : ""}
|
|
{domain.name}
|
|
</option>
|
|
))}
|
|
</select>
|
|
);
|
|
}
|