@reservi/react 1.3.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +181 -5
- package/dist/index.js +385 -24
- 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
|
|
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,a,v){const C={type:t.type};return a?{...C,...v==null?{}:{title:v},currentStart:o.dl.toDate(a.currentStart),currentEnd:o.dl.toDate(a.currentEnd),activeStart:o.dl.toDate(a.activeStart),activeEnd:o.dl.toDate(a.activeEnd)}:v==null?C:{...C,title:v}}const _=["eventContent","dayCellContent","dayHeaderContent","slotLabelContent","moreLinkContent"],V=["locale","direction","timeZone","firstDay","weekends","hiddenDays","fixedWeekCount","showNonCurrentDates","weekNumbers","weekNumberCalculation","navLinks","dayMaxEvents","dayMaxEventRows","slotMinTime","slotMaxTime","slotDuration","slotLabelInterval","allDaySlot","nowIndicator","scrollTime","editable","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,a){return t.getOption(a)}const W=c.forwardRef(function(a,v){const C=c.useRef(null),g=c.useRef(null),l=c.useRef(a);l.current=a;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,m){b.current.set(i,{el:d,payload:m}),w()},update(i,d){const m=b.current.get(i);m&&(m.payload=d,w())},unmount(i){b.current.delete(i)&&w()}}),[w]);c.useEffect(()=>{var j,x;const i=C.current;if(!i)return;P.current=!0;const d={eventContent:e=>l.current.eventContent?h.hostSlot({slot:"eventContent",arg:e}):void 0,dayCellContent:e=>l.current.dayCellContent?h.hostSlot({slot:"dayCellContent",arg:e}):void 0,dayHeaderContent:e=>l.current.dayHeaderContent?h.hostSlot({slot:"dayHeaderContent",arg:e}):void 0,slotLabelContent:e=>l.current.slotLabelContent?h.hostSlot({slot:"slotLabelContent",arg:e}):void 0,moreLinkContent:e=>l.current.moreLinkContent?h.hostSlot({slot:"moreLinkContent",arg:e}):void 0},m={...Z(l.current),slots:d,hostBridge:H,hooks:{eventDidMount:e=>{const n=l.current.eventDidMount;n&&n({...q(e),el:e.el})},dayCellDidMount:e=>{var n,r;return(r=(n=l.current).dayCellDidMount)==null?void 0:r.call(n,e)},dayHeaderDidMount:e=>{var n,r;return(r=(n=l.current).dayHeaderDidMount)==null?void 0:r.call(n,e)},slotLabelDidMount:e=>{var n,r;return(r=(n=l.current).slotLabelDidMount)==null?void 0:r.call(n,e)}}},S=h.mount(i,m);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=l.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=l.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=l.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=l.current).unselect)==null?void 0:n.call(e)}),u.on("datesSet",({range:e,view:n})=>{var r,s;return(s=(r=l.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=l.current).eventsSet)==null?void 0:r.call(n,e.map(s=>f(s)))}),u.on("eventDrop",({event:e})=>{var n,r;return(r=(n=l.current).eventDrop)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventResize",({event:e})=>{var n,r;return(r=(n=l.current).eventResize)==null?void 0:r.call(n,{event:f(e),view:y()})}),u.on("eventChange",({event:e})=>{var n,r;return(r=(n=l.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=l.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=l.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=l.current).loading)==null?void 0:r.call(n,e)})];return(x=(j=l.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=>a[i]);c.useEffect(()=>{var S;const i=(S=g.current)==null?void 0:S.api;if(!i)return;const d={};let m=!1;V.forEach((u,y)=>{B(i,u)!==L[y]&&(d[u]=L[y],m=!0)}),m&&i.setOptions(d)},L);const k=a.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:m}]of b.current){const S=Y(a,m);S!=null&&I.push(G.createPortal(S,d,i))}return R.jsxs(R.Fragment,{children:[R.jsx("div",{ref:C,className:a.className,style:a.style}),I]})});function Y(t,a){var v,C,g,l,b;switch(a.slot){case"eventContent":return(v=t.eventContent)==null?void 0:v.call(t,q(a.arg));case"dayCellContent":return(C=t.dayCellContent)==null?void 0:C.call(t,a.arg);case"dayHeaderContent":return(g=t.dayHeaderContent)==null?void 0:g.call(t,a.arg);case"slotLabelContent":return(l=t.slotLabelContent)==null?void 0:l.call(t,a.arg);case"moreLinkContent":{const D=a.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 a={};for(const[v,C]of Object.entries(t))K.has(v)||(a[v]=C);return a}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/ReserviCalendar.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { mount, type ReserviCalendarHandle, type ReserviCalendarOptions } from \"@reservi/preact\";\nimport type { CalendarApi } from \"@reservi/core\";\n\nexport interface ReserviCalendarProps extends ReserviCalendarOptions {\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n}\n\n/**\n * Componente React. Monta el calendario agnóstico (Preact) en un div y mantiene\n * sincronizados los eventos; el resto se controla vía la API (onReady).\n */\nexport function ReserviCalendar({ onReady, className, ...options }: ReserviCalendarProps) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Montaje único (la identidad de la instancia se mantiene entre renders).\n useEffect(() => {\n if (!hostRef.current) return;\n const handle = mount(hostRef.current, options);\n handleRef.current = handle;\n onReady?.(handle.api);\n return () => {\n handle.destroy();\n handleRef.current = null;\n };\n }, []);\n\n // Sincroniza eventos cuando cambia la prop.\n useEffect(() => {\n if (handleRef.current && options.events) {\n handleRef.current.api.refetchEvents(options.events);\n }\n }, [options.events]);\n\n return <div ref={hostRef} className={className} />;\n}\n"],"names":["ReserviCalendar","onReady","className","options","hostRef","useRef","handleRef","useEffect","handle","mount","jsx"],"mappings":"gMAeO,SAASA,EAAgB,CAAE,QAAAC,EAAS,UAAAC,EAAW,GAAGC,GAAiC,CACxF,MAAMC,EAAUC,EAAAA,OAAuB,IAAI,EACrCC,EAAYD,EAAAA,OAAqC,IAAI,EAG3DE,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACH,EAAQ,QAAS,OACtB,MAAMI,EAASC,EAAAA,MAAML,EAAQ,QAASD,CAAO,EAC7C,OAAAG,EAAU,QAAUE,EACpBP,GAAA,MAAAA,EAAUO,EAAO,KACV,IAAM,CACXA,EAAO,QAAA,EACPF,EAAU,QAAU,IACtB,CACF,EAAG,CAAA,CAAE,EAGLC,EAAAA,UAAU,IAAM,CACVD,EAAU,SAAWH,EAAQ,QAC/BG,EAAU,QAAQ,IAAI,cAAcH,EAAQ,MAAM,CAEtD,EAAG,CAACA,EAAQ,MAAM,CAAC,EAEZO,EAAAA,IAAC,MAAA,CAAI,IAAKN,EAAS,UAAAF,CAAA,CAAsB,CAClD"}
|
|
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 \"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.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { CalendarApi } from '@reservi/core';
|
|
2
2
|
import { CalendarOptions } from '@reservi/core';
|
|
3
|
+
import { CalendarViewAdapter } from '@reservi/core';
|
|
4
|
+
import { CSSProperties } from 'react';
|
|
5
|
+
import { DateRange } from '@reservi/core';
|
|
3
6
|
import { dayGridPlugin } from '@reservi/core';
|
|
4
7
|
import { definePlugin } from '@reservi/core';
|
|
5
8
|
import { defineTheme } from '@reservi/core';
|
|
9
|
+
import { dl } from '@reservi/core';
|
|
6
10
|
import { EventDef } from '@reservi/core';
|
|
7
11
|
import { EventInput } from '@reservi/core';
|
|
8
|
-
import {
|
|
12
|
+
import { ForwardRefExoticComponent } from 'react';
|
|
9
13
|
import { listPlugin } from '@reservi/core';
|
|
10
14
|
import { multiMonthPlugin } from '@reservi/core';
|
|
15
|
+
import { ReactNode } from 'react';
|
|
16
|
+
import { RefAttributes } from 'react';
|
|
11
17
|
import { ReserviCalendarOptions } from '@reservi/preact';
|
|
12
18
|
import { ReserviClassNames } from '@reservi/preact';
|
|
13
19
|
import { ReserviSlots } from '@reservi/preact';
|
|
@@ -16,38 +22,169 @@ import { ResourceInput } from '@reservi/core';
|
|
|
16
22
|
import { resourcePlugin } from '@reservi/core';
|
|
17
23
|
import { timeGridPlugin } from '@reservi/core';
|
|
18
24
|
import { timelinePlugin } from '@reservi/core';
|
|
25
|
+
import { ViewSpec } from '@reservi/core';
|
|
26
|
+
|
|
27
|
+
/** Convierte un `EventDef` del núcleo en el evento que ve el anfitrión. */
|
|
28
|
+
export declare function adaptEvent(def: EventDef): RsvEventApi;
|
|
29
|
+
|
|
30
|
+
/** Vista + rango visible, con fechas nativas. */
|
|
31
|
+
export declare function adaptView(spec: ViewSpec, range?: DateRange, title?: string): RsvViewApi;
|
|
32
|
+
|
|
33
|
+
/** Opciones del calendario menos lo que en React se expresa como props. */
|
|
34
|
+
declare type BaseOptions = Omit<ReserviCalendarOptions, "slots" | "hooks" | "hostBridge">;
|
|
19
35
|
|
|
20
36
|
export { CalendarApi }
|
|
21
37
|
|
|
22
38
|
export { CalendarOptions }
|
|
23
39
|
|
|
40
|
+
export { CalendarViewAdapter }
|
|
41
|
+
|
|
42
|
+
export declare interface DateClickArg {
|
|
43
|
+
date: Date;
|
|
44
|
+
dateStr: string;
|
|
45
|
+
allDay: boolean;
|
|
46
|
+
view: RsvViewApi;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export declare interface DatesSetArg {
|
|
50
|
+
start: Date;
|
|
51
|
+
end: Date;
|
|
52
|
+
startStr: string;
|
|
53
|
+
endStr: string;
|
|
54
|
+
view: RsvViewApi;
|
|
55
|
+
}
|
|
56
|
+
|
|
24
57
|
export { dayGridPlugin }
|
|
25
58
|
|
|
26
59
|
export { definePlugin }
|
|
27
60
|
|
|
28
61
|
export { defineTheme }
|
|
29
62
|
|
|
63
|
+
export { dl }
|
|
64
|
+
|
|
65
|
+
export declare interface EventChangeArg {
|
|
66
|
+
event: RsvEventApi;
|
|
67
|
+
view: RsvViewApi;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export declare interface EventClickArg {
|
|
71
|
+
event: RsvEventApi;
|
|
72
|
+
el: HTMLElement | null;
|
|
73
|
+
view: RsvViewApi;
|
|
74
|
+
}
|
|
75
|
+
|
|
30
76
|
export { EventDef }
|
|
31
77
|
|
|
32
78
|
export { EventInput }
|
|
33
79
|
|
|
34
80
|
export { listPlugin }
|
|
35
81
|
|
|
82
|
+
export declare interface MoreLinkClickArg {
|
|
83
|
+
date: Date;
|
|
84
|
+
dateStr: string;
|
|
85
|
+
allEvents: RsvEventApi[];
|
|
86
|
+
hiddenEvents: RsvEventApi[];
|
|
87
|
+
view: RsvViewApi;
|
|
88
|
+
}
|
|
89
|
+
|
|
36
90
|
export { multiMonthPlugin }
|
|
37
91
|
|
|
92
|
+
export declare interface ReactDayCellContentArg {
|
|
93
|
+
date: Date;
|
|
94
|
+
dayNumber: number;
|
|
95
|
+
isToday: boolean;
|
|
96
|
+
isOther: boolean;
|
|
97
|
+
view: RsvViewApi;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export declare interface ReactDayHeaderContentArg {
|
|
101
|
+
date: Date;
|
|
102
|
+
text: string;
|
|
103
|
+
dayOfWeek: number;
|
|
104
|
+
dayNumber: number;
|
|
105
|
+
isToday: boolean;
|
|
106
|
+
view: RsvViewApi;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export declare interface ReactEventContentArg {
|
|
110
|
+
event: RsvEventApi;
|
|
111
|
+
isAllDay: boolean;
|
|
112
|
+
timeText: string;
|
|
113
|
+
view: RsvViewApi;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export declare interface ReactMoreLinkContentArg {
|
|
117
|
+
date: Date;
|
|
118
|
+
moreCount: number;
|
|
119
|
+
allEvents: RsvEventApi[];
|
|
120
|
+
hiddenEvents: RsvEventApi[];
|
|
121
|
+
view: RsvViewApi;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export declare interface ReactSlotLabelContentArg {
|
|
125
|
+
text: string;
|
|
126
|
+
minutes: number;
|
|
127
|
+
isMajor: boolean;
|
|
128
|
+
view: RsvViewApi;
|
|
129
|
+
}
|
|
130
|
+
|
|
38
131
|
/**
|
|
39
|
-
* Componente React
|
|
40
|
-
*
|
|
132
|
+
* Componente React de Reservi Calendar. API deliberadamente compatible con
|
|
133
|
+
* `@fullcalendar/react`: mismos nombres de opciones, callbacks como props,
|
|
134
|
+
* `ref.getApi()` y render props que devuelven JSX.
|
|
135
|
+
*
|
|
136
|
+
* Internamente monta la capa agnóstica (Preact) y pinta los render props en el
|
|
137
|
+
* árbol de React mediante portales, así que el contenido de los eventos
|
|
138
|
+
* conserva el contexto de React (stores, i18n, theme…).
|
|
41
139
|
*/
|
|
42
|
-
export declare
|
|
140
|
+
export declare const ReserviCalendar: ForwardRefExoticComponent<ReserviCalendarProps & RefAttributes<ReserviCalendarRef>>;
|
|
43
141
|
|
|
44
142
|
export { ReserviCalendarOptions }
|
|
45
143
|
|
|
46
|
-
export declare interface ReserviCalendarProps extends
|
|
144
|
+
export declare interface ReserviCalendarProps extends BaseOptions {
|
|
145
|
+
eventClick?: (arg: EventClickArg) => void;
|
|
146
|
+
dateClick?: (arg: DateClickArg) => void;
|
|
147
|
+
select?: (arg: SelectArg) => void;
|
|
148
|
+
unselect?: () => void;
|
|
149
|
+
datesSet?: (arg: DatesSetArg) => void;
|
|
150
|
+
eventsSet?: (events: RsvEventApi[]) => void;
|
|
151
|
+
eventDrop?: (arg: EventChangeArg) => void;
|
|
152
|
+
eventResize?: (arg: EventChangeArg) => void;
|
|
153
|
+
eventChange?: (arg: EventChangeArg) => void;
|
|
154
|
+
moreLinkClick?: (arg: MoreLinkClickArg) => void;
|
|
155
|
+
navLinkDay?: (arg: {
|
|
156
|
+
date: Date;
|
|
157
|
+
dateStr: string;
|
|
158
|
+
}) => void;
|
|
159
|
+
loading?: (isLoading: boolean) => void;
|
|
160
|
+
eventContent?: (arg: ReactEventContentArg) => ReactNode;
|
|
161
|
+
dayCellContent?: (arg: ReactDayCellContentArg) => ReactNode;
|
|
162
|
+
dayHeaderContent?: (arg: ReactDayHeaderContentArg) => ReactNode;
|
|
163
|
+
slotLabelContent?: (arg: ReactSlotLabelContentArg) => ReactNode;
|
|
164
|
+
moreLinkContent?: (arg: ReactMoreLinkContentArg) => ReactNode;
|
|
165
|
+
eventDidMount?: (arg: ReactEventContentArg & {
|
|
166
|
+
el: HTMLElement;
|
|
167
|
+
}) => void;
|
|
168
|
+
dayCellDidMount?: (arg: ReactDayCellContentArg & {
|
|
169
|
+
el: HTMLElement;
|
|
170
|
+
}) => void;
|
|
171
|
+
dayHeaderDidMount?: (arg: ReactDayHeaderContentArg & {
|
|
172
|
+
el: HTMLElement;
|
|
173
|
+
}) => void;
|
|
174
|
+
slotLabelDidMount?: (arg: ReactSlotLabelContentArg & {
|
|
175
|
+
el: HTMLElement;
|
|
176
|
+
}) => void;
|
|
47
177
|
/** Se invoca con la API del calendario tras montar. */
|
|
48
178
|
onReady?: (api: CalendarApi) => void;
|
|
49
179
|
/** Clase del contenedor host. */
|
|
50
180
|
className?: string;
|
|
181
|
+
/** Estilos en línea del contenedor host. */
|
|
182
|
+
style?: CSSProperties;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Handle imperativo: `ref.current.getApi()`, como en `@fullcalendar/react`. */
|
|
186
|
+
export declare interface ReserviCalendarRef {
|
|
187
|
+
getApi(): CalendarApi | null;
|
|
51
188
|
}
|
|
52
189
|
|
|
53
190
|
export { ReserviClassNames }
|
|
@@ -60,6 +197,45 @@ export { ResourceInput }
|
|
|
60
197
|
|
|
61
198
|
export { resourcePlugin }
|
|
62
199
|
|
|
200
|
+
/** Evento tal como lo recibe el anfitrión (equivalente a `EventApi`). */
|
|
201
|
+
export declare interface RsvEventApi {
|
|
202
|
+
readonly id: string;
|
|
203
|
+
readonly groupId: string;
|
|
204
|
+
readonly title: string;
|
|
205
|
+
readonly start: Date | null;
|
|
206
|
+
readonly end: Date | null;
|
|
207
|
+
readonly startStr: string;
|
|
208
|
+
readonly endStr: string;
|
|
209
|
+
readonly allDay: boolean;
|
|
210
|
+
readonly url: string;
|
|
211
|
+
readonly display: string;
|
|
212
|
+
readonly backgroundColor: string;
|
|
213
|
+
readonly borderColor: string;
|
|
214
|
+
readonly textColor: string;
|
|
215
|
+
readonly classNames: string[];
|
|
216
|
+
readonly extendedProps: Record<string, unknown>;
|
|
217
|
+
/** Definición original del núcleo, por si se necesita la API completa. */
|
|
218
|
+
readonly def: EventDef;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Vista activa (equivalente reducido de `ViewApi`). */
|
|
222
|
+
export declare interface RsvViewApi {
|
|
223
|
+
readonly type: string;
|
|
224
|
+
readonly title?: string;
|
|
225
|
+
readonly currentStart?: Date;
|
|
226
|
+
readonly currentEnd?: Date;
|
|
227
|
+
readonly activeStart?: Date;
|
|
228
|
+
readonly activeEnd?: Date;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export declare interface SelectArg {
|
|
232
|
+
start: Date;
|
|
233
|
+
end: Date;
|
|
234
|
+
startStr: string;
|
|
235
|
+
endStr: string;
|
|
236
|
+
view: RsvViewApi;
|
|
237
|
+
}
|
|
238
|
+
|
|
63
239
|
export { timeGridPlugin }
|
|
64
240
|
|
|
65
241
|
export { timelinePlugin }
|
package/dist/index.js
CHANGED
|
@@ -1,28 +1,389 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import { jsxs as B, Fragment as G, jsx as W } from "react/jsx-runtime";
|
|
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
|
+
import { createPortal as Q } from "react-dom";
|
|
4
|
+
import { mount as U, hostSlot as w } from "@reservi/preact";
|
|
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 Se, resourcePlugin as fe, timeGridPlugin as ye, timelinePlugin as De } from "@reservi/core";
|
|
7
|
+
const F = (t) => t ? l.toDate(t) : null, A = (t) => t ? l.toISOString(t) : "";
|
|
8
|
+
function S(t) {
|
|
9
|
+
return {
|
|
10
|
+
id: t.id,
|
|
11
|
+
groupId: t.groupId,
|
|
12
|
+
title: t.title,
|
|
13
|
+
start: F(t.start),
|
|
14
|
+
end: F(t.end),
|
|
15
|
+
startStr: A(t.start),
|
|
16
|
+
endStr: A(t.end),
|
|
17
|
+
allDay: t.allDay,
|
|
18
|
+
url: t.url,
|
|
19
|
+
display: t.display,
|
|
20
|
+
backgroundColor: t.backgroundColor,
|
|
21
|
+
borderColor: t.borderColor,
|
|
22
|
+
textColor: t.textColor,
|
|
23
|
+
classNames: t.classNames,
|
|
24
|
+
extendedProps: t.extendedProps,
|
|
25
|
+
def: t
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function V(t, a, d) {
|
|
29
|
+
const v = { type: t.type };
|
|
30
|
+
return a ? {
|
|
31
|
+
...v,
|
|
32
|
+
...d == null ? {} : { title: d },
|
|
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
|
+
} : d == null ? v : { ...v, title: d };
|
|
38
|
+
}
|
|
39
|
+
const X = [
|
|
40
|
+
"eventContent",
|
|
41
|
+
"dayCellContent",
|
|
42
|
+
"dayHeaderContent",
|
|
43
|
+
"slotLabelContent",
|
|
44
|
+
"moreLinkContent"
|
|
45
|
+
], z = [
|
|
46
|
+
"locale",
|
|
47
|
+
"direction",
|
|
48
|
+
"timeZone",
|
|
49
|
+
"firstDay",
|
|
50
|
+
"weekends",
|
|
51
|
+
"hiddenDays",
|
|
52
|
+
"fixedWeekCount",
|
|
53
|
+
"showNonCurrentDates",
|
|
54
|
+
"weekNumbers",
|
|
55
|
+
"weekNumberCalculation",
|
|
56
|
+
"navLinks",
|
|
57
|
+
"dayMaxEvents",
|
|
58
|
+
"dayMaxEventRows",
|
|
59
|
+
"slotMinTime",
|
|
60
|
+
"slotMaxTime",
|
|
61
|
+
"slotDuration",
|
|
62
|
+
"slotLabelInterval",
|
|
63
|
+
"allDaySlot",
|
|
64
|
+
"nowIndicator",
|
|
65
|
+
"scrollTime",
|
|
66
|
+
"editable",
|
|
67
|
+
"selectable",
|
|
68
|
+
"selectMirror",
|
|
69
|
+
"snapDuration",
|
|
70
|
+
"businessHours",
|
|
71
|
+
"eventOverlap",
|
|
72
|
+
"eventConstraint",
|
|
73
|
+
"eventAllow",
|
|
74
|
+
"theme",
|
|
75
|
+
"themeTokens",
|
|
76
|
+
"headerToolbar",
|
|
77
|
+
"hourHeight",
|
|
78
|
+
"height",
|
|
79
|
+
"eventTimeFormat",
|
|
80
|
+
"slotLabelFormat",
|
|
81
|
+
"dayHeaderFormat",
|
|
82
|
+
"listDayFormat",
|
|
83
|
+
"listDaySideFormat",
|
|
84
|
+
"titleFormat",
|
|
85
|
+
"viewOverrides",
|
|
86
|
+
"keyboardShortcuts",
|
|
87
|
+
"resourceAreaWidth",
|
|
88
|
+
"resourceOrder",
|
|
89
|
+
"lazyFetching",
|
|
90
|
+
// Opciones de la capa de UI (no del núcleo). `setOptions` es agnóstico de la
|
|
91
|
+
// clave, así que se sincronizan igual: sin esto, cambiar de vista dejaría las
|
|
92
|
+
// clases de la vista anterior.
|
|
93
|
+
"classNames",
|
|
94
|
+
"views",
|
|
95
|
+
"addButtonText",
|
|
96
|
+
"responsiveViews"
|
|
97
|
+
];
|
|
98
|
+
function $(t, a) {
|
|
99
|
+
return t.getOption(a);
|
|
100
|
+
}
|
|
101
|
+
const le = Y(
|
|
102
|
+
function(a, d) {
|
|
103
|
+
const v = g(null), y = g(null), o = g(a);
|
|
104
|
+
o.current = a;
|
|
105
|
+
const D = g(/* @__PURE__ */ new Map()), [, h] = q(0), L = g(!1), E = g(!0), b = K(() => {
|
|
106
|
+
L.current || (L.current = !0, queueMicrotask(() => {
|
|
107
|
+
L.current = !1, E.current && h((i) => i + 1);
|
|
108
|
+
}));
|
|
109
|
+
}, []), H = Z(
|
|
110
|
+
() => ({
|
|
111
|
+
mount(i, c, C) {
|
|
112
|
+
D.current.set(i, { el: c, payload: C }), b();
|
|
113
|
+
},
|
|
114
|
+
update(i, c) {
|
|
115
|
+
const C = D.current.get(i);
|
|
116
|
+
C && (C.payload = c, b());
|
|
117
|
+
},
|
|
118
|
+
unmount(i) {
|
|
119
|
+
D.current.delete(i) && b();
|
|
120
|
+
}
|
|
121
|
+
}),
|
|
122
|
+
[b]
|
|
123
|
+
);
|
|
124
|
+
R(() => {
|
|
125
|
+
var T, P;
|
|
126
|
+
const i = v.current;
|
|
127
|
+
if (!i) return;
|
|
128
|
+
E.current = !0;
|
|
129
|
+
const c = {
|
|
130
|
+
eventContent: (e) => o.current.eventContent ? w({ slot: "eventContent", arg: e }) : void 0,
|
|
131
|
+
dayCellContent: (e) => o.current.dayCellContent ? w({ slot: "dayCellContent", arg: e }) : void 0,
|
|
132
|
+
dayHeaderContent: (e) => o.current.dayHeaderContent ? w({ slot: "dayHeaderContent", arg: e }) : void 0,
|
|
133
|
+
slotLabelContent: (e) => o.current.slotLabelContent ? w({ slot: "slotLabelContent", arg: e }) : void 0,
|
|
134
|
+
moreLinkContent: (e) => o.current.moreLinkContent ? w({ slot: "moreLinkContent", arg: e }) : void 0
|
|
135
|
+
}, C = {
|
|
136
|
+
...te(o.current),
|
|
137
|
+
slots: c,
|
|
138
|
+
hostBridge: H,
|
|
139
|
+
hooks: {
|
|
140
|
+
eventDidMount: (e) => {
|
|
141
|
+
const n = o.current.eventDidMount;
|
|
142
|
+
n && n({ ..._(e), el: e.el });
|
|
143
|
+
},
|
|
144
|
+
dayCellDidMount: (e) => {
|
|
145
|
+
var n, r;
|
|
146
|
+
return (r = (n = o.current).dayCellDidMount) == null ? void 0 : r.call(n, e);
|
|
147
|
+
},
|
|
148
|
+
dayHeaderDidMount: (e) => {
|
|
149
|
+
var n, r;
|
|
150
|
+
return (r = (n = o.current).dayHeaderDidMount) == null ? void 0 : r.call(n, e);
|
|
151
|
+
},
|
|
152
|
+
slotLabelDidMount: (e) => {
|
|
153
|
+
var n, r;
|
|
154
|
+
return (r = (n = o.current).slotLabelDidMount) == null ? void 0 : r.call(n, e);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}, f = U(i, C);
|
|
158
|
+
y.current = f;
|
|
159
|
+
const s = f.api, m = () => {
|
|
160
|
+
const e = s.getViewModel();
|
|
161
|
+
return V(e.spec, e.range, e.title);
|
|
162
|
+
}, j = [
|
|
163
|
+
s.on(
|
|
164
|
+
"eventClick",
|
|
165
|
+
({ event: e, el: n }) => {
|
|
166
|
+
var r, u;
|
|
167
|
+
return (u = (r = o.current).eventClick) == null ? void 0 : u.call(r, {
|
|
168
|
+
event: S(e),
|
|
169
|
+
el: n ?? null,
|
|
170
|
+
view: m()
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
s.on(
|
|
175
|
+
"dateClick",
|
|
176
|
+
({ date: e, allDay: n }) => {
|
|
177
|
+
var r, u;
|
|
178
|
+
return (u = (r = o.current).dateClick) == null ? void 0 : u.call(r, {
|
|
179
|
+
date: l.toDate(e),
|
|
180
|
+
dateStr: l.toISOString(e),
|
|
181
|
+
allDay: n ?? !1,
|
|
182
|
+
view: m()
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
),
|
|
186
|
+
s.on(
|
|
187
|
+
"select",
|
|
188
|
+
({ start: e, end: n }) => {
|
|
189
|
+
var r, u;
|
|
190
|
+
return (u = (r = o.current).select) == null ? void 0 : u.call(r, {
|
|
191
|
+
start: l.toDate(e),
|
|
192
|
+
end: l.toDate(n),
|
|
193
|
+
startStr: l.toISOString(e),
|
|
194
|
+
endStr: l.toISOString(n),
|
|
195
|
+
view: m()
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
s.on("unselect", () => {
|
|
200
|
+
var e, n;
|
|
201
|
+
return (n = (e = o.current).unselect) == null ? void 0 : n.call(e);
|
|
202
|
+
}),
|
|
203
|
+
s.on(
|
|
204
|
+
"datesSet",
|
|
205
|
+
({ range: e, view: n }) => {
|
|
206
|
+
var r, u;
|
|
207
|
+
return (u = (r = o.current).datesSet) == null ? void 0 : u.call(r, {
|
|
208
|
+
start: l.toDate(e.activeStart),
|
|
209
|
+
end: l.toDate(e.activeEnd),
|
|
210
|
+
startStr: l.toISOString(e.activeStart),
|
|
211
|
+
endStr: l.toISOString(e.activeEnd),
|
|
212
|
+
view: V(n, e)
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
),
|
|
216
|
+
// Sin `view()`: `eventsSet` se emite desde un effect de signals y leer
|
|
217
|
+
// el ViewModel ahí lo añadiría a sus dependencias.
|
|
218
|
+
s.on(
|
|
219
|
+
"eventsSet",
|
|
220
|
+
(e) => {
|
|
221
|
+
var n, r;
|
|
222
|
+
return (r = (n = o.current).eventsSet) == null ? void 0 : r.call(n, e.map((u) => S(u)));
|
|
223
|
+
}
|
|
224
|
+
),
|
|
225
|
+
s.on(
|
|
226
|
+
"eventDrop",
|
|
227
|
+
({ event: e }) => {
|
|
228
|
+
var n, r;
|
|
229
|
+
return (r = (n = o.current).eventDrop) == null ? void 0 : r.call(n, { event: S(e), view: m() });
|
|
230
|
+
}
|
|
231
|
+
),
|
|
232
|
+
s.on(
|
|
233
|
+
"eventResize",
|
|
234
|
+
({ event: e }) => {
|
|
235
|
+
var n, r;
|
|
236
|
+
return (r = (n = o.current).eventResize) == null ? void 0 : r.call(n, { event: S(e), view: m() });
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
s.on(
|
|
240
|
+
"eventChange",
|
|
241
|
+
({ event: e }) => {
|
|
242
|
+
var n, r;
|
|
243
|
+
return (r = (n = o.current).eventChange) == null ? void 0 : r.call(n, { event: S(e), view: m() });
|
|
244
|
+
}
|
|
245
|
+
),
|
|
246
|
+
s.on(
|
|
247
|
+
"moreLinkClick",
|
|
248
|
+
({ date: e, allEvents: n, hiddenEvents: r }) => {
|
|
249
|
+
var u, N;
|
|
250
|
+
return (N = (u = o.current).moreLinkClick) == null ? void 0 : N.call(u, {
|
|
251
|
+
date: l.toDate(e),
|
|
252
|
+
dateStr: l.toISOString(e),
|
|
253
|
+
allEvents: n.map((O) => S(O)),
|
|
254
|
+
hiddenEvents: r.map((O) => S(O)),
|
|
255
|
+
view: m()
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
),
|
|
259
|
+
s.on(
|
|
260
|
+
"navLinkDay",
|
|
261
|
+
({ date: e }) => {
|
|
262
|
+
var n, r;
|
|
263
|
+
return (r = (n = o.current).navLinkDay) == null ? void 0 : r.call(n, { date: l.toDate(e), dateStr: l.toISOString(e) });
|
|
264
|
+
}
|
|
265
|
+
),
|
|
266
|
+
s.on("loading", ({ isLoading: e }) => {
|
|
267
|
+
var n, r;
|
|
268
|
+
return (r = (n = o.current).loading) == null ? void 0 : r.call(n, e);
|
|
269
|
+
})
|
|
270
|
+
];
|
|
271
|
+
return (P = (T = o.current).onReady) == null || P.call(T, s), () => {
|
|
272
|
+
E.current = !1;
|
|
273
|
+
for (const e of j) e();
|
|
274
|
+
f.destroy(), y.current = null, D.current.clear();
|
|
275
|
+
};
|
|
276
|
+
}, [H]), J(d, () => ({ getApi: () => {
|
|
277
|
+
var i;
|
|
278
|
+
return ((i = y.current) == null ? void 0 : i.api) ?? null;
|
|
279
|
+
} }), []);
|
|
280
|
+
const M = z.map((i) => a[i]);
|
|
281
|
+
R(() => {
|
|
282
|
+
var f;
|
|
283
|
+
const i = (f = y.current) == null ? void 0 : f.api;
|
|
284
|
+
if (!i) return;
|
|
285
|
+
const c = {};
|
|
286
|
+
let C = !1;
|
|
287
|
+
z.forEach((s, m) => {
|
|
288
|
+
$(i, s) !== M[m] && (c[s] = M[m], C = !0);
|
|
289
|
+
}), C && i.setOptions(c);
|
|
290
|
+
}, M);
|
|
291
|
+
const k = a.events, x = g(k);
|
|
292
|
+
R(() => {
|
|
293
|
+
var c;
|
|
294
|
+
const i = (c = y.current) == null ? void 0 : c.api;
|
|
295
|
+
if (!(!i || !k)) {
|
|
296
|
+
if (x.current === k) {
|
|
297
|
+
x.current = void 0;
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
i.refetchEvents(k);
|
|
301
|
+
}
|
|
302
|
+
}, [k]);
|
|
303
|
+
const I = [];
|
|
304
|
+
for (const [i, { el: c, payload: C }] of D.current) {
|
|
305
|
+
const f = p(a, C);
|
|
306
|
+
f != null && I.push(Q(f, c, i));
|
|
307
|
+
}
|
|
308
|
+
return /* @__PURE__ */ B(G, { children: [
|
|
309
|
+
/* @__PURE__ */ W("div", { ref: v, className: a.className, style: a.style }),
|
|
310
|
+
I
|
|
311
|
+
] });
|
|
312
|
+
}
|
|
313
|
+
);
|
|
314
|
+
function p(t, a) {
|
|
315
|
+
var d, v, y, o, D;
|
|
316
|
+
switch (a.slot) {
|
|
317
|
+
case "eventContent":
|
|
318
|
+
return (d = t.eventContent) == null ? void 0 : d.call(t, _(a.arg));
|
|
319
|
+
case "dayCellContent":
|
|
320
|
+
return (v = t.dayCellContent) == null ? void 0 : v.call(t, a.arg);
|
|
321
|
+
case "dayHeaderContent":
|
|
322
|
+
return (y = t.dayHeaderContent) == null ? void 0 : y.call(t, a.arg);
|
|
323
|
+
case "slotLabelContent":
|
|
324
|
+
return (o = t.slotLabelContent) == null ? void 0 : o.call(t, a.arg);
|
|
325
|
+
case "moreLinkContent": {
|
|
326
|
+
const h = a.arg;
|
|
327
|
+
return (D = t.moreLinkContent) == null ? void 0 : D.call(t, {
|
|
328
|
+
date: h.date,
|
|
329
|
+
moreCount: h.moreCount,
|
|
330
|
+
allEvents: h.allEvents.map(S),
|
|
331
|
+
hiddenEvents: h.hiddenEvents.map(S),
|
|
332
|
+
view: h.view
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
default:
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function _(t) {
|
|
340
|
+
return {
|
|
341
|
+
event: S(t.event),
|
|
342
|
+
isAllDay: t.isAllDay,
|
|
343
|
+
timeText: t.timeText,
|
|
344
|
+
view: t.view
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
const ee = /* @__PURE__ */ new Set([
|
|
348
|
+
...X,
|
|
349
|
+
"eventClick",
|
|
350
|
+
"dateClick",
|
|
351
|
+
"select",
|
|
352
|
+
"unselect",
|
|
353
|
+
"datesSet",
|
|
354
|
+
"eventsSet",
|
|
355
|
+
"eventDrop",
|
|
356
|
+
"eventResize",
|
|
357
|
+
"eventChange",
|
|
358
|
+
"moreLinkClick",
|
|
359
|
+
"navLinkDay",
|
|
360
|
+
"loading",
|
|
361
|
+
"eventDidMount",
|
|
362
|
+
"dayCellDidMount",
|
|
363
|
+
"dayHeaderDidMount",
|
|
364
|
+
"slotLabelDidMount",
|
|
365
|
+
"onReady",
|
|
366
|
+
"className",
|
|
367
|
+
"style"
|
|
368
|
+
]);
|
|
369
|
+
function te(t) {
|
|
370
|
+
const a = {};
|
|
371
|
+
for (const [d, v] of Object.entries(t))
|
|
372
|
+
ee.has(d) || (a[d] = v);
|
|
373
|
+
return a;
|
|
16
374
|
}
|
|
17
375
|
export {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
376
|
+
le as ReserviCalendar,
|
|
377
|
+
S as adaptEvent,
|
|
378
|
+
V as adaptView,
|
|
379
|
+
ce as dayGridPlugin,
|
|
380
|
+
de as definePlugin,
|
|
381
|
+
ve as defineTheme,
|
|
382
|
+
Ce as dl,
|
|
383
|
+
me as listPlugin,
|
|
384
|
+
Se as multiMonthPlugin,
|
|
385
|
+
fe as resourcePlugin,
|
|
386
|
+
ye as timeGridPlugin,
|
|
387
|
+
De as timelinePlugin
|
|
27
388
|
};
|
|
28
389
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/ReserviCalendar.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { mount, type ReserviCalendarHandle, type ReserviCalendarOptions } from \"@reservi/preact\";\nimport type { CalendarApi } from \"@reservi/core\";\n\nexport interface ReserviCalendarProps extends ReserviCalendarOptions {\n /** Se invoca con la API del calendario tras montar. */\n onReady?: (api: CalendarApi) => void;\n /** Clase del contenedor host. */\n className?: string;\n}\n\n/**\n * Componente React. Monta el calendario agnóstico (Preact) en un div y mantiene\n * sincronizados los eventos; el resto se controla vía la API (onReady).\n */\nexport function ReserviCalendar({ onReady, className, ...options }: ReserviCalendarProps) {\n const hostRef = useRef<HTMLDivElement>(null);\n const handleRef = useRef<ReserviCalendarHandle | null>(null);\n\n // Montaje único (la identidad de la instancia se mantiene entre renders).\n useEffect(() => {\n if (!hostRef.current) return;\n const handle = mount(hostRef.current, options);\n handleRef.current = handle;\n onReady?.(handle.api);\n return () => {\n handle.destroy();\n handleRef.current = null;\n };\n }, []);\n\n // Sincroniza eventos cuando cambia la prop.\n useEffect(() => {\n if (handleRef.current && options.events) {\n handleRef.current.api.refetchEvents(options.events);\n }\n }, [options.events]);\n\n return <div ref={hostRef} className={className} />;\n}\n"],"names":["ReserviCalendar","onReady","className","options","hostRef","useRef","handleRef","useEffect","handle","mount","jsx"],"mappings":";;;;AAeO,SAASA,EAAgB,EAAE,SAAAC,GAAS,WAAAC,GAAW,GAAGC,KAAiC;AACxF,QAAMC,IAAUC,EAAuB,IAAI,GACrCC,IAAYD,EAAqC,IAAI;AAG3D,SAAAE,EAAU,MAAM;AACd,QAAI,CAACH,EAAQ,QAAS;AACtB,UAAMI,IAASC,EAAML,EAAQ,SAASD,CAAO;AAC7C,WAAAG,EAAU,UAAUE,GACpBP,KAAA,QAAAA,EAAUO,EAAO,MACV,MAAM;AACX,MAAAA,EAAO,QAAA,GACPF,EAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAAA,CAAE,GAGLC,EAAU,MAAM;AACd,IAAID,EAAU,WAAWH,EAAQ,UAC/BG,EAAU,QAAQ,IAAI,cAAcH,EAAQ,MAAM;AAAA,EAEtD,GAAG,CAACA,EAAQ,MAAM,CAAC,GAEZ,gBAAAO,EAAC,OAAA,EAAI,KAAKN,GAAS,WAAAF,EAAA,CAAsB;AAClD;"}
|
|
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 \"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": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
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/core": "1.
|
|
40
|
-
"@reservi/preact": "1.
|
|
39
|
+
"@reservi/core": "1.4.0",
|
|
40
|
+
"@reservi/preact": "1.4.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"react": "^18.0.0 || ^19.0.0",
|