| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484 |
- /*
- FullCalendar Vue Component v4.4.2
- Docs: https://fullcalendar.io/docs/vue
- License: MIT
- */
- import deepEqual from 'fast-deep-equal';
- import { Calendar } from '@fullcalendar/core';
- function _typeof(obj) {
- "@babel/helpers - typeof";
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
- _typeof = function (obj) {
- return typeof obj;
- };
- } else {
- _typeof = function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
- };
- }
- return _typeof(obj);
- }
- function _unsupportedIterableToArray(o, minLen) {
- if (!o) return;
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
- var n = Object.prototype.toString.call(o).slice(8, -1);
- if (n === "Object" && o.constructor) n = o.constructor.name;
- if (n === "Map" || n === "Set") return Array.from(o);
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
- }
- function _arrayLikeToArray(arr, len) {
- if (len == null || len > arr.length) len = arr.length;
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
- return arr2;
- }
- function _createForOfIteratorHelper(o, allowArrayLike) {
- var it;
- if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
- if (it) o = it;
- var i = 0;
- var F = function () {};
- return {
- s: F,
- n: function () {
- if (i >= o.length) return {
- done: true
- };
- return {
- done: false,
- value: o[i++]
- };
- },
- e: function (e) {
- throw e;
- },
- f: F
- };
- }
- throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
- }
- var normalCompletion = true,
- didErr = false,
- err;
- return {
- s: function () {
- it = o[Symbol.iterator]();
- },
- n: function () {
- var step = it.next();
- normalCompletion = step.done;
- return step;
- },
- e: function (e) {
- didErr = true;
- err = e;
- },
- f: function () {
- try {
- if (!normalCompletion && it.return != null) it.return();
- } finally {
- if (didErr) throw err;
- }
- }
- };
- }
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- /*
- Really simple clone utility. Only copies plain arrays, objects, and Dates. Transfers everything else as-is.
- Wanted to use a third-party lib, but none did exactly this.
- */
- function deepCopy(input) {
- if (Array.isArray(input)) {
- return input.map(deepCopy);
- } else if (input instanceof Date) {
- return new Date(input.valueOf());
- } else if (_typeof(input) === 'object' && input) {
- // non-null object
- return mapHash(input, deepCopy);
- } else {
- // everything else (null, function, etc)
- return input;
- }
- }
- function mapHash(input, func) {
- var output = {};
- for (var key in input) {
- if (hasOwnProperty.call(input, key)) {
- output[key] = func(input[key], key);
- }
- }
- return output;
- }
- /*
- the docs point to this file as an index of options.
- when this files is moved, update the docs.
- */
- /*
- TODO: figure out booleans so attributes can be defined like:
- <FullCalendar editable />
- */
- var PROP_DEFS = {
- header: {},
- footer: {},
- customButtons: {},
- buttonIcons: {},
- themeSystem: {},
- bootstrapFontAwesome: {},
- firstDay: {},
- dir: {},
- weekends: {},
- hiddenDays: {},
- fixedWeekCount: {},
- weekNumbers: {},
- weekNumbersWithinDays: {},
- weekNumberCalculation: {},
- businessHours: {},
- showNonCurrentDates: {},
- height: {},
- contentHeight: {},
- aspectRatio: {},
- handleWindowResize: {},
- windowResizeDelay: {},
- eventLimit: {},
- eventLimitClick: {},
- timeZone: {},
- now: {},
- defaultView: {},
- allDaySlot: {},
- allDayText: {},
- slotDuration: {},
- slotLabelFormat: {},
- slotLabelInterval: {},
- snapDuration: {},
- scrollTime: {},
- minTime: {},
- maxTime: {},
- slotEventOverlap: {},
- listDayFormat: {},
- listDayAltFormat: {},
- noEventsMessage: {},
- defaultDate: {},
- nowIndicator: {},
- visibleRange: {},
- validRange: {},
- dateIncrement: {},
- dateAlignment: {},
- duration: {},
- dayCount: {},
- locales: {},
- locale: {},
- eventTimeFormat: {},
- columnHeader: {},
- columnHeaderFormat: {},
- columnHeaderText: {},
- columnHeaderHtml: {},
- titleFormat: {},
- weekLabel: {},
- displayEventTime: {},
- displayEventEnd: {},
- eventLimitText: {},
- dayPopoverFormat: {},
- navLinks: {},
- navLinkDayClick: {},
- navLinkWeekClick: {},
- selectable: {},
- selectMirror: {},
- unselectAuto: {},
- unselectCancel: {},
- defaultAllDayEventDuration: {},
- defaultTimedEventDuration: {},
- cmdFormatter: {},
- defaultRangeSeparator: {},
- selectConstraint: {},
- selectOverlap: {},
- selectAllow: {},
- editable: {},
- eventStartEditable: {},
- eventDurationEditable: {},
- eventConstraint: {},
- eventOverlap: {},
- eventAllow: {},
- eventClassName: {},
- eventClassNames: {},
- eventBackgroundColor: {},
- eventBorderColor: {},
- eventTextColor: {},
- eventColor: {},
- events: {},
- eventSources: {},
- allDayDefault: {},
- startParam: {},
- endParam: {},
- lazyFetching: {},
- nextDayThreshold: {},
- eventOrder: {},
- rerenderDelay: {},
- dragRevertDuration: {},
- dragScroll: {},
- longPressDelay: {},
- eventLongPressDelay: {},
- droppable: {},
- dropAccept: {},
- eventDataTransform: {},
- allDayMaintainDuration: {},
- eventResizableFromStart: {},
- timeGridEventMinHeight: {},
- allDayHtml: {},
- eventDragMinDistance: {},
- eventResourceEditable: {},
- eventSourceFailure: {},
- eventSourceSuccess: {},
- forceEventDuration: {},
- progressiveEventRendering: {},
- selectLongPressDelay: {},
- selectMinDistance: {},
- timeZoneParam: {},
- titleRangeSeparator: {},
- // compound OptionsInput...
- buttonText: {},
- views: {},
- plugins: {},
- // scheduler...
- schedulerLicenseKey: {},
- resources: {},
- resourceLabelText: {},
- resourceOrder: {},
- filterResourcesWithEvents: {},
- resourceText: {},
- resourceGroupField: {},
- resourceGroupText: {},
- resourceAreaWidth: {},
- resourceColumns: {},
- resourcesInitiallyExpanded: {},
- slotWidth: {},
- datesAboveResources: {},
- googleCalendarApiKey: {},
- refetchResourcesOnNavigate: {},
- // used to be emissions but are now props...
- datesRender: {},
- datesDestroy: {},
- dayRender: {},
- eventRender: {},
- eventDestroy: {},
- viewSkeletonRender: {},
- viewSkeletonDestroy: {},
- resourceRender: {}
- };
- var PROP_IS_DEEP = {
- header: true,
- footer: true,
- events: true,
- eventSources: true,
- resources: true
- };
- 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)
- 'datesRender', 'datesDestroy', 'dayRender', 'eventRender', 'eventDestroy', 'viewSkeletonRender', 'viewSkeletonDestroy', 'resourceRender']; // identify deprecated emissions (TODO: eventually remove)
- var EMISSION_USE_PROP = {
- datesRender: true,
- datesDestroy: true,
- dayRender: true,
- eventRender: true,
- eventDestroy: true,
- viewSkeletonRender: true,
- viewSkeletonDestroy: true,
- resourceRender: true
- };
- /*
- VOCAB:
- "props" are the values passed in from the parent (they are NOT listeners/emissions)
- "emissions" are another way to say "events that will fire"
- "options" are the options that the FullCalendar API accepts
- NOTE: "deep" props are complex objects that we want to watch for internal changes.
- Vue allows a reference to be internally mutated. Each time we detect a mutation,
- we use deepCopy to freeze the state. This has the added benefit of stripping the
- getter/setter methods that Vue embeds.
- */
- var FullCalendarComponent = {
- props: PROP_DEFS,
- // INTERNALS
- // this.$options.calendar
- // this.$options.deepCopies - all current deep options
- // this.$options.dirtyOptions - null/undefined means nothing dirty
- data: function data() {
- return {
- renderId: 0,
- deepCopies: {}
- };
- },
- render: function render(createElement) {
- return createElement('div', {
- // when renderId is changed, Vue will trigger a real-DOM async rerender, calling beforeUpdate/updated
- attrs: {
- 'data-fc-render-id': this.renderId
- }
- });
- },
- mounted: function mounted() {
- warnDeprecatedListeners(this.$listeners);
- this.$options.calendar = new Calendar(this.$el, this.buildCalendarOptions());
- this.$options.calendar.render();
- },
- beforeUpdate: function beforeUpdate() {
- this.renderDirty();
- },
- beforeDestroy: function beforeDestroy() {
- this.$options.calendar.destroy();
- },
- watch: mapHash(PROP_DEFS, buildPropWatcher),
- methods: {
- buildCalendarOptions: function buildCalendarOptions() {
- var _this = this;
- var options = {};
- var _iterator = _createForOfIteratorHelper(EMISSION_NAMES),
- _step;
- try {
- var _loop = function _loop() {
- var emissionName = _step.value;
- options[emissionName] = function () {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- _this.$emit.apply(_this, [emissionName].concat(args));
- };
- };
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
- _loop();
- } // do after emissions. these props will override emissions with same name
- } catch (err) {
- _iterator.e(err);
- } finally {
- _iterator.f();
- }
- for (var propName in PROP_DEFS) {
- var propVal = this[propName]; // protect against FullCalendar choking on undefined options
- if (propVal !== undefined) {
- if (PROP_IS_DEEP[propName]) {
- propVal = deepCopy(propVal); // freeze state
- this.deepCopies[propName] = propVal; // side effect!
- }
- options[propName] = propVal;
- }
- }
- return options;
- },
- recordDirtyOption: function recordDirtyOption(optionName, newVal) {
- (this.$options.dirtyOptions || (this.$options.dirtyOptions = {}))[optionName] = newVal;
- this.renderId++; // triggers a render eventually
- },
- renderDirty: function renderDirty() {
- var dirtyOptions = this.$options.dirtyOptions;
- if (dirtyOptions) {
- this.$options.dirtyOptions = null; // clear before rendering. might trigger new dirtiness
- this.$options.calendar.mutateOptions(dirtyOptions, [], false, deepEqual);
- }
- },
- getApi: function getApi() {
- return this.$options.calendar;
- }
- }
- };
- function buildPropWatcher(propDef, propName) {
- if (PROP_IS_DEEP[propName]) {
- return {
- deep: true,
- // listen to children as well
- handler: function handler(newVal) {
- // use this instead of the handler's param because if same reference, will always be equal
- var oldVal = this.deepCopies[propName];
- if (!deepEqual(newVal, oldVal)) {
- newVal = deepCopy(newVal); // freeze state
- this.deepCopies[propName] = newVal; // always keep this up to date
- this.recordDirtyOption(propName, newVal);
- }
- }
- };
- } else {
- return function (newVal) {
- this.recordDirtyOption(propName, newVal);
- };
- }
- }
- function warnDeprecatedListeners(listenerHash) {
- for (var emissionName in listenerHash) {
- if (EMISSION_USE_PROP[emissionName]) {
- console.warn('Use of ' + emissionName + ' as an event is deprecated. Please convert to a prop.');
- }
- }
- }
- /*
- Registers the component globally if appropriate.
- This modules exposes the component AND an install function.
- Derived from:
- https://vuejs.org/v2/cookbook/packaging-sfc-for-npm.html
- */
- var installed = false; // declare install function executed by Vue.use()
- function install(Vue) {
- if (!installed) {
- installed = true;
- Vue.component('FullCalendar', FullCalendarComponent);
- }
- } // detect a globally availble version of Vue (eg. in browser via <script> tag)
- var GlobalVue;
- if (typeof window !== 'undefined') {
- GlobalVue = window.Vue;
- } else if (typeof global !== 'undefined') {
- GlobalVue = global.Vue;
- } // auto-install if possible
- if (GlobalVue) {
- GlobalVue.use({
- install: install
- });
- } // to allow use as module (npm/webpack/etc.) export component
- export default FullCalendarComponent;
- export { install };
|