@fayz-ai/plugin-agenda 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/AgendaContext.d.ts +13 -0
- package/dist/AgendaContext.d.ts.map +1 -0
- package/dist/AgendaPage.d.ts +11 -0
- package/dist/AgendaPage.d.ts.map +1 -0
- package/dist/bridges/create-financial-bridge.d.ts +19 -0
- package/dist/bridges/create-financial-bridge.d.ts.map +1 -0
- package/dist/calendar-styles.d.ts +8 -0
- package/dist/calendar-styles.d.ts.map +1 -0
- package/dist/chunk-3LJKZQK4.js +12 -0
- package/dist/chunk-3LJKZQK4.js.map +1 -0
- package/dist/chunk-SYDBDI3Q.cjs +15 -0
- package/dist/chunk-SYDBDI3Q.cjs.map +1 -0
- package/dist/components/AgendaGeneralSettings.d.ts +3 -0
- package/dist/components/AgendaGeneralSettings.d.ts.map +1 -0
- package/dist/components/AppointmentModal.d.ts +16 -0
- package/dist/components/AppointmentModal.d.ts.map +1 -0
- package/dist/components/AppointmentPopover.d.ts +14 -0
- package/dist/components/AppointmentPopover.d.ts.map +1 -0
- package/dist/components/BookingPaymentPanel.d.ts +18 -0
- package/dist/components/BookingPaymentPanel.d.ts.map +1 -0
- package/dist/components/CalendarSidebar.d.ts +3 -0
- package/dist/components/CalendarSidebar.d.ts.map +1 -0
- package/dist/components/CalendarToolbar.d.ts +13 -0
- package/dist/components/CalendarToolbar.d.ts.map +1 -0
- package/dist/components/EventContextMenu.d.ts +14 -0
- package/dist/components/EventContextMenu.d.ts.map +1 -0
- package/dist/components/FloatingPanel.d.ts +27 -0
- package/dist/components/FloatingPanel.d.ts.map +1 -0
- package/dist/components/MiniCalendar.d.ts +9 -0
- package/dist/components/MiniCalendar.d.ts.map +1 -0
- package/dist/components/PaymentStatusBadge.d.ts +13 -0
- package/dist/components/PaymentStatusBadge.d.ts.map +1 -0
- package/dist/components/SearchCombobox.d.ts +38 -0
- package/dist/components/SearchCombobox.d.ts.map +1 -0
- package/dist/components/StatusBadge.d.ts +5 -0
- package/dist/components/StatusBadge.d.ts.map +1 -0
- package/dist/config.d.ts +151 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/data/index.d.ts +4 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/mock.d.ts +3 -0
- package/dist/data/mock.d.ts.map +1 -0
- package/dist/data/supabase.d.ts +3 -0
- package/dist/data/supabase.d.ts.map +1 -0
- package/dist/data/types.d.ts +26 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/financial-bridge.d.ts +92 -0
- package/dist/financial-bridge.d.ts.map +1 -0
- package/dist/hooks/useAgendaSettings.d.ts +7 -0
- package/dist/hooks/useAgendaSettings.d.ts.map +1 -0
- package/dist/index.cjs +5135 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5120 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/tenant.d.ts +3 -0
- package/dist/lib/tenant.d.ts.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/index.d.ts +2 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/pt-BR.d.ts +2 -0
- package/dist/locales/pt-BR.d.ts.map +1 -0
- package/dist/registries.d.ts +3 -0
- package/dist/registries.d.ts.map +1 -0
- package/dist/store.d.ts +66 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/tenant-222EHYUC.cjs +16 -0
- package/dist/tenant-222EHYUC.cjs.map +1 -0
- package/dist/tenant-LAUWVUYB.js +3 -0
- package/dist/tenant-LAUWVUYB.js.map +1 -0
- package/dist/types.d.ts +202 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/views/CalendarView.d.ts +3 -0
- package/dist/views/CalendarView.d.ts.map +1 -0
- package/dist/views/ConfirmationsView.d.ts +3 -0
- package/dist/views/ConfirmationsView.d.ts.map +1 -0
- package/package.json +63 -0
- package/src/AgendaContext.tsx +11 -0
- package/src/AgendaPage.tsx +33 -0
- package/src/bridges/create-financial-bridge.ts +298 -0
- package/src/calendar-styles.css +245 -0
- package/src/calendar-styles.ts +285 -0
- package/src/components/AgendaGeneralSettings.tsx +64 -0
- package/src/components/AppointmentModal.tsx +1031 -0
- package/src/components/AppointmentPopover.tsx +221 -0
- package/src/components/BookingPaymentPanel.tsx +394 -0
- package/src/components/CalendarSidebar.tsx +119 -0
- package/src/components/CalendarToolbar.tsx +83 -0
- package/src/components/EventContextMenu.tsx +122 -0
- package/src/components/FloatingPanel.tsx +123 -0
- package/src/components/MiniCalendar.tsx +120 -0
- package/src/components/PaymentStatusBadge.tsx +62 -0
- package/src/components/SearchCombobox.tsx +216 -0
- package/src/components/StatusBadge.tsx +23 -0
- package/src/config.ts +269 -0
- package/src/data/index.ts +3 -0
- package/src/data/mock.ts +324 -0
- package/src/data/supabase.ts +570 -0
- package/src/data/types.ts +37 -0
- package/src/financial-bridge.ts +96 -0
- package/src/hooks/useAgendaSettings.ts +17 -0
- package/src/index.ts +180 -0
- package/src/lib/tenant.ts +3 -0
- package/src/locales/en.ts +207 -0
- package/src/locales/index.ts +7 -0
- package/src/locales/pt-BR.ts +207 -0
- package/src/registries.ts +36 -0
- package/src/store.ts +304 -0
- package/src/types.ts +265 -0
- package/src/views/CalendarView.tsx +904 -0
- package/src/views/ConfirmationsView.tsx +155 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/lib/tenant.ts"],"names":[],"mappings":"AACA,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,QAAW;AACnE,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAAa"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6MrC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/locales/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGhE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6MvC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AA4BtD,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAO/C,CAAA"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type StoreApi } from 'zustand/vanilla';
|
|
2
|
+
import type { AgendaDataProvider } from './data/types';
|
|
3
|
+
import type { AgendaFinancialBridge } from './financial-bridge';
|
|
4
|
+
import type { CalendarBooking, Professional, Schedule, CreateBookingInput, UpdateBookingInput } from './types';
|
|
5
|
+
export interface AgendaUIState {
|
|
6
|
+
bookings: CalendarBooking[];
|
|
7
|
+
bookingsLoading: boolean;
|
|
8
|
+
dateRange: {
|
|
9
|
+
start: string;
|
|
10
|
+
end: string;
|
|
11
|
+
};
|
|
12
|
+
currentView: string;
|
|
13
|
+
selectedDate: string;
|
|
14
|
+
professionals: Professional[];
|
|
15
|
+
professionalsLoading: boolean;
|
|
16
|
+
selectedProfessionalIds: string[];
|
|
17
|
+
selectedLocationId: string | null;
|
|
18
|
+
selectedStatuses: string[];
|
|
19
|
+
locations: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
}>;
|
|
23
|
+
schedules: Schedule[];
|
|
24
|
+
schedulesLoading: boolean;
|
|
25
|
+
pendingConfirmations: CalendarBooking[];
|
|
26
|
+
confirmationsLoading: boolean;
|
|
27
|
+
appointmentModal: {
|
|
28
|
+
open: boolean;
|
|
29
|
+
mode: 'create' | 'edit';
|
|
30
|
+
bookingId?: string;
|
|
31
|
+
prefill?: Partial<CreateBookingInput> & {
|
|
32
|
+
endsAt?: string;
|
|
33
|
+
};
|
|
34
|
+
initialTab?: string;
|
|
35
|
+
};
|
|
36
|
+
fetchBookings(range: {
|
|
37
|
+
start: string;
|
|
38
|
+
end: string;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
fetchProfessionals(): Promise<void>;
|
|
41
|
+
fetchLocations(): Promise<void>;
|
|
42
|
+
fetchSchedules(professionalId?: string): Promise<void>;
|
|
43
|
+
fetchConfirmations(): Promise<void>;
|
|
44
|
+
createBooking(input: CreateBookingInput): Promise<CalendarBooking>;
|
|
45
|
+
updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking>;
|
|
46
|
+
deleteBooking(id: string): Promise<void>;
|
|
47
|
+
updateBookingStatus(id: string, status: string): Promise<void>;
|
|
48
|
+
rescheduleBooking(id: string, newStart: string, newEnd: string, newProfessionalId?: string): Promise<void>;
|
|
49
|
+
setFilters(filters: Partial<{
|
|
50
|
+
professionalIds: string[];
|
|
51
|
+
locationId: string | null;
|
|
52
|
+
statuses: string[];
|
|
53
|
+
}>): void;
|
|
54
|
+
setView(view: string): void;
|
|
55
|
+
setSelectedDate(date: string): void;
|
|
56
|
+
openAppointmentModal(mode: 'create' | 'edit', options?: {
|
|
57
|
+
bookingId?: string;
|
|
58
|
+
prefill?: Partial<CreateBookingInput> & {
|
|
59
|
+
endsAt?: string;
|
|
60
|
+
};
|
|
61
|
+
initialTab?: string;
|
|
62
|
+
}): void;
|
|
63
|
+
closeAppointmentModal(): void;
|
|
64
|
+
}
|
|
65
|
+
export declare function createAgendaStore(provider: AgendaDataProvider, financialBridge?: AgendaFinancialBridge): StoreApi<AgendaUIState>;
|
|
66
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAI5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,KAAK,EACV,eAAe,EAAE,YAAY,EAAE,QAAQ,EACvC,kBAAkB,EAAE,kBAAkB,EACvC,MAAM,SAAS,CAAA;AAMhB,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,eAAe,EAAE,OAAO,CAAA;IACxB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IAGpB,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,oBAAoB,EAAE,OAAO,CAAA;IAG7B,uBAAuB,EAAE,MAAM,EAAE,CAAA;IACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAG1B,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAG9C,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,gBAAgB,EAAE,OAAO,CAAA;IAGzB,oBAAoB,EAAE,eAAe,EAAE,CAAA;IACvC,oBAAoB,EAAE,OAAO,CAAA;IAG7B,gBAAgB,EAAE;QAChB,IAAI,EAAE,OAAO,CAAA;QACb,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;QACvB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IAGD,aAAa,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnE,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtD,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAClE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAC7E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1G,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;QAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI,CAAA;IAChH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACvK,qBAAqB,IAAI,IAAI,CAAA;CAC9B;AAeD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAE,qBAAqB,GAAG,QAAQ,CAAC,aAAa,CAAC,CA4NhI"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkSYDBDI3Q_cjs = require('./chunk-SYDBDI3Q.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "getAgendaTenantId", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkSYDBDI3Q_cjs.getAgendaTenantId; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "setAgendaTenantId", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkSYDBDI3Q_cjs.setAgendaTenantId; }
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=tenant-222EHYUC.cjs.map
|
|
16
|
+
//# sourceMappingURL=tenant-222EHYUC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"tenant-222EHYUC.cjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"tenant-LAUWVUYB.js"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/** Booking status lifecycle */
|
|
2
|
+
export type BookingStatus = 'scheduled' | 'confirmed' | 'in_progress' | 'completed' | 'cancelled' | 'no_show';
|
|
3
|
+
/** Confirmation outreach status */
|
|
4
|
+
export type ConfirmationStatus = 'pending' | 'sent' | 'confirmed' | 'declined';
|
|
5
|
+
/** Booking type identifier — extensible via string literal union */
|
|
6
|
+
export type BookingTypeId = 'appointment' | 'task' | 'out_of_office' | 'block' | (string & {});
|
|
7
|
+
/** Configuration for a booking type (event type) */
|
|
8
|
+
export interface BookingTypeConfig {
|
|
9
|
+
id: BookingTypeId;
|
|
10
|
+
label: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
color: string;
|
|
13
|
+
fields: {
|
|
14
|
+
client: boolean;
|
|
15
|
+
professional: boolean;
|
|
16
|
+
services: boolean;
|
|
17
|
+
location: boolean;
|
|
18
|
+
status: boolean;
|
|
19
|
+
};
|
|
20
|
+
requiresServices: boolean;
|
|
21
|
+
requiresClient: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** A booking service line item (from saas_core.booking_items) */
|
|
24
|
+
export interface BookingService {
|
|
25
|
+
id: string;
|
|
26
|
+
serviceId: string | null;
|
|
27
|
+
name: string;
|
|
28
|
+
durationMinutes: number;
|
|
29
|
+
price: number;
|
|
30
|
+
assigneeId: string | null;
|
|
31
|
+
}
|
|
32
|
+
/** Calendar booking — the main entity rendered on the calendar (from v_bookings view on orders) */
|
|
33
|
+
export interface CalendarBooking {
|
|
34
|
+
id: string;
|
|
35
|
+
tenantId: string;
|
|
36
|
+
kind: string;
|
|
37
|
+
/** Lifecycle stage: booked, invoiced, paid, etc. */
|
|
38
|
+
stage?: string;
|
|
39
|
+
/** Financial direction: credit, debit, null */
|
|
40
|
+
direction?: string | null;
|
|
41
|
+
startsAt: string;
|
|
42
|
+
endsAt: string | null;
|
|
43
|
+
status: BookingStatus;
|
|
44
|
+
notes: string | null;
|
|
45
|
+
/** In unified model, orderId === id (the booking IS the order) */
|
|
46
|
+
orderId: string | null;
|
|
47
|
+
locationId: string | null;
|
|
48
|
+
metadata: Record<string, unknown>;
|
|
49
|
+
clientId: string | null;
|
|
50
|
+
clientName: string | null;
|
|
51
|
+
clientPhone: string | null;
|
|
52
|
+
clientEmail: string | null;
|
|
53
|
+
clientAvatarUrl: string | null;
|
|
54
|
+
professionalId: string | null;
|
|
55
|
+
professionalName: string | null;
|
|
56
|
+
professionalAvatarUrl: string | null;
|
|
57
|
+
locationName: string | null;
|
|
58
|
+
orderTotal: number | null;
|
|
59
|
+
orderStatus: string | null;
|
|
60
|
+
/** Payment status from financial bridge (enriched at runtime) */
|
|
61
|
+
paymentStatus?: import('./financial-bridge').BookingPaymentStatus;
|
|
62
|
+
services: BookingService[] | null;
|
|
63
|
+
totalDurationMinutes: number | null;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
updatedAt: string;
|
|
66
|
+
}
|
|
67
|
+
/** Professional / staff resource for the calendar */
|
|
68
|
+
export interface Professional {
|
|
69
|
+
id: string;
|
|
70
|
+
name: string;
|
|
71
|
+
avatarUrl: string | null;
|
|
72
|
+
locationId: string | null;
|
|
73
|
+
locationName: string | null;
|
|
74
|
+
isActive: boolean;
|
|
75
|
+
}
|
|
76
|
+
/** Working hours schedule (from saas_core.schedules) */
|
|
77
|
+
export interface Schedule {
|
|
78
|
+
id: string;
|
|
79
|
+
tenantId: string;
|
|
80
|
+
kind: string;
|
|
81
|
+
assigneeId: string | null;
|
|
82
|
+
locationId: string | null;
|
|
83
|
+
dayOfWeek: number | null;
|
|
84
|
+
specificDate: string | null;
|
|
85
|
+
startsAt: string;
|
|
86
|
+
endsAt: string;
|
|
87
|
+
isActive: boolean;
|
|
88
|
+
metadata: Record<string, unknown>;
|
|
89
|
+
}
|
|
90
|
+
/** Available time slot */
|
|
91
|
+
export interface TimeSlot {
|
|
92
|
+
start: string;
|
|
93
|
+
end: string;
|
|
94
|
+
}
|
|
95
|
+
/** Confirmation record stored in booking metadata */
|
|
96
|
+
export interface ConfirmationRecord {
|
|
97
|
+
channel: string;
|
|
98
|
+
sentAt: string;
|
|
99
|
+
status: ConfirmationStatus;
|
|
100
|
+
confirmedAt?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* When a status is available for selection relative to the booking date.
|
|
104
|
+
* - 'always' — any date (e.g. scheduled, confirmed, cancelled)
|
|
105
|
+
* - 'today_or_past' — booking is today or earlier (e.g. completed, no_show)
|
|
106
|
+
* - 'today_only' — booking is today (e.g. in_progress)
|
|
107
|
+
*/
|
|
108
|
+
export type StatusAvailability = 'always' | 'today_or_past' | 'today_only';
|
|
109
|
+
export interface StatusConfig {
|
|
110
|
+
value: string;
|
|
111
|
+
label: string;
|
|
112
|
+
color: string;
|
|
113
|
+
/** When this status can be selected (default: 'always') */
|
|
114
|
+
availableWhen?: StatusAvailability;
|
|
115
|
+
}
|
|
116
|
+
/** Check if a status is available for a given booking date */
|
|
117
|
+
export declare function isStatusAvailable(status: StatusConfig, bookingStartsAt: string): boolean;
|
|
118
|
+
/** Props passed to every booking modal tab component */
|
|
119
|
+
export interface BookingModalTabProps {
|
|
120
|
+
bookingId?: string;
|
|
121
|
+
clientId: string;
|
|
122
|
+
orderId: string | null;
|
|
123
|
+
services: Array<{
|
|
124
|
+
name: string;
|
|
125
|
+
price: number;
|
|
126
|
+
durationMinutes: number;
|
|
127
|
+
}>;
|
|
128
|
+
formatCurrency: (amount: number) => string;
|
|
129
|
+
onDataChange?: () => void;
|
|
130
|
+
}
|
|
131
|
+
/** A tab registered in the booking edit modal */
|
|
132
|
+
export interface BookingModalTab {
|
|
133
|
+
id: string;
|
|
134
|
+
label: string;
|
|
135
|
+
icon: string;
|
|
136
|
+
order: number;
|
|
137
|
+
component: React.ComponentType<BookingModalTabProps>;
|
|
138
|
+
visible?: (ctx: {
|
|
139
|
+
mode: 'create' | 'edit';
|
|
140
|
+
clientId?: string;
|
|
141
|
+
orderId?: string;
|
|
142
|
+
}) => boolean;
|
|
143
|
+
}
|
|
144
|
+
export interface CreateBookingInput {
|
|
145
|
+
kind?: BookingTypeId;
|
|
146
|
+
clientId: string;
|
|
147
|
+
professionalId: string;
|
|
148
|
+
locationId?: string;
|
|
149
|
+
startsAt: string;
|
|
150
|
+
notes?: string;
|
|
151
|
+
services: CreateBookingServiceInput[];
|
|
152
|
+
}
|
|
153
|
+
export interface CreateBookingServiceInput {
|
|
154
|
+
serviceId: string;
|
|
155
|
+
name: string;
|
|
156
|
+
durationMinutes: number;
|
|
157
|
+
price: number;
|
|
158
|
+
assigneeId?: string;
|
|
159
|
+
}
|
|
160
|
+
export interface UpdateBookingInput {
|
|
161
|
+
clientId?: string;
|
|
162
|
+
professionalId?: string;
|
|
163
|
+
locationId?: string;
|
|
164
|
+
startsAt?: string;
|
|
165
|
+
endsAt?: string;
|
|
166
|
+
status?: BookingStatus;
|
|
167
|
+
notes?: string;
|
|
168
|
+
services?: CreateBookingServiceInput[];
|
|
169
|
+
}
|
|
170
|
+
export interface SaveScheduleInput {
|
|
171
|
+
assigneeId: string;
|
|
172
|
+
locationId?: string;
|
|
173
|
+
dayOfWeek?: number;
|
|
174
|
+
specificDate?: string;
|
|
175
|
+
startsAt: string;
|
|
176
|
+
endsAt: string;
|
|
177
|
+
isActive?: boolean;
|
|
178
|
+
metadata?: Record<string, unknown>;
|
|
179
|
+
}
|
|
180
|
+
export interface BookingQuery {
|
|
181
|
+
dateRange: {
|
|
182
|
+
start: string;
|
|
183
|
+
end: string;
|
|
184
|
+
};
|
|
185
|
+
professionalIds?: string[];
|
|
186
|
+
locationId?: string;
|
|
187
|
+
statuses?: string[];
|
|
188
|
+
kind?: string;
|
|
189
|
+
}
|
|
190
|
+
export interface ConflictCheckParams {
|
|
191
|
+
assigneeId: string;
|
|
192
|
+
startsAt: string;
|
|
193
|
+
endsAt: string;
|
|
194
|
+
excludeBookingId?: string;
|
|
195
|
+
}
|
|
196
|
+
export interface AvailableSlotsParams {
|
|
197
|
+
assigneeId: string;
|
|
198
|
+
date: string;
|
|
199
|
+
durationMinutes: number;
|
|
200
|
+
slotInterval?: number;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../../src/views/CalendarView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AA4OhF,wBAAgB,YAAY,sBA2pB3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmationsView.d.ts","sourceRoot":"","sources":["../../src/views/ConfirmationsView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAiCxC,wBAAgB,iBAAiB,sBAyHhC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fayz-ai/plugin-agenda",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Fayz SDK — plugin-agenda plugin",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"source": "./src/index.ts",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"src"
|
|
20
|
+
],
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
23
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"lucide-react": "^0.400.0",
|
|
27
|
+
"zustand": "^4.5.0",
|
|
28
|
+
"@fullcalendar/core": "^6.1.20",
|
|
29
|
+
"@fullcalendar/daygrid": "^6.1.20",
|
|
30
|
+
"@fullcalendar/timegrid": "^6.1.20",
|
|
31
|
+
"@fullcalendar/react": "^6.1.20",
|
|
32
|
+
"@fullcalendar/interaction": "^6.1.20",
|
|
33
|
+
"@tanstack/react-table": "^8.20.0",
|
|
34
|
+
"@fullcalendar/resource-timegrid": "^6.1.0",
|
|
35
|
+
"@fullcalendar/list": "^6.1.0",
|
|
36
|
+
"@fayz-ai/core": "^0.1.7",
|
|
37
|
+
"@fayz-ai/ui": "^0.1.7",
|
|
38
|
+
"@fayz-ai/saas": "^0.1.7",
|
|
39
|
+
"@fayz-ai/plugin-financial": "^0.1.2"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/react": "^18.3.0",
|
|
43
|
+
"react": "^18.3.0",
|
|
44
|
+
"tsup": "^8.2.0",
|
|
45
|
+
"typescript": "^5.5.0",
|
|
46
|
+
"@types/react-dom": "^18.3.0"
|
|
47
|
+
},
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"keywords": [
|
|
50
|
+
"fayz",
|
|
51
|
+
"fayz-plugin",
|
|
52
|
+
"fayz-sdk"
|
|
53
|
+
],
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"build": "tsup && tsc --emitDeclarationOnly --declaration --declarationMap --noEmit false",
|
|
59
|
+
"dev": "tsup --watch",
|
|
60
|
+
"typecheck": "tsc --noEmit",
|
|
61
|
+
"clean": "rm -rf dist"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createPluginContext } from '@fayz-ai/saas'
|
|
2
|
+
import type { ResolvedAgendaConfig } from './config'
|
|
3
|
+
import type { AgendaDataProvider } from './data/types'
|
|
4
|
+
import type { AgendaUIState } from './store'
|
|
5
|
+
|
|
6
|
+
const ctx = createPluginContext<ResolvedAgendaConfig, AgendaDataProvider, AgendaUIState>('AgendaPage')
|
|
7
|
+
|
|
8
|
+
export const AgendaContextProvider = ctx.ContextProvider
|
|
9
|
+
export const useAgendaConfig = ctx.useConfig
|
|
10
|
+
export const useAgendaProvider = ctx.useProvider
|
|
11
|
+
export const useAgendaStore = ctx.useStore
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { usePluginRuntimeOptional } from '@fayz-ai/core'
|
|
3
|
+
import type { StoreApi } from 'zustand/vanilla'
|
|
4
|
+
import { AgendaContextProvider } from './AgendaContext'
|
|
5
|
+
import type { ResolvedAgendaConfig } from './config'
|
|
6
|
+
import type { AgendaDataProvider } from './data/types'
|
|
7
|
+
import type { AgendaUIState } from './store'
|
|
8
|
+
import { CalendarView } from './views/CalendarView'
|
|
9
|
+
import { setAgendaTenantId } from './lib/tenant'
|
|
10
|
+
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Main page — clean single-page calendar, no module nav wrapper
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
export function AgendaPage({ config, provider, store }: {
|
|
16
|
+
config: ResolvedAgendaConfig
|
|
17
|
+
provider: AgendaDataProvider
|
|
18
|
+
store: StoreApi<AgendaUIState>
|
|
19
|
+
}) {
|
|
20
|
+
const runtime = usePluginRuntimeOptional()
|
|
21
|
+
const tenantId = runtime?.context.tenant?.id
|
|
22
|
+
|
|
23
|
+
React.useEffect(() => {
|
|
24
|
+
setAgendaTenantId(tenantId)
|
|
25
|
+
return () => setAgendaTenantId(undefined)
|
|
26
|
+
}, [tenantId])
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<AgendaContextProvider config={config} provider={provider} store={store}>
|
|
30
|
+
<CalendarView />
|
|
31
|
+
</AgendaContextProvider>
|
|
32
|
+
)
|
|
33
|
+
}
|