Portal GET /api/portal/pets serializes weightKg→weight and dateOfBirth→
birthDate. The portal read view read the staff-shaped keys, so populated
pets rendered 'Unknown'. Size Category (petSizeCategory) was never shown
in any read tab.
- packages/types: add portal-shaped weight?/birthDate? alongside the
existing staff-side weightKg/dateOfBirth (no rename — staff Clients
pages still use weightKg/dateOfBirth).
- PetProfiles: header + Basic Info InfoRows read portal keys with a
fallback to staff keys; add a Size Category InfoRow with a
formatSizeCategory helper (extra_large → 'Extra Large').
- PetForm: pre-fill weight from portal weight key with weightKg fallback.
- Tests: PetProfiles.test.tsx (read view + formatter) and a PetForm
pre-fill case.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit ports the GRO-1173 admin UI changes from the app monorepo
into the extracted groombook/web repo, using the correct source paths
(src/ instead of apps/web/src/):
- New BufferRulesSection component (full CRUD UI for /api/buffer-rules)
- Default Buffer (minutes) field added to service create/edit form
- Size Category and Coat Type dropdowns added to PetForm (portal)
- @groombook/types Service interface extended with defaultBufferMinutes
- BufferRulesSection embedded in Settings page
The PetForm already had coatType — this commit adds petSizeCategory
and renders both fields with proper dropdown selectors.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- Make coatType and petSizeCategory optional on Pet (?:) — they may not be set
- Remove "single" and "short" from COAT_TYPES (not in CoatType union)
- Use { name: "Add" } instead of /add/i to target the + button specifically
- Add optional chaining to puppyCutSpans[0]?.closest() (noUncheckedIndexedAccess)
- Add optional chaining to petsData[0]?.id ?? "" in PetProfiles
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add MedicalAlert, AlertSeverity, CoatType, preferredCuts, medicalAlerts,
temperamentScore, temperamentFlags to @groombook/types Pet interface
- Add aria-label="Add" to the preferred cuts + button
- Fix temperament text expectation from "(/4/5)" to "(4/5)"
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Copy apps/web/ with all src, components, pages, portal
- Inline packages/types/ as local packages/types module
- Add tsconfig path aliases for @groombook/types
- Port Dockerfile and CI workflow
- Image name: ghcr.io/groombook/web
Co-Authored-By: Paperclip <noreply@paperclip.ing>