@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.
Files changed (29) hide show
  1. package/dist/index.d.ts +6 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/planner/components/AvailabilityEditor.d.ts +28 -0
  6. package/dist/planner/components/AvailabilityEditor.d.ts.map +1 -0
  7. package/dist/planner/components/AvailabilityEditor.js +108 -0
  8. package/dist/planner/components/AvailabilityEditor.js.map +1 -0
  9. package/dist/planner/components/BookingWidget.d.ts +47 -0
  10. package/dist/planner/components/BookingWidget.d.ts.map +1 -0
  11. package/dist/planner/components/BookingWidget.js +171 -0
  12. package/dist/planner/components/BookingWidget.js.map +1 -0
  13. package/dist/planner/components/TeamPlanner.d.ts +19 -0
  14. package/dist/planner/components/TeamPlanner.d.ts.map +1 -0
  15. package/dist/planner/components/TeamPlanner.js +141 -0
  16. package/dist/planner/components/TeamPlanner.js.map +1 -0
  17. package/dist/planner/components/WeekCalendar.d.ts +19 -0
  18. package/dist/planner/components/WeekCalendar.d.ts.map +1 -0
  19. package/dist/planner/components/WeekCalendar.js +97 -0
  20. package/dist/planner/components/WeekCalendar.js.map +1 -0
  21. package/dist/planner/hooks/usePlannerApi.d.ts +133 -0
  22. package/dist/planner/hooks/usePlannerApi.d.ts.map +1 -0
  23. package/dist/planner/hooks/usePlannerApi.js +97 -0
  24. package/dist/planner/hooks/usePlannerApi.js.map +1 -0
  25. package/dist/planner/index.d.ts +16 -0
  26. package/dist/planner/index.d.ts.map +1 -0
  27. package/dist/planner/index.js +18 -0
  28. package/dist/planner/index.js.map +1 -0
  29. 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
@@ -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.4",
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",