Files
smoothschedule/frontend/playwright-report/data/2a18c07f8cb8b46b200c1a5f81ddde2ae1b0547c.md
poduck b10426fbdb 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>
2025-11-28 01:11:53 -05:00

10 KiB

Page snapshot

- 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"