@underverse-ui/underverse 0.2.88 → 0.2.89

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 CHANGED
@@ -8007,6 +8007,15 @@ function CalendarTimeline({
8007
8007
  resources,
8008
8008
  events,
8009
8009
  size = "md",
8010
+ enableEventSheet,
8011
+ eventSheetSize = "md",
8012
+ renderEventSheet,
8013
+ selectedEventId,
8014
+ defaultSelectedEventId,
8015
+ onSelectedEventIdChange,
8016
+ eventSheetOpen,
8017
+ defaultEventSheetOpen,
8018
+ onEventSheetOpenChange,
8010
8019
  view,
8011
8020
  defaultView = "month",
8012
8021
  onViewChange,
@@ -8047,6 +8056,28 @@ function CalendarTimeline({
8047
8056
  const detectedLocale = useLocale();
8048
8057
  const resolvedLocale = React28.useMemo(() => localeToBCP47(locale ?? detectedLocale), [locale, detectedLocale]);
8049
8058
  const resolvedTimeZone = React28.useMemo(() => timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC", [timeZone]);
8059
+ const effectiveEnableEventSheet = enableEventSheet ?? Boolean(renderEventSheet);
8060
+ const isControlledSelectedEventId = selectedEventId !== void 0;
8061
+ const [internalSelectedEventId, setInternalSelectedEventId] = React28.useState(defaultSelectedEventId ?? null);
8062
+ const activeSelectedEventId = isControlledSelectedEventId ? selectedEventId : internalSelectedEventId;
8063
+ const setSelectedEventId = React28.useCallback(
8064
+ (next) => {
8065
+ if (!isControlledSelectedEventId) setInternalSelectedEventId(next);
8066
+ onSelectedEventIdChange?.(next);
8067
+ },
8068
+ [isControlledSelectedEventId, onSelectedEventIdChange]
8069
+ );
8070
+ const isControlledEventSheetOpen = eventSheetOpen !== void 0;
8071
+ const [internalEventSheetOpen, setInternalEventSheetOpen] = React28.useState(defaultEventSheetOpen ?? false);
8072
+ const activeEventSheetOpen = isControlledEventSheetOpen ? Boolean(eventSheetOpen) : internalEventSheetOpen;
8073
+ const setEventSheetOpen = React28.useCallback(
8074
+ (next) => {
8075
+ if (!isControlledEventSheetOpen) setInternalEventSheetOpen(next);
8076
+ onEventSheetOpenChange?.(next);
8077
+ if (!next) setSelectedEventId(null);
8078
+ },
8079
+ [isControlledEventSheetOpen, onEventSheetOpenChange, setSelectedEventId]
8080
+ );
8050
8081
  const sizeConfig = React28.useMemo(() => {
8051
8082
  const cfgBySize = {
8052
8083
  sm: {
@@ -8263,6 +8294,31 @@ function CalendarTimeline({
8263
8294
  for (const r of resources) map.set(r.id, r);
8264
8295
  return map;
8265
8296
  }, [resources]);
8297
+ const selectedEvent = React28.useMemo(() => {
8298
+ if (!activeSelectedEventId) return null;
8299
+ const found = normalizedEvents.find((e) => e.id === activeSelectedEventId);
8300
+ return found ?? null;
8301
+ }, [activeSelectedEventId, normalizedEvents]);
8302
+ const selectedResource = React28.useMemo(() => {
8303
+ if (!selectedEvent) return void 0;
8304
+ return resourceById.get(selectedEvent.resourceId);
8305
+ }, [resourceById, selectedEvent]);
8306
+ const selectedTimeText = React28.useMemo(() => {
8307
+ if (!selectedEvent) return "";
8308
+ return formatters?.eventTime?.({
8309
+ start: selectedEvent._start,
8310
+ end: selectedEvent._end,
8311
+ locale: resolvedLocale,
8312
+ timeZone: resolvedTimeZone,
8313
+ view: activeView
8314
+ }) ?? defaultEventTime({ start: selectedEvent._start, end: selectedEvent._end, locale: resolvedLocale, timeZone: resolvedTimeZone, view: activeView });
8315
+ }, [activeView, formatters, resolvedLocale, resolvedTimeZone, selectedEvent]);
8316
+ React28.useEffect(() => {
8317
+ if (!effectiveEnableEventSheet) return;
8318
+ if (activeEventSheetOpen && activeSelectedEventId && !selectedEvent) {
8319
+ setEventSheetOpen(false);
8320
+ }
8321
+ }, [activeEventSheetOpen, activeSelectedEventId, effectiveEnableEventSheet, selectedEvent, setEventSheetOpen]);
8266
8322
  const leftRef = React28.useRef(null);
8267
8323
  const bodyRef = React28.useRef(null);
8268
8324
  const headerRef = React28.useRef(null);
@@ -8731,7 +8787,13 @@ function CalendarTimeline({
8731
8787
  role: "button",
8732
8788
  tabIndex: 0,
8733
8789
  "aria-label": aria,
8734
- onClick: () => onEventClick?.(ev),
8790
+ onClick: () => {
8791
+ onEventClick?.(ev);
8792
+ if (effectiveEnableEventSheet) {
8793
+ setSelectedEventId(ev.id);
8794
+ setEventSheetOpen(true);
8795
+ }
8796
+ },
8735
8797
  onDoubleClick: () => onEventDoubleClick?.(ev),
8736
8798
  onPointerDown: (e) => onPointerDownEvent(e, ev, "move"),
8737
8799
  children: [
@@ -8797,7 +8859,35 @@ function CalendarTimeline({
8797
8859
  ]
8798
8860
  }
8799
8861
  )
8800
- ] })
8862
+ ] }),
8863
+ effectiveEnableEventSheet && selectedEvent ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
8864
+ Sheet,
8865
+ {
8866
+ open: activeEventSheetOpen,
8867
+ onOpenChange: setEventSheetOpen,
8868
+ side: "right",
8869
+ size: eventSheetSize,
8870
+ title: selectedEvent.title ?? "Event",
8871
+ description: selectedTimeText || void 0,
8872
+ children: renderEventSheet ? renderEventSheet({
8873
+ event: selectedEvent,
8874
+ resource: selectedResource,
8875
+ close: () => setEventSheetOpen(false),
8876
+ locale: resolvedLocale,
8877
+ timeZone: resolvedTimeZone,
8878
+ view: activeView
8879
+ }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "space-y-3", children: [
8880
+ selectedResource?.label ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
8881
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-xs text-muted-foreground", children: t("resourcesHeader") }),
8882
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "font-medium", children: selectedResource.label })
8883
+ ] }) : null,
8884
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
8885
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-xs text-muted-foreground", children: "ID" }),
8886
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "font-mono text-xs break-all", children: selectedEvent.id })
8887
+ ] })
8888
+ ] })
8889
+ }
8890
+ ) : null
8801
8891
  ]
8802
8892
  }
8803
8893
  );