Adds resource-based calendar view mode
Introduces new ResourceColumnDataSource and ResourceHeaderRenderer to support column rendering by resources instead of dates Enables dynamic calendar mode switching between date and resource views Updates core managers and services to support async column retrieval Refactors data source interfaces to use Promise-based methods Improves calendar flexibility and resource management capabilities
This commit is contained in:
parent
a7d365b186
commit
eeaeddeef8
19 changed files with 765 additions and 991 deletions
|
|
@ -3965,5 +3965,354 @@
|
|||
"duration": 1440,
|
||||
"color": "#795548"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV22-001",
|
||||
"title": "Balayage",
|
||||
"start": "2025-11-22T09:00:00Z",
|
||||
"end": "2025-11-22T11:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"bookingId": "BOOK-NOV22-001",
|
||||
"resourceId": "EMP001",
|
||||
"customerId": "CUST001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 120, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV22-002",
|
||||
"title": "Herreklipning",
|
||||
"start": "2025-11-22T09:30:00Z",
|
||||
"end": "2025-11-22T10:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP003",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 30, "color": "#3f51b5" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV22-003",
|
||||
"title": "Farvning",
|
||||
"start": "2025-11-22T10:00:00Z",
|
||||
"end": "2025-11-22T12:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 120, "color": "#e91e63" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV22-004",
|
||||
"title": "Styling",
|
||||
"start": "2025-11-22T13:00:00Z",
|
||||
"end": "2025-11-22T14:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV22-005",
|
||||
"title": "Vask og føn",
|
||||
"start": "2025-11-22T11:00:00Z",
|
||||
"end": "2025-11-22T11:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 30, "color": "#8bc34a" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV22-006",
|
||||
"title": "Klipning dame",
|
||||
"start": "2025-11-22T14:00:00Z",
|
||||
"end": "2025-11-22T15:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP004",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#009688" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV23-001",
|
||||
"title": "Permanent",
|
||||
"start": "2025-11-23T09:00:00Z",
|
||||
"end": "2025-11-23T11:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 150, "color": "#e91e63" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV23-002",
|
||||
"title": "Skæg trimning",
|
||||
"start": "2025-11-23T10:00:00Z",
|
||||
"end": "2025-11-23T10:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP003",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 30, "color": "#3f51b5" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV23-003",
|
||||
"title": "Highlights",
|
||||
"start": "2025-11-23T12:00:00Z",
|
||||
"end": "2025-11-23T14:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"bookingId": "BOOK-NOV22-001",
|
||||
"resourceId": "EMP001",
|
||||
"customerId": "CUST001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 120, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV23-004",
|
||||
"title": "Assistance",
|
||||
"start": "2025-11-23T13:00:00Z",
|
||||
"end": "2025-11-23T14:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#ff9800" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV24-001",
|
||||
"title": "Bryllupsfrisure",
|
||||
"start": "2025-11-24T08:00:00Z",
|
||||
"end": "2025-11-24T10:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"bookingId": "BOOK-NOV22-001",
|
||||
"resourceId": "EMP001",
|
||||
"customerId": "CUST001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 120, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV24-002",
|
||||
"title": "Ombre",
|
||||
"start": "2025-11-24T10:00:00Z",
|
||||
"end": "2025-11-24T12:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 150, "color": "#e91e63" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV24-003",
|
||||
"title": "Fade klipning",
|
||||
"start": "2025-11-24T11:00:00Z",
|
||||
"end": "2025-11-24T11:45:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP003",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 45, "color": "#3f51b5" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV24-004",
|
||||
"title": "Klipning og vask",
|
||||
"start": "2025-11-24T14:00:00Z",
|
||||
"end": "2025-11-24T15:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP004",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#009688" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV24-005",
|
||||
"title": "Grundklipning elev",
|
||||
"start": "2025-11-24T13:00:00Z",
|
||||
"end": "2025-11-24T14:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#8bc34a" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV25-001",
|
||||
"title": "Balayage kort hår",
|
||||
"start": "2025-11-25T09:00:00Z",
|
||||
"end": "2025-11-25T10:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 90, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV25-002",
|
||||
"title": "Extensions",
|
||||
"start": "2025-11-25T11:00:00Z",
|
||||
"end": "2025-11-25T14:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 180, "color": "#e91e63" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV25-003",
|
||||
"title": "Herreklipning + skæg",
|
||||
"start": "2025-11-25T09:00:00Z",
|
||||
"end": "2025-11-25T10:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP003",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#3f51b5" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV25-004",
|
||||
"title": "Styling special",
|
||||
"start": "2025-11-25T15:00:00Z",
|
||||
"end": "2025-11-25T16:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP004",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 90, "color": "#009688" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV25-005",
|
||||
"title": "Praktik vask",
|
||||
"start": "2025-11-25T10:00:00Z",
|
||||
"end": "2025-11-25T10:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 30, "color": "#ff9800" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV26-001",
|
||||
"title": "Farvekorrektion",
|
||||
"start": "2025-11-26T09:00:00Z",
|
||||
"end": "2025-11-26T12:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 180, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV26-002",
|
||||
"title": "Keratinbehandling",
|
||||
"start": "2025-11-26T10:00:00Z",
|
||||
"end": "2025-11-26T12:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 150, "color": "#e91e63" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV26-003",
|
||||
"title": "Skin fade",
|
||||
"start": "2025-11-26T13:00:00Z",
|
||||
"end": "2025-11-26T13:45:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP003",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 45, "color": "#3f51b5" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV26-004",
|
||||
"title": "Dameklipning lang",
|
||||
"start": "2025-11-26T14:00:00Z",
|
||||
"end": "2025-11-26T15:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP004",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 90, "color": "#009688" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV26-005",
|
||||
"title": "Føntørring træning",
|
||||
"start": "2025-11-26T11:00:00Z",
|
||||
"end": "2025-11-26T12:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#8bc34a" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV27-001",
|
||||
"title": "Full color",
|
||||
"start": "2025-11-27T09:00:00Z",
|
||||
"end": "2025-11-27T11:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"bookingId": "BOOK-NOV22-001",
|
||||
"resourceId": "EMP001",
|
||||
"customerId": "CUST001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 120, "color": "#9c27b0" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV27-002",
|
||||
"title": "Babylights",
|
||||
"start": "2025-11-27T12:00:00Z",
|
||||
"end": "2025-11-27T15:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 180, "color": "#e91e63" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV27-003",
|
||||
"title": "Klassisk herreklip",
|
||||
"start": "2025-11-27T10:00:00Z",
|
||||
"end": "2025-11-27T10:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP003",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 30, "color": "#3f51b5" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV27-004",
|
||||
"title": "Klipning + styling",
|
||||
"start": "2025-11-27T11:00:00Z",
|
||||
"end": "2025-11-27T12:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "EMP004",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 90, "color": "#009688" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV27-005",
|
||||
"title": "Vask assistance",
|
||||
"start": "2025-11-27T14:00:00Z",
|
||||
"end": "2025-11-27T14:30:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT001",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 30, "color": "#8bc34a" }
|
||||
},
|
||||
{
|
||||
"id": "RES-NOV27-006",
|
||||
"title": "Observation",
|
||||
"start": "2025-11-27T15:00:00Z",
|
||||
"end": "2025-11-27T16:00:00Z",
|
||||
"type": "customer",
|
||||
"allDay": false,
|
||||
"resourceId": "STUDENT002",
|
||||
"syncStatus": "synced",
|
||||
"metadata": { "duration": 60, "color": "#ff9800" }
|
||||
}
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue