Files
lunarfront-app/packages/admin/src/components/lessons/instructor-form.tsx
Ryan Moon 5ad27bc196 Add lessons module, rate cycles, EC2 deploy scripts, and help content
- Lessons module: lesson types, instructors, schedule slots, enrollments,
  sessions (list + week grid view), lesson plans, grading scales, templates
- Rate cycles: replace monthly_rate with billing_interval + billing_unit on
  enrollments; add weekly/monthly/quarterly rate presets to lesson types and
  schedule slots with auto-fill on enrollment form
- Member detail page: tabbed layout for details, identity documents, enrollments
- Sessions week view: custom 7-column grid replacing react-big-calendar
- Music store seed: instructors, lesson types, slots, enrollments, sessions,
  grading scale, lesson plan template
- Scrollbar styling: themed to match sidebar/app palette
- deploy/: EC2 setup and redeploy scripts, nginx config, systemd service
- Help: add Lessons category (overview, types, instructors, slots, enrollments,
  sessions, plans/grading); collapsible sidebar with independent scroll;
  remove POS/accounting references from docs
2026-03-30 18:52:57 -05:00

53 lines
1.8 KiB
TypeScript

import { useForm } from 'react-hook-form'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Textarea } from '@/components/ui/textarea'
import type { Instructor } from '@/types/lesson'
interface Props {
defaultValues?: Partial<Instructor>
onSubmit: (data: Record<string, unknown>) => void
loading?: boolean
}
export function InstructorForm({ defaultValues, onSubmit, loading }: Props) {
const { register, handleSubmit } = useForm({
defaultValues: {
displayName: defaultValues?.displayName ?? '',
bio: defaultValues?.bio ?? '',
instruments: defaultValues?.instruments?.join(', ') ?? '',
},
})
function handleFormSubmit(data: { displayName: string; bio: string; instruments: string }) {
onSubmit({
displayName: data.displayName,
bio: data.bio || undefined,
instruments: data.instruments
? data.instruments.split(',').map((s) => s.trim()).filter(Boolean)
: undefined,
})
}
return (
<form onSubmit={handleSubmit(handleFormSubmit)} className="space-y-4">
<div className="space-y-2">
<Label htmlFor="displayName">Display Name *</Label>
<Input id="displayName" {...register('displayName')} required />
</div>
<div className="space-y-2">
<Label htmlFor="bio">Bio</Label>
<Textarea id="bio" {...register('bio')} rows={3} />
</div>
<div className="space-y-2">
<Label htmlFor="instruments">Instruments</Label>
<Input id="instruments" {...register('instruments')} placeholder="Piano, Guitar, Voice (comma-separated)" />
</div>
<Button type="submit" disabled={loading} className="w-full">
{loading ? 'Saving...' : defaultValues ? 'Save Changes' : 'Create Instructor'}
</Button>
</form>
)
}