chunk-INZMDDGR.js 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043
  1. import {
  2. BaseComponent,
  3. BgEvent,
  4. DateComponent,
  5. DateProfileGenerator,
  6. DayCellContainer,
  7. DayHeader,
  8. DaySeriesModel,
  9. DayTableModel,
  10. EventContainer,
  11. MoreLinkContainer,
  12. NowTimer,
  13. PositionCache,
  14. RefMap,
  15. SegHierarchy,
  16. SimpleScrollGrid,
  17. Slicer,
  18. StandardEvent,
  19. ViewContainer,
  20. WeekNumberContainer,
  21. addDays,
  22. addMs,
  23. addWeeks,
  24. buildEntryKey,
  25. buildEventRangeKey,
  26. buildNavLinkAttrs,
  27. buildSegTimeText,
  28. createFormatter,
  29. diffWeeks,
  30. formatDayString,
  31. formatIsoMonthStr,
  32. getSegAnchorAttrs,
  33. getSegMeta,
  34. getStickyFooterScrollbar,
  35. getStickyHeaderDates,
  36. getUniqueDomId,
  37. hasCustomDayCellContent,
  38. injectStyles,
  39. intersectRanges,
  40. intersectSpans,
  41. isPropsEqual,
  42. memoize,
  43. renderFill,
  44. renderScrollShim,
  45. setRef,
  46. sortEventSegs
  47. } from "./chunk-QH2VTIUN.js";
  48. import {
  49. _,
  50. d,
  51. y
  52. } from "./chunk-PTVH4XAB.js";
  53. // node_modules/.pnpm/@fullcalendar+daygrid@6.1.14_@fullcalendar+core@6.1.14/node_modules/@fullcalendar/daygrid/internal.js
  54. var TableView = class extends DateComponent {
  55. constructor() {
  56. super(...arguments);
  57. this.headerElRef = d();
  58. }
  59. renderSimpleLayout(headerRowContent, bodyContent) {
  60. let { props, context } = this;
  61. let sections = [];
  62. let stickyHeaderDates = getStickyHeaderDates(context.options);
  63. if (headerRowContent) {
  64. sections.push({
  65. type: "header",
  66. key: "header",
  67. isSticky: stickyHeaderDates,
  68. chunk: {
  69. elRef: this.headerElRef,
  70. tableClassName: "fc-col-header",
  71. rowContent: headerRowContent
  72. }
  73. });
  74. }
  75. sections.push({
  76. type: "body",
  77. key: "body",
  78. liquid: true,
  79. chunk: { content: bodyContent }
  80. });
  81. return y(
  82. ViewContainer,
  83. { elClasses: ["fc-daygrid"], viewSpec: context.viewSpec },
  84. y(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [], sections })
  85. );
  86. }
  87. renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) {
  88. let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
  89. if (!ScrollGrid) {
  90. throw new Error("No ScrollGrid implementation");
  91. }
  92. let { props, context } = this;
  93. let stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
  94. let stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
  95. let sections = [];
  96. if (headerRowContent) {
  97. sections.push({
  98. type: "header",
  99. key: "header",
  100. isSticky: stickyHeaderDates,
  101. chunks: [{
  102. key: "main",
  103. elRef: this.headerElRef,
  104. tableClassName: "fc-col-header",
  105. rowContent: headerRowContent
  106. }]
  107. });
  108. }
  109. sections.push({
  110. type: "body",
  111. key: "body",
  112. liquid: true,
  113. chunks: [{
  114. key: "main",
  115. content: bodyContent
  116. }]
  117. });
  118. if (stickyFooterScrollbar) {
  119. sections.push({
  120. type: "footer",
  121. key: "footer",
  122. isSticky: true,
  123. chunks: [{
  124. key: "main",
  125. content: renderScrollShim
  126. }]
  127. });
  128. }
  129. return y(
  130. ViewContainer,
  131. { elClasses: ["fc-daygrid"], viewSpec: context.viewSpec },
  132. y(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, forPrint: props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections })
  133. );
  134. }
  135. };
  136. function splitSegsByRow(segs, rowCnt) {
  137. let byRow = [];
  138. for (let i = 0; i < rowCnt; i += 1) {
  139. byRow[i] = [];
  140. }
  141. for (let seg of segs) {
  142. byRow[seg.row].push(seg);
  143. }
  144. return byRow;
  145. }
  146. function splitSegsByFirstCol(segs, colCnt) {
  147. let byCol = [];
  148. for (let i = 0; i < colCnt; i += 1) {
  149. byCol[i] = [];
  150. }
  151. for (let seg of segs) {
  152. byCol[seg.firstCol].push(seg);
  153. }
  154. return byCol;
  155. }
  156. function splitInteractionByRow(ui, rowCnt) {
  157. let byRow = [];
  158. if (!ui) {
  159. for (let i = 0; i < rowCnt; i += 1) {
  160. byRow[i] = null;
  161. }
  162. } else {
  163. for (let i = 0; i < rowCnt; i += 1) {
  164. byRow[i] = {
  165. affectedInstances: ui.affectedInstances,
  166. isEvent: ui.isEvent,
  167. segs: []
  168. };
  169. }
  170. for (let seg of ui.segs) {
  171. byRow[seg.row].segs.push(seg);
  172. }
  173. }
  174. return byRow;
  175. }
  176. var DEFAULT_TABLE_EVENT_TIME_FORMAT = createFormatter({
  177. hour: "numeric",
  178. minute: "2-digit",
  179. omitZeroMinute: true,
  180. meridiem: "narrow"
  181. });
  182. function hasListItemDisplay(seg) {
  183. let { display } = seg.eventRange.ui;
  184. return display === "list-item" || display === "auto" && !seg.eventRange.def.allDay && seg.firstCol === seg.lastCol && // can't be multi-day
  185. seg.isStart && // "
  186. seg.isEnd;
  187. }
  188. var TableBlockEvent = class extends BaseComponent {
  189. render() {
  190. let { props } = this;
  191. return y(StandardEvent, Object.assign({}, props, { elClasses: ["fc-daygrid-event", "fc-daygrid-block-event", "fc-h-event"], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay }));
  192. }
  193. };
  194. var TableListItemEvent = class extends BaseComponent {
  195. render() {
  196. let { props, context } = this;
  197. let { options } = context;
  198. let { seg } = props;
  199. let timeFormat = options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT;
  200. let timeText = buildSegTimeText(seg, timeFormat, context, true, props.defaultDisplayEventEnd);
  201. return y(EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ["fc-daygrid-event", "fc-daygrid-dot-event"], elAttrs: getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent, timeText, isResizing: false, isDateSelecting: false }));
  202. }
  203. };
  204. function renderInnerContent(renderProps) {
  205. return y(
  206. _,
  207. null,
  208. y("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }),
  209. renderProps.timeText && y("div", { className: "fc-event-time" }, renderProps.timeText),
  210. y("div", { className: "fc-event-title" }, renderProps.event.title || y(_, null, " "))
  211. );
  212. }
  213. var TableCellMoreLink = class extends BaseComponent {
  214. constructor() {
  215. super(...arguments);
  216. this.compileSegs = memoize(compileSegs);
  217. }
  218. render() {
  219. let { props } = this;
  220. let { allSegs, invisibleSegs } = this.compileSegs(props.singlePlacements);
  221. return y(MoreLinkContainer, { elClasses: ["fc-daygrid-more-link"], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => {
  222. let isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || (props.eventResize ? props.eventResize.affectedInstances : null) || {};
  223. return y(_, null, allSegs.map((seg) => {
  224. let instanceId = seg.eventRange.instance.instanceId;
  225. return y("div", { className: "fc-daygrid-event-harness", key: instanceId, style: {
  226. visibility: isForcedInvisible[instanceId] ? "hidden" : ""
  227. } }, hasListItemDisplay(seg) ? y(TableListItemEvent, Object.assign({ seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange))) : y(TableBlockEvent, Object.assign({ seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, getSegMeta(seg, props.todayRange))));
  228. }));
  229. } });
  230. }
  231. };
  232. function compileSegs(singlePlacements) {
  233. let allSegs = [];
  234. let invisibleSegs = [];
  235. for (let placement of singlePlacements) {
  236. allSegs.push(placement.seg);
  237. if (!placement.isVisible) {
  238. invisibleSegs.push(placement.seg);
  239. }
  240. }
  241. return { allSegs, invisibleSegs };
  242. }
  243. var DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week: "narrow" });
  244. var TableCell = class extends DateComponent {
  245. constructor() {
  246. super(...arguments);
  247. this.rootElRef = d();
  248. this.state = {
  249. dayNumberId: getUniqueDomId()
  250. };
  251. this.handleRootEl = (el) => {
  252. setRef(this.rootElRef, el);
  253. setRef(this.props.elRef, el);
  254. };
  255. }
  256. render() {
  257. let { context, props, state, rootElRef } = this;
  258. let { options, dateEnv } = context;
  259. let { date, dateProfile } = props;
  260. const isMonthStart = props.showDayNumber && shouldDisplayMonthStart(date, dateProfile.currentRange, dateEnv);
  261. return y(DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [
  262. "fc-daygrid-day",
  263. ...props.extraClassNames || []
  264. ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), props.showDayNumber ? { "aria-labelledby": state.dayNumberId } : {}), { role: "gridcell" }), defaultGenerator: renderTopInner, date, dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, isMonthStart, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => y(
  265. "div",
  266. { ref: props.innerElRef, className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", style: { minHeight: props.minHeight } },
  267. props.showWeekNumber && y(WeekNumberContainer, { elTag: "a", elClasses: ["fc-daygrid-week-number"], elAttrs: buildNavLinkAttrs(context, date, "week"), date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }),
  268. !renderProps.isDisabled && (props.showDayNumber || hasCustomDayCellContent(options) || props.forceDayTop) ? y(
  269. "div",
  270. { className: "fc-daygrid-day-top" },
  271. y(InnerContent, { elTag: "a", elClasses: [
  272. "fc-daygrid-day-number",
  273. isMonthStart && "fc-daygrid-month-start"
  274. ], elAttrs: Object.assign(Object.assign({}, buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) })
  275. ) : props.showDayNumber ? (
  276. // for creating correct amount of space (see issue #7162)
  277. y(
  278. "div",
  279. { className: "fc-daygrid-day-top", style: { visibility: "hidden" } },
  280. y("a", { className: "fc-daygrid-day-number" }, " ")
  281. )
  282. ) : void 0,
  283. y(
  284. "div",
  285. { className: "fc-daygrid-day-events", ref: props.fgContentElRef },
  286. props.fgContent,
  287. y(
  288. "div",
  289. { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } },
  290. y(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange })
  291. )
  292. ),
  293. y("div", { className: "fc-daygrid-day-bg" }, props.bgContent)
  294. ));
  295. }
  296. };
  297. function renderTopInner(props) {
  298. return props.dayNumberText || y(_, null, " ");
  299. }
  300. function shouldDisplayMonthStart(date, currentRange, dateEnv) {
  301. const { start: currentStart, end: currentEnd } = currentRange;
  302. const currentEndIncl = addMs(currentEnd, -1);
  303. const currentFirstYear = dateEnv.getYear(currentStart);
  304. const currentFirstMonth = dateEnv.getMonth(currentStart);
  305. const currentLastYear = dateEnv.getYear(currentEndIncl);
  306. const currentLastMonth = dateEnv.getMonth(currentEndIncl);
  307. return !(currentFirstYear === currentLastYear && currentFirstMonth === currentLastMonth) && Boolean(
  308. // first date in current view?
  309. date.valueOf() === currentStart.valueOf() || // a month-start that's within the current range?
  310. dateEnv.getDay(date) === 1 && date.valueOf() < currentEnd.valueOf()
  311. );
  312. }
  313. function generateSegKey(seg) {
  314. return seg.eventRange.instance.instanceId + ":" + seg.firstCol;
  315. }
  316. function generateSegUid(seg) {
  317. return generateSegKey(seg) + ":" + seg.lastCol;
  318. }
  319. function computeFgSegPlacement(segs, dayMaxEvents, dayMaxEventRows, strictOrder, segHeights, maxContentHeight, cells) {
  320. let hierarchy = new DayGridSegHierarchy((segEntry) => {
  321. let segUid = segs[segEntry.index].eventRange.instance.instanceId + ":" + segEntry.span.start + ":" + (segEntry.span.end - 1);
  322. return segHeights[segUid] || 1;
  323. });
  324. hierarchy.allowReslicing = true;
  325. hierarchy.strictOrder = strictOrder;
  326. if (dayMaxEvents === true || dayMaxEventRows === true) {
  327. hierarchy.maxCoord = maxContentHeight;
  328. hierarchy.hiddenConsumes = true;
  329. } else if (typeof dayMaxEvents === "number") {
  330. hierarchy.maxStackCnt = dayMaxEvents;
  331. } else if (typeof dayMaxEventRows === "number") {
  332. hierarchy.maxStackCnt = dayMaxEventRows;
  333. hierarchy.hiddenConsumes = true;
  334. }
  335. let segInputs = [];
  336. let unknownHeightSegs = [];
  337. for (let i = 0; i < segs.length; i += 1) {
  338. let seg = segs[i];
  339. let segUid = generateSegUid(seg);
  340. let eventHeight = segHeights[segUid];
  341. if (eventHeight != null) {
  342. segInputs.push({
  343. index: i,
  344. span: {
  345. start: seg.firstCol,
  346. end: seg.lastCol + 1
  347. }
  348. });
  349. } else {
  350. unknownHeightSegs.push(seg);
  351. }
  352. }
  353. let hiddenEntries = hierarchy.addSegs(segInputs);
  354. let segRects = hierarchy.toRects();
  355. let { singleColPlacements, multiColPlacements, leftoverMargins } = placeRects(segRects, segs, cells);
  356. let moreCnts = [];
  357. let moreMarginTops = [];
  358. for (let seg of unknownHeightSegs) {
  359. multiColPlacements[seg.firstCol].push({
  360. seg,
  361. isVisible: false,
  362. isAbsolute: true,
  363. absoluteTop: 0,
  364. marginTop: 0
  365. });
  366. for (let col = seg.firstCol; col <= seg.lastCol; col += 1) {
  367. singleColPlacements[col].push({
  368. seg: resliceSeg(seg, col, col + 1, cells),
  369. isVisible: false,
  370. isAbsolute: false,
  371. absoluteTop: 0,
  372. marginTop: 0
  373. });
  374. }
  375. }
  376. for (let col = 0; col < cells.length; col += 1) {
  377. moreCnts.push(0);
  378. }
  379. for (let hiddenEntry of hiddenEntries) {
  380. let seg = segs[hiddenEntry.index];
  381. let hiddenSpan = hiddenEntry.span;
  382. multiColPlacements[hiddenSpan.start].push({
  383. seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells),
  384. isVisible: false,
  385. isAbsolute: true,
  386. absoluteTop: 0,
  387. marginTop: 0
  388. });
  389. for (let col = hiddenSpan.start; col < hiddenSpan.end; col += 1) {
  390. moreCnts[col] += 1;
  391. singleColPlacements[col].push({
  392. seg: resliceSeg(seg, col, col + 1, cells),
  393. isVisible: false,
  394. isAbsolute: false,
  395. absoluteTop: 0,
  396. marginTop: 0
  397. });
  398. }
  399. }
  400. for (let col = 0; col < cells.length; col += 1) {
  401. moreMarginTops.push(leftoverMargins[col]);
  402. }
  403. return { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops };
  404. }
  405. function placeRects(allRects, segs, cells) {
  406. let rectsByEachCol = groupRectsByEachCol(allRects, cells.length);
  407. let singleColPlacements = [];
  408. let multiColPlacements = [];
  409. let leftoverMargins = [];
  410. for (let col = 0; col < cells.length; col += 1) {
  411. let rects = rectsByEachCol[col];
  412. let singlePlacements = [];
  413. let currentHeight = 0;
  414. let currentMarginTop = 0;
  415. for (let rect of rects) {
  416. let seg = segs[rect.index];
  417. singlePlacements.push({
  418. seg: resliceSeg(seg, col, col + 1, cells),
  419. isVisible: true,
  420. isAbsolute: false,
  421. absoluteTop: rect.levelCoord,
  422. marginTop: rect.levelCoord - currentHeight
  423. });
  424. currentHeight = rect.levelCoord + rect.thickness;
  425. }
  426. let multiPlacements = [];
  427. currentHeight = 0;
  428. currentMarginTop = 0;
  429. for (let rect of rects) {
  430. let seg = segs[rect.index];
  431. let isAbsolute = rect.span.end - rect.span.start > 1;
  432. let isFirstCol = rect.span.start === col;
  433. currentMarginTop += rect.levelCoord - currentHeight;
  434. currentHeight = rect.levelCoord + rect.thickness;
  435. if (isAbsolute) {
  436. currentMarginTop += rect.thickness;
  437. if (isFirstCol) {
  438. multiPlacements.push({
  439. seg: resliceSeg(seg, rect.span.start, rect.span.end, cells),
  440. isVisible: true,
  441. isAbsolute: true,
  442. absoluteTop: rect.levelCoord,
  443. marginTop: 0
  444. });
  445. }
  446. } else if (isFirstCol) {
  447. multiPlacements.push({
  448. seg: resliceSeg(seg, rect.span.start, rect.span.end, cells),
  449. isVisible: true,
  450. isAbsolute: false,
  451. absoluteTop: rect.levelCoord,
  452. marginTop: currentMarginTop
  453. // claim the margin
  454. });
  455. currentMarginTop = 0;
  456. }
  457. }
  458. singleColPlacements.push(singlePlacements);
  459. multiColPlacements.push(multiPlacements);
  460. leftoverMargins.push(currentMarginTop);
  461. }
  462. return { singleColPlacements, multiColPlacements, leftoverMargins };
  463. }
  464. function groupRectsByEachCol(rects, colCnt) {
  465. let rectsByEachCol = [];
  466. for (let col = 0; col < colCnt; col += 1) {
  467. rectsByEachCol.push([]);
  468. }
  469. for (let rect of rects) {
  470. for (let col = rect.span.start; col < rect.span.end; col += 1) {
  471. rectsByEachCol[col].push(rect);
  472. }
  473. }
  474. return rectsByEachCol;
  475. }
  476. function resliceSeg(seg, spanStart, spanEnd, cells) {
  477. if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) {
  478. return seg;
  479. }
  480. let eventRange = seg.eventRange;
  481. let origRange = eventRange.range;
  482. let slicedRange = intersectRanges(origRange, {
  483. start: cells[spanStart].date,
  484. end: addDays(cells[spanEnd - 1].date, 1)
  485. });
  486. return Object.assign(Object.assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: {
  487. def: eventRange.def,
  488. ui: Object.assign(Object.assign({}, eventRange.ui), { durationEditable: false }),
  489. instance: eventRange.instance,
  490. range: slicedRange
  491. }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() });
  492. }
  493. var DayGridSegHierarchy = class extends SegHierarchy {
  494. constructor() {
  495. super(...arguments);
  496. this.hiddenConsumes = false;
  497. this.forceHidden = {};
  498. }
  499. addSegs(segInputs) {
  500. const hiddenSegs = super.addSegs(segInputs);
  501. const { entriesByLevel } = this;
  502. const excludeHidden = (entry) => !this.forceHidden[buildEntryKey(entry)];
  503. for (let level = 0; level < entriesByLevel.length; level += 1) {
  504. entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden);
  505. }
  506. return hiddenSegs;
  507. }
  508. handleInvalidInsertion(insertion, entry, hiddenEntries) {
  509. const { entriesByLevel, forceHidden } = this;
  510. const { touchingEntry, touchingLevel, touchingLateral } = insertion;
  511. if (this.hiddenConsumes && touchingEntry) {
  512. const touchingEntryId = buildEntryKey(touchingEntry);
  513. if (!forceHidden[touchingEntryId]) {
  514. if (this.allowReslicing) {
  515. const hiddenEntry = Object.assign(Object.assign({}, touchingEntry), { span: intersectSpans(touchingEntry.span, entry.span) });
  516. const hiddenEntryId = buildEntryKey(hiddenEntry);
  517. forceHidden[hiddenEntryId] = true;
  518. entriesByLevel[touchingLevel][touchingLateral] = hiddenEntry;
  519. hiddenEntries.push(hiddenEntry);
  520. this.splitEntry(touchingEntry, entry, hiddenEntries);
  521. } else {
  522. forceHidden[touchingEntryId] = true;
  523. hiddenEntries.push(touchingEntry);
  524. }
  525. }
  526. }
  527. super.handleInvalidInsertion(insertion, entry, hiddenEntries);
  528. }
  529. };
  530. var TableRow = class extends DateComponent {
  531. constructor() {
  532. super(...arguments);
  533. this.cellElRefs = new RefMap();
  534. this.frameElRefs = new RefMap();
  535. this.fgElRefs = new RefMap();
  536. this.segHarnessRefs = new RefMap();
  537. this.rootElRef = d();
  538. this.state = {
  539. framePositions: null,
  540. maxContentHeight: null,
  541. segHeights: {}
  542. };
  543. this.handleResize = (isForced) => {
  544. if (isForced) {
  545. this.updateSizing(true);
  546. }
  547. };
  548. }
  549. render() {
  550. let { props, state, context } = this;
  551. let { options } = context;
  552. let colCnt = props.cells.length;
  553. let businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt);
  554. let bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt);
  555. let highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt);
  556. let mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt);
  557. let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.segHeights, state.maxContentHeight, props.cells);
  558. let isForcedInvisible = (
  559. // TODO: messy way to compute this
  560. props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}
  561. );
  562. return y(
  563. "tr",
  564. { ref: this.rootElRef, role: "row" },
  565. props.renderIntro && props.renderIntro(),
  566. props.cells.map((cell, col) => {
  567. let normalFgNodes = this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible);
  568. let mirrorFgNodes = this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false);
  569. return y(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: this.fgElRefs.createRef(cell.key), fgContent: (
  570. // Fragment scopes the keys
  571. y(
  572. _,
  573. null,
  574. y(_, null, normalFgNodes),
  575. y(_, null, mirrorFgNodes)
  576. )
  577. ), bgContent: (
  578. // Fragment scopes the keys
  579. y(
  580. _,
  581. null,
  582. this.renderFillSegs(highlightSegsByCol[col], "highlight"),
  583. this.renderFillSegs(businessHoursByCol[col], "non-business"),
  584. this.renderFillSegs(bgEventSegsByCol[col], "bg-event")
  585. )
  586. ), minHeight: props.cellMinHeight });
  587. })
  588. );
  589. }
  590. componentDidMount() {
  591. this.updateSizing(true);
  592. this.context.addResizeHandler(this.handleResize);
  593. }
  594. componentDidUpdate(prevProps, prevState) {
  595. let currentProps = this.props;
  596. this.updateSizing(!isPropsEqual(prevProps, currentProps));
  597. }
  598. componentWillUnmount() {
  599. this.context.removeResizeHandler(this.handleResize);
  600. }
  601. getHighlightSegs() {
  602. let { props } = this;
  603. if (props.eventDrag && props.eventDrag.segs.length) {
  604. return props.eventDrag.segs;
  605. }
  606. if (props.eventResize && props.eventResize.segs.length) {
  607. return props.eventResize.segs;
  608. }
  609. return props.dateSelectionSegs;
  610. }
  611. getMirrorSegs() {
  612. let { props } = this;
  613. if (props.eventResize && props.eventResize.segs.length) {
  614. return props.eventResize.segs;
  615. }
  616. return [];
  617. }
  618. renderFgSegs(col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) {
  619. let { context } = this;
  620. let { eventSelection } = this.props;
  621. let { framePositions } = this.state;
  622. let defaultDisplayEventEnd = this.props.cells.length === 1;
  623. let isMirror = isDragging || isResizing || isDateSelecting;
  624. let nodes = [];
  625. if (framePositions) {
  626. for (let placement of segPlacements) {
  627. let { seg } = placement;
  628. let { instanceId } = seg.eventRange.instance;
  629. let isVisible = placement.isVisible && !isForcedInvisible[instanceId];
  630. let isAbsolute = placement.isAbsolute;
  631. let left = "";
  632. let right = "";
  633. if (isAbsolute) {
  634. if (context.isRtl) {
  635. right = 0;
  636. left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol];
  637. } else {
  638. left = 0;
  639. right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol];
  640. }
  641. }
  642. nodes.push(y("div", { className: "fc-daygrid-event-harness" + (isAbsolute ? " fc-daygrid-event-harness-abs" : ""), key: generateSegKey(seg), ref: isMirror ? null : this.segHarnessRefs.createRef(generateSegUid(seg)), style: {
  643. visibility: isVisible ? "" : "hidden",
  644. marginTop: isAbsolute ? "" : placement.marginTop,
  645. top: isAbsolute ? placement.absoluteTop : "",
  646. left,
  647. right
  648. } }, hasListItemDisplay(seg) ? y(TableListItemEvent, Object.assign({ seg, isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd }, getSegMeta(seg, todayRange))) : y(TableBlockEvent, Object.assign({ seg, isDragging, isResizing, isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))));
  649. }
  650. }
  651. return nodes;
  652. }
  653. renderFillSegs(segs, fillType) {
  654. let { isRtl } = this.context;
  655. let { todayRange } = this.props;
  656. let { framePositions } = this.state;
  657. let nodes = [];
  658. if (framePositions) {
  659. for (let seg of segs) {
  660. let leftRightCss = isRtl ? {
  661. right: 0,
  662. left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]
  663. } : {
  664. left: 0,
  665. right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]
  666. };
  667. nodes.push(y("div", { key: buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === "bg-event" ? y(BgEvent, Object.assign({ seg }, getSegMeta(seg, todayRange))) : renderFill(fillType)));
  668. }
  669. }
  670. return y(_, {}, ...nodes);
  671. }
  672. updateSizing(isExternalSizingChange) {
  673. let { props, state, frameElRefs } = this;
  674. if (!props.forPrint && props.clientWidth !== null) {
  675. if (isExternalSizingChange) {
  676. let frameEls = props.cells.map((cell) => frameElRefs.currentMap[cell.key]);
  677. if (frameEls.length) {
  678. let originEl = this.rootElRef.current;
  679. let newPositionCache = new PositionCache(
  680. originEl,
  681. frameEls,
  682. true,
  683. // isHorizontal
  684. false
  685. );
  686. if (!state.framePositions || !state.framePositions.similarTo(newPositionCache)) {
  687. this.setState({
  688. framePositions: new PositionCache(
  689. originEl,
  690. frameEls,
  691. true,
  692. // isHorizontal
  693. false
  694. )
  695. });
  696. }
  697. }
  698. }
  699. const oldSegHeights = this.state.segHeights;
  700. const newSegHeights = this.querySegHeights();
  701. const limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true;
  702. this.safeSetState({
  703. // HACK to prevent oscillations of events being shown/hidden from max-event-rows
  704. // Essentially, once you compute an element's height, never null-out.
  705. // TODO: always display all events, as visibility:hidden?
  706. segHeights: Object.assign(Object.assign({}, oldSegHeights), newSegHeights),
  707. maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null
  708. });
  709. }
  710. }
  711. querySegHeights() {
  712. let segElMap = this.segHarnessRefs.currentMap;
  713. let segHeights = {};
  714. for (let segUid in segElMap) {
  715. let height = Math.round(segElMap[segUid].getBoundingClientRect().height);
  716. segHeights[segUid] = Math.max(segHeights[segUid] || 0, height);
  717. }
  718. return segHeights;
  719. }
  720. computeMaxContentHeight() {
  721. let firstKey = this.props.cells[0].key;
  722. let cellEl = this.cellElRefs.currentMap[firstKey];
  723. let fcContainerEl = this.fgElRefs.currentMap[firstKey];
  724. return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top;
  725. }
  726. getCellEls() {
  727. let elMap = this.cellElRefs.currentMap;
  728. return this.props.cells.map((cell) => elMap[cell.key]);
  729. }
  730. };
  731. TableRow.addStateEquality({
  732. segHeights: isPropsEqual
  733. });
  734. function buildMirrorPlacements(mirrorSegs, colPlacements) {
  735. if (!mirrorSegs.length) {
  736. return [];
  737. }
  738. let topsByInstanceId = buildAbsoluteTopHash(colPlacements);
  739. return mirrorSegs.map((seg) => ({
  740. seg,
  741. isVisible: true,
  742. isAbsolute: true,
  743. absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId],
  744. marginTop: 0
  745. }));
  746. }
  747. function buildAbsoluteTopHash(colPlacements) {
  748. let topsByInstanceId = {};
  749. for (let placements of colPlacements) {
  750. for (let placement of placements) {
  751. topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop;
  752. }
  753. }
  754. return topsByInstanceId;
  755. }
  756. var TableRows = class extends DateComponent {
  757. constructor() {
  758. super(...arguments);
  759. this.splitBusinessHourSegs = memoize(splitSegsByRow);
  760. this.splitBgEventSegs = memoize(splitSegsByRow);
  761. this.splitFgEventSegs = memoize(splitSegsByRow);
  762. this.splitDateSelectionSegs = memoize(splitSegsByRow);
  763. this.splitEventDrag = memoize(splitInteractionByRow);
  764. this.splitEventResize = memoize(splitInteractionByRow);
  765. this.rowRefs = new RefMap();
  766. }
  767. render() {
  768. let { props, context } = this;
  769. let rowCnt = props.cells.length;
  770. let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt);
  771. let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt);
  772. let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt);
  773. let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt);
  774. let eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt);
  775. let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt);
  776. let cellMinHeight = rowCnt >= 7 && props.clientWidth ? props.clientWidth / context.options.aspectRatio / 6 : null;
  777. return y(NowTimer, { unit: "day" }, (nowDate, todayRange) => y(_, null, props.cells.map((cells, row) => y(TableRow, {
  778. ref: this.rowRefs.createRef(row),
  779. key: cells.length ? cells[0].date.toISOString() : row,
  780. showDayNumbers: rowCnt > 1,
  781. showWeekNumbers: props.showWeekNumbers,
  782. todayRange,
  783. dateProfile: props.dateProfile,
  784. cells,
  785. renderIntro: props.renderRowIntro,
  786. businessHourSegs: businessHourSegsByRow[row],
  787. eventSelection: props.eventSelection,
  788. bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay),
  789. fgEventSegs: fgEventSegsByRow[row],
  790. dateSelectionSegs: dateSelectionSegsByRow[row],
  791. eventDrag: eventDragByRow[row],
  792. eventResize: eventResizeByRow[row],
  793. dayMaxEvents: props.dayMaxEvents,
  794. dayMaxEventRows: props.dayMaxEventRows,
  795. clientWidth: props.clientWidth,
  796. clientHeight: props.clientHeight,
  797. cellMinHeight,
  798. forPrint: props.forPrint
  799. }))));
  800. }
  801. componentDidMount() {
  802. this.registerInteractiveComponent();
  803. }
  804. componentDidUpdate() {
  805. this.registerInteractiveComponent();
  806. }
  807. registerInteractiveComponent() {
  808. if (!this.rootEl) {
  809. const firstCellEl = this.rowRefs.currentMap[0].getCellEls()[0];
  810. const rootEl = firstCellEl ? firstCellEl.closest(".fc-daygrid-body") : null;
  811. if (rootEl) {
  812. this.rootEl = rootEl;
  813. this.context.registerInteractiveComponent(this, {
  814. el: rootEl,
  815. isHitComboAllowed: this.props.isHitComboAllowed
  816. });
  817. }
  818. }
  819. }
  820. componentWillUnmount() {
  821. if (this.rootEl) {
  822. this.context.unregisterInteractiveComponent(this);
  823. this.rootEl = null;
  824. }
  825. }
  826. // Hit System
  827. // ----------------------------------------------------------------------------------------------------
  828. prepareHits() {
  829. this.rowPositions = new PositionCache(
  830. this.rootEl,
  831. this.rowRefs.collect().map((rowObj) => rowObj.getCellEls()[0]),
  832. // first cell el in each row. TODO: not optimal
  833. false,
  834. true
  835. );
  836. this.colPositions = new PositionCache(
  837. this.rootEl,
  838. this.rowRefs.currentMap[0].getCellEls(),
  839. // cell els in first row
  840. true,
  841. // horizontal
  842. false
  843. );
  844. }
  845. queryHit(positionLeft, positionTop) {
  846. let { colPositions, rowPositions } = this;
  847. let col = colPositions.leftToIndex(positionLeft);
  848. let row = rowPositions.topToIndex(positionTop);
  849. if (row != null && col != null) {
  850. let cell = this.props.cells[row][col];
  851. return {
  852. dateProfile: this.props.dateProfile,
  853. dateSpan: Object.assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan),
  854. dayEl: this.getCellEl(row, col),
  855. rect: {
  856. left: colPositions.lefts[col],
  857. right: colPositions.rights[col],
  858. top: rowPositions.tops[row],
  859. bottom: rowPositions.bottoms[row]
  860. },
  861. layer: 0
  862. };
  863. }
  864. return null;
  865. }
  866. getCellEl(row, col) {
  867. return this.rowRefs.currentMap[row].getCellEls()[col];
  868. }
  869. getCellRange(row, col) {
  870. let start = this.props.cells[row][col].date;
  871. let end = addDays(start, 1);
  872. return { start, end };
  873. }
  874. };
  875. function isSegAllDay(seg) {
  876. return seg.eventRange.def.allDay;
  877. }
  878. var Table = class extends DateComponent {
  879. constructor() {
  880. super(...arguments);
  881. this.elRef = d();
  882. this.needsScrollReset = false;
  883. }
  884. render() {
  885. let { props } = this;
  886. let { dayMaxEventRows, dayMaxEvents, expandRows } = props;
  887. let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true;
  888. if (limitViaBalanced && !expandRows) {
  889. limitViaBalanced = false;
  890. dayMaxEventRows = null;
  891. dayMaxEvents = null;
  892. }
  893. let classNames = [
  894. "fc-daygrid-body",
  895. limitViaBalanced ? "fc-daygrid-body-balanced" : "fc-daygrid-body-unbalanced",
  896. expandRows ? "" : "fc-daygrid-body-natural"
  897. // will height of one row depend on the others?
  898. ];
  899. return y(
  900. "div",
  901. { ref: this.elRef, className: classNames.join(" "), style: {
  902. // these props are important to give this wrapper correct dimensions for interactions
  903. // TODO: if we set it here, can we avoid giving to inner tables?
  904. width: props.clientWidth,
  905. minWidth: props.tableMinWidth
  906. } },
  907. y(
  908. "table",
  909. { role: "presentation", className: "fc-scrollgrid-sync-table", style: {
  910. width: props.clientWidth,
  911. minWidth: props.tableMinWidth,
  912. height: expandRows ? props.clientHeight : ""
  913. } },
  914. props.colGroupNode,
  915. y(
  916. "tbody",
  917. { role: "presentation" },
  918. y(TableRows, { dateProfile: props.dateProfile, cells: props.cells, renderRowIntro: props.renderRowIntro, showWeekNumbers: props.showWeekNumbers, clientWidth: props.clientWidth, clientHeight: props.clientHeight, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, dayMaxEvents, dayMaxEventRows, forPrint: props.forPrint, isHitComboAllowed: props.isHitComboAllowed })
  919. )
  920. )
  921. );
  922. }
  923. componentDidMount() {
  924. this.requestScrollReset();
  925. }
  926. componentDidUpdate(prevProps) {
  927. if (prevProps.dateProfile !== this.props.dateProfile) {
  928. this.requestScrollReset();
  929. } else {
  930. this.flushScrollReset();
  931. }
  932. }
  933. requestScrollReset() {
  934. this.needsScrollReset = true;
  935. this.flushScrollReset();
  936. }
  937. flushScrollReset() {
  938. if (this.needsScrollReset && this.props.clientWidth) {
  939. const subjectEl = getScrollSubjectEl(this.elRef.current, this.props.dateProfile);
  940. if (subjectEl) {
  941. const originEl = subjectEl.closest(".fc-daygrid-body");
  942. const scrollEl = originEl.closest(".fc-scroller");
  943. const scrollTop = subjectEl.getBoundingClientRect().top - originEl.getBoundingClientRect().top;
  944. scrollEl.scrollTop = scrollTop ? scrollTop + 1 : 0;
  945. }
  946. this.needsScrollReset = false;
  947. }
  948. }
  949. };
  950. function getScrollSubjectEl(containerEl, dateProfile) {
  951. let el;
  952. if (dateProfile.currentRangeUnit.match(/year|month/)) {
  953. el = containerEl.querySelector(`[data-date="${formatIsoMonthStr(dateProfile.currentDate)}-01"]`);
  954. }
  955. if (!el) {
  956. el = containerEl.querySelector(`[data-date="${formatDayString(dateProfile.currentDate)}"]`);
  957. }
  958. return el;
  959. }
  960. var DayTableSlicer = class extends Slicer {
  961. constructor() {
  962. super(...arguments);
  963. this.forceDayIfListItem = true;
  964. }
  965. sliceRange(dateRange, dayTableModel) {
  966. return dayTableModel.sliceRange(dateRange);
  967. }
  968. };
  969. var DayTable = class extends DateComponent {
  970. constructor() {
  971. super(...arguments);
  972. this.slicer = new DayTableSlicer();
  973. this.tableRef = d();
  974. }
  975. render() {
  976. let { props, context } = this;
  977. return y(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }));
  978. }
  979. };
  980. var DayTableView = class extends TableView {
  981. constructor() {
  982. super(...arguments);
  983. this.buildDayTableModel = memoize(buildDayTableModel);
  984. this.headerRef = d();
  985. this.tableRef = d();
  986. }
  987. render() {
  988. let { options, dateProfileGenerator } = this.context;
  989. let { props } = this;
  990. let dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator);
  991. let headerContent = options.dayHeaders && y(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 });
  992. let bodyContent = (contentArg) => y(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint });
  993. return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent);
  994. }
  995. };
  996. function buildDayTableModel(dateProfile, dateProfileGenerator) {
  997. let daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);
  998. return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
  999. }
  1000. var TableDateProfileGenerator = class extends DateProfileGenerator {
  1001. // Computes the date range that will be rendered
  1002. buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) {
  1003. let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay);
  1004. let { props } = this;
  1005. return buildDayTableRenderRange({
  1006. currentRange: renderRange,
  1007. snapToWeek: /^(year|month)$/.test(currentRangeUnit),
  1008. fixedWeekCount: props.fixedWeekCount,
  1009. dateEnv: props.dateEnv
  1010. });
  1011. }
  1012. };
  1013. function buildDayTableRenderRange(props) {
  1014. let { dateEnv, currentRange } = props;
  1015. let { start, end } = currentRange;
  1016. let endOfWeek;
  1017. if (props.snapToWeek) {
  1018. start = dateEnv.startOfWeek(start);
  1019. endOfWeek = dateEnv.startOfWeek(end);
  1020. if (endOfWeek.valueOf() !== end.valueOf()) {
  1021. end = addWeeks(endOfWeek, 1);
  1022. }
  1023. }
  1024. if (props.fixedWeekCount) {
  1025. let lastMonthRenderStart = dateEnv.startOfWeek(dateEnv.startOfMonth(addDays(currentRange.end, -1)));
  1026. let rowCnt = Math.ceil(
  1027. // could be partial weeks due to hiddenDays
  1028. diffWeeks(lastMonthRenderStart, end)
  1029. );
  1030. end = addWeeks(end, 6 - rowCnt);
  1031. }
  1032. return { start, end };
  1033. }
  1034. var css_248z = ':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-month-start{font-size:1.1em;font-weight:700}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:0 2px}.fc .fc-daygrid-day-bottom:after,.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{border-radius:3px;cursor:pointer;line-height:1;margin-top:1px;max-width:100%;overflow:hidden;padding:2px;position:relative;white-space:nowrap;z-index:4}.fc .fc-daygrid-more-link:hover{background-color:rgba(0,0,0,.1)}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-more-link{float:left}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-more-link{float:right}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}';
  1035. injectStyles(css_248z);
  1036. export {
  1037. DayTable,
  1038. DayTableView,
  1039. TableDateProfileGenerator
  1040. };
  1041. //# sourceMappingURL=chunk-INZMDDGR.js.map