{"version":3,"file":"js/application-99d255b205fb8f3288d8.js","sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/channels/consumer.js","webpack:///./app/javascript/channels/waitlist_channel.js","webpack:///./app/javascript/packs/application.js","webpack:///./app/javascript/packs/calendars/day.js","webpack:///./app/javascript/packs/calendars/month.js","webpack:///./app/javascript/packs/calendars/week.js","webpack:///./app/javascript/packs/line.js","webpack:///./app/javascript/packs/line_single_template.js","webpack:///./app/javascript/packs/medical_question.js","webpack:///./app/javascript/packs/navbar.js","webpack:///./app/javascript/packs/setting.js","webpack:///./app/javascript/packs/shift.js","webpack:///./app/javascript/packs/waitlist.js","webpack:///./app/javascript/packs/waitlist_search.js","webpack:///./node_modules/@fullcalendar/common/main.css?a8ed","webpack:///./node_modules/@fullcalendar/common/main.js","webpack:///./node_modules/@fullcalendar/common/vdom.js","webpack:///./node_modules/@fullcalendar/core/main.js","webpack:///./node_modules/@fullcalendar/core/vdom.js","webpack:///./node_modules/@fullcalendar/daygrid/main.css?907f","webpack:///./node_modules/@fullcalendar/daygrid/main.js","webpack:///./node_modules/@fullcalendar/interaction/main.js","webpack:///./node_modules/@fullcalendar/premium-common/main.js","webpack:///./node_modules/@fullcalendar/resource-common/main.js","webpack:///./node_modules/@fullcalendar/resource-daygrid/main.js","webpack:///./node_modules/@fullcalendar/resource-timegrid/main.js","webpack:///./node_modules/@fullcalendar/timegrid/main.css?d99b","webpack:///./node_modules/@fullcalendar/timegrid/main.js","webpack:///./node_modules/@rails/actioncable/app/assets/javascripts/action_cable.js","webpack:///./node_modules/@rails/activestorage/app/assets/javascripts/activestorage.js","webpack:///./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js","webpack:///./node_modules/admin-lte/dist/js/adminlte.min.js","webpack:///./node_modules/bootstrap/dist/js/bootstrap.js","webpack:///./node_modules/bootstrap/js/dist/modal.js","webpack:///./node_modules/bootstrap/js/dist/util.js","webpack:///./node_modules/bootstrap4-toggle/js/bootstrap4-toggle.min.js","webpack:///./node_modules/@fullcalendar/common/main.css","webpack:///./node_modules/@fullcalendar/daygrid/main.css","webpack:///./node_modules/@fullcalendar/timegrid/main.css","webpack:///./node_modules/lightbox2/dist/css/lightbox.min.css","webpack:///./node_modules/select2/dist/css/select2.css","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/css-loader/dist/runtime/getUrl.js","webpack:///./node_modules/jquery/dist/jquery.js","webpack:///./node_modules/lightbox2/dist/css/lightbox.min.css?f13e","webpack:///./node_modules/lightbox2/dist/images/close.png","webpack:///./node_modules/lightbox2/dist/images/loading.gif","webpack:///./node_modules/lightbox2/dist/images/next.png","webpack:///./node_modules/lightbox2/dist/images/prev.png","webpack:///./node_modules/lightbox2/dist/js/lightbox.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./node_modules/moment/locale/af.js","webpack:///./node_modules/moment/locale/ar-dz.js","webpack:///./node_modules/moment/locale/ar-kw.js","webpack:///./node_modules/moment/locale/ar-ly.js","webpack:///./node_modules/moment/locale/ar-ma.js","webpack:///./node_modules/moment/locale/ar-sa.js","webpack:///./node_modules/moment/locale/ar-tn.js","webpack:///./node_modules/moment/locale/ar.js","webpack:///./node_modules/moment/locale/az.js","webpack:///./node_modules/moment/locale/be.js","webpack:///./node_modules/moment/locale/bg.js","webpack:///./node_modules/moment/locale/bm.js","webpack:///./node_modules/moment/locale/bn-bd.js","webpack:///./node_modules/moment/locale/bn.js","webpack:///./node_modules/moment/locale/bo.js","webpack:///./node_modules/moment/locale/br.js","webpack:///./node_modules/moment/locale/bs.js","webpack:///./node_modules/moment/locale/ca.js","webpack:///./node_modules/moment/locale/cs.js","webpack:///./node_modules/moment/locale/cv.js","webpack:///./node_modules/moment/locale/cy.js","webpack:///./node_modules/moment/locale/da.js","webpack:///./node_modules/moment/locale/de-at.js","webpack:///./node_modules/moment/locale/de-ch.js","webpack:///./node_modules/moment/locale/de.js","webpack:///./node_modules/moment/locale/dv.js","webpack:///./node_modules/moment/locale/el.js","webpack:///./node_modules/moment/locale/en-au.js","webpack:///./node_modules/moment/locale/en-ca.js","webpack:///./node_modules/moment/locale/en-gb.js","webpack:///./node_modules/moment/locale/en-ie.js","webpack:///./node_modules/moment/locale/en-il.js","webpack:///./node_modules/moment/locale/en-in.js","webpack:///./node_modules/moment/locale/en-nz.js","webpack:///./node_modules/moment/locale/en-sg.js","webpack:///./node_modules/moment/locale/eo.js","webpack:///./node_modules/moment/locale/es-do.js","webpack:///./node_modules/moment/locale/es-mx.js","webpack:///./node_modules/moment/locale/es-us.js","webpack:///./node_modules/moment/locale/es.js","webpack:///./node_modules/moment/locale/et.js","webpack:///./node_modules/moment/locale/eu.js","webpack:///./node_modules/moment/locale/fa.js","webpack:///./node_modules/moment/locale/fi.js","webpack:///./node_modules/moment/locale/fil.js","webpack:///./node_modules/moment/locale/fo.js","webpack:///./node_modules/moment/locale/fr-ca.js","webpack:///./node_modules/moment/locale/fr-ch.js","webpack:///./node_modules/moment/locale/fr.js","webpack:///./node_modules/moment/locale/fy.js","webpack:///./node_modules/moment/locale/ga.js","webpack:///./node_modules/moment/locale/gd.js","webpack:///./node_modules/moment/locale/gl.js","webpack:///./node_modules/moment/locale/gom-deva.js","webpack:///./node_modules/moment/locale/gom-latn.js","webpack:///./node_modules/moment/locale/gu.js","webpack:///./node_modules/moment/locale/he.js","webpack:///./node_modules/moment/locale/hi.js","webpack:///./node_modules/moment/locale/hr.js","webpack:///./node_modules/moment/locale/hu.js","webpack:///./node_modules/moment/locale/hy-am.js","webpack:///./node_modules/moment/locale/id.js","webpack:///./node_modules/moment/locale/is.js","webpack:///./node_modules/moment/locale/it-ch.js","webpack:///./node_modules/moment/locale/it.js","webpack:///./node_modules/moment/locale/ja.js","webpack:///./node_modules/moment/locale/jv.js","webpack:///./node_modules/moment/locale/ka.js","webpack:///./node_modules/moment/locale/kk.js","webpack:///./node_modules/moment/locale/km.js","webpack:///./node_modules/moment/locale/kn.js","webpack:///./node_modules/moment/locale/ko.js","webpack:///./node_modules/moment/locale/ku.js","webpack:///./node_modules/moment/locale/ky.js","webpack:///./node_modules/moment/locale/lb.js","webpack:///./node_modules/moment/locale/lo.js","webpack:///./node_modules/moment/locale/lt.js","webpack:///./node_modules/moment/locale/lv.js","webpack:///./node_modules/moment/locale/me.js","webpack:///./node_modules/moment/locale/mi.js","webpack:///./node_modules/moment/locale/mk.js","webpack:///./node_modules/moment/locale/ml.js","webpack:///./node_modules/moment/locale/mn.js","webpack:///./node_modules/moment/locale/mr.js","webpack:///./node_modules/moment/locale/ms-my.js","webpack:///./node_modules/moment/locale/ms.js","webpack:///./node_modules/moment/locale/mt.js","webpack:///./node_modules/moment/locale/my.js","webpack:///./node_modules/moment/locale/nb.js","webpack:///./node_modules/moment/locale/ne.js","webpack:///./node_modules/moment/locale/nl-be.js","webpack:///./node_modules/moment/locale/nl.js","webpack:///./node_modules/moment/locale/nn.js","webpack:///./node_modules/moment/locale/oc-lnc.js","webpack:///./node_modules/moment/locale/pa-in.js","webpack:///./node_modules/moment/locale/pl.js","webpack:///./node_modules/moment/locale/pt-br.js","webpack:///./node_modules/moment/locale/pt.js","webpack:///./node_modules/moment/locale/ro.js","webpack:///./node_modules/moment/locale/ru.js","webpack:///./node_modules/moment/locale/sd.js","webpack:///./node_modules/moment/locale/se.js","webpack:///./node_modules/moment/locale/si.js","webpack:///./node_modules/moment/locale/sk.js","webpack:///./node_modules/moment/locale/sl.js","webpack:///./node_modules/moment/locale/sq.js","webpack:///./node_modules/moment/locale/sr-cyrl.js","webpack:///./node_modules/moment/locale/sr.js","webpack:///./node_modules/moment/locale/ss.js","webpack:///./node_modules/moment/locale/sv.js","webpack:///./node_modules/moment/locale/sw.js","webpack:///./node_modules/moment/locale/ta.js","webpack:///./node_modules/moment/locale/te.js","webpack:///./node_modules/moment/locale/tet.js","webpack:///./node_modules/moment/locale/tg.js","webpack:///./node_modules/moment/locale/th.js","webpack:///./node_modules/moment/locale/tk.js","webpack:///./node_modules/moment/locale/tl-ph.js","webpack:///./node_modules/moment/locale/tlh.js","webpack:///./node_modules/moment/locale/tr.js","webpack:///./node_modules/moment/locale/tzl.js","webpack:///./node_modules/moment/locale/tzm-latn.js","webpack:///./node_modules/moment/locale/tzm.js","webpack:///./node_modules/moment/locale/ug-cn.js","webpack:///./node_modules/moment/locale/uk.js","webpack:///./node_modules/moment/locale/ur.js","webpack:///./node_modules/moment/locale/uz-latn.js","webpack:///./node_modules/moment/locale/uz.js","webpack:///./node_modules/moment/locale/vi.js","webpack:///./node_modules/moment/locale/x-pseudo.js","webpack:///./node_modules/moment/locale/yo.js","webpack:///./node_modules/moment/locale/zh-cn.js","webpack:///./node_modules/moment/locale/zh-hk.js","webpack:///./node_modules/moment/locale/zh-mo.js","webpack:///./node_modules/moment/locale/zh-tw.js","webpack:///./node_modules/moment/moment.js","webpack:///./node_modules/popper.js/dist/esm/popper.js","webpack:///./node_modules/preact/compat/dist/compat.module.js","webpack:///./node_modules/preact/dist/preact.module.js","webpack:///./node_modules/preact/hooks/dist/hooks.module.js","webpack:///./node_modules/select2/dist/css/select2.css?3b33","webpack:///./node_modules/select2/dist/js/select2.js","webpack:///./node_modules/sortablejs/modular/sortable.esm.js","webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack:///./node_modules/sweetalert2/dist/sweetalert2.all.js","webpack:///./node_modules/tslib/tslib.es6.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/module.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./app/javascript/packs/application.js\");\n","// Action Cable provides the framework to deal with WebSockets in Rails.\n// You can generate new channels where WebSocket features live using the `rails generate channel` command.\n\nimport { createConsumer } from \"@rails/actioncable\"\n\nexport default createConsumer()\n","import consumer from \"./consumer\"\n\nimport { MonthCalendar } from \"../packs/calendars/month\";\nimport { WeekCalendar } from \"../packs/calendars/week\";\nimport { DayCalendar } from \"../packs/calendars/day\";\n\n$(function () {\n var selectedDate = null\n let params = new URLSearchParams(location.search)\n\n if (isSubscriptionsPath()) {\n let stmcCode = location.pathname.split('/')[1];\n\n consumer.subscriptions.create({ channel: \"WaitlistChannel\", stmc_code: stmcCode }, {\n received(data) {\n let date = params.get(\"date\");\n let entryTime = new Date(data.entry_time)\n selectedDate = date ? new Date(date) : new Date()\n if (!(entryTime.getFullYear() == selectedDate.getFullYear() && entryTime.getMonth() + 1 == selectedDate.getMonth() + 1 && entryTime.getDate() == selectedDate.getDate())) return\n notifyRecentArrival(data)\n },\n });\n };\n\n displaySoundPermission()\n let calObj = setCalenderObj();\n\n function setCalenderObj() {\n if (params.get('calendar_type') == 'month') return MonthCalendar.generate();\n if (params.get('calendar_type') == 'week') return WeekCalendar.generate();\n return DayCalendar.generate();\n }\n\n function isSubscriptionsPath() {\n return \"waitlists\" == location.pathname.split('/')[2]\n }\n\n function notifyRecentArrival(data) {\n let waitlistViewModeIsCalendar = $('#waitlist_view_mode').val() == 'calendar';\n if (JSON.parse(data.is_create)) {\n createPush('新着の受付があります。');\n displayRecentArrivalBatchForTab(data.recent_entry_tab_id, data.default_tab_id);\n if (waitlistViewModeIsCalendar) {\n calendarPartialUpdate();\n } else {\n waitlistsPartialUpdate();\n displayRecentArrivalCount();\n }\n // 音が有効の場合のみ\n if (localStorage.getItem('sound-disable') == null) {\n createNotificationSound();\n }\n } else if (JSON.parse(data.is_cancel)) {\n waitlistViewModeIsCalendar ? calendarPartialUpdate() : waitlistsPartialUpdate();\n createPush('受付がキャンセルされました。');\n } else {\n waitlistViewModeIsCalendar ? calendarPartialUpdate() : waitlistsPartialUpdate();\n }\n }\n\n // 受付一覧の部分更新\n function waitlistsPartialUpdate() {\n let targetPath = location.pathname;\n // ソトマチ・保留・完了一覧以外のpath以外が来ることはない気はするが、\n // 万が一別のpathがきた際にこの処理が走ると表示が崩れるため一応チェックしている\n let pathCheck = targetPath.includes('waitings') || targetPath.includes('holdings') || targetPath.includes('completed');\n if (!pathCheck) { return };\n $.ajax({\n type: 'GET',\n url: targetPath,\n data: {\n date: `${selectedDate.getFullYear()}-${selectedDate.getMonth() + 1}-${selectedDate.getDate()}`,\n required_item_id: params.get('required_item_id'),\n tab_id: params.get('tab_id'),\n calendar_type: params.get('calendar_type')\n },\n dataType: 'html'\n }).done(function (result) {\n // タブの受付件数表示箇所の部分更新\n $('.tab-item').each(function (index, element) {\n let tabPartialUpdateList = $('.js-tab-partial-update', $(result));\n $(element).html(tabPartialUpdateList[index]);\n });\n\n // 画面更新前に受付エリアのスクロール位置を取っておく\n const currentScrollPosition = document.getElementsByClassName('waitlist-area')[0].scrollTop;\n\n // モーダルが開いている場合部分更新を行うとバグが起きるため、モーダルを閉じた際に部分更新を行う\n if ($('body').hasClass('modal-open')) {\n let showModal = $('.modal.show')\n showModal.on('hidden.bs.modal', function (e) {\n $('.tab-area').html($('.waitlist-area', $(result)));\n $('[data-toggle=\"tooltip\"]').tooltip();\n setHeightToWaitlistArea(currentScrollPosition);\n });\n } else {\n $('.tab-area').html($('.waitlist-area', $(result)));\n $('[data-toggle=\"tooltip\"]').tooltip();\n }\n\n // 完了, 保留, 問診依頼、再撮影依頼ボタン押下時\n $('.js-btn-complete, .js-btn-pending, .js-btn-request_interview, .js-btn-call, .js-btn-requested_card_resend').on('click', (e) => {\n $(this).prop('disabled', 'true');\n e.preventDefault();\n e.stopPropagation();\n const target = e.target;\n const link = e.target.href;\n const text = e.target.text;\n actionConfirmModal(target, link, text);\n });\n\n createWaitlistModal();\n tmpReservationModal();\n setHeightToWaitlistArea(currentScrollPosition);\n }).fail(function (err) {\n console.log(err);\n })\n }\n\n // カレンダーの部分更新\n function calendarPartialUpdate() {\n if (params.get('calendar_type') == 'week') {\n return location.reload();\n }\n\n let targetPath = location.pathname;\n\n $.ajax({\n type: 'GET',\n url: targetPath,\n data: {\n date: `${selectedDate.getFullYear()}-${selectedDate.getMonth() + 1}-${selectedDate.getDate()}`,\n required_item_id: params.get('required_item_id'),\n tab_id: params.get('tab_id'),\n calendar_type: params.get('calendar_type')\n },\n dataType: 'html'\n }).done(function (result) {\n // タブの受付件数表示箇所の部分更新\n $('.tab-item').each(function (index, element) {\n let tabPartialUpdateList = $('.js-tab-partial-update', $(result));\n $(element).html(tabPartialUpdateList[index]);\n });\n\n // 部分更新を行う際tooltipが出ていると残ってしまうので\n // ここで全て消す\n removeAllTooltips();\n\n // カレンダーを一度リセット\n calObj.removeAllEvents();\n // カレンダーイベントの更新\n let calendarEvents = $(result).find('#calendar-events').data('events');\n calObj.addEventSource({ events: calendarEvents });\n\n // 画面更新後ツールチップが残ってしまっている可能性があるため削除する\n $(\".tooltip\").remove();\n // ツールチップを初期化する(これがないと崩れる)\n $('.event-content-tooltip').tooltip();\n\n createWaitlistModal();\n }).fail(function (err) {\n console.log(err);\n })\n }\n\n // Waitlist確認モーダル\n function actionConfirmModal(target, link, text) {\n const isRequestInterview = $(target).hasClass('js-btn-request_interview');\n const isCall = $(target).hasClass('js-btn-call');\n const isRequestedCardResend = $(target).hasClass('js-btn-requested_card_resend');\n let config = {\n showConfirmButton: true,\n showCancelButton: true,\n timer: null,\n allowOutsideClick: true,\n confirmButtonColor: '#16a378',\n cancelButtonText: \"いいえ\",\n };\n let addConfig = {};\n\n if (isRequestInterview) { // 問診依頼\n addConfig = {\n title: '問診の入力を依頼する',\n text: 'LINEを送信しますがよろしいですか?',\n confirmButtonText: '送信する'\n }\n } else if (isCall) {\n addConfig = {\n title: '呼び出しする',\n text: '呼び出しは取り消しできません。よろしいですか?',\n confirmButtonText: '呼び出す'\n }\n } else if (isRequestedCardResend) {\n addConfig = {\n title: '再撮影依頼する',\n text: '再撮影依頼は取り消しできません。よろしいですか?',\n confirmButtonText: '再撮影依頼'\n }\n } else { // タブ移動\n addConfig = {\n title: `${text}に移動する`,\n text: '元に戻せませんがよろしいですか?',\n confirmButtonText: '移動する'\n }\n }\n config = { ...config, ...addConfig };\n\n Swal.fire(config).then((e) => {\n if (e.isConfirmed) {\n $.ajax({ url: link, type: \"GET\" });\n if (!isRequestInterview && !isCall && !isRequestedCardResend) {\n $(target).closest('.js-waitlist').fadeOut();\n }\n }\n });\n }\n\n // push通知の作成\n function createPush(content) {\n Push.create(content, {\n icon: '../../../favicon.ico',\n timeout: 10000,\n onClick: function () {\n window.focus();\n this.close();\n }\n });\n }\n\n // 通知音の作成\n function createNotificationSound() {\n let context = new AudioContext();\n let source = context.createBufferSource();\n\n let request = new XMLHttpRequest();\n request.open('GET', '/push_notification.mp3', true);\n request.responseType = 'arraybuffer';\n request.send();\n\n request.onload = function () {\n let res = request.response;\n context.decodeAudioData(res, function (buf) {\n source.buffer = buf;\n });\n };\n\n source.connect(context.destination);\n source.start();\n source.stop(1);\n }\n\n // 新着の受付の件数を画面下部に表示\n function displayRecentArrivalCount() {\n if ($(document).innerHeight() > $(window).innerHeight()) {\n // 新着お知らせメッセージに表示している新着の受付の件数を更新\n let currentCount = Number($('.recent-arrival-count').text());\n if (!isNaN(currentCount)) { $('.recent-arrival-count').text(currentCount + 1) }\n $('.recent-arrival-notification').show();\n }\n }\n\n // 現在開いているタブと別のタブで新着の受付があった場合にバッチを表示\n function displayRecentArrivalBatchForTab(recentEntryTabId, defaultTabId) {\n // 現在のタブを取得し取得できなければデフォルトのタブであると判定する\n var currentTabId = params.get('tab_id')\n if (!currentTabId) currentTabId = defaultTabId\n\n $('.tab-item').each(function () {\n let dataTabId = $(this).data('tab-id');\n if (Number(dataTabId) === Number(recentEntryTabId) && Number(dataTabId) !== Number(currentTabId)) {\n $(this).addClass('recent-arrival-batch');\n }\n });\n }\n\n // 新着お知らせメッセージを消すためのスクロールイベント\n $(window).on('scroll', function () {\n let docHeight = $(document).innerHeight(); //ドキュメントの高さ\n let windowHeight = $(window).innerHeight(); //ウィンドウの高さ\n let pageBottom = docHeight - windowHeight;\n if (pageBottom <= $(window).scrollTop()) {\n //ウィンドウの一番下までスクロールした時に新着お知らせメッセージを消す\n $('.recent-arrival-notification').hide();\n // 新着お知らせメッセージに表示している新着の受付の件数をリセット\n $('.recent-arrival-count').text('');\n }\n })\n\n // 新着お知らせメッセージを消すボタンのクリックイベント\n $('.notification-close-button').on('click', function () {\n $('.recent-arrival-notification').hide();\n // 新着お知らせメッセージに表示している新着の受付の件数をリセット\n $('.recent-arrival-count').text('');\n });\n\n // 音声通知許可のダイアログ\n // 音を鳴らすには何かしらのマウス操作が必要なため一度ポップアップを押してもらう\n function displaySoundPermission() {\n if (localStorage.getItem('sound-disable') == null) {\n // 音が有効の場合ダイアログ表示\n if (performance.getEntriesByType(\"navigation\")[0].type === 'reload') {\n // 画面更新されたらセッション削除し、改めて通知許可ポップアップを開く\n sessionStorage.removeItem('sound-permission');\n } else if (performance.getEntriesByType(\"navigation\")[0].type === 'navigate') {\n // 画面遷移したらセッション設定し、通知許可ポップアップは開かない\n sessionStorage.setItem('sound-permission', true);\n }\n\n // 新着通知音許可ポップアップignore設定されている場合(仮予約の時のみ)\n if (sessionStorage.getItem('sound-permission-ignore') !== null) {\n // セッション設定し、通知許可ポップアップは開かない\n sessionStorage.setItem('sound-permission', true);\n sessionStorage.removeItem('sound-permission-ignore');\n }\n if (sessionStorage.getItem('sound-permission') === null) {\n // 通知許可がされていない場合\n $('.sound-permission').show();\n }\n } else {\n // 音が無効の場合ダイアログ表示せず、アイコン切り替える\n let icon = $('.js-volume').find('i');\n icon.removeClass('fa-volume-up');\n icon.addClass('fa-volume-mute');\n }\n }\n\n // 新着通知音許可メッセージを消すボタンのクリックイベント\n $('.sound-permission-close-button').on('click', function () {\n $('.sound-permission').hide();\n sessionStorage.setItem('sound-permission', true);\n });\n\n $('.js-volume').on('click', function () {\n let icon = $(this).find('i');\n if (localStorage.getItem('sound-disable') == null) {\n // 音を有効→無効に切り替えの場合\n localStorage.setItem('sound-disable', true);\n icon.removeClass('fa-volume-up');\n icon.addClass('fa-volume-mute');\n $('.sound-permission').hide();\n } else {\n // 音を無効→有効に切り替えの場合\n localStorage.removeItem('sound-disable');\n icon.removeClass('fa-volume-mute');\n icon.addClass('fa-volume-up');\n if (sessionStorage.getItem('sound-permission') === null) {\n // 通知許可がされていない場合\n $('.sound-permission').show();\n }\n }\n });\n\n // Waitlist登録用モーダルの処理\n createWaitlistModal();\n function createWaitlistModal() {\n $('.js-btn-add-waitlist').on('click', (e) => {\n let entryTime = e.target.dataset.date\n let staffId = e.target.dataset.staffId\n // 仮予約\n $('#waitlist_entry_time').val(entryTime);\n\n // 予約\n $('.js-modal-entry-time').val(entryTime);\n // シフトに入っているstaff一覧取得\n let stmcCode = location.pathname.split('/')[1];\n $.ajax({\n type: 'GET',\n url: `/${stmcCode}/hospital/staffs_on_shift`,\n data: {\n date: entryTime,\n staff_id: staffId,\n }\n }).done(function (data) {\n // 仮予約\n let tmpStaffIdForm = $('.js-modal-tmp-staff-id');\n tmpStaffIdForm.children().remove();\n $.each(data, function (index, value) {\n tmpStaffIdForm.append(``);\n });\n // 予約\n let staffIdForm = $('.js-modal-staff-id');\n staffIdForm.children().remove();\n $.each(data, function (index, value) {\n staffIdForm.append(``);\n });\n });\n });\n }\n\n // 一覧表示:仮予約処理\n tmpReservationModal();\n function tmpReservationModal() {\n $('.js-btn-tmp-reservation').on('click', (e) => {\n $('#waitlist_entry_time').val(e.target.dataset.date);\n if (e.target.dataset.isAm === 'true') {\n $('.am_staffs').show();\n $('.am_staffs').prop('disabled', false);\n $('.pm_staffs').hide();\n $('.pm_staffs').prop('disabled', true);\n } else if (e.target.dataset.isPm === 'true') {\n $('.am_staffs').hide();\n $('.am_staffs').prop('disabled', true);\n $('.pm_staffs').show();\n $('.pm_staffs').prop('disabled', false);\n };\n });\n }\n function setHeightToWaitlistArea(currentScrollPosition) {\n // カレンダー表示ではない場合に処理を行う\n if (!document.getElementById('day-calendar')) {\n // waitlist-areaに高さを付与する\n const targetElements = document.getElementsByClassName('waitlist-area');\n for (let i = 0; i < targetElements.length; i++) {\n let documentHeight = window.innerHeight;\n // 比率で余白を決めるようにする\n let marginSize = documentHeight / 5.5;\n targetElements[i].style.height = `${documentHeight - marginSize}px`;\n targetElements[i].style.overflow = \"scroll\";\n targetElements[i].scrollTop = currentScrollPosition;\n }\n }\n }\n function removeAllTooltips() {\n const tooltipElements = document.getElementsByClassName(\"tooltip fade show\");\n Array.from(tooltipElements).forEach(element => {\n element.remove();\n });\n }\n})\n","// This file is automatically compiled by Webpack, along with any other files\n// present in this directory. You're encouraged to place your actual application logic in\n// a relevant structure within app/javascript and only use these pack files to reference\n// that code so it'll be compiled.\n\nrequire(\"@rails/ujs\").start()\n// require(\"turbolinks\").start()\nrequire(\"@rails/activestorage\").start()\n\n// Uncomment to copy all static images under ../images to the output folder and reference\n// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)\n// or the `imagePath` JavaScript helper below.\n//\n// const images = require.context('../images', true)\n// const imagePath = (name) => images(name, true)\nrequire(\"jquery\")\nrequire(\"bootstrap\")\nrequire(\"bootstrap4-toggle\")\nrequire(\"admin-lte\")\nrequire('lightbox2');\nrequire('sortablejs');\nimport 'lightbox2/dist/css/lightbox.min.css';\nimport 'packs/setting';\nimport 'packs/shift';\nimport 'packs/waitlist';\nimport 'packs/waitlist_search';\nimport 'packs/navbar';\nimport 'packs/medical_question';\nimport 'packs/line';\nimport 'packs/line_single_template';\nimport '../channels/waitlist_channel';\nimport lightbox from 'lightbox2'\nimport Swal from 'sweetalert2';\nimport Sortable from 'sortablejs';\n\nwindow.$ = jQuery;\nwindow.lightbox = lightbox;\nwindow.Swal = Swal;\nwindow.Sortable = Sortable;\n\nimport moment from 'moment'\nwindow.moment = moment\n\n$(function () {\n $('[data-toggle=\"tooltip\"]').tooltip();\n\n // LINE公式サイトモーダル\n $('#lineOfficialWebsite .btn-confirm').on('click', () => {\n $('#lineOfficialWebsite').modal('hide');\n });\n});\n","import { Calendar } from \"@fullcalendar/core\";\nimport interactionPlugin from \"@fullcalendar/interaction\";\nimport resourceTimeGridPlugin from '@fullcalendar/resource-timegrid';\nimport 'bootstrap/js/dist/modal';\n\nexport class DayCalendar {\n // resource(コマ)を表示しているヘッダーに付与するクラス名\n static resourceHeaderClassName = 'resource-timegrid-calendar-resource-header';\n // 上記ヘッダーの内側の要素のクラス名\n static resourceHeaderInnerClassName = 'fc-scrollgrid-sync-inner'\n // resource(コマ)全件表示の際、ヘッダーに付与するクラス名\n static viewAllResourceHeaderClassName = 'view-all-resource-header'\n // resource(コマ)一件表示の際、ヘッダーに付与するクラス名\n static selectedResourceHeaderClassName = 'selected-resource-header'\n // モーダルの開閉を管理(二重で開かないようにする)\n static isModalOpen = false;\n\n static generate() {\n let calendarEl = document.getElementById(\"day-calendar\");\n if (calendarEl == null) { return }\n let calendarEvents = $('#calendar-events').data('events');\n let resources = $('#calendar-staffs').data('staffs');\n let breakTimes = $('#calendar-break-times').data('break-times');\n let date = $('#calendar-date').data('date');\n let initData = $('#calendar-init').data('init');\n let komaTime = initData[\"koma_time\"];\n let startTime = initData[\"start_time\"];\n let endTime = initData[\"end_time\"];\n\n let scrollTime = this._setScrollTime(date, startTime)\n\n let calendar = new Calendar(calendarEl, {\n height: this._height(),\n schedulerLicenseKey: 'CC-Attribution-NonCommercial-NoDerivatives', // TODO\n plugins: [interactionPlugin, resourceTimeGridPlugin],\n initialView: \"resourceTimeGridDay\",\n headerToolbar: { left: \"\", center: \"\", right: \"\", },\n initialDate: date,\n scrollTime: scrollTime,\n slotDuration: `00:${komaTime}:00`,\n slotMinTime: startTime,\n slotMaxTime: endTime,\n locale: \"ja\",\n editable: false,\n eventResourceEditable: true,\n eventStartEditable: true,\n eventDrop: this._eventDrop(this),\n resources: resources,\n resourceOrder: 'order',\n events: calendarEvents,\n eventContent: this._eventContent(),\n eventDidMount: this._eventDidMount(),\n slotEventOverlap: false,\n allDaySlot: false,\n slotLabelInterval: `00:${komaTime}:00`,\n slotLabelFormat: {\n hour: '2-digit',\n minute: '2-digit',\n meridiem: false,\n hour12: false\n },\n slotLaneClassNames: this._addClassFutureBreaksSlotLane(date, breakTimes),\n resourceLabelClassNames: this.resourceHeaderClassName,\n eventClick: this._eventClick(),\n eventOrder: \"type\", // 登録イベントが右側に来るようにする\n });\n\n calendar.render();\n\n // カレンダーのheaderにクリックリスナーを仕込む\n this._selectResource(resources, calendar)\n\n // カレンダーのheaderに全件表示の際のクラスを当てる\n this._resourceHeaderAddClass()\n\n // シフトがお休みのスタッフのカレンダーにクラスを当てる\n this._addClassUnscheduledStaffResource(calendar)\n\n return calendar;\n }\n\n static _height() {\n let documentHeight = document.documentElement.offsetHeight\n // 比率で余白を決めるようにする\n let marginSize = documentHeight / 5.5\n return documentHeight - marginSize\n }\n\n static _setScrollTime(date, startTime) {\n let selectedDate = new Date(`${date} ${startTime}`);\n let currentDate = new Date();\n\n if (this._isSelectedDayToday(selectedDate, currentDate)) {\n if (selectedDate >= currentDate) {\n return startTime\n } else {\n let currentHours = currentDate.getHours()\n let currentMinutes = currentDate.getMinutes()\n let currentSeconds = currentDate.getSeconds()\n // scrollTimeに指定する際、一桁の数字だと正常に動作しないためゼロパディングを行う\n return `${this._zeroPadding(currentHours)}:${this._zeroPadding(currentMinutes)}:${this._zeroPadding(currentSeconds)}`\n }\n } else {\n return startTime\n }\n }\n\n static _eventContent() {\n const registrationEvent = this._registrationEvent;\n const calendarEvent = this._calendarEvent;\n const statusCard = this._statusCard\n return function (arg) {\n let extendedProps = arg.event.extendedProps\n let type = extendedProps.type\n if (type == 'registration') {\n return registrationEvent(extendedProps);\n } else {\n return calendarEvent(statusCard, extendedProps);\n }\n }\n };\n\n // Waitlist登録用のボタンをカレンダーのeventとして生成\n static _registrationEvent(extendedProps) {\n let eventContent = `\n +\n `;\n return { html: eventContent }\n };\n\n // Waitlistの情報をまとめたカレンダーのevent\n static _calendarEvent(statusCard, extendedProps) {\n let isNewArrival = extendedProps.is_new_arrival\n let isUpdateMedicalAnswer = extendedProps.is_update_medical_answer\n // 未読用のマーク\n let newArrival = !!(isNewArrival || isUpdateMedicalAnswer) ? '
' : '';\n\n let lineIconImage = \"/assets/iconmonstr-line-3-48.png\";\n let smsIconImage = \"/assets/iconmonstr-sms-1-48.png\";\n let iconImage = extendedProps.wait_type == \"sms\" ? smsIconImage : lineIconImage;\n // アイコン(ナカマチの場合はアイコンなし)\n let waitTypeIcon = extendedProps.wait_type != \"inside\" ? `${extendedProps.receipt_number_str}
\n${nameAndOtherText}
\n${extendedProps.hospital_card_number}
\n${extendedProps.required_item}
\n${statusCardText}
\n●(新着)
` : '';\n let eventContent = `\n ${newArrival}\n${title}
\n `;\n return {html: eventContent}\n }\n };\n}\n","import { Calendar } from \"@fullcalendar/core\";\nimport timeGridPlugin from \"@fullcalendar/timegrid\";\n\nexport class WeekCalendar {\n static generate() {\n let calendarEl = document.getElementById(\"week-calendar\");\n if (calendarEl == null) { return }\n let calendarEvents = $('#calendar-events').data('events');\n let date = $('#calendar-date').data('date');\n let initData = $('#calendar-init').data('init');\n\n let calendar = new Calendar(calendarEl, {\n plugins: [timeGridPlugin],\n initialDate: date,\n headerToolbar:{ left: '', center: '', right: '' },\n height: 'auto',\n eventTextColor: '#464646',\n eventBackgroundColor: '#fff',\n dayHeaderDidMount: this._dayHeaderDidMount(),\n events: calendarEvents,\n eventContent: this._eventContent(),\n eventDidMount: this._eventDidMount(),\n locale: \"ja\",\n slotEventOverlap: false,\n allDaySlot: false,\n slotLabelFormat: {\n hour: 'numeric',\n minute: '2-digit',\n },\n slotDuration: `00:${initData['koma_time']}:00`,\n slotLabelInterval: `00:${initData['koma_time']}`,\n slotMinTime: initData['start_time'],\n slotMaxTime: initData['end_time'],\n // TODO: 下記はデザイン当て込み前の動作確認用に追加しているものとなります。デザイン当て込み後は不要となるので削除。\n slotLabelClassNames: function(arg) {\n return [ 'tmp-height' ]\n },\n });\n\n calendar.render();\n\n return calendar;\n }\n\n static _dayHeaderDidMount() {\n return function(arg) {\n let dayLinkEl = arg.el.getElementsByClassName('fc-col-header-cell-cushion')[0];\n let url = location.href.split('?')[0];\n let params = new URLSearchParams(location.search)\n let date = arg.date.toLocaleDateString();\n params.set('calendar_type', 'day')\n params.set('date', date)\n dayLinkEl.setAttribute('href', `${url}?${params.toString()}`);\n }\n };\n\n static _eventContent() {\n const registrationEvent = this._registrationEvent;\n const calendarEvent = this._calendarEvent;\n return function(arg) {\n let extendedProps = arg.event.extendedProps\n let type = extendedProps.type\n if (type == 'registration') {\n return registrationEvent(extendedProps);\n } else {\n return calendarEvent(extendedProps);\n }\n }\n };\n\n // Waitlist登録用のボタンをカレンダーのeventとして生成\n static _registrationEvent(extendedProps) {\n let eventContent = `\n +\n `;\n return {html: eventContent}\n };\n\n // Waitlistの情報をまとめたカレンダーのevent\n static _calendarEvent(extendedProps) {\n let images = extendedProps.card_images.map(function(image){\n return `\n \n${extendedProps.hospital_card_number}
\n${extendedProps.name}
\n${extendedProps.required_item}
\n ${images}\n `;\n return {html: eventContent}\n };\n\n static _eventDidMount() {\n return function(arg) {\n let addWaitlistBtnEl = arg.el.getElementsByClassName('js-btn-add-waitlist')[0];\n if (addWaitlistBtnEl == null) return;\n [...Array(2)].map(() => $(addWaitlistBtnEl).unwrap());\n arg.el.classList.remove(...arg.el.classList)\n }\n }\n}\n","$(function () {\n // LINEテンプレート切替\n $('#js-template-title').on('change', (e) => {\n const body = $(e.target).val();\n $('#js-template-body').val(body);\n characterLimitCecker ();\n });\n // テキスト入力時\n $('#js-template-body').on('keyup', characterLimitCecker);\n // 画面読み込み時\n characterLimitCecker ();\n \n function characterLimitCecker () {\n if ($('#js-template-body').length == 0) return;\n // 改行は2文字扱い\n // 「---本メッセージに対して返信することは出来ません」(27文字)分を加算\n let count = $('#js-template-body').val().replace(/\\n/g, '改行').length + 27;\n if (count > 5000) {\n $('.text-counter').css('color', 'red');\n $('[type=\"submit\"]').prop('disabled', true);\n } else {\n $('.text-counter').css('color', 'black');\n $('[type=\"submit\"]').prop('disabled', false);\n }\n // カウンター\n $('.text-counter').text(count + ' / 5000文字');\n }\n});\n","$(function () {\n let text_counters = new Array();\n let textareas = new Array();\n\n // 初回読み込み時の処理\n initTextCounter();\n // テンプレート追加時の処理\n $('.add_fields').on('click', function () {\n // フォームが追加されるのを待って実行\n setTimeout(addTextCounter, 10);\n });\n // テンプレート削除時の処理\n removeTextCounter();\n\n // フォームの文字数カウンター初期化\n function initTextCounter() {\n getForms();\n // 入力フォームを取得できない場合は処理終了\n if (typeof textareas[0] === \"undefined\") return;\n $.each(text_counters, function () {\n setCounters(this);\n });\n $.each(text_counters, setCharacterLimitCecker);\n }\n\n function addTextCounter () {\n getForms();\n if (typeof textareas[0] === \"undefined\") return;\n // 追加されたフォームのカウンターを取得\n text_counters.push($('.text-counter:last'));\n \n setCounters(text_counters[text_counters.length - 1]);\n $.each(text_counters, setCharacterLimitCecker);\n }\n\n function removeTextCounter () {\n $('.remove_fields').on('click', function () {\n // フォームが削除されるのを待って実行\n setTimeout(initTextCounter, 10);\n });\n }\n \n function getForms () {\n // 全てのtextareaを取得\n textareas = new Array();\n $('.line-single-template-notes').each(function () {\n textareas.push($(this).prevAll('[id$=\"_body\"]'));\n });\n \n text_counters = new Array();\n $('.text-counter').each(function () {\n text_counters.push($(this));\n });\n }\n\n // カウンター初期化\n function setCounters (text_counter) {\n // 改行は2文字でカウント\n let count = $(text_counter).parent().prevAll('[id$=\"_body\"]').text().replace(/\\n/g, '改行').length + 27;\n\n if (count > 5000) {\n $(text_counter).css('color', 'red');\n $('[type=\"submit\"]').prop('disabled', true);\n } else {\n $(text_counter).css('color', 'black');\n $('[type=\"submit\"]').prop('disabled', false);\n }\n // 初期カウンター\n $(text_counter).text(count + ' / 5000文字');\n }\n\n // 文字数チェック\n function setCharacterLimitCecker () {\n $(this).parent().prevAll('[id$=\"_body\"]').on('keyup', function () {\n let count = $(this).val().replace(/\\n/g, '改行').length + 27;\n if (count > 5000) {\n // カウンターの文字色を赤にする\n $(this).nextAll().children('.text-counter').css('color', 'red');\n $('[type=\"submit\"]').prop('disabled', true);\n } else {\n $(this).nextAll().children('.text-counter').css('color', 'black');\n // 全てのtextareaが制限文字数以内の場合、送信可能に\n if (textareas.every(function (textarea) {\n return $(textarea).val().replace(/\\n/g, '改行').length + 27 <= 5000;\n })) {\n $('[type=\"submit\"]').prop('disabled', false);\n }\n }\n // 入力後カウンター\n $(this).nextAll().children('.text-counter').text(count + ' / 5000文字');\n });\n }\n\n});\n","$(function () {\n // ------------------------------\n // 質問 表示制御\n // ------------------------------\n // 初期表示時 選択肢エリアの表示切り替え\n $('.select-question-type').each(function(i, e) {\n if (e.value == 'text' || e.value == 'image' || !(e.value)) {\n $(this).closest(\".field\").find('.question-items-form-group').hide();\n }\n });\n // 質問タイプ変更時 選択肢エリアの表示切り替え\n $(document).on('change', '.select-question-type', function(){\n var selection = $(this).val();\n var questionItemsFormGroup = $(this).closest(\".field\").find('.question-items-form-group')\n if (selection == 'text' || selection == 'image' || !selection) {\n questionItemsFormGroup.hide();\n } else {\n questionItemsFormGroup.show();\n }\n });\n\n // ------------------------------\n // 選択肢 表示制御\n // ------------------------------\n // 初期表示時 inputサイズ調整\n $('.select-question-item-type').each(function(i, e) {\n if (e.value != 'text') {\n $(this).closest(\".form-group\").find('.question-items-optional-text-form').hide();\n $(this).closest(\".form-group\").find('.question-items-label-form').addClass('col-sm-7');\n }\n });\n // 選択肢タイプ変更時 inputサイズ調整, 表示切り替え\n $(document).on('change', '.select-question-item-type', function() {\n var selection = $(this).val();\n var questionItemsValueForm = $(this).closest(\".form-group\").find('.question-items-optional-text-form')\n var questionItemsLabelForm = $(this).closest(\".form-group\").find('.question-items-label-form')\n if (selection == 'text') {\n questionItemsValueForm.show();\n questionItemsLabelForm.removeClass('col-sm-7');\n questionItemsLabelForm.addClass('col-sm-3');\n } else {\n questionItemsValueForm.hide();\n questionItemsValueForm.children().val(null);\n questionItemsLabelForm.removeClass('col-sm-3');\n questionItemsLabelForm.addClass('col-sm-7');\n }\n });\n\n // ------------------------------\n // 並び替え\n // ------------------------------\n /**\n * Sortable設定\n * @param object (Element object) 並び替え範囲のオブジェクト\n */\n function setSortable(target) {\n Sortable.create(target, {\n animation: 100,\n handle:'.handle',\n onEnd: function (e) {\n $(target).children('.nested-fields').each(function (i, el) {\n $(el).find('.order').val(i+1);\n });\n }\n })\n }\n\n /**\n * 各要素に順番を設定\n * @param object (jQuery object) 並び替え範囲のオブジェクト\n */\n function setOrder($target) {\n $target.children('.nested-fields').each(function (i, el) {\n $(el).find('.order').val(i+1);\n });\n }\n\n /**\n * 各要素に順番を設定\n * @param object (MutationRecord object) MutationObserverのコールバック関数のオブジェクト\n * @param object (jQuery object) 質問の並び替え範囲のオブジェクト\n */\n function newQuestionSetting(mutationRecords, $parent) {\n for (let record of mutationRecords) {\n for (let node of record.addedNodes) {\n if ($(node).parent().is( $parent )) {\n // 新規追加時のみmutationRecordsの対象が1件(並び替え時は2件)\n let isNewQuestion = mutationRecords.length === 1;\n if (isNewQuestion) {\n // 新規質問の選択肢 Sortable設定\n let questionItemField = $(node).find('.js-medical_question_item_field')[0];\n setSortable(questionItemField);\n }\n }\n }\n }\n }\n\n // 質問\n let questionField = $('#js-medical_question_field')[0];\n if (questionField) {\n // 初期設定\n setSortable(questionField);\n // 追加時の監視\n let questionObserver = new MutationObserver(mutationRecords => {\n newQuestionSetting(mutationRecords, $(questionField));\n setOrder($(questionField));\n });\n questionObserver.observe(questionField, {childList: true, subtree: true});\n }\n\n // 選択肢\n let $questionItemFields = $('.js-medical_question_item_field');\n $questionItemFields.each(function (i, questionItemField) {\n if (questionItemField) {\n // 初期設定\n setSortable(questionItemField);\n // 追加時の監視\n let questionItemObserver = new MutationObserver( () => {\n setOrder($(questionItemField))\n });\n questionItemObserver.observe(questionItemField, {childList: true, subtree: true});\n }\n })\n});\n","import 'select2'\nimport 'select2/dist/css/select2.css'\n\n$(function () {\n // クリニック切替\n $('#js-hospital-stmc-code').select2({\n dropdownAutoWidth: true,\n language: {\"noResults\": function(){ return \"選択肢はありません\";}},\n }).on('select2:select', (e) => {\n $(e.target).closest(\"form\").submit();\n });\n\n // LINE一斉配信モーダル\n $('#lineOfficialPage .btn-confirm').on('click', () => {\n $('#lineOfficialPage').modal('hide');\n });\n})\n","$(function () {\n $(document).on('change', '#js-advanced-settings', function(){\n switchAdvancedSettings();\n });\n\n function switchAdvancedSettings() {\n if ($('#js-advanced-settings').prop('checked')) {\n $('.advanced-settings').fadeIn();\n } else {\n $('.advanced-settings').fadeOut();\n }\n }\n switchAdvancedSettings();\n\n // ------------------------------\n // 並び替え\n // ------------------------------\n /**\n * Sortable設定\n * @param object (Element object) 並び替え範囲のオブジェクト\n */\n function setSortable(target) {\n Sortable.create(target, {\n animation: 100,\n handle:'.handle',\n onEnd: function (e) {\n $(target).children('.nested-fields').each(function (i, el) {\n $(el).find('.order').val(i+1);\n });\n }\n })\n }\n \n function setSortableRequiredItems(target) {\n Sortable.create(target, {\n animation: 100,\n handle:'.handle',\n onEnd: function (e) {\n $(target).children('.card').each(function (i, el) {\n $(el).find('.order').val(i+1);\n });\n }\n })\n }\n\n /**\n * 各要素に順番を設定\n */\n\n function setOrder($target) {\n $target.children('.nested-fields').each(function (i, el) {\n $(el).find('.order').val(i+1);\n });\n }\n\n function setOrderRequiredItems($target) {\n $target.children('.card').each(function (i, el) {\n $(el).find('.order').val(i+1);\n });\n }\n\n // コマ単位情報\n let $staffItemFields = $('.js-hospital_staff_item_field');\n $staffItemFields.each(function (i, staffItemFields) {\n if (staffItemFields) {\n // 初期設定\n setSortable(staffItemFields);\n // 追加時の監視\n let staffItemObserver = new MutationObserver( () => {\n setOrder($(staffItemFields))\n });\n staffItemObserver.observe(staffItemFields, {childList: true, subtree: true});\n }\n })\n\n // 選択肢1フィールド\n let $requiredItemFields = $('.js-hospital_required_item_field');\n $requiredItemFields.each(function (i, requiredItemField) {\n if (requiredItemField) {\n // 初期設定\n setSortableRequiredItems(requiredItemField);\n // 追加時の監視\n let requiredItemObserver = new MutationObserver( () => {\n setOrderRequiredItems($(requiredItemField))\n });\n requiredItemObserver.observe(requiredItemField, {childList: true, subtree: true});\n }\n })\n\n // 選択肢2フィールド\n let $optionalItemFields = $('.js-hospital_optional_item_field');\n $optionalItemFields.each(function (i, optionalItemField) {\n if (optionalItemField) {\n // 初期設定\n setSortable(optionalItemField);\n // 追加時の監視\n let optionalItemObserver = new MutationObserver( () => {\n setOrder($(optionalItemField))\n });\n optionalItemObserver.observe(optionalItemField, {childList: true, subtree: true});\n }\n })\n\n});\n","$(function () {\n $('#js-shift-year').on('change', (e) => {\n $(e.target).closest(\"form\").submit();\n });\n $('#js-shift-month').on('change', (e) => {\n $(e.target).closest(\"form\").submit();\n });\n});","$(function () {\n // 完了, 保留, 問診依頼, 再撮影依頼ボタン押下時\n $('.js-btn-complete, .js-btn-pending, .js-btn-request_interview, .js-btn-call, .js-btn-requested_card_resend').on('click', (e) => {\n $(this).prop('disabled', 'true');\n e.preventDefault();\n e.stopPropagation();\n const target = e.target;\n const link = e.target.href;\n const text = e.target.text;\n actionConfirmModal(target, link, text);\n });\n // Waitlist確認モーダル\n function actionConfirmModal(target, link, text) {\n const isRequestInterview = $(target).hasClass('js-btn-request_interview');\n const isCall = $(target).hasClass('js-btn-call');\n const isRequestedCardResend = $(target).hasClass('js-btn-requested_card_resend');\n let config = {\n showConfirmButton: true,\n showCancelButton: true,\n timer: null,\n allowOutsideClick: true,\n confirmButtonColor: '#16a378',\n cancelButtonText: \"いいえ\",\n };\n let addConfig = {};\n\n if (isRequestInterview) { // 問診依頼\n addConfig = {\n title: '問診の入力を依頼する',\n text: 'LINEを送信しますがよろしいですか?',\n confirmButtonText: '送信する'\n }\n } else if (isCall) {\n addConfig = {\n title: '呼び出しする',\n text: '呼び出しは取り消しできません。よろしいですか?',\n confirmButtonText: '呼び出す'\n }\n } else if (isRequestedCardResend) {\n addConfig = {\n title: '再撮影依頼する',\n text: '再撮影依頼は取り消しできません。よろしいですか?',\n confirmButtonText: '再撮影依頼'\n }\n } else { // タブ移動\n addConfig = {\n title: `${text}に移動する`,\n text: '元に戻せませんがよろしいですか?',\n confirmButtonText: '移動する'\n }\n }\n config = { ...config, ...addConfig };\n\n Swal.fire(config).then((e) => {\n if (e.isConfirmed) {\n $.ajax({ url: link, type: \"GET\" });\n if (!isRequestInterview && !isCall && !isRequestedCardResend) {\n $(target).closest('.js-waitlist').fadeOut();\n }\n }\n });\n }\n\n // 診察券画像 複数表示\n lightbox.option({\n 'resizeDuration': 100,\n 'wrapAround': true,\n 'disableScrolling': false,\n 'imageFadeDuration': 100,\n 'fadeDuration': 100,\n 'alwaysShowNavOnTouchDevices': true,\n });\n\n // ソトマチ一覧 検索条件変更\n $('#js-sotomachi-date, #js-sotomachi-required-item, #js-sotomachi-staff, #js-sotomachi-only-available-time').on('change', (e) => {\n $(e.target).closest(\"form\").submit();\n });\n\n // ソトマチ一覧 検索条件変更\n $('#js-switch-tab-mode').on('change', (e) => {\n if ($(e.target).prop(\"checked\")) {\n var newActionUrl = $(e.target).closest(\"form\").attr('action').replace('waitings', 'holdings');\n $(e.target).closest(\"form\").attr('action', newActionUrl);\n } else {\n var newActionUrl = $(e.target).closest(\"form\").attr('action').replace('holdings', 'waitings');\n $(e.target).closest(\"form\").attr('action', newActionUrl);\n }\n $(e.target).closest(\"form\").submit();\n });\n\n // ソトマチ一覧 空きのみ表示無効化判定\n $('#js-sotomachi-required-item, #js-sotomachi-staff').on('change', () => {\n changeOnlyAvailableTimeState($('#js-sotomachi-only-available-time'), true);\n });\n\n changeOnlyAvailableTimeState($('#js-sotomachi-only-available-time'), false);\n\n function changeOnlyAvailableTimeState($requiredItem, $submitOrNot) {\n if ($('#js-sotomachi-required-item').val() || $('#js-sotomachi-staff').val()) {\n $requiredItem.prop('disabled', false);\n $requiredItem.prev().css(\"color\", \"black\");\n } else {\n $requiredItem.prop('checked', false);\n $requiredItem.prop('disabled', true);\n $requiredItem.prev().css(\"color\", \"gray\");\n if ($submitOrNot) {\n $requiredItem.closest(\"form\").submit();\n }\n }\n }\n\n // 選択肢②のスキップ\n checkSkipOptional($('.js-form-required_item'));\n\n $('.js-form-required_item').on('change', (e) => {\n checkSkipOptional($(e.target));\n });\n\n function checkSkipOptional($requiredItem) {\n $optionalItemArea = $('.js-form-optional_item');\n $optionalItem = $optionalItemArea.find('select');\n\n // hidden_field の場合\n if ($requiredItem.find('option').length !== 0) {\n $requiredItem = $requiredItem.find('option:selected');\n }\n\n if ($requiredItem.data('skip-optional')) {\n $optionalItemArea.hide();\n $optionalItem.val('');\n } else {\n $optionalItemArea.show();\n // $optionalItem.val($optionalItem.find('option:first-child').val());\n }\n }\n\n // ブラウザバック カレンダー日付連動対応\n var url_path = location.pathname.split('/')\n // 受付リストページのみに限定\n if (url_path[2] === \"waitlists\" && url_path[3] === \"waitings\") {\n // For Safari (※Chromeも一部カバーケース有)\n var type = null;\n var perfEntries = performance.getEntriesByType(\"navigation\");\n\n perfEntries.forEach(function (pe) {\n // タイプ取得\n type = pe.type;\n });\n\n // ブラウザバック/フォワード判定\n if (type == 'back_forward') {\n window.location.reload();\n return;\n }\n\n // For Chrome\n window.addEventListener('pageshow', function (event) {\n // cache利用時判定\n if (event.persisted) {\n window.location.reload();\n return;\n }\n });\n }\n\n // 仮予約登録ボタンクリック時\n $('.js-btn-tmp-reservation-submit').on('click', (e) => {\n $('#newTmpReservationModal').modal('hide');\n });\n\n setHeightToWaitlistArea()\n function setHeightToWaitlistArea() {\n // カレンダー表示ではない場合に処理を行う\n if (!document.getElementById('day-calendar')) {\n // waitlist-areaに高さを付与する\n const targetElements = document.getElementsByClassName('waitlist-area');\n for (let i = 0; i < targetElements.length; i++) {\n let documentHeight = window.innerHeight;\n // 比率で余白を決めるようにする\n let marginSize = documentHeight / 5.5;\n targetElements[i].style.height = `${documentHeight - marginSize}px`;\n targetElements[i].style.overflow = \"scroll\";\n }\n }\n }\n});\n","$(function () {\n\n // ソトマチ一覧 検索条件変更\n $('#js-sotomachi-search-datetime').on('change', (e) => {\n $(e.target).closest(\"form\").submit();\n });\n\n});\n","var api = require(\"!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../css-loader/dist/cjs.js??ref--6-1!../../postcss-loader/src/index.js??ref--6-2!./main.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*!\nFullCalendar v5.11.3\nDocs & License: https://fullcalendar.io/\n(c) 2022 Adam Shaw\n*/\nimport './main.css';\nimport { __assign, __spreadArray, __extends } from 'tslib';\nimport { createContext, Component, createRef, createElement, Fragment, createPortal } from './vdom.js';\nexport * from './vdom.js'; // no public types yet. when there are, export from:\n// import {} from './api-type-deps'\n\nvar EventSourceApi =\n/** @class */\nfunction () {\n function EventSourceApi(context, internalEventSource) {\n this.context = context;\n this.internalEventSource = internalEventSource;\n }\n\n EventSourceApi.prototype.remove = function () {\n this.context.dispatch({\n type: 'REMOVE_EVENT_SOURCE',\n sourceId: this.internalEventSource.sourceId\n });\n };\n\n EventSourceApi.prototype.refetch = function () {\n this.context.dispatch({\n type: 'FETCH_EVENT_SOURCES',\n sourceIds: [this.internalEventSource.sourceId],\n isRefetch: true\n });\n };\n\n Object.defineProperty(EventSourceApi.prototype, \"id\", {\n get: function get() {\n return this.internalEventSource.publicId;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventSourceApi.prototype, \"url\", {\n get: function get() {\n return this.internalEventSource.meta.url;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventSourceApi.prototype, \"format\", {\n get: function get() {\n return this.internalEventSource.meta.format; // TODO: bad. not guaranteed\n },\n enumerable: false,\n configurable: true\n });\n return EventSourceApi;\n}();\n\nfunction removeElement(el) {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\n} // Querying\n// ----------------------------------------------------------------------------------------------------------------\n\n\nfunction elementClosest(el, selector) {\n if (el.closest) {\n return el.closest(selector); // really bad fallback for IE\n // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n }\n\n if (!document.documentElement.contains(el)) {\n return null;\n }\n\n do {\n if (elementMatches(el, selector)) {\n return el;\n }\n\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n}\n\nfunction elementMatches(el, selector) {\n var method = el.matches || el.matchesSelector || el.msMatchesSelector;\n return method.call(el, selector);\n} // accepts multiple subject els\n// returns a real array. good for methods like forEach\n// TODO: accept the document\n\n\nfunction findElements(container, selector) {\n var containers = container instanceof HTMLElement ? [container] : container;\n var allMatches = [];\n\n for (var i = 0; i < containers.length; i += 1) {\n var matches = containers[i].querySelectorAll(selector);\n\n for (var j = 0; j < matches.length; j += 1) {\n allMatches.push(matches[j]);\n }\n }\n\n return allMatches;\n} // accepts multiple subject els\n// only queries direct child elements // TODO: rename to findDirectChildren!\n\n\nfunction findDirectChildren(parent, selector) {\n var parents = parent instanceof HTMLElement ? [parent] : parent;\n var allMatches = [];\n\n for (var i = 0; i < parents.length; i += 1) {\n var childNodes = parents[i].children; // only ever elements\n\n for (var j = 0; j < childNodes.length; j += 1) {\n var childNode = childNodes[j];\n\n if (!selector || elementMatches(childNode, selector)) {\n allMatches.push(childNode);\n }\n }\n }\n\n return allMatches;\n} // Style\n// ----------------------------------------------------------------------------------------------------------------\n\n\nvar PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;\n\nfunction applyStyle(el, props) {\n for (var propName in props) {\n applyStyleProp(el, propName, props[propName]);\n }\n}\n\nfunction applyStyleProp(el, name, val) {\n if (val == null) {\n el.style[name] = '';\n } else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {\n el.style[name] = val + \"px\";\n } else {\n el.style[name] = val;\n }\n} // Event Handling\n// ----------------------------------------------------------------------------------------------------------------\n// if intercepting bubbled events at the document/window/body level,\n// and want to see originating element (the 'target'), use this util instead\n// of `ev.target` because it goes within web-component boundaries.\n\n\nfunction getEventTargetViaRoot(ev) {\n var _a, _b;\n\n return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target;\n} // Shadow DOM consuderations\n// ----------------------------------------------------------------------------------------------------------------\n\n\nfunction getElRoot(el) {\n return el.getRootNode ? el.getRootNode() : document;\n} // Unique ID for DOM attribute\n\n\nvar guid$1 = 0;\n\nfunction getUniqueDomId() {\n guid$1 += 1;\n return 'fc-dom-' + guid$1;\n} // Stops a mouse/touch event from doing it's native browser action\n\n\nfunction preventDefault(ev) {\n ev.preventDefault();\n} // Event Delegation\n// ----------------------------------------------------------------------------------------------------------------\n\n\nfunction buildDelegationHandler(selector, handler) {\n return function (ev) {\n var matchedChild = elementClosest(ev.target, selector);\n\n if (matchedChild) {\n handler.call(matchedChild, ev, matchedChild);\n }\n };\n}\n\nfunction listenBySelector(container, eventType, selector, handler) {\n var attachedHandler = buildDelegationHandler(selector, handler);\n container.addEventListener(eventType, attachedHandler);\n return function () {\n container.removeEventListener(eventType, attachedHandler);\n };\n}\n\nfunction listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {\n var currentMatchedChild;\n return listenBySelector(container, 'mouseover', selector, function (mouseOverEv, matchedChild) {\n if (matchedChild !== currentMatchedChild) {\n currentMatchedChild = matchedChild;\n onMouseEnter(mouseOverEv, matchedChild);\n\n var realOnMouseLeave_1 = function realOnMouseLeave_1(mouseLeaveEv) {\n currentMatchedChild = null;\n onMouseLeave(mouseLeaveEv, matchedChild);\n matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);\n }; // listen to the next mouseleave, and then unattach\n\n\n matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);\n }\n });\n} // Animation\n// ----------------------------------------------------------------------------------------------------------------\n\n\nvar transitionEventNames = ['webkitTransitionEnd', 'otransitionend', 'oTransitionEnd', 'msTransitionEnd', 'transitionend']; // triggered only when the next single subsequent transition finishes\n\nfunction whenTransitionDone(el, callback) {\n var realCallback = function realCallback(ev) {\n callback(ev);\n transitionEventNames.forEach(function (eventName) {\n el.removeEventListener(eventName, realCallback);\n });\n };\n\n transitionEventNames.forEach(function (eventName) {\n el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes\n });\n} // ARIA workarounds\n// ----------------------------------------------------------------------------------------------------------------\n\n\nfunction createAriaClickAttrs(handler) {\n return __assign({\n onClick: handler\n }, createAriaKeyboardAttrs(handler));\n}\n\nfunction createAriaKeyboardAttrs(handler) {\n return {\n tabIndex: 0,\n onKeyDown: function onKeyDown(ev) {\n if (ev.key === 'Enter' || ev.key === ' ') {\n handler(ev);\n ev.preventDefault(); // if space, don't scroll down page\n }\n }\n };\n}\n\nvar guidNumber = 0;\n\nfunction guid() {\n guidNumber += 1;\n return String(guidNumber);\n}\n/* FullCalendar-specific DOM Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n// Make the mouse cursor express that an event is not allowed in the current area\n\n\nfunction disableCursor() {\n document.body.classList.add('fc-not-allowed');\n} // Returns the mouse cursor to its original look\n\n\nfunction enableCursor() {\n document.body.classList.remove('fc-not-allowed');\n}\n/* Selection\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction preventSelection(el) {\n el.classList.add('fc-unselectable');\n el.addEventListener('selectstart', preventDefault);\n}\n\nfunction allowSelection(el) {\n el.classList.remove('fc-unselectable');\n el.removeEventListener('selectstart', preventDefault);\n}\n/* Context Menu\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction preventContextMenu(el) {\n el.addEventListener('contextmenu', preventDefault);\n}\n\nfunction allowContextMenu(el) {\n el.removeEventListener('contextmenu', preventDefault);\n}\n\nfunction parseFieldSpecs(input) {\n var specs = [];\n var tokens = [];\n var i;\n var token;\n\n if (typeof input === 'string') {\n tokens = input.split(/\\s*,\\s*/);\n } else if (typeof input === 'function') {\n tokens = [input];\n } else if (Array.isArray(input)) {\n tokens = input;\n }\n\n for (i = 0; i < tokens.length; i += 1) {\n token = tokens[i];\n\n if (typeof token === 'string') {\n specs.push(token.charAt(0) === '-' ? {\n field: token.substring(1),\n order: -1\n } : {\n field: token,\n order: 1\n });\n } else if (typeof token === 'function') {\n specs.push({\n func: token\n });\n }\n }\n\n return specs;\n}\n\nfunction compareByFieldSpecs(obj0, obj1, fieldSpecs) {\n var i;\n var cmp;\n\n for (i = 0; i < fieldSpecs.length; i += 1) {\n cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);\n\n if (cmp) {\n return cmp;\n }\n }\n\n return 0;\n}\n\nfunction compareByFieldSpec(obj0, obj1, fieldSpec) {\n if (fieldSpec.func) {\n return fieldSpec.func(obj0, obj1);\n }\n\n return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) * (fieldSpec.order || 1);\n}\n\nfunction flexibleCompare(a, b) {\n if (!a && !b) {\n return 0;\n }\n\n if (b == null) {\n return -1;\n }\n\n if (a == null) {\n return 1;\n }\n\n if (typeof a === 'string' || typeof b === 'string') {\n return String(a).localeCompare(String(b));\n }\n\n return a - b;\n}\n/* String Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction padStart(val, len) {\n var s = String(val);\n return '000'.substr(0, len - s.length) + s;\n}\n\nfunction formatWithOrdinals(formatter, args, fallbackText) {\n if (typeof formatter === 'function') {\n return formatter.apply(void 0, args);\n }\n\n if (typeof formatter === 'string') {\n // non-blank string\n return args.reduce(function (str, arg, index) {\n return str.replace('$' + index, arg || '');\n }, formatter);\n }\n\n return fallbackText;\n}\n/* Number Utilities\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isInt(n) {\n return n % 1 === 0;\n}\n/* FC-specific DOM dimension stuff\n----------------------------------------------------------------------------------------------------------------------*/\n\n\nfunction computeSmallestCellWidth(cellEl) {\n var allWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-frame');\n var contentWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-cushion');\n\n if (!allWidthEl) {\n throw new Error('needs fc-scrollgrid-shrink-frame className'); // TODO: use const\n }\n\n if (!contentWidthEl) {\n throw new Error('needs fc-scrollgrid-shrink-cushion className');\n }\n\n return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border\n contentWidthEl.getBoundingClientRect().width;\n}\n\nvar DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; // Adding\n\nfunction addWeeks(m, n) {\n var a = dateToUtcArray(m);\n a[2] += n * 7;\n return arrayToUtcDate(a);\n}\n\nfunction addDays(m, n) {\n var a = dateToUtcArray(m);\n a[2] += n;\n return arrayToUtcDate(a);\n}\n\nfunction addMs(m, n) {\n var a = dateToUtcArray(m);\n a[6] += n;\n return arrayToUtcDate(a);\n} // Diffing (all return floats)\n// TODO: why not use ranges?\n\n\nfunction diffWeeks(m0, m1) {\n return diffDays(m0, m1) / 7;\n}\n\nfunction diffDays(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);\n}\n\nfunction diffHours(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);\n}\n\nfunction diffMinutes(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / (1000 * 60);\n}\n\nfunction diffSeconds(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / 1000;\n}\n\nfunction diffDayAndTime(m0, m1) {\n var m0day = startOfDay(m0);\n var m1day = startOfDay(m1);\n return {\n years: 0,\n months: 0,\n days: Math.round(diffDays(m0day, m1day)),\n milliseconds: m1.valueOf() - m1day.valueOf() - (m0.valueOf() - m0day.valueOf())\n };\n} // Diffing Whole Units\n\n\nfunction diffWholeWeeks(m0, m1) {\n var d = diffWholeDays(m0, m1);\n\n if (d !== null && d % 7 === 0) {\n return d / 7;\n }\n\n return null;\n}\n\nfunction diffWholeDays(m0, m1) {\n if (timeAsMs(m0) === timeAsMs(m1)) {\n return Math.round(diffDays(m0, m1));\n }\n\n return null;\n} // Start-Of\n\n\nfunction startOfDay(m) {\n return arrayToUtcDate([m.getUTCFullYear(), m.getUTCMonth(), m.getUTCDate()]);\n}\n\nfunction startOfHour(m) {\n return arrayToUtcDate([m.getUTCFullYear(), m.getUTCMonth(), m.getUTCDate(), m.getUTCHours()]);\n}\n\nfunction startOfMinute(m) {\n return arrayToUtcDate([m.getUTCFullYear(), m.getUTCMonth(), m.getUTCDate(), m.getUTCHours(), m.getUTCMinutes()]);\n}\n\nfunction startOfSecond(m) {\n return arrayToUtcDate([m.getUTCFullYear(), m.getUTCMonth(), m.getUTCDate(), m.getUTCHours(), m.getUTCMinutes(), m.getUTCSeconds()]);\n} // Week Computation\n\n\nfunction weekOfYear(marker, dow, doy) {\n var y = marker.getUTCFullYear();\n var w = weekOfGivenYear(marker, y, dow, doy);\n\n if (w < 1) {\n return weekOfGivenYear(marker, y - 1, dow, doy);\n }\n\n var nextW = weekOfGivenYear(marker, y + 1, dow, doy);\n\n if (nextW >= 1) {\n return Math.min(w, nextW);\n }\n\n return w;\n}\n\nfunction weekOfGivenYear(marker, year, dow, doy) {\n var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);\n var dayStart = startOfDay(marker);\n var days = Math.round(diffDays(firstWeekStart, dayStart));\n return Math.floor(days / 7) + 1; // zero-indexed\n} // start-of-first-week - start-of-year\n\n\nfunction firstWeekOffset(year, dow, doy) {\n // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n var fwd = 7 + dow - doy; // first-week day local weekday -- which local weekday is fwd\n\n var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;\n return -fwdlw + fwd - 1;\n} // Array Conversion\n\n\nfunction dateToLocalArray(date) {\n return [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()];\n}\n\nfunction arrayToLocalDate(a) {\n return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month\n a[3] || 0, a[4] || 0, a[5] || 0);\n}\n\nfunction dateToUtcArray(date) {\n return [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()];\n}\n\nfunction arrayToUtcDate(a) {\n // according to web standards (and Safari), a month index is required.\n // massage if only given a year.\n if (a.length === 1) {\n a = a.concat([0]);\n }\n\n return new Date(Date.UTC.apply(Date, a));\n} // Other Utils\n\n\nfunction isValidDate(m) {\n return !isNaN(m.valueOf());\n}\n\nfunction timeAsMs(m) {\n return m.getUTCHours() * 1000 * 60 * 60 + m.getUTCMinutes() * 1000 * 60 + m.getUTCSeconds() * 1000 + m.getUTCMilliseconds();\n}\n\nfunction createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {\n return {\n instanceId: guid(),\n defId: defId,\n range: range,\n forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,\n forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo\n };\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty; // Merges an array of objects into a single object.\n// The second argument allows for an array of property names who's object values will be merged together.\n\nfunction mergeProps(propObjs, complexPropsMap) {\n var dest = {};\n\n if (complexPropsMap) {\n for (var name_1 in complexPropsMap) {\n var complexObjs = []; // collect the trailing object values, stopping when a non-object is discovered\n\n for (var i = propObjs.length - 1; i >= 0; i -= 1) {\n var val = propObjs[i][name_1];\n\n if (_typeof(val) === 'object' && val) {\n // non-null object\n complexObjs.unshift(val);\n } else if (val !== undefined) {\n dest[name_1] = val; // if there were no objects, this value will be used\n\n break;\n }\n } // if the trailing values were objects, use the merged value\n\n\n if (complexObjs.length) {\n dest[name_1] = mergeProps(complexObjs);\n }\n }\n } // copy values into the destination, going from last to first\n\n\n for (var i = propObjs.length - 1; i >= 0; i -= 1) {\n var props = propObjs[i];\n\n for (var name_2 in props) {\n if (!(name_2 in dest)) {\n // if already assigned by previous props or complex props, don't reassign\n dest[name_2] = props[name_2];\n }\n }\n }\n\n return dest;\n}\n\nfunction filterHash(hash, func) {\n var filtered = {};\n\n for (var key in hash) {\n if (func(hash[key], key)) {\n filtered[key] = hash[key];\n }\n }\n\n return filtered;\n}\n\nfunction mapHash(hash, func) {\n var newHash = {};\n\n for (var key in hash) {\n newHash[key] = func(hash[key], key);\n }\n\n return newHash;\n}\n\nfunction arrayToHash(a) {\n var hash = {};\n\n for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {\n var item = a_1[_i];\n hash[item] = true;\n }\n\n return hash;\n}\n\nfunction buildHashFromArray(a, func) {\n var hash = {};\n\n for (var i = 0; i < a.length; i += 1) {\n var tuple = func(a[i], i);\n hash[tuple[0]] = tuple[1];\n }\n\n return hash;\n}\n\nfunction hashValuesToArray(obj) {\n var a = [];\n\n for (var key in obj) {\n a.push(obj[key]);\n }\n\n return a;\n}\n\nfunction isPropsEqual(obj0, obj1) {\n if (obj0 === obj1) {\n return true;\n }\n\n for (var key in obj0) {\n if (hasOwnProperty.call(obj0, key)) {\n if (!(key in obj1)) {\n return false;\n }\n }\n }\n\n for (var key in obj1) {\n if (hasOwnProperty.call(obj1, key)) {\n if (obj0[key] !== obj1[key]) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nfunction getUnequalProps(obj0, obj1) {\n var keys = [];\n\n for (var key in obj0) {\n if (hasOwnProperty.call(obj0, key)) {\n if (!(key in obj1)) {\n keys.push(key);\n }\n }\n }\n\n for (var key in obj1) {\n if (hasOwnProperty.call(obj1, key)) {\n if (obj0[key] !== obj1[key]) {\n keys.push(key);\n }\n }\n }\n\n return keys;\n}\n\nfunction compareObjs(oldProps, newProps, equalityFuncs) {\n if (equalityFuncs === void 0) {\n equalityFuncs = {};\n }\n\n if (oldProps === newProps) {\n return true;\n }\n\n for (var key in newProps) {\n if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;else {\n return false;\n }\n } // check for props that were omitted in the new\n\n\n for (var key in oldProps) {\n if (!(key in newProps)) {\n return false;\n }\n }\n\n return true;\n}\n/*\nassumed \"true\" equality for handler names like \"onReceiveSomething\"\n*/\n\n\nfunction isObjValsEqual(val0, val1, comparator) {\n if (val0 === val1 || comparator === true) {\n return true;\n }\n\n if (comparator) {\n return comparator(val0, val1);\n }\n\n return false;\n}\n\nfunction collectFromHash(hash, startIndex, endIndex, step) {\n if (startIndex === void 0) {\n startIndex = 0;\n }\n\n if (step === void 0) {\n step = 1;\n }\n\n var res = [];\n\n if (endIndex == null) {\n endIndex = Object.keys(hash).length;\n }\n\n for (var i = startIndex; i < endIndex; i += step) {\n var val = hash[i];\n\n if (val !== undefined) {\n // will disregard undefined for sparse arrays\n res.push(val);\n }\n }\n\n return res;\n}\n\nfunction parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) {\n for (var i = 0; i < recurringTypes.length; i += 1) {\n var parsed = recurringTypes[i].parse(refined, dateEnv);\n\n if (parsed) {\n var allDay = refined.allDay;\n\n if (allDay == null) {\n allDay = defaultAllDay;\n\n if (allDay == null) {\n allDay = parsed.allDayGuess;\n\n if (allDay == null) {\n allDay = false;\n }\n }\n }\n\n return {\n allDay: allDay,\n duration: parsed.duration,\n typeData: parsed.typeData,\n typeId: i\n };\n }\n }\n\n return null;\n}\n\nfunction expandRecurring(eventStore, framingRange, context) {\n var dateEnv = context.dateEnv,\n pluginHooks = context.pluginHooks,\n options = context.options;\n var defs = eventStore.defs,\n instances = eventStore.instances; // remove existing recurring instances\n // TODO: bad. always expand events as a second step\n\n instances = filterHash(instances, function (instance) {\n return !defs[instance.defId].recurringDef;\n });\n\n for (var defId in defs) {\n var def = defs[defId];\n\n if (def.recurringDef) {\n var duration = def.recurringDef.duration;\n\n if (!duration) {\n duration = def.allDay ? options.defaultAllDayEventDuration : options.defaultTimedEventDuration;\n }\n\n var starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes);\n\n for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {\n var start = starts_1[_i];\n var instance = createEventInstance(defId, {\n start: start,\n end: dateEnv.add(start, duration)\n });\n instances[instance.instanceId] = instance;\n }\n }\n }\n\n return {\n defs: defs,\n instances: instances\n };\n}\n/*\nEvent MUST have a recurringDef\n*/\n\n\nfunction expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {\n var typeDef = recurringTypes[eventDef.recurringDef.typeId];\n var markers = typeDef.expand(eventDef.recurringDef.typeData, {\n start: dateEnv.subtract(framingRange.start, duration),\n end: framingRange.end\n }, dateEnv); // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to\n\n if (eventDef.allDay) {\n markers = markers.map(startOfDay);\n }\n\n return markers;\n}\n\nvar INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];\nvar PARSE_RE = /^(-?)(?:(\\d+)\\.)?(\\d+):(\\d\\d)(?::(\\d\\d)(?:\\.(\\d\\d\\d))?)?/; // Parsing and Creation\n\nfunction createDuration(input, unit) {\n var _a;\n\n if (typeof input === 'string') {\n return parseString(input);\n }\n\n if (_typeof(input) === 'object' && input) {\n // non-null object\n return parseObject(input);\n }\n\n if (typeof input === 'number') {\n return parseObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));\n }\n\n return null;\n}\n\nfunction parseString(s) {\n var m = PARSE_RE.exec(s);\n\n if (m) {\n var sign = m[1] ? -1 : 1;\n return {\n years: 0,\n months: 0,\n days: sign * (m[2] ? parseInt(m[2], 10) : 0),\n milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours\n (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes\n (m[5] ? parseInt(m[5], 10) : 0) * 1000 + ( // seconds\n m[6] ? parseInt(m[6], 10) : 0) // ms\n )\n };\n }\n\n return null;\n}\n\nfunction parseObject(obj) {\n var duration = {\n years: obj.years || obj.year || 0,\n months: obj.months || obj.month || 0,\n days: obj.days || obj.day || 0,\n milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours\n (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes\n (obj.seconds || obj.second || 0) * 1000 + ( // seconds\n obj.milliseconds || obj.millisecond || obj.ms || 0) // ms\n\n };\n var weeks = obj.weeks || obj.week;\n\n if (weeks) {\n duration.days += weeks * 7;\n duration.specifiedWeeks = true;\n }\n\n return duration;\n} // Equality\n\n\nfunction durationsEqual(d0, d1) {\n return d0.years === d1.years && d0.months === d1.months && d0.days === d1.days && d0.milliseconds === d1.milliseconds;\n}\n\nfunction asCleanDays(dur) {\n if (!dur.years && !dur.months && !dur.milliseconds) {\n return dur.days;\n }\n\n return 0;\n} // Simple Math\n\n\nfunction addDurations(d0, d1) {\n return {\n years: d0.years + d1.years,\n months: d0.months + d1.months,\n days: d0.days + d1.days,\n milliseconds: d0.milliseconds + d1.milliseconds\n };\n}\n\nfunction subtractDurations(d1, d0) {\n return {\n years: d1.years - d0.years,\n months: d1.months - d0.months,\n days: d1.days - d0.days,\n milliseconds: d1.milliseconds - d0.milliseconds\n };\n}\n\nfunction multiplyDuration(d, n) {\n return {\n years: d.years * n,\n months: d.months * n,\n days: d.days * n,\n milliseconds: d.milliseconds * n\n };\n} // Conversions\n// \"Rough\" because they are based on average-case Gregorian months/years\n\n\nfunction asRoughYears(dur) {\n return asRoughDays(dur) / 365;\n}\n\nfunction asRoughMonths(dur) {\n return asRoughDays(dur) / 30;\n}\n\nfunction asRoughDays(dur) {\n return asRoughMs(dur) / 864e5;\n}\n\nfunction asRoughMinutes(dur) {\n return asRoughMs(dur) / (1000 * 60);\n}\n\nfunction asRoughSeconds(dur) {\n return asRoughMs(dur) / 1000;\n}\n\nfunction asRoughMs(dur) {\n return dur.years * (365 * 864e5) + dur.months * (30 * 864e5) + dur.days * 864e5 + dur.milliseconds;\n} // Advanced Math\n\n\nfunction wholeDivideDurations(numerator, denominator) {\n var res = null;\n\n for (var i = 0; i < INTERNAL_UNITS.length; i += 1) {\n var unit = INTERNAL_UNITS[i];\n\n if (denominator[unit]) {\n var localRes = numerator[unit] / denominator[unit];\n\n if (!isInt(localRes) || res !== null && res !== localRes) {\n return null;\n }\n\n res = localRes;\n } else if (numerator[unit]) {\n // needs to divide by something but can't!\n return null;\n }\n }\n\n return res;\n}\n\nfunction greatestDurationDenominator(dur) {\n var ms = dur.milliseconds;\n\n if (ms) {\n if (ms % 1000 !== 0) {\n return {\n unit: 'millisecond',\n value: ms\n };\n }\n\n if (ms % (1000 * 60) !== 0) {\n return {\n unit: 'second',\n value: ms / 1000\n };\n }\n\n if (ms % (1000 * 60 * 60) !== 0) {\n return {\n unit: 'minute',\n value: ms / (1000 * 60)\n };\n }\n\n if (ms) {\n return {\n unit: 'hour',\n value: ms / (1000 * 60 * 60)\n };\n }\n }\n\n if (dur.days) {\n if (dur.specifiedWeeks && dur.days % 7 === 0) {\n return {\n unit: 'week',\n value: dur.days / 7\n };\n }\n\n return {\n unit: 'day',\n value: dur.days\n };\n }\n\n if (dur.months) {\n return {\n unit: 'month',\n value: dur.months\n };\n }\n\n if (dur.years) {\n return {\n unit: 'year',\n value: dur.years\n };\n }\n\n return {\n unit: 'millisecond',\n value: 0\n };\n} // timeZoneOffset is in minutes\n\n\nfunction buildIsoString(marker, timeZoneOffset, stripZeroTime) {\n if (stripZeroTime === void 0) {\n stripZeroTime = false;\n }\n\n var s = marker.toISOString();\n s = s.replace('.000', '');\n\n if (stripZeroTime) {\n s = s.replace('T00:00:00Z', '');\n }\n\n if (s.length > 10) {\n // time part wasn't stripped, can add timezone info\n if (timeZoneOffset == null) {\n s = s.replace('Z', '');\n } else if (timeZoneOffset !== 0) {\n s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));\n } // otherwise, its UTC-0 and we want to keep the Z\n\n }\n\n return s;\n} // formats the date, but with no time part\n// TODO: somehow merge with buildIsoString and stripZeroTime\n// TODO: rename. omit \"string\"\n\n\nfunction formatDayString(marker) {\n return marker.toISOString().replace(/T.*$/, '');\n} // TODO: use Date::toISOString and use everything after the T?\n\n\nfunction formatIsoTimeString(marker) {\n return padStart(marker.getUTCHours(), 2) + ':' + padStart(marker.getUTCMinutes(), 2) + ':' + padStart(marker.getUTCSeconds(), 2);\n}\n\nfunction formatTimeZoneOffset(minutes, doIso) {\n if (doIso === void 0) {\n doIso = false;\n }\n\n var sign = minutes < 0 ? '-' : '+';\n var abs = Math.abs(minutes);\n var hours = Math.floor(abs / 60);\n var mins = Math.round(abs % 60);\n\n if (doIso) {\n return sign + padStart(hours, 2) + \":\" + padStart(mins, 2);\n }\n\n return \"GMT\" + sign + hours + (mins ? \":\" + padStart(mins, 2) : '');\n} // TODO: new util arrayify?\n\n\nfunction removeExact(array, exactVal) {\n var removeCnt = 0;\n var i = 0;\n\n while (i < array.length) {\n if (array[i] === exactVal) {\n array.splice(i, 1);\n removeCnt += 1;\n } else {\n i += 1;\n }\n }\n\n return removeCnt;\n}\n\nfunction isArraysEqual(a0, a1, equalityFunc) {\n if (a0 === a1) {\n return true;\n }\n\n var len = a0.length;\n var i;\n\n if (len !== a1.length) {\n // not array? or not same length?\n return false;\n }\n\n for (i = 0; i < len; i += 1) {\n if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction memoize(workerFunc, resEquality, teardownFunc) {\n var currentArgs;\n var currentRes;\n return function () {\n var newArgs = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n newArgs[_i] = arguments[_i];\n }\n\n if (!currentArgs) {\n currentRes = workerFunc.apply(this, newArgs);\n } else if (!isArraysEqual(currentArgs, newArgs)) {\n if (teardownFunc) {\n teardownFunc(currentRes);\n }\n\n var res = workerFunc.apply(this, newArgs);\n\n if (!resEquality || !resEquality(res, currentRes)) {\n currentRes = res;\n }\n }\n\n currentArgs = newArgs;\n return currentRes;\n };\n}\n\nfunction memoizeObjArg(workerFunc, resEquality, teardownFunc) {\n var _this = this;\n\n var currentArg;\n var currentRes;\n return function (newArg) {\n if (!currentArg) {\n currentRes = workerFunc.call(_this, newArg);\n } else if (!isPropsEqual(currentArg, newArg)) {\n if (teardownFunc) {\n teardownFunc(currentRes);\n }\n\n var res = workerFunc.call(_this, newArg);\n\n if (!resEquality || !resEquality(res, currentRes)) {\n currentRes = res;\n }\n }\n\n currentArg = newArg;\n return currentRes;\n };\n}\n\nfunction memoizeArraylike( // used at all?\nworkerFunc, resEquality, teardownFunc) {\n var _this = this;\n\n var currentArgSets = [];\n var currentResults = [];\n return function (newArgSets) {\n var currentLen = currentArgSets.length;\n var newLen = newArgSets.length;\n var i = 0;\n\n for (; i < currentLen; i += 1) {\n if (!newArgSets[i]) {\n // one of the old sets no longer exists\n if (teardownFunc) {\n teardownFunc(currentResults[i]);\n }\n } else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) {\n if (teardownFunc) {\n teardownFunc(currentResults[i]);\n }\n\n var res = workerFunc.apply(_this, newArgSets[i]);\n\n if (!resEquality || !resEquality(res, currentResults[i])) {\n currentResults[i] = res;\n }\n }\n }\n\n for (; i < newLen; i += 1) {\n currentResults[i] = workerFunc.apply(_this, newArgSets[i]);\n }\n\n currentArgSets = newArgSets;\n currentResults.splice(newLen); // remove excess\n\n return currentResults;\n };\n}\n\nfunction memoizeHashlike(workerFunc, resEquality, teardownFunc) {\n var _this = this;\n\n var currentArgHash = {};\n var currentResHash = {};\n return function (newArgHash) {\n var newResHash = {};\n\n for (var key in newArgHash) {\n if (!currentResHash[key]) {\n newResHash[key] = workerFunc.apply(_this, newArgHash[key]);\n } else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) {\n if (teardownFunc) {\n teardownFunc(currentResHash[key]);\n }\n\n var res = workerFunc.apply(_this, newArgHash[key]);\n newResHash[key] = resEquality && resEquality(res, currentResHash[key]) ? currentResHash[key] : res;\n } else {\n newResHash[key] = currentResHash[key];\n }\n }\n\n currentArgHash = newArgHash;\n currentResHash = newResHash;\n return newResHash;\n };\n}\n\nvar EXTENDED_SETTINGS_AND_SEVERITIES = {\n week: 3,\n separator: 0,\n omitZeroMinute: 0,\n meridiem: 0,\n omitCommas: 0\n};\nvar STANDARD_DATE_PROP_SEVERITIES = {\n timeZoneName: 7,\n era: 6,\n year: 5,\n month: 4,\n day: 2,\n weekday: 2,\n hour: 1,\n minute: 1,\n second: 1\n};\nvar MERIDIEM_RE = /\\s*([ap])\\.?m\\.?/i; // eats up leading spaces too\n\nvar COMMA_RE = /,/g; // we need re for globalness\n\nvar MULTI_SPACE_RE = /\\s+/g;\nvar LTR_RE = /\\u200e/g; // control character\n\nvar UTC_RE = /UTC|GMT/;\n\nvar NativeFormatter =\n/** @class */\nfunction () {\n function NativeFormatter(formatSettings) {\n var standardDateProps = {};\n var extendedSettings = {};\n var severity = 0;\n\n for (var name_1 in formatSettings) {\n if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {\n extendedSettings[name_1] = formatSettings[name_1];\n severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);\n } else {\n standardDateProps[name_1] = formatSettings[name_1];\n\n if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {\n // TODO: what about hour12? no severity\n severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);\n }\n }\n }\n\n this.standardDateProps = standardDateProps;\n this.extendedSettings = extendedSettings;\n this.severity = severity;\n this.buildFormattingFunc = memoize(buildFormattingFunc);\n }\n\n NativeFormatter.prototype.format = function (date, context) {\n return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);\n };\n\n NativeFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) {\n var _a = this,\n standardDateProps = _a.standardDateProps,\n extendedSettings = _a.extendedSettings;\n\n var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);\n\n if (!diffSeverity) {\n return this.format(start, context);\n }\n\n var biggestUnitForPartial = diffSeverity;\n\n if (biggestUnitForPartial > 1 && ( // the two dates are different in a way that's larger scale than time\n standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {\n biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time\n }\n\n var full0 = this.format(start, context);\n var full1 = this.format(end, context);\n\n if (full0 === full1) {\n return full0;\n }\n\n var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);\n var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);\n var partial0 = partialFormattingFunc(start);\n var partial1 = partialFormattingFunc(end);\n var insertion = findCommonInsertion(full0, partial0, full1, partial1);\n var separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || '';\n\n if (insertion) {\n return insertion.before + partial0 + separator + partial1 + insertion.after;\n }\n\n return full0 + separator + full1;\n };\n\n NativeFormatter.prototype.getLargestUnit = function () {\n switch (this.severity) {\n case 7:\n case 6:\n case 5:\n return 'year';\n\n case 4:\n return 'month';\n\n case 3:\n return 'week';\n\n case 2:\n return 'day';\n\n default:\n return 'time';\n // really?\n }\n };\n\n return NativeFormatter;\n}();\n\nfunction buildFormattingFunc(standardDateProps, extendedSettings, context) {\n var standardDatePropCnt = Object.keys(standardDateProps).length;\n\n if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {\n return function (date) {\n return formatTimeZoneOffset(date.timeZoneOffset);\n };\n }\n\n if (standardDatePropCnt === 0 && extendedSettings.week) {\n return function (date) {\n return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week);\n };\n }\n\n return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);\n}\n\nfunction buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {\n standardDateProps = __assign({}, standardDateProps); // copy\n\n extendedSettings = __assign({}, extendedSettings); // copy\n\n sanitizeSettings(standardDateProps, extendedSettings);\n standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers\n\n var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);\n var zeroFormat; // needed?\n\n if (extendedSettings.omitZeroMinute) {\n var zeroProps = __assign({}, standardDateProps);\n\n delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings\n\n zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);\n }\n\n return function (date) {\n var marker = date.marker;\n var format;\n\n if (zeroFormat && !marker.getUTCMinutes()) {\n format = zeroFormat;\n } else {\n format = normalFormat;\n }\n\n var s = format.format(marker);\n return postProcess(s, date, standardDateProps, extendedSettings, context);\n };\n}\n\nfunction sanitizeSettings(standardDateProps, extendedSettings) {\n // deal with a browser inconsistency where formatting the timezone\n // requires that the hour/minute be present.\n if (standardDateProps.timeZoneName) {\n if (!standardDateProps.hour) {\n standardDateProps.hour = '2-digit';\n }\n\n if (!standardDateProps.minute) {\n standardDateProps.minute = '2-digit';\n }\n } // only support short timezone names\n\n\n if (standardDateProps.timeZoneName === 'long') {\n standardDateProps.timeZoneName = 'short';\n } // if requesting to display seconds, MUST display minutes\n\n\n if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {\n delete extendedSettings.omitZeroMinute;\n }\n}\n\nfunction postProcess(s, date, standardDateProps, extendedSettings, context) {\n s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes\n\n if (standardDateProps.timeZoneName === 'short') {\n s = injectTzoStr(s, context.timeZone === 'UTC' || date.timeZoneOffset == null ? 'UTC' : // important to normalize for IE, which does \"GMT\"\n formatTimeZoneOffset(date.timeZoneOffset));\n }\n\n if (extendedSettings.omitCommas) {\n s = s.replace(COMMA_RE, '').trim();\n }\n\n if (extendedSettings.omitZeroMinute) {\n s = s.replace(':00', ''); // zeroFormat doesn't always achieve this\n } // ^ do anything that might create adjacent spaces before this point,\n // because MERIDIEM_RE likes to eat up loading spaces\n\n\n if (extendedSettings.meridiem === false) {\n s = s.replace(MERIDIEM_RE, '').trim();\n } else if (extendedSettings.meridiem === 'narrow') {\n // a/p\n s = s.replace(MERIDIEM_RE, function (m0, m1) {\n return m1.toLocaleLowerCase();\n });\n } else if (extendedSettings.meridiem === 'short') {\n // am/pm\n s = s.replace(MERIDIEM_RE, function (m0, m1) {\n return m1.toLocaleLowerCase() + \"m\";\n });\n } else if (extendedSettings.meridiem === 'lowercase') {\n // other meridiem transformers already converted to lowercase\n s = s.replace(MERIDIEM_RE, function (m0) {\n return m0.toLocaleLowerCase();\n });\n }\n\n s = s.replace(MULTI_SPACE_RE, ' ');\n s = s.trim();\n return s;\n}\n\nfunction injectTzoStr(s, tzoStr) {\n var replaced = false;\n s = s.replace(UTC_RE, function () {\n replaced = true;\n return tzoStr;\n }); // IE11 doesn't include UTC/GMT in the original string, so append to end\n\n if (!replaced) {\n s += \" \" + tzoStr;\n }\n\n return s;\n}\n\nfunction formatWeekNumber(num, weekText, weekTextLong, locale, display) {\n var parts = [];\n\n if (display === 'long') {\n parts.push(weekTextLong);\n } else if (display === 'short' || display === 'narrow') {\n parts.push(weekText);\n }\n\n if (display === 'long' || display === 'short') {\n parts.push(' ');\n }\n\n parts.push(locale.simpleNumberFormat.format(num));\n\n if (locale.options.direction === 'rtl') {\n // TODO: use control characters instead?\n parts.reverse();\n }\n\n return parts.join('');\n} // Range Formatting Utils\n// 0 = exactly the same\n// 1 = different by time\n// and bigger\n\n\nfunction computeMarkerDiffSeverity(d0, d1, ca) {\n if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {\n return 5;\n }\n\n if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {\n return 4;\n }\n\n if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {\n return 2;\n }\n\n if (timeAsMs(d0) !== timeAsMs(d1)) {\n return 1;\n }\n\n return 0;\n}\n\nfunction computePartialFormattingOptions(options, biggestUnit) {\n var partialOptions = {};\n\n for (var name_2 in options) {\n if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)\n STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {\n partialOptions[name_2] = options[name_2];\n }\n }\n\n return partialOptions;\n}\n\nfunction findCommonInsertion(full0, partial0, full1, partial1) {\n var i0 = 0;\n\n while (i0 < full0.length) {\n var found0 = full0.indexOf(partial0, i0);\n\n if (found0 === -1) {\n break;\n }\n\n var before0 = full0.substr(0, found0);\n i0 = found0 + partial0.length;\n var after0 = full0.substr(i0);\n var i1 = 0;\n\n while (i1 < full1.length) {\n var found1 = full1.indexOf(partial1, i1);\n\n if (found1 === -1) {\n break;\n }\n\n var before1 = full1.substr(0, found1);\n i1 = found1 + partial1.length;\n var after1 = full1.substr(i1);\n\n if (before0 === before1 && after0 === after1) {\n return {\n before: before0,\n after: after0\n };\n }\n }\n }\n\n return null;\n}\n\nfunction expandZonedMarker(dateInfo, calendarSystem) {\n var a = calendarSystem.markerToArray(dateInfo.marker);\n return {\n marker: dateInfo.marker,\n timeZoneOffset: dateInfo.timeZoneOffset,\n array: a,\n year: a[0],\n month: a[1],\n day: a[2],\n hour: a[3],\n minute: a[4],\n second: a[5],\n millisecond: a[6]\n };\n}\n\nfunction createVerboseFormattingArg(start, end, context, betterDefaultSeparator) {\n var startInfo = expandZonedMarker(start, context.calendarSystem);\n var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;\n return {\n date: startInfo,\n start: startInfo,\n end: endInfo,\n timeZone: context.timeZone,\n localeCodes: context.locale.codes,\n defaultSeparator: betterDefaultSeparator || context.defaultSeparator\n };\n}\n/*\nTODO: fix the terminology of \"formatter\" vs \"formatting func\"\n*/\n\n/*\nAt the time of instantiation, this object does not know which cmd-formatting system it will use.\nIt receives this at the time of formatting, as a setting.\n*/\n\n\nvar CmdFormatter =\n/** @class */\nfunction () {\n function CmdFormatter(cmdStr) {\n this.cmdStr = cmdStr;\n }\n\n CmdFormatter.prototype.format = function (date, context, betterDefaultSeparator) {\n return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator));\n };\n\n CmdFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) {\n return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator));\n };\n\n return CmdFormatter;\n}();\n\nvar FuncFormatter =\n/** @class */\nfunction () {\n function FuncFormatter(func) {\n this.func = func;\n }\n\n FuncFormatter.prototype.format = function (date, context, betterDefaultSeparator) {\n return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator));\n };\n\n FuncFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) {\n return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator));\n };\n\n return FuncFormatter;\n}();\n\nfunction createFormatter(input) {\n if (_typeof(input) === 'object' && input) {\n // non-null object\n return new NativeFormatter(input);\n }\n\n if (typeof input === 'string') {\n return new CmdFormatter(input);\n }\n\n if (typeof input === 'function') {\n return new FuncFormatter(input);\n }\n\n return null;\n} // base options\n// ------------\n\n\nvar BASE_OPTION_REFINERS = {\n navLinkDayClick: identity,\n navLinkWeekClick: identity,\n duration: createDuration,\n bootstrapFontAwesome: identity,\n buttonIcons: identity,\n customButtons: identity,\n defaultAllDayEventDuration: createDuration,\n defaultTimedEventDuration: createDuration,\n nextDayThreshold: createDuration,\n scrollTime: createDuration,\n scrollTimeReset: Boolean,\n slotMinTime: createDuration,\n slotMaxTime: createDuration,\n dayPopoverFormat: createFormatter,\n slotDuration: createDuration,\n snapDuration: createDuration,\n headerToolbar: identity,\n footerToolbar: identity,\n defaultRangeSeparator: String,\n titleRangeSeparator: String,\n forceEventDuration: Boolean,\n dayHeaders: Boolean,\n dayHeaderFormat: createFormatter,\n dayHeaderClassNames: identity,\n dayHeaderContent: identity,\n dayHeaderDidMount: identity,\n dayHeaderWillUnmount: identity,\n dayCellClassNames: identity,\n dayCellContent: identity,\n dayCellDidMount: identity,\n dayCellWillUnmount: identity,\n initialView: String,\n aspectRatio: Number,\n weekends: Boolean,\n weekNumberCalculation: identity,\n weekNumbers: Boolean,\n weekNumberClassNames: identity,\n weekNumberContent: identity,\n weekNumberDidMount: identity,\n weekNumberWillUnmount: identity,\n editable: Boolean,\n viewClassNames: identity,\n viewDidMount: identity,\n viewWillUnmount: identity,\n nowIndicator: Boolean,\n nowIndicatorClassNames: identity,\n nowIndicatorContent: identity,\n nowIndicatorDidMount: identity,\n nowIndicatorWillUnmount: identity,\n showNonCurrentDates: Boolean,\n lazyFetching: Boolean,\n startParam: String,\n endParam: String,\n timeZoneParam: String,\n timeZone: String,\n locales: identity,\n locale: identity,\n themeSystem: String,\n dragRevertDuration: Number,\n dragScroll: Boolean,\n allDayMaintainDuration: Boolean,\n unselectAuto: Boolean,\n dropAccept: identity,\n eventOrder: parseFieldSpecs,\n eventOrderStrict: Boolean,\n handleWindowResize: Boolean,\n windowResizeDelay: Number,\n longPressDelay: Number,\n eventDragMinDistance: Number,\n expandRows: Boolean,\n height: identity,\n contentHeight: identity,\n direction: String,\n weekNumberFormat: createFormatter,\n eventResizableFromStart: Boolean,\n displayEventTime: Boolean,\n displayEventEnd: Boolean,\n weekText: String,\n weekTextLong: String,\n progressiveEventRendering: Boolean,\n businessHours: identity,\n initialDate: identity,\n now: identity,\n eventDataTransform: identity,\n stickyHeaderDates: identity,\n stickyFooterScrollbar: identity,\n viewHeight: identity,\n defaultAllDay: Boolean,\n eventSourceFailure: identity,\n eventSourceSuccess: identity,\n eventDisplay: String,\n eventStartEditable: Boolean,\n eventDurationEditable: Boolean,\n eventOverlap: identity,\n eventConstraint: identity,\n eventAllow: identity,\n eventBackgroundColor: String,\n eventBorderColor: String,\n eventTextColor: String,\n eventColor: String,\n eventClassNames: identity,\n eventContent: identity,\n eventDidMount: identity,\n eventWillUnmount: identity,\n selectConstraint: identity,\n selectOverlap: identity,\n selectAllow: identity,\n droppable: Boolean,\n unselectCancel: String,\n slotLabelFormat: identity,\n slotLaneClassNames: identity,\n slotLaneContent: identity,\n slotLaneDidMount: identity,\n slotLaneWillUnmount: identity,\n slotLabelClassNames: identity,\n slotLabelContent: identity,\n slotLabelDidMount: identity,\n slotLabelWillUnmount: identity,\n dayMaxEvents: identity,\n dayMaxEventRows: identity,\n dayMinWidth: Number,\n slotLabelInterval: createDuration,\n allDayText: String,\n allDayClassNames: identity,\n allDayContent: identity,\n allDayDidMount: identity,\n allDayWillUnmount: identity,\n slotMinWidth: Number,\n navLinks: Boolean,\n eventTimeFormat: createFormatter,\n rerenderDelay: Number,\n moreLinkText: identity,\n moreLinkHint: identity,\n selectMinDistance: Number,\n selectable: Boolean,\n selectLongPressDelay: Number,\n eventLongPressDelay: Number,\n selectMirror: Boolean,\n eventMaxStack: Number,\n eventMinHeight: Number,\n eventMinWidth: Number,\n eventShortHeight: Number,\n slotEventOverlap: Boolean,\n plugins: identity,\n firstDay: Number,\n dayCount: Number,\n dateAlignment: String,\n dateIncrement: createDuration,\n hiddenDays: identity,\n monthMode: Boolean,\n fixedWeekCount: Boolean,\n validRange: identity,\n visibleRange: identity,\n titleFormat: identity,\n eventInteractive: Boolean,\n // only used by list-view, but languages define the value, so we need it in base options\n noEventsText: String,\n viewHint: identity,\n navLinkHint: identity,\n closeHint: String,\n timeHint: String,\n eventHint: String,\n moreLinkClick: identity,\n moreLinkClassNames: identity,\n moreLinkContent: identity,\n moreLinkDidMount: identity,\n moreLinkWillUnmount: identity\n}; // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results.\n// raw values.\n\nvar BASE_OPTION_DEFAULTS = {\n eventDisplay: 'auto',\n defaultRangeSeparator: ' - ',\n titleRangeSeparator: \" \\u2013 \",\n defaultTimedEventDuration: '01:00:00',\n defaultAllDayEventDuration: {\n day: 1\n },\n forceEventDuration: false,\n nextDayThreshold: '00:00:00',\n dayHeaders: true,\n initialView: '',\n aspectRatio: 1.35,\n headerToolbar: {\n start: 'title',\n center: '',\n end: 'today prev,next'\n },\n weekends: true,\n weekNumbers: false,\n weekNumberCalculation: 'local',\n editable: false,\n nowIndicator: false,\n scrollTime: '06:00:00',\n scrollTimeReset: true,\n slotMinTime: '00:00:00',\n slotMaxTime: '24:00:00',\n showNonCurrentDates: true,\n lazyFetching: true,\n startParam: 'start',\n endParam: 'end',\n timeZoneParam: 'timeZone',\n timeZone: 'local',\n locales: [],\n locale: '',\n themeSystem: 'standard',\n dragRevertDuration: 500,\n dragScroll: true,\n allDayMaintainDuration: false,\n unselectAuto: true,\n dropAccept: '*',\n eventOrder: 'start,-duration,allDay,title',\n dayPopoverFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric'\n },\n handleWindowResize: true,\n windowResizeDelay: 100,\n longPressDelay: 1000,\n eventDragMinDistance: 5,\n expandRows: false,\n navLinks: false,\n selectable: false,\n eventMinHeight: 15,\n eventMinWidth: 30,\n eventShortHeight: 30\n}; // calendar listeners\n// ------------------\n\nvar CALENDAR_LISTENER_REFINERS = {\n datesSet: identity,\n eventsSet: identity,\n eventAdd: identity,\n eventChange: identity,\n eventRemove: identity,\n windowResize: identity,\n eventClick: identity,\n eventMouseEnter: identity,\n eventMouseLeave: identity,\n select: identity,\n unselect: identity,\n loading: identity,\n // internal\n _unmount: identity,\n _beforeprint: identity,\n _afterprint: identity,\n _noEventDrop: identity,\n _noEventResize: identity,\n _resize: identity,\n _scrollRequest: identity\n}; // calendar-specific options\n// -------------------------\n\nvar CALENDAR_OPTION_REFINERS = {\n buttonText: identity,\n buttonHints: identity,\n views: identity,\n plugins: identity,\n initialEvents: identity,\n events: identity,\n eventSources: identity\n};\nvar COMPLEX_OPTION_COMPARATORS = {\n headerToolbar: isMaybeObjectsEqual,\n footerToolbar: isMaybeObjectsEqual,\n buttonText: isMaybeObjectsEqual,\n buttonHints: isMaybeObjectsEqual,\n buttonIcons: isMaybeObjectsEqual,\n dateIncrement: isMaybeObjectsEqual\n};\n\nfunction isMaybeObjectsEqual(a, b) {\n if (_typeof(a) === 'object' && _typeof(b) === 'object' && a && b) {\n // both non-null objects\n return isPropsEqual(a, b);\n }\n\n return a === b;\n} // view-specific options\n// ---------------------\n\n\nvar VIEW_OPTION_REFINERS = {\n type: String,\n component: identity,\n buttonText: String,\n buttonTextKey: String,\n dateProfileGeneratorClass: identity,\n usesMinMaxTime: Boolean,\n classNames: identity,\n content: identity,\n didMount: identity,\n willUnmount: identity\n}; // util funcs\n// ----------------------------------------------------------------------------------------------------\n\nfunction mergeRawOptions(optionSets) {\n return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS);\n}\n\nfunction refineProps(input, refiners) {\n var refined = {};\n var extra = {};\n\n for (var propName in refiners) {\n if (propName in input) {\n refined[propName] = refiners[propName](input[propName]);\n }\n }\n\n for (var propName in input) {\n if (!(propName in refiners)) {\n extra[propName] = input[propName];\n }\n }\n\n return {\n refined: refined,\n extra: extra\n };\n}\n\nfunction identity(raw) {\n return raw;\n}\n\nfunction parseEvents(rawEvents, eventSource, context, allowOpenRange) {\n var eventStore = createEmptyEventStore();\n var eventRefiners = buildEventRefiners(context);\n\n for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {\n var rawEvent = rawEvents_1[_i];\n var tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners);\n\n if (tuple) {\n eventTupleToStore(tuple, eventStore);\n }\n }\n\n return eventStore;\n}\n\nfunction eventTupleToStore(tuple, eventStore) {\n if (eventStore === void 0) {\n eventStore = createEmptyEventStore();\n }\n\n eventStore.defs[tuple.def.defId] = tuple.def;\n\n if (tuple.instance) {\n eventStore.instances[tuple.instance.instanceId] = tuple.instance;\n }\n\n return eventStore;\n} // retrieves events that have the same groupId as the instance specified by `instanceId`\n// or they are the same as the instance.\n// why might instanceId not be in the store? an event from another calendar?\n\n\nfunction getRelevantEvents(eventStore, instanceId) {\n var instance = eventStore.instances[instanceId];\n\n if (instance) {\n var def_1 = eventStore.defs[instance.defId]; // get events/instances with same group\n\n var newStore = filterEventStoreDefs(eventStore, function (lookDef) {\n return isEventDefsGrouped(def_1, lookDef);\n }); // add the original\n // TODO: wish we could use eventTupleToStore or something like it\n\n newStore.defs[def_1.defId] = def_1;\n newStore.instances[instance.instanceId] = instance;\n return newStore;\n }\n\n return createEmptyEventStore();\n}\n\nfunction isEventDefsGrouped(def0, def1) {\n return Boolean(def0.groupId && def0.groupId === def1.groupId);\n}\n\nfunction createEmptyEventStore() {\n return {\n defs: {},\n instances: {}\n };\n}\n\nfunction mergeEventStores(store0, store1) {\n return {\n defs: __assign(__assign({}, store0.defs), store1.defs),\n instances: __assign(__assign({}, store0.instances), store1.instances)\n };\n}\n\nfunction filterEventStoreDefs(eventStore, filterFunc) {\n var defs = filterHash(eventStore.defs, filterFunc);\n var instances = filterHash(eventStore.instances, function (instance) {\n return defs[instance.defId] // still exists?\n ;\n });\n return {\n defs: defs,\n instances: instances\n };\n}\n\nfunction excludeSubEventStore(master, sub) {\n var defs = master.defs,\n instances = master.instances;\n var filteredDefs = {};\n var filteredInstances = {};\n\n for (var defId in defs) {\n if (!sub.defs[defId]) {\n // not explicitly excluded\n filteredDefs[defId] = defs[defId];\n }\n }\n\n for (var instanceId in instances) {\n if (!sub.instances[instanceId] && // not explicitly excluded\n filteredDefs[instances[instanceId].defId] // def wasn't filtered away\n ) {\n filteredInstances[instanceId] = instances[instanceId];\n }\n }\n\n return {\n defs: filteredDefs,\n instances: filteredInstances\n };\n}\n\nfunction normalizeConstraint(input, context) {\n if (Array.isArray(input)) {\n return parseEvents(input, null, context, true); // allowOpenRange=true\n }\n\n if (_typeof(input) === 'object' && input) {\n // non-null object\n return parseEvents([input], null, context, true); // allowOpenRange=true\n }\n\n if (input != null) {\n return String(input);\n }\n\n return null;\n}\n\nfunction parseClassNames(raw) {\n if (Array.isArray(raw)) {\n return raw;\n }\n\n if (typeof raw === 'string') {\n return raw.split(/\\s+/);\n }\n\n return [];\n} // TODO: better called \"EventSettings\" or \"EventConfig\"\n// TODO: move this file into structs\n// TODO: separate constraint/overlap/allow, because selection uses only that, not other props\n\n\nvar EVENT_UI_REFINERS = {\n display: String,\n editable: Boolean,\n startEditable: Boolean,\n durationEditable: Boolean,\n constraint: identity,\n overlap: identity,\n allow: identity,\n className: parseClassNames,\n classNames: parseClassNames,\n color: String,\n backgroundColor: String,\n borderColor: String,\n textColor: String\n};\nvar EMPTY_EVENT_UI = {\n display: null,\n startEditable: null,\n durationEditable: null,\n constraints: [],\n overlap: null,\n allows: [],\n backgroundColor: '',\n borderColor: '',\n textColor: '',\n classNames: []\n};\n\nfunction createEventUi(refined, context) {\n var constraint = normalizeConstraint(refined.constraint, context);\n return {\n display: refined.display || null,\n startEditable: refined.startEditable != null ? refined.startEditable : refined.editable,\n durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable,\n constraints: constraint != null ? [constraint] : [],\n overlap: refined.overlap != null ? refined.overlap : null,\n allows: refined.allow != null ? [refined.allow] : [],\n backgroundColor: refined.backgroundColor || refined.color || '',\n borderColor: refined.borderColor || refined.color || '',\n textColor: refined.textColor || '',\n classNames: (refined.className || []).concat(refined.classNames || []) // join singular and plural\n\n };\n} // TODO: prevent against problems with <2 args!\n\n\nfunction combineEventUis(uis) {\n return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);\n}\n\nfunction combineTwoEventUis(item0, item1) {\n return {\n display: item1.display != null ? item1.display : item0.display,\n startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,\n durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,\n constraints: item0.constraints.concat(item1.constraints),\n overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,\n allows: item0.allows.concat(item1.allows),\n backgroundColor: item1.backgroundColor || item0.backgroundColor,\n borderColor: item1.borderColor || item0.borderColor,\n textColor: item1.textColor || item0.textColor,\n classNames: item0.classNames.concat(item1.classNames)\n };\n}\n\nvar EVENT_NON_DATE_REFINERS = {\n id: String,\n groupId: String,\n title: String,\n url: String,\n interactive: Boolean\n};\nvar EVENT_DATE_REFINERS = {\n start: identity,\n end: identity,\n date: identity,\n allDay: Boolean\n};\n\nvar EVENT_REFINERS = __assign(__assign(__assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), {\n extendedProps: identity\n});\n\nfunction parseEvent(raw, eventSource, context, allowOpenRange, refiners) {\n if (refiners === void 0) {\n refiners = buildEventRefiners(context);\n }\n\n var _a = refineEventDef(raw, context, refiners),\n refined = _a.refined,\n extra = _a.extra;\n\n var defaultAllDay = computeIsDefaultAllDay(eventSource, context);\n var recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes);\n\n if (recurringRes) {\n var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context);\n def.recurringDef = {\n typeId: recurringRes.typeId,\n typeData: recurringRes.typeData,\n duration: recurringRes.duration\n };\n return {\n def: def,\n instance: null\n };\n }\n\n var singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange);\n\n if (singleRes) {\n var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context);\n var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);\n return {\n def: def,\n instance: instance\n };\n }\n\n return null;\n}\n\nfunction refineEventDef(raw, context, refiners) {\n if (refiners === void 0) {\n refiners = buildEventRefiners(context);\n }\n\n return refineProps(raw, refiners);\n}\n\nfunction buildEventRefiners(context) {\n return __assign(__assign(__assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners);\n}\n/*\nWill NOT populate extendedProps with the leftover properties.\nWill NOT populate date-related props.\n*/\n\n\nfunction parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) {\n var def = {\n title: refined.title || '',\n groupId: refined.groupId || '',\n publicId: refined.id || '',\n url: refined.url || '',\n recurringDef: null,\n defId: guid(),\n sourceId: sourceId,\n allDay: allDay,\n hasEnd: hasEnd,\n interactive: refined.interactive,\n ui: createEventUi(refined, context),\n extendedProps: __assign(__assign({}, refined.extendedProps || {}), extra)\n };\n\n for (var _i = 0, _a = context.pluginHooks.eventDefMemberAdders; _i < _a.length; _i++) {\n var memberAdder = _a[_i];\n\n __assign(def, memberAdder(refined));\n } // help out EventApi from having user modify props\n\n\n Object.freeze(def.ui.classNames);\n Object.freeze(def.extendedProps);\n return def;\n}\n\nfunction parseSingle(refined, defaultAllDay, context, allowOpenRange) {\n var allDay = refined.allDay;\n var startMeta;\n var startMarker = null;\n var hasEnd = false;\n var endMeta;\n var endMarker = null;\n var startInput = refined.start != null ? refined.start : refined.date;\n startMeta = context.dateEnv.createMarkerMeta(startInput);\n\n if (startMeta) {\n startMarker = startMeta.marker;\n } else if (!allowOpenRange) {\n return null;\n }\n\n if (refined.end != null) {\n endMeta = context.dateEnv.createMarkerMeta(refined.end);\n }\n\n if (allDay == null) {\n if (defaultAllDay != null) {\n allDay = defaultAllDay;\n } else {\n // fall back to the date props LAST\n allDay = (!startMeta || startMeta.isTimeUnspecified) && (!endMeta || endMeta.isTimeUnspecified);\n }\n }\n\n if (allDay && startMarker) {\n startMarker = startOfDay(startMarker);\n }\n\n if (endMeta) {\n endMarker = endMeta.marker;\n\n if (allDay) {\n endMarker = startOfDay(endMarker);\n }\n\n if (startMarker && endMarker <= startMarker) {\n endMarker = null;\n }\n }\n\n if (endMarker) {\n hasEnd = true;\n } else if (!allowOpenRange) {\n hasEnd = context.options.forceEventDuration || false;\n endMarker = context.dateEnv.add(startMarker, allDay ? context.options.defaultAllDayEventDuration : context.options.defaultTimedEventDuration);\n }\n\n return {\n allDay: allDay,\n hasEnd: hasEnd,\n range: {\n start: startMarker,\n end: endMarker\n },\n forcedStartTzo: startMeta ? startMeta.forcedTzo : null,\n forcedEndTzo: endMeta ? endMeta.forcedTzo : null\n };\n}\n\nfunction computeIsDefaultAllDay(eventSource, context) {\n var res = null;\n\n if (eventSource) {\n res = eventSource.defaultAllDay;\n }\n\n if (res == null) {\n res = context.options.defaultAllDay;\n }\n\n return res;\n}\n/* Date stuff that doesn't belong in datelib core\n----------------------------------------------------------------------------------------------------------------------*/\n// given a timed range, computes an all-day range that has the same exact duration,\n// but whose start time is aligned with the start of the day.\n\n\nfunction computeAlignedDayRange(timedRange) {\n var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;\n var start = startOfDay(timedRange.start);\n var end = addDays(start, dayCnt);\n return {\n start: start,\n end: end\n };\n} // given a timed range, computes an all-day range based on how for the end date bleeds into the next day\n// TODO: give nextDayThreshold a default arg\n\n\nfunction computeVisibleDayRange(timedRange, nextDayThreshold) {\n if (nextDayThreshold === void 0) {\n nextDayThreshold = createDuration(0);\n }\n\n var startDay = null;\n var endDay = null;\n\n if (timedRange.end) {\n endDay = startOfDay(timedRange.end);\n var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`\n // If the end time is actually inclusively part of the next day and is equal to or\n // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\n // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\n\n if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {\n endDay = addDays(endDay, 1);\n }\n }\n\n if (timedRange.start) {\n startDay = startOfDay(timedRange.start); // the beginning of the day the range starts\n // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.\n\n if (endDay && endDay <= startDay) {\n endDay = addDays(startDay, 1);\n }\n }\n\n return {\n start: startDay,\n end: endDay\n };\n} // spans from one day into another?\n\n\nfunction isMultiDayRange(range) {\n var visibleRange = computeVisibleDayRange(range);\n return diffDays(visibleRange.start, visibleRange.end) > 1;\n}\n\nfunction diffDates(date0, date1, dateEnv, largeUnit) {\n if (largeUnit === 'year') {\n return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');\n }\n\n if (largeUnit === 'month') {\n return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');\n }\n\n return diffDayAndTime(date0, date1); // returns a duration\n}\n\nfunction parseRange(input, dateEnv) {\n var start = null;\n var end = null;\n\n if (input.start) {\n start = dateEnv.createMarker(input.start);\n }\n\n if (input.end) {\n end = dateEnv.createMarker(input.end);\n }\n\n if (!start && !end) {\n return null;\n }\n\n if (start && end && end < start) {\n return null;\n }\n\n return {\n start: start,\n end: end\n };\n} // SIDE-EFFECT: will mutate ranges.\n// Will return a new array result.\n\n\nfunction invertRanges(ranges, constraintRange) {\n var invertedRanges = [];\n var start = constraintRange.start; // the end of the previous range. the start of the new range\n\n var i;\n var dateRange; // ranges need to be in order. required for our date-walking algorithm\n\n ranges.sort(compareRanges);\n\n for (i = 0; i < ranges.length; i += 1) {\n dateRange = ranges[i]; // add the span of time before the event (if there is any)\n\n if (dateRange.start > start) {\n // compare millisecond time (skip any ambig logic)\n invertedRanges.push({\n start: start,\n end: dateRange.start\n });\n }\n\n if (dateRange.end > start) {\n start = dateRange.end;\n }\n } // add the span of time after the last event (if there is any)\n\n\n if (start < constraintRange.end) {\n // compare millisecond time (skip any ambig logic)\n invertedRanges.push({\n start: start,\n end: constraintRange.end\n });\n }\n\n return invertedRanges;\n}\n\nfunction compareRanges(range0, range1) {\n return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first\n}\n\nfunction intersectRanges(range0, range1) {\n var start = range0.start,\n end = range0.end;\n var newRange = null;\n\n if (range1.start !== null) {\n if (start === null) {\n start = range1.start;\n } else {\n start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));\n }\n }\n\n if (range1.end != null) {\n if (end === null) {\n end = range1.end;\n } else {\n end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));\n }\n }\n\n if (start === null || end === null || start < end) {\n newRange = {\n start: start,\n end: end\n };\n }\n\n return newRange;\n}\n\nfunction rangesEqual(range0, range1) {\n return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());\n}\n\nfunction rangesIntersect(range0, range1) {\n return (range0.end === null || range1.start === null || range0.end > range1.start) && (range0.start === null || range1.end === null || range0.start < range1.end);\n}\n\nfunction rangeContainsRange(outerRange, innerRange) {\n return (outerRange.start === null || innerRange.start !== null && innerRange.start >= outerRange.start) && (outerRange.end === null || innerRange.end !== null && innerRange.end <= outerRange.end);\n}\n\nfunction rangeContainsMarker(range, date) {\n return (range.start === null || date >= range.start) && (range.end === null || date < range.end);\n} // If the given date is not within the given range, move it inside.\n// (If it's past the end, make it one millisecond before the end).\n\n\nfunction constrainMarkerToRange(date, range) {\n if (range.start != null && date < range.start) {\n return range.start;\n }\n\n if (range.end != null && date >= range.end) {\n return new Date(range.end.valueOf() - 1);\n }\n\n return date;\n}\n/*\nSpecifying nextDayThreshold signals that all-day ranges should be sliced.\n*/\n\n\nfunction sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {\n var inverseBgByGroupId = {};\n var inverseBgByDefId = {};\n var defByGroupId = {};\n var bgRanges = [];\n var fgRanges = [];\n var eventUis = compileEventUis(eventStore.defs, eventUiBases);\n\n for (var defId in eventStore.defs) {\n var def = eventStore.defs[defId];\n var ui = eventUis[def.defId];\n\n if (ui.display === 'inverse-background') {\n if (def.groupId) {\n inverseBgByGroupId[def.groupId] = [];\n\n if (!defByGroupId[def.groupId]) {\n defByGroupId[def.groupId] = def;\n }\n } else {\n inverseBgByDefId[defId] = [];\n }\n }\n }\n\n for (var instanceId in eventStore.instances) {\n var instance = eventStore.instances[instanceId];\n var def = eventStore.defs[instance.defId];\n var ui = eventUis[def.defId];\n var origRange = instance.range;\n var normalRange = !def.allDay && nextDayThreshold ? computeVisibleDayRange(origRange, nextDayThreshold) : origRange;\n var slicedRange = intersectRanges(normalRange, framingRange);\n\n if (slicedRange) {\n if (ui.display === 'inverse-background') {\n if (def.groupId) {\n inverseBgByGroupId[def.groupId].push(slicedRange);\n } else {\n inverseBgByDefId[instance.defId].push(slicedRange);\n }\n } else if (ui.display !== 'none') {\n (ui.display === 'background' ? bgRanges : fgRanges).push({\n def: def,\n ui: ui,\n instance: instance,\n range: slicedRange,\n isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),\n isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()\n });\n }\n }\n }\n\n for (var groupId in inverseBgByGroupId) {\n // BY GROUP\n var ranges = inverseBgByGroupId[groupId];\n var invertedRanges = invertRanges(ranges, framingRange);\n\n for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {\n var invertedRange = invertedRanges_1[_i];\n var def = defByGroupId[groupId];\n var ui = eventUis[def.defId];\n bgRanges.push({\n def: def,\n ui: ui,\n instance: null,\n range: invertedRange,\n isStart: false,\n isEnd: false\n });\n }\n }\n\n for (var defId in inverseBgByDefId) {\n var ranges = inverseBgByDefId[defId];\n var invertedRanges = invertRanges(ranges, framingRange);\n\n for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {\n var invertedRange = invertedRanges_2[_a];\n bgRanges.push({\n def: eventStore.defs[defId],\n ui: eventUis[defId],\n instance: null,\n range: invertedRange,\n isStart: false,\n isEnd: false\n });\n }\n }\n\n return {\n bg: bgRanges,\n fg: fgRanges\n };\n}\n\nfunction hasBgRendering(def) {\n return def.ui.display === 'background' || def.ui.display === 'inverse-background';\n}\n\nfunction setElSeg(el, seg) {\n el.fcSeg = seg;\n}\n\nfunction getElSeg(el) {\n return el.fcSeg || el.parentNode.fcSeg || // for the harness\n null;\n} // event ui computation\n\n\nfunction compileEventUis(eventDefs, eventUiBases) {\n return mapHash(eventDefs, function (eventDef) {\n return compileEventUi(eventDef, eventUiBases);\n });\n}\n\nfunction compileEventUi(eventDef, eventUiBases) {\n var uis = [];\n\n if (eventUiBases['']) {\n uis.push(eventUiBases['']);\n }\n\n if (eventUiBases[eventDef.defId]) {\n uis.push(eventUiBases[eventDef.defId]);\n }\n\n uis.push(eventDef.ui);\n return combineEventUis(uis);\n}\n\nfunction sortEventSegs(segs, eventOrderSpecs) {\n var objs = segs.map(buildSegCompareObj);\n objs.sort(function (obj0, obj1) {\n return compareByFieldSpecs(obj0, obj1, eventOrderSpecs);\n });\n return objs.map(function (c) {\n return c._seg;\n });\n} // returns a object with all primitive props that can be compared\n\n\nfunction buildSegCompareObj(seg) {\n var eventRange = seg.eventRange;\n var eventDef = eventRange.def;\n var range = eventRange.instance ? eventRange.instance.range : eventRange.range;\n var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events\n\n var end = range.end ? range.end.valueOf() : 0; // \"\n\n return __assign(__assign(__assign({}, eventDef.extendedProps), eventDef), {\n id: eventDef.publicId,\n start: start,\n end: end,\n duration: end - start,\n allDay: Number(eventDef.allDay),\n _seg: seg\n });\n}\n\nfunction computeSegDraggable(seg, context) {\n var pluginHooks = context.pluginHooks;\n var transformers = pluginHooks.isDraggableTransformers;\n var _a = seg.eventRange,\n def = _a.def,\n ui = _a.ui;\n var val = ui.startEditable;\n\n for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {\n var transformer = transformers_1[_i];\n val = transformer(val, def, ui, context);\n }\n\n return val;\n}\n\nfunction computeSegStartResizable(seg, context) {\n return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart;\n}\n\nfunction computeSegEndResizable(seg, context) {\n return seg.isEnd && seg.eventRange.ui.durationEditable;\n}\n\nfunction buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true\ndefaultDisplayEventEnd, // defaults to true\nstartOverride, endOverride) {\n var dateEnv = context.dateEnv,\n options = context.options;\n var displayEventTime = options.displayEventTime,\n displayEventEnd = options.displayEventEnd;\n var eventDef = seg.eventRange.def;\n var eventInstance = seg.eventRange.instance;\n\n if (displayEventTime == null) {\n displayEventTime = defaultDisplayEventTime !== false;\n }\n\n if (displayEventEnd == null) {\n displayEventEnd = defaultDisplayEventEnd !== false;\n }\n\n var wholeEventStart = eventInstance.range.start;\n var wholeEventEnd = eventInstance.range.end;\n var segStart = startOverride || seg.start || seg.eventRange.range.start;\n var segEnd = endOverride || seg.end || seg.eventRange.range.end;\n var isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf();\n var isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf();\n\n if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) {\n segStart = isStartDay ? wholeEventStart : segStart;\n segEnd = isEndDay ? wholeEventEnd : segEnd;\n\n if (displayEventEnd && eventDef.hasEnd) {\n return dateEnv.formatRange(segStart, segEnd, timeFormat, {\n forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo,\n forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo\n });\n }\n\n return dateEnv.format(segStart, timeFormat, {\n forcedTzo: startOverride ? null : eventInstance.forcedStartTzo // nooooo, same\n\n });\n }\n\n return '';\n}\n\nfunction getSegMeta(seg, todayRange, nowDate) {\n var segRange = seg.eventRange.range;\n return {\n isPast: segRange.end < (nowDate || todayRange.start),\n isFuture: segRange.start >= (nowDate || todayRange.end),\n isToday: todayRange && rangeContainsMarker(todayRange, segRange.start)\n };\n}\n\nfunction getEventClassNames(props) {\n var classNames = ['fc-event'];\n\n if (props.isMirror) {\n classNames.push('fc-event-mirror');\n }\n\n if (props.isDraggable) {\n classNames.push('fc-event-draggable');\n }\n\n if (props.isStartResizable || props.isEndResizable) {\n classNames.push('fc-event-resizable');\n }\n\n if (props.isDragging) {\n classNames.push('fc-event-dragging');\n }\n\n if (props.isResizing) {\n classNames.push('fc-event-resizing');\n }\n\n if (props.isSelected) {\n classNames.push('fc-event-selected');\n }\n\n if (props.isStart) {\n classNames.push('fc-event-start');\n }\n\n if (props.isEnd) {\n classNames.push('fc-event-end');\n }\n\n if (props.isPast) {\n classNames.push('fc-event-past');\n }\n\n if (props.isToday) {\n classNames.push('fc-event-today');\n }\n\n if (props.isFuture) {\n classNames.push('fc-event-future');\n }\n\n return classNames;\n}\n\nfunction buildEventRangeKey(eventRange) {\n return eventRange.instance ? eventRange.instance.instanceId : eventRange.def.defId + \":\" + eventRange.range.start.toISOString(); // inverse-background events don't have specific instances. TODO: better solution\n}\n\nfunction getSegAnchorAttrs(seg, context) {\n var _a = seg.eventRange,\n def = _a.def,\n instance = _a.instance;\n var url = def.url;\n\n if (url) {\n return {\n href: url\n };\n }\n\n var emitter = context.emitter,\n options = context.options;\n var eventInteractive = options.eventInteractive;\n\n if (eventInteractive == null) {\n eventInteractive = def.interactive;\n\n if (eventInteractive == null) {\n eventInteractive = Boolean(emitter.hasHandlers('eventClick'));\n }\n } // mock what happens in EventClicking\n\n\n if (eventInteractive) {\n // only attach keyboard-related handlers because click handler is already done in EventClicking\n return createAriaKeyboardAttrs(function (ev) {\n emitter.trigger('eventClick', {\n el: ev.target,\n event: new EventApi(context, def, instance),\n jsEvent: ev,\n view: context.viewApi\n });\n });\n }\n\n return {};\n}\n\nvar STANDARD_PROPS = {\n start: identity,\n end: identity,\n allDay: Boolean\n};\n\nfunction parseDateSpan(raw, dateEnv, defaultDuration) {\n var span = parseOpenDateSpan(raw, dateEnv);\n var range = span.range;\n\n if (!range.start) {\n return null;\n }\n\n if (!range.end) {\n if (defaultDuration == null) {\n return null;\n }\n\n range.end = dateEnv.add(range.start, defaultDuration);\n }\n\n return span;\n}\n/*\nTODO: somehow combine with parseRange?\nWill return null if the start/end props were present but parsed invalidly.\n*/\n\n\nfunction parseOpenDateSpan(raw, dateEnv) {\n var _a = refineProps(raw, STANDARD_PROPS),\n standardProps = _a.refined,\n extra = _a.extra;\n\n var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;\n var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;\n var allDay = standardProps.allDay;\n\n if (allDay == null) {\n allDay = startMeta && startMeta.isTimeUnspecified && (!endMeta || endMeta.isTimeUnspecified);\n }\n\n return __assign({\n range: {\n start: startMeta ? startMeta.marker : null,\n end: endMeta ? endMeta.marker : null\n },\n allDay: allDay\n }, extra);\n}\n\nfunction isDateSpansEqual(span0, span1) {\n return rangesEqual(span0.range, span1.range) && span0.allDay === span1.allDay && isSpanPropsEqual(span0, span1);\n} // the NON-DATE-RELATED props\n\n\nfunction isSpanPropsEqual(span0, span1) {\n for (var propName in span1) {\n if (propName !== 'range' && propName !== 'allDay') {\n if (span0[propName] !== span1[propName]) {\n return false;\n }\n }\n } // are there any props that span0 has that span1 DOESN'T have?\n // both have range/allDay, so no need to special-case.\n\n\n for (var propName in span0) {\n if (!(propName in span1)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction buildDateSpanApi(span, dateEnv) {\n return __assign(__assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), {\n allDay: span.allDay\n });\n}\n\nfunction buildRangeApiWithTimeZone(range, dateEnv, omitTime) {\n return __assign(__assign({}, buildRangeApi(range, dateEnv, omitTime)), {\n timeZone: dateEnv.timeZone\n });\n}\n\nfunction buildRangeApi(range, dateEnv, omitTime) {\n return {\n start: dateEnv.toDate(range.start),\n end: dateEnv.toDate(range.end),\n startStr: dateEnv.formatIso(range.start, {\n omitTime: omitTime\n }),\n endStr: dateEnv.formatIso(range.end, {\n omitTime: omitTime\n })\n };\n}\n\nfunction fabricateEventRange(dateSpan, eventUiBases, context) {\n var res = refineEventDef({\n editable: false\n }, context);\n var def = parseEventDef(res.refined, res.extra, '', // sourceId\n dateSpan.allDay, true, // hasEnd\n context);\n return {\n def: def,\n ui: compileEventUi(def, eventUiBases),\n instance: createEventInstance(def.defId, dateSpan.range),\n range: dateSpan.range,\n isStart: true,\n isEnd: true\n };\n}\n\nfunction triggerDateSelect(selection, pev, context) {\n context.emitter.trigger('select', __assign(__assign({}, buildDateSpanApiWithContext(selection, context)), {\n jsEvent: pev ? pev.origEvent : null,\n view: context.viewApi || context.calendarApi.view\n }));\n}\n\nfunction triggerDateUnselect(pev, context) {\n context.emitter.trigger('unselect', {\n jsEvent: pev ? pev.origEvent : null,\n view: context.viewApi || context.calendarApi.view\n });\n}\n\nfunction buildDateSpanApiWithContext(dateSpan, context) {\n var props = {};\n\n for (var _i = 0, _a = context.pluginHooks.dateSpanTransforms; _i < _a.length; _i++) {\n var transform = _a[_i];\n\n __assign(props, transform(dateSpan, context));\n }\n\n __assign(props, buildDateSpanApi(dateSpan, context.dateEnv));\n\n return props;\n} // Given an event's allDay status and start date, return what its fallback end date should be.\n// TODO: rename to computeDefaultEventEnd\n\n\nfunction getDefaultEventEnd(allDay, marker, context) {\n var dateEnv = context.dateEnv,\n options = context.options;\n var end = marker;\n\n if (allDay) {\n end = startOfDay(end);\n end = dateEnv.add(end, options.defaultAllDayEventDuration);\n } else {\n end = dateEnv.add(end, options.defaultTimedEventDuration);\n }\n\n return end;\n} // applies the mutation to ALL defs/instances within the event store\n\n\nfunction applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) {\n var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);\n var dest = createEmptyEventStore();\n\n for (var defId in eventStore.defs) {\n var def = eventStore.defs[defId];\n dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context);\n }\n\n for (var instanceId in eventStore.instances) {\n var instance = eventStore.instances[instanceId];\n var def = dest.defs[instance.defId]; // important to grab the newly modified def\n\n dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context);\n }\n\n return dest;\n}\n\nfunction applyMutationToEventDef(eventDef, eventConfig, mutation, context) {\n var standardProps = mutation.standardProps || {}; // if hasEnd has not been specified, guess a good value based on deltas.\n // if duration will change, there's no way the default duration will persist,\n // and thus, we need to mark the event as having a real end\n\n if (standardProps.hasEnd == null && eventConfig.durationEditable && (mutation.startDelta || mutation.endDelta)) {\n standardProps.hasEnd = true; // TODO: is this mutation okay?\n }\n\n var copy = __assign(__assign(__assign({}, eventDef), standardProps), {\n ui: __assign(__assign({}, eventDef.ui), standardProps.ui)\n });\n\n if (mutation.extendedProps) {\n copy.extendedProps = __assign(__assign({}, copy.extendedProps), mutation.extendedProps);\n }\n\n for (var _i = 0, _a = context.pluginHooks.eventDefMutationAppliers; _i < _a.length; _i++) {\n var applier = _a[_i];\n applier(copy, mutation, context);\n }\n\n if (!copy.hasEnd && context.options.forceEventDuration) {\n copy.hasEnd = true;\n }\n\n return copy;\n}\n\nfunction applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef\neventConfig, mutation, context) {\n var dateEnv = context.dateEnv;\n var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;\n var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;\n\n var copy = __assign({}, eventInstance);\n\n if (forceAllDay) {\n copy.range = computeAlignedDayRange(copy.range);\n }\n\n if (mutation.datesDelta && eventConfig.startEditable) {\n copy.range = {\n start: dateEnv.add(copy.range.start, mutation.datesDelta),\n end: dateEnv.add(copy.range.end, mutation.datesDelta)\n };\n }\n\n if (mutation.startDelta && eventConfig.durationEditable) {\n copy.range = {\n start: dateEnv.add(copy.range.start, mutation.startDelta),\n end: copy.range.end\n };\n }\n\n if (mutation.endDelta && eventConfig.durationEditable) {\n copy.range = {\n start: copy.range.start,\n end: dateEnv.add(copy.range.end, mutation.endDelta)\n };\n }\n\n if (clearEnd) {\n copy.range = {\n start: copy.range.start,\n end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context)\n };\n } // in case event was all-day but the supplied deltas were not\n // better util for this?\n\n\n if (eventDef.allDay) {\n copy.range = {\n start: startOfDay(copy.range.start),\n end: startOfDay(copy.range.end)\n };\n } // handle invalid durations\n\n\n if (copy.range.end < copy.range.start) {\n copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context);\n }\n\n return copy;\n} // no public types yet. when there are, export from:\n// import {} from './api-type-deps'\n\n\nvar ViewApi =\n/** @class */\nfunction () {\n function ViewApi(type, getCurrentData, dateEnv) {\n this.type = type;\n this.getCurrentData = getCurrentData;\n this.dateEnv = dateEnv;\n }\n\n Object.defineProperty(ViewApi.prototype, \"calendar\", {\n get: function get() {\n return this.getCurrentData().calendarApi;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ViewApi.prototype, \"title\", {\n get: function get() {\n return this.getCurrentData().viewTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ViewApi.prototype, \"activeStart\", {\n get: function get() {\n return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ViewApi.prototype, \"activeEnd\", {\n get: function get() {\n return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ViewApi.prototype, \"currentStart\", {\n get: function get() {\n return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ViewApi.prototype, \"currentEnd\", {\n get: function get() {\n return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);\n },\n enumerable: false,\n configurable: true\n });\n\n ViewApi.prototype.getOption = function (name) {\n return this.getCurrentData().options[name]; // are the view-specific options\n };\n\n return ViewApi;\n}();\n\nvar EVENT_SOURCE_REFINERS = {\n id: String,\n defaultAllDay: Boolean,\n url: String,\n format: String,\n events: identity,\n eventDataTransform: identity,\n // for any network-related sources\n success: identity,\n failure: identity\n};\n\nfunction parseEventSource(raw, context, refiners) {\n if (refiners === void 0) {\n refiners = buildEventSourceRefiners(context);\n }\n\n var rawObj;\n\n if (typeof raw === 'string') {\n rawObj = {\n url: raw\n };\n } else if (typeof raw === 'function' || Array.isArray(raw)) {\n rawObj = {\n events: raw\n };\n } else if (_typeof(raw) === 'object' && raw) {\n // not null\n rawObj = raw;\n }\n\n if (rawObj) {\n var _a = refineProps(rawObj, refiners),\n refined = _a.refined,\n extra = _a.extra;\n\n var metaRes = buildEventSourceMeta(refined, context);\n\n if (metaRes) {\n return {\n _raw: raw,\n isFetching: false,\n latestFetchId: '',\n fetchRange: null,\n defaultAllDay: refined.defaultAllDay,\n eventDataTransform: refined.eventDataTransform,\n success: refined.success,\n failure: refined.failure,\n publicId: refined.id || '',\n sourceId: guid(),\n sourceDefId: metaRes.sourceDefId,\n meta: metaRes.meta,\n ui: createEventUi(refined, context),\n extendedProps: extra\n };\n }\n }\n\n return null;\n}\n\nfunction buildEventSourceRefiners(context) {\n return __assign(__assign(__assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners);\n}\n\nfunction buildEventSourceMeta(raw, context) {\n var defs = context.pluginHooks.eventSourceDefs;\n\n for (var i = defs.length - 1; i >= 0; i -= 1) {\n // later-added plugins take precedence\n var def = defs[i];\n var meta = def.parseMeta(raw);\n\n if (meta) {\n return {\n sourceDefId: i,\n meta: meta\n };\n }\n }\n\n return null;\n}\n\nfunction reduceCurrentDate(currentDate, action) {\n switch (action.type) {\n case 'CHANGE_DATE':\n return action.dateMarker;\n\n default:\n return currentDate;\n }\n}\n\nfunction getInitialDate(options, dateEnv) {\n var initialDateInput = options.initialDate; // compute the initial ambig-timezone date\n\n if (initialDateInput != null) {\n return dateEnv.createMarker(initialDateInput);\n }\n\n return getNow(options.now, dateEnv); // getNow already returns unzoned\n}\n\nfunction getNow(nowInput, dateEnv) {\n if (typeof nowInput === 'function') {\n nowInput = nowInput();\n }\n\n if (nowInput == null) {\n return dateEnv.createNowMarker();\n }\n\n return dateEnv.createMarker(nowInput);\n}\n\nvar CalendarApi =\n/** @class */\nfunction () {\n function CalendarApi() {}\n\n CalendarApi.prototype.getCurrentData = function () {\n return this.currentDataManager.getCurrentData();\n };\n\n CalendarApi.prototype.dispatch = function (action) {\n return this.currentDataManager.dispatch(action);\n };\n\n Object.defineProperty(CalendarApi.prototype, \"view\", {\n get: function get() {\n return this.getCurrentData().viewApi;\n } // for public API\n ,\n enumerable: false,\n configurable: true\n });\n\n CalendarApi.prototype.batchRendering = function (callback) {\n callback();\n };\n\n CalendarApi.prototype.updateSize = function () {\n this.trigger('_resize', true);\n }; // Options\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.setOption = function (name, val) {\n this.dispatch({\n type: 'SET_OPTION',\n optionName: name,\n rawOptionValue: val\n });\n };\n\n CalendarApi.prototype.getOption = function (name) {\n return this.currentDataManager.currentCalendarOptionsInput[name];\n };\n\n CalendarApi.prototype.getAvailableLocaleCodes = function () {\n return Object.keys(this.getCurrentData().availableRawLocales);\n }; // Trigger\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.on = function (handlerName, handler) {\n var currentDataManager = this.currentDataManager;\n\n if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) {\n currentDataManager.emitter.on(handlerName, handler);\n } else {\n console.warn(\"Unknown listener name '\" + handlerName + \"'\");\n }\n };\n\n CalendarApi.prototype.off = function (handlerName, handler) {\n this.currentDataManager.emitter.off(handlerName, handler);\n }; // not meant for public use\n\n\n CalendarApi.prototype.trigger = function (handlerName) {\n var _a;\n\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n (_a = this.currentDataManager.emitter).trigger.apply(_a, __spreadArray([handlerName], args));\n }; // View\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.changeView = function (viewType, dateOrRange) {\n var _this = this;\n\n this.batchRendering(function () {\n _this.unselect();\n\n if (dateOrRange) {\n if (dateOrRange.start && dateOrRange.end) {\n // a range\n _this.dispatch({\n type: 'CHANGE_VIEW_TYPE',\n viewType: viewType\n });\n\n _this.dispatch({\n type: 'SET_OPTION',\n optionName: 'visibleRange',\n rawOptionValue: dateOrRange\n });\n } else {\n var dateEnv = _this.getCurrentData().dateEnv;\n\n _this.dispatch({\n type: 'CHANGE_VIEW_TYPE',\n viewType: viewType,\n dateMarker: dateEnv.createMarker(dateOrRange)\n });\n }\n } else {\n _this.dispatch({\n type: 'CHANGE_VIEW_TYPE',\n viewType: viewType\n });\n }\n });\n }; // Forces navigation to a view for the given date.\n // `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\n // needs to change\n\n\n CalendarApi.prototype.zoomTo = function (dateMarker, viewType) {\n var state = this.getCurrentData();\n var spec;\n viewType = viewType || 'day'; // day is default zoom\n\n spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType);\n this.unselect();\n\n if (spec) {\n this.dispatch({\n type: 'CHANGE_VIEW_TYPE',\n viewType: spec.type,\n dateMarker: dateMarker\n });\n } else {\n this.dispatch({\n type: 'CHANGE_DATE',\n dateMarker: dateMarker\n });\n }\n }; // Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\n // Preference is given to views that have corresponding buttons.\n\n\n CalendarApi.prototype.getUnitViewSpec = function (unit) {\n var _a = this.getCurrentData(),\n viewSpecs = _a.viewSpecs,\n toolbarConfig = _a.toolbarConfig;\n\n var viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []);\n var i;\n var spec;\n\n for (var viewType in viewSpecs) {\n viewTypes.push(viewType);\n }\n\n for (i = 0; i < viewTypes.length; i += 1) {\n spec = viewSpecs[viewTypes[i]];\n\n if (spec) {\n if (spec.singleUnit === unit) {\n return spec;\n }\n }\n }\n\n return null;\n }; // Current Date\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.prev = function () {\n this.unselect();\n this.dispatch({\n type: 'PREV'\n });\n };\n\n CalendarApi.prototype.next = function () {\n this.unselect();\n this.dispatch({\n type: 'NEXT'\n });\n };\n\n CalendarApi.prototype.prevYear = function () {\n var state = this.getCurrentData();\n this.unselect();\n this.dispatch({\n type: 'CHANGE_DATE',\n dateMarker: state.dateEnv.addYears(state.currentDate, -1)\n });\n };\n\n CalendarApi.prototype.nextYear = function () {\n var state = this.getCurrentData();\n this.unselect();\n this.dispatch({\n type: 'CHANGE_DATE',\n dateMarker: state.dateEnv.addYears(state.currentDate, 1)\n });\n };\n\n CalendarApi.prototype.today = function () {\n var state = this.getCurrentData();\n this.unselect();\n this.dispatch({\n type: 'CHANGE_DATE',\n dateMarker: getNow(state.calendarOptions.now, state.dateEnv)\n });\n };\n\n CalendarApi.prototype.gotoDate = function (zonedDateInput) {\n var state = this.getCurrentData();\n this.unselect();\n this.dispatch({\n type: 'CHANGE_DATE',\n dateMarker: state.dateEnv.createMarker(zonedDateInput)\n });\n };\n\n CalendarApi.prototype.incrementDate = function (deltaInput) {\n var state = this.getCurrentData();\n var delta = createDuration(deltaInput);\n\n if (delta) {\n // else, warn about invalid input?\n this.unselect();\n this.dispatch({\n type: 'CHANGE_DATE',\n dateMarker: state.dateEnv.add(state.currentDate, delta)\n });\n }\n }; // for external API\n\n\n CalendarApi.prototype.getDate = function () {\n var state = this.getCurrentData();\n return state.dateEnv.toDate(state.currentDate);\n }; // Date Formatting Utils\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.formatDate = function (d, formatter) {\n var dateEnv = this.getCurrentData().dateEnv;\n return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));\n }; // `settings` is for formatter AND isEndExclusive\n\n\n CalendarApi.prototype.formatRange = function (d0, d1, settings) {\n var dateEnv = this.getCurrentData().dateEnv;\n return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings);\n };\n\n CalendarApi.prototype.formatIso = function (d, omitTime) {\n var dateEnv = this.getCurrentData().dateEnv;\n return dateEnv.formatIso(dateEnv.createMarker(d), {\n omitTime: omitTime\n });\n }; // Date Selection / Event Selection / DayClick\n // -----------------------------------------------------------------------------------------------------------------\n // this public method receives start/end dates in any format, with any timezone\n // NOTE: args were changed from v3\n\n\n CalendarApi.prototype.select = function (dateOrObj, endDate) {\n var selectionInput;\n\n if (endDate == null) {\n if (dateOrObj.start != null) {\n selectionInput = dateOrObj;\n } else {\n selectionInput = {\n start: dateOrObj,\n end: null\n };\n }\n } else {\n selectionInput = {\n start: dateOrObj,\n end: endDate\n };\n }\n\n var state = this.getCurrentData();\n var selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({\n days: 1\n }));\n\n if (selection) {\n // throw parse error otherwise?\n this.dispatch({\n type: 'SELECT_DATES',\n selection: selection\n });\n triggerDateSelect(selection, null, state);\n }\n }; // public method\n\n\n CalendarApi.prototype.unselect = function (pev) {\n var state = this.getCurrentData();\n\n if (state.dateSelection) {\n this.dispatch({\n type: 'UNSELECT_DATES'\n });\n triggerDateUnselect(pev, state);\n }\n }; // Public Events API\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.addEvent = function (eventInput, sourceInput) {\n if (eventInput instanceof EventApi) {\n var def = eventInput._def;\n var instance = eventInput._instance;\n var currentData = this.getCurrentData(); // not already present? don't want to add an old snapshot\n\n if (!currentData.eventStore.defs[def.defId]) {\n this.dispatch({\n type: 'ADD_EVENTS',\n eventStore: eventTupleToStore({\n def: def,\n instance: instance\n }) // TODO: better util for two args?\n\n });\n this.triggerEventAdd(eventInput);\n }\n\n return eventInput;\n }\n\n var state = this.getCurrentData();\n var eventSource;\n\n if (sourceInput instanceof EventSourceApi) {\n eventSource = sourceInput.internalEventSource;\n } else if (typeof sourceInput === 'boolean') {\n if (sourceInput) {\n // true. part of the first event source\n eventSource = hashValuesToArray(state.eventSources)[0];\n }\n } else if (sourceInput != null) {\n // an ID. accepts a number too\n var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function\n\n if (!sourceApi) {\n console.warn(\"Could not find an event source with ID \\\"\" + sourceInput + \"\\\"\"); // TODO: test\n\n return null;\n }\n\n eventSource = sourceApi.internalEventSource;\n }\n\n var tuple = parseEvent(eventInput, eventSource, state, false);\n\n if (tuple) {\n var newEventApi = new EventApi(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance);\n this.dispatch({\n type: 'ADD_EVENTS',\n eventStore: eventTupleToStore(tuple)\n });\n this.triggerEventAdd(newEventApi);\n return newEventApi;\n }\n\n return null;\n };\n\n CalendarApi.prototype.triggerEventAdd = function (eventApi) {\n var _this = this;\n\n var emitter = this.getCurrentData().emitter;\n emitter.trigger('eventAdd', {\n event: eventApi,\n relatedEvents: [],\n revert: function revert() {\n _this.dispatch({\n type: 'REMOVE_EVENTS',\n eventStore: eventApiToStore(eventApi)\n });\n }\n });\n }; // TODO: optimize\n\n\n CalendarApi.prototype.getEventById = function (id) {\n var state = this.getCurrentData();\n var _a = state.eventStore,\n defs = _a.defs,\n instances = _a.instances;\n id = String(id);\n\n for (var defId in defs) {\n var def = defs[defId];\n\n if (def.publicId === id) {\n if (def.recurringDef) {\n return new EventApi(state, def, null);\n }\n\n for (var instanceId in instances) {\n var instance = instances[instanceId];\n\n if (instance.defId === def.defId) {\n return new EventApi(state, def, instance);\n }\n }\n }\n }\n\n return null;\n };\n\n CalendarApi.prototype.getEvents = function () {\n var currentData = this.getCurrentData();\n return buildEventApis(currentData.eventStore, currentData);\n };\n\n CalendarApi.prototype.removeAllEvents = function () {\n this.dispatch({\n type: 'REMOVE_ALL_EVENTS'\n });\n }; // Public Event Sources API\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.getEventSources = function () {\n var state = this.getCurrentData();\n var sourceHash = state.eventSources;\n var sourceApis = [];\n\n for (var internalId in sourceHash) {\n sourceApis.push(new EventSourceApi(state, sourceHash[internalId]));\n }\n\n return sourceApis;\n };\n\n CalendarApi.prototype.getEventSourceById = function (id) {\n var state = this.getCurrentData();\n var sourceHash = state.eventSources;\n id = String(id);\n\n for (var sourceId in sourceHash) {\n if (sourceHash[sourceId].publicId === id) {\n return new EventSourceApi(state, sourceHash[sourceId]);\n }\n }\n\n return null;\n };\n\n CalendarApi.prototype.addEventSource = function (sourceInput) {\n var state = this.getCurrentData();\n\n if (sourceInput instanceof EventSourceApi) {\n // not already present? don't want to add an old snapshot\n if (!state.eventSources[sourceInput.internalEventSource.sourceId]) {\n this.dispatch({\n type: 'ADD_EVENT_SOURCES',\n sources: [sourceInput.internalEventSource]\n });\n }\n\n return sourceInput;\n }\n\n var eventSource = parseEventSource(sourceInput, state);\n\n if (eventSource) {\n // TODO: error otherwise?\n this.dispatch({\n type: 'ADD_EVENT_SOURCES',\n sources: [eventSource]\n });\n return new EventSourceApi(state, eventSource);\n }\n\n return null;\n };\n\n CalendarApi.prototype.removeAllEventSources = function () {\n this.dispatch({\n type: 'REMOVE_ALL_EVENT_SOURCES'\n });\n };\n\n CalendarApi.prototype.refetchEvents = function () {\n this.dispatch({\n type: 'FETCH_EVENT_SOURCES',\n isRefetch: true\n });\n }; // Scroll\n // -----------------------------------------------------------------------------------------------------------------\n\n\n CalendarApi.prototype.scrollToTime = function (timeInput) {\n var time = createDuration(timeInput);\n\n if (time) {\n this.trigger('_scrollRequest', {\n time: time\n });\n }\n };\n\n return CalendarApi;\n}();\n\nvar EventApi =\n/** @class */\nfunction () {\n // instance will be null if expressing a recurring event that has no current instances,\n // OR if trying to validate an incoming external event that has no dates assigned\n function EventApi(context, def, instance) {\n this._context = context;\n this._def = def;\n this._instance = instance || null;\n }\n /*\n TODO: make event struct more responsible for this\n */\n\n\n EventApi.prototype.setProp = function (name, val) {\n var _a, _b;\n\n if (name in EVENT_DATE_REFINERS) {\n console.warn('Could not set date-related prop \\'name\\'. Use one of the date-related methods instead.'); // TODO: make proper aliasing system?\n } else if (name === 'id') {\n val = EVENT_NON_DATE_REFINERS[name](val);\n this.mutate({\n standardProps: {\n publicId: val\n } // hardcoded internal name\n\n });\n } else if (name in EVENT_NON_DATE_REFINERS) {\n val = EVENT_NON_DATE_REFINERS[name](val);\n this.mutate({\n standardProps: (_a = {}, _a[name] = val, _a)\n });\n } else if (name in EVENT_UI_REFINERS) {\n var ui = EVENT_UI_REFINERS[name](val);\n\n if (name === 'color') {\n ui = {\n backgroundColor: val,\n borderColor: val\n };\n } else if (name === 'editable') {\n ui = {\n startEditable: val,\n durationEditable: val\n };\n } else {\n ui = (_b = {}, _b[name] = val, _b);\n }\n\n this.mutate({\n standardProps: {\n ui: ui\n }\n });\n } else {\n console.warn(\"Could not set prop '\" + name + \"'. Use setExtendedProp instead.\");\n }\n };\n\n EventApi.prototype.setExtendedProp = function (name, val) {\n var _a;\n\n this.mutate({\n extendedProps: (_a = {}, _a[name] = val, _a)\n });\n };\n\n EventApi.prototype.setStart = function (startInput, options) {\n if (options === void 0) {\n options = {};\n }\n\n var dateEnv = this._context.dateEnv;\n var start = dateEnv.createMarker(startInput);\n\n if (start && this._instance) {\n // TODO: warning if parsed bad\n var instanceRange = this._instance.range;\n var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?\n\n if (options.maintainDuration) {\n this.mutate({\n datesDelta: startDelta\n });\n } else {\n this.mutate({\n startDelta: startDelta\n });\n }\n }\n };\n\n EventApi.prototype.setEnd = function (endInput, options) {\n if (options === void 0) {\n options = {};\n }\n\n var dateEnv = this._context.dateEnv;\n var end;\n\n if (endInput != null) {\n end = dateEnv.createMarker(endInput);\n\n if (!end) {\n return; // TODO: warning if parsed bad\n }\n }\n\n if (this._instance) {\n if (end) {\n var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);\n this.mutate({\n endDelta: endDelta\n });\n } else {\n this.mutate({\n standardProps: {\n hasEnd: false\n }\n });\n }\n }\n };\n\n EventApi.prototype.setDates = function (startInput, endInput, options) {\n if (options === void 0) {\n options = {};\n }\n\n var dateEnv = this._context.dateEnv;\n var standardProps = {\n allDay: options.allDay\n };\n var start = dateEnv.createMarker(startInput);\n var end;\n\n if (!start) {\n return; // TODO: warning if parsed bad\n }\n\n if (endInput != null) {\n end = dateEnv.createMarker(endInput);\n\n if (!end) {\n // TODO: warning if parsed bad\n return;\n }\n }\n\n if (this._instance) {\n var instanceRange = this._instance.range; // when computing the diff for an event being converted to all-day,\n // compute diff off of the all-day values the way event-mutation does.\n\n if (options.allDay === true) {\n instanceRange = computeAlignedDayRange(instanceRange);\n }\n\n var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);\n\n if (end) {\n var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);\n\n if (durationsEqual(startDelta, endDelta)) {\n this.mutate({\n datesDelta: startDelta,\n standardProps: standardProps\n });\n } else {\n this.mutate({\n startDelta: startDelta,\n endDelta: endDelta,\n standardProps: standardProps\n });\n }\n } else {\n // means \"clear the end\"\n standardProps.hasEnd = false;\n this.mutate({\n datesDelta: startDelta,\n standardProps: standardProps\n });\n }\n }\n };\n\n EventApi.prototype.moveStart = function (deltaInput) {\n var delta = createDuration(deltaInput);\n\n if (delta) {\n // TODO: warning if parsed bad\n this.mutate({\n startDelta: delta\n });\n }\n };\n\n EventApi.prototype.moveEnd = function (deltaInput) {\n var delta = createDuration(deltaInput);\n\n if (delta) {\n // TODO: warning if parsed bad\n this.mutate({\n endDelta: delta\n });\n }\n };\n\n EventApi.prototype.moveDates = function (deltaInput) {\n var delta = createDuration(deltaInput);\n\n if (delta) {\n // TODO: warning if parsed bad\n this.mutate({\n datesDelta: delta\n });\n }\n };\n\n EventApi.prototype.setAllDay = function (allDay, options) {\n if (options === void 0) {\n options = {};\n }\n\n var standardProps = {\n allDay: allDay\n };\n var maintainDuration = options.maintainDuration;\n\n if (maintainDuration == null) {\n maintainDuration = this._context.options.allDayMaintainDuration;\n }\n\n if (this._def.allDay !== allDay) {\n standardProps.hasEnd = maintainDuration;\n }\n\n this.mutate({\n standardProps: standardProps\n });\n };\n\n EventApi.prototype.formatRange = function (formatInput) {\n var dateEnv = this._context.dateEnv;\n var instance = this._instance;\n var formatter = createFormatter(formatInput);\n\n if (this._def.hasEnd) {\n return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {\n forcedStartTzo: instance.forcedStartTzo,\n forcedEndTzo: instance.forcedEndTzo\n });\n }\n\n return dateEnv.format(instance.range.start, formatter, {\n forcedTzo: instance.forcedStartTzo\n });\n };\n\n EventApi.prototype.mutate = function (mutation) {\n var instance = this._instance;\n\n if (instance) {\n var def = this._def;\n var context_1 = this._context;\n var eventStore_1 = context_1.getCurrentData().eventStore;\n var relevantEvents = getRelevantEvents(eventStore_1, instance.instanceId);\n var eventConfigBase = {\n '': {\n display: '',\n startEditable: true,\n durationEditable: true,\n constraints: [],\n overlap: null,\n allows: [],\n backgroundColor: '',\n borderColor: '',\n textColor: '',\n classNames: []\n }\n };\n relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context_1);\n var oldEvent = new EventApi(context_1, def, instance); // snapshot\n\n this._def = relevantEvents.defs[def.defId];\n this._instance = relevantEvents.instances[instance.instanceId];\n context_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: relevantEvents\n });\n context_1.emitter.trigger('eventChange', {\n oldEvent: oldEvent,\n event: this,\n relatedEvents: buildEventApis(relevantEvents, context_1, instance),\n revert: function revert() {\n context_1.dispatch({\n type: 'RESET_EVENTS',\n eventStore: eventStore_1\n });\n }\n });\n }\n };\n\n EventApi.prototype.remove = function () {\n var context = this._context;\n var asStore = eventApiToStore(this);\n context.dispatch({\n type: 'REMOVE_EVENTS',\n eventStore: asStore\n });\n context.emitter.trigger('eventRemove', {\n event: this,\n relatedEvents: [],\n revert: function revert() {\n context.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: asStore\n });\n }\n });\n };\n\n Object.defineProperty(EventApi.prototype, \"source\", {\n get: function get() {\n var sourceId = this._def.sourceId;\n\n if (sourceId) {\n return new EventSourceApi(this._context, this._context.getCurrentData().eventSources[sourceId]);\n }\n\n return null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"start\", {\n get: function get() {\n return this._instance ? this._context.dateEnv.toDate(this._instance.range.start) : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"end\", {\n get: function get() {\n return this._instance && this._def.hasEnd ? this._context.dateEnv.toDate(this._instance.range.end) : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"startStr\", {\n get: function get() {\n var instance = this._instance;\n\n if (instance) {\n return this._context.dateEnv.formatIso(instance.range.start, {\n omitTime: this._def.allDay,\n forcedTzo: instance.forcedStartTzo\n });\n }\n\n return '';\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"endStr\", {\n get: function get() {\n var instance = this._instance;\n\n if (instance && this._def.hasEnd) {\n return this._context.dateEnv.formatIso(instance.range.end, {\n omitTime: this._def.allDay,\n forcedTzo: instance.forcedEndTzo\n });\n }\n\n return '';\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"id\", {\n // computable props that all access the def\n // TODO: find a TypeScript-compatible way to do this at scale\n get: function get() {\n return this._def.publicId;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"groupId\", {\n get: function get() {\n return this._def.groupId;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"allDay\", {\n get: function get() {\n return this._def.allDay;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"title\", {\n get: function get() {\n return this._def.title;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"url\", {\n get: function get() {\n return this._def.url;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"display\", {\n get: function get() {\n return this._def.ui.display || 'auto';\n } // bad. just normalize the type earlier\n ,\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"startEditable\", {\n get: function get() {\n return this._def.ui.startEditable;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"durationEditable\", {\n get: function get() {\n return this._def.ui.durationEditable;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"constraint\", {\n get: function get() {\n return this._def.ui.constraints[0] || null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"overlap\", {\n get: function get() {\n return this._def.ui.overlap;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"allow\", {\n get: function get() {\n return this._def.ui.allows[0] || null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"backgroundColor\", {\n get: function get() {\n return this._def.ui.backgroundColor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"borderColor\", {\n get: function get() {\n return this._def.ui.borderColor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"textColor\", {\n get: function get() {\n return this._def.ui.textColor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"classNames\", {\n // NOTE: user can't modify these because Object.freeze was called in event-def parsing\n get: function get() {\n return this._def.ui.classNames;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"extendedProps\", {\n get: function get() {\n return this._def.extendedProps;\n },\n enumerable: false,\n configurable: true\n });\n\n EventApi.prototype.toPlainObject = function (settings) {\n if (settings === void 0) {\n settings = {};\n }\n\n var def = this._def;\n var ui = def.ui;\n\n var _a = this,\n startStr = _a.startStr,\n endStr = _a.endStr;\n\n var res = {};\n\n if (def.title) {\n res.title = def.title;\n }\n\n if (startStr) {\n res.start = startStr;\n }\n\n if (endStr) {\n res.end = endStr;\n }\n\n if (def.publicId) {\n res.id = def.publicId;\n }\n\n if (def.groupId) {\n res.groupId = def.groupId;\n }\n\n if (def.url) {\n res.url = def.url;\n }\n\n if (ui.display && ui.display !== 'auto') {\n res.display = ui.display;\n } // TODO: what about recurring-event properties???\n // TODO: include startEditable/durationEditable/constraint/overlap/allow\n\n\n if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) {\n res.color = ui.backgroundColor;\n } else {\n if (ui.backgroundColor) {\n res.backgroundColor = ui.backgroundColor;\n }\n\n if (ui.borderColor) {\n res.borderColor = ui.borderColor;\n }\n }\n\n if (ui.textColor) {\n res.textColor = ui.textColor;\n }\n\n if (ui.classNames.length) {\n res.classNames = ui.classNames;\n }\n\n if (Object.keys(def.extendedProps).length) {\n if (settings.collapseExtendedProps) {\n __assign(res, def.extendedProps);\n } else {\n res.extendedProps = def.extendedProps;\n }\n }\n\n return res;\n };\n\n EventApi.prototype.toJSON = function () {\n return this.toPlainObject();\n };\n\n return EventApi;\n}();\n\nfunction eventApiToStore(eventApi) {\n var _a, _b;\n\n var def = eventApi._def;\n var instance = eventApi._instance;\n return {\n defs: (_a = {}, _a[def.defId] = def, _a),\n instances: instance ? (_b = {}, _b[instance.instanceId] = instance, _b) : {}\n };\n}\n\nfunction buildEventApis(eventStore, context, excludeInstance) {\n var defs = eventStore.defs,\n instances = eventStore.instances;\n var eventApis = [];\n var excludeInstanceId = excludeInstance ? excludeInstance.instanceId : '';\n\n for (var id in instances) {\n var instance = instances[id];\n var def = defs[instance.defId];\n\n if (instance.instanceId !== excludeInstanceId) {\n eventApis.push(new EventApi(context, def, instance));\n }\n }\n\n return eventApis;\n}\n\nvar calendarSystemClassMap = {};\n\nfunction registerCalendarSystem(name, theClass) {\n calendarSystemClassMap[name] = theClass;\n}\n\nfunction createCalendarSystem(name) {\n return new calendarSystemClassMap[name]();\n}\n\nvar GregorianCalendarSystem =\n/** @class */\nfunction () {\n function GregorianCalendarSystem() {}\n\n GregorianCalendarSystem.prototype.getMarkerYear = function (d) {\n return d.getUTCFullYear();\n };\n\n GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {\n return d.getUTCMonth();\n };\n\n GregorianCalendarSystem.prototype.getMarkerDay = function (d) {\n return d.getUTCDate();\n };\n\n GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {\n return arrayToUtcDate(arr);\n };\n\n GregorianCalendarSystem.prototype.markerToArray = function (marker) {\n return dateToUtcArray(marker);\n };\n\n return GregorianCalendarSystem;\n}();\n\nregisterCalendarSystem('gregory', GregorianCalendarSystem);\nvar ISO_RE = /^\\s*(\\d{4})(-?(\\d{2})(-?(\\d{2})([T ](\\d{2}):?(\\d{2})(:?(\\d{2})(\\.(\\d+))?)?(Z|(([-+])(\\d{2})(:?(\\d{2}))?))?)?)?)?$/;\n\nfunction parse(str) {\n var m = ISO_RE.exec(str);\n\n if (m) {\n var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number(\"0.\" + m[12]) * 1000 : 0));\n\n if (isValidDate(marker)) {\n var timeZoneOffset = null;\n\n if (m[13]) {\n timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + Number(m[18] || 0));\n }\n\n return {\n marker: marker,\n isTimeUnspecified: !m[6],\n timeZoneOffset: timeZoneOffset\n };\n }\n }\n\n return null;\n}\n\nvar DateEnv =\n/** @class */\nfunction () {\n function DateEnv(settings) {\n var timeZone = this.timeZone = settings.timeZone;\n var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';\n\n if (settings.namedTimeZoneImpl && isNamedTimeZone) {\n this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);\n }\n\n this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);\n this.calendarSystem = createCalendarSystem(settings.calendarSystem);\n this.locale = settings.locale;\n this.weekDow = settings.locale.week.dow;\n this.weekDoy = settings.locale.week.doy;\n\n if (settings.weekNumberCalculation === 'ISO') {\n this.weekDow = 1;\n this.weekDoy = 4;\n }\n\n if (typeof settings.firstDay === 'number') {\n this.weekDow = settings.firstDay;\n }\n\n if (typeof settings.weekNumberCalculation === 'function') {\n this.weekNumberFunc = settings.weekNumberCalculation;\n }\n\n this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText;\n this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText;\n this.cmdFormatter = settings.cmdFormatter;\n this.defaultSeparator = settings.defaultSeparator;\n } // Creating / Parsing\n\n\n DateEnv.prototype.createMarker = function (input) {\n var meta = this.createMarkerMeta(input);\n\n if (meta === null) {\n return null;\n }\n\n return meta.marker;\n };\n\n DateEnv.prototype.createNowMarker = function () {\n if (this.canComputeOffset) {\n return this.timestampToMarker(new Date().valueOf());\n } // if we can't compute the current date val for a timezone,\n // better to give the current local date vals than UTC\n\n\n return arrayToUtcDate(dateToLocalArray(new Date()));\n };\n\n DateEnv.prototype.createMarkerMeta = function (input) {\n if (typeof input === 'string') {\n return this.parse(input);\n }\n\n var marker = null;\n\n if (typeof input === 'number') {\n marker = this.timestampToMarker(input);\n } else if (input instanceof Date) {\n input = input.valueOf();\n\n if (!isNaN(input)) {\n marker = this.timestampToMarker(input);\n }\n } else if (Array.isArray(input)) {\n marker = arrayToUtcDate(input);\n }\n\n if (marker === null || !isValidDate(marker)) {\n return null;\n }\n\n return {\n marker: marker,\n isTimeUnspecified: false,\n forcedTzo: null\n };\n };\n\n DateEnv.prototype.parse = function (s) {\n var parts = parse(s);\n\n if (parts === null) {\n return null;\n }\n\n var marker = parts.marker;\n var forcedTzo = null;\n\n if (parts.timeZoneOffset !== null) {\n if (this.canComputeOffset) {\n marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);\n } else {\n forcedTzo = parts.timeZoneOffset;\n }\n }\n\n return {\n marker: marker,\n isTimeUnspecified: parts.isTimeUnspecified,\n forcedTzo: forcedTzo\n };\n }; // Accessors\n\n\n DateEnv.prototype.getYear = function (marker) {\n return this.calendarSystem.getMarkerYear(marker);\n };\n\n DateEnv.prototype.getMonth = function (marker) {\n return this.calendarSystem.getMarkerMonth(marker);\n }; // Adding / Subtracting\n\n\n DateEnv.prototype.add = function (marker, dur) {\n var a = this.calendarSystem.markerToArray(marker);\n a[0] += dur.years;\n a[1] += dur.months;\n a[2] += dur.days;\n a[6] += dur.milliseconds;\n return this.calendarSystem.arrayToMarker(a);\n };\n\n DateEnv.prototype.subtract = function (marker, dur) {\n var a = this.calendarSystem.markerToArray(marker);\n a[0] -= dur.years;\n a[1] -= dur.months;\n a[2] -= dur.days;\n a[6] -= dur.milliseconds;\n return this.calendarSystem.arrayToMarker(a);\n };\n\n DateEnv.prototype.addYears = function (marker, n) {\n var a = this.calendarSystem.markerToArray(marker);\n a[0] += n;\n return this.calendarSystem.arrayToMarker(a);\n };\n\n DateEnv.prototype.addMonths = function (marker, n) {\n var a = this.calendarSystem.markerToArray(marker);\n a[1] += n;\n return this.calendarSystem.arrayToMarker(a);\n }; // Diffing Whole Units\n\n\n DateEnv.prototype.diffWholeYears = function (m0, m1) {\n var calendarSystem = this.calendarSystem;\n\n if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {\n return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);\n }\n\n return null;\n };\n\n DateEnv.prototype.diffWholeMonths = function (m0, m1) {\n var calendarSystem = this.calendarSystem;\n\n if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {\n return calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0) + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;\n }\n\n return null;\n }; // Range / Duration\n\n\n DateEnv.prototype.greatestWholeUnit = function (m0, m1) {\n var n = this.diffWholeYears(m0, m1);\n\n if (n !== null) {\n return {\n unit: 'year',\n value: n\n };\n }\n\n n = this.diffWholeMonths(m0, m1);\n\n if (n !== null) {\n return {\n unit: 'month',\n value: n\n };\n }\n\n n = diffWholeWeeks(m0, m1);\n\n if (n !== null) {\n return {\n unit: 'week',\n value: n\n };\n }\n\n n = diffWholeDays(m0, m1);\n\n if (n !== null) {\n return {\n unit: 'day',\n value: n\n };\n }\n\n n = diffHours(m0, m1);\n\n if (isInt(n)) {\n return {\n unit: 'hour',\n value: n\n };\n }\n\n n = diffMinutes(m0, m1);\n\n if (isInt(n)) {\n return {\n unit: 'minute',\n value: n\n };\n }\n\n n = diffSeconds(m0, m1);\n\n if (isInt(n)) {\n return {\n unit: 'second',\n value: n\n };\n }\n\n return {\n unit: 'millisecond',\n value: m1.valueOf() - m0.valueOf()\n };\n };\n\n DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {\n // TODO: can use greatestWholeUnit\n var diff;\n\n if (d.years) {\n diff = this.diffWholeYears(m0, m1);\n\n if (diff !== null) {\n return diff / asRoughYears(d);\n }\n }\n\n if (d.months) {\n diff = this.diffWholeMonths(m0, m1);\n\n if (diff !== null) {\n return diff / asRoughMonths(d);\n }\n }\n\n if (d.days) {\n diff = diffWholeDays(m0, m1);\n\n if (diff !== null) {\n return diff / asRoughDays(d);\n }\n }\n\n return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);\n }; // Start-Of\n // these DON'T return zoned-dates. only UTC start-of dates\n\n\n DateEnv.prototype.startOf = function (m, unit) {\n if (unit === 'year') {\n return this.startOfYear(m);\n }\n\n if (unit === 'month') {\n return this.startOfMonth(m);\n }\n\n if (unit === 'week') {\n return this.startOfWeek(m);\n }\n\n if (unit === 'day') {\n return startOfDay(m);\n }\n\n if (unit === 'hour') {\n return startOfHour(m);\n }\n\n if (unit === 'minute') {\n return startOfMinute(m);\n }\n\n if (unit === 'second') {\n return startOfSecond(m);\n }\n\n return null;\n };\n\n DateEnv.prototype.startOfYear = function (m) {\n return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m)]);\n };\n\n DateEnv.prototype.startOfMonth = function (m) {\n return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m), this.calendarSystem.getMarkerMonth(m)]);\n };\n\n DateEnv.prototype.startOfWeek = function (m) {\n return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m), this.calendarSystem.getMarkerMonth(m), m.getUTCDate() - (m.getUTCDay() - this.weekDow + 7) % 7]);\n }; // Week Number\n\n\n DateEnv.prototype.computeWeekNumber = function (marker) {\n if (this.weekNumberFunc) {\n return this.weekNumberFunc(this.toDate(marker));\n }\n\n return weekOfYear(marker, this.weekDow, this.weekDoy);\n }; // TODO: choke on timeZoneName: long\n\n\n DateEnv.prototype.format = function (marker, formatter, dateOptions) {\n if (dateOptions === void 0) {\n dateOptions = {};\n }\n\n return formatter.format({\n marker: marker,\n timeZoneOffset: dateOptions.forcedTzo != null ? dateOptions.forcedTzo : this.offsetForMarker(marker)\n }, this);\n };\n\n DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {\n if (dateOptions === void 0) {\n dateOptions = {};\n }\n\n if (dateOptions.isEndExclusive) {\n end = addMs(end, -1);\n }\n\n return formatter.formatRange({\n marker: start,\n timeZoneOffset: dateOptions.forcedStartTzo != null ? dateOptions.forcedStartTzo : this.offsetForMarker(start)\n }, {\n marker: end,\n timeZoneOffset: dateOptions.forcedEndTzo != null ? dateOptions.forcedEndTzo : this.offsetForMarker(end)\n }, this, dateOptions.defaultSeparator);\n };\n /*\n DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that,\n might as well use buildIsoString or some other util directly\n */\n\n\n DateEnv.prototype.formatIso = function (marker, extraOptions) {\n if (extraOptions === void 0) {\n extraOptions = {};\n }\n\n var timeZoneOffset = null;\n\n if (!extraOptions.omitTimeZoneOffset) {\n if (extraOptions.forcedTzo != null) {\n timeZoneOffset = extraOptions.forcedTzo;\n } else {\n timeZoneOffset = this.offsetForMarker(marker);\n }\n }\n\n return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);\n }; // TimeZone\n\n\n DateEnv.prototype.timestampToMarker = function (ms) {\n if (this.timeZone === 'local') {\n return arrayToUtcDate(dateToLocalArray(new Date(ms)));\n }\n\n if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {\n return new Date(ms);\n }\n\n return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));\n };\n\n DateEnv.prototype.offsetForMarker = function (m) {\n if (this.timeZone === 'local') {\n return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert \"inverse\" offset to \"normal\" offset\n }\n\n if (this.timeZone === 'UTC') {\n return 0;\n }\n\n if (this.namedTimeZoneImpl) {\n return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));\n }\n\n return null;\n }; // Conversion\n\n\n DateEnv.prototype.toDate = function (m, forcedTzo) {\n if (this.timeZone === 'local') {\n return arrayToLocalDate(dateToUtcArray(m));\n }\n\n if (this.timeZone === 'UTC') {\n return new Date(m.valueOf()); // make sure it's a copy\n }\n\n if (!this.namedTimeZoneImpl) {\n return new Date(m.valueOf() - (forcedTzo || 0));\n }\n\n return new Date(m.valueOf() - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60);\n };\n\n return DateEnv;\n}();\n\nvar globalLocales = [];\nvar MINIMAL_RAW_EN_LOCALE = {\n code: 'en',\n week: {\n dow: 0,\n doy: 4 // 4 days need to be within the year to be considered the first week\n\n },\n direction: 'ltr',\n buttonText: {\n prev: 'prev',\n next: 'next',\n prevYear: 'prev year',\n nextYear: 'next year',\n year: 'year',\n today: 'today',\n month: 'month',\n week: 'week',\n day: 'day',\n list: 'list'\n },\n weekText: 'W',\n weekTextLong: 'Week',\n closeHint: 'Close',\n timeHint: 'Time',\n eventHint: 'Event',\n allDayText: 'all-day',\n moreLinkText: 'more',\n noEventsText: 'No events to display'\n};\n\nvar RAW_EN_LOCALE = __assign(__assign({}, MINIMAL_RAW_EN_LOCALE), {\n // Includes things we don't want other locales to inherit,\n // things that derive from other translatable strings.\n buttonHints: {\n prev: 'Previous $0',\n next: 'Next $0',\n today: function today(buttonText, unit) {\n return unit === 'day' ? 'Today' : \"This \" + buttonText;\n }\n },\n viewHint: '$0 view',\n navLinkHint: 'Go to $0',\n moreLinkHint: function moreLinkHint(eventCnt) {\n return \"Show \" + eventCnt + \" more event\" + (eventCnt === 1 ? '' : 's');\n }\n});\n\nfunction organizeRawLocales(explicitRawLocales) {\n var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';\n var allRawLocales = globalLocales.concat(explicitRawLocales);\n var rawLocaleMap = {\n en: RAW_EN_LOCALE\n };\n\n for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {\n var rawLocale = allRawLocales_1[_i];\n rawLocaleMap[rawLocale.code] = rawLocale;\n }\n\n return {\n map: rawLocaleMap,\n defaultCode: defaultCode\n };\n}\n\nfunction buildLocale(inputSingular, available) {\n if (_typeof(inputSingular) === 'object' && !Array.isArray(inputSingular)) {\n return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);\n }\n\n return queryLocale(inputSingular, available);\n}\n\nfunction queryLocale(codeArg, available) {\n var codes = [].concat(codeArg || []); // will convert to array\n\n var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;\n return parseLocale(codeArg, codes, raw);\n}\n\nfunction queryRawLocale(codes, available) {\n for (var i = 0; i < codes.length; i += 1) {\n var parts = codes[i].toLocaleLowerCase().split('-');\n\n for (var j = parts.length; j > 0; j -= 1) {\n var simpleId = parts.slice(0, j).join('-');\n\n if (available[simpleId]) {\n return available[simpleId];\n }\n }\n }\n\n return null;\n}\n\nfunction parseLocale(codeArg, codes, raw) {\n var merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']);\n delete merged.code; // don't want this part of the options\n\n var week = merged.week;\n delete merged.week;\n return {\n codeArg: codeArg,\n codes: codes,\n week: week,\n simpleNumberFormat: new Intl.NumberFormat(codeArg),\n options: merged\n };\n}\n\nfunction formatDate(dateInput, options) {\n if (options === void 0) {\n options = {};\n }\n\n var dateEnv = buildDateEnv$1(options);\n var formatter = createFormatter(options);\n var dateMeta = dateEnv.createMarkerMeta(dateInput);\n\n if (!dateMeta) {\n // TODO: warning?\n return '';\n }\n\n return dateEnv.format(dateMeta.marker, formatter, {\n forcedTzo: dateMeta.forcedTzo\n });\n}\n\nfunction formatRange(startInput, endInput, options) {\n var dateEnv = buildDateEnv$1(_typeof(options) === 'object' && options ? options : {}); // pass in if non-null object\n\n var formatter = createFormatter(options);\n var startMeta = dateEnv.createMarkerMeta(startInput);\n var endMeta = dateEnv.createMarkerMeta(endInput);\n\n if (!startMeta || !endMeta) {\n // TODO: warning?\n return '';\n }\n\n return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {\n forcedStartTzo: startMeta.forcedTzo,\n forcedEndTzo: endMeta.forcedTzo,\n isEndExclusive: options.isEndExclusive,\n defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator\n });\n} // TODO: more DRY and optimized\n\n\nfunction buildDateEnv$1(settings) {\n var locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere\n\n return new DateEnv(__assign(__assign({\n timeZone: BASE_OPTION_DEFAULTS.timeZone,\n calendarSystem: 'gregory'\n }, settings), {\n locale: locale\n }));\n}\n\nvar DEF_DEFAULTS = {\n startTime: '09:00',\n endTime: '17:00',\n daysOfWeek: [1, 2, 3, 4, 5],\n display: 'inverse-background',\n classNames: 'fc-non-business',\n groupId: '_businessHours' // so multiple defs get grouped\n\n};\n/*\nTODO: pass around as EventDefHash!!!\n*/\n\nfunction parseBusinessHours(input, context) {\n return parseEvents(refineInputs(input), null, context);\n}\n\nfunction refineInputs(input) {\n var rawDefs;\n\n if (input === true) {\n rawDefs = [{}]; // will get DEF_DEFAULTS verbatim\n } else if (Array.isArray(input)) {\n // if specifying an array, every sub-definition NEEDS a day-of-week\n rawDefs = input.filter(function (rawDef) {\n return rawDef.daysOfWeek;\n });\n } else if (_typeof(input) === 'object' && input) {\n // non-null object\n rawDefs = [input];\n } else {\n // is probably false\n rawDefs = [];\n }\n\n rawDefs = rawDefs.map(function (rawDef) {\n return __assign(__assign({}, DEF_DEFAULTS), rawDef);\n });\n return rawDefs;\n}\n\nfunction pointInsideRect(point, rect) {\n return point.left >= rect.left && point.left < rect.right && point.top >= rect.top && point.top < rect.bottom;\n} // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\n\n\nfunction intersectRects(rect1, rect2) {\n var res = {\n left: Math.max(rect1.left, rect2.left),\n right: Math.min(rect1.right, rect2.right),\n top: Math.max(rect1.top, rect2.top),\n bottom: Math.min(rect1.bottom, rect2.bottom)\n };\n\n if (res.left < res.right && res.top < res.bottom) {\n return res;\n }\n\n return false;\n}\n\nfunction translateRect(rect, deltaX, deltaY) {\n return {\n left: rect.left + deltaX,\n right: rect.right + deltaX,\n top: rect.top + deltaY,\n bottom: rect.bottom + deltaY\n };\n} // Returns a new point that will have been moved to reside within the given rectangle\n\n\nfunction constrainPoint(point, rect) {\n return {\n left: Math.min(Math.max(point.left, rect.left), rect.right),\n top: Math.min(Math.max(point.top, rect.top), rect.bottom)\n };\n} // Returns a point that is the center of the given rectangle\n\n\nfunction getRectCenter(rect) {\n return {\n left: (rect.left + rect.right) / 2,\n top: (rect.top + rect.bottom) / 2\n };\n} // Subtracts point2's coordinates from point1's coordinates, returning a delta\n\n\nfunction diffPoints(point1, point2) {\n return {\n left: point1.left - point2.left,\n top: point1.top - point2.top\n };\n}\n\nvar canVGrowWithinCell;\n\nfunction getCanVGrowWithinCell() {\n if (canVGrowWithinCell == null) {\n canVGrowWithinCell = computeCanVGrowWithinCell();\n }\n\n return canVGrowWithinCell;\n}\n\nfunction computeCanVGrowWithinCell() {\n // for SSR, because this function is call immediately at top-level\n // TODO: just make this logic execute top-level, immediately, instead of doing lazily\n if (typeof document === 'undefined') {\n return true;\n }\n\n var el = document.createElement('div');\n el.style.position = 'absolute';\n el.style.top = '0px';\n el.style.left = '0px';\n el.innerHTML = '/ | elements with colspans.\n SOLUTION: making individual | \n\n _this.frameElRefs = new RefMap(); // the fc-daygrid-day-frame\n\n _this.fgElRefs = new RefMap(); // the fc-daygrid-day-events\n\n _this.segHarnessRefs = new RefMap(); // indexed by \"instanceId:firstCol\"\n\n _this.rootElRef = createRef();\n _this.state = {\n framePositions: null,\n maxContentHeight: null,\n eventInstanceHeights: {}\n };\n return _this;\n }\n\n TableRow.prototype.render = function () {\n var _this = this;\n\n var _a = this,\n props = _a.props,\n state = _a.state,\n context = _a.context;\n\n var options = context.options;\n var colCnt = props.cells.length;\n var businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt);\n var bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt);\n var highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt);\n var mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt);\n\n var _b = computeFgSegPlacement(sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells),\n singleColPlacements = _b.singleColPlacements,\n multiColPlacements = _b.multiColPlacements,\n moreCnts = _b.moreCnts,\n moreMarginTops = _b.moreMarginTops;\n\n var isForcedInvisible = // TODO: messy way to compute this\n props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {};\n return createElement(\"tr\", {\n ref: this.rootElRef,\n role: \"row\"\n }, props.renderIntro && props.renderIntro(), props.cells.map(function (cell, col) {\n var normalFgNodes = _this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible);\n\n var mirrorFgNodes = _this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false);\n\n return createElement(TableCell, {\n key: cell.key,\n elRef: _this.cellElRefs.createRef(cell.key),\n innerElRef: _this.frameElRefs.createRef(cell.key)\n /* FF | problem, but okay to use for left/right. TODO: rename prop */\n ,\n dateProfile: props.dateProfile,\n date: cell.date,\n showDayNumber: props.showDayNumbers,\n showWeekNumber: props.showWeekNumbers && col === 0,\n forceDayTop: props.showWeekNumbers\n /* even displaying weeknum for row, not necessarily day */\n ,\n todayRange: props.todayRange,\n eventSelection: props.eventSelection,\n eventDrag: props.eventDrag,\n eventResize: props.eventResize,\n extraHookProps: cell.extraHookProps,\n extraDataAttrs: cell.extraDataAttrs,\n extraClassNames: cell.extraClassNames,\n extraDateSpan: cell.extraDateSpan,\n moreCnt: moreCnts[col],\n moreMarginTop: moreMarginTops[col],\n singlePlacements: singleColPlacements[col],\n fgContentElRef: _this.fgElRefs.createRef(cell.key),\n fgContent: // Fragment scopes the keys\n createElement(Fragment, null, createElement(Fragment, null, normalFgNodes), createElement(Fragment, null, mirrorFgNodes)),\n bgContent: // Fragment scopes the keys\n createElement(Fragment, null, _this.renderFillSegs(highlightSegsByCol[col], 'highlight'), _this.renderFillSegs(businessHoursByCol[col], 'non-business'), _this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))\n });\n }));\n };\n\n TableRow.prototype.componentDidMount = function () {\n this.updateSizing(true);\n };\n\n TableRow.prototype.componentDidUpdate = function (prevProps, prevState) {\n var currentProps = this.props;\n this.updateSizing(!isPropsEqual(prevProps, currentProps));\n };\n\n TableRow.prototype.getHighlightSegs = function () {\n var props = this.props;\n\n if (props.eventDrag && props.eventDrag.segs.length) {\n // messy check\n return props.eventDrag.segs;\n }\n\n if (props.eventResize && props.eventResize.segs.length) {\n // messy check\n return props.eventResize.segs;\n }\n\n return props.dateSelectionSegs;\n };\n\n TableRow.prototype.getMirrorSegs = function () {\n var props = this.props;\n\n if (props.eventResize && props.eventResize.segs.length) {\n // messy check\n return props.eventResize.segs;\n }\n\n return [];\n };\n\n TableRow.prototype.renderFgSegs = function (col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) {\n var context = this.context;\n var eventSelection = this.props.eventSelection;\n var framePositions = this.state.framePositions;\n var defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1\n\n var isMirror = isDragging || isResizing || isDateSelecting;\n var nodes = [];\n\n if (framePositions) {\n for (var _i = 0, segPlacements_1 = segPlacements; _i < segPlacements_1.length; _i++) {\n var placement = segPlacements_1[_i];\n var seg = placement.seg;\n var instanceId = seg.eventRange.instance.instanceId;\n var key = instanceId + ':' + col;\n var isVisible = placement.isVisible && !isForcedInvisible[instanceId];\n var isAbsolute = placement.isAbsolute;\n var left = '';\n var right = '';\n\n if (isAbsolute) {\n if (context.isRtl) {\n right = 0;\n left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol];\n } else {\n left = 0;\n right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol];\n }\n }\n /*\n known bug: events that are force to be list-item but span multiple days still take up space in later columns\n todo: in print view, for multi-day events, don't display title within non-start/end segs\n */\n\n\n nodes.push(createElement(\"div\", {\n className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''),\n key: key,\n ref: isMirror ? null : this.segHarnessRefs.createRef(key),\n style: {\n visibility: isVisible ? '' : 'hidden',\n marginTop: isAbsolute ? '' : placement.marginTop,\n top: isAbsolute ? placement.absoluteTop : '',\n left: left,\n right: right\n }\n }, hasListItemDisplay(seg) ? createElement(TableListItemEvent, __assign({\n seg: seg,\n isDragging: isDragging,\n isSelected: instanceId === eventSelection,\n defaultDisplayEventEnd: defaultDisplayEventEnd\n }, getSegMeta(seg, todayRange))) : createElement(TableBlockEvent, __assign({\n seg: seg,\n isDragging: isDragging,\n isResizing: isResizing,\n isDateSelecting: isDateSelecting,\n isSelected: instanceId === eventSelection,\n defaultDisplayEventEnd: defaultDisplayEventEnd\n }, getSegMeta(seg, todayRange)))));\n }\n }\n\n return nodes;\n };\n\n TableRow.prototype.renderFillSegs = function (segs, fillType) {\n var isRtl = this.context.isRtl;\n var todayRange = this.props.todayRange;\n var framePositions = this.state.framePositions;\n var nodes = [];\n\n if (framePositions) {\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n var leftRightCss = isRtl ? {\n right: 0,\n left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]\n } : {\n left: 0,\n right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]\n };\n nodes.push(createElement(\"div\", {\n key: buildEventRangeKey(seg.eventRange),\n className: \"fc-daygrid-bg-harness\",\n style: leftRightCss\n }, fillType === 'bg-event' ? createElement(BgEvent, __assign({\n seg: seg\n }, getSegMeta(seg, todayRange))) : renderFill(fillType)));\n }\n }\n\n return createElement.apply(void 0, __spreadArray([Fragment, {}], nodes));\n };\n\n TableRow.prototype.updateSizing = function (isExternalSizingChange) {\n var _a = this,\n props = _a.props,\n frameElRefs = _a.frameElRefs;\n\n if (!props.forPrint && props.clientWidth !== null // positioning ready?\n ) {\n if (isExternalSizingChange) {\n var frameEls = props.cells.map(function (cell) {\n return frameElRefs.currentMap[cell.key];\n });\n\n if (frameEls.length) {\n var originEl = this.rootElRef.current;\n this.setState({\n framePositions: new PositionCache(originEl, frameEls, true, // isHorizontal\n false)\n });\n }\n }\n\n var oldInstanceHeights = this.state.eventInstanceHeights;\n var newInstanceHeights = this.queryEventInstanceHeights();\n var limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true;\n this.safeSetState({\n // HACK to prevent oscillations of events being shown/hidden from max-event-rows\n // Essentially, once you compute an element's height, never null-out.\n // TODO: always display all events, as visibility:hidden?\n eventInstanceHeights: __assign(__assign({}, oldInstanceHeights), newInstanceHeights),\n maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null\n });\n }\n };\n\n TableRow.prototype.queryEventInstanceHeights = function () {\n var segElMap = this.segHarnessRefs.currentMap;\n var eventInstanceHeights = {}; // get the max height amongst instance segs\n\n for (var key in segElMap) {\n var height = Math.round(segElMap[key].getBoundingClientRect().height);\n var instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key\n\n eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height);\n }\n\n return eventInstanceHeights;\n };\n\n TableRow.prototype.computeMaxContentHeight = function () {\n var firstKey = this.props.cells[0].key;\n var cellEl = this.cellElRefs.currentMap[firstKey];\n var fcContainerEl = this.fgElRefs.currentMap[firstKey];\n return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top;\n };\n\n TableRow.prototype.getCellEls = function () {\n var elMap = this.cellElRefs.currentMap;\n return this.props.cells.map(function (cell) {\n return elMap[cell.key];\n });\n };\n\n return TableRow;\n}(DateComponent);\n\nTableRow.addStateEquality({\n eventInstanceHeights: isPropsEqual\n});\n\nfunction buildMirrorPlacements(mirrorSegs, colPlacements) {\n if (!mirrorSegs.length) {\n return [];\n }\n\n var topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render?\n\n return mirrorSegs.map(function (seg) {\n return {\n seg: seg,\n isVisible: true,\n isAbsolute: true,\n absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId],\n marginTop: 0\n };\n });\n}\n\nfunction buildAbsoluteTopHash(colPlacements) {\n var topsByInstanceId = {};\n\n for (var _i = 0, colPlacements_1 = colPlacements; _i < colPlacements_1.length; _i++) {\n var placements = colPlacements_1[_i];\n\n for (var _a = 0, placements_1 = placements; _a < placements_1.length; _a++) {\n var placement = placements_1[_a];\n topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop;\n }\n }\n\n return topsByInstanceId;\n}\n\nvar Table =\n/** @class */\nfunction (_super) {\n __extends(Table, _super);\n\n function Table() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.splitBusinessHourSegs = memoize(splitSegsByRow);\n _this.splitBgEventSegs = memoize(splitSegsByRow);\n _this.splitFgEventSegs = memoize(splitSegsByRow);\n _this.splitDateSelectionSegs = memoize(splitSegsByRow);\n _this.splitEventDrag = memoize(splitInteractionByRow);\n _this.splitEventResize = memoize(splitInteractionByRow);\n _this.rowRefs = new RefMap();\n\n _this.handleRootEl = function (rootEl) {\n _this.rootEl = rootEl;\n\n if (rootEl) {\n _this.context.registerInteractiveComponent(_this, {\n el: rootEl,\n isHitComboAllowed: _this.props.isHitComboAllowed\n });\n } else {\n _this.context.unregisterInteractiveComponent(_this);\n }\n };\n\n return _this;\n }\n\n Table.prototype.render = function () {\n var _this = this;\n\n var props = this.props;\n var dateProfile = props.dateProfile,\n dayMaxEventRows = props.dayMaxEventRows,\n dayMaxEvents = props.dayMaxEvents,\n expandRows = props.expandRows;\n var rowCnt = props.cells.length;\n var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt);\n var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt);\n var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt);\n var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt);\n var eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt);\n var eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt);\n var limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; // if rows can't expand to fill fixed height, can't do balanced-height event limit\n // TODO: best place to normalize these options?\n\n if (limitViaBalanced && !expandRows) {\n limitViaBalanced = false;\n dayMaxEventRows = null;\n dayMaxEvents = null;\n }\n\n var classNames = ['fc-daygrid-body', limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', expandRows ? '' : 'fc-daygrid-body-natural' // will height of one row depend on the others?\n ];\n return createElement(\"div\", {\n className: classNames.join(' '),\n ref: this.handleRootEl,\n style: {\n // these props are important to give this wrapper correct dimensions for interactions\n // TODO: if we set it here, can we avoid giving to inner tables?\n width: props.clientWidth,\n minWidth: props.tableMinWidth\n }\n }, createElement(NowTimer, {\n unit: \"day\"\n }, function (nowDate, todayRange) {\n return createElement(Fragment, null, createElement(\"table\", {\n role: \"presentation\",\n className: \"fc-scrollgrid-sync-table\",\n style: {\n width: props.clientWidth,\n minWidth: props.tableMinWidth,\n height: expandRows ? props.clientHeight : ''\n }\n }, props.colGroupNode, createElement(\"tbody\", {\n role: \"presentation\"\n }, props.cells.map(function (cells, row) {\n return createElement(TableRow, {\n ref: _this.rowRefs.createRef(row),\n key: cells.length ? cells[0].date.toISOString()\n /* best? or put key on cell? or use diff formatter? */\n : row // in case there are no cells (like when resource view is loading)\n ,\n showDayNumbers: rowCnt > 1,\n showWeekNumbers: props.showWeekNumbers,\n todayRange: todayRange,\n dateProfile: dateProfile,\n cells: cells,\n renderIntro: props.renderRowIntro,\n businessHourSegs: businessHourSegsByRow[row],\n eventSelection: props.eventSelection,\n bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay)\n /* hack */\n ,\n fgEventSegs: fgEventSegsByRow[row],\n dateSelectionSegs: dateSelectionSegsByRow[row],\n eventDrag: eventDragByRow[row],\n eventResize: eventResizeByRow[row],\n dayMaxEvents: dayMaxEvents,\n dayMaxEventRows: dayMaxEventRows,\n clientWidth: props.clientWidth,\n clientHeight: props.clientHeight,\n forPrint: props.forPrint\n });\n }))));\n }));\n }; // Hit System\n // ----------------------------------------------------------------------------------------------------\n\n\n Table.prototype.prepareHits = function () {\n this.rowPositions = new PositionCache(this.rootEl, this.rowRefs.collect().map(function (rowObj) {\n return rowObj.getCellEls()[0];\n }), // first cell el in each row. TODO: not optimal\n false, true);\n this.colPositions = new PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row\n true, // horizontal\n false);\n };\n\n Table.prototype.queryHit = function (positionLeft, positionTop) {\n var _a = this,\n colPositions = _a.colPositions,\n rowPositions = _a.rowPositions;\n\n var col = colPositions.leftToIndex(positionLeft);\n var row = rowPositions.topToIndex(positionTop);\n\n if (row != null && col != null) {\n var cell = this.props.cells[row][col];\n return {\n dateProfile: this.props.dateProfile,\n dateSpan: __assign({\n range: this.getCellRange(row, col),\n allDay: true\n }, cell.extraDateSpan),\n dayEl: this.getCellEl(row, col),\n rect: {\n left: colPositions.lefts[col],\n right: colPositions.rights[col],\n top: rowPositions.tops[row],\n bottom: rowPositions.bottoms[row]\n },\n layer: 0\n };\n }\n\n return null;\n };\n\n Table.prototype.getCellEl = function (row, col) {\n return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal\n };\n\n Table.prototype.getCellRange = function (row, col) {\n var start = this.props.cells[row][col].date;\n var end = addDays(start, 1);\n return {\n start: start,\n end: end\n };\n };\n\n return Table;\n}(DateComponent);\n\nfunction isSegAllDay(seg) {\n return seg.eventRange.def.allDay;\n}\n\nvar DayTableSlicer =\n/** @class */\nfunction (_super) {\n __extends(DayTableSlicer, _super);\n\n function DayTableSlicer() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.forceDayIfListItem = true;\n return _this;\n }\n\n DayTableSlicer.prototype.sliceRange = function (dateRange, dayTableModel) {\n return dayTableModel.sliceRange(dateRange);\n };\n\n return DayTableSlicer;\n}(Slicer);\n\nvar DayTable =\n/** @class */\nfunction (_super) {\n __extends(DayTable, _super);\n\n function DayTable() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.slicer = new DayTableSlicer();\n _this.tableRef = createRef();\n return _this;\n }\n\n DayTable.prototype.render = function () {\n var _a = this,\n props = _a.props,\n context = _a.context;\n\n return createElement(Table, __assign({\n ref: this.tableRef\n }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), {\n dateProfile: props.dateProfile,\n cells: props.dayTableModel.cells,\n colGroupNode: props.colGroupNode,\n tableMinWidth: props.tableMinWidth,\n renderRowIntro: props.renderRowIntro,\n dayMaxEvents: props.dayMaxEvents,\n dayMaxEventRows: props.dayMaxEventRows,\n showWeekNumbers: props.showWeekNumbers,\n expandRows: props.expandRows,\n headerAlignElRef: props.headerAlignElRef,\n clientWidth: props.clientWidth,\n clientHeight: props.clientHeight,\n forPrint: props.forPrint\n }));\n };\n\n return DayTable;\n}(DateComponent);\n\nvar DayTableView =\n/** @class */\nfunction (_super) {\n __extends(DayTableView, _super);\n\n function DayTableView() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.buildDayTableModel = memoize(buildDayTableModel);\n _this.headerRef = createRef();\n _this.tableRef = createRef();\n return _this;\n }\n\n DayTableView.prototype.render = function () {\n var _this = this;\n\n var _a = this.context,\n options = _a.options,\n dateProfileGenerator = _a.dateProfileGenerator;\n var props = this.props;\n var dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator);\n var headerContent = options.dayHeaders && createElement(DayHeader, {\n ref: this.headerRef,\n dateProfile: props.dateProfile,\n dates: dayTableModel.headerDates,\n datesRepDistinctDays: dayTableModel.rowCnt === 1\n });\n\n var bodyContent = function bodyContent(contentArg) {\n return createElement(DayTable, {\n ref: _this.tableRef,\n dateProfile: props.dateProfile,\n dayTableModel: dayTableModel,\n businessHours: props.businessHours,\n dateSelection: props.dateSelection,\n eventStore: props.eventStore,\n eventUiBases: props.eventUiBases,\n eventSelection: props.eventSelection,\n eventDrag: props.eventDrag,\n eventResize: props.eventResize,\n nextDayThreshold: options.nextDayThreshold,\n colGroupNode: contentArg.tableColGroupNode,\n tableMinWidth: contentArg.tableMinWidth,\n dayMaxEvents: options.dayMaxEvents,\n dayMaxEventRows: options.dayMaxEventRows,\n showWeekNumbers: options.weekNumbers,\n expandRows: !props.isHeightAuto,\n headerAlignElRef: _this.headerElRef,\n clientWidth: contentArg.clientWidth,\n clientHeight: contentArg.clientHeight,\n forPrint: props.forPrint\n });\n };\n\n return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent);\n };\n\n return DayTableView;\n}(TableView);\n\nfunction buildDayTableModel(dateProfile, dateProfileGenerator) {\n var daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);\n return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));\n}\n\nvar TableDateProfileGenerator =\n/** @class */\nfunction (_super) {\n __extends(TableDateProfileGenerator, _super);\n\n function TableDateProfileGenerator() {\n return _super !== null && _super.apply(this, arguments) || this;\n } // Computes the date range that will be rendered.\n\n\n TableDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {\n var dateEnv = this.props.dateEnv;\n\n var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);\n\n var start = renderRange.start;\n var end = renderRange.end;\n var endOfWeek; // year and month views should be aligned with weeks. this is already done for week\n\n if (/^(year|month)$/.test(currentRangeUnit)) {\n start = dateEnv.startOfWeek(start); // make end-of-week if not already\n\n endOfWeek = dateEnv.startOfWeek(end);\n\n if (endOfWeek.valueOf() !== end.valueOf()) {\n end = addWeeks(endOfWeek, 1);\n }\n } // ensure 6 weeks\n\n\n if (this.props.monthMode && this.props.fixedWeekCount) {\n var rowCnt = Math.ceil( // could be partial weeks due to hiddenDays\n diffWeeks(start, end));\n end = addWeeks(end, 6 - rowCnt);\n }\n\n return {\n start: start,\n end: end\n };\n };\n\n return TableDateProfileGenerator;\n}(DateProfileGenerator);\n\nvar main = createPlugin({\n initialView: 'dayGridMonth',\n views: {\n dayGrid: {\n component: DayTableView,\n dateProfileGeneratorClass: TableDateProfileGenerator\n },\n dayGridDay: {\n type: 'dayGrid',\n duration: {\n days: 1\n }\n },\n dayGridWeek: {\n type: 'dayGrid',\n duration: {\n weeks: 1\n }\n },\n dayGridMonth: {\n type: 'dayGrid',\n duration: {\n months: 1\n },\n monthMode: true,\n fixedWeekCount: true\n }\n }\n});\nexport default main;\nexport { DayTableView as DayGridView, DayTable, DayTableSlicer, Table, TableView, buildDayTableModel };","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*!\nFullCalendar v5.11.3\nDocs & License: https://fullcalendar.io/\n(c) 2022 Adam Shaw\n*/\nimport { config, elementClosest, Emitter, applyStyle, whenTransitionDone, removeElement, ScrollController, ElementScrollController, computeInnerRect, WindowScrollController, getElRoot, preventSelection, preventContextMenu, allowSelection, allowContextMenu, ElementDragging, computeRect, getClippingParents, pointInsideRect, isDateSpansEqual, constrainPoint, intersectRects, getRectCenter, diffPoints, mapHash, rangeContainsRange, interactionSettingsToStore, Interaction, isDateSelectionValid, enableCursor, disableCursor, triggerDateSelect, compareNumbers, getElSeg, getRelevantEvents, EventApi, createEmptyEventStore, applyMutationToEventStore, isInteractionValid, buildEventApis, interactionSettingsStore, startOfDay, diffDates, createDuration, getEventTargetViaRoot, identity, eventTupleToStore, parseDragMeta, elementMatches, refineEventDef, parseEventDef, getDefaultEventEnd, createEventInstance, BASE_OPTION_DEFAULTS, createPlugin } from '@fullcalendar/common';\nimport { __extends, __assign } from 'tslib';\nconfig.touchMouseIgnoreWait = 500;\nvar ignoreMouseDepth = 0;\nvar listenerCnt = 0;\nvar isWindowTouchMoveCancelled = false;\n/*\nUses a \"pointer\" abstraction, which monitors UI events for both mouse and touch.\nTracks when the pointer \"drags\" on a certain element, meaning down+move+up.\n\nAlso, tracks if there was touch-scrolling.\nAlso, can prevent touch-scrolling from happening.\nAlso, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.\n\nemits:\n- pointerdown\n- pointermove\n- pointerup\n*/\n\nvar PointerDragging =\n/** @class */\nfunction () {\n function PointerDragging(containerEl) {\n var _this = this;\n\n this.subjectEl = null; // options that can be directly assigned by caller\n\n this.selector = ''; // will cause subjectEl in all emitted events to be this element\n\n this.handleSelector = '';\n this.shouldIgnoreMove = false;\n this.shouldWatchScroll = true; // for simulating pointermove on scroll\n // internal states\n\n this.isDragging = false;\n this.isTouchDragging = false;\n this.wasTouchScroll = false; // Mouse\n // ----------------------------------------------------------------------------------------------------\n\n this.handleMouseDown = function (ev) {\n if (!_this.shouldIgnoreMouse() && isPrimaryMouseButton(ev) && _this.tryStart(ev)) {\n var pev = _this.createEventFromMouse(ev, true);\n\n _this.emitter.trigger('pointerdown', pev);\n\n _this.initScrollWatch(pev);\n\n if (!_this.shouldIgnoreMove) {\n document.addEventListener('mousemove', _this.handleMouseMove);\n }\n\n document.addEventListener('mouseup', _this.handleMouseUp);\n }\n };\n\n this.handleMouseMove = function (ev) {\n var pev = _this.createEventFromMouse(ev);\n\n _this.recordCoords(pev);\n\n _this.emitter.trigger('pointermove', pev);\n };\n\n this.handleMouseUp = function (ev) {\n document.removeEventListener('mousemove', _this.handleMouseMove);\n document.removeEventListener('mouseup', _this.handleMouseUp);\n\n _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));\n\n _this.cleanup(); // call last so that pointerup has access to props\n\n }; // Touch\n // ----------------------------------------------------------------------------------------------------\n\n\n this.handleTouchStart = function (ev) {\n if (_this.tryStart(ev)) {\n _this.isTouchDragging = true;\n\n var pev = _this.createEventFromTouch(ev, true);\n\n _this.emitter.trigger('pointerdown', pev);\n\n _this.initScrollWatch(pev); // unlike mouse, need to attach to target, not document\n // https://stackoverflow.com/a/45760014\n\n\n var targetEl = ev.target;\n\n if (!_this.shouldIgnoreMove) {\n targetEl.addEventListener('touchmove', _this.handleTouchMove);\n }\n\n targetEl.addEventListener('touchend', _this.handleTouchEnd);\n targetEl.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end\n // attach a handler to get called when ANY scroll action happens on the page.\n // this was impossible to do with normal on/off because 'scroll' doesn't bubble.\n // http://stackoverflow.com/a/32954565/96342\n\n window.addEventListener('scroll', _this.handleTouchScroll, true);\n }\n };\n\n this.handleTouchMove = function (ev) {\n var pev = _this.createEventFromTouch(ev);\n\n _this.recordCoords(pev);\n\n _this.emitter.trigger('pointermove', pev);\n };\n\n this.handleTouchEnd = function (ev) {\n if (_this.isDragging) {\n // done to guard against touchend followed by touchcancel\n var targetEl = ev.target;\n targetEl.removeEventListener('touchmove', _this.handleTouchMove);\n targetEl.removeEventListener('touchend', _this.handleTouchEnd);\n targetEl.removeEventListener('touchcancel', _this.handleTouchEnd);\n window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true\n\n _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));\n\n _this.cleanup(); // call last so that pointerup has access to props\n\n\n _this.isTouchDragging = false;\n startIgnoringMouse();\n }\n };\n\n this.handleTouchScroll = function () {\n _this.wasTouchScroll = true;\n };\n\n this.handleScroll = function (ev) {\n if (!_this.shouldIgnoreMove) {\n var pageX = window.pageXOffset - _this.prevScrollX + _this.prevPageX;\n var pageY = window.pageYOffset - _this.prevScrollY + _this.prevPageY;\n\n _this.emitter.trigger('pointermove', {\n origEvent: ev,\n isTouch: _this.isTouchDragging,\n subjectEl: _this.subjectEl,\n pageX: pageX,\n pageY: pageY,\n deltaX: pageX - _this.origPageX,\n deltaY: pageY - _this.origPageY\n });\n }\n };\n\n this.containerEl = containerEl;\n this.emitter = new Emitter();\n containerEl.addEventListener('mousedown', this.handleMouseDown);\n containerEl.addEventListener('touchstart', this.handleTouchStart, {\n passive: true\n });\n listenerCreated();\n }\n\n PointerDragging.prototype.destroy = function () {\n this.containerEl.removeEventListener('mousedown', this.handleMouseDown);\n this.containerEl.removeEventListener('touchstart', this.handleTouchStart, {\n passive: true\n });\n listenerDestroyed();\n };\n\n PointerDragging.prototype.tryStart = function (ev) {\n var subjectEl = this.querySubjectEl(ev);\n var downEl = ev.target;\n\n if (subjectEl && (!this.handleSelector || elementClosest(downEl, this.handleSelector))) {\n this.subjectEl = subjectEl;\n this.isDragging = true; // do this first so cancelTouchScroll will work\n\n this.wasTouchScroll = false;\n return true;\n }\n\n return false;\n };\n\n PointerDragging.prototype.cleanup = function () {\n isWindowTouchMoveCancelled = false;\n this.isDragging = false;\n this.subjectEl = null; // keep wasTouchScroll around for later access\n\n this.destroyScrollWatch();\n };\n\n PointerDragging.prototype.querySubjectEl = function (ev) {\n if (this.selector) {\n return elementClosest(ev.target, this.selector);\n }\n\n return this.containerEl;\n };\n\n PointerDragging.prototype.shouldIgnoreMouse = function () {\n return ignoreMouseDepth || this.isTouchDragging;\n }; // can be called by user of this class, to cancel touch-based scrolling for the current drag\n\n\n PointerDragging.prototype.cancelTouchScroll = function () {\n if (this.isDragging) {\n isWindowTouchMoveCancelled = true;\n }\n }; // Scrolling that simulates pointermoves\n // ----------------------------------------------------------------------------------------------------\n\n\n PointerDragging.prototype.initScrollWatch = function (ev) {\n if (this.shouldWatchScroll) {\n this.recordCoords(ev);\n window.addEventListener('scroll', this.handleScroll, true); // useCapture=true\n }\n };\n\n PointerDragging.prototype.recordCoords = function (ev) {\n if (this.shouldWatchScroll) {\n this.prevPageX = ev.pageX;\n this.prevPageY = ev.pageY;\n this.prevScrollX = window.pageXOffset;\n this.prevScrollY = window.pageYOffset;\n }\n };\n\n PointerDragging.prototype.destroyScrollWatch = function () {\n if (this.shouldWatchScroll) {\n window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true\n }\n }; // Event Normalization\n // ----------------------------------------------------------------------------------------------------\n\n\n PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {\n var deltaX = 0;\n var deltaY = 0; // TODO: repeat code\n\n if (isFirst) {\n this.origPageX = ev.pageX;\n this.origPageY = ev.pageY;\n } else {\n deltaX = ev.pageX - this.origPageX;\n deltaY = ev.pageY - this.origPageY;\n }\n\n return {\n origEvent: ev,\n isTouch: false,\n subjectEl: this.subjectEl,\n pageX: ev.pageX,\n pageY: ev.pageY,\n deltaX: deltaX,\n deltaY: deltaY\n };\n };\n\n PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {\n var touches = ev.touches;\n var pageX;\n var pageY;\n var deltaX = 0;\n var deltaY = 0; // if touch coords available, prefer,\n // because FF would give bad ev.pageX ev.pageY\n\n if (touches && touches.length) {\n pageX = touches[0].pageX;\n pageY = touches[0].pageY;\n } else {\n pageX = ev.pageX;\n pageY = ev.pageY;\n } // TODO: repeat code\n\n\n if (isFirst) {\n this.origPageX = pageX;\n this.origPageY = pageY;\n } else {\n deltaX = pageX - this.origPageX;\n deltaY = pageY - this.origPageY;\n }\n\n return {\n origEvent: ev,\n isTouch: true,\n subjectEl: this.subjectEl,\n pageX: pageX,\n pageY: pageY,\n deltaX: deltaX,\n deltaY: deltaY\n };\n };\n\n return PointerDragging;\n}(); // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\n\n\nfunction isPrimaryMouseButton(ev) {\n return ev.button === 0 && !ev.ctrlKey;\n} // Ignoring fake mouse events generated by touch\n// ----------------------------------------------------------------------------------------------------\n\n\nfunction startIgnoringMouse() {\n ignoreMouseDepth += 1;\n setTimeout(function () {\n ignoreMouseDepth -= 1;\n }, config.touchMouseIgnoreWait);\n} // We want to attach touchmove as early as possible for Safari\n// ----------------------------------------------------------------------------------------------------\n\n\nfunction listenerCreated() {\n listenerCnt += 1;\n\n if (listenerCnt === 1) {\n window.addEventListener('touchmove', onWindowTouchMove, {\n passive: false\n });\n }\n}\n\nfunction listenerDestroyed() {\n listenerCnt -= 1;\n\n if (!listenerCnt) {\n window.removeEventListener('touchmove', onWindowTouchMove, {\n passive: false\n });\n }\n}\n\nfunction onWindowTouchMove(ev) {\n if (isWindowTouchMoveCancelled) {\n ev.preventDefault();\n }\n}\n/*\nAn effect in which an element follows the movement of a pointer across the screen.\nThe moving element is a clone of some other element.\nMust call start + handleMove + stop.\n*/\n\n\nvar ElementMirror =\n/** @class */\nfunction () {\n function ElementMirror() {\n this.isVisible = false; // must be explicitly enabled\n\n this.sourceEl = null;\n this.mirrorEl = null;\n this.sourceElRect = null; // screen coords relative to viewport\n // options that can be set directly by caller\n\n this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues\n\n this.zIndex = 9999;\n this.revertDuration = 0;\n }\n\n ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {\n this.sourceEl = sourceEl;\n this.sourceElRect = this.sourceEl.getBoundingClientRect();\n this.origScreenX = pageX - window.pageXOffset;\n this.origScreenY = pageY - window.pageYOffset;\n this.deltaX = 0;\n this.deltaY = 0;\n this.updateElPosition();\n };\n\n ElementMirror.prototype.handleMove = function (pageX, pageY) {\n this.deltaX = pageX - window.pageXOffset - this.origScreenX;\n this.deltaY = pageY - window.pageYOffset - this.origScreenY;\n this.updateElPosition();\n }; // can be called before start\n\n\n ElementMirror.prototype.setIsVisible = function (bool) {\n if (bool) {\n if (!this.isVisible) {\n if (this.mirrorEl) {\n this.mirrorEl.style.display = '';\n }\n\n this.isVisible = bool; // needs to happen before updateElPosition\n\n this.updateElPosition(); // because was not updating the position while invisible\n }\n } else if (this.isVisible) {\n if (this.mirrorEl) {\n this.mirrorEl.style.display = 'none';\n }\n\n this.isVisible = bool;\n }\n }; // always async\n\n\n ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {\n var _this = this;\n\n var done = function done() {\n _this.cleanup();\n\n callback();\n };\n\n if (needsRevertAnimation && this.mirrorEl && this.isVisible && this.revertDuration && ( // if 0, transition won't work\n this.deltaX || this.deltaY) // if same coords, transition won't work\n ) {\n this.doRevertAnimation(done, this.revertDuration);\n } else {\n setTimeout(done, 0);\n }\n };\n\n ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {\n var mirrorEl = this.mirrorEl;\n var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened\n\n mirrorEl.style.transition = 'top ' + revertDuration + 'ms,' + 'left ' + revertDuration + 'ms';\n applyStyle(mirrorEl, {\n left: finalSourceElRect.left,\n top: finalSourceElRect.top\n });\n whenTransitionDone(mirrorEl, function () {\n mirrorEl.style.transition = '';\n callback();\n });\n };\n\n ElementMirror.prototype.cleanup = function () {\n if (this.mirrorEl) {\n removeElement(this.mirrorEl);\n this.mirrorEl = null;\n }\n\n this.sourceEl = null;\n };\n\n ElementMirror.prototype.updateElPosition = function () {\n if (this.sourceEl && this.isVisible) {\n applyStyle(this.getMirrorEl(), {\n left: this.sourceElRect.left + this.deltaX,\n top: this.sourceElRect.top + this.deltaY\n });\n }\n };\n\n ElementMirror.prototype.getMirrorEl = function () {\n var sourceElRect = this.sourceElRect;\n var mirrorEl = this.mirrorEl;\n\n if (!mirrorEl) {\n mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true\n // we don't want long taps or any mouse interaction causing selection/menus.\n // would use preventSelection(), but that prevents selectstart, causing problems.\n\n mirrorEl.classList.add('fc-unselectable');\n mirrorEl.classList.add('fc-event-dragging');\n applyStyle(mirrorEl, {\n position: 'fixed',\n zIndex: this.zIndex,\n visibility: '',\n boxSizing: 'border-box',\n width: sourceElRect.right - sourceElRect.left,\n height: sourceElRect.bottom - sourceElRect.top,\n right: 'auto',\n bottom: 'auto',\n margin: 0\n });\n this.parentNode.appendChild(mirrorEl);\n }\n\n return mirrorEl;\n };\n\n return ElementMirror;\n}();\n/*\nIs a cache for a given element's scroll information (all the info that ScrollController stores)\nin addition the \"client rectangle\" of the element.. the area within the scrollbars.\n\nThe cache can be in one of two modes:\n- doesListening:false - ignores when the container is scrolled by someone else\n- doesListening:true - watch for scrolling and update the cache\n*/\n\n\nvar ScrollGeomCache =\n/** @class */\nfunction (_super) {\n __extends(ScrollGeomCache, _super);\n\n function ScrollGeomCache(scrollController, doesListening) {\n var _this = _super.call(this) || this;\n\n _this.handleScroll = function () {\n _this.scrollTop = _this.scrollController.getScrollTop();\n _this.scrollLeft = _this.scrollController.getScrollLeft();\n\n _this.handleScrollChange();\n };\n\n _this.scrollController = scrollController;\n _this.doesListening = doesListening;\n _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();\n _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();\n _this.scrollWidth = scrollController.getScrollWidth();\n _this.scrollHeight = scrollController.getScrollHeight();\n _this.clientWidth = scrollController.getClientWidth();\n _this.clientHeight = scrollController.getClientHeight();\n _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values\n\n if (_this.doesListening) {\n _this.getEventTarget().addEventListener('scroll', _this.handleScroll);\n }\n\n return _this;\n }\n\n ScrollGeomCache.prototype.destroy = function () {\n if (this.doesListening) {\n this.getEventTarget().removeEventListener('scroll', this.handleScroll);\n }\n };\n\n ScrollGeomCache.prototype.getScrollTop = function () {\n return this.scrollTop;\n };\n\n ScrollGeomCache.prototype.getScrollLeft = function () {\n return this.scrollLeft;\n };\n\n ScrollGeomCache.prototype.setScrollTop = function (top) {\n this.scrollController.setScrollTop(top);\n\n if (!this.doesListening) {\n // we are not relying on the element to normalize out-of-bounds scroll values\n // so we need to sanitize ourselves\n this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);\n this.handleScrollChange();\n }\n };\n\n ScrollGeomCache.prototype.setScrollLeft = function (top) {\n this.scrollController.setScrollLeft(top);\n\n if (!this.doesListening) {\n // we are not relying on the element to normalize out-of-bounds scroll values\n // so we need to sanitize ourselves\n this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);\n this.handleScrollChange();\n }\n };\n\n ScrollGeomCache.prototype.getClientWidth = function () {\n return this.clientWidth;\n };\n\n ScrollGeomCache.prototype.getClientHeight = function () {\n return this.clientHeight;\n };\n\n ScrollGeomCache.prototype.getScrollWidth = function () {\n return this.scrollWidth;\n };\n\n ScrollGeomCache.prototype.getScrollHeight = function () {\n return this.scrollHeight;\n };\n\n ScrollGeomCache.prototype.handleScrollChange = function () {};\n\n return ScrollGeomCache;\n}(ScrollController);\n\nvar ElementScrollGeomCache =\n/** @class */\nfunction (_super) {\n __extends(ElementScrollGeomCache, _super);\n\n function ElementScrollGeomCache(el, doesListening) {\n return _super.call(this, new ElementScrollController(el), doesListening) || this;\n }\n\n ElementScrollGeomCache.prototype.getEventTarget = function () {\n return this.scrollController.el;\n };\n\n ElementScrollGeomCache.prototype.computeClientRect = function () {\n return computeInnerRect(this.scrollController.el);\n };\n\n return ElementScrollGeomCache;\n}(ScrollGeomCache);\n\nvar WindowScrollGeomCache =\n/** @class */\nfunction (_super) {\n __extends(WindowScrollGeomCache, _super);\n\n function WindowScrollGeomCache(doesListening) {\n return _super.call(this, new WindowScrollController(), doesListening) || this;\n }\n\n WindowScrollGeomCache.prototype.getEventTarget = function () {\n return window;\n };\n\n WindowScrollGeomCache.prototype.computeClientRect = function () {\n return {\n left: this.scrollLeft,\n right: this.scrollLeft + this.clientWidth,\n top: this.scrollTop,\n bottom: this.scrollTop + this.clientHeight\n };\n }; // the window is the only scroll object that changes it's rectangle relative\n // to the document's topleft as it scrolls\n\n\n WindowScrollGeomCache.prototype.handleScrollChange = function () {\n this.clientRect = this.computeClientRect();\n };\n\n return WindowScrollGeomCache;\n}(ScrollGeomCache); // If available we are using native \"performance\" API instead of \"Date\"\n// Read more about it on MDN:\n// https://developer.mozilla.org/en-US/docs/Web/API/Performance\n\n\nvar getTime = typeof performance === 'function' ? performance.now : Date.now;\n/*\nFor a pointer interaction, automatically scrolls certain scroll containers when the pointer\napproaches the edge.\n\nThe caller must call start + handleMove + stop.\n*/\n\nvar AutoScroller =\n/** @class */\nfunction () {\n function AutoScroller() {\n var _this = this; // options that can be set by caller\n\n\n this.isEnabled = true;\n this.scrollQuery = [window, '.fc-scroller'];\n this.edgeThreshold = 50; // pixels\n\n this.maxVelocity = 300; // pixels per second\n // internal state\n\n this.pointerScreenX = null;\n this.pointerScreenY = null;\n this.isAnimating = false;\n this.scrollCaches = null; // protect against the initial pointerdown being too close to an edge and starting the scroll\n\n this.everMovedUp = false;\n this.everMovedDown = false;\n this.everMovedLeft = false;\n this.everMovedRight = false;\n\n this.animate = function () {\n if (_this.isAnimating) {\n // wasn't cancelled between animation calls\n var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);\n\n if (edge) {\n var now = getTime();\n\n _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);\n\n _this.requestAnimation(now);\n } else {\n _this.isAnimating = false; // will stop animation\n }\n }\n };\n }\n\n AutoScroller.prototype.start = function (pageX, pageY, scrollStartEl) {\n if (this.isEnabled) {\n this.scrollCaches = this.buildCaches(scrollStartEl);\n this.pointerScreenX = null;\n this.pointerScreenY = null;\n this.everMovedUp = false;\n this.everMovedDown = false;\n this.everMovedLeft = false;\n this.everMovedRight = false;\n this.handleMove(pageX, pageY);\n }\n };\n\n AutoScroller.prototype.handleMove = function (pageX, pageY) {\n if (this.isEnabled) {\n var pointerScreenX = pageX - window.pageXOffset;\n var pointerScreenY = pageY - window.pageYOffset;\n var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;\n var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;\n\n if (yDelta < 0) {\n this.everMovedUp = true;\n } else if (yDelta > 0) {\n this.everMovedDown = true;\n }\n\n if (xDelta < 0) {\n this.everMovedLeft = true;\n } else if (xDelta > 0) {\n this.everMovedRight = true;\n }\n\n this.pointerScreenX = pointerScreenX;\n this.pointerScreenY = pointerScreenY;\n\n if (!this.isAnimating) {\n this.isAnimating = true;\n this.requestAnimation(getTime());\n }\n }\n };\n\n AutoScroller.prototype.stop = function () {\n if (this.isEnabled) {\n this.isAnimating = false; // will stop animation\n\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n scrollCache.destroy();\n }\n\n this.scrollCaches = null;\n }\n };\n\n AutoScroller.prototype.requestAnimation = function (now) {\n this.msSinceRequest = now;\n requestAnimationFrame(this.animate);\n };\n\n AutoScroller.prototype.handleSide = function (edge, seconds) {\n var scrollCache = edge.scrollCache;\n var edgeThreshold = this.edgeThreshold;\n var invDistance = edgeThreshold - edge.distance;\n var velocity = // the closer to the edge, the faster we scroll\n invDistance * invDistance / (edgeThreshold * edgeThreshold) * // quadratic\n this.maxVelocity * seconds;\n var sign = 1;\n\n switch (edge.name) {\n case 'left':\n sign = -1;\n // falls through\n\n case 'right':\n scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);\n break;\n\n case 'top':\n sign = -1;\n // falls through\n\n case 'bottom':\n scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);\n break;\n }\n }; // left/top are relative to document topleft\n\n\n AutoScroller.prototype.computeBestEdge = function (left, top) {\n var edgeThreshold = this.edgeThreshold;\n var bestSide = null;\n var scrollCaches = this.scrollCaches || [];\n\n for (var _i = 0, scrollCaches_1 = scrollCaches; _i < scrollCaches_1.length; _i++) {\n var scrollCache = scrollCaches_1[_i];\n var rect = scrollCache.clientRect;\n var leftDist = left - rect.left;\n var rightDist = rect.right - left;\n var topDist = top - rect.top;\n var bottomDist = rect.bottom - top; // completely within the rect?\n\n if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {\n if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && (!bestSide || bestSide.distance > topDist)) {\n bestSide = {\n scrollCache: scrollCache,\n name: 'top',\n distance: topDist\n };\n }\n\n if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && (!bestSide || bestSide.distance > bottomDist)) {\n bestSide = {\n scrollCache: scrollCache,\n name: 'bottom',\n distance: bottomDist\n };\n }\n\n if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && (!bestSide || bestSide.distance > leftDist)) {\n bestSide = {\n scrollCache: scrollCache,\n name: 'left',\n distance: leftDist\n };\n }\n\n if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && (!bestSide || bestSide.distance > rightDist)) {\n bestSide = {\n scrollCache: scrollCache,\n name: 'right',\n distance: rightDist\n };\n }\n }\n }\n\n return bestSide;\n };\n\n AutoScroller.prototype.buildCaches = function (scrollStartEl) {\n return this.queryScrollEls(scrollStartEl).map(function (el) {\n if (el === window) {\n return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls\n }\n\n return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls\n });\n };\n\n AutoScroller.prototype.queryScrollEls = function (scrollStartEl) {\n var els = [];\n\n for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {\n var query = _a[_i];\n\n if (_typeof(query) === 'object') {\n els.push(query);\n } else {\n els.push.apply(els, Array.prototype.slice.call(getElRoot(scrollStartEl).querySelectorAll(query)));\n }\n }\n\n return els;\n };\n\n return AutoScroller;\n}();\n/*\nMonitors dragging on an element. Has a number of high-level features:\n- minimum distance required before dragging\n- minimum wait time (\"delay\") before dragging\n- a mirror element that follows the pointer\n*/\n\n\nvar FeaturefulElementDragging =\n/** @class */\nfunction (_super) {\n __extends(FeaturefulElementDragging, _super);\n\n function FeaturefulElementDragging(containerEl, selector) {\n var _this = _super.call(this, containerEl) || this;\n\n _this.containerEl = containerEl; // options that can be directly set by caller\n // the caller can also set the PointerDragging's options as well\n\n _this.delay = null;\n _this.minDistance = 0;\n _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag\n\n _this.mirrorNeedsRevert = false;\n _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup\n\n _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation\n\n _this.isDelayEnded = false;\n _this.isDistanceSurpassed = false;\n _this.delayTimeoutId = null;\n\n _this.onPointerDown = function (ev) {\n if (!_this.isDragging) {\n // so new drag doesn't happen while revert animation is going\n _this.isInteracting = true;\n _this.isDelayEnded = false;\n _this.isDistanceSurpassed = false;\n preventSelection(document.body);\n preventContextMenu(document.body); // prevent links from being visited if there's an eventual drag.\n // also prevents selection in older browsers (maybe?).\n // not necessary for touch, besides, browser would complain about passiveness.\n\n if (!ev.isTouch) {\n ev.origEvent.preventDefault();\n }\n\n _this.emitter.trigger('pointerdown', ev);\n\n if (_this.isInteracting && // not destroyed via pointerdown handler\n !_this.pointer.shouldIgnoreMove) {\n // actions related to initiating dragstart+dragmove+dragend...\n _this.mirror.setIsVisible(false); // reset. caller must set-visible\n\n\n _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down\n\n\n _this.startDelay(ev);\n\n if (!_this.minDistance) {\n _this.handleDistanceSurpassed(ev);\n }\n }\n }\n };\n\n _this.onPointerMove = function (ev) {\n if (_this.isInteracting) {\n _this.emitter.trigger('pointermove', ev);\n\n if (!_this.isDistanceSurpassed) {\n var minDistance = _this.minDistance;\n var distanceSq = void 0; // current distance from the origin, squared\n\n var deltaX = ev.deltaX,\n deltaY = ev.deltaY;\n distanceSq = deltaX * deltaX + deltaY * deltaY;\n\n if (distanceSq >= minDistance * minDistance) {\n // use pythagorean theorem\n _this.handleDistanceSurpassed(ev);\n }\n }\n\n if (_this.isDragging) {\n // a real pointer move? (not one simulated by scrolling)\n if (ev.origEvent.type !== 'scroll') {\n _this.mirror.handleMove(ev.pageX, ev.pageY);\n\n _this.autoScroller.handleMove(ev.pageX, ev.pageY);\n }\n\n _this.emitter.trigger('dragmove', ev);\n }\n }\n };\n\n _this.onPointerUp = function (ev) {\n if (_this.isInteracting) {\n _this.isInteracting = false;\n allowSelection(document.body);\n allowContextMenu(document.body);\n\n _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert\n\n\n if (_this.isDragging) {\n _this.autoScroller.stop();\n\n _this.tryStopDrag(ev); // which will stop the mirror\n\n }\n\n if (_this.delayTimeoutId) {\n clearTimeout(_this.delayTimeoutId);\n _this.delayTimeoutId = null;\n }\n }\n };\n\n var pointer = _this.pointer = new PointerDragging(containerEl);\n pointer.emitter.on('pointerdown', _this.onPointerDown);\n pointer.emitter.on('pointermove', _this.onPointerMove);\n pointer.emitter.on('pointerup', _this.onPointerUp);\n\n if (selector) {\n pointer.selector = selector;\n }\n\n _this.mirror = new ElementMirror();\n _this.autoScroller = new AutoScroller();\n return _this;\n }\n\n FeaturefulElementDragging.prototype.destroy = function () {\n this.pointer.destroy(); // HACK: simulate a pointer-up to end the current drag\n // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire)\n\n this.onPointerUp({});\n };\n\n FeaturefulElementDragging.prototype.startDelay = function (ev) {\n var _this = this;\n\n if (typeof this.delay === 'number') {\n this.delayTimeoutId = setTimeout(function () {\n _this.delayTimeoutId = null;\n\n _this.handleDelayEnd(ev);\n }, this.delay); // not assignable to number!\n } else {\n this.handleDelayEnd(ev);\n }\n };\n\n FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {\n this.isDelayEnded = true;\n this.tryStartDrag(ev);\n };\n\n FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {\n this.isDistanceSurpassed = true;\n this.tryStartDrag(ev);\n };\n\n FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {\n if (this.isDelayEnded && this.isDistanceSurpassed) {\n if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {\n this.isDragging = true;\n this.mirrorNeedsRevert = false;\n this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl);\n this.emitter.trigger('dragstart', ev);\n\n if (this.touchScrollAllowed === false) {\n this.pointer.cancelTouchScroll();\n }\n }\n }\n };\n\n FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {\n // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events\n // that come from the document to fire beforehand. much more convenient this way.\n this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev));\n };\n\n FeaturefulElementDragging.prototype.stopDrag = function (ev) {\n this.isDragging = false;\n this.emitter.trigger('dragend', ev);\n }; // fill in the implementations...\n\n\n FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {\n this.pointer.shouldIgnoreMove = bool;\n };\n\n FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {\n this.mirror.setIsVisible(bool);\n };\n\n FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {\n this.mirrorNeedsRevert = bool;\n };\n\n FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {\n this.autoScroller.isEnabled = bool;\n };\n\n return FeaturefulElementDragging;\n}(ElementDragging);\n/*\nWhen this class is instantiated, it records the offset of an element (relative to the document topleft),\nand continues to monitor scrolling, updating the cached coordinates if it needs to.\nDoes not access the DOM after instantiation, so highly performant.\n\nAlso keeps track of all scrolling/overflow:hidden containers that are parents of the given element\nand an determine if a given point is inside the combined clipping rectangle.\n*/\n\n\nvar OffsetTracker =\n/** @class */\nfunction () {\n function OffsetTracker(el) {\n this.origRect = computeRect(el); // will work fine for divs that have overflow:hidden\n\n this.scrollCaches = getClippingParents(el).map(function (scrollEl) {\n return new ElementScrollGeomCache(scrollEl, true);\n });\n }\n\n OffsetTracker.prototype.destroy = function () {\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n scrollCache.destroy();\n }\n };\n\n OffsetTracker.prototype.computeLeft = function () {\n var left = this.origRect.left;\n\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();\n }\n\n return left;\n };\n\n OffsetTracker.prototype.computeTop = function () {\n var top = this.origRect.top;\n\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n top += scrollCache.origScrollTop - scrollCache.getScrollTop();\n }\n\n return top;\n };\n\n OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {\n var point = {\n left: pageX,\n top: pageY\n };\n\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n\n if (!isIgnoredClipping(scrollCache.getEventTarget()) && !pointInsideRect(point, scrollCache.clientRect)) {\n return false;\n }\n }\n\n return true;\n };\n\n return OffsetTracker;\n}(); // certain clipping containers should never constrain interactions, like and \n// https://github.com/fullcalendar/fullcalendar/issues/3615\n\n\nfunction isIgnoredClipping(node) {\n var tagName = node.tagName;\n return tagName === 'HTML' || tagName === 'BODY';\n}\n/*\nTracks movement over multiple droppable areas (aka \"hits\")\nthat exist in one or more DateComponents.\nRelies on an existing draggable.\n\nemits:\n- pointerdown\n- dragstart\n- hitchange - fires initially, even if not over a hit\n- pointerup\n- (hitchange - again, to null, if ended over a hit)\n- dragend\n*/\n\n\nvar HitDragging =\n/** @class */\nfunction () {\n function HitDragging(dragging, droppableStore) {\n var _this = this; // options that can be set by caller\n\n\n this.useSubjectCenter = false;\n this.requireInitial = true; // if doesn't start out on a hit, won't emit any events\n\n this.initialHit = null;\n this.movingHit = null;\n this.finalHit = null; // won't ever be populated if shouldIgnoreMove\n\n this.handlePointerDown = function (ev) {\n var dragging = _this.dragging;\n _this.initialHit = null;\n _this.movingHit = null;\n _this.finalHit = null;\n\n _this.prepareHits();\n\n _this.processFirstCoord(ev);\n\n if (_this.initialHit || !_this.requireInitial) {\n dragging.setIgnoreMove(false); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(\n\n _this.emitter.trigger('pointerdown', ev);\n } else {\n dragging.setIgnoreMove(true);\n }\n };\n\n this.handleDragStart = function (ev) {\n _this.emitter.trigger('dragstart', ev);\n\n _this.handleMove(ev, true); // force = fire even if initially null\n\n };\n\n this.handleDragMove = function (ev) {\n _this.emitter.trigger('dragmove', ev);\n\n _this.handleMove(ev);\n };\n\n this.handlePointerUp = function (ev) {\n _this.releaseHits();\n\n _this.emitter.trigger('pointerup', ev);\n };\n\n this.handleDragEnd = function (ev) {\n if (_this.movingHit) {\n _this.emitter.trigger('hitupdate', null, true, ev);\n }\n\n _this.finalHit = _this.movingHit;\n _this.movingHit = null;\n\n _this.emitter.trigger('dragend', ev);\n };\n\n this.droppableStore = droppableStore;\n dragging.emitter.on('pointerdown', this.handlePointerDown);\n dragging.emitter.on('dragstart', this.handleDragStart);\n dragging.emitter.on('dragmove', this.handleDragMove);\n dragging.emitter.on('pointerup', this.handlePointerUp);\n dragging.emitter.on('dragend', this.handleDragEnd);\n this.dragging = dragging;\n this.emitter = new Emitter();\n } // sets initialHit\n // sets coordAdjust\n\n\n HitDragging.prototype.processFirstCoord = function (ev) {\n var origPoint = {\n left: ev.pageX,\n top: ev.pageY\n };\n var adjustedPoint = origPoint;\n var subjectEl = ev.subjectEl;\n var subjectRect;\n\n if (subjectEl instanceof HTMLElement) {\n // i.e. not a Document/ShadowRoot\n subjectRect = computeRect(subjectEl);\n adjustedPoint = constrainPoint(adjustedPoint, subjectRect);\n }\n\n var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);\n\n if (initialHit) {\n if (this.useSubjectCenter && subjectRect) {\n var slicedSubjectRect = intersectRects(subjectRect, initialHit.rect);\n\n if (slicedSubjectRect) {\n adjustedPoint = getRectCenter(slicedSubjectRect);\n }\n }\n\n this.coordAdjust = diffPoints(adjustedPoint, origPoint);\n } else {\n this.coordAdjust = {\n left: 0,\n top: 0\n };\n }\n };\n\n HitDragging.prototype.handleMove = function (ev, forceHandle) {\n var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);\n\n if (forceHandle || !isHitsEqual(this.movingHit, hit)) {\n this.movingHit = hit;\n this.emitter.trigger('hitupdate', hit, false, ev);\n }\n };\n\n HitDragging.prototype.prepareHits = function () {\n this.offsetTrackers = mapHash(this.droppableStore, function (interactionSettings) {\n interactionSettings.component.prepareHits();\n return new OffsetTracker(interactionSettings.el);\n });\n };\n\n HitDragging.prototype.releaseHits = function () {\n var offsetTrackers = this.offsetTrackers;\n\n for (var id in offsetTrackers) {\n offsetTrackers[id].destroy();\n }\n\n this.offsetTrackers = {};\n };\n\n HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {\n var _a = this,\n droppableStore = _a.droppableStore,\n offsetTrackers = _a.offsetTrackers;\n\n var bestHit = null;\n\n for (var id in droppableStore) {\n var component = droppableStore[id].component;\n var offsetTracker = offsetTrackers[id];\n\n if (offsetTracker && // wasn't destroyed mid-drag\n offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {\n var originLeft = offsetTracker.computeLeft();\n var originTop = offsetTracker.computeTop();\n var positionLeft = offsetLeft - originLeft;\n var positionTop = offsetTop - originTop;\n var origRect = offsetTracker.origRect;\n var width = origRect.right - origRect.left;\n var height = origRect.bottom - origRect.top;\n\n if ( // must be within the element's bounds\n positionLeft >= 0 && positionLeft < width && positionTop >= 0 && positionTop < height) {\n var hit = component.queryHit(positionLeft, positionTop, width, height);\n\n if (hit && // make sure the hit is within activeRange, meaning it's not a dead cell\n rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range) && (!bestHit || hit.layer > bestHit.layer)) {\n hit.componentId = id;\n hit.context = component.context; // TODO: better way to re-orient rectangle\n\n hit.rect.left += originLeft;\n hit.rect.right += originLeft;\n hit.rect.top += originTop;\n hit.rect.bottom += originTop;\n bestHit = hit;\n }\n }\n }\n }\n\n return bestHit;\n };\n\n return HitDragging;\n}();\n\nfunction isHitsEqual(hit0, hit1) {\n if (!hit0 && !hit1) {\n return true;\n }\n\n if (Boolean(hit0) !== Boolean(hit1)) {\n return false;\n }\n\n return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);\n}\n\nfunction buildDatePointApiWithContext(dateSpan, context) {\n var props = {};\n\n for (var _i = 0, _a = context.pluginHooks.datePointTransforms; _i < _a.length; _i++) {\n var transform = _a[_i];\n\n __assign(props, transform(dateSpan, context));\n }\n\n __assign(props, buildDatePointApi(dateSpan, context.dateEnv));\n\n return props;\n}\n\nfunction buildDatePointApi(span, dateEnv) {\n return {\n date: dateEnv.toDate(span.range.start),\n dateStr: dateEnv.formatIso(span.range.start, {\n omitTime: span.allDay\n }),\n allDay: span.allDay\n };\n}\n/*\nMonitors when the user clicks on a specific date/time of a component.\nA pointerdown+pointerup on the same \"hit\" constitutes a click.\n*/\n\n\nvar DateClicking =\n/** @class */\nfunction (_super) {\n __extends(DateClicking, _super);\n\n function DateClicking(settings) {\n var _this = _super.call(this, settings) || this;\n\n _this.handlePointerDown = function (pev) {\n var dragging = _this.dragging;\n var downEl = pev.origEvent.target; // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired\n\n dragging.setIgnoreMove(!_this.component.isValidDateDownEl(downEl));\n }; // won't even fire if moving was ignored\n\n\n _this.handleDragEnd = function (ev) {\n var component = _this.component;\n var pointer = _this.dragging.pointer;\n\n if (!pointer.wasTouchScroll) {\n var _a = _this.hitDragging,\n initialHit = _a.initialHit,\n finalHit = _a.finalHit;\n\n if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {\n var context = component.context;\n\n var arg = __assign(__assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), {\n dayEl: initialHit.dayEl,\n jsEvent: ev.origEvent,\n view: context.viewApi || context.calendarApi.view\n });\n\n context.emitter.trigger('dateClick', arg);\n }\n }\n }; // we DO want to watch pointer moves because otherwise finalHit won't get populated\n\n\n _this.dragging = new FeaturefulElementDragging(settings.el);\n _this.dragging.autoScroller.isEnabled = false;\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragend', _this.handleDragEnd);\n return _this;\n }\n\n DateClicking.prototype.destroy = function () {\n this.dragging.destroy();\n };\n\n return DateClicking;\n}(Interaction);\n/*\nTracks when the user selects a portion of time of a component,\nconstituted by a drag over date cells, with a possible delay at the beginning of the drag.\n*/\n\n\nvar DateSelecting =\n/** @class */\nfunction (_super) {\n __extends(DateSelecting, _super);\n\n function DateSelecting(settings) {\n var _this = _super.call(this, settings) || this;\n\n _this.dragSelection = null;\n\n _this.handlePointerDown = function (ev) {\n var _a = _this,\n component = _a.component,\n dragging = _a.dragging;\n var options = component.context.options;\n var canSelect = options.selectable && component.isValidDateDownEl(ev.origEvent.target); // don't bother to watch expensive moves if component won't do selection\n\n dragging.setIgnoreMove(!canSelect); // if touch, require user to hold down\n\n dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null;\n };\n\n _this.handleDragStart = function (ev) {\n _this.component.context.calendarApi.unselect(ev); // unselect previous selections\n\n };\n\n _this.handleHitUpdate = function (hit, isFinal) {\n var context = _this.component.context;\n var dragSelection = null;\n var isInvalid = false;\n\n if (hit) {\n var initialHit = _this.hitDragging.initialHit;\n var disallowed = hit.componentId === initialHit.componentId && _this.isHitComboAllowed && !_this.isHitComboAllowed(initialHit, hit);\n\n if (!disallowed) {\n dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers);\n }\n\n if (!dragSelection || !isDateSelectionValid(dragSelection, hit.dateProfile, context)) {\n isInvalid = true;\n dragSelection = null;\n }\n }\n\n if (dragSelection) {\n context.dispatch({\n type: 'SELECT_DATES',\n selection: dragSelection\n });\n } else if (!isFinal) {\n // only unselect if moved away while dragging\n context.dispatch({\n type: 'UNSELECT_DATES'\n });\n }\n\n if (!isInvalid) {\n enableCursor();\n } else {\n disableCursor();\n }\n\n if (!isFinal) {\n _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging\n }\n };\n\n _this.handlePointerUp = function (pev) {\n if (_this.dragSelection) {\n // selection is already rendered, so just need to report selection\n triggerDateSelect(_this.dragSelection, pev, _this.component.context);\n _this.dragSelection = null;\n }\n };\n\n var component = settings.component;\n var options = component.context.options;\n var dragging = _this.dragging = new FeaturefulElementDragging(settings.el);\n dragging.touchScrollAllowed = false;\n dragging.minDistance = options.selectMinDistance || 0;\n dragging.autoScroller.isEnabled = options.dragScroll;\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragstart', _this.handleDragStart);\n hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);\n hitDragging.emitter.on('pointerup', _this.handlePointerUp);\n return _this;\n }\n\n DateSelecting.prototype.destroy = function () {\n this.dragging.destroy();\n };\n\n return DateSelecting;\n}(Interaction);\n\nfunction getComponentTouchDelay$1(component) {\n var options = component.context.options;\n var delay = options.selectLongPressDelay;\n\n if (delay == null) {\n delay = options.longPressDelay;\n }\n\n return delay;\n}\n\nfunction joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {\n var dateSpan0 = hit0.dateSpan;\n var dateSpan1 = hit1.dateSpan;\n var ms = [dateSpan0.range.start, dateSpan0.range.end, dateSpan1.range.start, dateSpan1.range.end];\n ms.sort(compareNumbers);\n var props = {};\n\n for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {\n var transformer = dateSelectionTransformers_1[_i];\n var res = transformer(hit0, hit1);\n\n if (res === false) {\n return null;\n }\n\n if (res) {\n __assign(props, res);\n }\n }\n\n props.range = {\n start: ms[0],\n end: ms[3]\n };\n props.allDay = dateSpan0.allDay;\n return props;\n}\n\nvar EventDragging =\n/** @class */\nfunction (_super) {\n __extends(EventDragging, _super);\n\n function EventDragging(settings) {\n var _this = _super.call(this, settings) || this; // internal state\n\n\n _this.subjectEl = null;\n _this.subjectSeg = null; // the seg being selected/dragged\n\n _this.isDragging = false;\n _this.eventRange = null;\n _this.relevantEvents = null; // the events being dragged\n\n _this.receivingContext = null;\n _this.validMutation = null;\n _this.mutatedRelevantEvents = null;\n\n _this.handlePointerDown = function (ev) {\n var origTarget = ev.origEvent.target;\n var _a = _this,\n component = _a.component,\n dragging = _a.dragging;\n var mirror = dragging.mirror;\n var options = component.context.options;\n var initialContext = component.context;\n _this.subjectEl = ev.subjectEl;\n var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl);\n var eventRange = _this.eventRange = subjectSeg.eventRange;\n var eventInstanceId = eventRange.instance.instanceId;\n _this.relevantEvents = getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId);\n dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;\n dragging.delay = // only do a touch delay if touch and this event hasn't been selected yet\n ev.isTouch && eventInstanceId !== component.props.eventSelection ? getComponentTouchDelay(component) : null;\n\n if (options.fixedMirrorParent) {\n mirror.parentNode = options.fixedMirrorParent;\n } else {\n mirror.parentNode = elementClosest(origTarget, '.fc');\n }\n\n mirror.revertDuration = options.dragRevertDuration;\n var isValid = component.isValidSegDownEl(origTarget) && !elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer\n\n dragging.setIgnoreMove(!isValid); // disable dragging for elements that are resizable (ie, selectable)\n // but are not draggable\n\n _this.isDragging = isValid && ev.subjectEl.classList.contains('fc-event-draggable');\n };\n\n _this.handleDragStart = function (ev) {\n var initialContext = _this.component.context;\n var eventRange = _this.eventRange;\n var eventInstanceId = eventRange.instance.instanceId;\n\n if (ev.isTouch) {\n // need to select a different event?\n if (eventInstanceId !== _this.component.props.eventSelection) {\n initialContext.dispatch({\n type: 'SELECT_EVENT',\n eventInstanceId: eventInstanceId\n });\n }\n } else {\n // if now using mouse, but was previous touch interaction, clear selected event\n initialContext.dispatch({\n type: 'UNSELECT_EVENT'\n });\n }\n\n if (_this.isDragging) {\n initialContext.calendarApi.unselect(ev); // unselect *date* selection\n\n initialContext.emitter.trigger('eventDragStart', {\n el: _this.subjectEl,\n event: new EventApi(initialContext, eventRange.def, eventRange.instance),\n jsEvent: ev.origEvent,\n view: initialContext.viewApi\n });\n }\n };\n\n _this.handleHitUpdate = function (hit, isFinal) {\n if (!_this.isDragging) {\n return;\n }\n\n var relevantEvents = _this.relevantEvents;\n var initialHit = _this.hitDragging.initialHit;\n var initialContext = _this.component.context; // states based on new hit\n\n var receivingContext = null;\n var mutation = null;\n var mutatedRelevantEvents = null;\n var isInvalid = false;\n var interaction = {\n affectedEvents: relevantEvents,\n mutatedEvents: createEmptyEventStore(),\n isEvent: true\n };\n\n if (hit) {\n receivingContext = hit.context;\n var receivingOptions = receivingContext.options;\n\n if (initialContext === receivingContext || receivingOptions.editable && receivingOptions.droppable) {\n mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers);\n\n if (mutation) {\n mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext);\n interaction.mutatedEvents = mutatedRelevantEvents;\n\n if (!isInteractionValid(interaction, hit.dateProfile, receivingContext)) {\n isInvalid = true;\n mutation = null;\n mutatedRelevantEvents = null;\n interaction.mutatedEvents = createEmptyEventStore();\n }\n }\n } else {\n receivingContext = null;\n }\n }\n\n _this.displayDrag(receivingContext, interaction);\n\n if (!isInvalid) {\n enableCursor();\n } else {\n disableCursor();\n }\n\n if (!isFinal) {\n if (initialContext === receivingContext && // TODO: write test for this\n isHitsEqual(initialHit, hit)) {\n mutation = null;\n }\n\n _this.dragging.setMirrorNeedsRevert(!mutation); // render the mirror if no already-rendered mirror\n // TODO: wish we could somehow wait for dispatch to guarantee render\n\n\n _this.dragging.setMirrorIsVisible(!hit || !getElRoot(_this.subjectEl).querySelector('.fc-event-mirror')); // assign states based on new hit\n\n\n _this.receivingContext = receivingContext;\n _this.validMutation = mutation;\n _this.mutatedRelevantEvents = mutatedRelevantEvents;\n }\n };\n\n _this.handlePointerUp = function () {\n if (!_this.isDragging) {\n _this.cleanup(); // because handleDragEnd won't fire\n\n }\n };\n\n _this.handleDragEnd = function (ev) {\n if (_this.isDragging) {\n var initialContext_1 = _this.component.context;\n var initialView = initialContext_1.viewApi;\n var _a = _this,\n receivingContext_1 = _a.receivingContext,\n validMutation = _a.validMutation;\n var eventDef = _this.eventRange.def;\n var eventInstance = _this.eventRange.instance;\n var eventApi = new EventApi(initialContext_1, eventDef, eventInstance);\n var relevantEvents_1 = _this.relevantEvents;\n var mutatedRelevantEvents_1 = _this.mutatedRelevantEvents;\n var finalHit = _this.hitDragging.finalHit;\n\n _this.clearDrag(); // must happen after revert animation\n\n\n initialContext_1.emitter.trigger('eventDragStop', {\n el: _this.subjectEl,\n event: eventApi,\n jsEvent: ev.origEvent,\n view: initialView\n });\n\n if (validMutation) {\n // dropped within same calendar\n if (receivingContext_1 === initialContext_1) {\n var updatedEventApi = new EventApi(initialContext_1, mutatedRelevantEvents_1.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents_1.instances[eventInstance.instanceId] : null);\n initialContext_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: mutatedRelevantEvents_1\n });\n var eventChangeArg = {\n oldEvent: eventApi,\n event: updatedEventApi,\n relatedEvents: buildEventApis(mutatedRelevantEvents_1, initialContext_1, eventInstance),\n revert: function revert() {\n initialContext_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: relevantEvents_1 // the pre-change data\n\n });\n }\n };\n var transformed = {};\n\n for (var _i = 0, _b = initialContext_1.getCurrentData().pluginHooks.eventDropTransformers; _i < _b.length; _i++) {\n var transformer = _b[_i];\n\n __assign(transformed, transformer(validMutation, initialContext_1));\n }\n\n initialContext_1.emitter.trigger('eventDrop', __assign(__assign(__assign({}, eventChangeArg), transformed), {\n el: ev.subjectEl,\n delta: validMutation.datesDelta,\n jsEvent: ev.origEvent,\n view: initialView\n }));\n initialContext_1.emitter.trigger('eventChange', eventChangeArg); // dropped in different calendar\n } else if (receivingContext_1) {\n var eventRemoveArg = {\n event: eventApi,\n relatedEvents: buildEventApis(relevantEvents_1, initialContext_1, eventInstance),\n revert: function revert() {\n initialContext_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: relevantEvents_1\n });\n }\n };\n initialContext_1.emitter.trigger('eventLeave', __assign(__assign({}, eventRemoveArg), {\n draggedEl: ev.subjectEl,\n view: initialView\n }));\n initialContext_1.dispatch({\n type: 'REMOVE_EVENTS',\n eventStore: relevantEvents_1\n });\n initialContext_1.emitter.trigger('eventRemove', eventRemoveArg);\n var addedEventDef = mutatedRelevantEvents_1.defs[eventDef.defId];\n var addedEventInstance = mutatedRelevantEvents_1.instances[eventInstance.instanceId];\n var addedEventApi = new EventApi(receivingContext_1, addedEventDef, addedEventInstance);\n receivingContext_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: mutatedRelevantEvents_1\n });\n var eventAddArg = {\n event: addedEventApi,\n relatedEvents: buildEventApis(mutatedRelevantEvents_1, receivingContext_1, addedEventInstance),\n revert: function revert() {\n receivingContext_1.dispatch({\n type: 'REMOVE_EVENTS',\n eventStore: mutatedRelevantEvents_1\n });\n }\n };\n receivingContext_1.emitter.trigger('eventAdd', eventAddArg);\n\n if (ev.isTouch) {\n receivingContext_1.dispatch({\n type: 'SELECT_EVENT',\n eventInstanceId: eventInstance.instanceId\n });\n }\n\n receivingContext_1.emitter.trigger('drop', __assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext_1)), {\n draggedEl: ev.subjectEl,\n jsEvent: ev.origEvent,\n view: finalHit.context.viewApi\n }));\n receivingContext_1.emitter.trigger('eventReceive', __assign(__assign({}, eventAddArg), {\n draggedEl: ev.subjectEl,\n view: finalHit.context.viewApi\n }));\n }\n } else {\n initialContext_1.emitter.trigger('_noEventDrop');\n }\n }\n\n _this.cleanup();\n };\n\n var component = _this.component;\n var options = component.context.options;\n var dragging = _this.dragging = new FeaturefulElementDragging(settings.el);\n dragging.pointer.selector = EventDragging.SELECTOR;\n dragging.touchScrollAllowed = false;\n dragging.autoScroller.isEnabled = options.dragScroll;\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsStore);\n hitDragging.useSubjectCenter = settings.useEventCenter;\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragstart', _this.handleDragStart);\n hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);\n hitDragging.emitter.on('pointerup', _this.handlePointerUp);\n hitDragging.emitter.on('dragend', _this.handleDragEnd);\n return _this;\n }\n\n EventDragging.prototype.destroy = function () {\n this.dragging.destroy();\n }; // render a drag state on the next receivingCalendar\n\n\n EventDragging.prototype.displayDrag = function (nextContext, state) {\n var initialContext = this.component.context;\n var prevContext = this.receivingContext; // does the previous calendar need to be cleared?\n\n if (prevContext && prevContext !== nextContext) {\n // does the initial calendar need to be cleared?\n // if so, don't clear all the way. we still need to to hide the affectedEvents\n if (prevContext === initialContext) {\n prevContext.dispatch({\n type: 'SET_EVENT_DRAG',\n state: {\n affectedEvents: state.affectedEvents,\n mutatedEvents: createEmptyEventStore(),\n isEvent: true\n }\n }); // completely clear the old calendar if it wasn't the initial\n } else {\n prevContext.dispatch({\n type: 'UNSET_EVENT_DRAG'\n });\n }\n }\n\n if (nextContext) {\n nextContext.dispatch({\n type: 'SET_EVENT_DRAG',\n state: state\n });\n }\n };\n\n EventDragging.prototype.clearDrag = function () {\n var initialCalendar = this.component.context;\n var receivingContext = this.receivingContext;\n\n if (receivingContext) {\n receivingContext.dispatch({\n type: 'UNSET_EVENT_DRAG'\n });\n } // the initial calendar might have an dummy drag state from displayDrag\n\n\n if (initialCalendar !== receivingContext) {\n initialCalendar.dispatch({\n type: 'UNSET_EVENT_DRAG'\n });\n }\n };\n\n EventDragging.prototype.cleanup = function () {\n this.subjectSeg = null;\n this.isDragging = false;\n this.eventRange = null;\n this.relevantEvents = null;\n this.receivingContext = null;\n this.validMutation = null;\n this.mutatedRelevantEvents = null;\n }; // TODO: test this in IE11\n // QUESTION: why do we need it on the resizable???\n\n\n EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable';\n return EventDragging;\n}(Interaction);\n\nfunction computeEventMutation(hit0, hit1, massagers) {\n var dateSpan0 = hit0.dateSpan;\n var dateSpan1 = hit1.dateSpan;\n var date0 = dateSpan0.range.start;\n var date1 = dateSpan1.range.start;\n var standardProps = {};\n\n if (dateSpan0.allDay !== dateSpan1.allDay) {\n standardProps.allDay = dateSpan1.allDay;\n standardProps.hasEnd = hit1.context.options.allDayMaintainDuration;\n\n if (dateSpan1.allDay) {\n // means date1 is already start-of-day,\n // but date0 needs to be converted\n date0 = startOfDay(date0);\n }\n }\n\n var delta = diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ? hit0.largeUnit : null);\n\n if (delta.milliseconds) {\n // has hours/minutes/seconds\n standardProps.allDay = false;\n }\n\n var mutation = {\n datesDelta: delta,\n standardProps: standardProps\n };\n\n for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {\n var massager = massagers_1[_i];\n massager(mutation, hit0, hit1);\n }\n\n return mutation;\n}\n\nfunction getComponentTouchDelay(component) {\n var options = component.context.options;\n var delay = options.eventLongPressDelay;\n\n if (delay == null) {\n delay = options.longPressDelay;\n }\n\n return delay;\n}\n\nvar EventResizing =\n/** @class */\nfunction (_super) {\n __extends(EventResizing, _super);\n\n function EventResizing(settings) {\n var _this = _super.call(this, settings) || this; // internal state\n\n\n _this.draggingSegEl = null;\n _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?\n\n _this.eventRange = null;\n _this.relevantEvents = null;\n _this.validMutation = null;\n _this.mutatedRelevantEvents = null;\n\n _this.handlePointerDown = function (ev) {\n var component = _this.component;\n\n var segEl = _this.querySegEl(ev);\n\n var seg = getElSeg(segEl);\n var eventRange = _this.eventRange = seg.eventRange;\n _this.dragging.minDistance = component.context.options.eventDragMinDistance; // if touch, need to be working with a selected event\n\n _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) || ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId);\n };\n\n _this.handleDragStart = function (ev) {\n var context = _this.component.context;\n var eventRange = _this.eventRange;\n _this.relevantEvents = getRelevantEvents(context.getCurrentData().eventStore, _this.eventRange.instance.instanceId);\n\n var segEl = _this.querySegEl(ev);\n\n _this.draggingSegEl = segEl;\n _this.draggingSeg = getElSeg(segEl);\n context.calendarApi.unselect();\n context.emitter.trigger('eventResizeStart', {\n el: segEl,\n event: new EventApi(context, eventRange.def, eventRange.instance),\n jsEvent: ev.origEvent,\n view: context.viewApi\n });\n };\n\n _this.handleHitUpdate = function (hit, isFinal, ev) {\n var context = _this.component.context;\n var relevantEvents = _this.relevantEvents;\n var initialHit = _this.hitDragging.initialHit;\n var eventInstance = _this.eventRange.instance;\n var mutation = null;\n var mutatedRelevantEvents = null;\n var isInvalid = false;\n var interaction = {\n affectedEvents: relevantEvents,\n mutatedEvents: createEmptyEventStore(),\n isEvent: true\n };\n\n if (hit) {\n var disallowed = hit.componentId === initialHit.componentId && _this.isHitComboAllowed && !_this.isHitComboAllowed(initialHit, hit);\n\n if (!disallowed) {\n mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range);\n }\n }\n\n if (mutation) {\n mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context);\n interaction.mutatedEvents = mutatedRelevantEvents;\n\n if (!isInteractionValid(interaction, hit.dateProfile, context)) {\n isInvalid = true;\n mutation = null;\n mutatedRelevantEvents = null;\n interaction.mutatedEvents = null;\n }\n }\n\n if (mutatedRelevantEvents) {\n context.dispatch({\n type: 'SET_EVENT_RESIZE',\n state: interaction\n });\n } else {\n context.dispatch({\n type: 'UNSET_EVENT_RESIZE'\n });\n }\n\n if (!isInvalid) {\n enableCursor();\n } else {\n disableCursor();\n }\n\n if (!isFinal) {\n if (mutation && isHitsEqual(initialHit, hit)) {\n mutation = null;\n }\n\n _this.validMutation = mutation;\n _this.mutatedRelevantEvents = mutatedRelevantEvents;\n }\n };\n\n _this.handleDragEnd = function (ev) {\n var context = _this.component.context;\n var eventDef = _this.eventRange.def;\n var eventInstance = _this.eventRange.instance;\n var eventApi = new EventApi(context, eventDef, eventInstance);\n var relevantEvents = _this.relevantEvents;\n var mutatedRelevantEvents = _this.mutatedRelevantEvents;\n context.emitter.trigger('eventResizeStop', {\n el: _this.draggingSegEl,\n event: eventApi,\n jsEvent: ev.origEvent,\n view: context.viewApi\n });\n\n if (_this.validMutation) {\n var updatedEventApi = new EventApi(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null);\n context.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: mutatedRelevantEvents\n });\n var eventChangeArg = {\n oldEvent: eventApi,\n event: updatedEventApi,\n relatedEvents: buildEventApis(mutatedRelevantEvents, context, eventInstance),\n revert: function revert() {\n context.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: relevantEvents // the pre-change events\n\n });\n }\n };\n context.emitter.trigger('eventResize', __assign(__assign({}, eventChangeArg), {\n el: _this.draggingSegEl,\n startDelta: _this.validMutation.startDelta || createDuration(0),\n endDelta: _this.validMutation.endDelta || createDuration(0),\n jsEvent: ev.origEvent,\n view: context.viewApi\n }));\n context.emitter.trigger('eventChange', eventChangeArg);\n } else {\n context.emitter.trigger('_noEventResize');\n } // reset all internal state\n\n\n _this.draggingSeg = null;\n _this.relevantEvents = null;\n _this.validMutation = null; // okay to keep eventInstance around. useful to set it in handlePointerDown\n };\n\n var component = settings.component;\n var dragging = _this.dragging = new FeaturefulElementDragging(settings.el);\n dragging.pointer.selector = '.fc-event-resizer';\n dragging.touchScrollAllowed = false;\n dragging.autoScroller.isEnabled = component.context.options.dragScroll;\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragstart', _this.handleDragStart);\n hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);\n hitDragging.emitter.on('dragend', _this.handleDragEnd);\n return _this;\n }\n\n EventResizing.prototype.destroy = function () {\n this.dragging.destroy();\n };\n\n EventResizing.prototype.querySegEl = function (ev) {\n return elementClosest(ev.subjectEl, '.fc-event');\n };\n\n return EventResizing;\n}(Interaction);\n\nfunction computeMutation(hit0, hit1, isFromStart, instanceRange) {\n var dateEnv = hit0.context.dateEnv;\n var date0 = hit0.dateSpan.range.start;\n var date1 = hit1.dateSpan.range.start;\n var delta = diffDates(date0, date1, dateEnv, hit0.largeUnit);\n\n if (isFromStart) {\n if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {\n return {\n startDelta: delta\n };\n }\n } else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {\n return {\n endDelta: delta\n };\n }\n\n return null;\n}\n\nvar UnselectAuto =\n/** @class */\nfunction () {\n function UnselectAuto(context) {\n var _this = this;\n\n this.context = context;\n this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system\n\n this.matchesCancel = false;\n this.matchesEvent = false;\n\n this.onSelect = function (selectInfo) {\n if (selectInfo.jsEvent) {\n _this.isRecentPointerDateSelect = true;\n }\n };\n\n this.onDocumentPointerDown = function (pev) {\n var unselectCancel = _this.context.options.unselectCancel;\n var downEl = getEventTargetViaRoot(pev.origEvent);\n _this.matchesCancel = !!elementClosest(downEl, unselectCancel);\n _this.matchesEvent = !!elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event?\n };\n\n this.onDocumentPointerUp = function (pev) {\n var context = _this.context;\n var documentPointer = _this.documentPointer;\n var calendarState = context.getCurrentData(); // touch-scrolling should never unfocus any type of selection\n\n if (!documentPointer.wasTouchScroll) {\n if (calendarState.dateSelection && // an existing date selection?\n !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?\n ) {\n var unselectAuto = context.options.unselectAuto;\n\n if (unselectAuto && (!unselectAuto || !_this.matchesCancel)) {\n context.calendarApi.unselect(pev);\n }\n }\n\n if (calendarState.eventSelection && // an existing event selected?\n !_this.matchesEvent // interaction DIDN'T start on an event\n ) {\n context.dispatch({\n type: 'UNSELECT_EVENT'\n });\n }\n }\n\n _this.isRecentPointerDateSelect = false;\n };\n\n var documentPointer = this.documentPointer = new PointerDragging(document);\n documentPointer.shouldIgnoreMove = true;\n documentPointer.shouldWatchScroll = false;\n documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown);\n documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);\n /*\n TODO: better way to know about whether there was a selection with the pointer\n */\n\n context.emitter.on('select', this.onSelect);\n }\n\n UnselectAuto.prototype.destroy = function () {\n this.context.emitter.off('select', this.onSelect);\n this.documentPointer.destroy();\n };\n\n return UnselectAuto;\n}();\n\nvar OPTION_REFINERS = {\n fixedMirrorParent: identity\n};\nvar LISTENER_REFINERS = {\n dateClick: identity,\n eventDragStart: identity,\n eventDragStop: identity,\n eventDrop: identity,\n eventResizeStart: identity,\n eventResizeStop: identity,\n eventResize: identity,\n drop: identity,\n eventReceive: identity,\n eventLeave: identity\n};\n/*\nGiven an already instantiated draggable object for one-or-more elements,\nInterprets any dragging as an attempt to drag an events that lives outside\nof a calendar onto a calendar.\n*/\n\nvar ExternalElementDragging =\n/** @class */\nfunction () {\n function ExternalElementDragging(dragging, suppliedDragMeta) {\n var _this = this;\n\n this.receivingContext = null;\n this.droppableEvent = null; // will exist for all drags, even if create:false\n\n this.suppliedDragMeta = null;\n this.dragMeta = null;\n\n this.handleDragStart = function (ev) {\n _this.dragMeta = _this.buildDragMeta(ev.subjectEl);\n };\n\n this.handleHitUpdate = function (hit, isFinal, ev) {\n var dragging = _this.hitDragging.dragging;\n var receivingContext = null;\n var droppableEvent = null;\n var isInvalid = false;\n var interaction = {\n affectedEvents: createEmptyEventStore(),\n mutatedEvents: createEmptyEventStore(),\n isEvent: _this.dragMeta.create\n };\n\n if (hit) {\n receivingContext = hit.context;\n\n if (_this.canDropElOnCalendar(ev.subjectEl, receivingContext)) {\n droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingContext);\n interaction.mutatedEvents = eventTupleToStore(droppableEvent);\n isInvalid = !isInteractionValid(interaction, hit.dateProfile, receivingContext);\n\n if (isInvalid) {\n interaction.mutatedEvents = createEmptyEventStore();\n droppableEvent = null;\n }\n }\n }\n\n _this.displayDrag(receivingContext, interaction); // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)\n // TODO: wish we could somehow wait for dispatch to guarantee render\n\n\n dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror'));\n\n if (!isInvalid) {\n enableCursor();\n } else {\n disableCursor();\n }\n\n if (!isFinal) {\n dragging.setMirrorNeedsRevert(!droppableEvent);\n _this.receivingContext = receivingContext;\n _this.droppableEvent = droppableEvent;\n }\n };\n\n this.handleDragEnd = function (pev) {\n var _a = _this,\n receivingContext = _a.receivingContext,\n droppableEvent = _a.droppableEvent;\n\n _this.clearDrag();\n\n if (receivingContext && droppableEvent) {\n var finalHit = _this.hitDragging.finalHit;\n var finalView = finalHit.context.viewApi;\n var dragMeta = _this.dragMeta;\n receivingContext.emitter.trigger('drop', __assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), {\n draggedEl: pev.subjectEl,\n jsEvent: pev.origEvent,\n view: finalView\n }));\n\n if (dragMeta.create) {\n var addingEvents_1 = eventTupleToStore(droppableEvent);\n receivingContext.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: addingEvents_1\n });\n\n if (pev.isTouch) {\n receivingContext.dispatch({\n type: 'SELECT_EVENT',\n eventInstanceId: droppableEvent.instance.instanceId\n });\n } // signal that an external event landed\n\n\n receivingContext.emitter.trigger('eventReceive', {\n event: new EventApi(receivingContext, droppableEvent.def, droppableEvent.instance),\n relatedEvents: [],\n revert: function revert() {\n receivingContext.dispatch({\n type: 'REMOVE_EVENTS',\n eventStore: addingEvents_1\n });\n },\n draggedEl: pev.subjectEl,\n view: finalView\n });\n }\n }\n\n _this.receivingContext = null;\n _this.droppableEvent = null;\n };\n\n var hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore);\n hitDragging.requireInitial = false; // will start outside of a component\n\n hitDragging.emitter.on('dragstart', this.handleDragStart);\n hitDragging.emitter.on('hitupdate', this.handleHitUpdate);\n hitDragging.emitter.on('dragend', this.handleDragEnd);\n this.suppliedDragMeta = suppliedDragMeta;\n }\n\n ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {\n if (_typeof(this.suppliedDragMeta) === 'object') {\n return parseDragMeta(this.suppliedDragMeta);\n }\n\n if (typeof this.suppliedDragMeta === 'function') {\n return parseDragMeta(this.suppliedDragMeta(subjectEl));\n }\n\n return getDragMetaFromEl(subjectEl);\n };\n\n ExternalElementDragging.prototype.displayDrag = function (nextContext, state) {\n var prevContext = this.receivingContext;\n\n if (prevContext && prevContext !== nextContext) {\n prevContext.dispatch({\n type: 'UNSET_EVENT_DRAG'\n });\n }\n\n if (nextContext) {\n nextContext.dispatch({\n type: 'SET_EVENT_DRAG',\n state: state\n });\n }\n };\n\n ExternalElementDragging.prototype.clearDrag = function () {\n if (this.receivingContext) {\n this.receivingContext.dispatch({\n type: 'UNSET_EVENT_DRAG'\n });\n }\n };\n\n ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingContext) {\n var dropAccept = receivingContext.options.dropAccept;\n\n if (typeof dropAccept === 'function') {\n return dropAccept.call(receivingContext.calendarApi, el);\n }\n\n if (typeof dropAccept === 'string' && dropAccept) {\n return Boolean(elementMatches(el, dropAccept));\n }\n\n return true;\n };\n\n return ExternalElementDragging;\n}(); // Utils for computing event store from the DragMeta\n// ----------------------------------------------------------------------------------------------------\n\n\nfunction computeEventForDateSpan(dateSpan, dragMeta, context) {\n var defProps = __assign({}, dragMeta.leftoverProps);\n\n for (var _i = 0, _a = context.pluginHooks.externalDefTransforms; _i < _a.length; _i++) {\n var transform = _a[_i];\n\n __assign(defProps, transform(dateSpan, dragMeta));\n }\n\n var _b = refineEventDef(defProps, context),\n refined = _b.refined,\n extra = _b.extra;\n\n var def = parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd\n context);\n var start = dateSpan.range.start; // only rely on time info if drop zone is all-day,\n // otherwise, we already know the time\n\n if (dateSpan.allDay && dragMeta.startTime) {\n start = context.dateEnv.add(start, dragMeta.startTime);\n }\n\n var end = dragMeta.duration ? context.dateEnv.add(start, dragMeta.duration) : getDefaultEventEnd(dateSpan.allDay, start, context);\n var instance = createEventInstance(def.defId, {\n start: start,\n end: end\n });\n return {\n def: def,\n instance: instance\n };\n} // Utils for extracting data from element\n// ----------------------------------------------------------------------------------------------------\n\n\nfunction getDragMetaFromEl(el) {\n var str = getEmbeddedElData(el, 'event');\n var obj = str ? JSON.parse(str) : {\n create: false\n }; // if no embedded data, assume no event creation\n\n return parseDragMeta(obj);\n}\n\nconfig.dataAttrPrefix = '';\n\nfunction getEmbeddedElData(el, name) {\n var prefix = config.dataAttrPrefix;\n var prefixedName = (prefix ? prefix + '-' : '') + name;\n return el.getAttribute('data-' + prefixedName) || '';\n}\n/*\nMakes an element (that is *external* to any calendar) draggable.\nCan pass in data that determines how an event will be created when dropped onto a calendar.\nLeverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.\n*/\n\n\nvar ExternalDraggable =\n/** @class */\nfunction () {\n function ExternalDraggable(el, settings) {\n var _this = this;\n\n if (settings === void 0) {\n settings = {};\n }\n\n this.handlePointerDown = function (ev) {\n var dragging = _this.dragging;\n var _a = _this.settings,\n minDistance = _a.minDistance,\n longPressDelay = _a.longPressDelay;\n dragging.minDistance = minDistance != null ? minDistance : ev.isTouch ? 0 : BASE_OPTION_DEFAULTS.eventDragMinDistance;\n dragging.delay = ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv\n longPressDelay != null ? longPressDelay : BASE_OPTION_DEFAULTS.longPressDelay : 0;\n };\n\n this.handleDragStart = function (ev) {\n if (ev.isTouch && _this.dragging.delay && ev.subjectEl.classList.contains('fc-event')) {\n _this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected');\n }\n };\n\n this.settings = settings;\n var dragging = this.dragging = new FeaturefulElementDragging(el);\n dragging.touchScrollAllowed = false;\n\n if (settings.itemSelector != null) {\n dragging.pointer.selector = settings.itemSelector;\n }\n\n if (settings.appendTo != null) {\n dragging.mirror.parentNode = settings.appendTo; // TODO: write tests\n }\n\n dragging.emitter.on('pointerdown', this.handlePointerDown);\n dragging.emitter.on('dragstart', this.handleDragStart);\n new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new\n }\n\n ExternalDraggable.prototype.destroy = function () {\n this.dragging.destroy();\n };\n\n return ExternalDraggable;\n}();\n/*\nDetects when a *THIRD-PARTY* drag-n-drop system interacts with elements.\nThe third-party system is responsible for drawing the visuals effects of the drag.\nThis class simply monitors for pointer movements and fires events.\nIt also has the ability to hide the moving element (the \"mirror\") during the drag.\n*/\n\n\nvar InferredElementDragging =\n/** @class */\nfunction (_super) {\n __extends(InferredElementDragging, _super);\n\n function InferredElementDragging(containerEl) {\n var _this = _super.call(this, containerEl) || this;\n\n _this.shouldIgnoreMove = false;\n _this.mirrorSelector = '';\n _this.currentMirrorEl = null;\n\n _this.handlePointerDown = function (ev) {\n _this.emitter.trigger('pointerdown', ev);\n\n if (!_this.shouldIgnoreMove) {\n // fire dragstart right away. does not support delay or min-distance\n _this.emitter.trigger('dragstart', ev);\n }\n };\n\n _this.handlePointerMove = function (ev) {\n if (!_this.shouldIgnoreMove) {\n _this.emitter.trigger('dragmove', ev);\n }\n };\n\n _this.handlePointerUp = function (ev) {\n _this.emitter.trigger('pointerup', ev);\n\n if (!_this.shouldIgnoreMove) {\n // fire dragend right away. does not support a revert animation\n _this.emitter.trigger('dragend', ev);\n }\n };\n\n var pointer = _this.pointer = new PointerDragging(containerEl);\n pointer.emitter.on('pointerdown', _this.handlePointerDown);\n pointer.emitter.on('pointermove', _this.handlePointerMove);\n pointer.emitter.on('pointerup', _this.handlePointerUp);\n return _this;\n }\n\n InferredElementDragging.prototype.destroy = function () {\n this.pointer.destroy();\n };\n\n InferredElementDragging.prototype.setIgnoreMove = function (bool) {\n this.shouldIgnoreMove = bool;\n };\n\n InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {\n if (bool) {\n // restore a previously hidden element.\n // use the reference in case the selector class has already been removed.\n if (this.currentMirrorEl) {\n this.currentMirrorEl.style.visibility = '';\n this.currentMirrorEl = null;\n }\n } else {\n var mirrorEl = this.mirrorSelector // TODO: somehow query FullCalendars WITHIN shadow-roots\n ? document.querySelector(this.mirrorSelector) : null;\n\n if (mirrorEl) {\n this.currentMirrorEl = mirrorEl;\n mirrorEl.style.visibility = 'hidden';\n }\n }\n };\n\n return InferredElementDragging;\n}(ElementDragging);\n/*\nBridges third-party drag-n-drop systems with FullCalendar.\nMust be instantiated and destroyed by caller.\n*/\n\n\nvar ThirdPartyDraggable =\n/** @class */\nfunction () {\n function ThirdPartyDraggable(containerOrSettings, settings) {\n var containerEl = document;\n\n if ( // wish we could just test instanceof EventTarget, but doesn't work in IE11\n containerOrSettings === document || containerOrSettings instanceof Element) {\n containerEl = containerOrSettings;\n settings = settings || {};\n } else {\n settings = containerOrSettings || {};\n }\n\n var dragging = this.dragging = new InferredElementDragging(containerEl);\n\n if (typeof settings.itemSelector === 'string') {\n dragging.pointer.selector = settings.itemSelector;\n } else if (containerEl === document) {\n dragging.pointer.selector = '[data-event]';\n }\n\n if (typeof settings.mirrorSelector === 'string') {\n dragging.mirrorSelector = settings.mirrorSelector;\n }\n\n new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new\n }\n\n ThirdPartyDraggable.prototype.destroy = function () {\n this.dragging.destroy();\n };\n\n return ThirdPartyDraggable;\n}();\n\nvar main = createPlugin({\n componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing],\n calendarInteractions: [UnselectAuto],\n elementDraggingImpl: FeaturefulElementDragging,\n optionRefiners: OPTION_REFINERS,\n listenerRefiners: LISTENER_REFINERS\n});\nexport default main;\nexport { ExternalDraggable as Draggable, FeaturefulElementDragging, PointerDragging, ThirdPartyDraggable };","/*!\nFullCalendar Scheduler v5.11.3\nDocs & License: https://fullcalendar.io/scheduler\n(c) 2022 Adam Shaw\n*/\nimport { createElement, Fragment, config, isValidDate, addDays, createPlugin } from '@fullcalendar/common';\nvar RELEASE_DATE = '2022-08-23'; // for Scheduler\n\nvar UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too\n\nvar INVALID_LICENSE_URL = 'http://fullcalendar.io/docs/schedulerLicenseKey#invalid';\nvar OUTDATED_LICENSE_URL = 'http://fullcalendar.io/docs/schedulerLicenseKey#outdated';\nvar PRESET_LICENSE_KEYS = ['GPL-My-Project-Is-Open-Source', 'CC-Attribution-NonCommercial-NoDerivatives'];\nvar CSS = {\n position: 'absolute',\n zIndex: 99999,\n bottom: '1px',\n left: '1px',\n background: '#eee',\n borderColor: '#ddd',\n borderStyle: 'solid',\n borderWidth: '1px 1px 0 0',\n padding: '2px 4px',\n fontSize: '12px',\n borderTopRightRadius: '3px'\n};\n\nfunction buildLicenseWarning(context) {\n var key = context.options.schedulerLicenseKey;\n var currentUrl = typeof window !== 'undefined' ? window.location.href : '';\n\n if (!isImmuneUrl(currentUrl)) {\n var status_1 = processLicenseKey(key);\n\n if (status_1 !== 'valid') {\n return createElement(\"div\", {\n className: \"fc-license-message\",\n style: CSS\n }, status_1 === 'outdated' ? createElement(Fragment, null, 'Your license key is too old to work with this version. ', createElement(\"a\", {\n href: OUTDATED_LICENSE_URL\n }, \"More Info\")) : createElement(Fragment, null, 'Your license key is invalid. ', createElement(\"a\", {\n href: INVALID_LICENSE_URL\n }, \"More Info\")));\n }\n }\n\n return null;\n}\n/*\nThis decryption is not meant to be bulletproof. Just a way to remind about an upgrade.\n*/\n\n\nfunction processLicenseKey(key) {\n if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {\n return 'valid';\n }\n\n var parts = (key || '').match(/^(\\d+)-fcs-(\\d+)$/);\n\n if (parts && parts[1].length === 10) {\n var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);\n var releaseDate = new Date(config.mockSchedulerReleaseDate || RELEASE_DATE);\n\n if (isValidDate(releaseDate)) {\n // token won't be replaced in dev mode\n var minPurchaseDate = addDays(releaseDate, -UPGRADE_WINDOW);\n\n if (minPurchaseDate < purchaseDate) {\n return 'valid';\n }\n\n return 'outdated';\n }\n }\n\n return 'invalid';\n}\n\nfunction isImmuneUrl(url) {\n return /\\w+:\\/\\/fullcalendar\\.io\\/|\\/examples\\/[\\w-]+\\.html$/.test(url);\n}\n\nvar OPTION_REFINERS = {\n schedulerLicenseKey: String\n};\nvar main = createPlugin({\n optionRefiners: OPTION_REFINERS,\n viewContainerAppends: [buildLicenseWarning]\n});\nexport default main;","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/*!\nFullCalendar Scheduler v5.11.3\nDocs & License: https://fullcalendar.io/scheduler\n(c) 2022 Adam Shaw\n*/\nimport { memoize, filterHash, rangesIntersect, isPropsEqual, mapHash, combineEventUis, refineProps, guid, identity, rangesEqual, parseBusinessHours, createEventUi, parseClassNames, EventApi, CalendarApi, Splitter, mergeEventStores, isPropsValid, parseFieldSpecs, unpromisify, requestJson, createElement, ViewContextType, formatDayString, RenderHook, BaseComponent, NowTimer, Fragment, TableDateCell, TableDowCell, computeFallbackHeaderFormat, flexibleCompare, compareByFieldSpecs, createPlugin } from '@fullcalendar/common';\nimport premiumCommonPlugin from '@fullcalendar/premium-common';\nimport { __assign, __extends, __spreadArray } from 'tslib';\n\nfunction massageEventDragMutation(eventMutation, hit0, hit1) {\n var resource0 = hit0.dateSpan.resourceId;\n var resource1 = hit1.dateSpan.resourceId;\n\n if (resource0 && resource1 && resource0 !== resource1) {\n eventMutation.resourceMutation = {\n matchResourceId: resource0,\n setResourceId: resource1\n };\n }\n}\n/*\nTODO: all this would be much easier if we were using a hash!\n*/\n\n\nfunction applyEventDefMutation(eventDef, mutation, context) {\n var resourceMutation = mutation.resourceMutation;\n\n if (resourceMutation && computeResourceEditable(eventDef, context)) {\n var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);\n\n if (index !== -1) {\n var resourceIds = eventDef.resourceIds.slice(); // copy\n\n resourceIds.splice(index, 1); // remove\n\n if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) {\n // not already in there\n resourceIds.push(resourceMutation.setResourceId); // add\n }\n\n eventDef.resourceIds = resourceIds;\n }\n }\n}\n/*\nHACK\nTODO: use EventUi system instead of this\n*/\n\n\nfunction computeResourceEditable(eventDef, context) {\n var resourceEditable = eventDef.resourceEditable;\n\n if (resourceEditable == null) {\n var source = eventDef.sourceId && context.getCurrentData().eventSources[eventDef.sourceId];\n\n if (source) {\n resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack\n }\n\n if (resourceEditable == null) {\n resourceEditable = context.options.eventResourceEditable;\n\n if (resourceEditable == null) {\n resourceEditable = context.options.editable; // TODO: use defaults system instead\n }\n }\n }\n\n return resourceEditable;\n}\n\nfunction transformEventDrop(mutation, context) {\n var resourceMutation = mutation.resourceMutation;\n\n if (resourceMutation) {\n var calendarApi = context.calendarApi;\n return {\n oldResource: calendarApi.getResourceById(resourceMutation.matchResourceId),\n newResource: calendarApi.getResourceById(resourceMutation.setResourceId)\n };\n }\n\n return {\n oldResource: null,\n newResource: null\n };\n}\n\nvar ResourceDataAdder =\n/** @class */\nfunction () {\n function ResourceDataAdder() {\n this.filterResources = memoize(filterResources);\n }\n\n ResourceDataAdder.prototype.transform = function (viewProps, calendarProps) {\n if (calendarProps.viewSpec.optionDefaults.needsResourceData) {\n return {\n resourceStore: this.filterResources(calendarProps.resourceStore, calendarProps.options.filterResourcesWithEvents, calendarProps.eventStore, calendarProps.dateProfile.activeRange),\n resourceEntityExpansions: calendarProps.resourceEntityExpansions\n };\n }\n\n return null;\n };\n\n return ResourceDataAdder;\n}();\n\nfunction filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {\n if (doFilterResourcesWithEvents) {\n var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);\n var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);\n\n __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));\n\n return filterHash(resourceStore, function (resource, resourceId) {\n return hasEvents_1[resourceId];\n });\n }\n\n return resourceStore;\n}\n\nfunction filterEventInstancesInRange(eventInstances, activeRange) {\n return filterHash(eventInstances, function (eventInstance) {\n return rangesIntersect(eventInstance.range, activeRange);\n });\n}\n\nfunction computeHasEvents(eventInstances, eventDefs) {\n var hasEvents = {};\n\n for (var instanceId in eventInstances) {\n var instance = eventInstances[instanceId];\n\n for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {\n var resourceId = _a[_i];\n hasEvents[resourceId] = true;\n }\n }\n\n return hasEvents;\n}\n/*\nmark resources as having events if any of their ancestors have them\nNOTE: resourceStore might not have all the resources that hasEvents{} has keyed\n*/\n\n\nfunction computeAncestorHasEvents(hasEvents, resourceStore) {\n var res = {};\n\n for (var resourceId in hasEvents) {\n var resource = void 0;\n\n while (resource = resourceStore[resourceId]) {\n resourceId = resource.parentId; // now functioning as the parentId\n\n if (resourceId) {\n res[resourceId] = true;\n } else {\n break;\n }\n }\n }\n\n return res;\n}\n/*\nfor making sure events that have editable resources are always draggable in resource views\n*/\n\n\nfunction transformIsDraggable(val, eventDef, eventUi, context) {\n if (!val) {\n var state = context.getCurrentData();\n var viewSpec = state.viewSpecs[state.currentViewType];\n\n if (viewSpec.optionDefaults.needsResourceData) {\n if (computeResourceEditable(eventDef, context)) {\n return true;\n }\n }\n }\n\n return val;\n} // for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)\n\n\nvar ResourceEventConfigAdder =\n/** @class */\nfunction () {\n function ResourceEventConfigAdder() {\n this.buildResourceEventUis = memoize(buildResourceEventUis, isPropsEqual);\n this.injectResourceEventUis = memoize(injectResourceEventUis);\n }\n\n ResourceEventConfigAdder.prototype.transform = function (viewProps, calendarProps) {\n if (!calendarProps.viewSpec.optionDefaults.needsResourceData) {\n return {\n eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))\n };\n }\n\n return null;\n };\n\n return ResourceEventConfigAdder;\n}();\n\nfunction buildResourceEventUis(resourceStore) {\n return mapHash(resourceStore, function (resource) {\n return resource.ui;\n });\n}\n\nfunction injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {\n return mapHash(eventUiBases, function (eventUi, defId) {\n if (defId) {\n // not the '' key\n return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);\n }\n\n return eventUi;\n });\n}\n\nfunction injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {\n var parts = []; // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts\n\n for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {\n var resourceId = _a[_i];\n\n if (resourceEventUis[resourceId]) {\n parts.unshift(resourceEventUis[resourceId]);\n }\n }\n\n parts.unshift(origEventUi);\n return combineEventUis(parts);\n}\n\nvar defs = []; // TODO: use plugin system\n\nfunction registerResourceSourceDef(def) {\n defs.push(def);\n}\n\nfunction getResourceSourceDef(id) {\n return defs[id];\n}\n\nfunction getResourceSourceDefs() {\n return defs;\n} // TODO: make this a plugin-able parser\n// TODO: success/failure\n\n\nvar RESOURCE_SOURCE_REFINERS = {\n id: String,\n // for array. TODO: move to resource-array\n resources: identity,\n // for json feed. TODO: move to resource-json-feed\n url: String,\n method: String,\n startParam: String,\n endParam: String,\n timeZoneParam: String,\n extraParams: identity\n};\n\nfunction parseResourceSource(input) {\n var inputObj;\n\n if (typeof input === 'string') {\n inputObj = {\n url: input\n };\n } else if (typeof input === 'function' || Array.isArray(input)) {\n inputObj = {\n resources: input\n };\n } else if (_typeof(input) === 'object' && input) {\n // non-null object\n inputObj = input;\n }\n\n if (inputObj) {\n var _a = refineProps(inputObj, RESOURCE_SOURCE_REFINERS),\n refined = _a.refined,\n extra = _a.extra;\n\n warnUnknownProps(extra);\n var metaRes = buildResourceSourceMeta(refined);\n\n if (metaRes) {\n return {\n _raw: input,\n sourceId: guid(),\n sourceDefId: metaRes.sourceDefId,\n meta: metaRes.meta,\n publicId: refined.id || '',\n isFetching: false,\n latestFetchId: '',\n fetchRange: null\n };\n }\n }\n\n return null;\n}\n\nfunction buildResourceSourceMeta(refined) {\n var defs = getResourceSourceDefs();\n\n for (var i = defs.length - 1; i >= 0; i -= 1) {\n // later-added plugins take precedence\n var def = defs[i];\n var meta = def.parseMeta(refined);\n\n if (meta) {\n return {\n meta: meta,\n sourceDefId: i\n };\n }\n }\n\n return null;\n}\n\nfunction warnUnknownProps(props) {\n for (var propName in props) {\n console.warn(\"Unknown resource prop '\" + propName + \"'\");\n }\n}\n\nfunction reduceResourceSource(source, action, context) {\n var options = context.options,\n dateProfile = context.dateProfile;\n\n if (!source || !action) {\n return createSource(options.initialResources || options.resources, dateProfile.activeRange, options.refetchResourcesOnNavigate, context);\n }\n\n switch (action.type) {\n case 'RESET_RESOURCE_SOURCE':\n return createSource(action.resourceSourceInput, dateProfile.activeRange, options.refetchResourcesOnNavigate, context);\n\n case 'PREV': // TODO: how do we track all actions that affect dateProfile :(\n\n case 'NEXT':\n case 'CHANGE_DATE':\n case 'CHANGE_VIEW_TYPE':\n return handleRangeChange(source, dateProfile.activeRange, options.refetchResourcesOnNavigate, context);\n\n case 'RECEIVE_RESOURCES':\n case 'RECEIVE_RESOURCE_ERROR':\n return receiveResponse(source, action.fetchId, action.fetchRange);\n\n case 'REFETCH_RESOURCES':\n return fetchSource(source, dateProfile.activeRange, context);\n\n default:\n return source;\n }\n}\n\nfunction createSource(input, activeRange, refetchResourcesOnNavigate, context) {\n if (input) {\n var source = parseResourceSource(input);\n source = fetchSource(source, refetchResourcesOnNavigate ? activeRange : null, context);\n return source;\n }\n\n return null;\n}\n\nfunction handleRangeChange(source, activeRange, refetchResourcesOnNavigate, context) {\n if (refetchResourcesOnNavigate && !doesSourceIgnoreRange(source) && (!source.fetchRange || !rangesEqual(source.fetchRange, activeRange))) {\n return fetchSource(source, activeRange, context);\n }\n\n return source;\n}\n\nfunction doesSourceIgnoreRange(source) {\n return Boolean(getResourceSourceDef(source.sourceDefId).ignoreRange);\n}\n\nfunction fetchSource(source, fetchRange, context) {\n var sourceDef = getResourceSourceDef(source.sourceDefId);\n var fetchId = guid();\n sourceDef.fetch({\n resourceSource: source,\n range: fetchRange,\n context: context\n }, function (res) {\n context.dispatch({\n type: 'RECEIVE_RESOURCES',\n fetchId: fetchId,\n fetchRange: fetchRange,\n rawResources: res.rawResources\n });\n }, function (error) {\n context.dispatch({\n type: 'RECEIVE_RESOURCE_ERROR',\n fetchId: fetchId,\n fetchRange: fetchRange,\n error: error\n });\n });\n return __assign(__assign({}, source), {\n isFetching: true,\n latestFetchId: fetchId\n });\n}\n\nfunction receiveResponse(source, fetchId, fetchRange) {\n if (fetchId === source.latestFetchId) {\n return __assign(__assign({}, source), {\n isFetching: false,\n fetchRange: fetchRange\n });\n }\n\n return source;\n}\n\nvar PRIVATE_ID_PREFIX = '_fc:';\nvar RESOURCE_REFINERS = {\n id: String,\n parentId: String,\n children: identity,\n title: String,\n businessHours: identity,\n extendedProps: identity,\n // event-ui\n eventEditable: Boolean,\n eventStartEditable: Boolean,\n eventDurationEditable: Boolean,\n eventConstraint: identity,\n eventOverlap: Boolean,\n eventAllow: identity,\n eventClassNames: parseClassNames,\n eventBackgroundColor: String,\n eventBorderColor: String,\n eventTextColor: String,\n eventColor: String\n};\n/*\nneeds a full store so that it can populate children too\n*/\n\nfunction parseResource(raw, parentId, store, context) {\n if (parentId === void 0) {\n parentId = '';\n }\n\n var _a = refineProps(raw, RESOURCE_REFINERS),\n refined = _a.refined,\n extra = _a.extra;\n\n var resource = {\n id: refined.id || PRIVATE_ID_PREFIX + guid(),\n parentId: refined.parentId || parentId,\n title: refined.title || '',\n businessHours: refined.businessHours ? parseBusinessHours(refined.businessHours, context) : null,\n ui: createEventUi({\n editable: refined.eventEditable,\n startEditable: refined.eventStartEditable,\n durationEditable: refined.eventDurationEditable,\n constraint: refined.eventConstraint,\n overlap: refined.eventOverlap,\n allow: refined.eventAllow,\n classNames: refined.eventClassNames,\n backgroundColor: refined.eventBackgroundColor,\n borderColor: refined.eventBorderColor,\n textColor: refined.eventTextColor,\n color: refined.eventColor\n }, context),\n extendedProps: __assign(__assign({}, extra), refined.extendedProps)\n }; // help out ResourceApi from having user modify props\n\n Object.freeze(resource.ui.classNames);\n Object.freeze(resource.extendedProps);\n if (store[resource.id]) ;else {\n store[resource.id] = resource;\n\n if (refined.children) {\n for (var _i = 0, _b = refined.children; _i < _b.length; _i++) {\n var childInput = _b[_i];\n parseResource(childInput, resource.id, store, context);\n }\n }\n }\n return resource;\n}\n/*\nTODO: use this in more places\n*/\n\n\nfunction getPublicId(id) {\n if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {\n return '';\n }\n\n return id;\n}\n\nfunction reduceResourceStore(store, action, source, context) {\n if (!store || !action) {\n return {};\n }\n\n switch (action.type) {\n case 'RECEIVE_RESOURCES':\n return receiveRawResources(store, action.rawResources, action.fetchId, source, context);\n\n case 'ADD_RESOURCE':\n return addResource(store, action.resourceHash);\n\n case 'REMOVE_RESOURCE':\n return removeResource(store, action.resourceId);\n\n case 'SET_RESOURCE_PROP':\n return setResourceProp(store, action.resourceId, action.propName, action.propValue);\n\n case 'SET_RESOURCE_EXTENDED_PROP':\n return setResourceExtendedProp(store, action.resourceId, action.propName, action.propValue);\n\n default:\n return store;\n }\n}\n\nfunction receiveRawResources(existingStore, inputs, fetchId, source, context) {\n if (source.latestFetchId === fetchId) {\n var nextStore = {};\n\n for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {\n var input = inputs_1[_i];\n parseResource(input, '', nextStore, context);\n }\n\n return nextStore;\n }\n\n return existingStore;\n}\n\nfunction addResource(existingStore, additions) {\n // TODO: warn about duplicate IDs\n return __assign(__assign({}, existingStore), additions);\n}\n\nfunction removeResource(existingStore, resourceId) {\n var newStore = __assign({}, existingStore);\n\n delete newStore[resourceId]; // promote children\n\n for (var childResourceId in newStore) {\n // a child, *maybe* but probably not\n if (newStore[childResourceId].parentId === resourceId) {\n newStore[childResourceId] = __assign(__assign({}, newStore[childResourceId]), {\n parentId: ''\n });\n }\n }\n\n return newStore;\n}\n\nfunction setResourceProp(existingStore, resourceId, name, value) {\n var _a, _b;\n\n var existingResource = existingStore[resourceId]; // TODO: sanitization\n\n if (existingResource) {\n return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), (_b = {}, _b[name] = value, _b)), _a));\n }\n\n return existingStore;\n}\n\nfunction setResourceExtendedProp(existingStore, resourceId, name, value) {\n var _a, _b;\n\n var existingResource = existingStore[resourceId];\n\n if (existingResource) {\n return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), {\n extendedProps: __assign(__assign({}, existingResource.extendedProps), (_b = {}, _b[name] = value, _b))\n }), _a));\n }\n\n return existingStore;\n}\n\nfunction reduceResourceEntityExpansions(expansions, action) {\n var _a;\n\n if (!expansions || !action) {\n return {};\n }\n\n switch (action.type) {\n case 'SET_RESOURCE_ENTITY_EXPANDED':\n return __assign(__assign({}, expansions), (_a = {}, _a[action.id] = action.isExpanded, _a));\n\n default:\n return expansions;\n }\n}\n\nfunction reduceResources(state, action, context) {\n var resourceSource = reduceResourceSource(state && state.resourceSource, action, context);\n var resourceStore = reduceResourceStore(state && state.resourceStore, action, resourceSource, context);\n var resourceEntityExpansions = reduceResourceEntityExpansions(state && state.resourceEntityExpansions, action);\n return {\n resourceSource: resourceSource,\n resourceStore: resourceStore,\n resourceEntityExpansions: resourceEntityExpansions\n };\n}\n\nvar EVENT_REFINERS = {\n resourceId: String,\n resourceIds: identity,\n resourceEditable: Boolean\n};\n\nfunction generateEventDefResourceMembers(refined) {\n return {\n resourceIds: ensureStringArray(refined.resourceIds).concat(refined.resourceId ? [refined.resourceId] : []),\n resourceEditable: refined.resourceEditable\n };\n}\n\nfunction ensureStringArray(items) {\n return (items || []).map(function (item) {\n return String(item);\n });\n}\n\nfunction transformDateSelectionJoin(hit0, hit1) {\n var resourceId0 = hit0.dateSpan.resourceId;\n var resourceId1 = hit1.dateSpan.resourceId;\n\n if (resourceId0 && resourceId1) {\n return {\n resourceId: resourceId0\n };\n }\n\n return null;\n}\n\nvar ResourceApi =\n/** @class */\nfunction () {\n function ResourceApi(_context, _resource) {\n this._context = _context;\n this._resource = _resource;\n }\n\n ResourceApi.prototype.setProp = function (name, value) {\n var oldResource = this._resource;\n\n this._context.dispatch({\n type: 'SET_RESOURCE_PROP',\n resourceId: oldResource.id,\n propName: name,\n propValue: value\n });\n\n this.sync(oldResource);\n };\n\n ResourceApi.prototype.setExtendedProp = function (name, value) {\n var oldResource = this._resource;\n\n this._context.dispatch({\n type: 'SET_RESOURCE_EXTENDED_PROP',\n resourceId: oldResource.id,\n propName: name,\n propValue: value\n });\n\n this.sync(oldResource);\n };\n\n ResourceApi.prototype.sync = function (oldResource) {\n var context = this._context;\n var resourceId = oldResource.id; // TODO: what if dispatch didn't complete synchronously?\n\n this._resource = context.getCurrentData().resourceStore[resourceId];\n context.emitter.trigger('resourceChange', {\n oldResource: new ResourceApi(context, oldResource),\n resource: this,\n revert: function revert() {\n var _a;\n\n context.dispatch({\n type: 'ADD_RESOURCE',\n resourceHash: (_a = {}, _a[resourceId] = oldResource, _a)\n });\n }\n });\n };\n\n ResourceApi.prototype.remove = function () {\n var context = this._context;\n var internalResource = this._resource;\n var resourceId = internalResource.id;\n context.dispatch({\n type: 'REMOVE_RESOURCE',\n resourceId: resourceId\n });\n context.emitter.trigger('resourceRemove', {\n resource: this,\n revert: function revert() {\n var _a;\n\n context.dispatch({\n type: 'ADD_RESOURCE',\n resourceHash: (_a = {}, _a[resourceId] = internalResource, _a)\n });\n }\n });\n };\n\n ResourceApi.prototype.getParent = function () {\n var context = this._context;\n var parentId = this._resource.parentId;\n\n if (parentId) {\n return new ResourceApi(context, context.getCurrentData().resourceSource[parentId]);\n }\n\n return null;\n };\n\n ResourceApi.prototype.getChildren = function () {\n var thisResourceId = this._resource.id;\n var context = this._context;\n var resourceStore = context.getCurrentData().resourceStore;\n var childApis = [];\n\n for (var resourceId in resourceStore) {\n if (resourceStore[resourceId].parentId === thisResourceId) {\n childApis.push(new ResourceApi(context, resourceStore[resourceId]));\n }\n }\n\n return childApis;\n };\n /*\n this is really inefficient!\n TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state\n */\n\n\n ResourceApi.prototype.getEvents = function () {\n var thisResourceId = this._resource.id;\n var context = this._context;\n var _a = context.getCurrentData().eventStore,\n defs = _a.defs,\n instances = _a.instances;\n var eventApis = [];\n\n for (var instanceId in instances) {\n var instance = instances[instanceId];\n var def = defs[instance.defId];\n\n if (def.resourceIds.indexOf(thisResourceId) !== -1) {\n // inefficient!!!\n eventApis.push(new EventApi(context, def, instance));\n }\n }\n\n return eventApis;\n };\n\n Object.defineProperty(ResourceApi.prototype, \"id\", {\n get: function get() {\n return getPublicId(this._resource.id);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"title\", {\n get: function get() {\n return this._resource.title;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventConstraint\", {\n get: function get() {\n return this._resource.ui.constraints[0] || null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventOverlap\", {\n get: function get() {\n return this._resource.ui.overlap;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventAllow\", {\n get: function get() {\n return this._resource.ui.allows[0] || null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventBackgroundColor\", {\n get: function get() {\n return this._resource.ui.backgroundColor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventBorderColor\", {\n get: function get() {\n return this._resource.ui.borderColor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventTextColor\", {\n get: function get() {\n return this._resource.ui.textColor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"eventClassNames\", {\n // NOTE: user can't modify these because Object.freeze was called in event-def parsing\n get: function get() {\n return this._resource.ui.classNames;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ResourceApi.prototype, \"extendedProps\", {\n get: function get() {\n return this._resource.extendedProps;\n },\n enumerable: false,\n configurable: true\n });\n\n ResourceApi.prototype.toPlainObject = function (settings) {\n if (settings === void 0) {\n settings = {};\n }\n\n var internal = this._resource;\n var ui = internal.ui;\n var publicId = this.id;\n var res = {};\n\n if (publicId) {\n res.id = publicId;\n }\n\n if (internal.title) {\n res.title = internal.title;\n }\n\n if (settings.collapseEventColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) {\n res.eventColor = ui.backgroundColor;\n } else {\n if (ui.backgroundColor) {\n res.eventBackgroundColor = ui.backgroundColor;\n }\n\n if (ui.borderColor) {\n res.eventBorderColor = ui.borderColor;\n }\n }\n\n if (ui.textColor) {\n res.eventTextColor = ui.textColor;\n }\n\n if (ui.classNames.length) {\n res.eventClassNames = ui.classNames;\n }\n\n if (Object.keys(internal.extendedProps).length) {\n if (settings.collapseExtendedProps) {\n __assign(res, internal.extendedProps);\n } else {\n res.extendedProps = internal.extendedProps;\n }\n }\n\n return res;\n };\n\n ResourceApi.prototype.toJSON = function () {\n return this.toPlainObject();\n };\n\n return ResourceApi;\n}();\n\nfunction buildResourceApis(resourceStore, context) {\n var resourceApis = [];\n\n for (var resourceId in resourceStore) {\n resourceApis.push(new ResourceApi(context, resourceStore[resourceId]));\n }\n\n return resourceApis;\n}\n\nCalendarApi.prototype.addResource = function (input, scrollTo) {\n var _a;\n\n var _this = this;\n\n if (scrollTo === void 0) {\n scrollTo = true;\n }\n\n var currentState = this.getCurrentData();\n var resourceHash;\n var resource;\n\n if (input instanceof ResourceApi) {\n resource = input._resource;\n resourceHash = (_a = {}, _a[resource.id] = resource, _a);\n } else {\n resourceHash = {};\n resource = parseResource(input, '', resourceHash, currentState);\n }\n\n this.dispatch({\n type: 'ADD_RESOURCE',\n resourceHash: resourceHash\n });\n\n if (scrollTo) {\n // TODO: wait til dispatch completes somehow\n this.trigger('_scrollRequest', {\n resourceId: resource.id\n });\n }\n\n var resourceApi = new ResourceApi(currentState, resource);\n currentState.emitter.trigger('resourceAdd', {\n resource: resourceApi,\n revert: function revert() {\n _this.dispatch({\n type: 'REMOVE_RESOURCE',\n resourceId: resource.id\n });\n }\n });\n return resourceApi;\n};\n\nCalendarApi.prototype.getResourceById = function (id) {\n id = String(id);\n var currentState = this.getCurrentData(); // eslint-disable-line react/no-this-in-sfc\n\n if (currentState.resourceStore) {\n // guard against calendar with no resource functionality\n var rawResource = currentState.resourceStore[id];\n\n if (rawResource) {\n return new ResourceApi(currentState, rawResource);\n }\n }\n\n return null;\n};\n\nCalendarApi.prototype.getResources = function () {\n var currentState = this.getCurrentData();\n var resourceStore = currentState.resourceStore;\n var resourceApis = [];\n\n if (resourceStore) {\n // guard against calendar with no resource functionality\n for (var resourceId in resourceStore) {\n resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId]));\n }\n }\n\n return resourceApis;\n};\n\nCalendarApi.prototype.getTopLevelResources = function () {\n var currentState = this.getCurrentData();\n var resourceStore = currentState.resourceStore;\n var resourceApis = [];\n\n if (resourceStore) {\n // guard against calendar with no resource functionality\n for (var resourceId in resourceStore) {\n if (!resourceStore[resourceId].parentId) {\n resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId]));\n }\n }\n }\n\n return resourceApis;\n};\n\nCalendarApi.prototype.refetchResources = function () {\n this.dispatch({\n type: 'REFETCH_RESOURCES'\n });\n};\n\nfunction transformDatePoint(dateSpan, context) {\n return dateSpan.resourceId ? {\n resource: context.calendarApi.getResourceById(dateSpan.resourceId)\n } : {};\n}\n\nfunction transformDateSpan(dateSpan, context) {\n return dateSpan.resourceId ? {\n resource: context.calendarApi.getResourceById(dateSpan.resourceId)\n } : {};\n}\n/*\nsplits things BASED OFF OF which resources they are associated with.\ncreates a '' entry which is when something has NO resource.\n*/\n\n\nvar ResourceSplitter =\n/** @class */\nfunction (_super) {\n __extends(ResourceSplitter, _super);\n\n function ResourceSplitter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n ResourceSplitter.prototype.getKeyInfo = function (props) {\n return __assign({\n '': {}\n }, props.resourceStore);\n };\n\n ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {\n return [dateSpan.resourceId || ''];\n };\n\n ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {\n var resourceIds = eventDef.resourceIds;\n\n if (!resourceIds.length) {\n return [''];\n }\n\n return resourceIds;\n };\n\n return ResourceSplitter;\n}(Splitter);\n\nfunction isPropsValidWithResources(combinedProps, context) {\n var splitter = new ResourceSplitter();\n var sets = splitter.splitProps(__assign(__assign({}, combinedProps), {\n resourceStore: context.getCurrentData().resourceStore\n }));\n\n for (var resourceId in sets) {\n var props = sets[resourceId]; // merge in event data from the non-resource segment\n\n if (resourceId && sets['']) {\n // current segment is not the non-resource one, and there IS a non-resource one\n props = __assign(__assign({}, props), {\n eventStore: mergeEventStores(sets[''].eventStore, props.eventStore),\n eventUiBases: __assign(__assign({}, sets[''].eventUiBases), props.eventUiBases)\n });\n }\n\n if (!isPropsValid(props, context, {\n resourceId: resourceId\n }, filterConfig.bind(null, resourceId))) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction filterConfig(resourceId, config) {\n return __assign(__assign({}, config), {\n constraints: filterConstraints(resourceId, config.constraints)\n });\n}\n\nfunction filterConstraints(resourceId, constraints) {\n return constraints.map(function (constraint) {\n var defs = constraint.defs;\n\n if (defs) {\n // we are dealing with an EventStore\n // if any of the events define constraints to resources that are NOT this resource,\n // then this resource is unconditionally prohibited, which is what a `false` value does.\n for (var defId in defs) {\n var resourceIds = defs[defId].resourceIds;\n\n if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) {\n // TODO: use a hash?!!! (for other reasons too)\n return false;\n }\n }\n }\n\n return constraint;\n });\n}\n\nfunction transformExternalDef(dateSpan) {\n return dateSpan.resourceId ? {\n resourceId: dateSpan.resourceId\n } : {};\n}\n\nEventApi.prototype.getResources = function () {\n var calendarApi = this._context.calendarApi;\n return this._def.resourceIds.map(function (resourceId) {\n return calendarApi.getResourceById(resourceId);\n });\n};\n\nEventApi.prototype.setResources = function (resources) {\n var resourceIds = []; // massage resources -> resourceIds\n\n for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {\n var resource = resources_1[_i];\n var resourceId = null;\n\n if (typeof resource === 'string') {\n resourceId = resource;\n } else if (typeof resource === 'number') {\n resourceId = String(resource);\n } else if (resource instanceof ResourceApi) {\n resourceId = resource.id; // guaranteed to always have an ID. hmmm\n } else {\n console.warn('unknown resource type: ' + resource);\n }\n\n if (resourceId) {\n resourceIds.push(resourceId);\n }\n }\n\n this.mutate({\n standardProps: {\n resourceIds: resourceIds\n }\n });\n};\n\nvar optionChangeHandlers = {\n resources: handleResources\n};\n\nfunction handleResources(newSourceInput, context) {\n var oldSourceInput = context.getCurrentData().resourceSource._raw;\n\n if (oldSourceInput !== newSourceInput) {\n context.dispatch({\n type: 'RESET_RESOURCE_SOURCE',\n resourceSourceInput: newSourceInput\n });\n }\n}\n\nvar DEFAULT_RESOURCE_ORDER = parseFieldSpecs('id,title');\n\nfunction handleResourceStore(resourceStore, calendarData) {\n var emitter = calendarData.emitter;\n\n if (emitter.hasHandlers('resourcesSet')) {\n emitter.trigger('resourcesSet', buildResourceApis(resourceStore, calendarData));\n }\n}\n\nvar OPTION_REFINERS = {\n initialResources: identity,\n resources: identity,\n eventResourceEditable: Boolean,\n refetchResourcesOnNavigate: Boolean,\n resourceOrder: parseFieldSpecs,\n filterResourcesWithEvents: Boolean,\n resourceGroupField: String,\n resourceAreaWidth: identity,\n resourceAreaColumns: identity,\n resourcesInitiallyExpanded: Boolean,\n datesAboveResources: Boolean,\n needsResourceData: Boolean,\n resourceAreaHeaderClassNames: identity,\n resourceAreaHeaderContent: identity,\n resourceAreaHeaderDidMount: identity,\n resourceAreaHeaderWillUnmount: identity,\n resourceGroupLabelClassNames: identity,\n resourceGroupLabelContent: identity,\n resourceGroupLabelDidMount: identity,\n resourceGroupLabelWillUnmount: identity,\n resourceLabelClassNames: identity,\n resourceLabelContent: identity,\n resourceLabelDidMount: identity,\n resourceLabelWillUnmount: identity,\n resourceLaneClassNames: identity,\n resourceLaneContent: identity,\n resourceLaneDidMount: identity,\n resourceLaneWillUnmount: identity,\n resourceGroupLaneClassNames: identity,\n resourceGroupLaneContent: identity,\n resourceGroupLaneDidMount: identity,\n resourceGroupLaneWillUnmount: identity\n};\nvar LISTENER_REFINERS = {\n resourcesSet: identity,\n resourceAdd: identity,\n resourceChange: identity,\n resourceRemove: identity\n};\nregisterResourceSourceDef({\n ignoreRange: true,\n parseMeta: function parseMeta(refined) {\n if (Array.isArray(refined.resources)) {\n return refined.resources;\n }\n\n return null;\n },\n fetch: function fetch(arg, successCallback) {\n successCallback({\n rawResources: arg.resourceSource.meta\n });\n }\n});\nregisterResourceSourceDef({\n parseMeta: function parseMeta(refined) {\n if (typeof refined.resources === 'function') {\n return refined.resources;\n }\n\n return null;\n },\n fetch: function fetch(arg, success, failure) {\n var dateEnv = arg.context.dateEnv;\n var func = arg.resourceSource.meta;\n var publicArg = arg.range ? {\n start: dateEnv.toDate(arg.range.start),\n end: dateEnv.toDate(arg.range.end),\n startStr: dateEnv.formatIso(arg.range.start),\n endStr: dateEnv.formatIso(arg.range.end),\n timeZone: dateEnv.timeZone\n } : {}; // TODO: make more dry with EventSourceFunc\n // TODO: accept a response?\n\n unpromisify(func.bind(null, publicArg), function (rawResources) {\n success({\n rawResources: rawResources\n }); // needs an object response\n }, failure);\n }\n});\nregisterResourceSourceDef({\n parseMeta: function parseMeta(refined) {\n if (refined.url) {\n return {\n url: refined.url,\n method: (refined.method || 'GET').toUpperCase(),\n extraParams: refined.extraParams\n };\n }\n\n return null;\n },\n fetch: function fetch(arg, successCallback, failureCallback) {\n var meta = arg.resourceSource.meta;\n var requestParams = buildRequestParams(meta, arg.range, arg.context);\n requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {\n successCallback({\n rawResources: rawResources,\n xhr: xhr\n });\n }, function (message, xhr) {\n failureCallback({\n message: message,\n xhr: xhr\n });\n });\n }\n}); // TODO: somehow consolidate with event json feed\n\nfunction buildRequestParams(meta, range, context) {\n var dateEnv = context.dateEnv,\n options = context.options;\n var startParam;\n var endParam;\n var timeZoneParam;\n var customRequestParams;\n var params = {};\n\n if (range) {\n startParam = meta.startParam;\n\n if (startParam == null) {\n startParam = options.startParam;\n }\n\n endParam = meta.endParam;\n\n if (endParam == null) {\n endParam = options.endParam;\n }\n\n timeZoneParam = meta.timeZoneParam;\n\n if (timeZoneParam == null) {\n timeZoneParam = options.timeZoneParam;\n }\n\n params[startParam] = dateEnv.formatIso(range.start);\n params[endParam] = dateEnv.formatIso(range.end);\n\n if (dateEnv.timeZone !== 'local') {\n params[timeZoneParam] = dateEnv.timeZone;\n }\n } // retrieve any outbound GET/POST data from the options\n\n\n if (typeof meta.extraParams === 'function') {\n // supplied as a function that returns a key/value object\n customRequestParams = meta.extraParams();\n } else {\n // probably supplied as a straight key/value object\n customRequestParams = meta.extraParams || {};\n }\n\n __assign(params, customRequestParams);\n\n return params;\n} // TODO: not used for Spreadsheet. START USING. difficult because of col-specific rendering props\n\n\nfunction ResourceLabelRoot(props) {\n return createElement(ViewContextType.Consumer, null, function (context) {\n var options = context.options;\n var hookProps = {\n resource: new ResourceApi(context, props.resource),\n date: props.date ? context.dateEnv.toDate(props.date) : null,\n view: context.viewApi\n };\n var dataAttrs = {\n 'data-resource-id': props.resource.id,\n 'data-date': props.date ? formatDayString(props.date) : undefined\n };\n return createElement(RenderHook, {\n hookProps: hookProps,\n classNames: options.resourceLabelClassNames,\n content: options.resourceLabelContent,\n defaultContent: renderInnerContent,\n didMount: options.resourceLabelDidMount,\n willUnmount: options.resourceLabelWillUnmount\n }, function (rootElRef, classNames, innerElRef, innerContent) {\n return props.children(rootElRef, classNames, // TODO: pass in 'fc-resource' ?\n dataAttrs, innerElRef, innerContent);\n });\n });\n}\n\nfunction renderInnerContent(props) {\n return props.resource.title || props.resource.id;\n}\n\nvar ResourceCell =\n/** @class */\nfunction (_super) {\n __extends(ResourceCell, _super);\n\n function ResourceCell() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n ResourceCell.prototype.render = function () {\n var props = this.props;\n return createElement(ResourceLabelRoot, {\n resource: props.resource,\n date: props.date\n }, function (elRef, customClassNames, dataAttrs, innerElRef, innerContent) {\n return createElement(\"th\", __assign({\n ref: elRef,\n role: \"columnheader\",\n className: ['fc-col-header-cell', 'fc-resource'].concat(customClassNames).join(' '),\n colSpan: props.colSpan\n }, dataAttrs), createElement(\"div\", {\n className: \"fc-scrollgrid-sync-inner\"\n }, createElement(\"span\", {\n className: ['fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : ''].join(' '),\n ref: innerElRef\n }, innerContent)));\n });\n };\n\n return ResourceCell;\n}(BaseComponent);\n\nvar ResourceDayHeader =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayHeader, _super);\n\n function ResourceDayHeader() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.buildDateFormat = memoize(buildDateFormat);\n return _this;\n }\n\n ResourceDayHeader.prototype.render = function () {\n var _this = this;\n\n var _a = this,\n props = _a.props,\n context = _a.context;\n\n var dateFormat = this.buildDateFormat(context.options.dayHeaderFormat, props.datesRepDistinctDays, props.dates.length);\n return createElement(NowTimer, {\n unit: \"day\"\n }, function (nowDate, todayRange) {\n if (props.dates.length === 1) {\n return _this.renderResourceRow(props.resources, props.dates[0]);\n }\n\n if (context.options.datesAboveResources) {\n return _this.renderDayAndResourceRows(props.dates, dateFormat, todayRange, props.resources);\n }\n\n return _this.renderResourceAndDayRows(props.resources, props.dates, dateFormat, todayRange);\n });\n };\n\n ResourceDayHeader.prototype.renderResourceRow = function (resources, date) {\n var resourceCells = resources.map(function (resource) {\n return createElement(ResourceCell, {\n key: resource.id,\n resource: resource,\n colSpan: 1,\n date: date\n });\n });\n return this.buildTr(resourceCells, 'resources');\n };\n\n ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, dateFormat, todayRange, resources) {\n var dateCells = [];\n var resourceCells = [];\n\n for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {\n var date = dates_1[_i];\n dateCells.push(this.renderDateCell(date, dateFormat, todayRange, resources.length, null, true));\n\n for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {\n var resource = resources_1[_a];\n resourceCells.push(createElement(ResourceCell, {\n key: resource.id + ':' + date.toISOString(),\n resource: resource,\n colSpan: 1,\n date: date\n }));\n }\n }\n\n return createElement(Fragment, null, this.buildTr(dateCells, 'day'), this.buildTr(resourceCells, 'resources'));\n };\n\n ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates, dateFormat, todayRange) {\n var resourceCells = [];\n var dateCells = [];\n\n for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {\n var resource = resources_2[_i];\n resourceCells.push(createElement(ResourceCell, {\n key: resource.id,\n resource: resource,\n colSpan: dates.length,\n isSticky: true\n }));\n\n for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {\n var date = dates_2[_a];\n dateCells.push(this.renderDateCell(date, dateFormat, todayRange, 1, resource));\n }\n }\n\n return createElement(Fragment, null, this.buildTr(resourceCells, 'resources'), this.buildTr(dateCells, 'day'));\n }; // a cell with date text. might have a resource associated with it\n\n\n ResourceDayHeader.prototype.renderDateCell = function (date, dateFormat, todayRange, colSpan, resource, isSticky) {\n var props = this.props;\n var keyPostfix = resource ? \":\" + resource.id : '';\n var extraHookProps = resource ? {\n resource: new ResourceApi(this.context, resource)\n } : {};\n var extraDataAttrs = resource ? {\n 'data-resource-id': resource.id\n } : {};\n return props.datesRepDistinctDays ? createElement(TableDateCell, {\n key: date.toISOString() + keyPostfix,\n date: date,\n dateProfile: props.dateProfile,\n todayRange: todayRange,\n colCnt: props.dates.length * props.resources.length,\n dayHeaderFormat: dateFormat,\n colSpan: colSpan,\n isSticky: isSticky,\n extraHookProps: extraHookProps,\n extraDataAttrs: extraDataAttrs\n }) : createElement(TableDowCell // we can't leverage the pure-componentness becausae the extra* props are new every time :(\n , {\n key: date.getUTCDay() + keyPostfix,\n dow: date.getUTCDay(),\n dayHeaderFormat: dateFormat,\n colSpan: colSpan,\n isSticky: isSticky,\n extraHookProps: extraHookProps,\n extraDataAttrs: extraDataAttrs\n });\n };\n\n ResourceDayHeader.prototype.buildTr = function (cells, key) {\n var renderIntro = this.props.renderIntro;\n\n if (!cells.length) {\n cells = [createElement(\"td\", {\n key: 0\n }, \"\\xA0\")];\n }\n\n return createElement(\"tr\", {\n key: key,\n role: \"row\"\n }, renderIntro && renderIntro(key), cells);\n };\n\n return ResourceDayHeader;\n}(BaseComponent);\n\nfunction buildDateFormat(dayHeaderFormat, datesRepDistinctDays, dayCnt) {\n return dayHeaderFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt);\n}\n\nvar ResourceIndex =\n/** @class */\nfunction () {\n function ResourceIndex(resources) {\n var indicesById = {};\n var ids = [];\n\n for (var i = 0; i < resources.length; i += 1) {\n var id = resources[i].id;\n ids.push(id);\n indicesById[id] = i;\n }\n\n this.ids = ids;\n this.indicesById = indicesById;\n this.length = resources.length;\n }\n\n return ResourceIndex;\n}();\n\nvar AbstractResourceDayTableModel =\n/** @class */\nfunction () {\n function AbstractResourceDayTableModel(dayTableModel, resources, context) {\n this.dayTableModel = dayTableModel;\n this.resources = resources;\n this.context = context;\n this.resourceIndex = new ResourceIndex(resources);\n this.rowCnt = dayTableModel.rowCnt;\n this.colCnt = dayTableModel.colCnt * resources.length;\n this.cells = this.buildCells();\n }\n\n AbstractResourceDayTableModel.prototype.buildCells = function () {\n var _a = this,\n rowCnt = _a.rowCnt,\n dayTableModel = _a.dayTableModel,\n resources = _a.resources;\n\n var rows = [];\n\n for (var row = 0; row < rowCnt; row += 1) {\n var rowCells = [];\n\n for (var dateCol = 0; dateCol < dayTableModel.colCnt; dateCol += 1) {\n for (var resourceCol = 0; resourceCol < resources.length; resourceCol += 1) {\n var resource = resources[resourceCol];\n var extraHookProps = {\n resource: new ResourceApi(this.context, resource)\n };\n var extraDataAttrs = {\n 'data-resource-id': resource.id\n };\n var extraClassNames = ['fc-resource'];\n var extraDateSpan = {\n resourceId: resource.id\n };\n var date = dayTableModel.cells[row][dateCol].date;\n rowCells[this.computeCol(dateCol, resourceCol)] = {\n key: resource.id + ':' + date.toISOString(),\n date: date,\n extraHookProps: extraHookProps,\n extraDataAttrs: extraDataAttrs,\n extraClassNames: extraClassNames,\n extraDateSpan: extraDateSpan\n };\n }\n }\n\n rows.push(rowCells);\n }\n\n return rows;\n };\n\n return AbstractResourceDayTableModel;\n}();\n/*\nresources over dates\n*/\n\n\nvar ResourceDayTableModel =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTableModel, _super);\n\n function ResourceDayTableModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n ResourceDayTableModel.prototype.computeCol = function (dateI, resourceI) {\n return resourceI * this.dayTableModel.colCnt + dateI;\n };\n /*\n all date ranges are intact\n */\n\n\n ResourceDayTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {\n return [{\n firstCol: this.computeCol(dateStartI, resourceI),\n lastCol: this.computeCol(dateEndI, resourceI),\n isStart: true,\n isEnd: true\n }];\n };\n\n return ResourceDayTableModel;\n}(AbstractResourceDayTableModel);\n/*\ndates over resources\n*/\n\n\nvar DayResourceTableModel =\n/** @class */\nfunction (_super) {\n __extends(DayResourceTableModel, _super);\n\n function DayResourceTableModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n DayResourceTableModel.prototype.computeCol = function (dateI, resourceI) {\n return dateI * this.resources.length + resourceI;\n };\n /*\n every single day is broken up\n */\n\n\n DayResourceTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {\n var segs = [];\n\n for (var i = dateStartI; i <= dateEndI; i += 1) {\n var col = this.computeCol(i, resourceI);\n segs.push({\n firstCol: col,\n lastCol: col,\n isStart: i === dateStartI,\n isEnd: i === dateEndI\n });\n }\n\n return segs;\n };\n\n return DayResourceTableModel;\n}(AbstractResourceDayTableModel);\n\nvar NO_SEGS = []; // for memoizing\n\nvar VResourceJoiner =\n/** @class */\nfunction () {\n function VResourceJoiner() {\n this.joinDateSelection = memoize(this.joinSegs);\n this.joinBusinessHours = memoize(this.joinSegs);\n this.joinFgEvents = memoize(this.joinSegs);\n this.joinBgEvents = memoize(this.joinSegs);\n this.joinEventDrags = memoize(this.joinInteractions);\n this.joinEventResizes = memoize(this.joinInteractions);\n }\n /*\n propSets also has a '' key for things with no resource\n */\n\n\n VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {\n var dateSelectionSets = [];\n var businessHoursSets = [];\n var fgEventSets = [];\n var bgEventSets = [];\n var eventDrags = [];\n var eventResizes = [];\n var eventSelection = '';\n var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key\n\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var key = keys_1[_i];\n var props = propSets[key];\n dateSelectionSets.push(props.dateSelectionSegs);\n businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours\n\n fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs\n\n bgEventSets.push(props.bgEventSegs);\n eventDrags.push(props.eventDrag);\n eventResizes.push(props.eventResize);\n eventSelection = eventSelection || props.eventSelection;\n }\n\n return {\n dateSelectionSegs: this.joinDateSelection.apply(this, __spreadArray([resourceDayTable], dateSelectionSets)),\n businessHourSegs: this.joinBusinessHours.apply(this, __spreadArray([resourceDayTable], businessHoursSets)),\n fgEventSegs: this.joinFgEvents.apply(this, __spreadArray([resourceDayTable], fgEventSets)),\n bgEventSegs: this.joinBgEvents.apply(this, __spreadArray([resourceDayTable], bgEventSets)),\n eventDrag: this.joinEventDrags.apply(this, __spreadArray([resourceDayTable], eventDrags)),\n eventResize: this.joinEventResizes.apply(this, __spreadArray([resourceDayTable], eventResizes)),\n eventSelection: eventSelection\n };\n };\n\n VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {\n var segGroups = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n segGroups[_i - 1] = arguments[_i];\n }\n\n var resourceCnt = resourceDayTable.resources.length;\n var transformedSegs = [];\n\n for (var i = 0; i < resourceCnt; i += 1) {\n for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {\n var seg = _b[_a];\n transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));\n }\n\n for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) {\n // one beyond. the all-resource\n var seg = _d[_c];\n transformedSegs.push.apply( // one beyond. the all-resource\n transformedSegs, this.transformSeg(seg, resourceDayTable, i));\n }\n }\n\n return transformedSegs;\n };\n /*\n for expanding non-resource segs to all resources.\n only for public use.\n no memoizing.\n */\n\n\n VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {\n var resourceCnt = resourceDayTable.resources.length;\n var transformedSegs = [];\n\n for (var i = 0; i < resourceCnt; i += 1) {\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));\n }\n }\n\n return transformedSegs;\n };\n\n VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {\n var interactions = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n interactions[_i - 1] = arguments[_i];\n }\n\n var resourceCnt = resourceDayTable.resources.length;\n var affectedInstances = {};\n var transformedSegs = [];\n var anyInteractions = false;\n var isEvent = false;\n\n for (var i = 0; i < resourceCnt; i += 1) {\n var interaction = interactions[i];\n\n if (interaction) {\n anyInteractions = true;\n\n for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {\n var seg = _b[_a];\n transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));\n }\n\n __assign(affectedInstances, interaction.affectedInstances);\n\n isEvent = isEvent || interaction.isEvent;\n }\n\n if (interactions[resourceCnt]) {\n // one beyond. the all-resource\n for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {\n var seg = _d[_c];\n transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));\n }\n }\n }\n\n if (anyInteractions) {\n return {\n affectedInstances: affectedInstances,\n segs: transformedSegs,\n isEvent: isEvent\n };\n }\n\n return null;\n };\n\n return VResourceJoiner;\n}();\n/*\nTODO: just use ResourceHash somehow? could then use the generic ResourceSplitter\n*/\n\n\nvar VResourceSplitter =\n/** @class */\nfunction (_super) {\n __extends(VResourceSplitter, _super);\n\n function VResourceSplitter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n VResourceSplitter.prototype.getKeyInfo = function (props) {\n var resourceDayTableModel = props.resourceDayTableModel;\n var hash = mapHash(resourceDayTableModel.resourceIndex.indicesById, function (i) {\n return resourceDayTableModel.resources[i];\n }); // :(\n\n hash[''] = {};\n return hash;\n };\n\n VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {\n return [dateSpan.resourceId || ''];\n };\n\n VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {\n var resourceIds = eventDef.resourceIds;\n\n if (!resourceIds.length) {\n return [''];\n }\n\n return resourceIds;\n };\n\n return VResourceSplitter;\n}(Splitter);\n/*\ndoesn't accept grouping\n*/\n\n\nfunction flattenResources(resourceStore, orderSpecs) {\n return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true).map(function (node) {\n return node.resource;\n });\n}\n\nfunction buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {\n var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);\n var flatNodes = [];\n flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);\n return flatNodes;\n}\n\nfunction flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {\n for (var i = 0; i < complexNodes.length; i += 1) {\n var complexNode = complexNodes[i];\n var group = complexNode.group;\n\n if (group) {\n if (isVGrouping) {\n var firstRowIndex = res.length;\n var rowSpanIndex = rowSpans.length;\n flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);\n\n if (firstRowIndex < res.length) {\n var firstRow = res[firstRowIndex];\n var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();\n firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;\n }\n } else {\n var id = group.spec.field + ':' + group.value;\n var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;\n res.push({\n id: id,\n group: group,\n isExpanded: isExpanded\n });\n\n if (isExpanded) {\n flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);\n }\n }\n } else if (complexNode.resource) {\n var id = complexNode.resource.id;\n var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;\n res.push({\n id: id,\n rowSpans: rowSpans,\n depth: depth,\n isExpanded: isExpanded,\n hasChildren: Boolean(complexNode.children.length),\n resource: complexNode.resource,\n resourceFields: complexNode.resourceFields\n });\n\n if (isExpanded) {\n flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);\n }\n }\n }\n}\n\nfunction buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {\n var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);\n var builtNodes = [];\n\n for (var resourceId in resourceNodes) {\n var resourceNode = resourceNodes[resourceId];\n\n if (!resourceNode.resource.parentId) {\n insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);\n }\n }\n\n return builtNodes;\n}\n\nfunction buildResourceNodes(resourceStore, orderSpecs) {\n var nodeHash = {};\n\n for (var resourceId in resourceStore) {\n var resource = resourceStore[resourceId];\n nodeHash[resourceId] = {\n resource: resource,\n resourceFields: buildResourceFields(resource),\n children: []\n };\n }\n\n for (var resourceId in resourceStore) {\n var resource = resourceStore[resourceId];\n\n if (resource.parentId) {\n var parentNode = nodeHash[resource.parentId];\n\n if (parentNode) {\n insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);\n }\n }\n }\n\n return nodeHash;\n}\n\nfunction insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {\n if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {\n var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);\n insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);\n } else {\n insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);\n }\n}\n\nfunction ensureGroupNodes(resourceNode, nodes, groupSpec) {\n var groupValue = resourceNode.resourceFields[groupSpec.field];\n var groupNode;\n var newGroupIndex; // find an existing group that matches, or determine the position for a new group\n\n if (groupSpec.order) {\n for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex += 1) {\n var node = nodes[newGroupIndex];\n\n if (node.group) {\n var cmp = flexibleCompare(groupValue, node.group.value) * groupSpec.order;\n\n if (cmp === 0) {\n groupNode = node;\n break;\n } else if (cmp < 0) {\n break;\n }\n }\n }\n } else {\n // the groups are unordered\n for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex += 1) {\n var node = nodes[newGroupIndex];\n\n if (node.group && groupValue === node.group.value) {\n groupNode = node;\n break;\n }\n }\n }\n\n if (!groupNode) {\n groupNode = {\n group: {\n value: groupValue,\n spec: groupSpec\n },\n children: []\n };\n nodes.splice(newGroupIndex, 0, groupNode);\n }\n\n return groupNode;\n}\n\nfunction insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {\n var i;\n\n for (i = 0; i < siblings.length; i += 1) {\n var cmp = compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs); // TODO: pass in ResourceApi?\n\n if (cmp > 0) {\n // went 1 past. insert at i\n break;\n }\n }\n\n siblings.splice(i, 0, resourceNode);\n}\n\nfunction buildResourceFields(resource) {\n var obj = __assign(__assign(__assign({}, resource.extendedProps), resource.ui), resource);\n\n delete obj.ui;\n delete obj.extendedProps;\n return obj;\n}\n\nfunction isGroupsEqual(group0, group1) {\n return group0.spec === group1.spec && group0.value === group1.value;\n}\n\nvar main = createPlugin({\n deps: [premiumCommonPlugin],\n reducers: [reduceResources],\n isLoadingFuncs: [function (state) {\n return state.resourceSource && state.resourceSource.isFetching;\n }],\n eventRefiners: EVENT_REFINERS,\n eventDefMemberAdders: [generateEventDefResourceMembers],\n isDraggableTransformers: [transformIsDraggable],\n eventDragMutationMassagers: [massageEventDragMutation],\n eventDefMutationAppliers: [applyEventDefMutation],\n dateSelectionTransformers: [transformDateSelectionJoin],\n datePointTransforms: [transformDatePoint],\n dateSpanTransforms: [transformDateSpan],\n viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],\n isPropsValid: isPropsValidWithResources,\n externalDefTransforms: [transformExternalDef],\n eventDropTransformers: [transformEventDrop],\n optionChangeHandlers: optionChangeHandlers,\n optionRefiners: OPTION_REFINERS,\n listenerRefiners: LISTENER_REFINERS,\n propSetHandlers: {\n resourceStore: handleResourceStore\n }\n});\nexport default main;\nexport { AbstractResourceDayTableModel, DEFAULT_RESOURCE_ORDER, DayResourceTableModel, ResourceApi, ResourceDayHeader, ResourceDayTableModel, ResourceLabelRoot, ResourceSplitter, VResourceJoiner, VResourceSplitter, buildResourceFields, buildRowNodes, flattenResources, getPublicId, isGroupsEqual };","/*!\nFullCalendar Scheduler v5.11.3\nDocs & License: https://fullcalendar.io/scheduler\n(c) 2022 Adam Shaw\n*/\nimport { createRef, mapHash, createElement, DateComponent, memoize, createPlugin } from '@fullcalendar/common';\nimport premiumCommonPlugin from '@fullcalendar/premium-common';\nimport resourceCommonPlugin, { VResourceJoiner, VResourceSplitter, flattenResources, DEFAULT_RESOURCE_ORDER, ResourceDayHeader, DayResourceTableModel, ResourceDayTableModel } from '@fullcalendar/resource-common';\nimport dayGridPlugin, { DayTableSlicer, Table, TableView, buildDayTableModel } from '@fullcalendar/daygrid';\nimport { __extends, __assign } from 'tslib';\n\nvar ResourceDayTableJoiner =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTableJoiner, _super);\n\n function ResourceDayTableJoiner() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n ResourceDayTableJoiner.prototype.transformSeg = function (seg, resourceDayTableModel, resourceI) {\n var colRanges = resourceDayTableModel.computeColRanges(seg.firstCol, seg.lastCol, resourceI);\n return colRanges.map(function (colRange) {\n return __assign(__assign(__assign({}, seg), colRange), {\n isStart: seg.isStart && colRange.isStart,\n isEnd: seg.isEnd && colRange.isEnd\n });\n });\n };\n\n return ResourceDayTableJoiner;\n}(VResourceJoiner);\n\nvar ResourceDayTable =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTable, _super);\n\n function ResourceDayTable() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.splitter = new VResourceSplitter();\n _this.slicers = {};\n _this.joiner = new ResourceDayTableJoiner();\n _this.tableRef = createRef();\n\n _this.isHitComboAllowed = function (hit0, hit1) {\n var allowAcrossResources = _this.props.resourceDayTableModel.dayTableModel.colCnt === 1;\n return allowAcrossResources || hit0.dateSpan.resourceId === hit1.dateSpan.resourceId;\n };\n\n return _this;\n }\n\n ResourceDayTable.prototype.render = function () {\n var _this = this;\n\n var _a = this,\n props = _a.props,\n context = _a.context;\n\n var resourceDayTableModel = props.resourceDayTableModel,\n nextDayThreshold = props.nextDayThreshold,\n dateProfile = props.dateProfile;\n var splitProps = this.splitter.splitProps(props);\n this.slicers = mapHash(splitProps, function (split, resourceId) {\n return _this.slicers[resourceId] || new DayTableSlicer();\n });\n var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {\n return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, context, resourceDayTableModel.dayTableModel);\n });\n return createElement(Table, __assign({\n forPrint: props.forPrint,\n ref: this.tableRef\n }, this.joiner.joinProps(slicedProps, resourceDayTableModel), {\n cells: resourceDayTableModel.cells,\n dateProfile: dateProfile,\n colGroupNode: props.colGroupNode,\n tableMinWidth: props.tableMinWidth,\n renderRowIntro: props.renderRowIntro,\n dayMaxEvents: props.dayMaxEvents,\n dayMaxEventRows: props.dayMaxEventRows,\n showWeekNumbers: props.showWeekNumbers,\n expandRows: props.expandRows,\n headerAlignElRef: props.headerAlignElRef,\n clientWidth: props.clientWidth,\n clientHeight: props.clientHeight,\n isHitComboAllowed: this.isHitComboAllowed\n }));\n };\n\n return ResourceDayTable;\n}(DateComponent);\n\nvar ResourceDayTableView =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTableView, _super);\n\n function ResourceDayTableView() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.flattenResources = memoize(flattenResources);\n _this.buildResourceDayTableModel = memoize(buildResourceDayTableModel);\n _this.headerRef = createRef();\n _this.tableRef = createRef();\n return _this;\n }\n\n ResourceDayTableView.prototype.render = function () {\n var _this = this;\n\n var _a = this,\n props = _a.props,\n context = _a.context;\n\n var options = context.options;\n var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER;\n var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs);\n var resourceDayTableModel = this.buildResourceDayTableModel(props.dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context);\n var headerContent = options.dayHeaders && createElement(ResourceDayHeader, {\n ref: this.headerRef,\n resources: resources,\n dateProfile: props.dateProfile,\n dates: resourceDayTableModel.dayTableModel.headerDates,\n datesRepDistinctDays: true\n });\n\n var bodyContent = function bodyContent(contentArg) {\n return createElement(ResourceDayTable, {\n ref: _this.tableRef,\n dateProfile: props.dateProfile,\n resourceDayTableModel: resourceDayTableModel,\n businessHours: props.businessHours,\n eventStore: props.eventStore,\n eventUiBases: props.eventUiBases,\n dateSelection: props.dateSelection,\n eventSelection: props.eventSelection,\n eventDrag: props.eventDrag,\n eventResize: props.eventResize,\n nextDayThreshold: options.nextDayThreshold,\n tableMinWidth: contentArg.tableMinWidth,\n colGroupNode: contentArg.tableColGroupNode,\n dayMaxEvents: options.dayMaxEvents,\n dayMaxEventRows: options.dayMaxEventRows,\n showWeekNumbers: options.weekNumbers,\n expandRows: !props.isHeightAuto,\n headerAlignElRef: _this.headerElRef,\n clientWidth: contentArg.clientWidth,\n clientHeight: contentArg.clientHeight,\n forPrint: props.forPrint\n });\n };\n\n return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, resourceDayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent);\n };\n\n return ResourceDayTableView;\n}(TableView);\n\nfunction buildResourceDayTableModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) {\n var dayTable = buildDayTableModel(dateProfile, dateProfileGenerator);\n return datesAboveResources ? new DayResourceTableModel(dayTable, resources, context) : new ResourceDayTableModel(dayTable, resources, context);\n}\n\nvar main = createPlugin({\n deps: [premiumCommonPlugin, resourceCommonPlugin, dayGridPlugin],\n initialView: 'resourceDayGridDay',\n views: {\n resourceDayGrid: {\n type: 'dayGrid',\n component: ResourceDayTableView,\n needsResourceData: true\n },\n resourceDayGridDay: {\n type: 'resourceDayGrid',\n duration: {\n days: 1\n }\n },\n resourceDayGridWeek: {\n type: 'resourceDayGrid',\n duration: {\n weeks: 1\n }\n },\n resourceDayGridMonth: {\n type: 'resourceDayGrid',\n duration: {\n months: 1\n },\n // TODO: wish we didn't have to C&P from dayGrid's file\n monthMode: true,\n fixedWeekCount: true\n }\n }\n});\nexport default main;\nexport { ResourceDayTable, ResourceDayTableView };","/*!\nFullCalendar Scheduler v5.11.3\nDocs & License: https://fullcalendar.io/scheduler\n(c) 2022 Adam Shaw\n*/\nimport { memoize, createRef, mapHash, createElement, NowTimer, DateComponent, createPlugin } from '@fullcalendar/common';\nimport premiumCommonPlugin from '@fullcalendar/premium-common';\nimport resourceCommonPlugin, { VResourceJoiner, VResourceSplitter, flattenResources, DEFAULT_RESOURCE_ORDER, ResourceDayHeader, DayResourceTableModel, ResourceDayTableModel } from '@fullcalendar/resource-common';\nimport timeGridPlugin, { buildDayRanges, DayTimeColsSlicer, TimeCols, buildSlatMetas, TimeColsView, buildTimeColsModel } from '@fullcalendar/timegrid';\nimport { __extends, __assign } from 'tslib';\nimport { ResourceDayTable } from '@fullcalendar/resource-daygrid';\n\nvar ResourceDayTimeColsJoiner =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTimeColsJoiner, _super);\n\n function ResourceDayTimeColsJoiner() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n ResourceDayTimeColsJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {\n return [__assign(__assign({}, seg), {\n col: resourceDayTable.computeCol(seg.col, resourceI)\n })];\n };\n\n return ResourceDayTimeColsJoiner;\n}(VResourceJoiner);\n\nvar ResourceDayTimeCols =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTimeCols, _super);\n\n function ResourceDayTimeCols() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.buildDayRanges = memoize(buildDayRanges);\n _this.splitter = new VResourceSplitter();\n _this.slicers = {};\n _this.joiner = new ResourceDayTimeColsJoiner();\n _this.timeColsRef = createRef();\n\n _this.isHitComboAllowed = function (hit0, hit1) {\n var allowAcrossResources = _this.dayRanges.length === 1;\n return allowAcrossResources || hit0.dateSpan.resourceId === hit1.dateSpan.resourceId;\n };\n\n return _this;\n }\n\n ResourceDayTimeCols.prototype.render = function () {\n var _this = this;\n\n var _a = this,\n props = _a.props,\n context = _a.context;\n\n var dateEnv = context.dateEnv,\n options = context.options;\n var dateProfile = props.dateProfile,\n resourceDayTableModel = props.resourceDayTableModel;\n var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTableModel.dayTableModel, dateProfile, dateEnv);\n var splitProps = this.splitter.splitProps(props);\n this.slicers = mapHash(splitProps, function (split, resourceId) {\n return _this.slicers[resourceId] || new DayTimeColsSlicer();\n });\n var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {\n return slicer.sliceProps(splitProps[resourceId], dateProfile, null, context, dayRanges);\n });\n return (// TODO: would move this further down hierarchy, but sliceNowDate needs it\n createElement(NowTimer, {\n unit: options.nowIndicator ? 'minute' : 'day'\n }, function (nowDate, todayRange) {\n return createElement(TimeCols, __assign({\n ref: _this.timeColsRef\n }, _this.joiner.joinProps(slicedProps, resourceDayTableModel), {\n dateProfile: dateProfile,\n axis: props.axis,\n slotDuration: props.slotDuration,\n slatMetas: props.slatMetas,\n cells: resourceDayTableModel.cells[0],\n tableColGroupNode: props.tableColGroupNode,\n tableMinWidth: props.tableMinWidth,\n clientWidth: props.clientWidth,\n clientHeight: props.clientHeight,\n expandRows: props.expandRows,\n nowDate: nowDate,\n nowIndicatorSegs: options.nowIndicator && _this.buildNowIndicatorSegs(nowDate),\n todayRange: todayRange,\n onScrollTopRequest: props.onScrollTopRequest,\n forPrint: props.forPrint,\n onSlatCoords: props.onSlatCoords,\n isHitComboAllowed: _this.isHitComboAllowed\n }));\n })\n );\n };\n\n ResourceDayTimeCols.prototype.buildNowIndicatorSegs = function (date) {\n var nonResourceSegs = this.slicers[''].sliceNowDate(date, this.context, this.dayRanges);\n return this.joiner.expandSegs(this.props.resourceDayTableModel, nonResourceSegs);\n };\n\n return ResourceDayTimeCols;\n}(DateComponent);\n\nvar ResourceDayTimeColsView =\n/** @class */\nfunction (_super) {\n __extends(ResourceDayTimeColsView, _super);\n\n function ResourceDayTimeColsView() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.flattenResources = memoize(flattenResources);\n _this.buildResourceTimeColsModel = memoize(buildResourceTimeColsModel);\n _this.buildSlatMetas = memoize(buildSlatMetas);\n return _this;\n }\n\n ResourceDayTimeColsView.prototype.render = function () {\n var _this = this;\n\n var _a = this,\n props = _a.props,\n context = _a.context;\n\n var options = context.options,\n dateEnv = context.dateEnv;\n var dateProfile = props.dateProfile;\n var splitProps = this.allDaySplitter.splitProps(props);\n var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER;\n var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs);\n var resourceDayTableModel = this.buildResourceTimeColsModel(dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context);\n var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv);\n var dayMinWidth = options.dayMinWidth;\n var hasAttachedAxis = !dayMinWidth;\n var hasDetachedAxis = dayMinWidth;\n var headerContent = options.dayHeaders && createElement(ResourceDayHeader, {\n resources: resources,\n dates: resourceDayTableModel.dayTableModel.headerDates,\n dateProfile: dateProfile,\n datesRepDistinctDays: true,\n renderIntro: hasAttachedAxis ? this.renderHeadAxis : null\n });\n\n var allDayContent = options.allDaySlot !== false && function (contentArg) {\n return createElement(ResourceDayTable, __assign({}, splitProps.allDay, {\n dateProfile: dateProfile,\n resourceDayTableModel: resourceDayTableModel,\n nextDayThreshold: options.nextDayThreshold,\n tableMinWidth: contentArg.tableMinWidth,\n colGroupNode: contentArg.tableColGroupNode,\n renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null,\n showWeekNumbers: false,\n expandRows: false,\n headerAlignElRef: _this.headerElRef,\n clientWidth: contentArg.clientWidth,\n clientHeight: contentArg.clientHeight,\n forPrint: props.forPrint\n }, _this.getAllDayMaxEventProps()));\n };\n\n var timeGridContent = function timeGridContent(contentArg) {\n return createElement(ResourceDayTimeCols, __assign({}, splitProps.timed, {\n dateProfile: dateProfile,\n axis: hasAttachedAxis,\n slotDuration: options.slotDuration,\n slatMetas: slatMetas,\n resourceDayTableModel: resourceDayTableModel,\n tableColGroupNode: contentArg.tableColGroupNode,\n tableMinWidth: contentArg.tableMinWidth,\n clientWidth: contentArg.clientWidth,\n clientHeight: contentArg.clientHeight,\n onSlatCoords: _this.handleSlatCoords,\n expandRows: contentArg.expandRows,\n forPrint: props.forPrint,\n onScrollTopRequest: _this.handleScrollTopRequest\n }));\n };\n\n return hasDetachedAxis ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, resourceDayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent);\n };\n\n return ResourceDayTimeColsView;\n}(TimeColsView);\n\nfunction buildResourceTimeColsModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) {\n var dayTable = buildTimeColsModel(dateProfile, dateProfileGenerator);\n return datesAboveResources ? new DayResourceTableModel(dayTable, resources, context) : new ResourceDayTableModel(dayTable, resources, context);\n}\n\nvar main = createPlugin({\n deps: [premiumCommonPlugin, resourceCommonPlugin, timeGridPlugin],\n initialView: 'resourceTimeGridDay',\n views: {\n resourceTimeGrid: {\n type: 'timeGrid',\n component: ResourceDayTimeColsView,\n needsResourceData: true\n },\n resourceTimeGridDay: {\n type: 'resourceTimeGrid',\n duration: {\n days: 1\n }\n },\n resourceTimeGridWeek: {\n type: 'resourceTimeGrid',\n duration: {\n weeks: 1\n }\n }\n }\n});\nexport default main;\nexport { ResourceDayTimeCols, ResourceDayTimeColsView };","var api = require(\"!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../css-loader/dist/cjs.js??ref--6-1!../../postcss-loader/src/index.js??ref--6-2!./main.css\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","/*!\nFullCalendar v5.11.3\nDocs & License: https://fullcalendar.io/\n(c) 2022 Adam Shaw\n*/\nimport './main.css';\nimport { hasBgRendering, Splitter, createFormatter, createElement, ViewContextType, RenderHook, BaseComponent, createRef, diffDays, buildNavLinkAttrs, WeekNumberRoot, getStickyHeaderDates, ViewRoot, SimpleScrollGrid, getStickyFooterScrollbar, NowTimer, NowIndicatorRoot, renderScrollShim, DateComponent, rangeContainsMarker, startOfDay, asRoughMs, createDuration, RefMap, PositionCache, MoreLinkRoot, setRef, SegHierarchy, groupIntersectingEntries, buildEntryKey, binarySearch, getEntrySpanEnd, StandardEvent, DayCellContent, Fragment, getSegMeta, memoize, sortEventSegs, DayCellRoot, buildIsoString, computeEarliestSegStart, buildEventRangeKey, BgEvent, renderFill, addDurations, multiplyDuration, wholeDivideDurations, intersectRanges, Slicer, formatIsoTimeString, DayHeader, DaySeriesModel, DayTableModel, createPlugin } from '@fullcalendar/common';\nimport { __extends, __assign } from 'tslib';\nimport { DayTable } from '@fullcalendar/daygrid';\n\nvar AllDaySplitter =\n/** @class */\nfunction (_super) {\n __extends(AllDaySplitter, _super);\n\n function AllDaySplitter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n AllDaySplitter.prototype.getKeyInfo = function () {\n return {\n allDay: {},\n timed: {}\n };\n };\n\n AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {\n if (dateSpan.allDay) {\n return ['allDay'];\n }\n\n return ['timed'];\n };\n\n AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {\n if (!eventDef.allDay) {\n return ['timed'];\n }\n\n if (hasBgRendering(eventDef)) {\n return ['timed', 'allDay'];\n }\n\n return ['allDay'];\n };\n\n return AllDaySplitter;\n}(Splitter);\n\nvar DEFAULT_SLAT_LABEL_FORMAT = createFormatter({\n hour: 'numeric',\n minute: '2-digit',\n omitZeroMinute: true,\n meridiem: 'short'\n});\n\nfunction TimeColsAxisCell(props) {\n var classNames = ['fc-timegrid-slot', 'fc-timegrid-slot-label', props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor'];\n return createElement(ViewContextType.Consumer, null, function (context) {\n if (!props.isLabeled) {\n return createElement(\"td\", {\n className: classNames.join(' '),\n \"data-time\": props.isoTimeStr\n });\n }\n\n var dateEnv = context.dateEnv,\n options = context.options,\n viewApi = context.viewApi;\n var labelFormat = // TODO: fully pre-parse\n options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : Array.isArray(options.slotLabelFormat) ? createFormatter(options.slotLabelFormat[0]) : createFormatter(options.slotLabelFormat);\n var hookProps = {\n level: 0,\n time: props.time,\n date: dateEnv.toDate(props.date),\n view: viewApi,\n text: dateEnv.format(props.date, labelFormat)\n };\n return createElement(RenderHook, {\n hookProps: hookProps,\n classNames: options.slotLabelClassNames,\n content: options.slotLabelContent,\n defaultContent: renderInnerContent,\n didMount: options.slotLabelDidMount,\n willUnmount: options.slotLabelWillUnmount\n }, function (rootElRef, customClassNames, innerElRef, innerContent) {\n return createElement(\"td\", {\n ref: rootElRef,\n className: classNames.concat(customClassNames).join(' '),\n \"data-time\": props.isoTimeStr\n }, createElement(\"div\", {\n className: \"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame\"\n }, createElement(\"div\", {\n className: \"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion\",\n ref: innerElRef\n }, innerContent)));\n });\n });\n}\n\nfunction renderInnerContent(props) {\n return props.text;\n}\n\nvar TimeBodyAxis =\n/** @class */\nfunction (_super) {\n __extends(TimeBodyAxis, _super);\n\n function TimeBodyAxis() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n TimeBodyAxis.prototype.render = function () {\n return this.props.slatMetas.map(function (slatMeta) {\n return createElement(\"tr\", {\n key: slatMeta.key\n }, createElement(TimeColsAxisCell, __assign({}, slatMeta)));\n });\n };\n\n return TimeBodyAxis;\n}(BaseComponent);\n\nvar DEFAULT_WEEK_NUM_FORMAT = createFormatter({\n week: 'short'\n});\nvar AUTO_ALL_DAY_MAX_EVENT_ROWS = 5;\n\nvar TimeColsView =\n/** @class */\nfunction (_super) {\n __extends(TimeColsView, _super);\n\n function TimeColsView() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n\n _this.allDaySplitter = new AllDaySplitter(); // for use by subclasses\n\n _this.headerElRef = createRef();\n _this.rootElRef = createRef();\n _this.scrollerElRef = createRef();\n _this.state = {\n slatCoords: null\n };\n\n _this.handleScrollTopRequest = function (scrollTop) {\n var scrollerEl = _this.scrollerElRef.current;\n\n if (scrollerEl) {\n // TODO: not sure how this could ever be null. weirdness with the reducer\n scrollerEl.scrollTop = scrollTop;\n }\n };\n /* Header Render Methods\n ------------------------------------------------------------------------------------------------------------------*/\n\n\n _this.renderHeadAxis = function (rowKey, frameHeight) {\n if (frameHeight === void 0) {\n frameHeight = '';\n }\n\n var options = _this.context.options;\n var dateProfile = _this.props.dateProfile;\n var range = dateProfile.renderRange;\n var dayCnt = diffDays(range.start, range.end);\n var navLinkAttrs = dayCnt === 1 ? // only do in day views (to avoid doing in week views that dont need it)\n buildNavLinkAttrs(_this.context, range.start, 'week') : {};\n\n if (options.weekNumbers && rowKey === 'day') {\n return createElement(WeekNumberRoot, {\n date: range.start,\n defaultFormat: DEFAULT_WEEK_NUM_FORMAT\n }, function (rootElRef, classNames, innerElRef, innerContent) {\n return createElement(\"th\", {\n ref: rootElRef,\n \"aria-hidden\": true,\n className: ['fc-timegrid-axis', 'fc-scrollgrid-shrink'].concat(classNames).join(' ')\n }, createElement(\"div\", {\n className: \"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid\",\n style: {\n height: frameHeight\n }\n }, createElement(\"a\", __assign({\n ref: innerElRef,\n className: \"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner\"\n }, navLinkAttrs), innerContent)));\n });\n }\n\n return createElement(\"th\", {\n \"aria-hidden\": true,\n className: \"fc-timegrid-axis\"\n }, createElement(\"div\", {\n className: \"fc-timegrid-axis-frame\",\n style: {\n height: frameHeight\n }\n }));\n };\n /* Table Component Render Methods\n ------------------------------------------------------------------------------------------------------------------*/\n // only a one-way height sync. we don't send the axis inner-content height to the DayGrid,\n // but DayGrid still needs to have classNames on inner elements in order to measure.\n\n\n _this.renderTableRowAxis = function (rowHeight) {\n var _a = _this.context,\n options = _a.options,\n viewApi = _a.viewApi;\n var hookProps = {\n text: options.allDayText,\n view: viewApi\n };\n return (// TODO: make reusable hook. used in list view too\n createElement(RenderHook, {\n hookProps: hookProps,\n classNames: options.allDayClassNames,\n content: options.allDayContent,\n defaultContent: renderAllDayInner,\n didMount: options.allDayDidMount,\n willUnmount: options.allDayWillUnmount\n }, function (rootElRef, classNames, innerElRef, innerContent) {\n return createElement(\"td\", {\n ref: rootElRef,\n \"aria-hidden\": true,\n className: ['fc-timegrid-axis', 'fc-scrollgrid-shrink'].concat(classNames).join(' ')\n }, createElement(\"div\", {\n className: 'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame' + (rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : ''),\n style: {\n height: rowHeight\n }\n }, createElement(\"span\", {\n className: \"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner\",\n ref: innerElRef\n }, innerContent)));\n })\n );\n };\n\n _this.handleSlatCoords = function (slatCoords) {\n _this.setState({\n slatCoords: slatCoords\n });\n };\n\n return _this;\n } // rendering\n // ----------------------------------------------------------------------------------------------------\n\n\n TimeColsView.prototype.renderSimpleLayout = function (headerRowContent, allDayContent, timeContent) {\n var _a = this,\n context = _a.context,\n props = _a.props;\n\n var sections = [];\n var stickyHeaderDates = getStickyHeaderDates(context.options);\n\n if (headerRowContent) {\n sections.push({\n type: 'header',\n key: 'header',\n isSticky: stickyHeaderDates,\n chunk: {\n elRef: this.headerElRef,\n tableClassName: 'fc-col-header',\n rowContent: headerRowContent\n }\n });\n }\n\n if (allDayContent) {\n sections.push({\n type: 'body',\n key: 'all-day',\n chunk: {\n content: allDayContent\n }\n });\n sections.push({\n type: 'body',\n key: 'all-day-divider',\n outerContent: // TODO: rename to cellContent so don't need to define |
---|