feat: Add photo galleries to services, resource types management, and UI improvements

Major features:
- Add drag-and-drop photo gallery to Service create/edit modals
- Add Resource Types management section to Settings (CRUD for custom types)
- Add edit icon consistency to Resources table (pencil icon in actions)
- Improve Services page with drag-to-reorder and customer preview mockup

Backend changes:
- Add photos JSONField to Service model with migration
- Add ResourceType model with category (STAFF/OTHER), description fields
- Add ResourceTypeViewSet with CRUD operations
- Add service reorder endpoint for display order

Frontend changes:
- Services page: two-column layout, drag-reorder, photo upload
- Settings page: Resource Types tab with full CRUD modal
- Resources page: Edit icon in actions column instead of row click
- Sidebar: Payments link visibility based on role and paymentsEnabled
- Update types.ts with Service.photos and ResourceTypeDefinition

Note: Removed photos from ResourceType (kept only for Service)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-11-28 01:11:53 -05:00
parent a7c756a8ec
commit b10426fbdb
52 changed files with 4259 additions and 356 deletions

View File

@@ -1,6 +1,6 @@
{
"status": "failed",
"failedTests": [
"7662eeffef95b745c0c7-05f7d22eaed6ca80a04d"
"4ccd3b6df344f024c4e8-470435a1aee1bc432b30"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -0,0 +1,268 @@
# Page snapshot
```yaml
- generic [ref=e1]:
- generic [ref=e3]:
- generic [ref=e5]:
- button "Collapse sidebar" [ref=e6]:
- generic [ref=e7]: DE
- generic [ref=e8]:
- heading "Demo Company" [level=1] [ref=e9]
- paragraph [ref=e10]: demo.smoothschedule.com
- navigation [ref=e11]:
- link "Dashboard" [ref=e12] [cursor=pointer]:
- /url: "#/"
- img [ref=e13]
- generic [ref=e18]: Dashboard
- link "Scheduler" [ref=e19] [cursor=pointer]:
- /url: "#/scheduler"
- img [ref=e20]
- generic [ref=e22]: Scheduler
- link "Customers" [ref=e23] [cursor=pointer]:
- /url: "#/customers"
- img [ref=e24]
- generic [ref=e29]: Customers
- link "Services" [ref=e30] [cursor=pointer]:
- /url: "#/services"
- img [ref=e31]
- generic [ref=e34]: Services
- link "Resources" [ref=e35] [cursor=pointer]:
- /url: "#/resources"
- img [ref=e36]
- generic [ref=e39]: Resources
- generic "Payments are disabled. Enable them in Business Settings to accept payments from customers." [ref=e40]:
- img [ref=e41]
- generic [ref=e43]: Payments
- link "Messages" [ref=e44] [cursor=pointer]:
- /url: "#/messages"
- img [ref=e45]
- generic [ref=e47]: Messages
- link "Staff" [ref=e48] [cursor=pointer]:
- /url: "#/staff"
- img [ref=e49]
- generic [ref=e54]: Staff
- link "Business Settings" [ref=e56] [cursor=pointer]:
- /url: "#/settings"
- img [ref=e57]
- generic [ref=e60]: Business Settings
- generic [ref=e61]:
- generic [ref=e62]:
- img [ref=e63]
- generic [ref=e69]:
- generic [ref=e70]: Powered by
- text: Smooth Schedule
- button "Sign Out" [ref=e71]:
- img [ref=e72]
- generic [ref=e75]: Sign Out
- generic [ref=e76]:
- banner [ref=e77]:
- generic [ref=e79]:
- img [ref=e81]
- textbox "Search" [ref=e84]
- generic [ref=e85]:
- button "🇺🇸 English" [ref=e87]:
- img [ref=e88]
- generic [ref=e91]: 🇺🇸
- generic [ref=e92]: English
- img [ref=e93]
- button [ref=e95]:
- img [ref=e96]
- button [ref=e98]:
- img [ref=e99]
- button "Business Owner Owner BO" [ref=e104]:
- generic [ref=e105]:
- paragraph [ref=e106]: Business Owner
- paragraph [ref=e107]: Owner
- generic [ref=e108]: BO
- img [ref=e109]
- main [active] [ref=e111]:
- generic [ref=e112]:
- generic [ref=e113]:
- heading "Dashboard" [level=2] [ref=e114]
- paragraph [ref=e115]: Today's Overview
- generic [ref=e116]:
- generic [ref=e117]:
- paragraph [ref=e118]: Total Appointments
- generic [ref=e119]:
- generic [ref=e120]: "50"
- generic [ref=e121]:
- img [ref=e122]
- text: +12%
- generic [ref=e125]:
- paragraph [ref=e126]: Customers
- generic [ref=e127]:
- generic [ref=e128]: "1"
- generic [ref=e129]:
- img [ref=e130]
- text: +8%
- generic [ref=e133]:
- paragraph [ref=e134]: Services
- generic [ref=e135]:
- generic [ref=e136]: "5"
- generic [ref=e137]:
- img [ref=e138]
- text: 0%
- generic [ref=e139]:
- paragraph [ref=e140]: Resources
- generic [ref=e141]:
- generic [ref=e142]: "4"
- generic [ref=e143]:
- img [ref=e144]
- text: +3%
- generic [ref=e147]:
- generic [ref=e149]:
- generic [ref=e150]:
- img [ref=e152]
- heading "Quick Add Appointment" [level=3] [ref=e154]
- generic [ref=e155]:
- generic [ref=e156]:
- generic [ref=e157]:
- img [ref=e158]
- text: Customer
- combobox [ref=e161]:
- option "Walk-in / No customer" [selected]
- option "Customer User (customer@demo.com)"
- generic [ref=e162]:
- generic [ref=e163]:
- img [ref=e164]
- text: Service *
- combobox [ref=e167]:
- option "Select service..." [selected]
- option "Beard Trim (15 min - $15)"
- option "Consultation (30 min - $0)"
- option "Full Styling (60 min - $75)"
- option "Hair Coloring (90 min - $120)"
- option "Haircut (30 min - $35)"
- generic [ref=e168]:
- generic [ref=e169]:
- img [ref=e170]
- text: Resource
- combobox [ref=e173]:
- option "Unassigned" [selected]
- option "Conference Room A"
- option "Dental Chair 1"
- option "Meeting Room B"
- option "Meeting Room B"
- generic [ref=e174]:
- generic [ref=e175]:
- generic [ref=e176]: Date *
- textbox [ref=e177]: 2025-11-27
- generic [ref=e178]:
- generic [ref=e179]:
- img [ref=e180]
- text: Time *
- combobox [ref=e183]:
- option "06:00"
- option "06:15"
- option "06:30"
- option "06:45"
- option "07:00"
- option "07:15"
- option "07:30"
- option "07:45"
- option "08:00"
- option "08:15"
- option "08:30"
- option "08:45"
- option "09:00" [selected]
- option "09:15"
- option "09:30"
- option "09:45"
- option "10:00"
- option "10:15"
- option "10:30"
- option "10:45"
- option "11:00"
- option "11:15"
- option "11:30"
- option "11:45"
- option "12:00"
- option "12:15"
- option "12:30"
- option "12:45"
- option "13:00"
- option "13:15"
- option "13:30"
- option "13:45"
- option "14:00"
- option "14:15"
- option "14:30"
- option "14:45"
- option "15:00"
- option "15:15"
- option "15:30"
- option "15:45"
- option "16:00"
- option "16:15"
- option "16:30"
- option "16:45"
- option "17:00"
- option "17:15"
- option "17:30"
- option "17:45"
- option "18:00"
- option "18:15"
- option "18:30"
- option "18:45"
- option "19:00"
- option "19:15"
- option "19:30"
- option "19:45"
- option "20:00"
- option "20:15"
- option "20:30"
- option "20:45"
- option "21:00"
- option "21:15"
- option "21:30"
- option "21:45"
- option "22:00"
- option "22:15"
- option "22:30"
- option "22:45"
- generic [ref=e184]:
- generic [ref=e185]:
- img [ref=e186]
- text: Notes
- textbox "Optional notes..." [ref=e189]
- button "Add Appointment" [disabled] [ref=e190]:
- img [ref=e191]
- text: Add Appointment
- generic [ref=e193]:
- heading "Total Revenue" [level=3] [ref=e194]
- application [ref=e198]:
- generic [ref=e202]:
- generic [ref=e203]:
- generic [ref=e205]: Mon
- generic [ref=e207]: Tue
- generic [ref=e209]: Wed
- generic [ref=e211]: Thu
- generic [ref=e213]: Fri
- generic [ref=e215]: Sat
- generic [ref=e217]: Sun
- generic [ref=e218]:
- generic [ref=e220]: $0
- generic [ref=e222]: $1
- generic [ref=e224]: $2
- generic [ref=e226]: $3
- generic [ref=e228]: $4
- generic [ref=e229]:
- heading "Upcoming Appointments" [level=3] [ref=e230]
- application [ref=e234]:
- generic [ref=e250]:
- generic [ref=e251]:
- generic [ref=e253]: Mon
- generic [ref=e255]: Tue
- generic [ref=e257]: Wed
- generic [ref=e259]: Thu
- generic [ref=e261]: Fri
- generic [ref=e263]: Sat
- generic [ref=e265]: Sun
- generic [ref=e266]:
- generic [ref=e268]: "0"
- generic [ref=e270]: "3"
- generic [ref=e272]: "6"
- generic [ref=e274]: "9"
- generic [ref=e276]: "12"
- generic [ref=e277]: "0"
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB