@underverse-ui/underverse 0.2.99 → 0.2.100
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 +42 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +42 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -1095,6 +1095,14 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
|
|
|
1095
1095
|
defaultRowHeights?: Record<string, number>;
|
|
1096
1096
|
/** Called when per-resource row heights change. */
|
|
1097
1097
|
onRowHeightsChange?: (next: Record<string, number>) => void;
|
|
1098
|
+
/**
|
|
1099
|
+
* Auto-expand each resource row height to fit overlapping events (lanes) without collapsing into "+more".
|
|
1100
|
+
* When enabled, `maxLanesPerRow` is ignored unless overridden via `autoRowHeight.maxLanesPerRow`.
|
|
1101
|
+
*/
|
|
1102
|
+
autoRowHeight?: boolean | {
|
|
1103
|
+
maxRowHeight?: number;
|
|
1104
|
+
maxLanesPerRow?: number;
|
|
1105
|
+
};
|
|
1098
1106
|
/**
|
|
1099
1107
|
* Allow resizing layout with mouse:
|
|
1100
1108
|
* - column: drag the divider in the header
|
|
@@ -1177,7 +1185,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
|
|
|
1177
1185
|
virtualization?: CalendarTimelineVirtualization;
|
|
1178
1186
|
}
|
|
1179
1187
|
|
|
1180
|
-
declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
|
|
1188
|
+
declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
|
|
1181
1189
|
|
|
1182
1190
|
type ComboboxOption = string | {
|
|
1183
1191
|
label: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1095,6 +1095,14 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
|
|
|
1095
1095
|
defaultRowHeights?: Record<string, number>;
|
|
1096
1096
|
/** Called when per-resource row heights change. */
|
|
1097
1097
|
onRowHeightsChange?: (next: Record<string, number>) => void;
|
|
1098
|
+
/**
|
|
1099
|
+
* Auto-expand each resource row height to fit overlapping events (lanes) without collapsing into "+more".
|
|
1100
|
+
* When enabled, `maxLanesPerRow` is ignored unless overridden via `autoRowHeight.maxLanesPerRow`.
|
|
1101
|
+
*/
|
|
1102
|
+
autoRowHeight?: boolean | {
|
|
1103
|
+
maxRowHeight?: number;
|
|
1104
|
+
maxLanesPerRow?: number;
|
|
1105
|
+
};
|
|
1098
1106
|
/**
|
|
1099
1107
|
* Allow resizing layout with mouse:
|
|
1100
1108
|
* - column: drag the divider in the header
|
|
@@ -1177,7 +1185,7 @@ interface CalendarTimelineProps<TResourceMeta = unknown, TEventMeta = unknown> e
|
|
|
1177
1185
|
virtualization?: CalendarTimelineVirtualization;
|
|
1178
1186
|
}
|
|
1179
1187
|
|
|
1180
|
-
declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
|
|
1188
|
+
declare function CalendarTimeline<TResourceMeta = unknown, TEventMeta = unknown>({ resources, events, size, enableEventSheet, eventSheetSize, renderEventSheet, selectedEventId, defaultSelectedEventId, onSelectedEventIdChange, eventSheetOpen, defaultEventSheetOpen, onEventSheetOpenChange, view, defaultView, onViewChange, date, defaultDate, onDateChange, weekStartsOn, locale, timeZone, labels, formatters, groups, groupCollapsed, defaultGroupCollapsed, onGroupCollapsedChange, resourceColumnWidth, defaultResourceColumnWidth, onResourceColumnWidthChange, minResourceColumnWidth, maxResourceColumnWidth, rowHeight, defaultRowHeight, onRowHeightChange, minRowHeight, maxRowHeight, rowHeights, defaultRowHeights, onRowHeightsChange, autoRowHeight, enableLayoutResize, slotMinWidth, dayTimeStepMinutes, dayRangeMode, workHours, maxLanesPerRow, now, renderResource, renderGroup, renderEvent, interactions, onRangeChange, onEventClick, onEventDoubleClick, onCreateEventClick, onCreateEvent, onEventMove, onEventResize, onEventDelete, onMoreClick, virtualization, className, ...rest }: CalendarTimelineProps<TResourceMeta, TEventMeta>): react_jsx_runtime.JSX.Element;
|
|
1181
1189
|
|
|
1182
1190
|
type ComboboxOption = string | {
|
|
1183
1191
|
label: string;
|
package/dist/index.js
CHANGED
|
@@ -8584,6 +8584,7 @@ function CalendarTimeline({
|
|
|
8584
8584
|
rowHeights,
|
|
8585
8585
|
defaultRowHeights,
|
|
8586
8586
|
onRowHeightsChange,
|
|
8587
|
+
autoRowHeight,
|
|
8587
8588
|
enableLayoutResize,
|
|
8588
8589
|
slotMinWidth,
|
|
8589
8590
|
dayTimeStepMinutes = 60,
|
|
@@ -8636,6 +8637,10 @@ function CalendarTimeline({
|
|
|
8636
8637
|
[isControlledEventSheetOpen, onEventSheetOpenChange, setSelectedEventId]
|
|
8637
8638
|
);
|
|
8638
8639
|
const sizeConfig = React28.useMemo(() => getSizeConfig(size), [size]);
|
|
8640
|
+
const densityClass = sizeConfig.densityClass;
|
|
8641
|
+
const eventHeight = sizeConfig.eventHeight;
|
|
8642
|
+
const laneGap = sizeConfig.laneGap;
|
|
8643
|
+
const lanePaddingY = sizeConfig.lanePaddingY;
|
|
8639
8644
|
const canResizeColumn = React28.useMemo(() => {
|
|
8640
8645
|
const cfg = enableLayoutResize;
|
|
8641
8646
|
if (!cfg) return false;
|
|
@@ -8823,13 +8828,43 @@ function CalendarTimeline({
|
|
|
8823
8828
|
setInternalRowHeights(defaultRowHeights);
|
|
8824
8829
|
}, [defaultRowHeights, isControlledRowHeights]);
|
|
8825
8830
|
const activeRowHeights = isControlledRowHeights ? rowHeights : internalRowHeights;
|
|
8831
|
+
const autoRowHeightCfg = React28.useMemo(() => {
|
|
8832
|
+
if (!autoRowHeight) return null;
|
|
8833
|
+
return autoRowHeight === true ? {} : autoRowHeight;
|
|
8834
|
+
}, [autoRowHeight]);
|
|
8835
|
+
const effectiveMaxLanesPerRow = React28.useMemo(() => {
|
|
8836
|
+
if (!autoRowHeightCfg) return maxLanesPerRow;
|
|
8837
|
+
const maxLanes = autoRowHeightCfg.maxLanesPerRow;
|
|
8838
|
+
if (typeof maxLanes === "number" && Number.isFinite(maxLanes) && maxLanes > 0) return Math.floor(maxLanes);
|
|
8839
|
+
return Number.POSITIVE_INFINITY;
|
|
8840
|
+
}, [autoRowHeightCfg, maxLanesPerRow]);
|
|
8841
|
+
const autoRowHeightsByResource = React28.useMemo(() => {
|
|
8842
|
+
if (!autoRowHeightCfg) return null;
|
|
8843
|
+
const maxRowHeight2 = autoRowHeightCfg.maxRowHeight;
|
|
8844
|
+
const out = /* @__PURE__ */ new Map();
|
|
8845
|
+
for (const [resourceId, list] of eventsByResource.entries()) {
|
|
8846
|
+
const mapped = list.map((ev) => {
|
|
8847
|
+
const startIdx = binarySearchLastLE(slotStarts, ev._start);
|
|
8848
|
+
const endIdx = clamp3(binarySearchFirstGE(slotStarts, ev._end), startIdx + 1, slots.length);
|
|
8849
|
+
return { startIdx, endIdx };
|
|
8850
|
+
});
|
|
8851
|
+
const { laneCount } = intervalPack(mapped);
|
|
8852
|
+
const lanesToFit = Number.isFinite(effectiveMaxLanesPerRow) ? Math.max(1, Math.min(laneCount, effectiveMaxLanesPerRow)) : Math.max(1, laneCount);
|
|
8853
|
+
const needed = lanePaddingY * 2 + lanesToFit * eventHeight + laneGap * Math.max(0, lanesToFit - 1);
|
|
8854
|
+
const next = typeof maxRowHeight2 === "number" && Number.isFinite(maxRowHeight2) && maxRowHeight2 > 0 ? Math.min(needed, maxRowHeight2) : needed;
|
|
8855
|
+
out.set(resourceId, next);
|
|
8856
|
+
}
|
|
8857
|
+
return out;
|
|
8858
|
+
}, [autoRowHeightCfg, eventHeight, eventsByResource, laneGap, lanePaddingY, slotStarts, slots.length, effectiveMaxLanesPerRow]);
|
|
8826
8859
|
const getResourceRowHeight = React28.useCallback(
|
|
8827
8860
|
(resourceId) => {
|
|
8828
8861
|
const h = activeRowHeights[resourceId];
|
|
8829
|
-
|
|
8830
|
-
|
|
8862
|
+
const base = typeof h === "number" && Number.isFinite(h) && h > 0 ? h : effectiveRowHeight;
|
|
8863
|
+
const auto = autoRowHeightsByResource?.get(resourceId);
|
|
8864
|
+
if (typeof auto === "number" && Number.isFinite(auto) && auto > 0) return Math.max(base, auto);
|
|
8865
|
+
return base;
|
|
8831
8866
|
},
|
|
8832
|
-
[activeRowHeights, effectiveRowHeight]
|
|
8867
|
+
[activeRowHeights, autoRowHeightsByResource, effectiveRowHeight]
|
|
8833
8868
|
);
|
|
8834
8869
|
const setRowHeightForResource = React28.useCallback(
|
|
8835
8870
|
(resourceId, height) => {
|
|
@@ -8962,10 +8997,6 @@ function CalendarTimeline({
|
|
|
8962
8997
|
const fmt = getDtf(resolvedLocale, resolvedTimeZone, { weekday: "long", year: "numeric", month: "long", day: "numeric" });
|
|
8963
8998
|
return fmt.format(range.start);
|
|
8964
8999
|
}, [activeDate, activeView, formatters, l.week, range.end, range.start, resolvedLocale, resolvedTimeZone]);
|
|
8965
|
-
const densityClass = sizeConfig.densityClass;
|
|
8966
|
-
const eventHeight = sizeConfig.eventHeight;
|
|
8967
|
-
const laneGap = sizeConfig.laneGap;
|
|
8968
|
-
const lanePaddingY = sizeConfig.lanePaddingY;
|
|
8969
9000
|
const createMode = interactions?.createMode ?? "drag";
|
|
8970
9001
|
const canCreate = !isViewOnly && (interactions?.creatable ?? false) && !!onCreateEvent;
|
|
8971
9002
|
const [createOpen, setCreateOpen] = React28.useState(false);
|
|
@@ -9350,10 +9381,10 @@ function CalendarTimeline({
|
|
|
9350
9381
|
return { ev: { ...ev, _start: s, _end: e }, startIdx, endIdx };
|
|
9351
9382
|
});
|
|
9352
9383
|
const { packed, laneCount } = intervalPack(mapped);
|
|
9353
|
-
const visible = packed.filter((p) => p.lane <
|
|
9354
|
-
const hidden = packed.filter((p) => p.lane >=
|
|
9384
|
+
const visible = packed.filter((p) => p.lane < effectiveMaxLanesPerRow);
|
|
9385
|
+
const hidden = packed.filter((p) => p.lane >= effectiveMaxLanesPerRow);
|
|
9355
9386
|
const rowHeightPx = getResourceRowHeight(resourceId);
|
|
9356
|
-
const visibleLaneCount = Math.max(1, Math.min(laneCount,
|
|
9387
|
+
const visibleLaneCount = Math.max(1, Math.min(laneCount, effectiveMaxLanesPerRow));
|
|
9357
9388
|
const available = Math.max(0, rowHeightPx - lanePaddingY * 2 - laneGap * Math.max(0, visibleLaneCount - 1));
|
|
9358
9389
|
const fitPerLane = visibleLaneCount > 0 ? Math.floor(available / visibleLaneCount) : eventHeight;
|
|
9359
9390
|
const perLaneHeight = Math.max(9, Math.min(eventHeight, fitPerLane || eventHeight));
|
|
@@ -9371,7 +9402,7 @@ function CalendarTimeline({
|
|
|
9371
9402
|
});
|
|
9372
9403
|
}
|
|
9373
9404
|
return map;
|
|
9374
|
-
}, [eventsByResource, getResourceRowHeight, laneGap, lanePaddingY, slotStarts, slots.length, slotWidth,
|
|
9405
|
+
}, [eventsByResource, getResourceRowHeight, laneGap, lanePaddingY, slotStarts, slots.length, slotWidth, effectiveMaxLanesPerRow, preview, eventHeight]);
|
|
9375
9406
|
return /* @__PURE__ */ jsxs31(
|
|
9376
9407
|
"div",
|
|
9377
9408
|
{
|