5.1 KiB
5.1 KiB
Plannable Items Feature - Plan of Attack
Overview
Implement a plannable items feature for trips, with a simplified 3-table structure that allows users to create items and organize them into calendar slots.
Database Structure (3 tables)
1. plannable_items table
id(primary key)trip_id(foreign key to trips)name(string)type(enum: hotel/restaurant/attraction/transport/activity)address(string, nullable)notes(text, nullable)metadata(JSON for type-specific fields)created_at,updated_at
2. calendar_slots table
id(primary key)trip_id(foreign key to trips)name(string, e.g., "Monday", "Day 1", "Morning of Day 2")datetime_start,datetime_endslot_date(date)slot_order(integer, for sorting)created_at,updated_at
3. planned_items table (junction)
id(primary key)plannable_item_id(foreign key)calendar_slot_id(foreign key)created_at,updated_at
Slot Management Strategy
- Auto-create day-based slots when trip is created or dates are updated
- Generate one slot per day between start_date and end_date
- Items can exist in "unplanned" state (no slot assignment) or be assigned to a slot
Backend Implementation
1. Database Migrations
- Create migration for
plannable_itemstable - Create migration for
calendar_slotstable - Create migration for
planned_itemsjunction table
2. Models and Relationships
PlannableItemmodel (belongs to Trip, belongs to many CalendarSlots through PlannedItems)CalendarSlotmodel (belongs to Trip, has many PlannableItems through PlannedItems)PlannedItemmodel (junction model with additional attributes)- Update
Tripmodel to include relationships
3. Business Logic
- Auto-create/update slots when trip dates change
- Handle slot regeneration when dates are modified
- Preserve existing planned items when possible
4. API Endpoints
GET /api/trips/{id}/plannables - List all plannable items for a trip
POST /api/trips/{id}/plannables - Create new plannable item
PUT /api/plannables/{id} - Update plannable item
DELETE /api/plannables/{id} - Delete plannable item
GET /api/trips/{id}/calendar-slots - Get all slots for a trip
PUT /api/calendar-slots/{id} - Update slot (rename)
POST /api/planned-items - Assign item to slot
PUT /api/planned-items/{id} - Update assignment (change slot, time, order)
DELETE /api/planned-items/{id} - Unassign item from slot
PUT /api/calendar-slots/{id}/reorder - Reorder items within a slot
Frontend Implementation
1. Routing Setup
- Install
react-router-dompackage - Configure routes in App.jsx
- Add route for trip detail page:
/trip/:id
2. Trip Detail Page (TripDetail.jsx)
- Header section: Display trip name, dates, description
- Two-column layout:
- Left: Plannable items sidebar
- Right: Calendar view (future implementation)
3. Plannable Items Sidebar Components
PlannablesList.jsx
- "+" button at top to add new items
- "Unplanned Items" section
- Day slot sections with assigned items
- Drag & drop functionality between sections
PlannableItem.jsx
- Display item with type icon
- Show name and key details
- Edit/Delete actions
- Draggable wrapper
PlannableForm.jsx
- Modal/slide-out form
- Dynamic fields based on item type
- Validation
4. Update Existing Components
- Make
TripCardclickable - Add navigation to trip detail on click
- Update Dashboard to handle navigation
5. State Management
- Consider using Context or simple state management for:
- Plannable items list
- Calendar slots
- Drag & drop state
UI/UX Considerations
- Type-specific icons (🏨 hotel, 🍽️ restaurant, 🎯 attraction, ✈️ transport, 🎭 activity)
- Color coding for different types
- Smooth drag & drop animations
- Loading states during API calls
- Confirmation dialogs for deletions
- Toast notifications for actions
Implementation Order
- ✅ Backend migrations and models - COMPLETED
- Created migrations for plannable_items, calendar_slots, planned_items tables
- Created models with relationships
- ✅ Backend API endpoints - COMPLETED
- Created controllers for PlannableItem, CalendarSlot, PlannedItem
- Added all routes to api.php
- Organized controllers in DDD structure (Infrastructure/Domain)
- ✅ Auto-slot creation - COMPLETED
- Created CalendarSlotService
- Created TripObserver to auto-create slots on trip creation/update
- Registered service provider
- ⏳ Frontend routing setup - TODO
- ⏳ Trip detail page structure - TODO
- ⏳ Plannable items CRUD - TODO
- ⏳ Calendar slots display - TODO
- ⏳ Drag & drop functionality - TODO
- ⏳ Polish and edge cases - TODO
Future Enhancements (Not in MVP)
- Calendar view in right column
- Time-based slots (morning/afternoon/evening)
- Collaborative features (share with travel companions)
- Import from external sources (booking confirmations)
- Export to PDF/calendar formats
- Cost tracking and budgeting
- Map view of planned items