@underverse-ui/underverse 0.2.88 → 0.2.90

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
@@ -730,6 +730,7 @@ var defaultTranslations = {
730
730
  month: "Month",
731
731
  week: "Week",
732
732
  day: "Day",
733
+ resourcesHeader: "Resources",
733
734
  expandGroup: "Expand group",
734
735
  collapseGroup: "Collapse group",
735
736
  more: "+{n} more"
@@ -805,6 +806,7 @@ var defaultTranslations = {
805
806
  month: "Th\xE1ng",
806
807
  week: "Tu\u1EA7n",
807
808
  day: "Ng\xE0y",
809
+ resourcesHeader: "T\xE0i nguy\xEAn",
808
810
  expandGroup: "M\u1EDF nh\xF3m",
809
811
  collapseGroup: "Thu g\u1ECDn nh\xF3m",
810
812
  more: "+{n} th\xEAm"
@@ -880,6 +882,7 @@ var defaultTranslations = {
880
882
  month: "\uC6D4",
881
883
  week: "\uC8FC",
882
884
  day: "\uC77C",
885
+ resourcesHeader: "\uB9AC\uC18C\uC2A4",
883
886
  expandGroup: "\uADF8\uB8F9 \uD3BC\uCE58\uAE30",
884
887
  collapseGroup: "\uADF8\uB8F9 \uC811\uAE30",
885
888
  more: "+{n}\uAC1C \uB354"
@@ -955,6 +958,7 @@ var defaultTranslations = {
955
958
  month: "\u6708",
956
959
  week: "\u9031",
957
960
  day: "\u65E5",
961
+ resourcesHeader: "\u30EA\u30BD\u30FC\u30B9",
958
962
  expandGroup: "\u30B0\u30EB\u30FC\u30D7\u3092\u5C55\u958B",
959
963
  collapseGroup: "\u30B0\u30EB\u30FC\u30D7\u3092\u6298\u308A\u305F\u305F\u3080",
960
964
  more: "+{n}\u4EF6"
@@ -5755,11 +5759,6 @@ var ScrollArea = (0, import_react14.forwardRef)(
5755
5759
  );
5756
5760
  ScrollArea.displayName = "ScrollArea";
5757
5761
 
5758
- // ../../components/ui/DatePicker.tsx
5759
- var React23 = __toESM(require("react"), 1);
5760
- var import_react15 = require("react");
5761
- var import_lucide_react14 = require("lucide-react");
5762
-
5763
5762
  // ../../lib/utils/date.ts
5764
5763
  function formatDateShort(date) {
5765
5764
  if (!date) return "";
@@ -5773,6 +5772,9 @@ function formatDateShort(date) {
5773
5772
  }
5774
5773
 
5775
5774
  // ../../components/ui/DatePicker.tsx
5775
+ var import_lucide_react14 = require("lucide-react");
5776
+ var React23 = __toESM(require("react"), 1);
5777
+ var import_react15 = require("react");
5776
5778
  var import_jsx_runtime29 = require("react/jsx-runtime");
5777
5779
  var DatePicker = ({
5778
5780
  id,
@@ -8007,6 +8009,15 @@ function CalendarTimeline({
8007
8009
  resources,
8008
8010
  events,
8009
8011
  size = "md",
8012
+ enableEventSheet,
8013
+ eventSheetSize = "md",
8014
+ renderEventSheet,
8015
+ selectedEventId,
8016
+ defaultSelectedEventId,
8017
+ onSelectedEventIdChange,
8018
+ eventSheetOpen,
8019
+ defaultEventSheetOpen,
8020
+ onEventSheetOpenChange,
8010
8021
  view,
8011
8022
  defaultView = "month",
8012
8023
  onViewChange,
@@ -8047,6 +8058,28 @@ function CalendarTimeline({
8047
8058
  const detectedLocale = useLocale();
8048
8059
  const resolvedLocale = React28.useMemo(() => localeToBCP47(locale ?? detectedLocale), [locale, detectedLocale]);
8049
8060
  const resolvedTimeZone = React28.useMemo(() => timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC", [timeZone]);
8061
+ const effectiveEnableEventSheet = enableEventSheet ?? Boolean(renderEventSheet);
8062
+ const isControlledSelectedEventId = selectedEventId !== void 0;
8063
+ const [internalSelectedEventId, setInternalSelectedEventId] = React28.useState(defaultSelectedEventId ?? null);
8064
+ const activeSelectedEventId = isControlledSelectedEventId ? selectedEventId : internalSelectedEventId;
8065
+ const setSelectedEventId = React28.useCallback(
8066
+ (next) => {
8067
+ if (!isControlledSelectedEventId) setInternalSelectedEventId(next);
8068
+ onSelectedEventIdChange?.(next);
8069
+ },
8070
+ [isControlledSelectedEventId, onSelectedEventIdChange]
8071
+ );
8072
+ const isControlledEventSheetOpen = eventSheetOpen !== void 0;
8073
+ const [internalEventSheetOpen, setInternalEventSheetOpen] = React28.useState(defaultEventSheetOpen ?? false);
8074
+ const activeEventSheetOpen = isControlledEventSheetOpen ? Boolean(eventSheetOpen) : internalEventSheetOpen;
8075
+ const setEventSheetOpen = React28.useCallback(
8076
+ (next) => {
8077
+ if (!isControlledEventSheetOpen) setInternalEventSheetOpen(next);
8078
+ onEventSheetOpenChange?.(next);
8079
+ if (!next) setSelectedEventId(null);
8080
+ },
8081
+ [isControlledEventSheetOpen, onEventSheetOpenChange, setSelectedEventId]
8082
+ );
8050
8083
  const sizeConfig = React28.useMemo(() => {
8051
8084
  const cfgBySize = {
8052
8085
  sm: {
@@ -8263,6 +8296,31 @@ function CalendarTimeline({
8263
8296
  for (const r of resources) map.set(r.id, r);
8264
8297
  return map;
8265
8298
  }, [resources]);
8299
+ const selectedEvent = React28.useMemo(() => {
8300
+ if (!activeSelectedEventId) return null;
8301
+ const found = normalizedEvents.find((e) => e.id === activeSelectedEventId);
8302
+ return found ?? null;
8303
+ }, [activeSelectedEventId, normalizedEvents]);
8304
+ const selectedResource = React28.useMemo(() => {
8305
+ if (!selectedEvent) return void 0;
8306
+ return resourceById.get(selectedEvent.resourceId);
8307
+ }, [resourceById, selectedEvent]);
8308
+ const selectedTimeText = React28.useMemo(() => {
8309
+ if (!selectedEvent) return "";
8310
+ return formatters?.eventTime?.({
8311
+ start: selectedEvent._start,
8312
+ end: selectedEvent._end,
8313
+ locale: resolvedLocale,
8314
+ timeZone: resolvedTimeZone,
8315
+ view: activeView
8316
+ }) ?? defaultEventTime({ start: selectedEvent._start, end: selectedEvent._end, locale: resolvedLocale, timeZone: resolvedTimeZone, view: activeView });
8317
+ }, [activeView, formatters, resolvedLocale, resolvedTimeZone, selectedEvent]);
8318
+ React28.useEffect(() => {
8319
+ if (!effectiveEnableEventSheet) return;
8320
+ if (activeEventSheetOpen && activeSelectedEventId && !selectedEvent) {
8321
+ setEventSheetOpen(false);
8322
+ }
8323
+ }, [activeEventSheetOpen, activeSelectedEventId, effectiveEnableEventSheet, selectedEvent, setEventSheetOpen]);
8266
8324
  const leftRef = React28.useRef(null);
8267
8325
  const bodyRef = React28.useRef(null);
8268
8326
  const headerRef = React28.useRef(null);
@@ -8731,7 +8789,13 @@ function CalendarTimeline({
8731
8789
  role: "button",
8732
8790
  tabIndex: 0,
8733
8791
  "aria-label": aria,
8734
- onClick: () => onEventClick?.(ev),
8792
+ onClick: () => {
8793
+ onEventClick?.(ev);
8794
+ if (effectiveEnableEventSheet) {
8795
+ setSelectedEventId(ev.id);
8796
+ setEventSheetOpen(true);
8797
+ }
8798
+ },
8735
8799
  onDoubleClick: () => onEventDoubleClick?.(ev),
8736
8800
  onPointerDown: (e) => onPointerDownEvent(e, ev, "move"),
8737
8801
  children: [
@@ -8797,7 +8861,35 @@ function CalendarTimeline({
8797
8861
  ]
8798
8862
  }
8799
8863
  )
8800
- ] })
8864
+ ] }),
8865
+ effectiveEnableEventSheet && selectedEvent ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
8866
+ Sheet,
8867
+ {
8868
+ open: activeEventSheetOpen,
8869
+ onOpenChange: setEventSheetOpen,
8870
+ side: "right",
8871
+ size: eventSheetSize,
8872
+ title: selectedEvent.title ?? "Event",
8873
+ description: selectedTimeText || void 0,
8874
+ children: renderEventSheet ? renderEventSheet({
8875
+ event: selectedEvent,
8876
+ resource: selectedResource,
8877
+ close: () => setEventSheetOpen(false),
8878
+ locale: resolvedLocale,
8879
+ timeZone: resolvedTimeZone,
8880
+ view: activeView
8881
+ }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "space-y-3", children: [
8882
+ selectedResource?.label ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
8883
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-xs text-muted-foreground", children: t("resourcesHeader") }),
8884
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "font-medium", children: selectedResource.label })
8885
+ ] }) : null,
8886
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
8887
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-xs text-muted-foreground", children: "ID" }),
8888
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "font-mono text-xs break-all", children: selectedEvent.id })
8889
+ ] })
8890
+ ] })
8891
+ }
8892
+ ) : null
8801
8893
  ]
8802
8894
  }
8803
8895
  );
@@ -16051,6 +16143,7 @@ var en_default = {
16051
16143
  month: "Month",
16052
16144
  week: "Week",
16053
16145
  day: "Day",
16146
+ resourcesHeader: "Resources",
16054
16147
  expandGroup: "Expand group",
16055
16148
  collapseGroup: "Collapse group",
16056
16149
  more: "+{n} more"
@@ -16137,6 +16230,7 @@ var vi_default = {
16137
16230
  month: "Th\xE1ng",
16138
16231
  week: "Tu\u1EA7n",
16139
16232
  day: "Ng\xE0y",
16233
+ resourcesHeader: "T\xE0i nguy\xEAn",
16140
16234
  expandGroup: "M\u1EDF nh\xF3m",
16141
16235
  collapseGroup: "Thu g\u1ECDn nh\xF3m",
16142
16236
  more: "+{n} th\xEAm"
@@ -16223,6 +16317,7 @@ var ko_default = {
16223
16317
  month: "\uC6D4",
16224
16318
  week: "\uC8FC",
16225
16319
  day: "\uC77C",
16320
+ resourcesHeader: "\uB9AC\uC18C\uC2A4",
16226
16321
  expandGroup: "\uADF8\uB8F9 \uD3BC\uCE58\uAE30",
16227
16322
  collapseGroup: "\uADF8\uB8F9 \uC811\uAE30",
16228
16323
  more: "+{n}\uAC1C \uB354"
@@ -16309,6 +16404,7 @@ var ja_default = {
16309
16404
  month: "\u6708",
16310
16405
  week: "\u9031",
16311
16406
  day: "\u65E5",
16407
+ resourcesHeader: "\u30EA\u30BD\u30FC\u30B9",
16312
16408
  expandGroup: "\u30B0\u30EB\u30FC\u30D7\u3092\u5C55\u958B",
16313
16409
  collapseGroup: "\u30B0\u30EB\u30FC\u30D7\u3092\u6298\u308A\u305F\u305F\u3080",
16314
16410
  more: "+{n}\u4EF6"