main.esm.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /*
  2. FullCalendar Vue Component v4.4.2
  3. Docs: https://fullcalendar.io/docs/vue
  4. License: MIT
  5. */
  6. import deepEqual from 'fast-deep-equal';
  7. import { Calendar } from '@fullcalendar/core';
  8. function _typeof(obj) {
  9. "@babel/helpers - typeof";
  10. if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
  11. _typeof = function (obj) {
  12. return typeof obj;
  13. };
  14. } else {
  15. _typeof = function (obj) {
  16. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  17. };
  18. }
  19. return _typeof(obj);
  20. }
  21. function _unsupportedIterableToArray(o, minLen) {
  22. if (!o) return;
  23. if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  24. var n = Object.prototype.toString.call(o).slice(8, -1);
  25. if (n === "Object" && o.constructor) n = o.constructor.name;
  26. if (n === "Map" || n === "Set") return Array.from(o);
  27. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
  28. }
  29. function _arrayLikeToArray(arr, len) {
  30. if (len == null || len > arr.length) len = arr.length;
  31. for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  32. return arr2;
  33. }
  34. function _createForOfIteratorHelper(o, allowArrayLike) {
  35. var it;
  36. if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
  37. if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
  38. if (it) o = it;
  39. var i = 0;
  40. var F = function () {};
  41. return {
  42. s: F,
  43. n: function () {
  44. if (i >= o.length) return {
  45. done: true
  46. };
  47. return {
  48. done: false,
  49. value: o[i++]
  50. };
  51. },
  52. e: function (e) {
  53. throw e;
  54. },
  55. f: F
  56. };
  57. }
  58. throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  59. }
  60. var normalCompletion = true,
  61. didErr = false,
  62. err;
  63. return {
  64. s: function () {
  65. it = o[Symbol.iterator]();
  66. },
  67. n: function () {
  68. var step = it.next();
  69. normalCompletion = step.done;
  70. return step;
  71. },
  72. e: function (e) {
  73. didErr = true;
  74. err = e;
  75. },
  76. f: function () {
  77. try {
  78. if (!normalCompletion && it.return != null) it.return();
  79. } finally {
  80. if (didErr) throw err;
  81. }
  82. }
  83. };
  84. }
  85. var hasOwnProperty = Object.prototype.hasOwnProperty;
  86. /*
  87. Really simple clone utility. Only copies plain arrays, objects, and Dates. Transfers everything else as-is.
  88. Wanted to use a third-party lib, but none did exactly this.
  89. */
  90. function deepCopy(input) {
  91. if (Array.isArray(input)) {
  92. return input.map(deepCopy);
  93. } else if (input instanceof Date) {
  94. return new Date(input.valueOf());
  95. } else if (_typeof(input) === 'object' && input) {
  96. // non-null object
  97. return mapHash(input, deepCopy);
  98. } else {
  99. // everything else (null, function, etc)
  100. return input;
  101. }
  102. }
  103. function mapHash(input, func) {
  104. var output = {};
  105. for (var key in input) {
  106. if (hasOwnProperty.call(input, key)) {
  107. output[key] = func(input[key], key);
  108. }
  109. }
  110. return output;
  111. }
  112. /*
  113. the docs point to this file as an index of options.
  114. when this files is moved, update the docs.
  115. */
  116. /*
  117. TODO: figure out booleans so attributes can be defined like:
  118. <FullCalendar editable />
  119. */
  120. var PROP_DEFS = {
  121. header: {},
  122. footer: {},
  123. customButtons: {},
  124. buttonIcons: {},
  125. themeSystem: {},
  126. bootstrapFontAwesome: {},
  127. firstDay: {},
  128. dir: {},
  129. weekends: {},
  130. hiddenDays: {},
  131. fixedWeekCount: {},
  132. weekNumbers: {},
  133. weekNumbersWithinDays: {},
  134. weekNumberCalculation: {},
  135. businessHours: {},
  136. showNonCurrentDates: {},
  137. height: {},
  138. contentHeight: {},
  139. aspectRatio: {},
  140. handleWindowResize: {},
  141. windowResizeDelay: {},
  142. eventLimit: {},
  143. eventLimitClick: {},
  144. timeZone: {},
  145. now: {},
  146. defaultView: {},
  147. allDaySlot: {},
  148. allDayText: {},
  149. slotDuration: {},
  150. slotLabelFormat: {},
  151. slotLabelInterval: {},
  152. snapDuration: {},
  153. scrollTime: {},
  154. minTime: {},
  155. maxTime: {},
  156. slotEventOverlap: {},
  157. listDayFormat: {},
  158. listDayAltFormat: {},
  159. noEventsMessage: {},
  160. defaultDate: {},
  161. nowIndicator: {},
  162. visibleRange: {},
  163. validRange: {},
  164. dateIncrement: {},
  165. dateAlignment: {},
  166. duration: {},
  167. dayCount: {},
  168. locales: {},
  169. locale: {},
  170. eventTimeFormat: {},
  171. columnHeader: {},
  172. columnHeaderFormat: {},
  173. columnHeaderText: {},
  174. columnHeaderHtml: {},
  175. titleFormat: {},
  176. weekLabel: {},
  177. displayEventTime: {},
  178. displayEventEnd: {},
  179. eventLimitText: {},
  180. dayPopoverFormat: {},
  181. navLinks: {},
  182. navLinkDayClick: {},
  183. navLinkWeekClick: {},
  184. selectable: {},
  185. selectMirror: {},
  186. unselectAuto: {},
  187. unselectCancel: {},
  188. defaultAllDayEventDuration: {},
  189. defaultTimedEventDuration: {},
  190. cmdFormatter: {},
  191. defaultRangeSeparator: {},
  192. selectConstraint: {},
  193. selectOverlap: {},
  194. selectAllow: {},
  195. editable: {},
  196. eventStartEditable: {},
  197. eventDurationEditable: {},
  198. eventConstraint: {},
  199. eventOverlap: {},
  200. eventAllow: {},
  201. eventClassName: {},
  202. eventClassNames: {},
  203. eventBackgroundColor: {},
  204. eventBorderColor: {},
  205. eventTextColor: {},
  206. eventColor: {},
  207. events: {},
  208. eventSources: {},
  209. allDayDefault: {},
  210. startParam: {},
  211. endParam: {},
  212. lazyFetching: {},
  213. nextDayThreshold: {},
  214. eventOrder: {},
  215. rerenderDelay: {},
  216. dragRevertDuration: {},
  217. dragScroll: {},
  218. longPressDelay: {},
  219. eventLongPressDelay: {},
  220. droppable: {},
  221. dropAccept: {},
  222. eventDataTransform: {},
  223. allDayMaintainDuration: {},
  224. eventResizableFromStart: {},
  225. timeGridEventMinHeight: {},
  226. allDayHtml: {},
  227. eventDragMinDistance: {},
  228. eventResourceEditable: {},
  229. eventSourceFailure: {},
  230. eventSourceSuccess: {},
  231. forceEventDuration: {},
  232. progressiveEventRendering: {},
  233. selectLongPressDelay: {},
  234. selectMinDistance: {},
  235. timeZoneParam: {},
  236. titleRangeSeparator: {},
  237. // compound OptionsInput...
  238. buttonText: {},
  239. views: {},
  240. plugins: {},
  241. // scheduler...
  242. schedulerLicenseKey: {},
  243. resources: {},
  244. resourceLabelText: {},
  245. resourceOrder: {},
  246. filterResourcesWithEvents: {},
  247. resourceText: {},
  248. resourceGroupField: {},
  249. resourceGroupText: {},
  250. resourceAreaWidth: {},
  251. resourceColumns: {},
  252. resourcesInitiallyExpanded: {},
  253. slotWidth: {},
  254. datesAboveResources: {},
  255. googleCalendarApiKey: {},
  256. refetchResourcesOnNavigate: {},
  257. // used to be emissions but are now props...
  258. datesRender: {},
  259. datesDestroy: {},
  260. dayRender: {},
  261. eventRender: {},
  262. eventDestroy: {},
  263. viewSkeletonRender: {},
  264. viewSkeletonDestroy: {},
  265. resourceRender: {}
  266. };
  267. var PROP_IS_DEEP = {
  268. header: true,
  269. footer: true,
  270. events: true,
  271. eventSources: true,
  272. resources: true
  273. };
  274. var EMISSION_NAMES = ['windowResize', 'dateClick', 'eventClick', 'eventMouseEnter', 'eventMouseLeave', 'select', 'unselect', 'loading', 'eventPositioned', '_eventsPositioned', 'eventDragStart', 'eventDragStop', 'eventDrop', 'eventResizeStart', 'eventResizeStop', 'eventResize', 'drop', 'eventReceive', 'eventLeave', '_destroyed', // should now be props... (TODO: eventually remove)
  275. 'datesRender', 'datesDestroy', 'dayRender', 'eventRender', 'eventDestroy', 'viewSkeletonRender', 'viewSkeletonDestroy', 'resourceRender']; // identify deprecated emissions (TODO: eventually remove)
  276. var EMISSION_USE_PROP = {
  277. datesRender: true,
  278. datesDestroy: true,
  279. dayRender: true,
  280. eventRender: true,
  281. eventDestroy: true,
  282. viewSkeletonRender: true,
  283. viewSkeletonDestroy: true,
  284. resourceRender: true
  285. };
  286. /*
  287. VOCAB:
  288. "props" are the values passed in from the parent (they are NOT listeners/emissions)
  289. "emissions" are another way to say "events that will fire"
  290. "options" are the options that the FullCalendar API accepts
  291. NOTE: "deep" props are complex objects that we want to watch for internal changes.
  292. Vue allows a reference to be internally mutated. Each time we detect a mutation,
  293. we use deepCopy to freeze the state. This has the added benefit of stripping the
  294. getter/setter methods that Vue embeds.
  295. */
  296. var FullCalendarComponent = {
  297. props: PROP_DEFS,
  298. // INTERNALS
  299. // this.$options.calendar
  300. // this.$options.deepCopies - all current deep options
  301. // this.$options.dirtyOptions - null/undefined means nothing dirty
  302. data: function data() {
  303. return {
  304. renderId: 0,
  305. deepCopies: {}
  306. };
  307. },
  308. render: function render(createElement) {
  309. return createElement('div', {
  310. // when renderId is changed, Vue will trigger a real-DOM async rerender, calling beforeUpdate/updated
  311. attrs: {
  312. 'data-fc-render-id': this.renderId
  313. }
  314. });
  315. },
  316. mounted: function mounted() {
  317. warnDeprecatedListeners(this.$listeners);
  318. this.$options.calendar = new Calendar(this.$el, this.buildCalendarOptions());
  319. this.$options.calendar.render();
  320. },
  321. beforeUpdate: function beforeUpdate() {
  322. this.renderDirty();
  323. },
  324. beforeDestroy: function beforeDestroy() {
  325. this.$options.calendar.destroy();
  326. },
  327. watch: mapHash(PROP_DEFS, buildPropWatcher),
  328. methods: {
  329. buildCalendarOptions: function buildCalendarOptions() {
  330. var _this = this;
  331. var options = {};
  332. var _iterator = _createForOfIteratorHelper(EMISSION_NAMES),
  333. _step;
  334. try {
  335. var _loop = function _loop() {
  336. var emissionName = _step.value;
  337. options[emissionName] = function () {
  338. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  339. args[_key] = arguments[_key];
  340. }
  341. _this.$emit.apply(_this, [emissionName].concat(args));
  342. };
  343. };
  344. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  345. _loop();
  346. } // do after emissions. these props will override emissions with same name
  347. } catch (err) {
  348. _iterator.e(err);
  349. } finally {
  350. _iterator.f();
  351. }
  352. for (var propName in PROP_DEFS) {
  353. var propVal = this[propName]; // protect against FullCalendar choking on undefined options
  354. if (propVal !== undefined) {
  355. if (PROP_IS_DEEP[propName]) {
  356. propVal = deepCopy(propVal); // freeze state
  357. this.deepCopies[propName] = propVal; // side effect!
  358. }
  359. options[propName] = propVal;
  360. }
  361. }
  362. return options;
  363. },
  364. recordDirtyOption: function recordDirtyOption(optionName, newVal) {
  365. (this.$options.dirtyOptions || (this.$options.dirtyOptions = {}))[optionName] = newVal;
  366. this.renderId++; // triggers a render eventually
  367. },
  368. renderDirty: function renderDirty() {
  369. var dirtyOptions = this.$options.dirtyOptions;
  370. if (dirtyOptions) {
  371. this.$options.dirtyOptions = null; // clear before rendering. might trigger new dirtiness
  372. this.$options.calendar.mutateOptions(dirtyOptions, [], false, deepEqual);
  373. }
  374. },
  375. getApi: function getApi() {
  376. return this.$options.calendar;
  377. }
  378. }
  379. };
  380. function buildPropWatcher(propDef, propName) {
  381. if (PROP_IS_DEEP[propName]) {
  382. return {
  383. deep: true,
  384. // listen to children as well
  385. handler: function handler(newVal) {
  386. // use this instead of the handler's param because if same reference, will always be equal
  387. var oldVal = this.deepCopies[propName];
  388. if (!deepEqual(newVal, oldVal)) {
  389. newVal = deepCopy(newVal); // freeze state
  390. this.deepCopies[propName] = newVal; // always keep this up to date
  391. this.recordDirtyOption(propName, newVal);
  392. }
  393. }
  394. };
  395. } else {
  396. return function (newVal) {
  397. this.recordDirtyOption(propName, newVal);
  398. };
  399. }
  400. }
  401. function warnDeprecatedListeners(listenerHash) {
  402. for (var emissionName in listenerHash) {
  403. if (EMISSION_USE_PROP[emissionName]) {
  404. console.warn('Use of ' + emissionName + ' as an event is deprecated. Please convert to a prop.');
  405. }
  406. }
  407. }
  408. /*
  409. Registers the component globally if appropriate.
  410. This modules exposes the component AND an install function.
  411. Derived from:
  412. https://vuejs.org/v2/cookbook/packaging-sfc-for-npm.html
  413. */
  414. var installed = false; // declare install function executed by Vue.use()
  415. function install(Vue) {
  416. if (!installed) {
  417. installed = true;
  418. Vue.component('FullCalendar', FullCalendarComponent);
  419. }
  420. } // detect a globally availble version of Vue (eg. in browser via <script> tag)
  421. var GlobalVue;
  422. if (typeof window !== 'undefined') {
  423. GlobalVue = window.Vue;
  424. } else if (typeof global !== 'undefined') {
  425. GlobalVue = global.Vue;
  426. } // auto-install if possible
  427. if (GlobalVue) {
  428. GlobalVue.use({
  429. install: install
  430. });
  431. } // to allow use as module (npm/webpack/etc.) export component
  432. export default FullCalendarComponent;
  433. export { install };