@reservi/react 2.0.0-beta.2 → 2.0.0-beta.4
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.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +72 -69
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),c=require("react"),G=require("react-dom"),h=require("@reservi/preact"),o=require("@reservi/core"),F=t=>t?o.dl.toDate(t):null,A=t=>t?o.dl.toISOString(t):"";function f(t){return{id:t.id,groupId:t.groupId,title:t.title,start:F(t.start),end:F(t.end),startStr:A(t.start),endStr:A(t.end),allDay:t.allDay,url:t.url,display:t.display,backgroundColor:t.backgroundColor,borderColor:t.borderColor,textColor:t.textColor,classNames:t.classNames,extendedProps:t.extendedProps,def:t}}function M(t,l,v){const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),c=require("react"),G=require("react-dom"),h=require("@reservi/preact"),o=require("@reservi/core"),F=t=>t?o.dl.toDate(t):null,A=t=>t?o.dl.toISOString(t):"";function f(t){return{id:t.id,groupId:t.groupId,title:t.title,start:F(t.start),end:F(t.end),startStr:A(t.start),endStr:A(t.end),allDay:t.allDay,url:t.url,display:t.display,backgroundColor:t.backgroundColor,borderColor:t.borderColor,textColor:t.textColor,classNames:t.classNames,extendedProps:t.extendedProps,def:t}}function M(t,l,v){const m={type:t.type};return l?{...m,...v==null?{}:{title:v},currentStart:o.dl.toDate(l.currentStart),currentEnd:o.dl.toDate(l.currentEnd),activeStart:o.dl.toDate(l.activeStart),activeEnd:o.dl.toDate(l.activeEnd)}:v==null?m:{...m,title:v}}const _=["eventContent","dayCellContent","dayHeaderContent","slotLabelContent","moreLinkContent"],V=["locale","direction","timeZone","firstDay","weekends","hiddenDays","fixedWeekCount","showNonCurrentDates","weekNumbers","weekNumberCalculation","navLinks","dayHeaders","dayNumberAlign","moreLinkPopover","dayMaxEvents","dayMaxEventRows","slotMinTime","slotMaxTime","slotDuration","slotLabelInterval","allDaySlot","nowIndicator","scrollTime","editable","eventDraggable","selectable","selectMirror","snapDuration","businessHours","eventOverlap","eventConstraint","eventAllow","theme","themeTokens","headerToolbar","hourHeight","height","eventTimeFormat","slotLabelFormat","dayHeaderFormat","listDayFormat","listDaySideFormat","titleFormat","viewOverrides","keyboardShortcuts","resourceAreaWidth","resourceOrder","lazyFetching","classNames","views","addButtonText","responsiveViews"];function B(t,l){return t.getOption(l)}const W=c.forwardRef(function(l,v){const m=c.useRef(null),g=c.useRef(null),a=c.useRef(l);a.current=l;const b=c.useRef(new Map),[,D]=c.useState(0),O=c.useRef(!1),P=c.useRef(!0),w=c.useCallback(()=>{O.current||(O.current=!0,queueMicrotask(()=>{O.current=!1,P.current&&D(i=>i+1)}))},[]),H=c.useMemo(()=>({mount(i,d,C){b.current.set(i,{el:d,payload:C}),w()},update(i,d){const C=b.current.get(i);C&&(C.payload=d,w())},unmount(i){b.current.delete(i)&&w()}}),[w]);c.useEffect(()=>{var j,x;const i=m.current;if(!i)return;P.current=!0;const d={eventContent:e=>a.current.eventContent?h.hostSlot({slot:"eventContent",arg:e}):void 0,dayCellContent:e=>a.current.dayCellContent?h.hostSlot({slot:"dayCellContent",arg:e}):void 0,dayHeaderContent:e=>a.current.dayHeaderContent?h.hostSlot({slot:"dayHeaderContent",arg:e}):void 0,slotLabelContent:e=>a.current.slotLabelContent?h.hostSlot({slot:"slotLabelContent",arg:e}):void 0,moreLinkContent:e=>a.current.moreLinkContent?h.hostSlot({slot:"moreLinkContent",arg:e}):void 0},C={...Z(a.current),slots:d,hostBridge:H,hooks:{eventDidMount:e=>{const n=a.current.eventDidMount;n&&n({...q(e),el:e.el})},dayCellDidMount:e=>{var n,r;return(r=(n=a.current).dayCellDidMount)==null?void 0:r.call(n,e)},dayHeaderDidMount:e=>{var n,r;return(r=(n=a.current).dayHeaderDidMount)==null?void 0:r.call(n,e)},slotLabelDidMount:e=>{var n,r;return(r=(n=a.current).slotLabelDidMount)==null?void 0:r.call(n,e)}}},S=h.mount(i,C);g.current=S;const u=S.api,y=()=>{const e=u.getViewModel();return M(e.spec,e.range,e.title)},z=[u.on("eventClick",({event:e,el:n})=>{var r,s;return(s=(r=a.current).eventClick)==null?void 0:s.call(r,{event:f(e),el:n??null,view:y()})}),u.on("dateClick",({date:e,allDay:n})=>{var r,s;return(s=(r=a.current).dateClick)==null?void 0:s.call(r,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e),allDay:n??!1,view:y()})}),u.on("select",({start:e,end:n})=>{var r,s;return(s=(r=a.current).select)==null?void 0:s.call(r,{start:o.dl.toDate(e),end:o.dl.toDate(n),startStr:o.dl.toISOString(e),endStr:o.dl.toISOString(n),view:y()})}),u.on("unselect",()=>{var e,n;return(n=(e=a.current).unselect)==null?void 0:n.call(e)}),u.on("datesSet",({range:e,view:n})=>{var r,s;return(s=(r=a.current).datesSet)==null?void 0:s.call(r,{start:o.dl.toDate(e.activeStart),end:o.dl.toDate(e.activeEnd),startStr:o.dl.toISOString(e.activeStart),endStr:o.dl.toISOString(e.activeEnd),view:M(n,e)})}),u.on("eventsSet",e=>{var n,r;return(r=(n=a.current).eventsSet)==null?void 0:r.call(n,e.map(s=>f(s)))}),u.on("eventDrop",({event:e})=>{var n,r;return(r=(n=a.current).eventDrop)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventResize",({event:e})=>{var n,r;return(r=(n=a.current).eventResize)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventChange",({event:e})=>{var n,r;return(r=(n=a.current).eventChange)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("moreLinkClick",({date:e,allEvents:n,hiddenEvents:r})=>{var s,N;return(N=(s=a.current).moreLinkClick)==null?void 0:N.call(s,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e),allEvents:n.map(E=>f(E)),hiddenEvents:r.map(E=>f(E)),view:y()})}),u.on("navLinkDay",({date:e})=>{var n,r;return(r=(n=a.current).navLinkDay)==null?void 0:r.call(n,{date:o.dl.toDate(e),dateStr:o.dl.toISOString(e)})}),u.on("loading",({isLoading:e})=>{var n,r;return(r=(n=a.current).loading)==null?void 0:r.call(n,e)})];return(x=(j=a.current).onReady)==null||x.call(j,u),()=>{P.current=!1;for(const e of z)e();S.destroy(),g.current=null,b.current.clear()}},[H]),c.useImperativeHandle(v,()=>({getApi:()=>{var i;return((i=g.current)==null?void 0:i.api)??null}}),[]);const L=V.map(i=>l[i]);c.useEffect(()=>{var S;const i=(S=g.current)==null?void 0:S.api;if(!i)return;const d={};let C=!1;V.forEach((u,y)=>{B(i,u)!==L[y]&&(d[u]=L[y],C=!0)}),C&&i.setOptions(d)},L);const k=l.events,T=c.useRef(k);c.useEffect(()=>{var d;const i=(d=g.current)==null?void 0:d.api;if(!(!i||!k)){if(T.current===k){T.current=void 0;return}i.refetchEvents(k)}},[k]);const I=[];for(const[i,{el:d,payload:C}]of b.current){const S=Y(l,C);S!=null&&I.push(G.createPortal(S,d,i))}return R.jsxs(R.Fragment,{children:[R.jsx("div",{ref:m,className:l.className,style:l.style}),I]})});function Y(t,l){var v,m,g,a,b;switch(l.slot){case"eventContent":return(v=t.eventContent)==null?void 0:v.call(t,q(l.arg));case"dayCellContent":return(m=t.dayCellContent)==null?void 0:m.call(t,l.arg);case"dayHeaderContent":return(g=t.dayHeaderContent)==null?void 0:g.call(t,l.arg);case"slotLabelContent":return(a=t.slotLabelContent)==null?void 0:a.call(t,l.arg);case"moreLinkContent":{const D=l.arg;return(b=t.moreLinkContent)==null?void 0:b.call(t,{date:D.date,moreCount:D.moreCount,allEvents:D.allEvents.map(f),hiddenEvents:D.hiddenEvents.map(f),view:D.view})}default:return null}}function q(t){return{event:f(t.event),isAllDay:t.isAllDay,timeText:t.timeText,view:t.view}}const K=new Set([..._,"eventClick","dateClick","select","unselect","datesSet","eventsSet","eventDrop","eventResize","eventChange","moreLinkClick","navLinkDay","loading","eventDidMount","dayCellDidMount","dayHeaderDidMount","slotLabelDidMount","onReady","className","style"]);function Z(t){const l={};for(const[v,m]of Object.entries(t))K.has(v)||(l[v]=m);return l}Object.defineProperty(exports,"dayGridPlugin",{enumerable:!0,get:()=>o.dayGridPlugin});Object.defineProperty(exports,"definePlugin",{enumerable:!0,get:()=>o.definePlugin});Object.defineProperty(exports,"defineTheme",{enumerable:!0,get:()=>o.defineTheme});Object.defineProperty(exports,"dl",{enumerable:!0,get:()=>o.dl});Object.defineProperty(exports,"listPlugin",{enumerable:!0,get:()=>o.listPlugin});Object.defineProperty(exports,"multiMonthPlugin",{enumerable:!0,get:()=>o.multiMonthPlugin});Object.defineProperty(exports,"resourcePlugin",{enumerable:!0,get:()=>o.resourcePlugin});Object.defineProperty(exports,"timeGridPlugin",{enumerable:!0,get:()=>o.timeGridPlugin});Object.defineProperty(exports,"timelinePlugin",{enumerable:!0,get:()=>o.timelinePlugin});exports.ReserviCalendar=W;exports.adaptEvent=f;exports.adaptView=M;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayHeaders\",\n \"dayNumberAlign\",\n \"moreLinkPopover\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,10 @@ import { jsxs as B, Fragment as G, jsx as W } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as Y, useRef as g, useState as q, useCallback as K, useMemo as Z, useEffect as R, useImperativeHandle as J } from "react";
|
|
3
3
|
import { createPortal as Q } from "react-dom";
|
|
4
4
|
import { mount as U, hostSlot as w } from "@reservi/preact";
|
|
5
|
-
import { dl as
|
|
6
|
-
import { dayGridPlugin as ce, definePlugin as de, defineTheme as ve, dl as Ce, listPlugin as me, multiMonthPlugin as
|
|
7
|
-
const F = (t) => t ?
|
|
8
|
-
function
|
|
5
|
+
import { dl as l } from "@reservi/core";
|
|
6
|
+
import { dayGridPlugin as ce, definePlugin as de, defineTheme as ve, dl as Ce, listPlugin as me, multiMonthPlugin as ye, resourcePlugin as Se, timeGridPlugin as fe, timelinePlugin as De } from "@reservi/core";
|
|
7
|
+
const F = (t) => t ? l.toDate(t) : null, A = (t) => t ? l.toISOString(t) : "";
|
|
8
|
+
function y(t) {
|
|
9
9
|
return {
|
|
10
10
|
id: t.id,
|
|
11
11
|
groupId: t.groupId,
|
|
@@ -30,10 +30,10 @@ function V(t, a, d) {
|
|
|
30
30
|
return a ? {
|
|
31
31
|
...v,
|
|
32
32
|
...d == null ? {} : { title: d },
|
|
33
|
-
currentStart:
|
|
34
|
-
currentEnd:
|
|
35
|
-
activeStart:
|
|
36
|
-
activeEnd:
|
|
33
|
+
currentStart: l.toDate(a.currentStart),
|
|
34
|
+
currentEnd: l.toDate(a.currentEnd),
|
|
35
|
+
activeStart: l.toDate(a.activeStart),
|
|
36
|
+
activeEnd: l.toDate(a.activeEnd)
|
|
37
37
|
} : d == null ? v : { ...v, title: d };
|
|
38
38
|
}
|
|
39
39
|
const X = [
|
|
@@ -54,6 +54,9 @@ const X = [
|
|
|
54
54
|
"weekNumbers",
|
|
55
55
|
"weekNumberCalculation",
|
|
56
56
|
"navLinks",
|
|
57
|
+
"dayHeaders",
|
|
58
|
+
"dayNumberAlign",
|
|
59
|
+
"moreLinkPopover",
|
|
57
60
|
"dayMaxEvents",
|
|
58
61
|
"dayMaxEventRows",
|
|
59
62
|
"slotMinTime",
|
|
@@ -99,33 +102,33 @@ const X = [
|
|
|
99
102
|
function $(t, a) {
|
|
100
103
|
return t.getOption(a);
|
|
101
104
|
}
|
|
102
|
-
const
|
|
105
|
+
const le = Y(
|
|
103
106
|
function(a, d) {
|
|
104
|
-
const v = g(null),
|
|
107
|
+
const v = g(null), f = g(null), o = g(a);
|
|
105
108
|
o.current = a;
|
|
106
109
|
const D = g(/* @__PURE__ */ new Map()), [, h] = q(0), L = g(!1), E = g(!0), b = K(() => {
|
|
107
110
|
L.current || (L.current = !0, queueMicrotask(() => {
|
|
108
|
-
L.current = !1, E.current && h((
|
|
111
|
+
L.current = !1, E.current && h((i) => i + 1);
|
|
109
112
|
}));
|
|
110
113
|
}, []), H = Z(
|
|
111
114
|
() => ({
|
|
112
|
-
mount(
|
|
113
|
-
D.current.set(
|
|
115
|
+
mount(i, c, C) {
|
|
116
|
+
D.current.set(i, { el: c, payload: C }), b();
|
|
114
117
|
},
|
|
115
|
-
update(
|
|
116
|
-
const C = D.current.get(
|
|
118
|
+
update(i, c) {
|
|
119
|
+
const C = D.current.get(i);
|
|
117
120
|
C && (C.payload = c, b());
|
|
118
121
|
},
|
|
119
|
-
unmount(
|
|
120
|
-
D.current.delete(
|
|
122
|
+
unmount(i) {
|
|
123
|
+
D.current.delete(i) && b();
|
|
121
124
|
}
|
|
122
125
|
}),
|
|
123
126
|
[b]
|
|
124
127
|
);
|
|
125
128
|
R(() => {
|
|
126
|
-
var
|
|
127
|
-
const
|
|
128
|
-
if (!
|
|
129
|
+
var P, T;
|
|
130
|
+
const i = v.current;
|
|
131
|
+
if (!i) return;
|
|
129
132
|
E.current = !0;
|
|
130
133
|
const c = {
|
|
131
134
|
eventContent: (e) => o.current.eventContent ? w({ slot: "eventContent", arg: e }) : void 0,
|
|
@@ -155,9 +158,9 @@ const ie = Y(
|
|
|
155
158
|
return (r = (n = o.current).slotLabelDidMount) == null ? void 0 : r.call(n, e);
|
|
156
159
|
}
|
|
157
160
|
}
|
|
158
|
-
},
|
|
159
|
-
|
|
160
|
-
const s =
|
|
161
|
+
}, S = U(i, C);
|
|
162
|
+
f.current = S;
|
|
163
|
+
const s = S.api, m = () => {
|
|
161
164
|
const e = s.getViewModel();
|
|
162
165
|
return V(e.spec, e.range, e.title);
|
|
163
166
|
}, j = [
|
|
@@ -166,7 +169,7 @@ const ie = Y(
|
|
|
166
169
|
({ event: e, el: n }) => {
|
|
167
170
|
var r, u;
|
|
168
171
|
return (u = (r = o.current).eventClick) == null ? void 0 : u.call(r, {
|
|
169
|
-
event:
|
|
172
|
+
event: y(e),
|
|
170
173
|
el: n ?? null,
|
|
171
174
|
view: m()
|
|
172
175
|
});
|
|
@@ -177,8 +180,8 @@ const ie = Y(
|
|
|
177
180
|
({ date: e, allDay: n }) => {
|
|
178
181
|
var r, u;
|
|
179
182
|
return (u = (r = o.current).dateClick) == null ? void 0 : u.call(r, {
|
|
180
|
-
date:
|
|
181
|
-
dateStr:
|
|
183
|
+
date: l.toDate(e),
|
|
184
|
+
dateStr: l.toISOString(e),
|
|
182
185
|
allDay: n ?? !1,
|
|
183
186
|
view: m()
|
|
184
187
|
});
|
|
@@ -189,10 +192,10 @@ const ie = Y(
|
|
|
189
192
|
({ start: e, end: n }) => {
|
|
190
193
|
var r, u;
|
|
191
194
|
return (u = (r = o.current).select) == null ? void 0 : u.call(r, {
|
|
192
|
-
start:
|
|
193
|
-
end:
|
|
194
|
-
startStr:
|
|
195
|
-
endStr:
|
|
195
|
+
start: l.toDate(e),
|
|
196
|
+
end: l.toDate(n),
|
|
197
|
+
startStr: l.toISOString(e),
|
|
198
|
+
endStr: l.toISOString(n),
|
|
196
199
|
view: m()
|
|
197
200
|
});
|
|
198
201
|
}
|
|
@@ -206,10 +209,10 @@ const ie = Y(
|
|
|
206
209
|
({ range: e, view: n }) => {
|
|
207
210
|
var r, u;
|
|
208
211
|
return (u = (r = o.current).datesSet) == null ? void 0 : u.call(r, {
|
|
209
|
-
start:
|
|
210
|
-
end:
|
|
211
|
-
startStr:
|
|
212
|
-
endStr:
|
|
212
|
+
start: l.toDate(e.activeStart),
|
|
213
|
+
end: l.toDate(e.activeEnd),
|
|
214
|
+
startStr: l.toISOString(e.activeStart),
|
|
215
|
+
endStr: l.toISOString(e.activeEnd),
|
|
213
216
|
view: V(n, e)
|
|
214
217
|
});
|
|
215
218
|
}
|
|
@@ -220,28 +223,28 @@ const ie = Y(
|
|
|
220
223
|
"eventsSet",
|
|
221
224
|
(e) => {
|
|
222
225
|
var n, r;
|
|
223
|
-
return (r = (n = o.current).eventsSet) == null ? void 0 : r.call(n, e.map((u) =>
|
|
226
|
+
return (r = (n = o.current).eventsSet) == null ? void 0 : r.call(n, e.map((u) => y(u)));
|
|
224
227
|
}
|
|
225
228
|
),
|
|
226
229
|
s.on(
|
|
227
230
|
"eventDrop",
|
|
228
231
|
({ event: e }) => {
|
|
229
232
|
var n, r;
|
|
230
|
-
return (r = (n = o.current).eventDrop) == null ? void 0 : r.call(n, { event:
|
|
233
|
+
return (r = (n = o.current).eventDrop) == null ? void 0 : r.call(n, { event: y(e), view: m() });
|
|
231
234
|
}
|
|
232
235
|
),
|
|
233
236
|
s.on(
|
|
234
237
|
"eventResize",
|
|
235
238
|
({ event: e }) => {
|
|
236
239
|
var n, r;
|
|
237
|
-
return (r = (n = o.current).eventResize) == null ? void 0 : r.call(n, { event:
|
|
240
|
+
return (r = (n = o.current).eventResize) == null ? void 0 : r.call(n, { event: y(e), view: m() });
|
|
238
241
|
}
|
|
239
242
|
),
|
|
240
243
|
s.on(
|
|
241
244
|
"eventChange",
|
|
242
245
|
({ event: e }) => {
|
|
243
246
|
var n, r;
|
|
244
|
-
return (r = (n = o.current).eventChange) == null ? void 0 : r.call(n, { event:
|
|
247
|
+
return (r = (n = o.current).eventChange) == null ? void 0 : r.call(n, { event: y(e), view: m() });
|
|
245
248
|
}
|
|
246
249
|
),
|
|
247
250
|
s.on(
|
|
@@ -249,10 +252,10 @@ const ie = Y(
|
|
|
249
252
|
({ date: e, allEvents: n, hiddenEvents: r }) => {
|
|
250
253
|
var u, N;
|
|
251
254
|
return (N = (u = o.current).moreLinkClick) == null ? void 0 : N.call(u, {
|
|
252
|
-
date:
|
|
253
|
-
dateStr:
|
|
254
|
-
allEvents: n.map((O) =>
|
|
255
|
-
hiddenEvents: r.map((O) =>
|
|
255
|
+
date: l.toDate(e),
|
|
256
|
+
dateStr: l.toISOString(e),
|
|
257
|
+
allEvents: n.map((O) => y(O)),
|
|
258
|
+
hiddenEvents: r.map((O) => y(O)),
|
|
256
259
|
view: m()
|
|
257
260
|
});
|
|
258
261
|
}
|
|
@@ -261,7 +264,7 @@ const ie = Y(
|
|
|
261
264
|
"navLinkDay",
|
|
262
265
|
({ date: e }) => {
|
|
263
266
|
var n, r;
|
|
264
|
-
return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date:
|
|
267
|
+
return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date: l.toDate(e), dateStr: l.toISOString(e) });
|
|
265
268
|
}
|
|
266
269
|
),
|
|
267
270
|
s.on("loading", ({ isLoading: e }) => {
|
|
@@ -269,42 +272,42 @@ const ie = Y(
|
|
|
269
272
|
return (r = (n = o.current).loading) == null ? void 0 : r.call(n, e);
|
|
270
273
|
})
|
|
271
274
|
];
|
|
272
|
-
return (
|
|
275
|
+
return (T = (P = o.current).onReady) == null || T.call(P, s), () => {
|
|
273
276
|
E.current = !1;
|
|
274
277
|
for (const e of j) e();
|
|
275
|
-
|
|
278
|
+
S.destroy(), f.current = null, D.current.clear();
|
|
276
279
|
};
|
|
277
280
|
}, [H]), J(d, () => ({ getApi: () => {
|
|
278
|
-
var
|
|
279
|
-
return ((
|
|
281
|
+
var i;
|
|
282
|
+
return ((i = f.current) == null ? void 0 : i.api) ?? null;
|
|
280
283
|
} }), []);
|
|
281
|
-
const M = z.map((
|
|
284
|
+
const M = z.map((i) => a[i]);
|
|
282
285
|
R(() => {
|
|
283
|
-
var
|
|
284
|
-
const
|
|
285
|
-
if (!
|
|
286
|
+
var S;
|
|
287
|
+
const i = (S = f.current) == null ? void 0 : S.api;
|
|
288
|
+
if (!i) return;
|
|
286
289
|
const c = {};
|
|
287
290
|
let C = !1;
|
|
288
291
|
z.forEach((s, m) => {
|
|
289
|
-
$(
|
|
290
|
-
}), C &&
|
|
292
|
+
$(i, s) !== M[m] && (c[s] = M[m], C = !0);
|
|
293
|
+
}), C && i.setOptions(c);
|
|
291
294
|
}, M);
|
|
292
295
|
const k = a.events, x = g(k);
|
|
293
296
|
R(() => {
|
|
294
297
|
var c;
|
|
295
|
-
const
|
|
296
|
-
if (!(!
|
|
298
|
+
const i = (c = f.current) == null ? void 0 : c.api;
|
|
299
|
+
if (!(!i || !k)) {
|
|
297
300
|
if (x.current === k) {
|
|
298
301
|
x.current = void 0;
|
|
299
302
|
return;
|
|
300
303
|
}
|
|
301
|
-
|
|
304
|
+
i.refetchEvents(k);
|
|
302
305
|
}
|
|
303
306
|
}, [k]);
|
|
304
307
|
const I = [];
|
|
305
|
-
for (const [
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
+
for (const [i, { el: c, payload: C }] of D.current) {
|
|
309
|
+
const S = p(a, C);
|
|
310
|
+
S != null && I.push(Q(S, c, i));
|
|
308
311
|
}
|
|
309
312
|
return /* @__PURE__ */ B(G, { children: [
|
|
310
313
|
/* @__PURE__ */ W("div", { ref: v, className: a.className, style: a.style }),
|
|
@@ -313,14 +316,14 @@ const ie = Y(
|
|
|
313
316
|
}
|
|
314
317
|
);
|
|
315
318
|
function p(t, a) {
|
|
316
|
-
var d, v,
|
|
319
|
+
var d, v, f, o, D;
|
|
317
320
|
switch (a.slot) {
|
|
318
321
|
case "eventContent":
|
|
319
322
|
return (d = t.eventContent) == null ? void 0 : d.call(t, _(a.arg));
|
|
320
323
|
case "dayCellContent":
|
|
321
324
|
return (v = t.dayCellContent) == null ? void 0 : v.call(t, a.arg);
|
|
322
325
|
case "dayHeaderContent":
|
|
323
|
-
return (
|
|
326
|
+
return (f = t.dayHeaderContent) == null ? void 0 : f.call(t, a.arg);
|
|
324
327
|
case "slotLabelContent":
|
|
325
328
|
return (o = t.slotLabelContent) == null ? void 0 : o.call(t, a.arg);
|
|
326
329
|
case "moreLinkContent": {
|
|
@@ -328,8 +331,8 @@ function p(t, a) {
|
|
|
328
331
|
return (D = t.moreLinkContent) == null ? void 0 : D.call(t, {
|
|
329
332
|
date: h.date,
|
|
330
333
|
moreCount: h.moreCount,
|
|
331
|
-
allEvents: h.allEvents.map(
|
|
332
|
-
hiddenEvents: h.hiddenEvents.map(
|
|
334
|
+
allEvents: h.allEvents.map(y),
|
|
335
|
+
hiddenEvents: h.hiddenEvents.map(y),
|
|
333
336
|
view: h.view
|
|
334
337
|
});
|
|
335
338
|
}
|
|
@@ -339,7 +342,7 @@ function p(t, a) {
|
|
|
339
342
|
}
|
|
340
343
|
function _(t) {
|
|
341
344
|
return {
|
|
342
|
-
event:
|
|
345
|
+
event: y(t.event),
|
|
343
346
|
isAllDay: t.isAllDay,
|
|
344
347
|
timeText: t.timeText,
|
|
345
348
|
view: t.view
|
|
@@ -374,17 +377,17 @@ function te(t) {
|
|
|
374
377
|
return a;
|
|
375
378
|
}
|
|
376
379
|
export {
|
|
377
|
-
|
|
378
|
-
|
|
380
|
+
le as ReserviCalendar,
|
|
381
|
+
y as adaptEvent,
|
|
379
382
|
V as adaptView,
|
|
380
383
|
ce as dayGridPlugin,
|
|
381
384
|
de as definePlugin,
|
|
382
385
|
ve as defineTheme,
|
|
383
386
|
Ce as dl,
|
|
384
387
|
me as listPlugin,
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
+
ye as multiMonthPlugin,
|
|
389
|
+
Se as resourcePlugin,
|
|
390
|
+
fe as timeGridPlugin,
|
|
388
391
|
De as timelinePlugin
|
|
389
392
|
};
|
|
390
393
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/adapt.ts","../src/ReserviCalendar.tsx"],"sourcesContent":["/**\n * Adaptación de los tipos del dominio a la forma que espera un consumidor de\n * FullCalendar: fechas nativas (`Date`), variantes `*Str` en ISO y `view.type`.\n *\n * El núcleo trabaja con `RsvDate` (tipo opaco); esta capa es la frontera donde\n * se convierte a `Date`, para que el código del anfitrión no tenga que conocer\n * el DatePort.\n */\nimport { dl, type EventDef, type DateRange, type RsvDate, type ViewSpec } from \"@reservi/core\";\n\n/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */\nexport interface RsvEventApi {\n readonly id: string;\n readonly groupId: string;\n readonly title: string;\n readonly start: Date | null;\n readonly end: Date | null;\n readonly startStr: string;\n readonly endStr: string;\n readonly allDay: boolean;\n readonly url: string;\n readonly display: string;\n readonly backgroundColor: string;\n readonly borderColor: string;\n readonly textColor: string;\n readonly classNames: string[];\n readonly extendedProps: Record<string, unknown>;\n /** Definición original del núcleo, por si se necesita la API completa. */\n readonly def: EventDef;\n}\n\n/** Vista activa (equivalente reducido de `ViewApi`). */\nexport interface RsvViewApi {\n readonly type: string;\n readonly title?: string;\n readonly currentStart?: Date;\n readonly currentEnd?: Date;\n readonly activeStart?: Date;\n readonly activeEnd?: Date;\n}\n\nconst toDate = (d: RsvDate | null | undefined): Date | null => (d ? dl.toDate(d) : null);\nconst toStr = (d: RsvDate | null | undefined): string => (d ? dl.toISOString(d) : \"\");\n\n/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */\nexport function adaptEvent(def: EventDef): RsvEventApi {\n return {\n id: def.id,\n groupId: def.groupId,\n title: def.title,\n start: toDate(def.start),\n end: toDate(def.end),\n startStr: toStr(def.start),\n endStr: toStr(def.end),\n allDay: def.allDay,\n url: def.url,\n display: def.display,\n backgroundColor: def.backgroundColor,\n borderColor: def.borderColor,\n textColor: def.textColor,\n classNames: def.classNames,\n extendedProps: def.extendedProps,\n def,\n };\n}\n\n/** Vista + rango visible, con fechas nativas. */\nexport function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi {\n const base: RsvViewApi = { type: spec.type };\n if (!range) return title == null ? base : { ...base, title };\n return {\n ...base,\n ...(title == null ? {} : { title }),\n currentStart: dl.toDate(range.currentStart),\n currentEnd: dl.toDate(range.currentEnd),\n activeStart: dl.toDate(range.activeStart),\n activeEnd: dl.toDate(range.activeEnd),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n hostSlot,\n mount,\n type DayCellContentArg,\n type DayHeaderContentArg,\n type EventContentArg,\n type HostBridge,\n type MoreLinkContentArg,\n type ReserviCalendarHandle,\n type ReserviCalendarOptions,\n type ReserviSlots,\n type SlotLabelContentArg,\n} from \"@reservi/preact\";\nimport { dl, type CalendarApi, type CalendarOptions, type EventDef } from \"@reservi/core\";\nimport { adaptEvent, adaptView, type RsvEventApi, type RsvViewApi } from \"./adapt.js\";\n\n// ─────────────────────────── Argumentos de callback ───────────────────────────\n\nexport interface EventClickArg {\n event: RsvEventApi;\n el: HTMLElement | null;\n view: RsvViewApi;\n}\n\nexport interface DateClickArg {\n date: Date;\n dateStr: string;\n allDay: boolean;\n view: RsvViewApi;\n}\n\nexport interface SelectArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface DatesSetArg {\n start: Date;\n end: Date;\n startStr: string;\n endStr: string;\n view: RsvViewApi;\n}\n\nexport interface EventChangeArg {\n event: RsvEventApi;\n view: RsvViewApi;\n}\n\nexport interface MoreLinkClickArg {\n date: Date;\n dateStr: string;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n// ─────────────────────────── Argumentos de render ───────────────────────────\n\nexport interface ReactEventContentArg {\n event: RsvEventApi;\n isAllDay: boolean;\n timeText: string;\n view: RsvViewApi;\n}\n\nexport interface ReactDayCellContentArg {\n date: Date;\n dayNumber: number;\n isToday: boolean;\n isOther: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactDayHeaderContentArg {\n date: Date;\n text: string;\n dayOfWeek: number;\n dayNumber: number;\n isToday: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactSlotLabelContentArg {\n text: string;\n minutes: number;\n isMajor: boolean;\n view: RsvViewApi;\n}\n\nexport interface ReactMoreLinkContentArg {\n date: Date;\n moreCount: number;\n allEvents: RsvEventApi[];\n hiddenEvents: RsvEventApi[];\n view: RsvViewApi;\n}\n\n/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */\nexport interface ReserviCalendarRef {\n getApi(): CalendarApi | null;\n}\n\n/** Opciones del calendario menos lo que en React se expresa como props. */\ntype BaseOptions = Omit<ReserviCalendarOptions, \"slots\" | \"hooks\" | \"hostBridge\">;\n\nexport interface ReserviCalendarProps extends BaseOptions {\n // ── Callbacks (props, igual que FullCalendar) ──\n eventClick?: (arg: EventClickArg) => void;\n dateClick?: (arg: DateClickArg) => void;\n select?: (arg: SelectArg) => void;\n unselect?: () => void;\n datesSet?: (arg: DatesSetArg) => void;\n eventsSet?: (events: RsvEventApi[]) => void;\n eventDrop?: (arg: EventChangeArg) => void;\n eventResize?: (arg: EventChangeArg) => void;\n eventChange?: (arg: EventChangeArg) => void;\n moreLinkClick?: (arg: MoreLinkClickArg) => void;\n navLinkDay?: (arg: { date: Date; dateStr: string }) => void;\n loading?: (isLoading: boolean) => void;\n\n // ── Render props: devuelven JSX de React ──\n eventContent?: (arg: ReactEventContentArg) => ReactNode;\n dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;\n dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;\n slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;\n moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;\n\n // ── Hooks sobre el DOM ya montado (una vez por elemento) ──\n eventDidMount?: (arg: ReactEventContentArg & { el: HTMLElement }) => void;\n dayCellDidMount?: (arg: ReactDayCellContentArg & { el: HTMLElement }) => void;\n dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & { el: HTMLElement }) => void;\n slotLabelDidMount?: (arg: ReactSlotLabelContentArg & { el: HTMLElement }) => void;\n\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n /** Estilos en línea del contenedor host. */\n style?: CSSProperties;\n}\n\n/** Nombres de los render props delegados al árbol de React. */\nconst HOST_SLOTS = [\n \"eventContent\",\n \"dayCellContent\",\n \"dayHeaderContent\",\n \"slotLabelContent\",\n \"moreLinkContent\",\n] as const;\n\ntype HostSlotName = (typeof HOST_SLOTS)[number];\n\n/**\n * Lo que la capa Preact guarda en cada hueco: QUÉ slot pintar y con qué\n * argumento. Se guarda el argumento (no el nodo ya construido) para que un\n * re-render de React vuelva a ejecutar el render prop con el estado más\n * reciente, igual que si el contenido viviera en el árbol de React.\n */\ninterface HostPayload {\n slot: HostSlotName;\n arg: unknown;\n}\n\n/**\n * Opciones que pueden cambiar en caliente vía `setOptions`. El resto\n * (`initialView`, `initialDate`, `plugins`, `resources`…) solo se lee al\n * montar, igual que en FullCalendar.\n */\nconst LIVE_OPTIONS = [\n \"locale\",\n \"direction\",\n \"timeZone\",\n \"firstDay\",\n \"weekends\",\n \"hiddenDays\",\n \"fixedWeekCount\",\n \"showNonCurrentDates\",\n \"weekNumbers\",\n \"weekNumberCalculation\",\n \"navLinks\",\n \"dayHeaders\",\n \"dayNumberAlign\",\n \"moreLinkPopover\",\n \"dayMaxEvents\",\n \"dayMaxEventRows\",\n \"slotMinTime\",\n \"slotMaxTime\",\n \"slotDuration\",\n \"slotLabelInterval\",\n \"allDaySlot\",\n \"nowIndicator\",\n \"scrollTime\",\n \"editable\",\n \"eventDraggable\",\n \"selectable\",\n \"selectMirror\",\n \"snapDuration\",\n \"businessHours\",\n \"eventOverlap\",\n \"eventConstraint\",\n \"eventAllow\",\n \"theme\",\n \"themeTokens\",\n \"headerToolbar\",\n \"hourHeight\",\n \"height\",\n \"eventTimeFormat\",\n \"slotLabelFormat\",\n \"dayHeaderFormat\",\n \"listDayFormat\",\n \"listDaySideFormat\",\n \"titleFormat\",\n \"viewOverrides\",\n \"keyboardShortcuts\",\n \"resourceAreaWidth\",\n \"resourceOrder\",\n \"lazyFetching\",\n // Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la\n // clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las\n // clases de la vista anterior.\n \"classNames\",\n \"views\",\n \"addButtonText\",\n \"responsiveViews\",\n] as const satisfies readonly (keyof BaseOptions)[];\n\n/** Lee una opción sin acotarla a las claves del núcleo. */\nfunction readOption(api: CalendarApi, key: keyof BaseOptions): unknown {\n return api.getOption(key as keyof CalendarOptions) as unknown;\n}\n\n/**\n * Componente React de Reservi Calendar. API deliberadamente compatible con\n * `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,\n * `ref.getApi()` y render props que devuelven JSX.\n *\n * Internamente monta la capa agnóstica (Preact) y pinta los render props en el\n * árbol de React mediante portales, así que el contenido de los eventos\n * conserva el contexto de React (stores, i18n, theme…).\n */\nexport const ReserviCalendar = forwardRef<ReserviCalendarRef, ReserviCalendarProps>(\n function ReserviCalendar(props, ref) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Los callbacks y render props se leen siempre desde aquí, de modo que\n // cambiar una prop no obligue a re-montar el calendario.\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // ── Puente de render: huecos del DOM ↔ portales de React ──\n const hostsRef = useRef(new Map<string, { el: HTMLElement; payload: HostPayload }>());\n const [, setHostVersion] = useState(0);\n const flushPendingRef = useRef(false);\n const aliveRef = useRef(true);\n\n const scheduleFlush = useCallback(() => {\n if (flushPendingRef.current) return;\n flushPendingRef.current = true;\n // Microtask: agrupa todos los huecos de un mismo render de Preact en un\n // único render de React, y sale de la fase de render actual.\n queueMicrotask(() => {\n flushPendingRef.current = false;\n if (aliveRef.current) setHostVersion((v) => v + 1);\n });\n }, []);\n\n const bridge = useMemo<HostBridge>(\n () => ({\n mount(id, el, node) {\n hostsRef.current.set(id, { el, payload: node as HostPayload });\n scheduleFlush();\n },\n update(id, node) {\n const entry = hostsRef.current.get(id);\n if (!entry) return;\n entry.payload = node as HostPayload;\n scheduleFlush();\n },\n unmount(id) {\n if (hostsRef.current.delete(id)) scheduleFlush();\n },\n }),\n [scheduleFlush],\n );\n\n // ── Montaje único ──\n useEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n aliveRef.current = true;\n\n // Cada slot decide en tiempo de render si el anfitrión aporta contenido.\n // Devolver `undefined` significa \"usa el contenido por defecto\".\n const slots: ReserviSlots = {\n eventContent: (arg) =>\n propsRef.current.eventContent ? hostSlot({ slot: \"eventContent\", arg }) : undefined,\n dayCellContent: (arg) =>\n propsRef.current.dayCellContent ? hostSlot({ slot: \"dayCellContent\", arg }) : undefined,\n dayHeaderContent: (arg) =>\n propsRef.current.dayHeaderContent\n ? hostSlot({ slot: \"dayHeaderContent\", arg })\n : undefined,\n slotLabelContent: (arg) =>\n propsRef.current.slotLabelContent\n ? hostSlot({ slot: \"slotLabelContent\", arg })\n : undefined,\n moreLinkContent: (arg) =>\n propsRef.current.moreLinkContent ? hostSlot({ slot: \"moreLinkContent\", arg }) : undefined,\n };\n\n const options: ReserviCalendarOptions = {\n ...splitOptions(propsRef.current),\n slots,\n hostBridge: bridge,\n hooks: {\n eventDidMount: (arg) => {\n const cb = propsRef.current.eventDidMount;\n if (cb) cb({ ...adaptEventContentArg(arg), el: arg.el });\n },\n dayCellDidMount: (arg) => propsRef.current.dayCellDidMount?.(arg),\n dayHeaderDidMount: (arg) => propsRef.current.dayHeaderDidMount?.(arg),\n slotLabelDidMount: (arg) => propsRef.current.slotLabelDidMount?.(arg),\n },\n };\n\n const handle = mount(el, options);\n handleRef.current = handle;\n const api = handle.api;\n\n /** Vista + rango actuales, en fechas nativas. */\n const view = (): RsvViewApi => {\n const vm = api.getViewModel();\n return adaptView(vm.spec, vm.range, vm.title);\n };\n\n // ── Eventos del núcleo → callbacks del anfitrión ──\n const offs = [\n api.on(\"eventClick\", ({ event, el: target }) =>\n propsRef.current.eventClick?.({\n event: adaptEvent(event),\n el: target ?? null,\n view: view(),\n }),\n ),\n api.on(\"dateClick\", ({ date, allDay }) =>\n propsRef.current.dateClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allDay: allDay ?? false,\n view: view(),\n }),\n ),\n api.on(\"select\", ({ start, end }) =>\n propsRef.current.select?.({\n start: dl.toDate(start),\n end: dl.toDate(end),\n startStr: dl.toISOString(start),\n endStr: dl.toISOString(end),\n view: view(),\n }),\n ),\n api.on(\"unselect\", () => propsRef.current.unselect?.()),\n api.on(\"datesSet\", ({ range, view: spec }) =>\n propsRef.current.datesSet?.({\n start: dl.toDate(range.activeStart),\n end: dl.toDate(range.activeEnd),\n startStr: dl.toISOString(range.activeStart),\n endStr: dl.toISOString(range.activeEnd),\n view: adaptView(spec, range),\n }),\n ),\n // Sin `view()`: `eventsSet` se emite desde un effect de signals y leer\n // el ViewModel ahí lo añadiría a sus dependencias.\n api.on(\"eventsSet\", (events) =>\n propsRef.current.eventsSet?.(events.map((e) => adaptEvent(e))),\n ),\n api.on(\"eventDrop\", ({ event }) =>\n propsRef.current.eventDrop?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventResize\", ({ event }) =>\n propsRef.current.eventResize?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"eventChange\", ({ event }) =>\n propsRef.current.eventChange?.({ event: adaptEvent(event), view: view() }),\n ),\n api.on(\"moreLinkClick\", ({ date, allEvents, hiddenEvents }) =>\n propsRef.current.moreLinkClick?.({\n date: dl.toDate(date),\n dateStr: dl.toISOString(date),\n allEvents: allEvents.map((e) => adaptEvent(e)),\n hiddenEvents: hiddenEvents.map((e) => adaptEvent(e)),\n view: view(),\n }),\n ),\n api.on(\"navLinkDay\", ({ date }) =>\n propsRef.current.navLinkDay?.({ date: dl.toDate(date), dateStr: dl.toISOString(date) }),\n ),\n api.on(\"loading\", ({ isLoading }) => propsRef.current.loading?.(isLoading)),\n ];\n\n propsRef.current.onReady?.(api);\n\n return () => {\n aliveRef.current = false;\n for (const off of offs) off();\n handle.destroy();\n handleRef.current = null;\n hostsRef.current.clear();\n };\n // Montaje único a propósito: el resto se sincroniza vía `setOptions`.\n }, [bridge]);\n\n useImperativeHandle(ref, () => ({ getApi: () => handleRef.current?.api ?? null }), []);\n\n // ── Sincronización de opciones en caliente ──\n // El array tiene longitud constante (LIVE_OPTIONS), así que sirve de deps.\n const liveValues = LIVE_OPTIONS.map((key) => props[key]);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api) return;\n const patch: Record<string, unknown> = {};\n let changed = false;\n LIVE_OPTIONS.forEach((key, i) => {\n // La comparación fina la hace `setOptions` (por valor); aquí basta con\n // descartar lo que sigue siendo la misma referencia.\n if (readOption(api, key) === liveValues[i]) return;\n patch[key] = liveValues[i];\n changed = true;\n });\n if (changed) api.setOptions(patch as Partial<CalendarOptions>);\n // `liveValues` es un array construido en cada render con el valor vivo de\n // cada opcion sincronizable: es la lista de dependencias, no una omision.\n }, liveValues);\n\n // ── Sincronización de eventos ──\n const events = props.events;\n const mountedEventsRef = useRef(events);\n useEffect(() => {\n const api = handleRef.current?.api;\n if (!api || !events) return;\n // En el primer efecto los eventos ya los consumió el constructor.\n if (mountedEventsRef.current === events) {\n mountedEventsRef.current = undefined;\n return;\n }\n api.refetchEvents(events);\n }, [events]);\n\n // ── Portales: el contenido de los render props vive en el árbol de React ──\n const portals: ReactNode[] = [];\n for (const [id, { el, payload }] of hostsRef.current) {\n const node = renderHostPayload(props, payload);\n if (node != null) portals.push(createPortal(node, el, id));\n }\n\n return (\n <>\n <div ref={hostRef} className={props.className} style={props.style} />\n {portals}\n </>\n );\n },\n);\n\n/** Ejecuta el render prop correspondiente a un hueco. */\nfunction renderHostPayload(props: ReserviCalendarProps, payload: HostPayload): ReactNode {\n switch (payload.slot) {\n case \"eventContent\":\n return props.eventContent?.(adaptEventContentArg(payload.arg as EventContentArg));\n case \"dayCellContent\":\n return props.dayCellContent?.(payload.arg as DayCellContentArg);\n case \"dayHeaderContent\":\n return props.dayHeaderContent?.(payload.arg as DayHeaderContentArg);\n case \"slotLabelContent\":\n return props.slotLabelContent?.(payload.arg as SlotLabelContentArg);\n case \"moreLinkContent\": {\n const arg = payload.arg as MoreLinkContentArg;\n return props.moreLinkContent?.({\n date: arg.date,\n moreCount: arg.moreCount,\n allEvents: arg.allEvents.map(adaptEvent),\n hiddenEvents: arg.hiddenEvents.map(adaptEvent),\n view: arg.view,\n });\n }\n default:\n return null;\n }\n}\n\n/** `EventDef` → `RsvEventApi` dentro del argumento de un slot de evento. */\nfunction adaptEventContentArg(arg: {\n event: EventDef;\n isAllDay: boolean;\n timeText: string;\n view: { type: string };\n}): ReactEventContentArg {\n return {\n event: adaptEvent(arg.event),\n isAllDay: arg.isAllDay,\n timeText: arg.timeText,\n view: arg.view,\n };\n}\n\n/** Claves que son props de React y no opciones del calendario. */\nconst REACT_ONLY_KEYS = new Set<string>([\n ...HOST_SLOTS,\n \"eventClick\",\n \"dateClick\",\n \"select\",\n \"unselect\",\n \"datesSet\",\n \"eventsSet\",\n \"eventDrop\",\n \"eventResize\",\n \"eventChange\",\n \"moreLinkClick\",\n \"navLinkDay\",\n \"loading\",\n \"eventDidMount\",\n \"dayCellDidMount\",\n \"dayHeaderDidMount\",\n \"slotLabelDidMount\",\n \"onReady\",\n \"className\",\n \"style\",\n]);\n\n/** Separa las opciones del calendario de las props propias de React. */\nfunction splitOptions(props: ReserviCalendarProps): BaseOptions {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!REACT_ONLY_KEYS.has(key)) out[key] = value;\n }\n return out as BaseOptions;\n}\n"],"names":["toDate","d","dl","toStr","adaptEvent","def","adaptView","spec","range","title","base","HOST_SLOTS","LIVE_OPTIONS","readOption","api","key","ReserviCalendar","forwardRef","props","ref","hostRef","useRef","handleRef","propsRef","hostsRef","setHostVersion","useState","flushPendingRef","aliveRef","scheduleFlush","useCallback","v","bridge","useMemo","id","el","node","entry","useEffect","slots","arg","hostSlot","options","splitOptions","cb","adaptEventContentArg","_b","_a","handle","mount","view","vm","offs","event","target","date","allDay","start","end","events","e","allEvents","hiddenEvents","isLoading","off","useImperativeHandle","liveValues","patch","changed","i","mountedEventsRef","portals","payload","renderHostPayload","createPortal","jsxs","Fragment","jsx","_c","_d","_e","REACT_ONLY_KEYS","out","value"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reservi/react",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.4",
|
|
4
4
|
"description": "Wrapper de React para Reservi Calendar.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@reservi/
|
|
40
|
-
"@reservi/
|
|
39
|
+
"@reservi/preact": "2.0.0-beta.4",
|
|
40
|
+
"@reservi/core": "2.0.0-beta.4"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"react": "^18.0.0 || ^19.0.0",
|