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:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"failedTests": [
|
||||
"7662eeffef95b745c0c7-05f7d22eaed6ca80a04d"
|
||||
"4ccd3b6df344f024c4e8-470435a1aee1bc432b30"
|
||||
]
|
||||
}
|
||||
BIN
frontend/test-results/before-scheduler-click.png
Normal file
BIN
frontend/test-results/before-scheduler-click.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
@@ -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 |
Reference in New Issue
Block a user