full_calendar 4.2.0

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