aboutsummaryrefslogtreecommitdiffstats
path: root/library/fullcalendar/packages/daygrid/index.global.js
diff options
context:
space:
mode:
Diffstat (limited to 'library/fullcalendar/packages/daygrid/index.global.js')
-rw-r--r--library/fullcalendar/packages/daygrid/index.global.js99
1 files changed, 62 insertions, 37 deletions
diff --git a/library/fullcalendar/packages/daygrid/index.global.js b/library/fullcalendar/packages/daygrid/index.global.js
index 2f96df948..feebff044 100644
--- a/library/fullcalendar/packages/daygrid/index.global.js
+++ b/library/fullcalendar/packages/daygrid/index.global.js
@@ -1,5 +1,5 @@
/*!
-FullCalendar Day Grid Plugin v6.1.8
+FullCalendar Day Grid Plugin v6.1.11
Docs & License: https://fullcalendar.io/docs/month-view
(c) 2023 Adam Shaw
*/
@@ -262,9 +262,22 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
(dateEnv.getDay(date) === 1 && date.valueOf() < currentEnd.valueOf()));
}
+ function generateSegKey(seg) {
+ return seg.eventRange.instance.instanceId + ':' + seg.firstCol;
+ }
+ function generateSegUid(seg) {
+ return generateSegKey(seg) + ':' + seg.lastCol;
+ }
function computeFgSegPlacement(segs, // assumed already sorted
- dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) {
- let hierarchy = new DayGridSegHierarchy();
+ dayMaxEvents, dayMaxEventRows, strictOrder, segHeights, maxContentHeight, cells) {
+ let hierarchy = new DayGridSegHierarchy((segEntry) => {
+ // TODO: more DRY with generateSegUid
+ let segUid = segs[segEntry.index].eventRange.instance.instanceId +
+ ':' + segEntry.span.start +
+ ':' + (segEntry.span.end - 1);
+ // if no thickness known, assume 1 (if 0, so small it always fits)
+ return segHeights[segUid] || 1;
+ });
hierarchy.allowReslicing = true;
hierarchy.strictOrder = strictOrder;
if (dayMaxEvents === true || dayMaxEventRows === true) {
@@ -283,12 +296,11 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
let unknownHeightSegs = [];
for (let i = 0; i < segs.length; i += 1) {
let seg = segs[i];
- let { instanceId } = seg.eventRange.instance;
- let eventHeight = eventInstanceHeights[instanceId];
+ let segUid = generateSegUid(seg);
+ let eventHeight = segHeights[segUid];
if (eventHeight != null) {
segInputs.push({
index: i,
- thickness: eventHeight,
span: {
start: seg.firstCol,
end: seg.lastCol + 1,
@@ -466,16 +478,20 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
handleInvalidInsertion(insertion, entry, hiddenEntries) {
const { entriesByLevel, forceHidden } = this;
const { touchingEntry, touchingLevel, touchingLateral } = insertion;
+ // the entry that the new insertion is touching must be hidden
if (this.hiddenConsumes && touchingEntry) {
const touchingEntryId = internal$1.buildEntryKey(touchingEntry);
- // if not already hidden
if (!forceHidden[touchingEntryId]) {
if (this.allowReslicing) {
- const placeholderEntry = Object.assign(Object.assign({}, touchingEntry), { span: internal$1.intersectSpans(touchingEntry.span, entry.span) });
- const placeholderEntryId = internal$1.buildEntryKey(placeholderEntry);
- forceHidden[placeholderEntryId] = true;
- entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder
- this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it
+ // split up the touchingEntry, reinsert it
+ const hiddenEntry = Object.assign(Object.assign({}, touchingEntry), { span: internal$1.intersectSpans(touchingEntry.span, entry.span) });
+ // reinsert the area that turned into a "more" link (so no other entries try to
+ // occupy the space) but mark it forced-hidden
+ const hiddenEntryId = internal$1.buildEntryKey(hiddenEntry);
+ forceHidden[hiddenEntryId] = true;
+ entriesByLevel[touchingLevel][touchingLateral] = hiddenEntry;
+ hiddenEntries.push(hiddenEntry);
+ this.splitEntry(touchingEntry, entry, hiddenEntries);
}
else {
forceHidden[touchingEntryId] = true;
@@ -483,7 +499,8 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
}
}
}
- return super.handleInvalidInsertion(insertion, entry, hiddenEntries);
+ // will try to reslice...
+ super.handleInvalidInsertion(insertion, entry, hiddenEntries);
}
}
@@ -498,7 +515,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
this.state = {
framePositions: null,
maxContentHeight: null,
- eventInstanceHeights: {},
+ segHeights: {},
};
this.handleResize = (isForced) => {
if (isForced) {
@@ -514,7 +531,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
let bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt);
let highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt);
let mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt);
- let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(internal$1.sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells);
+ let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(internal$1.sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.segHeights, state.maxContentHeight, props.cells);
let isForcedInvisible = // TODO: messy way to compute this
(props.eventDrag && props.eventDrag.affectedInstances) ||
(props.eventResize && props.eventResize.affectedInstances) ||
@@ -573,7 +590,6 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
for (let placement of segPlacements) {
let { seg } = placement;
let { instanceId } = seg.eventRange.instance;
- let key = instanceId + ':' + col;
let isVisible = placement.isVisible && !isForcedInvisible[instanceId];
let isAbsolute = placement.isAbsolute;
let left = '';
@@ -592,7 +608,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
known bug: events that are force to be list-item but span multiple days still take up space in later columns
todo: in print view, for multi-day events, don't display title within non-start/end segs
*/
- nodes.push(preact.createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: {
+ nodes.push(preact.createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: generateSegKey(seg), ref: isMirror ? null : this.segHarnessRefs.createRef(generateSegUid(seg)), style: {
visibility: isVisible ? '' : 'hidden',
marginTop: isAbsolute ? '' : placement.marginTop,
top: isAbsolute ? placement.absoluteTop : '',
@@ -643,28 +659,27 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
}
}
}
- const oldInstanceHeights = this.state.eventInstanceHeights;
- const newInstanceHeights = this.queryEventInstanceHeights();
+ const oldSegHeights = this.state.segHeights;
+ const newSegHeights = this.querySegHeights();
const limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true;
this.safeSetState({
// HACK to prevent oscillations of events being shown/hidden from max-event-rows
// Essentially, once you compute an element's height, never null-out.
// TODO: always display all events, as visibility:hidden?
- eventInstanceHeights: Object.assign(Object.assign({}, oldInstanceHeights), newInstanceHeights),
+ segHeights: Object.assign(Object.assign({}, oldSegHeights), newSegHeights),
maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null,
});
}
}
- queryEventInstanceHeights() {
+ querySegHeights() {
let segElMap = this.segHarnessRefs.currentMap;
- let eventInstanceHeights = {};
+ let segHeights = {};
// get the max height amongst instance segs
- for (let key in segElMap) {
- let height = Math.round(segElMap[key].getBoundingClientRect().height);
- let instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key
- eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height);
+ for (let segUid in segElMap) {
+ let height = Math.round(segElMap[segUid].getBoundingClientRect().height);
+ segHeights[segUid] = Math.max(segHeights[segUid] || 0, height);
}
- return eventInstanceHeights;
+ return segHeights;
}
computeMaxContentHeight() {
let firstKey = this.props.cells[0].key;
@@ -678,7 +693,7 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
}
}
TableRow.addStateEquality({
- eventInstanceHeights: internal$1.isPropsEqual,
+ segHeights: internal$1.isPropsEqual,
});
function buildMirrorPlacements(mirrorSegs, colPlacements) {
if (!mirrorSegs.length) {
@@ -734,15 +749,25 @@ FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
, showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: props.dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, cellMinHeight: cellMinHeight, forPrint: props.forPrint })))))));
}
componentDidMount() {
- // HACK: need a daygrid wrapper parent to do positioning
- // NOTE: a daygrid resource view w/o resources can have zero cells
- const firstCellEl = this.rowRefs.currentMap[0].getCellEls()[0];
- this.rootEl = firstCellEl ? firstCellEl.closest('.fc-daygrid-body') : null;
- if (this.rootEl) {
- this.context.registerInteractiveComponent(this, {
- el: this.rootEl,
- isHitComboAllowed: this.props.isHitComboAllowed,
- });
+ this.registerInteractiveComponent();
+ }
+ componentDidUpdate() {
+ // for if started with zero cells
+ this.registerInteractiveComponent();
+ }
+ registerInteractiveComponent() {
+ if (!this.rootEl) {
+ // HACK: need a daygrid wrapper parent to do positioning
+ // NOTE: a daygrid resource view w/o resources can have zero cells
+ const firstCellEl = this.rowRefs.currentMap[0].getCellEls()[0];
+ const rootEl = firstCellEl ? firstCellEl.closest('.fc-daygrid-body') : null;
+ if (rootEl) {
+ this.rootEl = rootEl;
+ this.context.registerInteractiveComponent(this, {
+ el: rootEl,
+ isHitComboAllowed: this.props.isHitComboAllowed,
+ });
+ }
}
}
componentWillUnmount() {