main.js 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639
  1. /*!
  2. FullCalendar Day Grid Plugin v4.2.0
  3. Docs & License: https://fullcalendar.io/
  4. (c) 2019 Adam Shaw
  5. */
  6. (function (global, factory) {
  7. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
  8. typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
  9. (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar));
  10. }(this, function (exports, core) { 'use strict';
  11. /*! *****************************************************************************
  12. Copyright (c) Microsoft Corporation. All rights reserved.
  13. Licensed under the Apache License, Version 2.0 (the "License"); you may not use
  14. this file except in compliance with the License. You may obtain a copy of the
  15. License at http://www.apache.org/licenses/LICENSE-2.0
  16. THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  17. KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
  18. WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
  19. MERCHANTABLITY OR NON-INFRINGEMENT.
  20. See the Apache Version 2.0 License for specific language governing permissions
  21. and limitations under the License.
  22. ***************************************************************************** */
  23. /* global Reflect, Promise */
  24. var extendStatics = function(d, b) {
  25. extendStatics = Object.setPrototypeOf ||
  26. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  27. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  28. return extendStatics(d, b);
  29. };
  30. function __extends(d, b) {
  31. extendStatics(d, b);
  32. function __() { this.constructor = d; }
  33. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34. }
  35. var __assign = function() {
  36. __assign = Object.assign || function __assign(t) {
  37. for (var s, i = 1, n = arguments.length; i < n; i++) {
  38. s = arguments[i];
  39. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
  40. }
  41. return t;
  42. };
  43. return __assign.apply(this, arguments);
  44. };
  45. var DayGridDateProfileGenerator = /** @class */ (function (_super) {
  46. __extends(DayGridDateProfileGenerator, _super);
  47. function DayGridDateProfileGenerator() {
  48. return _super !== null && _super.apply(this, arguments) || this;
  49. }
  50. // Computes the date range that will be rendered.
  51. DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
  52. var dateEnv = this.dateEnv;
  53. var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
  54. var start = renderRange.start;
  55. var end = renderRange.end;
  56. var endOfWeek;
  57. // year and month views should be aligned with weeks. this is already done for week
  58. if (/^(year|month)$/.test(currentRangeUnit)) {
  59. start = dateEnv.startOfWeek(start);
  60. // make end-of-week if not already
  61. endOfWeek = dateEnv.startOfWeek(end);
  62. if (endOfWeek.valueOf() !== end.valueOf()) {
  63. end = core.addWeeks(endOfWeek, 1);
  64. }
  65. }
  66. // ensure 6 weeks
  67. if (this.options.monthMode &&
  68. this.options.fixedWeekCount) {
  69. var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
  70. core.diffWeeks(start, end));
  71. end = core.addWeeks(end, 6 - rowCnt);
  72. }
  73. return { start: start, end: end };
  74. };
  75. return DayGridDateProfileGenerator;
  76. }(core.DateProfileGenerator));
  77. /* A rectangular panel that is absolutely positioned over other content
  78. ------------------------------------------------------------------------------------------------------------------------
  79. Options:
  80. - className (string)
  81. - content (HTML string, element, or element array)
  82. - parentEl
  83. - top
  84. - left
  85. - right (the x coord of where the right edge should be. not a "CSS" right)
  86. - autoHide (boolean)
  87. - show (callback)
  88. - hide (callback)
  89. */
  90. var Popover = /** @class */ (function () {
  91. function Popover(options) {
  92. var _this = this;
  93. this.isHidden = true;
  94. this.margin = 10; // the space required between the popover and the edges of the scroll container
  95. // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
  96. this.documentMousedown = function (ev) {
  97. // only hide the popover if the click happened outside the popover
  98. if (_this.el && !_this.el.contains(ev.target)) {
  99. _this.hide();
  100. }
  101. };
  102. this.options = options;
  103. }
  104. // Shows the popover on the specified position. Renders it if not already
  105. Popover.prototype.show = function () {
  106. if (this.isHidden) {
  107. if (!this.el) {
  108. this.render();
  109. }
  110. this.el.style.display = '';
  111. this.position();
  112. this.isHidden = false;
  113. this.trigger('show');
  114. }
  115. };
  116. // Hides the popover, through CSS, but does not remove it from the DOM
  117. Popover.prototype.hide = function () {
  118. if (!this.isHidden) {
  119. this.el.style.display = 'none';
  120. this.isHidden = true;
  121. this.trigger('hide');
  122. }
  123. };
  124. // Creates `this.el` and renders content inside of it
  125. Popover.prototype.render = function () {
  126. var _this = this;
  127. var options = this.options;
  128. var el = this.el = core.createElement('div', {
  129. className: 'fc-popover ' + (options.className || ''),
  130. style: {
  131. top: '0',
  132. left: '0'
  133. }
  134. });
  135. if (typeof options.content === 'function') {
  136. options.content(el);
  137. }
  138. options.parentEl.appendChild(el);
  139. // when a click happens on anything inside with a 'fc-close' className, hide the popover
  140. core.listenBySelector(el, 'click', '.fc-close', function (ev) {
  141. _this.hide();
  142. });
  143. if (options.autoHide) {
  144. document.addEventListener('mousedown', this.documentMousedown);
  145. }
  146. };
  147. // Hides and unregisters any handlers
  148. Popover.prototype.destroy = function () {
  149. this.hide();
  150. if (this.el) {
  151. core.removeElement(this.el);
  152. this.el = null;
  153. }
  154. document.removeEventListener('mousedown', this.documentMousedown);
  155. };
  156. // Positions the popover optimally, using the top/left/right options
  157. Popover.prototype.position = function () {
  158. var options = this.options;
  159. var el = this.el;
  160. var elDims = el.getBoundingClientRect(); // only used for width,height
  161. var origin = core.computeRect(el.offsetParent);
  162. var clippingRect = core.computeClippingRect(options.parentEl);
  163. var top; // the "position" (not "offset") values for the popover
  164. var left; //
  165. // compute top and left
  166. top = options.top || 0;
  167. if (options.left !== undefined) {
  168. left = options.left;
  169. }
  170. else if (options.right !== undefined) {
  171. left = options.right - elDims.width; // derive the left value from the right value
  172. }
  173. else {
  174. left = 0;
  175. }
  176. // constrain to the view port. if constrained by two edges, give precedence to top/left
  177. top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
  178. top = Math.max(top, clippingRect.top + this.margin);
  179. left = Math.min(left, clippingRect.right - elDims.width - this.margin);
  180. left = Math.max(left, clippingRect.left + this.margin);
  181. core.applyStyle(el, {
  182. top: top - origin.top,
  183. left: left - origin.left
  184. });
  185. };
  186. // Triggers a callback. Calls a function in the option hash of the same name.
  187. // Arguments beyond the first `name` are forwarded on.
  188. // TODO: better code reuse for this. Repeat code
  189. // can kill this???
  190. Popover.prototype.trigger = function (name) {
  191. if (this.options[name]) {
  192. this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
  193. }
  194. };
  195. return Popover;
  196. }());
  197. /* Event-rendering methods for the DayGrid class
  198. ----------------------------------------------------------------------------------------------------------------------*/
  199. // "Simple" is bad a name. has nothing to do with SimpleDayGrid
  200. var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
  201. __extends(SimpleDayGridEventRenderer, _super);
  202. function SimpleDayGridEventRenderer() {
  203. return _super !== null && _super.apply(this, arguments) || this;
  204. }
  205. // Builds the HTML to be used for the default element for an individual segment
  206. SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
  207. var options = this.context.options;
  208. var eventRange = seg.eventRange;
  209. var eventDef = eventRange.def;
  210. var eventUi = eventRange.ui;
  211. var allDay = eventDef.allDay;
  212. var isDraggable = eventUi.startEditable;
  213. var isResizableFromStart = allDay && seg.isStart && eventUi.durationEditable && options.eventResizableFromStart;
  214. var isResizableFromEnd = allDay && seg.isEnd && eventUi.durationEditable;
  215. var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
  216. var skinCss = core.cssToStr(this.getSkinCss(eventUi));
  217. var timeHtml = '';
  218. var timeText;
  219. var titleHtml;
  220. classes.unshift('fc-day-grid-event', 'fc-h-event');
  221. // Only display a timed events time if it is the starting segment
  222. if (seg.isStart) {
  223. timeText = this.getTimeText(eventRange);
  224. if (timeText) {
  225. timeHtml = '<span class="fc-time">' + core.htmlEscape(timeText) + '</span>';
  226. }
  227. }
  228. titleHtml =
  229. '<span class="fc-title">' +
  230. (core.htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
  231. '</span>';
  232. return '<a class="' + classes.join(' ') + '"' +
  233. (eventDef.url ?
  234. ' href="' + core.htmlEscape(eventDef.url) + '"' :
  235. '') +
  236. (skinCss ?
  237. ' style="' + skinCss + '"' :
  238. '') +
  239. '>' +
  240. '<div class="fc-content">' +
  241. (options.dir === 'rtl' ?
  242. titleHtml + ' ' + timeHtml : // put a natural space in between
  243. timeHtml + ' ' + titleHtml //
  244. ) +
  245. '</div>' +
  246. (isResizableFromStart ?
  247. '<div class="fc-resizer fc-start-resizer"></div>' :
  248. '') +
  249. (isResizableFromEnd ?
  250. '<div class="fc-resizer fc-end-resizer"></div>' :
  251. '') +
  252. '</a>';
  253. };
  254. // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
  255. SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
  256. return {
  257. hour: 'numeric',
  258. minute: '2-digit',
  259. omitZeroMinute: true,
  260. meridiem: 'narrow'
  261. };
  262. };
  263. SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
  264. return false; // TODO: somehow consider the originating DayGrid's column count
  265. };
  266. return SimpleDayGridEventRenderer;
  267. }(core.FgEventRenderer));
  268. /* Event-rendering methods for the DayGrid class
  269. ----------------------------------------------------------------------------------------------------------------------*/
  270. var DayGridEventRenderer = /** @class */ (function (_super) {
  271. __extends(DayGridEventRenderer, _super);
  272. function DayGridEventRenderer(dayGrid) {
  273. var _this = _super.call(this, dayGrid.context) || this;
  274. _this.dayGrid = dayGrid;
  275. return _this;
  276. }
  277. // Renders the given foreground event segments onto the grid
  278. DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
  279. var rowStructs = this.rowStructs = this.renderSegRows(segs);
  280. // append to each row's content skeleton
  281. this.dayGrid.rowEls.forEach(function (rowNode, i) {
  282. rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
  283. });
  284. // removes the "more.." events popover
  285. if (!mirrorInfo) {
  286. this.dayGrid.removeSegPopover();
  287. }
  288. };
  289. // Unrenders all currently rendered foreground event segments
  290. DayGridEventRenderer.prototype.detachSegs = function () {
  291. var rowStructs = this.rowStructs || [];
  292. var rowStruct;
  293. while ((rowStruct = rowStructs.pop())) {
  294. core.removeElement(rowStruct.tbodyEl);
  295. }
  296. this.rowStructs = null;
  297. };
  298. // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
  299. // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
  300. // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
  301. DayGridEventRenderer.prototype.renderSegRows = function (segs) {
  302. var rowStructs = [];
  303. var segRows;
  304. var row;
  305. segRows = this.groupSegRows(segs); // group into nested arrays
  306. // iterate each row of segment groupings
  307. for (row = 0; row < segRows.length; row++) {
  308. rowStructs.push(this.renderSegRow(row, segRows[row]));
  309. }
  310. return rowStructs;
  311. };
  312. // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
  313. // the segments. Returns object with a bunch of internal data about how the render was calculated.
  314. // NOTE: modifies rowSegs
  315. DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
  316. var dayGrid = this.dayGrid;
  317. var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
  318. var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
  319. var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
  320. var tbody = document.createElement('tbody');
  321. var segMatrix = []; // lookup for which segments are rendered into which level+col cells
  322. var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
  323. var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
  324. var i;
  325. var levelSegs;
  326. var col;
  327. var tr;
  328. var j;
  329. var seg;
  330. var td;
  331. // populates empty cells from the current column (`col`) to `endCol`
  332. function emptyCellsUntil(endCol) {
  333. while (col < endCol) {
  334. // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
  335. td = (loneCellMatrix[i - 1] || [])[col];
  336. if (td) {
  337. td.rowSpan = (td.rowSpan || 1) + 1;
  338. }
  339. else {
  340. td = document.createElement('td');
  341. tr.appendChild(td);
  342. }
  343. cellMatrix[i][col] = td;
  344. loneCellMatrix[i][col] = td;
  345. col++;
  346. }
  347. }
  348. for (i = 0; i < levelCnt; i++) { // iterate through all levels
  349. levelSegs = segLevels[i];
  350. col = 0;
  351. tr = document.createElement('tr');
  352. segMatrix.push([]);
  353. cellMatrix.push([]);
  354. loneCellMatrix.push([]);
  355. // levelCnt might be 1 even though there are no actual levels. protect against this.
  356. // this single empty row is useful for styling.
  357. if (levelSegs) {
  358. for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
  359. seg = levelSegs[j];
  360. var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
  361. var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
  362. emptyCellsUntil(leftCol);
  363. // create a container that occupies or more columns. append the event element.
  364. td = core.createElement('td', { className: 'fc-event-container' }, seg.el);
  365. if (leftCol !== rightCol) {
  366. td.colSpan = rightCol - leftCol + 1;
  367. }
  368. else { // a single-column segment
  369. loneCellMatrix[i][col] = td;
  370. }
  371. while (col <= rightCol) {
  372. cellMatrix[i][col] = td;
  373. segMatrix[i][col] = seg;
  374. col++;
  375. }
  376. tr.appendChild(td);
  377. }
  378. }
  379. emptyCellsUntil(colCnt); // finish off the row
  380. var introHtml = dayGrid.renderProps.renderIntroHtml();
  381. if (introHtml) {
  382. if (dayGrid.isRtl) {
  383. core.appendToElement(tr, introHtml);
  384. }
  385. else {
  386. core.prependToElement(tr, introHtml);
  387. }
  388. }
  389. tbody.appendChild(tr);
  390. }
  391. return {
  392. row: row,
  393. tbodyEl: tbody,
  394. cellMatrix: cellMatrix,
  395. segMatrix: segMatrix,
  396. segLevels: segLevels,
  397. segs: rowSegs
  398. };
  399. };
  400. // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
  401. // NOTE: modifies segs
  402. DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
  403. var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt;
  404. var levels = [];
  405. var i;
  406. var seg;
  407. var j;
  408. // Give preference to elements with certain criteria, so they have
  409. // a chance to be closer to the top.
  410. segs = this.sortEventSegs(segs);
  411. for (i = 0; i < segs.length; i++) {
  412. seg = segs[i];
  413. // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
  414. for (j = 0; j < levels.length; j++) {
  415. if (!isDaySegCollision(seg, levels[j])) {
  416. break;
  417. }
  418. }
  419. // `j` now holds the desired subrow index
  420. seg.level = j;
  421. seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
  422. seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
  423. ;
  424. (levels[j] || (levels[j] = [])).push(seg);
  425. }
  426. // order segments left-to-right. very important if calendar is RTL
  427. for (j = 0; j < levels.length; j++) {
  428. levels[j].sort(compareDaySegCols);
  429. }
  430. return levels;
  431. };
  432. // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
  433. DayGridEventRenderer.prototype.groupSegRows = function (segs) {
  434. var segRows = [];
  435. var i;
  436. for (i = 0; i < this.dayGrid.rowCnt; i++) {
  437. segRows.push([]);
  438. }
  439. for (i = 0; i < segs.length; i++) {
  440. segRows[segs[i].row].push(segs[i]);
  441. }
  442. return segRows;
  443. };
  444. // Computes a default `displayEventEnd` value if one is not expliclty defined
  445. DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
  446. return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
  447. };
  448. return DayGridEventRenderer;
  449. }(SimpleDayGridEventRenderer));
  450. // Computes whether two segments' columns collide. They are assumed to be in the same row.
  451. function isDaySegCollision(seg, otherSegs) {
  452. var i;
  453. var otherSeg;
  454. for (i = 0; i < otherSegs.length; i++) {
  455. otherSeg = otherSegs[i];
  456. if (otherSeg.firstCol <= seg.lastCol &&
  457. otherSeg.lastCol >= seg.firstCol) {
  458. return true;
  459. }
  460. }
  461. return false;
  462. }
  463. // A cmp function for determining the leftmost event
  464. function compareDaySegCols(a, b) {
  465. return a.leftCol - b.leftCol;
  466. }
  467. var DayGridMirrorRenderer = /** @class */ (function (_super) {
  468. __extends(DayGridMirrorRenderer, _super);
  469. function DayGridMirrorRenderer() {
  470. return _super !== null && _super.apply(this, arguments) || this;
  471. }
  472. DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
  473. var sourceSeg = mirrorInfo.sourceSeg;
  474. var rowStructs = this.rowStructs = this.renderSegRows(segs);
  475. // inject each new event skeleton into each associated row
  476. this.dayGrid.rowEls.forEach(function (rowNode, row) {
  477. var skeletonEl = core.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
  478. var skeletonTopEl;
  479. var skeletonTop;
  480. // If there is an original segment, match the top position. Otherwise, put it at the row's top level
  481. if (sourceSeg && sourceSeg.row === row) {
  482. skeletonTopEl = sourceSeg.el;
  483. }
  484. else {
  485. skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
  486. if (!skeletonTopEl) { // when no events
  487. skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
  488. }
  489. }
  490. skeletonTop = skeletonTopEl.getBoundingClientRect().top -
  491. rowNode.getBoundingClientRect().top; // the offsetParent origin
  492. skeletonEl.style.top = skeletonTop + 'px';
  493. skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
  494. rowNode.appendChild(skeletonEl);
  495. });
  496. };
  497. return DayGridMirrorRenderer;
  498. }(DayGridEventRenderer));
  499. var DayGridFillRenderer = /** @class */ (function (_super) {
  500. __extends(DayGridFillRenderer, _super);
  501. function DayGridFillRenderer(dayGrid) {
  502. var _this = _super.call(this, dayGrid.context) || this;
  503. _this.fillSegTag = 'td'; // override the default tag name
  504. _this.dayGrid = dayGrid;
  505. return _this;
  506. }
  507. DayGridFillRenderer.prototype.renderSegs = function (type, segs) {
  508. // don't render timed background events
  509. if (type === 'bgEvent') {
  510. segs = segs.filter(function (seg) {
  511. return seg.eventRange.def.allDay;
  512. });
  513. }
  514. _super.prototype.renderSegs.call(this, type, segs);
  515. };
  516. DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
  517. var els = [];
  518. var i;
  519. var seg;
  520. var skeletonEl;
  521. for (i = 0; i < segs.length; i++) {
  522. seg = segs[i];
  523. skeletonEl = this.renderFillRow(type, seg);
  524. this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
  525. els.push(skeletonEl);
  526. }
  527. return els;
  528. };
  529. // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
  530. DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
  531. var dayGrid = this.dayGrid;
  532. var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
  533. var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
  534. var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
  535. var startCol = leftCol;
  536. var endCol = rightCol + 1;
  537. var className;
  538. var skeletonEl;
  539. var trEl;
  540. if (type === 'businessHours') {
  541. className = 'bgevent';
  542. }
  543. else {
  544. className = type.toLowerCase();
  545. }
  546. skeletonEl = core.htmlToElement('<div class="fc-' + className + '-skeleton">' +
  547. '<table><tr></tr></table>' +
  548. '</div>');
  549. trEl = skeletonEl.getElementsByTagName('tr')[0];
  550. if (startCol > 0) {
  551. core.appendToElement(trEl,
  552. // will create (startCol + 1) td's
  553. new Array(startCol + 1).join('<td></td>'));
  554. }
  555. seg.el.colSpan = endCol - startCol;
  556. trEl.appendChild(seg.el);
  557. if (endCol < colCnt) {
  558. core.appendToElement(trEl,
  559. // will create (colCnt - endCol) td's
  560. new Array(colCnt - endCol + 1).join('<td></td>'));
  561. }
  562. var introHtml = dayGrid.renderProps.renderIntroHtml();
  563. if (introHtml) {
  564. if (dayGrid.isRtl) {
  565. core.appendToElement(trEl, introHtml);
  566. }
  567. else {
  568. core.prependToElement(trEl, introHtml);
  569. }
  570. }
  571. return skeletonEl;
  572. };
  573. return DayGridFillRenderer;
  574. }(core.FillRenderer));
  575. var DayTile = /** @class */ (function (_super) {
  576. __extends(DayTile, _super);
  577. function DayTile(context, el) {
  578. var _this = _super.call(this, context, el) || this;
  579. var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
  580. var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame);
  581. _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
  582. _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
  583. _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
  584. _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
  585. context.calendar.registerInteractiveComponent(_this, {
  586. el: _this.el,
  587. useEventCenter: false
  588. });
  589. return _this;
  590. }
  591. DayTile.prototype.render = function (props) {
  592. this.renderFrame(props.date);
  593. this.renderFgEvents(props.fgSegs);
  594. this.renderEventSelection(props.eventSelection);
  595. this.renderEventDrag(props.eventDragInstances);
  596. this.renderEventResize(props.eventResizeInstances);
  597. };
  598. DayTile.prototype.destroy = function () {
  599. _super.prototype.destroy.call(this);
  600. this.renderFrame.unrender(); // should unrender everything else
  601. this.calendar.unregisterInteractiveComponent(this);
  602. };
  603. DayTile.prototype._renderFrame = function (date) {
  604. var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
  605. var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache
  606. );
  607. this.el.innerHTML =
  608. '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
  609. '<span class="fc-title">' +
  610. core.htmlEscape(title) +
  611. '</span>' +
  612. '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
  613. '</div>' +
  614. '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
  615. '<div class="fc-event-container"></div>' +
  616. '</div>';
  617. this.segContainerEl = this.el.querySelector('.fc-event-container');
  618. };
  619. DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
  620. var date = this.props.date; // HACK
  621. if (positionLeft < elWidth && positionTop < elHeight) {
  622. return {
  623. component: this,
  624. dateSpan: {
  625. allDay: true,
  626. range: { start: date, end: core.addDays(date, 1) }
  627. },
  628. dayEl: this.el,
  629. rect: {
  630. left: 0,
  631. top: 0,
  632. right: elWidth,
  633. bottom: elHeight
  634. },
  635. layer: 1
  636. };
  637. }
  638. };
  639. return DayTile;
  640. }(core.DateComponent));
  641. var DayTileEventRenderer = /** @class */ (function (_super) {
  642. __extends(DayTileEventRenderer, _super);
  643. function DayTileEventRenderer(dayTile) {
  644. var _this = _super.call(this, dayTile.context) || this;
  645. _this.dayTile = dayTile;
  646. return _this;
  647. }
  648. DayTileEventRenderer.prototype.attachSegs = function (segs) {
  649. for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
  650. var seg = segs_1[_i];
  651. this.dayTile.segContainerEl.appendChild(seg.el);
  652. }
  653. };
  654. DayTileEventRenderer.prototype.detachSegs = function (segs) {
  655. for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
  656. var seg = segs_2[_i];
  657. core.removeElement(seg.el);
  658. }
  659. };
  660. return DayTileEventRenderer;
  661. }(SimpleDayGridEventRenderer));
  662. var DayBgRow = /** @class */ (function () {
  663. function DayBgRow(context) {
  664. this.context = context;
  665. }
  666. DayBgRow.prototype.renderHtml = function (props) {
  667. var parts = [];
  668. if (props.renderIntroHtml) {
  669. parts.push(props.renderIntroHtml());
  670. }
  671. for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
  672. var cell = _a[_i];
  673. parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
  674. }
  675. if (!props.cells.length) {
  676. parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
  677. }
  678. if (this.context.options.dir === 'rtl') {
  679. parts.reverse();
  680. }
  681. return '<tr>' + parts.join('') + '</tr>';
  682. };
  683. return DayBgRow;
  684. }());
  685. function renderCellHtml(date, dateProfile, context, otherAttrs) {
  686. var dateEnv = context.dateEnv, theme = context.theme;
  687. var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
  688. var classes = core.getDayClasses(date, dateProfile, context);
  689. classes.unshift('fc-day', theme.getClass('widgetContent'));
  690. return '<td class="' + classes.join(' ') + '"' +
  691. (isDateValid ?
  692. ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
  693. '') +
  694. (otherAttrs ?
  695. ' ' + otherAttrs :
  696. '') +
  697. '></td>';
  698. }
  699. var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' });
  700. var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' });
  701. var DayGrid = /** @class */ (function (_super) {
  702. __extends(DayGrid, _super);
  703. function DayGrid(context, el, renderProps) {
  704. var _this = _super.call(this, context, el) || this;
  705. _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
  706. _this.isCellSizesDirty = false;
  707. var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
  708. var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
  709. _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
  710. var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells);
  711. _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
  712. _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
  713. _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
  714. _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
  715. _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
  716. _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
  717. _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
  718. _this.renderProps = renderProps;
  719. return _this;
  720. }
  721. DayGrid.prototype.render = function (props) {
  722. var cells = props.cells;
  723. this.rowCnt = cells.length;
  724. this.colCnt = cells[0].length;
  725. this.renderCells(cells, props.isRigid);
  726. this.renderBusinessHours(props.businessHourSegs);
  727. this.renderDateSelection(props.dateSelectionSegs);
  728. this.renderBgEvents(props.bgEventSegs);
  729. this.renderFgEvents(props.fgEventSegs);
  730. this.renderEventSelection(props.eventSelection);
  731. this.renderEventDrag(props.eventDrag);
  732. this.renderEventResize(props.eventResize);
  733. if (this.segPopoverTile) {
  734. this.updateSegPopoverTile();
  735. }
  736. };
  737. DayGrid.prototype.destroy = function () {
  738. _super.prototype.destroy.call(this);
  739. this.renderCells.unrender(); // will unrender everything else
  740. };
  741. DayGrid.prototype.getCellRange = function (row, col) {
  742. var start = this.props.cells[row][col].date;
  743. var end = core.addDays(start, 1);
  744. return { start: start, end: end };
  745. };
  746. DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
  747. var ownProps = this.props;
  748. this.segPopoverTile.receiveProps({
  749. date: date || this.segPopoverTile.props.date,
  750. fgSegs: segs || this.segPopoverTile.props.fgSegs,
  751. eventSelection: ownProps.eventSelection,
  752. eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
  753. eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
  754. });
  755. };
  756. /* Date Rendering
  757. ------------------------------------------------------------------------------------------------------------------*/
  758. DayGrid.prototype._renderCells = function (cells, isRigid) {
  759. var _a = this, view = _a.view, dateEnv = _a.dateEnv;
  760. var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
  761. var html = '';
  762. var row;
  763. var col;
  764. for (row = 0; row < rowCnt; row++) {
  765. html += this.renderDayRowHtml(row, isRigid);
  766. }
  767. this.el.innerHTML = html;
  768. this.rowEls = core.findElements(this.el, '.fc-row');
  769. this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
  770. if (this.isRtl) {
  771. this.cellEls.reverse();
  772. }
  773. this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical
  774. );
  775. this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
  776. true, false // horizontal
  777. );
  778. // trigger dayRender with each cell's element
  779. for (row = 0; row < rowCnt; row++) {
  780. for (col = 0; col < colCnt; col++) {
  781. this.publiclyTrigger('dayRender', [
  782. {
  783. date: dateEnv.toDate(cells[row][col].date),
  784. el: this.getCellEl(row, col),
  785. view: view
  786. }
  787. ]);
  788. }
  789. }
  790. this.isCellSizesDirty = true;
  791. };
  792. DayGrid.prototype._unrenderCells = function () {
  793. this.removeSegPopover();
  794. };
  795. // Generates the HTML for a single row, which is a div that wraps a table.
  796. // `row` is the row number.
  797. DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
  798. var theme = this.theme;
  799. var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
  800. if (isRigid) {
  801. classes.push('fc-rigid');
  802. }
  803. var bgRow = new DayBgRow(this.context);
  804. return '' +
  805. '<div class="' + classes.join(' ') + '">' +
  806. '<div class="fc-bg">' +
  807. '<table class="' + theme.getClass('tableGrid') + '">' +
  808. bgRow.renderHtml({
  809. cells: this.props.cells[row],
  810. dateProfile: this.props.dateProfile,
  811. renderIntroHtml: this.renderProps.renderBgIntroHtml
  812. }) +
  813. '</table>' +
  814. '</div>' +
  815. '<div class="fc-content-skeleton">' +
  816. '<table>' +
  817. (this.getIsNumbersVisible() ?
  818. '<thead>' +
  819. this.renderNumberTrHtml(row) +
  820. '</thead>' :
  821. '') +
  822. '</table>' +
  823. '</div>' +
  824. '</div>';
  825. };
  826. DayGrid.prototype.getIsNumbersVisible = function () {
  827. return this.getIsDayNumbersVisible() ||
  828. this.renderProps.cellWeekNumbersVisible ||
  829. this.renderProps.colWeekNumbersVisible;
  830. };
  831. DayGrid.prototype.getIsDayNumbersVisible = function () {
  832. return this.rowCnt > 1;
  833. };
  834. /* Grid Number Rendering
  835. ------------------------------------------------------------------------------------------------------------------*/
  836. DayGrid.prototype.renderNumberTrHtml = function (row) {
  837. var intro = this.renderProps.renderNumberIntroHtml(row, this);
  838. return '' +
  839. '<tr>' +
  840. (this.isRtl ? '' : intro) +
  841. this.renderNumberCellsHtml(row) +
  842. (this.isRtl ? intro : '') +
  843. '</tr>';
  844. };
  845. DayGrid.prototype.renderNumberCellsHtml = function (row) {
  846. var htmls = [];
  847. var col;
  848. var date;
  849. for (col = 0; col < this.colCnt; col++) {
  850. date = this.props.cells[row][col].date;
  851. htmls.push(this.renderNumberCellHtml(date));
  852. }
  853. if (this.isRtl) {
  854. htmls.reverse();
  855. }
  856. return htmls.join('');
  857. };
  858. // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
  859. // The number row will only exist if either day numbers or week numbers are turned on.
  860. DayGrid.prototype.renderNumberCellHtml = function (date) {
  861. var _a = this, view = _a.view, dateEnv = _a.dateEnv;
  862. var html = '';
  863. var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
  864. var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
  865. var classes;
  866. var weekCalcFirstDow;
  867. if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
  868. // no numbers in day cell (week number must be along the side)
  869. return '<td></td>'; // will create an empty space above events :(
  870. }
  871. classes = core.getDayClasses(date, this.props.dateProfile, this.context);
  872. classes.unshift('fc-day-top');
  873. if (this.renderProps.cellWeekNumbersVisible) {
  874. weekCalcFirstDow = dateEnv.weekDow;
  875. }
  876. html += '<td class="' + classes.join(' ') + '"' +
  877. (isDateValid ?
  878. ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
  879. '') +
  880. '>';
  881. if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
  882. html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
  883. );
  884. }
  885. if (isDayNumberVisible) {
  886. html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
  887. );
  888. }
  889. html += '</td>';
  890. return html;
  891. };
  892. /* Sizing
  893. ------------------------------------------------------------------------------------------------------------------*/
  894. DayGrid.prototype.updateSize = function (isResize) {
  895. var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
  896. if (isResize ||
  897. this.isCellSizesDirty ||
  898. this.view.calendar.isEventsUpdated // hack
  899. ) {
  900. this.buildPositionCaches();
  901. this.isCellSizesDirty = false;
  902. }
  903. fillRenderer.computeSizes(isResize);
  904. eventRenderer.computeSizes(isResize);
  905. mirrorRenderer.computeSizes(isResize);
  906. fillRenderer.assignSizes(isResize);
  907. eventRenderer.assignSizes(isResize);
  908. mirrorRenderer.assignSizes(isResize);
  909. };
  910. DayGrid.prototype.buildPositionCaches = function () {
  911. this.buildColPositions();
  912. this.buildRowPositions();
  913. };
  914. DayGrid.prototype.buildColPositions = function () {
  915. this.colPositions.build();
  916. };
  917. DayGrid.prototype.buildRowPositions = function () {
  918. this.rowPositions.build();
  919. this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
  920. };
  921. /* Hit System
  922. ------------------------------------------------------------------------------------------------------------------*/
  923. DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
  924. var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
  925. var col = colPositions.leftToIndex(leftPosition);
  926. var row = rowPositions.topToIndex(topPosition);
  927. if (row != null && col != null) {
  928. return {
  929. row: row,
  930. col: col,
  931. dateSpan: {
  932. range: this.getCellRange(row, col),
  933. allDay: true
  934. },
  935. dayEl: this.getCellEl(row, col),
  936. relativeRect: {
  937. left: colPositions.lefts[col],
  938. right: colPositions.rights[col],
  939. top: rowPositions.tops[row],
  940. bottom: rowPositions.bottoms[row]
  941. }
  942. };
  943. }
  944. };
  945. /* Cell System
  946. ------------------------------------------------------------------------------------------------------------------*/
  947. // FYI: the first column is the leftmost column, regardless of date
  948. DayGrid.prototype.getCellEl = function (row, col) {
  949. return this.cellEls[row * this.colCnt + col];
  950. };
  951. /* Event Drag Visualization
  952. ------------------------------------------------------------------------------------------------------------------*/
  953. DayGrid.prototype._renderEventDrag = function (state) {
  954. if (state) {
  955. this.eventRenderer.hideByHash(state.affectedInstances);
  956. this.fillRenderer.renderSegs('highlight', state.segs);
  957. }
  958. };
  959. DayGrid.prototype._unrenderEventDrag = function (state) {
  960. if (state) {
  961. this.eventRenderer.showByHash(state.affectedInstances);
  962. this.fillRenderer.unrender('highlight');
  963. }
  964. };
  965. /* Event Resize Visualization
  966. ------------------------------------------------------------------------------------------------------------------*/
  967. DayGrid.prototype._renderEventResize = function (state) {
  968. if (state) {
  969. this.eventRenderer.hideByHash(state.affectedInstances);
  970. this.fillRenderer.renderSegs('highlight', state.segs);
  971. this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
  972. }
  973. };
  974. DayGrid.prototype._unrenderEventResize = function (state) {
  975. if (state) {
  976. this.eventRenderer.showByHash(state.affectedInstances);
  977. this.fillRenderer.unrender('highlight');
  978. this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
  979. }
  980. };
  981. /* More+ Link Popover
  982. ------------------------------------------------------------------------------------------------------------------*/
  983. DayGrid.prototype.removeSegPopover = function () {
  984. if (this.segPopover) {
  985. this.segPopover.hide(); // in handler, will call segPopover's removeElement
  986. }
  987. };
  988. // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
  989. // `levelLimit` can be false (don't limit), a number, or true (should be computed).
  990. DayGrid.prototype.limitRows = function (levelLimit) {
  991. var rowStructs = this.eventRenderer.rowStructs || [];
  992. var row; // row #
  993. var rowLevelLimit;
  994. for (row = 0; row < rowStructs.length; row++) {
  995. this.unlimitRow(row);
  996. if (!levelLimit) {
  997. rowLevelLimit = false;
  998. }
  999. else if (typeof levelLimit === 'number') {
  1000. rowLevelLimit = levelLimit;
  1001. }
  1002. else {
  1003. rowLevelLimit = this.computeRowLevelLimit(row);
  1004. }
  1005. if (rowLevelLimit !== false) {
  1006. this.limitRow(row, rowLevelLimit);
  1007. }
  1008. }
  1009. };
  1010. // Computes the number of levels a row will accomodate without going outside its bounds.
  1011. // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
  1012. // `row` is the row number.
  1013. DayGrid.prototype.computeRowLevelLimit = function (row) {
  1014. var rowEl = this.rowEls[row]; // the containing "fake" row div
  1015. var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
  1016. var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
  1017. var i;
  1018. var trEl;
  1019. // Reveal one level <tr> at a time and stop when we find one out of bounds
  1020. for (i = 0; i < trEls.length; i++) {
  1021. trEl = trEls[i];
  1022. trEl.classList.remove('fc-limited'); // reset to original state (reveal)
  1023. if (trEl.getBoundingClientRect().bottom > rowBottom) {
  1024. return i;
  1025. }
  1026. }
  1027. return false; // should not limit at all
  1028. };
  1029. // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
  1030. // `row` is the row number.
  1031. // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
  1032. DayGrid.prototype.limitRow = function (row, levelLimit) {
  1033. var _this = this;
  1034. var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl;
  1035. var rowStruct = this.eventRenderer.rowStructs[row];
  1036. var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
  1037. var col = 0; // col #, left-to-right (not chronologically)
  1038. var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
  1039. var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
  1040. var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
  1041. var i;
  1042. var seg;
  1043. var segsBelow; // array of segment objects below `seg` in the current `col`
  1044. var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
  1045. var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
  1046. var td;
  1047. var rowSpan;
  1048. var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
  1049. var j;
  1050. var moreTd;
  1051. var moreWrap;
  1052. var moreLink;
  1053. // Iterates through empty level cells and places "more" links inside if need be
  1054. var emptyCellsUntil = function (endCol) {
  1055. while (col < endCol) {
  1056. segsBelow = _this.getCellSegs(row, col, levelLimit);
  1057. if (segsBelow.length) {
  1058. td = cellMatrix[levelLimit - 1][col];
  1059. moreLink = _this.renderMoreLink(row, col, segsBelow);
  1060. moreWrap = core.createElement('div', null, moreLink);
  1061. td.appendChild(moreWrap);
  1062. moreNodes.push(moreWrap);
  1063. }
  1064. col++;
  1065. }
  1066. };
  1067. if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
  1068. levelSegs = rowStruct.segLevels[levelLimit - 1];
  1069. cellMatrix = rowStruct.cellMatrix;
  1070. limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
  1071. limitedNodes.forEach(function (node) {
  1072. node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
  1073. });
  1074. // iterate though segments in the last allowable level
  1075. for (i = 0; i < levelSegs.length; i++) {
  1076. seg = levelSegs[i];
  1077. var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
  1078. var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
  1079. emptyCellsUntil(leftCol); // process empty cells before the segment
  1080. // determine *all* segments below `seg` that occupy the same columns
  1081. colSegsBelow = [];
  1082. totalSegsBelow = 0;
  1083. while (col <= rightCol) {
  1084. segsBelow = this.getCellSegs(row, col, levelLimit);
  1085. colSegsBelow.push(segsBelow);
  1086. totalSegsBelow += segsBelow.length;
  1087. col++;
  1088. }
  1089. if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
  1090. td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
  1091. rowSpan = td.rowSpan || 1;
  1092. segMoreNodes = [];
  1093. // make a replacement <td> for each column the segment occupies. will be one for each colspan
  1094. for (j = 0; j < colSegsBelow.length; j++) {
  1095. moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
  1096. segsBelow = colSegsBelow[j];
  1097. moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
  1098. );
  1099. moreWrap = core.createElement('div', null, moreLink);
  1100. moreTd.appendChild(moreWrap);
  1101. segMoreNodes.push(moreTd);
  1102. moreNodes.push(moreTd);
  1103. }
  1104. td.classList.add('fc-limited');
  1105. core.insertAfterElement(td, segMoreNodes);
  1106. limitedNodes.push(td);
  1107. }
  1108. }
  1109. emptyCellsUntil(this.colCnt); // finish off the level
  1110. rowStruct.moreEls = moreNodes; // for easy undoing later
  1111. rowStruct.limitedEls = limitedNodes; // for easy undoing later
  1112. }
  1113. };
  1114. // Reveals all levels and removes all "more"-related elements for a grid's row.
  1115. // `row` is a row number.
  1116. DayGrid.prototype.unlimitRow = function (row) {
  1117. var rowStruct = this.eventRenderer.rowStructs[row];
  1118. if (rowStruct.moreEls) {
  1119. rowStruct.moreEls.forEach(core.removeElement);
  1120. rowStruct.moreEls = null;
  1121. }
  1122. if (rowStruct.limitedEls) {
  1123. rowStruct.limitedEls.forEach(function (limitedEl) {
  1124. limitedEl.classList.remove('fc-limited');
  1125. });
  1126. rowStruct.limitedEls = null;
  1127. }
  1128. };
  1129. // Renders an <a> element that represents hidden event element for a cell.
  1130. // Responsible for attaching click handler as well.
  1131. DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
  1132. var _this = this;
  1133. var _a = this, view = _a.view, dateEnv = _a.dateEnv;
  1134. var a = core.createElement('a', { className: 'fc-more' });
  1135. a.innerText = this.getMoreLinkText(hiddenSegs.length);
  1136. a.addEventListener('click', function (ev) {
  1137. var clickOption = _this.opt('eventLimitClick');
  1138. var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
  1139. var date = _this.props.cells[row][_col].date;
  1140. var moreEl = ev.currentTarget;
  1141. var dayEl = _this.getCellEl(row, col);
  1142. var allSegs = _this.getCellSegs(row, col);
  1143. // rescope the segments to be within the cell's date
  1144. var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
  1145. var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
  1146. if (typeof clickOption === 'function') {
  1147. // the returned value can be an atomic option
  1148. clickOption = _this.publiclyTrigger('eventLimitClick', [
  1149. {
  1150. date: dateEnv.toDate(date),
  1151. allDay: true,
  1152. dayEl: dayEl,
  1153. moreEl: moreEl,
  1154. segs: reslicedAllSegs,
  1155. hiddenSegs: reslicedHiddenSegs,
  1156. jsEvent: ev,
  1157. view: view
  1158. }
  1159. ]);
  1160. }
  1161. if (clickOption === 'popover') {
  1162. _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
  1163. }
  1164. else if (typeof clickOption === 'string') { // a view name
  1165. view.calendar.zoomTo(date, clickOption);
  1166. }
  1167. });
  1168. return a;
  1169. };
  1170. // Reveals the popover that displays all events within a cell
  1171. DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
  1172. var _this = this;
  1173. var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme;
  1174. var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
  1175. var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
  1176. var topEl; // the element we want to match the top coordinate of
  1177. var options;
  1178. if (this.rowCnt === 1) {
  1179. topEl = view.el; // will cause the popover to cover any sort of header
  1180. }
  1181. else {
  1182. topEl = this.rowEls[row]; // will align with top of row
  1183. }
  1184. options = {
  1185. className: 'fc-more-popover ' + theme.getClass('popover'),
  1186. parentEl: view.el,
  1187. top: core.computeRect(topEl).top,
  1188. autoHide: true,
  1189. content: function (el) {
  1190. _this.segPopoverTile = new DayTile(_this.context, el);
  1191. _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
  1192. },
  1193. hide: function () {
  1194. _this.segPopoverTile.destroy();
  1195. _this.segPopoverTile = null;
  1196. _this.segPopover.destroy();
  1197. _this.segPopover = null;
  1198. }
  1199. };
  1200. // Determine horizontal coordinate.
  1201. // We use the moreWrap instead of the <td> to avoid border confusion.
  1202. if (this.isRtl) {
  1203. options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border
  1204. }
  1205. else {
  1206. options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border
  1207. }
  1208. this.segPopover = new Popover(options);
  1209. this.segPopover.show();
  1210. calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
  1211. };
  1212. // Given the events within an array of segment objects, reslice them to be in a single day
  1213. DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
  1214. var dayStart = dayDate;
  1215. var dayEnd = core.addDays(dayStart, 1);
  1216. var dayRange = { start: dayStart, end: dayEnd };
  1217. var newSegs = [];
  1218. for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
  1219. var seg = segs_1[_i];
  1220. var eventRange = seg.eventRange;
  1221. var origRange = eventRange.range;
  1222. var slicedRange = core.intersectRanges(origRange, dayRange);
  1223. if (slicedRange) {
  1224. newSegs.push(__assign({}, seg, { eventRange: {
  1225. def: eventRange.def,
  1226. ui: __assign({}, eventRange.ui, { durationEditable: false }),
  1227. instance: eventRange.instance,
  1228. range: slicedRange
  1229. }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
  1230. }
  1231. }
  1232. return newSegs;
  1233. };
  1234. // Generates the text that should be inside a "more" link, given the number of events it represents
  1235. DayGrid.prototype.getMoreLinkText = function (num) {
  1236. var opt = this.opt('eventLimitText');
  1237. if (typeof opt === 'function') {
  1238. return opt(num);
  1239. }
  1240. else {
  1241. return '+' + num + ' ' + opt;
  1242. }
  1243. };
  1244. // Returns segments within a given cell.
  1245. // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
  1246. DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
  1247. var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
  1248. var level = startLevel || 0;
  1249. var segs = [];
  1250. var seg;
  1251. while (level < segMatrix.length) {
  1252. seg = segMatrix[level][col];
  1253. if (seg) {
  1254. segs.push(seg);
  1255. }
  1256. level++;
  1257. }
  1258. return segs;
  1259. };
  1260. return DayGrid;
  1261. }(core.DateComponent));
  1262. var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' });
  1263. /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
  1264. ----------------------------------------------------------------------------------------------------------------------*/
  1265. // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
  1266. // It is responsible for managing width/height.
  1267. var DayGridView = /** @class */ (function (_super) {
  1268. __extends(DayGridView, _super);
  1269. function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
  1270. var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
  1271. /* Header Rendering
  1272. ------------------------------------------------------------------------------------------------------------------*/
  1273. // Generates the HTML that will go before the day-of week header cells
  1274. _this.renderHeadIntroHtml = function () {
  1275. var theme = _this.theme;
  1276. if (_this.colWeekNumbersVisible) {
  1277. return '' +
  1278. '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
  1279. '<span>' + // needed for matchCellWidths
  1280. core.htmlEscape(_this.opt('weekLabel')) +
  1281. '</span>' +
  1282. '</th>';
  1283. }
  1284. return '';
  1285. };
  1286. /* Day Grid Rendering
  1287. ------------------------------------------------------------------------------------------------------------------*/
  1288. // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
  1289. _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
  1290. var dateEnv = _this.dateEnv;
  1291. var weekStart = dayGrid.props.cells[row][0].date;
  1292. if (_this.colWeekNumbersVisible) {
  1293. return '' +
  1294. '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
  1295. core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
  1296. _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
  1297. ) +
  1298. '</td>';
  1299. }
  1300. return '';
  1301. };
  1302. // Generates the HTML that goes before the day bg cells for each day-row
  1303. _this.renderDayGridBgIntroHtml = function () {
  1304. var theme = _this.theme;
  1305. if (_this.colWeekNumbersVisible) {
  1306. return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
  1307. }
  1308. return '';
  1309. };
  1310. // Generates the HTML that goes before every other type of row generated by DayGrid.
  1311. // Affects mirror-skeleton and highlight-skeleton rows.
  1312. _this.renderDayGridIntroHtml = function () {
  1313. if (_this.colWeekNumbersVisible) {
  1314. return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
  1315. }
  1316. return '';
  1317. };
  1318. _this.el.classList.add('fc-dayGrid-view');
  1319. _this.el.innerHTML = _this.renderSkeletonHtml();
  1320. _this.scroller = new core.ScrollComponent('hidden', // overflow x
  1321. 'auto' // overflow y
  1322. );
  1323. var dayGridContainerEl = _this.scroller.el;
  1324. _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
  1325. dayGridContainerEl.classList.add('fc-day-grid-container');
  1326. var dayGridEl = core.createElement('div', { className: 'fc-day-grid' });
  1327. dayGridContainerEl.appendChild(dayGridEl);
  1328. var cellWeekNumbersVisible;
  1329. if (_this.opt('weekNumbers')) {
  1330. if (_this.opt('weekNumbersWithinDays')) {
  1331. cellWeekNumbersVisible = true;
  1332. _this.colWeekNumbersVisible = false;
  1333. }
  1334. else {
  1335. cellWeekNumbersVisible = false;
  1336. _this.colWeekNumbersVisible = true;
  1337. }
  1338. }
  1339. else {
  1340. _this.colWeekNumbersVisible = false;
  1341. cellWeekNumbersVisible = false;
  1342. }
  1343. _this.dayGrid = new DayGrid(_this.context, dayGridEl, {
  1344. renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml,
  1345. renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
  1346. renderIntroHtml: _this.renderDayGridIntroHtml,
  1347. colWeekNumbersVisible: _this.colWeekNumbersVisible,
  1348. cellWeekNumbersVisible: cellWeekNumbersVisible
  1349. });
  1350. return _this;
  1351. }
  1352. DayGridView.prototype.destroy = function () {
  1353. _super.prototype.destroy.call(this);
  1354. this.dayGrid.destroy();
  1355. this.scroller.destroy();
  1356. };
  1357. // Builds the HTML skeleton for the view.
  1358. // The day-grid component will render inside of a container defined by this HTML.
  1359. DayGridView.prototype.renderSkeletonHtml = function () {
  1360. var theme = this.theme;
  1361. return '' +
  1362. '<table class="' + theme.getClass('tableGrid') + '">' +
  1363. (this.opt('columnHeader') ?
  1364. '<thead class="fc-head">' +
  1365. '<tr>' +
  1366. '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
  1367. '</tr>' +
  1368. '</thead>' :
  1369. '') +
  1370. '<tbody class="fc-body">' +
  1371. '<tr>' +
  1372. '<td class="' + theme.getClass('widgetContent') + '"></td>' +
  1373. '</tr>' +
  1374. '</tbody>' +
  1375. '</table>';
  1376. };
  1377. // Generates an HTML attribute string for setting the width of the week number column, if it is known
  1378. DayGridView.prototype.weekNumberStyleAttr = function () {
  1379. if (this.weekNumberWidth != null) {
  1380. return 'style="width:' + this.weekNumberWidth + 'px"';
  1381. }
  1382. return '';
  1383. };
  1384. // Determines whether each row should have a constant height
  1385. DayGridView.prototype.hasRigidRows = function () {
  1386. var eventLimit = this.opt('eventLimit');
  1387. return eventLimit && typeof eventLimit !== 'number';
  1388. };
  1389. /* Dimensions
  1390. ------------------------------------------------------------------------------------------------------------------*/
  1391. DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
  1392. _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
  1393. this.dayGrid.updateSize(isResize);
  1394. };
  1395. // Refreshes the horizontal dimensions of the view
  1396. DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
  1397. var dayGrid = this.dayGrid;
  1398. var eventLimit = this.opt('eventLimit');
  1399. var headRowEl = this.header ? this.header.el : null; // HACK
  1400. var scrollerHeight;
  1401. var scrollbarWidths;
  1402. // hack to give the view some height prior to dayGrid's columns being rendered
  1403. // TODO: separate setting height from scroller VS dayGrid.
  1404. if (!dayGrid.rowEls) {
  1405. if (!isAuto) {
  1406. scrollerHeight = this.computeScrollerHeight(viewHeight);
  1407. this.scroller.setHeight(scrollerHeight);
  1408. }
  1409. return;
  1410. }
  1411. if (this.colWeekNumbersVisible) {
  1412. // Make sure all week number cells running down the side have the same width.
  1413. this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number'));
  1414. }
  1415. // reset all heights to be natural
  1416. this.scroller.clear();
  1417. if (headRowEl) {
  1418. core.uncompensateScroll(headRowEl);
  1419. }
  1420. dayGrid.removeSegPopover(); // kill the "more" popover if displayed
  1421. // is the event limit a constant level number?
  1422. if (eventLimit && typeof eventLimit === 'number') {
  1423. dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
  1424. }
  1425. // distribute the height to the rows
  1426. // (viewHeight is a "recommended" value if isAuto)
  1427. scrollerHeight = this.computeScrollerHeight(viewHeight);
  1428. this.setGridHeight(scrollerHeight, isAuto);
  1429. // is the event limit dynamically calculated?
  1430. if (eventLimit && typeof eventLimit !== 'number') {
  1431. dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
  1432. }
  1433. if (!isAuto) { // should we force dimensions of the scroll container?
  1434. this.scroller.setHeight(scrollerHeight);
  1435. scrollbarWidths = this.scroller.getScrollbarWidths();
  1436. if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
  1437. if (headRowEl) {
  1438. core.compensateScroll(headRowEl, scrollbarWidths);
  1439. }
  1440. // doing the scrollbar compensation might have created text overflow which created more height. redo
  1441. scrollerHeight = this.computeScrollerHeight(viewHeight);
  1442. this.scroller.setHeight(scrollerHeight);
  1443. }
  1444. // guarantees the same scrollbar widths
  1445. this.scroller.lockOverflow(scrollbarWidths);
  1446. }
  1447. };
  1448. // given a desired total height of the view, returns what the height of the scroller should be
  1449. DayGridView.prototype.computeScrollerHeight = function (viewHeight) {
  1450. return viewHeight -
  1451. core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
  1452. };
  1453. // Sets the height of just the DayGrid component in this view
  1454. DayGridView.prototype.setGridHeight = function (height, isAuto) {
  1455. if (this.opt('monthMode')) {
  1456. // if auto, make the height of each row the height that it would be if there were 6 weeks
  1457. if (isAuto) {
  1458. height *= this.dayGrid.rowCnt / 6;
  1459. }
  1460. core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
  1461. }
  1462. else {
  1463. if (isAuto) {
  1464. core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
  1465. }
  1466. else {
  1467. core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
  1468. }
  1469. }
  1470. };
  1471. /* Scroll
  1472. ------------------------------------------------------------------------------------------------------------------*/
  1473. DayGridView.prototype.computeDateScroll = function (timeMs) {
  1474. return { top: 0 };
  1475. };
  1476. DayGridView.prototype.queryDateScroll = function () {
  1477. return { top: this.scroller.getScrollTop() };
  1478. };
  1479. DayGridView.prototype.applyDateScroll = function (scroll) {
  1480. if (scroll.top !== undefined) {
  1481. this.scroller.setScrollTop(scroll.top);
  1482. }
  1483. };
  1484. return DayGridView;
  1485. }(core.View));
  1486. DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
  1487. var SimpleDayGrid = /** @class */ (function (_super) {
  1488. __extends(SimpleDayGrid, _super);
  1489. function SimpleDayGrid(context, dayGrid) {
  1490. var _this = _super.call(this, context, dayGrid.el) || this;
  1491. _this.slicer = new DayGridSlicer();
  1492. _this.dayGrid = dayGrid;
  1493. context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el });
  1494. return _this;
  1495. }
  1496. SimpleDayGrid.prototype.destroy = function () {
  1497. _super.prototype.destroy.call(this);
  1498. this.calendar.unregisterInteractiveComponent(this);
  1499. };
  1500. SimpleDayGrid.prototype.render = function (props) {
  1501. var dayGrid = this.dayGrid;
  1502. var dateProfile = props.dateProfile, dayTable = props.dayTable;
  1503. dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }));
  1504. };
  1505. SimpleDayGrid.prototype.buildPositionCaches = function () {
  1506. this.dayGrid.buildPositionCaches();
  1507. };
  1508. SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
  1509. var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
  1510. if (rawHit) {
  1511. return {
  1512. component: this.dayGrid,
  1513. dateSpan: rawHit.dateSpan,
  1514. dayEl: rawHit.dayEl,
  1515. rect: {
  1516. left: rawHit.relativeRect.left,
  1517. right: rawHit.relativeRect.right,
  1518. top: rawHit.relativeRect.top,
  1519. bottom: rawHit.relativeRect.bottom
  1520. },
  1521. layer: 0
  1522. };
  1523. }
  1524. };
  1525. return SimpleDayGrid;
  1526. }(core.DateComponent));
  1527. var DayGridSlicer = /** @class */ (function (_super) {
  1528. __extends(DayGridSlicer, _super);
  1529. function DayGridSlicer() {
  1530. return _super !== null && _super.apply(this, arguments) || this;
  1531. }
  1532. DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
  1533. return dayTable.sliceRange(dateRange);
  1534. };
  1535. return DayGridSlicer;
  1536. }(core.Slicer));
  1537. var DayGridView$1 = /** @class */ (function (_super) {
  1538. __extends(DayGridView, _super);
  1539. function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
  1540. var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
  1541. _this.buildDayTable = core.memoize(buildDayTable);
  1542. if (_this.opt('columnHeader')) {
  1543. _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
  1544. }
  1545. _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);
  1546. return _this;
  1547. }
  1548. DayGridView.prototype.destroy = function () {
  1549. _super.prototype.destroy.call(this);
  1550. if (this.header) {
  1551. this.header.destroy();
  1552. }
  1553. this.simpleDayGrid.destroy();
  1554. };
  1555. DayGridView.prototype.render = function (props) {
  1556. _super.prototype.render.call(this, props);
  1557. var dateProfile = this.props.dateProfile;
  1558. var dayTable = this.dayTable =
  1559. this.buildDayTable(dateProfile, this.dateProfileGenerator);
  1560. if (this.header) {
  1561. this.header.receiveProps({
  1562. dateProfile: dateProfile,
  1563. dates: dayTable.headerDates,
  1564. datesRepDistinctDays: dayTable.rowCnt === 1,
  1565. renderIntroHtml: this.renderHeadIntroHtml
  1566. });
  1567. }
  1568. this.simpleDayGrid.receiveProps({
  1569. dateProfile: dateProfile,
  1570. dayTable: dayTable,
  1571. businessHours: props.businessHours,
  1572. dateSelection: props.dateSelection,
  1573. eventStore: props.eventStore,
  1574. eventUiBases: props.eventUiBases,
  1575. eventSelection: props.eventSelection,
  1576. eventDrag: props.eventDrag,
  1577. eventResize: props.eventResize,
  1578. isRigid: this.hasRigidRows(),
  1579. nextDayThreshold: this.nextDayThreshold
  1580. });
  1581. };
  1582. return DayGridView;
  1583. }(DayGridView));
  1584. function buildDayTable(dateProfile, dateProfileGenerator) {
  1585. var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
  1586. return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
  1587. }
  1588. var main = core.createPlugin({
  1589. defaultView: 'dayGridMonth',
  1590. views: {
  1591. dayGrid: DayGridView$1,
  1592. dayGridDay: {
  1593. type: 'dayGrid',
  1594. duration: { days: 1 }
  1595. },
  1596. dayGridWeek: {
  1597. type: 'dayGrid',
  1598. duration: { weeks: 1 }
  1599. },
  1600. dayGridMonth: {
  1601. type: 'dayGrid',
  1602. duration: { months: 1 },
  1603. monthMode: true,
  1604. fixedWeekCount: true
  1605. }
  1606. }
  1607. });
  1608. exports.AbstractDayGridView = DayGridView;
  1609. exports.DayBgRow = DayBgRow;
  1610. exports.DayGrid = DayGrid;
  1611. exports.DayGridSlicer = DayGridSlicer;
  1612. exports.DayGridView = DayGridView$1;
  1613. exports.SimpleDayGrid = SimpleDayGrid;
  1614. exports.buildBasicDayTable = buildDayTable;
  1615. exports.default = main;
  1616. Object.defineProperty(exports, '__esModule', { value: true });
  1617. }));