@vicacha-devs/strapi-plugin-bookings 0.0.0-stage → 1.0.0
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/LICENSE.md +21 -0
- package/README.md +23 -2
- package/dist/admin/App-BrB9n7EO.mjs +371 -0
- package/dist/admin/App-ZlqOsILc.js +371 -0
- package/dist/admin/SettingsPage-LR6F2vyx.js +410 -0
- package/dist/admin/SettingsPage-Xas3gvn4.mjs +410 -0
- package/dist/admin/ar-9_2mxMp2.js +339 -0
- package/dist/admin/ar-CrM4yxqb.mjs +339 -0
- package/dist/admin/de-D3NbAP6M.mjs +339 -0
- package/dist/admin/de-DBaO-D7Z.js +339 -0
- package/dist/admin/en-Cu-rn_xM.mjs +339 -0
- package/dist/admin/en-DAoI7qkk.js +339 -0
- package/dist/admin/es-DUqsu82s.js +339 -0
- package/dist/admin/es-Y0zfya4P.mjs +339 -0
- package/dist/admin/fr-BkLta_o8.js +339 -0
- package/dist/admin/fr-BrzKRqet.mjs +339 -0
- package/dist/admin/getTranslation-CZAJyMSt.mjs +5 -0
- package/dist/admin/getTranslation-Cd0_4UtW.js +4 -0
- package/dist/admin/id-BZz53ViW.mjs +339 -0
- package/dist/admin/id-ByxSagzq.js +339 -0
- package/dist/admin/index.js +1497 -0
- package/dist/admin/index.mjs +1492 -0
- package/dist/admin/pt-BSCDUkdd.js +339 -0
- package/dist/admin/pt-DUfISuZf.mjs +339 -0
- package/dist/admin/src/components/Initializer.d.ts +6 -0
- package/dist/admin/src/components/PluginIcon.d.ts +3 -0
- package/dist/admin/src/components/RRuleInput.d.ts +3 -0
- package/dist/admin/src/components/bookings/BookingSidePanel.d.ts +10 -0
- package/dist/admin/src/components/bookings/BookingsGridCanvas.d.ts +20 -0
- package/dist/admin/src/components/bookings/QuickCreateBookingModal.d.ts +11 -0
- package/dist/admin/src/index.d.ts +24 -0
- package/dist/admin/src/pages/App.d.ts +3 -0
- package/dist/admin/src/pages/CalendarPage.d.ts +3 -0
- package/dist/admin/src/pages/SettingsPage.d.ts +3 -0
- package/dist/admin/src/permissions.d.ts +29 -0
- package/dist/admin/src/pluginId.d.ts +1 -0
- package/dist/admin/src/translations/cmLabels.d.ts +1 -0
- package/dist/admin/src/translations/cmPlaceholders.d.ts +1 -0
- package/dist/admin/src/utils/getTranslation.d.ts +2 -0
- package/dist/admin/tr-_nhc9hk6.mjs +339 -0
- package/dist/admin/tr-r17l5F2K.js +339 -0
- package/dist/admin/ur-8edBd0Qo.mjs +339 -0
- package/dist/admin/ur-Dw_TAOZ3.js +339 -0
- package/dist/admin/zh-CeR0swEm.mjs +339 -0
- package/dist/admin/zh-D0z5sxxN.js +339 -0
- package/dist/server/index.js +3547 -0
- package/dist/server/index.mjs +3545 -0
- package/dist/server/src/bootstrap.d.ts +6 -0
- package/dist/server/src/config/index.d.ts +6 -0
- package/dist/server/src/content-types/booking/schema.json.d.ts +117 -0
- package/dist/server/src/content-types/index.d.ts +265 -0
- package/dist/server/src/content-types/resource/schema.json.d.ts +147 -0
- package/dist/server/src/controllers/admin.d.ts +30 -0
- package/dist/server/src/controllers/content-api.d.ts +32 -0
- package/dist/server/src/controllers/index.d.ts +28 -0
- package/dist/server/src/destroy.d.ts +5 -0
- package/dist/server/src/errors.d.ts +18 -0
- package/dist/server/src/index.d.ts +347 -0
- package/dist/server/src/register.d.ts +5 -0
- package/dist/server/src/routes/admin.d.ts +14 -0
- package/dist/server/src/routes/content-api.d.ts +9 -0
- package/dist/server/src/routes/index.d.ts +30 -0
- package/dist/server/src/services/availability.d.ts +8 -0
- package/dist/server/src/services/index.d.ts +12 -0
- package/dist/server/src/services/reservation.d.ts +6 -0
- package/dist/server/src/services/reservationHelpers.d.ts +41 -0
- package/dist/server/src/services/reservationHostCapacity.d.ts +16 -0
- package/dist/server/src/services/reservationMutations.d.ts +32 -0
- package/dist/server/src/services/reservationSources.d.ts +4 -0
- package/dist/server/src/services/reservationValidators.d.ts +27 -0
- package/dist/server/src/services/settings.d.ts +8 -0
- package/dist/server/src/types.d.ts +99 -0
- package/dist/shared/calendarSystems.d.ts +3 -0
- package/dist/shared/icalAndCsv.d.ts +16 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.js +752 -0
- package/dist/shared/index.mjs +729 -0
- package/dist/shared/pluginId.d.ts +2 -0
- package/dist/shared/slotEngine.d.ts +19 -0
- package/dist/shared/slotTimezone.d.ts +45 -0
- package/dist/shared/types.d.ts +245 -0
- package/package.json +111 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DEFAULT_WEEKLY_SCHEDULE, enumerateLocalDatesInRange, extractMonthDay, extractZonedWallClock, formatTimeMinutes, isSlotBlackedOut, matchesDateOrYearlessRange, matchesSingleDateOrYearless, normalizeTimeZone, parsePeriodTimestampInZone, parseTimeMinutes, resolveDailyScheduleForDate, wallClockToUtcMs, ResolvedDailySchedule, ZonedWallClock } from './slotTimezone';
|
|
2
|
+
import { AssignableHost, AvailableSlot, BookingRecord, BookingResource, HolidayScheduleRule, SeasonalScheduleOverride, SecondaryCalendarConfig } from './types';
|
|
3
|
+
export { DEFAULT_WEEKLY_SCHEDULE, enumerateLocalDatesInRange, extractMonthDay, extractZonedWallClock, formatTimeMinutes, isSlotBlackedOut, matchesDateOrYearlessRange, matchesSingleDateOrYearless, normalizeTimeZone, parsePeriodTimestampInZone, parseTimeMinutes, resolveDailyScheduleForDate, wallClockToUtcMs, type ResolvedDailySchedule, type ZonedWallClock, };
|
|
4
|
+
export declare function isActiveBookingStatus(status: BookingRecord["status"]): boolean;
|
|
5
|
+
export declare function doesBookingOverlapSlot(booking: Pick<BookingRecord, "startDate" | "endDate" | "status">, slotStartMs: number, slotEndMs: number, bufferBeforeMinutes?: number, bufferAfterMinutes?: number): boolean;
|
|
6
|
+
export declare function selectAvailableHostsForSlot(resource: BookingResource, overlappingBookings: BookingRecord[], preferredLanguage?: string): AssignableHost[];
|
|
7
|
+
export interface ComputeAvailableSlotsParams {
|
|
8
|
+
resource: BookingResource;
|
|
9
|
+
from: string;
|
|
10
|
+
to: string;
|
|
11
|
+
existingBookings: BookingRecord[];
|
|
12
|
+
partySize?: number;
|
|
13
|
+
preferredLanguage?: string;
|
|
14
|
+
secondaryCalendars?: SecondaryCalendarConfig[];
|
|
15
|
+
globalSeasonalSchedules?: SeasonalScheduleOverride[];
|
|
16
|
+
globalHolidays?: HolidayScheduleRule[];
|
|
17
|
+
referenceNow?: Date;
|
|
18
|
+
}
|
|
19
|
+
export declare function computeAvailableSlots(params: ComputeAvailableSlotsParams): AvailableSlot[];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BlackoutPeriod, BookingResource, DailyTimeWindow, DayOfWeekKey, HolidayScheduleRule, SeasonalScheduleOverride, WeeklyScheduleConfig } from './types';
|
|
2
|
+
export declare const DEFAULT_WEEKLY_SCHEDULE: WeeklyScheduleConfig;
|
|
3
|
+
export declare function normalizeTimeZone(tz?: string): string;
|
|
4
|
+
export interface ZonedWallClock {
|
|
5
|
+
year: number;
|
|
6
|
+
month: number;
|
|
7
|
+
day: number;
|
|
8
|
+
dateStr: string;
|
|
9
|
+
dayKey: DayOfWeekKey;
|
|
10
|
+
hours: number;
|
|
11
|
+
minutes: number;
|
|
12
|
+
seconds: number;
|
|
13
|
+
ms: number;
|
|
14
|
+
minutesOfDay: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function extractZonedWallClock(epochMs: number, rawTimeZone?: string): ZonedWallClock;
|
|
17
|
+
export declare function parseIsoDateYmd(dateStr: string): {
|
|
18
|
+
year: number;
|
|
19
|
+
month: number;
|
|
20
|
+
day: number;
|
|
21
|
+
} | null;
|
|
22
|
+
/**
|
|
23
|
+
* Resolves a local wall-clock `(dateStr, totalMinutes)` in `timeZone` to UTC epoch ms.
|
|
24
|
+
* When `strictGap` is true, returns `null` if the local wall-clock falls inside a
|
|
25
|
+
* non-existent Spring-Forward DST transition gap (e.g. 02:30 on US DST start).
|
|
26
|
+
*/
|
|
27
|
+
export declare function wallClockToUtcMs(dateStr: string, totalMinutes: number, rawTimeZone?: string, strictGap?: boolean): number | null;
|
|
28
|
+
export declare function parsePeriodTimestampInZone(raw: string, endOfDay: boolean, rawTimeZone?: string): number;
|
|
29
|
+
export declare function enumerateLocalDatesInRange(rangeStartMs: number, rangeEndMs: number, rawTimeZone?: string, maxDays?: number): Array<{
|
|
30
|
+
dateStr: string;
|
|
31
|
+
dayKey: DayOfWeekKey;
|
|
32
|
+
}>;
|
|
33
|
+
export declare function parseTimeMinutes(hhmm: string): number;
|
|
34
|
+
export declare function formatTimeMinutes(totalMinutes: number): string;
|
|
35
|
+
export declare function extractMonthDay(dateOrMmDd: string): string;
|
|
36
|
+
export declare function matchesDateOrYearlessRange(dateStr: string, startStr: string, endStr: string, yearless?: boolean): boolean;
|
|
37
|
+
export declare function matchesSingleDateOrYearless(dateStr: string, ruleDateStr: string, yearless?: boolean): boolean;
|
|
38
|
+
export declare function isSlotBlackedOut(slotStartMs: number, slotEndMs: number, blackoutDates: BlackoutPeriod[], rawTimeZone?: string): boolean;
|
|
39
|
+
export interface ResolvedDailySchedule {
|
|
40
|
+
mode: "interval" | "window";
|
|
41
|
+
durationMins: number;
|
|
42
|
+
windows: DailyTimeWindow[];
|
|
43
|
+
scheduleLabel?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function resolveDailyScheduleForDate(dateStr: string, dayKey: DayOfWeekKey, resource: BookingResource, globalSeasonalSchedules?: SeasonalScheduleOverride[], globalHolidays?: HolidayScheduleRule[]): ResolvedDailySchedule;
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { AlternateDateValue as SecondaryCalendarDateBadge, CalendarSystemConfig as SecondaryCalendarConfig, CalendarThemePreset, SecondaryCalendarLanguageMode } from '../../strapi-plugin-calendar/shared/index.ts';
|
|
2
|
+
export type { SecondaryCalendarConfig, SecondaryCalendarDateBadge, CalendarThemePreset, SecondaryCalendarLanguageMode, };
|
|
3
|
+
export type BookingResourceType = "service" | "appointment" | "room" | "staff" | "equipment" | "other";
|
|
4
|
+
export type BookingStatus = "pending" | "confirmed" | "completed" | "cancelled" | "no_show";
|
|
5
|
+
export interface DailyTimeWindow {
|
|
6
|
+
/** Start time in HH:mm (24h), e.g. '09:00' */
|
|
7
|
+
start: string;
|
|
8
|
+
/** End time in HH:mm (24h), e.g. '12:00' */
|
|
9
|
+
end: string;
|
|
10
|
+
/** Optional named slot label, e.g. 'morning' or 'afternoon' */
|
|
11
|
+
label?: string;
|
|
12
|
+
/** Optional slot-specific capacity override */
|
|
13
|
+
capacity?: number;
|
|
14
|
+
}
|
|
15
|
+
export type DayOfWeekKey = "0" | "1" | "2" | "3" | "4" | "5" | "6";
|
|
16
|
+
export interface WeeklyScheduleConfig {
|
|
17
|
+
/**
|
|
18
|
+
* Mode of slot generation:
|
|
19
|
+
* - 'interval': slices each daily window into `slotDurationMinutes` intervals (e.g. 09:00-10:00, 10:00-11:00)
|
|
20
|
+
* - 'window': treats each daily window as a single bookable block (e.g. 'morning' 09:00-12:00, 'afternoon' 14:00-17:00)
|
|
21
|
+
*/
|
|
22
|
+
mode?: "interval" | "window";
|
|
23
|
+
/** Operating windows keyed by JS UTC day of week ('0'=Sunday ... '6'=Saturday) */
|
|
24
|
+
days: Partial<Record<DayOfWeekKey, DailyTimeWindow[]>>;
|
|
25
|
+
}
|
|
26
|
+
export interface BlackoutPeriod {
|
|
27
|
+
/** ISO date ('YYYY-MM-DD'), month-day ('MM-DD' when yearless=true), or ISO datetime string */
|
|
28
|
+
start: string;
|
|
29
|
+
/** ISO date ('YYYY-MM-DD'), month-day ('MM-DD' when yearless=true), or ISO datetime string */
|
|
30
|
+
end: string;
|
|
31
|
+
/** When true, applies every year on the same MM-DD range (supports cross-year ranges like 12-20 to 01-05) */
|
|
32
|
+
yearless?: boolean;
|
|
33
|
+
reason?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SeasonalScheduleOverride {
|
|
36
|
+
id?: string;
|
|
37
|
+
/** Human-readable schedule label, e.g. 'Summer Hours', 'Ramadan Schedule', 'Holiday Season' */
|
|
38
|
+
label: string;
|
|
39
|
+
/** ISO date ('YYYY-MM-DD') or month-day ('MM-DD') when yearless=true */
|
|
40
|
+
startDate: string;
|
|
41
|
+
/** ISO date ('YYYY-MM-DD') or month-day ('MM-DD') when yearless=true */
|
|
42
|
+
endDate: string;
|
|
43
|
+
/** When true, repeats every year on the same month-day range */
|
|
44
|
+
yearless?: boolean;
|
|
45
|
+
/** Optional priority when multiple seasonal schedules overlap (higher number wins) */
|
|
46
|
+
priority?: number;
|
|
47
|
+
/** Optional slot duration override (in minutes) while this seasonal schedule is active */
|
|
48
|
+
slotDurationMinutes?: number;
|
|
49
|
+
/** Weekly schedule active during this date range */
|
|
50
|
+
schedule: WeeklyScheduleConfig;
|
|
51
|
+
}
|
|
52
|
+
export interface HolidayScheduleRule {
|
|
53
|
+
id?: string;
|
|
54
|
+
/** Holiday name, e.g. 'New Year', 'Eid al-Fitr', 'National Holiday' */
|
|
55
|
+
name: string;
|
|
56
|
+
/** ISO date ('YYYY-MM-DD') or month-day ('MM-DD') when yearless=true */
|
|
57
|
+
date: string;
|
|
58
|
+
/** When true, repeats every year on the same month-day */
|
|
59
|
+
yearless?: boolean;
|
|
60
|
+
/** When true (or when windows is empty/omitted), the resource is closed on this holiday */
|
|
61
|
+
isClosed?: boolean;
|
|
62
|
+
/** Optional slot generation mode when custom holiday windows are provided */
|
|
63
|
+
mode?: "interval" | "window";
|
|
64
|
+
/** Optional reduced/special operating windows when open on a holiday */
|
|
65
|
+
windows?: DailyTimeWindow[];
|
|
66
|
+
}
|
|
67
|
+
export interface AssignableHost {
|
|
68
|
+
id: string;
|
|
69
|
+
name: string;
|
|
70
|
+
email?: string;
|
|
71
|
+
languages?: string[];
|
|
72
|
+
role?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface BookingResource {
|
|
75
|
+
documentId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
slug: string;
|
|
78
|
+
resourceType: BookingResourceType;
|
|
79
|
+
description?: string;
|
|
80
|
+
color: string;
|
|
81
|
+
timezone: string;
|
|
82
|
+
slotDurationMinutes: number;
|
|
83
|
+
bufferBeforeMinutes: number;
|
|
84
|
+
bufferAfterMinutes: number;
|
|
85
|
+
capacityPerSlot: number;
|
|
86
|
+
maxPartySize: number;
|
|
87
|
+
minLeadTimeHours: number;
|
|
88
|
+
maxAdvanceDays: number;
|
|
89
|
+
requiresApproval: boolean;
|
|
90
|
+
weeklySchedule: WeeklyScheduleConfig;
|
|
91
|
+
seasonalSchedules?: SeasonalScheduleOverride[];
|
|
92
|
+
holidayRules?: HolidayScheduleRule[];
|
|
93
|
+
blackoutDates: BlackoutPeriod[];
|
|
94
|
+
recurrenceRule?: string;
|
|
95
|
+
supportedLanguages: string[];
|
|
96
|
+
assignedHosts: AssignableHost[];
|
|
97
|
+
location?: string;
|
|
98
|
+
price?: number;
|
|
99
|
+
currency?: string;
|
|
100
|
+
isActive: boolean;
|
|
101
|
+
metadata?: Record<string, unknown>;
|
|
102
|
+
}
|
|
103
|
+
export interface AvailableSlot {
|
|
104
|
+
slotId: string;
|
|
105
|
+
resourceDocumentId: string;
|
|
106
|
+
resourceName: string;
|
|
107
|
+
resourceSlug: string;
|
|
108
|
+
start: string;
|
|
109
|
+
end: string;
|
|
110
|
+
date: string;
|
|
111
|
+
slotLabel: string;
|
|
112
|
+
scheduleLabel?: string;
|
|
113
|
+
capacity: number;
|
|
114
|
+
bookedCount: number;
|
|
115
|
+
remainingCapacity: number;
|
|
116
|
+
isAvailable: boolean;
|
|
117
|
+
availableHosts: AssignableHost[];
|
|
118
|
+
secondaryDates?: Record<string, SecondaryCalendarDateBadge>;
|
|
119
|
+
}
|
|
120
|
+
export interface BookingRecord {
|
|
121
|
+
documentId: string;
|
|
122
|
+
bookingCode: string;
|
|
123
|
+
title: string;
|
|
124
|
+
resourceDocumentId?: string;
|
|
125
|
+
resourceName?: string;
|
|
126
|
+
resourceColor?: string;
|
|
127
|
+
customerName: string;
|
|
128
|
+
customerEmail: string;
|
|
129
|
+
customerPhone?: string;
|
|
130
|
+
organization?: string;
|
|
131
|
+
startDate: string;
|
|
132
|
+
endDate: string;
|
|
133
|
+
slotLabel?: string;
|
|
134
|
+
timezone: string;
|
|
135
|
+
partySize: number;
|
|
136
|
+
status: BookingStatus;
|
|
137
|
+
preferredLanguage?: string;
|
|
138
|
+
assignedHost?: string;
|
|
139
|
+
notes?: string;
|
|
140
|
+
internalNotes?: string;
|
|
141
|
+
sourceCollection?: string;
|
|
142
|
+
secondaryDates?: Record<string, SecondaryCalendarDateBadge>;
|
|
143
|
+
metadata?: Record<string, unknown>;
|
|
144
|
+
createdAt?: string;
|
|
145
|
+
updatedAt?: string;
|
|
146
|
+
}
|
|
147
|
+
export interface CreateReservationInput {
|
|
148
|
+
resourceDocumentId?: string;
|
|
149
|
+
resourceSlug?: string;
|
|
150
|
+
customerName: string;
|
|
151
|
+
customerEmail: string;
|
|
152
|
+
customerPhone?: string;
|
|
153
|
+
organization?: string;
|
|
154
|
+
startDate: string;
|
|
155
|
+
endDate?: string;
|
|
156
|
+
slotLabel?: string;
|
|
157
|
+
timezone?: string;
|
|
158
|
+
partySize?: number;
|
|
159
|
+
preferredLanguage?: string;
|
|
160
|
+
assignedHost?: string;
|
|
161
|
+
notes?: string;
|
|
162
|
+
metadata?: Record<string, unknown>;
|
|
163
|
+
}
|
|
164
|
+
export interface CreateReservationResult {
|
|
165
|
+
booking: BookingRecord;
|
|
166
|
+
cancelToken: string;
|
|
167
|
+
waitlisted: boolean;
|
|
168
|
+
}
|
|
169
|
+
export interface RescheduleBookingInput {
|
|
170
|
+
bookingDocumentId?: string;
|
|
171
|
+
bookingCode?: string;
|
|
172
|
+
cancelToken?: string;
|
|
173
|
+
newStartDate: string;
|
|
174
|
+
newEndDate?: string;
|
|
175
|
+
newSlotLabel?: string;
|
|
176
|
+
partySize?: number;
|
|
177
|
+
}
|
|
178
|
+
export interface CancelBookingInput {
|
|
179
|
+
bookingDocumentId?: string;
|
|
180
|
+
bookingCode?: string;
|
|
181
|
+
cancelToken?: string;
|
|
182
|
+
reason?: string;
|
|
183
|
+
}
|
|
184
|
+
export interface BookingSourceMapping {
|
|
185
|
+
id: string;
|
|
186
|
+
uid: string;
|
|
187
|
+
label: string;
|
|
188
|
+
color: string;
|
|
189
|
+
enabled: boolean;
|
|
190
|
+
customerNameField: string;
|
|
191
|
+
customerEmailField?: string;
|
|
192
|
+
customerPhoneField?: string;
|
|
193
|
+
organizationField?: string;
|
|
194
|
+
dateField: string;
|
|
195
|
+
endDateField?: string;
|
|
196
|
+
slotLabelField?: string;
|
|
197
|
+
partySizeField?: string;
|
|
198
|
+
statusField?: string;
|
|
199
|
+
languageField?: string;
|
|
200
|
+
notesField?: string;
|
|
201
|
+
slotWindows?: Record<string, {
|
|
202
|
+
start: string;
|
|
203
|
+
end: string;
|
|
204
|
+
}>;
|
|
205
|
+
}
|
|
206
|
+
export interface BookingsPluginSettings {
|
|
207
|
+
theme?: CalendarThemePreset;
|
|
208
|
+
defaultLocale?: string;
|
|
209
|
+
secondaryCalendarLanguage?: SecondaryCalendarLanguageMode;
|
|
210
|
+
defaultTimezone: string;
|
|
211
|
+
defaultSlotDurationMinutes: number;
|
|
212
|
+
defaultBufferBeforeMinutes: number;
|
|
213
|
+
defaultBufferAfterMinutes: number;
|
|
214
|
+
defaultCapacityPerSlot: number;
|
|
215
|
+
defaultMinLeadTimeHours: number;
|
|
216
|
+
defaultMaxAdvanceDays: number;
|
|
217
|
+
defaultRequiresApproval: boolean;
|
|
218
|
+
sendEmailNotifications: boolean;
|
|
219
|
+
secondaryCalendars: SecondaryCalendarConfig[];
|
|
220
|
+
defaultSeasonalSchedules?: SeasonalScheduleOverride[];
|
|
221
|
+
holidays?: HolidayScheduleRule[];
|
|
222
|
+
icalFeedToken?: string;
|
|
223
|
+
sources: BookingSourceMapping[];
|
|
224
|
+
}
|
|
225
|
+
export interface BookingFilterQuery {
|
|
226
|
+
from?: string;
|
|
227
|
+
to?: string;
|
|
228
|
+
resourceDocumentId?: string;
|
|
229
|
+
resourceSlug?: string;
|
|
230
|
+
status?: BookingStatus | "";
|
|
231
|
+
preferredLanguage?: string;
|
|
232
|
+
search?: string;
|
|
233
|
+
source?: string;
|
|
234
|
+
activeOnly?: boolean;
|
|
235
|
+
limit?: number;
|
|
236
|
+
}
|
|
237
|
+
export interface BookingStats {
|
|
238
|
+
totalBookings: number;
|
|
239
|
+
confirmedBookings: number;
|
|
240
|
+
pendingBookings: number;
|
|
241
|
+
cancelledBookings: number;
|
|
242
|
+
completedBookings: number;
|
|
243
|
+
totalGuests: number;
|
|
244
|
+
activeResources: number;
|
|
245
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,114 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vicacha-devs/strapi-plugin-bookings",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Generic Strapi v5 Bookings, Appointments, Resource Scheduling & Time-Slot Availability Engine powered by @vicacha-devs/strapi-plugin-calendar",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"appointments",
|
|
7
|
+
"availability",
|
|
8
|
+
"bookings",
|
|
9
|
+
"calendar",
|
|
10
|
+
"reservations",
|
|
11
|
+
"scheduling",
|
|
12
|
+
"strapi",
|
|
13
|
+
"strapi-plugin",
|
|
14
|
+
"strapi-v5",
|
|
15
|
+
"time-slots"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/Vicacha-Devs/strapi-v5-extensions/tree/main/packages/strapi-plugin-bookings#readme",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/Vicacha-Devs/strapi-v5-extensions/issues"
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"author": "Vicacha Devs",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/Vicacha-Devs/strapi-v5-extensions.git",
|
|
26
|
+
"directory": "packages/strapi-plugin-bookings"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"exports": {
|
|
32
|
+
"./package.json": "./package.json",
|
|
33
|
+
"./strapi-admin": {
|
|
34
|
+
"types": "./dist/admin/src/index.d.ts",
|
|
35
|
+
"source": "./admin/src/index.ts",
|
|
36
|
+
"import": "./dist/admin/index.mjs",
|
|
37
|
+
"require": "./dist/admin/index.js",
|
|
38
|
+
"default": "./dist/admin/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./strapi-server": {
|
|
41
|
+
"types": "./dist/server/src/index.d.ts",
|
|
42
|
+
"source": "./server/src/index.ts",
|
|
43
|
+
"import": "./dist/server/index.mjs",
|
|
44
|
+
"require": "./dist/server/index.js",
|
|
45
|
+
"default": "./dist/server/index.js"
|
|
46
|
+
},
|
|
47
|
+
"./shared": {
|
|
48
|
+
"types": "./dist/shared/index.d.ts",
|
|
49
|
+
"source": "./shared/index.ts",
|
|
50
|
+
"import": "./dist/shared/index.mjs",
|
|
51
|
+
"require": "./dist/shared/index.js",
|
|
52
|
+
"default": "./dist/shared/index.js"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public",
|
|
57
|
+
"provenance": true
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@strapi/design-system": "2.2.0",
|
|
61
|
+
"@strapi/icons": "2.2.0",
|
|
62
|
+
"react-intl": "8.1.3",
|
|
63
|
+
"@vicacha-devs/strapi-plugin-calendar": "1.1.1"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@strapi/sdk-plugin": "6.1.1",
|
|
67
|
+
"@strapi/strapi": "5.39.0",
|
|
68
|
+
"@strapi/typescript-utils": "5.39.0",
|
|
69
|
+
"@types/node": "22.10.2",
|
|
70
|
+
"@types/react": "19.2.14",
|
|
71
|
+
"@types/react-dom": "19.2.3",
|
|
72
|
+
"react": "18.3.1",
|
|
73
|
+
"react-dom": "18.3.1",
|
|
74
|
+
"react-router-dom": "6.30.3",
|
|
75
|
+
"styled-components": "6.3.11",
|
|
76
|
+
"typescript": "5.9.3",
|
|
77
|
+
"vitest": "4.1.0",
|
|
78
|
+
"@vicacha-devs/eslint-config": "1.0.0",
|
|
79
|
+
"@vicacha-devs/plugin-shared": "1.0.0",
|
|
80
|
+
"@vicacha-devs/typescript-config": "1.0.0"
|
|
81
|
+
},
|
|
82
|
+
"peerDependencies": {
|
|
83
|
+
"@strapi/sdk-plugin": "^5.0.0 || ^6.0.0",
|
|
84
|
+
"@strapi/strapi": "^5.0.0",
|
|
85
|
+
"@vicacha-devs/strapi-plugin-calendar": "^1.0.0",
|
|
86
|
+
"react": "^18.0.0",
|
|
87
|
+
"react-dom": "^18.0.0",
|
|
88
|
+
"react-router-dom": "^6.0.0",
|
|
89
|
+
"styled-components": "^6.0.0"
|
|
90
|
+
},
|
|
91
|
+
"engines": {
|
|
92
|
+
"node": ">=20.16.0",
|
|
93
|
+
"pnpm": ">=10.0.0"
|
|
94
|
+
},
|
|
95
|
+
"strapi": {
|
|
96
|
+
"kind": "plugin",
|
|
97
|
+
"name": "bookings",
|
|
98
|
+
"displayName": "Bookings & Scheduling",
|
|
99
|
+
"description": "Manage bookable resources, operating schedules, time-slot availability, staff assignment, and reservations in Strapi v5 powered by @vicacha-devs/strapi-plugin-calendar"
|
|
100
|
+
},
|
|
101
|
+
"scripts": {
|
|
102
|
+
"build": "strapi-plugin build && node ../../scripts/ensure-dist-types.ts",
|
|
103
|
+
"clean": "rm -rf dist",
|
|
104
|
+
"test": "node --import ./tests/register-ts-resolver.ts --test tests/*.test.ts",
|
|
105
|
+
"test:ts": "npm run test:ts:front && npm run test:ts:back",
|
|
106
|
+
"test:ts:back": "tsc --noEmit -p server/tsconfig.json",
|
|
107
|
+
"test:ts:front": "tsc --noEmit -p admin/tsconfig.json",
|
|
108
|
+
"test:vitest": "vitest run",
|
|
109
|
+
"test:watch": "vitest",
|
|
110
|
+
"verify": "strapi-plugin verify",
|
|
111
|
+
"watch": "strapi-plugin watch",
|
|
112
|
+
"watch:link": "strapi-plugin watch:link"
|
|
113
|
+
}
|
|
6
114
|
}
|