main.umd.js 15 KB

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