@soulbatical/tetra-ui 0.1.4 → 0.1.6
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/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/planner/components/AvailabilityEditor.d.ts +28 -0
- package/dist/planner/components/AvailabilityEditor.d.ts.map +1 -0
- package/dist/planner/components/AvailabilityEditor.js +108 -0
- package/dist/planner/components/AvailabilityEditor.js.map +1 -0
- package/dist/planner/components/BookingWidget.d.ts +47 -0
- package/dist/planner/components/BookingWidget.d.ts.map +1 -0
- package/dist/planner/components/BookingWidget.js +171 -0
- package/dist/planner/components/BookingWidget.js.map +1 -0
- package/dist/planner/components/TeamPlanner.d.ts +19 -0
- package/dist/planner/components/TeamPlanner.d.ts.map +1 -0
- package/dist/planner/components/TeamPlanner.js +141 -0
- package/dist/planner/components/TeamPlanner.js.map +1 -0
- package/dist/planner/components/WeekCalendar.d.ts +19 -0
- package/dist/planner/components/WeekCalendar.d.ts.map +1 -0
- package/dist/planner/components/WeekCalendar.js +97 -0
- package/dist/planner/components/WeekCalendar.js.map +1 -0
- package/dist/planner/hooks/usePlannerApi.d.ts +133 -0
- package/dist/planner/hooks/usePlannerApi.d.ts.map +1 -0
- package/dist/planner/hooks/usePlannerApi.js +97 -0
- package/dist/planner/hooks/usePlannerApi.js.map +1 -0
- package/dist/planner/index.d.ts +16 -0
- package/dist/planner/index.d.ts.map +1 -0
- package/dist/planner/index.js +18 -0
- package/dist/planner/index.js.map +1 -0
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
|
@@ -47,4 +47,10 @@ export type { FeatureFiltersProps } from "./components/FeatureFilters.js";
|
|
|
47
47
|
export { FeatureForm } from "./components/FeatureForm.js";
|
|
48
48
|
export type { FeatureFormProps, CustomComponentMap } from "./components/FeatureForm.js";
|
|
49
49
|
export { useAffiliateDashboard, useAffiliateProfile, useAffiliateCommissions, } from "./hooks/useAffiliateDashboard.js";
|
|
50
|
+
export { WeekCalendar, type WeekCalendarProps } from "./planner/index.js";
|
|
51
|
+
export { TeamPlanner, type TeamPlannerProps } from "./planner/index.js";
|
|
52
|
+
export { AvailabilityEditor, type AvailabilityEditorProps } from "./planner/index.js";
|
|
53
|
+
export { BookingWidget, type BookingWidgetProps } from "./planner/index.js";
|
|
54
|
+
export { usePlannerApi, type PlannerApiConfig } from "./planner/index.js";
|
|
55
|
+
export type { Appointment as PlannerAppointment, AvailabilitySlot as PlannerAvailabilitySlot, DayAvailability as PlannerDayAvailability, TeamAvailability as PlannerTeamAvailability, SchedulerSettings as PlannerSchedulerSettings, Vacation as PlannerVacation, TimeSlot as PlannerTimeSlot } from "./planner/index.js";
|
|
50
56
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -59,4 +59,10 @@ export { FeatureFilters } from "./components/FeatureFilters.js";
|
|
|
59
59
|
export { FeatureForm } from "./components/FeatureForm.js";
|
|
60
60
|
// ── Affiliate hooks ─────────────────────────────────────────
|
|
61
61
|
export { useAffiliateDashboard, useAffiliateProfile, useAffiliateCommissions, } from "./hooks/useAffiliateDashboard.js";
|
|
62
|
+
// ── Planner Module ──────────────────────────────────────────
|
|
63
|
+
export { WeekCalendar } from "./planner/index.js";
|
|
64
|
+
export { TeamPlanner } from "./planner/index.js";
|
|
65
|
+
export { AvailabilityEditor } from "./planner/index.js";
|
|
66
|
+
export { BookingWidget } from "./planner/index.js";
|
|
67
|
+
export { usePlannerApi } from "./planner/index.js";
|
|
62
68
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AvailabilityEditor — Weekly availability schedule editor
|
|
3
|
+
*
|
|
4
|
+
* Allows setting multiple time blocks per day.
|
|
5
|
+
* Integrated save via Tetra Planner API.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <AvailabilityEditor apiBase="/planner" userId={user.id} />
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export interface AvailabilityEditorProps {
|
|
13
|
+
apiBase?: string;
|
|
14
|
+
userId: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
onSaved?: () => void;
|
|
17
|
+
labels?: {
|
|
18
|
+
title?: string;
|
|
19
|
+
save?: string;
|
|
20
|
+
saving?: string;
|
|
21
|
+
saved?: string;
|
|
22
|
+
addBlock?: string;
|
|
23
|
+
notAvailable?: string;
|
|
24
|
+
dayNames?: string[];
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare function AvailabilityEditor({ apiBase, userId, className, onSaved, labels, }: AvailabilityEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=AvailabilityEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvailabilityEditor.d.ts","sourceRoot":"","sources":["../../../src/planner/components/AvailabilityEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAeD,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,MAAM,EACN,SAAc,EACd,OAAO,EACP,MAAM,GACP,EAAE,uBAAuB,2CA6LzB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AvailabilityEditor — Weekly availability schedule editor
|
|
3
|
+
*
|
|
4
|
+
* Allows setting multiple time blocks per day.
|
|
5
|
+
* Integrated save via Tetra Planner API.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <AvailabilityEditor apiBase="/planner" userId={user.id} />
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
'use client';
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
15
|
+
import { usePlannerApi } from '../hooks/usePlannerApi.js';
|
|
16
|
+
const DEFAULT_DAYS = ['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'];
|
|
17
|
+
const DEFAULT_BLOCK = { startTime: '09:00', endTime: '17:00' };
|
|
18
|
+
export function AvailabilityEditor({ apiBase, userId, className = '', onSaved, labels, }) {
|
|
19
|
+
const api = usePlannerApi({ apiBase });
|
|
20
|
+
const dayNames = labels?.dayNames || DEFAULT_DAYS;
|
|
21
|
+
const [schedule, setSchedule] = useState(Array.from({ length: 7 }, () => ({ enabled: false, blocks: [{ ...DEFAULT_BLOCK }] })));
|
|
22
|
+
const [saving, setSaving] = useState(false);
|
|
23
|
+
const [saveStatus, setSaveStatus] = useState('idle');
|
|
24
|
+
// ── Load existing availability ──────────────────────────
|
|
25
|
+
const loadAvailability = useCallback(async () => {
|
|
26
|
+
try {
|
|
27
|
+
const slots = await api.getAvailability(userId);
|
|
28
|
+
const newSchedule = Array.from({ length: 7 }, () => ({
|
|
29
|
+
enabled: false,
|
|
30
|
+
blocks: [{ ...DEFAULT_BLOCK }],
|
|
31
|
+
}));
|
|
32
|
+
for (const slot of slots) {
|
|
33
|
+
if (slot.dayOfWeek >= 0 && slot.dayOfWeek <= 6) {
|
|
34
|
+
const day = newSchedule[slot.dayOfWeek];
|
|
35
|
+
const block = {
|
|
36
|
+
startTime: slot.startTime.substring(0, 5),
|
|
37
|
+
endTime: slot.endTime.substring(0, 5),
|
|
38
|
+
};
|
|
39
|
+
if (!day.enabled) {
|
|
40
|
+
day.enabled = true;
|
|
41
|
+
day.blocks = [block];
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
day.blocks.push(block);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
setSchedule(newSchedule);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// keep defaults
|
|
52
|
+
}
|
|
53
|
+
}, [api, userId]);
|
|
54
|
+
useEffect(() => { loadAvailability(); }, [loadAvailability]);
|
|
55
|
+
// ── Save ────────────────────────────────────────────────
|
|
56
|
+
const handleSave = async () => {
|
|
57
|
+
setSaving(true);
|
|
58
|
+
setSaveStatus('idle');
|
|
59
|
+
const slots = schedule.flatMap((day, index) => day.enabled
|
|
60
|
+
? day.blocks.map((block) => ({
|
|
61
|
+
dayOfWeek: index,
|
|
62
|
+
startTime: block.startTime,
|
|
63
|
+
endTime: block.endTime,
|
|
64
|
+
isAvailable: true,
|
|
65
|
+
}))
|
|
66
|
+
: []);
|
|
67
|
+
try {
|
|
68
|
+
const res = await api.setAvailability(slots);
|
|
69
|
+
if (res.success) {
|
|
70
|
+
setSaveStatus('saved');
|
|
71
|
+
onSaved?.();
|
|
72
|
+
setTimeout(() => setSaveStatus('idle'), 2000);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
setSaveStatus('error');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
setSaveStatus('error');
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
setSaving(false);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
// ── Mutators ────────────────────────────────────────────
|
|
86
|
+
const toggleDay = (dayIndex, enabled) => {
|
|
87
|
+
setSchedule((prev) => prev.map((d, i) => i === dayIndex ? { ...d, enabled } : d));
|
|
88
|
+
};
|
|
89
|
+
const updateBlock = (dayIndex, blockIndex, updates) => {
|
|
90
|
+
setSchedule((prev) => prev.map((d, i) => i === dayIndex
|
|
91
|
+
? { ...d, blocks: d.blocks.map((b, bi) => bi === blockIndex ? { ...b, ...updates } : b) }
|
|
92
|
+
: d));
|
|
93
|
+
};
|
|
94
|
+
const addBlock = (dayIndex) => {
|
|
95
|
+
setSchedule((prev) => prev.map((d, i) => i === dayIndex
|
|
96
|
+
? { ...d, blocks: [...d.blocks, { startTime: '13:00', endTime: '17:00' }] }
|
|
97
|
+
: d));
|
|
98
|
+
};
|
|
99
|
+
const removeBlock = (dayIndex, blockIndex) => {
|
|
100
|
+
setSchedule((prev) => prev.map((d, i) => i === dayIndex
|
|
101
|
+
? { ...d, blocks: d.blocks.filter((_, bi) => bi !== blockIndex) }
|
|
102
|
+
: d));
|
|
103
|
+
};
|
|
104
|
+
return (_jsxs("div", { className: `bg-white dark:bg-gray-900 rounded-xl border border-gray-200 dark:border-gray-700 p-4 ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsx("h3", { className: "text-sm font-semibold text-gray-900 dark:text-gray-100", children: labels?.title || 'Beschikbaarheid' }), _jsx("button", { onClick: handleSave, disabled: saving, className: `px-4 py-1.5 text-sm font-medium rounded-lg transition-colors ${saveStatus === 'saved'
|
|
105
|
+
? 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400'
|
|
106
|
+
: 'bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50'}`, children: saving ? (labels?.saving || 'Opslaan...') : saveStatus === 'saved' ? (labels?.saved || 'Opgeslagen') : (labels?.save || 'Opslaan') })] }), _jsx("div", { className: "space-y-2", children: schedule.map((day, dayIndex) => (_jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("label", { className: "flex items-center gap-2 w-28 flex-shrink-0 pt-2 cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: day.enabled, onChange: (e) => toggleDay(dayIndex, e.target.checked), className: "rounded border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800" }), _jsx("span", { className: `text-sm ${day.enabled ? 'font-medium text-gray-900 dark:text-gray-100' : 'text-gray-400 dark:text-gray-500'}`, children: dayNames[dayIndex] })] }), day.enabled ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [day.blocks.map((block, blockIndex) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "time", value: block.startTime, onChange: (e) => updateBlock(dayIndex, blockIndex, { startTime: e.target.value }), className: "px-2 py-1.5 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" }), _jsx("span", { className: "text-gray-400 text-sm", children: "\u2014" }), _jsx("input", { type: "time", value: block.endTime, onChange: (e) => updateBlock(dayIndex, blockIndex, { endTime: e.target.value }), className: "px-2 py-1.5 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" }), day.blocks.length > 1 && (_jsx("button", { onClick: () => removeBlock(dayIndex, blockIndex), className: "p-1 text-gray-400 hover:text-red-500 transition-colors", children: _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", strokeWidth: 1.5, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }) }) }))] }, blockIndex))), _jsxs("button", { onClick: () => addBlock(dayIndex), className: "flex items-center gap-1 text-xs text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors w-fit", children: [_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 4.5v15m7.5-7.5h-15" }) }), labels?.addBlock || 'Tijdsblok toevoegen'] })] })) : (_jsx("span", { className: "text-sm text-gray-400 dark:text-gray-500 pt-2", children: labels?.notAvailable || 'Niet beschikbaar' }))] }, dayIndex))) })] }));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=AvailabilityEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvailabilityEditor.js","sourceRoot":"","sources":["../../../src/planner/components/AvailabilityEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BookingWidget — Calendly-style slot picker
|
|
3
|
+
*
|
|
4
|
+
* Works both as public (unauthenticated) and internal (authenticated) booking.
|
|
5
|
+
* Shows a date picker → available slots → confirm booking.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // Public booking page
|
|
10
|
+
* <BookingWidget ownerId={coachId} publicApiBase="/api/public" />
|
|
11
|
+
*
|
|
12
|
+
* // Internal booking (authenticated)
|
|
13
|
+
* <BookingWidget ownerId={coachId} apiBase="/planner" mode="internal" />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export interface BookingWidgetProps {
|
|
17
|
+
/** Owner (coach/consultant) to book with */
|
|
18
|
+
ownerId: string;
|
|
19
|
+
/** API base for authenticated requests (default: '/planner') */
|
|
20
|
+
apiBase?: string;
|
|
21
|
+
/** API base URL for public requests (e.g. 'https://api.example.com/api/public') */
|
|
22
|
+
publicApiBase?: string;
|
|
23
|
+
/** 'public' = unauthenticated, 'internal' = authenticated (default: 'public') */
|
|
24
|
+
mode?: 'public' | 'internal';
|
|
25
|
+
/** Pre-fill parent resource ID (e.g. trackId) */
|
|
26
|
+
parentId?: string;
|
|
27
|
+
/** Callback after successful booking */
|
|
28
|
+
onBooked?: (appointment: any) => void;
|
|
29
|
+
/** Additional CSS class */
|
|
30
|
+
className?: string;
|
|
31
|
+
labels?: {
|
|
32
|
+
title?: string;
|
|
33
|
+
selectDate?: string;
|
|
34
|
+
selectTime?: string;
|
|
35
|
+
noSlots?: string;
|
|
36
|
+
book?: string;
|
|
37
|
+
booking?: string;
|
|
38
|
+
booked?: string;
|
|
39
|
+
name?: string;
|
|
40
|
+
email?: string;
|
|
41
|
+
notes?: string;
|
|
42
|
+
yourDetails?: string;
|
|
43
|
+
back?: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export declare function BookingWidget({ ownerId, apiBase, publicApiBase, mode, parentId, onBooked, className, labels, }: BookingWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
47
|
+
//# sourceMappingURL=BookingWidget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BookingWidget.d.ts","sourceRoot":"","sources":["../../../src/planner/components/BookingWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAoDD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,OAAoB,EACpB,aAAa,EACb,IAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAc,EACd,MAAM,GACP,EAAE,kBAAkB,2CA8TpB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BookingWidget — Calendly-style slot picker
|
|
3
|
+
*
|
|
4
|
+
* Works both as public (unauthenticated) and internal (authenticated) booking.
|
|
5
|
+
* Shows a date picker → available slots → confirm booking.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* // Public booking page
|
|
10
|
+
* <BookingWidget ownerId={coachId} publicApiBase="/api/public" />
|
|
11
|
+
*
|
|
12
|
+
* // Internal booking (authenticated)
|
|
13
|
+
* <BookingWidget ownerId={coachId} apiBase="/planner" mode="internal" />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
'use client';
|
|
17
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
18
|
+
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
19
|
+
const MONTH_NAMES = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'];
|
|
20
|
+
const DAY_HEADERS = ['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za', 'Zo'];
|
|
21
|
+
function getCalendarDays(year, month) {
|
|
22
|
+
const days = [];
|
|
23
|
+
const firstDay = new Date(year, month, 1);
|
|
24
|
+
const lastDay = new Date(year, month + 1, 0);
|
|
25
|
+
// Monday-based offset
|
|
26
|
+
let startOffset = firstDay.getDay() - 1;
|
|
27
|
+
if (startOffset < 0)
|
|
28
|
+
startOffset = 6;
|
|
29
|
+
// Previous month padding
|
|
30
|
+
for (let i = startOffset - 1; i >= 0; i--) {
|
|
31
|
+
const d = new Date(year, month, -i);
|
|
32
|
+
days.push({ date: d.toISOString().substring(0, 10), dayOfWeek: d.getDay(), inMonth: false });
|
|
33
|
+
}
|
|
34
|
+
// Current month
|
|
35
|
+
for (let i = 1; i <= lastDay.getDate(); i++) {
|
|
36
|
+
const d = new Date(year, month, i);
|
|
37
|
+
days.push({ date: d.toISOString().substring(0, 10), dayOfWeek: d.getDay(), inMonth: true });
|
|
38
|
+
}
|
|
39
|
+
// Next month padding (fill to 42 for 6 rows)
|
|
40
|
+
while (days.length < 42) {
|
|
41
|
+
const d = new Date(year, month + 1, days.length - lastDay.getDate() - startOffset + 1);
|
|
42
|
+
days.push({ date: d.toISOString().substring(0, 10), dayOfWeek: d.getDay(), inMonth: false });
|
|
43
|
+
}
|
|
44
|
+
return days;
|
|
45
|
+
}
|
|
46
|
+
export function BookingWidget({ ownerId, apiBase = '/planner', publicApiBase, mode = 'public', parentId, onBooked, className = '', labels, }) {
|
|
47
|
+
const [step, setStep] = useState('date');
|
|
48
|
+
const [schedulerData, setSchedulerData] = useState(null);
|
|
49
|
+
const [currentMonth, setCurrentMonth] = useState(() => new Date());
|
|
50
|
+
const [selectedDate, setSelectedDate] = useState(null);
|
|
51
|
+
const [slots, setSlots] = useState([]);
|
|
52
|
+
const [selectedSlot, setSelectedSlot] = useState(null);
|
|
53
|
+
const [loadingSlots, setLoadingSlots] = useState(false);
|
|
54
|
+
const [booking, setBooking] = useState(false);
|
|
55
|
+
const [error, setError] = useState(null);
|
|
56
|
+
// Public mode fields
|
|
57
|
+
const [name, setName] = useState('');
|
|
58
|
+
const [email, setEmail] = useState('');
|
|
59
|
+
const [notes, setNotes] = useState('');
|
|
60
|
+
const isPublic = mode === 'public';
|
|
61
|
+
const baseUrl = isPublic ? publicApiBase : undefined;
|
|
62
|
+
// ── Fetch helper (works for both public and authenticated) ──
|
|
63
|
+
const apiFetch = useCallback(async (path, options) => {
|
|
64
|
+
if (isPublic && publicApiBase) {
|
|
65
|
+
const res = await fetch(`${publicApiBase}${path}`, {
|
|
66
|
+
headers: { 'Content-Type': 'application/json' },
|
|
67
|
+
...options,
|
|
68
|
+
});
|
|
69
|
+
return res.json();
|
|
70
|
+
}
|
|
71
|
+
// Authenticated — use apiClient
|
|
72
|
+
const { apiClient } = await import('../../services/apiClient.js');
|
|
73
|
+
if (options?.method === 'POST') {
|
|
74
|
+
return apiClient.post(`${apiBase}${path}`, options.body ? JSON.parse(options.body) : undefined);
|
|
75
|
+
}
|
|
76
|
+
return apiClient.get(`${apiBase}${path}`);
|
|
77
|
+
}, [isPublic, publicApiBase, apiBase]);
|
|
78
|
+
// ── Load scheduler data ─────────────────────────────────
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
async function load() {
|
|
81
|
+
try {
|
|
82
|
+
const res = await apiFetch(`/scheduler/${ownerId}`);
|
|
83
|
+
if (res.success)
|
|
84
|
+
setSchedulerData(res.data);
|
|
85
|
+
}
|
|
86
|
+
catch { /* silent */ }
|
|
87
|
+
}
|
|
88
|
+
load();
|
|
89
|
+
}, [ownerId, apiFetch]);
|
|
90
|
+
// ── Load slots for selected date ────────────────────────
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!selectedDate)
|
|
93
|
+
return;
|
|
94
|
+
setLoadingSlots(true);
|
|
95
|
+
setSlots([]);
|
|
96
|
+
setSelectedSlot(null);
|
|
97
|
+
(async () => {
|
|
98
|
+
try {
|
|
99
|
+
const res = await apiFetch(`/scheduler/${ownerId}/slots?date=${selectedDate}`);
|
|
100
|
+
if (res.success && res.data?.slots) {
|
|
101
|
+
setSlots(res.data.slots);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch { /* silent */ }
|
|
105
|
+
finally {
|
|
106
|
+
setLoadingSlots(false);
|
|
107
|
+
}
|
|
108
|
+
})();
|
|
109
|
+
}, [selectedDate, ownerId, apiFetch]);
|
|
110
|
+
// ── Calendar data ───────────────────────────────────────
|
|
111
|
+
const calendarDays = useMemo(() => getCalendarDays(currentMonth.getFullYear(), currentMonth.getMonth()), [currentMonth]);
|
|
112
|
+
const today = new Date().toISOString().substring(0, 10);
|
|
113
|
+
const maxDate = useMemo(() => {
|
|
114
|
+
const d = new Date();
|
|
115
|
+
d.setDate(d.getDate() + (schedulerData?.settings.maxDaysAhead || 14));
|
|
116
|
+
return d.toISOString().substring(0, 10);
|
|
117
|
+
}, [schedulerData]);
|
|
118
|
+
const availableDaysSet = useMemo(() => new Set(schedulerData?.availableDays || []), [schedulerData]);
|
|
119
|
+
const isDayAvailable = (dateStr, dayOfWeek) => dateStr >= today && dateStr <= maxDate && availableDaysSet.has(dayOfWeek);
|
|
120
|
+
// ── Book ────────────────────────────────────────────────
|
|
121
|
+
const handleBook = async () => {
|
|
122
|
+
if (!selectedDate || !selectedSlot)
|
|
123
|
+
return;
|
|
124
|
+
setBooking(true);
|
|
125
|
+
setError(null);
|
|
126
|
+
try {
|
|
127
|
+
const body = isPublic
|
|
128
|
+
? { name, email, date: selectedDate, startTime: selectedSlot.startTime, endTime: selectedSlot.endTime, notes }
|
|
129
|
+
: { parentId, date: selectedDate, startTime: selectedSlot.startTime, endTime: selectedSlot.endTime };
|
|
130
|
+
const res = await apiFetch(`/scheduler/${ownerId}/book`, {
|
|
131
|
+
method: 'POST',
|
|
132
|
+
body: JSON.stringify(body),
|
|
133
|
+
});
|
|
134
|
+
if (res.success) {
|
|
135
|
+
setStep('done');
|
|
136
|
+
onBooked?.(res.data);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
setError(res.detail || res.error || 'Kon niet boeken');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
setError('Er ging iets mis');
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
setBooking(false);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
// ── Render ──────────────────────────────────────────────
|
|
150
|
+
const ownerName = schedulerData?.owner.name || '';
|
|
151
|
+
const eventName = schedulerData?.settings.eventName || 'Session';
|
|
152
|
+
const duration = schedulerData?.settings.sessionDurationMinutes || 60;
|
|
153
|
+
return (_jsxs("div", { className: `bg-white dark:bg-gray-900 rounded-xl border border-gray-200 dark:border-gray-700 overflow-hidden max-w-md mx-auto ${className}`, children: [_jsxs("div", { className: "px-5 py-4 border-b border-gray-200 dark:border-gray-700", children: [_jsxs("div", { className: "flex items-center gap-3", children: [schedulerData?.owner.avatarUrl ? (_jsx("img", { src: schedulerData.owner.avatarUrl, alt: "", className: "w-10 h-10 rounded-full" })) : (_jsx("div", { className: "w-10 h-10 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center text-blue-600 dark:text-blue-400 font-semibold text-sm", children: ownerName.substring(0, 2).toUpperCase() })), _jsxs("div", { children: [_jsx("div", { className: "font-semibold text-gray-900 dark:text-gray-100", children: eventName }), _jsxs("div", { className: "text-sm text-gray-500 dark:text-gray-400", children: [ownerName, " \u00B7 ", duration, " min"] })] })] }), schedulerData?.settings.description && (_jsx("p", { className: "mt-2 text-sm text-gray-600 dark:text-gray-400", children: schedulerData.settings.description }))] }), step === 'date' && (_jsxs("div", { className: "p-4", children: [_jsx("div", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 mb-3", children: labels?.selectDate || 'Kies een datum' }), _jsxs("div", { className: "flex items-center justify-between mb-3", children: [_jsx("button", { onClick: () => setCurrentMonth((p) => new Date(p.getFullYear(), p.getMonth() - 1)), className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800", children: _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 19.5L8.25 12l7.5-7.5" }) }) }), _jsxs("span", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: [MONTH_NAMES[currentMonth.getMonth()], " ", currentMonth.getFullYear()] }), _jsx("button", { onClick: () => setCurrentMonth((p) => new Date(p.getFullYear(), p.getMonth() + 1)), className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800", children: _jsx("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8.25 4.5l7.5 7.5-7.5 7.5" }) }) })] }), _jsx("div", { className: "grid grid-cols-7 gap-0.5 text-center text-xs mb-1", children: DAY_HEADERS.map((d) => (_jsx("div", { className: "py-1 text-gray-400 dark:text-gray-500 font-medium", children: d }, d))) }), _jsx("div", { className: "grid grid-cols-7 gap-0.5", children: calendarDays.map(({ date, dayOfWeek, inMonth }) => {
|
|
154
|
+
const available = inMonth && isDayAvailable(date, dayOfWeek);
|
|
155
|
+
const selected = date === selectedDate;
|
|
156
|
+
const isCurrentDay = date === today;
|
|
157
|
+
return (_jsx("button", { disabled: !available, onClick: () => { setSelectedDate(date); setStep('time'); }, className: `py-2 text-sm rounded-lg transition-colors ${selected ? 'bg-blue-600 text-white font-semibold' :
|
|
158
|
+
available ? 'text-gray-900 dark:text-gray-100 hover:bg-blue-50 dark:hover:bg-blue-950/30 font-medium' :
|
|
159
|
+
inMonth ? 'text-gray-300 dark:text-gray-600 cursor-not-allowed' :
|
|
160
|
+
'text-gray-200 dark:text-gray-700 cursor-not-allowed'} ${isCurrentDay && !selected ? 'ring-1 ring-blue-400' : ''}`, children: new Date(date + 'T00:00:00').getDate() }, date));
|
|
161
|
+
}) })] })), step === 'time' && (_jsxs("div", { className: "p-4", children: [_jsxs("button", { onClick: () => setStep('date'), className: "flex items-center gap-1 text-sm text-blue-600 dark:text-blue-400 mb-3 hover:underline", children: [_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 19.5L8.25 12l7.5-7.5" }) }), labels?.back || 'Terug'] }), _jsx("div", { className: "text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: labels?.selectTime || 'Kies een tijd' }), _jsx("div", { className: "text-xs text-gray-400 mb-3", children: selectedDate }), loadingSlots ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx("div", { className: "w-5 h-5 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" }) })) : slots.length === 0 ? (_jsx("div", { className: "py-8 text-center text-sm text-gray-400", children: labels?.noSlots || 'Geen beschikbare tijden' })) : (_jsx("div", { className: "grid grid-cols-3 gap-2 max-h-64 overflow-y-auto", children: slots.map((slot) => {
|
|
162
|
+
const selected = selectedSlot?.startTime === slot.startTime;
|
|
163
|
+
return (_jsx("button", { onClick: () => {
|
|
164
|
+
setSelectedSlot(slot);
|
|
165
|
+
setStep(isPublic ? 'details' : 'details');
|
|
166
|
+
}, className: `py-2 text-sm rounded-lg border transition-colors ${selected
|
|
167
|
+
? 'bg-blue-600 text-white border-blue-600'
|
|
168
|
+
: 'border-gray-200 dark:border-gray-700 text-gray-700 dark:text-gray-300 hover:border-blue-400 hover:bg-blue-50 dark:hover:bg-blue-950/30'}`, children: slot.startTime }, slot.startTime));
|
|
169
|
+
}) }))] })), step === 'details' && selectedSlot && (_jsxs("div", { className: "p-4", children: [_jsxs("button", { onClick: () => setStep('time'), className: "flex items-center gap-1 text-sm text-blue-600 dark:text-blue-400 mb-3 hover:underline", children: [_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 19.5L8.25 12l7.5-7.5" }) }), labels?.back || 'Terug'] }), _jsxs("div", { className: "bg-gray-50 dark:bg-gray-800 rounded-lg p-3 mb-4 text-sm", children: [_jsx("div", { className: "font-medium text-gray-900 dark:text-gray-100", children: selectedDate }), _jsxs("div", { className: "text-gray-600 dark:text-gray-400", children: [selectedSlot.startTime, " \u2014 ", selectedSlot.endTime, " (", duration, " min)"] })] }), isPublic && (_jsxs("div", { className: "space-y-3 mb-4", children: [_jsx("div", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: labels?.yourDetails || 'Jouw gegevens' }), _jsx("input", { type: "text", placeholder: labels?.name || 'Naam', value: name, onChange: (e) => setName(e.target.value), className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" }), _jsx("input", { type: "email", placeholder: labels?.email || 'E-mail', value: email, onChange: (e) => setEmail(e.target.value), className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" }), _jsx("textarea", { placeholder: labels?.notes || 'Opmerkingen (optioneel)', value: notes, onChange: (e) => setNotes(e.target.value), rows: 2, className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 resize-none" })] })), error && (_jsx("div", { className: "mb-3 p-2 bg-red-50 dark:bg-red-950/30 text-red-600 dark:text-red-400 rounded-lg text-xs", children: error })), _jsx("button", { onClick: handleBook, disabled: booking || (isPublic && (!name || !email)), className: "w-full py-2.5 bg-blue-600 text-white font-medium rounded-lg hover:bg-blue-700 disabled:opacity-50 transition-colors text-sm", children: booking ? (labels?.booking || 'Bezig met boeken...') : (labels?.book || 'Bevestigen') })] })), step === 'done' && (_jsxs("div", { className: "p-8 text-center", children: [_jsx("div", { className: "w-12 h-12 mx-auto mb-3 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center", children: _jsx("svg", { className: "w-6 h-6 text-green-600 dark:text-green-400", fill: "none", viewBox: "0 0 24 24", strokeWidth: 2, stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4.5 12.75l6 6 9-13.5" }) }) }), _jsx("div", { className: "text-lg font-semibold text-gray-900 dark:text-gray-100 mb-1", children: labels?.booked || 'Geboekt!' }), _jsxs("div", { className: "text-sm text-gray-500 dark:text-gray-400", children: [selectedDate, " om ", selectedSlot?.startTime] })] }))] }));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=BookingWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BookingWidget.js","sourceRoot":"","sources":["../../../src/planner/components/BookingWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TeamPlanner — Horizontal resource timeline (DayPilot-powered)
|
|
3
|
+
*
|
|
4
|
+
* Shows all team members as rows with a horizontal time axis.
|
|
5
|
+
* Supports day/week/month zoom. Powered by DayPilot Lite (Apache 2.0).
|
|
6
|
+
*/
|
|
7
|
+
import { type Appointment } from '../hooks/usePlannerApi.js';
|
|
8
|
+
export interface TeamPlannerProps {
|
|
9
|
+
apiBase?: string;
|
|
10
|
+
startHour?: number;
|
|
11
|
+
endHour?: number;
|
|
12
|
+
onBookSlot?: (ownerId: string, date: string, startTime: string, endTime: string) => void;
|
|
13
|
+
onAppointmentClick?: (appointment: Appointment) => void;
|
|
14
|
+
className?: string;
|
|
15
|
+
locale?: string;
|
|
16
|
+
defaultZoom?: 'day' | 'week' | 'month';
|
|
17
|
+
}
|
|
18
|
+
export declare function TeamPlanner({ apiBase, startHour, endHour, onBookSlot, onAppointmentClick, className, locale, defaultZoom, }: TeamPlannerProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=TeamPlanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamPlanner.d.ts","sourceRoot":"","sources":["../../../src/planner/components/TeamPlanner.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAiB,KAAK,WAAW,EAAyB,MAAM,2BAA2B,CAAC;AAEnG,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzF,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CACxC;AAkDD,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,SAAa,EACb,OAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,SAAc,EACd,MAAgB,EAChB,WAAmB,GACpB,EAAE,gBAAgB,2CAuIlB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TeamPlanner — Horizontal resource timeline (DayPilot-powered)
|
|
3
|
+
*
|
|
4
|
+
* Shows all team members as rows with a horizontal time axis.
|
|
5
|
+
* Supports day/week/month zoom. Powered by DayPilot Lite (Apache 2.0).
|
|
6
|
+
*/
|
|
7
|
+
'use client';
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
10
|
+
import { DayPilot, DayPilotScheduler, DayPilotNavigator } from '@daypilot/daypilot-lite-react';
|
|
11
|
+
import { usePlannerApi } from '../hooks/usePlannerApi.js';
|
|
12
|
+
function appointmentColor(status) {
|
|
13
|
+
switch (status) {
|
|
14
|
+
case 'scheduled': return '#3b82f6';
|
|
15
|
+
case 'completed': return '#22c55e';
|
|
16
|
+
case 'cancelled': return '#9ca3af';
|
|
17
|
+
default: return '#3b82f6';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function getZoomConfig(zoom) {
|
|
21
|
+
switch (zoom) {
|
|
22
|
+
case 'day':
|
|
23
|
+
return {
|
|
24
|
+
scale: 'CellDuration',
|
|
25
|
+
cellDuration: 30,
|
|
26
|
+
days: 1,
|
|
27
|
+
timeHeaders: [
|
|
28
|
+
{ groupBy: 'Day', format: 'dddd d MMMM' },
|
|
29
|
+
{ groupBy: 'Hour' },
|
|
30
|
+
],
|
|
31
|
+
cellWidth: 60,
|
|
32
|
+
};
|
|
33
|
+
case 'week':
|
|
34
|
+
return {
|
|
35
|
+
scale: 'CellDuration',
|
|
36
|
+
cellDuration: 60,
|
|
37
|
+
days: 7,
|
|
38
|
+
timeHeaders: [
|
|
39
|
+
{ groupBy: 'Day', format: 'ddd d/M' },
|
|
40
|
+
{ groupBy: 'Hour', format: 'HH' },
|
|
41
|
+
],
|
|
42
|
+
cellWidth: 30,
|
|
43
|
+
};
|
|
44
|
+
case 'month':
|
|
45
|
+
return {
|
|
46
|
+
scale: 'Day',
|
|
47
|
+
days: 31,
|
|
48
|
+
timeHeaders: [
|
|
49
|
+
{ groupBy: 'Month' },
|
|
50
|
+
{ groupBy: 'Day', format: 'd' },
|
|
51
|
+
],
|
|
52
|
+
cellWidth: 40,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function TeamPlanner({ apiBase, startHour = 8, endHour = 18, onBookSlot, onAppointmentClick, className = '', locale = 'nl-nl', defaultZoom = 'day', }) {
|
|
57
|
+
const api = usePlannerApi({ apiBase });
|
|
58
|
+
const schedulerRef = useRef(null);
|
|
59
|
+
const [startDate, setStartDate] = useState(() => DayPilot.Date.today());
|
|
60
|
+
const [zoom, setZoom] = useState(defaultZoom);
|
|
61
|
+
const [teamData, setTeamData] = useState(null);
|
|
62
|
+
const [appointments, setAppointments] = useState([]);
|
|
63
|
+
const [loading, setLoading] = useState(true);
|
|
64
|
+
const fetchData = useCallback(async () => {
|
|
65
|
+
setLoading(true);
|
|
66
|
+
try {
|
|
67
|
+
const dateStr = startDate.toString('yyyy-MM-dd');
|
|
68
|
+
const [team, appts] = await Promise.all([
|
|
69
|
+
api.getTeamAvailability(dateStr),
|
|
70
|
+
api.getAppointments(),
|
|
71
|
+
]);
|
|
72
|
+
setTeamData(team);
|
|
73
|
+
setAppointments(appts);
|
|
74
|
+
}
|
|
75
|
+
catch { /* silent */ }
|
|
76
|
+
finally {
|
|
77
|
+
setLoading(false);
|
|
78
|
+
}
|
|
79
|
+
}, [api, startDate]);
|
|
80
|
+
useEffect(() => { fetchData(); }, [fetchData]);
|
|
81
|
+
const resources = (teamData?.owners || []).map((owner) => ({
|
|
82
|
+
id: owner.id,
|
|
83
|
+
name: owner.name || 'Unnamed',
|
|
84
|
+
}));
|
|
85
|
+
const events = appointments
|
|
86
|
+
.filter((a) => a.status !== 'cancelled')
|
|
87
|
+
.map((a) => ({
|
|
88
|
+
id: a.id,
|
|
89
|
+
text: a.title,
|
|
90
|
+
start: new DayPilot.Date(a.startTime),
|
|
91
|
+
end: new DayPilot.Date(a.endTime),
|
|
92
|
+
resource: a.organizerId,
|
|
93
|
+
backColor: appointmentColor(a.status),
|
|
94
|
+
barColor: appointmentColor(a.status),
|
|
95
|
+
fontColor: '#ffffff',
|
|
96
|
+
data: a,
|
|
97
|
+
}));
|
|
98
|
+
const zoomConfig = getZoomConfig(zoom);
|
|
99
|
+
const schedulerConfig = {
|
|
100
|
+
startDate,
|
|
101
|
+
locale,
|
|
102
|
+
...zoomConfig,
|
|
103
|
+
eventHeight: 32,
|
|
104
|
+
rowHeaderWidth: 150,
|
|
105
|
+
resources,
|
|
106
|
+
events,
|
|
107
|
+
treeEnabled: false,
|
|
108
|
+
businessBeginsHour: startHour,
|
|
109
|
+
businessEndsHour: endHour,
|
|
110
|
+
showNonBusiness: false,
|
|
111
|
+
eventMoveHandling: 'Disabled',
|
|
112
|
+
eventResizeHandling: 'Disabled',
|
|
113
|
+
timeRangeSelectedHandling: 'Enabled',
|
|
114
|
+
onTimeRangeSelected: (args) => {
|
|
115
|
+
if (onBookSlot) {
|
|
116
|
+
onBookSlot(args.resource, args.start.toString('yyyy-MM-dd'), args.start.toString('HH:mm'), args.end.toString('HH:mm'));
|
|
117
|
+
}
|
|
118
|
+
schedulerRef.current?.clearSelection();
|
|
119
|
+
},
|
|
120
|
+
onEventClick: (args) => {
|
|
121
|
+
if (onAppointmentClick && args.e?.data?.data) {
|
|
122
|
+
onAppointmentClick(args.e.data.data);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
onBeforeEventRender: (args) => {
|
|
126
|
+
args.data.borderRadius = '4px';
|
|
127
|
+
args.data.fontColor = '#ffffff';
|
|
128
|
+
},
|
|
129
|
+
onBeforeRowHeaderRender: (args) => {
|
|
130
|
+
const owner = teamData?.owners?.find((o) => o.id === args.row?.data?.id);
|
|
131
|
+
if (owner?.vacationDay) {
|
|
132
|
+
args.row.backColor = '#fef3c7';
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
controlRef: (ref) => { schedulerRef.current = ref; },
|
|
136
|
+
};
|
|
137
|
+
return (_jsxs("div", { className: `flex flex-col gap-4 ${className}`, children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(DayPilotNavigator, { selectMode: zoom === 'month' ? 'Month' : 'Day', showMonths: 1, skipMonths: 1, startDate: startDate, locale: locale, onTimeRangeSelected: (args) => setStartDate(args.start) }), _jsx("div", { className: "flex items-center gap-1 bg-gray-100 dark:bg-gray-800 rounded-lg p-1", children: ['day', 'week', 'month'].map((z) => (_jsx("button", { onClick: () => setZoom(z), className: `px-3 py-1 text-xs font-medium rounded-md transition-colors ${zoom === z
|
|
138
|
+
? 'bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 shadow-sm'
|
|
139
|
+
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700'}`, children: z === 'day' ? 'Dag' : z === 'week' ? 'Week' : 'Maand' }, z))) })] }), loading && resources.length === 0 ? (_jsx("div", { className: "flex items-center justify-center h-64", children: _jsx("div", { className: "w-6 h-6 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" }) })) : (_jsx(DayPilotScheduler, { ...schedulerConfig })), _jsxs("div", { className: "text-[10px] text-gray-400 text-right", children: ["Powered by ", _jsx("a", { href: "https://www.daypilot.org/", target: "_blank", rel: "noopener noreferrer", className: "underline hover:text-gray-600", children: "DayPilot" })] })] }));
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=TeamPlanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TeamPlanner.js","sourceRoot":"","sources":["../../../src/planner/components/TeamPlanner.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeekCalendar — Personal agenda week view (DayPilot-powered)
|
|
3
|
+
*
|
|
4
|
+
* Shows a week view with appointments, availability backgrounds, and click-to-create.
|
|
5
|
+
* Powered by DayPilot Lite (Apache 2.0).
|
|
6
|
+
*/
|
|
7
|
+
import { type Appointment } from '../hooks/usePlannerApi.js';
|
|
8
|
+
export interface WeekCalendarProps {
|
|
9
|
+
apiBase?: string;
|
|
10
|
+
userId: string;
|
|
11
|
+
startHour?: number;
|
|
12
|
+
endHour?: number;
|
|
13
|
+
onCreateAppointment?: (date: string, startTime: string, endTime: string) => void;
|
|
14
|
+
onAppointmentClick?: (appointment: Appointment) => void;
|
|
15
|
+
className?: string;
|
|
16
|
+
locale?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function WeekCalendar({ apiBase, userId, startHour, endHour, onCreateAppointment, onAppointmentClick, className, locale, }: WeekCalendarProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=WeekCalendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeekCalendar.d.ts","sourceRoot":"","sources":["../../../src/planner/components/WeekCalendar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAiB,KAAK,WAAW,EAAyB,MAAM,2BAA2B,CAAC;AAEnG,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjF,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EACN,SAAa,EACb,OAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,SAAc,EACd,MAAgB,GACjB,EAAE,iBAAiB,2CAqGnB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WeekCalendar — Personal agenda week view (DayPilot-powered)
|
|
3
|
+
*
|
|
4
|
+
* Shows a week view with appointments, availability backgrounds, and click-to-create.
|
|
5
|
+
* Powered by DayPilot Lite (Apache 2.0).
|
|
6
|
+
*/
|
|
7
|
+
'use client';
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
10
|
+
import { DayPilot, DayPilotCalendar, DayPilotNavigator } from '@daypilot/daypilot-lite-react';
|
|
11
|
+
import { usePlannerApi } from '../hooks/usePlannerApi.js';
|
|
12
|
+
function appointmentColor(status) {
|
|
13
|
+
switch (status) {
|
|
14
|
+
case 'scheduled': return '#3b82f6';
|
|
15
|
+
case 'completed': return '#22c55e';
|
|
16
|
+
case 'cancelled': return '#9ca3af';
|
|
17
|
+
default: return '#3b82f6';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function WeekCalendar({ apiBase, userId, startHour = 8, endHour = 18, onCreateAppointment, onAppointmentClick, className = '', locale = 'nl-nl', }) {
|
|
21
|
+
const api = usePlannerApi({ apiBase });
|
|
22
|
+
const calendarRef = useRef(null);
|
|
23
|
+
const [startDate, setStartDate] = useState(() => DayPilot.Date.today().firstDayOfWeek());
|
|
24
|
+
const [appointments, setAppointments] = useState([]);
|
|
25
|
+
const [availability, setAvailability] = useState([]);
|
|
26
|
+
const fetchData = useCallback(async () => {
|
|
27
|
+
try {
|
|
28
|
+
const [appts, avail] = await Promise.all([
|
|
29
|
+
api.getAppointments(),
|
|
30
|
+
api.getAvailability(userId),
|
|
31
|
+
]);
|
|
32
|
+
setAppointments(appts);
|
|
33
|
+
setAvailability(avail);
|
|
34
|
+
}
|
|
35
|
+
catch { /* silent */ }
|
|
36
|
+
}, [api, userId]);
|
|
37
|
+
useEffect(() => { fetchData(); }, [fetchData]);
|
|
38
|
+
const events = appointments
|
|
39
|
+
.filter((a) => a.status !== 'cancelled')
|
|
40
|
+
.map((a) => ({
|
|
41
|
+
id: a.id,
|
|
42
|
+
text: a.title,
|
|
43
|
+
start: new DayPilot.Date(a.startTime),
|
|
44
|
+
end: new DayPilot.Date(a.endTime),
|
|
45
|
+
backColor: appointmentColor(a.status),
|
|
46
|
+
barColor: appointmentColor(a.status),
|
|
47
|
+
fontColor: '#ffffff',
|
|
48
|
+
data: a,
|
|
49
|
+
}));
|
|
50
|
+
const onBeforeCellRender = useCallback((args) => {
|
|
51
|
+
const dayOfWeek = args.cell.start.getDayOfWeek();
|
|
52
|
+
const cellMinutes = args.cell.start.getHours() * 60 + args.cell.start.getMinutes();
|
|
53
|
+
const isAvailable = availability.some((slot) => {
|
|
54
|
+
if (slot.dayOfWeek !== dayOfWeek || !slot.isAvailable)
|
|
55
|
+
return false;
|
|
56
|
+
const slotStart = parseInt(slot.startTime.split(':')[0]) * 60 + parseInt(slot.startTime.split(':')[1]);
|
|
57
|
+
const slotEnd = parseInt(slot.endTime.split(':')[0]) * 60 + parseInt(slot.endTime.split(':')[1]);
|
|
58
|
+
return cellMinutes >= slotStart && cellMinutes < slotEnd;
|
|
59
|
+
});
|
|
60
|
+
if (isAvailable) {
|
|
61
|
+
args.cell.backColor = '#f0fdf4';
|
|
62
|
+
}
|
|
63
|
+
}, [availability]);
|
|
64
|
+
const calendarConfig = {
|
|
65
|
+
viewType: 'Week',
|
|
66
|
+
startDate,
|
|
67
|
+
locale,
|
|
68
|
+
events,
|
|
69
|
+
businessBeginsHour: startHour,
|
|
70
|
+
businessEndsHour: endHour,
|
|
71
|
+
showNonBusiness: false,
|
|
72
|
+
cellHeight: 30,
|
|
73
|
+
headerHeight: 40,
|
|
74
|
+
eventMoveHandling: 'Disabled',
|
|
75
|
+
eventResizeHandling: 'Disabled',
|
|
76
|
+
timeRangeSelectedHandling: 'Enabled',
|
|
77
|
+
onBeforeCellRender,
|
|
78
|
+
onTimeRangeSelected: (args) => {
|
|
79
|
+
if (onCreateAppointment) {
|
|
80
|
+
onCreateAppointment(args.start.toString('yyyy-MM-dd'), args.start.toString('HH:mm'), args.end.toString('HH:mm'));
|
|
81
|
+
}
|
|
82
|
+
calendarRef.current?.clearSelection();
|
|
83
|
+
},
|
|
84
|
+
onEventClick: (args) => {
|
|
85
|
+
if (onAppointmentClick && args.e?.data?.data) {
|
|
86
|
+
onAppointmentClick(args.e.data.data);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
onBeforeEventRender: (args) => {
|
|
90
|
+
args.data.borderRadius = '6px';
|
|
91
|
+
args.data.fontColor = '#ffffff';
|
|
92
|
+
},
|
|
93
|
+
controlRef: (ref) => { calendarRef.current = ref; },
|
|
94
|
+
};
|
|
95
|
+
return (_jsxs("div", { className: `flex gap-4 ${className}`, children: [_jsx("div", { className: "flex-shrink-0", children: _jsx(DayPilotNavigator, { selectMode: "Week", showMonths: 1, skipMonths: 1, startDate: startDate, locale: locale, onTimeRangeSelected: (args) => setStartDate(args.start) }) }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(DayPilotCalendar, { ...calendarConfig }) })] }));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=WeekCalendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WeekCalendar.js","sourceRoot":"","sources":["../../../src/planner/components/WeekCalendar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePlannerApi — Base API hook for all planner data fetching
|
|
3
|
+
*
|
|
4
|
+
* Provides typed fetch wrappers for the Tetra Planner backend routes.
|
|
5
|
+
* All other planner hooks build on this.
|
|
6
|
+
*/
|
|
7
|
+
export interface PlannerApiConfig {
|
|
8
|
+
/** Base path for planner API (default: '/planner') */
|
|
9
|
+
apiBase?: string;
|
|
10
|
+
/** Base path for public API (default: '/api/public') */
|
|
11
|
+
publicApiBase?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TimeSlot {
|
|
14
|
+
startTime: string;
|
|
15
|
+
endTime: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AvailabilitySlot {
|
|
18
|
+
id: string;
|
|
19
|
+
organizationId: string;
|
|
20
|
+
ownerId: string;
|
|
21
|
+
dayOfWeek: number;
|
|
22
|
+
startTime: string;
|
|
23
|
+
endTime: string;
|
|
24
|
+
isAvailable: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface Appointment {
|
|
27
|
+
id: string;
|
|
28
|
+
organizationId: string;
|
|
29
|
+
parentId: string | null;
|
|
30
|
+
organizerId: string;
|
|
31
|
+
title: string;
|
|
32
|
+
description: string | null;
|
|
33
|
+
startTime: string;
|
|
34
|
+
endTime: string;
|
|
35
|
+
location: string | null;
|
|
36
|
+
type: string;
|
|
37
|
+
status: 'scheduled' | 'completed' | 'cancelled';
|
|
38
|
+
attendeeIds: string[];
|
|
39
|
+
googleCalendarEventId: string | null;
|
|
40
|
+
createdAt: string;
|
|
41
|
+
updatedAt: string;
|
|
42
|
+
organizer?: {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
email: string;
|
|
46
|
+
} | null;
|
|
47
|
+
parent?: {
|
|
48
|
+
id: string;
|
|
49
|
+
title: string;
|
|
50
|
+
} | null;
|
|
51
|
+
}
|
|
52
|
+
export interface DayAvailability {
|
|
53
|
+
date: string;
|
|
54
|
+
dayOfWeek: number;
|
|
55
|
+
ownerId: string;
|
|
56
|
+
slots: TimeSlot[];
|
|
57
|
+
sessionDurationMinutes: number;
|
|
58
|
+
}
|
|
59
|
+
export interface TeamAvailability {
|
|
60
|
+
date: string;
|
|
61
|
+
dayOfWeek: number;
|
|
62
|
+
owners: Array<{
|
|
63
|
+
id: string;
|
|
64
|
+
name: string | null;
|
|
65
|
+
avatarUrl: string | null;
|
|
66
|
+
slots: TimeSlot[];
|
|
67
|
+
vacationDay: boolean;
|
|
68
|
+
}>;
|
|
69
|
+
}
|
|
70
|
+
export interface SchedulerSettings {
|
|
71
|
+
eventName: string;
|
|
72
|
+
zoomLink: string | null;
|
|
73
|
+
description: string | null;
|
|
74
|
+
sessionDurationMinutes: number;
|
|
75
|
+
maxDaysAhead: number;
|
|
76
|
+
minLeadTimeHours: number;
|
|
77
|
+
timeIncrementMinutes: number;
|
|
78
|
+
}
|
|
79
|
+
export interface Vacation {
|
|
80
|
+
id: string;
|
|
81
|
+
ownerId: string;
|
|
82
|
+
startDate: string;
|
|
83
|
+
endDate: string;
|
|
84
|
+
description: string | null;
|
|
85
|
+
}
|
|
86
|
+
interface ApiRes<T = any> {
|
|
87
|
+
success: boolean;
|
|
88
|
+
data: T;
|
|
89
|
+
error?: string;
|
|
90
|
+
}
|
|
91
|
+
export declare function usePlannerApi(config?: PlannerApiConfig): {
|
|
92
|
+
getAvailability: (ownerId?: string) => Promise<AvailabilitySlot[]>;
|
|
93
|
+
setAvailability: (slots: Array<{
|
|
94
|
+
dayOfWeek: number;
|
|
95
|
+
startTime: string;
|
|
96
|
+
endTime: string;
|
|
97
|
+
isAvailable?: boolean;
|
|
98
|
+
}>) => Promise<ApiRes<any>>;
|
|
99
|
+
getAvailableSlots: (ownerId: string, date: string) => Promise<DayAvailability | null>;
|
|
100
|
+
getTeamAvailability: (date: string) => Promise<TeamAvailability | null>;
|
|
101
|
+
getAppointments: (status?: string) => Promise<Appointment[]>;
|
|
102
|
+
createAppointment: (data: {
|
|
103
|
+
title: string;
|
|
104
|
+
parentId?: string;
|
|
105
|
+
startTime: string;
|
|
106
|
+
endTime: string;
|
|
107
|
+
description?: string;
|
|
108
|
+
location?: string;
|
|
109
|
+
type?: string;
|
|
110
|
+
attendeeIds?: string[];
|
|
111
|
+
}) => Promise<Appointment | null>;
|
|
112
|
+
cancelAppointment: (id: string) => Promise<boolean>;
|
|
113
|
+
completeAppointment: (id: string) => Promise<boolean>;
|
|
114
|
+
bookSlot: (ownerId: string, data: {
|
|
115
|
+
parentId?: string;
|
|
116
|
+
date: string;
|
|
117
|
+
startTime: string;
|
|
118
|
+
endTime: string;
|
|
119
|
+
title?: string;
|
|
120
|
+
}) => Promise<Appointment | null>;
|
|
121
|
+
getVacations: () => Promise<Vacation[]>;
|
|
122
|
+
createVacation: (startDate: string, endDate: string, description?: string) => Promise<any>;
|
|
123
|
+
deleteVacation: (id: string) => Promise<boolean>;
|
|
124
|
+
getSettings: () => Promise<SchedulerSettings | null>;
|
|
125
|
+
updateSettings: (settings: Partial<SchedulerSettings>) => Promise<any>;
|
|
126
|
+
getCalendarStatus: () => Promise<{
|
|
127
|
+
connected: boolean;
|
|
128
|
+
}>;
|
|
129
|
+
getCalendarAuthUrl: () => Promise<string | null>;
|
|
130
|
+
disconnectCalendar: () => Promise<boolean>;
|
|
131
|
+
};
|
|
132
|
+
export {};
|
|
133
|
+
//# sourceMappingURL=usePlannerApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePlannerApi.d.ts","sourceRoot":"","sources":["../../../src/planner/hooks/usePlannerApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* usePlannerApi — Base API hook for all planner data fetching
|
|
3
|
+
*
|
|
4
|
+
* Provides typed fetch wrappers for the Tetra Planner backend routes.
|
|
5
|
+
* All other planner hooks build on this.
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback } from 'react';
|
|
8
|
+
import { apiClient } from '../../services/apiClient.js';
|
|
9
|
+
export function usePlannerApi(config = {}) {
|
|
10
|
+
const base = config.apiBase || '/planner';
|
|
11
|
+
// ── Availability ──────────────────────────────────────────
|
|
12
|
+
const getAvailability = useCallback(async (ownerId) => {
|
|
13
|
+
const path = ownerId ? `${base}/owners/${ownerId}/availability` : `${base}/availability`;
|
|
14
|
+
const res = await apiClient.get(path);
|
|
15
|
+
return res.success ? res.data : [];
|
|
16
|
+
}, [base]);
|
|
17
|
+
const setAvailability = useCallback(async (slots) => {
|
|
18
|
+
const res = await apiClient.put(`${base}/availability`, { slots });
|
|
19
|
+
return res;
|
|
20
|
+
}, [base]);
|
|
21
|
+
// ── Available Slots ───────────────────────────────────────
|
|
22
|
+
const getAvailableSlots = useCallback(async (ownerId, date) => {
|
|
23
|
+
const res = await apiClient.get(`${base}/owners/${ownerId}/available-slots?date=${date}`);
|
|
24
|
+
return res.success ? res.data : null;
|
|
25
|
+
}, [base]);
|
|
26
|
+
// ── Team Availability ─────────────────────────────────────
|
|
27
|
+
const getTeamAvailability = useCallback(async (date) => {
|
|
28
|
+
const res = await apiClient.get(`${base}/team-availability?date=${date}`);
|
|
29
|
+
return res.success ? res.data : null;
|
|
30
|
+
}, [base]);
|
|
31
|
+
// ── Appointments ──────────────────────────────────────────
|
|
32
|
+
const getAppointments = useCallback(async (status) => {
|
|
33
|
+
const qs = status ? `?status=${status}` : '';
|
|
34
|
+
const res = await apiClient.get(`${base}/appointments${qs}`);
|
|
35
|
+
return res.success ? res.data : [];
|
|
36
|
+
}, [base]);
|
|
37
|
+
const createAppointment = useCallback(async (data) => {
|
|
38
|
+
const res = await apiClient.post(`${base}/appointments`, data);
|
|
39
|
+
return res.success ? res.data : null;
|
|
40
|
+
}, [base]);
|
|
41
|
+
const cancelAppointment = useCallback(async (id) => {
|
|
42
|
+
const res = await apiClient.delete(`${base}/appointments/${id}`);
|
|
43
|
+
return res.success;
|
|
44
|
+
}, [base]);
|
|
45
|
+
const completeAppointment = useCallback(async (id) => {
|
|
46
|
+
const res = await apiClient.post(`${base}/appointments/${id}/complete`);
|
|
47
|
+
return res.success;
|
|
48
|
+
}, [base]);
|
|
49
|
+
const bookSlot = useCallback(async (ownerId, data) => {
|
|
50
|
+
const res = await apiClient.post(`${base}/owners/${ownerId}/book`, data);
|
|
51
|
+
return res.success ? res.data : null;
|
|
52
|
+
}, [base]);
|
|
53
|
+
// ── Vacations ─────────────────────────────────────────────
|
|
54
|
+
const getVacations = useCallback(async () => {
|
|
55
|
+
const res = await apiClient.get(`${base}/vacations`);
|
|
56
|
+
return res.success ? res.data : [];
|
|
57
|
+
}, [base]);
|
|
58
|
+
const createVacation = useCallback(async (startDate, endDate, description) => {
|
|
59
|
+
const res = await apiClient.post(`${base}/vacations`, { startDate, endDate, description });
|
|
60
|
+
return res.success ? res.data : null;
|
|
61
|
+
}, [base]);
|
|
62
|
+
const deleteVacation = useCallback(async (id) => {
|
|
63
|
+
const res = await apiClient.delete(`${base}/vacations/${id}`);
|
|
64
|
+
return res.success;
|
|
65
|
+
}, [base]);
|
|
66
|
+
// ── Settings ──────────────────────────────────────────────
|
|
67
|
+
const getSettings = useCallback(async () => {
|
|
68
|
+
const res = await apiClient.get(`${base}/scheduler-settings`);
|
|
69
|
+
return res.success ? res.data : null;
|
|
70
|
+
}, [base]);
|
|
71
|
+
const updateSettings = useCallback(async (settings) => {
|
|
72
|
+
const res = await apiClient.put(`${base}/scheduler-settings`, settings);
|
|
73
|
+
return res.success ? res.data : null;
|
|
74
|
+
}, [base]);
|
|
75
|
+
// ── Calendar ──────────────────────────────────────────────
|
|
76
|
+
const getCalendarStatus = useCallback(async () => {
|
|
77
|
+
const res = await apiClient.get('/calendar/status');
|
|
78
|
+
return res.success ? res.data : { connected: false };
|
|
79
|
+
}, []);
|
|
80
|
+
const getCalendarAuthUrl = useCallback(async () => {
|
|
81
|
+
const res = await apiClient.get('/calendar/auth-url');
|
|
82
|
+
return res.success ? res.data?.url : null;
|
|
83
|
+
}, []);
|
|
84
|
+
const disconnectCalendar = useCallback(async () => {
|
|
85
|
+
const res = await apiClient.post('/calendar/disconnect');
|
|
86
|
+
return res.success;
|
|
87
|
+
}, []);
|
|
88
|
+
return {
|
|
89
|
+
getAvailability, setAvailability,
|
|
90
|
+
getAvailableSlots, getTeamAvailability,
|
|
91
|
+
getAppointments, createAppointment, cancelAppointment, completeAppointment, bookSlot,
|
|
92
|
+
getVacations, createVacation, deleteVacation,
|
|
93
|
+
getSettings, updateSettings,
|
|
94
|
+
getCalendarStatus, getCalendarAuthUrl, disconnectCalendar,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=usePlannerApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePlannerApi.js","sourceRoot":"","sources":["../../../src/planner/hooks/usePlannerApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @soulbatical/tetra-ui/planner
|
|
3
|
+
*
|
|
4
|
+
* Planner frontend components — calendar, team planner, booking widget.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { WeekCalendar, TeamPlanner, AvailabilityEditor, BookingWidget } from '@soulbatical/tetra-ui';
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export { WeekCalendar, type WeekCalendarProps } from './components/WeekCalendar.js';
|
|
12
|
+
export { TeamPlanner, type TeamPlannerProps } from './components/TeamPlanner.js';
|
|
13
|
+
export { AvailabilityEditor, type AvailabilityEditorProps } from './components/AvailabilityEditor.js';
|
|
14
|
+
export { BookingWidget, type BookingWidgetProps } from './components/BookingWidget.js';
|
|
15
|
+
export { usePlannerApi, type PlannerApiConfig, type Appointment, type AvailabilitySlot, type DayAvailability, type TeamAvailability, type SchedulerSettings, type Vacation, type TimeSlot } from './hooks/usePlannerApi.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/planner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AACtG,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGvF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @soulbatical/tetra-ui/planner
|
|
3
|
+
*
|
|
4
|
+
* Planner frontend components — calendar, team planner, booking widget.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { WeekCalendar, TeamPlanner, AvailabilityEditor, BookingWidget } from '@soulbatical/tetra-ui';
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
// Components
|
|
12
|
+
export { WeekCalendar } from './components/WeekCalendar.js';
|
|
13
|
+
export { TeamPlanner } from './components/TeamPlanner.js';
|
|
14
|
+
export { AvailabilityEditor } from './components/AvailabilityEditor.js';
|
|
15
|
+
export { BookingWidget } from './components/BookingWidget.js';
|
|
16
|
+
// Hooks
|
|
17
|
+
export { usePlannerApi } from './hooks/usePlannerApi.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,aAAa;AACb,OAAO,EAAE,YAAY,EAA0B,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAgC,MAAM,oCAAoC,CAAC;AACtG,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AAEvF,QAAQ;AACR,OAAO,EAAE,aAAa,EAAqK,MAAM,0BAA0B,CAAC"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "restricted"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.1.
|
|
7
|
+
"version": "0.1.6",
|
|
8
8
|
"description": "Shared React frontend framework for Tetra platform projects (Soulbatical BV) — config-driven components, hooks, providers, and styling",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"main": "dist/index.js",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
+
"@daypilot/daypilot-lite-react": "^5.4.1",
|
|
64
65
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
65
66
|
"@radix-ui/react-select": "^2.2.6",
|
|
66
67
|
"@radix-ui/react-slot": "^1.2.4",
|