- Fix ShareButton silently swallowing errors from createShareLink; now
shows inline error text so failures are visible to the user
- Add getShareLinksForEntity server action and EntityShareLink type to
_core/share.ts
- Add ShareLinkList component — renders active share links per entity
with per-row Revoke; renders nothing when empty
- Wire ShareLinkList into plant and container detail pages (loaded
server-side in parallel with the entity fetch)
- Add images jsonb column to garden_containers schema + migration 0018
- Add addContainerImage / removeContainerImage / setContainerPrimaryImage
server actions mirroring the plant image pattern (10-image cap, first
upload auto-sets cover)
- Update ContainerDetailDto, listContainers, getContainer to include images
- Rewrite ContainerDetail with Info/Gallery tabs; Gallery tab mirrors
plant gallery (3-col grid, star/X overlays, upload button, counter)
- Update ContainerShareData and container renderSharedView to show cover
image hero and secondary image grid on public share pages
Trailing slashes on /plant/search/ and /plant/detail/ caused Django to
return an HTML redirect page instead of JSON. SDK uses no trailing slashes.
Also updates the helper text to reference OpenPlantBook instead of Perenual.
- getCareDueWidgetRows query: schedule rows due within N days, filtered
by optional container list, ordered by next_due_at
- getGardenOverviewStats query: plant/container/overdue counts + next care
- CareDueWidget: compact list sorted by urgency, inline log-care button,
truncates at 10 rows with View all link
- GardenOverviewWidget: stat row (plants, containers, overdue) + next care
line + garden link
- plant-widget.tsx server component: InlineLogButton uses form action to
call logCare without client JS or navigation
- manifest: garden.care-due and garden.overview widgets registered;
resolveConfigOptions returns container list for care-due config picker
- quickAdds: icons updated (leaf/box/droplets), log-care URL ->
/garden?logCare=1
- calendar-bridge.ts and lists-bridge.ts isolate cross-module deps
- scheduleOnCalendar action: creates event from care schedule with 30-min
slot, title convention (Water/Fertilize/Repot/Prune/custom), reminder opt
- pushOverdueToTaskList action: inserts one task per overdue (plant+schedule)
pair into the default task list, skips duplicate text entries
- CareScheduleEditor: per-row calendar 📅 button opens inline form with
calendar select + optional reminder minutes + success link to /calendar
- Garden page header: PushOverdueButton with auto-dismissing feedback toast
- logCare/deleteCareLog actions with schedule update and reminder wiring
- upsertCareSchedule/deleteCareSchedule/toggleCareSchedule actions
- updateScheduleAfterCare helper cancels old reminder, schedules new one
- getCareLogs/getCareSchedules/getOverduePlants/getCareDueSoon queries
- CareLogForm, CareScheduleEditor, CareHistoryList components
- Plant detail Care tab wired up with schedule editor + log form + history
- Log plant care quick-add added to garden manifest