Files
stack/apps/web/src/components/domains/DomainSelector.tsx
Jason Woltje 5dd46c85af feat(#82): implement Personality Module
- 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)
2026-01-29 17:58:09 -06:00

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>
);
}