From 36467d1375d3a96902030b9465d390e0552d94dd Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 13 Mar 2020 14:22:41 +0100 Subject: [PATCH 001/175] Fix logging out behaviour after refreshing any page --- tensorhive/app/web/dev/src/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorhive/app/web/dev/src/main.js b/tensorhive/app/web/dev/src/main.js index 4850a023..3718a6dd 100644 --- a/tensorhive/app/web/dev/src/main.js +++ b/tensorhive/app/web/dev/src/main.js @@ -41,7 +41,7 @@ axios.get('static/config.json').then(response => { } if (version === null) { if (config.version !== undefined) { - window.localStorage.setItem('version', JSON.stringify(config.apiVersion)) + window.localStorage.setItem('version', JSON.stringify(config.version)) } else { window.localStorage.setItem('version', JSON.stringify('no data in config file')) } From 41d5dc60d9fc4d0ab68c9598e9a05c216dd9c914 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 13 Mar 2020 14:04:52 +0100 Subject: [PATCH 002/175] Add tail mode and refresh feature to the log preview --- .../src/components/views/TasksOverview.vue | 17 +++--- .../views/tasks_overview/TaskLog.vue | 54 +++++++++++++++++-- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/tensorhive/app/web/dev/src/components/views/TasksOverview.vue b/tensorhive/app/web/dev/src/components/views/TasksOverview.vue index 4844b5fc..04c9c975 100644 --- a/tensorhive/app/web/dev/src/components/views/TasksOverview.vue +++ b/tensorhive/app/web/dev/src/components/views/TasksOverview.vue @@ -40,7 +40,13 @@ :multipleFlag="multipleFlag" :selected="selected" /> - + @@ -587,27 +593,26 @@ export default { } }, - getLog: function (id) { + getLog: function (id, tailMode = false) { + this.taskId = id if (!this.actionFlag) { this.snackbar = true this.actionFlag = true api - .request('get', '/tasks/' + id + '/log', this.$store.state.accessToken) + .request('get', '/tasks/' + id + '/log?tail=' + tailMode, this.$store.state.accessToken) .then(response => { this.logs = response.data.output_lines this.path = response.data.path this.showModalLog = true - this.snackbar = false - this.actionFlag = false }) .catch(error => { this.handleError(error) + }).finally(() => { this.snackbar = false this.actionFlag = false }) } }, - openFromTemplate: function (chosenTemplate) { this.chosenTemplate = chosenTemplate this.showModalCreate = true diff --git a/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue b/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue index bf33cd83..5107146f 100644 --- a/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue +++ b/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue @@ -14,7 +14,36 @@ > close - Task log + + Task log + + refresh + + + + + + {{path}} @@ -33,11 +62,15 @@ export default { props: { showModal: Boolean, lines: Array, - path: String + path: String, + taskId: Number }, data () { return { - show: false + show: false, + tailMode: false, + autoRefresh: false, + autoRefreshIntervalId: -1 } }, watch: { @@ -51,6 +84,21 @@ export default { methods: { close: function () { this.$emit('close') + }, + refresh: function () { + this.$emit('getLog', this.taskId, this.tailMode) + if (this.autoRefresh && !this.tailMode) { + this.autoRefresh = false + this.toggleAutoRefresh() + } + }, + toggleAutoRefresh: function () { + if (this.autoRefresh) { + this.autoRefreshIntervalId = window.setInterval(this.refresh, 5000) + } else { + window.clearInterval(this.autoRefreshIntervalId) + this.autoRefreshIntervalId = -1 + } } } } From adb3f96d3cae00d4d8d8e84da763c13333fedb4f Mon Sep 17 00:00:00 2001 From: mateusz Date: Sat, 14 Mar 2020 17:37:58 +0100 Subject: [PATCH 003/175] Change resolution of time selection --- .../components/views/reserve_resources/FullCalendarInfo.vue | 4 ++-- .../views/reserve_resources/FullCalendarReserve.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarInfo.vue b/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarInfo.vue index 06f2027b..cae9dec0 100644 --- a/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarInfo.vue +++ b/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarInfo.vue @@ -103,7 +103,7 @@ v-if="startTimeMenu" v-model="newStartTime" full-width - :allowed-minutes="m => m % 30 === 0" + :allowed-minutes="m => m % 5 === 0" format="24hr" @click:minute="$refs.startMenu.save(newStartTime)" > @@ -156,7 +156,7 @@ v-if="endTimeMenu" v-model="newEndTime" full-width - :allowed-minutes="m => m % 30 === 0" + :allowed-minutes="m => m % 5 === 0" format="24hr" @click:minute="$refs.endMenu.save(newEndTime)" > diff --git a/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarReserve.vue b/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarReserve.vue index d74224f4..e0044b3a 100644 --- a/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarReserve.vue +++ b/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendarReserve.vue @@ -81,7 +81,7 @@ v-if="startTimeMenu" v-model="newStartTime" full-width - :allowed-minutes="m => m % 30 === 0" + :allowed-minutes="m => m % 5 === 0" format="24hr" @click:minute="$refs.startMenu.save(newStartTime)" > @@ -136,7 +136,7 @@ v-if="endTimeMenu" v-model="newEndTime" full-width - :allowed-minutes="m => m % 30 === 0" + :allowed-minutes="m => m % 5 === 0" format="24hr" @click:minute="$refs.endMenu.save(newEndTime)" > From 8293d0ef3b3493eb4bab2e1dbead005d5c775a0d Mon Sep 17 00:00:00 2001 From: mateusz Date: Sun, 15 Mar 2020 03:07:34 +0100 Subject: [PATCH 004/175] Don't require re-selecting checkbox --- .../views/reserve_resources/FullCalendar.vue | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendar.vue b/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendar.vue index ae60eb40..2d1c4243 100644 --- a/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendar.vue +++ b/tensorhive/app/web/dev/src/components/views/reserve_resources/FullCalendar.vue @@ -103,14 +103,29 @@ export default { this.$emit('handleError', error) }) var obj + var previousCheckboxes = [] + var previousLength = this.resourcesCheckboxes.length + for (i = 0; i < previousLength; i++) { + obj = { + uuid: this.resourcesCheckboxes[i].uuid, + checked: this.resourcesCheckboxes[i].checked + } + previousCheckboxes[i] = obj + } this.resourcesCheckboxes = [] for (i = 0; i < this.selectedResources.length; i++) { + var previousChecked = false + for (var j = 0; j < previousLength; j++) { + if (this.selectedResources[i].uuid === previousCheckboxes[j].uuid) { + previousChecked = previousCheckboxes[j].checked + } + } obj = { nodeName: this.selectedResources[i].nodeName, name: this.selectedResources[i].name, uuid: this.selectedResources[i].uuid, index: this.selectedResources[i].index, - checked: false, + checked: previousChecked, disabled: false } this.resourcesCheckboxes[i] = obj @@ -321,7 +336,6 @@ export default { select: function (startDate, endDate) { if (!startDate._ambigTime) { for (var i = 0; i < self.selectedResources.length; i++) { - self.resourcesCheckboxes[i].checked = false self.resourcesCheckboxes[i].disabled = false } var events = self.calendar.fullCalendar('clientEvents') From 681fe37f1fcd09edd5b321d2a83a6a73b06149cb Mon Sep 17 00:00:00 2001 From: Andrzej Pomirski Date: Fri, 22 May 2020 21:07:36 +0200 Subject: [PATCH 005/175] Correct footer grammar + fix a typo --- tensorhive/app/web/dev/src/components/TheDash.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorhive/app/web/dev/src/components/TheDash.vue b/tensorhive/app/web/dev/src/components/TheDash.vue index a4b711cc..c62a6e74 100644 --- a/tensorhive/app/web/dev/src/components/TheDash.vue +++ b/tensorhive/app/web/dev/src/components/TheDash.vue @@ -65,7 +65,7 @@ white--text xs12 > - Found a bug or needs some improvements? Leave us an issue on Github) + Want to report a bug or suggest an enhancement? Create an issue on Github. From e64b4691aa93a7c4f2c0dbfb57a8813b348085cd Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Tue, 31 Mar 2020 06:31:31 +0200 Subject: [PATCH 006/175] Improve tail mode behavior --- .../src/components/views/tasks_overview/TaskLog.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue b/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue index 5107146f..37dc8c28 100644 --- a/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue +++ b/tensorhive/app/web/dev/src/components/views/tasks_overview/TaskLog.vue @@ -30,7 +30,6 @@ style="display: inline" label="Tail mode" v-model="tailMode" - @click="refresh" hide-details /> @@ -79,10 +77,20 @@ export default { }, show () { if (this.show === false) this.close() + }, + tailMode () { + this.refresh() + }, + autoRefresh () { + this.toggleAutoRefresh() } }, methods: { close: function () { + if (this.autoRefreshIntervalId !== -1) { + window.clearInterval(this.autoRefreshIntervalId) + this.autoRefreshIntervalId = -1 + } this.$emit('close') }, refresh: function () { From 513ea8133a34b8ea293b760539e7aa091e95a871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Ro=C5=9Bciszewski?= Date: Mon, 13 Jul 2020 14:07:47 +0200 Subject: [PATCH 007/175] update static webapp files --- tensorhive/app/web/dist/index.html | 2 +- tensorhive/app/web/dist/static/config.json | 2 +- ...dd740a9.css => app.cb8e83ce86b10dc3573b6e29ca3530c8.css} | 2 +- ....923c89f30ff332c6de66.js => app.3d22f1efa5bc05f6f25f.js} | 6 +++--- .../app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js.map | 1 + .../app/web/dist/static/js/app.923c89f30ff332c6de66.js.map | 1 - .../web/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) rename tensorhive/app/web/dist/static/css/{app.07828496f238c2952d9c7eab8dd740a9.css => app.cb8e83ce86b10dc3573b6e29ca3530c8.css} (99%) rename tensorhive/app/web/dist/static/js/{app.923c89f30ff332c6de66.js => app.3d22f1efa5bc05f6f25f.js} (69%) create mode 100644 tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js.map delete mode 100644 tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js.map diff --git a/tensorhive/app/web/dist/index.html b/tensorhive/app/web/dist/index.html index 0a6a0b08..00e6465a 100644 --- a/tensorhive/app/web/dist/index.html +++ b/tensorhive/app/web/dist/index.html @@ -1 +1 @@ -TensorHive
\ No newline at end of file +TensorHive
\ No newline at end of file diff --git a/tensorhive/app/web/dist/static/config.json b/tensorhive/app/web/dist/static/config.json index 4e82c4d5..efe11793 100644 --- a/tensorhive/app/web/dist/static/config.json +++ b/tensorhive/app/web/dist/static/config.json @@ -1 +1 @@ -{"apiPath": "http://localhost:1111/api/0.3.1", "version": "0.3.3", "apiVersion": "0.3.1"} +{"apiPath": "http://localhost:1111/api/0.3.1", "version": "0.3", "apiVersion": "0.3.1"} diff --git a/tensorhive/app/web/dist/static/css/app.07828496f238c2952d9c7eab8dd740a9.css b/tensorhive/app/web/dist/static/css/app.cb8e83ce86b10dc3573b6e29ca3530c8.css similarity index 99% rename from tensorhive/app/web/dist/static/css/app.07828496f238c2952d9c7eab8dd740a9.css rename to tensorhive/app/web/dist/static/css/app.cb8e83ce86b10dc3573b6e29ca3530c8.css index 4105db86..75e64ca6 100644 --- a/tensorhive/app/web/dist/static/css/app.07828496f238c2952d9c7eab8dd740a9.css +++ b/tensorhive/app/web/dist/static/css/app.cb8e83ce86b10dc3573b6e29ca3530c8.css @@ -2,7 +2,7 @@ * FullCalendar v3.9.0 * Docs & License: https://fullcalendar.io/ * (c) 2018 Adam Shaw - */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc button{box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-default{background-color:#f5f5f5;background-image:linear-gradient(180deg,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px hsla(0,0%,100%,.75);box-shadow:inset 0 1px 0 hsla(0,0%,100%,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]{cursor:pointer}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-helper-skeleton td{background:none;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad}.fc-event,.fc-event-dot{background-color:#3a87ad}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}.fc-icon{display:inline-block;height:1em;line-height:1em;font-size:1em;text-align:center;overflow:hidden;font-family:Courier New,Courier,monospace;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\2039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\D7";font-size:200%;top:6%}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.ui-widget .fc-disabled-day{background-image:none}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.ui-widget .fc-event{color:#fff;text-decoration:none;font-weight:400}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid .fc-slats .ui-widget-content{background:none}.fc.fc-bootstrap3 a{text-decoration:none}.fc.fc-bootstrap3 a[data-goto]:hover{text-decoration:underline}.fc-bootstrap3 hr.fc-divider{border-color:inherit}.fc-bootstrap3 .fc-today.alert{border-radius:0}.fc-bootstrap3 .fc-popover .panel-body{padding:0}.fc-bootstrap3 .fc-time-grid .fc-slats table{background:none}.fc.fc-bootstrap4 a{text-decoration:none}.fc.fc-bootstrap4 a[data-goto]:hover{text-decoration:underline}.fc-bootstrap4 hr.fc-divider{border-color:inherit}.fc-bootstrap4 .fc-today.alert{border-radius:0}.fc-bootstrap4 a.fc-event:not([href]):not([tabindex]){color:#fff}.fc-bootstrap4 .fc-popover.card{position:absolute}.fc-bootstrap4 .fc-popover .card-body{padding:0}.fc-bootstrap4 .fc-time-grid .fc-slats table{background:none}.fc-toolbar{text-align:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1em}.fc-toolbar.fc-footer-toolbar{margin-top:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:2px}.fc-basic-view th.fc-day-number,.fc-basic-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-basic-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-basic-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-basic-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px 0}.fc-rtl .fc-basic-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-basic-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:gray}.fc-basic-view td.fc-week-number{text-align:center}.fc-basic-view td.fc-week-number>*{display:inline-block;min-width:1.25em}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\A0-\A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}.fc td,.fc th{border-color:#222d32!important}.fc-event{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.float-right-button[data-v-1d62e0bd]{float:right}.resources_row[data-v-1d62e0bd]{max-height:25px}.container{overflow:hidden}.large-icon{padding-left:20px}.spaced-text{padding-left:15px;padding-right:10px}.large-chip{font-size:20px;width:auto;height:50px}.container[data-v-73dcc08a]{width:100%;max-width:100%}.container-content[data-v-73dcc08a],.container-header[data-v-73dcc08a]{width:100%;max-width:100%;margin-left:0;white-space:nowrap;display:inline-block;position:relative}.range-select-container[data-v-73dcc08a]{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.date-input[data-v-73dcc08a],.range-input[data-v-73dcc08a]{max-width:150px}.small-button[data-v-73dcc08a]{height:25px!important;width:25px!important}.small-checkbox-node[data-v-73dcc08a]{margin-top:0!important;margin-left:10px!important;height:15px!important;width:15px!important}.small-checkbox[data-v-73dcc08a]{margin-top:-15px!important;margin-left:10px!important;height:15px!important;width:15px!important}.left-table[data-v-73dcc08a]{min-width:205px;overflow-x:scroll;overflow-y:hidden;display:inline-block;max-height:calc(50vh - 88px)}.left-table-header[data-v-73dcc08a]{min-width:205px;overflow-x:hidden;overflow-y:hidden;display:inline-block}.right-table[data-v-73dcc08a]{width:calc(100% - 205px);overflow-x:scroll;overflow-y:scroll;display:inline-block;max-height:calc(50vh - 88px)}.right-table-header[data-v-73dcc08a]{width:calc(100% - 205px);overflow-x:hidden;overflow-y:scroll;display:inline-block}.first-column[data-v-73dcc08a]{min-width:200px;white-space:nowrap}.node-cell[data-v-73dcc08a]{display:-ms-flexbox;display:flex}.hours[data-v-73dcc08a]{min-width:40px}.reserved[data-v-73dcc08a]{background:#c64141}.userReservation[data-v-73dcc08a]{background:#41c641}table[data-v-73dcc08a]{border:0 solid #222d32;border-radius:3px;border-collapse:collapse;border-spacing:0}th[data-v-73dcc08a]{background:#fafafa;min-width:960px}td[data-v-73dcc08a],th[data-v-73dcc08a]{border:1px solid #222d32;height:40px;max-height:40px;text-align:center;display:table-cell}td[data-v-73dcc08a]{background:transparent;min-width:20px}.button_box{margin-top:10vh;margin-left:10vw}.big_button{height:150px!important;width:150px!important}.watch_table{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.watch_box{height:40vh;width:25vw;min-width:300px;margin-left:3vh}.select_line{display:-ms-flexbox;display:flex;-ms-flex-pack:left;justify-content:left;position:-webkit-sticky;position:sticky}.select_space{width:5%}.select_item{width:30%;position:-webkit-sticky;position:sticky}.chart_box,.table_box{width:100%;height:34vh;position:relative}.table_box{overflow-y:scroll}.dark-font{color:#000!important;font-size:1.5em}.table-container{max-height:80vh;overflow-y:scroll}.float-right-button{float:right}.parameter-name-input{max-width:150px}.task-command{background-color:#f8f9fa;border:1px solid #eaecf0}.space{width:5px}.task-select{max-width:100px}.float-right-button[data-v-c5e32eee]{float:right}.parameter-name-input[data-v-c5e32eee]{max-width:150px}.space[data-v-68056994]{width:5px}.task-preview[data-v-68056994]{background-color:#f8f9fa;border:1px solid #eaecf0;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.task-input[data-v-68056994],.task-select[data-v-68056994]{max-width:200px}.remove-button{max-width:25px;max-height:25px;min-width:25px;min-height:25px;margin-left:-25px}.remove-button-tf{margin-left:-5px}.task-input{max-width:200px}.remove-button[data-v-ed523d5c]{max-width:25px;max-height:25px;min-width:25px;min-height:25px;margin-left:-25px}.remove-button-tf[data-v-ed523d5c]{margin-left:-5px}.task-input[data-v-ed523d5c]{max-width:200px}.tf-short[data-v-ed523d5c]{max-width:50px}.tf-wide[data-v-ed523d5c]{max-width:100px}.float-right-button[data-v-1f240f3d],.float-right-button[data-v-ab402584]{float:right}.host-input[data-v-ab402584]{min-width:10vw!important;max-width:10vw!important}.command-input[data-v-ab402584]{min-width:65vw!important;max-width:65vw!important}.float-right-button[data-v-21a65550],.float-right-button[data-v-246122fb]{float:right}.log_box[data-v-246122fb]{resize:both;background-color:#f8f9fa;border:1px solid #eaecf0}.float-right-button[data-v-58aecb3a],.float-right-button[data-v-775c6214]{float:right}.input-group[data-v-58aecb3a]{padding-bottom:2em;height:4em;width:100%}.input-group span.input-group-addon[data-v-58aecb3a]{width:2em;height:4em}@media (max-width:1241px){.input-group input[data-v-58aecb3a]{height:4em}}@media (min-width:1242px){.input-group input[data-v-58aecb3a]{height:6em}}.input-group-addon i[data-v-58aecb3a]{height:15px;width:15px}/*! + */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc button{box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-default{background-color:#f5f5f5;background-image:linear-gradient(180deg,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px hsla(0,0%,100%,.75);box-shadow:inset 0 1px 0 hsla(0,0%,100%,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]{cursor:pointer}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-helper-skeleton td{background:none;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad}.fc-event,.fc-event-dot{background-color:#3a87ad}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}.fc-icon{display:inline-block;height:1em;line-height:1em;font-size:1em;text-align:center;overflow:hidden;font-family:Courier New,Courier,monospace;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\2039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\D7";font-size:200%;top:6%}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.ui-widget .fc-disabled-day{background-image:none}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.ui-widget .fc-event{color:#fff;text-decoration:none;font-weight:400}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid .fc-slats .ui-widget-content{background:none}.fc.fc-bootstrap3 a{text-decoration:none}.fc.fc-bootstrap3 a[data-goto]:hover{text-decoration:underline}.fc-bootstrap3 hr.fc-divider{border-color:inherit}.fc-bootstrap3 .fc-today.alert{border-radius:0}.fc-bootstrap3 .fc-popover .panel-body{padding:0}.fc-bootstrap3 .fc-time-grid .fc-slats table{background:none}.fc.fc-bootstrap4 a{text-decoration:none}.fc.fc-bootstrap4 a[data-goto]:hover{text-decoration:underline}.fc-bootstrap4 hr.fc-divider{border-color:inherit}.fc-bootstrap4 .fc-today.alert{border-radius:0}.fc-bootstrap4 a.fc-event:not([href]):not([tabindex]){color:#fff}.fc-bootstrap4 .fc-popover.card{position:absolute}.fc-bootstrap4 .fc-popover .card-body{padding:0}.fc-bootstrap4 .fc-time-grid .fc-slats table{background:none}.fc-toolbar{text-align:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1em}.fc-toolbar.fc-footer-toolbar{margin-top:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:2px}.fc-basic-view th.fc-day-number,.fc-basic-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-basic-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-basic-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-basic-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px 0}.fc-rtl .fc-basic-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-basic-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:gray}.fc-basic-view td.fc-week-number{text-align:center}.fc-basic-view td.fc-week-number>*{display:inline-block;min-width:1.25em}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\A0-\A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}.fc td,.fc th{border-color:#222d32!important}.fc-event{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.float-right-button[data-v-6b687e6b]{float:right}.resources_row[data-v-6b687e6b]{max-height:25px}.container{overflow:hidden}.large-icon{padding-left:20px}.spaced-text{padding-left:15px;padding-right:10px}.large-chip{font-size:20px;width:auto;height:50px}.container[data-v-73dcc08a]{width:100%;max-width:100%}.container-content[data-v-73dcc08a],.container-header[data-v-73dcc08a]{width:100%;max-width:100%;margin-left:0;white-space:nowrap;display:inline-block;position:relative}.range-select-container[data-v-73dcc08a]{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.date-input[data-v-73dcc08a],.range-input[data-v-73dcc08a]{max-width:150px}.small-button[data-v-73dcc08a]{height:25px!important;width:25px!important}.small-checkbox-node[data-v-73dcc08a]{margin-top:0!important;margin-left:10px!important;height:15px!important;width:15px!important}.small-checkbox[data-v-73dcc08a]{margin-top:-15px!important;margin-left:10px!important;height:15px!important;width:15px!important}.left-table[data-v-73dcc08a]{min-width:205px;overflow-x:scroll;overflow-y:hidden;display:inline-block;max-height:calc(50vh - 88px)}.left-table-header[data-v-73dcc08a]{min-width:205px;overflow-x:hidden;overflow-y:hidden;display:inline-block}.right-table[data-v-73dcc08a]{width:calc(100% - 205px);overflow-x:scroll;overflow-y:scroll;display:inline-block;max-height:calc(50vh - 88px)}.right-table-header[data-v-73dcc08a]{width:calc(100% - 205px);overflow-x:hidden;overflow-y:scroll;display:inline-block}.first-column[data-v-73dcc08a]{min-width:200px;white-space:nowrap}.node-cell[data-v-73dcc08a]{display:-ms-flexbox;display:flex}.hours[data-v-73dcc08a]{min-width:40px}.reserved[data-v-73dcc08a]{background:#c64141}.userReservation[data-v-73dcc08a]{background:#41c641}table[data-v-73dcc08a]{border:0 solid #222d32;border-radius:3px;border-collapse:collapse;border-spacing:0}th[data-v-73dcc08a]{background:#fafafa;min-width:960px}td[data-v-73dcc08a],th[data-v-73dcc08a]{border:1px solid #222d32;height:40px;max-height:40px;text-align:center;display:table-cell}td[data-v-73dcc08a]{background:transparent;min-width:20px}.button_box{margin-top:10vh;margin-left:10vw}.big_button{height:150px!important;width:150px!important}.watch_table{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.watch_box{height:40vh;width:25vw;min-width:300px;margin-left:3vh}.select_line{display:-ms-flexbox;display:flex;-ms-flex-pack:left;justify-content:left;position:-webkit-sticky;position:sticky}.select_space{width:5%}.select_item{width:30%;position:-webkit-sticky;position:sticky}.chart_box,.table_box{width:100%;height:34vh;position:relative}.table_box{overflow-y:scroll}.dark-font{color:#000!important;font-size:1.5em}.table-container{max-height:80vh;overflow-y:scroll}.float-right-button{float:right}.parameter-name-input{max-width:150px}.task-command{background-color:#f8f9fa;border:1px solid #eaecf0}.space{width:5px}.task-select{max-width:100px}.float-right-button[data-v-c5e32eee]{float:right}.parameter-name-input[data-v-c5e32eee]{max-width:150px}.space[data-v-68056994]{width:5px}.task-preview[data-v-68056994]{background-color:#f8f9fa;border:1px solid #eaecf0;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.task-input[data-v-68056994],.task-select[data-v-68056994]{max-width:200px}.remove-button{max-width:25px;max-height:25px;min-width:25px;min-height:25px;margin-left:-25px}.remove-button-tf{margin-left:-5px}.task-input{max-width:200px}.remove-button[data-v-ed523d5c]{max-width:25px;max-height:25px;min-width:25px;min-height:25px;margin-left:-25px}.remove-button-tf[data-v-ed523d5c]{margin-left:-5px}.task-input[data-v-ed523d5c]{max-width:200px}.tf-short[data-v-ed523d5c]{max-width:50px}.tf-wide[data-v-ed523d5c]{max-width:100px}.float-right-button[data-v-1f240f3d],.float-right-button[data-v-ab402584]{float:right}.host-input[data-v-ab402584]{min-width:10vw!important;max-width:10vw!important}.command-input[data-v-ab402584]{min-width:65vw!important;max-width:65vw!important}.float-right-button[data-v-21a65550],.float-right-button[data-v-4291c17c]{float:right}.log_box[data-v-4291c17c]{resize:both;background-color:#f8f9fa;border:1px solid #eaecf0}.float-right-button[data-v-58aecb3a],.float-right-button[data-v-d8f593d8]{float:right}.input-group[data-v-58aecb3a]{padding-bottom:2em;height:4em;width:100%}.input-group span.input-group-addon[data-v-58aecb3a]{width:2em;height:4em}@media (max-width:1241px){.input-group input[data-v-58aecb3a]{height:4em}}@media (min-width:1242px){.input-group input[data-v-58aecb3a]{height:6em}}.input-group-addon i[data-v-58aecb3a]{height:15px;width:15px}/*! * Vuetify v1.5.5 * Forged by John Leider * Released under the MIT License. diff --git a/tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js b/tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js similarity index 69% rename from tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js rename to tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js index 5634d6d3..93ce8c14 100644 --- a/tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js +++ b/tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js @@ -1,7 +1,7 @@ -webpackJsonp([1],[,,function(t,e,n){"use strict";var i=n(54),r=n.n(i),s=n(31);e.a={request:function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;if(!t)return void console.error("API function call requires method argument");if(!e)return void console.error("API function call requires uri argument");var o=s.a.serverURI+e;return null!==n&&(r.a.defaults.headers.common.Authorization=n),r()({method:t,url:o,data:i})}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";e.a={serverURI:"",apiVersion:"",version:"",fixedLayout:!1,hideLogoOnMobile:!1}},,,,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";var i=n(31),r=n(257),s=n(263),o=(n.n(s),n(2));e.a={name:"TheDash",components:{BaseSidebar:r.a},data:function(){return{year:(new Date).getFullYear(),classes:{fixed_layout:i.a.fixedLayout,hide_logo:i.a.hideLogoOnMobile},alert:!1,errorMessage:""}},computed:{displayName:function(){return this.$store.state.user},version:function(){return i.a.version},apiVersion:function(){return i.a.apiVersion}},methods:{handleError:function(t){t.hasOwnProperty("response")?t.response.data.hasOwnProperty("msg")?this.errorMessage=t.response.data.msg:this.errorMessage=t.response.data:this.errorMessage=t.message,this.alert=!0},changeloading:function(){this.$store.commit("TOGGLE_SEARCHING")},logout:function(){var t=this;null!==this.$store.state.accessToken&&o.a.request("delete","/user/logout",this.$store.state.accessToken).then(function(e){t.$store.commit("SET_ACCESS_TOKEN",null),window.localStorage&&window.localStorage.setItem("accessToken",null),null!==t.$store.state.refreshToken&&o.a.request("delete","/user/logout/refresh_token",t.$store.state.refreshToken).then(function(e){t.$store.commit("SET_REFRESH_TOKEN",null),window.localStorage&&window.localStorage.setItem("refreshToken",null)}).catch(function(e){t.handleError(e)})}).catch(function(e){t.handleError(e)}),this.$store.commit("SET_USER",null),this.$store.commit("SET_ROLE",null),window.localStorage&&(window.localStorage.setItem("user",null),window.localStorage.setItem("role",null)),this.$router.push("/login")}}}},function(t,e,n){"use strict";var i=n(259);e.a={name:"BaseSidebar",components:{BaseSidebarMenu:i.a},mounted:function(){window.jQuery('[data-toggle="hideseek"]').off().hideseek()}}},function(t,e,n){"use strict";e.a={name:"BaseSidebarMenu"}},,,,,,,function(t,e,n){"use strict";var i=n(13),r=n.n(i),s=n(2);e.a={name:"Login",data:function(t){return{section:"Login",username:"",password:"",modalUsername:"",modalEmail:"",modalPassword:"",modalPassword2:"",alert:!1,modalAlert:!1,created:!1,errorMessage:"",showModal:!1,entry:""}},methods:{handleError:function(t){t.hasOwnProperty("response")?t.response.data.hasOwnProperty("msg")?this.errorMessage=t.response.data.msg:this.errorMessage=t.response.data:this.errorMessage=t.message},requestEntry:function(){var t=this;s.a.request("get","/user/authorized_keys_entry",this.$store.state.accessToken).then(function(e){t.entry=e.data,t.showModal=!0}).catch(function(e){t.handleError(e),t.modalAlert=!0})},copyEntryToClipboard:function(){var t=document.querySelector("#entry");t.setAttribute("type","text"),t.select();try{document.execCommand("copy")?alert("Authorized keys entry is in your clipboard"):alert("Something went wrong, try again")}catch(t){alert("Unable to copy")}window.getSelection().removeAllRanges()},createUser:function(){var t=this;if(this.modalPassword===this.modalPassword2){var e=this.modalUsername,n=this.modalEmail,i=this.modalPassword;s.a.request("post","/user/ssh_signup",this.$store.state.accessToken,{username:e,email:n,password:i}).then(function(e){t.showModal=!1,t.created=!0}).catch(function(e){t.handleError(e),t.modalAlert=!0})}else this.errorMessage="Passwords do not match",this.modalAlert=!0},checkCreds:function(){var t=this,e=this.username,n=this.password;this.toggleLoading(),this.resetResponse(),this.$store.commit("TOGGLE_LOADING"),s.a.request("post","/user/login",this.$store.state.accessToken,{username:e,password:n}).then(function(n){t.toggleLoading();var i=n.data;if(i.error){var s=i.error.name;return void(t.response=s?"InvalidCredentialsError"===s?"Username/Password incorrect. Please try again.":s:i.error)}if(e){var o="Bearer "+i.access_token,a="Bearer "+i.refresh_token,l=JSON.parse(atob(i.access_token.split(".")[1])),c=l.identity,u=2===l.user_claims.roles.length?"admin":"user";t.$store.commit("SET_USER",e),t.$store.commit("SET_ROLE",u),t.$store.commit("SET_ID",c),t.$store.commit("SET_ACCESS_TOKEN",o),t.$store.commit("SET_REFRESH_TOKEN",a),window.localStorage&&(window.localStorage.setItem("user",r()(e)),window.localStorage.setItem("accessToken",o),window.localStorage.setItem("refreshToken",a),window.localStorage.setItem("role",u),window.localStorage.setItem("userId",c)),t.$router.push("/")}}).catch(function(e){t.handleError(e),t.alert=!0})},toggleLoading:function(){this.loading=""===this.loading?"loading":""},resetResponse:function(){this.response=""}}}},function(t,e,n){"use strict";e.a={name:"NotFound"}},function(t,e,n){"use strict";var i=n(2),r=n(33),s=n.n(r),o=n(290),a=n(301);e.a={components:{FullCalendar:o.a,MySchedule:a.a},data:function(){return{nodes:{},parsedNodes:[],alert:!1,snackbar:!1,errorMessage:"",updateCalendar:!1,selectedResources:[],nodeCheckbox:!1,resourceTypeCheckbox:!1,resourceCheckbox:!1,showSchedule:!1,interval:null,time:3e4}},mounted:function(){var t=this;i.a.request("get","/nodes/metrics",this.$store.state.accessToken).then(function(e){t.nodes=e.data,t.parseData()}).catch(function(e){t.handleError(e)});var e=this;this.interval=setInterval(function(){e.updateCalendar=!e.updateCalendar},this.time)},methods:{handleError:function(t){t.hasOwnProperty("response")?t.response.data.hasOwnProperty("msg")?this.showSnackbar(t.response.data.msg):this.showSnackbar(t.response.data):this.showSnackbar(t.message)},showSnackbar:function(t){this.errorMessage=t,this.snackbar=!0},loadResources:function(t){this.selectedResources=[];for(var e in t)if(t[e].selected){var n={nodeName:t[e].nodeName,name:t[e].resourceName,uuid:e,index:t[e].resourceIndex};this.selectedResources.push(n)}this.updateCalendar=!this.updateCalendar},toggle:function(t){t.open=!t.open},parseData:function(){var t,e,n,i,r,o,a,l;for(var c in this.nodes){i=[],t=this.nodes[c],n=[];for(var u in t){if("GPU"===u){e=t[u];for(var d in e)r={nodeName:c,resourceUUID:d,resourceName:e[d].name,resourceIndex:e[d].index,metrics:e[d].metrics},r.metrics.checked=!0,n.push(r)}l=s.a.orderBy(n,"resourceIndex"),o={name:u,checked:!0,open:!1,resources:l},i.push(o)}a={nodeName:c,checked:!0,open:!1,resourceTypes:i},this.parsedNodes.push(a)}this.loadCalendar()},loadCalendar:function(){var t,e,n,i;this.selectedResources=[];for(var r=0;r0){r=this.selectedResources[0].uuid;for(var o=1;o"+e.description),t.selectedResources.length>6&&a()(n).css("color","rgba(0, 0, 0, 0)"),e.allDay||s.a.request("get","/users/"+e.userId,t.$store.state.accessToken).then(function(t){n.find(".fc-title").prepend(t.data.username.bold().big().italics()+"
")}).catch(function(t){i.$emit("handleError",t)})},eventAfterRender:function(e,n,i){for(var r,s,o,l=0;le&&s[i].start48*this.range&&(h=48*this.range);for(var p=d;p=0;c-=this.time/1e3)c%((this.space+1)*this.time/1e3)==0?i.push(c):i.push("");a=[];for(var d in t)null!==t[d].metrics[n]&&this.isVisible(t[d].metrics[n],n)&&(s=isNaN(t[d].metrics[n])?t[d].metrics[n].value:t[d].metrics[n],o=isNaN(t[d].metrics[n])?t[d].metrics[n].unit:"",r=t[d].metrics.mem_total.value,a.push(this.createDataset(d,e+t[d].index,this.setColor(t[d].index+1),s)));return l=u.a.orderBy(a,"label"),{metricName:n,data:{labels:i,datasets:l},options:this.createOptions(r,n,o)}},createDataset:function(t,e,n,i){for(var r=[],s=0;sr&&(this.lines[s].tfConfigTaskIndex-=1);else delete this.tfCluster[i]}e&&0!==e.length?(this.tfCluster.hasOwnProperty(e)||(this.tfCluster[e]=[]),this.lines[n].tfConfigTaskType=e,this.lines[n].tfConfigTaskIndex=this.tfCluster[e].length,this.tfCluster[e].push(this.lines[n].host+":"+this.lines[n].tfConfigPort)):(this.lines[n].tfConfigTaskType=e,this.lines[n].tfConfigTaskIndex=-1),this.tfCluster.__ob__.dep.notify()}},updateTfConfigTaskIndex:function(t,e){var n;for(n in this.lines)if(this.lines[n].id===t)break;if(this.lines[n].enableTfConfig&&this.enableSmartTfConfig&&e!==this.lines[n].tfConfigTaskIndex){var i=this.lines[n].tfConfigTaskType,r=this.lines[n].tfConfigTaskIndex;if(this.tfCluster[i].length<=e?e=0:e<0&&(e=this.tfCluster[i].length-1),e!==this.lines[n].tfConfigTaskIndex){var s=this.tfCluster[i][r];this.tfCluster[i].splice(r,1);for(var o in this.lines)this.lines[o].tfConfigTaskType===i&&this.lines[o].tfConfigTaskIndex>r&&(this.lines[o].tfConfigTaskIndex-=1),this.lines[o].tfConfigTaskType===i&&this.lines[o].tfConfigTaskIndex>=e&&(this.lines[o].tfConfigTaskIndex+=1);this.tfCluster[i].splice(e,0,s),this.lines[n].tfConfigTaskIndex=e,this.tfCluster.__ob__.dep.notify()}}},convertResource:function(t){return""!==t&&null!==t?"CPU"===t?"CUDA_VISIBLE_DEVICES=":"CUDA_VISIBLE_DEVICES="+t[3]:""},emptyParametersAndEnvVariables:function(){this.enableSmartTfConfig=!1,this.isNewFieldStatic=!1,this.staticParameters=[],this.staticEnvVariables=[];for(var t in this.lines)this.lines[t].tfConfigTaskIndex=0,this.lines[t].tfConfigTaskType="",this.lines[t].tfConfigPort="",this.lines[t].enableTfConfig=!1,this.lines[t].parameters=[],this.lines[t].parameterIds=0,this.lines[t].envVariables=[],this.lines[t].envVariableIds=0;this.tfCluster={}}}}},function(t,e,n){"use strict";var i=n(327),r=n.n(i),s=n(330),o=n(333),a=n(336);e.a={components:{TaskLineTfConfig:a.a,TaskLineParameter:s.a,TaskLineEnvVariable:o.a},props:{hostnames:Array,hosts:Object,host:String,resource:String,command:String,parameters:Array,staticParameters:Array,envVariables:Array,staticEnvVariables:Array,enableTfConfig:Boolean,tfConfig:String,tfConfigPort:String,tfConfigTaskType:String,tfConfigTaskIndex:Number,tfCluster:Object,enableSmartTfConfig:Boolean},data:function(){return{newHost:"",newResource:"",newEnvVariables:[{id:0,envVariable:"",value:""}],newCommand:"",newParameters:[{id:0,parameter:"",value:""}],newEnableTfConfig:!1,newTfConfig:"",showModal:!1}},created:function(){this.newHost=this.host,this.newResource=this.resource,this.newEnvVariables=this.envVariables,this.envVariableIds=this.envVariables.length,this.newCommand=this.command,this.newParameters=this.parameters,this.parameterIds=this.parameters.length,this.newEnableTfConfig=this.enableTfConfig,this.newTfConfig=this.tfConfig},computed:{hostResources:function(){return""!==this.newHost?this.hosts[this.newHost].resources:[]},taskPreview:function(){var t="";for(var e in this.parameters){var n=this.parameters[e].parameter.length;" "===this.parameters[e].parameter.charAt(n-1)||"="===this.parameters[e].parameter.charAt(n-1)?t+=this.parameters[e].parameter+this.parameters[e].value+" ":t+=this.parameters[e].parameter+" "+this.parameters[e].value+" "}var i="";this.newEnableTfConfig&&(i+="TF_CONFIG="+this.newTfConfig+" ");for(var r in this.envVariables)i+=this.envVariables[r].envVariable+"="+this.envVariables[r].value+" ";return this.host+" "+this.convertResource(this.resource)+" "+i+" "+this.command+" "+t}},watch:{parameters:function(){this.newParameters=this.parameters},envVariables:function(){this.newEnvVariables=this.envVariables},enableTfConfig:function(){this.newEnableTfConfig=this.enableTfConfig},tfConfig:function(){this.newTfConfig=this.tfConfig},newHost:function(){this.newResource=this.hosts[this.newHost].resources[0],this.updateLine()},newResource:function(){this.updateLine()},newCommand:function(){this.updateLine()},newParameters:function(){this.updateLine()},newEnvVariables:function(){this.updateLine()},newEnableTfConfig:function(){this.updateLine()},newTfConfig:function(){this.updateLine()}},methods:{convertResource:function(t){return""!==t&&null!==t?"CPU"===t?"CUDA_VISIBLE_DEVICES=":"CUDA_VISIBLE_DEVICES="+t[3]:""},changeParameter:function(t,e,n){for(var i in this.parameters)if(this.parameters[i].id===t){this.parameters[i].parameter=e,this.parameters[i].value=n;var s=!0,o=!1,a=void 0;try{for(var l,c=r()(this.staticParameters);!(s=(l=c.next()).done);s=!0){var u=l.value;e===u&&this.$emit("staticParameterChanged",e,n)}}catch(t){o=!0,a=t}finally{try{!s&&c.return&&c.return()}finally{if(o)throw a}}"--job_name="!==e&&"--task_index="!==e||this.$emit("psWorkerParameterChanged")}},deleteParameter:function(t){for(var e in this.parameters)if(this.parameters[e].id===t){var n=!0,i=!1,s=void 0;try{for(var o,a=r()(this.staticParameters);!(n=(o=a.next()).done);n=!0){var l=o.value;this.parameters[e].parameter===l&&this.$emit("staticParameterDeleted",l)}}catch(t){i=!0,s=t}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}this.parameters.splice(e,1)}},changeEnvVariable:function(t,e,n){for(var i in this.envVariables)if(this.envVariables[i].id===t){this.envVariables[i].envVariable=e,this.envVariables[i].value=n;var s=!0,o=!1,a=void 0;try{for(var l,c=r()(this.staticEnvVariables);!(s=(l=c.next()).done);s=!0){var u=l.value;e===u&&this.$emit("staticEnvVariableChanged",e,n)}}catch(t){o=!0,a=t}finally{try{!s&&c.return&&c.return()}finally{if(o)throw a}}}},deleteEnvVariable:function(t){for(var e in this.envVariables)if(this.envVariables[e].id===t){var n=!0,i=!1,s=void 0;try{for(var o,a=r()(this.staticEnvVariables);!(n=(o=a.next()).done);n=!0){var l=o.value;this.envVariables[e].envVariable===l&&this.$emit("staticEnvVariableDeleted",l)}}catch(t){i=!0,s=t}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}this.envVariables.splice(e,1)}},changeTfConfig:function(t){this.newTfConfig=t},deleteTfConfig:function(){this.$emit("updateTfConfigTaskType",""),this.newEnableTfConfig=!1,this.newTfConfig=""},updateTfConfigPort:function(t){this.$emit("updateTfConfigPort",t)},updateTfConfigTaskType:function(t){this.$emit("updateTfConfigTaskType",t)},updateTfConfigTaskIndex:function(t){this.$emit("updateTfConfigTaskIndex",t)},updateLine:function(){this.$emit("changeLine",this.newHost,this.newResource,this.newCommand,this.newParameters,this.newEnvVariables,this.newEnableTfConfig,this.newTfConfig)},removeMe:function(){this.$emit("deleteLine")}}}},function(t,e,n){"use strict";e.a={props:{parameter:String,value:String},data:function(){return{newParameter:"",newValue:""}},created:function(){this.newParameter=this.parameter,this.newValue=this.value},watch:{value:function(){this.newValue=this.value},newParameter:function(){this.$emit("changeParameter",this.newParameter,this.newValue)},newValue:function(){this.$emit("changeParameter",this.newParameter,this.newValue)}},methods:{removeMe:function(){this.$emit("deleteParameter")}}}},function(t,e,n){"use strict";e.a={props:{envVariable:String,value:String},data:function(){return{newEnvVariable:"",newValue:"",showModalTfConfigEdit:!1}},created:function(){this.newEnvVariable=this.envVariable,this.newValue=this.value},watch:{value:function(){this.newValue=this.value},newEnvVariable:function(){this.$emit("changeEnvVariable",this.newEnvVariable,this.newValue)},newValue:function(){this.$emit("changeEnvVariable",this.newEnvVariable,this.newValue)}},methods:{removeMe:function(){this.$emit("deleteEnvVariable")},updateValue:function(t){this.newValue=t}}}},function(t,e,n){"use strict";var i=n(13),r=n.n(i),s=n(338);e.a={components:{TfConfigEdit:s.a},name:"TaskLineTfConfig",props:{value:String,port:String,taskType:String,taskIndex:Number,tfCluster:Object,enableSmartTfConfig:Boolean},data:function(){return{newValue:"",newPort:"",newTaskType:"",taskTypeItems:["chief","evaluator","master","ps","worker"],newTaskIndex:-1,localEnableSmartTfConfig:!1,showModalTfConfigEdit:!1}},created:function(){this.newValue=this.value,this.newPort=this.port,this.newTaskType=this.taskType,this.newTaskIndex=this.taskIndex,this.localEnableSmartTfConfig=this.enableSmartTfConfig},watch:{value:function(){this.newValue=this.value},port:function(){this.newPort=this.port},taskType:function(){this.newTaskType=this.taskType},taskIndex:function(){this.newTaskIndex=this.taskIndex},tfCluster:function(){if(this.newTaskIndex>=0){var t={cluster:this.tfCluster,task:{type:this.newTaskType,index:this.newTaskIndex}};this.updateValue("'"+r()(t).split('"').join('\\"')+"'")}else this.updateValue("")},enableSmartTfConfig:function(){this.localEnableSmartTfConfig=this.enableSmartTfConfig},newValue:function(){this.$emit("changeTfConfig",this.newValue)},newPort:function(){this.$emit("updateTfConfigPort",this.newPort)},newTaskType:function(){this.$emit("updateTfConfigTaskType",this.newTaskType)},newTaskIndex:function(){isNaN(parseInt(this.newTaskIndex))?this.newTaskIndex=this.taskIndex:this.$emit("updateTfConfigTaskIndex",parseInt(this.newTaskIndex))}},methods:{removeMe:function(){this.$emit("deleteTfConfig")},updateValue:function(t){this.newValue=t}}}},function(t,e,n){"use strict";var i=n(13),r=n.n(i);e.a={name:"TfConfigEdit",props:{value:String,showModal:Boolean},data:function(){return{newValue:"",properJson:!1,show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){!1===this.show?this.close():this.newValue=this.desanitize(this.value)},newValue:function(){try{JSON.parse(this.newValue),this.properJson=!0}catch(t){this.properJson=!1}}},methods:{close:function(){this.$emit("close")},save:function(){this.close(),this.$emit("updateValue",this.sanitize(this.newValue))},sanitize:function(t){return t=r()(JSON.parse(t)),"'"+t.split('"').join('\\"')+"'"},desanitize:function(t){try{return r()(JSON.parse(t.split("'").join("").split('\\"').join('"')),null,2)}catch(e){return t}}}}},function(t,e,n){"use strict";var i=n(2);e.a={props:{showModal:Boolean,taskId:Number,hostname:String,command:String,actionFlag:Boolean},data:function(){return{newHost:"",newCommand:"",show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){!1===this.show&&this.close()},hostname:function(){this.newHost=this.hostname},command:function(){this.newCommand=this.command}},methods:{changeTask:function(){var t=this,e={hostname:this.newHost,command:this.newCommand};this.actionFlag||(this.$emit("changeActionFlag",!0),this.$emit("changeSnackbar",!0),i.a.request("put","/tasks/"+this.taskId,this.$store.state.accessToken,e).then(function(e){t.close(),t.$emit("getTask",t.taskId,!0)}))},close:function(){this.$emit("close")}}}},function(t,e,n){"use strict";var i=n(2),r=n(0),s=n.n(r);e.a={props:{showModal:Boolean,taskId:Number,spawnTime:String,terminateTime:String,actionFlag:Boolean,multipleFlag:Boolean,selected:Array},data:function(){return{spawnTimeMenu:!1,spawnDateMenu:!1,terminateTimeMenu:!1,terminateDateMenu:!1,spawn:!1,terminate:!1,newSpawnDate:"",newSpawnTime:"",newTerminateDate:"",newTerminateTime:"",selectedIndex:0,show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){!1===this.show&&this.close()},spawnTime:function(){null!==this.spawnTime?(this.newSpawnDate=s()(this.spawnTime).format("YYYY-MM-DD"),this.newSpawnTime=s()(this.spawnTime).format("HH:mm")):(this.newSpawnDate="",this.newSpawnTime="")},terminateTime:function(){null!==this.terminateTime?(this.newTerminateDate=s()(this.terminateTime).format("YYYY-MM-DD"),this.newTerminateTime=s()(this.terminateTime).format("HH:mm")):(this.newTerminateDate="",this.newTerminateTime="")}},methods:{actionSave:function(){this.$refs.menu.save(this.newSpawnTime)},checkActionFlag:function(){!1===this.actionFlag&&(this.$emit("changeActionFlag",!0),this.$emit("changeSnackbar",!0),this.scheduleTasks())},scheduleTasks:function(){var t=this,e={};""!==this.newSpawnTime&&null!==this.newSpawnTime&&void 0!==this.newSpawnTime&&(e.spawnAt=s()(this.newSpawnDate+"T"+this.newSpawnTime).toISOString()),""!==this.newTerminateTime&&null!==this.newTerminateTime&&void 0!==this.newTerminateTime&&(e.terminateAt=s()(this.newTerminateDate+"T"+this.newTerminateTime).toISOString()),this.spawn||(e.spawnAt=null),this.terminate||(e.terminateAt=null);var n;n=this.multipleFlag?this.selected[this.selectedIndex].id:this.taskId,i.a.request("put","/tasks/"+n,this.$store.state.accessToken,e).then(function(e){t.close(),t.getTask(n)}).catch(function(e){t.$emit("handleError",e),t.close(),t.getTask(n)})},getTask:function(t){var e=this;i.a.request("get","/tasks/"+t,this.$store.state.accessToken).then(function(n){e.$emit("updateTask",t,n.data.task),e.multipleFlag?(e.selectedIndex++,e.selectedIndex3&&void 0!==arguments[3]?arguments[3]:null;if(!t)return void console.error("API function call requires method argument");if(!e)return void console.error("API function call requires uri argument");var o=s.a.serverURI+e;return null!==n&&(r.a.defaults.headers.common.Authorization=n),r()({method:t,url:o,data:i})}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";e.a={serverURI:"",apiVersion:"",version:"",fixedLayout:!1,hideLogoOnMobile:!1}},,,,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";var i=n(31),r=n(257),s=n(263),o=(n.n(s),n(2));e.a={name:"TheDash",components:{BaseSidebar:r.a},data:function(){return{year:(new Date).getFullYear(),classes:{fixed_layout:i.a.fixedLayout,hide_logo:i.a.hideLogoOnMobile},alert:!1,errorMessage:""}},computed:{displayName:function(){return this.$store.state.user},version:function(){return i.a.version},apiVersion:function(){return i.a.apiVersion}},methods:{handleError:function(t){t.hasOwnProperty("response")?t.response.data.hasOwnProperty("msg")?this.errorMessage=t.response.data.msg:this.errorMessage=t.response.data:this.errorMessage=t.message,this.alert=!0},changeloading:function(){this.$store.commit("TOGGLE_SEARCHING")},logout:function(){var t=this;null!==this.$store.state.accessToken&&o.a.request("delete","/user/logout",this.$store.state.accessToken).then(function(e){t.$store.commit("SET_ACCESS_TOKEN",null),window.localStorage&&window.localStorage.setItem("accessToken",null),null!==t.$store.state.refreshToken&&o.a.request("delete","/user/logout/refresh_token",t.$store.state.refreshToken).then(function(e){t.$store.commit("SET_REFRESH_TOKEN",null),window.localStorage&&window.localStorage.setItem("refreshToken",null)}).catch(function(e){t.handleError(e)})}).catch(function(e){t.handleError(e)}),this.$store.commit("SET_USER",null),this.$store.commit("SET_ROLE",null),window.localStorage&&(window.localStorage.setItem("user",null),window.localStorage.setItem("role",null)),this.$router.push("/login")}}}},function(t,e,n){"use strict";var i=n(259);e.a={name:"BaseSidebar",components:{BaseSidebarMenu:i.a},mounted:function(){window.jQuery('[data-toggle="hideseek"]').off().hideseek()}}},function(t,e,n){"use strict";e.a={name:"BaseSidebarMenu"}},,,,,,,function(t,e,n){"use strict";var i=n(13),r=n.n(i),s=n(2);e.a={name:"Login",data:function(t){return{section:"Login",username:"",password:"",modalUsername:"",modalEmail:"",modalPassword:"",modalPassword2:"",alert:!1,modalAlert:!1,created:!1,errorMessage:"",showModal:!1,entry:""}},methods:{handleError:function(t){t.hasOwnProperty("response")?t.response.data.hasOwnProperty("msg")?this.errorMessage=t.response.data.msg:this.errorMessage=t.response.data:this.errorMessage=t.message},requestEntry:function(){var t=this;s.a.request("get","/user/authorized_keys_entry",this.$store.state.accessToken).then(function(e){t.entry=e.data,t.showModal=!0}).catch(function(e){t.handleError(e),t.modalAlert=!0})},copyEntryToClipboard:function(){var t=document.querySelector("#entry");t.setAttribute("type","text"),t.select();try{document.execCommand("copy")?alert("Authorized keys entry is in your clipboard"):alert("Something went wrong, try again")}catch(t){alert("Unable to copy")}window.getSelection().removeAllRanges()},createUser:function(){var t=this;if(this.modalPassword===this.modalPassword2){var e=this.modalUsername,n=this.modalEmail,i=this.modalPassword;s.a.request("post","/user/ssh_signup",this.$store.state.accessToken,{username:e,email:n,password:i}).then(function(e){t.showModal=!1,t.created=!0}).catch(function(e){t.handleError(e),t.modalAlert=!0})}else this.errorMessage="Passwords do not match",this.modalAlert=!0},checkCreds:function(){var t=this,e=this.username,n=this.password;this.toggleLoading(),this.resetResponse(),this.$store.commit("TOGGLE_LOADING"),s.a.request("post","/user/login",this.$store.state.accessToken,{username:e,password:n}).then(function(n){t.toggleLoading();var i=n.data;if(i.error){var s=i.error.name;return void(t.response=s?"InvalidCredentialsError"===s?"Username/Password incorrect. Please try again.":s:i.error)}if(e){var o="Bearer "+i.access_token,a="Bearer "+i.refresh_token,l=JSON.parse(atob(i.access_token.split(".")[1])),c=l.identity,u=2===l.user_claims.roles.length?"admin":"user";t.$store.commit("SET_USER",e),t.$store.commit("SET_ROLE",u),t.$store.commit("SET_ID",c),t.$store.commit("SET_ACCESS_TOKEN",o),t.$store.commit("SET_REFRESH_TOKEN",a),window.localStorage&&(window.localStorage.setItem("user",r()(e)),window.localStorage.setItem("accessToken",o),window.localStorage.setItem("refreshToken",a),window.localStorage.setItem("role",u),window.localStorage.setItem("userId",c)),t.$router.push("/")}}).catch(function(e){t.handleError(e),t.alert=!0})},toggleLoading:function(){this.loading=""===this.loading?"loading":""},resetResponse:function(){this.response=""}}}},function(t,e,n){"use strict";e.a={name:"NotFound"}},function(t,e,n){"use strict";var i=n(2),r=n(33),s=n.n(r),o=n(290),a=n(301);e.a={components:{FullCalendar:o.a,MySchedule:a.a},data:function(){return{nodes:{},parsedNodes:[],alert:!1,snackbar:!1,errorMessage:"",updateCalendar:!1,selectedResources:[],nodeCheckbox:!1,resourceTypeCheckbox:!1,resourceCheckbox:!1,showSchedule:!1,interval:null,time:3e4}},mounted:function(){var t=this;i.a.request("get","/nodes/metrics",this.$store.state.accessToken).then(function(e){t.nodes=e.data,t.parseData()}).catch(function(e){t.handleError(e)});var e=this;this.interval=setInterval(function(){e.updateCalendar=!e.updateCalendar},this.time)},methods:{handleError:function(t){t.hasOwnProperty("response")?t.response.data.hasOwnProperty("msg")?this.showSnackbar(t.response.data.msg):this.showSnackbar(t.response.data):this.showSnackbar(t.message)},showSnackbar:function(t){this.errorMessage=t,this.snackbar=!0},loadResources:function(t){this.selectedResources=[];for(var e in t)if(t[e].selected){var n={nodeName:t[e].nodeName,name:t[e].resourceName,uuid:e,index:t[e].resourceIndex};this.selectedResources.push(n)}this.updateCalendar=!this.updateCalendar},toggle:function(t){t.open=!t.open},parseData:function(){var t,e,n,i,r,o,a,l;for(var c in this.nodes){i=[],t=this.nodes[c],n=[];for(var u in t){if("GPU"===u){e=t[u];for(var d in e)r={nodeName:c,resourceUUID:d,resourceName:e[d].name,resourceIndex:e[d].index,metrics:e[d].metrics},r.metrics.checked=!0,n.push(r)}l=s.a.orderBy(n,"resourceIndex"),o={name:u,checked:!0,open:!1,resources:l},i.push(o)}a={nodeName:c,checked:!0,open:!1,resourceTypes:i},this.parsedNodes.push(a)}this.loadCalendar()},loadCalendar:function(){var t,e,n,i;this.selectedResources=[];for(var r=0;r0){r=this.selectedResources[0].uuid;for(var o=1;o"+e.description),t.selectedResources.length>6&&a()(n).css("color","rgba(0, 0, 0, 0)"),e.allDay||s.a.request("get","/users/"+e.userId,t.$store.state.accessToken).then(function(t){n.find(".fc-title").prepend(t.data.username.bold().big().italics()+"
")}).catch(function(t){i.$emit("handleError",t)})},eventAfterRender:function(e,n,i){for(var r,s,o,l=0;le&&s[i].start48*this.range&&(h=48*this.range);for(var p=d;p=0;c-=this.time/1e3)c%((this.space+1)*this.time/1e3)==0?i.push(c):i.push("");a=[];for(var d in t)null!==t[d].metrics[n]&&this.isVisible(t[d].metrics[n],n)&&(s=isNaN(t[d].metrics[n])?t[d].metrics[n].value:t[d].metrics[n],o=isNaN(t[d].metrics[n])?t[d].metrics[n].unit:"",r=t[d].metrics.mem_total.value,a.push(this.createDataset(d,e+t[d].index,this.setColor(t[d].index+1),s)));return l=u.a.orderBy(a,"label"),{metricName:n,data:{labels:i,datasets:l},options:this.createOptions(r,n,o)}},createDataset:function(t,e,n,i){for(var r=[],s=0;s1&&void 0!==arguments[1]&&arguments[1];this.taskId=t,this.actionFlag||(this.snackbar=!0,this.actionFlag=!0,i.a.request("get","/tasks/"+t+"/log?tail="+n,this.$store.state.accessToken).then(function(t){e.logs=t.data.output_lines,e.path=t.data.path,e.showModalLog=!0}).catch(function(t){e.handleError(t)}).finally(function(){e.snackbar=!1,e.actionFlag=!1}))},openFromTemplate:function(t){this.chosenTemplate=t,this.showModalCreate=!0}}}},function(t,e,n){"use strict";var i=n(2),r=n(325);e.a={components:{TaskLine:r.a},props:{showModal:Boolean,hostnames:Array,hosts:Object,actionFlag:Boolean,chosenTemplate:String},data:function(){return{newParameter:"",linesIds:1,lines:[{id:0,host:"",resource:"",command:"",parameters:[],envVariables:[],parameterIds:0,envVariableIds:0,enableTfConfig:!1,tfConfig:"",tfConfigPort:"",tfConfigTaskType:"",tfConfigTaskIndex:-1}],tfCluster:{},staticParameters:[],staticEnvVariables:[],isNewFieldStatic:!1,enableSmartTfConfig:!1,show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){if(!1===this.show)this.close();else switch(this.emptyParametersAndEnvVariables(),this.chosenTemplate){case"tf1":this.addParameter(void 0,"--ps_hosts="),this.addParameter(void 0,"--worker_hosts="),this.addParameter(void 0,"--job_name=","worker"),this.addParameter(void 0,"--task_index="),this.staticParameters=["--ps_hosts=","--worker_hosts="];break;case"tf2":this.enableSmartTfConfig=!0,this.addEnvVariable(void 0,"TF_CONFIG");break;case"torch":this.addParameter(void 0,"--init-method="),this.addParameter(void 0,"--backend=","gloo"),this.addParameter(void 0,"--rank="),this.addParameter(void 0,"--world-size="),this.staticParameters=["--init-method=","--backend=","--world-size="]}}},methods:{close:function(){this.$emit("close")},addTasks:function(){var t=this;for(var e in this.lines){var n=this.lines[e],r=this.convertResource(n.resource);n.enableTfConfig&&(r+=" TF_CONFIG="+n.tfConfig);for(var s in n.envVariables){var o=n.envVariables[s];r+=" "+o.envVariable+"="+o.value}r+=" "+n.command;for(var a in n.parameters){var l=n.parameters[a],c=l.parameter.length;" "===l.parameter.charAt(c-1)||"="===l.parameter.charAt(c-1)?r+=" "+l.parameter+l.value:r+=" "+l.parameter+" "+l.value}var u={userId:this.$store.state.id,hostname:n.host,command:r};this.actionFlag||i.a.request("post","/tasks",this.$store.state.accessToken,u).then(function(e){t.close(),t.$emit("getTasks",!1)})}},addParameter:function(t,e,n){var i=0;for(var r in this.lines){var s={id:this.lines[r].parameterIds,parameter:e||this.newParameter,value:n||""};("tf1"===this.chosenTemplate&&"--task_index="===e||"torch"===this.chosenTemplate&&"--rank="===e||"torch"===this.chosenTemplate&&"--world-size="===e)&&("--world-size="===e?(i++,s.value=i.toString()):(s.value=i.toString(),i++)),this.lines[r].parameterIds++,this.lines[r].parameters.push(s)}this.isNewFieldStatic&&this.staticParameters.push(e||this.newParameter)},addEnvVariable:function(t,e,n){var i=e||this.newParameter;"="===i.charAt(i.length-1)&&(i=i.substring(0,i.length-1));var r;if("TF_CONFIG"===i){this.chosenTemplate="tf2";for(r in this.lines)this.lines[r].enableTfConfig=!0,this.lines[r].tfConfig="";var s={};for(r in this.lines){var o=this.lines[r].host;this.updateTfConfigTaskType(this.lines[r].id,"worker"),o&&(s.hasOwnProperty(o)?(this.updateTfConfigPort(this.lines[r].id,s[o].toString()),s[o]++):(this.updateTfConfigPort(this.lines[r].id,"2222"),s[o]=2223))}}else{for(r in this.lines){var a={id:this.lines[r].envVariableIds,envVariable:i,value:n||""};this.lines[r].envVariableIds++,this.lines[r].envVariables.push(a)}this.isNewFieldStatic&&this.staticEnvVariables.push(i)}},copyLine:function(){if(0===this.lines.length)this.addLine();else{var t=this.lines[this.lines.length-1],e=t.parameters,n=[];for(var i in e){var r=e[i],s={id:i,parameter:r.parameter,value:r.value};("tf1"===this.chosenTemplate&&"--task_index="===s.parameter||"torch"===this.chosenTemplate&&"--rank="===s.parameter||"torch"===this.chosenTemplate&&"--world-size="===s.parameter)&&(s.value=(parseInt(s.value)+1).toString()),n.push(s)}var o=t.envVariables,a=[];for(var l in o){var c=o[l],u={id:l,envVariable:c.envVariable,value:c.value};a.push(u)}var d={id:this.linesIds,host:t.host,resource:t.resource,command:t.command,parameters:n,envVariables:a,enableTfConfig:t.enableTfConfig,tfConfig:t.tfConfig,tfConfigPort:"",tfConfigTaskType:"",tfConfigTaskIndex:-1};if(this.linesIds++,this.lines.push(d),t.enableTfConfig&&this.enableSmartTfConfig&&(this.updateTfConfigTaskType(d.id,t.tfConfigTaskType),d.host)){var h={};h[d.host]=2221;for(var p in this.lines)this.lines[p].host&&this.lines[p].tfConfigPort&&(h.hasOwnProperty(this.lines[p].host)?h[this.lines[p].host]=Math.max(h[this.lines[p].host],parseInt(this.lines[p].tfConfigPort)):h[this.lines[p].host]=2221);this.updateTfConfigPort(d.id,(h[d.host]+1).toString())}}},addLine:function(){var t={id:this.linesIds,host:"",resource:"",command:"",envVariables:[],parameters:[],parameterIds:0,envVariableIds:0,enableTfConfig:!1,tfConfig:"",tfConfigPort:"",tfConfigTaskType:"",tfConfigTaskIndex:-1};this.linesIds++,this.lines.push(t)},changeLine:function(t,e,n,i,r,s,o,a){for(var l in this.lines)this.lines[l].id===t&&(e!==this.lines[l].host&&o&&this.enableSmartTfConfig&&this.updateTfConfigHost(t,e),"tf1"===this.chosenTemplate&&this.updatePsWorkerHosts(l,e),this.lines[l].host=e,this.lines[l].resource=n,this.lines[l].command=i,this.lines[l].parameters=r,this.lines[l].envVariables=s,this.lines[l].enableTfConfig=o,this.lines[l].tfConfig=a)},deleteLine:function(t){for(var e in this.lines)this.lines[e].id===t&&(this.lines[e].enableTfConfig&&this.enableSmartTfConfig&&this.updateTfConfigTaskType(this.lines[e].id,""),this.lines.splice(e,1))},staticParameterChanged:function(t,e,n){for(var i in this.lines)if(this.lines[i].id!==t)for(var r in this.lines[i].parameters)this.lines[i].parameters[r].parameter===e&&(this.lines[i].parameters[r].value=n)},staticParameterDeleted:function(t,e){var n=this.staticParameters.indexOf(e);-1!==n&&this.staticParameters.splice(n,1);for(var i in this.lines)if(this.lines[i].id!==t)for(var r in this.lines[i].parameters)this.lines[i].parameters[r].parameter===e&&this.lines[i].parameters.splice(r,1)},staticEnvVariableChanged:function(t,e,n){for(var i in this.lines)if(this.lines[i].id!==t)for(var r in this.lines[i].envVariables)this.lines[i].envVariables[r].envVariable===e&&(this.lines[i].envVariables[r].value=n)},staticEnvVariableDeleted:function(t,e){var n=this.staticEnvVariables.indexOf(e);-1!==n&&this.staticEnvVariables.splice(n,1);for(var i in this.lines)if(this.lines[i].id!==t)for(var r in this.lines[i].envVariables)this.lines[i].envVariables[r].envVariable===e&&this.lines[i].envVariables.splice(r,1)},updatePsWorkerHosts:function(t,e){var n=[],i=[],r=2222;for(var s in this.lines){var o=this.lines[s],a="";for(var l in o.parameters)"--job_name="===o.parameters[l].parameter&&(a=o.parameters[l].value);for(var c in o.parameters)if("--task_index="===o.parameters[c].parameter){var u="";u=s===t?e:o.host,"worker"===a?(i[o.parameters[c].value]=u+":"+r.toString(),r++):"ps"===a&&(n[o.parameters[c].value]=u+":"+r.toString(),r++)}}var d="",h="";for(var p in n)d+=n[p]+",";d=d.replace(/,\s*$/,"");for(var f in i)h+=i[f]+",";h=h.replace(/,\s*$/,"");for(var v in this.lines)for(var g in this.lines[v].parameters)"--ps_hosts="===this.lines[v].parameters[g].parameter?this.lines[v].parameters[g].value=d:"--worker_hosts="===this.lines[v].parameters[g].parameter&&(this.lines[v].parameters[g].value=h)},updateTfConfigHost:function(t,e){var n;for(n in this.lines)if(this.lines[n].id===t)break;var i={};i[e]=2221;for(var r in this.lines)this.lines[r].id!==t&&this.lines[r].host&&this.lines[r].tfConfigPort&&(i.hasOwnProperty(this.lines[r].host)?i[this.lines[r].host]=Math.max(i[this.lines[r].host],parseInt(this.lines[r].tfConfigPort)):i[this.lines[r].host]=2221);this.lines[n].tfConfigPort=(i[e]+1).toString();var s=this.lines[n].tfConfigTaskIndex;if(-1!==s){var o=this.lines[n].tfConfigTaskType;this.tfCluster[o][s]=e+":"+this.lines[n].tfConfigPort,this.tfCluster.__ob__.dep.notify()}},updateTfConfigPort:function(t,e){var n;for(n in this.lines)if(this.lines[n].id===t)break;if(this.lines[n].enableTfConfig&&this.enableSmartTfConfig){this.lines[n].tfConfigPort=e;var i=this.lines[n].tfConfigTaskIndex;if(-1!==i){var r=this.lines[n].tfConfigTaskType;this.tfCluster[r][i]=this.lines[n].host+":"+this.lines[n].tfConfigPort,this.tfCluster.__ob__.dep.notify()}}},updateTfConfigTaskType:function(t,e){var n;for(n in this.lines)if(this.lines[n].id===t)break;if(this.lines[n].enableTfConfig&&this.enableSmartTfConfig){var i=this.lines[n].tfConfigTaskType;if(i&&0!==i.length){var r=this.lines[n].tfConfigTaskIndex;if(this.tfCluster[i].splice(r,1),0!==this.tfCluster[i].length)for(var s in this.lines)this.lines[s].tfConfigTaskType===i&&this.lines[s].tfConfigTaskIndex>r&&(this.lines[s].tfConfigTaskIndex-=1);else delete this.tfCluster[i]}e&&0!==e.length?(this.tfCluster.hasOwnProperty(e)||(this.tfCluster[e]=[]),this.lines[n].tfConfigTaskType=e,this.lines[n].tfConfigTaskIndex=this.tfCluster[e].length,this.tfCluster[e].push(this.lines[n].host+":"+this.lines[n].tfConfigPort)):(this.lines[n].tfConfigTaskType=e,this.lines[n].tfConfigTaskIndex=-1),this.tfCluster.__ob__.dep.notify()}},updateTfConfigTaskIndex:function(t,e){var n;for(n in this.lines)if(this.lines[n].id===t)break;if(this.lines[n].enableTfConfig&&this.enableSmartTfConfig&&e!==this.lines[n].tfConfigTaskIndex){var i=this.lines[n].tfConfigTaskType,r=this.lines[n].tfConfigTaskIndex;if(this.tfCluster[i].length<=e?e=0:e<0&&(e=this.tfCluster[i].length-1),e!==this.lines[n].tfConfigTaskIndex){var s=this.tfCluster[i][r];this.tfCluster[i].splice(r,1);for(var o in this.lines)this.lines[o].tfConfigTaskType===i&&this.lines[o].tfConfigTaskIndex>r&&(this.lines[o].tfConfigTaskIndex-=1),this.lines[o].tfConfigTaskType===i&&this.lines[o].tfConfigTaskIndex>=e&&(this.lines[o].tfConfigTaskIndex+=1);this.tfCluster[i].splice(e,0,s),this.lines[n].tfConfigTaskIndex=e,this.tfCluster.__ob__.dep.notify()}}},convertResource:function(t){return""!==t&&null!==t?"CPU"===t?"CUDA_VISIBLE_DEVICES=":"CUDA_VISIBLE_DEVICES="+t[3]:""},emptyParametersAndEnvVariables:function(){this.enableSmartTfConfig=!1,this.isNewFieldStatic=!1,this.staticParameters=[],this.staticEnvVariables=[];for(var t in this.lines)this.lines[t].tfConfigTaskIndex=0,this.lines[t].tfConfigTaskType="",this.lines[t].tfConfigPort="",this.lines[t].enableTfConfig=!1,this.lines[t].parameters=[],this.lines[t].parameterIds=0,this.lines[t].envVariables=[],this.lines[t].envVariableIds=0;this.tfCluster={}}}}},function(t,e,n){"use strict";var i=n(327),r=n.n(i),s=n(330),o=n(333),a=n(336);e.a={components:{TaskLineTfConfig:a.a,TaskLineParameter:s.a,TaskLineEnvVariable:o.a},props:{hostnames:Array,hosts:Object,host:String,resource:String,command:String,parameters:Array,staticParameters:Array,envVariables:Array,staticEnvVariables:Array,enableTfConfig:Boolean,tfConfig:String,tfConfigPort:String,tfConfigTaskType:String,tfConfigTaskIndex:Number,tfCluster:Object,enableSmartTfConfig:Boolean},data:function(){return{newHost:"",newResource:"",newEnvVariables:[{id:0,envVariable:"",value:""}],newCommand:"",newParameters:[{id:0,parameter:"",value:""}],newEnableTfConfig:!1,newTfConfig:"",showModal:!1}},created:function(){this.newHost=this.host,this.newResource=this.resource,this.newEnvVariables=this.envVariables,this.envVariableIds=this.envVariables.length,this.newCommand=this.command,this.newParameters=this.parameters,this.parameterIds=this.parameters.length,this.newEnableTfConfig=this.enableTfConfig,this.newTfConfig=this.tfConfig},computed:{hostResources:function(){return""!==this.newHost?this.hosts[this.newHost].resources:[]},taskPreview:function(){var t="";for(var e in this.parameters){var n=this.parameters[e].parameter.length;" "===this.parameters[e].parameter.charAt(n-1)||"="===this.parameters[e].parameter.charAt(n-1)?t+=this.parameters[e].parameter+this.parameters[e].value+" ":t+=this.parameters[e].parameter+" "+this.parameters[e].value+" "}var i="";this.newEnableTfConfig&&(i+="TF_CONFIG="+this.newTfConfig+" ");for(var r in this.envVariables)i+=this.envVariables[r].envVariable+"="+this.envVariables[r].value+" ";return this.host+" "+this.convertResource(this.resource)+" "+i+" "+this.command+" "+t}},watch:{parameters:function(){this.newParameters=this.parameters},envVariables:function(){this.newEnvVariables=this.envVariables},enableTfConfig:function(){this.newEnableTfConfig=this.enableTfConfig},tfConfig:function(){this.newTfConfig=this.tfConfig},newHost:function(){this.newResource=this.hosts[this.newHost].resources[0],this.updateLine()},newResource:function(){this.updateLine()},newCommand:function(){this.updateLine()},newParameters:function(){this.updateLine()},newEnvVariables:function(){this.updateLine()},newEnableTfConfig:function(){this.updateLine()},newTfConfig:function(){this.updateLine()}},methods:{convertResource:function(t){return""!==t&&null!==t?"CPU"===t?"CUDA_VISIBLE_DEVICES=":"CUDA_VISIBLE_DEVICES="+t[3]:""},changeParameter:function(t,e,n){for(var i in this.parameters)if(this.parameters[i].id===t){this.parameters[i].parameter=e,this.parameters[i].value=n;var s=!0,o=!1,a=void 0;try{for(var l,c=r()(this.staticParameters);!(s=(l=c.next()).done);s=!0){var u=l.value;e===u&&this.$emit("staticParameterChanged",e,n)}}catch(t){o=!0,a=t}finally{try{!s&&c.return&&c.return()}finally{if(o)throw a}}"--job_name="!==e&&"--task_index="!==e||this.$emit("psWorkerParameterChanged")}},deleteParameter:function(t){for(var e in this.parameters)if(this.parameters[e].id===t){var n=!0,i=!1,s=void 0;try{for(var o,a=r()(this.staticParameters);!(n=(o=a.next()).done);n=!0){var l=o.value;this.parameters[e].parameter===l&&this.$emit("staticParameterDeleted",l)}}catch(t){i=!0,s=t}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}this.parameters.splice(e,1)}},changeEnvVariable:function(t,e,n){for(var i in this.envVariables)if(this.envVariables[i].id===t){this.envVariables[i].envVariable=e,this.envVariables[i].value=n;var s=!0,o=!1,a=void 0;try{for(var l,c=r()(this.staticEnvVariables);!(s=(l=c.next()).done);s=!0){var u=l.value;e===u&&this.$emit("staticEnvVariableChanged",e,n)}}catch(t){o=!0,a=t}finally{try{!s&&c.return&&c.return()}finally{if(o)throw a}}}},deleteEnvVariable:function(t){for(var e in this.envVariables)if(this.envVariables[e].id===t){var n=!0,i=!1,s=void 0;try{for(var o,a=r()(this.staticEnvVariables);!(n=(o=a.next()).done);n=!0){var l=o.value;this.envVariables[e].envVariable===l&&this.$emit("staticEnvVariableDeleted",l)}}catch(t){i=!0,s=t}finally{try{!n&&a.return&&a.return()}finally{if(i)throw s}}this.envVariables.splice(e,1)}},changeTfConfig:function(t){this.newTfConfig=t},deleteTfConfig:function(){this.$emit("updateTfConfigTaskType",""),this.newEnableTfConfig=!1,this.newTfConfig=""},updateTfConfigPort:function(t){this.$emit("updateTfConfigPort",t)},updateTfConfigTaskType:function(t){this.$emit("updateTfConfigTaskType",t)},updateTfConfigTaskIndex:function(t){this.$emit("updateTfConfigTaskIndex",t)},updateLine:function(){this.$emit("changeLine",this.newHost,this.newResource,this.newCommand,this.newParameters,this.newEnvVariables,this.newEnableTfConfig,this.newTfConfig)},removeMe:function(){this.$emit("deleteLine")}}}},function(t,e,n){"use strict";e.a={props:{parameter:String,value:String},data:function(){return{newParameter:"",newValue:""}},created:function(){this.newParameter=this.parameter,this.newValue=this.value},watch:{value:function(){this.newValue=this.value},newParameter:function(){this.$emit("changeParameter",this.newParameter,this.newValue)},newValue:function(){this.$emit("changeParameter",this.newParameter,this.newValue)}},methods:{removeMe:function(){this.$emit("deleteParameter")}}}},function(t,e,n){"use strict";e.a={props:{envVariable:String,value:String},data:function(){return{newEnvVariable:"",newValue:"",showModalTfConfigEdit:!1}},created:function(){this.newEnvVariable=this.envVariable,this.newValue=this.value},watch:{value:function(){this.newValue=this.value},newEnvVariable:function(){this.$emit("changeEnvVariable",this.newEnvVariable,this.newValue)},newValue:function(){this.$emit("changeEnvVariable",this.newEnvVariable,this.newValue)}},methods:{removeMe:function(){this.$emit("deleteEnvVariable")},updateValue:function(t){this.newValue=t}}}},function(t,e,n){"use strict";var i=n(13),r=n.n(i),s=n(338);e.a={components:{TfConfigEdit:s.a},name:"TaskLineTfConfig",props:{value:String,port:String,taskType:String,taskIndex:Number,tfCluster:Object,enableSmartTfConfig:Boolean},data:function(){return{newValue:"",newPort:"",newTaskType:"",taskTypeItems:["chief","evaluator","master","ps","worker"],newTaskIndex:-1,localEnableSmartTfConfig:!1,showModalTfConfigEdit:!1}},created:function(){this.newValue=this.value,this.newPort=this.port,this.newTaskType=this.taskType,this.newTaskIndex=this.taskIndex,this.localEnableSmartTfConfig=this.enableSmartTfConfig},watch:{value:function(){this.newValue=this.value},port:function(){this.newPort=this.port},taskType:function(){this.newTaskType=this.taskType},taskIndex:function(){this.newTaskIndex=this.taskIndex},tfCluster:function(){if(this.newTaskIndex>=0){var t={cluster:this.tfCluster,task:{type:this.newTaskType,index:this.newTaskIndex}};this.updateValue("'"+r()(t).split('"').join('\\"')+"'")}else this.updateValue("")},enableSmartTfConfig:function(){this.localEnableSmartTfConfig=this.enableSmartTfConfig},newValue:function(){this.$emit("changeTfConfig",this.newValue)},newPort:function(){this.$emit("updateTfConfigPort",this.newPort)},newTaskType:function(){this.$emit("updateTfConfigTaskType",this.newTaskType)},newTaskIndex:function(){isNaN(parseInt(this.newTaskIndex))?this.newTaskIndex=this.taskIndex:this.$emit("updateTfConfigTaskIndex",parseInt(this.newTaskIndex))}},methods:{removeMe:function(){this.$emit("deleteTfConfig")},updateValue:function(t){this.newValue=t}}}},function(t,e,n){"use strict";var i=n(13),r=n.n(i);e.a={name:"TfConfigEdit",props:{value:String,showModal:Boolean},data:function(){return{newValue:"",properJson:!1,show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){!1===this.show?this.close():this.newValue=this.desanitize(this.value)},newValue:function(){try{JSON.parse(this.newValue),this.properJson=!0}catch(t){this.properJson=!1}}},methods:{close:function(){this.$emit("close")},save:function(){this.close(),this.$emit("updateValue",this.sanitize(this.newValue))},sanitize:function(t){return t=r()(JSON.parse(t)),"'"+t.split('"').join('\\"')+"'"},desanitize:function(t){try{return r()(JSON.parse(t.split("'").join("").split('\\"').join('"')),null,2)}catch(e){return t}}}}},function(t,e,n){"use strict";var i=n(2);e.a={props:{showModal:Boolean,taskId:Number,hostname:String,command:String,actionFlag:Boolean},data:function(){return{newHost:"",newCommand:"",show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){!1===this.show&&this.close()},hostname:function(){this.newHost=this.hostname},command:function(){this.newCommand=this.command}},methods:{changeTask:function(){var t=this,e={hostname:this.newHost,command:this.newCommand};this.actionFlag||(this.$emit("changeActionFlag",!0),this.$emit("changeSnackbar",!0),i.a.request("put","/tasks/"+this.taskId,this.$store.state.accessToken,e).then(function(e){t.close(),t.$emit("getTask",t.taskId,!0)}))},close:function(){this.$emit("close")}}}},function(t,e,n){"use strict";var i=n(2),r=n(0),s=n.n(r);e.a={props:{showModal:Boolean,taskId:Number,spawnTime:String,terminateTime:String,actionFlag:Boolean,multipleFlag:Boolean,selected:Array},data:function(){return{spawnTimeMenu:!1,spawnDateMenu:!1,terminateTimeMenu:!1,terminateDateMenu:!1,spawn:!1,terminate:!1,newSpawnDate:"",newSpawnTime:"",newTerminateDate:"",newTerminateTime:"",selectedIndex:0,show:!1}},watch:{showModal:function(){this.show=this.showModal},show:function(){!1===this.show&&this.close()},spawnTime:function(){null!==this.spawnTime?(this.newSpawnDate=s()(this.spawnTime).format("YYYY-MM-DD"),this.newSpawnTime=s()(this.spawnTime).format("HH:mm")):(this.newSpawnDate="",this.newSpawnTime="")},terminateTime:function(){null!==this.terminateTime?(this.newTerminateDate=s()(this.terminateTime).format("YYYY-MM-DD"),this.newTerminateTime=s()(this.terminateTime).format("HH:mm")):(this.newTerminateDate="",this.newTerminateTime="")}},methods:{actionSave:function(){this.$refs.menu.save(this.newSpawnTime)},checkActionFlag:function(){!1===this.actionFlag&&(this.$emit("changeActionFlag",!0),this.$emit("changeSnackbar",!0),this.scheduleTasks())},scheduleTasks:function(){var t=this,e={};""!==this.newSpawnTime&&null!==this.newSpawnTime&&void 0!==this.newSpawnTime&&(e.spawnAt=s()(this.newSpawnDate+"T"+this.newSpawnTime).toISOString()),""!==this.newTerminateTime&&null!==this.newTerminateTime&&void 0!==this.newTerminateTime&&(e.terminateAt=s()(this.newTerminateDate+"T"+this.newTerminateTime).toISOString()),this.spawn||(e.spawnAt=null),this.terminate||(e.terminateAt=null);var n;n=this.multipleFlag?this.selected[this.selectedIndex].id:this.taskId,i.a.request("put","/tasks/"+n,this.$store.state.accessToken,e).then(function(e){t.close(),t.getTask(n)}).catch(function(e){t.$emit("handleError",e),t.close(),t.getTask(n)})},getTask:function(t){var e=this;i.a.request("get","/tasks/"+t,this.$store.state.accessToken).then(function(n){e.$emit("updateTask",t,n.data.task),e.multipleFlag?(e.selectedIndex++,e.selectedIndex *").each(function(t,n){var i=pt(n).outerWidth();i>e&&(e=i)}),e++,t.width(e),e}function u(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function d(t){var e=t.css("position"),n=t.parents().filter(function(){var t=pt(this);return/(auto|scroll)/.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&n.length?n:pt(t[0].ownerDocument||document)}function h(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function p(t,e){var n=t.offset(),i=v(t),r=n.left+w(t,"border-left-width")+i.left-(e?e.left:0),s=n.top+w(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:s,bottom:s+t[0].clientHeight}}function f(t,e){var n=t.offset(),i=n.left+w(t,"border-left-width")+w(t,"padding-left")-(e?e.left:0),r=n.top+w(t,"border-top-width")+w(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function v(t){var e,n=t[0].offsetWidth-t[0].clientWidth,i=t[0].offsetHeight-t[0].clientHeight;return n=g(n),i=g(i),e={left:0,right:0,top:0,bottom:i},m()&&"rtl"===t.css("direction")?e.left=n:e.right=n,e}function g(t){return t=Math.max(0,t),t=Math.round(t)}function m(){return null===ft&&(ft=y()),ft}function y(){var t=pt("
").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),e=t.children(),n=e.offset().left>t.offset().left;return t.remove(),n}function w(t,e){return parseFloat(t.css(e))||0}function b(t){return 1===t.which&&!t.ctrlKey}function T(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageX:t.pageX}function C(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageY:t.pageY}function _(t){return/^touch/.test(t.type)}function S(t){t.addClass("fc-unselectable").on("selectstart",E)}function D(t){t.removeClass("fc-unselectable").off("selectstart",E)}function E(t){t.preventDefault()}function k(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left=1&&ct(s)));i++);return r}function V(t,e){var n=z(t);return"week"===n&&"object"==typeof e&&e.days&&(n="day"),n}function j(t,e,n){return null!=n?n.diff(e,t,!0):ht.isDuration(e)?e.as(t):e.end.diff(e.start,t,!0)}function L(t,e,n){var i;return G(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ct(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function B(t,e){var n,i;return G(t)||G(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ct(n)&&Math.abs(i)>=1&&ct(i)?n/i:t.asDays()/e.asDays())}function U(t,e){var n;return G(t)?ht.duration(t*e):(n=t.asMonths(),Math.abs(n)>=1&&ct(n)?ht.duration({months:n*e}):ht.duration({days:t.asDays()*e}))}function G(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function $(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function Y(t){return"string"==typeof t&&/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function W(){for(var t=[],e=0;e=0;s--)if("object"==typeof(o=t[s][i]))r.unshift(o);else if(void 0!==o){l[i]=o;break}r.length&&(l[i]=Z(r))}for(n=t.length-1;n>=0;n--){a=t[n];for(i in a)i in l||(l[i]=a[i])}return l}function K(t,e){for(var n in t)X(t,n)&&(e[n]=t[n])}function X(t,e){return vt.call(t,e)}function Q(t,e,n){if(pt.isFunction(t)&&(t=[t]),t){var i=void 0,r=void 0;for(i=0;i/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function rt(t){return t.replace(/&.*?;/g,"")}function st(t){var e=[];return pt.each(t,function(t,n){null!=n&&e.push(t+":"+n)}),e.join(";")}function ot(t){var e=[];return pt.each(t,function(t,n){null!=n&&e.push(t+'="'+it(n)+'"')}),e.join(" ")}function at(t){return t.charAt(0).toUpperCase()+t.slice(1)}function lt(t,e){return t-e}function ct(t){return t%1==0}function ut(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function dt(t,e,n){void 0===n&&(n=!1);var i,r,s,o,a,l=function(){var c=+new Date-o;ca&&o.push(new t(a,s.startMs)),s.endMs>a&&(a=s.endMs);return at.startMs)&&(null==this.startMs||null==t.endMs||this.startMs=this.startMs)&&(null==this.endMs||null!=t.endMs&&t.endMs<=this.endMs)},t.prototype.containsDate=function(t){var e=t.valueOf();return(null==this.startMs||e>=this.startMs)&&(null==this.endMs||e=this.endMs&&(e=this.endMs-1),e},t.prototype.equals=function(t){return this.startMs===t.startMs&&this.endMs===t.endMs},t.prototype.clone=function(){var e=new t(this.startMs,this.endMs);return e.isStart=this.isStart,e.isEnd=this.isEnd,e},t.prototype.getStart=function(){return null!=this.startMs?s.default.utc(this.startMs).stripZone():null},t.prototype.getEnd=function(){return null!=this.endMs?s.default.utc(this.endMs).stripZone():null},t.prototype.as=function(t){return r.utc(this.endMs).diff(r.utc(this.startMs),t,!0)},t}();e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(208),o=n(33),a=n(49),l=function(t){function e(n){var i=t.call(this)||this;return i.calendar=n,i.className=[],i.uid=String(e.uuid++),i}return i.__extends(e,t),e.parse=function(t,e){var n=new this(e);return!("object"!=typeof t||!n.applyProps(t))&&n},e.normalizeId=function(t){return t?String(t):null},e.prototype.fetch=function(t,e,n){},e.prototype.removeEventDefsById=function(t){},e.prototype.removeAllEventDefs=function(){},e.prototype.getPrimitive=function(t){},e.prototype.parseEventDefs=function(t){var e,n,i=[];for(e=0;e0},e}(s.default);e.default=o},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.isAllDay=!1,this.unzonedRange=t,this.isAllDay=e}return t.prototype.toLegacy=function(t){return{start:t.msToMoment(this.unzonedRange.startMs,this.isAllDay),end:t.msToMoment(this.unzonedRange.endMs,this.isAllDay)}},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(34),s=n(209),o=n(17),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildInstances=function(){return[this.buildInstance()]},e.prototype.buildInstance=function(){return new s.default(this,this.dateProfile)},e.prototype.isAllDay=function(){return this.dateProfile.isAllDay()},e.prototype.clone=function(){var e=t.prototype.clone.call(this);return e.dateProfile=this.dateProfile,e},e.prototype.rezone=function(){var t=this.source.calendar,e=this.dateProfile;this.dateProfile=new o.default(t.moment(e.start),e.end?t.moment(e.end):null,t)},e.prototype.applyManualStandardProps=function(e){var n=t.prototype.applyManualStandardProps.call(this,e),i=o.default.parse(e,this.source);return!!i&&(this.dateProfile=i,null!=e.date&&(this.miscProps.date=e.date),n)},e}(r.default);e.default=a,a.defineStandardProps({start:!1,date:!1,end:!1,allDay:!1})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(){}return t.mixInto=function(t){var e=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){t.prototype[n]||(t.prototype[n]=e.prototype[n])})},t.mixOver=function(t){var e=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){t.prototype[n]=e.prototype[n]})},t}();e.default=n},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){this.view=t._getView(),this.component=t}return t.prototype.opt=function(t){return this.view.opt(t)},t.prototype.end=function(){},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.version="3.9.0",e.internalApiVersion=12;var i=n(4);e.applyAll=i.applyAll,e.debounce=i.debounce,e.isInt=i.isInt,e.htmlEscape=i.htmlEscape,e.cssToStr=i.cssToStr,e.proxy=i.proxy,e.capitaliseFirstLetter=i.capitaliseFirstLetter,e.getOuterRect=i.getOuterRect,e.getClientRect=i.getClientRect,e.getContentRect=i.getContentRect,e.getScrollbarWidths=i.getScrollbarWidths,e.preventDefault=i.preventDefault,e.parseFieldSpecs=i.parseFieldSpecs,e.compareByFieldSpecs=i.compareByFieldSpecs,e.compareByFieldSpec=i.compareByFieldSpec,e.flexibleCompare=i.flexibleCompare,e.computeGreatestUnit=i.computeGreatestUnit,e.divideRangeByDuration=i.divideRangeByDuration,e.divideDurationByDuration=i.divideDurationByDuration,e.multiplyDuration=i.multiplyDuration,e.durationHasTime=i.durationHasTime,e.log=i.log,e.warn=i.warn,e.removeExact=i.removeExact,e.intersectRects=i.intersectRects;var r=n(47);e.formatDate=r.formatDate,e.formatRange=r.formatRange,e.queryMostGranularFormatUnit=r.queryMostGranularFormatUnit;var s=n(31);e.datepickerLocale=s.datepickerLocale,e.locale=s.locale;var o=n(10);e.moment=o.default;var a=n(11);e.EmitterMixin=a.default;var l=n(7);e.ListenerMixin=l.default;var c=n(48);e.Model=c.default;var u=n(207);e.Constraints=u.default;var d=n(5);e.UnzonedRange=d.default;var h=n(12);e.ComponentFootprint=h.default;var p=n(212);e.BusinessHourGenerator=p.default;var f=n(34);e.EventDef=f.default;var v=n(37);e.EventDefMutation=v.default;var g=n(38);e.EventSourceParser=g.default;var m=n(6);e.EventSource=m.default;var y=n(51);e.defineThemeSystem=y.defineThemeSystem;var w=n(18);e.EventInstanceGroup=w.default;var b=n(52);e.ArrayEventSource=b.default;var T=n(215);e.FuncEventSource=T.default;var C=n(216);e.JsonFeedEventSource=C.default;var _=n(36);e.EventFootprint=_.default;var S=n(33);e.Class=S.default;var D=n(14);e.Mixin=D.default;var E=n(53);e.CoordCache=E.default;var k=n(54);e.DragListener=k.default;var x=n(20);e.Promise=x.default;var M=n(217);e.TaskQueue=M.default;var R=n(218);e.RenderQueue=R.default;var I=n(39);e.Scroller=I.default;var P=n(19);e.Theme=P.default;var H=n(219);e.DateComponent=H.default;var F=n(40);e.InteractiveDateComponent=F.default;var O=n(220);e.Calendar=O.default;var A=n(41);e.View=A.default;var N=n(22);e.defineView=N.defineView,e.getViewConfig=N.getViewConfig;var z=n(55);e.DayTableMixin=z.default;var V=n(56);e.BusinessHourRenderer=V.default;var j=n(42);e.EventRenderer=j.default;var L=n(57);e.FillRenderer=L.default;var B=n(58);e.HelperRenderer=B.default;var U=n(222);e.ExternalDropping=U.default;var G=n(223);e.EventResizing=G.default;var $=n(59);e.EventPointing=$.default;var Y=n(224);e.EventDragging=Y.default;var W=n(225);e.DateSelecting=W.default;var q=n(60);e.StandardInteractionsMixin=q.default;var Z=n(226);e.AgendaView=Z.default;var K=n(227);e.TimeGrid=K.default;var X=n(61);e.DayGrid=X.default;var Q=n(62);e.BasicView=Q.default;var J=n(229);e.MonthView=J.default;var tt=n(230);e.ListView=tt.default},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(5),r=function(){function t(t,e,n){this.start=t,this.end=e||null,this.unzonedRange=this.buildUnzonedRange(n)}return t.parse=function(e,n){var i=e.start||e.date,r=e.end;if(!i)return!1;var s=n.calendar,o=s.moment(i),a=r?s.moment(r):null,l=e.allDay,c=s.opt("forceEventDuration");return!!o.isValid()&&(!a||a.isValid()&&a.isAfter(o)||(a=null),null==l&&null==(l=n.allDayDefault)&&(l=s.opt("allDayDefault")),!0===l?(o.stripTime(),a&&a.stripTime()):!1===l&&(o.hasTime()||o.time(0),a&&!a.hasTime()&&a.time(0)),!a&&c&&(a=s.getDefaultEventEnd(!o.hasTime(),o)),new t(o,a,s))},t.isStandardProp=function(t){return"start"===t||"date"===t||"end"===t||"allDay"===t},t.prototype.isAllDay=function(){return!(this.start.hasTime()||this.end&&this.end.hasTime())},t.prototype.buildUnzonedRange=function(t){var e=this.start.clone().stripZone().valueOf(),n=this.getEnd(t).stripZone().valueOf();return new i.default(e,n)},t.prototype.getEnd=function(t){return this.end?this.end.clone():t.getDefaultEventEnd(this.isAllDay(),this.start)},t}();e.default=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(5),r=n(35),s=n(211),o=function(){function t(t){this.eventInstances=t||[]}return t.prototype.getAllEventRanges=function(t){return t?this.sliceNormalRenderRanges(t):this.eventInstances.map(r.eventInstanceToEventRange)},t.prototype.sliceRenderRanges=function(t){return this.isInverse()?this.sliceInverseRenderRanges(t):this.sliceNormalRenderRanges(t)},t.prototype.sliceNormalRenderRanges=function(t){var e,n,i,r=this.eventInstances,o=[];for(e=0;e
')},e.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},e.prototype.destroy=function(){this.el.remove()},e.prototype.applyOverflow=function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},e.prototype.lockOverflow=function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},e.prototype.setHeight=function(t){this.scrollEl.height(t)},e.prototype.getScrollTop=function(){return this.scrollEl.scrollTop()},e.prototype.setScrollTop=function(t){this.scrollEl.scrollTop(t)},e.prototype.getClientWidth=function(){return this.scrollEl[0].clientWidth},e.prototype.getClientHeight=function(){return this.scrollEl[0].clientHeight},e.prototype.getScrollbarWidths=function(){return s.getScrollbarWidths(this.scrollEl)},e}(o.default);e.default=a},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(4),o=n(219),a=n(21),l=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.segSelector=".fc-event-container > *",i.dateSelectingClass&&(i.dateClicking=new i.dateClickingClass(i)),i.dateSelectingClass&&(i.dateSelecting=new i.dateSelectingClass(i)),i.eventPointingClass&&(i.eventPointing=new i.eventPointingClass(i)),i.eventDraggingClass&&i.eventPointing&&(i.eventDragging=new i.eventDraggingClass(i,i.eventPointing)),i.eventResizingClass&&i.eventPointing&&(i.eventResizing=new i.eventResizingClass(i,i.eventPointing)),i.externalDroppingClass&&(i.externalDropping=new i.externalDroppingClass(i)),i}return i.__extends(e,t),e.prototype.setElement=function(e){t.prototype.setElement.call(this,e),this.dateClicking&&this.dateClicking.bindToEl(e),this.dateSelecting&&this.dateSelecting.bindToEl(e),this.bindAllSegHandlersToEl(e)},e.prototype.removeElement=function(){this.endInteractions(),t.prototype.removeElement.call(this)},e.prototype.executeEventUnrender=function(){this.endInteractions(),t.prototype.executeEventUnrender.call(this)},e.prototype.bindGlobalHandlers=function(){t.prototype.bindGlobalHandlers.call(this),this.externalDropping&&this.externalDropping.bindToDocument()},e.prototype.unbindGlobalHandlers=function(){t.prototype.unbindGlobalHandlers.call(this),this.externalDropping&&this.externalDropping.unbindFromDocument()},e.prototype.bindDateHandlerToEl=function(t,e,n){var i=this;this.el.on(e,function(t){if(!r(t.target).is(i.segSelector+":not(.fc-helper),"+i.segSelector+":not(.fc-helper) *,.fc-more,a[data-goto]"))return n.call(i,t)})},e.prototype.bindAllSegHandlersToEl=function(t){[this.eventPointing,this.eventDragging,this.eventResizing].forEach(function(e){e&&e.bindToEl(t)})},e.prototype.bindSegHandlerToEl=function(t,e,n){var i=this;t.on(e,this.segSelector,function(t){var e=r(t.currentTarget);if(!e.is(".fc-helper")){var s=e.data("fc-seg");if(s&&!i.shouldIgnoreEventPointing())return n.call(i,s,t)}})},e.prototype.shouldIgnoreMouse=function(){return a.default.get().shouldIgnoreMouse()},e.prototype.shouldIgnoreTouch=function(){var t=this._getView();return t.isSelected||t.selectedEvent},e.prototype.shouldIgnoreEventPointing=function(){return this.eventDragging&&this.eventDragging.isDragging||this.eventResizing&&this.eventResizing.isResizing},e.prototype.canStartSelection=function(t,e){return s.getEvIsTouch(e)&&!this.canStartResize(t,e)&&(this.isEventDefDraggable(t.footprint.eventDef)||this.isEventDefResizable(t.footprint.eventDef))},e.prototype.canStartDrag=function(t,e){return!this.canStartResize(t,e)&&this.isEventDefDraggable(t.footprint.eventDef)},e.prototype.canStartResize=function(t,e){var n=this._getView(),i=t.footprint.eventDef;return(!s.getEvIsTouch(e)||n.isEventDefSelected(i))&&this.isEventDefResizable(i)&&r(e.target).is(".fc-resizer")},e.prototype.endInteractions=function(){[this.dateClicking,this.dateSelecting,this.eventPointing,this.eventDragging,this.eventResizing].forEach(function(t){t&&t.end()})},e.prototype.isEventDefDraggable=function(t){return this.isEventDefStartEditable(t)},e.prototype.isEventDefStartEditable=function(t){var e=t.isStartExplicitlyEditable();return null==e&&null==(e=this.opt("eventStartEditable"))&&(e=this.isEventDefGenerallyEditable(t)),e},e.prototype.isEventDefGenerallyEditable=function(t){var e=t.isExplicitlyEditable();return null==e&&(e=this.opt("editable")),e},e.prototype.isEventDefResizableFromStart=function(t){return this.opt("eventResizableFromStart")&&this.isEventDefResizable(t)},e.prototype.isEventDefResizableFromEnd=function(t){return this.isEventDefResizable(t)},e.prototype.isEventDefResizable=function(t){var e=t.isDurationExplicitlyEditable();return null==e&&null==(e=this.opt("eventDurationEditable"))&&(e=this.isEventDefGenerallyEditable(t)),e},e.prototype.diffDates=function(t,e){return this.largeUnit?s.diffByUnit(t,e,this.largeUnit):s.diffDayTime(t,e)},e.prototype.isEventInstanceGroupAllowed=function(t){var e,n=this._getView(),i=this.dateProfile,r=this.eventRangesToEventFootprints(t.getAllEventRanges());for(e=0;e1?"ll":"LL"},e.prototype.setDate=function(t){var e=this.get("dateProfile"),n=this.dateProfileGenerator.build(t,void 0,!0);e&&e.activeUnzonedRange.equals(n.activeUnzonedRange)||this.set("dateProfile",n)},e.prototype.unsetDate=function(){this.unset("dateProfile")},e.prototype.fetchInitialEvents=function(t){var e=this.calendar,n=t.isRangeAllDay&&!this.usesMinMaxTime;return e.requestEvents(e.msToMoment(t.activeUnzonedRange.startMs,n),e.msToMoment(t.activeUnzonedRange.endMs,n))},e.prototype.bindEventChanges=function(){this.listenTo(this.calendar,"eventsReset",this.resetEvents)},e.prototype.unbindEventChanges=function(){this.stopListeningTo(this.calendar,"eventsReset")},e.prototype.setEvents=function(t){this.set("currentEvents",t),this.set("hasEvents",!0)},e.prototype.unsetEvents=function(){this.unset("currentEvents"),this.unset("hasEvents")},e.prototype.resetEvents=function(t){this.startBatchRender(),this.unsetEvents(),this.setEvents(t),this.stopBatchRender()},e.prototype.requestDateRender=function(t){var e=this;this.requestRender(function(){e.executeDateRender(t)},"date","init")},e.prototype.requestDateUnrender=function(){var t=this;this.requestRender(function(){t.executeDateUnrender()},"date","destroy")},e.prototype.executeDateRender=function(e){t.prototype.executeDateRender.call(this,e),this.render&&this.render(),this.trigger("datesRendered"),this.addScroll({isDateInit:!0}),this.startNowIndicator()},e.prototype.executeDateUnrender=function(){this.unselect(),this.stopNowIndicator(),this.trigger("before:datesUnrendered"),this.destroy&&this.destroy(),t.prototype.executeDateUnrender.call(this)},e.prototype.bindBaseRenderHandlers=function(){var t=this;this.on("datesRendered",function(){t.whenSizeUpdated(t.triggerViewRender)}),this.on("before:datesUnrendered",function(){t.triggerViewDestroy()})},e.prototype.triggerViewRender=function(){this.publiclyTrigger("viewRender",{context:this,args:[this,this.el]})},e.prototype.triggerViewDestroy=function(){this.publiclyTrigger("viewDestroy",{context:this,args:[this,this.el]})},e.prototype.requestEventsRender=function(t){var e=this;this.requestRender(function(){e.executeEventRender(t),e.whenSizeUpdated(e.triggerAfterEventsRendered)},"event","init")},e.prototype.requestEventsUnrender=function(){var t=this;this.requestRender(function(){t.triggerBeforeEventsDestroyed(),t.executeEventUnrender()},"event","destroy")},e.prototype.requestBusinessHoursRender=function(t){var e=this;this.requestRender(function(){e.renderBusinessHours(t)},"businessHours","init")},e.prototype.requestBusinessHoursUnrender=function(){var t=this;this.requestRender(function(){t.unrenderBusinessHours()},"businessHours","destroy")},e.prototype.bindGlobalHandlers=function(){t.prototype.bindGlobalHandlers.call(this),this.listenTo(u.default.get(),{touchstart:this.processUnselect,mousedown:this.handleDocumentMousedown})},e.prototype.unbindGlobalHandlers=function(){t.prototype.unbindGlobalHandlers.call(this),this.stopListeningTo(u.default.get())},e.prototype.startNowIndicator=function(){var t,e,n,i=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit())&&(e=o.proxy(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),n=this.initialNowDate.clone().startOf(t).add(1,t).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout(function(){i.nowIndicatorTimeoutID=null,e(),n=+s.duration(1,t),n=Math.max(100,n),i.nowIndicatorIntervalID=setInterval(e,n)},n))},e.prototype.updateNowIndicator=function(){this.isDatesRendered&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add((new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},e.prototype.stopNowIndicator=function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},e.prototype.updateSize=function(e,n,i){this.setHeight?this.setHeight(e,n):t.prototype.updateSize.call(this,e,n,i),this.updateNowIndicator()},e.prototype.addScroll=function(t){var e=this.queuedScroll||(this.queuedScroll={});r.extend(e,t)},e.prototype.popScroll=function(){this.applyQueuedScroll(),this.queuedScroll=null},e.prototype.applyQueuedScroll=function(){this.queuedScroll&&this.applyScroll(this.queuedScroll)},e.prototype.queryScroll=function(){var t={};return this.isDatesRendered&&r.extend(t,this.queryDateScroll()),t},e.prototype.applyScroll=function(t){t.isDateInit&&this.isDatesRendered&&r.extend(t,this.computeInitialDateScroll()),this.isDatesRendered&&this.applyDateScroll(t)},e.prototype.computeInitialDateScroll=function(){return{}},e.prototype.queryDateScroll=function(){return{}},e.prototype.applyDateScroll=function(t){},e.prototype.reportEventDrop=function(t,e,n,i){var r=this.calendar.eventManager,o=r.mutateEventsWithId(t.def.id,e),a=e.dateMutation;a&&(t.dateProfile=a.buildNewDateProfile(t.dateProfile,this.calendar)),this.triggerEventDrop(t,a&&a.dateDelta||s.duration(),o,n,i)},e.prototype.triggerEventDrop=function(t,e,n,i,r){this.publiclyTrigger("eventDrop",{context:i[0],args:[t.toLegacy(),e,n,r,{},this]})},e.prototype.reportExternalDrop=function(t,e,n,i,r,s){e&&this.calendar.eventManager.addEventDef(t,n),this.triggerExternalDrop(t,e,i,r,s)},e.prototype.triggerExternalDrop=function(t,e,n,i,r){this.publiclyTrigger("drop",{context:n[0],args:[t.dateProfile.start.clone(),i,r,this]}),e&&this.publiclyTrigger("eventReceive",{context:this,args:[t.buildInstance().toLegacy(),this]})},e.prototype.reportEventResize=function(t,e,n,i){var r=this.calendar.eventManager,s=r.mutateEventsWithId(t.def.id,e);t.dateProfile=e.dateMutation.buildNewDateProfile(t.dateProfile,this.calendar),this.triggerEventResize(t,e.dateMutation.endDelta,s,n,i)},e.prototype.triggerEventResize=function(t,e,n,i,r){this.publiclyTrigger("eventResize",{context:i[0],args:[t.toLegacy(),e,n,r,{},this]})},e.prototype.select=function(t,e){this.unselect(e),this.renderSelectionFootprint(t),this.reportSelection(t,e)},e.prototype.renderSelectionFootprint=function(e){this.renderSelection?this.renderSelection(e.toLegacy(this.calendar)):t.prototype.renderSelectionFootprint.call(this,e)},e.prototype.reportSelection=function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},e.prototype.triggerSelect=function(t,e){var n=this.calendar.footprintToDateProfile(t);this.publiclyTrigger("select",{context:this,args:[n.start,n.end,e,this]})},e.prototype.unselect=function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",{context:this,args:[t,this]}))},e.prototype.selectEventInstance=function(t){this.selectedEventInstance&&this.selectedEventInstance===t||(this.unselectEventInstance(),this.getEventSegs().forEach(function(e){e.footprint.eventInstance===t&&e.el&&e.el.addClass("fc-selected")}),this.selectedEventInstance=t)},e.prototype.unselectEventInstance=function(){this.selectedEventInstance&&(this.getEventSegs().forEach(function(t){t.el&&t.el.removeClass("fc-selected")}),this.selectedEventInstance=null)},e.prototype.isEventDefSelected=function(t){return this.selectedEventInstance&&this.selectedEventInstance.def.id===t.id},e.prototype.handleDocumentMousedown=function(t){o.isPrimaryMouseButton(t)&&this.processUnselect(t)},e.prototype.processUnselect=function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},e.prototype.processRangeUnselect=function(t){var e;this.isSelected&&this.opt("unselectAuto")&&((e=this.opt("unselectCancel"))&&r(t.target).closest(e).length||this.unselect(t))},e.prototype.processEventUnselect=function(t){this.selectedEventInstance&&(r(t.target).closest(".fc-selected").length||this.unselectEventInstance())},e.prototype.triggerBaseRendered=function(){this.publiclyTrigger("viewRender",{context:this,args:[this,this.el]})},e.prototype.triggerBaseUnrendered=function(){this.publiclyTrigger("viewDestroy",{context:this,args:[this,this.el]})},e.prototype.triggerDayClick=function(t,e,n){var i=this.calendar.footprintToDateProfile(t);this.publiclyTrigger("dayClick",{context:e,args:[i.start,n,this]})},e.prototype.isDateInOtherMonth=function(t,e){return!1},e.prototype.getUnzonedRangeOption=function(t){var e=this.opt(t);if("function"==typeof e&&(e=e.apply(null,Array.prototype.slice.call(arguments,1))),e)return this.calendar.parseUnzonedRange(e)},e.prototype.initHiddenDays=function(){var t,e=this.opt("hiddenDays")||[],n=[],i=0;for(!1===this.opt("weekends")&&e.push(0,6),t=0;t<7;t++)(n[t]=-1!==r.inArray(t,e))||i++;if(!i)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(t){var e=t.getStart(),n=t.getEnd();return e&&(e=this.skipHiddenDays(e)),n&&(n=this.skipHiddenDays(n,-1,!0)),null===e||null===n||es&&(!l[o]||c.isSame(u,l[o]))&&(o-1!==s||"."!==d[o]);o--)g=d[o]+g;for(a=s;a<=o;a++)m+=d[a],y+=h[a];return(m||y)&&(w=r?y+i+m:m+i+y),v(p+w+g)}function a(t){return S[t]||(S[t]=l(t))}function l(t){var e=c(t);return{fakeFormatString:d(e),sameUnits:h(e)}}function c(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push.apply(n,u(e[1])):e[2]?n.push({maybe:c(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push.apply(n,u(e[5]));return n}function u(t){return". "===t?["."," "]:[t]}function d(t){var e,n,i=[];for(e=0;er.value)&&(r=i);return r?r.unit:null}Object.defineProperty(e,"__esModule",{value:!0});var m=n(10);m.newMomentProto.format=function(){return this._fullCalendar&&arguments[0]?r(this,arguments[0]):this._ambigTime?m.oldMomentFormat(i(this),"YYYY-MM-DD"):this._ambigZone?m.oldMomentFormat(i(this),"YYYY-MM-DD[T]HH:mm:ss"):this._fullCalendar?m.oldMomentFormat(i(this)):m.oldMomentProto.format.apply(this,arguments)},m.newMomentProto.toISOString=function(){return this._ambigTime?m.oldMomentFormat(i(this),"YYYY-MM-DD"):this._ambigZone?m.oldMomentFormat(i(this),"YYYY-MM-DD[T]HH:mm:ss"):this._fullCalendar?m.oldMomentProto.toISOString.apply(i(this),arguments):m.oldMomentProto.toISOString.apply(this,arguments)};var y="\v",w="",b="",T=new RegExp(b+"([^"+b+"]*)"+b,"g"),C={t:function(t){return m.oldMomentFormat(t,"a").charAt(0)},T:function(t){return m.oldMomentFormat(t,"A").charAt(0)}},_={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}};e.formatDate=r,e.formatRange=s;var S={};e.queryMostGranularFormatUnit=g},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(33),s=n(11),o=n(7),a=function(t){function e(){var e=t.call(this)||this;return e._watchers={},e._props={},e.applyGlobalWatchers(),e.constructed(),e}return i.__extends(e,t),e.watch=function(t){for(var e=[],n=1;n0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},t.prototype.clear=function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},t.prototype.ensureBuilt=function(){this.origin||this.build()},t.prototype.buildElHorizontals=function(){var t=[],e=[];this.els.each(function(n,r){var s=i(r),o=s.offset().left,a=s.outerWidth();t.push(o),e.push(o+a)}),this.lefts=t,this.rights=e},t.prototype.buildElVerticals=function(){var t=[],e=[];this.els.each(function(n,r){var s=i(r),o=s.offset().top,a=s.outerHeight();t.push(o),e.push(o+a)}),this.tops=t,this.bottoms=e},t.prototype.getHorizontalIndex=function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e=n[e]&&t=n[e]&&t0&&(t=r.getScrollParent(this.els.eq(0)),!t.is(document))?r.getClientRect(t):null},t.prototype.isPointInBounds=function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},t.prototype.isLeftInBounds=function(t){return!this.boundingRect||t>=this.boundingRect.left&&t=this.boundingRect.top&&t=i*i&&this.handleDistanceSurpassed(t),this.isDragging&&this.handleDrag(e,n,t)},t.prototype.handleDrag=function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},t.prototype.endDrag=function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},t.prototype.handleDragEnd=function(t){this.trigger("dragEnd",t)},t.prototype.startDelay=function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},t.prototype.handleDelayEnd=function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},t.prototype.handleDistanceSurpassed=function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},t.prototype.handleTouchMove=function(t){this.isDragging&&this.shouldCancelTouchScroll&&t.preventDefault(),this.handleMove(t)},t.prototype.handleMouseMove=function(t){this.handleMove(t)},t.prototype.handleTouchScroll=function(t){this.isDragging&&!this.scrollAlwaysKills||this.endInteraction(t,!0)},t.prototype.trigger=function(t){for(var e=[],n=1;n=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?c=i*this.scrollSpeed*-1:s>=0&&s<=1&&(c=s*this.scrollSpeed)),this.setScrollVel(l,c)},t.prototype.setScrollVel=function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(r.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},t.prototype.constrainScrollVel=function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},t.prototype.scrollIntervalFunc=function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},t.prototype.endAutoScroll=function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},t.prototype.handleDebouncedScroll=function(){this.scrollIntervalId||this.handleScrollEnd()},t.prototype.handleScrollEnd=function(){},t}();e.default=a,s.default.mixInto(a)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(14),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.updateDayTable=function(){for(var t,e,n,i=this,r=i.view,s=r.calendar,o=s.msToUtcMoment(i.dateProfile.renderUnzonedRange.startMs,!0),a=s.msToUtcMoment(i.dateProfile.renderUnzonedRange.endMs,!0),l=-1,c=[],u=[];o.isBefore(a);)r.isHiddenDay(o)?c.push(l+.5):(l++,c.push(l),u.push(o.clone())),o.add(1,"days");if(this.breakOnWeeks){for(e=u[0].day(),t=1;t=e.length?e[e.length-1]+1:e[n]},e.prototype.computeColHeadFormat=function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.opt("dayOfMonthFormat"):"dddd"},e.prototype.sliceRangeByRow=function(t){var e,n,i,r,s,o=this.daysPerRow,a=this.view.computeDayRange(t),l=this.getDateDayIndex(a.start),c=this.getDateDayIndex(a.end.clone().subtract(1,"days")),u=[];for(e=0;e'+this.renderHeadTrHtml()+"
"},e.prototype.renderHeadIntroHtml=function(){return this.renderIntroHtml()},e.prototype.renderHeadTrHtml=function(){return""+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+""},e.prototype.renderHeadDateCellsHtml=function(){var t,e,n=[];for(t=0;t1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+(a?o.buildGotoAnchorHtml({date:t,forceOff:s.rowCnt>1||1===s.colCnt},i):i)+""},e.prototype.renderBgTrHtml=function(t){return""+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+""},e.prototype.renderBgIntroHtml=function(t){return this.renderIntroHtml()},e.prototype.renderBgCellsHtml=function(t){var e,n,i=[];for(e=0;e"},e.prototype.renderIntroHtml=function(){},e.prototype.bookendCells=function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))},e}(s.default);e.default=o},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.component=t,this.fillRenderer=e}return t.prototype.render=function(t){var e=this.component,n=e._getDateProfile().activeUnzonedRange,i=t.buildEventInstanceGroup(e.hasAllDayBusinessHours,n),r=i?e.eventRangesToEventFootprints(i.sliceRenderRanges(n)):[];this.renderEventFootprints(r)},t.prototype.renderEventFootprints=function(t){var e=this.component.eventFootprintsToSegs(t);this.renderSegs(e),this.segs=e},t.prototype.renderSegs=function(t){this.fillRenderer&&this.fillRenderer.renderSegs("businessHours",t,{getClasses:function(t){return["fc-nonbusiness","fc-bgevent"]}})},t.prototype.unrender=function(){this.fillRenderer&&this.fillRenderer.unrender("businessHours"),this.segs=null},t.prototype.getSegs=function(){return this.segs||[]},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),s=function(){function t(t){this.fillSegTag="div",this.component=t,this.elsByFill={}}return t.prototype.renderFootprint=function(t,e,n){this.renderSegs(t,this.component.componentFootprintToSegs(e),n)},t.prototype.renderSegs=function(t,e,n){var i;return e=this.buildSegEls(t,e,n),i=this.attachSegEls(t,e),i&&this.reportEls(t,i),e},t.prototype.unrender=function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},t.prototype.buildSegEls=function(t,e,n){var r,s=this,o="",a=[];if(e.length){for(r=0;r"},t.prototype.attachSegEls=function(t,e){},t.prototype.reportEls=function(t,e){this.elsByFill[t]?this.elsByFill[t]=this.elsByFill[t].add(e):this.elsByFill[t]=i(e)},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(13),r=n(36),s=n(6),o=function(){function t(t,e){this.view=t._getView(),this.component=t,this.eventRenderer=e}return t.prototype.renderComponentFootprint=function(t){this.renderEventFootprints([this.fabricateEventFootprint(t)])},t.prototype.renderEventDraggingFootprints=function(t,e,n){this.renderEventFootprints(t,e,"fc-dragging",n?null:this.view.opt("dragOpacity"))},t.prototype.renderEventResizingFootprints=function(t,e,n){this.renderEventFootprints(t,e,"fc-resizing")},t.prototype.renderEventFootprints=function(t,e,n,i){var r,s=this.component.eventFootprintsToSegs(t),o="fc-helper "+(n||"");for(s=this.eventRenderer.renderFgSegEls(s),r=0;r
'+this.renderBgTrHtml(t)+'
'+(this.getIsNumbersVisible()?""+this.renderNumberTrHtml(t)+"":"")+"
"},e.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.cellWeekNumbersVisible},e.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},e.prototype.renderNumberTrHtml=function(t){return""+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+""},e.prototype.renderNumberIntroHtml=function(t){return this.renderIntroHtml()},e.prototype.renderNumberCellsHtml=function(t){var e,n,i=[];for(e=0;e",this.cellWeekNumbersVisible&&t.day()===n&&(r+=i.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),o&&(r+=i.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.format("D"))),r+=""):""},e.prototype.prepareHits=function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},e.prototype.releaseHits=function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},e.prototype.queryHit=function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},e.prototype.getHitFootprint=function(t){var e=this.getCellRange(t.row,t.col);return new c.default(new l.default(e.start,e.end),!0)},e.prototype.getHitEl=function(t){return this.getCellEl(t.row,t.col)},e.prototype.getCellHit=function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},e.prototype.getCellEl=function(t,e){return this.cellEls.eq(t*this.colCnt+e)},e.prototype.executeEventUnrender=function(){this.removeSegPopover(),t.prototype.executeEventUnrender.call(this)},e.prototype.getOwnEventSegs=function(){return t.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs||[])},e.prototype.renderDrag=function(t,e,n){var i;for(i=0;i td > :first-child").each(e),i.position().top+s>a)return n;return!1},e.prototype.limitRow=function(t,e){var n,i,s,o,a,l,c,u,d,h,p,f,v,g,m,y=this,w=this.eventRenderer.rowStructs[t],b=[],T=0,C=function(n){for(;T").append(m),d.append(g),b.push(g[0])),T++};if(e&&e').attr("rowspan",h),l=u[f],m=this.renderMoreLink(t,a.leftCol+f,[a].concat(l)),g=r("
").append(m),v.append(g),p.push(v[0]),b.push(v[0]);d.addClass("fc-limited").after(r(p)),s.push(d[0])}}C(this.colCnt),w.moreEls=r(b),w.limitedEls=r(s)}},e.prototype.unlimitRow=function(t){var e=this.eventRenderer.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},e.prototype.renderMoreLink=function(t,e,n){var i=this,s=this.view;return r('').text(this.getMoreLinkText(n.length)).on("click",function(o){var a=i.opt("eventLimitClick"),l=i.getCellDate(t,e),c=r(o.currentTarget),u=i.getCellEl(t,e),d=i.getCellSegs(t,e),h=i.resliceDaySegs(d,l),p=i.resliceDaySegs(n,l);"function"==typeof a&&(a=i.publiclyTrigger("eventLimitClick",{context:s,args:[{date:l.clone(),dayEl:u,moreEl:c,segs:h,hiddenSegs:p},o,s]})),"popover"===a?i.showSegPopover(t,e,c,h):"string"==typeof a&&s.calendar.zoomTo(l,a)})},e.prototype.showSegPopover=function(t,e,n,i){var r,s,o=this,l=this.view,c=n.parent();r=1===this.rowCnt?l.el:this.rowEls.eq(t),s={className:"fc-more-popover "+l.calendar.theme.getClass("popover"),content:this.renderSegPopoverContent(t,e,i),parentEl:l.el,top:r.offset().top,autoHide:!0,viewportConstrain:this.opt("popoverViewportConstrain"),hide:function(){o.popoverSegs&&o.triggerBeforeEventSegsDestroyed(o.popoverSegs),o.segPopover.removeElement(),o.segPopover=null,o.popoverSegs=null}},this.isRTL?s.right=c.offset().left+c.outerWidth()+1:s.left=c.offset().left-1,this.segPopover=new a.default(s),this.segPopover.show(),this.bindAllSegHandlersToEl(this.segPopover.el),this.triggerAfterEventSegsRendered(i)},e.prototype.renderSegPopoverContent=function(t,e,n){var i,o=this.view,a=o.calendar.theme,l=this.getCellDate(t,e).format(this.opt("dayPopoverFormat")),c=r('
'+s.htmlEscape(l)+'
'),u=c.find(".fc-event-container");for(n=this.eventRenderer.renderFgSegEls(n,!0),this.popoverSegs=n,i=0;i"+o.htmlEscape(this.opt("weekNumberTitle"))+"":""},e.prototype.renderNumberIntroHtml=function(t){var e=this.view,n=this.getCellDate(t,0);return this.colWeekNumbersVisible?'"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"":""},e.prototype.renderBgIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'":""},e.prototype.renderIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'":""},e.prototype.getIsNumbersVisible=function(){return u.default.prototype.getIsNumbersVisible.apply(this,arguments)||this.colWeekNumbersVisible},e}(t)}Object.defineProperty(e,"__esModule",{value:!0});var r=n(2),s=n(3),o=n(4),a=n(39),l=n(41),c=n(228),u=n(61),d=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.dayGrid=i.instantiateDayGrid(),i.dayGrid.isRigid=i.hasRigidRows(),i.opt("weekNumbers")&&(i.opt("weekNumbersWithinDays")?(i.dayGrid.cellWeekNumbersVisible=!0,i.dayGrid.colWeekNumbersVisible=!1):(i.dayGrid.cellWeekNumbersVisible=!1,i.dayGrid.colWeekNumbersVisible=!0)),i.addChild(i.dayGrid),i.scroller=new a.default({overflowX:"hidden",overflowY:"auto"}),i}return r.__extends(e,t),e.prototype.instantiateDayGrid=function(){return new(i(this.dayGridClass))(this)},e.prototype.executeDateRender=function(e){this.dayGrid.breakOnWeeks=/year|month|week/.test(e.currentRangeUnit),t.prototype.executeDateRender.call(this,e)},e.prototype.renderSkeleton=function(){var t,e;this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.scroller.render(),t=this.scroller.el.addClass("fc-day-grid-container"),e=s('
').appendTo(t),this.el.find(".fc-body > tr > td").append(t),this.dayGrid.headContainerEl=this.el.find(".fc-head-container"),this.dayGrid.setElement(e)},e.prototype.unrenderSkeleton=function(){this.dayGrid.removeElement(),this.scroller.destroy()},e.prototype.renderSkeletonHtml=function(){var t=this.calendar.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'},e.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},e.prototype.hasRigidRows=function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},e.prototype.updateSize=function(e,n,i){var r,s,a=this.opt("eventLimit"),l=this.dayGrid.headContainerEl.find(".fc-row");if(!this.dayGrid.rowEls)return void(n||(r=this.computeScrollerHeight(e),this.scroller.setHeight(r)));t.prototype.updateSize.call(this,e,n,i),this.dayGrid.colWeekNumbersVisible&&(this.weekNumberWidth=o.matchCellWidths(this.el.find(".fc-week-number"))),this.scroller.clear(),o.uncompensateScroll(l),this.dayGrid.removeSegPopover(),a&&"number"==typeof a&&this.dayGrid.limitRows(a),r=this.computeScrollerHeight(e),this.setGridHeight(r,n),a&&"number"!=typeof a&&this.dayGrid.limitRows(a),n||(this.scroller.setHeight(r),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(o.compensateScroll(l,s),r=this.computeScrollerHeight(e),this.scroller.setHeight(r)),this.scroller.lockOverflow(s))},e.prototype.computeScrollerHeight=function(t){return t-o.subtractInnerElHeight(this.el,this.scroller.el)},e.prototype.setGridHeight=function(t,e){e?o.undistributeHeight(this.dayGrid.rowEls):o.distributeHeight(this.dayGrid.rowEls,t,!0)},e.prototype.computeInitialDateScroll=function(){return{top:0}},e.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},e.prototype.applyDateScroll=function(t){void 0!==t.top&&this.scroller.setScrollTop(t.top)},e}(l.default);e.default=d,d.prototype.dateProfileGeneratorClass=c.default,d.prototype.dayGridClass=u.default},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){function i(t,e,n){var i;for(i=0;i=0;e--)switch(n=i[e],n.type){case"init":r=!1;case"add":case"remove":i.splice(e,1)}return r&&i.push(t),r},e}(r.default);e.default=s},function(t,e,n){function i(t){var e,n,i,r=[];for(e in t)for(n=t[e].eventInstances,i=0;i'+n+"
":""+n+""},e.prototype.getAllDayHtml=function(){return this.opt("allDayHtml")||a.htmlEscape(this.opt("allDayText"))},e.prototype.getDayClasses=function(t,e){var n,i=this._getView(),r=[];return this.dateProfile.activeUnzonedRange.containsDate(t)?(r.push("fc-"+a.dayIDs[t.day()]),i.isDateInOtherMonth(t,this.dateProfile)&&r.push("fc-other-month"),n=i.calendar.getNow(),t.isSame(n,"day")?(r.push("fc-today"),!0!==e&&r.push(i.calendar.theme.getClass("today"))):t=this.nextDayThreshold&&s.add(1,"days"),s<=n&&(s=n.clone().add(1,"days")),{start:n,end:s}},e.prototype.isMultiDayRange=function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1},e.guid=0,e}(u.default);e.default=h},function(t,e,n){function i(t,e){return null==e?t:r.isFunction(e)?t.filter(e):(e+="",t.filter(function(t){return t.id==e||t._id===e}))}Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),s=n(0),o=n(4),a=n(32),l=n(238),c=n(21),u=n(11),d=n(7),h=n(239),p=n(240),f=n(241),v=n(207),g=n(31),m=n(10),y=n(5),w=n(12),b=n(17),T=n(242),C=n(212),_=n(38),S=n(49),D=n(13),E=n(37),k=n(6),x=n(51),M=function(){function t(t,e){this.loadingLevel=0,this.ignoreUpdateViewSize=0,this.freezeContentHeightDepth=0,c.default.needed(),this.el=t,this.viewsByType={},this.optionsManager=new p.default(this,e),this.viewSpecManager=new f.default(this.optionsManager,this),this.initMomentInternals(),this.initCurrentDate(),this.initEventManager(),this.constraints=new v.default(this.eventManager,this),this.constructed()}return t.prototype.constructed=function(){},t.prototype.getView=function(){return this.view},t.prototype.publiclyTrigger=function(t,e){var n,i,s=this.opt(t);if(r.isPlainObject(e)?(n=e.context,i=e.args):r.isArray(e)&&(i=e),null==n&&(n=this.el[0]),i||(i=[]),this.triggerWith(t,n,i),s)return s.apply(n,i)},t.prototype.hasPublicHandlers=function(t){return this.hasHandlers(t)||this.opt(t)},t.prototype.option=function(t,e){var n;if("string"==typeof t){if(void 0===e)return this.optionsManager.get(t);n={},n[t]=e,this.optionsManager.add(n)}else"object"==typeof t&&this.optionsManager.add(t)},t.prototype.opt=function(t){return this.optionsManager.get(t)},t.prototype.instantiateView=function(t){var e=this.viewSpecManager.getViewSpec(t);if(!e)throw new Error('View type "'+t+'" is not valid');return new e.class(this,e)},t.prototype.isValidViewType=function(t){return Boolean(this.viewSpecManager.getViewSpec(t))},t.prototype.changeView=function(t,e){e&&(e.start&&e.end?this.optionsManager.recordOverrides({visibleRange:e}):this.currentDate=this.moment(e).stripZone()),this.renderView(t)},t.prototype.zoomTo=function(t,e){var n;e=e||"day",n=this.viewSpecManager.getViewSpec(e)||this.viewSpecManager.getUnitViewSpec(e),this.currentDate=t.clone(),this.renderView(n?n.type:null)},t.prototype.initCurrentDate=function(){var t=this.opt("defaultDate");this.currentDate=null!=t?this.moment(t).stripZone():this.getNow()},t.prototype.prev=function(){var t=this.view,e=t.dateProfileGenerator.buildPrev(t.get("dateProfile"));e.isValid&&(this.currentDate=e.date,this.renderView())},t.prototype.next=function(){var t=this.view,e=t.dateProfileGenerator.buildNext(t.get("dateProfile"));e.isValid&&(this.currentDate=e.date,this.renderView())},t.prototype.prevYear=function(){this.currentDate.add(-1,"years"),this.renderView()},t.prototype.nextYear=function(){this.currentDate.add(1,"years"),this.renderView()},t.prototype.today=function(){this.currentDate=this.getNow(),this.renderView()},t.prototype.gotoDate=function(t){this.currentDate=this.moment(t).stripZone(),this.renderView()},t.prototype.incrementDate=function(t){this.currentDate.add(s.duration(t)),this.renderView()},t.prototype.getDate=function(){return this.applyTimezone(this.currentDate)},t.prototype.pushLoading=function(){this.loadingLevel++||this.publiclyTrigger("loading",[!0,this.view])},t.prototype.popLoading=function(){--this.loadingLevel||this.publiclyTrigger("loading",[!1,this.view])},t.prototype.render=function(){this.contentEl?this.elementVisible()&&(this.calcSize(),this.updateViewSize()):this.initialRender()},t.prototype.initialRender=function(){var t=this,e=this.el;e.addClass("fc"),e.on("click.fc","a[data-goto]",function(e){var n=r(e.currentTarget),i=n.data("goto"),s=t.moment(i.date),a=i.type,l=t.view.opt("navLink"+o.capitaliseFirstLetter(a)+"Click");"function"==typeof l?l(s,e):("string"==typeof l&&(a=l),t.zoomTo(s,a))}),this.optionsManager.watch("settingTheme",["?theme","?themeSystem"],function(n){var i=x.getThemeSystemClass(n.themeSystem||n.theme),r=new i(t.optionsManager),s=r.getClass("widget");t.theme=r,s&&e.addClass(s)},function(){var n=t.theme.getClass("widget");t.theme=null,n&&e.removeClass(n)}),this.optionsManager.watch("settingBusinessHourGenerator",["?businessHours"],function(e){t.businessHourGenerator=new C.default(e.businessHours,t),t.view&&t.view.set("businessHourGenerator",t.businessHourGenerator)},function(){t.businessHourGenerator=null}),this.optionsManager.watch("applyingDirClasses",["?isRTL","?locale"],function(t){e.toggleClass("fc-ltr",!t.isRTL),e.toggleClass("fc-rtl",t.isRTL)}),this.contentEl=r("
").prependTo(e),this.initToolbars(),this.renderHeader(),this.renderFooter(),this.renderView(this.opt("defaultView")),this.opt("handleWindowResize")&&r(window).resize(this.windowResizeProxy=o.debounce(this.windowResize.bind(this),this.opt("windowResizeDelay")))},t.prototype.destroy=function(){this.view&&this.clearView(),this.toolbarsManager.proxyCall("removeElement"),this.contentEl.remove(),this.el.removeClass("fc fc-ltr fc-rtl"),this.optionsManager.unwatch("settingTheme"),this.optionsManager.unwatch("settingBusinessHourGenerator"),this.el.off(".fc"),this.windowResizeProxy&&(r(window).unbind("resize",this.windowResizeProxy),this.windowResizeProxy=null),c.default.unneeded()},t.prototype.elementVisible=function(){return this.el.is(":visible")},t.prototype.bindViewHandlers=function(t){var e=this;t.watch("titleForCalendar",["title"],function(n){t===e.view&&e.setToolbarsTitle(n.title)}),t.watch("dateProfileForCalendar",["dateProfile"],function(n){t===e.view&&(e.currentDate=n.dateProfile.date,e.updateToolbarButtons(n.dateProfile))})},t.prototype.unbindViewHandlers=function(t){t.unwatch("titleForCalendar"),t.unwatch("dateProfileForCalendar")},t.prototype.renderView=function(t){var e,n=this.view;this.freezeContentHeight(),n&&t&&n.type!==t&&this.clearView(),!this.view&&t&&(e=this.view=this.viewsByType[t]||(this.viewsByType[t]=this.instantiateView(t)),this.bindViewHandlers(e),e.startBatchRender(),e.setElement(r("
").appendTo(this.contentEl)),this.toolbarsManager.proxyCall("activateButton",t)),this.view&&(this.view.get("businessHourGenerator")!==this.businessHourGenerator&&this.view.set("businessHourGenerator",this.businessHourGenerator),this.view.setDate(this.currentDate),e&&e.stopBatchRender()),this.thawContentHeight()},t.prototype.clearView=function(){var t=this.view;this.toolbarsManager.proxyCall("deactivateButton",t.type),this.unbindViewHandlers(t),t.removeElement(),t.unsetDate(),this.view=null},t.prototype.reinitView=function(){var t=this.view,e=t.queryScroll();this.freezeContentHeight(),this.clearView(),this.calcSize(),this.renderView(t.type),this.view.applyScroll(e),this.thawContentHeight()},t.prototype.getSuggestedViewHeight=function(){return null==this.suggestedViewHeight&&this.calcSize(),this.suggestedViewHeight},t.prototype.isHeightAuto=function(){return"auto"===this.opt("contentHeight")||"auto"===this.opt("height")},t.prototype.updateViewSize=function(t){void 0===t&&(t=!1);var e,n=this.view;if(!this.ignoreUpdateViewSize&&n)return t&&(this.calcSize(),e=n.queryScroll()),this.ignoreUpdateViewSize++,n.updateSize(this.getSuggestedViewHeight(),this.isHeightAuto(),t),this.ignoreUpdateViewSize--,t&&n.applyScroll(e),!0},t.prototype.calcSize=function(){this.elementVisible()&&this._calcSize()},t.prototype._calcSize=function(){var t=this.opt("contentHeight"),e=this.opt("height");this.suggestedViewHeight="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-this.queryToolbarsHeight():"function"==typeof e?e()-this.queryToolbarsHeight():"parent"===e?this.el.parent().height()-this.queryToolbarsHeight():Math.round(this.contentEl.width()/Math.max(this.opt("aspectRatio"),.5))},t.prototype.windowResize=function(t){t.target===window&&this.view&&this.view.isDatesRendered&&this.updateViewSize(!0)&&this.publiclyTrigger("windowResize",[this.view])},t.prototype.freezeContentHeight=function(){this.freezeContentHeightDepth++||this.forceFreezeContentHeight()},t.prototype.forceFreezeContentHeight=function(){this.contentEl.css({width:"100%",height:this.contentEl.height(),overflow:"hidden"})},t.prototype.thawContentHeight=function(){this.freezeContentHeightDepth--,this.contentEl.css({width:"",height:"",overflow:""}),this.freezeContentHeightDepth&&this.forceFreezeContentHeight()},t.prototype.initToolbars=function(){this.header=new h.default(this,this.computeHeaderOptions()),this.footer=new h.default(this,this.computeFooterOptions()),this.toolbarsManager=new l.default([this.header,this.footer])},t.prototype.computeHeaderOptions=function(){return{extraClasses:"fc-header-toolbar",layout:this.opt("header")}},t.prototype.computeFooterOptions=function(){return{extraClasses:"fc-footer-toolbar",layout:this.opt("footer")}},t.prototype.renderHeader=function(){var t=this.header;t.setToolbarOptions(this.computeHeaderOptions()),t.render(),t.el&&this.el.prepend(t.el)},t.prototype.renderFooter=function(){var t=this.footer;t.setToolbarOptions(this.computeFooterOptions()),t.render(),t.el&&this.el.append(t.el)},t.prototype.setToolbarsTitle=function(t){this.toolbarsManager.proxyCall("updateTitle",t)},t.prototype.updateToolbarButtons=function(t){var e=this.getNow(),n=this.view,i=n.dateProfileGenerator.build(e),r=n.dateProfileGenerator.buildPrev(n.get("dateProfile")),s=n.dateProfileGenerator.buildNext(n.get("dateProfile"));this.toolbarsManager.proxyCall(i.isValid&&!t.currentUnzonedRange.containsDate(e)?"enableButton":"disableButton","today"),this.toolbarsManager.proxyCall(r.isValid?"enableButton":"disableButton","prev"),this.toolbarsManager.proxyCall(s.isValid?"enableButton":"disableButton","next")},t.prototype.queryToolbarsHeight=function(){return this.toolbarsManager.items.reduce(function(t,e){return t+(e.el?e.el.outerHeight(!0):0)},0)},t.prototype.select=function(t,e){this.view.select(this.buildSelectFootprint.apply(this,arguments))},t.prototype.unselect=function(){this.view&&this.view.unselect()},t.prototype.buildSelectFootprint=function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),new w.default(new y.default(i,n),!i.hasTime())},t.prototype.initMomentInternals=function(){var t=this;this.defaultAllDayEventDuration=s.duration(this.opt("defaultAllDayEventDuration")),this.defaultTimedEventDuration=s.duration(this.opt("defaultTimedEventDuration")),this.optionsManager.watch("buildingMomentLocale",["?locale","?monthNames","?monthNamesShort","?dayNames","?dayNamesShort","?firstDay","?weekNumberCalculation"],function(e){var n,i=e.weekNumberCalculation,r=e.firstDay;"iso"===i&&(i="ISO");var s=Object.create(g.getMomentLocaleData(e.locale));e.monthNames&&(s._months=e.monthNames),e.monthNamesShort&&(s._monthsShort=e.monthNamesShort),e.dayNames&&(s._weekdays=e.dayNames),e.dayNamesShort&&(s._weekdaysShort=e.dayNamesShort),null==r&&"ISO"===i&&(r=1),null!=r&&(n=Object.create(s._week),n.dow=r,s._week=n),"ISO"!==i&&"local"!==i&&"function"!=typeof i||(s._fullCalendar_weekCalc=i),t.localeData=s,t.currentDate&&t.localizeMoment(t.currentDate)})},t.prototype.moment=function(){for(var t=[],e=0;e864e5&&r.time(n-864e5)),new s.default(i,r)},t.prototype.buildRangeFromDuration=function(t,e,n,o){function a(){u=t.clone().startOf(p),d=u.clone().add(n),h=new s.default(u,d)}var l,c,u,d,h,p=this.opt("dateAlignment");return p||(l=this.opt("dateIncrement"),l?(c=i.duration(l),p=cs.getStart()&&(i=new a.default,i.setEndDelta(l),r=new o.default,r.setDateMutation(i),r)},e}(c.default);e.default=u},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(37),o=n(50),a=n(54),l=n(23),c=n(244),u=n(15),d=function(t){function e(e,n){var i=t.call(this,e)||this;return i.isDragging=!1,i.eventPointing=n,i}return i.__extends(e,t),e.prototype.end=function(){this.dragListener&&this.dragListener.endInteraction()},e.prototype.getSelectionDelay=function(){var t=this.opt("eventLongPressDelay");return null==t&&(t=this.opt("longPressDelay")),t},e.prototype.bindToEl=function(t){var e=this.component;e.bindSegHandlerToEl(t,"mousedown",this.handleMousedown.bind(this)),e.bindSegHandlerToEl(t,"touchstart",this.handleTouchStart.bind(this))},e.prototype.handleMousedown=function(t,e){!this.component.shouldIgnoreMouse()&&this.component.canStartDrag(t,e)&&this.buildDragListener(t).startInteraction(e,{distance:5})},e.prototype.handleTouchStart=function(t,e){var n=this.component,i={delay:this.view.isEventDefSelected(t.footprint.eventDef)?0:this.getSelectionDelay()};n.canStartDrag(t,e)?this.buildDragListener(t).startInteraction(e,i):n.canStartSelection(t,e)&&this.buildSelectListener(t).startInteraction(e,i)},e.prototype.buildSelectListener=function(t){var e=this,n=this.view,i=t.footprint.eventDef,r=t.footprint.eventInstance;if(this.dragListener)return this.dragListener;var s=this.dragListener=new a.default({dragStart:function(t){s.isTouch&&!n.isEventDefSelected(i)&&r&&n.selectEventInstance(r)},interactionEnd:function(t){e.dragListener=null}});return s},e.prototype.buildDragListener=function(t){var e,n,i,s=this,o=this.component,a=this.view,u=a.calendar,d=u.eventManager,h=t.el,p=t.footprint.eventDef,f=t.footprint.eventInstance;if(this.dragListener)return this.dragListener;var v=this.dragListener=new l.default(a,{scroll:this.opt("dragScroll"),subjectEl:h,subjectCenter:!0,interactionStart:function(i){t.component=o,e=!1,n=new c.default(t.el,{additionalClass:"fc-dragging",parentEl:a.el,opacity:v.isTouch?null:s.opt("dragOpacity"),revertDuration:s.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){v.isTouch&&!a.isEventDefSelected(p)&&f&&a.selectEventInstance(f),e=!0,s.eventPointing.handleMouseout(t,n),s.segDragStart(t,n),a.hideEventsWithId(t.footprint.eventDef.id)},hitOver:function(e,l,c){var h,f,g,m=!0;t.hit&&(c=t.hit),h=c.component.getSafeHitFootprint(c),f=e.component.getSafeHitFootprint(e),h&&f?(i=s.computeEventDropMutation(h,f,p),i?(g=d.buildMutatedEventInstanceGroup(p.id,i),m=o.isEventInstanceGroupAllowed(g)):m=!1):m=!1,m||(i=null,r.disableCursor()),i&&a.renderDrag(o.eventRangesToEventFootprints(g.sliceRenderRanges(o.dateProfile.renderUnzonedRange,u)),t,v.isTouch)?n.hide():n.show(),l&&(i=null)},hitOut:function(){a.unrenderDrag(t),n.show(),i=null},hitDone:function(){r.enableCursor()},interactionEnd:function(r){delete t.component,n.stop(!i,function(){e&&(a.unrenderDrag(t),s.segDragStop(t,r)),a.showEventsWithId(t.footprint.eventDef.id),i&&a.reportEventDrop(f,i,h,r)}),s.dragListener=null}});return v},e.prototype.segDragStart=function(t,e){this.isDragging=!0,this.component.publiclyTrigger("eventDragStart",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.segDragStop=function(t,e){this.isDragging=!1,this.component.publiclyTrigger("eventDragStop",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.computeEventDropMutation=function(t,e,n){var i=new s.default;return i.setDateMutation(this.computeEventDateMutation(t,e)),i},e.prototype.computeEventDateMutation=function(t,e){var n,i,r=t.unzonedRange.getStart(),s=e.unzonedRange.getStart(),a=!1,l=!1,c=!1;return t.isAllDay!==e.isAllDay&&(a=!0,e.isAllDay?(c=!0,r.stripTime()):l=!0),n=this.component.diffDates(s,r),i=new o.default,i.clearEnd=a,i.forceTimed=l,i.forceAllDay=c,i.setDateDelta(n),i},e}(u.default);e.default=d},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(23),o=n(12),a=n(5),l=n(15),c=function(t){function e(e){var n=t.call(this,e)||this;return n.dragListener=n.buildDragListener(),n}return i.__extends(e,t),e.prototype.end=function(){this.dragListener.endInteraction()},e.prototype.getDelay=function(){var t=this.opt("selectLongPressDelay");return null==t&&(t=this.opt("longPressDelay")),t},e.prototype.bindToEl=function(t){var e=this,n=this.component,i=this.dragListener;n.bindDateHandlerToEl(t,"mousedown",function(t){e.opt("selectable")&&!n.shouldIgnoreMouse()&&i.startInteraction(t,{distance:e.opt("selectMinDistance")})}),n.bindDateHandlerToEl(t,"touchstart",function(t){e.opt("selectable")&&!n.shouldIgnoreTouch()&&i.startInteraction(t,{delay:e.getDelay()})}),r.preventSelection(t)},e.prototype.buildDragListener=function(){var t,e=this,n=this.component;return new s.default(n,{scroll:this.opt("dragScroll"),interactionStart:function(){t=null},dragStart:function(t){e.view.unselect(t)},hitOver:function(i,s,o){var a,l;o&&(a=n.getSafeHitFootprint(o),l=n.getSafeHitFootprint(i),t=a&&l?e.computeSelection(a,l):null,t?n.renderSelectionFootprint(t):!1===t&&r.disableCursor())},hitOut:function(){t=null,n.unrenderSelection()},hitDone:function(){r.enableCursor()},interactionEnd:function(n,i){!i&&t&&e.view.reportSelection(t,n)}})},e.prototype.computeSelection=function(t,e){var n=this.computeSelectionFootprint(t,e);return!(n&&!this.isSelectionFootprintAllowed(n))&&n},e.prototype.computeSelectionFootprint=function(t,e){var n=[t.unzonedRange.startMs,t.unzonedRange.endMs,e.unzonedRange.startMs,e.unzonedRange.endMs];return n.sort(r.compareNumbers),new o.default(new a.default(n[0],n[3]),t.isAllDay)},e.prototype.isSelectionFootprintAllowed=function(t){return this.component.dateProfile.validUnzonedRange.containsRange(t.unzonedRange)&&this.view.calendar.constraints.isSelectionFootprintAllowed(t)},e}(l.default);e.default=c},function(t,e,n){function i(t){var e,n=[],i=[];for(e=0;e').appendTo(t),this.el.find(".fc-body > tr > td").append(t),this.timeGrid.headContainerEl=this.el.find(".fc-head-container"),this.timeGrid.setElement(e),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight())},e.prototype.unrenderSkeleton=function(){this.timeGrid.removeElement(),this.dayGrid&&this.dayGrid.removeElement(),this.scroller.destroy()},e.prototype.renderSkeletonHtml=function(){var t=this.calendar.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'+(this.dayGrid?'

':"")+"
"},e.prototype.axisStyleAttr=function(){return null!=this.axisWidth?'style="width:'+this.axisWidth+'px"':""},e.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},e.prototype.updateSize=function(e,n,i){var r,s,o;if(t.prototype.updateSize.call(this,e,n,i),this.axisWidth=c.matchCellWidths(this.el.find(".fc-axis")),!this.timeGrid.colEls)return void(n||(s=this.computeScrollerHeight(e),this.scroller.setHeight(s)));var a=this.el.find(".fc-row:not(.fc-scroller *)");this.timeGrid.bottomRuleEl.hide(),this.scroller.clear(),c.uncompensateScroll(a),this.dayGrid&&(this.dayGrid.removeSegPopover(),r=this.opt("eventLimit"),r&&"number"!=typeof r&&(r=5),r&&this.dayGrid.limitRows(r)),n||(s=this.computeScrollerHeight(e),this.scroller.setHeight(s),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(c.compensateScroll(a,o),s=this.computeScrollerHeight(e),this.scroller.setHeight(s)),this.scroller.lockOverflow(o),this.timeGrid.getTotalSlatHeight()"+e.buildGotoAnchorHtml({date:i,type:"week",forceOff:this.colCnt>1},c.htmlEscape(t))+""):'"},renderBgIntroHtml:function(){var t=this.view;return'"},renderIntroHtml:function(){return'"}},s={renderBgIntroHtml:function(){var t=this.view;return'"+t.getAllDayHtml()+""},renderIntroHtml:function(){return'"}}},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(0),o=n(4),a=n(40),l=n(56),c=n(60),u=n(55),d=n(53),h=n(5),p=n(12),f=n(246),v=n(247),g=n(248),m=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],y=function(t){function e(e){var n=t.call(this,e)||this;return n.processOptions(),n}return i.__extends(e,t),e.prototype.componentFootprintToSegs=function(t){var e,n=this.sliceRangeByTimes(t.unzonedRange);for(e=0;e=0;e--)if(n=s.duration(m[e]),i=o.divideDurationByDuration(n,t),o.isInt(i)&&i>1)return n;return s.duration(t)},e.prototype.renderDates=function(t){this.dateProfile=t,this.updateDayTable(),this.renderSlats(),this.renderColumns()},e.prototype.unrenderDates=function(){this.unrenderColumns()},e.prototype.renderSkeleton=function(){var t=this.view.calendar.theme;this.el.html('
'),this.bottomRuleEl=this.el.find("hr")},e.prototype.renderSlats=function(){var t=this.view.calendar.theme;this.slatContainerEl=this.el.find("> .fc-slats").html(''+this.renderSlatRowHtml()+"
"),this.slatEls=this.slatContainerEl.find("tr"),this.slatCoordCache=new d.default({els:this.slatEls,isVertical:!0})},e.prototype.renderSlatRowHtml=function(){for(var t,e,n,i=this.view,r=i.calendar,a=r.theme,l=this.isRTL,c=this.dateProfile,u="",d=s.duration(+c.minTime),h=s.duration(0);d"+(e?""+o.htmlEscape(t.format(this.labelFormat))+"":"")+"",u+='"+(l?"":n)+''+(l?n:"")+"",d.add(this.slotDuration),h.add(this.slotDuration);return u},e.prototype.renderColumns=function(){var t=this.dateProfile,e=this.view.calendar.theme;this.dayRanges=this.dayDates.map(function(e){return new h.default(e.clone().add(t.minTime),e.clone().add(t.maxTime))}),this.headContainerEl&&this.headContainerEl.html(this.renderHeadHtml()),this.el.find("> .fc-bg").html(''+this.renderBgTrHtml(0)+"
"),this.colEls=this.el.find(".fc-day, .fc-disabled-day"),this.colCoordCache=new d.default({els:this.colEls,isHorizontal:!0}),this.renderContentSkeleton()},e.prototype.unrenderColumns=function(){this.unrenderContentSkeleton()},e.prototype.renderContentSkeleton=function(){var t,e,n="";for(t=0;t
';e=this.contentSkeletonEl=r('
'+n+"
"),this.colContainerEls=e.find(".fc-content-col"),this.helperContainerEls=e.find(".fc-helper-container"),this.fgContainerEls=e.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=e.find(".fc-bgevent-container"),this.highlightContainerEls=e.find(".fc-highlight-container"),this.businessContainerEls=e.find(".fc-business-container"),this.bookendCells(e.find("tr")),this.el.append(e)},e.prototype.unrenderContentSkeleton=function(){this.contentSkeletonEl&&(this.contentSkeletonEl.remove(),this.contentSkeletonEl=null,this.colContainerEls=null,this.helperContainerEls=null,this.fgContainerEls=null,this.bgContainerEls=null,this.highlightContainerEls=null,this.businessContainerEls=null)},e.prototype.groupSegsByCol=function(t){var e,n=[];for(e=0;e
').css("top",i).appendTo(this.colContainerEls.eq(n[e].col))[0]);n.length>0&&s.push(r('
').css("top",i).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=r(s)}},e.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},e.prototype.updateSize=function(e,n,i){t.prototype.updateSize.call(this,e,n,i),this.slatCoordCache.build(),i&&this.updateSegVerticals([].concat(this.eventRenderer.getSegs(),this.businessSegs||[]))},e.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.outerHeight()},e.prototype.computeDateTop=function(t,e){return this.computeTimeTop(s.duration(t-e.clone().stripTime()))},e.prototype.computeTimeTop=function(t){var e,n,i=this.slatEls.length,r=this.dateProfile,s=(t-r.minTime)/this.slotDuration;return s=Math.max(0,s),s=Math.min(i,s),e=Math.floor(s),e=Math.min(e,i-1),n=s-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},e.prototype.updateSegVerticals=function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},e.prototype.computeSegVerticals=function(t){var e,n,i,r=this.opt("agendaEventMinHeight");for(e=0;e
'+s.htmlEscape(this.opt("noEventsMessage"))+"
")},e.prototype.renderSegList=function(t){var e,n,i,s=this.groupSegsByDay(t),o=r('
'),a=o.find("tbody");for(e=0;e'+(e?this.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},s.htmlEscape(t.format(e))):"")+(n?this.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},s.htmlEscape(t.format(n))):"")+""},e}(a.default);e.default=d,d.prototype.eventRendererClass=c.default,d.prototype.eventPointingClass=u.default},,,,,,function(t,e,n){var i=n(3),r=n(16),s=n(4),o=n(220);n(10),n(47),n(256),n(257),n(260),n(261),n(262),n(263),i.fullCalendar=r,i.fn.fullCalendar=function(t){var e=Array.prototype.slice.call(arguments,1),n=this;return this.each(function(r,a){var l,c=i(a),u=c.data("fullCalendar");"string"==typeof t?"getCalendar"===t?r||(n=u):"destroy"===t?u&&(u.destroy(),c.removeData("fullCalendar")):u?i.isFunction(u[t])?(l=u[t].apply(u,e),r||(n=l),"destroy"===t&&c.removeData("fullCalendar")):s.warn("'"+t+"' is an unknown FullCalendar method."):s.warn("Attempting to call a FullCalendar method on an element with no calendar."):u||(u=new o.default(c,t),c.data("fullCalendar",u),u.render())}),n},t.exports=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(48),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.setElement=function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton(),this.set("isInDom",!0)},e.prototype.removeElement=function(){this.unset("isInDom"),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},e.prototype.bindGlobalHandlers=function(){},e.prototype.unbindGlobalHandlers=function(){},e.prototype.renderSkeleton=function(){},e.prototype.unrenderSkeleton=function(){},e}(r.default);e.default=s},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){this.items=t||[]}return t.prototype.proxyCall=function(t){for(var e=[],n=1;n"),e.append(this.renderSection("left")).append(this.renderSection("right")).append(this.renderSection("center")).append('
')):this.removeElement()},t.prototype.removeElement=function(){this.el&&(this.el.remove(),this.el=null)},t.prototype.renderSection=function(t){var e=this,n=this.calendar,s=n.theme,o=n.optionsManager,a=n.viewSpecManager,l=i('
'),c=this.toolbarOptions.layout[t],u=o.get("customButtons")||{},d=o.overrides.buttonText||{},h=o.get("buttonText")||{};return c&&i.each(c.split(" "),function(t,o){var c,p=i(),f=!0;i.each(o.split(","),function(t,o){var l,c,v,g,m,y,w,b,T;"title"===o?(p=p.add(i("

 

")),f=!1):((l=u[o])?(v=function(t){l.click&&l.click.call(b[0],t)},(g=s.getCustomButtonIconClass(l))||(g=s.getIconClass(o))||(m=l.text)):(c=a.getViewSpec(o))?(e.viewsWithButtons.push(o),v=function(){n.changeView(o)},(m=c.buttonTextOverride)||(g=s.getIconClass(o))||(m=c.buttonTextDefault)):n[o]&&(v=function(){n[o]()},(m=d[o])||(g=s.getIconClass(o))||(m=h[o])),v&&(w=["fc-"+o+"-button",s.getClass("button"),s.getClass("stateDefault")],m?(y=r.htmlEscape(m),T=""):g&&(y="",T=' aria-label="'+o+'"'),b=i('").click(function(t){b.hasClass(s.getClass("stateDisabled"))||(v(t),(b.hasClass(s.getClass("stateActive"))||b.hasClass(s.getClass("stateDisabled")))&&b.removeClass(s.getClass("stateHover")))}).mousedown(function(){b.not("."+s.getClass("stateActive")).not("."+s.getClass("stateDisabled")).addClass(s.getClass("stateDown"))}).mouseup(function(){b.removeClass(s.getClass("stateDown"))}).hover(function(){b.not("."+s.getClass("stateActive")).not("."+s.getClass("stateDisabled")).addClass(s.getClass("stateHover"))},function(){b.removeClass(s.getClass("stateHover")).removeClass(s.getClass("stateDown"))}),p=p.add(b)))}),f&&p.first().addClass(s.getClass("cornerLeft")).end().last().addClass(s.getClass("cornerRight")).end(),p.length>1?(c=i("
"),f&&c.addClass(s.getClass("buttonGroup")),c.append(p),l.append(c)):l.append(p)}),l},t.prototype.updateTitle=function(t){this.el&&this.el.find("h2").text(t)},t.prototype.activateButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").addClass(this.calendar.theme.getClass("stateActive"))},t.prototype.deactivateButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").removeClass(this.calendar.theme.getClass("stateActive"))},t.prototype.disableButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").prop("disabled",!0).addClass(this.calendar.theme.getClass("stateDisabled"))},t.prototype.enableButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(this.calendar.theme.getClass("stateDisabled"))},t.prototype.getViewsWithButtons=function(){return this.viewsWithButtons},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(4),o=n(32),a=n(31),l=n(48),c=function(t){function e(e,n){var i=t.call(this)||this;return i._calendar=e,i.overrides=r.extend({},n),i.dynamicOverrides={},i.compute(),i}return i.__extends(e,t),e.prototype.add=function(t){var e,n=0;this.recordOverrides(t);for(e in t)n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void this._calendar.updateViewSize(!0);if("defaultDate"===e)return;if("businessHours"===e)return;if(/^(event|select)(Overlap|Constraint|Allow)$/.test(e))return;if("timezone"===e)return void this._calendar.view.flash("initialEvents")}this._calendar.renderHeader(),this._calendar.renderFooter(),this._calendar.viewsByType={},this._calendar.reinitView()},e.prototype.compute=function(){var t,e,n,i,r;t=s.firstDefined(this.dynamicOverrides.locale,this.overrides.locale),e=a.localeOptionHash[t],e||(t=o.globalDefaults.locale,e=a.localeOptionHash[t]||{}),n=s.firstDefined(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,o.globalDefaults.isRTL),i=n?o.rtlDefaults:{},this.dirDefaults=i,this.localeDefaults=e,r=o.mergeOptions([o.globalDefaults,i,e,this.overrides,this.dynamicOverrides]),a.populateInstanceComputableOptions(r),this.reset(r)},e.prototype.recordOverrides=function(t){var e;for(e in t)this.dynamicOverrides[e]=t[e];this._calendar.viewSpecManager.clearCache(),this.compute()},e}(l.default);e.default=c},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(0),r=n(3),s=n(22),o=n(4),a=n(32),l=n(31),c=function(){function t(t,e){this.optionsManager=t,this._calendar=e,this.clearCache()}return t.prototype.clearCache=function(){this.viewSpecCache={}},t.prototype.getViewSpec=function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},t.prototype.getUnitViewSpec=function(t){var e,n,i;if(-1!==r.inArray(t,o.unitsDesc))for(e=this._calendar.header.getViewsWithButtons(),r.each(s.viewHash,function(t){e.push(t)}),n=0;n
'+(n?'
'+l.htmlEscape(n)+"
":"")+(u.title?'
'+l.htmlEscape(u.title)+"
":"")+'
'+(p?'
':"")+""},e.prototype.updateFgSegCoords=function(t){this.timeGrid.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.timeGrid.assignSegVerticals(t),this.assignFgSegHorizontals(t)},e.prototype.computeFgSegHorizontals=function(t){var e,n,o;if(this.sortEventSegs(t),e=i(t),r(e),n=e[0]){for(o=0;o').addClass(e.className||"").css({top:0,left:0}).append(e.content).appendTo(e.parentEl),this.el.on("click",".fc-close",function(){t.hide()}),e.autoHide&&this.listenTo(i(document),"mousedown",this.documentMousedown)},t.prototype.documentMousedown=function(t){this.el&&!i(t.target).closest(this.el).length&&this.hide()},t.prototype.removeElement=function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(i(document),"mousedown")},t.prototype.position=function(){var t,e,n,s,o,a=this.options,l=this.el.offsetParent().offset(),c=this.el.outerWidth(),u=this.el.outerHeight(),d=i(window),h=r.getScrollParent(this.el);s=a.top||0,o=void 0!==a.left?a.left:void 0!==a.right?a.right-c:0,h.is(window)||h.is(document)?(h=d,t=0,e=0):(n=h.offset(),t=n.top,e=n.left),t+=d.scrollTop(),e+=d.scrollLeft(),!1!==a.viewportConstrain&&(s=Math.min(s,t+h.outerHeight()-u-this.margin),s=Math.max(s,t+this.margin),o=Math.min(o,e+h.outerWidth()-c-this.margin),o=Math.max(o,e+this.margin)),this.el.css({top:s-l.top,left:o-l.left})},t.prototype.trigger=function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},t}();e.default=o,s.default.mixInto(o)},function(t,e,n){function i(t,e){var n,i;for(n=0;n=t.leftCol)return!0;return!1}function r(t,e){return t.leftCol-e.leftCol}Object.defineProperty(e,"__esModule",{value:!0});var s=n(2),o=n(3),a=n(4),l=n(42),c=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.dayGrid=e,i}return s.__extends(e,t),e.prototype.renderBgRanges=function(e){e=o.grep(e,function(t){return t.eventDef.isAllDay()}),t.prototype.renderBgRanges.call(this,e)},e.prototype.renderFgSegs=function(t){var e=this.rowStructs=this.renderSegRows(t);this.dayGrid.rowEls.each(function(t,n){o(n).find(".fc-content-skeleton > table").append(e[t].tbodyEl)})},e.prototype.unrenderFgSegs=function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},e.prototype.renderSegRows=function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n"),a.append(u)),g[i][s]=u,m[i][s]=u,s++}var i,r,s,a,l,c,u,d=this.dayGrid.colCnt,h=this.buildSegLevels(e),p=Math.max(1,h.length),f=o(""),v=[],g=[],m=[];for(i=0;i"),v.push([]),g.push([]),m.push([]),r)for(l=0;l').append(c.el),c.leftCol!==c.rightCol?u.attr("colspan",c.rightCol-c.leftCol+1):m[i][s]=u;s<=c.rightCol;)g[i][s]=u,v[i][s]=c,s++;a.append(u)}n(d),this.dayGrid.bookendCells(a),f.append(a)}return{row:t,tbodyEl:f,cellMatrix:g,segMatrix:v,segLevels:h,segs:e}},e.prototype.buildSegLevels=function(t){var e,n,s,o=[];for(this.sortEventSegs(t),e=0;e'+a.htmlEscape(n)+""),i=''+(a.htmlEscape(s.title||"")||" ")+"",'
'+(this.dayGrid.isRTL?i+" "+p:p+" "+i)+"
"+(c?'
':"")+(u?'
':"")+""},e}(l.default);e.default=c},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(58),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderSegs=function(t,e){var n,i=[];return n=this.eventRenderer.renderSegRows(t),this.component.rowEls.each(function(t,s){var o,a,l=r(s),c=r('
');e&&e.row===t?a=e.el.position().top:(o=l.find(".fc-content-skeleton tbody"),o.length||(o=l.find(".fc-content-skeleton table")),a=o.position().top),c.css("top",a).find("table").append(n[t].tbodyEl),l.append(c),i.push(c[0])}),r(i)},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(57),o=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.fillSegTag="td",e}return i.__extends(e,t),e.prototype.attachSegEls=function(t,e){var n,i,r,s=[];for(n=0;n
'),s=i.find("tr"),a>0&&s.append(''),s.append(e.el.attr("colspan",l-a)),l'),this.component.bookendCells(s),i},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(228),s=n(5),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildRenderRange=function(e,n,i){var r,o=t.prototype.buildRenderRange.call(this,e,n,i),a=this.msToUtcMoment(o.startMs,i),l=this.msToUtcMoment(o.endMs,i);return this.opt("fixedWeekCount")&&(r=Math.ceil(l.diff(a,"weeks",!0)),l.add(6-r,"weeks")),new s.default(a,l)},e}(r.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(42),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderFgSegs=function(t){t.length?this.component.renderSegList(t):this.component.renderEmptyMessage()},e.prototype.fgSegHtml=function(t){var e,n=this.view,i=n.calendar,s=i.theme,o=t.footprint,a=o.eventDef,l=o.componentFootprint,c=a.url,u=["fc-list-item"].concat(this.getClasses(a)),d=this.getBgColor(a);return e=l.isAllDay?n.getAllDayHtml():n.isMultiDayRange(l.unzonedRange)?t.isStart||t.isEnd?r.htmlEscape(this._getTimeText(i.msToMoment(t.startMs),i.msToMoment(t.endMs),l.isAllDay)):n.getAllDayHtml():r.htmlEscape(this.getTimeText(o)),c&&u.push("fc-has-url"),''+(this.displayEventTime?''+(e||"")+"":"")+'"+r.htmlEscape(a.title||"")+""},e.prototype.computeEventTimeFormat=function(){return this.opt("mediumTimeFormat")},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(59),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.handleClick=function(e,n){var i;t.prototype.handleClick.call(this,e,n),r(n.target).closest("a[href]").length||(i=e.footprint.eventDef.url)&&!n.isDefaultPrevented()&&(window.location.href=i)},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(38),r=n(52),s=n(215),o=n(216);i.default.registerClass(r.default),i.default.registerClass(s.default),i.default.registerClass(o.default)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(51),r=n(213),s=n(214),o=n(258),a=n(259);i.defineThemeSystem("standard",r.default),i.defineThemeSystem("jquery-ui",s.default),i.defineThemeSystem("bootstrap3",o.default),i.defineThemeSystem("bootstrap4",a.default)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=s,s.prototype.classes={widget:"fc-bootstrap3",tableGrid:"table-bordered",tableList:"table",tableListHeading:"active",buttonGroup:"btn-group",button:"btn btn-default",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"panel panel-default",popoverHeader:"panel-heading",popoverContent:"panel-body",headerRow:"panel-default",dayRow:"panel-default",listView:"panel panel-default"},s.prototype.baseIconClass="glyphicon",s.prototype.iconClasses={close:"glyphicon-remove",prev:"glyphicon-chevron-left",next:"glyphicon-chevron-right",prevYear:"glyphicon-backward",nextYear:"glyphicon-forward"},s.prototype.iconOverrideOption="bootstrapGlyphicons",s.prototype.iconOverrideCustomButtonOption="bootstrapGlyphicon",s.prototype.iconOverridePrefix="glyphicon-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=s,s.prototype.classes={widget:"fc-bootstrap4",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},s.prototype.baseIconClass="fa",s.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},s.prototype.iconOverrideOption="bootstrapFontAwesome",s.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",s.prototype.iconOverridePrefix="fa-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(62),s=n(229);i.defineView("basic",{class:r.default}),i.defineView("basicDay",{type:"basic",duration:{days:1}}),i.defineView("basicWeek",{type:"basic",duration:{weeks:1}}),i.defineView("month",{class:s.default,duration:{months:1},defaults:{fixedWeekCount:!0}})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(226);i.defineView("agenda",{class:r.default,defaults:{allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0}}),i.defineView("agendaDay",{type:"agenda",duration:{days:1}}),i.defineView("agendaWeek",{type:"agenda",duration:{weeks:1}})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(230);i.defineView("list",{class:r.default,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}}),i.defineView("listDay",{type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}}),i.defineView("listWeek",{type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}}),i.defineView("listMonth",{type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}}),i.defineView("listYear",{type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0})}])})},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("full-calendar-reserve",{attrs:{"show-modal":t.showModalReserve,startDate:t.startDate,endDate:t.endDate,"resources-checkboxes":t.resourcesCheckboxes,"number-of-resources":t.selectedResources.length,"add-reservation":t.addReservation},on:{close:function(e){t.showModalReserve=!1}}}),t._v(" "),n("full-calendar-info",{attrs:{"show-modal":t.showModalInfo,reservation:t.reservation,cancel:t.cancelReservation,update:t.updateReservation,refreshTasks:t.refreshTasks,nodes:t.nodes},on:{close:function(e){t.showModalInfo=!1},handleError:t.handleError}})],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(302)}var r=n(195),s=n(306),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-73dcc08a",null);e.a=l.exports},function(t,e){},,,,function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"range-select-container"},[n("v-menu",{attrs:{"close-on-content-click":!1,"nudge-right":40,lazy:"",transition:"scale-transition","offset-y":"","full-width":"","min-width":"290px"},model:{value:t.menu,callback:function(e){t.menu=e},expression:"menu"}},[n("v-text-field",{staticClass:"date-input",attrs:{slot:"activator",label:"Schedule start date","prepend-icon":"event",readonly:""},slot:"activator",model:{value:t.picker,callback:function(e){t.picker=e},expression:"picker"}}),t._v(" "),n("v-date-picker",{on:{input:function(e){t.menu=!1,t.changeSchedule()}},model:{value:t.picker,callback:function(e){t.picker=e},expression:"picker"}})],1),t._v(" "),n("v-text-field",{staticClass:"range-input",attrs:{min:"1",step:"1",type:"number",label:"Schedule range in days"},on:{input:function(e){return t.changeSchedule()}},model:{value:t.range,callback:function(e){t.range=e},expression:"range"}})],1),t._v(" "),n("div",{staticClass:"container"},[n("div",{staticClass:"container-header"},[n("div",{staticClass:"left-table-header"},[t._m(0),t._v(" "),n("table",[n("tbody",[n("tr",[n("td",{staticClass:"first-column"},[n("v-checkbox",{staticClass:"small-checkbox",attrs:{color:"success",label:"Change all"},on:{change:t.changeAll},model:{value:t.changeAllCheckbox,callback:function(e){t.changeAllCheckbox=e},expression:"changeAllCheckbox"}})],1)])])])]),t._v(" "),n("div",{staticClass:"right-table-header",attrs:{id:"right-header"}},[n("table",[n("tbody",t._l(t.tableContent.header,function(e){return n("th",{key:e.value},[t._v(t._s(e.value))])}),0)]),t._v(" "),n("table",[n("tbody",[n("tr",t._l(t.tableContent.hours,function(e){return n("td",{key:e.id,staticClass:"hours"},[t._v(t._s(e.value))])}),0)])])])]),t._v(" "),n("div",{staticClass:"container-content"},[n("div",{staticClass:"left-table",attrs:{id:"left-table"}},[n("div",{key:t.leftTableKey},t._l(t.tableContent.nodes,function(e){return n("table",{key:e.nodeName},[n("tbody",[n("tr",[n("td",{staticClass:"first-column"},[n("div",{staticClass:"node-cell"},[n("v-checkbox",{staticClass:"small-checkbox-node",attrs:{color:"success",label:""+e.nodeName,"input-value":""},on:{change:function(n){return t.changeWholeNode(e.nodeName)}},model:{value:e.selected,callback:function(n){t.$set(e,"selected",n)},expression:"node.selected"}}),t._v(" "),n("v-btn",{staticClass:"mx-2 small-button",attrs:{fab:"",dark:"",color:"info"},on:{click:function(n){return t.toggle(e)}}},[e.hidden?n("v-icon",{attrs:{dark:""}},[t._v("add")]):t._e(),t._v(" "),e.hidden?t._e():n("v-icon",{attrs:{dark:""}},[t._v("remove")])],1)],1)])])]),t._v(" "),n("tbody",{directives:[{name:"show",rawName:"v-show",value:!e.hidden,expression:"!node.hidden"}]},t._l(e.resources,function(i){return n("tr",{key:i},[n("td",{staticClass:"first-column"},[n("v-checkbox",{staticClass:"small-checkbox",attrs:{color:"success",label:""+t.tableContent.resources[i].name},on:{change:function(n){return t.changeResource(e.nodeName,i)}},model:{value:t.tableContent.resources[i].selected,callback:function(e){t.$set(t.tableContent.resources[i],"selected",e)},expression:"tableContent.resources[resourceUUID].selected"}})],1)])}),0)])}),0)]),t._v(" "),n("div",{staticClass:"right-table",attrs:{id:"right-table"}},[n("div",{key:t.rightTableKey},t._l(t.tableContent.nodes,function(e){return n("table",{key:e.nodeName},[n("tbody",[n("tr",t._l(e.slots,function(e){return n("td",{key:e.id},[t._v(t._s(e.value))])}),0)]),t._v(" "),n("tbody",{directives:[{name:"show",rawName:"v-show",value:!e.hidden,expression:"!node.hidden"}]},t._l(e.resources,function(e){return n("tr",{key:e},t._l(t.tableContent.resources[e].slots,function(e){return n("td",{key:e.id,class:{reserved:e.reserved,userReservation:e.userReservation}},[t._v(t._s(e.value))])}),0)}),0)])}),0)])])])])},r=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("table",[n("tbody",[n("th",{staticClass:"first-column"},[t._v("Resources")])])])}],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("v-snackbar",{attrs:{color:"error",bottom:"","multi-line":""},model:{value:t.snackbar,callback:function(e){t.snackbar=e},expression:"snackbar"}},[t._v("\n "+t._s(t.errorMessage)+"\n "),n("v-btn",{attrs:{color:"white",flat:""},on:{click:function(e){t.snackbar=!1}}},[t._v("\n Close\n ")])],1),t._v(" "),t.showSchedule?t._e():n("v-btn",{attrs:{color:"info",small:"",round:""},on:{click:function(e){t.showSchedule=!0}}},[t._v("\n Select visible GPUs\n ")]),t._v(" "),n("section",{directives:[{name:"show",rawName:"v-show",value:t.showSchedule,expression:"showSchedule"}],attrs:{id:"schedule_section"}},[n("v-btn",{attrs:{color:"info",small:"",round:""},on:{click:function(e){t.showSchedule=!1}}},[t._v("\n Hide schedule\n ")]),t._v(" "),n("MySchedule",{attrs:{"parsed-nodes":t.parsedNodes},on:{handleError:function(e){return t.handleError.apply(void 0,arguments)},loadResources:function(e){return t.loadResources.apply(void 0,arguments)}}})],1),t._v(" "),n("section",{attrs:{id:"calendar_section"}},[n("FullCalendar",{attrs:{"update-calendar":t.updateCalendar,"selected-resources":t.selectedResources,nodes:t.nodes},on:{handleError:function(e){return t.handleError.apply(void 0,arguments)}}})],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=n(197),r=n(320),s=n(1),o=s(i.a,r.a,!1,null,null,null);e.a=o.exports},function(t,e,n){"use strict";function i(t){n(310)}var r=n(198),s=n(319),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(312)}var r=n(199),s=n(318),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=n(200),r=n(1),s=r(i.a,null,!1,null,null,null);e.a=s.exports},,,,,function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"select_line"},[n("v-select",{staticClass:"select_item",attrs:{items:t.nodes},model:{value:t.selectedNode,callback:function(e){t.selectedNode=e},expression:"selectedNode"}}),t._v(" "),n("div",{staticClass:"select_space"}),t._v(" "),n("v-select",{staticClass:"select_item",attrs:{items:t.resourceTypes},model:{value:t.selectedResourceType,callback:function(e){t.selectedResourceType=e},expression:"selectedResourceType"}}),t._v(" "),n("div",{staticClass:"select_space"}),t._v(" "),n("v-select",{staticClass:"select_item",attrs:{items:t.metrics},model:{value:t.selectedMetric,callback:function(e){t.selectedMetric=e},expression:"selectedMetric"}}),t._v(" "),n("v-btn",{attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)],1),t._v(" "),n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.alert,callback:function(e){t.alert=e},expression:"alert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),!0===t.showProcesses?n("div",{staticClass:"table_box"},[n("v-data-table",{staticClass:"elevation-1",attrs:{headers:t.headers,items:t.processes,"item-key":"pid","hide-actions":""},scopedSlots:t._u([{key:"items",fn:function(e){return[n("tr",{on:{click:function(t){e.expanded=!e.expanded}}},[n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.index))]),t._v(" "),n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.owner))]),t._v(" "),n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.pid))]),t._v(" "),n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.command))])])]}},{key:"expand",fn:function(e){return[n("v-card",{attrs:{flat:""}},[n("v-card-text",[t._v("GPU UUID: "+t._s(e.item.uuid))])],1)]}}],null,!1,51043860)})],1):n("div",[n("LineChart",{staticClass:"chart_box",attrs:{"chart-data":t.metricData,options:t.metricOptions,"rerender-chart":t.rerenderChart,"update-chart":t.updateChart}})],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.alert,callback:function(e){t.alert=e},expression:"alert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),n("div",{staticClass:"watch_table"},[t._l(t.watches,function(e){return n("WatchBox",{key:e.id,staticClass:"watch_box",attrs:{"default-node":e.defaultNode,"default-resource-type":e.defaultResourceType,"default-metric":e.defaultMetric,"resources-indexes":t.resourcesIndexes,"chart-datasets":t.chartDatasets,"update-chart":t.updateChart,time:t.time},on:{changeDefaultNode:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeDefaultNode.apply(void 0,[e.id].concat(r))},changeDefaultResourceType:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeDefaultResourceType.apply(void 0,[e.id].concat(r))},changeDefaultMetric:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeDefaultMetric.apply(void 0,[e.id].concat(r))},deleteWatch:function(n){return t.deleteWatch(e.id)}}})}),t._v(" "),n("div",{staticClass:"button_box"},[n("v-btn",{staticClass:"big_button",attrs:{fab:"",dark:"",color:"#b8bcc2"},on:{click:t.addWatch}},[n("v-icon",{attrs:{size:"100px",dark:""}},[t._v("add")])],1)],1)],2)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("WatchGenerator")],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(322)}var r=n(201),s=n(356),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(324)}var r=n(202),s=n(343),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-c5e32eee",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(326)}var r=n(203),s=n(342),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-68056994",null);e.a=l.exports},function(t,e){},,,,function(t,e,n){"use strict";function i(t){n(331)}var r=n(204),s=n(332),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"task-input",attrs:{label:t.newParameter,small:""},model:{value:t.newValue,callback:function(e){t.newValue=e},expression:"newValue"}}),t._v(" "),n("v-btn",{staticClass:"remove-button",attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(334)}var r=n(205),s=n(335),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"task-input",attrs:{label:t.newEnvVariable,small:""},model:{value:t.newValue,callback:function(e){t.newValue=e},expression:"newValue"}}),t._v(" "),n("v-btn",{staticClass:"remove-button",attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(337)}var r=n(206),s=n(341),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-ed523d5c",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(339)}var r=n(207),s=n(340),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-1f240f3d",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("TF_CONFIG editor")])],1),t._v(" "),n("v-card-text",[n("v-textarea",{attrs:{solo:"","auto-grow":"",label:"Enter TF_CONFIG JSON here"},model:{value:t.newValue,callback:function(e){t.newValue=e},expression:"newValue"}})],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-tooltip",{attrs:{disabled:t.properJson,top:"",color:"red"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("div",t._g({},i),[n("v-btn",{attrs:{color:"success",disabled:!t.properJson},on:{click:function(e){return t.save()}}},[t._v("\n Save\n ")])],1)]}}])},[t._v(" "),n("span",[t._v("TF_CONFIG needs to be proper JSON object")])])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("TfConfigEdit",{attrs:{value:t.newValue,"show-modal":t.showModalTfConfigEdit},on:{close:function(e){t.showModalTfConfigEdit=!1},updateValue:function(e){return t.updateValue.apply(void 0,arguments)}}}),t._v(" "),t.enableSmartTfConfig?n("v-layout",[n("v-text-field",{staticClass:"tf-short",attrs:{label:"Port",small:""},model:{value:t.newPort,callback:function(e){t.newPort=e},expression:"newPort"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-combobox",{staticClass:"tf-wide",attrs:{label:"Task type",items:t.taskTypeItems},model:{value:t.newTaskType,callback:function(e){t.newTaskType=e},expression:"newTaskType"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),t.newTaskIndex>=0?n("v-text-field",{staticClass:"tf-short",attrs:{label:"Index",type:"number",small:""},model:{value:t.newTaskIndex,callback:function(e){t.newTaskIndex=e},expression:"newTaskIndex"}}):t._e()],1):n("v-btn",{staticClass:"task-input",attrs:{color:"info",round:"",medium:""},on:{click:function(e){t.showModalTfConfigEdit=!0}}},[t._v("\n TF_CONFIG\n ")]),t._v(" "),n("v-tooltip",{attrs:{bottom:"",color:"red"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-btn",t._g({staticClass:"remove-button remove-button-tf",attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},i),[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)]}}])},[t._v(" "),n("span",[t._v("Delete TF_CONFIG")])])],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("v-layout",{attrs:{"align-center":"","justify-center":""}},[n("div",{staticClass:"task-preview"},[t._v("\n "+t._s(t.taskPreview)+"\n ")])]),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-select",{staticClass:"task-select",attrs:{items:t.hostnames,label:"Hostname",small:""},model:{value:t.newHost,callback:function(e){t.newHost=e},expression:"newHost"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-select",{staticClass:"task-select",attrs:{items:t.hostResources,label:"Resource",small:""},model:{value:t.newResource,callback:function(e){t.newResource=e},expression:"newResource"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[t.newEnableTfConfig?n("TaskLineTfConfig",{attrs:{value:t.tfConfig,port:t.tfConfigPort,"task-type":t.tfConfigTaskType,"task-index":t.tfConfigTaskIndex,"tf-cluster":t.tfCluster,"enable-smart-tf-config":t.enableSmartTfConfig},on:{changeTfConfig:function(e){return t.changeTfConfig.apply(void 0,arguments)},deleteTfConfig:function(e){return t.deleteTfConfig()},updateTfConfigPort:function(e){return t.updateTfConfigPort.apply(void 0,arguments)},updateTfConfigTaskType:function(e){return t.updateTfConfigTaskType.apply(void 0,arguments)},updateTfConfigTaskIndex:function(e){return t.updateTfConfigTaskIndex.apply(void 0,arguments)}}}):t._e()],1),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},t._l(t.envVariables,function(e){return n("TaskLineEnvVariable",{key:e.id,staticClass:"task-input",attrs:{envVariable:e.envVariable,value:e.value},on:{changeEnvVariable:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeEnvVariable.apply(void 0,[e.id].concat(r))},deleteEnvVariable:function(n){return t.deleteEnvVariable(e.id)}}})}),1),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-text-field",{staticClass:"task-input",attrs:{label:"Command",small:""},model:{value:t.newCommand,callback:function(e){t.newCommand=e},expression:"newCommand"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},t._l(t.parameters,function(e){return n("TaskLineParameter",{key:e.id,staticClass:"task-input",attrs:{parameter:e.parameter,value:e.value},on:{changeParameter:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeParameter.apply(void 0,[e.id].concat(r))},deleteParameter:function(n){return t.deleteParameter(e.id)}}})}),1),t._v(" "),n("v-btn",{attrs:{color:"error",small:""},on:{click:function(e){return t.removeMe()}}},[t._v("\n Remove task\n ")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Create tasks")]),t._v(" "),n("v-tooltip",{attrs:{right:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({},i),[t._v("\n info\n ")])]}}])},[t._v(" "),n("span",[t._v("CPU tasks can be run without making reservation.\n "),n("br"),t._v("When you want to create a GPU task, you must\n "),n("br"),t._v("first ensure that you are eligible to do so\n "),n("br"),t._v("(having active reservation for that GPU).\n ")])]),t._v(" "),"tf2"===t.chosenTemplate?n("v-switch",{staticClass:"float-right-button",attrs:{label:"Smart TF_CONFIG"},model:{value:t.enableSmartTfConfig,callback:function(e){t.enableSmartTfConfig=e},expression:"enableSmartTfConfig"}}):t._e()],1),t._v(" "),n("v-card-text",t._l(t.lines,function(e){return n("TaskLine",{key:e.id,attrs:{hostnames:t.hostnames,hosts:t.hosts,host:e.host,resource:e.resource,envVariables:e.envVariables,staticEnvVariables:t.staticEnvVariables,command:e.command,parameters:e.parameters,staticParameters:t.staticParameters,"enable-tf-config":e.enableTfConfig,"tf-config":e.tfConfig,"tf-config-port":e.tfConfigPort,"tf-config-task-type":e.tfConfigTaskType,"tf-config-task-index":e.tfConfigTaskIndex,"tf-cluster":t.tfCluster,"enable-smart-tf-config":t.enableSmartTfConfig},on:{changeLine:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeLine.apply(void 0,[e.id].concat(r))},deleteLine:function(n){return t.deleteLine(e.id)},staticParameterChanged:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticParameterChanged.apply(void 0,[e.id].concat(r))},psWorkerParameterChanged:function(e){return t.updatePsWorkerHosts(-1,"")},staticEnvVariableChanged:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticEnvVariableChanged.apply(void 0,[e.id].concat(r))},staticParameterDeleted:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticParameterDeleted.apply(void 0,[e.id].concat(r))},staticEnvVariableDeleted:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticEnvVariableDeleted.apply(void 0,[e.id].concat(r))},updateTfConfigPort:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.updateTfConfigPort.apply(void 0,[e.id].concat(r))},updateTfConfigTaskType:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.updateTfConfigTaskType.apply(void 0,[e.id].concat(r))},updateTfConfigTaskIndex:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.updateTfConfigTaskIndex.apply(void 0,[e.id].concat(r))}}})}),1),t._v(" "),n("v-card-text",[n("v-flex",{attrs:{xs12:""}},[n("v-btn",{attrs:{color:"info",block:"",small:""},on:{click:t.copyLine}},[t._v("\n Add task\n ")])],1),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"parameter-name-input",attrs:{label:"Parameter name",small:""},model:{value:t.newParameter,callback:function(e){t.newParameter=e},expression:"newParameter"}}),t._v(" "),n("v-btn",{attrs:{color:"info",round:""},on:{click:t.addEnvVariable}},[t._v("\n Add as ENV variable to all tasks\n ")]),t._v(" "),n("v-btn",{attrs:{color:"info",round:""},on:{click:t.addParameter}},[t._v("\n Add as parameter to all tasks\n ")]),t._v(" "),n("v-checkbox",{attrs:{label:"Static"},model:{value:t.isNewFieldStatic,callback:function(e){t.isNewFieldStatic=e},expression:"isNewFieldStatic"}})],1)],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:t.addTasks}},[t._v("\n Create all tasks\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(345)}var r=n(208),s=n(346),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-ab402584",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Edit task")])],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"host-input",attrs:{label:"Hostname",small:""},model:{value:t.newHost,callback:function(e){t.newHost=e},expression:"newHost"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-text-field",{staticClass:"command-input",attrs:{label:"Command",small:""},model:{value:t.newCommand,callback:function(e){t.newCommand=e},expression:"newCommand"}})],1)],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:t.changeTask}},[t._v("\n Edit task\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(348)}var r=n(209),s=n(349),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-21a65550",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"40vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Schedule task")])],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-checkbox",{attrs:{label:"Set spawn time"},model:{value:t.spawn,callback:function(e){t.spawn=e},expression:"spawn"}}),t._v(" "),n("v-menu",{attrs:{"close-on-content-click":!1,"nudge-right":40,lazy:"",transition:"none","offset-y":"","full-width":"","min-width":"290px"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Spawn date","prepend-icon":"event"},model:{value:t.newSpawnDate,callback:function(e){t.newSpawnDate=e},expression:"newSpawnDate"}},i))]}}]),model:{value:t.spawnDateMenu,callback:function(e){t.spawnDateMenu=e},expression:"spawnDateMenu"}},[t._v(" "),n("v-date-picker",{on:{input:function(e){t.spawnDateMenu=!1}},model:{value:t.newSpawnDate,callback:function(e){t.newSpawnDate=e},expression:"newSpawnDate"}})],1),t._v(" "),n("v-menu",{ref:"spawnMenu",attrs:{"close-on-content-click":!1,"nudge-right":40,"return-value":t.newSpawnTime,lazy:"",transition:"none","offset-y":"","full-width":"","max-width":"290px","min-width":"290px"},on:{"update:returnValue":function(e){t.newSpawnTime=e},"update:return-value":function(e){t.newSpawnTime=e}},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Spawn time","prepend-icon":"access_time"},model:{value:t.newSpawnTime,callback:function(e){t.newSpawnTime=e},expression:"newSpawnTime"}},i))]}}]),model:{value:t.spawnTimeMenu,callback:function(e){t.spawnTimeMenu=e},expression:"spawnTimeMenu"}},[t._v(" "),t.spawnTimeMenu?n("v-time-picker",{attrs:{"full-width":"",format:"24hr"},on:{"click:minute":function(e){return t.$refs.spawnMenu.save(t.newSpawnTime)}},model:{value:t.newSpawnTime,callback:function(e){t.newSpawnTime=e},expression:"newSpawnTime"}}):t._e()],1)],1),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-checkbox",{attrs:{label:"Set terminate time"},model:{value:t.terminate,callback:function(e){t.terminate=e},expression:"terminate"}}),t._v(" "),n("v-menu",{attrs:{"close-on-content-click":!1,"nudge-right":40,lazy:"",transition:"none","offset-y":"","full-width":"","min-width":"290px"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Terminate date","prepend-icon":"event"},model:{value:t.newTerminateDate,callback:function(e){t.newTerminateDate=e},expression:"newTerminateDate"}},i))]}}]),model:{value:t.terminateDateMenu,callback:function(e){t.terminateDateMenu=e},expression:"terminateDateMenu"}},[t._v(" "),n("v-date-picker",{on:{input:function(e){t.terminateDateMenu=!1}},model:{value:t.newTerminateDate,callback:function(e){t.newTerminateDate=e},expression:"newTerminateDate"}})],1),t._v(" "),n("v-menu",{ref:"terminateMenu",attrs:{"close-on-content-click":!1,"nudge-right":40,"return-value":t.newTerminateTime,lazy:"",transition:"none","offset-y":"","full-width":"","max-width":"290px","min-width":"290px"},on:{"update:returnValue":function(e){t.newTerminateTime=e},"update:return-value":function(e){t.newTerminateTime=e}},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Terminate time","prepend-icon":"access_time"},model:{value:t.newTerminateTime,callback:function(e){t.newTerminateTime=e},expression:"newTerminateTime"}},i))]}}]),model:{value:t.terminateTimeMenu,callback:function(e){t.terminateTimeMenu=e},expression:"terminateTimeMenu"}},[t._v(" "),t.terminateTimeMenu?n("v-time-picker",{attrs:{"full-width":"",format:"24hr"},on:{"click:minute":function(e){return t.$refs.terminateMenu.save(t.newTerminateTime)}},model:{value:t.newTerminateTime,callback:function(e){t.newTerminateTime=e},expression:"newTerminateTime"}}):t._e()],1)],1)],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:t.checkActionFlag}},[t._v("\n Schedule task\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(351)}var r=n(210),s=n(352),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-246122fb",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Task log")])],1),t._v(" "),n("v-card-text",[t._v("\n "+t._s(t.path)+"\n "),n("div",{staticClass:"log_box"},t._l(t.lines,function(e,i){return n("div",{key:i},[t._v("\n "+t._s(e)+"\n ")])}),0)])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(354)}var r=n(211),s=n(355),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-775c6214",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Choose framework template")])],1),t._v(" "),n("v-card-text",[n("v-select",{attrs:{items:t.possibleTemplates,label:"Choose template from list",solo:""},on:{change:t.setChosenTemplate}})],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:function(e){return t.goToCreate()}}},[t._v("\n Go to task creator\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("TaskCreate",{attrs:{"show-modal":t.showModalCreate,hostnames:t.hostnames,hosts:t.hosts,actionFlag:t.actionFlag,"chosen-template":t.chosenTemplate},on:{close:function(e){t.showModalCreate=!1},getTasks:t.getTasks}}),t._v(" "),n("TaskTemplateChooser",{attrs:{"show-modal":t.showModalChooseTemplate},on:{close:function(e){t.showModalChooseTemplate=!1},openFromTemplate:t.openFromTemplate}}),t._v(" "),n("TaskEdit",{attrs:{"show-modal":t.showModalEdit,taskId:t.taskId,hostname:t.newHostname,command:t.newCommand,actionFlag:t.actionFlag},on:{close:function(e){t.showModalEdit=!1},getTask:function(e){return t.getTask.apply(void 0,arguments)},changeActionFlag:function(e){return t.changeActionFlag.apply(void 0,arguments)},changeSnackbar:function(e){return t.changeSnackbar.apply(void 0,arguments)}}}),t._v(" "),n("TaskSchedule",{attrs:{"show-modal":t.showModalSchedule,taskId:t.taskId,spawnTime:t.newSpawnTime,terminateTime:t.newTerminateTime,actionFlag:t.actionFlag,multipleFlag:t.multipleFlag,selected:t.selected},on:{close:function(e){t.showModalSchedule=!1},updateTask:function(e){return t.updateTask.apply(void 0,arguments)},changeActionFlag:function(e){return t.changeActionFlag.apply(void 0,arguments)},changeSnackbar:function(e){return t.changeSnackbar.apply(void 0,arguments)},handleError:function(e){return t.handleError.apply(void 0,arguments)}}}),t._v(" "),n("TaskLog",{attrs:{"show-modal":t.showModalLog,lines:t.logs,path:t.path},on:{close:function(e){t.showModalLog=!1}}}),t._v(" "),n("v-dialog",{attrs:{width:"500"},model:{value:t.showModalHowItWorks,callback:function(e){t.showModalHowItWorks=e},expression:"showModalHowItWorks"}},[n("v-card",[n("v-card-text",{staticClass:"headline grey lighten-2",attrs:{"primary-title":""}},[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModalHowItWorks=!1}}},[n("v-icon",[t._v("close")])],1),t._v("How it works\n ")],1),t._v(" "),n("v-card-text",[t._v("\n Your tasks are managed by `screen` program installed on each machine. You can attach\n to/close them as they are running. Screen sessions created by TensorHive have custom\n names so you won't be confused which is which.\n "),n("br"),t._v(" "),n("br"),t._v("When your task command stops executing, screen session will disappear from `screen -ls`\n but stdout+stderr produced by your process will be redirected to a log file.\n Logs are automatically gathered and stored on that machine under `~/TensorHiveLogs`.\n ")])],1)],1),t._v(" "),n("v-dialog",{attrs:{width:"400"},model:{value:t.showModalRemove,callback:function(e){t.showModalRemove=e},expression:"showModalRemove"}},[n("v-card",[n("v-card-text",{staticClass:"headline grey lighten-2",attrs:{"primary-title":""}},[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModalRemove=!1}}},[n("v-icon",[t._v("close")])],1),t._v("Do you want to remove this task?\n ")],1),t._v(" "),n("v-card-actions",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success",round:""},on:{click:function(e){return t.removeTask()}}},[t._v("Yes")])],1)],1)],1)],1),t._v(" "),n("div",{staticClass:"table-container"},[n("v-data-table",{key:t.tableKey,staticClass:"elevation-1",attrs:{headers:t.headers,items:t.tasks,pagination:t.pagination,loading:t.actionFlag,"select-all":"","item-key":"id","rows-per-page-items":t.rowsPerPageItems},on:{"update:pagination":function(e){t.pagination=e}},scopedSlots:t._u([{key:"headers",fn:function(e){return[n("tr",[n("th",[n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-checkbox",{attrs:{"input-value":e.all,indeterminate:e.indeterminate,primary:"","hide-details":""},on:{click:function(e){return e.stopPropagation(),t.toggleAll(e)}}}),t._v(" "),n("v-tooltip",{attrs:{right:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){t.showModalHowItWorks=!0}}},i),[t._v("info")])]}}],null,!0)},[t._v(" "),n("span",[t._v("How it works")])])],1)],1),t._v(" "),t._l(e.headers,function(e){return n("th",{key:e.text,class:["column sortable",t.pagination.descending?"desc":"asc",e.value===t.pagination.sortBy?"active":""],on:{click:function(n){return t.changeSort(e.value)}}},[n("v-icon",{attrs:{small:""}},[t._v("arrow_upward")]),t._v(" "),n("span",{staticClass:"dark-font"},[t._v(t._s(e.text))])],1)})],2)]}},{key:"items",fn:function(e){return[n("tr",{attrs:{active:e.selected},on:{click:function(t){e.selected=!e.selected}}},[n("td",[n("v-checkbox",{attrs:{"input-value":e.selected,primary:"","hide-details":""}})],1),t._v(" "),n("td",[t._v(t._s(e.item.id))]),t._v(" "),n("td",[t._v(t._s(e.item.hostname))]),t._v(" "),n("td",{staticClass:"task-command"},[t._v(t._s(e.item.command))]),t._v(" "),n("td",[t._v(t._s(e.item.pid))]),t._v(" "),n("td",[t._v(t._s(e.item.status))]),t._v(" "),n("td",[t._v(t._s(t.prettyDate(e.item.spawnAt)))]),t._v(" "),n("td",[t._v(t._s(t.prettyDate(e.item.terminateAt)))]),t._v(" "),n("td",[n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.scheduleTasks(e.item)}}},r),[t._v("schedule")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Schedule task")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.spawnTasks(e.item.id)}}},r),[t._v("play_arrow")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Spawn task")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.terminateTasks(e.item.id,null)}}},r),[t._v("stop")])]}}],null,!0)},[t._v(" "),n("span",[t._v("\n Terminate task - does not guarantee that\n "),n("br"),t._v("task will stop (depends on command)\n ")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({staticStyle:{"font-size":"20px"},on:{click:function(n){return t.terminateTasks(e.item.id,!1)}}},r),[t._v("💀")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Kill task - use when command is more stubborn")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({staticStyle:{"font-size":"20px"},on:{click:function(n){return t.getLog(e.item.id)}}},r),[t._v("description")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Show log")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.editTask(e.item)}}},r),[t._v("edit")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Edit task")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.showConfirmationDialog(e.item.id)}}},r),[t._v("delete")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Remove task")])])],1)])]}}]),model:{value:t.selected,callback:function(e){t.selected=e},expression:"selected"}},[t._v(" "),n("v-progress-linear",{attrs:{indeterminate:!0},scopedSlots:t._u([{key:"progress",fn:function(){},proxy:!0}])})],1)],1),t._v(" "),n("div",{staticClass:"text-xs-center pt-2"},[n("v-btn",{attrs:{color:"primary"},on:{click:function(e){return t.openFromTemplate("")}}},[t._v("Create tasks")]),t._v(" "),n("v-btn",{attrs:{color:"primary"},on:{click:function(e){t.showModalChooseTemplate=!0}}},[t._v("Create tasks from template")]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.getTasks(!0)}}},i),[t._v("refresh")])]}}])},[t._v(" "),n("span",[t._v("Refresh")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.scheduleTasks(null)}}},i),[t._v("schedule")])]}}])},[t._v(" "),n("span",[t._v("Schedule selected tasks")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.spawnTasks(null)}}},i),[t._v("play_arrow")])]}}])},[t._v(" "),n("span",[t._v("Spawn selected tasks")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.terminateTasks(null,null)}}},i),[t._v("stop")])]}}])},[t._v(" "),n("span",[t._v("\n Terminate selected tasks - does not guarantee that\n "),n("br"),t._v("task will stop (depends on command)\n ")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({staticStyle:{"font-size":"20px"},on:{click:function(e){return t.terminateTasks(null,!1)}}},i),[t._v("💀")])]}}])},[t._v(" "),n("span",[t._v("Kill selected tasks - use when command is more stubborn")])])],1),t._v(" "),n("v-snackbar",{attrs:{color:"amber",bottom:"","multi-line":""},model:{value:t.snackbar,callback:function(e){t.snackbar=e},expression:"snackbar"}},[n("span",{staticStyle:{color:"black"}},[t._v("Synchronization in progress. Actions are not allowed now.")]),t._v(" "),n("v-btn",{attrs:{color:"black",flat:""},on:{click:function(e){t.snackbar=!1}}},[t._v("Close")])],1),t._v(" "),n("v-snackbar",{attrs:{color:"red",bottom:"","multi-line":""},model:{value:t.snackbarError,callback:function(e){t.snackbarError=e},expression:"snackbarError"}},[t._v("\n "+t._s(t.errorMessage)+"\n "),n("v-btn",{attrs:{color:"black",flat:""},on:{click:function(e){t.snackbarError=!1}}},[t._v("Close")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(358)}var r=n(212),s=n(359),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-58aecb3a",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.alert,callback:function(e){t.alert=e},expression:"alert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),n("v-alert",{attrs:{dismissible:"",type:"info"},model:{value:t.created,callback:function(e){t.created=e},expression:"created"}},[t._v("\n User successfully created\n ")]),t._v(" "),n("v-layout",{attrs:{row:"","justify-center":""}},[n("v-dialog",{attrs:{width:"500px"},model:{value:t.showModal,callback:function(e){t.showModal=e},expression:"showModal"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModal=!1}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Create new user")])],1),t._v(" "),n("v-card-text",[n("form",{on:{submit:function(e){return e.preventDefault(),t.createUser(e)}}},[n("v-card-text",[t._v("\n Username\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-user"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalUsername,expression:"modalUsername"}],staticClass:"form-control",attrs:{name:"modalUsername",placeholder:"Username",type:"text"},domProps:{value:t.modalUsername},on:{input:function(e){e.target.composing||(t.modalUsername=e.target.value)}}})]),t._v("\n Email\n "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-envelope"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalEmail,expression:"modalEmail"}],staticClass:"form-control",attrs:{name:"modalEmail",placeholder:"Email",type:"text"},domProps:{value:t.modalEmail},on:{input:function(e){e.target.composing||(t.modalEmail=e.target.value)}}})]),t._v("\n Password\n "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalPassword,expression:"modalPassword"}],staticClass:"form-control",attrs:{name:"modalPassword",placeholder:"Password",type:"password"},domProps:{value:t.modalPassword},on:{input:function(e){e.target.composing||(t.modalPassword=e.target.value)}}})]),t._v("\n Repeat password\n "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalPassword2,expression:"modalPassword2"}],staticClass:"form-control",attrs:{name:"modalPassword2",placeholder:"Password2",type:"password"},domProps:{value:t.modalPassword2},on:{input:function(e){e.target.composing||(t.modalPassword2=e.target.value)}}})]),t._v(" "),n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.modalAlert,callback:function(e){t.modalAlert=e},expression:"modalAlert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),n("v-btn",{attrs:{color:"success",type:"submit"}},[t._v("\n Create\n ")])],1)])],1)],1)],1),t._v(" "),n("v-dialog",{attrs:{width:"400"},model:{value:t.showModalRemove,callback:function(e){t.showModalRemove=e},expression:"showModalRemove"}},[n("v-card",[n("v-card-text",{staticClass:"headline grey lighten-2",attrs:{"primary-title":""}},[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModalRemove=!1}}},[n("v-icon",[t._v("close")])],1),t._v("\n Do you want to remove this user?\n ")],1),t._v(" "),n("v-card-actions",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success",round:""},on:{click:function(e){return t.removeUser()}}},[t._v("\n Yes\n ")])],1)],1)],1)],1),t._v(" "),n("div",[n("div",{staticClass:"text-xs-center pt-2"},[n("v-btn",{attrs:{color:"primary"},on:{click:function(e){t.showModal=!0}}},[t._v("Create user")])],1),t._v(" "),n("v-dialog",{attrs:{"max-width":"500px"},model:{value:t.dialog,callback:function(e){t.dialog=e},expression:"dialog"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.dialog=!1}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("v-card-text",[t._v("\n Edit user\n ")]),t._v(" "),n("v-card-text",[t._v("\n Current username: "+t._s(t.currentUser.username)+"\n ")]),t._v(" "),n("v-card-text",[t._v("\n New username\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-envelope"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.username,expression:"user.username"}],staticClass:"form-control",attrs:{name:"modalUsername",placeholder:"Username",type:"text"},domProps:{value:t.user.username},on:{input:function(e){e.target.composing||t.$set(t.user,"username",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n Current email: "+t._s(t.currentUser.email)+"\n ")]),t._v(" "),n("v-card-text",[t._v("\n New email\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-envelope"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.email,expression:"user.email"}],staticClass:"form-control",attrs:{name:"modalEmail",placeholder:"Email",type:"text"},domProps:{value:t.user.email},on:{input:function(e){e.target.composing||t.$set(t.user,"email",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n New password\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.password,expression:"user.password"}],staticClass:"form-control",attrs:{name:"modalPassword",placeholder:"Password",type:"password"},domProps:{value:t.user.password},on:{input:function(e){e.target.composing||t.$set(t.user,"password",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n Repeat password\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.password2,expression:"user.password2"}],staticClass:"form-control",attrs:{name:"modalPassword2",placeholder:"Password2",type:"password"},domProps:{value:t.user.password2},on:{input:function(e){e.target.composing||t.$set(t.user,"password2",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n Account roles:\n ")]),t._v(" "),n("v-card-text",[n("v-checkbox",{attrs:{label:"admin"},model:{value:t.adminCheckbox,callback:function(e){t.adminCheckbox=e},expression:"adminCheckbox"}})],1)],1),t._v(" "),n("v-card-actions",[n("v-spacer"),t._v(" "),n("v-btn",{attrs:{color:"blue darken-1",flat:""},on:{click:t.updateUser}},[t._v("Edit")])],1)],1)],1),t._v(" "),n("v-data-table",{staticClass:"elevation-1",attrs:{headers:t.headers,items:t.users,search:t.search,pagination:t.pagination,"item-key":"id","hide-actions":""},on:{"update:pagination":function(e){t.pagination=e}},scopedSlots:t._u([{key:"items",fn:function(e){return[n("tr",[n("td",[t._v(t._s(e.item.id))]),t._v(" "),n("td",[t._v(t._s(e.item.username))]),t._v(" "),n("td",[t._v(t._s(e.item.email))]),t._v(" "),n("td",[t._v(t._s(t.prettyDate(e.item.createdAt)))]),t._v(" "),n("td",[t._v(t._s(e.item.role))]),t._v(" "),n("td",[n("v-icon",{attrs:{small:""},on:{click:function(n){return t.editUser(e.item)}}},[t._v("\n edit\n ")]),t._v(" "),n("v-icon",{attrs:{small:""},on:{click:function(n){return t.showConfirmationDialog(e.item.id)}}},[t._v("\n delete\n ")])],1)])]}}])}),t._v(" "),n("div",{staticClass:"text-xs-center pt-2"},[n("v-pagination",{attrs:{length:t.pages},model:{value:t.pagination.page,callback:function(e){t.$set(t.pagination,"page",e)},expression:"pagination.page"}})],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=n(30),r=n(361),s=n(362),o=n(363),a=n(364);i.default.use(r.a),e.a=new r.a.Store({state:s.a,actions:o.a,mutations:a.a})},,function(t,e,n){"use strict";e.a={callingAPI:!1,searching:"",serverURI:"http://10.110.1.136:8080",user:null,role:null,id:null,accessToken:null,refreshToken:null,userInfo:{messages:[{1:"test",2:"test"}],notifications:[],tasks:[]}}},function(t,e,n){"use strict";e.a={}},function(t,e,n){"use strict";e.a={TOGGLE_LOADING:function(t){t.callingAPI=!t.callingAPI},TOGGLE_SEARCHING:function(t){t.searching=""===t.searching?"loading":""},SET_USER:function(t,e){t.user=e},SET_ROLE:function(t,e){t.role=e},SET_ID:function(t,e){t.id=e},SET_ACCESS_TOKEN:function(t,e){t.accessToken=e},SET_REFRESH_TOKEN:function(t,e){t.refreshToken=e}}},function(t,e,n){"use strict";function i(t){return a.href=t,a.hostname}function r(t){return t.length}function s(t){return new Date(t).toDateString()}function o(t,e){return 1===t?t+e:t+e+"s"}e.b=i,e.a=r,e.d=s,e.c=o;var a=document.createElement("a")},function(t,e,n){"use strict";var i=n(213),r=n(367),s=n(1),o=s(i.a,r.a,!1,null,null,null);e.a=o.exports},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{attrs:{id:"app"}},[n("v-app",[n("router-view")],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},,function(t,e){},function(t,e){}],[214]); -//# sourceMappingURL=app.923c89f30ff332c6de66.js.map \ No newline at end of file +!function(e,i){t.exports=i(n(0),n(194))}("undefined"!=typeof self&&self,function(t,e){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=236)}([function(e,n){e.exports=t},,function(t,e){var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};e.__extends=function(t,e){function i(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}},function(t,n){t.exports=e},function(t,e,n){function i(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function r(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function s(){pt("body").addClass("fc-not-allowed")}function o(){pt("body").removeClass("fc-not-allowed")}function a(t,e,n){var i=Math.floor(e/t.length),r=Math.floor(e-i*(t.length-1)),s=[],o=[],a=[],c=0;l(t),t.each(function(e,n){var l=e===t.length-1?r:i,u=pt(n).outerHeight(!0);u *").each(function(t,n){var i=pt(n).outerWidth();i>e&&(e=i)}),e++,t.width(e),e}function u(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function d(t){var e=t.css("position"),n=t.parents().filter(function(){var t=pt(this);return/(auto|scroll)/.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&n.length?n:pt(t[0].ownerDocument||document)}function h(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function p(t,e){var n=t.offset(),i=v(t),r=n.left+w(t,"border-left-width")+i.left-(e?e.left:0),s=n.top+w(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:s,bottom:s+t[0].clientHeight}}function f(t,e){var n=t.offset(),i=n.left+w(t,"border-left-width")+w(t,"padding-left")-(e?e.left:0),r=n.top+w(t,"border-top-width")+w(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function v(t){var e,n=t[0].offsetWidth-t[0].clientWidth,i=t[0].offsetHeight-t[0].clientHeight;return n=g(n),i=g(i),e={left:0,right:0,top:0,bottom:i},m()&&"rtl"===t.css("direction")?e.left=n:e.right=n,e}function g(t){return t=Math.max(0,t),t=Math.round(t)}function m(){return null===ft&&(ft=y()),ft}function y(){var t=pt("
").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),e=t.children(),n=e.offset().left>t.offset().left;return t.remove(),n}function w(t,e){return parseFloat(t.css(e))||0}function b(t){return 1===t.which&&!t.ctrlKey}function C(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageX:t.pageX}function T(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageY:t.pageY}function _(t){return/^touch/.test(t.type)}function S(t){t.addClass("fc-unselectable").on("selectstart",E)}function D(t){t.removeClass("fc-unselectable").off("selectstart",E)}function E(t){t.preventDefault()}function k(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left=1&&ct(s)));i++);return r}function V(t,e){var n=z(t);return"week"===n&&"object"==typeof e&&e.days&&(n="day"),n}function j(t,e,n){return null!=n?n.diff(e,t,!0):ht.isDuration(e)?e.as(t):e.end.diff(e.start,t,!0)}function L(t,e,n){var i;return G(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ct(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function B(t,e){var n,i;return G(t)||G(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ct(n)&&Math.abs(i)>=1&&ct(i)?n/i:t.asDays()/e.asDays())}function U(t,e){var n;return G(t)?ht.duration(t*e):(n=t.asMonths(),Math.abs(n)>=1&&ct(n)?ht.duration({months:n*e}):ht.duration({days:t.asDays()*e}))}function G(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function $(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function Y(t){return"string"==typeof t&&/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function W(){for(var t=[],e=0;e=0;s--)if("object"==typeof(o=t[s][i]))r.unshift(o);else if(void 0!==o){l[i]=o;break}r.length&&(l[i]=Z(r))}for(n=t.length-1;n>=0;n--){a=t[n];for(i in a)i in l||(l[i]=a[i])}return l}function K(t,e){for(var n in t)X(t,n)&&(e[n]=t[n])}function X(t,e){return vt.call(t,e)}function Q(t,e,n){if(pt.isFunction(t)&&(t=[t]),t){var i=void 0,r=void 0;for(i=0;i/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function rt(t){return t.replace(/&.*?;/g,"")}function st(t){var e=[];return pt.each(t,function(t,n){null!=n&&e.push(t+":"+n)}),e.join(";")}function ot(t){var e=[];return pt.each(t,function(t,n){null!=n&&e.push(t+'="'+it(n)+'"')}),e.join(" ")}function at(t){return t.charAt(0).toUpperCase()+t.slice(1)}function lt(t,e){return t-e}function ct(t){return t%1==0}function ut(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function dt(t,e,n){void 0===n&&(n=!1);var i,r,s,o,a,l=function(){var c=+new Date-o;ca&&o.push(new t(a,s.startMs)),s.endMs>a&&(a=s.endMs);return at.startMs)&&(null==this.startMs||null==t.endMs||this.startMs=this.startMs)&&(null==this.endMs||null!=t.endMs&&t.endMs<=this.endMs)},t.prototype.containsDate=function(t){var e=t.valueOf();return(null==this.startMs||e>=this.startMs)&&(null==this.endMs||e=this.endMs&&(e=this.endMs-1),e},t.prototype.equals=function(t){return this.startMs===t.startMs&&this.endMs===t.endMs},t.prototype.clone=function(){var e=new t(this.startMs,this.endMs);return e.isStart=this.isStart,e.isEnd=this.isEnd,e},t.prototype.getStart=function(){return null!=this.startMs?s.default.utc(this.startMs).stripZone():null},t.prototype.getEnd=function(){return null!=this.endMs?s.default.utc(this.endMs).stripZone():null},t.prototype.as=function(t){return r.utc(this.endMs).diff(r.utc(this.startMs),t,!0)},t}();e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(208),o=n(33),a=n(49),l=function(t){function e(n){var i=t.call(this)||this;return i.calendar=n,i.className=[],i.uid=String(e.uuid++),i}return i.__extends(e,t),e.parse=function(t,e){var n=new this(e);return!("object"!=typeof t||!n.applyProps(t))&&n},e.normalizeId=function(t){return t?String(t):null},e.prototype.fetch=function(t,e,n){},e.prototype.removeEventDefsById=function(t){},e.prototype.removeAllEventDefs=function(){},e.prototype.getPrimitive=function(t){},e.prototype.parseEventDefs=function(t){var e,n,i=[];for(e=0;e0},e}(s.default);e.default=o},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.isAllDay=!1,this.unzonedRange=t,this.isAllDay=e}return t.prototype.toLegacy=function(t){return{start:t.msToMoment(this.unzonedRange.startMs,this.isAllDay),end:t.msToMoment(this.unzonedRange.endMs,this.isAllDay)}},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(34),s=n(209),o=n(17),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildInstances=function(){return[this.buildInstance()]},e.prototype.buildInstance=function(){return new s.default(this,this.dateProfile)},e.prototype.isAllDay=function(){return this.dateProfile.isAllDay()},e.prototype.clone=function(){var e=t.prototype.clone.call(this);return e.dateProfile=this.dateProfile,e},e.prototype.rezone=function(){var t=this.source.calendar,e=this.dateProfile;this.dateProfile=new o.default(t.moment(e.start),e.end?t.moment(e.end):null,t)},e.prototype.applyManualStandardProps=function(e){var n=t.prototype.applyManualStandardProps.call(this,e),i=o.default.parse(e,this.source);return!!i&&(this.dateProfile=i,null!=e.date&&(this.miscProps.date=e.date),n)},e}(r.default);e.default=a,a.defineStandardProps({start:!1,date:!1,end:!1,allDay:!1})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(){}return t.mixInto=function(t){var e=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){t.prototype[n]||(t.prototype[n]=e.prototype[n])})},t.mixOver=function(t){var e=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){t.prototype[n]=e.prototype[n]})},t}();e.default=n},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){this.view=t._getView(),this.component=t}return t.prototype.opt=function(t){return this.view.opt(t)},t.prototype.end=function(){},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.version="3.9.0",e.internalApiVersion=12;var i=n(4);e.applyAll=i.applyAll,e.debounce=i.debounce,e.isInt=i.isInt,e.htmlEscape=i.htmlEscape,e.cssToStr=i.cssToStr,e.proxy=i.proxy,e.capitaliseFirstLetter=i.capitaliseFirstLetter,e.getOuterRect=i.getOuterRect,e.getClientRect=i.getClientRect,e.getContentRect=i.getContentRect,e.getScrollbarWidths=i.getScrollbarWidths,e.preventDefault=i.preventDefault,e.parseFieldSpecs=i.parseFieldSpecs,e.compareByFieldSpecs=i.compareByFieldSpecs,e.compareByFieldSpec=i.compareByFieldSpec,e.flexibleCompare=i.flexibleCompare,e.computeGreatestUnit=i.computeGreatestUnit,e.divideRangeByDuration=i.divideRangeByDuration,e.divideDurationByDuration=i.divideDurationByDuration,e.multiplyDuration=i.multiplyDuration,e.durationHasTime=i.durationHasTime,e.log=i.log,e.warn=i.warn,e.removeExact=i.removeExact,e.intersectRects=i.intersectRects;var r=n(47);e.formatDate=r.formatDate,e.formatRange=r.formatRange,e.queryMostGranularFormatUnit=r.queryMostGranularFormatUnit;var s=n(31);e.datepickerLocale=s.datepickerLocale,e.locale=s.locale;var o=n(10);e.moment=o.default;var a=n(11);e.EmitterMixin=a.default;var l=n(7);e.ListenerMixin=l.default;var c=n(48);e.Model=c.default;var u=n(207);e.Constraints=u.default;var d=n(5);e.UnzonedRange=d.default;var h=n(12);e.ComponentFootprint=h.default;var p=n(212);e.BusinessHourGenerator=p.default;var f=n(34);e.EventDef=f.default;var v=n(37);e.EventDefMutation=v.default;var g=n(38);e.EventSourceParser=g.default;var m=n(6);e.EventSource=m.default;var y=n(51);e.defineThemeSystem=y.defineThemeSystem;var w=n(18);e.EventInstanceGroup=w.default;var b=n(52);e.ArrayEventSource=b.default;var C=n(215);e.FuncEventSource=C.default;var T=n(216);e.JsonFeedEventSource=T.default;var _=n(36);e.EventFootprint=_.default;var S=n(33);e.Class=S.default;var D=n(14);e.Mixin=D.default;var E=n(53);e.CoordCache=E.default;var k=n(54);e.DragListener=k.default;var x=n(20);e.Promise=x.default;var M=n(217);e.TaskQueue=M.default;var R=n(218);e.RenderQueue=R.default;var I=n(39);e.Scroller=I.default;var P=n(19);e.Theme=P.default;var H=n(219);e.DateComponent=H.default;var F=n(40);e.InteractiveDateComponent=F.default;var O=n(220);e.Calendar=O.default;var A=n(41);e.View=A.default;var N=n(22);e.defineView=N.defineView,e.getViewConfig=N.getViewConfig;var z=n(55);e.DayTableMixin=z.default;var V=n(56);e.BusinessHourRenderer=V.default;var j=n(42);e.EventRenderer=j.default;var L=n(57);e.FillRenderer=L.default;var B=n(58);e.HelperRenderer=B.default;var U=n(222);e.ExternalDropping=U.default;var G=n(223);e.EventResizing=G.default;var $=n(59);e.EventPointing=$.default;var Y=n(224);e.EventDragging=Y.default;var W=n(225);e.DateSelecting=W.default;var q=n(60);e.StandardInteractionsMixin=q.default;var Z=n(226);e.AgendaView=Z.default;var K=n(227);e.TimeGrid=K.default;var X=n(61);e.DayGrid=X.default;var Q=n(62);e.BasicView=Q.default;var J=n(229);e.MonthView=J.default;var tt=n(230);e.ListView=tt.default},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(5),r=function(){function t(t,e,n){this.start=t,this.end=e||null,this.unzonedRange=this.buildUnzonedRange(n)}return t.parse=function(e,n){var i=e.start||e.date,r=e.end;if(!i)return!1;var s=n.calendar,o=s.moment(i),a=r?s.moment(r):null,l=e.allDay,c=s.opt("forceEventDuration");return!!o.isValid()&&(!a||a.isValid()&&a.isAfter(o)||(a=null),null==l&&null==(l=n.allDayDefault)&&(l=s.opt("allDayDefault")),!0===l?(o.stripTime(),a&&a.stripTime()):!1===l&&(o.hasTime()||o.time(0),a&&!a.hasTime()&&a.time(0)),!a&&c&&(a=s.getDefaultEventEnd(!o.hasTime(),o)),new t(o,a,s))},t.isStandardProp=function(t){return"start"===t||"date"===t||"end"===t||"allDay"===t},t.prototype.isAllDay=function(){return!(this.start.hasTime()||this.end&&this.end.hasTime())},t.prototype.buildUnzonedRange=function(t){var e=this.start.clone().stripZone().valueOf(),n=this.getEnd(t).stripZone().valueOf();return new i.default(e,n)},t.prototype.getEnd=function(t){return this.end?this.end.clone():t.getDefaultEventEnd(this.isAllDay(),this.start)},t}();e.default=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(5),r=n(35),s=n(211),o=function(){function t(t){this.eventInstances=t||[]}return t.prototype.getAllEventRanges=function(t){return t?this.sliceNormalRenderRanges(t):this.eventInstances.map(r.eventInstanceToEventRange)},t.prototype.sliceRenderRanges=function(t){return this.isInverse()?this.sliceInverseRenderRanges(t):this.sliceNormalRenderRanges(t)},t.prototype.sliceNormalRenderRanges=function(t){var e,n,i,r=this.eventInstances,o=[];for(e=0;e
')},e.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},e.prototype.destroy=function(){this.el.remove()},e.prototype.applyOverflow=function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},e.prototype.lockOverflow=function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},e.prototype.setHeight=function(t){this.scrollEl.height(t)},e.prototype.getScrollTop=function(){return this.scrollEl.scrollTop()},e.prototype.setScrollTop=function(t){this.scrollEl.scrollTop(t)},e.prototype.getClientWidth=function(){return this.scrollEl[0].clientWidth},e.prototype.getClientHeight=function(){return this.scrollEl[0].clientHeight},e.prototype.getScrollbarWidths=function(){return s.getScrollbarWidths(this.scrollEl)},e}(o.default);e.default=a},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(4),o=n(219),a=n(21),l=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.segSelector=".fc-event-container > *",i.dateSelectingClass&&(i.dateClicking=new i.dateClickingClass(i)),i.dateSelectingClass&&(i.dateSelecting=new i.dateSelectingClass(i)),i.eventPointingClass&&(i.eventPointing=new i.eventPointingClass(i)),i.eventDraggingClass&&i.eventPointing&&(i.eventDragging=new i.eventDraggingClass(i,i.eventPointing)),i.eventResizingClass&&i.eventPointing&&(i.eventResizing=new i.eventResizingClass(i,i.eventPointing)),i.externalDroppingClass&&(i.externalDropping=new i.externalDroppingClass(i)),i}return i.__extends(e,t),e.prototype.setElement=function(e){t.prototype.setElement.call(this,e),this.dateClicking&&this.dateClicking.bindToEl(e),this.dateSelecting&&this.dateSelecting.bindToEl(e),this.bindAllSegHandlersToEl(e)},e.prototype.removeElement=function(){this.endInteractions(),t.prototype.removeElement.call(this)},e.prototype.executeEventUnrender=function(){this.endInteractions(),t.prototype.executeEventUnrender.call(this)},e.prototype.bindGlobalHandlers=function(){t.prototype.bindGlobalHandlers.call(this),this.externalDropping&&this.externalDropping.bindToDocument()},e.prototype.unbindGlobalHandlers=function(){t.prototype.unbindGlobalHandlers.call(this),this.externalDropping&&this.externalDropping.unbindFromDocument()},e.prototype.bindDateHandlerToEl=function(t,e,n){var i=this;this.el.on(e,function(t){if(!r(t.target).is(i.segSelector+":not(.fc-helper),"+i.segSelector+":not(.fc-helper) *,.fc-more,a[data-goto]"))return n.call(i,t)})},e.prototype.bindAllSegHandlersToEl=function(t){[this.eventPointing,this.eventDragging,this.eventResizing].forEach(function(e){e&&e.bindToEl(t)})},e.prototype.bindSegHandlerToEl=function(t,e,n){var i=this;t.on(e,this.segSelector,function(t){var e=r(t.currentTarget);if(!e.is(".fc-helper")){var s=e.data("fc-seg");if(s&&!i.shouldIgnoreEventPointing())return n.call(i,s,t)}})},e.prototype.shouldIgnoreMouse=function(){return a.default.get().shouldIgnoreMouse()},e.prototype.shouldIgnoreTouch=function(){var t=this._getView();return t.isSelected||t.selectedEvent},e.prototype.shouldIgnoreEventPointing=function(){return this.eventDragging&&this.eventDragging.isDragging||this.eventResizing&&this.eventResizing.isResizing},e.prototype.canStartSelection=function(t,e){return s.getEvIsTouch(e)&&!this.canStartResize(t,e)&&(this.isEventDefDraggable(t.footprint.eventDef)||this.isEventDefResizable(t.footprint.eventDef))},e.prototype.canStartDrag=function(t,e){return!this.canStartResize(t,e)&&this.isEventDefDraggable(t.footprint.eventDef)},e.prototype.canStartResize=function(t,e){var n=this._getView(),i=t.footprint.eventDef;return(!s.getEvIsTouch(e)||n.isEventDefSelected(i))&&this.isEventDefResizable(i)&&r(e.target).is(".fc-resizer")},e.prototype.endInteractions=function(){[this.dateClicking,this.dateSelecting,this.eventPointing,this.eventDragging,this.eventResizing].forEach(function(t){t&&t.end()})},e.prototype.isEventDefDraggable=function(t){return this.isEventDefStartEditable(t)},e.prototype.isEventDefStartEditable=function(t){var e=t.isStartExplicitlyEditable();return null==e&&null==(e=this.opt("eventStartEditable"))&&(e=this.isEventDefGenerallyEditable(t)),e},e.prototype.isEventDefGenerallyEditable=function(t){var e=t.isExplicitlyEditable();return null==e&&(e=this.opt("editable")),e},e.prototype.isEventDefResizableFromStart=function(t){return this.opt("eventResizableFromStart")&&this.isEventDefResizable(t)},e.prototype.isEventDefResizableFromEnd=function(t){return this.isEventDefResizable(t)},e.prototype.isEventDefResizable=function(t){var e=t.isDurationExplicitlyEditable();return null==e&&null==(e=this.opt("eventDurationEditable"))&&(e=this.isEventDefGenerallyEditable(t)),e},e.prototype.diffDates=function(t,e){return this.largeUnit?s.diffByUnit(t,e,this.largeUnit):s.diffDayTime(t,e)},e.prototype.isEventInstanceGroupAllowed=function(t){var e,n=this._getView(),i=this.dateProfile,r=this.eventRangesToEventFootprints(t.getAllEventRanges());for(e=0;e1?"ll":"LL"},e.prototype.setDate=function(t){var e=this.get("dateProfile"),n=this.dateProfileGenerator.build(t,void 0,!0);e&&e.activeUnzonedRange.equals(n.activeUnzonedRange)||this.set("dateProfile",n)},e.prototype.unsetDate=function(){this.unset("dateProfile")},e.prototype.fetchInitialEvents=function(t){var e=this.calendar,n=t.isRangeAllDay&&!this.usesMinMaxTime;return e.requestEvents(e.msToMoment(t.activeUnzonedRange.startMs,n),e.msToMoment(t.activeUnzonedRange.endMs,n))},e.prototype.bindEventChanges=function(){this.listenTo(this.calendar,"eventsReset",this.resetEvents)},e.prototype.unbindEventChanges=function(){this.stopListeningTo(this.calendar,"eventsReset")},e.prototype.setEvents=function(t){this.set("currentEvents",t),this.set("hasEvents",!0)},e.prototype.unsetEvents=function(){this.unset("currentEvents"),this.unset("hasEvents")},e.prototype.resetEvents=function(t){this.startBatchRender(),this.unsetEvents(),this.setEvents(t),this.stopBatchRender()},e.prototype.requestDateRender=function(t){var e=this;this.requestRender(function(){e.executeDateRender(t)},"date","init")},e.prototype.requestDateUnrender=function(){var t=this;this.requestRender(function(){t.executeDateUnrender()},"date","destroy")},e.prototype.executeDateRender=function(e){t.prototype.executeDateRender.call(this,e),this.render&&this.render(),this.trigger("datesRendered"),this.addScroll({isDateInit:!0}),this.startNowIndicator()},e.prototype.executeDateUnrender=function(){this.unselect(),this.stopNowIndicator(),this.trigger("before:datesUnrendered"),this.destroy&&this.destroy(),t.prototype.executeDateUnrender.call(this)},e.prototype.bindBaseRenderHandlers=function(){var t=this;this.on("datesRendered",function(){t.whenSizeUpdated(t.triggerViewRender)}),this.on("before:datesUnrendered",function(){t.triggerViewDestroy()})},e.prototype.triggerViewRender=function(){this.publiclyTrigger("viewRender",{context:this,args:[this,this.el]})},e.prototype.triggerViewDestroy=function(){this.publiclyTrigger("viewDestroy",{context:this,args:[this,this.el]})},e.prototype.requestEventsRender=function(t){var e=this;this.requestRender(function(){e.executeEventRender(t),e.whenSizeUpdated(e.triggerAfterEventsRendered)},"event","init")},e.prototype.requestEventsUnrender=function(){var t=this;this.requestRender(function(){t.triggerBeforeEventsDestroyed(),t.executeEventUnrender()},"event","destroy")},e.prototype.requestBusinessHoursRender=function(t){var e=this;this.requestRender(function(){e.renderBusinessHours(t)},"businessHours","init")},e.prototype.requestBusinessHoursUnrender=function(){var t=this;this.requestRender(function(){t.unrenderBusinessHours()},"businessHours","destroy")},e.prototype.bindGlobalHandlers=function(){t.prototype.bindGlobalHandlers.call(this),this.listenTo(u.default.get(),{touchstart:this.processUnselect,mousedown:this.handleDocumentMousedown})},e.prototype.unbindGlobalHandlers=function(){t.prototype.unbindGlobalHandlers.call(this),this.stopListeningTo(u.default.get())},e.prototype.startNowIndicator=function(){var t,e,n,i=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit())&&(e=o.proxy(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),n=this.initialNowDate.clone().startOf(t).add(1,t).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout(function(){i.nowIndicatorTimeoutID=null,e(),n=+s.duration(1,t),n=Math.max(100,n),i.nowIndicatorIntervalID=setInterval(e,n)},n))},e.prototype.updateNowIndicator=function(){this.isDatesRendered&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add((new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},e.prototype.stopNowIndicator=function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},e.prototype.updateSize=function(e,n,i){this.setHeight?this.setHeight(e,n):t.prototype.updateSize.call(this,e,n,i),this.updateNowIndicator()},e.prototype.addScroll=function(t){var e=this.queuedScroll||(this.queuedScroll={});r.extend(e,t)},e.prototype.popScroll=function(){this.applyQueuedScroll(),this.queuedScroll=null},e.prototype.applyQueuedScroll=function(){this.queuedScroll&&this.applyScroll(this.queuedScroll)},e.prototype.queryScroll=function(){var t={};return this.isDatesRendered&&r.extend(t,this.queryDateScroll()),t},e.prototype.applyScroll=function(t){t.isDateInit&&this.isDatesRendered&&r.extend(t,this.computeInitialDateScroll()),this.isDatesRendered&&this.applyDateScroll(t)},e.prototype.computeInitialDateScroll=function(){return{}},e.prototype.queryDateScroll=function(){return{}},e.prototype.applyDateScroll=function(t){},e.prototype.reportEventDrop=function(t,e,n,i){var r=this.calendar.eventManager,o=r.mutateEventsWithId(t.def.id,e),a=e.dateMutation;a&&(t.dateProfile=a.buildNewDateProfile(t.dateProfile,this.calendar)),this.triggerEventDrop(t,a&&a.dateDelta||s.duration(),o,n,i)},e.prototype.triggerEventDrop=function(t,e,n,i,r){this.publiclyTrigger("eventDrop",{context:i[0],args:[t.toLegacy(),e,n,r,{},this]})},e.prototype.reportExternalDrop=function(t,e,n,i,r,s){e&&this.calendar.eventManager.addEventDef(t,n),this.triggerExternalDrop(t,e,i,r,s)},e.prototype.triggerExternalDrop=function(t,e,n,i,r){this.publiclyTrigger("drop",{context:n[0],args:[t.dateProfile.start.clone(),i,r,this]}),e&&this.publiclyTrigger("eventReceive",{context:this,args:[t.buildInstance().toLegacy(),this]})},e.prototype.reportEventResize=function(t,e,n,i){var r=this.calendar.eventManager,s=r.mutateEventsWithId(t.def.id,e);t.dateProfile=e.dateMutation.buildNewDateProfile(t.dateProfile,this.calendar),this.triggerEventResize(t,e.dateMutation.endDelta,s,n,i)},e.prototype.triggerEventResize=function(t,e,n,i,r){this.publiclyTrigger("eventResize",{context:i[0],args:[t.toLegacy(),e,n,r,{},this]})},e.prototype.select=function(t,e){this.unselect(e),this.renderSelectionFootprint(t),this.reportSelection(t,e)},e.prototype.renderSelectionFootprint=function(e){this.renderSelection?this.renderSelection(e.toLegacy(this.calendar)):t.prototype.renderSelectionFootprint.call(this,e)},e.prototype.reportSelection=function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},e.prototype.triggerSelect=function(t,e){var n=this.calendar.footprintToDateProfile(t);this.publiclyTrigger("select",{context:this,args:[n.start,n.end,e,this]})},e.prototype.unselect=function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",{context:this,args:[t,this]}))},e.prototype.selectEventInstance=function(t){this.selectedEventInstance&&this.selectedEventInstance===t||(this.unselectEventInstance(),this.getEventSegs().forEach(function(e){e.footprint.eventInstance===t&&e.el&&e.el.addClass("fc-selected")}),this.selectedEventInstance=t)},e.prototype.unselectEventInstance=function(){this.selectedEventInstance&&(this.getEventSegs().forEach(function(t){t.el&&t.el.removeClass("fc-selected")}),this.selectedEventInstance=null)},e.prototype.isEventDefSelected=function(t){return this.selectedEventInstance&&this.selectedEventInstance.def.id===t.id},e.prototype.handleDocumentMousedown=function(t){o.isPrimaryMouseButton(t)&&this.processUnselect(t)},e.prototype.processUnselect=function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},e.prototype.processRangeUnselect=function(t){var e;this.isSelected&&this.opt("unselectAuto")&&((e=this.opt("unselectCancel"))&&r(t.target).closest(e).length||this.unselect(t))},e.prototype.processEventUnselect=function(t){this.selectedEventInstance&&(r(t.target).closest(".fc-selected").length||this.unselectEventInstance())},e.prototype.triggerBaseRendered=function(){this.publiclyTrigger("viewRender",{context:this,args:[this,this.el]})},e.prototype.triggerBaseUnrendered=function(){this.publiclyTrigger("viewDestroy",{context:this,args:[this,this.el]})},e.prototype.triggerDayClick=function(t,e,n){var i=this.calendar.footprintToDateProfile(t);this.publiclyTrigger("dayClick",{context:e,args:[i.start,n,this]})},e.prototype.isDateInOtherMonth=function(t,e){return!1},e.prototype.getUnzonedRangeOption=function(t){var e=this.opt(t);if("function"==typeof e&&(e=e.apply(null,Array.prototype.slice.call(arguments,1))),e)return this.calendar.parseUnzonedRange(e)},e.prototype.initHiddenDays=function(){var t,e=this.opt("hiddenDays")||[],n=[],i=0;for(!1===this.opt("weekends")&&e.push(0,6),t=0;t<7;t++)(n[t]=-1!==r.inArray(t,e))||i++;if(!i)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(t){var e=t.getStart(),n=t.getEnd();return e&&(e=this.skipHiddenDays(e)),n&&(n=this.skipHiddenDays(n,-1,!0)),null===e||null===n||es&&(!l[o]||c.isSame(u,l[o]))&&(o-1!==s||"."!==d[o]);o--)g=d[o]+g;for(a=s;a<=o;a++)m+=d[a],y+=h[a];return(m||y)&&(w=r?y+i+m:m+i+y),v(p+w+g)}function a(t){return S[t]||(S[t]=l(t))}function l(t){var e=c(t);return{fakeFormatString:d(e),sameUnits:h(e)}}function c(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push.apply(n,u(e[1])):e[2]?n.push({maybe:c(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push.apply(n,u(e[5]));return n}function u(t){return". "===t?["."," "]:[t]}function d(t){var e,n,i=[];for(e=0;er.value)&&(r=i);return r?r.unit:null}Object.defineProperty(e,"__esModule",{value:!0});var m=n(10);m.newMomentProto.format=function(){return this._fullCalendar&&arguments[0]?r(this,arguments[0]):this._ambigTime?m.oldMomentFormat(i(this),"YYYY-MM-DD"):this._ambigZone?m.oldMomentFormat(i(this),"YYYY-MM-DD[T]HH:mm:ss"):this._fullCalendar?m.oldMomentFormat(i(this)):m.oldMomentProto.format.apply(this,arguments)},m.newMomentProto.toISOString=function(){return this._ambigTime?m.oldMomentFormat(i(this),"YYYY-MM-DD"):this._ambigZone?m.oldMomentFormat(i(this),"YYYY-MM-DD[T]HH:mm:ss"):this._fullCalendar?m.oldMomentProto.toISOString.apply(i(this),arguments):m.oldMomentProto.toISOString.apply(this,arguments)};var y="\v",w="",b="",C=new RegExp(b+"([^"+b+"]*)"+b,"g"),T={t:function(t){return m.oldMomentFormat(t,"a").charAt(0)},T:function(t){return m.oldMomentFormat(t,"A").charAt(0)}},_={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}};e.formatDate=r,e.formatRange=s;var S={};e.queryMostGranularFormatUnit=g},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(33),s=n(11),o=n(7),a=function(t){function e(){var e=t.call(this)||this;return e._watchers={},e._props={},e.applyGlobalWatchers(),e.constructed(),e}return i.__extends(e,t),e.watch=function(t){for(var e=[],n=1;n0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},t.prototype.clear=function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},t.prototype.ensureBuilt=function(){this.origin||this.build()},t.prototype.buildElHorizontals=function(){var t=[],e=[];this.els.each(function(n,r){var s=i(r),o=s.offset().left,a=s.outerWidth();t.push(o),e.push(o+a)}),this.lefts=t,this.rights=e},t.prototype.buildElVerticals=function(){var t=[],e=[];this.els.each(function(n,r){var s=i(r),o=s.offset().top,a=s.outerHeight();t.push(o),e.push(o+a)}),this.tops=t,this.bottoms=e},t.prototype.getHorizontalIndex=function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e=n[e]&&t=n[e]&&t0&&(t=r.getScrollParent(this.els.eq(0)),!t.is(document))?r.getClientRect(t):null},t.prototype.isPointInBounds=function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},t.prototype.isLeftInBounds=function(t){return!this.boundingRect||t>=this.boundingRect.left&&t=this.boundingRect.top&&t=i*i&&this.handleDistanceSurpassed(t),this.isDragging&&this.handleDrag(e,n,t)},t.prototype.handleDrag=function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},t.prototype.endDrag=function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},t.prototype.handleDragEnd=function(t){this.trigger("dragEnd",t)},t.prototype.startDelay=function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},t.prototype.handleDelayEnd=function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},t.prototype.handleDistanceSurpassed=function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},t.prototype.handleTouchMove=function(t){this.isDragging&&this.shouldCancelTouchScroll&&t.preventDefault(),this.handleMove(t)},t.prototype.handleMouseMove=function(t){this.handleMove(t)},t.prototype.handleTouchScroll=function(t){this.isDragging&&!this.scrollAlwaysKills||this.endInteraction(t,!0)},t.prototype.trigger=function(t){for(var e=[],n=1;n=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?c=i*this.scrollSpeed*-1:s>=0&&s<=1&&(c=s*this.scrollSpeed)),this.setScrollVel(l,c)},t.prototype.setScrollVel=function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(r.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},t.prototype.constrainScrollVel=function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},t.prototype.scrollIntervalFunc=function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},t.prototype.endAutoScroll=function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},t.prototype.handleDebouncedScroll=function(){this.scrollIntervalId||this.handleScrollEnd()},t.prototype.handleScrollEnd=function(){},t}();e.default=a,s.default.mixInto(a)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(14),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.updateDayTable=function(){for(var t,e,n,i=this,r=i.view,s=r.calendar,o=s.msToUtcMoment(i.dateProfile.renderUnzonedRange.startMs,!0),a=s.msToUtcMoment(i.dateProfile.renderUnzonedRange.endMs,!0),l=-1,c=[],u=[];o.isBefore(a);)r.isHiddenDay(o)?c.push(l+.5):(l++,c.push(l),u.push(o.clone())),o.add(1,"days");if(this.breakOnWeeks){for(e=u[0].day(),t=1;t=e.length?e[e.length-1]+1:e[n]},e.prototype.computeColHeadFormat=function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.opt("dayOfMonthFormat"):"dddd"},e.prototype.sliceRangeByRow=function(t){var e,n,i,r,s,o=this.daysPerRow,a=this.view.computeDayRange(t),l=this.getDateDayIndex(a.start),c=this.getDateDayIndex(a.end.clone().subtract(1,"days")),u=[];for(e=0;e'+this.renderHeadTrHtml()+"
"},e.prototype.renderHeadIntroHtml=function(){return this.renderIntroHtml()},e.prototype.renderHeadTrHtml=function(){return""+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+""},e.prototype.renderHeadDateCellsHtml=function(){var t,e,n=[];for(t=0;t1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+(a?o.buildGotoAnchorHtml({date:t,forceOff:s.rowCnt>1||1===s.colCnt},i):i)+""},e.prototype.renderBgTrHtml=function(t){return""+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+""},e.prototype.renderBgIntroHtml=function(t){return this.renderIntroHtml()},e.prototype.renderBgCellsHtml=function(t){var e,n,i=[];for(e=0;e"},e.prototype.renderIntroHtml=function(){},e.prototype.bookendCells=function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))},e}(s.default);e.default=o},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.component=t,this.fillRenderer=e}return t.prototype.render=function(t){var e=this.component,n=e._getDateProfile().activeUnzonedRange,i=t.buildEventInstanceGroup(e.hasAllDayBusinessHours,n),r=i?e.eventRangesToEventFootprints(i.sliceRenderRanges(n)):[];this.renderEventFootprints(r)},t.prototype.renderEventFootprints=function(t){var e=this.component.eventFootprintsToSegs(t);this.renderSegs(e),this.segs=e},t.prototype.renderSegs=function(t){this.fillRenderer&&this.fillRenderer.renderSegs("businessHours",t,{getClasses:function(t){return["fc-nonbusiness","fc-bgevent"]}})},t.prototype.unrender=function(){this.fillRenderer&&this.fillRenderer.unrender("businessHours"),this.segs=null},t.prototype.getSegs=function(){return this.segs||[]},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),s=function(){function t(t){this.fillSegTag="div",this.component=t,this.elsByFill={}}return t.prototype.renderFootprint=function(t,e,n){this.renderSegs(t,this.component.componentFootprintToSegs(e),n)},t.prototype.renderSegs=function(t,e,n){var i;return e=this.buildSegEls(t,e,n),i=this.attachSegEls(t,e),i&&this.reportEls(t,i),e},t.prototype.unrender=function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},t.prototype.buildSegEls=function(t,e,n){var r,s=this,o="",a=[];if(e.length){for(r=0;r"},t.prototype.attachSegEls=function(t,e){},t.prototype.reportEls=function(t,e){this.elsByFill[t]?this.elsByFill[t]=this.elsByFill[t].add(e):this.elsByFill[t]=i(e)},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(13),r=n(36),s=n(6),o=function(){function t(t,e){this.view=t._getView(),this.component=t,this.eventRenderer=e}return t.prototype.renderComponentFootprint=function(t){this.renderEventFootprints([this.fabricateEventFootprint(t)])},t.prototype.renderEventDraggingFootprints=function(t,e,n){this.renderEventFootprints(t,e,"fc-dragging",n?null:this.view.opt("dragOpacity"))},t.prototype.renderEventResizingFootprints=function(t,e,n){this.renderEventFootprints(t,e,"fc-resizing")},t.prototype.renderEventFootprints=function(t,e,n,i){var r,s=this.component.eventFootprintsToSegs(t),o="fc-helper "+(n||"");for(s=this.eventRenderer.renderFgSegEls(s),r=0;r
'+this.renderBgTrHtml(t)+'
'+(this.getIsNumbersVisible()?""+this.renderNumberTrHtml(t)+"":"")+"
"},e.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.cellWeekNumbersVisible},e.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},e.prototype.renderNumberTrHtml=function(t){return""+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+""},e.prototype.renderNumberIntroHtml=function(t){return this.renderIntroHtml()},e.prototype.renderNumberCellsHtml=function(t){var e,n,i=[];for(e=0;e",this.cellWeekNumbersVisible&&t.day()===n&&(r+=i.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),o&&(r+=i.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.format("D"))),r+=""):""},e.prototype.prepareHits=function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},e.prototype.releaseHits=function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},e.prototype.queryHit=function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},e.prototype.getHitFootprint=function(t){var e=this.getCellRange(t.row,t.col);return new c.default(new l.default(e.start,e.end),!0)},e.prototype.getHitEl=function(t){return this.getCellEl(t.row,t.col)},e.prototype.getCellHit=function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},e.prototype.getCellEl=function(t,e){return this.cellEls.eq(t*this.colCnt+e)},e.prototype.executeEventUnrender=function(){this.removeSegPopover(),t.prototype.executeEventUnrender.call(this)},e.prototype.getOwnEventSegs=function(){return t.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs||[])},e.prototype.renderDrag=function(t,e,n){var i;for(i=0;i td > :first-child").each(e),i.position().top+s>a)return n;return!1},e.prototype.limitRow=function(t,e){var n,i,s,o,a,l,c,u,d,h,p,f,v,g,m,y=this,w=this.eventRenderer.rowStructs[t],b=[],C=0,T=function(n){for(;C").append(m),d.append(g),b.push(g[0])),C++};if(e&&e').attr("rowspan",h),l=u[f],m=this.renderMoreLink(t,a.leftCol+f,[a].concat(l)),g=r("
").append(m),v.append(g),p.push(v[0]),b.push(v[0]);d.addClass("fc-limited").after(r(p)),s.push(d[0])}}T(this.colCnt),w.moreEls=r(b),w.limitedEls=r(s)}},e.prototype.unlimitRow=function(t){var e=this.eventRenderer.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},e.prototype.renderMoreLink=function(t,e,n){var i=this,s=this.view;return r('').text(this.getMoreLinkText(n.length)).on("click",function(o){var a=i.opt("eventLimitClick"),l=i.getCellDate(t,e),c=r(o.currentTarget),u=i.getCellEl(t,e),d=i.getCellSegs(t,e),h=i.resliceDaySegs(d,l),p=i.resliceDaySegs(n,l);"function"==typeof a&&(a=i.publiclyTrigger("eventLimitClick",{context:s,args:[{date:l.clone(),dayEl:u,moreEl:c,segs:h,hiddenSegs:p},o,s]})),"popover"===a?i.showSegPopover(t,e,c,h):"string"==typeof a&&s.calendar.zoomTo(l,a)})},e.prototype.showSegPopover=function(t,e,n,i){var r,s,o=this,l=this.view,c=n.parent();r=1===this.rowCnt?l.el:this.rowEls.eq(t),s={className:"fc-more-popover "+l.calendar.theme.getClass("popover"),content:this.renderSegPopoverContent(t,e,i),parentEl:l.el,top:r.offset().top,autoHide:!0,viewportConstrain:this.opt("popoverViewportConstrain"),hide:function(){o.popoverSegs&&o.triggerBeforeEventSegsDestroyed(o.popoverSegs),o.segPopover.removeElement(),o.segPopover=null,o.popoverSegs=null}},this.isRTL?s.right=c.offset().left+c.outerWidth()+1:s.left=c.offset().left-1,this.segPopover=new a.default(s),this.segPopover.show(),this.bindAllSegHandlersToEl(this.segPopover.el),this.triggerAfterEventSegsRendered(i)},e.prototype.renderSegPopoverContent=function(t,e,n){var i,o=this.view,a=o.calendar.theme,l=this.getCellDate(t,e).format(this.opt("dayPopoverFormat")),c=r('
'+s.htmlEscape(l)+'
'),u=c.find(".fc-event-container");for(n=this.eventRenderer.renderFgSegEls(n,!0),this.popoverSegs=n,i=0;i"+o.htmlEscape(this.opt("weekNumberTitle"))+"":""},e.prototype.renderNumberIntroHtml=function(t){var e=this.view,n=this.getCellDate(t,0);return this.colWeekNumbersVisible?'"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"":""},e.prototype.renderBgIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'":""},e.prototype.renderIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'":""},e.prototype.getIsNumbersVisible=function(){return u.default.prototype.getIsNumbersVisible.apply(this,arguments)||this.colWeekNumbersVisible},e}(t)}Object.defineProperty(e,"__esModule",{value:!0});var r=n(2),s=n(3),o=n(4),a=n(39),l=n(41),c=n(228),u=n(61),d=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.dayGrid=i.instantiateDayGrid(),i.dayGrid.isRigid=i.hasRigidRows(),i.opt("weekNumbers")&&(i.opt("weekNumbersWithinDays")?(i.dayGrid.cellWeekNumbersVisible=!0,i.dayGrid.colWeekNumbersVisible=!1):(i.dayGrid.cellWeekNumbersVisible=!1,i.dayGrid.colWeekNumbersVisible=!0)),i.addChild(i.dayGrid),i.scroller=new a.default({overflowX:"hidden",overflowY:"auto"}),i}return r.__extends(e,t),e.prototype.instantiateDayGrid=function(){return new(i(this.dayGridClass))(this)},e.prototype.executeDateRender=function(e){this.dayGrid.breakOnWeeks=/year|month|week/.test(e.currentRangeUnit),t.prototype.executeDateRender.call(this,e)},e.prototype.renderSkeleton=function(){var t,e;this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.scroller.render(),t=this.scroller.el.addClass("fc-day-grid-container"),e=s('
').appendTo(t),this.el.find(".fc-body > tr > td").append(t),this.dayGrid.headContainerEl=this.el.find(".fc-head-container"),this.dayGrid.setElement(e)},e.prototype.unrenderSkeleton=function(){this.dayGrid.removeElement(),this.scroller.destroy()},e.prototype.renderSkeletonHtml=function(){var t=this.calendar.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'},e.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},e.prototype.hasRigidRows=function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},e.prototype.updateSize=function(e,n,i){var r,s,a=this.opt("eventLimit"),l=this.dayGrid.headContainerEl.find(".fc-row");if(!this.dayGrid.rowEls)return void(n||(r=this.computeScrollerHeight(e),this.scroller.setHeight(r)));t.prototype.updateSize.call(this,e,n,i),this.dayGrid.colWeekNumbersVisible&&(this.weekNumberWidth=o.matchCellWidths(this.el.find(".fc-week-number"))),this.scroller.clear(),o.uncompensateScroll(l),this.dayGrid.removeSegPopover(),a&&"number"==typeof a&&this.dayGrid.limitRows(a),r=this.computeScrollerHeight(e),this.setGridHeight(r,n),a&&"number"!=typeof a&&this.dayGrid.limitRows(a),n||(this.scroller.setHeight(r),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(o.compensateScroll(l,s),r=this.computeScrollerHeight(e),this.scroller.setHeight(r)),this.scroller.lockOverflow(s))},e.prototype.computeScrollerHeight=function(t){return t-o.subtractInnerElHeight(this.el,this.scroller.el)},e.prototype.setGridHeight=function(t,e){e?o.undistributeHeight(this.dayGrid.rowEls):o.distributeHeight(this.dayGrid.rowEls,t,!0)},e.prototype.computeInitialDateScroll=function(){return{top:0}},e.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},e.prototype.applyDateScroll=function(t){void 0!==t.top&&this.scroller.setScrollTop(t.top)},e}(l.default);e.default=d,d.prototype.dateProfileGeneratorClass=c.default,d.prototype.dayGridClass=u.default},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){function i(t,e,n){var i;for(i=0;i=0;e--)switch(n=i[e],n.type){case"init":r=!1;case"add":case"remove":i.splice(e,1)}return r&&i.push(t),r},e}(r.default);e.default=s},function(t,e,n){function i(t){var e,n,i,r=[];for(e in t)for(n=t[e].eventInstances,i=0;i'+n+"
":""+n+""},e.prototype.getAllDayHtml=function(){return this.opt("allDayHtml")||a.htmlEscape(this.opt("allDayText"))},e.prototype.getDayClasses=function(t,e){var n,i=this._getView(),r=[];return this.dateProfile.activeUnzonedRange.containsDate(t)?(r.push("fc-"+a.dayIDs[t.day()]),i.isDateInOtherMonth(t,this.dateProfile)&&r.push("fc-other-month"),n=i.calendar.getNow(),t.isSame(n,"day")?(r.push("fc-today"),!0!==e&&r.push(i.calendar.theme.getClass("today"))):t=this.nextDayThreshold&&s.add(1,"days"),s<=n&&(s=n.clone().add(1,"days")),{start:n,end:s}},e.prototype.isMultiDayRange=function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1},e.guid=0,e}(u.default);e.default=h},function(t,e,n){function i(t,e){return null==e?t:r.isFunction(e)?t.filter(e):(e+="",t.filter(function(t){return t.id==e||t._id===e}))}Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),s=n(0),o=n(4),a=n(32),l=n(238),c=n(21),u=n(11),d=n(7),h=n(239),p=n(240),f=n(241),v=n(207),g=n(31),m=n(10),y=n(5),w=n(12),b=n(17),C=n(242),T=n(212),_=n(38),S=n(49),D=n(13),E=n(37),k=n(6),x=n(51),M=function(){function t(t,e){this.loadingLevel=0,this.ignoreUpdateViewSize=0,this.freezeContentHeightDepth=0,c.default.needed(),this.el=t,this.viewsByType={},this.optionsManager=new p.default(this,e),this.viewSpecManager=new f.default(this.optionsManager,this),this.initMomentInternals(),this.initCurrentDate(),this.initEventManager(),this.constraints=new v.default(this.eventManager,this),this.constructed()}return t.prototype.constructed=function(){},t.prototype.getView=function(){return this.view},t.prototype.publiclyTrigger=function(t,e){var n,i,s=this.opt(t);if(r.isPlainObject(e)?(n=e.context,i=e.args):r.isArray(e)&&(i=e),null==n&&(n=this.el[0]),i||(i=[]),this.triggerWith(t,n,i),s)return s.apply(n,i)},t.prototype.hasPublicHandlers=function(t){return this.hasHandlers(t)||this.opt(t)},t.prototype.option=function(t,e){var n;if("string"==typeof t){if(void 0===e)return this.optionsManager.get(t);n={},n[t]=e,this.optionsManager.add(n)}else"object"==typeof t&&this.optionsManager.add(t)},t.prototype.opt=function(t){return this.optionsManager.get(t)},t.prototype.instantiateView=function(t){var e=this.viewSpecManager.getViewSpec(t);if(!e)throw new Error('View type "'+t+'" is not valid');return new e.class(this,e)},t.prototype.isValidViewType=function(t){return Boolean(this.viewSpecManager.getViewSpec(t))},t.prototype.changeView=function(t,e){e&&(e.start&&e.end?this.optionsManager.recordOverrides({visibleRange:e}):this.currentDate=this.moment(e).stripZone()),this.renderView(t)},t.prototype.zoomTo=function(t,e){var n;e=e||"day",n=this.viewSpecManager.getViewSpec(e)||this.viewSpecManager.getUnitViewSpec(e),this.currentDate=t.clone(),this.renderView(n?n.type:null)},t.prototype.initCurrentDate=function(){var t=this.opt("defaultDate");this.currentDate=null!=t?this.moment(t).stripZone():this.getNow()},t.prototype.prev=function(){var t=this.view,e=t.dateProfileGenerator.buildPrev(t.get("dateProfile"));e.isValid&&(this.currentDate=e.date,this.renderView())},t.prototype.next=function(){var t=this.view,e=t.dateProfileGenerator.buildNext(t.get("dateProfile"));e.isValid&&(this.currentDate=e.date,this.renderView())},t.prototype.prevYear=function(){this.currentDate.add(-1,"years"),this.renderView()},t.prototype.nextYear=function(){this.currentDate.add(1,"years"),this.renderView()},t.prototype.today=function(){this.currentDate=this.getNow(),this.renderView()},t.prototype.gotoDate=function(t){this.currentDate=this.moment(t).stripZone(),this.renderView()},t.prototype.incrementDate=function(t){this.currentDate.add(s.duration(t)),this.renderView()},t.prototype.getDate=function(){return this.applyTimezone(this.currentDate)},t.prototype.pushLoading=function(){this.loadingLevel++||this.publiclyTrigger("loading",[!0,this.view])},t.prototype.popLoading=function(){--this.loadingLevel||this.publiclyTrigger("loading",[!1,this.view])},t.prototype.render=function(){this.contentEl?this.elementVisible()&&(this.calcSize(),this.updateViewSize()):this.initialRender()},t.prototype.initialRender=function(){var t=this,e=this.el;e.addClass("fc"),e.on("click.fc","a[data-goto]",function(e){var n=r(e.currentTarget),i=n.data("goto"),s=t.moment(i.date),a=i.type,l=t.view.opt("navLink"+o.capitaliseFirstLetter(a)+"Click");"function"==typeof l?l(s,e):("string"==typeof l&&(a=l),t.zoomTo(s,a))}),this.optionsManager.watch("settingTheme",["?theme","?themeSystem"],function(n){var i=x.getThemeSystemClass(n.themeSystem||n.theme),r=new i(t.optionsManager),s=r.getClass("widget");t.theme=r,s&&e.addClass(s)},function(){var n=t.theme.getClass("widget");t.theme=null,n&&e.removeClass(n)}),this.optionsManager.watch("settingBusinessHourGenerator",["?businessHours"],function(e){t.businessHourGenerator=new T.default(e.businessHours,t),t.view&&t.view.set("businessHourGenerator",t.businessHourGenerator)},function(){t.businessHourGenerator=null}),this.optionsManager.watch("applyingDirClasses",["?isRTL","?locale"],function(t){e.toggleClass("fc-ltr",!t.isRTL),e.toggleClass("fc-rtl",t.isRTL)}),this.contentEl=r("
").prependTo(e),this.initToolbars(),this.renderHeader(),this.renderFooter(),this.renderView(this.opt("defaultView")),this.opt("handleWindowResize")&&r(window).resize(this.windowResizeProxy=o.debounce(this.windowResize.bind(this),this.opt("windowResizeDelay")))},t.prototype.destroy=function(){this.view&&this.clearView(),this.toolbarsManager.proxyCall("removeElement"),this.contentEl.remove(),this.el.removeClass("fc fc-ltr fc-rtl"),this.optionsManager.unwatch("settingTheme"),this.optionsManager.unwatch("settingBusinessHourGenerator"),this.el.off(".fc"),this.windowResizeProxy&&(r(window).unbind("resize",this.windowResizeProxy),this.windowResizeProxy=null),c.default.unneeded()},t.prototype.elementVisible=function(){return this.el.is(":visible")},t.prototype.bindViewHandlers=function(t){var e=this;t.watch("titleForCalendar",["title"],function(n){t===e.view&&e.setToolbarsTitle(n.title)}),t.watch("dateProfileForCalendar",["dateProfile"],function(n){t===e.view&&(e.currentDate=n.dateProfile.date,e.updateToolbarButtons(n.dateProfile))})},t.prototype.unbindViewHandlers=function(t){t.unwatch("titleForCalendar"),t.unwatch("dateProfileForCalendar")},t.prototype.renderView=function(t){var e,n=this.view;this.freezeContentHeight(),n&&t&&n.type!==t&&this.clearView(),!this.view&&t&&(e=this.view=this.viewsByType[t]||(this.viewsByType[t]=this.instantiateView(t)),this.bindViewHandlers(e),e.startBatchRender(),e.setElement(r("
").appendTo(this.contentEl)),this.toolbarsManager.proxyCall("activateButton",t)),this.view&&(this.view.get("businessHourGenerator")!==this.businessHourGenerator&&this.view.set("businessHourGenerator",this.businessHourGenerator),this.view.setDate(this.currentDate),e&&e.stopBatchRender()),this.thawContentHeight()},t.prototype.clearView=function(){var t=this.view;this.toolbarsManager.proxyCall("deactivateButton",t.type),this.unbindViewHandlers(t),t.removeElement(),t.unsetDate(),this.view=null},t.prototype.reinitView=function(){var t=this.view,e=t.queryScroll();this.freezeContentHeight(),this.clearView(),this.calcSize(),this.renderView(t.type),this.view.applyScroll(e),this.thawContentHeight()},t.prototype.getSuggestedViewHeight=function(){return null==this.suggestedViewHeight&&this.calcSize(),this.suggestedViewHeight},t.prototype.isHeightAuto=function(){return"auto"===this.opt("contentHeight")||"auto"===this.opt("height")},t.prototype.updateViewSize=function(t){void 0===t&&(t=!1);var e,n=this.view;if(!this.ignoreUpdateViewSize&&n)return t&&(this.calcSize(),e=n.queryScroll()),this.ignoreUpdateViewSize++,n.updateSize(this.getSuggestedViewHeight(),this.isHeightAuto(),t),this.ignoreUpdateViewSize--,t&&n.applyScroll(e),!0},t.prototype.calcSize=function(){this.elementVisible()&&this._calcSize()},t.prototype._calcSize=function(){var t=this.opt("contentHeight"),e=this.opt("height");this.suggestedViewHeight="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-this.queryToolbarsHeight():"function"==typeof e?e()-this.queryToolbarsHeight():"parent"===e?this.el.parent().height()-this.queryToolbarsHeight():Math.round(this.contentEl.width()/Math.max(this.opt("aspectRatio"),.5))},t.prototype.windowResize=function(t){t.target===window&&this.view&&this.view.isDatesRendered&&this.updateViewSize(!0)&&this.publiclyTrigger("windowResize",[this.view])},t.prototype.freezeContentHeight=function(){this.freezeContentHeightDepth++||this.forceFreezeContentHeight()},t.prototype.forceFreezeContentHeight=function(){this.contentEl.css({width:"100%",height:this.contentEl.height(),overflow:"hidden"})},t.prototype.thawContentHeight=function(){this.freezeContentHeightDepth--,this.contentEl.css({width:"",height:"",overflow:""}),this.freezeContentHeightDepth&&this.forceFreezeContentHeight()},t.prototype.initToolbars=function(){this.header=new h.default(this,this.computeHeaderOptions()),this.footer=new h.default(this,this.computeFooterOptions()),this.toolbarsManager=new l.default([this.header,this.footer])},t.prototype.computeHeaderOptions=function(){return{extraClasses:"fc-header-toolbar",layout:this.opt("header")}},t.prototype.computeFooterOptions=function(){return{extraClasses:"fc-footer-toolbar",layout:this.opt("footer")}},t.prototype.renderHeader=function(){var t=this.header;t.setToolbarOptions(this.computeHeaderOptions()),t.render(),t.el&&this.el.prepend(t.el)},t.prototype.renderFooter=function(){var t=this.footer;t.setToolbarOptions(this.computeFooterOptions()),t.render(),t.el&&this.el.append(t.el)},t.prototype.setToolbarsTitle=function(t){this.toolbarsManager.proxyCall("updateTitle",t)},t.prototype.updateToolbarButtons=function(t){var e=this.getNow(),n=this.view,i=n.dateProfileGenerator.build(e),r=n.dateProfileGenerator.buildPrev(n.get("dateProfile")),s=n.dateProfileGenerator.buildNext(n.get("dateProfile"));this.toolbarsManager.proxyCall(i.isValid&&!t.currentUnzonedRange.containsDate(e)?"enableButton":"disableButton","today"),this.toolbarsManager.proxyCall(r.isValid?"enableButton":"disableButton","prev"),this.toolbarsManager.proxyCall(s.isValid?"enableButton":"disableButton","next")},t.prototype.queryToolbarsHeight=function(){return this.toolbarsManager.items.reduce(function(t,e){return t+(e.el?e.el.outerHeight(!0):0)},0)},t.prototype.select=function(t,e){this.view.select(this.buildSelectFootprint.apply(this,arguments))},t.prototype.unselect=function(){this.view&&this.view.unselect()},t.prototype.buildSelectFootprint=function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),new w.default(new y.default(i,n),!i.hasTime())},t.prototype.initMomentInternals=function(){var t=this;this.defaultAllDayEventDuration=s.duration(this.opt("defaultAllDayEventDuration")),this.defaultTimedEventDuration=s.duration(this.opt("defaultTimedEventDuration")),this.optionsManager.watch("buildingMomentLocale",["?locale","?monthNames","?monthNamesShort","?dayNames","?dayNamesShort","?firstDay","?weekNumberCalculation"],function(e){var n,i=e.weekNumberCalculation,r=e.firstDay;"iso"===i&&(i="ISO");var s=Object.create(g.getMomentLocaleData(e.locale));e.monthNames&&(s._months=e.monthNames),e.monthNamesShort&&(s._monthsShort=e.monthNamesShort),e.dayNames&&(s._weekdays=e.dayNames),e.dayNamesShort&&(s._weekdaysShort=e.dayNamesShort),null==r&&"ISO"===i&&(r=1),null!=r&&(n=Object.create(s._week),n.dow=r,s._week=n),"ISO"!==i&&"local"!==i&&"function"!=typeof i||(s._fullCalendar_weekCalc=i),t.localeData=s,t.currentDate&&t.localizeMoment(t.currentDate)})},t.prototype.moment=function(){for(var t=[],e=0;e864e5&&r.time(n-864e5)),new s.default(i,r)},t.prototype.buildRangeFromDuration=function(t,e,n,o){function a(){u=t.clone().startOf(p),d=u.clone().add(n),h=new s.default(u,d)}var l,c,u,d,h,p=this.opt("dateAlignment");return p||(l=this.opt("dateIncrement"),l?(c=i.duration(l),p=cs.getStart()&&(i=new a.default,i.setEndDelta(l),r=new o.default,r.setDateMutation(i),r)},e}(c.default);e.default=u},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(37),o=n(50),a=n(54),l=n(23),c=n(244),u=n(15),d=function(t){function e(e,n){var i=t.call(this,e)||this;return i.isDragging=!1,i.eventPointing=n,i}return i.__extends(e,t),e.prototype.end=function(){this.dragListener&&this.dragListener.endInteraction()},e.prototype.getSelectionDelay=function(){var t=this.opt("eventLongPressDelay");return null==t&&(t=this.opt("longPressDelay")),t},e.prototype.bindToEl=function(t){var e=this.component;e.bindSegHandlerToEl(t,"mousedown",this.handleMousedown.bind(this)),e.bindSegHandlerToEl(t,"touchstart",this.handleTouchStart.bind(this))},e.prototype.handleMousedown=function(t,e){!this.component.shouldIgnoreMouse()&&this.component.canStartDrag(t,e)&&this.buildDragListener(t).startInteraction(e,{distance:5})},e.prototype.handleTouchStart=function(t,e){var n=this.component,i={delay:this.view.isEventDefSelected(t.footprint.eventDef)?0:this.getSelectionDelay()};n.canStartDrag(t,e)?this.buildDragListener(t).startInteraction(e,i):n.canStartSelection(t,e)&&this.buildSelectListener(t).startInteraction(e,i)},e.prototype.buildSelectListener=function(t){var e=this,n=this.view,i=t.footprint.eventDef,r=t.footprint.eventInstance;if(this.dragListener)return this.dragListener;var s=this.dragListener=new a.default({dragStart:function(t){s.isTouch&&!n.isEventDefSelected(i)&&r&&n.selectEventInstance(r)},interactionEnd:function(t){e.dragListener=null}});return s},e.prototype.buildDragListener=function(t){var e,n,i,s=this,o=this.component,a=this.view,u=a.calendar,d=u.eventManager,h=t.el,p=t.footprint.eventDef,f=t.footprint.eventInstance;if(this.dragListener)return this.dragListener;var v=this.dragListener=new l.default(a,{scroll:this.opt("dragScroll"),subjectEl:h,subjectCenter:!0,interactionStart:function(i){t.component=o,e=!1,n=new c.default(t.el,{additionalClass:"fc-dragging",parentEl:a.el,opacity:v.isTouch?null:s.opt("dragOpacity"),revertDuration:s.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){v.isTouch&&!a.isEventDefSelected(p)&&f&&a.selectEventInstance(f),e=!0,s.eventPointing.handleMouseout(t,n),s.segDragStart(t,n),a.hideEventsWithId(t.footprint.eventDef.id)},hitOver:function(e,l,c){var h,f,g,m=!0;t.hit&&(c=t.hit),h=c.component.getSafeHitFootprint(c),f=e.component.getSafeHitFootprint(e),h&&f?(i=s.computeEventDropMutation(h,f,p),i?(g=d.buildMutatedEventInstanceGroup(p.id,i),m=o.isEventInstanceGroupAllowed(g)):m=!1):m=!1,m||(i=null,r.disableCursor()),i&&a.renderDrag(o.eventRangesToEventFootprints(g.sliceRenderRanges(o.dateProfile.renderUnzonedRange,u)),t,v.isTouch)?n.hide():n.show(),l&&(i=null)},hitOut:function(){a.unrenderDrag(t),n.show(),i=null},hitDone:function(){r.enableCursor()},interactionEnd:function(r){delete t.component,n.stop(!i,function(){e&&(a.unrenderDrag(t),s.segDragStop(t,r)),a.showEventsWithId(t.footprint.eventDef.id),i&&a.reportEventDrop(f,i,h,r)}),s.dragListener=null}});return v},e.prototype.segDragStart=function(t,e){this.isDragging=!0,this.component.publiclyTrigger("eventDragStart",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.segDragStop=function(t,e){this.isDragging=!1,this.component.publiclyTrigger("eventDragStop",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.computeEventDropMutation=function(t,e,n){var i=new s.default;return i.setDateMutation(this.computeEventDateMutation(t,e)),i},e.prototype.computeEventDateMutation=function(t,e){var n,i,r=t.unzonedRange.getStart(),s=e.unzonedRange.getStart(),a=!1,l=!1,c=!1;return t.isAllDay!==e.isAllDay&&(a=!0,e.isAllDay?(c=!0,r.stripTime()):l=!0),n=this.component.diffDates(s,r),i=new o.default,i.clearEnd=a,i.forceTimed=l,i.forceAllDay=c,i.setDateDelta(n),i},e}(u.default);e.default=d},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(23),o=n(12),a=n(5),l=n(15),c=function(t){function e(e){var n=t.call(this,e)||this;return n.dragListener=n.buildDragListener(),n}return i.__extends(e,t),e.prototype.end=function(){this.dragListener.endInteraction()},e.prototype.getDelay=function(){var t=this.opt("selectLongPressDelay");return null==t&&(t=this.opt("longPressDelay")),t},e.prototype.bindToEl=function(t){var e=this,n=this.component,i=this.dragListener;n.bindDateHandlerToEl(t,"mousedown",function(t){e.opt("selectable")&&!n.shouldIgnoreMouse()&&i.startInteraction(t,{distance:e.opt("selectMinDistance")})}),n.bindDateHandlerToEl(t,"touchstart",function(t){e.opt("selectable")&&!n.shouldIgnoreTouch()&&i.startInteraction(t,{delay:e.getDelay()})}),r.preventSelection(t)},e.prototype.buildDragListener=function(){var t,e=this,n=this.component;return new s.default(n,{scroll:this.opt("dragScroll"),interactionStart:function(){t=null},dragStart:function(t){e.view.unselect(t)},hitOver:function(i,s,o){var a,l;o&&(a=n.getSafeHitFootprint(o),l=n.getSafeHitFootprint(i),t=a&&l?e.computeSelection(a,l):null,t?n.renderSelectionFootprint(t):!1===t&&r.disableCursor())},hitOut:function(){t=null,n.unrenderSelection()},hitDone:function(){r.enableCursor()},interactionEnd:function(n,i){!i&&t&&e.view.reportSelection(t,n)}})},e.prototype.computeSelection=function(t,e){var n=this.computeSelectionFootprint(t,e);return!(n&&!this.isSelectionFootprintAllowed(n))&&n},e.prototype.computeSelectionFootprint=function(t,e){var n=[t.unzonedRange.startMs,t.unzonedRange.endMs,e.unzonedRange.startMs,e.unzonedRange.endMs];return n.sort(r.compareNumbers),new o.default(new a.default(n[0],n[3]),t.isAllDay)},e.prototype.isSelectionFootprintAllowed=function(t){return this.component.dateProfile.validUnzonedRange.containsRange(t.unzonedRange)&&this.view.calendar.constraints.isSelectionFootprintAllowed(t)},e}(l.default);e.default=c},function(t,e,n){function i(t){var e,n=[],i=[];for(e=0;e').appendTo(t),this.el.find(".fc-body > tr > td").append(t),this.timeGrid.headContainerEl=this.el.find(".fc-head-container"),this.timeGrid.setElement(e),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight())},e.prototype.unrenderSkeleton=function(){this.timeGrid.removeElement(),this.dayGrid&&this.dayGrid.removeElement(),this.scroller.destroy()},e.prototype.renderSkeletonHtml=function(){var t=this.calendar.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'+(this.dayGrid?'

':"")+"
"},e.prototype.axisStyleAttr=function(){return null!=this.axisWidth?'style="width:'+this.axisWidth+'px"':""},e.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},e.prototype.updateSize=function(e,n,i){var r,s,o;if(t.prototype.updateSize.call(this,e,n,i),this.axisWidth=c.matchCellWidths(this.el.find(".fc-axis")),!this.timeGrid.colEls)return void(n||(s=this.computeScrollerHeight(e),this.scroller.setHeight(s)));var a=this.el.find(".fc-row:not(.fc-scroller *)");this.timeGrid.bottomRuleEl.hide(),this.scroller.clear(),c.uncompensateScroll(a),this.dayGrid&&(this.dayGrid.removeSegPopover(),r=this.opt("eventLimit"),r&&"number"!=typeof r&&(r=5),r&&this.dayGrid.limitRows(r)),n||(s=this.computeScrollerHeight(e),this.scroller.setHeight(s),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(c.compensateScroll(a,o),s=this.computeScrollerHeight(e),this.scroller.setHeight(s)),this.scroller.lockOverflow(o),this.timeGrid.getTotalSlatHeight()"+e.buildGotoAnchorHtml({date:i,type:"week",forceOff:this.colCnt>1},c.htmlEscape(t))+""):'"},renderBgIntroHtml:function(){var t=this.view;return'"},renderIntroHtml:function(){return'"}},s={renderBgIntroHtml:function(){var t=this.view;return'"+t.getAllDayHtml()+""},renderIntroHtml:function(){return'"}}},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(0),o=n(4),a=n(40),l=n(56),c=n(60),u=n(55),d=n(53),h=n(5),p=n(12),f=n(246),v=n(247),g=n(248),m=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],y=function(t){function e(e){var n=t.call(this,e)||this;return n.processOptions(),n}return i.__extends(e,t),e.prototype.componentFootprintToSegs=function(t){var e,n=this.sliceRangeByTimes(t.unzonedRange);for(e=0;e=0;e--)if(n=s.duration(m[e]),i=o.divideDurationByDuration(n,t),o.isInt(i)&&i>1)return n;return s.duration(t)},e.prototype.renderDates=function(t){this.dateProfile=t,this.updateDayTable(),this.renderSlats(),this.renderColumns()},e.prototype.unrenderDates=function(){this.unrenderColumns()},e.prototype.renderSkeleton=function(){var t=this.view.calendar.theme;this.el.html('
'),this.bottomRuleEl=this.el.find("hr")},e.prototype.renderSlats=function(){var t=this.view.calendar.theme;this.slatContainerEl=this.el.find("> .fc-slats").html(''+this.renderSlatRowHtml()+"
"),this.slatEls=this.slatContainerEl.find("tr"),this.slatCoordCache=new d.default({els:this.slatEls,isVertical:!0})},e.prototype.renderSlatRowHtml=function(){for(var t,e,n,i=this.view,r=i.calendar,a=r.theme,l=this.isRTL,c=this.dateProfile,u="",d=s.duration(+c.minTime),h=s.duration(0);d"+(e?""+o.htmlEscape(t.format(this.labelFormat))+"":"")+"",u+='"+(l?"":n)+''+(l?n:"")+"",d.add(this.slotDuration),h.add(this.slotDuration);return u},e.prototype.renderColumns=function(){var t=this.dateProfile,e=this.view.calendar.theme;this.dayRanges=this.dayDates.map(function(e){return new h.default(e.clone().add(t.minTime),e.clone().add(t.maxTime))}),this.headContainerEl&&this.headContainerEl.html(this.renderHeadHtml()),this.el.find("> .fc-bg").html(''+this.renderBgTrHtml(0)+"
"),this.colEls=this.el.find(".fc-day, .fc-disabled-day"),this.colCoordCache=new d.default({els:this.colEls,isHorizontal:!0}),this.renderContentSkeleton()},e.prototype.unrenderColumns=function(){this.unrenderContentSkeleton()},e.prototype.renderContentSkeleton=function(){var t,e,n="";for(t=0;t
';e=this.contentSkeletonEl=r('
'+n+"
"),this.colContainerEls=e.find(".fc-content-col"),this.helperContainerEls=e.find(".fc-helper-container"),this.fgContainerEls=e.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=e.find(".fc-bgevent-container"),this.highlightContainerEls=e.find(".fc-highlight-container"),this.businessContainerEls=e.find(".fc-business-container"),this.bookendCells(e.find("tr")),this.el.append(e)},e.prototype.unrenderContentSkeleton=function(){this.contentSkeletonEl&&(this.contentSkeletonEl.remove(),this.contentSkeletonEl=null,this.colContainerEls=null,this.helperContainerEls=null,this.fgContainerEls=null,this.bgContainerEls=null,this.highlightContainerEls=null,this.businessContainerEls=null)},e.prototype.groupSegsByCol=function(t){var e,n=[];for(e=0;e
').css("top",i).appendTo(this.colContainerEls.eq(n[e].col))[0]);n.length>0&&s.push(r('
').css("top",i).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=r(s)}},e.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},e.prototype.updateSize=function(e,n,i){t.prototype.updateSize.call(this,e,n,i),this.slatCoordCache.build(),i&&this.updateSegVerticals([].concat(this.eventRenderer.getSegs(),this.businessSegs||[]))},e.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.outerHeight()},e.prototype.computeDateTop=function(t,e){return this.computeTimeTop(s.duration(t-e.clone().stripTime()))},e.prototype.computeTimeTop=function(t){var e,n,i=this.slatEls.length,r=this.dateProfile,s=(t-r.minTime)/this.slotDuration;return s=Math.max(0,s),s=Math.min(i,s),e=Math.floor(s),e=Math.min(e,i-1),n=s-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},e.prototype.updateSegVerticals=function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},e.prototype.computeSegVerticals=function(t){var e,n,i,r=this.opt("agendaEventMinHeight");for(e=0;e
'+s.htmlEscape(this.opt("noEventsMessage"))+"
")},e.prototype.renderSegList=function(t){var e,n,i,s=this.groupSegsByDay(t),o=r('
'),a=o.find("tbody");for(e=0;e'+(e?this.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},s.htmlEscape(t.format(e))):"")+(n?this.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},s.htmlEscape(t.format(n))):"")+""},e}(a.default);e.default=d,d.prototype.eventRendererClass=c.default,d.prototype.eventPointingClass=u.default},,,,,,function(t,e,n){var i=n(3),r=n(16),s=n(4),o=n(220);n(10),n(47),n(256),n(257),n(260),n(261),n(262),n(263),i.fullCalendar=r,i.fn.fullCalendar=function(t){var e=Array.prototype.slice.call(arguments,1),n=this;return this.each(function(r,a){var l,c=i(a),u=c.data("fullCalendar");"string"==typeof t?"getCalendar"===t?r||(n=u):"destroy"===t?u&&(u.destroy(),c.removeData("fullCalendar")):u?i.isFunction(u[t])?(l=u[t].apply(u,e),r||(n=l),"destroy"===t&&c.removeData("fullCalendar")):s.warn("'"+t+"' is an unknown FullCalendar method."):s.warn("Attempting to call a FullCalendar method on an element with no calendar."):u||(u=new o.default(c,t),c.data("fullCalendar",u),u.render())}),n},t.exports=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(48),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.setElement=function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton(),this.set("isInDom",!0)},e.prototype.removeElement=function(){this.unset("isInDom"),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},e.prototype.bindGlobalHandlers=function(){},e.prototype.unbindGlobalHandlers=function(){},e.prototype.renderSkeleton=function(){},e.prototype.unrenderSkeleton=function(){},e}(r.default);e.default=s},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){this.items=t||[]}return t.prototype.proxyCall=function(t){for(var e=[],n=1;n"),e.append(this.renderSection("left")).append(this.renderSection("right")).append(this.renderSection("center")).append('
')):this.removeElement()},t.prototype.removeElement=function(){this.el&&(this.el.remove(),this.el=null)},t.prototype.renderSection=function(t){var e=this,n=this.calendar,s=n.theme,o=n.optionsManager,a=n.viewSpecManager,l=i('
'),c=this.toolbarOptions.layout[t],u=o.get("customButtons")||{},d=o.overrides.buttonText||{},h=o.get("buttonText")||{};return c&&i.each(c.split(" "),function(t,o){var c,p=i(),f=!0;i.each(o.split(","),function(t,o){var l,c,v,g,m,y,w,b,C;"title"===o?(p=p.add(i("

 

")),f=!1):((l=u[o])?(v=function(t){l.click&&l.click.call(b[0],t)},(g=s.getCustomButtonIconClass(l))||(g=s.getIconClass(o))||(m=l.text)):(c=a.getViewSpec(o))?(e.viewsWithButtons.push(o),v=function(){n.changeView(o)},(m=c.buttonTextOverride)||(g=s.getIconClass(o))||(m=c.buttonTextDefault)):n[o]&&(v=function(){n[o]()},(m=d[o])||(g=s.getIconClass(o))||(m=h[o])),v&&(w=["fc-"+o+"-button",s.getClass("button"),s.getClass("stateDefault")],m?(y=r.htmlEscape(m),C=""):g&&(y="",C=' aria-label="'+o+'"'),b=i('").click(function(t){b.hasClass(s.getClass("stateDisabled"))||(v(t),(b.hasClass(s.getClass("stateActive"))||b.hasClass(s.getClass("stateDisabled")))&&b.removeClass(s.getClass("stateHover")))}).mousedown(function(){b.not("."+s.getClass("stateActive")).not("."+s.getClass("stateDisabled")).addClass(s.getClass("stateDown"))}).mouseup(function(){b.removeClass(s.getClass("stateDown"))}).hover(function(){b.not("."+s.getClass("stateActive")).not("."+s.getClass("stateDisabled")).addClass(s.getClass("stateHover"))},function(){b.removeClass(s.getClass("stateHover")).removeClass(s.getClass("stateDown"))}),p=p.add(b)))}),f&&p.first().addClass(s.getClass("cornerLeft")).end().last().addClass(s.getClass("cornerRight")).end(),p.length>1?(c=i("
"),f&&c.addClass(s.getClass("buttonGroup")),c.append(p),l.append(c)):l.append(p)}),l},t.prototype.updateTitle=function(t){this.el&&this.el.find("h2").text(t)},t.prototype.activateButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").addClass(this.calendar.theme.getClass("stateActive"))},t.prototype.deactivateButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").removeClass(this.calendar.theme.getClass("stateActive"))},t.prototype.disableButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").prop("disabled",!0).addClass(this.calendar.theme.getClass("stateDisabled"))},t.prototype.enableButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(this.calendar.theme.getClass("stateDisabled"))},t.prototype.getViewsWithButtons=function(){return this.viewsWithButtons},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(4),o=n(32),a=n(31),l=n(48),c=function(t){function e(e,n){var i=t.call(this)||this;return i._calendar=e,i.overrides=r.extend({},n),i.dynamicOverrides={},i.compute(),i}return i.__extends(e,t),e.prototype.add=function(t){var e,n=0;this.recordOverrides(t);for(e in t)n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void this._calendar.updateViewSize(!0);if("defaultDate"===e)return;if("businessHours"===e)return;if(/^(event|select)(Overlap|Constraint|Allow)$/.test(e))return;if("timezone"===e)return void this._calendar.view.flash("initialEvents")}this._calendar.renderHeader(),this._calendar.renderFooter(),this._calendar.viewsByType={},this._calendar.reinitView()},e.prototype.compute=function(){var t,e,n,i,r;t=s.firstDefined(this.dynamicOverrides.locale,this.overrides.locale),e=a.localeOptionHash[t],e||(t=o.globalDefaults.locale,e=a.localeOptionHash[t]||{}),n=s.firstDefined(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,o.globalDefaults.isRTL),i=n?o.rtlDefaults:{},this.dirDefaults=i,this.localeDefaults=e,r=o.mergeOptions([o.globalDefaults,i,e,this.overrides,this.dynamicOverrides]),a.populateInstanceComputableOptions(r),this.reset(r)},e.prototype.recordOverrides=function(t){var e;for(e in t)this.dynamicOverrides[e]=t[e];this._calendar.viewSpecManager.clearCache(),this.compute()},e}(l.default);e.default=c},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(0),r=n(3),s=n(22),o=n(4),a=n(32),l=n(31),c=function(){function t(t,e){this.optionsManager=t,this._calendar=e,this.clearCache()}return t.prototype.clearCache=function(){this.viewSpecCache={}},t.prototype.getViewSpec=function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},t.prototype.getUnitViewSpec=function(t){var e,n,i;if(-1!==r.inArray(t,o.unitsDesc))for(e=this._calendar.header.getViewsWithButtons(),r.each(s.viewHash,function(t){e.push(t)}),n=0;n
'+(n?'
'+l.htmlEscape(n)+"
":"")+(u.title?'
'+l.htmlEscape(u.title)+"
":"")+'
'+(p?'
':"")+""},e.prototype.updateFgSegCoords=function(t){this.timeGrid.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.timeGrid.assignSegVerticals(t),this.assignFgSegHorizontals(t)},e.prototype.computeFgSegHorizontals=function(t){var e,n,o;if(this.sortEventSegs(t),e=i(t),r(e),n=e[0]){for(o=0;o').addClass(e.className||"").css({top:0,left:0}).append(e.content).appendTo(e.parentEl),this.el.on("click",".fc-close",function(){t.hide()}),e.autoHide&&this.listenTo(i(document),"mousedown",this.documentMousedown)},t.prototype.documentMousedown=function(t){this.el&&!i(t.target).closest(this.el).length&&this.hide()},t.prototype.removeElement=function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(i(document),"mousedown")},t.prototype.position=function(){var t,e,n,s,o,a=this.options,l=this.el.offsetParent().offset(),c=this.el.outerWidth(),u=this.el.outerHeight(),d=i(window),h=r.getScrollParent(this.el);s=a.top||0,o=void 0!==a.left?a.left:void 0!==a.right?a.right-c:0,h.is(window)||h.is(document)?(h=d,t=0,e=0):(n=h.offset(),t=n.top,e=n.left),t+=d.scrollTop(),e+=d.scrollLeft(),!1!==a.viewportConstrain&&(s=Math.min(s,t+h.outerHeight()-u-this.margin),s=Math.max(s,t+this.margin),o=Math.min(o,e+h.outerWidth()-c-this.margin),o=Math.max(o,e+this.margin)),this.el.css({top:s-l.top,left:o-l.left})},t.prototype.trigger=function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},t}();e.default=o,s.default.mixInto(o)},function(t,e,n){function i(t,e){var n,i;for(n=0;n=t.leftCol)return!0;return!1}function r(t,e){return t.leftCol-e.leftCol}Object.defineProperty(e,"__esModule",{value:!0});var s=n(2),o=n(3),a=n(4),l=n(42),c=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.dayGrid=e,i}return s.__extends(e,t),e.prototype.renderBgRanges=function(e){e=o.grep(e,function(t){return t.eventDef.isAllDay()}),t.prototype.renderBgRanges.call(this,e)},e.prototype.renderFgSegs=function(t){var e=this.rowStructs=this.renderSegRows(t);this.dayGrid.rowEls.each(function(t,n){o(n).find(".fc-content-skeleton > table").append(e[t].tbodyEl)})},e.prototype.unrenderFgSegs=function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},e.prototype.renderSegRows=function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n"),a.append(u)),g[i][s]=u,m[i][s]=u,s++}var i,r,s,a,l,c,u,d=this.dayGrid.colCnt,h=this.buildSegLevels(e),p=Math.max(1,h.length),f=o(""),v=[],g=[],m=[];for(i=0;i"),v.push([]),g.push([]),m.push([]),r)for(l=0;l').append(c.el),c.leftCol!==c.rightCol?u.attr("colspan",c.rightCol-c.leftCol+1):m[i][s]=u;s<=c.rightCol;)g[i][s]=u,v[i][s]=c,s++;a.append(u)}n(d),this.dayGrid.bookendCells(a),f.append(a)}return{row:t,tbodyEl:f,cellMatrix:g,segMatrix:v,segLevels:h,segs:e}},e.prototype.buildSegLevels=function(t){var e,n,s,o=[];for(this.sortEventSegs(t),e=0;e'+a.htmlEscape(n)+""),i=''+(a.htmlEscape(s.title||"")||" ")+"",'
'+(this.dayGrid.isRTL?i+" "+p:p+" "+i)+"
"+(c?'
':"")+(u?'
':"")+""},e}(l.default);e.default=c},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(58),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderSegs=function(t,e){var n,i=[];return n=this.eventRenderer.renderSegRows(t),this.component.rowEls.each(function(t,s){var o,a,l=r(s),c=r('
');e&&e.row===t?a=e.el.position().top:(o=l.find(".fc-content-skeleton tbody"),o.length||(o=l.find(".fc-content-skeleton table")),a=o.position().top),c.css("top",a).find("table").append(n[t].tbodyEl),l.append(c),i.push(c[0])}),r(i)},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(57),o=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.fillSegTag="td",e}return i.__extends(e,t),e.prototype.attachSegEls=function(t,e){var n,i,r,s=[];for(n=0;n
'),s=i.find("tr"),a>0&&s.append(''),s.append(e.el.attr("colspan",l-a)),l'),this.component.bookendCells(s),i},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(228),s=n(5),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildRenderRange=function(e,n,i){var r,o=t.prototype.buildRenderRange.call(this,e,n,i),a=this.msToUtcMoment(o.startMs,i),l=this.msToUtcMoment(o.endMs,i);return this.opt("fixedWeekCount")&&(r=Math.ceil(l.diff(a,"weeks",!0)),l.add(6-r,"weeks")),new s.default(a,l)},e}(r.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),s=n(42),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderFgSegs=function(t){t.length?this.component.renderSegList(t):this.component.renderEmptyMessage()},e.prototype.fgSegHtml=function(t){var e,n=this.view,i=n.calendar,s=i.theme,o=t.footprint,a=o.eventDef,l=o.componentFootprint,c=a.url,u=["fc-list-item"].concat(this.getClasses(a)),d=this.getBgColor(a);return e=l.isAllDay?n.getAllDayHtml():n.isMultiDayRange(l.unzonedRange)?t.isStart||t.isEnd?r.htmlEscape(this._getTimeText(i.msToMoment(t.startMs),i.msToMoment(t.endMs),l.isAllDay)):n.getAllDayHtml():r.htmlEscape(this.getTimeText(o)),c&&u.push("fc-has-url"),''+(this.displayEventTime?''+(e||"")+"":"")+'"+r.htmlEscape(a.title||"")+""},e.prototype.computeEventTimeFormat=function(){return this.opt("mediumTimeFormat")},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),s=n(59),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.handleClick=function(e,n){var i;t.prototype.handleClick.call(this,e,n),r(n.target).closest("a[href]").length||(i=e.footprint.eventDef.url)&&!n.isDefaultPrevented()&&(window.location.href=i)},e}(s.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(38),r=n(52),s=n(215),o=n(216);i.default.registerClass(r.default),i.default.registerClass(s.default),i.default.registerClass(o.default)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(51),r=n(213),s=n(214),o=n(258),a=n(259);i.defineThemeSystem("standard",r.default),i.defineThemeSystem("jquery-ui",s.default),i.defineThemeSystem("bootstrap3",o.default),i.defineThemeSystem("bootstrap4",a.default)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=s,s.prototype.classes={widget:"fc-bootstrap3",tableGrid:"table-bordered",tableList:"table",tableListHeading:"active",buttonGroup:"btn-group",button:"btn btn-default",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"panel panel-default",popoverHeader:"panel-heading",popoverContent:"panel-body",headerRow:"panel-default",dayRow:"panel-default",listView:"panel panel-default"},s.prototype.baseIconClass="glyphicon",s.prototype.iconClasses={close:"glyphicon-remove",prev:"glyphicon-chevron-left",next:"glyphicon-chevron-right",prevYear:"glyphicon-backward",nextYear:"glyphicon-forward"},s.prototype.iconOverrideOption="bootstrapGlyphicons",s.prototype.iconOverrideCustomButtonOption="bootstrapGlyphicon",s.prototype.iconOverridePrefix="glyphicon-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=s,s.prototype.classes={widget:"fc-bootstrap4",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},s.prototype.baseIconClass="fa",s.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},s.prototype.iconOverrideOption="bootstrapFontAwesome",s.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",s.prototype.iconOverridePrefix="fa-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(62),s=n(229);i.defineView("basic",{class:r.default}),i.defineView("basicDay",{type:"basic",duration:{days:1}}),i.defineView("basicWeek",{type:"basic",duration:{weeks:1}}),i.defineView("month",{class:s.default,duration:{months:1},defaults:{fixedWeekCount:!0}})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(226);i.defineView("agenda",{class:r.default,defaults:{allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0}}),i.defineView("agendaDay",{type:"agenda",duration:{days:1}}),i.defineView("agendaWeek",{type:"agenda",duration:{weeks:1}})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(230);i.defineView("list",{class:r.default,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}}),i.defineView("listDay",{type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}}),i.defineView("listWeek",{type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}}),i.defineView("listMonth",{type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}}),i.defineView("listYear",{type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0})}])})},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("full-calendar-reserve",{attrs:{"show-modal":t.showModalReserve,startDate:t.startDate,endDate:t.endDate,"resources-checkboxes":t.resourcesCheckboxes,"number-of-resources":t.selectedResources.length,"add-reservation":t.addReservation},on:{close:function(e){t.showModalReserve=!1}}}),t._v(" "),n("full-calendar-info",{attrs:{"show-modal":t.showModalInfo,reservation:t.reservation,cancel:t.cancelReservation,update:t.updateReservation,refreshTasks:t.refreshTasks,nodes:t.nodes},on:{close:function(e){t.showModalInfo=!1},handleError:t.handleError}})],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(302)}var r=n(195),s=n(306),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-73dcc08a",null);e.a=l.exports},function(t,e){},,,,function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"range-select-container"},[n("v-menu",{attrs:{"close-on-content-click":!1,"nudge-right":40,lazy:"",transition:"scale-transition","offset-y":"","full-width":"","min-width":"290px"},model:{value:t.menu,callback:function(e){t.menu=e},expression:"menu"}},[n("v-text-field",{staticClass:"date-input",attrs:{slot:"activator",label:"Schedule start date","prepend-icon":"event",readonly:""},slot:"activator",model:{value:t.picker,callback:function(e){t.picker=e},expression:"picker"}}),t._v(" "),n("v-date-picker",{on:{input:function(e){t.menu=!1,t.changeSchedule()}},model:{value:t.picker,callback:function(e){t.picker=e},expression:"picker"}})],1),t._v(" "),n("v-text-field",{staticClass:"range-input",attrs:{min:"1",step:"1",type:"number",label:"Schedule range in days"},on:{input:function(e){return t.changeSchedule()}},model:{value:t.range,callback:function(e){t.range=e},expression:"range"}})],1),t._v(" "),n("div",{staticClass:"container"},[n("div",{staticClass:"container-header"},[n("div",{staticClass:"left-table-header"},[t._m(0),t._v(" "),n("table",[n("tbody",[n("tr",[n("td",{staticClass:"first-column"},[n("v-checkbox",{staticClass:"small-checkbox",attrs:{color:"success",label:"Change all"},on:{change:t.changeAll},model:{value:t.changeAllCheckbox,callback:function(e){t.changeAllCheckbox=e},expression:"changeAllCheckbox"}})],1)])])])]),t._v(" "),n("div",{staticClass:"right-table-header",attrs:{id:"right-header"}},[n("table",[n("tbody",t._l(t.tableContent.header,function(e){return n("th",{key:e.value},[t._v(t._s(e.value))])}),0)]),t._v(" "),n("table",[n("tbody",[n("tr",t._l(t.tableContent.hours,function(e){return n("td",{key:e.id,staticClass:"hours"},[t._v(t._s(e.value))])}),0)])])])]),t._v(" "),n("div",{staticClass:"container-content"},[n("div",{staticClass:"left-table",attrs:{id:"left-table"}},[n("div",{key:t.leftTableKey},t._l(t.tableContent.nodes,function(e){return n("table",{key:e.nodeName},[n("tbody",[n("tr",[n("td",{staticClass:"first-column"},[n("div",{staticClass:"node-cell"},[n("v-checkbox",{staticClass:"small-checkbox-node",attrs:{color:"success",label:""+e.nodeName,"input-value":""},on:{change:function(n){return t.changeWholeNode(e.nodeName)}},model:{value:e.selected,callback:function(n){t.$set(e,"selected",n)},expression:"node.selected"}}),t._v(" "),n("v-btn",{staticClass:"mx-2 small-button",attrs:{fab:"",dark:"",color:"info"},on:{click:function(n){return t.toggle(e)}}},[e.hidden?n("v-icon",{attrs:{dark:""}},[t._v("add")]):t._e(),t._v(" "),e.hidden?t._e():n("v-icon",{attrs:{dark:""}},[t._v("remove")])],1)],1)])])]),t._v(" "),n("tbody",{directives:[{name:"show",rawName:"v-show",value:!e.hidden,expression:"!node.hidden"}]},t._l(e.resources,function(i){return n("tr",{key:i},[n("td",{staticClass:"first-column"},[n("v-checkbox",{staticClass:"small-checkbox",attrs:{color:"success",label:""+t.tableContent.resources[i].name},on:{change:function(n){return t.changeResource(e.nodeName,i)}},model:{value:t.tableContent.resources[i].selected,callback:function(e){t.$set(t.tableContent.resources[i],"selected",e)},expression:"tableContent.resources[resourceUUID].selected"}})],1)])}),0)])}),0)]),t._v(" "),n("div",{staticClass:"right-table",attrs:{id:"right-table"}},[n("div",{key:t.rightTableKey},t._l(t.tableContent.nodes,function(e){return n("table",{key:e.nodeName},[n("tbody",[n("tr",t._l(e.slots,function(e){return n("td",{key:e.id},[t._v(t._s(e.value))])}),0)]),t._v(" "),n("tbody",{directives:[{name:"show",rawName:"v-show",value:!e.hidden,expression:"!node.hidden"}]},t._l(e.resources,function(e){return n("tr",{key:e},t._l(t.tableContent.resources[e].slots,function(e){return n("td",{key:e.id,class:{reserved:e.reserved,userReservation:e.userReservation}},[t._v(t._s(e.value))])}),0)}),0)])}),0)])])])])},r=[function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("table",[n("tbody",[n("th",{staticClass:"first-column"},[t._v("Resources")])])])}],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("v-snackbar",{attrs:{color:"error",bottom:"","multi-line":""},model:{value:t.snackbar,callback:function(e){t.snackbar=e},expression:"snackbar"}},[t._v("\n "+t._s(t.errorMessage)+"\n "),n("v-btn",{attrs:{color:"white",flat:""},on:{click:function(e){t.snackbar=!1}}},[t._v("\n Close\n ")])],1),t._v(" "),t.showSchedule?t._e():n("v-btn",{attrs:{color:"info",small:"",round:""},on:{click:function(e){t.showSchedule=!0}}},[t._v("\n Select visible GPUs\n ")]),t._v(" "),n("section",{directives:[{name:"show",rawName:"v-show",value:t.showSchedule,expression:"showSchedule"}],attrs:{id:"schedule_section"}},[n("v-btn",{attrs:{color:"info",small:"",round:""},on:{click:function(e){t.showSchedule=!1}}},[t._v("\n Hide schedule\n ")]),t._v(" "),n("MySchedule",{attrs:{"parsed-nodes":t.parsedNodes},on:{handleError:function(e){return t.handleError.apply(void 0,arguments)},loadResources:function(e){return t.loadResources.apply(void 0,arguments)}}})],1),t._v(" "),n("section",{attrs:{id:"calendar_section"}},[n("FullCalendar",{attrs:{"update-calendar":t.updateCalendar,"selected-resources":t.selectedResources,nodes:t.nodes},on:{handleError:function(e){return t.handleError.apply(void 0,arguments)}}})],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=n(197),r=n(320),s=n(1),o=s(i.a,r.a,!1,null,null,null);e.a=o.exports},function(t,e,n){"use strict";function i(t){n(310)}var r=n(198),s=n(319),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(312)}var r=n(199),s=n(318),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=n(200),r=n(1),s=r(i.a,null,!1,null,null,null);e.a=s.exports},,,,,function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"select_line"},[n("v-select",{staticClass:"select_item",attrs:{items:t.nodes},model:{value:t.selectedNode,callback:function(e){t.selectedNode=e},expression:"selectedNode"}}),t._v(" "),n("div",{staticClass:"select_space"}),t._v(" "),n("v-select",{staticClass:"select_item",attrs:{items:t.resourceTypes},model:{value:t.selectedResourceType,callback:function(e){t.selectedResourceType=e},expression:"selectedResourceType"}}),t._v(" "),n("div",{staticClass:"select_space"}),t._v(" "),n("v-select",{staticClass:"select_item",attrs:{items:t.metrics},model:{value:t.selectedMetric,callback:function(e){t.selectedMetric=e},expression:"selectedMetric"}}),t._v(" "),n("v-btn",{attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)],1),t._v(" "),n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.alert,callback:function(e){t.alert=e},expression:"alert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),!0===t.showProcesses?n("div",{staticClass:"table_box"},[n("v-data-table",{staticClass:"elevation-1",attrs:{headers:t.headers,items:t.processes,"item-key":"pid","hide-actions":""},scopedSlots:t._u([{key:"items",fn:function(e){return[n("tr",{on:{click:function(t){e.expanded=!e.expanded}}},[n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.index))]),t._v(" "),n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.owner))]),t._v(" "),n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.pid))]),t._v(" "),n("td",{staticClass:"text-xs-right"},[t._v(t._s(e.item.command))])])]}},{key:"expand",fn:function(e){return[n("v-card",{attrs:{flat:""}},[n("v-card-text",[t._v("GPU UUID: "+t._s(e.item.uuid))])],1)]}}],null,!1,51043860)})],1):n("div",[n("LineChart",{staticClass:"chart_box",attrs:{"chart-data":t.metricData,options:t.metricOptions,"rerender-chart":t.rerenderChart,"update-chart":t.updateChart}})],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.alert,callback:function(e){t.alert=e},expression:"alert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),n("div",{staticClass:"watch_table"},[t._l(t.watches,function(e){return n("WatchBox",{key:e.id,staticClass:"watch_box",attrs:{"default-node":e.defaultNode,"default-resource-type":e.defaultResourceType,"default-metric":e.defaultMetric,"resources-indexes":t.resourcesIndexes,"chart-datasets":t.chartDatasets,"update-chart":t.updateChart,time:t.time},on:{changeDefaultNode:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeDefaultNode.apply(void 0,[e.id].concat(r))},changeDefaultResourceType:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeDefaultResourceType.apply(void 0,[e.id].concat(r))},changeDefaultMetric:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeDefaultMetric.apply(void 0,[e.id].concat(r))},deleteWatch:function(n){return t.deleteWatch(e.id)}}})}),t._v(" "),n("div",{staticClass:"button_box"},[n("v-btn",{staticClass:"big_button",attrs:{fab:"",dark:"",color:"#b8bcc2"},on:{click:t.addWatch}},[n("v-icon",{attrs:{size:"100px",dark:""}},[t._v("add")])],1)],1)],2)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("WatchGenerator")],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(322)}var r=n(201),s=n(356),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(324)}var r=n(202),s=n(343),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-c5e32eee",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(326)}var r=n(203),s=n(342),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-68056994",null);e.a=l.exports},function(t,e){},,,,function(t,e,n){"use strict";function i(t){n(331)}var r=n(204),s=n(332),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"task-input",attrs:{label:t.newParameter,small:""},model:{value:t.newValue,callback:function(e){t.newValue=e},expression:"newValue"}}),t._v(" "),n("v-btn",{staticClass:"remove-button",attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(334)}var r=n(205),s=n(335),o=n(1),a=i,l=o(r.a,s.a,!1,a,null,null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"task-input",attrs:{label:t.newEnvVariable,small:""},model:{value:t.newValue,callback:function(e){t.newValue=e},expression:"newValue"}}),t._v(" "),n("v-btn",{staticClass:"remove-button",attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(337)}var r=n(206),s=n(341),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-ed523d5c",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";function i(t){n(339)}var r=n(207),s=n(340),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-1f240f3d",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("TF_CONFIG editor")])],1),t._v(" "),n("v-card-text",[n("v-textarea",{attrs:{solo:"","auto-grow":"",label:"Enter TF_CONFIG JSON here"},model:{value:t.newValue,callback:function(e){t.newValue=e},expression:"newValue"}})],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-tooltip",{attrs:{disabled:t.properJson,top:"",color:"red"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("div",t._g({},i),[n("v-btn",{attrs:{color:"success",disabled:!t.properJson},on:{click:function(e){return t.save()}}},[t._v("\n Save\n ")])],1)]}}])},[t._v(" "),n("span",[t._v("TF_CONFIG needs to be proper JSON object")])])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("TfConfigEdit",{attrs:{value:t.newValue,"show-modal":t.showModalTfConfigEdit},on:{close:function(e){t.showModalTfConfigEdit=!1},updateValue:function(e){return t.updateValue.apply(void 0,arguments)}}}),t._v(" "),t.enableSmartTfConfig?n("v-layout",[n("v-text-field",{staticClass:"tf-short",attrs:{label:"Port",small:""},model:{value:t.newPort,callback:function(e){t.newPort=e},expression:"newPort"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-combobox",{staticClass:"tf-wide",attrs:{label:"Task type",items:t.taskTypeItems},model:{value:t.newTaskType,callback:function(e){t.newTaskType=e},expression:"newTaskType"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),t.newTaskIndex>=0?n("v-text-field",{staticClass:"tf-short",attrs:{label:"Index",type:"number",small:""},model:{value:t.newTaskIndex,callback:function(e){t.newTaskIndex=e},expression:"newTaskIndex"}}):t._e()],1):n("v-btn",{staticClass:"task-input",attrs:{color:"info",round:"",medium:""},on:{click:function(e){t.showModalTfConfigEdit=!0}}},[t._v("\n TF_CONFIG\n ")]),t._v(" "),n("v-tooltip",{attrs:{bottom:"",color:"red"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-btn",t._g({staticClass:"remove-button remove-button-tf",attrs:{color:"indigo",fab:"",dark:"",small:"",outline:""},on:{click:function(e){return t.removeMe()}}},i),[n("v-icon",{attrs:{dark:""}},[t._v("delete")])],1)]}}])},[t._v(" "),n("span",[t._v("Delete TF_CONFIG")])])],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("v-layout",{attrs:{"align-center":"","justify-center":""}},[n("div",{staticClass:"task-preview"},[t._v("\n "+t._s(t.taskPreview)+"\n ")])]),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-select",{staticClass:"task-select",attrs:{items:t.hostnames,label:"Hostname",small:""},model:{value:t.newHost,callback:function(e){t.newHost=e},expression:"newHost"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-select",{staticClass:"task-select",attrs:{items:t.hostResources,label:"Resource",small:""},model:{value:t.newResource,callback:function(e){t.newResource=e},expression:"newResource"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[t.newEnableTfConfig?n("TaskLineTfConfig",{attrs:{value:t.tfConfig,port:t.tfConfigPort,"task-type":t.tfConfigTaskType,"task-index":t.tfConfigTaskIndex,"tf-cluster":t.tfCluster,"enable-smart-tf-config":t.enableSmartTfConfig},on:{changeTfConfig:function(e){return t.changeTfConfig.apply(void 0,arguments)},deleteTfConfig:function(e){return t.deleteTfConfig()},updateTfConfigPort:function(e){return t.updateTfConfigPort.apply(void 0,arguments)},updateTfConfigTaskType:function(e){return t.updateTfConfigTaskType.apply(void 0,arguments)},updateTfConfigTaskIndex:function(e){return t.updateTfConfigTaskIndex.apply(void 0,arguments)}}}):t._e()],1),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},t._l(t.envVariables,function(e){return n("TaskLineEnvVariable",{key:e.id,staticClass:"task-input",attrs:{envVariable:e.envVariable,value:e.value},on:{changeEnvVariable:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeEnvVariable.apply(void 0,[e.id].concat(r))},deleteEnvVariable:function(n){return t.deleteEnvVariable(e.id)}}})}),1),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-text-field",{staticClass:"task-input",attrs:{label:"Command",small:""},model:{value:t.newCommand,callback:function(e){t.newCommand=e},expression:"newCommand"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},t._l(t.parameters,function(e){return n("TaskLineParameter",{key:e.id,staticClass:"task-input",attrs:{parameter:e.parameter,value:e.value},on:{changeParameter:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeParameter.apply(void 0,[e.id].concat(r))},deleteParameter:function(n){return t.deleteParameter(e.id)}}})}),1),t._v(" "),n("v-btn",{attrs:{color:"error",small:""},on:{click:function(e){return t.removeMe()}}},[t._v("\n Remove task\n ")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Create tasks")]),t._v(" "),n("v-tooltip",{attrs:{right:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({},i),[t._v("\n info\n ")])]}}])},[t._v(" "),n("span",[t._v("CPU tasks can be run without making reservation.\n "),n("br"),t._v("When you want to create a GPU task, you must\n "),n("br"),t._v("first ensure that you are eligible to do so\n "),n("br"),t._v("(having active reservation for that GPU).\n ")])]),t._v(" "),"tf2"===t.chosenTemplate?n("v-switch",{staticClass:"float-right-button",attrs:{label:"Smart TF_CONFIG"},model:{value:t.enableSmartTfConfig,callback:function(e){t.enableSmartTfConfig=e},expression:"enableSmartTfConfig"}}):t._e()],1),t._v(" "),n("v-card-text",t._l(t.lines,function(e){return n("TaskLine",{key:e.id,attrs:{hostnames:t.hostnames,hosts:t.hosts,host:e.host,resource:e.resource,envVariables:e.envVariables,staticEnvVariables:t.staticEnvVariables,command:e.command,parameters:e.parameters,staticParameters:t.staticParameters,"enable-tf-config":e.enableTfConfig,"tf-config":e.tfConfig,"tf-config-port":e.tfConfigPort,"tf-config-task-type":e.tfConfigTaskType,"tf-config-task-index":e.tfConfigTaskIndex,"tf-cluster":t.tfCluster,"enable-smart-tf-config":t.enableSmartTfConfig},on:{changeLine:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.changeLine.apply(void 0,[e.id].concat(r))},deleteLine:function(n){return t.deleteLine(e.id)},staticParameterChanged:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticParameterChanged.apply(void 0,[e.id].concat(r))},psWorkerParameterChanged:function(e){return t.updatePsWorkerHosts(-1,"")},staticEnvVariableChanged:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticEnvVariableChanged.apply(void 0,[e.id].concat(r))},staticParameterDeleted:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticParameterDeleted.apply(void 0,[e.id].concat(r))},staticEnvVariableDeleted:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.staticEnvVariableDeleted.apply(void 0,[e.id].concat(r))},updateTfConfigPort:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.updateTfConfigPort.apply(void 0,[e.id].concat(r))},updateTfConfigTaskType:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.updateTfConfigTaskType.apply(void 0,[e.id].concat(r))},updateTfConfigTaskIndex:function(n){for(var i=arguments.length,r=Array(i);i--;)r[i]=arguments[i];return t.updateTfConfigTaskIndex.apply(void 0,[e.id].concat(r))}}})}),1),t._v(" "),n("v-card-text",[n("v-flex",{attrs:{xs12:""}},[n("v-btn",{attrs:{color:"info",block:"",small:""},on:{click:t.copyLine}},[t._v("\n Add task\n ")])],1),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"parameter-name-input",attrs:{label:"Parameter name",small:""},model:{value:t.newParameter,callback:function(e){t.newParameter=e},expression:"newParameter"}}),t._v(" "),n("v-btn",{attrs:{color:"info",round:""},on:{click:t.addEnvVariable}},[t._v("\n Add as ENV variable to all tasks\n ")]),t._v(" "),n("v-btn",{attrs:{color:"info",round:""},on:{click:t.addParameter}},[t._v("\n Add as parameter to all tasks\n ")]),t._v(" "),n("v-checkbox",{attrs:{label:"Static"},model:{value:t.isNewFieldStatic,callback:function(e){t.isNewFieldStatic=e},expression:"isNewFieldStatic"}})],1)],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:t.addTasks}},[t._v("\n Create all tasks\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(345)}var r=n(208),s=n(346),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-ab402584",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Edit task")])],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-text-field",{staticClass:"host-input",attrs:{label:"Hostname",small:""},model:{value:t.newHost,callback:function(e){t.newHost=e},expression:"newHost"}}),t._v(" "),n("span",{staticClass:"space"}),t._v(" "),n("v-text-field",{staticClass:"command-input",attrs:{label:"Command",small:""},model:{value:t.newCommand,callback:function(e){t.newCommand=e},expression:"newCommand"}})],1)],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:t.changeTask}},[t._v("\n Edit task\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(348)}var r=n(209),s=n(349),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-21a65550",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"40vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Schedule task")])],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-checkbox",{attrs:{label:"Set spawn time"},model:{value:t.spawn,callback:function(e){t.spawn=e},expression:"spawn"}}),t._v(" "),n("v-menu",{attrs:{"close-on-content-click":!1,"nudge-right":40,lazy:"",transition:"none","offset-y":"","full-width":"","min-width":"290px"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Spawn date","prepend-icon":"event"},model:{value:t.newSpawnDate,callback:function(e){t.newSpawnDate=e},expression:"newSpawnDate"}},i))]}}]),model:{value:t.spawnDateMenu,callback:function(e){t.spawnDateMenu=e},expression:"spawnDateMenu"}},[t._v(" "),n("v-date-picker",{on:{input:function(e){t.spawnDateMenu=!1}},model:{value:t.newSpawnDate,callback:function(e){t.newSpawnDate=e},expression:"newSpawnDate"}})],1),t._v(" "),n("v-menu",{ref:"spawnMenu",attrs:{"close-on-content-click":!1,"nudge-right":40,"return-value":t.newSpawnTime,lazy:"",transition:"none","offset-y":"","full-width":"","max-width":"290px","min-width":"290px"},on:{"update:returnValue":function(e){t.newSpawnTime=e},"update:return-value":function(e){t.newSpawnTime=e}},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Spawn time","prepend-icon":"access_time"},model:{value:t.newSpawnTime,callback:function(e){t.newSpawnTime=e},expression:"newSpawnTime"}},i))]}}]),model:{value:t.spawnTimeMenu,callback:function(e){t.spawnTimeMenu=e},expression:"spawnTimeMenu"}},[t._v(" "),t.spawnTimeMenu?n("v-time-picker",{attrs:{"full-width":"",format:"24hr"},on:{"click:minute":function(e){return t.$refs.spawnMenu.save(t.newSpawnTime)}},model:{value:t.newSpawnTime,callback:function(e){t.newSpawnTime=e},expression:"newSpawnTime"}}):t._e()],1)],1),t._v(" "),n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-checkbox",{attrs:{label:"Set terminate time"},model:{value:t.terminate,callback:function(e){t.terminate=e},expression:"terminate"}}),t._v(" "),n("v-menu",{attrs:{"close-on-content-click":!1,"nudge-right":40,lazy:"",transition:"none","offset-y":"","full-width":"","min-width":"290px"},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Terminate date","prepend-icon":"event"},model:{value:t.newTerminateDate,callback:function(e){t.newTerminateDate=e},expression:"newTerminateDate"}},i))]}}]),model:{value:t.terminateDateMenu,callback:function(e){t.terminateDateMenu=e},expression:"terminateDateMenu"}},[t._v(" "),n("v-date-picker",{on:{input:function(e){t.terminateDateMenu=!1}},model:{value:t.newTerminateDate,callback:function(e){t.newTerminateDate=e},expression:"newTerminateDate"}})],1),t._v(" "),n("v-menu",{ref:"terminateMenu",attrs:{"close-on-content-click":!1,"nudge-right":40,"return-value":t.newTerminateTime,lazy:"",transition:"none","offset-y":"","full-width":"","max-width":"290px","min-width":"290px"},on:{"update:returnValue":function(e){t.newTerminateTime=e},"update:return-value":function(e){t.newTerminateTime=e}},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-text-field",t._g({attrs:{label:"Terminate time","prepend-icon":"access_time"},model:{value:t.newTerminateTime,callback:function(e){t.newTerminateTime=e},expression:"newTerminateTime"}},i))]}}]),model:{value:t.terminateTimeMenu,callback:function(e){t.terminateTimeMenu=e},expression:"terminateTimeMenu"}},[t._v(" "),t.terminateTimeMenu?n("v-time-picker",{attrs:{"full-width":"",format:"24hr"},on:{"click:minute":function(e){return t.$refs.terminateMenu.save(t.newTerminateTime)}},model:{value:t.newTerminateTime,callback:function(e){t.newTerminateTime=e},expression:"newTerminateTime"}}):t._e()],1)],1)],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:t.checkActionFlag}},[t._v("\n Schedule task\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(351)}var r=n(210),s=n(352),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-4291c17c",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("\n Task log\n "),n("v-btn",{attrs:{flat:"",icon:"",color:"green"},on:{click:function(e){return t.refresh()}}},[n("v-icon",[t._v("refresh")])],1)],1),t._v(" "),n("span",{staticClass:"subheading"},[n("v-checkbox",{staticStyle:{display:"inline"},attrs:{flat:"",label:"Tail mode","hide-details":""},model:{value:t.tailMode,callback:function(e){t.tailMode=e},expression:"tailMode"}}),t._v(" "),n("v-checkbox",t._g({staticStyle:{display:"inline"},attrs:{flat:"",label:"Auto-refresh",disabled:!t.tailMode,"hide-details":""},model:{value:t.autoRefresh,callback:function(e){t.autoRefresh=e},expression:"autoRefresh"}},t.on))],1)],1),t._v(" "),n("v-card-text",[t._v("\n "+t._s(t.path)+"\n "),n("div",{staticClass:"log_box"},t._l(t.lines,function(e,i){return n("div",{key:i},[t._v("\n "+t._s(e)+"\n ")])}),0)])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(354)}var r=n(211),s=n(355),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-d8f593d8",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("v-dialog",{attrs:{width:"80vw"},model:{value:t.show,callback:function(e){t.show=e},expression:"show"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){return t.close()}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Choose framework template")])],1),t._v(" "),n("v-card-text",[n("v-select",{attrs:{items:t.possibleTemplates,label:"Choose template from list",solo:""},on:{change:t.setChosenTemplate}})],1),t._v(" "),n("v-card-text",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success"},on:{click:function(e){return t.goToCreate()}}},[t._v("\n Go to task creator\n ")])],1)],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("TaskCreate",{attrs:{"show-modal":t.showModalCreate,hostnames:t.hostnames,hosts:t.hosts,actionFlag:t.actionFlag,"chosen-template":t.chosenTemplate},on:{close:function(e){t.showModalCreate=!1},getTasks:t.getTasks}}),t._v(" "),n("TaskTemplateChooser",{attrs:{"show-modal":t.showModalChooseTemplate},on:{close:function(e){t.showModalChooseTemplate=!1},openFromTemplate:t.openFromTemplate}}),t._v(" "),n("TaskEdit",{attrs:{"show-modal":t.showModalEdit,taskId:t.taskId,hostname:t.newHostname,command:t.newCommand,actionFlag:t.actionFlag},on:{close:function(e){t.showModalEdit=!1},getTask:function(e){return t.getTask.apply(void 0,arguments)},changeActionFlag:function(e){return t.changeActionFlag.apply(void 0,arguments)},changeSnackbar:function(e){return t.changeSnackbar.apply(void 0,arguments)}}}),t._v(" "),n("TaskSchedule",{attrs:{"show-modal":t.showModalSchedule,taskId:t.taskId,spawnTime:t.newSpawnTime,terminateTime:t.newTerminateTime,actionFlag:t.actionFlag,multipleFlag:t.multipleFlag,selected:t.selected},on:{close:function(e){t.showModalSchedule=!1},updateTask:function(e){return t.updateTask.apply(void 0,arguments)},changeActionFlag:function(e){return t.changeActionFlag.apply(void 0,arguments)},changeSnackbar:function(e){return t.changeSnackbar.apply(void 0,arguments)},handleError:function(e){return t.handleError.apply(void 0,arguments)}}}),t._v(" "),n("TaskLog",{attrs:{"show-modal":t.showModalLog,lines:t.logs,path:t.path,taskId:t.taskId},on:{close:function(e){t.showModalLog=!1},getLog:function(e){return t.getLog.apply(void 0,arguments)}}}),t._v(" "),n("v-dialog",{attrs:{width:"500"},model:{value:t.showModalHowItWorks,callback:function(e){t.showModalHowItWorks=e},expression:"showModalHowItWorks"}},[n("v-card",[n("v-card-text",{staticClass:"headline grey lighten-2",attrs:{"primary-title":""}},[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModalHowItWorks=!1}}},[n("v-icon",[t._v("close")])],1),t._v("How it works\n ")],1),t._v(" "),n("v-card-text",[t._v("\n Your tasks are managed by `screen` program installed on each machine. You can attach\n to/close them as they are running. Screen sessions created by TensorHive have custom\n names so you won't be confused which is which.\n "),n("br"),t._v(" "),n("br"),t._v("When your task command stops executing, screen session will disappear from `screen -ls`\n but stdout+stderr produced by your process will be redirected to a log file.\n Logs are automatically gathered and stored on that machine under `~/TensorHiveLogs`.\n ")])],1)],1),t._v(" "),n("v-dialog",{attrs:{width:"400"},model:{value:t.showModalRemove,callback:function(e){t.showModalRemove=e},expression:"showModalRemove"}},[n("v-card",[n("v-card-text",{staticClass:"headline grey lighten-2",attrs:{"primary-title":""}},[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModalRemove=!1}}},[n("v-icon",[t._v("close")])],1),t._v("Do you want to remove this task?\n ")],1),t._v(" "),n("v-card-actions",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success",round:""},on:{click:function(e){return t.removeTask()}}},[t._v("Yes")])],1)],1)],1)],1),t._v(" "),n("div",{staticClass:"table-container"},[n("v-data-table",{key:t.tableKey,staticClass:"elevation-1",attrs:{headers:t.headers,items:t.tasks,pagination:t.pagination,loading:t.actionFlag,"select-all":"","item-key":"id","rows-per-page-items":t.rowsPerPageItems},on:{"update:pagination":function(e){t.pagination=e}},scopedSlots:t._u([{key:"headers",fn:function(e){return[n("tr",[n("th",[n("v-layout",{attrs:{"align-center":"","justify-start":""}},[n("v-checkbox",{attrs:{"input-value":e.all,indeterminate:e.indeterminate,primary:"","hide-details":""},on:{click:function(e){return e.stopPropagation(),t.toggleAll(e)}}}),t._v(" "),n("v-tooltip",{attrs:{right:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){t.showModalHowItWorks=!0}}},i),[t._v("info")])]}}],null,!0)},[t._v(" "),n("span",[t._v("How it works")])])],1)],1),t._v(" "),t._l(e.headers,function(e){return n("th",{key:e.text,class:["column sortable",t.pagination.descending?"desc":"asc",e.value===t.pagination.sortBy?"active":""],on:{click:function(n){return t.changeSort(e.value)}}},[n("v-icon",{attrs:{small:""}},[t._v("arrow_upward")]),t._v(" "),n("span",{staticClass:"dark-font"},[t._v(t._s(e.text))])],1)})],2)]}},{key:"items",fn:function(e){return[n("tr",{attrs:{active:e.selected},on:{click:function(t){e.selected=!e.selected}}},[n("td",[n("v-checkbox",{attrs:{"input-value":e.selected,primary:"","hide-details":""}})],1),t._v(" "),n("td",[t._v(t._s(e.item.id))]),t._v(" "),n("td",[t._v(t._s(e.item.hostname))]),t._v(" "),n("td",{staticClass:"task-command"},[t._v(t._s(e.item.command))]),t._v(" "),n("td",[t._v(t._s(e.item.pid))]),t._v(" "),n("td",[t._v(t._s(e.item.status))]),t._v(" "),n("td",[t._v(t._s(t.prettyDate(e.item.spawnAt)))]),t._v(" "),n("td",[t._v(t._s(t.prettyDate(e.item.terminateAt)))]),t._v(" "),n("td",[n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.scheduleTasks(e.item)}}},r),[t._v("schedule")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Schedule task")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.spawnTasks(e.item.id)}}},r),[t._v("play_arrow")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Spawn task")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.terminateTasks(e.item.id,null)}}},r),[t._v("stop")])]}}],null,!0)},[t._v(" "),n("span",[t._v("\n Terminate task - does not guarantee that\n "),n("br"),t._v("task will stop (depends on command)\n ")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({staticStyle:{"font-size":"20px"},on:{click:function(n){return t.terminateTasks(e.item.id,!1)}}},r),[t._v("💀")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Kill task - use when command is more stubborn")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({staticStyle:{"font-size":"20px"},on:{click:function(n){return t.getLog(e.item.id)}}},r),[t._v("description")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Show log")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.editTask(e.item)}}},r),[t._v("edit")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Edit task")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(i){var r=i.on;return[n("v-icon",t._g({on:{click:function(n){return t.showConfirmationDialog(e.item.id)}}},r),[t._v("delete")])]}}],null,!0)},[t._v(" "),n("span",[t._v("Remove task")])])],1)])]}}]),model:{value:t.selected,callback:function(e){t.selected=e},expression:"selected"}},[t._v(" "),n("v-progress-linear",{attrs:{indeterminate:!0},scopedSlots:t._u([{key:"progress",fn:function(){},proxy:!0}])})],1)],1),t._v(" "),n("div",{staticClass:"text-xs-center pt-2"},[n("v-btn",{attrs:{color:"primary"},on:{click:function(e){return t.openFromTemplate("")}}},[t._v("Create tasks")]),t._v(" "),n("v-btn",{attrs:{color:"primary"},on:{click:function(e){t.showModalChooseTemplate=!0}}},[t._v("Create tasks from template")]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.getTasks(!0)}}},i),[t._v("refresh")])]}}])},[t._v(" "),n("span",[t._v("Refresh")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.scheduleTasks(null)}}},i),[t._v("schedule")])]}}])},[t._v(" "),n("span",[t._v("Schedule selected tasks")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.spawnTasks(null)}}},i),[t._v("play_arrow")])]}}])},[t._v(" "),n("span",[t._v("Spawn selected tasks")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({on:{click:function(e){return t.terminateTasks(null,null)}}},i),[t._v("stop")])]}}])},[t._v(" "),n("span",[t._v("\n Terminate selected tasks - does not guarantee that\n "),n("br"),t._v("task will stop (depends on command)\n ")])]),t._v(" "),n("v-tooltip",{attrs:{top:""},scopedSlots:t._u([{key:"activator",fn:function(e){var i=e.on;return[n("v-icon",t._g({staticStyle:{"font-size":"20px"},on:{click:function(e){return t.terminateTasks(null,!1)}}},i),[t._v("💀")])]}}])},[t._v(" "),n("span",[t._v("Kill selected tasks - use when command is more stubborn")])])],1),t._v(" "),n("v-snackbar",{attrs:{color:"amber",bottom:"","multi-line":""},model:{value:t.snackbar,callback:function(e){t.snackbar=e},expression:"snackbar"}},[n("span",{staticStyle:{color:"black"}},[t._v("Synchronization in progress. Actions are not allowed now.")]),t._v(" "),n("v-btn",{attrs:{color:"black",flat:""},on:{click:function(e){t.snackbar=!1}}},[t._v("Close")])],1),t._v(" "),n("v-snackbar",{attrs:{color:"red",bottom:"","multi-line":""},model:{value:t.snackbarError,callback:function(e){t.snackbarError=e},expression:"snackbarError"}},[t._v("\n "+t._s(t.errorMessage)+"\n "),n("v-btn",{attrs:{color:"black",flat:""},on:{click:function(e){t.snackbarError=!1}}},[t._v("Close")])],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";function i(t){n(358)}var r=n(212),s=n(359),o=n(1),a=i,l=o(r.a,s.a,!1,a,"data-v-58aecb3a",null);e.a=l.exports},function(t,e){},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"content"},[n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.alert,callback:function(e){t.alert=e},expression:"alert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),n("v-alert",{attrs:{dismissible:"",type:"info"},model:{value:t.created,callback:function(e){t.created=e},expression:"created"}},[t._v("\n User successfully created\n ")]),t._v(" "),n("v-layout",{attrs:{row:"","justify-center":""}},[n("v-dialog",{attrs:{width:"500px"},model:{value:t.showModal,callback:function(e){t.showModal=e},expression:"showModal"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModal=!1}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("span",{staticClass:"headline"},[t._v("Create new user")])],1),t._v(" "),n("v-card-text",[n("form",{on:{submit:function(e){return e.preventDefault(),t.createUser(e)}}},[n("v-card-text",[t._v("\n Username\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-user"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalUsername,expression:"modalUsername"}],staticClass:"form-control",attrs:{name:"modalUsername",placeholder:"Username",type:"text"},domProps:{value:t.modalUsername},on:{input:function(e){e.target.composing||(t.modalUsername=e.target.value)}}})]),t._v("\n Email\n "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-envelope"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalEmail,expression:"modalEmail"}],staticClass:"form-control",attrs:{name:"modalEmail",placeholder:"Email",type:"text"},domProps:{value:t.modalEmail},on:{input:function(e){e.target.composing||(t.modalEmail=e.target.value)}}})]),t._v("\n Password\n "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalPassword,expression:"modalPassword"}],staticClass:"form-control",attrs:{name:"modalPassword",placeholder:"Password",type:"password"},domProps:{value:t.modalPassword},on:{input:function(e){e.target.composing||(t.modalPassword=e.target.value)}}})]),t._v("\n Repeat password\n "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.modalPassword2,expression:"modalPassword2"}],staticClass:"form-control",attrs:{name:"modalPassword2",placeholder:"Password2",type:"password"},domProps:{value:t.modalPassword2},on:{input:function(e){e.target.composing||(t.modalPassword2=e.target.value)}}})]),t._v(" "),n("v-alert",{attrs:{dismissible:"",type:"error"},model:{value:t.modalAlert,callback:function(e){t.modalAlert=e},expression:"modalAlert"}},[t._v("\n "+t._s(t.errorMessage)+"\n ")]),t._v(" "),n("v-btn",{attrs:{color:"success",type:"submit"}},[t._v("\n Create\n ")])],1)])],1)],1)],1),t._v(" "),n("v-dialog",{attrs:{width:"400"},model:{value:t.showModalRemove,callback:function(e){t.showModalRemove=e},expression:"showModalRemove"}},[n("v-card",[n("v-card-text",{staticClass:"headline grey lighten-2",attrs:{"primary-title":""}},[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.showModalRemove=!1}}},[n("v-icon",[t._v("close")])],1),t._v("\n Do you want to remove this user?\n ")],1),t._v(" "),n("v-card-actions",[n("v-layout",{attrs:{"align-center":"","justify-end":""}},[n("v-btn",{attrs:{color:"success",round:""},on:{click:function(e){return t.removeUser()}}},[t._v("\n Yes\n ")])],1)],1)],1)],1),t._v(" "),n("div",[n("div",{staticClass:"text-xs-center pt-2"},[n("v-btn",{attrs:{color:"primary"},on:{click:function(e){t.showModal=!0}}},[t._v("Create user")])],1),t._v(" "),n("v-dialog",{attrs:{"max-width":"500px"},model:{value:t.dialog,callback:function(e){t.dialog=e},expression:"dialog"}},[n("v-card",[n("v-card-text",[n("v-btn",{staticClass:"float-right-button",attrs:{flat:"",icon:"",color:"black"},on:{click:function(e){t.dialog=!1}}},[n("v-icon",[t._v("close")])],1),t._v(" "),n("v-card-text",[t._v("\n Edit user\n ")]),t._v(" "),n("v-card-text",[t._v("\n Current username: "+t._s(t.currentUser.username)+"\n ")]),t._v(" "),n("v-card-text",[t._v("\n New username\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-envelope"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.username,expression:"user.username"}],staticClass:"form-control",attrs:{name:"modalUsername",placeholder:"Username",type:"text"},domProps:{value:t.user.username},on:{input:function(e){e.target.composing||t.$set(t.user,"username",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n Current email: "+t._s(t.currentUser.email)+"\n ")]),t._v(" "),n("v-card-text",[t._v("\n New email\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-envelope"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.email,expression:"user.email"}],staticClass:"form-control",attrs:{name:"modalEmail",placeholder:"Email",type:"text"},domProps:{value:t.user.email},on:{input:function(e){e.target.composing||t.$set(t.user,"email",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n New password\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.password,expression:"user.password"}],staticClass:"form-control",attrs:{name:"modalPassword",placeholder:"Password",type:"password"},domProps:{value:t.user.password},on:{input:function(e){e.target.composing||t.$set(t.user,"password",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n Repeat password\n ")]),t._v(" "),n("div",{staticClass:"input-group"},[n("span",{staticClass:"input-group-addon"},[n("i",{staticClass:"fa fa-lock"})]),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.user.password2,expression:"user.password2"}],staticClass:"form-control",attrs:{name:"modalPassword2",placeholder:"Password2",type:"password"},domProps:{value:t.user.password2},on:{input:function(e){e.target.composing||t.$set(t.user,"password2",e.target.value)}}})]),t._v(" "),n("v-card-text",[t._v("\n Account roles:\n ")]),t._v(" "),n("v-card-text",[n("v-checkbox",{attrs:{label:"admin"},model:{value:t.adminCheckbox,callback:function(e){t.adminCheckbox=e},expression:"adminCheckbox"}})],1)],1),t._v(" "),n("v-card-actions",[n("v-spacer"),t._v(" "),n("v-btn",{attrs:{color:"blue darken-1",flat:""},on:{click:t.updateUser}},[t._v("Edit")])],1)],1)],1),t._v(" "),n("v-data-table",{staticClass:"elevation-1",attrs:{headers:t.headers,items:t.users,search:t.search,pagination:t.pagination,"item-key":"id","hide-actions":""},on:{"update:pagination":function(e){t.pagination=e}},scopedSlots:t._u([{key:"items",fn:function(e){return[n("tr",[n("td",[t._v(t._s(e.item.id))]),t._v(" "),n("td",[t._v(t._s(e.item.username))]),t._v(" "),n("td",[t._v(t._s(e.item.email))]),t._v(" "),n("td",[t._v(t._s(t.prettyDate(e.item.createdAt)))]),t._v(" "),n("td",[t._v(t._s(e.item.role))]),t._v(" "),n("td",[n("v-icon",{attrs:{small:""},on:{click:function(n){return t.editUser(e.item)}}},[t._v("\n edit\n ")]),t._v(" "),n("v-icon",{attrs:{small:""},on:{click:function(n){return t.showConfirmationDialog(e.item.id)}}},[t._v("\n delete\n ")])],1)])]}}])}),t._v(" "),n("div",{staticClass:"text-xs-center pt-2"},[n("v-pagination",{attrs:{length:t.pages},model:{value:t.pagination.page,callback:function(e){t.$set(t.pagination,"page",e)},expression:"pagination.page"}})],1)],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},function(t,e,n){"use strict";var i=n(30),r=n(361),s=n(362),o=n(363),a=n(364);i.default.use(r.a),e.a=new r.a.Store({state:s.a,actions:o.a,mutations:a.a})},,function(t,e,n){"use strict";e.a={callingAPI:!1,searching:"",serverURI:"http://10.110.1.136:8080",user:null,role:null,id:null,accessToken:null,refreshToken:null,userInfo:{messages:[{1:"test",2:"test"}],notifications:[],tasks:[]}}},function(t,e,n){"use strict";e.a={}},function(t,e,n){"use strict";e.a={TOGGLE_LOADING:function(t){t.callingAPI=!t.callingAPI},TOGGLE_SEARCHING:function(t){t.searching=""===t.searching?"loading":""},SET_USER:function(t,e){t.user=e},SET_ROLE:function(t,e){t.role=e},SET_ID:function(t,e){t.id=e},SET_ACCESS_TOKEN:function(t,e){t.accessToken=e},SET_REFRESH_TOKEN:function(t,e){t.refreshToken=e}}},function(t,e,n){"use strict";function i(t){return a.href=t,a.hostname}function r(t){return t.length}function s(t){return new Date(t).toDateString()}function o(t,e){return 1===t?t+e:t+e+"s"}e.b=i,e.a=r,e.d=s,e.c=o;var a=document.createElement("a")},function(t,e,n){"use strict";var i=n(213),r=n(367),s=n(1),o=s(i.a,r.a,!1,null,null,null);e.a=o.exports},function(t,e,n){"use strict";var i=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{attrs:{id:"app"}},[n("v-app",[n("router-view")],1)],1)},r=[],s={render:i,staticRenderFns:r};e.a=s},,function(t,e){},function(t,e){}],[214]); +//# sourceMappingURL=app.3d22f1efa5bc05f6f25f.js.map \ No newline at end of file diff --git a/tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js.map b/tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js.map new file mode 100644 index 00000000..ef5299e7 --- /dev/null +++ b/tensorhive/app/web/dist/static/js/app.3d22f1efa5bc05f6f25f.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///static/js/app.3d22f1efa5bc05f6f25f.js","webpack:///./src/api/index.js","webpack:///./src/config/index.js","webpack:///src/components/TheDash.vue","webpack:///src/components/dash/BaseSidebar.vue","webpack:///src/components/dash/BaseSidebarMenu.vue","webpack:///src/components/TheLogin.vue","webpack:///src/components/404.vue","webpack:///src/components/views/ReservationsOverview.vue","webpack:///src/components/views/reserve_resources/FullCalendar.vue","webpack:///src/components/views/reserve_resources/FullCalendarReserve.vue","webpack:///src/components/views/reserve_resources/FullCalendarInfo.vue","webpack:///src/components/views/reserve_resources/MySchedule.vue","webpack:///src/components/views/NodesOverview.vue","webpack:///src/components/views/nodes_overview/WatchGenerator.vue","webpack:///src/components/views/nodes_overview/WatchBox.vue","webpack:///src/components/views/nodes_overview/LineChart.vue","webpack:///src/components/views/TasksOverview.vue","webpack:///src/components/views/tasks_overview/TaskCreate.vue","webpack:///src/components/views/tasks_overview/TaskLine.vue","webpack:///src/components/views/tasks_overview/TaskLineParameter.vue","webpack:///src/components/views/tasks_overview/TaskLineEnvVariable.vue","webpack:///src/components/views/tasks_overview/TaskLineTfConfig.vue","webpack:///src/components/views/tasks_overview/TfConfigEdit.vue","webpack:///src/components/views/tasks_overview/TaskEdit.vue","webpack:///src/components/views/tasks_overview/TaskSchedule.vue","webpack:///src/components/views/tasks_overview/TaskLog.vue","webpack:///src/components/views/tasks_overview/TaskTemplateChooser.vue","webpack:///src/components/views/UsersOverview.vue","webpack:///src/components/App.vue","webpack:///./src/main.js","webpack:///./src/routes.js","webpack:///./src/components/TheDash.vue","webpack:///./src/components/dash/BaseSidebar.vue","webpack:///./src/components/dash/BaseSidebarMenu.vue","webpack:///./src/components/dash/BaseSidebarMenu.vue?ea08","webpack:///./src/components/dash/BaseSidebar.vue?593a","webpack:///./src/components/TheDash.vue?4fff","webpack:///./src/components/TheLogin.vue","webpack:///./src/components/TheLogin.vue?889c","webpack:///./src/components/404.vue","webpack:///./src/components/404.vue?a49b","webpack:///./src/components/views/ReservationsOverview.vue","webpack:///./src/components/views/reserve_resources/FullCalendar.vue","webpack:///./src/components/views/reserve_resources/FullCalendarReserve.vue","webpack:///./node_modules/moment/locale ^\\.\\/.*$","webpack:///./src/components/views/reserve_resources/FullCalendarReserve.vue?a65a","webpack:///./src/components/views/reserve_resources/FullCalendarInfo.vue","webpack:///./src/components/views/reserve_resources/FullCalendarInfo.vue?c7f5","webpack:///./static/fullcalendar/fullcalendar.js","webpack:///./src/components/views/reserve_resources/FullCalendar.vue?9657","webpack:///./src/components/views/reserve_resources/MySchedule.vue","webpack:///./src/components/views/reserve_resources/MySchedule.vue?d990","webpack:///./src/components/views/ReservationsOverview.vue?83a8","webpack:///./src/components/views/NodesOverview.vue","webpack:///./src/components/views/nodes_overview/WatchGenerator.vue","webpack:///./src/components/views/nodes_overview/WatchBox.vue","webpack:///./src/components/views/nodes_overview/LineChart.vue","webpack:///./src/components/views/nodes_overview/WatchBox.vue?df61","webpack:///./src/components/views/nodes_overview/WatchGenerator.vue?ebb9","webpack:///./src/components/views/NodesOverview.vue?bbc4","webpack:///./src/components/views/TasksOverview.vue","webpack:///./src/components/views/tasks_overview/TaskCreate.vue","webpack:///./src/components/views/tasks_overview/TaskLine.vue","webpack:///./src/components/views/tasks_overview/TaskLineParameter.vue","webpack:///./src/components/views/tasks_overview/TaskLineParameter.vue?2ad6","webpack:///./src/components/views/tasks_overview/TaskLineEnvVariable.vue","webpack:///./src/components/views/tasks_overview/TaskLineEnvVariable.vue?f44b","webpack:///./src/components/views/tasks_overview/TaskLineTfConfig.vue","webpack:///./src/components/views/tasks_overview/TfConfigEdit.vue","webpack:///./src/components/views/tasks_overview/TfConfigEdit.vue?f8ad","webpack:///./src/components/views/tasks_overview/TaskLineTfConfig.vue?e748","webpack:///./src/components/views/tasks_overview/TaskLine.vue?40e0","webpack:///./src/components/views/tasks_overview/TaskCreate.vue?85fd","webpack:///./src/components/views/tasks_overview/TaskEdit.vue","webpack:///./src/components/views/tasks_overview/TaskEdit.vue?7932","webpack:///./src/components/views/tasks_overview/TaskSchedule.vue","webpack:///./src/components/views/tasks_overview/TaskSchedule.vue?c038","webpack:///./src/components/views/tasks_overview/TaskLog.vue","webpack:///./src/components/views/tasks_overview/TaskLog.vue?c1cd","webpack:///./src/components/views/tasks_overview/TaskTemplateChooser.vue","webpack:///./src/components/views/tasks_overview/TaskTemplateChooser.vue?099e","webpack:///./src/components/views/TasksOverview.vue?7bd2","webpack:///./src/components/views/UsersOverview.vue","webpack:///./src/components/views/UsersOverview.vue?c94b","webpack:///./src/store/index.js","webpack:///./src/store/state.js","webpack:///./src/store/actions.js","webpack:///./src/store/mutations.js","webpack:///./src/filters/index.js","webpack:///./src/components/App.vue","webpack:///./src/components/App.vue?6735"],"names":["webpackJsonp","module","__webpack_exports__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0_axios__","__WEBPACK_IMPORTED_MODULE_0_axios___default","n","__WEBPACK_IMPORTED_MODULE_1__config__","request","method","uri","token","data","arguments","length","undefined","console","error","url","config","serverURI","axios","defaults","headers","common","apiVersion","version","fixedLayout","hideLogoOnMobile","__WEBPACK_IMPORTED_MODULE_0__config__","__WEBPACK_IMPORTED_MODULE_1__dash_BaseSidebar_vue__","__WEBPACK_IMPORTED_MODULE_2_hideseek__","__WEBPACK_IMPORTED_MODULE_3__api__","name","components","BaseSidebar","year","Date","getFullYear","classes","fixed_layout","hide_logo","alert","errorMessage","computed","displayName","this","$store","state","user","methods","handleError","hasOwnProperty","response","msg","message","changeloading","commit","logout","_this","accessToken","then","window","localStorage","setItem","refreshToken","catch","$router","push","__WEBPACK_IMPORTED_MODULE_0__BaseSidebarMenu_vue__","BaseSidebarMenu","mounted","jQuery","off","hideseek","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default","__WEBPACK_IMPORTED_MODULE_1__api__","router","section","username","password","modalUsername","modalEmail","modalPassword","modalPassword2","modalAlert","created","showModal","entry","requestEntry","copyEntryToClipboard","entryInput","document","querySelector","setAttribute","select","execCommand","e","getSelection","removeAllRanges","createUser","_this2","email","checkCreds","_this3","toggleLoading","resetResponse","errorName","access_token","refresh_token","object","JSON","parse","atob","split","id","identity","role","user_claims","roles","loading","__WEBPACK_IMPORTED_MODULE_0__api__","__WEBPACK_IMPORTED_MODULE_1_lodash__","__WEBPACK_IMPORTED_MODULE_1_lodash___default","__WEBPACK_IMPORTED_MODULE_2__reserve_resources_FullCalendar_vue__","__WEBPACK_IMPORTED_MODULE_3__reserve_resources_MySchedule_vue__","FullCalendar","MySchedule","nodes","parsedNodes","snackbar","updateCalendar","selectedResources","nodeCheckbox","resourceTypeCheckbox","resourceCheckbox","showSchedule","interval","time","parseData","self","setInterval","showSnackbar","loadResources","resources","selected","obj","nodeName","resourceName","uuid","index","resourceIndex","toggle","node","open","resourceType","resourceTypes","tempResource","tempResourceType","tempNode","orderedResources","resourceTypeName","resourceUUID","metrics","a","orderBy","checked","loadCalendar","resource","i","j","k","__WEBPACK_IMPORTED_MODULE_0__FullCalendarReserve_vue__","__WEBPACK_IMPORTED_MODULE_1__FullCalendarInfo_vue__","__WEBPACK_IMPORTED_MODULE_2__api__","__WEBPACK_IMPORTED_MODULE_3_jquery__","__WEBPACK_IMPORTED_MODULE_3_jquery___default","__WEBPACK_IMPORTED_MODULE_4_moment__","__WEBPACK_IMPORTED_MODULE_4_moment___default","__WEBPACK_IMPORTED_MODULE_5_lodash__","__WEBPACK_IMPORTED_MODULE_5_lodash___default","FullCalendarReserve","FullCalendarInfo","props","Object","Array","Boolean","watch","calendar","fullCalendar","showModalReserve","showModalInfo","reservation","title","description","resourceId","start","end","reservationId","startDate","endDate","resourcesCheckboxes","refreshTasks","parsedNodeNames","$emit","getEvents","callback","resourcesString","toISOString","previousCheckboxes","previousLength","previousChecked","disabled","addResourcesHeader","dayStart","cloneDeep","tempReservation","allDay","userId","add","parseNodeNames","setColor","resourceNodeName","colors","colorIndex","updateReservation","newTime","newTitle","newDescription","toUpdate","empty","key","cancelReservation","toString","addReservation","_this4","$el","resize","allDaySlot","allDayText","height","selectable","selectOverlap","slotEventOverlap","editable","nowIndicator","firstDay","timezone","defaultView","header","left","center","right","views","week","columnHeaderFormat","buttonText","week2","type","duration","days","dateIncrement","events","eventRender","event","element","_this5","find","append","css","prepend","bold","big","italics","eventAfterRender","view","columnIndex","width","el","clientWidth","dayWidth","eventSlotWidth","eventWidth","Math","round","margin","c","color","_ambigTime","toDate","setTimeout","eventClick","calEvent","jsEvent","viewRender","__WEBPACK_IMPORTED_MODULE_0_moment__","__WEBPACK_IMPORTED_MODULE_0_moment___default","numberOfResources","Number","Function","show","close","startTime","newStartDate","format","newStartTime","endTime","newEndDate","newEndTime","startTimeMenu","startDateMenu","endTimeMenu","endDateMenu","showInfo","reservationTitle","reservationDescription","anyChecked","checkbox","parseInt","__WEBPACK_IMPORTED_MODULE_1_moment__","__WEBPACK_IMPORTED_MODULE_1_moment___default","cancel","update","actionsAbility","gpuUtilAvg","memUtilAvg","reservationStart","reservationEnd","gpuUUID","GPU","getTasks","tasksCard","cancelCard","updateCard","pagination","sortBy","tasks","selectedIndex","text","value","tableKey","actionFlag","showAlert","prettyDate","date","checkActionFlag","scheduleTasks","newTask","adjustHostAndCommand","getTask","hostname","command","setCommand","splitCommand","join","updateTask","task","newData","splice","toggleAll","slice","changeSort","column","descending","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default","tableContent","hours","scheduleStart","scheduleEnd","resourcesIds","startMoment","leftTableKey","rightTableKey","picker","substr","menu","landscape","reactive","range","changeAllCheckbox","selectedNodes","allFlag","nodeFlag","fillTable","changeAll","changeWholeNode","checkIfAllNodesSelected","changeResource","checkIfAllResourcesSelected","forceRerenderTables","changeSchedule","adjustTimezone","headerName","resourceIds","nodeIndex","nodeSlots","reserved","userReservation","hidden","slots","resourceTypeIndex","getReservations","dayDifferenceStart","diff","hoursDifferenceStart","minutesDifferenceStart","dayDifferenceEnd","hoursDifferenceEnd","minutesDifferenceEnd","startSlot","endSlot","slot","getTimezoneOffset","leftTable","getElementById","rightTable","rightHeader","onscroll","scrollTop","scrollLeft","__WEBPACK_IMPORTED_MODULE_0__nodes_overview_WatchGenerator_vue__","WatchGenerator","__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__","__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default","__WEBPACK_IMPORTED_MODULE_2__WatchBox_vue__","__WEBPACK_IMPORTED_MODULE_4_lodash__","__WEBPACK_IMPORTED_MODULE_4_lodash___default","WatchBox","watches","chartDatasets","chartLength","space","updateChart","resourcesIndexes","watchIds","loadData","$route","fullPath","clearInterval","changeData","saveWatches","changeDefaultNode","defaultNode","changeDefaultResourceType","defaultResourceType","changeDefaultMetric","defaultMetric","deleteWatch","step","colorToInt","nstep","isNaN","ncolor","test","getItem","host","isVisible","metric","metricName","apiResponse","uniqueMetricNames","findMetrics","tempMetrics","uniqueMetrics","unit","visible","uniqueMetricName","createMetric","labels","totalMemory","datasets","orderedDatasets","createDataset","options","createOptions","label","defaultData","fill","borderColor","pointBackgroundColor","backgroundColor","responsive","maintainAspectRatio","legend","position","display","tooltips","mode","xPadding","yPadding","bodySpacing","scales","xAxes","scaleLabel","labelString","yAxes","suggestedMin","max","suggestedMax","counter","apiRequest","toLowerCase","has","shift","addWatch","__WEBPACK_IMPORTED_MODULE_0__LineChart_vue__","LineChart","String","selectedNode","selectedResourceType","selectedMetric","rerenderChart","metricData","metricOptions","showProcesses","processes","sendDefaultNode","newDefault","sendDefaultResourceType","sendDefaultMetric","removeMe","loadOptions","fillNodes","fillResourceTypes","fillMetrics","metricIndex","checkProcesses","tempProcess","__WEBPACK_IMPORTED_MODULE_0_vue_chartjs__","extends","chartData","$data","_chart","destroy","renderChart","__WEBPACK_IMPORTED_MODULE_2__tasks_overview_TaskCreate_vue__","__WEBPACK_IMPORTED_MODULE_3__tasks_overview_TaskEdit_vue__","__WEBPACK_IMPORTED_MODULE_4__tasks_overview_TaskSchedule_vue__","__WEBPACK_IMPORTED_MODULE_5__tasks_overview_TaskLog_vue__","__WEBPACK_IMPORTED_MODULE_6__tasks_overview_TaskTemplateChooser__","TaskTemplateChooser","TaskCreate","TaskEdit","TaskSchedule","TaskLog","sortable","hostnames","hosts","showModalCreate","chosenTemplate","showModalChooseTemplate","showModalEdit","showModalSchedule","showModalHowItWorks","showModalRemove","showModalLog","taskId","newHostname","newCommand","newSpawnTime","newTerminateTime","initialSyncFlag","snackbarError","multipleFlag","logs","path","actionType","gracefully","rowsPerPageItems","getHosts","showError","changeActionFlag","bool","changeSnackbar","convertHostsInfo","hostsInfo","sync","spawnTasks","prepareActionLoop","terminateTasks","actionLoop","actionPath","getTaskLoop","resumeLoop","spawnAt","terminateAt","editTask","showConfirmationDialog","removeTask","_this6","getLog","_this7","tailMode","output_lines","finally","openFromTemplate","__WEBPACK_IMPORTED_MODULE_1__TaskLine_vue__","TaskLine","newParameter","linesIds","lines","parameters","envVariables","parameterIds","envVariableIds","enableTfConfig","tfConfig","tfConfigPort","tfConfigTaskType","tfConfigTaskIndex","tfCluster","staticParameters","staticEnvVariables","isNewFieldStatic","enableSmartTfConfig","emptyParametersAndEnvVariables","addParameter","addEnvVariable","addTasks","lineIndex","line","convertResource","envIndex","envVariable","parameterIndex","parameter","parameterNameLength","charAt","parameterName","parameterValue","taskIndex","variableName","variableValue","newName","substring","machinePorts","updateTfConfigTaskType","updateTfConfigPort","copyLine","addLine","lineToCopy","parametersToCopy","newParameters","parameterToCopy","envVariablesToCopy","newEnvVariables","EnvIndex","envVariableToCopy","newEnvVariable","machineHosts","changeLine","updateTfConfigHost","updatePsWorkerHosts","deleteLine","staticParameterChanged","staticParameterDeleted","staticIndex","indexOf","staticEnvVariableChanged","variable","variableIndex","staticEnvVariableDeleted","psHosts","workerHosts","currentPort","currLine","jobName","paramIndex","_paramIndex","lineHost","psHostsParam","workerHostsParam","pHost","replace","wHost","_line","_paramIndex2","taskType","__ob__","dep","notify","port","oldTaskType","oldTaskIndex","otherLineIndex","updateTfConfigTaskIndex","newTaskIndex","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default","__WEBPACK_IMPORTED_MODULE_1__TaskLineParameter_vue__","__WEBPACK_IMPORTED_MODULE_2__TaskLineEnvVariable_vue__","__WEBPACK_IMPORTED_MODULE_3__TaskLineTfConfig__","TaskLineTfConfig","TaskLineParameter","TaskLineEnvVariable","newHost","newResource","newEnableTfConfig","newTfConfig","hostResources","taskPreview","updateLine","changeParameter","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","next","done","staticParameterName","err","return","deleteParameter","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","changeEnvVariable","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","staticEnvVariableName","deleteEnvVariable","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","changeTfConfig","deleteTfConfig","newPort","newTaskType","newValue","showModalTfConfigEdit","updateValue","__WEBPACK_IMPORTED_MODULE_1__TfConfigEdit__","TfConfigEdit","taskTypeItems","localEnableSmartTfConfig","cluster","properJson","desanitize","save","sanitize","changeTask","spawnTime","terminateTime","spawnTimeMenu","spawnDateMenu","terminateTimeMenu","terminateDateMenu","spawn","terminate","newSpawnDate","newTerminateDate","actionSave","$refs","autoRefresh","autoRefreshIntervalId","refresh","toggleAutoRefresh","possibleTemplates","setChosenTemplate","templateName","goToCreate","dialog","search","users","password2","currentUser","userCheckbox","adminCheckbox","pages","rowsPerPage","totalItems","ceil","checkUsers","editUser","admin","updateUser","updatedUser","removeUser","defineProperty","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default","__WEBPACK_IMPORTED_MODULE_2_es6_promise_auto__","__WEBPACK_IMPORTED_MODULE_3_vue__","__WEBPACK_IMPORTED_MODULE_4_vue_router__","__WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__","__WEBPACK_IMPORTED_MODULE_6__routes__","__WEBPACK_IMPORTED_MODULE_7__store__","__WEBPACK_IMPORTED_MODULE_8__api__","__WEBPACK_IMPORTED_MODULE_9__filters__","__WEBPACK_IMPORTED_MODULE_10__components_App_vue__","__WEBPACK_IMPORTED_MODULE_11_vuetify__","__WEBPACK_IMPORTED_MODULE_11_vuetify___default","__WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css__","__WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css__","__WEBPACK_IMPORTED_MODULE_14_axios__","__WEBPACK_IMPORTED_MODULE_14_axios___default","__WEBPACK_IMPORTED_MODULE_15__config__","get","log","store","api","apiPath","clear","location","reload","Vue","use","Vuetify","filter","count","domain","pluralize","VueRouter","routes","linkExactActiveClass","scrollBehavior","to","from","savedPosition","x","y","beforeEach","matched","some","record","meta","requiresAuth","app","query","redirect","interceptors","status","reject","localUserString","localUser","render","h","AppView","__WEBPACK_IMPORTED_MODULE_0__components_TheDash_vue__","__WEBPACK_IMPORTED_MODULE_1__components_TheLogin_vue__","__WEBPACK_IMPORTED_MODULE_2__components_404_vue__","__WEBPACK_IMPORTED_MODULE_3__components_views_ReservationsOverview_vue__","__WEBPACK_IMPORTED_MODULE_4__components_views_NodesOverview_vue__","__WEBPACK_IMPORTED_MODULE_5__components_views_TasksOverview_vue__","__WEBPACK_IMPORTED_MODULE_6__components_views_UsersOverview_vue__","component","DashView","children","alias","CalendarView","WatchView","TasksView","UsersView","LoginView","NotFoundView","injectStyle","ssrContext","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheDash_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ebd4a91c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheDash_vue__","normalizeComponent","__vue_styles__","Component","exports","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebar_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_8c8911fe_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebar_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebarMenu_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1ff073b3_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebarMenu_vue__","_vm","_h","$createElement","_c","_self","staticClass","_v","attrs","tag","_e","staticRenderFns","esExports","class","dismissible","model","$$v","expression","_s","_m","close-on-content-click","offset-y","text-color","flat","on","click","$event","justify-center","row","wrap","text-xs-center","white--text","xs12","href","data-toggle","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheLogin_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_67170a3e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheLogin_vue__","icon","submit","preventDefault","directives","rawName","placeholder","domProps","input","target","composing","solo","small","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_404_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_209d35e8_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_404_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_ReservationsOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_a758ccee_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_ReservationsOverview_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendar_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_f3e7eb0c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendar_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarReserve_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_6b687e6b_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarReserve_vue__","webpackContext","req","webpackContextResolve","map","Error","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","keys","resolve","_l","$set","align-center","justify-start","nudge-right","lazy","transition","full-width","min-width","scopedSlots","_u","fn","ref","_g","prepend-icon","return-value","max-width","update:returnValue","update:return-value","allowed-minutes","m","click:minute","startMenu","endMenu","outline","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarInfo_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7c5a8e25_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarInfo_vue__","large","userName","items","select-all","item-key","update:pagination","input-value","all","indeterminate","primary","hide-details","stopPropagation","active","item","proxy","root","factory","__WEBPACK_EXTERNAL_MODULE_0__","__WEBPACK_EXTERNAL_MODULE_3__","modules","moduleId","installedModules","l","call","d","getter","o","configurable","enumerable","__esModule","property","prototype","p","s","extendStatics","setPrototypeOf","__proto__","b","__extends","__","constructor","create","compensateScroll","rowEls","scrollbarWidths","border-left-width","margin-left","border-right-width","margin-right","uncompensateScroll","disableCursor","$","addClass","enableCursor","removeClass","distributeHeight","els","availableHeight","shouldRedistribute","minOffset1","floor","minOffset2","flexEls","flexOffsets","flexHeights","usedHeight","undistributeHeight","each","minOffset","naturalOffset","outerHeight","naturalHeight","newHeight","matchCellWidths","maxInnerWidth","innerEl","innerWidth","outerWidth","subtractInnerElHeight","outerEl","both","getScrollParent","scrollParent","parents","parent","eq","ownerDocument","getOuterRect","origin","offset","top","bottom","getClientRect","getScrollbarWidths","getCssFloat","clientHeight","getContentRect","widths","leftRightWidth","offsetWidth","bottomWidth","offsetHeight","sanitizeScrollbarWidth","getIsLeftRtlScrollbars","_isLeftRtlScrollbars","computeIsLeftRtlScrollbars","border","padding","overflow","direction","appendTo","res","remove","prop","parseFloat","isPrimaryMouseButton","ev","which","ctrlKey","getEvX","touches","originalEvent","pageX","getEvY","pageY","getEvIsTouch","preventSelection","allowSelection","intersectRects","rect1","rect2","min","constrainPoint","point","rect","getRectCenter","diffPoints","point1","point2","parseFieldSpecs","specs","tokens","isArray","field","order","func","compareByFieldSpecs","obj1","obj2","fieldSpecs","obj1fallback","obj2fallback","cmp","compareByFieldSpec","fieldSpec","val1","val2","flexibleCompare","localeCompare","diffDayTime","moment","clone","stripTime","ms","diffDay","diffByUnit","computeGreatestUnit","val","unitsDesc","computeRangeAs","isInt","computeDurationGreatestUnit","durationInput","isDuration","as","divideRangeByDuration","dur","months","durationHasTime","asMonths","abs","asDays","divideDurationByDuration","dur1","dur2","months1","months2","multiplyDuration","minutes","seconds","milliseconds","isNativeDate","isTimeString","str","args","_i","apply","warn","mergeProps","propObjs","complexProps","complexObjs","dest","unshift","copyOwnProps","src","name_1","hasOwnProp","hasOwnPropMethod","applyAll","functions","thisObj","isFunction","ret","removeMatching","array","testFunc","removeCnt","removeExact","exactVal","isArraysEqual","a0","a1","len","firstDefined","htmlEscape","stripHtmlEntities","cssToStr","cssProps","statements","attrsToStr","parts","capitaliseFirstLetter","toUpperCase","compareNumbers","methodName","debounce","wait","immediate","timeout","context","timestamp","result","later","last","callNow","dayIDs","compareUnzonedRanges","range1","range2","startMs","moment_ext_1","UnzonedRange","startInput","endInput","isStart","isEnd","isMoment","stripZone","valueOf","endMs","invertRanges","ranges","constraintRange","dateRange","invertedRanges","sort","intersect","otherRange","newRange","intersectsWith","containsRange","innerRange","containsDate","constrainDate","equals","getStart","default","utc","getEnd","tslib_1","ParsableModelMixin_1","Class_1","EventDefParser_1","EventSource","_super","className","uid","rawInput","source","applyProps","normalizeId","fetch","removeEventDefsById","eventDefId","removeAllEventDefs","getPrimitive","otherSource","parseEventDefs","rawEventDefs","eventDef","eventDefs","parseEventDef","calendarTransform","opt","sourceTransform","eventDataTransform","applyManualStandardProps","rawProps","defineStandardProps","copyVerbatimStandardProps","mixInto","textColor","startEditable","durationEditable","rendering","overlap","constraint","allDayDefault","Mixin_1","guid","ListenerMixin","listenTo","other","arg","eventName","getListenerNamespace","stopListeningTo","listenerId","oldMomentFormat","mom","formatStr","oldMomentProto","makeMoment","parseAsUTC","parseZone","isAmbigTime","isAmbigZone","ambigMatch","isSingleString","util_1","ambigDateOfMonthRegex","ambigTimeOrZoneRegex","exec","_ambigZone","utcOffset","_fullCalendar","newMomentProto","extend","momentProperties","momentExt","hasTime","weeks","weekCalc","_locale","_fullCalendar_weekCalc","isoWeek","dayHours","set","wasAmbigTime","hasZone","local","keepLocalTime","tzo","EmitterMixin","types","handler","_prepareIntercept","one","intercept","extra","trigger","triggerHandler","triggerWith","hasHandlers","hash","_data","ComponentFootprint","unzonedRange","isAllDay","toLegacy","msToMoment","EventDef_1","EventInstance_1","EventDateProfile_1","SingleEventDef","buildInstances","buildInstance","dateProfile","def","rezone","superSuccess","miscProps","Mixin","destClass","getOwnPropertyNames","forEach","mixOver","Interaction","_getView","internalApiVersion","date_formatting_1","formatDate","formatRange","queryMostGranularFormatUnit","locale_1","datepickerLocale","locale","EmitterMixin_1","ListenerMixin_1","Model_1","Model","Constraints_1","Constraints","UnzonedRange_1","ComponentFootprint_1","BusinessHourGenerator_1","BusinessHourGenerator","EventDef","EventDefMutation_1","EventDefMutation","EventSourceParser_1","EventSourceParser","EventSource_1","ThemeRegistry_1","defineThemeSystem","EventInstanceGroup_1","EventInstanceGroup","ArrayEventSource_1","ArrayEventSource","FuncEventSource_1","FuncEventSource","JsonFeedEventSource_1","JsonFeedEventSource","EventFootprint_1","EventFootprint","Class","CoordCache_1","CoordCache","DragListener_1","DragListener","Promise_1","Promise","TaskQueue_1","TaskQueue","RenderQueue_1","RenderQueue","Scroller_1","Scroller","Theme_1","Theme","DateComponent_1","DateComponent","InteractiveDateComponent_1","InteractiveDateComponent","Calendar_1","Calendar","View_1","View","ViewRegistry_1","defineView","getViewConfig","DayTableMixin_1","DayTableMixin","BusinessHourRenderer_1","BusinessHourRenderer","EventRenderer_1","EventRenderer","FillRenderer_1","FillRenderer","HelperRenderer_1","HelperRenderer","ExternalDropping_1","ExternalDropping","EventResizing_1","EventResizing","EventPointing_1","EventPointing","EventDragging_1","EventDragging","DateSelecting_1","DateSelecting","StandardInteractionsMixin_1","StandardInteractionsMixin","AgendaView_1","AgendaView","TimeGrid_1","TimeGrid","DayGrid_1","DayGrid","BasicView_1","BasicView","MonthView_1","MonthView","ListView_1","ListView","EventDateProfile","buildUnzonedRange","forcedAllDay","forceEventDuration","isValid","isAfter","getDefaultEventEnd","isStandardProp","propName","EventRange_1","eventInstances","getAllEventRanges","sliceNormalRenderRanges","eventInstanceToEventRange","sliceRenderRanges","isInverse","sliceInverseRenderRanges","eventInstance","slicedRange","slicedEventRanges","unzonedRanges","eventInstanceToUnzonedRange","ownerDef","getEventDef","hasInverseRendering","explicitEventDef","optionsManager","processIconOverride","iconOverrideOption","setIconOverride","iconOverrideHash","iconClassesCopy","buttonName","isPlainObject","iconClasses","applyIconOverridePrefix","prefix","iconOverridePrefix","getClass","getIconClass","baseIconClass","getCustomButtonIconClass","customButtonProps","iconOverrideCustomButtonOption","attachImmediatelyResolvingThen","promise","onResolve","PromiseStub","attachImmediatelyRejectingThen","onReject","construct","executor","deferred","Deferred","exportHooks","touchMouseIgnoreWait","globalEmitter","neededCount","GlobalEmitter","isTouching","mouseIgnoreDepth","bind","needed","unneeded","unbind","touchstart","handleTouchStart","touchcancel","handleTouchCancel","touchend","handleTouchEnd","mousedown","handleMouseDown","mousemove","handleMouseMove","mouseup","handleMouseUp","handleClick","selectstart","handleSelectStart","contextmenu","handleContextMenu","addEventListener","handleTouchMoveProxy","handleTouchMove","Event","passive","handleScrollProxy","handleScroll","removeEventListener","stopTouch","shouldIgnoreMouse","skipMouseIgnore","startTouchMouseIgnore","viewName","viewConfig","viewHash","isHitsEqual","hit0","hit1","isHitPropsWithin","subHit","superHit","HitDragListener","handleInteractionStart","subjectRect","origPoint","subjectEl","hitsNeeded","computeScrollBounds","origHit","queryHit","subjectCenter","coordAdjust","handleDragStart","hit","handleHitOver","handleDrag","dx","dy","handleHitOut","handleDragEnd","handleHitDone","isOrig","handleInteractionEnd","isCancelled","hitsNotNeeded","handleScrollEnd","isDragging","releaseHits","prepareHits","populateInstanceComputableOptions","instanceComputableOptions","localeCode","dpLocaleCode","dpOptions","fcOptions","localeOptionHash","isRTL","weekNumberTitle","weekHeader","dpComputableOptions","jqDatePicker","datepicker","regional","en","setDefaults","newFcOptions","momOptions","options_1","mergeOptions","getMomentLocaleData","momComputableOptions","globalDefaults","localeData","locales","prev","prevText","nextText","today","currentText","monthYearFormat","showMonthAfterYear","yearSuffix","dayOfMonthFormat","longDateFormat","mediumTimeFormat","smallTimeFormat","extraSmallTimeFormat","hourFormat","noMeridiemTimeFormat","smallDayDateFormat","weekFormat","smallWeekFormat","englishDefaults","optionObjs","complexOptions","titleRangeSeparator","defaultTimedEventDuration","defaultAllDayEventDuration","nextDayThreshold","columnHeader","aspectRatio","weekends","weekNumbers","weekNumberCalculation","scrollTime","minTime","maxTime","showNonCurrentDates","lazyFetching","startParam","endParam","timezoneParam","prevYear","nextYear","month","day","agendaEventMinHeight","theme","dragOpacity","dragRevertDuration","dragScroll","unselectAuto","dropAccept","eventOrder","eventLimit","eventLimitText","eventLimitClick","dayPopoverFormat","handleWindowResize","windowResizeDelay","longPressDelay","rtlDefaults","buttonIcons","themeButtonIcons","members","SubClass","mixin","generateId","copy","rawId","getRendering","hasBgRendering","getConstraint","getOverlap","isStartExplicitlyEditable","isDurationExplicitlyEditable","isExplicitlyEditable","_id","applyMiscProps","eventDefsToEventInstances","eventRangeToEventFootprint","eventRange","eventFootprintToComponentFootprint","eventFootprint","componentFootprint","getEventLegacy","EventDefDateMutation_1","SingleEventDef_1","createFromRawProps","largeUnit","dateMutation","defMutation","dateProps","standardProps","verbatimStandardProps","createFromDiff","mutateSingle","origDateProfile","buildNewDateProfile","setDateMutation","isEmpty","sourceClasses","registerClass","EventSourceClass","eventSource","overflowX","overflowY","renderEl","applyOverflow","scrollEl","setHeight","overflow-x","overflow-y","lockOverflow","scrollWidth","scrollHeight","getScrollTop","setScrollTop","getClientWidth","getClientHeight","GlobalEmitter_1","_view","_options","segSelector","dateSelectingClass","dateClicking","dateClickingClass","dateSelecting","eventPointingClass","eventPointing","eventDraggingClass","eventDragging","eventResizingClass","eventResizing","externalDroppingClass","externalDropping","setElement","bindToEl","bindAllSegHandlersToEl","removeElement","endInteractions","executeEventUnrender","bindGlobalHandlers","bindToDocument","unbindGlobalHandlers","unbindFromDocument","bindDateHandlerToEl","is","eventInteraction","bindSegHandlerToEl","segEl","currentTarget","seg","shouldIgnoreEventPointing","shouldIgnoreTouch","isSelected","selectedEvent","isResizing","canStartSelection","canStartResize","isEventDefDraggable","footprint","isEventDefResizable","canStartDrag","isEventDefSelected","interaction","isEventDefStartEditable","isEditable","isEventDefGenerallyEditable","isEventDefResizableFromStart","isEventDefResizableFromEnd","isResizable","diffDates","isEventInstanceGroupAllowed","eventInstanceGroup","eventFootprints","eventRangesToEventFootprints","validUnzonedRange","constraints","isExternalInstanceGroupAllowed","isSelectionFootprintAllowed","DateProfileGenerator_1","viewSpec","batchRenderDepth","initRenderQueue","initHiddenDays","dateProfileGenerator","dateProfileGeneratorClass","bindBaseRenderHandlers","eventOrderSpecs","renderQueue","onRenderQueueStart","onRenderQueueStop","startBatchRender","stopBatchRender","freezeContentHeight","addScroll","queryScroll","updateViewSize","popScroll","thawContentHeight","pause","resume","requestRender","namespace","queue","whenSizeUpdated","isRunning","computeTitle","currentRangeUnit","currentUnzonedRange","activeUnzonedRange","isRangeAllDay","computeTitleFormat","setDate","currentDateProfile","newDateProfile","build","unsetDate","unset","fetchInitialEvents","forceAllDay","usesMinMaxTime","requestEvents","bindEventChanges","resetEvents","unbindEventChanges","setEvents","eventsPayload","unsetEvents","requestDateRender","executeDateRender","requestDateUnrender","executeDateUnrender","isDateInit","startNowIndicator","unselect","stopNowIndicator","triggerViewRender","triggerViewDestroy","publiclyTrigger","requestEventsRender","executeEventRender","triggerAfterEventsRendered","requestEventsUnrender","triggerBeforeEventsDestroyed","requestBusinessHoursRender","businessHourGenerator","renderBusinessHours","requestBusinessHoursUnrender","unrenderBusinessHours","processUnselect","handleDocumentMousedown","delay","getNowIndicatorUnit","initialNowDate","getNow","initialNowQueriedMs","startOf","nowIndicatorTimeoutID","nowIndicatorIntervalID","updateNowIndicator","isDatesRendered","unrenderNowIndicator","renderNowIndicator","isNowIndicatorRendered","clearTimeout","updateSize","totalHeight","isAuto","isResize","scroll","queuedScroll","applyQueuedScroll","applyScroll","queryDateScroll","computeInitialDateScroll","applyDateScroll","reportEventDrop","eventMutation","eventManager","undoFunc","mutateEventsWithId","triggerEventDrop","dateDelta","reportExternalDrop","singleEventDef","isEvent","isSticky","ui","addEventDef","triggerExternalDrop","reportEventResize","triggerEventResize","endDelta","durationDelta","renderSelectionFootprint","reportSelection","triggerSelect","footprintToDateProfile","unrenderSelection","selectEventInstance","selectedEventInstance","unselectEventInstance","getEventSegs","processRangeUnselect","processEventUnselect","ignore","closest","triggerBaseRendered","triggerBaseUnrendered","triggerDayClick","dayEl","isDateInOtherMonth","getUnzonedRangeOption","parseUnzonedRange","hiddenDays","isHiddenDayHash","dayCnt","inArray","trimHiddenDays","inputUnzonedRange","skipHiddenDays","isHiddenDay","inc","isExclusive","out","deps","initialEvents","intervalStart","intervalEnd","fillRenderer","rangeUpdated","displayEventTime","displayEventEnd","eventTimeFormat","computeEventTimeFormat","computeDisplayEventTime","computeDisplayEventEnd","instanceGroup","eventRanges","_getDateProfile","bgRanges","fgRanges","renderBgRanges","renderFgRanges","unrender","unrenderBgRanges","unrenderFgRanges","segs","eventFootprintsToSegs","renderFgSegEls","renderFgSegs","fgSegs","unrenderFgSegs","renderBgSegs","bgSegs","unrenderBgSegs","getSegs","concat","renderSegs","getClasses","getBgClasses","getCss","background-color","getBgColor","filterEl","filterEventRenderEl","disableResizing","hasEventRenderHandlers","hasPublicHandlers","html","renderedSegs","beforeFgSegHtml","fgSegHtml","getSegClasses","isDraggable","legacy","custom","getTimeText","displayEnd","_getTimeText","classNames","objs","getStylingObjs","eventClassName","getSkinCss","border-color","getBorderColor","getTextColor","eventBackgroundColor","eventColor","eventBorderColor","eventTextColor","getFallbackStylingObjs","sortEventSegs","compareEventSegs","seg1","seg2","f1","f2","cf1","cf2","r1","r2","englishMoment","renderFakeFormatString","getParsedFormatString","fakeFormatString","date1","date2","separator","renderParsedFormat","parsedFormat","leftI","rightI","middleI","sameUnits","unzonedDate1","unzonedDate2","renderedParts1","renderFakeFormatStringParts","renderedParts2","leftStr","rightStr","middleStr1","middleStr2","middleStr","isSame","processMaybeMarkers","parsedFormatStrCache","parseFormatString","chunks","chunkFormatString","buildFakeFormatString","buildSameUnits","match","chunker","splitStringLiteral","maybe","chunk","specialTokens","SPECIAL_TOKEN_MARKER","MAYBE_MARKER","PART_SEPARATOR","tokenInfo","units","largeTokenMap","fakePart","fakeRender","fakeParts","MAYBE_REGEXP","m0","m1","candidate","best","RegExp","t","T","Y","M","W","w","D","_watchers","_props","applyGlobalWatchers","constructed","_globalWatchArgs","newProps","setProps","reset","oldProps","changeset","names","changedProps","changedCnt","depList","startFunc","stopFunc","unwatch","_watchDeps","watcher","teardown","queuedChangeCnt","depCnt","satisfyCnt","values","bindTuples","isCallingStop","onBeforeDepChange","depName","isOptional","onDepChange","flash","RecurringEventDef_1","eventInput","EventDefDateMutation","clearEnd","forceTimed","dateProfile0","dateProfile1","subtractDates","date0","endDiff","mutation","subtract","setDateDelta","setEndDelta","eventDateProfile","shouldRezone","startDelta","applyTimezone","setStartDelta","themeName","themeClass","themeClassHash","getThemeSystemClass","themeSetting","JqueryUiTheme_1","StandardTheme_1","setRawEventDefs","currentTimezone","isHorizontal","isVertical","forcedOffsetParentEl","offsetParent","offsetParentEl","boundingRect","queryBoundingRect","buildElHorizontals","buildElVerticals","lefts","rights","tops","bottoms","ensureBuilt","getHorizontalIndex","leftOffset","getVerticalIndex","topOffset","getLeftOffset","leftIndex","getLeftPosition","getRightOffset","getRightPosition","getWidth","getTopOffset","topIndex","getTopPosition","getBottomOffset","getBottomPosition","getHeight","scrollParentEl","isPointInBounds","isLeftInBounds","isTopInBounds","isInteracting","isDistanceSurpassed","isDelayEnded","isTouch","isGeneric","shouldCancelTouchScroll","scrollAlwaysKills","isAutoScroll","scrollSensitivity","scrollSpeed","scrollIntervalMs","startInteraction","extraOptions","minDistance","distance","originX","originY","bindHandlers","initAutoScroll","startDelay","handleDistanceSurpassed","endInteraction","endDrag","delayTimeoutId","destroyAutoScroll","unbindHandlers","drag","handleMove","dragstop","touchmove","handleTouchScroll","startDrag","updateAutoScroll","initialEv","handleDelayEnd","handleDebouncedScroll","endAutoScroll","scrollBounds","topCloseness","bottomCloseness","leftCloseness","rightCloseness","sensitivity","bounds","topVel","leftVel","setScrollVel","scrollTopVel","scrollLeftVel","constrainScrollVel","scrollIntervalId","scrollIntervalFunc","frac","updateDayTable","daysPerRow","rowCnt","msToUtcMoment","renderUnzonedRange","dayIndex","dayIndices","dayDates","isBefore","breakOnWeeks","updateDayTableCols","colCnt","computeColCnt","colHeadFormat","computeColHeadFormat","getCellDate","col","getCellDayIndex","getCellRange","getColDayIndex","getDateDayIndex","dayOffset","sliceRangeByRow","rowFirst","rowLast","segFirst","segLast","normalRange","computeDayRange","rangeFirst","rangeLast","firstRowDayIndex","lastRowDayIndex","sliceRangeByDay","renderHeadHtml","renderHeadTrHtml","renderHeadIntroHtml","renderIntroHtml","renderHeadDateCellsHtml","htmls","renderHeadDateCellHtml","colspan","otherAttrs","innerHtml","isDateValid","getDayClasses","buildGotoAnchorHtml","forceOff","renderBgTrHtml","renderBgIntroHtml","renderBgCellsHtml","renderBgCellHtml","bookendCells","trEl","introHtml","buildEventInstanceGroup","hasAllDayBusinessHours","renderEventFootprints","fillSegTag","elsByFill","renderFootprint","componentFootprintToSegs","buildSegEls","attachSegEls","reportEls","buildSegHtml","eventRenderer","renderComponentFootprint","fabricateEventFootprint","renderEventDraggingFootprints","sourceSeg","renderEventResizingFootprints","extraClassNames","opacity","helperEls","dummyInstance","dummyEvent","Interaction_1","handleMouseover","handleMouseout","mousedOverSeg","DateClicking_1","Popover_1","DayGridEventRenderer_1","DayGridHelperRenderer_1","DayGridFillRenderer_1","cellWeekNumbersVisible","bottomCoordPadding","isRigid","leftCol","rightCol","renderDates","renderGrid","unrenderDates","removeSegPopover","headContainerEl","renderDayRowHtml","cellEls","rowCoordCache","colCoordCache","getCellEl","getIsNumbersVisible","renderNumberTrHtml","getIsDayNumbersVisible","renderNumberIntroHtml","renderNumberCellsHtml","renderNumberCellHtml","weekCalcFirstDoW","isDayNumberVisible","firstDayOfWeek","getCellHit","getHitFootprint","getHitEl","getOwnEventSegs","popoverSegs","renderDrag","renderHighlight","helperRenderer","unrenderDrag","unrenderHighlight","renderEventResize","unrenderEventResize","segPopover","hide","limitRows","levelLimit","rowLevelLimit","rowStructs","unlimitRow","computeRowLevelLimit","limitRow","iterInnerHeights","childNode","trHeight","rowEl","rowHeight","trEls","tbodyEl","levelSegs","cellMatrix","limitedNodes","segsBelow","totalSegsBelow","colSegsBelow","td","rowspan","segMoreNodes","moreTd","moreWrap","moreLink","rowStruct","moreNodes","emptyCellsUntil","endCol","getCellSegs","renderMoreLink","segLevels","attr","after","moreEls","limitedEls","hiddenSegs","getMoreLinkText","clickOption","moreEl","allSegs","reslicedAllSegs","resliceDaySegs","reslicedHiddenSegs","showSegPopover","zoomTo","topEl","content","renderSegPopoverContent","parentEl","autoHide","viewportConstrain","triggerBeforeEventSegsDestroyed","triggerAfterEventSegsRendered","segContainer","dayDate","dayEnd","dayRange","newSegs","num","startLevel","segMatrix","level","eventRendererClass","businessHourRendererClass","helperRendererClass","fillRendererClass","makeDayGridSubclass","SuperClass","colWeekNumbersVisible","weekNumberStyleAttr","weekStart","BasicViewDateProfileGenerator_1","dayGrid","instantiateDayGrid","hasRigidRows","addChild","scroller","dayGridClass","renderSkeleton","dayGridContainerEl","dayGridEl","renderSkeletonHtml","unrenderSkeleton","weekNumberWidth","scrollerHeight","headRowEl","computeScrollerHeight","setGridHeight","isOverlapsAllowedByFunc","overlapEventFootprints","overlapFunc","subjectEventInstance","isOverlapEventInstancesAllowed","overlapEventInstance","overlapEventDef","overlapVal","subjectLegacyInstance","_calendar","peerEventInstances","getPeerEventInstances","peerEventRanges","peerEventFootprints","constraintVal","eventAllowFunc","isFootprintAllowed","getEventInstancesWithoutId","selectAllowFunc","getEventInstances","constraintFootprints","constraintValToFootprints","isFootprintWithinConstraints","collectOverlapEventFootprints","footprintContainsFootprint","buildCurrentBusinessFootprints","parseEventDefToInstances","eventInstancesToFootprints","parseFootprints","getEventInstancesWithId","targetFootprint","footprintsIntersect","currentPeriod","eventRangeToEventFootprints","outerFootprint","innerFootprint","footprint0","footprint1","ParsableModelMixin","propDefs","proto","standardPropMap","manualProps","EventInstance","RecurringEventDef","zonedDayStart","instanceStart","instanceEnd","unzonedDate","unzonedEnd","instances","dowHash","setDow","dowNumbers","dow","EventRange","BUSINESS_HOUR_EVENT_DEFAULTS","rawComplexDef","buildEventDefs","rawDefs","requireDow","defs","buildEventDef","rawDef","fullRawDef","StandardTheme","widget","widgetHeader","widgetContent","buttonGroup","button","cornerLeft","cornerRight","stateDefault","stateActive","stateDisabled","stateHover","stateDown","popoverHeader","popoverContent","headerRow","dayRow","listView","JqueryUiTheme","pushLoading","popLoading","ajaxSettings","onSuccess","success","onError","requestParams","buildRequestParams","ajax","AJAX_DEFAULTS","xhr","callbackRes","statusText","errorThrown","customRequestParams","params","dataType","cache","q","isPaused","tryStart","getIsIdle","canRunNext","runRemaining","runTask","waitsByNamespace","taskFunc","waitMs","waitNamespace","delayWait","clearWait","compoundTask","startWait","spawnWait","waitId","shouldAppend","convertEventsPayloadToLegacyArray","legacyEvents","Component_1","util_2","hitsNeededDepth","childrenByUid","businessHourRenderer","child","removeChild","callChildren","_getCalendar","getBusinessHourSegs","getOwnBusinessHourSegs","iterChildren","showEventsWithId","hideEventsWithId","renderedHelper","getSafeHitFootprint","eventFootprintToSegs","gotoOptions","finalOptions","stringify","getAllDayHtml","noThemeHighlight","currentRangeAs","startDay","endTimeMS","endDay","isMultiDayRange","filterLegacyEventInstances","legacyEventInstances","legacyQuery","legacyEventInstance","Iterator_1","Toolbar_1","OptionsManager_1","ViewSpecManager_1","EventManager_1","overrides","loadingLevel","ignoreUpdateViewSize","freezeContentHeightDepth","viewsByType","viewSpecManager","initMomentInternals","initCurrentDate","initEventManager","getView","triggerInfo","optHandler","option","newOptionHash","instantiateView","viewType","spec","getViewSpec","isValidViewType","changeView","dateOrRange","recordOverrides","visibleRange","currentDate","renderView","newDate","getUnitViewSpec","defaultDateInput","prevInfo","buildPrev","nextInfo","buildNext","gotoDate","zonedDateInput","incrementDate","delta","getDate","contentEl","elementVisible","calcSize","initialRender","anchorEl","customAction","opts","themeSystem","widgetClass","businessHours","toggleClass","prependTo","initToolbars","renderHeader","renderFooter","windowResizeProxy","windowResize","clearView","toolbarsManager","proxyCall","bindViewHandlers","setToolbarsTitle","updateToolbarButtons","unbindViewHandlers","newView","oldView","currentView","reinitView","getSuggestedViewHeight","suggestedViewHeight","isHeightAuto","_calcSize","contentHeightInput","heightInput","queryToolbarsHeight","forceFreezeContentHeight","computeHeaderOptions","footer","computeFooterOptions","extraClasses","layout","setToolbarOptions","now","todayInfo","reduce","accumulator","toolbar","zonedStartInput","zonedEndInput","buildSelectFootprint","_week","monthNames","_months","monthNamesShort","_monthsShort","dayNames","_weekdays","dayNamesShort","_weekdaysShort","localizeMoment","getIsAmbigTimezone","adjustedZonedDate","zonedDate","toArray","timeAdjust","asMilliseconds","ignoreEnd","humanizeDuration","humanize","rangeInput","rawSources","singleRawSource","freeze","rawSource","addSource","thaw","getEventEnd","zonedStart","rerenderEvents","refetchEvents","refetchAllSources","renderEvents","eventInputs","renderEvent","stickySource","removeEvents","legacyInstances","idMap","getEventDefByUid","clientEvents","updateEvents","eventPropsArray","updateEvent","eventProps","eventDefMutation","getEventSources","otherSources","getEventSourceById","getSourceById","addEventSource","sourceInput","removeEventSources","sourceMultiQuery","sources","removeAllSources","multiQuerySources","removeSource","removeEventSource","sourceQuery","querySources","refetchEventSources","refetchSource","DateProfileGenerator","prevDate","nextDate","forceToValid","currentInfo","isDateAllDay","buildValidRange","buildCurrentRangeInfo","buildRenderRange","adjustActiveRange","buildDateIncrement","dayCount","durationUnit","buildRangeFromDuration","buildRangeFromDayCount","buildCustomVisibleRange","getFallbackDuration","computeRes","alignment","dateIncrementInput","dateIncrementDuration","customAlignment","runningCount","visibleUnzonedRange","fallback","getDraggedElMeta","stick","dataAttrPrefix","HitDragListener_1","dragListener","dragstart","sortstart","accept","listenToExternalDrag","interactionStart","hitOver","mutatedEventInstanceGroup","isAllowed","hitFootprint","computeExternalDrop","hitOut","hitDone","interactionEnd","buildDragListener","resizeMutation","dragStart","segResizeStart","origHitFootprint","computeEventStartResizeMutation","computeEventEndResizeMutation","buildMutatedEventInstanceGroup","segResizeStop","startFootprint","endFootprint","origEventFootprint","origRange","MouseFollower_1","getSelectionDelay","handleMousedown","settings","buildSelectListener","mouseFollower","additionalClass","revertDuration","zIndex","segDragStart","origFootprint","computeEventDropMutation","stop","segDragStop","computeEventDateMutation","getDelay","selectionFootprint","computeSelection","wholeFootprint","computeSelectionFootprint","groupEventFootprintsByAllDay","timed","agendaTimeGridMethods","agendaDayGridMethods","timeGrid","instantiateTimeGrid","timeGridClass","timeGridWrapEl","timeGridEl","axisStyleAttr","axisWidth","colEls","noScrollRowEls","bottomRuleEl","getTotalSlatHeight","computeTimeTop","dayEventsPayload","timedEventsPayload","groups","weekText","TimeGridEventRenderer_1","TimeGridHelperRenderer_1","TimeGridFillRenderer_1","AGENDA_STOCK_SUB_DURATIONS","processOptions","sliceRangeByTimes","segRange","dayRanges","slotDuration","snapDuration","snapsPerSlot","labelFormat","labelInterval","computeLabelInterval","slotsPerLabel","renderSlats","renderColumns","unrenderColumns","slatContainerEl","renderSlatRowHtml","slatEls","slatCoordCache","slotDate","isLabeled","axisHtml","slotTime","slotIterator","renderContentSkeleton","unrenderContentSkeleton","skeletonEl","cellHtml","contentSkeletonEl","colContainerEls","helperContainerEls","fgContainerEls","bgContainerEls","highlightContainerEls","businessContainerEls","groupSegsByCol","segsByCol","attachSegsByCol","containerEls","computeDateTop","nowIndicatorEls","updateSegVerticals","businessSegs","startOfDayDate","slatIndex","slatRemainder","slatCoverage","computeSegVerticals","assignSegVerticals","eventMinHeight","generateSegVerticalCss","colIndex","slatTop","slatHeight","partial","localSnapIndex","snapIndex","snapTop","snapBottom","snap","computeSnapTime","BasicViewDateProfileGenerator","weekday","MonthViewDateProfileGenerator_1","ListEventRenderer_1","ListEventPointing_1","viewEnd","renderEmptyMessage","renderSegList","daySegs","segsByDay","groupSegsByDay","tableEl","dayHeaderHtml","mainFormat","altFormat","_element","singleRes","removeData","Iterator","results","Toolbar","toolbarOptions","viewsWithButtons","newToolbarOptions","sections","renderSection","sectionEl","buttonStr","calendarCustomButtons","calendarButtonTextOverrides","calendarButtonText","buttonGroupStr","groupEl","groupChildren","isOnlyButtons","buttonClick","buttonIcon","buttonInnerHtml","buttonClasses","buttonEl","buttonAriaAttr","buttonTextOverride","buttonTextDefault","hasClass","not","hover","first","updateTitle","activateButton","deactivateButton","disableButton","enableButton","getViewsWithButtons","OptionsManager","dynamicOverrides","compute","optionName","optionCnt","localeDefaults","dirDefaults","rawOptions","clearCache","ViewSpecManager","viewSpecCache","buildViewSpec","viewTypes","singleUnit","requestedViewType","viewOverrides","specChain","defaultsChain","overridesChain","buildViewSpecOptions","buildViewSpecButtonText","queryButtonText","buttonTextKey","isSourcesEquivalent","source0","source1","EventPeriod_1","EventManager","force","isWithinRange","setPeriod","whenReleased","requestSource","doomedSource","purgeSource","purgeAllSources","requestSources","getSources","matchInputs","matchingSources","matchInput","grep","eventPeriod","unbindPeriod","bindPeriod","eventId","undoFuncs","getEventDefsById","removeEventDef","defCopy","allInstances","EventPeriod","pendingCnt","freezeDepth","stuntedReleaseCnt","releaseCnt","requestsByUid","eventDefsByUid","eventDefsById","eventInstanceGroupsById","addEventDefs","tryRelease","completedCnt","eventDefUid","addEventInstance","isEmptyObject","removeEventInstancesForDef","matchingInstances","currentEventInstance","release","MouseFollower","sourceEl","isFollowing","isHidden","isAnimating","y0","x0","topDelta","leftDelta","updatePosition","shouldRevert","complete","top0","left0","animate","getEl","visibility","sourceOffset","DateClicking","dayClickHit","buildSlotSegLevels","levels","computeSlotSegCollisions","computeForwardSlotSegs","forwardSegs","computeSlotSegPressures","forwardSeg","forwardPressure","otherSegs","TimeGridEventRenderer","renderFgSegsIntoContainers","updateFgSegCoords","timeText","fullTimeText","startTimeText","isResizableFromStart","isResizableFromEnd","skinCss","zonedEnd","computeFgSegHorizontals","assignFgSegHorizontals","level0","computeFgSegForwardBack","seriesBackwardPressure","seriesBackwardCoord","forwardCoord","sortForwardSegs","backwardCoord","compareForwardSegs","generateFgSegHorizontalCss","shouldOverlap","TimeGridHelperRenderer","helperNodes","TimeGridFillRenderer","Popover","documentMousedown","viewportTop","viewportLeft","viewportOffset","windowEl","viewportEl","isDaySegCollision","otherSeg","compareDaySegCols","DayGridEventRenderer","renderSegRows","rowNode","pop","segRows","groupSegRows","renderSegRow","rowSegs","loneCellMatrix","tr","buildSegLevels","levelCnt","tbody","titleHtml","timeHtml","DayGridHelperRenderer","skeletonTopEl","skeletonTop","DayGridFillRenderer","renderFillRow","startCol","MonthViewDateProfileGenerator","ListEventRenderer","bgColor","ListEventPointing","isDefaultPrevented","Bootstrap3Theme_1","Bootstrap4Theme_1","Bootstrap3Theme","tableGrid","tableList","tableListHeading","popover","Bootstrap4Theme","fixedWeekCount","listDayFormat","noEventsMessage","listDayAltFormat","show-modal","resources-checkboxes","number-of-resources","add-reservation","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_MySchedule_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_73dcc08a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_MySchedule_vue__","readonly","change","fab","dark","multi-line","parsed-nodes","update-calendar","selected-resources","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_NodesOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_18fc6060_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_NodesOverview_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchGenerator_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_14692e23_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchGenerator_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchBox_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4fc23b68_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchBox_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_LineChart_vue__","hide-actions","expanded","owner","pid","chart-data","rerender-chart","update-chart","default-node","default-resource-type","default-metric","resources-indexes","chart-datasets","argsArray","size","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TasksOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c0181bc6_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TasksOverview_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskCreate_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c5e32eee_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskCreate_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLine_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_68056994_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLine_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineParameter_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_dcbdcc6c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineParameter_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineEnvVariable_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_3a9cfdb2_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineEnvVariable_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineTfConfig_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ed523d5c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineTfConfig_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TfConfigEdit_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1f240f3d_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TfConfigEdit_vue__","auto-grow","justify-end","medium","task-type","task-index","tf-cluster","enable-smart-tf-config","enable-tf-config","tf-config","tf-config-port","tf-config-task-type","tf-config-task-index","psWorkerParameterChanged","block","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskEdit_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ab402584_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskEdit_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskSchedule_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_21a65550_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskSchedule_vue__","spawnMenu","terminateMenu","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLog_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4291c17c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLog_vue__","staticStyle","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskTemplateChooser_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_d8f593d8_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskTemplateChooser_vue__","chosen-template","primary-title","rows-per-page-items","font-size","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_UsersOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58aecb3a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_UsersOverview_vue__","createdAt","__WEBPACK_IMPORTED_MODULE_0_vue__","__WEBPACK_IMPORTED_MODULE_1_vuex__","__WEBPACK_IMPORTED_MODULE_2__state__","__WEBPACK_IMPORTED_MODULE_3__actions__","__WEBPACK_IMPORTED_MODULE_4__mutations__","Vuex","Store","actions","mutations","callingAPI","searching","userInfo","messages","1","2","notifications","TOGGLE_LOADING","TOGGLE_SEARCHING","SET_USER","SET_ROLE","SET_ID","SET_ACCESS_TOKEN","SET_REFRESH_TOKEN","urlParser","arr","toDateString","createElement","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_535f2ac0_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__"],"mappings":"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CA0S,eAAA,EACAC,eAAA,EACAC,aAAA,EACAC,aAAA,EACAT,aAAA,GACAE,aAAA,GACAE,WAAA,GACAC,WAAA,GACAK,UAAA,EACAC,iBAAA,GACAC,uBAAA,GACAf,MAAA,IAIA3P,SACA4P,MAAA,WACAhQ,KAAA4Q,UAAA,EACA5Q,KAAA+J,MAAA,UAGAgH,WAAA,WACA,GAAAA,IAAA,CACA,QAAAC,KAAAhR,MAAA4J,oBACA,GAAA5J,KAAA4J,oBAAAoH,GAAAvJ,QAAA,CACAsJ,GAAA,CACA,OAGA,MAAAA,IAGA5H,YAAA,WACA,GAAAwB,EACA,IAAA3K,KAAA+Q,aACA,OAAAnJ,GAAA,EAAAA,EAAA5H,KAAA4P,kBAAAhI,IACA5H,KAAA4J,oBAAAhC,GAAAH,UACAkD,GACAvB,MAAApJ,KAAA6Q,iBACAxH,YAAArJ,KAAA8Q,uBACAvH,MAAAoG,IAAA3P,KAAAkQ,aAAA,IAAAlQ,KAAAoQ,cAAAjG,cACAX,IAAAmG,IAAA3P,KAAAsQ,WAAA,IAAAtQ,KAAAuQ,YAAApG,cACAb,WAAAtJ,KAAA4J,oBAAAhC,GAAApB,KACAqE,OAAAoG,SAAAjR,KAAAC,OAAAC,MAAAoE,KAEAtE,KAAA6L,eAAAlB,QAIA3K,MAAA4Q,UAAA,MV2wCQ,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACC,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CAC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AC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,GACAC,UAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,UAAA,GACAC,aAAA,GACAC,OAAA,GACAC,UAAA,GACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,gBAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,UAAA,IACAC,aAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,UAAA,IACAC,aAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,YAAA,IACAC,eAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,QAAA,IACAC,WAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,UAAA,IACAC,aAAA,IACAC,QAAA,IACAC,WAAA,IACAC,OAAA,IACAC,UAAA,IACAC,QAAA,IACAC,WAAA,IACAC,QAAA,IACA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ACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CAEA,SAAAz9C,EAAAu2B,EAAAr2B,GA0NA,QAAAkoF,GAAAC,EAAAC,EAAAC,GACA,GAAA99E,EACA,KAAAA,EAAA,EAAeA,EAAA49E,EAAAxnF,OAAmC4J,IAClD,IAAA69E,EAAAD,EAAA59E,GAAA4hD,cAAArI,WAAAukC,IAAAvkC,WAAA,MACA,QAGA,UAEA,QAAAwkC,GAAAH,EAAAE,GACA,GACA99E,GACAg+E,EACAC,EACAC,EAJAC,EAAAL,EAAAvkC,UAKA,KAAAv5C,EAAA,EAAeA,EAAA49E,EAAAxnF,OAAmC4J,IAAA,CAMlD,GALAg+E,EAAAJ,EAAA59E,GAAA4hD,cACAq8B,EAAAD,EAAAhkC,KAIA,KADAkkC,EAAAD,EAAArvB,cAEA,QAEA,sBAAAsvB,KACAA,EAAAF,EAAAzkC,WAAA4kC,GACA,SAIA,SAtPAp9E,OAAA2lB,eAAAoF,EAAA,cAA8CphB,OAAA,GAC9C,IAAA+wC,GAAAhmD,EAAA,GACAimD,EAAAjmD,EAAA,IACA69C,EAAA79C,EAAA,IACAymD,EAAAzmD,EAAA,GACAshD,EAAAthD,EAAA,IACA+lD,EAAA,WACA,QAAAA,GAAAmgB,EAAAyiB,GACAhmF,KAAAujE,eACAvjE,K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","file":"static/js/app.3d22f1efa5bc05f6f25f.js","sourcesContent":["webpackJsonp([1],[\n/* 0 */,\n/* 1 */,\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_axios__ = __webpack_require__(54);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_axios___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_axios__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(31);\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n request: function request(method, uri, token) {\n var data = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n if (!method) {\n console.error('API function call requires method argument');\n return;\n }\n\n if (!uri) {\n console.error('API function call requires uri argument');\n return;\n }\n\n var url = __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].serverURI + uri;\n if (token !== null) {\n __WEBPACK_IMPORTED_MODULE_0_axios___default.a.defaults.headers.common['Authorization'] = token;\n }\n return __WEBPACK_IMPORTED_MODULE_0_axios___default()({ method: method, url: url, data: data });\n }\n});\n\n/***/ }),\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */,\n/* 7 */,\n/* 8 */,\n/* 9 */,\n/* 10 */,\n/* 11 */,\n/* 12 */,\n/* 13 */,\n/* 14 */,\n/* 15 */,\n/* 16 */,\n/* 17 */,\n/* 18 */,\n/* 19 */,\n/* 20 */,\n/* 21 */,\n/* 22 */,\n/* 23 */,\n/* 24 */,\n/* 25 */,\n/* 26 */,\n/* 27 */,\n/* 28 */,\n/* 29 */,\n/* 30 */,\n/* 31 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n serverURI: '',\n apiVersion: '',\n version: '',\n fixedLayout: false,\n hideLogoOnMobile: false\n});\n\n/***/ }),\n/* 32 */,\n/* 33 */,\n/* 34 */,\n/* 35 */,\n/* 36 */,\n/* 37 */,\n/* 38 */,\n/* 39 */,\n/* 40 */,\n/* 41 */,\n/* 42 */,\n/* 43 */,\n/* 44 */,\n/* 45 */,\n/* 46 */,\n/* 47 */,\n/* 48 */,\n/* 49 */,\n/* 50 */,\n/* 51 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__config__ = __webpack_require__(31);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dash_BaseSidebar_vue__ = __webpack_require__(257);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hideseek__ = __webpack_require__(263);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hideseek___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_hideseek__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__api__ = __webpack_require__(2);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'TheDash',\n\n components: {\n BaseSidebar: __WEBPACK_IMPORTED_MODULE_1__dash_BaseSidebar_vue__[\"a\" /* default */]\n },\n\n data: function data() {\n return {\n year: new Date().getFullYear(),\n classes: {\n fixed_layout: __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].fixedLayout,\n hide_logo: __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].hideLogoOnMobile\n },\n alert: false,\n errorMessage: ''\n };\n },\n\n computed: {\n displayName: function displayName() {\n return this.$store.state.user;\n },\n version: function version() {\n return __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].version;\n },\n apiVersion: function apiVersion() {\n return __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].apiVersion;\n }\n },\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n this.alert = true;\n },\n\n changeloading: function changeloading() {\n this.$store.commit('TOGGLE_SEARCHING');\n },\n\n\n logout: function logout() {\n var _this = this;\n\n if (this.$store.state.accessToken !== null) {\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('delete', '/user/logout', this.$store.state.accessToken).then(function (response) {\n _this.$store.commit('SET_ACCESS_TOKEN', null);\n\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', null);\n }\n if (_this.$store.state.refreshToken !== null) {\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('delete', '/user/logout/refresh_token', _this.$store.state.refreshToken).then(function (response) {\n _this.$store.commit('SET_REFRESH_TOKEN', null);\n if (window.localStorage) {\n window.localStorage.setItem('refreshToken', null);\n }\n }).catch(function (error) {\n _this.handleError(error);\n });\n }\n }).catch(function (error) {\n _this.handleError(error);\n });\n }\n this.$store.commit('SET_USER', null);\n this.$store.commit('SET_ROLE', null);\n\n if (window.localStorage) {\n window.localStorage.setItem('user', null);\n window.localStorage.setItem('role', null);\n }\n this.$router.push('/login');\n }\n }\n});\n\n/***/ }),\n/* 52 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BaseSidebarMenu_vue__ = __webpack_require__(259);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'BaseSidebar',\n\n components: { BaseSidebarMenu: __WEBPACK_IMPORTED_MODULE_0__BaseSidebarMenu_vue__[\"a\" /* default */] },\n\n mounted: function mounted() {\n window.jQuery('[data-toggle=\"hideseek\"]').off().hideseek();\n }\n});\n\n/***/ }),\n/* 53 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'BaseSidebarMenu'\n});\n\n/***/ }),\n/* 54 */,\n/* 55 */,\n/* 56 */,\n/* 57 */,\n/* 58 */,\n/* 59 */,\n/* 60 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__api__ = __webpack_require__(2);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'Login',\n\n data: function data(router) {\n return {\n section: 'Login',\n username: '',\n password: '',\n modalUsername: '',\n modalEmail: '',\n modalPassword: '',\n modalPassword2: '',\n alert: false,\n modalAlert: false,\n created: false,\n errorMessage: '',\n showModal: false,\n entry: ''\n };\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n },\n\n requestEntry: function requestEntry() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('get', '/user/authorized_keys_entry', this.$store.state.accessToken).then(function (response) {\n _this.entry = response.data;\n _this.showModal = true;\n }).catch(function (error) {\n _this.handleError(error);\n _this.modalAlert = true;\n });\n },\n copyEntryToClipboard: function copyEntryToClipboard() {\n var entryInput = document.querySelector('#entry');\n entryInput.setAttribute('type', 'text');\n entryInput.select();\n try {\n if (document.execCommand('copy')) {\n alert('Authorized keys entry is in your clipboard');\n } else {\n alert('Something went wrong, try again');\n }\n } catch (e) {\n alert('Unable to copy');\n }\n window.getSelection().removeAllRanges();\n },\n createUser: function createUser() {\n var _this2 = this;\n\n if (this.modalPassword === this.modalPassword2) {\n var modalUsername = this.modalUsername,\n modalEmail = this.modalEmail,\n modalPassword = this.modalPassword;\n\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('post', '/user/ssh_signup', this.$store.state.accessToken, { 'username': modalUsername, 'email': modalEmail, 'password': modalPassword }).then(function (response) {\n _this2.showModal = false;\n _this2.created = true;\n }).catch(function (error) {\n _this2.handleError(error);\n _this2.modalAlert = true;\n });\n } else {\n this.errorMessage = 'Passwords do not match';\n this.modalAlert = true;\n }\n },\n checkCreds: function checkCreds() {\n var _this3 = this;\n\n var username = this.username,\n password = this.password;\n\n\n this.toggleLoading();\n this.resetResponse();\n this.$store.commit('TOGGLE_LOADING');\n /* Making API call to authenticate a user */\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('post', '/user/login', this.$store.state.accessToken, { 'username': username, 'password': password }).then(function (response) {\n _this3.toggleLoading();\n\n var data = response.data;\n /* Checking if error object was returned from the server */\n if (data.error) {\n var errorName = data.error.name;\n if (errorName) {\n _this3.response = errorName === 'InvalidCredentialsError' ? 'Username/Password incorrect. Please try again.' : errorName;\n } else {\n _this3.response = data.error;\n }\n\n return;\n }\n /* Setting user in the state and caching record to the localStorage */\n if (username) {\n var accessToken = 'Bearer ' + data.access_token;\n var refreshToken = 'Bearer ' + data.refresh_token;\n var object = JSON.parse(atob(data.access_token.split('.')[1]));\n var id = object.identity;\n var role = object.user_claims.roles.length === 2 ? 'admin' : 'user';\n _this3.$store.commit('SET_USER', username);\n _this3.$store.commit('SET_ROLE', role);\n _this3.$store.commit('SET_ID', id);\n _this3.$store.commit('SET_ACCESS_TOKEN', accessToken);\n _this3.$store.commit('SET_REFRESH_TOKEN', refreshToken);\n\n if (window.localStorage) {\n window.localStorage.setItem('user', __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(username));\n window.localStorage.setItem('accessToken', accessToken);\n window.localStorage.setItem('refreshToken', refreshToken);\n window.localStorage.setItem('role', role);\n window.localStorage.setItem('userId', id);\n }\n _this3.$router.push('/');\n }\n }).catch(function (error) {\n _this3.handleError(error);\n _this3.alert = true;\n });\n },\n toggleLoading: function toggleLoading() {\n this.loading = this.loading === '' ? 'loading' : '';\n },\n resetResponse: function resetResponse() {\n this.response = '';\n }\n }\n});\n\n/***/ }),\n/* 61 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'NotFound'\n});\n\n/***/ }),\n/* 62 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_lodash__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reserve_resources_FullCalendar_vue__ = __webpack_require__(290);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reserve_resources_MySchedule_vue__ = __webpack_require__(301);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n FullCalendar: __WEBPACK_IMPORTED_MODULE_2__reserve_resources_FullCalendar_vue__[\"a\" /* default */],\n MySchedule: __WEBPACK_IMPORTED_MODULE_3__reserve_resources_MySchedule_vue__[\"a\" /* default */]\n },\n\n data: function data() {\n return {\n nodes: {},\n parsedNodes: [],\n alert: false,\n snackbar: false,\n errorMessage: '',\n updateCalendar: false,\n selectedResources: [],\n nodeCheckbox: false,\n resourceTypeCheckbox: false,\n resourceCheckbox: false,\n showSchedule: false,\n interval: null,\n time: 30000\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/nodes/metrics', this.$store.state.accessToken).then(function (response) {\n _this.nodes = response.data;\n _this.parseData();\n }).catch(function (error) {\n _this.handleError(error);\n });\n var self = this;\n this.interval = setInterval(function () {\n self.updateCalendar = !self.updateCalendar;\n }, this.time);\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.showSnackbar(error.message);\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.showSnackbar(error.response.data);\n } else {\n this.showSnackbar(error.response.data.msg);\n }\n }\n },\n\n showSnackbar: function showSnackbar(message) {\n this.errorMessage = message;\n this.snackbar = true;\n },\n\n\n loadResources: function loadResources(resources) {\n this.selectedResources = [];\n for (var id in resources) {\n if (resources[id].selected) {\n var obj = {\n nodeName: resources[id].nodeName,\n name: resources[id].resourceName,\n uuid: id,\n index: resources[id].resourceIndex\n };\n this.selectedResources.push(obj);\n }\n }\n this.updateCalendar = !this.updateCalendar;\n },\n\n toggle: function toggle(node) {\n node.open = !node.open;\n },\n\n parseData: function parseData() {\n var node, resourceType, resources, resourceTypes, tempResource, tempResourceType, tempNode, orderedResources;\n for (var nodeName in this.nodes) {\n resourceTypes = [];\n node = this.nodes[nodeName];\n resources = [];\n for (var resourceTypeName in node) {\n if (resourceTypeName === 'GPU') {\n resourceType = node[resourceTypeName];\n for (var resourceUUID in resourceType) {\n tempResource = {\n nodeName: nodeName,\n resourceUUID: resourceUUID,\n resourceName: resourceType[resourceUUID].name,\n resourceIndex: resourceType[resourceUUID].index,\n metrics: resourceType[resourceUUID].metrics\n };\n tempResource.metrics['checked'] = true;\n resources.push(tempResource);\n }\n }\n orderedResources = __WEBPACK_IMPORTED_MODULE_1_lodash___default.a.orderBy(resources, 'resourceIndex');\n tempResourceType = {\n name: resourceTypeName,\n checked: true,\n open: false,\n resources: orderedResources\n };\n resourceTypes.push(tempResourceType);\n }\n tempNode = {\n nodeName: nodeName,\n checked: true,\n open: false,\n resourceTypes: resourceTypes\n };\n this.parsedNodes.push(tempNode);\n }\n this.loadCalendar();\n },\n loadCalendar: function loadCalendar() {\n var node, resourceType, resource, obj;\n this.selectedResources = [];\n for (var i = 0; i < this.parsedNodes.length; i++) {\n node = this.parsedNodes[i];\n for (var j = 0; j < node.resourceTypes.length; j++) {\n resourceType = node.resourceTypes[j];\n for (var k = 0; k < resourceType.resources.length; k++) {\n resource = resourceType.resources[k];\n if (resource.metrics.checked) {\n obj = {\n nodeName: resource.nodeName,\n name: resource.resourceName,\n uuid: resource.resourceUUID,\n index: resource.resourceIndex\n };\n this.selectedResources.push(obj);\n }\n }\n }\n }\n this.updateCalendar = !this.updateCalendar;\n }\n }\n});\n\n/***/ }),\n/* 63 */,\n/* 64 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__FullCalendarReserve_vue__ = __webpack_require__(292);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__FullCalendarInfo_vue__ = __webpack_require__(296);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jquery__ = __webpack_require__(194);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_jquery__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_moment__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_lodash__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n__webpack_require__(299);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n FullCalendarReserve: __WEBPACK_IMPORTED_MODULE_0__FullCalendarReserve_vue__[\"a\" /* default */],\n FullCalendarInfo: __WEBPACK_IMPORTED_MODULE_1__FullCalendarInfo_vue__[\"a\" /* default */]\n },\n\n props: {\n nodes: Object,\n selectedResources: Array,\n updateCalendar: Boolean\n },\n\n watch: {\n updateCalendar: function updateCalendar() {\n this.calendar.fullCalendar('refetchEvents');\n }\n },\n\n data: function data() {\n return {\n calendar: null,\n showModalReserve: false,\n showModalInfo: false,\n reservation: {\n title: '',\n description: '',\n resourceId: '',\n start: new Date(),\n end: new Date()\n },\n reservationId: -1,\n startDate: null,\n endDate: null,\n resourcesCheckboxes: [],\n refreshTasks: false,\n parsedNodeNames: []\n };\n },\n\n\n methods: {\n handleError: function handleError(error) {\n this.$emit('handleError', error);\n },\n\n getEvents: function getEvents(start, end, callback) {\n var _this = this;\n\n var resourcesString = '';\n if (this.selectedResources.length > 0) {\n resourcesString = this.selectedResources[0].uuid;\n for (var i = 1; i < this.selectedResources.length; i++) {\n resourcesString += ',' + this.selectedResources[i].uuid;\n }\n }\n var self = this;\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('get', '/reservations?resources_ids=' + resourcesString + '&start=' + start.toISOString() + '&end=' + end.toISOString(), this.$store.state.accessToken).then(function (response) {\n if (self.reservationId !== -1) {\n for (var reservation in response.data) {\n if (response.data[reservation].id === self.reservationId) {\n self.reservation = response.data[reservation];\n self.reservation.start = __WEBPACK_IMPORTED_MODULE_4_moment___default()(self.reservation.start);\n self.reservation.end = __WEBPACK_IMPORTED_MODULE_4_moment___default()(self.reservation.end);\n }\n }\n self.reservationId = -1;\n }\n callback(response.data);\n }).catch(function (error) {\n _this.$emit('handleError', error);\n });\n var obj;\n var previousCheckboxes = [];\n var previousLength = this.resourcesCheckboxes.length;\n for (i = 0; i < previousLength; i++) {\n obj = {\n uuid: this.resourcesCheckboxes[i].uuid,\n checked: this.resourcesCheckboxes[i].checked\n };\n previousCheckboxes[i] = obj;\n }\n this.resourcesCheckboxes = [];\n for (i = 0; i < this.selectedResources.length; i++) {\n var previousChecked = false;\n for (var j = 0; j < previousLength; j++) {\n if (this.selectedResources[i].uuid === previousCheckboxes[j].uuid) {\n previousChecked = previousCheckboxes[j].checked;\n }\n }\n obj = {\n nodeName: this.selectedResources[i].nodeName,\n name: this.selectedResources[i].name,\n uuid: this.selectedResources[i].uuid,\n index: this.selectedResources[i].index,\n checked: previousChecked,\n disabled: false\n };\n this.resourcesCheckboxes[i] = obj;\n }\n this.addResourcesHeader();\n },\n\n addResourcesHeader: function addResourcesHeader() {\n var dayStart = __WEBPACK_IMPORTED_MODULE_5_lodash___default.a.cloneDeep(this.calendar.fullCalendar('getView').start);\n for (var i = 0; i < 7; i++) {\n for (var j = 0; j < this.selectedResources.length; j++) {\n var tempReservation = {\n title: 'GPU' + this.selectedResources[j].index,\n description: this.selectedResources[j].nodeName,\n start: dayStart,\n allDay: true,\n resourceId: this.selectedResources[j].uuid,\n userId: -1\n };\n this.calendar.fullCalendar('renderEvent', tempReservation);\n }\n if (dayStart) dayStart = dayStart.add(1, 'days');\n }\n },\n\n parseNodeNames: function parseNodeNames() {\n for (var nodeName in this.nodes) {\n this.parsedNodeNames.push(nodeName);\n }\n },\n\n setColor: function setColor(resourceIndex, resourceNodeName) {\n var colors = [['#00AA00', '#00AA55', '#28A228', '#26A65B'], // green\n ['#1E90FF', '#00A4A6', '#1F3A93', '#008080'], // blue\n ['#545454', '#708090', '#696969', '#6C7A89'] // gray\n ];\n if (this.parsedNodeNames.length === 0) {\n this.parseNodeNames();\n }\n var colorIndex;\n for (var index in this.parsedNodeNames) {\n if (this.parsedNodeNames[index] === resourceNodeName) {\n colorIndex = index % colors.length;\n }\n }\n var color = colors[colorIndex][resourceIndex % colors[colorIndex].length];\n return color;\n },\n\n updateReservation: function updateReservation(reservation, newTime, newTitle, newDescription) {\n var _this2 = this;\n\n var toUpdate = {};\n if (reservation.start.toISOString() !== newTime[0].toISOString()) {\n toUpdate['start'] = newTime[0].toISOString();\n }\n if (reservation.end.toISOString() !== newTime[1].toISOString()) {\n toUpdate['end'] = newTime[1].toISOString();\n }\n if (reservation.title !== newTitle && newTitle !== '') {\n toUpdate['title'] = newTitle;\n }\n if (reservation.description !== newDescription && newDescription !== '') {\n toUpdate['description'] = newDescription;\n }\n var empty = true;\n for (var key in toUpdate) {\n if (toUpdate.hasOwnProperty(key)) {\n empty = false;\n }\n }\n if (!empty) {\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('put', '/reservations/' + reservation.id, this.$store.state.accessToken, toUpdate).then(function (response) {\n _this2.calendar.fullCalendar('refetchEvents');\n _this2.showModalInfo = false;\n }).catch(function (error) {\n _this2.$emit('handleError', error);\n });\n }\n },\n\n cancelReservation: function cancelReservation(reservation) {\n var _this3 = this;\n\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('delete', '/reservations/' + reservation.id.toString(), this.$store.state.accessToken).then(function (response) {\n _this3.calendar.fullCalendar('refetchEvents');\n _this3.showModalInfo = false;\n }).catch(function (error) {\n _this3.$emit('handleError', error);\n });\n },\n\n addReservation: function addReservation(reservation) {\n var _this4 = this;\n\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('post', '/reservations', this.$store.state.accessToken, reservation).then(function (response) {\n _this4.calendar.fullCalendar('refetchEvents');\n _this4.showModalReserve = false;\n }).catch(function (error) {\n _this4.$emit('handleError', error);\n });\n }\n },\n\n mounted: function mounted() {\n var self = this;\n this.calendar = __WEBPACK_IMPORTED_MODULE_3_jquery___default()(self.$el);\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(window).resize(function () {\n self.calendar.fullCalendar('rerenderEvents');\n });\n this.calendar.fullCalendar({\n allDaySlot: true,\n allDayText: '',\n height: 'auto',\n selectable: true,\n selectOverlap: true,\n slotEventOverlap: false,\n editable: false,\n nowIndicator: true,\n firstDay: 1,\n timezone: 'local',\n defaultView: 'agendaWeek',\n header: {\n left: 'prev,next, today, agendaWeek, week2',\n center: 'title',\n right: ''\n },\n views: {\n week: {\n columnHeaderFormat: 'ddd D/M',\n buttonText: 'One week jump'\n },\n week2: {\n type: 'agendaWeek',\n duration: { days: 7 },\n buttonText: 'One day jump',\n dateIncrement: { days: 1 },\n columnHeaderFormat: 'ddd D/M'\n }\n },\n events: function events(start, end, timezone, callback) {\n self.getEvents(start, end, callback);\n },\n eventRender: function eventRender(event, element) {\n var _this5 = this;\n\n element.find('.fc-title').append('
' + event.description);\n if (self.selectedResources.length > 6) {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('color', 'rgba(0, 0, 0, 0)');\n }\n if (!event.allDay) {\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('get', '/users/' + event.userId, self.$store.state.accessToken).then(function (response) {\n element.find('.fc-title').prepend(response.data.username.bold().big().italics() + '
');\n }).catch(function (error) {\n _this5.$emit('handleError', error);\n });\n }\n },\n eventAfterRender: function eventAfterRender(event, element, view) {\n var columnIndex;\n var resourceIndex;\n var resourceNodeName;\n for (var i = 0; i < self.selectedResources.length; i++) {\n if (self.selectedResources[i].uuid === event.resourceId) {\n columnIndex = i;\n resourceIndex = self.selectedResources[i].index;\n resourceNodeName = self.selectedResources[i].nodeName;\n }\n }\n var hoursWidth = 42;\n var scrollWidth = 16;\n var width = view.el[0].clientWidth;\n var dayWidth = (width - scrollWidth - hoursWidth) / 7;\n var eventSlotWidth = dayWidth / self.selectedResources.length;\n var eventWidth = Math.round(eventSlotWidth - 1).toString() + 'px';\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('width', eventWidth);\n if (columnIndex !== 0) {\n var margin = (Math.round(columnIndex * eventSlotWidth) - 2).toString() + 'px';\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-left', margin);\n } else {\n if (event.allDay) {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-left', '1px');\n } else {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-left', '-2px');\n }\n }\n if (event.allDay) {\n if (columnIndex) {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-top', '-36px');\n }\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('height', 17 * 2);\n }\n var c = self.setColor(resourceIndex, resourceNodeName);\n if (event.userId === self.$store.state.id) {\n c = '#15C02C'; // user specified color: green\n }\n if (event.color !== c) {\n event.color = c;\n self.calendar.fullCalendar('updateEvent', event);\n }\n },\n\n select: function select(startDate, endDate) {\n if (!startDate._ambigTime) {\n for (var i = 0; i < self.selectedResources.length; i++) {\n self.resourcesCheckboxes[i].disabled = false;\n }\n var events = self.calendar.fullCalendar('clientEvents');\n var id;\n for (i = 0; i < events.length; i++) {\n if (!events[i].allDay) {\n if (events[i].end > startDate && events[i].start < endDate) {\n for (var j = 0; j < self.selectedResources.length; j++) {\n if (self.selectedResources[j].uuid === events[i].resourceId) {\n id = j;\n }\n }\n self.resourcesCheckboxes[id].disabled = true;\n }\n }\n }\n self.startDate = startDate.toDate();\n self.endDate = endDate.toDate();\n setTimeout(function () {\n self.showModalReserve = true;\n }, 100);\n }\n },\n\n eventClick: function eventClick(calEvent, jsEvent, view) {\n if (!calEvent.allDay) {\n self.reservationId = calEvent.id;\n self.calendar.fullCalendar('refetchEvents');\n self.refreshTasks = !self.refreshTasks;\n self.showModalInfo = true;\n }\n },\n viewRender: function viewRender(view, element) {\n self.calendar.fullCalendar('refetchEvents');\n }\n });\n }\n});\n\n/***/ }),\n/* 65 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'FullCalendarReserve',\n\n props: {\n showModal: Boolean,\n startDate: Date,\n endDate: Date,\n resourcesCheckboxes: Array,\n numberOfResources: Number,\n addReservation: Function\n\n },\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n startDate: function startDate() {\n if (this.startTime !== null) {\n this.newStartDate = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.startDate).format('YYYY-MM-DD');\n this.newStartTime = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.startDate).format('HH:mm');\n } else {\n this.newStartDate = '';\n this.newStartTime = '';\n }\n },\n endDate: function endDate() {\n if (this.endTime !== null) {\n this.newEndDate = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.endDate).format('YYYY-MM-DD');\n this.newEndTime = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.endDate).format('HH:mm');\n } else {\n this.newEndDate = '';\n this.newEndTime = '';\n }\n }\n },\n\n data: function data() {\n return {\n startTimeMenu: false,\n startDateMenu: false,\n endTimeMenu: false,\n endDateMenu: false,\n newStartDate: '',\n newStartTime: '',\n newEndDate: '',\n newEndTime: '',\n showInfo: false,\n reservationTitle: '',\n reservationDescription: '',\n show: false\n };\n },\n\n\n methods: {\n close: function close() {\n this.showInfo = false;\n this.$emit('close');\n },\n\n anyChecked: function anyChecked() {\n var anyChecked = false;\n for (var checkbox in this.resourcesCheckboxes) {\n if (this.resourcesCheckboxes[checkbox].checked) {\n anyChecked = true;\n break;\n }\n }\n return anyChecked;\n },\n\n reservation: function reservation() {\n var tempReservation;\n if (this.anyChecked()) {\n for (var i = 0; i < this.numberOfResources; i++) {\n if (this.resourcesCheckboxes[i].checked) {\n tempReservation = {\n title: this.reservationTitle,\n description: this.reservationDescription,\n start: __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.newStartDate + 'T' + this.newStartTime).toISOString(),\n end: __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.newEndDate + 'T' + this.newEndTime).toISOString(),\n resourceId: this.resourcesCheckboxes[i].uuid,\n userId: parseInt(this.$store.state.id)\n };\n this.addReservation(tempReservation);\n }\n }\n } else {\n this.showInfo = true;\n }\n }\n }\n});\n\n/***/ }),\n/* 66 */,\n/* 67 */,\n/* 68 */,\n/* 69 */,\n/* 70 */,\n/* 71 */,\n/* 72 */,\n/* 73 */,\n/* 74 */,\n/* 75 */,\n/* 76 */,\n/* 77 */,\n/* 78 */,\n/* 79 */,\n/* 80 */,\n/* 81 */,\n/* 82 */,\n/* 83 */,\n/* 84 */,\n/* 85 */,\n/* 86 */,\n/* 87 */,\n/* 88 */,\n/* 89 */,\n/* 90 */,\n/* 91 */,\n/* 92 */,\n/* 93 */,\n/* 94 */,\n/* 95 */,\n/* 96 */,\n/* 97 */,\n/* 98 */,\n/* 99 */,\n/* 100 */,\n/* 101 */,\n/* 102 */,\n/* 103 */,\n/* 104 */,\n/* 105 */,\n/* 106 */,\n/* 107 */,\n/* 108 */,\n/* 109 */,\n/* 110 */,\n/* 111 */,\n/* 112 */,\n/* 113 */,\n/* 114 */,\n/* 115 */,\n/* 116 */,\n/* 117 */,\n/* 118 */,\n/* 119 */,\n/* 120 */,\n/* 121 */,\n/* 122 */,\n/* 123 */,\n/* 124 */,\n/* 125 */,\n/* 126 */,\n/* 127 */,\n/* 128 */,\n/* 129 */,\n/* 130 */,\n/* 131 */,\n/* 132 */,\n/* 133 */,\n/* 134 */,\n/* 135 */,\n/* 136 */,\n/* 137 */,\n/* 138 */,\n/* 139 */,\n/* 140 */,\n/* 141 */,\n/* 142 */,\n/* 143 */,\n/* 144 */,\n/* 145 */,\n/* 146 */,\n/* 147 */,\n/* 148 */,\n/* 149 */,\n/* 150 */,\n/* 151 */,\n/* 152 */,\n/* 153 */,\n/* 154 */,\n/* 155 */,\n/* 156 */,\n/* 157 */,\n/* 158 */,\n/* 159 */,\n/* 160 */,\n/* 161 */,\n/* 162 */,\n/* 163 */,\n/* 164 */,\n/* 165 */,\n/* 166 */,\n/* 167 */,\n/* 168 */,\n/* 169 */,\n/* 170 */,\n/* 171 */,\n/* 172 */,\n/* 173 */,\n/* 174 */,\n/* 175 */,\n/* 176 */,\n/* 177 */,\n/* 178 */,\n/* 179 */,\n/* 180 */,\n/* 181 */,\n/* 182 */,\n/* 183 */,\n/* 184 */,\n/* 185 */,\n/* 186 */,\n/* 187 */,\n/* 188 */,\n/* 189 */,\n/* 190 */,\n/* 191 */,\n/* 192 */,\n/* 193 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'FullCalendarInfo',\n\n props: {\n showModal: Boolean,\n reservation: Object,\n cancel: Function,\n update: Function,\n refreshTasks: Boolean,\n nodes: Object\n },\n\n computed: {\n actionsAbility: function actionsAbility() {\n return this.reservation.userId === this.$store.state.id || this.$store.state.role === 'admin';\n },\n gpuUtilAvg: function gpuUtilAvg() {\n if (this.reservation.gpuUtilAvg === null) {\n return 'Reservation is not completed yet, no data';\n } else if (this.reservation.gpuUtilAvg === -1) {\n return 'This GPU does not support NVIDIA-SMI';\n } else {\n return this.reservation.gpuUtilAvg + '%';\n }\n },\n memUtilAvg: function memUtilAvg() {\n if (this.reservation.memUtilAvg === null) {\n return 'Reservation is not completed yet, no data';\n } else if (this.reservation.memUtilAvg === -1) {\n return 'This GPU does not support NVIDIA-SMI';\n } else {\n return this.reservation.memUtilAvg + '%';\n }\n },\n reservationTitle: function reservationTitle() {\n return this.reservation.title;\n },\n reservationDescription: function reservationDescription() {\n return this.reservation.description;\n },\n reservationStart: function reservationStart() {\n return this.reservation.start;\n },\n reservationEnd: function reservationEnd() {\n return this.reservation.end;\n }\n },\n\n watch: {\n reservation: function reservation() {\n for (var nodeName in this.nodes) {\n for (var gpuUUID in this.nodes[nodeName].GPU) {\n if (gpuUUID === this.reservation.resourceId) {\n var resource = this.nodes[nodeName].GPU[gpuUUID];\n this.reservation['hostname'] = nodeName;\n this.reservation['resourceIndex'] = resource.index;\n this.reservation['resourceName'] = resource.name;\n }\n }\n }\n },\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n refreshTasks: function refreshTasks() {\n this.getTasks();\n },\n reservationTitle: function reservationTitle() {\n this.newTitle = this.reservationTitle;\n },\n reservationDescription: function reservationDescription() {\n this.newDescription = this.reservationDescription;\n },\n reservationStart: function reservationStart() {\n if (this.reservationStart !== null) {\n this.newStartDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationStart).format('YYYY-MM-DD');\n this.newStartTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationStart).format('HH:mm');\n } else {\n this.newStartDate = '';\n this.newStartTime = '';\n }\n },\n reservationEnd: function reservationEnd() {\n if (this.reservationEnd !== null) {\n this.newEndDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationEnd).format('YYYY-MM-DD');\n this.newEndTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationEnd).format('HH:mm');\n } else {\n this.newEndDate = '';\n this.newEndTime = '';\n }\n }\n },\n\n data: function data() {\n return {\n tasksCard: false,\n cancelCard: false,\n updateCard: false,\n newTitle: '',\n newDescription: '',\n startTimeMenu: false,\n startDateMenu: false,\n endTimeMenu: false,\n endDateMenu: false,\n newStartDate: '',\n newStartTime: '',\n newEndDate: '',\n newEndTime: '',\n pagination: {\n sortBy: 'name'\n },\n tasks: [],\n selected: [],\n selectedIndex: 0,\n headers: [{ text: 'ID', value: 'id' }, { text: 'Command', value: 'command' }, { text: 'Spawn at', value: 'spawnAt' }, { text: 'Terminate at', value: 'terminateAt' }],\n tableKey: 0,\n actionFlag: false,\n showAlert: false,\n show: false\n };\n },\n\n\n methods: {\n prettyDate: function prettyDate(date) {\n if (date !== null) {\n return __WEBPACK_IMPORTED_MODULE_1_moment___default()(date).format('dddd, MMMM Do, HH:mm');\n } else {\n return null;\n }\n },\n\n\n getTasks: function getTasks() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks?userId=' + this.$store.state.id + '&syncAll=false', this.$store.state.accessToken).then(function (response) {\n _this.tasks = response.data.tasks;\n }).catch(function (error) {\n _this.$emit('handleError', error);\n });\n },\n\n checkActionFlag: function checkActionFlag() {\n if (this.actionFlag === false) {\n this.actionFlag = true;\n this.showAlert = true;\n this.scheduleTasks();\n }\n },\n\n scheduleTasks: function scheduleTasks() {\n var _this2 = this;\n\n var id;\n id = this.selected[this.selectedIndex].id;\n var newTask = this.adjustHostAndCommand();\n newTask['spawnAt'] = this.reservation.start;\n newTask['terminateAt'] = this.reservation.end;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/tasks/' + id, this.$store.state.accessToken, newTask).then(function (response) {\n _this2.getTask(id);\n }).catch(function (error) {\n _this2.$emit('handleError', error);\n _this2.getTask(id);\n });\n },\n\n adjustHostAndCommand: function adjustHostAndCommand() {\n for (var nodeName in this.nodes) {\n for (var gpuUUID in this.nodes[nodeName].GPU) {\n if (gpuUUID === this.reservation.resourceId) {\n return {\n hostname: nodeName,\n command: this.setCommand(this.nodes[nodeName].GPU[gpuUUID].index)\n };\n }\n }\n }\n return {};\n },\n\n setCommand: function setCommand(index) {\n var command = this.selected[this.selectedIndex].command;\n var splitCommand = command.split(' ');\n splitCommand[0] = 'CUDA_VISIBLE_DEVICES=' + index;\n return splitCommand.join(' ');\n },\n\n getTask: function getTask(id) {\n var _this3 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this3.updateTask(id, response.data.task);\n _this3.selectedIndex++;\n if (_this3.selectedIndex < _this3.selected.length) {\n _this3.scheduleTasks();\n } else {\n _this3.selectedIndex = 0;\n _this3.actionFlag = false;\n _this3.showAlert = false;\n }\n }).catch(function (error) {\n _this3.$emit('handleError', error);\n _this3.selectedIndex++;\n if (_this3.selectedIndex < _this3.selected.length) {\n _this3.scheduleTasks();\n } else {\n _this3.selectedIndex = 0;\n _this3.actionFlag = false;\n _this3.showAlert = false;\n }\n });\n },\n\n updateTask: function updateTask(id, newData) {\n for (var index in this.tasks) {\n if (this.tasks[index].id === id) {\n if (newData !== null) {\n this.tasks[index] = newData;\n } else {\n this.tasks.splice(index, 1);\n }\n }\n }\n this.tableKey++;\n },\n\n toggleAll: function toggleAll() {\n if (this.selected.length) this.selected = [];else this.selected = this.tasks.slice();\n },\n changeSort: function changeSort(column) {\n if (this.pagination.sortBy === column) {\n this.pagination.descending = !this.pagination.descending;\n } else {\n this.pagination.sortBy = column;\n this.pagination.descending = false;\n }\n },\n\n\n close: function close() {\n this.$emit('close');\n },\n\n cancelReservation: function cancelReservation() {\n this.cancel(this.reservation);\n },\n\n updateReservation: function updateReservation() {\n var newTime = [__WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newStartDate + 'T' + this.newStartTime), __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newEndDate + 'T' + this.newEndTime)];\n this.update(this.reservation, newTime, this.newTitle, this.newDescription);\n }\n }\n});\n\n/***/ }),\n/* 194 */,\n/* 195 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(196);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__api__ = __webpack_require__(2);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n data: function data() {\n return {\n tableContent: {\n nodes: {},\n resources: {},\n header: [],\n hours: []\n },\n scheduleStart: '',\n scheduleEnd: '',\n resourcesIds: [],\n startMoment: {},\n leftTableKey: 0,\n rightTableKey: 0,\n picker: new Date().toISOString().substr(0, 10),\n menu: false,\n landscape: false,\n reactive: false,\n range: 7,\n changeAllCheckbox: true,\n selectedNodes: 0,\n allFlag: false,\n nodeFlag: false\n };\n },\n\n\n props: {\n parsedNodes: Array\n },\n\n watch: {\n parsedNodes: function parsedNodes() {\n this.fillTable();\n }\n },\n\n methods: {\n changeAll: function changeAll() {\n this.allFlag = true;\n for (var nodeName in this.tableContent.nodes) {\n this.tableContent.nodes[nodeName].selected = this.changeAllCheckbox;\n this.changeWholeNode(nodeName);\n }\n this.allFlag = false;\n this.loadResources();\n },\n\n changeWholeNode: function changeWholeNode(nodeName) {\n this.nodeFlag = true;\n for (var resourceId in this.tableContent.nodes[nodeName].resources) {\n var resourceName = this.tableContent.nodes[nodeName].resources[resourceId];\n var resource = this.tableContent.resources[resourceName];\n resource.selected = this.tableContent.nodes[nodeName].selected;\n }\n if (!this.allFlag) {\n if (this.tableContent.nodes[nodeName].selected) {\n this.selectedNodes += 1;\n } else {\n this.selectedNodes -= 1;\n }\n this.checkIfAllNodesSelected();\n this.loadResources();\n }\n this.nodeFlag = false;\n },\n\n checkIfAllNodesSelected: function checkIfAllNodesSelected() {\n if (this.selectedNodes === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes).length) {\n this.changeAllCheckbox = true;\n } else {\n this.changeAllCheckbox = false;\n }\n },\n\n changeResource: function changeResource(nodeName, resourceUUID) {\n if (!this.allFlag && !this.nodeFlag) {\n if (this.tableContent.resources[resourceUUID].selected) {\n this.tableContent.nodes[nodeName].selectedResources += 1;\n } else {\n this.tableContent.nodes[nodeName].selectedResources -= 1;\n }\n this.checkIfAllResourcesSelected(nodeName);\n this.checkIfAllNodesSelected();\n this.forceRerenderTables();\n this.loadResources();\n }\n },\n\n checkIfAllResourcesSelected: function checkIfAllResourcesSelected(nodeName) {\n if (this.tableContent.nodes[nodeName].selectedResources === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes[nodeName].resources).length) {\n this.tableContent.nodes[nodeName].selected = true;\n this.selectedNodes += 1;\n } else {\n this.tableContent.nodes[nodeName].selected = false;\n this.selectedNodes -= 1;\n }\n },\n\n loadResources: function loadResources() {\n this.$emit('loadResources', this.tableContent.resources);\n },\n\n changeSchedule: function changeSchedule() {\n var start = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.picker + 'T00:00:00.000Z').add(this.adjustTimezone(), 'hours');\n this.startMoment = start;\n this.scheduleStart = start.toISOString();\n this.scheduleEnd = __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(this.range, 'days').toISOString();\n var header = [];\n header.push({ value: start.format('dddd, MMMM Do YYYY'), id: 1 });\n for (var i = 1; i < this.range; i++) {\n header.push({ value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(i, 'days').format('dddd, MMMM Do YYYY'), id: i + 1 });\n }\n var hours = [];\n for (var headerName in header) {\n for (i = 0; i < 24; i++) {\n hours.push({ value: i + ':00', id: headerName + ' hour ' + i });\n }\n }\n this.tableContent.header = header;\n this.tableContent.hours = hours;\n this.fillTable();\n },\n\n fillTable: function fillTable() {\n this.resourceIds = [];\n this.tableContent.nodes = {};\n this.tableContent.resources = [];\n for (var nodeIndex in this.parsedNodes) {\n var node = this.parsedNodes[nodeIndex];\n var nodeSlots = [];\n for (var i = 0; i < 48 * this.range; i++) {\n nodeSlots.push({ value: '', id: 'slot ' + i, reserved: false, userReservation: false });\n }\n this.tableContent.nodes[node.nodeName] = {\n nodeName: node.nodeName,\n hidden: true,\n resources: [],\n selected: true,\n selectedResources: 0,\n slots: nodeSlots\n };\n for (var resourceTypeIndex in node.resourceTypes) {\n var resourceType = node.resourceTypes[resourceTypeIndex];\n for (var resourceIndex in resourceType.resources) {\n var resource = resourceType.resources[resourceIndex];\n resource.name = resource.nodeName + ' GPU' + resourceIndex;\n resource['selected'] = true;\n this.tableContent.nodes[node.nodeName].selectedResources += 1;\n this.resourcesIds.push(resource.resourceUUID);\n var slots = [];\n for (i = 0; i < 48 * this.range; i++) {\n slots.push({ value: '', id: 'slot ' + i, reserved: false, userReservation: false });\n }\n resource['slots'] = slots;\n this.tableContent.nodes[node.nodeName].resources.push(resource.resourceUUID);\n this.tableContent.resources[resource.resourceUUID] = resource;\n }\n }\n this.tableContent.nodes[node.nodeName].selectedResources = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes[node.nodeName].resources).length;\n }\n this.selectedNodes = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes).length;\n this.getReservations();\n },\n\n getReservations: function getReservations() {\n var _this = this;\n\n var resourcesString = '';\n for (var i in this.resourcesIds) {\n resourcesString += this.resourcesIds[i] + ',';\n }\n resourcesString = resourcesString.slice(0, -1);\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('get', '/reservations?resources_ids=' + resourcesString + '&start=' + this.scheduleStart + '&end=' + this.scheduleEnd, this.$store.state.accessToken).then(function (response) {\n if (response.data.length !== 0) {\n _this.parseData(response.data);\n }\n }).catch(function (error) {\n _this.$emit('handleError', error);\n });\n },\n\n parseData: function parseData(data) {\n for (var i in data) {\n var start = __WEBPACK_IMPORTED_MODULE_1_moment___default()(data[i].start);\n var dayDifferenceStart = this.startMoment.diff(start, 'days');\n var hoursDifferenceStart = this.startMoment.diff(start, 'hours') % 24;\n var minutesDifferenceStart = this.startMoment.diff(start, 'minutes') % 60;\n if (minutesDifferenceStart !== 0) minutesDifferenceStart = 1;\n var end = __WEBPACK_IMPORTED_MODULE_1_moment___default()(data[i].end);\n var dayDifferenceEnd = this.startMoment.diff(end, 'days');\n var hoursDifferenceEnd = this.startMoment.diff(end, 'hours') % 24;\n var minutesDifferenceEnd = this.startMoment.diff(end, 'minutes') % 60;\n if (minutesDifferenceEnd !== 0) minutesDifferenceEnd = 1;\n var startSlot = -dayDifferenceStart * 48 - hoursDifferenceStart * 2 + minutesDifferenceStart;\n var endSlot = -dayDifferenceEnd * 48 - hoursDifferenceEnd * 2 + minutesDifferenceEnd;\n if (startSlot < 0) startSlot = 0;\n if (endSlot > 48 * this.range) endSlot = 48 * this.range;\n for (var slot = startSlot; slot < endSlot; slot++) {\n if (parseInt(this.$store.state.id) === parseInt(data[i].userId)) {\n this.tableContent.resources[data[i].resourceId].slots[slot].userReservation = true;\n } else {\n this.tableContent.resources[data[i].resourceId].slots[slot].reserved = true;\n }\n }\n this.forceRerenderTables();\n }\n },\n\n forceRerenderTables: function forceRerenderTables(key) {\n this.leftTableKey = !this.leftTableKey;\n this.rightTableKey = !this.rightTableKey;\n },\n\n adjustTimezone: function adjustTimezone() {\n var d = new Date();\n var v = d.getTimezoneOffset(); // in minutes for example GMT+1 = -60\n return v / 60;\n },\n\n toggle: function toggle(node) {\n this.tableContent.nodes[node.nodeName].hidden = !this.tableContent.nodes[node.nodeName].hidden;\n this.forceRerenderTables();\n }\n },\n\n mounted: function mounted() {\n // synchronise scrolls\n var leftTable = document.getElementById('left-table');\n var rightTable = document.getElementById('right-table');\n var rightHeader = document.getElementById('right-header');\n rightTable.onscroll = function () {\n leftTable.scrollTop = this.scrollTop;\n rightHeader.scrollLeft = this.scrollLeft;\n };\n\n var start = __WEBPACK_IMPORTED_MODULE_1_moment___default()(new Date().toISOString()).add(this.adjustTimezone(), 'hours');\n this.startMoment = start;\n this.scheduleStart = start.toISOString();\n this.scheduleEnd = __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(7, 'days').toISOString();\n var header = [{ value: start.format('dddd, MMMM Do YYYY'), id: 1 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(1, 'days').format('dddd, MMMM Do YYYY'), id: 2 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(2, 'days').format('dddd, MMMM Do YYYY'), id: 3 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(3, 'days').format('dddd, MMMM Do YYYY'), id: 4 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(4, 'days').format('dddd, MMMM Do YYYY'), id: 5 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(5, 'days').format('dddd, MMMM Do YYYY'), id: 6 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(6, 'days').format('dddd, MMMM Do YYYY'), id: 7 }];\n var hours = [];\n for (var headerName in header) {\n for (var i = 0; i < 24; i++) {\n hours.push({ value: i + ':00', id: headerName + ' hour ' + i });\n }\n }\n this.tableContent = {\n nodes: {},\n resources: [],\n header: header,\n hours: hours\n };\n this.fillTable();\n }\n});\n\n/***/ }),\n/* 196 */,\n/* 197 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__nodes_overview_WatchGenerator_vue__ = __webpack_require__(309);\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n WatchGenerator: __WEBPACK_IMPORTED_MODULE_0__nodes_overview_WatchGenerator_vue__[\"a\" /* default */]\n }\n});\n\n/***/ }),\n/* 198 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(196);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__WatchBox_vue__ = __webpack_require__(311);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_lodash__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash__);\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n WatchBox: __WEBPACK_IMPORTED_MODULE_2__WatchBox_vue__[\"a\" /* default */]\n },\n\n data: function data() {\n return {\n watches: [],\n chartDatasets: {},\n time: 5000,\n chartLength: 25,\n space: 2,\n interval: null,\n alert: false,\n errorMessage: '',\n updateChart: false,\n resourcesIndexes: {},\n watchIds: 3\n };\n },\n created: function created() {\n this.loadData();\n var self = this;\n this.interval = setInterval(function () {\n if (self.$route.fullPath !== '/nodes_overview') {\n clearInterval(self.interval);\n }\n self.changeData();\n }, this.time);\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n this.alert = true;\n },\n\n saveWatches: function saveWatches() {\n window.localStorage.setItem('watches', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(this.watches));\n window.localStorage.setItem('watchIds', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(this.watchIds));\n },\n changeDefaultNode: function changeDefaultNode(id, name) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches[index].defaultNode = name;\n }\n }\n this.saveWatches();\n },\n changeDefaultResourceType: function changeDefaultResourceType(id, name) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches[index].defaultResourceType = name;\n }\n }\n this.saveWatches();\n },\n changeDefaultMetric: function changeDefaultMetric(id, name) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches[index].defaultMetric = name;\n }\n }\n this.saveWatches();\n },\n deleteWatch: function deleteWatch(id) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches.splice(index, 1);\n }\n }\n this.saveWatches();\n },\n\n setColor: function setColor(node) {\n var color = '#123456';\n var step = node * 123456;\n var colorToInt = parseInt(color.substr(1), 16);\n var nstep = parseInt(step);\n if (!isNaN(colorToInt) && !isNaN(nstep)) {\n colorToInt += nstep;\n var ncolor = colorToInt.toString(16);\n ncolor = '#' + new Array(7 - ncolor.length).join(0) + ncolor;\n if (/^#[0-9a-f]{6}$/i.test(ncolor)) {\n return ncolor;\n }\n }\n return color;\n },\n\n loadData: function loadData() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('get', '/nodes/metrics', this.$store.state.accessToken).then(function (response) {\n if (JSON.parse(window.localStorage.getItem('watches')) === null) {\n var id = 0;\n _this.watches = [];\n for (var host in response.data) {\n var hostData = response.data[host];\n if ('GPU' in hostData) {\n _this.watches.push({\n id: id++,\n defaultNode: host,\n defaultResourceType: 'GPU',\n defaultMetric: 'utilization'\n });\n _this.watches.push({\n id: id++,\n defaultNode: host,\n defaultResourceType: 'GPU',\n defaultMetric: 'mem_used'\n });\n _this.watches.push({\n id: id,\n defaultNode: host,\n defaultResourceType: 'GPU',\n defaultMetric: 'processes'\n });\n } else {\n _this.watches.push({\n id: id++,\n defaultNode: host,\n defaultResourceType: 'CPU',\n defaultMetric: 'utilization'\n });\n }\n }\n } else {\n _this.watches = JSON.parse(window.localStorage.getItem('watches'));\n _this.watchIds = JSON.parse(window.localStorage.getItem('watchIds'));\n }\n _this.parseData(response.data);\n }).catch(function (error) {\n _this.handleError(error);\n });\n },\n\n isVisible: function isVisible(metric, metricName) {\n if (metric.value === null) {\n return false;\n } else {\n if (metricName === 'mem_total') return false;\n return true;\n }\n },\n\n parseData: function parseData(apiResponse) {\n var node, resourceType, metrics, resourceTypes, uniqueMetricNames;\n uniqueMetricNames = [];\n for (var nodeName in apiResponse) {\n resourceTypes = {};\n node = apiResponse[nodeName];\n if (node !== null) {\n for (var resourceTypeName in node) {\n uniqueMetricNames = [];\n resourceType = node[resourceTypeName];\n if (resourceType !== null) {\n metrics = this.findMetrics(resourceType, resourceTypeName);\n for (var metricName in metrics) {\n uniqueMetricNames.push(metricName);\n }\n resourceTypes[resourceTypeName] = {\n metrics: metrics,\n uniqueMetricNames: uniqueMetricNames\n };\n }\n }\n }\n this.chartDatasets[nodeName] = resourceTypes;\n }\n },\n\n findMetrics: function findMetrics(resourceType, resourceTypeName) {\n var resource, metric, tempMetrics, uniqueMetrics;\n tempMetrics = {};\n uniqueMetrics = {};\n for (var resourceUUID in resourceType) {\n if (resourceType[resourceUUID] !== null) {\n this.resourcesIndexes[resourceUUID] = resourceType[resourceUUID].index;\n resource = resourceType[resourceUUID];\n for (var metricName in resource.metrics) {\n if (isNaN(resource.metrics[metricName])) {\n metric = resource.metrics[metricName];\n metric['visible'] = this.isVisible(resource.metrics[metricName], metricName);\n } else {\n metric = {\n value: resource.metrics[metricName],\n unit: '',\n visible: this.isVisible(resource.metrics[metricName], metricName)\n };\n }\n if (uniqueMetrics.hasOwnProperty(metricName)) {\n if (uniqueMetrics[metricName].visible === false) {\n uniqueMetrics[metricName] = metric;\n }\n } else {\n uniqueMetrics[metricName] = metric;\n }\n }\n }\n }\n for (var uniqueMetricName in uniqueMetrics) {\n if (uniqueMetrics[uniqueMetricName].visible === true) {\n tempMetrics[uniqueMetricName] = this.createMetric(resourceType, resourceTypeName, uniqueMetricName);\n }\n }\n return tempMetrics;\n },\n\n createMetric: function createMetric(resourceType, resourceTypeName, metricName) {\n var labels, totalMemory, value, unit, datasets, orderedDatasets;\n labels = [];\n for (var i = (this.chartLength - 1) * this.time / 1000; i >= 0; i -= this.time / 1000) {\n if (i % ((this.space + 1) * this.time / 1000) === 0) {\n labels.push(i);\n } else {\n labels.push('');\n }\n }\n datasets = [];\n for (var resourceUUID in resourceType) {\n if (resourceType[resourceUUID].metrics[metricName] !== null && this.isVisible(resourceType[resourceUUID].metrics[metricName], metricName)) {\n value = isNaN(resourceType[resourceUUID].metrics[metricName]) ? resourceType[resourceUUID].metrics[metricName].value : resourceType[resourceUUID].metrics[metricName];\n unit = isNaN(resourceType[resourceUUID].metrics[metricName]) ? resourceType[resourceUUID].metrics[metricName].unit : '';\n totalMemory = resourceType[resourceUUID].metrics['mem_total'].value;\n datasets.push(this.createDataset(resourceUUID, resourceTypeName + resourceType[resourceUUID].index, this.setColor(resourceType[resourceUUID].index + 1), value));\n }\n }\n orderedDatasets = __WEBPACK_IMPORTED_MODULE_4_lodash___default.a.orderBy(datasets, 'label');\n var obj = {\n metricName: metricName,\n data: {\n labels: labels,\n datasets: orderedDatasets\n },\n options: this.createOptions(totalMemory, metricName, unit)\n };\n return obj;\n },\n\n createDataset: function createDataset(uuid, label, color, data) {\n var defaultData = [];\n for (var i = 0; i < this.chartLength - 1; i++) {\n defaultData.push(0);\n }\n if (data !== null) {\n defaultData.push(data);\n } else {\n defaultData.push(-1);\n }\n var obj = {\n uuid: uuid,\n label: label,\n fill: true,\n borderColor: color,\n pointBackgroundColor: color,\n backgroundColor: 'rgba(0, 0, 0, 0)',\n data: defaultData\n };\n return obj;\n },\n\n createOptions: function createOptions(totalMemory, metricName, unit) {\n var obj = {\n responsive: true,\n maintainAspectRatio: false,\n legend: {\n position: 'bottom',\n display: true\n },\n tooltips: {\n mode: 'label',\n xPadding: 10,\n yPadding: 10,\n bodySpacing: 10\n },\n scales: {\n xAxes: [{\n scaleLabel: {\n display: true,\n labelString: 'seconds ago'\n }\n }],\n yAxes: [{\n id: 'y-axis-1',\n type: 'linear',\n position: 'left',\n scaleLabel: {\n display: true,\n labelString: ''\n }\n }]\n }\n };\n obj['scales']['yAxes'][0]['scaleLabel']['labelString'] = unit;\n if (metricName === 'mem_util' || metricName === 'utilization' || metricName === 'fan_speed') {\n obj['scales']['yAxes'][0]['ticks'] = {\n suggestedMin: 0,\n max: 100\n };\n }\n if (metricName === 'mem_used' || metricName === 'mem_free') {\n obj['scales']['yAxes'][0]['ticks'] = {\n suggestedMin: 0,\n suggestedMax: totalMemory\n };\n }\n return obj;\n },\n\n changeData: function changeData() {\n var node, counter;\n counter = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.chartDatasets).length;\n for (var nodeName in this.chartDatasets) {\n counter--;\n node = this.chartDatasets[nodeName];\n this.apiRequest(node, nodeName, counter);\n }\n },\n\n apiRequest: function apiRequest(node, nodeName, counter) {\n var _this2 = this;\n\n var metric, resourceType, value;\n var data = [];\n for (var resourceTypeName in node) {\n resourceType = node[resourceTypeName];\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('get', '/nodes/' + nodeName + '/' + resourceTypeName.toLowerCase() + '/metrics', this.$store.state.accessToken).then(function (response) {\n data = response.data;\n for (var resourceTypeName in node) {\n resourceType = node[resourceTypeName];\n for (var metricName in resourceType.metrics) {\n metric = resourceType.metrics[metricName];\n for (var i = 0; i < metric.data.datasets.length; i++) {\n if (__WEBPACK_IMPORTED_MODULE_4_lodash___default.a.has(data, metric.data.datasets[i].uuid)) {\n value = isNaN(data[metric.data.datasets[i].uuid][metric.metricName]) ? data[metric.data.datasets[i].uuid][metric.metricName].value : data[metric.data.datasets[i].uuid][metric.metricName];\n metric.data.datasets[i].data.shift();\n metric.data.datasets[i].data.push(value);\n }\n }\n }\n }\n if (!counter) {\n _this2.updateChart = !_this2.updateChart;\n }\n }).catch(function (error) {\n _this2.handleError(error);\n });\n }\n },\n\n addWatch: function addWatch() {\n this.watches.push({\n id: this.watchIds,\n defaultNode: '',\n defaultResourceType: 'GPU',\n defaultMetric: ''\n });\n this.watchIds++;\n this.saveWatches();\n }\n }\n});\n\n/***/ }),\n/* 199 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__LineChart_vue__ = __webpack_require__(313);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__api__ = __webpack_require__(2);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n LineChart: __WEBPACK_IMPORTED_MODULE_0__LineChart_vue__[\"a\" /* default */]\n },\n\n props: {\n defaultNode: String,\n defaultResourceType: String,\n defaultMetric: String,\n resourcesIndexes: Object,\n chartDatasets: Object,\n updateChart: Boolean,\n time: Number\n },\n\n data: function data() {\n return {\n selectedNode: '',\n nodes: [],\n selectedResourceType: '',\n resourceTypes: [],\n selectedMetric: '',\n metrics: [],\n rerenderChart: false,\n metricData: null,\n metricOptions: null,\n showProcesses: false,\n interval: null,\n headers: [{ text: 'GPU index', value: 'index' }, { text: 'owner', value: 'owner' }, { text: 'pid', value: 'pid' }, { text: 'command', value: 'command' }],\n processes: [],\n alert: false,\n errorMessage: ''\n };\n },\n\n\n methods: {\n sendDefaultNode: function sendDefaultNode(newDefault) {\n this.$emit('changeDefaultNode', newDefault);\n },\n sendDefaultResourceType: function sendDefaultResourceType(newDefault) {\n this.$emit('changeDefaultResourceType', newDefault);\n },\n sendDefaultMetric: function sendDefaultMetric(newDefault) {\n this.$emit('changeDefaultMetric', newDefault);\n },\n removeMe: function removeMe() {\n this.$emit('deleteWatch');\n },\n\n loadData: function loadData() {\n return this.chartDatasets[this.selectedNode][this.selectedResourceType].metrics[this.selectedMetric].data;\n },\n\n loadOptions: function loadOptions() {\n return this.chartDatasets[this.selectedNode][this.selectedResourceType].metrics[this.selectedMetric].options;\n },\n\n fillNodes: function fillNodes() {\n this.nodes = [];\n var nodes = this.chartDatasets;\n for (var nodeName in nodes) {\n this.nodes.push(nodeName);\n }\n if (this.defaultNode === '') {\n this.selectedNode = this.nodes[0];\n } else {\n this.selectedNode = this.defaultNode;\n }\n this.fillResourceTypes();\n },\n\n fillResourceTypes: function fillResourceTypes() {\n this.resourceTypes = [];\n var resourceTypes = this.chartDatasets[this.selectedNode];\n for (var resourceTypeName in resourceTypes) {\n this.resourceTypes.push(resourceTypeName);\n }\n if (this.defaultResourceType === '') {\n this.selectedResourceType = this.resourceTypes[0];\n } else {\n this.selectedResourceType = this.defaultResourceType;\n }\n this.fillMetrics();\n },\n\n fillMetrics: function fillMetrics() {\n this.metrics = [];\n var metrics = this.chartDatasets[this.selectedNode][this.selectedResourceType].uniqueMetricNames;\n for (var metricIndex in metrics) {\n this.metrics.push(metrics[metricIndex]);\n }\n if (this.selectedResourceType === 'GPU') {\n this.metrics.push('processes');\n }\n if (this.defaultMetric === '') {\n var metric = this.metrics[0];\n for (metricIndex in this.metrics) {\n var metricName = this.metrics[metricIndex];\n if (metricName === 'utilization') {\n metric = metricName;\n break;\n } else if (metricName === 'mem_used') {\n metric = metricName;\n }\n }\n this.selectedMetric = metric;\n } else {\n this.selectedMetric = this.defaultMetric;\n }\n if (this.selectedNode !== '' && this.selectedResourceType !== '' && this.selectedMetric !== '' && this.selectedMetric !== 'processes') {\n this.metricData = this.loadData();\n this.metricOptions = this.loadOptions();\n this.rerenderChart = !this.rerenderChart;\n }\n },\n\n checkProcesses: function checkProcesses() {\n var _this = this;\n\n var data, processes, tempProcess;\n processes = [];\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('get', '/nodes/' + this.selectedNode + '/gpu/processes', this.$store.state.accessToken).then(function (response) {\n data = response.data;\n for (var resourceUUID in data) {\n if (data[resourceUUID] !== null) {\n for (var i = 0; i < data[resourceUUID].length; i++) {\n tempProcess = data[resourceUUID][i];\n tempProcess['index'] = _this.resourcesIndexes[resourceUUID];\n tempProcess['uuid'] = resourceUUID;\n processes.push(tempProcess);\n }\n }\n }\n _this.processes = processes;\n }).catch(function (error) {\n if (!error.hasOwnProperty('response')) {\n _this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n _this.errorMessage = error.response.data;\n } else {\n _this.errorMessage = error.response.data.msg;\n }\n }\n _this.alert = true;\n });\n }\n },\n\n watch: {\n selectedNode: function selectedNode() {\n this.sendDefaultNode(this.selectedNode);\n this.fillResourceTypes();\n },\n selectedResourceType: function selectedResourceType() {\n this.sendDefaultResourceType(this.selectedResourceType);\n this.fillMetrics();\n },\n selectedMetric: function selectedMetric() {\n this.sendDefaultMetric(this.selectedMetric);\n if (this.selectedMetric === 'processes') {\n this.checkProcesses();\n var self = this;\n this.interval = setInterval(function () {\n if (self.$route.fullPath !== '/nodes_overview') {\n clearInterval(self.interval);\n }\n self.checkProcesses();\n }, this.time);\n this.showProcesses = true;\n } else {\n this.showProcesses = false;\n this.metricData = this.loadData();\n this.metricOptions = this.loadOptions();\n this.rerenderChart = !this.rerenderChart;\n if (this.interval !== null) {\n clearInterval(this.interval);\n }\n }\n }\n },\n\n created: function created() {\n this.fillNodes();\n }\n});\n\n/***/ }),\n/* 200 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue_chartjs__ = __webpack_require__(314);\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n extends: __WEBPACK_IMPORTED_MODULE_0_vue_chartjs__[\"a\" /* Line */],\n props: {\n chartData: Object,\n options: Object,\n rerenderChart: Boolean,\n updateChart: Boolean\n },\n\n watch: {\n rerenderChart: function rerenderChart() {\n this.$data._chart.destroy();\n this.renderChart(this.chartData, this.options);\n },\n updateChart: function updateChart() {\n this.$data._chart.update();\n }\n },\n\n mounted: function mounted() {\n // this.chartData is created in the mixin.\n // If you want to pass options please create a local options object\n this.renderChart(this.chartData, this.options);\n }\n});\n\n/***/ }),\n/* 201 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__tasks_overview_TaskCreate_vue__ = __webpack_require__(323);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__tasks_overview_TaskEdit_vue__ = __webpack_require__(344);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__tasks_overview_TaskSchedule_vue__ = __webpack_require__(347);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__tasks_overview_TaskLog_vue__ = __webpack_require__(350);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__tasks_overview_TaskTemplateChooser__ = __webpack_require__(353);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n TaskTemplateChooser: __WEBPACK_IMPORTED_MODULE_6__tasks_overview_TaskTemplateChooser__[\"a\" /* default */],\n TaskCreate: __WEBPACK_IMPORTED_MODULE_2__tasks_overview_TaskCreate_vue__[\"a\" /* default */],\n TaskEdit: __WEBPACK_IMPORTED_MODULE_3__tasks_overview_TaskEdit_vue__[\"a\" /* default */],\n TaskSchedule: __WEBPACK_IMPORTED_MODULE_4__tasks_overview_TaskSchedule_vue__[\"a\" /* default */],\n TaskLog: __WEBPACK_IMPORTED_MODULE_5__tasks_overview_TaskLog_vue__[\"a\" /* default */]\n },\n data: function data() {\n return {\n pagination: {\n sortBy: 'name'\n },\n selected: [],\n headers: [{ text: 'ID', value: 'id' }, { text: 'hostname', value: 'hostname' }, { text: 'command', value: 'command' }, { text: 'pid', value: 'pid' }, { text: 'status', value: 'status' }, { text: 'spawn at', value: 'spawnAt' }, { text: 'terminate at', value: 'terminateAt' }, { text: 'actions', value: 'id', sortable: false }],\n tasks: [],\n hostnames: [],\n hosts: {},\n showModalCreate: false,\n chosenTemplate: '',\n showModalChooseTemplate: false,\n showModalEdit: false,\n showModalSchedule: false,\n showModalHowItWorks: false,\n showModalRemove: false,\n showModalLog: false,\n taskId: -1,\n newHostname: '',\n newCommand: '',\n newSpawnTime: '',\n newTerminateTime: '',\n tableKey: 0,\n interval: null,\n time: 60000,\n initialSyncFlag: false,\n snackbar: false,\n snackbarError: false,\n errorMessage: '',\n selectedIndex: 0,\n actionFlag: false,\n multipleFlag: false,\n logs: [],\n path: '',\n actionType: '',\n gracefully: null,\n rowsPerPageItems: [{ 'text': '$vuetify.dataIterator.rowsPerPageAll', 'value': -1 }, 25, 10, 5]\n };\n },\n\n\n watch: {\n initialSyncFlag: function initialSyncFlag() {\n this.getTasks(true);\n }\n },\n\n created: function created() {\n var self = this;\n this.interval = setInterval(function () {\n if (self.$route.fullPath !== '/tasks_overview') {\n clearInterval(self.interval);\n }\n self.getTasks(true);\n }, this.time);\n },\n mounted: function mounted() {\n this.getHosts();\n this.getTasks(false);\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.showError(error.message);\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.showError(error.response.data);\n } else {\n this.showError(error.response.data.msg);\n }\n }\n },\n\n showError: function showError(message) {\n this.errorMessage = message;\n this.snackbarError = true;\n },\n prettyDate: function prettyDate(date) {\n if (date !== null) {\n return __WEBPACK_IMPORTED_MODULE_1_moment___default()(date).format('dddd, MMMM Do, HH:mm');\n } else {\n return null;\n }\n },\n changeActionFlag: function changeActionFlag(bool) {\n this.actionFlag = bool;\n },\n changeSnackbar: function changeSnackbar(bool) {\n this.snackbar = bool;\n },\n toggleAll: function toggleAll() {\n if (this.selected.length) this.selected = [];else this.selected = this.tasks.slice();\n },\n changeSort: function changeSort(column) {\n if (this.pagination.sortBy === column) {\n this.pagination.descending = !this.pagination.descending;\n } else {\n this.pagination.sortBy = column;\n this.pagination.descending = false;\n }\n },\n\n\n getHosts: function getHosts() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/nodes/hostnames', this.$store.state.accessToken).then(function (response) {\n _this.hostnames = response.data;\n });\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/nodes/metrics', this.$store.state.accessToken).then(function (response) {\n _this.convertHostsInfo(response.data);\n });\n },\n\n convertHostsInfo: function convertHostsInfo(hostsInfo) {\n var hosts = {};\n for (var hostname in hostsInfo) {\n var host = hostsInfo[hostname];\n var resources = ['CPU'];\n for (var gpuUUID in host.GPU) {\n resources.push('GPU' + host.GPU[gpuUUID].index);\n }\n hosts[hostname] = { resources: resources };\n }\n this.hosts = hosts;\n },\n\n getTasks: function getTasks(sync) {\n var _this2 = this;\n\n if (!this.actionFlag) {\n this.snackbar = true;\n this.actionFlag = true;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks?userId=' + this.$store.state.id + '&syncAll=' + sync, this.$store.state.accessToken).then(function (response) {\n _this2.snackbar = false;\n _this2.actionFlag = false;\n _this2.tasks = response.data.tasks;\n if (!sync) {\n _this2.initialSyncFlag = !_this2.initialSyncFlag;\n }\n }).catch(function (error) {\n _this2.handleError(error);\n _this2.snackbar = false;\n _this2.actionFlag = false;\n });\n }\n },\n\n spawnTasks: function spawnTasks(id) {\n this.actionType = 'spawn';\n this.prepareActionLoop(id);\n },\n\n terminateTasks: function terminateTasks(id, gracefully) {\n this.gracefully = gracefully;\n this.actionType = 'terminate';\n this.prepareActionLoop(id);\n },\n\n prepareActionLoop: function prepareActionLoop(id, actionType) {\n if (id !== null) {\n this.multipleFlag = false;\n this.taskId = id;\n } else {\n this.multipleFlag = true;\n }\n if (!this.actionFlag) {\n if (!this.multipleFlag) {\n this.actionFlag = true;\n this.snackbar = true;\n this.actionLoop();\n } else if (this.selected.length) {\n this.actionFlag = true;\n this.snackbar = true;\n this.actionLoop();\n }\n }\n },\n\n actionLoop: function actionLoop() {\n var _this3 = this;\n\n var id;\n if (this.multipleFlag) {\n id = this.selected[this.selectedIndex].id;\n } else {\n id = this.taskId;\n }\n var actionPath;\n switch (this.actionType) {\n case 'spawn':\n actionPath = '/tasks/' + id + '/spawn';break;\n case 'terminate':\n actionPath = '/tasks/' + id + '/terminate?gracefully=' + this.gracefully;break;\n }\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', actionPath, this.$store.state.accessToken).then(function (response) {\n _this3.getTaskLoop(id);\n }).catch(function (error) {\n _this3.handleError(error);\n _this3.getTaskLoop(id);\n });\n },\n\n getTaskLoop: function getTaskLoop(id, actionType) {\n var _this4 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this4.updateTask(id, response.data.task);\n _this4.resumeLoop();\n }).catch(function (error) {\n _this4.handleError(error);\n _this4.resumeLoop();\n });\n },\n\n resumeLoop: function resumeLoop() {\n if (this.multipleFlag) {\n this.selectedIndex++;\n if (this.selectedIndex < this.selected.length) {\n switch (this.actionType) {\n case 'spawn':\n this.actionLoop();break;\n case 'terminate':\n this.actionLoop();break;\n }\n } else {\n this.selectedIndex = 0;\n this.snackbar = false;\n this.actionFlag = false;\n }\n } else {\n this.snackbar = false;\n this.actionFlag = false;\n }\n },\n\n scheduleTasks: function scheduleTasks(task) {\n if (task != null) {\n this.multipleFlag = false;\n this.taskId = task.id;\n this.newSpawnTime = task.spawnAt;\n this.newTerminateTime = task.terminateAt;\n } else {\n this.multipleFlag = true;\n }\n if (!this.multipleFlag) {\n this.showModalSchedule = true;\n } else if (this.selected.length) {\n this.showModalSchedule = true;\n }\n },\n\n editTask: function editTask(task) {\n this.taskId = task.id;\n this.newHostname = task.hostname;\n this.newCommand = task.command;\n this.showModalEdit = true;\n },\n\n getTask: function getTask(id) {\n var _this5 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this5.updateTask(id, response.data.task);\n _this5.snackbar = false;\n _this5.actionFlag = false;\n }).catch(function (error) {\n _this5.handleError(error);\n _this5.snackbar = false;\n _this5.actionFlag = false;\n });\n },\n\n updateTask: function updateTask(id, newData) {\n for (var index in this.tasks) {\n if (this.tasks[index].id === id) {\n if (newData !== null) {\n this.tasks[index] = newData;\n } else {\n this.tasks.splice(index, 1);\n }\n }\n }\n this.tableKey++;\n },\n\n showConfirmationDialog: function showConfirmationDialog(id) {\n this.taskId = id;\n this.showModalRemove = true;\n },\n\n\n removeTask: function removeTask() {\n var _this6 = this;\n\n var id = this.taskId;\n if (!this.actionFlag) {\n this.snackbar = true;\n this.actionFlag = true;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('delete', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this6.showModalRemove = false;\n _this6.snackbar = false;\n _this6.actionFlag = false;\n _this6.updateTask(id, null);\n }).catch(function (error) {\n _this6.handleError(error);\n _this6.snackbar = false;\n _this6.actionFlag = false;\n });\n }\n },\n\n getLog: function getLog(id) {\n var _this7 = this;\n\n var tailMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n this.taskId = id;\n if (!this.actionFlag) {\n this.snackbar = true;\n this.actionFlag = true;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id + '/log?tail=' + tailMode, this.$store.state.accessToken).then(function (response) {\n _this7.logs = response.data.output_lines;\n _this7.path = response.data.path;\n _this7.showModalLog = true;\n }).catch(function (error) {\n _this7.handleError(error);\n }).finally(function () {\n _this7.snackbar = false;\n _this7.actionFlag = false;\n });\n }\n },\n openFromTemplate: function openFromTemplate(chosenTemplate) {\n this.chosenTemplate = chosenTemplate;\n this.showModalCreate = true;\n }\n }\n});\n\n/***/ }),\n/* 202 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__TaskLine_vue__ = __webpack_require__(325);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n TaskLine: __WEBPACK_IMPORTED_MODULE_1__TaskLine_vue__[\"a\" /* default */]\n },\n\n props: {\n showModal: Boolean,\n hostnames: Array,\n hosts: Object,\n actionFlag: Boolean,\n chosenTemplate: String\n },\n\n data: function data() {\n return {\n newParameter: '',\n linesIds: 1,\n lines: [{\n id: 0,\n host: '',\n resource: '',\n command: '',\n parameters: [],\n envVariables: [],\n parameterIds: 0,\n envVariableIds: 0,\n enableTfConfig: false,\n tfConfig: '',\n tfConfigPort: '',\n tfConfigTaskType: '',\n tfConfigTaskIndex: -1\n }],\n tfCluster: {},\n staticParameters: [],\n staticEnvVariables: [],\n isNewFieldStatic: false,\n enableSmartTfConfig: false,\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();else {\n this.emptyParametersAndEnvVariables();\n switch (this.chosenTemplate) {\n case 'tf1':\n this.addParameter(undefined, '--ps_hosts=');\n this.addParameter(undefined, '--worker_hosts=');\n this.addParameter(undefined, '--job_name=', 'worker');\n this.addParameter(undefined, '--task_index=');\n this.staticParameters = ['--ps_hosts=', '--worker_hosts='];\n break;\n case 'tf2':\n this.enableSmartTfConfig = true;\n this.addEnvVariable(undefined, 'TF_CONFIG');\n break;\n case 'torch':\n this.addParameter(undefined, '--init-method=');\n this.addParameter(undefined, '--backend=', 'gloo');\n this.addParameter(undefined, '--rank=');\n this.addParameter(undefined, '--world-size=');\n this.staticParameters = ['--init-method=', '--backend=', '--world-size='];\n break;\n default:\n break;\n }\n }\n }\n },\n\n methods: {\n close: function close() {\n this.$emit('close');\n },\n\n addTasks: function addTasks() {\n var _this = this;\n\n for (var lineIndex in this.lines) {\n var line = this.lines[lineIndex];\n var command = this.convertResource(line.resource);\n if (line.enableTfConfig) {\n command += ' TF_CONFIG=' + line.tfConfig;\n }\n for (var envIndex in line.envVariables) {\n var envVariable = line.envVariables[envIndex];\n command += ' ' + envVariable.envVariable + '=' + envVariable.value;\n }\n command += ' ' + line.command;\n for (var parameterIndex in line.parameters) {\n var parameter = line.parameters[parameterIndex];\n var parameterNameLength = parameter.parameter.length;\n if (parameter.parameter.charAt(parameterNameLength - 1) === ' ' || parameter.parameter.charAt(parameterNameLength - 1) === '=') {\n command += ' ' + parameter.parameter + parameter.value;\n } else {\n command += ' ' + parameter.parameter + ' ' + parameter.value;\n }\n }\n var task = {\n userId: this.$store.state.id,\n hostname: line.host,\n command: command\n };\n if (!this.actionFlag) {\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('post', '/tasks', this.$store.state.accessToken, task).then(function (response) {\n _this.close();\n _this.$emit('getTasks', false);\n });\n }\n }\n },\n\n addParameter: function addParameter(event, parameterName, parameterValue) {\n var taskIndex = 0;\n for (var line in this.lines) {\n var parameter = {\n id: this.lines[line].parameterIds,\n parameter: parameterName || this.newParameter,\n value: parameterValue || ''\n };\n if (this.chosenTemplate === 'tf1' && parameterName === '--task_index=' || this.chosenTemplate === 'torch' && parameterName === '--rank=' || this.chosenTemplate === 'torch' && parameterName === '--world-size=') {\n if (parameterName === '--world-size=') {\n taskIndex++;\n parameter.value = taskIndex.toString();\n } else {\n parameter.value = taskIndex.toString();\n taskIndex++;\n }\n }\n this.lines[line].parameterIds++;\n this.lines[line].parameters.push(parameter);\n }\n if (this.isNewFieldStatic) {\n this.staticParameters.push(parameterName || this.newParameter);\n }\n },\n\n addEnvVariable: function addEnvVariable(event, variableName, variableValue) {\n var newName = variableName || this.newParameter;\n if (newName.charAt(newName.length - 1) === '=') {\n newName = newName.substring(0, newName.length - 1);\n }\n var line;\n if (newName === 'TF_CONFIG') {\n this.chosenTemplate = 'tf2';\n for (line in this.lines) {\n this.lines[line].enableTfConfig = true;\n this.lines[line].tfConfig = '';\n }\n var machinePorts = {};\n for (line in this.lines) {\n var host = this.lines[line].host;\n this.updateTfConfigTaskType(this.lines[line].id, 'worker');\n if (host) {\n if (machinePorts.hasOwnProperty(host)) {\n this.updateTfConfigPort(this.lines[line].id, machinePorts[host].toString());\n machinePorts[host]++;\n } else {\n this.updateTfConfigPort(this.lines[line].id, '2222');\n machinePorts[host] = 2223;\n }\n }\n }\n } else {\n for (line in this.lines) {\n var envVariable = {\n id: this.lines[line].envVariableIds,\n envVariable: newName,\n value: variableValue || ''\n };\n this.lines[line].envVariableIds++;\n this.lines[line].envVariables.push(envVariable);\n }\n if (this.isNewFieldStatic) {\n this.staticEnvVariables.push(newName);\n }\n }\n },\n\n copyLine: function copyLine() {\n if (this.lines.length === 0) {\n this.addLine();\n } else {\n var lineToCopy = this.lines[this.lines.length - 1];\n var parametersToCopy = lineToCopy.parameters;\n var newParameters = [];\n for (var index in parametersToCopy) {\n var parameterToCopy = parametersToCopy[index];\n var newParameter = {\n id: index,\n parameter: parameterToCopy.parameter,\n value: parameterToCopy.value\n };\n if (this.chosenTemplate === 'tf1' && newParameter.parameter === '--task_index=' || this.chosenTemplate === 'torch' && newParameter.parameter === '--rank=' || this.chosenTemplate === 'torch' && newParameter.parameter === '--world-size=') {\n newParameter.value = (parseInt(newParameter.value) + 1).toString();\n }\n newParameters.push(newParameter);\n }\n\n var envVariablesToCopy = lineToCopy.envVariables;\n var newEnvVariables = [];\n for (var EnvIndex in envVariablesToCopy) {\n var envVariableToCopy = envVariablesToCopy[EnvIndex];\n var newEnvVariable = {\n id: EnvIndex,\n envVariable: envVariableToCopy.envVariable,\n value: envVariableToCopy.value\n };\n newEnvVariables.push(newEnvVariable);\n }\n var line = {\n id: this.linesIds,\n host: lineToCopy.host,\n resource: lineToCopy.resource,\n command: lineToCopy.command,\n parameters: newParameters,\n envVariables: newEnvVariables,\n enableTfConfig: lineToCopy.enableTfConfig,\n tfConfig: lineToCopy.tfConfig,\n tfConfigPort: '',\n tfConfigTaskType: '',\n tfConfigTaskIndex: -1\n };\n this.linesIds++;\n this.lines.push(line);\n\n if (lineToCopy.enableTfConfig && this.enableSmartTfConfig) {\n this.updateTfConfigTaskType(line.id, lineToCopy.tfConfigTaskType);\n if (line.host) {\n var machineHosts = {};\n machineHosts[line.host] = 2221;\n for (var lineIndex in this.lines) {\n if (this.lines[lineIndex].host && this.lines[lineIndex].tfConfigPort) {\n if (machineHosts.hasOwnProperty(this.lines[lineIndex].host)) {\n machineHosts[this.lines[lineIndex].host] = Math.max(machineHosts[this.lines[lineIndex].host], parseInt(this.lines[lineIndex].tfConfigPort));\n } else {\n machineHosts[this.lines[lineIndex].host] = 2221;\n }\n }\n }\n this.updateTfConfigPort(line.id, (machineHosts[line.host] + 1).toString());\n }\n }\n }\n },\n\n addLine: function addLine() {\n var line = {\n id: this.linesIds,\n host: '',\n resource: '',\n command: '',\n envVariables: [],\n parameters: [],\n parameterIds: 0,\n envVariableIds: 0,\n enableTfConfig: false,\n tfConfig: '',\n tfConfigPort: '',\n tfConfigTaskType: '',\n tfConfigTaskIndex: -1\n };\n this.linesIds++;\n this.lines.push(line);\n },\n\n changeLine: function changeLine(id, host, resource, command, parameters, envVariables, enableTfConfig, tfConfig) {\n for (var index in this.lines) {\n if (this.lines[index].id === id) {\n if (host !== this.lines[index].host && enableTfConfig && this.enableSmartTfConfig) {\n this.updateTfConfigHost(id, host);\n }\n if (this.chosenTemplate === 'tf1') {\n this.updatePsWorkerHosts(index, host);\n }\n this.lines[index].host = host;\n this.lines[index].resource = resource;\n this.lines[index].command = command;\n this.lines[index].parameters = parameters;\n this.lines[index].envVariables = envVariables;\n this.lines[index].enableTfConfig = enableTfConfig;\n this.lines[index].tfConfig = tfConfig;\n }\n }\n },\n\n deleteLine: function deleteLine(id) {\n for (var index in this.lines) {\n if (this.lines[index].id === id) {\n if (this.lines[index].enableTfConfig && this.enableSmartTfConfig) {\n this.updateTfConfigTaskType(this.lines[index].id, '');\n }\n this.lines.splice(index, 1);\n }\n }\n },\n\n staticParameterChanged: function staticParameterChanged(id, parameter, value) {\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var parameterIndex in this.lines[index].parameters) {\n if (this.lines[index].parameters[parameterIndex].parameter === parameter) {\n this.lines[index].parameters[parameterIndex].value = value;\n }\n }\n }\n }\n },\n\n staticParameterDeleted: function staticParameterDeleted(id, parameter) {\n var staticIndex = this.staticParameters.indexOf(parameter);\n if (staticIndex !== -1) this.staticParameters.splice(staticIndex, 1);\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var parameterIndex in this.lines[index].parameters) {\n if (this.lines[index].parameters[parameterIndex].parameter === parameter) {\n this.lines[index].parameters.splice(parameterIndex, 1);\n }\n }\n }\n }\n },\n\n staticEnvVariableChanged: function staticEnvVariableChanged(id, variable, value) {\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var variableIndex in this.lines[index].envVariables) {\n if (this.lines[index].envVariables[variableIndex].envVariable === variable) {\n this.lines[index].envVariables[variableIndex].value = value;\n }\n }\n }\n }\n },\n\n staticEnvVariableDeleted: function staticEnvVariableDeleted(id, variable) {\n var staticIndex = this.staticEnvVariables.indexOf(variable);\n if (staticIndex !== -1) this.staticEnvVariables.splice(staticIndex, 1);\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var variableIndex in this.lines[index].envVariables) {\n if (this.lines[index].envVariables[variableIndex].envVariable === variable) {\n this.lines[index].envVariables.splice(variableIndex, 1);\n }\n }\n }\n }\n },\n\n updatePsWorkerHosts: function updatePsWorkerHosts(index, host) {\n var psHosts = [];\n var workerHosts = [];\n var currentPort = 2222;\n\n for (var line in this.lines) {\n var currLine = this.lines[line];\n var jobName = '';\n for (var paramIndex in currLine.parameters) {\n if (currLine.parameters[paramIndex].parameter === '--job_name=') {\n jobName = currLine.parameters[paramIndex].value;\n }\n }\n for (var _paramIndex in currLine.parameters) {\n if (currLine.parameters[_paramIndex].parameter === '--task_index=') {\n var lineHost = '';\n if (line === index) {\n lineHost = host;\n } else {\n lineHost = currLine.host;\n }\n if (jobName === 'worker') {\n workerHosts[currLine.parameters[_paramIndex].value] = lineHost + ':' + currentPort.toString();\n currentPort++;\n } else if (jobName === 'ps') {\n psHosts[currLine.parameters[_paramIndex].value] = lineHost + ':' + currentPort.toString();\n currentPort++;\n }\n }\n }\n }\n\n var psHostsParam = '';\n var workerHostsParam = '';\n\n for (var pHost in psHosts) {\n psHostsParam += psHosts[pHost] + ',';\n }\n psHostsParam = psHostsParam.replace(/,\\s*$/, '');\n for (var wHost in workerHosts) {\n workerHostsParam += workerHosts[wHost] + ',';\n }\n workerHostsParam = workerHostsParam.replace(/,\\s*$/, '');\n\n for (var _line in this.lines) {\n for (var _paramIndex2 in this.lines[_line].parameters) {\n if (this.lines[_line].parameters[_paramIndex2].parameter === '--ps_hosts=') {\n this.lines[_line].parameters[_paramIndex2].value = psHostsParam;\n } else if (this.lines[_line].parameters[_paramIndex2].parameter === '--worker_hosts=') {\n this.lines[_line].parameters[_paramIndex2].value = workerHostsParam;\n }\n }\n }\n },\n\n updateTfConfigHost: function updateTfConfigHost(id, host) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n // set new config port\n var machineHosts = {};\n machineHosts[host] = 2221;\n for (var line in this.lines) {\n if (this.lines[line].id !== id && this.lines[line].host && this.lines[line].tfConfigPort) {\n if (machineHosts.hasOwnProperty(this.lines[line].host)) {\n machineHosts[this.lines[line].host] = Math.max(machineHosts[this.lines[line].host], parseInt(this.lines[line].tfConfigPort));\n } else {\n machineHosts[this.lines[line].host] = 2221;\n }\n }\n }\n this.lines[lineIndex].tfConfigPort = (machineHosts[host] + 1).toString();\n\n // check if given line has taskIndex set\n var taskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n if (taskIndex !== -1) {\n var taskType = this.lines[lineIndex].tfConfigTaskType;\n this.tfCluster[taskType][taskIndex] = host + ':' + this.lines[lineIndex].tfConfigPort;\n this.tfCluster.__ob__.dep.notify();\n }\n },\n\n updateTfConfigPort: function updateTfConfigPort(id, port) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n if (!this.lines[lineIndex].enableTfConfig || !this.enableSmartTfConfig) {\n return;\n }\n\n this.lines[lineIndex].tfConfigPort = port;\n\n // check if given line has taskIndex set\n var taskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n if (taskIndex !== -1) {\n var taskType = this.lines[lineIndex].tfConfigTaskType;\n this.tfCluster[taskType][taskIndex] = this.lines[lineIndex].host + ':' + this.lines[lineIndex].tfConfigPort;\n this.tfCluster.__ob__.dep.notify();\n }\n },\n\n updateTfConfigTaskType: function updateTfConfigTaskType(id, taskType) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n if (!this.lines[lineIndex].enableTfConfig || !this.enableSmartTfConfig) {\n return;\n }\n\n // remove from old list of cluster tasks\n var oldTaskType = this.lines[lineIndex].tfConfigTaskType;\n if (oldTaskType && oldTaskType.length !== 0) {\n var oldTaskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n this.tfCluster[oldTaskType].splice(oldTaskIndex, 1);\n if (this.tfCluster[oldTaskType].length !== 0) {\n for (var otherLineIndex in this.lines) {\n if (this.lines[otherLineIndex].tfConfigTaskType === oldTaskType && this.lines[otherLineIndex].tfConfigTaskIndex > oldTaskIndex) {\n this.lines[otherLineIndex].tfConfigTaskIndex -= 1;\n }\n }\n } else {\n delete this.tfCluster[oldTaskType];\n }\n }\n\n // Assign new taskType and taskIndex\n if (!taskType || taskType.length === 0) {\n this.lines[lineIndex].tfConfigTaskType = taskType;\n this.lines[lineIndex].tfConfigTaskIndex = -1;\n } else {\n // check if there is a list with new taskType\n if (!this.tfCluster.hasOwnProperty(taskType)) {\n this.tfCluster[taskType] = [];\n }\n\n this.lines[lineIndex].tfConfigTaskType = taskType;\n this.lines[lineIndex].tfConfigTaskIndex = this.tfCluster[taskType].length;\n\n this.tfCluster[taskType].push(this.lines[lineIndex].host + ':' + this.lines[lineIndex].tfConfigPort);\n }\n this.tfCluster.__ob__.dep.notify();\n },\n\n updateTfConfigTaskIndex: function updateTfConfigTaskIndex(id, newTaskIndex) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n if (!this.lines[lineIndex].enableTfConfig || !this.enableSmartTfConfig || newTaskIndex === this.lines[lineIndex].tfConfigTaskIndex) {\n return;\n }\n\n var taskType = this.lines[lineIndex].tfConfigTaskType;\n var oldTaskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n if (this.tfCluster[taskType].length <= newTaskIndex) {\n newTaskIndex = 0;\n } else if (newTaskIndex < 0) {\n newTaskIndex = this.tfCluster[taskType].length - 1;\n }\n if (newTaskIndex === this.lines[lineIndex].tfConfigTaskIndex) {\n return;\n }\n\n var value = this.tfCluster[taskType][oldTaskIndex];\n this.tfCluster[taskType].splice(oldTaskIndex, 1);\n for (var otherLineIndex in this.lines) {\n if (this.lines[otherLineIndex].tfConfigTaskType === taskType && this.lines[otherLineIndex].tfConfigTaskIndex > oldTaskIndex) {\n this.lines[otherLineIndex].tfConfigTaskIndex -= 1;\n }\n if (this.lines[otherLineIndex].tfConfigTaskType === taskType && this.lines[otherLineIndex].tfConfigTaskIndex >= newTaskIndex) {\n this.lines[otherLineIndex].tfConfigTaskIndex += 1;\n }\n }\n this.tfCluster[taskType].splice(newTaskIndex, 0, value);\n this.lines[lineIndex].tfConfigTaskIndex = newTaskIndex;\n this.tfCluster.__ob__.dep.notify();\n },\n\n convertResource: function convertResource(resource) {\n if (resource !== '' && resource !== null) {\n if (resource === 'CPU') {\n return 'CUDA_VISIBLE_DEVICES=';\n } else {\n return 'CUDA_VISIBLE_DEVICES=' + resource[3];\n }\n } else {\n return '';\n }\n },\n\n emptyParametersAndEnvVariables: function emptyParametersAndEnvVariables() {\n this.enableSmartTfConfig = false;\n this.isNewFieldStatic = false;\n this.staticParameters = [];\n this.staticEnvVariables = [];\n for (var lineIndex in this.lines) {\n this.lines[lineIndex].tfConfigTaskIndex = 0;\n this.lines[lineIndex].tfConfigTaskType = '';\n this.lines[lineIndex].tfConfigPort = '';\n this.lines[lineIndex].enableTfConfig = false;\n this.lines[lineIndex].parameters = [];\n this.lines[lineIndex].parameterIds = 0;\n this.lines[lineIndex].envVariables = [];\n this.lines[lineIndex].envVariableIds = 0;\n }\n this.tfCluster = {};\n }\n }\n});\n\n/***/ }),\n/* 203 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(327);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__TaskLineParameter_vue__ = __webpack_require__(330);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__TaskLineEnvVariable_vue__ = __webpack_require__(333);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__TaskLineTfConfig__ = __webpack_require__(336);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n TaskLineTfConfig: __WEBPACK_IMPORTED_MODULE_3__TaskLineTfConfig__[\"a\" /* default */],\n TaskLineParameter: __WEBPACK_IMPORTED_MODULE_1__TaskLineParameter_vue__[\"a\" /* default */],\n TaskLineEnvVariable: __WEBPACK_IMPORTED_MODULE_2__TaskLineEnvVariable_vue__[\"a\" /* default */]\n },\n\n props: {\n hostnames: Array,\n hosts: Object,\n host: String,\n resource: String,\n command: String,\n parameters: Array,\n staticParameters: Array,\n envVariables: Array,\n staticEnvVariables: Array,\n enableTfConfig: Boolean,\n tfConfig: String,\n tfConfigPort: String,\n tfConfigTaskType: String,\n tfConfigTaskIndex: Number,\n tfCluster: Object,\n enableSmartTfConfig: Boolean\n },\n\n data: function data() {\n return {\n newHost: '',\n newResource: '',\n newEnvVariables: [{\n id: 0,\n envVariable: '',\n value: ''\n }],\n newCommand: '',\n newParameters: [{\n id: 0,\n parameter: '',\n value: ''\n }],\n newEnableTfConfig: false,\n newTfConfig: '',\n showModal: false\n };\n },\n created: function created() {\n this.newHost = this.host;\n this.newResource = this.resource;\n this.newEnvVariables = this.envVariables;\n this.envVariableIds = this.envVariables.length;\n this.newCommand = this.command;\n this.newParameters = this.parameters;\n this.parameterIds = this.parameters.length;\n this.newEnableTfConfig = this.enableTfConfig;\n this.newTfConfig = this.tfConfig;\n },\n\n\n computed: {\n hostResources: function hostResources() {\n if (this.newHost !== '') {\n return this.hosts[this.newHost].resources;\n } else {\n return [];\n }\n },\n taskPreview: function taskPreview() {\n var parameters = '';\n for (var index in this.parameters) {\n var parameterNameLength = this.parameters[index].parameter.length;\n if (this.parameters[index].parameter.charAt(parameterNameLength - 1) === ' ' || this.parameters[index].parameter.charAt(parameterNameLength - 1) === '=') {\n parameters += this.parameters[index].parameter + this.parameters[index].value + ' ';\n } else {\n parameters += this.parameters[index].parameter + ' ' + this.parameters[index].value + ' ';\n }\n }\n var envVariables = '';\n if (this.newEnableTfConfig) {\n envVariables += 'TF_CONFIG=' + this.newTfConfig + ' ';\n }\n for (var envIndex in this.envVariables) {\n envVariables += this.envVariables[envIndex].envVariable + '=' + this.envVariables[envIndex].value + ' ';\n }\n return this.host + ' ' + this.convertResource(this.resource) + ' ' + envVariables + ' ' + this.command + ' ' + parameters;\n }\n },\n\n watch: {\n parameters: function parameters() {\n this.newParameters = this.parameters;\n },\n envVariables: function envVariables() {\n this.newEnvVariables = this.envVariables;\n },\n enableTfConfig: function enableTfConfig() {\n this.newEnableTfConfig = this.enableTfConfig;\n },\n tfConfig: function tfConfig() {\n this.newTfConfig = this.tfConfig;\n },\n newHost: function newHost() {\n this.newResource = this.hosts[this.newHost].resources[0];\n this.updateLine();\n },\n newResource: function newResource() {\n this.updateLine();\n },\n newCommand: function newCommand() {\n this.updateLine();\n },\n newParameters: function newParameters() {\n this.updateLine();\n },\n newEnvVariables: function newEnvVariables() {\n this.updateLine();\n },\n newEnableTfConfig: function newEnableTfConfig() {\n this.updateLine();\n },\n newTfConfig: function newTfConfig() {\n this.updateLine();\n }\n },\n\n methods: {\n convertResource: function convertResource(resource) {\n if (resource !== '' && resource !== null) {\n if (resource === 'CPU') {\n return 'CUDA_VISIBLE_DEVICES=';\n } else {\n return 'CUDA_VISIBLE_DEVICES=' + resource[3];\n }\n } else {\n return '';\n }\n },\n\n\n changeParameter: function changeParameter(id, parameter, value) {\n for (var index in this.parameters) {\n if (this.parameters[index].id === id) {\n this.parameters[index].parameter = parameter;\n this.parameters[index].value = value;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticParameters), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var staticParameterName = _step.value;\n\n if (parameter === staticParameterName) {\n this.$emit('staticParameterChanged', parameter, value);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n if (parameter === '--job_name=' || parameter === '--task_index=') {\n this.$emit('psWorkerParameterChanged');\n }\n }\n }\n },\n\n deleteParameter: function deleteParameter(id) {\n for (var index in this.parameters) {\n if (this.parameters[index].id === id) {\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticParameters), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var staticParameterName = _step2.value;\n\n if (this.parameters[index].parameter === staticParameterName) {\n this.$emit('staticParameterDeleted', staticParameterName);\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n this.parameters.splice(index, 1);\n }\n }\n },\n\n changeEnvVariable: function changeEnvVariable(id, envVariable, value) {\n for (var index in this.envVariables) {\n if (this.envVariables[index].id === id) {\n this.envVariables[index].envVariable = envVariable;\n this.envVariables[index].value = value;\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticEnvVariables), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var staticEnvVariableName = _step3.value;\n\n if (envVariable === staticEnvVariableName) {\n this.$emit('staticEnvVariableChanged', envVariable, value);\n }\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n }\n }\n },\n\n deleteEnvVariable: function deleteEnvVariable(id) {\n for (var index in this.envVariables) {\n if (this.envVariables[index].id === id) {\n var _iteratorNormalCompletion4 = true;\n var _didIteratorError4 = false;\n var _iteratorError4 = undefined;\n\n try {\n for (var _iterator4 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticEnvVariables), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n var staticEnvVariableName = _step4.value;\n\n if (this.envVariables[index].envVariable === staticEnvVariableName) {\n this.$emit('staticEnvVariableDeleted', staticEnvVariableName);\n }\n }\n } catch (err) {\n _didIteratorError4 = true;\n _iteratorError4 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion4 && _iterator4.return) {\n _iterator4.return();\n }\n } finally {\n if (_didIteratorError4) {\n throw _iteratorError4;\n }\n }\n }\n\n this.envVariables.splice(index, 1);\n }\n }\n },\n\n changeTfConfig: function changeTfConfig(value) {\n this.newTfConfig = value;\n },\n\n deleteTfConfig: function deleteTfConfig() {\n this.$emit('updateTfConfigTaskType', '');\n this.newEnableTfConfig = false;\n this.newTfConfig = '';\n },\n\n updateTfConfigPort: function updateTfConfigPort(newPort) {\n this.$emit('updateTfConfigPort', newPort);\n },\n\n updateTfConfigTaskType: function updateTfConfigTaskType(newTaskType) {\n this.$emit('updateTfConfigTaskType', newTaskType);\n },\n\n updateTfConfigTaskIndex: function updateTfConfigTaskIndex(newTaskIndex) {\n this.$emit('updateTfConfigTaskIndex', newTaskIndex);\n },\n\n updateLine: function updateLine() {\n this.$emit('changeLine', this.newHost, this.newResource, this.newCommand, this.newParameters, this.newEnvVariables, this.newEnableTfConfig, this.newTfConfig);\n },\n\n removeMe: function removeMe() {\n this.$emit('deleteLine');\n }\n }\n});\n\n/***/ }),\n/* 204 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n parameter: String,\n value: String\n },\n\n data: function data() {\n return {\n newParameter: '',\n newValue: ''\n };\n },\n created: function created() {\n this.newParameter = this.parameter;\n this.newValue = this.value;\n },\n\n\n watch: {\n value: function value() {\n this.newValue = this.value;\n },\n newParameter: function newParameter() {\n this.$emit('changeParameter', this.newParameter, this.newValue);\n },\n newValue: function newValue() {\n this.$emit('changeParameter', this.newParameter, this.newValue);\n }\n },\n\n methods: {\n removeMe: function removeMe() {\n this.$emit('deleteParameter');\n }\n }\n});\n\n/***/ }),\n/* 205 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n envVariable: String,\n value: String\n },\n\n data: function data() {\n return {\n newEnvVariable: '',\n newValue: '',\n showModalTfConfigEdit: false\n };\n },\n created: function created() {\n this.newEnvVariable = this.envVariable;\n this.newValue = this.value;\n },\n\n\n watch: {\n value: function value() {\n this.newValue = this.value;\n },\n newEnvVariable: function newEnvVariable() {\n this.$emit('changeEnvVariable', this.newEnvVariable, this.newValue);\n },\n newValue: function newValue() {\n this.$emit('changeEnvVariable', this.newEnvVariable, this.newValue);\n }\n },\n\n methods: {\n removeMe: function removeMe() {\n this.$emit('deleteEnvVariable');\n },\n\n updateValue: function updateValue(newValue) {\n this.newValue = newValue;\n }\n }\n});\n\n/***/ }),\n/* 206 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__TfConfigEdit__ = __webpack_require__(338);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: { TfConfigEdit: __WEBPACK_IMPORTED_MODULE_1__TfConfigEdit__[\"a\" /* default */] },\n\n name: 'TaskLineTfConfig',\n\n props: {\n value: String,\n port: String,\n taskType: String,\n taskIndex: Number,\n tfCluster: Object,\n enableSmartTfConfig: Boolean\n },\n\n data: function data() {\n return {\n newValue: '',\n newPort: '',\n newTaskType: '',\n taskTypeItems: ['chief', 'evaluator', 'master', 'ps', 'worker'],\n newTaskIndex: -1,\n localEnableSmartTfConfig: false,\n showModalTfConfigEdit: false\n };\n },\n created: function created() {\n this.newValue = this.value;\n this.newPort = this.port;\n this.newTaskType = this.taskType;\n this.newTaskIndex = this.taskIndex;\n this.localEnableSmartTfConfig = this.enableSmartTfConfig;\n },\n\n\n watch: {\n value: function value() {\n this.newValue = this.value;\n },\n port: function port() {\n this.newPort = this.port;\n },\n taskType: function taskType() {\n this.newTaskType = this.taskType;\n },\n taskIndex: function taskIndex() {\n this.newTaskIndex = this.taskIndex;\n },\n tfCluster: function tfCluster() {\n if (this.newTaskIndex >= 0) {\n var value = {\n cluster: this.tfCluster,\n task: {\n type: this.newTaskType,\n index: this.newTaskIndex\n }\n };\n this.updateValue('\\'' + __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(value).split('\"').join('\\\\\"') + '\\'');\n } else {\n this.updateValue('');\n }\n },\n enableSmartTfConfig: function enableSmartTfConfig() {\n this.localEnableSmartTfConfig = this.enableSmartTfConfig;\n },\n newValue: function newValue() {\n this.$emit('changeTfConfig', this.newValue);\n },\n newPort: function newPort() {\n this.$emit('updateTfConfigPort', this.newPort);\n },\n newTaskType: function newTaskType() {\n this.$emit('updateTfConfigTaskType', this.newTaskType);\n },\n newTaskIndex: function newTaskIndex() {\n if (isNaN(parseInt(this.newTaskIndex))) {\n this.newTaskIndex = this.taskIndex;\n } else {\n // FIXME there is edge case when index is 0 and it's the only task of this type - it occurs when you change by button\n this.$emit('updateTfConfigTaskIndex', parseInt(this.newTaskIndex));\n }\n }\n },\n\n methods: {\n removeMe: function removeMe() {\n this.$emit('deleteTfConfig');\n },\n\n updateValue: function updateValue(newValue) {\n this.newValue = newValue;\n }\n }\n});\n\n/***/ }),\n/* 207 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'TfConfigEdit',\n\n props: {\n value: String,\n showModal: Boolean\n },\n\n data: function data() {\n return {\n newValue: '',\n properJson: false,\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();else this.newValue = this.desanitize(this.value);\n },\n newValue: function newValue() {\n try {\n JSON.parse(this.newValue);\n this.properJson = true;\n } catch (e) {\n this.properJson = false;\n }\n }\n },\n\n methods: {\n close: function close() {\n this.$emit('close');\n },\n\n save: function save() {\n this.close();\n this.$emit('updateValue', this.sanitize(this.newValue));\n },\n\n sanitize: function sanitize(value) {\n value = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(JSON.parse(value));\n return '\\'' + value.split('\"').join('\\\\\"') + '\\'';\n },\n\n desanitize: function desanitize(value) {\n try {\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(JSON.parse(value.split('\\'').join('').split('\\\\\"').join('\"')), null, 2);\n } catch (e) {\n return value;\n }\n }\n }\n});\n\n/***/ }),\n/* 208 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n showModal: Boolean,\n taskId: Number,\n hostname: String,\n command: String,\n actionFlag: Boolean\n },\n\n data: function data() {\n return {\n newHost: '',\n newCommand: '',\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n hostname: function hostname() {\n this.newHost = this.hostname;\n },\n command: function command() {\n this.newCommand = this.command;\n }\n },\n\n methods: {\n changeTask: function changeTask() {\n var _this = this;\n\n var newTask = {\n hostname: this.newHost,\n command: this.newCommand\n };\n if (!this.actionFlag) {\n this.$emit('changeActionFlag', true);\n this.$emit('changeSnackbar', true);\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/tasks/' + this.taskId, this.$store.state.accessToken, newTask).then(function (response) {\n _this.close();\n _this.$emit('getTask', _this.taskId, true);\n });\n }\n },\n\n close: function close() {\n this.$emit('close');\n }\n }\n});\n\n/***/ }),\n/* 209 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n showModal: Boolean,\n taskId: Number,\n spawnTime: String,\n terminateTime: String,\n actionFlag: Boolean,\n multipleFlag: Boolean,\n selected: Array\n },\n\n data: function data() {\n return {\n spawnTimeMenu: false,\n spawnDateMenu: false,\n terminateTimeMenu: false,\n terminateDateMenu: false,\n spawn: false,\n terminate: false,\n newSpawnDate: '',\n newSpawnTime: '',\n newTerminateDate: '',\n newTerminateTime: '',\n selectedIndex: 0,\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n spawnTime: function spawnTime() {\n if (this.spawnTime !== null) {\n this.newSpawnDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.spawnTime).format('YYYY-MM-DD');\n this.newSpawnTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.spawnTime).format('HH:mm');\n } else {\n this.newSpawnDate = '';\n this.newSpawnTime = '';\n }\n },\n terminateTime: function terminateTime() {\n if (this.terminateTime !== null) {\n this.newTerminateDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.terminateTime).format('YYYY-MM-DD');\n this.newTerminateTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.terminateTime).format('HH:mm');\n } else {\n this.newTerminateDate = '';\n this.newTerminateTime = '';\n }\n }\n },\n\n methods: {\n actionSave: function actionSave() {\n this.$refs.menu.save(this.newSpawnTime);\n },\n\n checkActionFlag: function checkActionFlag() {\n if (this.actionFlag === false) {\n this.$emit('changeActionFlag', true);\n this.$emit('changeSnackbar', true);\n this.scheduleTasks();\n }\n },\n\n scheduleTasks: function scheduleTasks() {\n var _this = this;\n\n var newTask = {};\n if (this.newSpawnTime !== '' && this.newSpawnTime !== null && this.newSpawnTime !== undefined) {\n newTask['spawnAt'] = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newSpawnDate + 'T' + this.newSpawnTime).toISOString();\n }\n if (this.newTerminateTime !== '' && this.newTerminateTime !== null && this.newTerminateTime !== undefined) {\n newTask['terminateAt'] = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newTerminateDate + 'T' + this.newTerminateTime).toISOString();\n }\n if (!this.spawn) {\n newTask['spawnAt'] = null;\n }\n if (!this.terminate) {\n newTask['terminateAt'] = null;\n }\n var id;\n if (this.multipleFlag) {\n id = this.selected[this.selectedIndex].id;\n } else {\n id = this.taskId;\n }\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/tasks/' + id, this.$store.state.accessToken, newTask).then(function (response) {\n _this.close();\n _this.getTask(id);\n }).catch(function (error) {\n _this.$emit('handleError', error);\n _this.close();\n _this.getTask(id);\n });\n },\n\n getTask: function getTask(id) {\n var _this2 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this2.$emit('updateTask', id, response.data.task);\n if (_this2.multipleFlag) {\n _this2.selectedIndex++;\n if (_this2.selectedIndex < _this2.selected.length) {\n _this2.scheduleTasks();\n } else {\n _this2.selectedIndex = 0;\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n } else {\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n }).catch(function (error) {\n _this2.$emit('handleError', error);\n if (_this2.multipleFlag) {\n _this2.selectedIndex++;\n if (_this2.selectedIndex < _this2.selected.length) {\n _this2.scheduleTasks();\n } else {\n _this2.selectedIndex = 0;\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n } else {\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n });\n },\n\n close: function close() {\n this.$emit('close');\n }\n }\n});\n\n/***/ }),\n/* 210 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n showModal: Boolean,\n lines: Array,\n path: String,\n taskId: Number\n },\n data: function data() {\n return {\n show: false,\n tailMode: false,\n autoRefresh: false,\n autoRefreshIntervalId: -1\n };\n },\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n tailMode: function tailMode() {\n this.refresh();\n },\n autoRefresh: function autoRefresh() {\n this.toggleAutoRefresh();\n }\n },\n methods: {\n close: function close() {\n if (this.autoRefreshIntervalId !== -1) {\n window.clearInterval(this.autoRefreshIntervalId);\n this.autoRefreshIntervalId = -1;\n }\n this.$emit('close');\n },\n refresh: function refresh() {\n this.$emit('getLog', this.taskId, this.tailMode);\n if (this.autoRefresh && !this.tailMode) {\n this.autoRefresh = false;\n this.toggleAutoRefresh();\n }\n },\n toggleAutoRefresh: function toggleAutoRefresh() {\n if (this.autoRefresh) {\n this.autoRefreshIntervalId = window.setInterval(this.refresh, 5000);\n } else {\n window.clearInterval(this.autoRefreshIntervalId);\n this.autoRefreshIntervalId = -1;\n }\n }\n }\n});\n\n/***/ }),\n/* 211 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'TaskTemplateChooser',\n\n props: {\n showModal: Boolean\n },\n\n data: function data() {\n return {\n chosenTemplate: '',\n possibleTemplates: ['No template', 'TensorFlow - cluster parameters', 'TensorFlow - TF_CONFIG', 'PyTorch'],\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n }\n },\n\n methods: {\n close: function close() {\n this.$emit('close');\n },\n\n setChosenTemplate: function setChosenTemplate(templateName) {\n switch (templateName) {\n case 'Tensorflow - cluster parameters':\n this.chosenTemplate = 'tf1';\n break;\n case 'Tensorflow - TF_CONFIG':\n this.chosenTemplate = 'tf2';\n break;\n case 'PyTorch':\n this.chosenTemplate = 'torch';\n break;\n default:\n this.chosenTemplate = '';\n }\n },\n\n goToCreate: function goToCreate() {\n this.close();\n this.$emit('openFromTemplate', this.chosenTemplate);\n }\n }\n});\n\n/***/ }),\n/* 212 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n data: function data() {\n return {\n dialog: false,\n search: '',\n pagination: {},\n selected: [],\n headers: [{ text: 'User id', value: 'id' }, { text: 'Username', value: 'username' }, { text: 'Email', value: 'email' }, { text: 'Created at', value: 'createdAt' }, { text: 'Role', value: 'role' }, { text: 'Actions', value: 'id' }],\n users: [],\n user: {\n id: -1,\n username: '',\n email: '',\n password: '',\n password2: '',\n roles: []\n },\n currentUser: {},\n time: 1000,\n alert: false,\n errorMessage: '',\n userCheckbox: false,\n adminCheckbox: false,\n modalUsername: '',\n modalEmail: '',\n modalPassword: '',\n modalPassword2: '',\n modalAlert: false,\n showModalRemove: false,\n userId: -1,\n created: false,\n showModal: false\n };\n },\n\n\n computed: {\n pages: function pages() {\n if (this.pagination.rowsPerPage == null || this.pagination.totalItems == null) return 0;\n\n return Math.ceil(this.pagination.totalItems / this.pagination.rowsPerPage);\n }\n },\n\n mounted: function mounted() {\n this.checkUsers();\n },\n\n\n methods: {\n prettyDate: function prettyDate(date) {\n if (date !== null) {\n return __WEBPACK_IMPORTED_MODULE_1_moment___default()(date).format('dddd, MMMM Do, HH:mm');\n } else {\n return null;\n }\n },\n\n\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n },\n\n createUser: function createUser() {\n var _this = this;\n\n if (this.modalPassword === this.modalPassword2) {\n var modalUsername = this.modalUsername,\n modalEmail = this.modalEmail,\n modalPassword = this.modalPassword;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('post', '/user/create', this.$store.state.accessToken, { 'username': modalUsername, 'email': modalEmail, 'password': modalPassword }).then(function (response) {\n _this.showModal = false;\n _this.created = true;\n _this.checkUsers();\n }).catch(function (error) {\n _this.handleError(error);\n _this.modalAlert = true;\n });\n } else {\n this.errorMessage = 'Passwords do not match';\n this.modalAlert = true;\n }\n },\n\n\n editUser: function editUser(currentUser) {\n this.dialog = true;\n this.user.id = currentUser.id;\n this.user.username = currentUser.username;\n this.user.email = currentUser.email;\n var admin = false;\n for (var role in currentUser.roles) {\n if (currentUser.roles[role] === 'admin') {\n admin = true;\n }\n }\n this.adminCheckbox = admin;\n this.currentUser = currentUser;\n },\n\n updateUser: function updateUser() {\n var _this2 = this;\n\n if (this.user.password === this.user.password2) {\n if (this.adminCheckbox) {\n this.user.roles.push('admin');\n }\n this.user.roles.push('user');\n var updatedUser = {\n id: this.user.id\n };\n if (this.user.username !== this.currentUser.username && this.user.username !== '') {\n updatedUser['username'] = this.user.username;\n }\n if (this.user.email !== this.currentUser.email && this.user.email !== '') {\n updatedUser['email'] = this.user.email;\n }\n if (this.user.password !== '') {\n updatedUser['password'] = this.user.password;\n }\n if (this.user.roles.length !== this.currentUser.roles.length) {\n updatedUser['roles'] = this.user.roles;\n }\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/user', this.$store.state.accessToken, updatedUser).then(function (response) {\n _this2.user = {\n id: -1,\n username: '',\n email: '',\n password: '',\n password2: '',\n roles: []\n };\n _this2.adminCheckbox = false;\n _this2.userCheckbox = false;\n _this2.dialog = false;\n _this2.checkUsers();\n }).catch(function (error) {\n _this2.pagination = {};\n _this2.handleError(error);\n _this2.alert = true;\n });\n } else {\n this.errorMessage = 'Passwords do not match';\n this.alert = true;\n }\n },\n checkUsers: function checkUsers() {\n var _this3 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/users', this.$store.state.accessToken).then(function (response) {\n _this3.users = response.data;\n for (var user in _this3.users) {\n var admin = false;\n for (var role in _this3.users[user].roles) {\n if (_this3.users[user].roles[role] === 'admin') {\n admin = true;\n }\n }\n if (admin) {\n _this3.users[user]['role'] = 'admin';\n } else {\n _this3.users[user]['role'] = 'user';\n }\n }\n _this3.pagination['totalItems'] = _this3.users.length;\n _this3.pagination['rowsPerPage'] = 30;\n }).catch(function (error) {\n _this3.pagination = {};\n _this3.handleError(error);\n _this3.alert = true;\n });\n },\n\n showConfirmationDialog: function showConfirmationDialog(id) {\n this.userId = id;\n this.showModalRemove = true;\n },\n\n\n removeUser: function removeUser() {\n var _this4 = this;\n\n var userId = this.userId;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('delete', '/user/delete/' + userId, this.$store.state.accessToken).then(function (response) {\n _this4.showModalRemove = false;\n _this4.checkUsers();\n }).catch(function (error) {\n _this4.handleError(error);\n _this4.alert = true;\n });\n }\n }\n});\n\n/***/ }),\n/* 213 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'App',\n\n data: function data() {\n return {\n section: 'Head'\n };\n }\n});\n\n/***/ }),\n/* 214 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__ = __webpack_require__(215);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_es6_promise_auto__ = __webpack_require__(247);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_es6_promise_auto___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_es6_promise_auto__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_vue__ = __webpack_require__(30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_vue_router__ = __webpack_require__(251);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__ = __webpack_require__(252);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_vuex_router_sync___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__routes__ = __webpack_require__(253);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__store__ = __webpack_require__(360);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__filters__ = __webpack_require__(365);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__components_App_vue__ = __webpack_require__(366);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_vuetify__ = __webpack_require__(368);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_vuetify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_vuetify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css__ = __webpack_require__(369);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css__ = __webpack_require__(370);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14_axios__ = __webpack_require__(54);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14_axios___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_14_axios__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__config__ = __webpack_require__(31);\n\n\n// Import ES6 Promise\n\n\n// Import System requirements\n\n\n\n\n\n\n\n\n// Import Helpers for filters\n\n\n// Import Views - Top level\n\n\n\n\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_14_axios___default.a.get('static/config.json').then(function (response) {\n __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI = response.data.apiPath;\n __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion = response.data.apiVersion;\n __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version = response.data.version;\n if (window.localStorage) {\n var apiVersion = JSON.parse(window.localStorage.getItem('apiVersion'));\n var version = JSON.parse(window.localStorage.getItem('version'));\n if (apiVersion === null) {\n if (__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion !== undefined) {\n window.localStorage.setItem('apiVersion', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion));\n } else {\n window.localStorage.setItem('apiVersion', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()('no data in config file'));\n }\n } else if (apiVersion !== __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion) {\n window.localStorage.clear();\n location.reload(true);\n }\n if (version === null) {\n if (__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version !== undefined) {\n window.localStorage.setItem('version', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version));\n } else {\n window.localStorage.setItem('version', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()('no data in config file'));\n }\n } else if (version !== __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version) {\n window.localStorage.clear();\n location.reload(true);\n }\n }\n\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].use(__WEBPACK_IMPORTED_MODULE_11_vuetify___default.a);\n\n // Import Install and register helper items\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('count', __WEBPACK_IMPORTED_MODULE_9__filters__[\"a\" /* count */]);\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('domain', __WEBPACK_IMPORTED_MODULE_9__filters__[\"b\" /* domain */]);\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('prettyDate', __WEBPACK_IMPORTED_MODULE_9__filters__[\"d\" /* prettyDate */]);\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('pluralize', __WEBPACK_IMPORTED_MODULE_9__filters__[\"c\" /* pluralize */]);\n\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].use(__WEBPACK_IMPORTED_MODULE_4_vue_router__[\"a\" /* default */]);\n\n // Routing logic\n var router = new __WEBPACK_IMPORTED_MODULE_4_vue_router__[\"a\" /* default */]({\n routes: __WEBPACK_IMPORTED_MODULE_6__routes__[\"a\" /* default */],\n mode: 'history',\n linkExactActiveClass: 'active',\n scrollBehavior: function scrollBehavior(to, from, savedPosition) {\n return savedPosition || { x: 0, y: 0 };\n }\n });\n\n // Some middleware to help us ensure the user is authenticated.\n router.beforeEach(function (to, from, next) {\n if (to.matched.some(function (record) {\n return record.meta.requiresAuth;\n }) && (!router.app.$store.state.accessToken || router.app.$store.state.accessToken === 'null')) {\n // this route requires auth, check if logged in\n // if not, redirect to login page.\n window.console.log('Not authenticated');\n next({\n path: '/login',\n query: { redirect: to.fullPath }\n });\n } else if (to.meta.role === 'admin') {\n if (router.app.$store.state.role === 'admin') {\n next();\n } else {\n next({\n path: '/',\n query: { redirect: to.fullPath }\n });\n }\n } else {\n next();\n }\n });\n\n Object(__WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__[\"sync\"])(__WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */], router);\n\n __WEBPACK_IMPORTED_MODULE_14_axios___default.a.interceptors.response.use(null, function (error) {\n if (error.config.url === __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI + '/user/refresh') {\n if (window.localStorage) {\n window.localStorage.setItem('user', null);\n window.localStorage.setItem('role', null);\n window.localStorage.setItem('accessToken', null);\n window.localStorage.setItem('refreshToken', null);\n }\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_USER', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ROLE', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_REFRESH_TOKEN', null);\n router.push('/login');\n } else {\n if (error.config && error.response && error.response.status === 401 && error.config.url !== __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI + '/user/login') {\n __WEBPACK_IMPORTED_MODULE_14_axios___default.a.defaults.headers.common['Authorization'] = __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.refreshToken;\n return __WEBPACK_IMPORTED_MODULE_14_axios___default()({ method: 'get', url: __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI + '/user/refresh', data: null }).then(function (response) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', 'Bearer ' + response.data.access_token);\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', 'Bearer ' + response.data.access_token);\n }\n error.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;\n return __WEBPACK_IMPORTED_MODULE_14_axios___default.a.request(error.config);\n }).catch(function (error) {\n handleError(error);\n logout();\n });\n }\n }\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default.a.reject(error);\n });\n // Check local storage to handle refreshes\n if (window.localStorage) {\n var localUserString = window.localStorage.getItem('user') || 'null';\n var localUser = JSON.parse(localUserString);\n\n if (localUser && __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.user !== localUser) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_USER', localUser);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', window.localStorage.getItem('accessToken'));\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_REFRESH_TOKEN', window.localStorage.getItem('refreshToken'));\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ROLE', window.localStorage.getItem('role'));\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ID', parseInt(window.localStorage.getItem('userId')));\n }\n }\n function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n console.log(error.message);\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n console.log(error.response.data);\n } else {\n console.log(error.response.data.msg);\n }\n }\n }\n\n function logout() {\n var _this = this;\n\n if (__WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.accessToken !== null) {\n __WEBPACK_IMPORTED_MODULE_8__api__[\"a\" /* default */].request('delete', '/user/logout', __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.accessToken).then(function (response) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', null);\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', null);\n }\n if (__WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.refreshToken !== null) {\n __WEBPACK_IMPORTED_MODULE_8__api__[\"a\" /* default */].request('delete', '/user/logout/refresh_token', __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.refreshToken).then(function (response) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_REFRESH_TOKEN', null);\n if (window.localStorage) {\n window.localStorage.setItem('refreshToken', null);\n }\n }).catch(function (error) {\n handleError(error);\n });\n }\n }).catch(function (error) {\n _this.handleError(error);\n });\n }\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_USER', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ROLE', null);\n\n if (window.localStorage) {\n window.localStorage.setItem('user', null);\n window.localStorage.setItem('role', null);\n }\n router.push('/login');\n }\n // Start out app!\n // eslint-disable-next-line no-new\n new __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"]({\n el: '#root',\n router: router,\n store: __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */],\n render: function render(h) {\n return h(__WEBPACK_IMPORTED_MODULE_10__components_App_vue__[\"a\" /* default */]);\n }\n });\n});\n\n/***/ }),\n/* 215 */,\n/* 216 */,\n/* 217 */,\n/* 218 */,\n/* 219 */,\n/* 220 */,\n/* 221 */,\n/* 222 */,\n/* 223 */,\n/* 224 */,\n/* 225 */,\n/* 226 */,\n/* 227 */,\n/* 228 */,\n/* 229 */,\n/* 230 */,\n/* 231 */,\n/* 232 */,\n/* 233 */,\n/* 234 */,\n/* 235 */,\n/* 236 */,\n/* 237 */,\n/* 238 */,\n/* 239 */,\n/* 240 */,\n/* 241 */,\n/* 242 */,\n/* 243 */,\n/* 244 */,\n/* 245 */,\n/* 246 */,\n/* 247 */,\n/* 248 */,\n/* 249 */,\n/* 250 */,\n/* 251 */,\n/* 252 */,\n/* 253 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_TheDash_vue__ = __webpack_require__(254);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_TheLogin_vue__ = __webpack_require__(283);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_404_vue__ = __webpack_require__(286);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_views_ReservationsOverview_vue__ = __webpack_require__(289);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__components_views_NodesOverview_vue__ = __webpack_require__(308);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__components_views_TasksOverview_vue__ = __webpack_require__(321);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__components_views_UsersOverview_vue__ = __webpack_require__(357);\n\n\n\n// Import Views - Dash\n\n\n\n\n// Routes\nvar routes = [{\n path: '/',\n component: __WEBPACK_IMPORTED_MODULE_0__components_TheDash_vue__[\"a\" /* default */],\n children: [{\n path: '/reservations_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_3__components_views_ReservationsOverview_vue__[\"a\" /* default */],\n name: 'Reservation Overview',\n meta: {\n description: 'Calendar with reservations',\n requiresAuth: true,\n role: 'user'\n }\n }, {\n path: 'nodes_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_4__components_views_NodesOverview_vue__[\"a\" /* default */],\n name: 'Nodes overview',\n meta: {\n description: 'Informations about nodes',\n requiresAuth: true,\n role: 'user'\n }\n }, {\n path: 'tasks_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_5__components_views_TasksOverview_vue__[\"a\" /* default */],\n name: 'Tasks overview',\n meta: {\n description: 'Tasks overview',\n requiresAuth: true,\n role: 'user'\n }\n }, {\n path: 'users_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_6__components_views_UsersOverview_vue__[\"a\" /* default */],\n name: 'Users overview',\n meta: {\n description: 'Table users view for admin',\n requiresAuth: true,\n role: 'admin'\n }\n }]\n}, {\n path: '/login',\n component: __WEBPACK_IMPORTED_MODULE_1__components_TheLogin_vue__[\"a\" /* default */],\n meta: {\n role: 'user'\n }\n}, {\n path: '*',\n component: __WEBPACK_IMPORTED_MODULE_2__components_404_vue__[\"a\" /* default */]\n}];\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (routes);\n\n/***/ }),\n/* 254 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheDash_vue__ = __webpack_require__(51);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ebd4a91c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheDash_vue__ = __webpack_require__(282);\nfunction injectStyle (ssrContext) {\n __webpack_require__(255)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheDash_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ebd4a91c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheDash_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 256 */,\n/* 257 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebar_vue__ = __webpack_require__(52);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_8c8911fe_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebar_vue__ = __webpack_require__(262);\nfunction injectStyle (ssrContext) {\n __webpack_require__(258)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebar_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_8c8911fe_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebar_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 259 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebarMenu_vue__ = __webpack_require__(53);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1ff073b3_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebarMenu_vue__ = __webpack_require__(261);\nfunction injectStyle (ssrContext) {\n __webpack_require__(260)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebarMenu_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1ff073b3_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebarMenu_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 261 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"sidebar-menu\"},[_c('li',{staticClass:\"header\"},[_vm._v(\"SCHEDULE\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/reservations_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-calendar-check-o\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Reservations Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"RESOURCES\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/nodes_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-bar-chart\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Nodes Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"TASKS\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/tasks_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-tasks\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Tasks Overview\")])])]),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('li',{staticClass:\"header\"},[_vm._v(\"\\n ADMIN ZONE\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/users_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-users\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Users Overview\")])])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 262 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{staticClass:\"main-sidebar\"},[_c('section',{staticClass:\"sidebar\"},[_c('BaseSidebarMenu')],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 263 */,\n/* 264 */,\n/* 265 */,\n/* 266 */,\n/* 267 */,\n/* 268 */,\n/* 269 */,\n/* 270 */,\n/* 271 */,\n/* 272 */,\n/* 273 */,\n/* 274 */,\n/* 275 */,\n/* 276 */,\n/* 277 */,\n/* 278 */,\n/* 279 */,\n/* 280 */,\n/* 281 */,\n/* 282 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:['wrapper', _vm.classes]},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('header',{staticClass:\"main-header\"},[_c('nav',{staticClass:\"navbar navbar-static-top\",attrs:{\"role\":\"navigation\"}},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"version_info\"},[_c('b',[_vm._v(\"TensorHive\")]),_vm._v(\" v\"+_vm._s(_vm.version)+\" \"),_c('b',[_vm._v(\"API\")]),_vm._v(\" v\"+_vm._s(_vm.apiVersion)+\"\\n \")]),_vm._v(\" \"),_c('v-menu',{staticClass:\"user_chip\",attrs:{\"close-on-content-click\":false,\"offset-y\":\"\"}},[_c('v-chip',{attrs:{\"slot\":\"activator\",\"color\":\"green\",\"text-color\":\"white\"},slot:\"activator\"},[_c('v-avatar',[_c('v-icon',[_vm._v(\"account_circle\")])],1),_vm._v(\"\\n \"+_vm._s(_vm.displayName)+\"\\n \")],1),_vm._v(\" \"),_c('v-card',[_c('v-card-actions',[_c('v-btn',{attrs:{\"flat\":\"\"},on:{\"click\":function($event){return _vm.logout()}}},[_vm._v(\"Logout\")])],1)],1)],1)],1)]),_vm._v(\" \"),_c('BaseSidebar'),_vm._v(\" \"),_c('div',{staticClass:\"content-wrapper\"},[_c('router-view')],1),_vm._v(\" \"),_c('v-footer',{attrs:{\"height\":\"auto\",\"color\":\"#222d32\"}},[_c('v-layout',{attrs:{\"justify-center\":\"\",\"row\":\"\",\"wrap\":\"\"}},[_c('v-flex',{attrs:{\"text-xs-center\":\"\",\"white--text\":\"\",\"xs12\":\"\"}},[_vm._v(\"\\n Found a bug or needs some improvements? Leave us an \"),_c('a',{attrs:{\"href\":\"https://github.com/roscisz/TensorHive/issues\"}},[_vm._v(\"issue on Github\")]),_vm._v(\")\\n \")])],1)],1)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{staticClass:\"sidebar-toggle\",attrs:{\"href\":\"javascript:;\",\"data-toggle\":\"offcanvas\",\"role\":\"button\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Toggle navigation\")])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 283 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheLogin_vue__ = __webpack_require__(60);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_67170a3e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheLogin_vue__ = __webpack_require__(285);\nfunction injectStyle (ssrContext) {\n __webpack_require__(284)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-67170a3e\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheLogin_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_67170a3e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheLogin_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 285 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"login\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Register new account\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"UNIX username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Repeat password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\"\\n Please copy the key below and paste it into \"),_c('b',[_vm._v(\"~/.ssh/authorized_keys\")]),_vm._v(\".\"),_c('br'),_vm._v(\"It will allow TensorHive to confirm your identity and access machines with provided UNIX username.\\n \"),_c('v-textarea',{attrs:{\"solo\":\"\",\"name\":\"entry\",\"value\":_vm.entry,\"id\":\"entry\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\"},on:{\"click\":_vm.copyEntryToClipboard}},[_vm._v(\"Copy to clipboard\")]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Register\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-center col-sm-12\"},[_c('form',{staticClass:\"login-form\",on:{\"submit\":function($event){$event.preventDefault();return _vm.checkCreds($event)}}},[_vm._v(\"\\n Login to your account\\n \"),_c('div',{staticClass:\"input-group\"},[_vm._m(0),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.username),expression:\"username\"}],staticClass:\"form-control\",attrs:{\"name\":\"username\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.username=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_vm._m(1),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],staticClass:\"form-control\",attrs:{\"name\":\"password\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n Identity verification succeeded, account has been successfully created. You can now log in.\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\"},on:{\"click\":_vm.requestEntry}},[_vm._v(\"Register\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Login\\n \")])],1)])],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 286 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_404_vue__ = __webpack_require__(61);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_209d35e8_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_404_vue__ = __webpack_require__(288);\nfunction injectStyle (ssrContext) {\n __webpack_require__(287)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_404_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_209d35e8_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_404_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 288 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"notFound\"}},[_c('div',{staticClass:\"text-center col-sm-12\"},[_c('h1',[_vm._v(\"You are lost.\")]),_vm._v(\" \"),_c('h4',[_vm._v(\"This page doesn't exist.\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"vertical-5p lead\",attrs:{\"to\":\"/\"}},[_vm._v(\"Take me home.\")])],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 289 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_ReservationsOverview_vue__ = __webpack_require__(62);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_a758ccee_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_ReservationsOverview_vue__ = __webpack_require__(307);\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_ReservationsOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_a758ccee_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_ReservationsOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 290 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendar_vue__ = __webpack_require__(64);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_f3e7eb0c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendar_vue__ = __webpack_require__(300);\nfunction injectStyle (ssrContext) {\n __webpack_require__(291)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendar_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_f3e7eb0c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendar_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 292 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarReserve_vue__ = __webpack_require__(65);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_6b687e6b_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarReserve_vue__ = __webpack_require__(295);\nfunction injectStyle (ssrContext) {\n __webpack_require__(293)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-6b687e6b\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarReserve_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_6b687e6b_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarReserve_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./af\": 66,\n\t\"./af.js\": 66,\n\t\"./ar\": 67,\n\t\"./ar-dz\": 68,\n\t\"./ar-dz.js\": 68,\n\t\"./ar-kw\": 69,\n\t\"./ar-kw.js\": 69,\n\t\"./ar-ly\": 70,\n\t\"./ar-ly.js\": 70,\n\t\"./ar-ma\": 71,\n\t\"./ar-ma.js\": 71,\n\t\"./ar-sa\": 72,\n\t\"./ar-sa.js\": 72,\n\t\"./ar-tn\": 73,\n\t\"./ar-tn.js\": 73,\n\t\"./ar.js\": 67,\n\t\"./az\": 74,\n\t\"./az.js\": 74,\n\t\"./be\": 75,\n\t\"./be.js\": 75,\n\t\"./bg\": 76,\n\t\"./bg.js\": 76,\n\t\"./bm\": 77,\n\t\"./bm.js\": 77,\n\t\"./bn\": 78,\n\t\"./bn.js\": 78,\n\t\"./bo\": 79,\n\t\"./bo.js\": 79,\n\t\"./br\": 80,\n\t\"./br.js\": 80,\n\t\"./bs\": 81,\n\t\"./bs.js\": 81,\n\t\"./ca\": 82,\n\t\"./ca.js\": 82,\n\t\"./cs\": 83,\n\t\"./cs.js\": 83,\n\t\"./cv\": 84,\n\t\"./cv.js\": 84,\n\t\"./cy\": 85,\n\t\"./cy.js\": 85,\n\t\"./da\": 86,\n\t\"./da.js\": 86,\n\t\"./de\": 87,\n\t\"./de-at\": 88,\n\t\"./de-at.js\": 88,\n\t\"./de-ch\": 89,\n\t\"./de-ch.js\": 89,\n\t\"./de.js\": 87,\n\t\"./dv\": 90,\n\t\"./dv.js\": 90,\n\t\"./el\": 91,\n\t\"./el.js\": 91,\n\t\"./en-SG\": 92,\n\t\"./en-SG.js\": 92,\n\t\"./en-au\": 93,\n\t\"./en-au.js\": 93,\n\t\"./en-ca\": 94,\n\t\"./en-ca.js\": 94,\n\t\"./en-gb\": 95,\n\t\"./en-gb.js\": 95,\n\t\"./en-ie\": 96,\n\t\"./en-ie.js\": 96,\n\t\"./en-il\": 97,\n\t\"./en-il.js\": 97,\n\t\"./en-nz\": 98,\n\t\"./en-nz.js\": 98,\n\t\"./eo\": 99,\n\t\"./eo.js\": 99,\n\t\"./es\": 100,\n\t\"./es-do\": 101,\n\t\"./es-do.js\": 101,\n\t\"./es-us\": 102,\n\t\"./es-us.js\": 102,\n\t\"./es.js\": 100,\n\t\"./et\": 103,\n\t\"./et.js\": 103,\n\t\"./eu\": 104,\n\t\"./eu.js\": 104,\n\t\"./fa\": 105,\n\t\"./fa.js\": 105,\n\t\"./fi\": 106,\n\t\"./fi.js\": 106,\n\t\"./fo\": 107,\n\t\"./fo.js\": 107,\n\t\"./fr\": 108,\n\t\"./fr-ca\": 109,\n\t\"./fr-ca.js\": 109,\n\t\"./fr-ch\": 110,\n\t\"./fr-ch.js\": 110,\n\t\"./fr.js\": 108,\n\t\"./fy\": 111,\n\t\"./fy.js\": 111,\n\t\"./ga\": 112,\n\t\"./ga.js\": 112,\n\t\"./gd\": 113,\n\t\"./gd.js\": 113,\n\t\"./gl\": 114,\n\t\"./gl.js\": 114,\n\t\"./gom-latn\": 115,\n\t\"./gom-latn.js\": 115,\n\t\"./gu\": 116,\n\t\"./gu.js\": 116,\n\t\"./he\": 117,\n\t\"./he.js\": 117,\n\t\"./hi\": 118,\n\t\"./hi.js\": 118,\n\t\"./hr\": 119,\n\t\"./hr.js\": 119,\n\t\"./hu\": 120,\n\t\"./hu.js\": 120,\n\t\"./hy-am\": 121,\n\t\"./hy-am.js\": 121,\n\t\"./id\": 122,\n\t\"./id.js\": 122,\n\t\"./is\": 123,\n\t\"./is.js\": 123,\n\t\"./it\": 124,\n\t\"./it-ch\": 125,\n\t\"./it-ch.js\": 125,\n\t\"./it.js\": 124,\n\t\"./ja\": 126,\n\t\"./ja.js\": 126,\n\t\"./jv\": 127,\n\t\"./jv.js\": 127,\n\t\"./ka\": 128,\n\t\"./ka.js\": 128,\n\t\"./kk\": 129,\n\t\"./kk.js\": 129,\n\t\"./km\": 130,\n\t\"./km.js\": 130,\n\t\"./kn\": 131,\n\t\"./kn.js\": 131,\n\t\"./ko\": 132,\n\t\"./ko.js\": 132,\n\t\"./ku\": 133,\n\t\"./ku.js\": 133,\n\t\"./ky\": 134,\n\t\"./ky.js\": 134,\n\t\"./lb\": 135,\n\t\"./lb.js\": 135,\n\t\"./lo\": 136,\n\t\"./lo.js\": 136,\n\t\"./lt\": 137,\n\t\"./lt.js\": 137,\n\t\"./lv\": 138,\n\t\"./lv.js\": 138,\n\t\"./me\": 139,\n\t\"./me.js\": 139,\n\t\"./mi\": 140,\n\t\"./mi.js\": 140,\n\t\"./mk\": 141,\n\t\"./mk.js\": 141,\n\t\"./ml\": 142,\n\t\"./ml.js\": 142,\n\t\"./mn\": 143,\n\t\"./mn.js\": 143,\n\t\"./mr\": 144,\n\t\"./mr.js\": 144,\n\t\"./ms\": 145,\n\t\"./ms-my\": 146,\n\t\"./ms-my.js\": 146,\n\t\"./ms.js\": 145,\n\t\"./mt\": 147,\n\t\"./mt.js\": 147,\n\t\"./my\": 148,\n\t\"./my.js\": 148,\n\t\"./nb\": 149,\n\t\"./nb.js\": 149,\n\t\"./ne\": 150,\n\t\"./ne.js\": 150,\n\t\"./nl\": 151,\n\t\"./nl-be\": 152,\n\t\"./nl-be.js\": 152,\n\t\"./nl.js\": 151,\n\t\"./nn\": 153,\n\t\"./nn.js\": 153,\n\t\"./pa-in\": 154,\n\t\"./pa-in.js\": 154,\n\t\"./pl\": 155,\n\t\"./pl.js\": 155,\n\t\"./pt\": 156,\n\t\"./pt-br\": 157,\n\t\"./pt-br.js\": 157,\n\t\"./pt.js\": 156,\n\t\"./ro\": 158,\n\t\"./ro.js\": 158,\n\t\"./ru\": 159,\n\t\"./ru.js\": 159,\n\t\"./sd\": 160,\n\t\"./sd.js\": 160,\n\t\"./se\": 161,\n\t\"./se.js\": 161,\n\t\"./si\": 162,\n\t\"./si.js\": 162,\n\t\"./sk\": 163,\n\t\"./sk.js\": 163,\n\t\"./sl\": 164,\n\t\"./sl.js\": 164,\n\t\"./sq\": 165,\n\t\"./sq.js\": 165,\n\t\"./sr\": 166,\n\t\"./sr-cyrl\": 167,\n\t\"./sr-cyrl.js\": 167,\n\t\"./sr.js\": 166,\n\t\"./ss\": 168,\n\t\"./ss.js\": 168,\n\t\"./sv\": 169,\n\t\"./sv.js\": 169,\n\t\"./sw\": 170,\n\t\"./sw.js\": 170,\n\t\"./ta\": 171,\n\t\"./ta.js\": 171,\n\t\"./te\": 172,\n\t\"./te.js\": 172,\n\t\"./tet\": 173,\n\t\"./tet.js\": 173,\n\t\"./tg\": 174,\n\t\"./tg.js\": 174,\n\t\"./th\": 175,\n\t\"./th.js\": 175,\n\t\"./tl-ph\": 176,\n\t\"./tl-ph.js\": 176,\n\t\"./tlh\": 177,\n\t\"./tlh.js\": 177,\n\t\"./tr\": 178,\n\t\"./tr.js\": 178,\n\t\"./tzl\": 179,\n\t\"./tzl.js\": 179,\n\t\"./tzm\": 180,\n\t\"./tzm-latn\": 181,\n\t\"./tzm-latn.js\": 181,\n\t\"./tzm.js\": 180,\n\t\"./ug-cn\": 182,\n\t\"./ug-cn.js\": 182,\n\t\"./uk\": 183,\n\t\"./uk.js\": 183,\n\t\"./ur\": 184,\n\t\"./ur.js\": 184,\n\t\"./uz\": 185,\n\t\"./uz-latn\": 186,\n\t\"./uz-latn.js\": 186,\n\t\"./uz.js\": 185,\n\t\"./vi\": 187,\n\t\"./vi.js\": 187,\n\t\"./x-pseudo\": 188,\n\t\"./x-pseudo.js\": 188,\n\t\"./yo\": 189,\n\t\"./yo.js\": 189,\n\t\"./zh-cn\": 190,\n\t\"./zh-cn.js\": 190,\n\t\"./zh-hk\": 191,\n\t\"./zh-hk.js\": 191,\n\t\"./zh-tw\": 192,\n\t\"./zh-tw.js\": 192\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 294;\n\n/***/ }),\n/* 295 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Which resources do you want to reserve?\")])],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.resourcesCheckboxes),function(checkbox){return _c('div',{key:checkbox.uuid,staticClass:\"resources_row\"},[_c('v-checkbox',{attrs:{\"label\":((checkbox.nodeName) + \" GPU\" + (checkbox.index) + \" \" + (checkbox.name)),\"disabled\":checkbox.disabled},model:{value:(checkbox.checked),callback:function ($$v) {_vm.$set(checkbox, \"checked\", $$v)},expression:\"checkbox.checked\"}})],1)}),0),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}]),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}]),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}]),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}]),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.reservationTitle),callback:function ($$v) {_vm.reservationTitle=$$v},expression:\"reservationTitle\"}}),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.reservationDescription),callback:function ($$v) {_vm.reservationDescription=$$v},expression:\"reservationDescription\"}}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showInfo===true),expression:\"showInfo===true\"}],staticClass:\"text-red\"},[_c('p',{staticClass:\"vertical-5p lead\"},[_vm._v(\"You need to choose at least one resource to reserve\")])]),_vm._v(\" \"),_c('div',{staticClass:\"modal-footer text-right\"},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.reservation()}}},[_vm._v(\"\\n Reserve\\n \")])],1)],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 296 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarInfo_vue__ = __webpack_require__(193);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7c5a8e25_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarInfo_vue__ = __webpack_require__(298);\nfunction injectStyle (ssrContext) {\n __webpack_require__(297)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarInfo_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7c5a8e25_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarInfo_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 298 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"indigo\",\"text-color\":\"white\"}},[_c('v-avatar',{attrs:{\"left\":\"\"}},[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"account_circle\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.userName))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"teal\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"dns\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.hostname))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"light-green\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"memory\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(\"GPU\"+_vm._s(_vm.reservation.resourceIndex)+\" \"+_vm._s(_vm.reservation.resourceName))])],1),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Title:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.title)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.newTitle),callback:function ($$v) {_vm.newTitle=$$v},expression:\"newTitle\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Description:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.description)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.newDescription),callback:function ($$v) {_vm.newDescription=$$v},expression:\"newDescription\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.gpuUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU memory utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.memUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Start:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.start))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}],null,false,710299969),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}],null,false,4222293411),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"End:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.end))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}],null,false,3230088161),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}],null,false,2362500227),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"GPU UUID:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.resourceId)+\"\\n \")]),_vm._v(\" \"),(_vm.tasksCard)?_c('v-card-text',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"warning\"},model:{value:(_vm.showAlert),callback:function ($$v) {_vm.showAlert=$$v},expression:\"showAlert\"}},[_vm._v(\"Synchronization in progress. Task assign is disabled now.\")])],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}})],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\"\\n \"+_vm._s(header.text)+\"\\n \")],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))])])]}}],null,false,4156683076),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}],null,false,63074868)})],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){return _vm.checkActionFlag()}}},[_vm._v(\"Assign selected\")]):_vm._e(),_vm._v(\" \"),(_vm.actionsAbility)?_c('v-card-text',{staticClass:\"container\"},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"yellow\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.tasksCard=!_vm.tasksCard; _vm.cancelCard=false; _vm.updateCard=false}}},[_vm._v(\"Schedule task(s) for this reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"error\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=!_vm.cancelCard; _vm.tasksCard=false; _vm.updateCard=false}}},[_vm._v(\"Cancel reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=!_vm.updateCard; _vm.tasksCard=false, _vm.cancelCard=false}}},[_vm._v(\"Edit reservation\")])],1):_vm._e(),_vm._v(\" \"),(_vm.cancelCard)?_c('v-card-text',[_vm._v(\"\\n Do you want to cancel selected reservation?\\n \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=false}}},[_vm._v(\"No\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.cancelReservation()}}},[_vm._v(\"Yes\")])],1):_vm._e(),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=false}}},[_vm._v(\"Back\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.updateReservation()}}},[_vm._v(\"Update\")])],1):_vm._e()],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\r\n * FullCalendar v3.9.0\r\n * Docs & License: https://fullcalendar.io/\r\n * (c) 2018 Adam Shaw\r\n */\r\n(function webpackUniversalModuleDefinition(root, factory) {\r\n\tif(true)\r\n\t\tmodule.exports = factory(__webpack_require__(0), __webpack_require__(194));\r\n\telse if(typeof define === 'function' && define.amd)\r\n\t\tdefine([\"moment\", \"jquery\"], factory);\r\n\telse if(typeof exports === 'object')\r\n\t\texports[\"FullCalendar\"] = factory(require(\"moment\"), require(\"jquery\"));\r\n\telse\r\n\t\troot[\"FullCalendar\"] = factory(root[\"moment\"], root[\"jQuery\"]);\r\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3__) {\r\nreturn /******/ (function(modules) { // webpackBootstrap\r\n/******/ \t// The module cache\r\n/******/ \tvar installedModules = {};\r\n/******/\r\n/******/ \t// The require function\r\n/******/ \tfunction __webpack_require__(moduleId) {\r\n/******/\r\n/******/ \t\t// Check if module is in cache\r\n/******/ \t\tif(installedModules[moduleId]) {\r\n/******/ \t\t\treturn installedModules[moduleId].exports;\r\n/******/ \t\t}\r\n/******/ \t\t// Create a new module (and put it into the cache)\r\n/******/ \t\tvar module = installedModules[moduleId] = {\r\n/******/ \t\t\ti: moduleId,\r\n/******/ \t\t\tl: false,\r\n/******/ \t\t\texports: {}\r\n/******/ \t\t};\r\n/******/\r\n/******/ \t\t// Execute the module function\r\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n/******/\r\n/******/ \t\t// Flag the module as loaded\r\n/******/ \t\tmodule.l = true;\r\n/******/\r\n/******/ \t\t// Return the exports of the module\r\n/******/ \t\treturn module.exports;\r\n/******/ \t}\r\n/******/\r\n/******/\r\n/******/ \t// expose the modules object (__webpack_modules__)\r\n/******/ \t__webpack_require__.m = modules;\r\n/******/\r\n/******/ \t// expose the module cache\r\n/******/ \t__webpack_require__.c = installedModules;\r\n/******/\r\n/******/ \t// define getter function for harmony exports\r\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\r\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\r\n/******/ \t\t\tObject.defineProperty(exports, name, {\r\n/******/ \t\t\t\tconfigurable: false,\r\n/******/ \t\t\t\tenumerable: true,\r\n/******/ \t\t\t\tget: getter\r\n/******/ \t\t\t});\r\n/******/ \t\t}\r\n/******/ \t};\r\n/******/\r\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\r\n/******/ \t__webpack_require__.n = function(module) {\r\n/******/ \t\tvar getter = module && module.__esModule ?\r\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\r\n/******/ \t\t\tfunction getModuleExports() { return module; };\r\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\r\n/******/ \t\treturn getter;\r\n/******/ \t};\r\n/******/\r\n/******/ \t// Object.prototype.hasOwnProperty.call\r\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\r\n/******/\r\n/******/ \t// __webpack_public_path__\r\n/******/ \t__webpack_require__.p = \"\";\r\n/******/\r\n/******/ \t// Load entry module and return exports\r\n/******/ \treturn __webpack_require__(__webpack_require__.s = 236);\r\n/******/ })\r\n/************************************************************************/\r\n/******/ ([\r\n/* 0 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\r\n\r\n/***/ }),\r\n/* 1 */,\r\n/* 2 */\r\n/***/ (function(module, exports) {\r\n\r\n/*\r\nderived from:\r\nhttps://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js\r\n\r\nonly include the helpers we need, to keep down filesize\r\n*/\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b)\r\n if (b.hasOwnProperty(p))\r\n d[p] = b[p]; };\r\nexports.__extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 3 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\r\n\r\n/***/ }),\r\n/* 4 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\n/* FullCalendar-specific DOM Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\r\n// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\r\nfunction compensateScroll(rowEls, scrollbarWidths) {\r\n if (scrollbarWidths.left) {\r\n rowEls.css({\r\n 'border-left-width': 1,\r\n 'margin-left': scrollbarWidths.left - 1\r\n });\r\n }\r\n if (scrollbarWidths.right) {\r\n rowEls.css({\r\n 'border-right-width': 1,\r\n 'margin-right': scrollbarWidths.right - 1\r\n });\r\n }\r\n}\r\nexports.compensateScroll = compensateScroll;\r\n// Undoes compensateScroll and restores all borders/margins\r\nfunction uncompensateScroll(rowEls) {\r\n rowEls.css({\r\n 'margin-left': '',\r\n 'margin-right': '',\r\n 'border-left-width': '',\r\n 'border-right-width': ''\r\n });\r\n}\r\nexports.uncompensateScroll = uncompensateScroll;\r\n// Make the mouse cursor express that an event is not allowed in the current area\r\nfunction disableCursor() {\r\n $('body').addClass('fc-not-allowed');\r\n}\r\nexports.disableCursor = disableCursor;\r\n// Returns the mouse cursor to its original look\r\nfunction enableCursor() {\r\n $('body').removeClass('fc-not-allowed');\r\n}\r\nexports.enableCursor = enableCursor;\r\n// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\r\n// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\r\n// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and\r\n// reduces the available height.\r\nfunction distributeHeight(els, availableHeight, shouldRedistribute) {\r\n // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\r\n // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\r\n var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\r\n var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\r\n var flexEls = []; // elements that are allowed to expand. array of DOM nodes\r\n var flexOffsets = []; // amount of vertical space it takes up\r\n var flexHeights = []; // actual css height\r\n var usedHeight = 0;\r\n undistributeHeight(els); // give all elements their natural height\r\n // find elements that are below the recommended height (expandable).\r\n // important to query for heights in a single first pass (to avoid reflow oscillation).\r\n els.each(function (i, el) {\r\n var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = $(el).outerHeight(true);\r\n if (naturalOffset < minOffset) {\r\n flexEls.push(el);\r\n flexOffsets.push(naturalOffset);\r\n flexHeights.push($(el).height());\r\n }\r\n else {\r\n // this element stretches past recommended height (non-expandable). mark the space as occupied.\r\n usedHeight += naturalOffset;\r\n }\r\n });\r\n // readjust the recommended height to only consider the height available to non-maxed-out rows.\r\n if (shouldRedistribute) {\r\n availableHeight -= usedHeight;\r\n minOffset1 = Math.floor(availableHeight / flexEls.length);\r\n minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\r\n }\r\n // assign heights to all expandable elements\r\n $(flexEls).each(function (i, el) {\r\n var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = flexOffsets[i];\r\n var naturalHeight = flexHeights[i];\r\n var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\r\n if (naturalOffset < minOffset) {\r\n $(el).height(newHeight);\r\n }\r\n });\r\n}\r\nexports.distributeHeight = distributeHeight;\r\n// Undoes distrubuteHeight, restoring all els to their natural height\r\nfunction undistributeHeight(els) {\r\n els.height('');\r\n}\r\nexports.undistributeHeight = undistributeHeight;\r\n// Given `els`, a jQuery set of cells, find the cell with the largest natural width and set the widths of all the\r\n// cells to be that width.\r\n// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\r\nfunction matchCellWidths(els) {\r\n var maxInnerWidth = 0;\r\n els.find('> *').each(function (i, innerEl) {\r\n var innerWidth = $(innerEl).outerWidth();\r\n if (innerWidth > maxInnerWidth) {\r\n maxInnerWidth = innerWidth;\r\n }\r\n });\r\n maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\r\n els.width(maxInnerWidth);\r\n return maxInnerWidth;\r\n}\r\nexports.matchCellWidths = matchCellWidths;\r\n// Given one element that resides inside another,\r\n// Subtracts the height of the inner element from the outer element.\r\nfunction subtractInnerElHeight(outerEl, innerEl) {\r\n var both = outerEl.add(innerEl);\r\n var diff;\r\n // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\r\n both.css({\r\n position: 'relative',\r\n left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\r\n });\r\n diff = outerEl.outerHeight() - innerEl.outerHeight(); // grab the dimensions\r\n both.css({ position: '', left: '' }); // undo hack\r\n return diff;\r\n}\r\nexports.subtractInnerElHeight = subtractInnerElHeight;\r\n/* Element Geom Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51\r\nfunction getScrollParent(el) {\r\n var position = el.css('position');\r\n var scrollParent = el.parents().filter(function () {\r\n var parent = $(this);\r\n return (/(auto|scroll)/).test(parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x'));\r\n }).eq(0);\r\n return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;\r\n}\r\nexports.getScrollParent = getScrollParent;\r\n// Queries the outer bounding area of a jQuery element.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getOuterRect(el, origin) {\r\n var offset = el.offset();\r\n var left = offset.left - (origin ? origin.left : 0);\r\n var top = offset.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.outerWidth(),\r\n top: top,\r\n bottom: top + el.outerHeight()\r\n };\r\n}\r\nexports.getOuterRect = getOuterRect;\r\n// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\n// WARNING: given element can't have borders\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getClientRect(el, origin) {\r\n var offset = el.offset();\r\n var scrollbarWidths = getScrollbarWidths(el);\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left - (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el[0].clientWidth,\r\n top: top,\r\n bottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars\r\n };\r\n}\r\nexports.getClientRect = getClientRect;\r\n// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getContentRect(el, origin) {\r\n var offset = el.offset(); // just outside of border, margin not included\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left') -\r\n (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top') -\r\n (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.width(),\r\n top: top,\r\n bottom: top + el.height()\r\n };\r\n}\r\nexports.getContentRect = getContentRect;\r\n// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.\r\n// WARNING: given element can't have borders (which will cause offsetWidth/offsetHeight to be larger).\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getScrollbarWidths(el) {\r\n var leftRightWidth = el[0].offsetWidth - el[0].clientWidth;\r\n var bottomWidth = el[0].offsetHeight - el[0].clientHeight;\r\n var widths;\r\n leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);\r\n bottomWidth = sanitizeScrollbarWidth(bottomWidth);\r\n widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };\r\n if (getIsLeftRtlScrollbars() && el.css('direction') === 'rtl') {\r\n widths.left = leftRightWidth;\r\n }\r\n else {\r\n widths.right = leftRightWidth;\r\n }\r\n return widths;\r\n}\r\nexports.getScrollbarWidths = getScrollbarWidths;\r\n// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to\r\n// retina displays, rounding, and IE11. Massage them into a usable value.\r\nfunction sanitizeScrollbarWidth(width) {\r\n width = Math.max(0, width); // no negatives\r\n width = Math.round(width);\r\n return width;\r\n}\r\n// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\r\nvar _isLeftRtlScrollbars = null;\r\nfunction getIsLeftRtlScrollbars() {\r\n if (_isLeftRtlScrollbars === null) {\r\n _isLeftRtlScrollbars = computeIsLeftRtlScrollbars();\r\n }\r\n return _isLeftRtlScrollbars;\r\n}\r\nfunction computeIsLeftRtlScrollbars() {\r\n var el = $('
')\r\n .css({\r\n position: 'absolute',\r\n top: -1000,\r\n left: 0,\r\n border: 0,\r\n padding: 0,\r\n overflow: 'scroll',\r\n direction: 'rtl'\r\n })\r\n .appendTo('body');\r\n var innerEl = el.children();\r\n var res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?\r\n el.remove();\r\n return res;\r\n}\r\n// Retrieves a jQuery element's computed CSS value as a floating-point number.\r\n// If the queried value is non-numeric (ex: IE can return \"medium\" for border width), will just return zero.\r\nfunction getCssFloat(el, prop) {\r\n return parseFloat(el.css(prop)) || 0;\r\n}\r\n/* Mouse / Touch Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\r\nfunction isPrimaryMouseButton(ev) {\r\n return ev.which === 1 && !ev.ctrlKey;\r\n}\r\nexports.isPrimaryMouseButton = isPrimaryMouseButton;\r\nfunction getEvX(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageX;\r\n }\r\n return ev.pageX;\r\n}\r\nexports.getEvX = getEvX;\r\nfunction getEvY(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageY;\r\n }\r\n return ev.pageY;\r\n}\r\nexports.getEvY = getEvY;\r\nfunction getEvIsTouch(ev) {\r\n return /^touch/.test(ev.type);\r\n}\r\nexports.getEvIsTouch = getEvIsTouch;\r\nfunction preventSelection(el) {\r\n el.addClass('fc-unselectable')\r\n .on('selectstart', preventDefault);\r\n}\r\nexports.preventSelection = preventSelection;\r\nfunction allowSelection(el) {\r\n el.removeClass('fc-unselectable')\r\n .off('selectstart', preventDefault);\r\n}\r\nexports.allowSelection = allowSelection;\r\n// Stops a mouse/touch event from doing it's native browser action\r\nfunction preventDefault(ev) {\r\n ev.preventDefault();\r\n}\r\nexports.preventDefault = preventDefault;\r\n/* General Geometry Utils\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\r\nfunction intersectRects(rect1, rect2) {\r\n var res = {\r\n left: Math.max(rect1.left, rect2.left),\r\n right: Math.min(rect1.right, rect2.right),\r\n top: Math.max(rect1.top, rect2.top),\r\n bottom: Math.min(rect1.bottom, rect2.bottom)\r\n };\r\n if (res.left < res.right && res.top < res.bottom) {\r\n return res;\r\n }\r\n return false;\r\n}\r\nexports.intersectRects = intersectRects;\r\n// Returns a new point that will have been moved to reside within the given rectangle\r\nfunction constrainPoint(point, rect) {\r\n return {\r\n left: Math.min(Math.max(point.left, rect.left), rect.right),\r\n top: Math.min(Math.max(point.top, rect.top), rect.bottom)\r\n };\r\n}\r\nexports.constrainPoint = constrainPoint;\r\n// Returns a point that is the center of the given rectangle\r\nfunction getRectCenter(rect) {\r\n return {\r\n left: (rect.left + rect.right) / 2,\r\n top: (rect.top + rect.bottom) / 2\r\n };\r\n}\r\nexports.getRectCenter = getRectCenter;\r\n// Subtracts point2's coordinates from point1's coordinates, returning a delta\r\nfunction diffPoints(point1, point2) {\r\n return {\r\n left: point1.left - point2.left,\r\n top: point1.top - point2.top\r\n };\r\n}\r\nexports.diffPoints = diffPoints;\r\n/* Object Ordering by Field\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction parseFieldSpecs(input) {\r\n var specs = [];\r\n var tokens = [];\r\n var i;\r\n var token;\r\n if (typeof input === 'string') {\r\n tokens = input.split(/\\s*,\\s*/);\r\n }\r\n else if (typeof input === 'function') {\r\n tokens = [input];\r\n }\r\n else if ($.isArray(input)) {\r\n tokens = input;\r\n }\r\n for (i = 0; i < tokens.length; i++) {\r\n token = tokens[i];\r\n if (typeof token === 'string') {\r\n specs.push(token.charAt(0) === '-' ?\r\n { field: token.substring(1), order: -1 } :\r\n { field: token, order: 1 });\r\n }\r\n else if (typeof token === 'function') {\r\n specs.push({ func: token });\r\n }\r\n }\r\n return specs;\r\n}\r\nexports.parseFieldSpecs = parseFieldSpecs;\r\nfunction compareByFieldSpecs(obj1, obj2, fieldSpecs, obj1fallback, obj2fallback) {\r\n var i;\r\n var cmp;\r\n for (i = 0; i < fieldSpecs.length; i++) {\r\n cmp = compareByFieldSpec(obj1, obj2, fieldSpecs[i], obj1fallback, obj2fallback);\r\n if (cmp) {\r\n return cmp;\r\n }\r\n }\r\n return 0;\r\n}\r\nexports.compareByFieldSpecs = compareByFieldSpecs;\r\nfunction compareByFieldSpec(obj1, obj2, fieldSpec, obj1fallback, obj2fallback) {\r\n if (fieldSpec.func) {\r\n return fieldSpec.func(obj1, obj2);\r\n }\r\n var val1 = obj1[fieldSpec.field];\r\n var val2 = obj2[fieldSpec.field];\r\n if (val1 == null && obj1fallback) {\r\n val1 = obj1fallback[fieldSpec.field];\r\n }\r\n if (val2 == null && obj2fallback) {\r\n val2 = obj2fallback[fieldSpec.field];\r\n }\r\n return flexibleCompare(val1, val2) * (fieldSpec.order || 1);\r\n}\r\nexports.compareByFieldSpec = compareByFieldSpec;\r\nfunction flexibleCompare(a, b) {\r\n if (!a && !b) {\r\n return 0;\r\n }\r\n if (b == null) {\r\n return -1;\r\n }\r\n if (a == null) {\r\n return 1;\r\n }\r\n if ($.type(a) === 'string' || $.type(b) === 'string') {\r\n return String(a).localeCompare(String(b));\r\n }\r\n return a - b;\r\n}\r\nexports.flexibleCompare = flexibleCompare;\r\n/* Date Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nexports.dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\r\nexports.unitsDesc = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; // descending\r\n// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.\r\n// Moments will have their timezones normalized.\r\nfunction diffDayTime(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),\r\n ms: a.time() - b.time() // time-of-day from day start. disregards timezone\r\n });\r\n}\r\nexports.diffDayTime = diffDayTime;\r\n// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.\r\nfunction diffDay(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days')\r\n });\r\n}\r\nexports.diffDay = diffDay;\r\n// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.\r\nfunction diffByUnit(a, b, unit) {\r\n return moment.duration(Math.round(a.diff(b, unit, true)), // returnFloat=true\r\n unit);\r\n}\r\nexports.diffByUnit = diffByUnit;\r\n// Computes the unit name of the largest whole-unit period of time.\r\n// For example, 48 hours will be \"days\" whereas 49 hours will be \"hours\".\r\n// Accepts start/end, a range object, or an original duration object.\r\nfunction computeGreatestUnit(start, end) {\r\n var i;\r\n var unit;\r\n var val;\r\n for (i = 0; i < exports.unitsDesc.length; i++) {\r\n unit = exports.unitsDesc[i];\r\n val = computeRangeAs(unit, start, end);\r\n if (val >= 1 && isInt(val)) {\r\n break;\r\n }\r\n }\r\n return unit; // will be \"milliseconds\" if nothing else matches\r\n}\r\nexports.computeGreatestUnit = computeGreatestUnit;\r\n// like computeGreatestUnit, but has special abilities to interpret the source input for clues\r\nfunction computeDurationGreatestUnit(duration, durationInput) {\r\n var unit = computeGreatestUnit(duration);\r\n // prevent days:7 from being interpreted as a week\r\n if (unit === 'week' && typeof durationInput === 'object' && durationInput.days) {\r\n unit = 'day';\r\n }\r\n return unit;\r\n}\r\nexports.computeDurationGreatestUnit = computeDurationGreatestUnit;\r\n// Computes the number of units (like \"hours\") in the given range.\r\n// Range can be a {start,end} object, separate start/end args, or a Duration.\r\n// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling\r\n// of month-diffing logic (which tends to vary from version to version).\r\nfunction computeRangeAs(unit, start, end) {\r\n if (end != null) {\r\n return end.diff(start, unit, true);\r\n }\r\n else if (moment.isDuration(start)) {\r\n return start.as(unit);\r\n }\r\n else {\r\n return start.end.diff(start.start, unit, true);\r\n }\r\n}\r\n// Intelligently divides a range (specified by a start/end params) by a duration\r\nfunction divideRangeByDuration(start, end, dur) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return (end - start) / dur;\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return end.diff(start, 'months', true) / months;\r\n }\r\n return end.diff(start, 'days', true) / dur.asDays();\r\n}\r\nexports.divideRangeByDuration = divideRangeByDuration;\r\n// Intelligently divides one duration by another\r\nfunction divideDurationByDuration(dur1, dur2) {\r\n var months1;\r\n var months2;\r\n if (durationHasTime(dur1) || durationHasTime(dur2)) {\r\n return dur1 / dur2;\r\n }\r\n months1 = dur1.asMonths();\r\n months2 = dur2.asMonths();\r\n if (Math.abs(months1) >= 1 && isInt(months1) &&\r\n Math.abs(months2) >= 1 && isInt(months2)) {\r\n return months1 / months2;\r\n }\r\n return dur1.asDays() / dur2.asDays();\r\n}\r\nexports.divideDurationByDuration = divideDurationByDuration;\r\n// Intelligently multiplies a duration by a number\r\nfunction multiplyDuration(dur, n) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return moment.duration(dur * n);\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return moment.duration({ months: months * n });\r\n }\r\n return moment.duration({ days: dur.asDays() * n });\r\n}\r\nexports.multiplyDuration = multiplyDuration;\r\n// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)\r\nfunction durationHasTime(dur) {\r\n return Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());\r\n}\r\nexports.durationHasTime = durationHasTime;\r\nfunction isNativeDate(input) {\r\n return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;\r\n}\r\nexports.isNativeDate = isNativeDate;\r\n// Returns a boolean about whether the given input is a time string, like \"06:40:00\" or \"06:00\"\r\nfunction isTimeString(str) {\r\n return typeof str === 'string' &&\r\n /^\\d+\\:\\d+(?:\\:\\d+\\.?(?:\\d{3})?)?$/.test(str);\r\n}\r\nexports.isTimeString = isTimeString;\r\n/* Logging and Debug\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction log() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.log) {\r\n return console.log.apply(console, args);\r\n }\r\n}\r\nexports.log = log;\r\nfunction warn() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.warn) {\r\n return console.warn.apply(console, args);\r\n }\r\n else {\r\n return log.apply(null, args);\r\n }\r\n}\r\nexports.warn = warn;\r\n/* General Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar hasOwnPropMethod = {}.hasOwnProperty;\r\n// Merges an array of objects into a single object.\r\n// The second argument allows for an array of property names who's object values will be merged together.\r\nfunction mergeProps(propObjs, complexProps) {\r\n var dest = {};\r\n var i;\r\n var name;\r\n var complexObjs;\r\n var j;\r\n var val;\r\n var props;\r\n if (complexProps) {\r\n for (i = 0; i < complexProps.length; i++) {\r\n name = complexProps[i];\r\n complexObjs = [];\r\n // collect the trailing object values, stopping when a non-object is discovered\r\n for (j = propObjs.length - 1; j >= 0; j--) {\r\n val = propObjs[j][name];\r\n if (typeof val === 'object') {\r\n complexObjs.unshift(val);\r\n }\r\n else if (val !== undefined) {\r\n dest[name] = val; // if there were no objects, this value will be used\r\n break;\r\n }\r\n }\r\n // if the trailing values were objects, use the merged value\r\n if (complexObjs.length) {\r\n dest[name] = mergeProps(complexObjs);\r\n }\r\n }\r\n }\r\n // copy values into the destination, going from last to first\r\n for (i = propObjs.length - 1; i >= 0; i--) {\r\n props = propObjs[i];\r\n for (name in props) {\r\n if (!(name in dest)) {\r\n dest[name] = props[name];\r\n }\r\n }\r\n }\r\n return dest;\r\n}\r\nexports.mergeProps = mergeProps;\r\nfunction copyOwnProps(src, dest) {\r\n for (var name_1 in src) {\r\n if (hasOwnProp(src, name_1)) {\r\n dest[name_1] = src[name_1];\r\n }\r\n }\r\n}\r\nexports.copyOwnProps = copyOwnProps;\r\nfunction hasOwnProp(obj, name) {\r\n return hasOwnPropMethod.call(obj, name);\r\n}\r\nexports.hasOwnProp = hasOwnProp;\r\nfunction applyAll(functions, thisObj, args) {\r\n if ($.isFunction(functions)) {\r\n functions = [functions];\r\n }\r\n if (functions) {\r\n var i = void 0;\r\n var ret = void 0;\r\n for (i = 0; i < functions.length; i++) {\r\n ret = functions[i].apply(thisObj, args) || ret;\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.applyAll = applyAll;\r\nfunction removeMatching(array, testFunc) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (testFunc(array[i])) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeMatching = removeMatching;\r\nfunction removeExact(array, exactVal) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (array[i] === exactVal) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeExact = removeExact;\r\nfunction isArraysEqual(a0, a1) {\r\n var len = a0.length;\r\n var i;\r\n if (len == null || len !== a1.length) {\r\n return false;\r\n }\r\n for (i = 0; i < len; i++) {\r\n if (a0[i] !== a1[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nexports.isArraysEqual = isArraysEqual;\r\nfunction firstDefined() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n for (var i = 0; i < args.length; i++) {\r\n if (args[i] !== undefined) {\r\n return args[i];\r\n }\r\n }\r\n}\r\nexports.firstDefined = firstDefined;\r\nfunction htmlEscape(s) {\r\n return (s + '').replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/'/g, ''')\r\n .replace(/\"/g, '"')\r\n .replace(/\\n/g, '
');\r\n}\r\nexports.htmlEscape = htmlEscape;\r\nfunction stripHtmlEntities(text) {\r\n return text.replace(/&.*?;/g, '');\r\n}\r\nexports.stripHtmlEntities = stripHtmlEntities;\r\n// Given a hash of CSS properties, returns a string of CSS.\r\n// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\r\nfunction cssToStr(cssProps) {\r\n var statements = [];\r\n $.each(cssProps, function (name, val) {\r\n if (val != null) {\r\n statements.push(name + ':' + val);\r\n }\r\n });\r\n return statements.join(';');\r\n}\r\nexports.cssToStr = cssToStr;\r\n// Given an object hash of HTML attribute names to values,\r\n// generates a string that can be injected between < > in HTML\r\nfunction attrsToStr(attrs) {\r\n var parts = [];\r\n $.each(attrs, function (name, val) {\r\n if (val != null) {\r\n parts.push(name + '=\"' + htmlEscape(val) + '\"');\r\n }\r\n });\r\n return parts.join(' ');\r\n}\r\nexports.attrsToStr = attrsToStr;\r\nfunction capitaliseFirstLetter(str) {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\nexports.capitaliseFirstLetter = capitaliseFirstLetter;\r\nfunction compareNumbers(a, b) {\r\n return a - b;\r\n}\r\nexports.compareNumbers = compareNumbers;\r\nfunction isInt(n) {\r\n return n % 1 === 0;\r\n}\r\nexports.isInt = isInt;\r\n// Returns a method bound to the given object context.\r\n// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with\r\n// different contexts as identical when binding/unbinding events.\r\nfunction proxy(obj, methodName) {\r\n var method = obj[methodName];\r\n return function () {\r\n return method.apply(obj, arguments);\r\n };\r\n}\r\nexports.proxy = proxy;\r\n// Returns a function, that, as long as it continues to be invoked, will not\r\n// be triggered. The function will be called after it stops being called for\r\n// N milliseconds. If `immediate` is passed, trigger the function on the\r\n// leading edge, instead of the trailing.\r\n// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\r\nfunction debounce(func, wait, immediate) {\r\n if (immediate === void 0) { immediate = false; }\r\n var timeout;\r\n var args;\r\n var context;\r\n var timestamp;\r\n var result;\r\n var later = function () {\r\n var last = +new Date() - timestamp;\r\n if (last < wait) {\r\n timeout = setTimeout(later, wait - last);\r\n }\r\n else {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n }\r\n };\r\n return function () {\r\n context = this;\r\n args = arguments;\r\n timestamp = +new Date();\r\n var callNow = immediate && !timeout;\r\n if (!timeout) {\r\n timeout = setTimeout(later, wait);\r\n }\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n return result;\r\n };\r\n}\r\nexports.debounce = debounce;\r\n\r\n\r\n/***/ }),\r\n/* 5 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange = /** @class */ (function () {\r\n function UnzonedRange(startInput, endInput) {\r\n // TODO: move these into footprint.\r\n // Especially, doesn't make sense for null startMs/endMs.\r\n this.isStart = true;\r\n this.isEnd = true;\r\n if (moment.isMoment(startInput)) {\r\n startInput = startInput.clone().stripZone();\r\n }\r\n if (moment.isMoment(endInput)) {\r\n endInput = endInput.clone().stripZone();\r\n }\r\n if (startInput) {\r\n this.startMs = startInput.valueOf();\r\n }\r\n if (endInput) {\r\n this.endMs = endInput.valueOf();\r\n }\r\n }\r\n /*\r\n SIDEEFFECT: will mutate eventRanges.\r\n Will return a new array result.\r\n Only works for non-open-ended ranges.\r\n */\r\n UnzonedRange.invertRanges = function (ranges, constraintRange) {\r\n var invertedRanges = [];\r\n var startMs = constraintRange.startMs; // the end of the previous range. the start of the new range\r\n var i;\r\n var dateRange;\r\n // ranges need to be in order. required for our date-walking algorithm\r\n ranges.sort(compareUnzonedRanges);\r\n for (i = 0; i < ranges.length; i++) {\r\n dateRange = ranges[i];\r\n // add the span of time before the event (if there is any)\r\n if (dateRange.startMs > startMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, dateRange.startMs));\r\n }\r\n if (dateRange.endMs > startMs) {\r\n startMs = dateRange.endMs;\r\n }\r\n }\r\n // add the span of time after the last event (if there is any)\r\n if (startMs < constraintRange.endMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, constraintRange.endMs));\r\n }\r\n return invertedRanges;\r\n };\r\n UnzonedRange.prototype.intersect = function (otherRange) {\r\n var startMs = this.startMs;\r\n var endMs = this.endMs;\r\n var newRange = null;\r\n if (otherRange.startMs != null) {\r\n if (startMs == null) {\r\n startMs = otherRange.startMs;\r\n }\r\n else {\r\n startMs = Math.max(startMs, otherRange.startMs);\r\n }\r\n }\r\n if (otherRange.endMs != null) {\r\n if (endMs == null) {\r\n endMs = otherRange.endMs;\r\n }\r\n else {\r\n endMs = Math.min(endMs, otherRange.endMs);\r\n }\r\n }\r\n if (startMs == null || endMs == null || startMs < endMs) {\r\n newRange = new UnzonedRange(startMs, endMs);\r\n newRange.isStart = this.isStart && startMs === this.startMs;\r\n newRange.isEnd = this.isEnd && endMs === this.endMs;\r\n }\r\n return newRange;\r\n };\r\n UnzonedRange.prototype.intersectsWith = function (otherRange) {\r\n return (this.endMs == null || otherRange.startMs == null || this.endMs > otherRange.startMs) &&\r\n (this.startMs == null || otherRange.endMs == null || this.startMs < otherRange.endMs);\r\n };\r\n UnzonedRange.prototype.containsRange = function (innerRange) {\r\n return (this.startMs == null || (innerRange.startMs != null && innerRange.startMs >= this.startMs)) &&\r\n (this.endMs == null || (innerRange.endMs != null && innerRange.endMs <= this.endMs));\r\n };\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n UnzonedRange.prototype.containsDate = function (date) {\r\n var ms = date.valueOf();\r\n return (this.startMs == null || ms >= this.startMs) &&\r\n (this.endMs == null || ms < this.endMs);\r\n };\r\n // If the given date is not within the given range, move it inside.\r\n // (If it's past the end, make it one millisecond before the end).\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n // Returns a MS-time.\r\n UnzonedRange.prototype.constrainDate = function (date) {\r\n var ms = date.valueOf();\r\n if (this.startMs != null && ms < this.startMs) {\r\n ms = this.startMs;\r\n }\r\n if (this.endMs != null && ms >= this.endMs) {\r\n ms = this.endMs - 1;\r\n }\r\n return ms;\r\n };\r\n UnzonedRange.prototype.equals = function (otherRange) {\r\n return this.startMs === otherRange.startMs && this.endMs === otherRange.endMs;\r\n };\r\n UnzonedRange.prototype.clone = function () {\r\n var range = new UnzonedRange(this.startMs, this.endMs);\r\n range.isStart = this.isStart;\r\n range.isEnd = this.isEnd;\r\n return range;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getStart = function () {\r\n if (this.startMs != null) {\r\n return moment_ext_1.default.utc(this.startMs).stripZone();\r\n }\r\n return null;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getEnd = function () {\r\n if (this.endMs != null) {\r\n return moment_ext_1.default.utc(this.endMs).stripZone();\r\n }\r\n return null;\r\n };\r\n UnzonedRange.prototype.as = function (unit) {\r\n return moment.utc(this.endMs).diff(moment.utc(this.startMs), unit, true);\r\n };\r\n return UnzonedRange;\r\n}());\r\nexports.default = UnzonedRange;\r\n/*\r\nOnly works for non-open-ended ranges.\r\n*/\r\nfunction compareUnzonedRanges(range1, range2) {\r\n return range1.startMs - range2.startMs; // earlier ranges go first\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 6 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventSource, _super);\r\n // can we do away with calendar? at least for the abstract?\r\n // useful for buildEventDef\r\n function EventSource(calendar) {\r\n var _this = _super.call(this) || this;\r\n _this.calendar = calendar;\r\n _this.className = [];\r\n _this.uid = String(EventSource.uuid++);\r\n return _this;\r\n }\r\n /*\r\n rawInput can be any data type!\r\n */\r\n EventSource.parse = function (rawInput, calendar) {\r\n var source = new this(calendar);\r\n if (typeof rawInput === 'object') {\r\n if (source.applyProps(rawInput)) {\r\n return source;\r\n }\r\n }\r\n return false;\r\n };\r\n EventSource.normalizeId = function (id) {\r\n if (id) {\r\n return String(id);\r\n }\r\n return null;\r\n };\r\n EventSource.prototype.fetch = function (start, end, timezone) {\r\n // subclasses must implement. must return a promise.\r\n };\r\n EventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n // optional for subclasses to implement\r\n };\r\n EventSource.prototype.removeAllEventDefs = function () {\r\n // optional for subclasses to implement\r\n };\r\n /*\r\n For compairing/matching\r\n */\r\n EventSource.prototype.getPrimitive = function (otherSource) {\r\n // subclasses must implement\r\n };\r\n EventSource.prototype.parseEventDefs = function (rawEventDefs) {\r\n var i;\r\n var eventDef;\r\n var eventDefs = [];\r\n for (i = 0; i < rawEventDefs.length; i++) {\r\n eventDef = this.parseEventDef(rawEventDefs[i]);\r\n if (eventDef) {\r\n eventDefs.push(eventDef);\r\n }\r\n }\r\n return eventDefs;\r\n };\r\n EventSource.prototype.parseEventDef = function (rawInput) {\r\n var calendarTransform = this.calendar.opt('eventDataTransform');\r\n var sourceTransform = this.eventDataTransform;\r\n if (calendarTransform) {\r\n rawInput = calendarTransform(rawInput, this.calendar);\r\n }\r\n if (sourceTransform) {\r\n rawInput = sourceTransform(rawInput, this.calendar);\r\n }\r\n return EventDefParser_1.default.parse(rawInput, this);\r\n };\r\n EventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventSource.normalizeId(rawProps.id);\r\n }\r\n // TODO: converge with EventDef\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n else if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventSource.uuid = 0;\r\n EventSource.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventSource.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventSource;\r\n}(Class_1.default));\r\nexports.default = EventSource;\r\nParsableModelMixin_1.default.mixInto(EventSource);\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nEventSource.defineStandardProps({\r\n // manually process...\r\n id: false,\r\n className: false,\r\n // automatically transfer...\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n rendering: true,\r\n overlap: true,\r\n constraint: true,\r\n allDayDefault: true,\r\n eventDataTransform: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 7 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUtility methods for easily listening to events on another object,\r\nand more importantly, easily unlistening from them.\r\n\r\nUSAGE:\r\n import { default as ListenerMixin, ListenerInterface } from './ListenerMixin'\r\nin class:\r\n listenTo: ListenerInterface['listenTo']\r\n stopListeningTo: ListenerInterface['stopListeningTo']\r\nafter class:\r\n ListenerMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar guid = 0;\r\nvar ListenerMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListenerMixin, _super);\r\n function ListenerMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Given an `other` object that has on/off methods, bind the given `callback` to an event by the given name.\r\n The `callback` will be called with the `this` context of the object that .listenTo is being called on.\r\n Can be called:\r\n .listenTo(other, eventName, callback)\r\n OR\r\n .listenTo(other, {\r\n eventName1: callback1,\r\n eventName2: callback2\r\n })\r\n */\r\n ListenerMixin.prototype.listenTo = function (other, arg, callback) {\r\n if (typeof arg === 'object') {\r\n for (var eventName in arg) {\r\n if (arg.hasOwnProperty(eventName)) {\r\n this.listenTo(other, eventName, arg[eventName]);\r\n }\r\n }\r\n }\r\n else if (typeof arg === 'string') {\r\n other.on(arg + '.' + this.getListenerNamespace(), // use event namespacing to identify this object\r\n $.proxy(callback, this) // always use `this` context\r\n // the usually-undesired jQuery guid behavior doesn't matter,\r\n // because we always unbind via namespace\r\n );\r\n }\r\n };\r\n /*\r\n Causes the current object to stop listening to events on the `other` object.\r\n `eventName` is optional. If omitted, will stop listening to ALL events on `other`.\r\n */\r\n ListenerMixin.prototype.stopListeningTo = function (other, eventName) {\r\n other.off((eventName || '') + '.' + this.getListenerNamespace());\r\n };\r\n /*\r\n Returns a string, unique to this object, to be used for event namespacing\r\n */\r\n ListenerMixin.prototype.getListenerNamespace = function () {\r\n if (this.listenerId == null) {\r\n this.listenerId = guid++;\r\n }\r\n return '_listener' + this.listenerId;\r\n };\r\n return ListenerMixin;\r\n}(Mixin_1.default));\r\nexports.default = ListenerMixin;\r\n\r\n\r\n/***/ }),\r\n/* 8 */,\r\n/* 9 */,\r\n/* 10 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ambigDateOfMonthRegex = /^\\s*\\d{4}-\\d\\d$/;\r\nvar ambigTimeOrZoneRegex = /^\\s*\\d{4}-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?)?$/;\r\nvar newMomentProto = moment.fn; // where we will attach our new methods\r\nexports.newMomentProto = newMomentProto;\r\nvar oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods\r\nexports.oldMomentProto = oldMomentProto;\r\n// tell momentjs to transfer these properties upon clone\r\nvar momentProperties = moment.momentProperties;\r\nmomentProperties.push('_fullCalendar');\r\nmomentProperties.push('_ambigTime');\r\nmomentProperties.push('_ambigZone');\r\n/*\r\nCall this if you want Moment's original format method to be used\r\n*/\r\nfunction oldMomentFormat(mom, formatStr) {\r\n return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js\r\n}\r\nexports.oldMomentFormat = oldMomentFormat;\r\n// Creating\r\n// -------------------------------------------------------------------------------------------------\r\n// Creates a new moment, similar to the vanilla moment(...) constructor, but with\r\n// extra features (ambiguous time, enhanced formatting). When given an existing moment,\r\n// it will function as a clone (and retain the zone of the moment). Anything else will\r\n// result in a moment in the local zone.\r\nvar momentExt = function () {\r\n return makeMoment(arguments);\r\n};\r\nexports.default = momentExt;\r\n// Sames as momentExt, but forces the resulting moment to be in the UTC timezone.\r\nmomentExt.utc = function () {\r\n var mom = makeMoment(arguments, true);\r\n // Force it into UTC because makeMoment doesn't guarantee it\r\n // (if given a pre-existing moment for example)\r\n if (mom.hasTime()) {\r\n mom.utc();\r\n }\r\n return mom;\r\n};\r\n// Same as momentExt, but when given an ISO8601 string, the timezone offset is preserved.\r\n// ISO8601 strings with no timezone offset will become ambiguously zoned.\r\nmomentExt.parseZone = function () {\r\n return makeMoment(arguments, true, true);\r\n};\r\n// Builds an enhanced moment from args. When given an existing moment, it clones. When given a\r\n// native Date, or called with no arguments (the current time), the resulting moment will be local.\r\n// Anything else needs to be \"parsed\" (a string or an array), and will be affected by:\r\n// parseAsUTC - if there is no zone information, should we parse the input in UTC?\r\n// parseZone - if there is zone information, should we force the zone of the moment?\r\nfunction makeMoment(args, parseAsUTC, parseZone) {\r\n if (parseAsUTC === void 0) { parseAsUTC = false; }\r\n if (parseZone === void 0) { parseZone = false; }\r\n var input = args[0];\r\n var isSingleString = args.length === 1 && typeof input === 'string';\r\n var isAmbigTime;\r\n var isAmbigZone;\r\n var ambigMatch;\r\n var mom;\r\n if (moment.isMoment(input) || util_1.isNativeDate(input) || input === undefined) {\r\n mom = moment.apply(null, args);\r\n }\r\n else {\r\n isAmbigTime = false;\r\n isAmbigZone = false;\r\n if (isSingleString) {\r\n if (ambigDateOfMonthRegex.test(input)) {\r\n // accept strings like '2014-05', but convert to the first of the month\r\n input += '-01';\r\n args = [input]; // for when we pass it on to moment's constructor\r\n isAmbigTime = true;\r\n isAmbigZone = true;\r\n }\r\n else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {\r\n isAmbigTime = !ambigMatch[5]; // no time part?\r\n isAmbigZone = true;\r\n }\r\n }\r\n else if ($.isArray(input)) {\r\n // arrays have no timezone information, so assume ambiguous zone\r\n isAmbigZone = true;\r\n }\r\n // otherwise, probably a string with a format\r\n if (parseAsUTC || isAmbigTime) {\r\n mom = moment.utc.apply(moment, args);\r\n }\r\n else {\r\n mom = moment.apply(null, args);\r\n }\r\n if (isAmbigTime) {\r\n mom._ambigTime = true;\r\n mom._ambigZone = true; // ambiguous time always means ambiguous zone\r\n }\r\n else if (parseZone) {\r\n if (isAmbigZone) {\r\n mom._ambigZone = true;\r\n }\r\n else if (isSingleString) {\r\n mom.utcOffset(input); // if not a valid zone, will assign UTC\r\n }\r\n }\r\n }\r\n mom._fullCalendar = true; // flag for extended functionality\r\n return mom;\r\n}\r\n// Week Number\r\n// -------------------------------------------------------------------------------------------------\r\n// Returns the week number, considering the locale's custom week number calcuation\r\n// `weeks` is an alias for `week`\r\nnewMomentProto.week = newMomentProto.weeks = function (input) {\r\n var weekCalc = this._locale._fullCalendar_weekCalc;\r\n if (input == null && typeof weekCalc === 'function') {\r\n return weekCalc(this);\r\n }\r\n else if (weekCalc === 'ISO') {\r\n return oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter\r\n }\r\n return oldMomentProto.week.apply(this, arguments); // local getter/setter\r\n};\r\n// Time-of-day\r\n// -------------------------------------------------------------------------------------------------\r\n// GETTER\r\n// Returns a Duration with the hours/minutes/seconds/ms values of the moment.\r\n// If the moment has an ambiguous time, a duration of 00:00 will be returned.\r\n//\r\n// SETTER\r\n// You can supply a Duration, a Moment, or a Duration-like argument.\r\n// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.\r\nnewMomentProto.time = function (time) {\r\n // Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.\r\n // `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.\r\n if (!this._fullCalendar) {\r\n return oldMomentProto.time.apply(this, arguments);\r\n }\r\n if (time == null) {\r\n return moment.duration({\r\n hours: this.hours(),\r\n minutes: this.minutes(),\r\n seconds: this.seconds(),\r\n milliseconds: this.milliseconds()\r\n });\r\n }\r\n else {\r\n this._ambigTime = false; // mark that the moment now has a time\r\n if (!moment.isDuration(time) && !moment.isMoment(time)) {\r\n time = moment.duration(time);\r\n }\r\n // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).\r\n // Only for Duration times, not Moment times.\r\n var dayHours = 0;\r\n if (moment.isDuration(time)) {\r\n dayHours = Math.floor(time.asDays()) * 24;\r\n }\r\n // We need to set the individual fields.\r\n // Can't use startOf('day') then add duration. In case of DST at start of day.\r\n return this.hours(dayHours + time.hours())\r\n .minutes(time.minutes())\r\n .seconds(time.seconds())\r\n .milliseconds(time.milliseconds());\r\n }\r\n};\r\n// Converts the moment to UTC, stripping out its time-of-day and timezone offset,\r\n// but preserving its YMD. A moment with a stripped time will display no time\r\n// nor timezone offset when .format() is called.\r\nnewMomentProto.stripTime = function () {\r\n if (!this._ambigTime) {\r\n this.utc(true); // keepLocalTime=true (for keeping *date* value)\r\n // set time to zero\r\n this.set({\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n ms: 0\r\n });\r\n // Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears all ambig flags.\r\n this._ambigTime = true;\r\n this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns if the moment has a non-ambiguous time (boolean)\r\nnewMomentProto.hasTime = function () {\r\n return !this._ambigTime;\r\n};\r\n// Timezone\r\n// -------------------------------------------------------------------------------------------------\r\n// Converts the moment to UTC, stripping out its timezone offset, but preserving its\r\n// YMD and time-of-day. A moment with a stripped timezone offset will display no\r\n// timezone offset when .format() is called.\r\nnewMomentProto.stripZone = function () {\r\n var wasAmbigTime;\r\n if (!this._ambigZone) {\r\n wasAmbigTime = this._ambigTime;\r\n this.utc(true); // keepLocalTime=true (for keeping date and time values)\r\n // the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore\r\n this._ambigTime = wasAmbigTime || false;\r\n // Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears the ambig flags.\r\n this._ambigZone = true;\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns of the moment has a non-ambiguous timezone offset (boolean)\r\nnewMomentProto.hasZone = function () {\r\n return !this._ambigZone;\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.local = function (keepLocalTime) {\r\n // for when converting from ambiguously-zoned to local,\r\n // keep the time values when converting from UTC -> local\r\n oldMomentProto.local.call(this, this._ambigZone || keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this; // for chaining\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.utc = function (keepLocalTime) {\r\n oldMomentProto.utc.call(this, keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this;\r\n};\r\n// implicitly marks a zone (will probably get called upon .utc() and .local())\r\nnewMomentProto.utcOffset = function (tzo) {\r\n if (tzo != null) {\r\n // these assignments needs to happen before the original zone method is called.\r\n // I forget why, something to do with a browser crash.\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n }\r\n return oldMomentProto.utcOffset.apply(this, arguments);\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 11 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'\r\nin class:\r\n on: EmitterInterface['on']\r\n one: EmitterInterface['one']\r\n off: EmitterInterface['off']\r\n trigger: EmitterInterface['trigger']\r\n triggerWith: EmitterInterface['triggerWith']\r\n hasHandlers: EmitterInterface['hasHandlers']\r\nafter class:\r\n EmitterMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar EmitterMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(EmitterMixin, _super);\r\n function EmitterMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // jQuery-ification via $(this) allows a non-DOM object to have\r\n // the same event handling capabilities (including namespaces).\r\n EmitterMixin.prototype.on = function (types, handler) {\r\n $(this).on(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.one = function (types, handler) {\r\n $(this).one(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype._prepareIntercept = function (handler) {\r\n // handlers are always called with an \"event\" object as their first param.\r\n // sneak the `this` context and arguments into the extra parameter object\r\n // and forward them on to the original handler.\r\n var intercept = function (ev, extra) {\r\n return handler.apply(extra.context || this, extra.args || []);\r\n };\r\n // mimick jQuery's internal \"proxy\" system (risky, I know)\r\n // causing all functions with the same .guid to appear to be the same.\r\n // https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448\r\n // this is needed for calling .off with the original non-intercept handler.\r\n if (!handler.guid) {\r\n handler.guid = $.guid++;\r\n }\r\n intercept.guid = handler.guid;\r\n return intercept;\r\n };\r\n EmitterMixin.prototype.off = function (types, handler) {\r\n $(this).off(types, handler);\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.trigger = function (types) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // pass in \"extra\" info to the intercept\r\n $(this).triggerHandler(types, { args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.triggerWith = function (types, context, args) {\r\n // `triggerHandler` is less reliant on the DOM compared to `trigger`.\r\n // pass in \"extra\" info to the intercept.\r\n $(this).triggerHandler(types, { context: context, args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.hasHandlers = function (type) {\r\n var hash = $._data(this, 'events'); // http://blog.jquery.com/2012/08/09/jquery-1-8-released/\r\n return hash && hash[type] && hash[type].length > 0;\r\n };\r\n return EmitterMixin;\r\n}(Mixin_1.default));\r\nexports.default = EmitterMixin;\r\n\r\n\r\n/***/ }),\r\n/* 12 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar ComponentFootprint = /** @class */ (function () {\r\n function ComponentFootprint(unzonedRange, isAllDay) {\r\n this.isAllDay = false; // component can choose to ignore this\r\n this.unzonedRange = unzonedRange;\r\n this.isAllDay = isAllDay;\r\n }\r\n /*\r\n Only works for non-open-ended ranges.\r\n */\r\n ComponentFootprint.prototype.toLegacy = function (calendar) {\r\n return {\r\n start: calendar.msToMoment(this.unzonedRange.startMs, this.isAllDay),\r\n end: calendar.msToMoment(this.unzonedRange.endMs, this.isAllDay)\r\n };\r\n };\r\n return ComponentFootprint;\r\n}());\r\nexports.default = ComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 13 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar SingleEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(SingleEventDef, _super);\r\n function SingleEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Will receive start/end params, but will be ignored.\r\n */\r\n SingleEventDef.prototype.buildInstances = function () {\r\n return [this.buildInstance()];\r\n };\r\n SingleEventDef.prototype.buildInstance = function () {\r\n return new EventInstance_1.default(this, // definition\r\n this.dateProfile);\r\n };\r\n SingleEventDef.prototype.isAllDay = function () {\r\n return this.dateProfile.isAllDay();\r\n };\r\n SingleEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n def.dateProfile = this.dateProfile;\r\n return def;\r\n };\r\n SingleEventDef.prototype.rezone = function () {\r\n var calendar = this.source.calendar;\r\n var dateProfile = this.dateProfile;\r\n this.dateProfile = new EventDateProfile_1.default(calendar.moment(dateProfile.start), dateProfile.end ? calendar.moment(dateProfile.end) : null, calendar);\r\n };\r\n /*\r\n NOTE: if super-method fails, should still attempt to apply\r\n */\r\n SingleEventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n var dateProfile = EventDateProfile_1.default.parse(rawProps, this.source); // returns null on failure\r\n if (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n // make sure `date` shows up in the legacy event objects as-is\r\n if (rawProps.date != null) {\r\n this.miscProps.date = rawProps.date;\r\n }\r\n return superSuccess;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n return SingleEventDef;\r\n}(EventDef_1.default));\r\nexports.default = SingleEventDef;\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nSingleEventDef.defineStandardProps({\r\n start: false,\r\n date: false,\r\n end: false,\r\n allDay: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 14 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Mixin = /** @class */ (function () {\r\n function Mixin() {\r\n }\r\n Mixin.mixInto = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n if (!destClass.prototype[name]) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n }\r\n });\r\n };\r\n /*\r\n will override existing methods\r\n TODO: remove! not used anymore\r\n */\r\n Mixin.mixOver = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n });\r\n };\r\n return Mixin;\r\n}());\r\nexports.default = Mixin;\r\n\r\n\r\n/***/ }),\r\n/* 15 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Interaction = /** @class */ (function () {\r\n function Interaction(component) {\r\n this.view = component._getView();\r\n this.component = component;\r\n }\r\n Interaction.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n Interaction.prototype.end = function () {\r\n // subclasses can implement\r\n };\r\n return Interaction;\r\n}());\r\nexports.default = Interaction;\r\n\r\n\r\n/***/ }),\r\n/* 16 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.version = '3.9.0';\r\n// When introducing internal API incompatibilities (where fullcalendar plugins would break),\r\n// the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)\r\n// and the below integer should be incremented.\r\nexports.internalApiVersion = 12;\r\nvar util_1 = __webpack_require__(4);\r\nexports.applyAll = util_1.applyAll;\r\nexports.debounce = util_1.debounce;\r\nexports.isInt = util_1.isInt;\r\nexports.htmlEscape = util_1.htmlEscape;\r\nexports.cssToStr = util_1.cssToStr;\r\nexports.proxy = util_1.proxy;\r\nexports.capitaliseFirstLetter = util_1.capitaliseFirstLetter;\r\nexports.getOuterRect = util_1.getOuterRect;\r\nexports.getClientRect = util_1.getClientRect;\r\nexports.getContentRect = util_1.getContentRect;\r\nexports.getScrollbarWidths = util_1.getScrollbarWidths;\r\nexports.preventDefault = util_1.preventDefault;\r\nexports.parseFieldSpecs = util_1.parseFieldSpecs;\r\nexports.compareByFieldSpecs = util_1.compareByFieldSpecs;\r\nexports.compareByFieldSpec = util_1.compareByFieldSpec;\r\nexports.flexibleCompare = util_1.flexibleCompare;\r\nexports.computeGreatestUnit = util_1.computeGreatestUnit;\r\nexports.divideRangeByDuration = util_1.divideRangeByDuration;\r\nexports.divideDurationByDuration = util_1.divideDurationByDuration;\r\nexports.multiplyDuration = util_1.multiplyDuration;\r\nexports.durationHasTime = util_1.durationHasTime;\r\nexports.log = util_1.log;\r\nexports.warn = util_1.warn;\r\nexports.removeExact = util_1.removeExact;\r\nexports.intersectRects = util_1.intersectRects;\r\nvar date_formatting_1 = __webpack_require__(47);\r\nexports.formatDate = date_formatting_1.formatDate;\r\nexports.formatRange = date_formatting_1.formatRange;\r\nexports.queryMostGranularFormatUnit = date_formatting_1.queryMostGranularFormatUnit;\r\nvar locale_1 = __webpack_require__(31);\r\nexports.datepickerLocale = locale_1.datepickerLocale;\r\nexports.locale = locale_1.locale;\r\nvar moment_ext_1 = __webpack_require__(10);\r\nexports.moment = moment_ext_1.default;\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nexports.EmitterMixin = EmitterMixin_1.default;\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexports.ListenerMixin = ListenerMixin_1.default;\r\nvar Model_1 = __webpack_require__(48);\r\nexports.Model = Model_1.default;\r\nvar Constraints_1 = __webpack_require__(207);\r\nexports.Constraints = Constraints_1.default;\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nexports.UnzonedRange = UnzonedRange_1.default;\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nexports.ComponentFootprint = ComponentFootprint_1.default;\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nexports.BusinessHourGenerator = BusinessHourGenerator_1.default;\r\nvar EventDef_1 = __webpack_require__(34);\r\nexports.EventDef = EventDef_1.default;\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nexports.EventDefMutation = EventDefMutation_1.default;\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nexports.EventSourceParser = EventSourceParser_1.default;\r\nvar EventSource_1 = __webpack_require__(6);\r\nexports.EventSource = EventSource_1.default;\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nexports.defineThemeSystem = ThemeRegistry_1.defineThemeSystem;\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nexports.EventInstanceGroup = EventInstanceGroup_1.default;\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nexports.ArrayEventSource = ArrayEventSource_1.default;\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nexports.FuncEventSource = FuncEventSource_1.default;\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nexports.JsonFeedEventSource = JsonFeedEventSource_1.default;\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nexports.EventFootprint = EventFootprint_1.default;\r\nvar Class_1 = __webpack_require__(33);\r\nexports.Class = Class_1.default;\r\nvar Mixin_1 = __webpack_require__(14);\r\nexports.Mixin = Mixin_1.default;\r\nvar CoordCache_1 = __webpack_require__(53);\r\nexports.CoordCache = CoordCache_1.default;\r\nvar DragListener_1 = __webpack_require__(54);\r\nexports.DragListener = DragListener_1.default;\r\nvar Promise_1 = __webpack_require__(20);\r\nexports.Promise = Promise_1.default;\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nexports.TaskQueue = TaskQueue_1.default;\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nexports.RenderQueue = RenderQueue_1.default;\r\nvar Scroller_1 = __webpack_require__(39);\r\nexports.Scroller = Scroller_1.default;\r\nvar Theme_1 = __webpack_require__(19);\r\nexports.Theme = Theme_1.default;\r\nvar DateComponent_1 = __webpack_require__(219);\r\nexports.DateComponent = DateComponent_1.default;\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nexports.InteractiveDateComponent = InteractiveDateComponent_1.default;\r\nvar Calendar_1 = __webpack_require__(220);\r\nexports.Calendar = Calendar_1.default;\r\nvar View_1 = __webpack_require__(41);\r\nexports.View = View_1.default;\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nexports.defineView = ViewRegistry_1.defineView;\r\nexports.getViewConfig = ViewRegistry_1.getViewConfig;\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nexports.DayTableMixin = DayTableMixin_1.default;\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nexports.BusinessHourRenderer = BusinessHourRenderer_1.default;\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nexports.EventRenderer = EventRenderer_1.default;\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nexports.FillRenderer = FillRenderer_1.default;\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nexports.HelperRenderer = HelperRenderer_1.default;\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nexports.ExternalDropping = ExternalDropping_1.default;\r\nvar EventResizing_1 = __webpack_require__(223);\r\nexports.EventResizing = EventResizing_1.default;\r\nvar EventPointing_1 = __webpack_require__(59);\r\nexports.EventPointing = EventPointing_1.default;\r\nvar EventDragging_1 = __webpack_require__(224);\r\nexports.EventDragging = EventDragging_1.default;\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nexports.DateSelecting = DateSelecting_1.default;\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nexports.StandardInteractionsMixin = StandardInteractionsMixin_1.default;\r\nvar AgendaView_1 = __webpack_require__(226);\r\nexports.AgendaView = AgendaView_1.default;\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nexports.TimeGrid = TimeGrid_1.default;\r\nvar DayGrid_1 = __webpack_require__(61);\r\nexports.DayGrid = DayGrid_1.default;\r\nvar BasicView_1 = __webpack_require__(62);\r\nexports.BasicView = BasicView_1.default;\r\nvar MonthView_1 = __webpack_require__(229);\r\nexports.MonthView = MonthView_1.default;\r\nvar ListView_1 = __webpack_require__(230);\r\nexports.ListView = ListView_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 17 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar EventDateProfile = /** @class */ (function () {\r\n function EventDateProfile(start, end, calendar) {\r\n this.start = start;\r\n this.end = end || null;\r\n this.unzonedRange = this.buildUnzonedRange(calendar);\r\n }\r\n /*\r\n Needs an EventSource object\r\n */\r\n EventDateProfile.parse = function (rawProps, source) {\r\n var startInput = rawProps.start || rawProps.date;\r\n var endInput = rawProps.end;\r\n if (!startInput) {\r\n return false;\r\n }\r\n var calendar = source.calendar;\r\n var start = calendar.moment(startInput);\r\n var end = endInput ? calendar.moment(endInput) : null;\r\n var forcedAllDay = rawProps.allDay;\r\n var forceEventDuration = calendar.opt('forceEventDuration');\r\n if (!start.isValid()) {\r\n return false;\r\n }\r\n if (end && (!end.isValid() || !end.isAfter(start))) {\r\n end = null;\r\n }\r\n if (forcedAllDay == null) {\r\n forcedAllDay = source.allDayDefault;\r\n if (forcedAllDay == null) {\r\n forcedAllDay = calendar.opt('allDayDefault');\r\n }\r\n }\r\n if (forcedAllDay === true) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else if (forcedAllDay === false) {\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n if (!end && forceEventDuration) {\r\n end = calendar.getDefaultEventEnd(!start.hasTime(), start);\r\n }\r\n return new EventDateProfile(start, end, calendar);\r\n };\r\n EventDateProfile.isStandardProp = function (propName) {\r\n return propName === 'start' || propName === 'date' || propName === 'end' || propName === 'allDay';\r\n };\r\n EventDateProfile.prototype.isAllDay = function () {\r\n return !(this.start.hasTime() || (this.end && this.end.hasTime()));\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.buildUnzonedRange = function (calendar) {\r\n var startMs = this.start.clone().stripZone().valueOf();\r\n var endMs = this.getEnd(calendar).stripZone().valueOf();\r\n return new UnzonedRange_1.default(startMs, endMs);\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.getEnd = function (calendar) {\r\n return this.end ?\r\n this.end.clone() :\r\n // derive the end from the start and allDay. compute allDay if necessary\r\n calendar.getDefaultEventEnd(this.isAllDay(), this.start);\r\n };\r\n return EventDateProfile;\r\n}());\r\nexports.default = EventDateProfile;\r\n\r\n\r\n/***/ }),\r\n/* 18 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventRange_1 = __webpack_require__(211);\r\n/*\r\nIt's expected that there will be at least one EventInstance,\r\nOR that an explicitEventDef is assigned.\r\n*/\r\nvar EventInstanceGroup = /** @class */ (function () {\r\n function EventInstanceGroup(eventInstances) {\r\n this.eventInstances = eventInstances || [];\r\n }\r\n EventInstanceGroup.prototype.getAllEventRanges = function (constraintRange) {\r\n if (constraintRange) {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.eventInstances.map(util_1.eventInstanceToEventRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceRenderRanges = function (constraintRange) {\r\n if (this.isInverse()) {\r\n return this.sliceInverseRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceNormalRenderRanges = function (constraintRange) {\r\n var eventInstances = this.eventInstances;\r\n var i;\r\n var eventInstance;\r\n var slicedRange;\r\n var slicedEventRanges = [];\r\n for (i = 0; i < eventInstances.length; i++) {\r\n eventInstance = eventInstances[i];\r\n slicedRange = eventInstance.dateProfile.unzonedRange.intersect(constraintRange);\r\n if (slicedRange) {\r\n slicedEventRanges.push(new EventRange_1.default(slicedRange, eventInstance.def, eventInstance));\r\n }\r\n }\r\n return slicedEventRanges;\r\n };\r\n EventInstanceGroup.prototype.sliceInverseRenderRanges = function (constraintRange) {\r\n var unzonedRanges = this.eventInstances.map(util_1.eventInstanceToUnzonedRange);\r\n var ownerDef = this.getEventDef();\r\n unzonedRanges = UnzonedRange_1.default.invertRanges(unzonedRanges, constraintRange);\r\n return unzonedRanges.map(function (unzonedRange) {\r\n return new EventRange_1.default(unzonedRange, ownerDef); // don't give an EventInstance\r\n });\r\n };\r\n EventInstanceGroup.prototype.isInverse = function () {\r\n return this.getEventDef().hasInverseRendering();\r\n };\r\n EventInstanceGroup.prototype.getEventDef = function () {\r\n return this.explicitEventDef || this.eventInstances[0].def;\r\n };\r\n return EventInstanceGroup;\r\n}());\r\nexports.default = EventInstanceGroup;\r\n\r\n\r\n/***/ }),\r\n/* 19 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar Theme = /** @class */ (function () {\r\n function Theme(optionsManager) {\r\n this.optionsManager = optionsManager;\r\n this.processIconOverride();\r\n }\r\n Theme.prototype.processIconOverride = function () {\r\n if (this.iconOverrideOption) {\r\n this.setIconOverride(this.optionsManager.get(this.iconOverrideOption));\r\n }\r\n };\r\n Theme.prototype.setIconOverride = function (iconOverrideHash) {\r\n var iconClassesCopy;\r\n var buttonName;\r\n if ($.isPlainObject(iconOverrideHash)) {\r\n iconClassesCopy = $.extend({}, this.iconClasses);\r\n for (buttonName in iconOverrideHash) {\r\n iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);\r\n }\r\n this.iconClasses = iconClassesCopy;\r\n }\r\n else if (iconOverrideHash === false) {\r\n this.iconClasses = {};\r\n }\r\n };\r\n Theme.prototype.applyIconOverridePrefix = function (className) {\r\n var prefix = this.iconOverridePrefix;\r\n if (prefix && className.indexOf(prefix) !== 0) {\r\n className = prefix + className;\r\n }\r\n return className;\r\n };\r\n Theme.prototype.getClass = function (key) {\r\n return this.classes[key] || '';\r\n };\r\n Theme.prototype.getIconClass = function (buttonName) {\r\n var className = this.iconClasses[buttonName];\r\n if (className) {\r\n return this.baseIconClass + ' ' + className;\r\n }\r\n return '';\r\n };\r\n Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {\r\n var className;\r\n if (this.iconOverrideCustomButtonOption) {\r\n className = customButtonProps[this.iconOverrideCustomButtonOption];\r\n if (className) {\r\n return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);\r\n }\r\n }\r\n return '';\r\n };\r\n return Theme;\r\n}());\r\nexports.default = Theme;\r\nTheme.prototype.classes = {};\r\nTheme.prototype.iconClasses = {};\r\nTheme.prototype.baseIconClass = '';\r\nTheme.prototype.iconOverridePrefix = '';\r\n\r\n\r\n/***/ }),\r\n/* 20 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar PromiseStub = {\r\n construct: function (executor) {\r\n var deferred = $.Deferred();\r\n var promise = deferred.promise();\r\n if (typeof executor === 'function') {\r\n executor(function (val) {\r\n deferred.resolve(val);\r\n attachImmediatelyResolvingThen(promise, val);\r\n }, function () {\r\n deferred.reject();\r\n attachImmediatelyRejectingThen(promise);\r\n });\r\n }\r\n return promise;\r\n },\r\n resolve: function (val) {\r\n var deferred = $.Deferred().resolve(val);\r\n var promise = deferred.promise();\r\n attachImmediatelyResolvingThen(promise, val);\r\n return promise;\r\n },\r\n reject: function () {\r\n var deferred = $.Deferred().reject();\r\n var promise = deferred.promise();\r\n attachImmediatelyRejectingThen(promise);\r\n return promise;\r\n }\r\n};\r\nexports.default = PromiseStub;\r\nfunction attachImmediatelyResolvingThen(promise, val) {\r\n promise.then = function (onResolve) {\r\n if (typeof onResolve === 'function') {\r\n return PromiseStub.resolve(onResolve(val));\r\n }\r\n return promise;\r\n };\r\n}\r\nfunction attachImmediatelyRejectingThen(promise) {\r\n promise.then = function (onResolve, onReject) {\r\n if (typeof onReject === 'function') {\r\n onReject();\r\n }\r\n return promise;\r\n };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 21 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexportHooks.touchMouseIgnoreWait = 500;\r\nvar globalEmitter = null;\r\nvar neededCount = 0;\r\n/*\r\nListens to document and window-level user-interaction events, like touch events and mouse events,\r\nand fires these events as-is to whoever is observing a GlobalEmitter.\r\nBest when used as a singleton via GlobalEmitter.get()\r\n\r\nNormalizes mouse/touch events. For examples:\r\n- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click\r\n- compensates for various buggy scenarios where a touchend does not fire\r\n*/\r\nvar GlobalEmitter = /** @class */ (function () {\r\n function GlobalEmitter() {\r\n this.isTouching = false;\r\n this.mouseIgnoreDepth = 0;\r\n }\r\n // gets the singleton\r\n GlobalEmitter.get = function () {\r\n if (!globalEmitter) {\r\n globalEmitter = new GlobalEmitter();\r\n globalEmitter.bind();\r\n }\r\n return globalEmitter;\r\n };\r\n // called when an object knows it will need a GlobalEmitter in the near future.\r\n GlobalEmitter.needed = function () {\r\n GlobalEmitter.get(); // ensures globalEmitter\r\n neededCount++;\r\n };\r\n // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.\r\n GlobalEmitter.unneeded = function () {\r\n neededCount--;\r\n if (!neededCount) {\r\n globalEmitter.unbind();\r\n globalEmitter = null;\r\n }\r\n };\r\n GlobalEmitter.prototype.bind = function () {\r\n var _this = this;\r\n this.listenTo($(document), {\r\n touchstart: this.handleTouchStart,\r\n touchcancel: this.handleTouchCancel,\r\n touchend: this.handleTouchEnd,\r\n mousedown: this.handleMouseDown,\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.handleMouseUp,\r\n click: this.handleClick,\r\n selectstart: this.handleSelectStart,\r\n contextmenu: this.handleContextMenu\r\n });\r\n // because we need to call preventDefault\r\n // because https://www.chromestatus.com/features/5093566007214080\r\n // TODO: investigate performance because this is a global handler\r\n window.addEventListener('touchmove', this.handleTouchMoveProxy = function (ev) {\r\n _this.handleTouchMove($.Event(ev));\r\n }, { passive: false } // allows preventDefault()\r\n );\r\n // attach a handler to get called when ANY scroll action happens on the page.\r\n // this was impossible to do with normal on/off because 'scroll' doesn't bubble.\r\n // http://stackoverflow.com/a/32954565/96342\r\n window.addEventListener('scroll', this.handleScrollProxy = function (ev) {\r\n _this.handleScroll($.Event(ev));\r\n }, true // useCapture\r\n );\r\n };\r\n GlobalEmitter.prototype.unbind = function () {\r\n this.stopListeningTo($(document));\r\n window.removeEventListener('touchmove', this.handleTouchMoveProxy);\r\n window.removeEventListener('scroll', this.handleScrollProxy, true // useCapture\r\n );\r\n };\r\n // Touch Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleTouchStart = function (ev) {\r\n // if a previous touch interaction never ended with a touchend, then implicitly end it,\r\n // but since a new touch interaction is about to begin, don't start the mouse ignore period.\r\n this.stopTouch(ev, true); // skipMouseIgnore=true\r\n this.isTouching = true;\r\n this.trigger('touchstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleTouchMove = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchmove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchCancel = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchcancel', ev);\r\n // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.\r\n // If touchend fires later, it won't have any effect b/c isTouching will be false.\r\n this.stopTouch(ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchEnd = function (ev) {\r\n this.stopTouch(ev);\r\n };\r\n // Mouse Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleMouseDown = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousedown', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseMove = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousemove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseUp = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mouseup', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleClick = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('click', ev);\r\n }\r\n };\r\n // Misc Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleSelectStart = function (ev) {\r\n this.trigger('selectstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleContextMenu = function (ev) {\r\n this.trigger('contextmenu', ev);\r\n };\r\n GlobalEmitter.prototype.handleScroll = function (ev) {\r\n this.trigger('scroll', ev);\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.stopTouch = function (ev, skipMouseIgnore) {\r\n if (skipMouseIgnore === void 0) { skipMouseIgnore = false; }\r\n if (this.isTouching) {\r\n this.isTouching = false;\r\n this.trigger('touchend', ev);\r\n if (!skipMouseIgnore) {\r\n this.startTouchMouseIgnore();\r\n }\r\n }\r\n };\r\n GlobalEmitter.prototype.startTouchMouseIgnore = function () {\r\n var _this = this;\r\n var wait = exportHooks.touchMouseIgnoreWait;\r\n if (wait) {\r\n this.mouseIgnoreDepth++;\r\n setTimeout(function () {\r\n _this.mouseIgnoreDepth--;\r\n }, wait);\r\n }\r\n };\r\n GlobalEmitter.prototype.shouldIgnoreMouse = function () {\r\n return this.isTouching || Boolean(this.mouseIgnoreDepth);\r\n };\r\n return GlobalEmitter;\r\n}());\r\nexports.default = GlobalEmitter;\r\nListenerMixin_1.default.mixInto(GlobalEmitter);\r\nEmitterMixin_1.default.mixInto(GlobalEmitter);\r\n\r\n\r\n/***/ }),\r\n/* 22 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar exportHooks = __webpack_require__(16);\r\nexports.viewHash = {};\r\nexportHooks.views = exports.viewHash;\r\nfunction defineView(viewName, viewConfig) {\r\n exports.viewHash[viewName] = viewConfig;\r\n}\r\nexports.defineView = defineView;\r\nfunction getViewConfig(viewName) {\r\n return exports.viewHash[viewName];\r\n}\r\nexports.getViewConfig = getViewConfig;\r\n\r\n\r\n/***/ }),\r\n/* 23 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar DragListener_1 = __webpack_require__(54);\r\n/* Tracks mouse movements over a component and raises events about which hit the mouse is over.\r\n------------------------------------------------------------------------------------------------------------------------\r\noptions:\r\n- subjectEl\r\n- subjectCenter\r\n*/\r\nvar HitDragListener = /** @class */ (function (_super) {\r\n tslib_1.__extends(HitDragListener, _super);\r\n function HitDragListener(component, options) {\r\n var _this = _super.call(this, options) || this;\r\n _this.component = component;\r\n return _this;\r\n }\r\n // Called when drag listening starts (but a real drag has not necessarily began).\r\n // ev might be undefined if dragging was started manually.\r\n HitDragListener.prototype.handleInteractionStart = function (ev) {\r\n var subjectEl = this.subjectEl;\r\n var subjectRect;\r\n var origPoint;\r\n var point;\r\n this.component.hitsNeeded();\r\n this.computeScrollBounds(); // for autoscroll\r\n if (ev) {\r\n origPoint = { left: util_1.getEvX(ev), top: util_1.getEvY(ev) };\r\n point = origPoint;\r\n // constrain the point to bounds of the element being dragged\r\n if (subjectEl) {\r\n subjectRect = util_1.getOuterRect(subjectEl); // used for centering as well\r\n point = util_1.constrainPoint(point, subjectRect);\r\n }\r\n this.origHit = this.queryHit(point.left, point.top);\r\n // treat the center of the subject as the collision point?\r\n if (subjectEl && this.options.subjectCenter) {\r\n // only consider the area the subject overlaps the hit. best for large subjects.\r\n // TODO: skip this if hit didn't supply left/right/top/bottom\r\n if (this.origHit) {\r\n subjectRect = util_1.intersectRects(this.origHit, subjectRect) ||\r\n subjectRect; // in case there is no intersection\r\n }\r\n point = util_1.getRectCenter(subjectRect);\r\n }\r\n this.coordAdjust = util_1.diffPoints(point, origPoint); // point - origPoint\r\n }\r\n else {\r\n this.origHit = null;\r\n this.coordAdjust = null;\r\n }\r\n // call the super-method. do it after origHit has been computed\r\n _super.prototype.handleInteractionStart.call(this, ev);\r\n };\r\n // Called when the actual drag has started\r\n HitDragListener.prototype.handleDragStart = function (ev) {\r\n var hit;\r\n _super.prototype.handleDragStart.call(this, ev);\r\n // might be different from this.origHit if the min-distance is large\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n // report the initial hit the mouse is over\r\n // especially important if no min-distance and drag starts immediately\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n };\r\n // Called when the drag moves\r\n HitDragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n var hit;\r\n _super.prototype.handleDrag.call(this, dx, dy, ev);\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n if (!isHitsEqual(hit, this.hit)) {\r\n if (this.hit) {\r\n this.handleHitOut();\r\n }\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n }\r\n };\r\n // Called when dragging has been stopped\r\n HitDragListener.prototype.handleDragEnd = function (ev) {\r\n this.handleHitDone();\r\n _super.prototype.handleDragEnd.call(this, ev);\r\n };\r\n // Called when a the mouse has just moved over a new hit\r\n HitDragListener.prototype.handleHitOver = function (hit) {\r\n var isOrig = isHitsEqual(hit, this.origHit);\r\n this.hit = hit;\r\n this.trigger('hitOver', this.hit, isOrig, this.origHit);\r\n };\r\n // Called when the mouse has just moved out of a hit\r\n HitDragListener.prototype.handleHitOut = function () {\r\n if (this.hit) {\r\n this.trigger('hitOut', this.hit);\r\n this.handleHitDone();\r\n this.hit = null;\r\n }\r\n };\r\n // Called after a hitOut. Also called before a dragStop\r\n HitDragListener.prototype.handleHitDone = function () {\r\n if (this.hit) {\r\n this.trigger('hitDone', this.hit);\r\n }\r\n };\r\n // Called when the interaction ends, whether there was a real drag or not\r\n HitDragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n _super.prototype.handleInteractionEnd.call(this, ev, isCancelled);\r\n this.origHit = null;\r\n this.hit = null;\r\n this.component.hitsNotNeeded();\r\n };\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n HitDragListener.prototype.handleScrollEnd = function () {\r\n _super.prototype.handleScrollEnd.call(this);\r\n // hits' absolute positions will be in new places after a user's scroll.\r\n // HACK for recomputing.\r\n if (this.isDragging) {\r\n this.component.releaseHits();\r\n this.component.prepareHits();\r\n }\r\n };\r\n // Gets the hit underneath the coordinates for the given mouse event\r\n HitDragListener.prototype.queryHit = function (left, top) {\r\n if (this.coordAdjust) {\r\n left += this.coordAdjust.left;\r\n top += this.coordAdjust.top;\r\n }\r\n return this.component.queryHit(left, top);\r\n };\r\n return HitDragListener;\r\n}(DragListener_1.default));\r\nexports.default = HitDragListener;\r\n// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component.\r\n// Two null values will be considered equal, as two \"out of the component\" states are the same.\r\nfunction isHitsEqual(hit0, hit1) {\r\n if (!hit0 && !hit1) {\r\n return true;\r\n }\r\n if (hit0 && hit1) {\r\n return hit0.component === hit1.component &&\r\n isHitPropsWithin(hit0, hit1) &&\r\n isHitPropsWithin(hit1, hit0); // ensures all props are identical\r\n }\r\n return false;\r\n}\r\n// Returns true if all of subHit's non-standard properties are within superHit\r\nfunction isHitPropsWithin(subHit, superHit) {\r\n for (var propName in subHit) {\r\n if (!/^(component|left|right|top|bottom)$/.test(propName)) {\r\n if (subHit[propName] !== superHit[propName]) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 24 */,\r\n/* 25 */,\r\n/* 26 */,\r\n/* 27 */,\r\n/* 28 */,\r\n/* 29 */,\r\n/* 30 */,\r\n/* 31 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar options_1 = __webpack_require__(32);\r\nvar util_1 = __webpack_require__(4);\r\nexports.localeOptionHash = {};\r\nexportHooks.locales = exports.localeOptionHash;\r\n// NOTE: can't guarantee any of these computations will run because not every locale has datepicker\r\n// configs, so make sure there are English fallbacks for these in the defaults file.\r\nvar dpComputableOptions = {\r\n buttonText: function (dpOptions) {\r\n return {\r\n // the translations sometimes wrongly contain HTML entities\r\n prev: util_1.stripHtmlEntities(dpOptions.prevText),\r\n next: util_1.stripHtmlEntities(dpOptions.nextText),\r\n today: util_1.stripHtmlEntities(dpOptions.currentText)\r\n };\r\n },\r\n // Produces format strings like \"MMMM YYYY\" -> \"September 2014\"\r\n monthYearFormat: function (dpOptions) {\r\n return dpOptions.showMonthAfterYear ?\r\n 'YYYY[' + dpOptions.yearSuffix + '] MMMM' :\r\n 'MMMM YYYY[' + dpOptions.yearSuffix + ']';\r\n }\r\n};\r\nvar momComputableOptions = {\r\n // Produces format strings like \"ddd M/D\" -> \"Fri 9/15\"\r\n dayOfMonthFormat: function (momOptions, fcOptions) {\r\n var format = momOptions.longDateFormat('l'); // for the format like \"M/D/YYYY\"\r\n // strip the year off the edge, as well as other misc non-whitespace chars\r\n format = format.replace(/^Y+[^\\w\\s]*|[^\\w\\s]*Y+$/g, '');\r\n if (fcOptions.isRTL) {\r\n format += ' ddd'; // for RTL, add day-of-week to end\r\n }\r\n else {\r\n format = 'ddd ' + format; // for LTR, add day-of-week to beginning\r\n }\r\n return format;\r\n },\r\n // Produces format strings like \"h:mma\" -> \"6:00pm\"\r\n mediumTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)a\" -> \"6pm\" / \"6:30pm\"\r\n smallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)t\" -> \"6p\" / \"6:30p\"\r\n extraSmallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"ha\" / \"H\" -> \"6pm\" / \"18\"\r\n hourFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '')\r\n .replace(/(\\Wmm)$/, '') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h:mm\" -> \"6:30\" (with no AM/PM)\r\n noMeridiemTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, ''); // remove trailing AM/PM\r\n }\r\n};\r\n// options that should be computed off live calendar options (considers override options)\r\n// TODO: best place for this? related to locale?\r\n// TODO: flipping text based on isRTL is a bad idea because the CSS `direction` might want to handle it\r\nvar instanceComputableOptions = {\r\n // Produces format strings for results like \"Mo 16\"\r\n smallDayDateFormat: function (options) {\r\n return options.isRTL ?\r\n 'D dd' :\r\n 'dd D';\r\n },\r\n // Produces format strings for results like \"Wk 5\"\r\n weekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[ ' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ' ]w';\r\n },\r\n // Produces format strings for results like \"Wk5\"\r\n smallWeekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ']w';\r\n }\r\n};\r\n// TODO: make these computable properties in optionsManager\r\nfunction populateInstanceComputableOptions(options) {\r\n $.each(instanceComputableOptions, function (name, func) {\r\n if (options[name] == null) {\r\n options[name] = func(options);\r\n }\r\n });\r\n}\r\nexports.populateInstanceComputableOptions = populateInstanceComputableOptions;\r\n// Initialize jQuery UI datepicker translations while using some of the translations\r\n// Will set this as the default locales for datepicker.\r\nfunction datepickerLocale(localeCode, dpLocaleCode, dpOptions) {\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n var fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // transfer some simple options from datepicker to fc\r\n fcOptions.isRTL = dpOptions.isRTL;\r\n fcOptions.weekNumberTitle = dpOptions.weekHeader;\r\n // compute some more complex options from datepicker\r\n $.each(dpComputableOptions, function (name, func) {\r\n fcOptions[name] = func(dpOptions);\r\n });\r\n var jqDatePicker = $.datepicker;\r\n // is jQuery UI Datepicker is on the page?\r\n if (jqDatePicker) {\r\n // Register the locale data.\r\n // FullCalendar and MomentJS use locale codes like \"pt-br\" but Datepicker\r\n // does it like \"pt-BR\" or if it doesn't have the locale, maybe just \"pt\".\r\n // Make an alias so the locale can be referenced either way.\r\n jqDatePicker.regional[dpLocaleCode] =\r\n jqDatePicker.regional[localeCode] = // alias\r\n dpOptions;\r\n // Alias 'en' to the default locale data. Do this every time.\r\n jqDatePicker.regional.en = jqDatePicker.regional[''];\r\n // Set as Datepicker's global defaults.\r\n jqDatePicker.setDefaults(dpOptions);\r\n }\r\n}\r\nexports.datepickerLocale = datepickerLocale;\r\n// Sets FullCalendar-specific translations. Will set the locales as the global default.\r\nfunction locale(localeCode, newFcOptions) {\r\n var fcOptions;\r\n var momOptions;\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // provided new options for this locales? merge them in\r\n if (newFcOptions) {\r\n fcOptions = exports.localeOptionHash[localeCode] = options_1.mergeOptions([fcOptions, newFcOptions]);\r\n }\r\n // compute locale options that weren't defined.\r\n // always do this. newFcOptions can be undefined when initializing from i18n file,\r\n // so no way to tell if this is an initialization or a default-setting.\r\n momOptions = getMomentLocaleData(localeCode); // will fall back to en\r\n $.each(momComputableOptions, function (name, func) {\r\n if (fcOptions[name] == null) {\r\n fcOptions[name] = (func)(momOptions, fcOptions);\r\n }\r\n });\r\n // set it as the default locale for FullCalendar\r\n options_1.globalDefaults.locale = localeCode;\r\n}\r\nexports.locale = locale;\r\n// Returns moment's internal locale data. If doesn't exist, returns English.\r\nfunction getMomentLocaleData(localeCode) {\r\n return moment.localeData(localeCode) || moment.localeData('en');\r\n}\r\nexports.getMomentLocaleData = getMomentLocaleData;\r\n// Initialize English by forcing computation of moment-derived options.\r\n// Also, sets it as the default.\r\nlocale('en', options_1.englishDefaults);\r\n\r\n\r\n/***/ }),\r\n/* 32 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nexports.globalDefaults = {\r\n titleRangeSeparator: ' \\u2013 ',\r\n monthYearFormat: 'MMMM YYYY',\r\n defaultTimedEventDuration: '02:00:00',\r\n defaultAllDayEventDuration: { days: 1 },\r\n forceEventDuration: false,\r\n nextDayThreshold: '09:00:00',\r\n // display\r\n columnHeader: true,\r\n defaultView: 'month',\r\n aspectRatio: 1.35,\r\n header: {\r\n left: 'title',\r\n center: '',\r\n right: 'today prev,next'\r\n },\r\n weekends: true,\r\n weekNumbers: false,\r\n weekNumberTitle: 'W',\r\n weekNumberCalculation: 'local',\r\n // editable: false,\r\n // nowIndicator: false,\r\n scrollTime: '06:00:00',\r\n minTime: '00:00:00',\r\n maxTime: '24:00:00',\r\n showNonCurrentDates: true,\r\n // event ajax\r\n lazyFetching: true,\r\n startParam: 'start',\r\n endParam: 'end',\r\n timezoneParam: 'timezone',\r\n timezone: false,\r\n // allDayDefault: undefined,\r\n // locale\r\n locale: null,\r\n isRTL: false,\r\n buttonText: {\r\n prev: 'prev',\r\n next: 'next',\r\n prevYear: 'prev year',\r\n nextYear: 'next year',\r\n year: 'year',\r\n today: 'today',\r\n month: 'month',\r\n week: 'week',\r\n day: 'day'\r\n },\r\n // buttonIcons: null,\r\n allDayText: 'all-day',\r\n // allows setting a min-height to the event segment to prevent short events overlapping each other\r\n agendaEventMinHeight: 0,\r\n // jquery-ui theming\r\n theme: false,\r\n // themeButtonIcons: null,\r\n // eventResizableFromStart: false,\r\n dragOpacity: .75,\r\n dragRevertDuration: 500,\r\n dragScroll: true,\r\n // selectable: false,\r\n unselectAuto: true,\r\n // selectMinDistance: 0,\r\n dropAccept: '*',\r\n eventOrder: 'title',\r\n // eventRenderWait: null,\r\n eventLimit: false,\r\n eventLimitText: 'more',\r\n eventLimitClick: 'popover',\r\n dayPopoverFormat: 'LL',\r\n handleWindowResize: true,\r\n windowResizeDelay: 100,\r\n longPressDelay: 1000\r\n};\r\nexports.englishDefaults = {\r\n dayPopoverFormat: 'dddd, MMMM D'\r\n};\r\nexports.rtlDefaults = {\r\n header: {\r\n left: 'next,prev today',\r\n center: '',\r\n right: 'title'\r\n },\r\n buttonIcons: {\r\n prev: 'right-single-arrow',\r\n next: 'left-single-arrow',\r\n prevYear: 'right-double-arrow',\r\n nextYear: 'left-double-arrow'\r\n },\r\n themeButtonIcons: {\r\n prev: 'circle-triangle-e',\r\n next: 'circle-triangle-w',\r\n nextYear: 'seek-prev',\r\n prevYear: 'seek-next'\r\n }\r\n};\r\nvar complexOptions = [\r\n 'header',\r\n 'footer',\r\n 'buttonText',\r\n 'buttonIcons',\r\n 'themeButtonIcons'\r\n];\r\n// Merges an array of option objects into a single object\r\nfunction mergeOptions(optionObjs) {\r\n return util_1.mergeProps(optionObjs, complexOptions);\r\n}\r\nexports.mergeOptions = mergeOptions;\r\n\r\n\r\n/***/ }),\r\n/* 33 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\n// Class that all other classes will inherit from\r\nvar Class = /** @class */ (function () {\r\n function Class() {\r\n }\r\n // Called on a class to create a subclass.\r\n // LIMITATION: cannot provide a constructor!\r\n Class.extend = function (members) {\r\n var SubClass = /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return SubClass;\r\n }(this));\r\n util_1.copyOwnProps(members, SubClass.prototype);\r\n return SubClass;\r\n };\r\n // Adds new member variables/methods to the class's prototype.\r\n // Can be called with another class, or a plain object hash containing new members.\r\n Class.mixin = function (members) {\r\n util_1.copyOwnProps(members, this.prototype);\r\n };\r\n return Class;\r\n}());\r\nexports.default = Class;\r\n\r\n\r\n/***/ }),\r\n/* 34 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar EventDef = /** @class */ (function () {\r\n function EventDef(source) {\r\n this.source = source;\r\n this.className = [];\r\n this.miscProps = {};\r\n }\r\n EventDef.parse = function (rawInput, source) {\r\n var def = new this(source);\r\n if (def.applyProps(rawInput)) {\r\n return def;\r\n }\r\n return false;\r\n };\r\n EventDef.normalizeId = function (id) {\r\n return String(id);\r\n };\r\n EventDef.generateId = function () {\r\n return '_fc' + (EventDef.uuid++);\r\n };\r\n EventDef.prototype.clone = function () {\r\n var copy = new this.constructor(this.source);\r\n copy.id = this.id;\r\n copy.rawId = this.rawId;\r\n copy.uid = this.uid; // not really unique anymore :(\r\n EventDef.copyVerbatimStandardProps(this, copy);\r\n copy.className = this.className.slice(); // copy\r\n copy.miscProps = $.extend({}, this.miscProps);\r\n return copy;\r\n };\r\n EventDef.prototype.hasInverseRendering = function () {\r\n return this.getRendering() === 'inverse-background';\r\n };\r\n EventDef.prototype.hasBgRendering = function () {\r\n var rendering = this.getRendering();\r\n return rendering === 'inverse-background' || rendering === 'background';\r\n };\r\n EventDef.prototype.getRendering = function () {\r\n if (this.rendering != null) {\r\n return this.rendering;\r\n }\r\n return this.source.rendering;\r\n };\r\n EventDef.prototype.getConstraint = function () {\r\n if (this.constraint != null) {\r\n return this.constraint;\r\n }\r\n if (this.source.constraint != null) {\r\n return this.source.constraint;\r\n }\r\n return this.source.calendar.opt('eventConstraint'); // what about View option?\r\n };\r\n EventDef.prototype.getOverlap = function () {\r\n if (this.overlap != null) {\r\n return this.overlap;\r\n }\r\n if (this.source.overlap != null) {\r\n return this.source.overlap;\r\n }\r\n return this.source.calendar.opt('eventOverlap'); // what about View option?\r\n };\r\n EventDef.prototype.isStartExplicitlyEditable = function () {\r\n if (this.startEditable != null) {\r\n return this.startEditable;\r\n }\r\n return this.source.startEditable;\r\n };\r\n EventDef.prototype.isDurationExplicitlyEditable = function () {\r\n if (this.durationEditable != null) {\r\n return this.durationEditable;\r\n }\r\n return this.source.durationEditable;\r\n };\r\n EventDef.prototype.isExplicitlyEditable = function () {\r\n if (this.editable != null) {\r\n return this.editable;\r\n }\r\n return this.source.editable;\r\n };\r\n EventDef.prototype.toLegacy = function () {\r\n var obj = $.extend({}, this.miscProps);\r\n obj._id = this.uid;\r\n obj.source = this.source;\r\n obj.className = this.className.slice(); // copy\r\n obj.allDay = this.isAllDay();\r\n if (this.rawId != null) {\r\n obj.id = this.rawId;\r\n }\r\n EventDef.copyVerbatimStandardProps(this, obj);\r\n return obj;\r\n };\r\n EventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventDef.normalizeId((this.rawId = rawProps.id));\r\n }\r\n else {\r\n this.id = EventDef.generateId();\r\n }\r\n if (rawProps._id != null) {\r\n this.uid = String(rawProps._id);\r\n }\r\n else {\r\n this.uid = EventDef.generateId();\r\n }\r\n // TODO: converge with EventSource\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventDef.prototype.applyMiscProps = function (rawProps) {\r\n $.extend(this.miscProps, rawProps);\r\n };\r\n EventDef.uuid = 0;\r\n EventDef.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventDef.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventDef;\r\n}());\r\nexports.default = EventDef;\r\nParsableModelMixin_1.default.mixInto(EventDef);\r\nEventDef.defineStandardProps({\r\n // not automatically assigned (`false`)\r\n _id: false,\r\n id: false,\r\n className: false,\r\n source: false,\r\n // automatically assigned (`true`)\r\n title: true,\r\n url: true,\r\n rendering: true,\r\n constraint: true,\r\n overlap: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 35 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange_1 = __webpack_require__(211);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nfunction eventDefsToEventInstances(eventDefs, unzonedRange) {\r\n var eventInstances = [];\r\n var i;\r\n for (i = 0; i < eventDefs.length; i++) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventDefs[i].buildInstances(unzonedRange));\r\n }\r\n return eventInstances;\r\n}\r\nexports.eventDefsToEventInstances = eventDefsToEventInstances;\r\nfunction eventInstanceToEventRange(eventInstance) {\r\n return new EventRange_1.default(eventInstance.dateProfile.unzonedRange, eventInstance.def, eventInstance);\r\n}\r\nexports.eventInstanceToEventRange = eventInstanceToEventRange;\r\nfunction eventRangeToEventFootprint(eventRange) {\r\n return new EventFootprint_1.default(new ComponentFootprint_1.default(eventRange.unzonedRange, eventRange.eventDef.isAllDay()), eventRange.eventDef, eventRange.eventInstance // might not exist\r\n );\r\n}\r\nexports.eventRangeToEventFootprint = eventRangeToEventFootprint;\r\nfunction eventInstanceToUnzonedRange(eventInstance) {\r\n return eventInstance.dateProfile.unzonedRange;\r\n}\r\nexports.eventInstanceToUnzonedRange = eventInstanceToUnzonedRange;\r\nfunction eventFootprintToComponentFootprint(eventFootprint) {\r\n return eventFootprint.componentFootprint;\r\n}\r\nexports.eventFootprintToComponentFootprint = eventFootprintToComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 36 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventFootprint = /** @class */ (function () {\r\n function EventFootprint(componentFootprint, eventDef, eventInstance) {\r\n this.componentFootprint = componentFootprint;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n EventFootprint.prototype.getEventLegacy = function () {\r\n return (this.eventInstance || this.eventDef).toLegacy();\r\n };\r\n return EventFootprint;\r\n}());\r\nexports.default = EventFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 37 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation = /** @class */ (function () {\r\n function EventDefMutation() {\r\n }\r\n EventDefMutation.createFromRawProps = function (eventInstance, rawProps, largeUnit) {\r\n var eventDef = eventInstance.def;\r\n var dateProps = {};\r\n var standardProps = {};\r\n var miscProps = {};\r\n var verbatimStandardProps = {};\r\n var eventDefId = null;\r\n var className = null;\r\n var propName;\r\n var dateProfile;\r\n var dateMutation;\r\n var defMutation;\r\n for (propName in rawProps) {\r\n if (EventDateProfile_1.default.isStandardProp(propName)) {\r\n dateProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.isStandardProp(propName)) {\r\n standardProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.miscProps[propName] !== rawProps[propName]) {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n dateProfile = EventDateProfile_1.default.parse(dateProps, eventDef.source);\r\n if (dateProfile) {\r\n dateMutation = EventDefDateMutation_1.default.createFromDiff(eventInstance.dateProfile, dateProfile, largeUnit);\r\n }\r\n if (standardProps.id !== eventDef.id) {\r\n eventDefId = standardProps.id; // only apply if there's a change\r\n }\r\n if (!util_1.isArraysEqual(standardProps.className, eventDef.className)) {\r\n className = standardProps.className; // only apply if there's a change\r\n }\r\n EventDef_1.default.copyVerbatimStandardProps(standardProps, // src\r\n verbatimStandardProps // dest\r\n );\r\n defMutation = new EventDefMutation();\r\n defMutation.eventDefId = eventDefId;\r\n defMutation.className = className;\r\n defMutation.verbatimStandardProps = verbatimStandardProps;\r\n defMutation.miscProps = miscProps;\r\n if (dateMutation) {\r\n defMutation.dateMutation = dateMutation;\r\n }\r\n return defMutation;\r\n };\r\n /*\r\n eventDef assumed to be a SingleEventDef.\r\n returns an undo function.\r\n */\r\n EventDefMutation.prototype.mutateSingle = function (eventDef) {\r\n var origDateProfile;\r\n if (this.dateMutation) {\r\n origDateProfile = eventDef.dateProfile;\r\n eventDef.dateProfile = this.dateMutation.buildNewDateProfile(origDateProfile, eventDef.source.calendar);\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.eventDefId != null) {\r\n eventDef.id = EventDef_1.default.normalizeId((eventDef.rawId = this.eventDefId));\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.className) {\r\n eventDef.className = this.className;\r\n }\r\n // can't undo\r\n if (this.verbatimStandardProps) {\r\n SingleEventDef_1.default.copyVerbatimStandardProps(this.verbatimStandardProps, // src\r\n eventDef // dest\r\n );\r\n }\r\n // can't undo\r\n if (this.miscProps) {\r\n eventDef.applyMiscProps(this.miscProps);\r\n }\r\n if (origDateProfile) {\r\n return function () {\r\n eventDef.dateProfile = origDateProfile;\r\n };\r\n }\r\n else {\r\n return function () { };\r\n }\r\n };\r\n EventDefMutation.prototype.setDateMutation = function (dateMutation) {\r\n if (dateMutation && !dateMutation.isEmpty()) {\r\n this.dateMutation = dateMutation;\r\n }\r\n else {\r\n this.dateMutation = null;\r\n }\r\n };\r\n EventDefMutation.prototype.isEmpty = function () {\r\n return !this.dateMutation;\r\n };\r\n return EventDefMutation;\r\n}());\r\nexports.default = EventDefMutation;\r\n\r\n\r\n/***/ }),\r\n/* 38 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.default = {\r\n sourceClasses: [],\r\n registerClass: function (EventSourceClass) {\r\n this.sourceClasses.unshift(EventSourceClass); // give highest priority\r\n },\r\n parse: function (rawInput, calendar) {\r\n var sourceClasses = this.sourceClasses;\r\n var i;\r\n var eventSource;\r\n for (i = 0; i < sourceClasses.length; i++) {\r\n eventSource = sourceClasses[i].parse(rawInput, calendar);\r\n if (eventSource) {\r\n return eventSource;\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 39 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Class_1 = __webpack_require__(33);\r\n/*\r\nEmbodies a div that has potential scrollbars\r\n*/\r\nvar Scroller = /** @class */ (function (_super) {\r\n tslib_1.__extends(Scroller, _super);\r\n function Scroller(options) {\r\n var _this = _super.call(this) || this;\r\n options = options || {};\r\n _this.overflowX = options.overflowX || options.overflow || 'auto';\r\n _this.overflowY = options.overflowY || options.overflow || 'auto';\r\n return _this;\r\n }\r\n Scroller.prototype.render = function () {\r\n this.el = this.renderEl();\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.renderEl = function () {\r\n return (this.scrollEl = $('
'));\r\n };\r\n // sets to natural height, unlocks overflow\r\n Scroller.prototype.clear = function () {\r\n this.setHeight('auto');\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.destroy = function () {\r\n this.el.remove();\r\n };\r\n // Overflow\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.applyOverflow = function () {\r\n this.scrollEl.css({\r\n 'overflow-x': this.overflowX,\r\n 'overflow-y': this.overflowY\r\n });\r\n };\r\n // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.\r\n // Useful for preserving scrollbar widths regardless of future resizes.\r\n // Can pass in scrollbarWidths for optimization.\r\n Scroller.prototype.lockOverflow = function (scrollbarWidths) {\r\n var overflowX = this.overflowX;\r\n var overflowY = this.overflowY;\r\n scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();\r\n if (overflowX === 'auto') {\r\n overflowX = (scrollbarWidths.top || scrollbarWidths.bottom || // horizontal scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth) ? 'scroll' : 'hidden';\r\n }\r\n if (overflowY === 'auto') {\r\n overflowY = (scrollbarWidths.left || scrollbarWidths.right || // vertical scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight) ? 'scroll' : 'hidden';\r\n }\r\n this.scrollEl.css({ 'overflow-x': overflowX, 'overflow-y': overflowY });\r\n };\r\n // Getters / Setters\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.setHeight = function (height) {\r\n this.scrollEl.height(height);\r\n };\r\n Scroller.prototype.getScrollTop = function () {\r\n return this.scrollEl.scrollTop();\r\n };\r\n Scroller.prototype.setScrollTop = function (top) {\r\n this.scrollEl.scrollTop(top);\r\n };\r\n Scroller.prototype.getClientWidth = function () {\r\n return this.scrollEl[0].clientWidth;\r\n };\r\n Scroller.prototype.getClientHeight = function () {\r\n return this.scrollEl[0].clientHeight;\r\n };\r\n Scroller.prototype.getScrollbarWidths = function () {\r\n return util_1.getScrollbarWidths(this.scrollEl);\r\n };\r\n return Scroller;\r\n}(Class_1.default));\r\nexports.default = Scroller;\r\n\r\n\r\n/***/ }),\r\n/* 40 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar DateComponent_1 = __webpack_require__(219);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar InteractiveDateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(InteractiveDateComponent, _super);\r\n function InteractiveDateComponent(_view, _options) {\r\n var _this = _super.call(this, _view, _options) || this;\r\n // self-config, overridable by subclasses\r\n _this.segSelector = '.fc-event-container > *'; // what constitutes an event element?\r\n if (_this.dateSelectingClass) {\r\n _this.dateClicking = new _this.dateClickingClass(_this);\r\n }\r\n if (_this.dateSelectingClass) {\r\n _this.dateSelecting = new _this.dateSelectingClass(_this);\r\n }\r\n if (_this.eventPointingClass) {\r\n _this.eventPointing = new _this.eventPointingClass(_this);\r\n }\r\n if (_this.eventDraggingClass && _this.eventPointing) {\r\n _this.eventDragging = new _this.eventDraggingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.eventResizingClass && _this.eventPointing) {\r\n _this.eventResizing = new _this.eventResizingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.externalDroppingClass) {\r\n _this.externalDropping = new _this.externalDroppingClass(_this);\r\n }\r\n return _this;\r\n }\r\n // Sets the container element that the view should render inside of, does global DOM-related initializations,\r\n // and renders all the non-date-related content inside.\r\n InteractiveDateComponent.prototype.setElement = function (el) {\r\n _super.prototype.setElement.call(this, el);\r\n if (this.dateClicking) {\r\n this.dateClicking.bindToEl(el);\r\n }\r\n if (this.dateSelecting) {\r\n this.dateSelecting.bindToEl(el);\r\n }\r\n this.bindAllSegHandlersToEl(el);\r\n };\r\n InteractiveDateComponent.prototype.removeElement = function () {\r\n this.endInteractions();\r\n _super.prototype.removeElement.call(this);\r\n };\r\n InteractiveDateComponent.prototype.executeEventUnrender = function () {\r\n this.endInteractions();\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n InteractiveDateComponent.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.bindToDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.unbindFromDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.bindDateHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n // attach a handler to the grid's root element.\r\n // jQuery will take care of unregistering them when removeElement gets called.\r\n this.el.on(name, function (ev) {\r\n if (!$(ev.target).is(_this.segSelector + ':not(.fc-helper),' + // directly on an event element\r\n _this.segSelector + ':not(.fc-helper) *,' + // within an event element\r\n '.fc-more,' + // a \"more..\" link\r\n 'a[data-goto]' // a clickable nav link\r\n )) {\r\n return handler.call(_this, ev);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindAllSegHandlersToEl = function (el) {\r\n [\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (eventInteraction) {\r\n if (eventInteraction) {\r\n eventInteraction.bindToEl(el);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindSegHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n el.on(name, this.segSelector, function (ev) {\r\n var segEl = $(ev.currentTarget);\r\n if (!segEl.is('.fc-helper')) {\r\n var seg = segEl.data('fc-seg'); // grab segment data. put there by View::renderEventsPayload\r\n if (seg && !_this.shouldIgnoreEventPointing()) {\r\n return handler.call(_this, seg, ev); // context will be the Grid\r\n }\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreMouse = function () {\r\n // HACK\r\n // This will still work even though bindDateHandlerToEl doesn't use GlobalEmitter.\r\n return GlobalEmitter_1.default.get().shouldIgnoreMouse();\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreTouch = function () {\r\n var view = this._getView();\r\n // On iOS (and Android?) when a new selection is initiated overtop another selection,\r\n // the touchend never fires because the elements gets removed mid-touch-interaction (my theory).\r\n // HACK: simply don't allow this to happen.\r\n // ALSO: prevent selection when an *event* is already raised.\r\n return view.isSelected || view.selectedEvent;\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreEventPointing = function () {\r\n // only call the handlers if there is not a drag/resize in progress\r\n return (this.eventDragging && this.eventDragging.isDragging) ||\r\n (this.eventResizing && this.eventResizing.isResizing);\r\n };\r\n InteractiveDateComponent.prototype.canStartSelection = function (seg, ev) {\r\n return util_1.getEvIsTouch(ev) &&\r\n !this.canStartResize(seg, ev) &&\r\n (this.isEventDefDraggable(seg.footprint.eventDef) ||\r\n this.isEventDefResizable(seg.footprint.eventDef));\r\n };\r\n InteractiveDateComponent.prototype.canStartDrag = function (seg, ev) {\r\n return !this.canStartResize(seg, ev) &&\r\n this.isEventDefDraggable(seg.footprint.eventDef);\r\n };\r\n InteractiveDateComponent.prototype.canStartResize = function (seg, ev) {\r\n var view = this._getView();\r\n var eventDef = seg.footprint.eventDef;\r\n return (!util_1.getEvIsTouch(ev) || view.isEventDefSelected(eventDef)) &&\r\n this.isEventDefResizable(eventDef) &&\r\n $(ev.target).is('.fc-resizer');\r\n };\r\n // Kills all in-progress dragging.\r\n // Useful for when public API methods that result in re-rendering are invoked during a drag.\r\n // Also useful for when touch devices misbehave and don't fire their touchend.\r\n InteractiveDateComponent.prototype.endInteractions = function () {\r\n [\r\n this.dateClicking,\r\n this.dateSelecting,\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (interaction) {\r\n if (interaction) {\r\n interaction.end();\r\n }\r\n });\r\n };\r\n // Event Drag-n-Drop\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be dragged by the user\r\n InteractiveDateComponent.prototype.isEventDefDraggable = function (eventDef) {\r\n return this.isEventDefStartEditable(eventDef);\r\n };\r\n InteractiveDateComponent.prototype.isEventDefStartEditable = function (eventDef) {\r\n var isEditable = eventDef.isStartExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('eventStartEditable');\r\n if (isEditable == null) {\r\n isEditable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isEditable;\r\n };\r\n InteractiveDateComponent.prototype.isEventDefGenerallyEditable = function (eventDef) {\r\n var isEditable = eventDef.isExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('editable');\r\n }\r\n return isEditable;\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be resized from its starting edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromStart = function (eventDef) {\r\n return this.opt('eventResizableFromStart') && this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized from its ending edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromEnd = function (eventDef) {\r\n return this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized by the user at all\r\n InteractiveDateComponent.prototype.isEventDefResizable = function (eventDef) {\r\n var isResizable = eventDef.isDurationExplicitlyEditable();\r\n if (isResizable == null) {\r\n isResizable = this.opt('eventDurationEditable');\r\n if (isResizable == null) {\r\n isResizable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isResizable;\r\n };\r\n // Event Mutation / Constraints\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Diffs the two dates, returning a duration, based on granularity of the grid\r\n // TODO: port isTimeScale into this system?\r\n InteractiveDateComponent.prototype.diffDates = function (a, b) {\r\n if (this.largeUnit) {\r\n return util_1.diffByUnit(a, b, this.largeUnit);\r\n }\r\n else {\r\n return util_1.diffDayTime(a, b);\r\n }\r\n };\r\n // is it allowed, in relation to the view's validRange?\r\n // NOTE: very similar to isExternalInstanceGroupAllowed\r\n InteractiveDateComponent.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // TODO: just use getAllEventRanges directly\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n return view.calendar.constraints.isEventInstanceGroupAllowed(eventInstanceGroup);\r\n };\r\n // NOTE: very similar to isEventInstanceGroupAllowed\r\n // when it's a completely anonymous external drag, no event.\r\n InteractiveDateComponent.prototype.isExternalInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // treat it as a selection\r\n // TODO: pass in eventInstanceGroup instead\r\n // because we don't want calendar's constraint system to depend on a component's\r\n // determination of footprints.\r\n if (!view.calendar.constraints.isSelectionFootprintAllowed(eventFootprints[i].componentFootprint)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n return InteractiveDateComponent;\r\n}(DateComponent_1.default));\r\nexports.default = InteractiveDateComponent;\r\n\r\n\r\n/***/ }),\r\n/* 41 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/* An abstract class from which other views inherit from\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar View = /** @class */ (function (_super) {\r\n tslib_1.__extends(View, _super);\r\n function View(calendar, viewSpec) {\r\n var _this = _super.call(this, null, viewSpec.options) || this;\r\n _this.batchRenderDepth = 0;\r\n _this.isSelected = false; // boolean whether a range of time is user-selected or not\r\n _this.calendar = calendar;\r\n _this.viewSpec = viewSpec;\r\n // shortcuts\r\n _this.type = viewSpec.type;\r\n // .name is deprecated\r\n _this.name = _this.type;\r\n _this.initRenderQueue();\r\n _this.initHiddenDays();\r\n _this.dateProfileGenerator = new _this.dateProfileGeneratorClass(_this);\r\n _this.bindBaseRenderHandlers();\r\n _this.eventOrderSpecs = util_1.parseFieldSpecs(_this.opt('eventOrder'));\r\n // legacy\r\n if (_this['initialize']) {\r\n _this['initialize']();\r\n }\r\n return _this;\r\n }\r\n View.prototype._getView = function () {\r\n return this;\r\n };\r\n // Retrieves an option with the given name\r\n View.prototype.opt = function (name) {\r\n return this.options[name];\r\n };\r\n /* Render Queue\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.initRenderQueue = function () {\r\n this.renderQueue = new RenderQueue_1.default({\r\n event: this.opt('eventRenderWait')\r\n });\r\n this.renderQueue.on('start', this.onRenderQueueStart.bind(this));\r\n this.renderQueue.on('stop', this.onRenderQueueStop.bind(this));\r\n this.on('before:change', this.startBatchRender);\r\n this.on('change', this.stopBatchRender);\r\n };\r\n View.prototype.onRenderQueueStart = function () {\r\n this.calendar.freezeContentHeight();\r\n this.addScroll(this.queryScroll());\r\n };\r\n View.prototype.onRenderQueueStop = function () {\r\n if (this.calendar.updateViewSize()) {\r\n this.popScroll();\r\n }\r\n this.calendar.thawContentHeight();\r\n };\r\n View.prototype.startBatchRender = function () {\r\n if (!(this.batchRenderDepth++)) {\r\n this.renderQueue.pause();\r\n }\r\n };\r\n View.prototype.stopBatchRender = function () {\r\n if (!(--this.batchRenderDepth)) {\r\n this.renderQueue.resume();\r\n }\r\n };\r\n View.prototype.requestRender = function (func, namespace, actionType) {\r\n this.renderQueue.queue(func, namespace, actionType);\r\n };\r\n // given func will auto-bind to `this`\r\n View.prototype.whenSizeUpdated = function (func) {\r\n if (this.renderQueue.isRunning) {\r\n this.renderQueue.one('stop', func.bind(this));\r\n }\r\n else {\r\n func.call(this);\r\n }\r\n };\r\n /* Title and Date Formatting\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes what the title at the top of the calendar should be for this view\r\n View.prototype.computeTitle = function (dateProfile) {\r\n var unzonedRange;\r\n // for views that span a large unit of time, show the proper interval, ignoring stray days before and after\r\n if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {\r\n unzonedRange = dateProfile.currentUnzonedRange;\r\n }\r\n else {\r\n unzonedRange = dateProfile.activeUnzonedRange;\r\n }\r\n return this.formatRange({\r\n start: this.calendar.msToMoment(unzonedRange.startMs, dateProfile.isRangeAllDay),\r\n end: this.calendar.msToMoment(unzonedRange.endMs, dateProfile.isRangeAllDay)\r\n }, dateProfile.isRangeAllDay, this.opt('titleFormat') || this.computeTitleFormat(dateProfile), this.opt('titleRangeSeparator'));\r\n };\r\n // Generates the format string that should be used to generate the title for the current date range.\r\n // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\r\n View.prototype.computeTitleFormat = function (dateProfile) {\r\n var currentRangeUnit = dateProfile.currentRangeUnit;\r\n if (currentRangeUnit === 'year') {\r\n return 'YYYY';\r\n }\r\n else if (currentRangeUnit === 'month') {\r\n return this.opt('monthYearFormat'); // like \"September 2014\"\r\n }\r\n else if (dateProfile.currentUnzonedRange.as('days') > 1) {\r\n return 'll'; // multi-day range. shorter, like \"Sep 9 - 10 2014\"\r\n }\r\n else {\r\n return 'LL'; // one day. longer, like \"September 9 2014\"\r\n }\r\n };\r\n // Date Setting/Unsetting\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.setDate = function (date) {\r\n var currentDateProfile = this.get('dateProfile');\r\n var newDateProfile = this.dateProfileGenerator.build(date, undefined, true); // forceToValid=true\r\n if (!currentDateProfile ||\r\n !currentDateProfile.activeUnzonedRange.equals(newDateProfile.activeUnzonedRange)) {\r\n this.set('dateProfile', newDateProfile);\r\n }\r\n };\r\n View.prototype.unsetDate = function () {\r\n this.unset('dateProfile');\r\n };\r\n // Event Data\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.fetchInitialEvents = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var forceAllDay = dateProfile.isRangeAllDay && !this.usesMinMaxTime;\r\n return calendar.requestEvents(calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, forceAllDay), calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, forceAllDay));\r\n };\r\n View.prototype.bindEventChanges = function () {\r\n this.listenTo(this.calendar, 'eventsReset', this.resetEvents); // TODO: make this a real event\r\n };\r\n View.prototype.unbindEventChanges = function () {\r\n this.stopListeningTo(this.calendar, 'eventsReset');\r\n };\r\n View.prototype.setEvents = function (eventsPayload) {\r\n this.set('currentEvents', eventsPayload);\r\n this.set('hasEvents', true);\r\n };\r\n View.prototype.unsetEvents = function () {\r\n this.unset('currentEvents');\r\n this.unset('hasEvents');\r\n };\r\n View.prototype.resetEvents = function (eventsPayload) {\r\n this.startBatchRender();\r\n this.unsetEvents();\r\n this.setEvents(eventsPayload);\r\n this.stopBatchRender();\r\n };\r\n // Date High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestDateRender = function (dateProfile) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateRender(dateProfile);\r\n }, 'date', 'init');\r\n };\r\n View.prototype.requestDateUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateUnrender();\r\n }, 'date', 'destroy');\r\n };\r\n // if dateProfile not specified, uses current\r\n View.prototype.executeDateRender = function (dateProfile) {\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n if (this['render']) {\r\n this['render'](); // TODO: deprecate\r\n }\r\n this.trigger('datesRendered');\r\n this.addScroll({ isDateInit: true });\r\n this.startNowIndicator(); // shouldn't render yet because updateSize will be called soon\r\n };\r\n View.prototype.executeDateUnrender = function () {\r\n this.unselect();\r\n this.stopNowIndicator();\r\n this.trigger('before:datesUnrendered');\r\n if (this['destroy']) {\r\n this['destroy'](); // TODO: deprecate\r\n }\r\n _super.prototype.executeDateUnrender.call(this);\r\n };\r\n // \"Base\" rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.bindBaseRenderHandlers = function () {\r\n var _this = this;\r\n this.on('datesRendered', function () {\r\n _this.whenSizeUpdated(_this.triggerViewRender);\r\n });\r\n this.on('before:datesUnrendered', function () {\r\n _this.triggerViewDestroy();\r\n });\r\n };\r\n View.prototype.triggerViewRender = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerViewDestroy = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Event High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestEventsRender = function (eventsPayload) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeEventRender(eventsPayload);\r\n _this.whenSizeUpdated(_this.triggerAfterEventsRendered);\r\n }, 'event', 'init');\r\n };\r\n View.prototype.requestEventsUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.triggerBeforeEventsDestroyed();\r\n _this.executeEventUnrender();\r\n }, 'event', 'destroy');\r\n };\r\n // Business Hour High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestBusinessHoursRender = function (businessHourGenerator) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.renderBusinessHours(businessHourGenerator);\r\n }, 'businessHours', 'init');\r\n };\r\n View.prototype.requestBusinessHoursUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.unrenderBusinessHours();\r\n }, 'businessHours', 'destroy');\r\n };\r\n // Misc view rendering utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Binds DOM handlers to elements that reside outside the view container, such as the document\r\n View.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n this.listenTo(GlobalEmitter_1.default.get(), {\r\n touchstart: this.processUnselect,\r\n mousedown: this.handleDocumentMousedown\r\n });\r\n };\r\n // Unbinds DOM handlers from elements that reside outside the view container\r\n View.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Immediately render the current time indicator and begins re-rendering it at an interval,\r\n // which is defined by this.getNowIndicatorUnit().\r\n // TODO: somehow do this for the current whole day's background too\r\n View.prototype.startNowIndicator = function () {\r\n var _this = this;\r\n var unit;\r\n var update;\r\n var delay; // ms wait value\r\n if (this.opt('nowIndicator')) {\r\n unit = this.getNowIndicatorUnit();\r\n if (unit) {\r\n update = util_1.proxy(this, 'updateNowIndicator'); // bind to `this`\r\n this.initialNowDate = this.calendar.getNow();\r\n this.initialNowQueriedMs = new Date().valueOf();\r\n // wait until the beginning of the next interval\r\n delay = this.initialNowDate.clone().startOf(unit).add(1, unit).valueOf() - this.initialNowDate.valueOf();\r\n this.nowIndicatorTimeoutID = setTimeout(function () {\r\n _this.nowIndicatorTimeoutID = null;\r\n update();\r\n delay = +moment.duration(1, unit);\r\n delay = Math.max(100, delay); // prevent too frequent\r\n _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval\r\n }, delay);\r\n }\r\n // rendering will be initiated in updateSize\r\n }\r\n };\r\n // rerenders the now indicator, computing the new current time from the amount of time that has passed\r\n // since the initial getNow call.\r\n View.prototype.updateNowIndicator = function () {\r\n if (this.isDatesRendered &&\r\n this.initialNowDate // activated before?\r\n ) {\r\n this.unrenderNowIndicator(); // won't unrender if unnecessary\r\n this.renderNowIndicator(this.initialNowDate.clone().add(new Date().valueOf() - this.initialNowQueriedMs) // add ms\r\n );\r\n this.isNowIndicatorRendered = true;\r\n }\r\n };\r\n // Immediately unrenders the view's current time indicator and stops any re-rendering timers.\r\n // Won't cause side effects if indicator isn't rendered.\r\n View.prototype.stopNowIndicator = function () {\r\n if (this.isNowIndicatorRendered) {\r\n if (this.nowIndicatorTimeoutID) {\r\n clearTimeout(this.nowIndicatorTimeoutID);\r\n this.nowIndicatorTimeoutID = null;\r\n }\r\n if (this.nowIndicatorIntervalID) {\r\n clearInterval(this.nowIndicatorIntervalID);\r\n this.nowIndicatorIntervalID = null;\r\n }\r\n this.unrenderNowIndicator();\r\n this.isNowIndicatorRendered = false;\r\n }\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n if (this['setHeight']) {\r\n this['setHeight'](totalHeight, isAuto);\r\n }\r\n else {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n }\r\n this.updateNowIndicator();\r\n };\r\n /* Scroller\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.addScroll = function (scroll) {\r\n var queuedScroll = this.queuedScroll || (this.queuedScroll = {});\r\n $.extend(queuedScroll, scroll);\r\n };\r\n View.prototype.popScroll = function () {\r\n this.applyQueuedScroll();\r\n this.queuedScroll = null;\r\n };\r\n View.prototype.applyQueuedScroll = function () {\r\n if (this.queuedScroll) {\r\n this.applyScroll(this.queuedScroll);\r\n }\r\n };\r\n View.prototype.queryScroll = function () {\r\n var scroll = {};\r\n if (this.isDatesRendered) {\r\n $.extend(scroll, this.queryDateScroll());\r\n }\r\n return scroll;\r\n };\r\n View.prototype.applyScroll = function (scroll) {\r\n if (scroll.isDateInit && this.isDatesRendered) {\r\n $.extend(scroll, this.computeInitialDateScroll());\r\n }\r\n if (this.isDatesRendered) {\r\n this.applyDateScroll(scroll);\r\n }\r\n };\r\n View.prototype.computeInitialDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.queryDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.applyDateScroll = function (scroll) {\r\n // subclasses must implement\r\n };\r\n /* Event Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.reportEventDrop = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n var dateMutation = eventMutation.dateMutation;\r\n // update the EventInstance, for handlers\r\n if (dateMutation) {\r\n eventInstance.dateProfile = dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n }\r\n this.triggerEventDrop(eventInstance, \r\n // a drop doesn't necessarily mean a date mutation (ex: resource change)\r\n (dateMutation && dateMutation.dateDelta) || moment.duration(), undoFunc, el, ev);\r\n };\r\n // Triggers event-drop handlers that have subscribed via the API\r\n View.prototype.triggerEventDrop = function (eventInstance, dateDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventDrop', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n dateDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* External Element Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an external element, via jQuery UI, has been dropped onto the calendar.\r\n // `meta` is the parsed data that has been embedded into the dragging event.\r\n // `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.\r\n View.prototype.reportExternalDrop = function (singleEventDef, isEvent, isSticky, el, ev, ui) {\r\n if (isEvent) {\r\n this.calendar.eventManager.addEventDef(singleEventDef, isSticky);\r\n }\r\n this.triggerExternalDrop(singleEventDef, isEvent, el, ev, ui);\r\n };\r\n // Triggers external-drop handlers that have subscribed via the API\r\n View.prototype.triggerExternalDrop = function (singleEventDef, isEvent, el, ev, ui) {\r\n // trigger 'drop' regardless of whether element represents an event\r\n this.publiclyTrigger('drop', {\r\n context: el[0],\r\n args: [\r\n singleEventDef.dateProfile.start.clone(),\r\n ev,\r\n ui,\r\n this\r\n ]\r\n });\r\n if (isEvent) {\r\n // signal an external event landed\r\n this.publiclyTrigger('eventReceive', {\r\n context: this,\r\n args: [\r\n singleEventDef.buildInstance().toLegacy(),\r\n this\r\n ]\r\n });\r\n }\r\n };\r\n /* Event Resizing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an event in the view has been resized to a new length\r\n View.prototype.reportEventResize = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n // update the EventInstance, for handlers\r\n eventInstance.dateProfile = eventMutation.dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n this.triggerEventResize(eventInstance, eventMutation.dateMutation.endDelta, undoFunc, el, ev);\r\n };\r\n // Triggers event-resize handlers that have subscribed via the API\r\n View.prototype.triggerEventResize = function (eventInstance, durationDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventResize', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n durationDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* Selection (time range)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Selects a date span on the view. `start` and `end` are both Moments.\r\n // `ev` is the native mouse event that begin the interaction.\r\n View.prototype.select = function (footprint, ev) {\r\n this.unselect(ev);\r\n this.renderSelectionFootprint(footprint);\r\n this.reportSelection(footprint, ev);\r\n };\r\n View.prototype.renderSelectionFootprint = function (footprint) {\r\n if (this['renderSelection']) {\r\n this['renderSelection'](footprint.toLegacy(this.calendar));\r\n }\r\n else {\r\n _super.prototype.renderSelectionFootprint.call(this, footprint);\r\n }\r\n };\r\n // Called when a new selection is made. Updates internal state and triggers handlers.\r\n View.prototype.reportSelection = function (footprint, ev) {\r\n this.isSelected = true;\r\n this.triggerSelect(footprint, ev);\r\n };\r\n // Triggers handlers to 'select'\r\n View.prototype.triggerSelect = function (footprint, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('select', {\r\n context: this,\r\n args: [\r\n dateProfile.start,\r\n dateProfile.end,\r\n ev,\r\n this\r\n ]\r\n });\r\n };\r\n // Undoes a selection. updates in the internal state and triggers handlers.\r\n // `ev` is the native mouse event that began the interaction.\r\n View.prototype.unselect = function (ev) {\r\n if (this.isSelected) {\r\n this.isSelected = false;\r\n if (this['destroySelection']) {\r\n this['destroySelection'](); // TODO: deprecate\r\n }\r\n this.unrenderSelection();\r\n this.publiclyTrigger('unselect', {\r\n context: this,\r\n args: [ev, this]\r\n });\r\n }\r\n };\r\n /* Event Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.selectEventInstance = function (eventInstance) {\r\n if (!this.selectedEventInstance ||\r\n this.selectedEventInstance !== eventInstance) {\r\n this.unselectEventInstance();\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventInstance === eventInstance &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.addClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = eventInstance;\r\n }\r\n };\r\n View.prototype.unselectEventInstance = function () {\r\n if (this.selectedEventInstance) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.el) {\r\n seg.el.removeClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = null;\r\n }\r\n };\r\n View.prototype.isEventDefSelected = function (eventDef) {\r\n // event references might change on refetchEvents(), while selectedEventInstance doesn't,\r\n // so compare IDs\r\n return this.selectedEventInstance && this.selectedEventInstance.def.id === eventDef.id;\r\n };\r\n /* Mouse / Touch Unselecting (time range & event unselection)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // TODO: move consistently to down/start or up/end?\r\n // TODO: don't kill previous selection if touch scrolling\r\n View.prototype.handleDocumentMousedown = function (ev) {\r\n if (util_1.isPrimaryMouseButton(ev)) {\r\n this.processUnselect(ev);\r\n }\r\n };\r\n View.prototype.processUnselect = function (ev) {\r\n this.processRangeUnselect(ev);\r\n this.processEventUnselect(ev);\r\n };\r\n View.prototype.processRangeUnselect = function (ev) {\r\n var ignore;\r\n // is there a time-range selection?\r\n if (this.isSelected && this.opt('unselectAuto')) {\r\n // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element\r\n ignore = this.opt('unselectCancel');\r\n if (!ignore || !$(ev.target).closest(ignore).length) {\r\n this.unselect(ev);\r\n }\r\n }\r\n };\r\n View.prototype.processEventUnselect = function (ev) {\r\n if (this.selectedEventInstance) {\r\n if (!$(ev.target).closest('.fc-selected').length) {\r\n this.unselectEventInstance();\r\n }\r\n }\r\n };\r\n /* Triggers\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.triggerBaseRendered = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerBaseUnrendered = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Triggers handlers to 'dayClick'\r\n // Span has start/end of the clicked area. Only the start is useful.\r\n View.prototype.triggerDayClick = function (footprint, dayEl, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('dayClick', {\r\n context: dayEl,\r\n args: [dateProfile.start, ev, this]\r\n });\r\n };\r\n /* Date Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // For DateComponent::getDayClasses\r\n View.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return false;\r\n };\r\n // Arguments after name will be forwarded to a hypothetical function value\r\n // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.\r\n // Always clone your objects if you fear mutation.\r\n View.prototype.getUnzonedRangeOption = function (name) {\r\n var val = this.opt(name);\r\n if (typeof val === 'function') {\r\n val = val.apply(null, Array.prototype.slice.call(arguments, 1));\r\n }\r\n if (val) {\r\n return this.calendar.parseUnzonedRange(val);\r\n }\r\n };\r\n /* Hidden Days\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Initializes internal variables related to calculating hidden days-of-week\r\n View.prototype.initHiddenDays = function () {\r\n var hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden\r\n var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\r\n var dayCnt = 0;\r\n var i;\r\n if (this.opt('weekends') === false) {\r\n hiddenDays.push(0, 6); // 0=sunday, 6=saturday\r\n }\r\n for (i = 0; i < 7; i++) {\r\n if (!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)) {\r\n dayCnt++;\r\n }\r\n }\r\n if (!dayCnt) {\r\n throw new Error('invalid hiddenDays'); // all days were hidden? bad.\r\n }\r\n this.isHiddenDayHash = isHiddenDayHash;\r\n };\r\n // Remove days from the beginning and end of the range that are computed as hidden.\r\n // If the whole range is trimmed off, returns null\r\n View.prototype.trimHiddenDays = function (inputUnzonedRange) {\r\n var start = inputUnzonedRange.getStart();\r\n var end = inputUnzonedRange.getEnd();\r\n if (start) {\r\n start = this.skipHiddenDays(start);\r\n }\r\n if (end) {\r\n end = this.skipHiddenDays(end, -1, true);\r\n }\r\n if (start === null || end === null || start < end) {\r\n return new UnzonedRange_1.default(start, end);\r\n }\r\n return null;\r\n };\r\n // Is the current day hidden?\r\n // `day` is a day-of-week index (0-6), or a Moment\r\n View.prototype.isHiddenDay = function (day) {\r\n if (moment.isMoment(day)) {\r\n day = day.day();\r\n }\r\n return this.isHiddenDayHash[day];\r\n };\r\n // Incrementing the current day until it is no longer a hidden day, returning a copy.\r\n // DOES NOT CONSIDER validUnzonedRange!\r\n // If the initial value of `date` is not a hidden day, don't do anything.\r\n // Pass `isExclusive` as `true` if you are dealing with an end date.\r\n // `inc` defaults to `1` (increment one day forward each time)\r\n View.prototype.skipHiddenDays = function (date, inc, isExclusive) {\r\n if (inc === void 0) { inc = 1; }\r\n if (isExclusive === void 0) { isExclusive = false; }\r\n var out = date.clone();\r\n while (this.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]) {\r\n out.add(inc, 'days');\r\n }\r\n return out;\r\n };\r\n return View;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = View;\r\nView.prototype.usesMinMaxTime = false;\r\nView.prototype.dateProfileGeneratorClass = DateProfileGenerator_1.default;\r\nView.watch('displayingDates', ['isInDom', 'dateProfile'], function (deps) {\r\n this.requestDateRender(deps.dateProfile);\r\n}, function () {\r\n this.requestDateUnrender();\r\n});\r\nView.watch('displayingBusinessHours', ['displayingDates', 'businessHourGenerator'], function (deps) {\r\n this.requestBusinessHoursRender(deps.businessHourGenerator);\r\n}, function () {\r\n this.requestBusinessHoursUnrender();\r\n});\r\nView.watch('initialEvents', ['dateProfile'], function (deps) {\r\n return this.fetchInitialEvents(deps.dateProfile);\r\n});\r\nView.watch('bindingEvents', ['initialEvents'], function (deps) {\r\n this.setEvents(deps.initialEvents);\r\n this.bindEventChanges();\r\n}, function () {\r\n this.unbindEventChanges();\r\n this.unsetEvents();\r\n});\r\nView.watch('displayingEvents', ['displayingDates', 'hasEvents'], function () {\r\n this.requestEventsRender(this.get('currentEvents'));\r\n}, function () {\r\n this.requestEventsUnrender();\r\n});\r\nView.watch('title', ['dateProfile'], function (deps) {\r\n return (this.title = this.computeTitle(deps.dateProfile)); // assign to View for legacy reasons\r\n});\r\nView.watch('legacyDateProps', ['dateProfile'], function (deps) {\r\n var calendar = this.calendar;\r\n var dateProfile = deps.dateProfile;\r\n // DEPRECATED, but we need to keep it updated...\r\n this.start = calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.end = calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n this.intervalStart = calendar.msToMoment(dateProfile.currentUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.intervalEnd = calendar.msToMoment(dateProfile.currentUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 42 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer = /** @class */ (function () {\r\n function EventRenderer(component, fillRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n EventRenderer.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n // Updates values that rely on options and also relate to range\r\n EventRenderer.prototype.rangeUpdated = function () {\r\n var displayEventTime;\r\n var displayEventEnd;\r\n this.eventTimeFormat =\r\n this.opt('eventTimeFormat') ||\r\n this.opt('timeFormat') || // deprecated\r\n this.computeEventTimeFormat();\r\n displayEventTime = this.opt('displayEventTime');\r\n if (displayEventTime == null) {\r\n displayEventTime = this.computeDisplayEventTime(); // might be based off of range\r\n }\r\n displayEventEnd = this.opt('displayEventEnd');\r\n if (displayEventEnd == null) {\r\n displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\r\n }\r\n this.displayEventTime = displayEventTime;\r\n this.displayEventEnd = displayEventEnd;\r\n };\r\n EventRenderer.prototype.render = function (eventsPayload) {\r\n var dateProfile = this.component._getDateProfile();\r\n var eventDefId;\r\n var instanceGroup;\r\n var eventRanges;\r\n var bgRanges = [];\r\n var fgRanges = [];\r\n for (eventDefId in eventsPayload) {\r\n instanceGroup = eventsPayload[eventDefId];\r\n eventRanges = instanceGroup.sliceRenderRanges(dateProfile.activeUnzonedRange);\r\n if (instanceGroup.getEventDef().hasBgRendering()) {\r\n bgRanges.push.apply(bgRanges, eventRanges);\r\n }\r\n else {\r\n fgRanges.push.apply(fgRanges, eventRanges);\r\n }\r\n }\r\n this.renderBgRanges(bgRanges);\r\n this.renderFgRanges(fgRanges);\r\n };\r\n EventRenderer.prototype.unrender = function () {\r\n this.unrenderBgRanges();\r\n this.unrenderFgRanges();\r\n };\r\n EventRenderer.prototype.renderFgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n // render an `.el` on each seg\r\n // returns a subset of the segs. segs that were actually rendered\r\n segs = this.renderFgSegEls(segs);\r\n if (this.renderFgSegs(segs) !== false) {\r\n this.fgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderFgRanges = function () {\r\n this.unrenderFgSegs(this.fgSegs || []);\r\n this.fgSegs = null;\r\n };\r\n EventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n if (this.renderBgSegs(segs) !== false) {\r\n this.bgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgRanges = function () {\r\n this.unrenderBgSegs();\r\n this.bgSegs = null;\r\n };\r\n EventRenderer.prototype.getSegs = function () {\r\n return (this.bgSegs || []).concat(this.fgSegs || []);\r\n };\r\n // Renders foreground event segments onto the grid\r\n EventRenderer.prototype.renderFgSegs = function (segs) {\r\n // subclasses must implement\r\n // segs already has rendered els, and has been filtered.\r\n return false; // signal failure if not implemented\r\n };\r\n // Unrenders all currently rendered foreground segments\r\n EventRenderer.prototype.unrenderFgSegs = function (segs) {\r\n // subclasses must implement\r\n };\r\n EventRenderer.prototype.renderBgSegs = function (segs) {\r\n var _this = this;\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('bgEvent', segs, {\r\n getClasses: function (seg) {\r\n return _this.getBgClasses(seg.footprint.eventDef);\r\n },\r\n getCss: function (seg) {\r\n return {\r\n 'background-color': _this.getBgColor(seg.footprint.eventDef)\r\n };\r\n },\r\n filterEl: function (seg, el) {\r\n return _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n });\r\n }\r\n else {\r\n return false; // signal failure if no fillRenderer\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgSegs = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('bgEvent');\r\n }\r\n };\r\n // Renders and assigns an `el` property for each foreground event segment.\r\n // Only returns segments that successfully rendered.\r\n EventRenderer.prototype.renderFgSegEls = function (segs, disableResizing) {\r\n var _this = this;\r\n if (disableResizing === void 0) { disableResizing = false; }\r\n var hasEventRenderHandlers = this.view.hasPublicHandlers('eventRender');\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of event segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n this.beforeFgSegHtml(segs[i]);\r\n html += this.fgSegHtml(segs[i], disableResizing);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n if (hasEventRenderHandlers) {\r\n el = _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n if (el) {\r\n el.data('fc-seg', seg); // used by handlers\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n EventRenderer.prototype.beforeFgSegHtml = function (seg) {\r\n };\r\n // Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()\r\n EventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n // subclasses should implement\r\n };\r\n // Generic utility for generating the HTML classNames for an event segment's element\r\n EventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable) {\r\n var classes = [\r\n 'fc-event',\r\n seg.isStart ? 'fc-start' : 'fc-not-start',\r\n seg.isEnd ? 'fc-end' : 'fc-not-end'\r\n ].concat(this.getClasses(seg.footprint.eventDef));\r\n if (isDraggable) {\r\n classes.push('fc-draggable');\r\n }\r\n if (isResizable) {\r\n classes.push('fc-resizable');\r\n }\r\n // event is currently selected? attach a className.\r\n if (this.view.isEventDefSelected(seg.footprint.eventDef)) {\r\n classes.push('fc-selected');\r\n }\r\n return classes;\r\n };\r\n // Given an event and the default element used for rendering, returns the element that should actually be used.\r\n // Basically runs events and elements through the eventRender hook.\r\n EventRenderer.prototype.filterEventRenderEl = function (eventFootprint, el) {\r\n var legacy = eventFootprint.getEventLegacy();\r\n var custom = this.view.publiclyTrigger('eventRender', {\r\n context: legacy,\r\n args: [legacy, el, this.view]\r\n });\r\n if (custom === false) {\r\n el = null;\r\n }\r\n else if (custom && custom !== true) {\r\n el = $(custom);\r\n }\r\n return el;\r\n };\r\n // Compute the text that should be displayed on an event's element.\r\n // `range` can be the Event object itself, or something range-like, with at least a `start`.\r\n // If event times are disabled, or the event has no time, will return a blank string.\r\n // If not specified, formatStr will default to the eventTimeFormat setting,\r\n // and displayEnd will default to the displayEventEnd setting.\r\n EventRenderer.prototype.getTimeText = function (eventFootprint, formatStr, displayEnd) {\r\n return this._getTimeText(eventFootprint.eventInstance.dateProfile.start, eventFootprint.eventInstance.dateProfile.end, eventFootprint.componentFootprint.isAllDay, formatStr, displayEnd);\r\n };\r\n EventRenderer.prototype._getTimeText = function (start, end, isAllDay, formatStr, displayEnd) {\r\n if (formatStr == null) {\r\n formatStr = this.eventTimeFormat;\r\n }\r\n if (displayEnd == null) {\r\n displayEnd = this.displayEventEnd;\r\n }\r\n if (this.displayEventTime && !isAllDay) {\r\n if (displayEnd && end) {\r\n return this.view.formatRange({ start: start, end: end }, false, // allDay\r\n formatStr);\r\n }\r\n else {\r\n return start.format(formatStr);\r\n }\r\n }\r\n return '';\r\n };\r\n EventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('smallTimeFormat');\r\n };\r\n EventRenderer.prototype.computeDisplayEventTime = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.getBgClasses = function (eventDef) {\r\n var classNames = this.getClasses(eventDef);\r\n classNames.push('fc-bgevent');\r\n return classNames;\r\n };\r\n EventRenderer.prototype.getClasses = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var classNames = [];\r\n for (i = 0; i < objs.length; i++) {\r\n classNames.push.apply(// append\r\n classNames, objs[i].eventClassName || objs[i].className || []);\r\n }\r\n return classNames;\r\n };\r\n // Utility for generating event skin-related CSS properties\r\n EventRenderer.prototype.getSkinCss = function (eventDef) {\r\n return {\r\n 'background-color': this.getBgColor(eventDef),\r\n 'border-color': this.getBorderColor(eventDef),\r\n color: this.getTextColor(eventDef)\r\n };\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBgColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBackgroundColor || objs[i].eventColor ||\r\n objs[i].backgroundColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBackgroundColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBorderColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBorderColor || objs[i].eventColor ||\r\n objs[i].borderColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBorderColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getTextColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventTextColor ||\r\n objs[i].textColor;\r\n }\r\n if (!val) {\r\n val = this.opt('eventTextColor');\r\n }\r\n return val;\r\n };\r\n EventRenderer.prototype.getStylingObjs = function (eventDef) {\r\n var objs = this.getFallbackStylingObjs(eventDef);\r\n objs.unshift(eventDef);\r\n return objs;\r\n };\r\n EventRenderer.prototype.getFallbackStylingObjs = function (eventDef) {\r\n return [eventDef.source];\r\n };\r\n EventRenderer.prototype.sortEventSegs = function (segs) {\r\n segs.sort(util_1.proxy(this, 'compareEventSegs'));\r\n };\r\n // A cmp function for determining which segments should take visual priority\r\n EventRenderer.prototype.compareEventSegs = function (seg1, seg2) {\r\n var f1 = seg1.footprint;\r\n var f2 = seg2.footprint;\r\n var cf1 = f1.componentFootprint;\r\n var cf2 = f2.componentFootprint;\r\n var r1 = cf1.unzonedRange;\r\n var r2 = cf2.unzonedRange;\r\n return r1.startMs - r2.startMs || // earlier events go first\r\n (r2.endMs - r2.startMs) - (r1.endMs - r1.startMs) || // tie? longer events go first\r\n cf2.isAllDay - cf1.isAllDay || // tie? put all-day events first (booleans cast to 0/1)\r\n util_1.compareByFieldSpecs(f1.eventDef, f2.eventDef, this.view.eventOrderSpecs, f1.eventDef.miscProps, f2.eventDef.miscProps);\r\n };\r\n return EventRenderer;\r\n}());\r\nexports.default = EventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 43 */,\r\n/* 44 */,\r\n/* 45 */,\r\n/* 46 */,\r\n/* 47 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment_ext_1 = __webpack_require__(10);\r\n// Plugin\r\n// -------------------------------------------------------------------------------------------------\r\nmoment_ext_1.newMomentProto.format = function () {\r\n if (this._fullCalendar && arguments[0]) {\r\n return formatDate(this, arguments[0]); // our extended formatting\r\n }\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // moment.format() doesn't ensure english, but we want to.\r\n return moment_ext_1.oldMomentFormat(englishMoment(this));\r\n }\r\n return moment_ext_1.oldMomentProto.format.apply(this, arguments);\r\n};\r\nmoment_ext_1.newMomentProto.toISOString = function () {\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // depending on browser, moment might not output english. ensure english.\r\n // https://github.com/moment/moment/blob/2.18.1/src/lib/moment/format.js#L22\r\n return moment_ext_1.oldMomentProto.toISOString.apply(englishMoment(this), arguments);\r\n }\r\n return moment_ext_1.oldMomentProto.toISOString.apply(this, arguments);\r\n};\r\nfunction englishMoment(mom) {\r\n if (mom.locale() !== 'en') {\r\n return mom.clone().locale('en');\r\n }\r\n return mom;\r\n}\r\n// Config\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nInserted between chunks in the fake (\"intermediate\") formatting string.\r\nImportant that it passes as whitespace (\\s) because moment often identifies non-standalone months\r\nvia a regexp with an \\s.\r\n*/\r\nvar PART_SEPARATOR = '\\u000b'; // vertical tab\r\n/*\r\nInserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,\r\nbut rather, a \"special\" token that has custom rendering (see specialTokens map).\r\n*/\r\nvar SPECIAL_TOKEN_MARKER = '\\u001f'; // information separator 1\r\n/*\r\nInserted at the beginning and end of a span of text that must have non-zero numeric characters.\r\nHandling of these markers is done in a post-processing step at the very end of text rendering.\r\n*/\r\nvar MAYBE_MARKER = '\\u001e'; // information separator 2\r\nvar MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global\r\n/*\r\nAddition formatting tokens we want recognized\r\n*/\r\nvar specialTokens = {\r\n t: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'a').charAt(0);\r\n },\r\n T: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'A').charAt(0);\r\n }\r\n};\r\n/*\r\nThe first characters of formatting tokens for units that are 1 day or larger.\r\n`value` is for ranking relative size (lower means bigger).\r\n`unit` is a normalized unit, used for comparing moments.\r\n*/\r\nvar largeTokenMap = {\r\n Y: { value: 1, unit: 'year' },\r\n M: { value: 2, unit: 'month' },\r\n W: { value: 3, unit: 'week' },\r\n w: { value: 3, unit: 'week' },\r\n D: { value: 4, unit: 'day' },\r\n d: { value: 4, unit: 'day' } // day of week\r\n};\r\n// Single Date Formatting\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats `date` with a Moment formatting string, but allow our non-zero areas and special token\r\n*/\r\nfunction formatDate(date, formatStr) {\r\n return renderFakeFormatString(getParsedFormatString(formatStr).fakeFormatString, date);\r\n}\r\nexports.formatDate = formatDate;\r\n// Date Range Formatting\r\n// -------------------------------------------------------------------------------------------------\r\n// TODO: make it work with timezone offset\r\n/*\r\nUsing a formatting string meant for a single date, generate a range string, like\r\n\"Sep 2 - 9 2013\", that intelligently inserts a separator where the dates differ.\r\nIf the dates are the same as far as the format string is concerned, just return a single\r\nrendering of one date, without any separator.\r\n*/\r\nfunction formatRange(date1, date2, formatStr, separator, isRTL) {\r\n var localeData;\r\n date1 = moment_ext_1.default.parseZone(date1);\r\n date2 = moment_ext_1.default.parseZone(date2);\r\n localeData = date1.localeData();\r\n // Expand localized format strings, like \"LL\" -> \"MMMM D YYYY\".\r\n // BTW, this is not important for `formatDate` because it is impossible to put custom tokens\r\n // or non-zero areas in Moment's localized format strings.\r\n formatStr = localeData.longDateFormat(formatStr) || formatStr;\r\n return renderParsedFormat(getParsedFormatString(formatStr), date1, date2, separator || ' - ', isRTL);\r\n}\r\nexports.formatRange = formatRange;\r\n/*\r\nRenders a range with an already-parsed format string.\r\n*/\r\nfunction renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {\r\n var sameUnits = parsedFormat.sameUnits;\r\n var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons\r\n var unzonedDate2 = date2.clone().stripZone(); // \"\r\n var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);\r\n var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);\r\n var leftI;\r\n var leftStr = '';\r\n var rightI;\r\n var rightStr = '';\r\n var middleI;\r\n var middleStr1 = '';\r\n var middleStr2 = '';\r\n var middleStr = '';\r\n // Start at the leftmost side of the formatting string and continue until you hit a token\r\n // that is not the same between dates.\r\n for (leftI = 0; leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI])); leftI++) {\r\n leftStr += renderedParts1[leftI];\r\n }\r\n // Similarly, start at the rightmost side of the formatting string and move left\r\n for (rightI = sameUnits.length - 1; rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI])); rightI--) {\r\n // If current chunk is on the boundary of unique date-content, and is a special-case\r\n // date-formatting postfix character, then don't consume it. Consider it unique date-content.\r\n // TODO: make configurable\r\n if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {\r\n break;\r\n }\r\n rightStr = renderedParts1[rightI] + rightStr;\r\n }\r\n // The area in the middle is different for both of the dates.\r\n // Collect them distinctly so we can jam them together later.\r\n for (middleI = leftI; middleI <= rightI; middleI++) {\r\n middleStr1 += renderedParts1[middleI];\r\n middleStr2 += renderedParts2[middleI];\r\n }\r\n if (middleStr1 || middleStr2) {\r\n if (isRTL) {\r\n middleStr = middleStr2 + separator + middleStr1;\r\n }\r\n else {\r\n middleStr = middleStr1 + separator + middleStr2;\r\n }\r\n }\r\n return processMaybeMarkers(leftStr + middleStr + rightStr);\r\n}\r\n// Format String Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nvar parsedFormatStrCache = {};\r\n/*\r\nReturns a parsed format string, leveraging a cache.\r\n*/\r\nfunction getParsedFormatString(formatStr) {\r\n return parsedFormatStrCache[formatStr] ||\r\n (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));\r\n}\r\n/*\r\nParses a format string into the following:\r\n- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.\r\n- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like \"day\"),\r\n that indicates how similar a range's start & end must be in order to share the same formatted text.\r\n If not a token, then the value is null.\r\n Always a flat array (not nested liked \"chunks\").\r\n*/\r\nfunction parseFormatString(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n return {\r\n fakeFormatString: buildFakeFormatString(chunks),\r\n sameUnits: buildSameUnits(chunks)\r\n };\r\n}\r\n/*\r\nBreak the formatting string into an array of chunks.\r\nA 'maybe' chunk will have nested chunks.\r\n*/\r\nfunction chunkFormatString(formatStr) {\r\n var chunks = [];\r\n var match;\r\n // TODO: more descrimination\r\n // \\4 is a backreference to the first character of a multi-character set.\r\n var chunker = /\\[([^\\]]*)\\]|\\(([^\\)]*)\\)|(LTS|LT|(\\w)\\4*o?)|([^\\w\\[\\(]+)/g;\r\n while ((match = chunker.exec(formatStr))) {\r\n if (match[1]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[1]));\r\n }\r\n else if (match[2]) {\r\n chunks.push({ maybe: chunkFormatString(match[2]) });\r\n }\r\n else if (match[3]) {\r\n chunks.push({ token: match[3] });\r\n }\r\n else if (match[5]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[5]));\r\n }\r\n }\r\n return chunks;\r\n}\r\n/*\r\nPotentially splits a literal-text string into multiple parts. For special cases.\r\n*/\r\nfunction splitStringLiteral(s) {\r\n if (s === '. ') {\r\n return ['.', ' ']; // for locales with periods bound to the end of each year/month/date\r\n }\r\n else {\r\n return [s];\r\n }\r\n}\r\n/*\r\nGiven chunks parsed from a real format string, generate a fake (aka \"intermediate\") format string with special control\r\ncharacters that will eventually be given to moment for formatting, and then post-processed.\r\n*/\r\nfunction buildFakeFormatString(chunks) {\r\n var parts = [];\r\n var i;\r\n var chunk;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (typeof chunk === 'string') {\r\n parts.push('[' + chunk + ']');\r\n }\r\n else if (chunk.token) {\r\n if (chunk.token in specialTokens) {\r\n parts.push(SPECIAL_TOKEN_MARKER + // useful during post-processing\r\n '[' + chunk.token + ']' // preserve as literal text\r\n );\r\n }\r\n else {\r\n parts.push(chunk.token); // unprotected text implies a format string\r\n }\r\n }\r\n else if (chunk.maybe) {\r\n parts.push(MAYBE_MARKER + // useful during post-processing\r\n buildFakeFormatString(chunk.maybe) +\r\n MAYBE_MARKER);\r\n }\r\n }\r\n return parts.join(PART_SEPARATOR);\r\n}\r\n/*\r\nGiven parsed chunks from a real formatting string, generates an array of unit strings (like \"day\") that indicate\r\nin which regard two dates must be similar in order to share range formatting text.\r\nThe `chunks` can be nested (because of \"maybe\" chunks), however, the returned array will be flat.\r\n*/\r\nfunction buildSameUnits(chunks) {\r\n var units = [];\r\n var i;\r\n var chunk;\r\n var tokenInfo;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n tokenInfo = largeTokenMap[chunk.token.charAt(0)];\r\n units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second\r\n }\r\n else if (chunk.maybe) {\r\n units.push.apply(units, // append\r\n buildSameUnits(chunk.maybe));\r\n }\r\n else {\r\n units.push(null);\r\n }\r\n }\r\n return units;\r\n}\r\n// Rendering to text\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats a date with a fake format string, post-processes the control characters, then returns.\r\n*/\r\nfunction renderFakeFormatString(fakeFormatString, date) {\r\n return processMaybeMarkers(renderFakeFormatStringParts(fakeFormatString, date).join(''));\r\n}\r\n/*\r\nFormats a date into parts that will have been post-processed, EXCEPT for the \"maybe\" markers.\r\n*/\r\nfunction renderFakeFormatStringParts(fakeFormatString, date) {\r\n var parts = [];\r\n var fakeRender = moment_ext_1.oldMomentFormat(date, fakeFormatString);\r\n var fakeParts = fakeRender.split(PART_SEPARATOR);\r\n var i;\r\n var fakePart;\r\n for (i = 0; i < fakeParts.length; i++) {\r\n fakePart = fakeParts[i];\r\n if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {\r\n parts.push(\r\n // the literal string IS the token's name.\r\n // call special token's registered function.\r\n specialTokens[fakePart.substring(1)](date));\r\n }\r\n else {\r\n parts.push(fakePart);\r\n }\r\n }\r\n return parts;\r\n}\r\n/*\r\nAccepts an almost-finally-formatted string and processes the \"maybe\" control characters, returning a new string.\r\n*/\r\nfunction processMaybeMarkers(s) {\r\n return s.replace(MAYBE_REGEXP, function (m0, m1) {\r\n if (m1.match(/[1-9]/)) {\r\n return m1;\r\n }\r\n else {\r\n return '';\r\n }\r\n });\r\n}\r\n// Misc Utils\r\n// -------------------------------------------------------------------------------------------------\r\n/*\r\nReturns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.\r\n*/\r\nfunction queryMostGranularFormatUnit(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n var i;\r\n var chunk;\r\n var candidate;\r\n var best;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n candidate = largeTokenMap[chunk.token.charAt(0)];\r\n if (candidate) {\r\n if (!best || candidate.value > best.value) {\r\n best = candidate;\r\n }\r\n }\r\n }\r\n }\r\n if (best) {\r\n return best.unit;\r\n }\r\n return null;\r\n}\r\nexports.queryMostGranularFormatUnit = queryMostGranularFormatUnit;\r\n\r\n\r\n/***/ }),\r\n/* 48 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Model = /** @class */ (function (_super) {\r\n tslib_1.__extends(Model, _super);\r\n function Model() {\r\n var _this = _super.call(this) || this;\r\n _this._watchers = {};\r\n _this._props = {};\r\n _this.applyGlobalWatchers();\r\n _this.constructed();\r\n return _this;\r\n }\r\n Model.watch = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // subclasses should make a masked-copy of the superclass's map\r\n // TODO: write test\r\n if (!this.prototype.hasOwnProperty('_globalWatchArgs')) {\r\n this.prototype._globalWatchArgs = Object.create(this.prototype._globalWatchArgs);\r\n }\r\n this.prototype._globalWatchArgs[name] = args;\r\n };\r\n Model.prototype.constructed = function () {\r\n // useful for monkeypatching. TODO: BaseClass?\r\n };\r\n Model.prototype.applyGlobalWatchers = function () {\r\n var map = this._globalWatchArgs;\r\n var name;\r\n for (name in map) {\r\n this.watch.apply(this, [name].concat(map[name]));\r\n }\r\n };\r\n Model.prototype.has = function (name) {\r\n return name in this._props;\r\n };\r\n Model.prototype.get = function (name) {\r\n if (name === undefined) {\r\n return this._props;\r\n }\r\n return this._props[name];\r\n };\r\n Model.prototype.set = function (name, val) {\r\n var newProps;\r\n if (typeof name === 'string') {\r\n newProps = {};\r\n newProps[name] = val === undefined ? null : val;\r\n }\r\n else {\r\n newProps = name;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.reset = function (newProps) {\r\n var oldProps = this._props;\r\n var changeset = {}; // will have undefined's to signal unsets\r\n var name;\r\n for (name in oldProps) {\r\n changeset[name] = undefined;\r\n }\r\n for (name in newProps) {\r\n changeset[name] = newProps[name];\r\n }\r\n this.setProps(changeset);\r\n };\r\n Model.prototype.unset = function (name) {\r\n var newProps = {};\r\n var names;\r\n var i;\r\n if (typeof name === 'string') {\r\n names = [name];\r\n }\r\n else {\r\n names = name;\r\n }\r\n for (i = 0; i < names.length; i++) {\r\n newProps[names[i]] = undefined;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.setProps = function (newProps) {\r\n var changedProps = {};\r\n var changedCnt = 0;\r\n var name;\r\n var val;\r\n for (name in newProps) {\r\n val = newProps[name];\r\n // a change in value?\r\n // if an object, don't check equality, because might have been mutated internally.\r\n // TODO: eventually enforce immutability.\r\n if (typeof val === 'object' ||\r\n val !== this._props[name]) {\r\n changedProps[name] = val;\r\n changedCnt++;\r\n }\r\n }\r\n if (changedCnt) {\r\n this.trigger('before:batchChange', changedProps);\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n this.trigger('before:change', name, val);\r\n this.trigger('before:change:' + name, val);\r\n }\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n if (val === undefined) {\r\n delete this._props[name];\r\n }\r\n else {\r\n this._props[name] = val;\r\n }\r\n this.trigger('change:' + name, val);\r\n this.trigger('change', name, val);\r\n }\r\n this.trigger('batchChange', changedProps);\r\n }\r\n };\r\n Model.prototype.watch = function (name, depList, startFunc, stopFunc) {\r\n var _this = this;\r\n this.unwatch(name);\r\n this._watchers[name] = this._watchDeps(depList, function (deps) {\r\n var res = startFunc.call(_this, deps);\r\n if (res && res.then) {\r\n _this.unset(name); // put in an unset state while resolving\r\n res.then(function (val) {\r\n _this.set(name, val);\r\n });\r\n }\r\n else {\r\n _this.set(name, res);\r\n }\r\n }, function (deps) {\r\n _this.unset(name);\r\n if (stopFunc) {\r\n stopFunc.call(_this, deps);\r\n }\r\n });\r\n };\r\n Model.prototype.unwatch = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n delete this._watchers[name];\r\n watcher.teardown();\r\n }\r\n };\r\n Model.prototype._watchDeps = function (depList, startFunc, stopFunc) {\r\n var _this = this;\r\n var queuedChangeCnt = 0;\r\n var depCnt = depList.length;\r\n var satisfyCnt = 0;\r\n var values = {}; // what's passed as the `deps` arguments\r\n var bindTuples = []; // array of [ eventName, handlerFunc ] arrays\r\n var isCallingStop = false;\r\n var onBeforeDepChange = function (depName, val, isOptional) {\r\n queuedChangeCnt++;\r\n if (queuedChangeCnt === 1) {\r\n if (satisfyCnt === depCnt) {\r\n isCallingStop = true;\r\n stopFunc(values);\r\n isCallingStop = false;\r\n }\r\n }\r\n };\r\n var onDepChange = function (depName, val, isOptional) {\r\n if (val === undefined) {\r\n // required dependency that was previously set?\r\n if (!isOptional && values[depName] !== undefined) {\r\n satisfyCnt--;\r\n }\r\n delete values[depName];\r\n }\r\n else {\r\n // required dependency that was previously unset?\r\n if (!isOptional && values[depName] === undefined) {\r\n satisfyCnt++;\r\n }\r\n values[depName] = val;\r\n }\r\n queuedChangeCnt--;\r\n if (!queuedChangeCnt) {\r\n // now finally satisfied or satisfied all along?\r\n if (satisfyCnt === depCnt) {\r\n // if the stopFunc initiated another value change, ignore it.\r\n // it will be processed by another change event anyway.\r\n if (!isCallingStop) {\r\n startFunc(values);\r\n }\r\n }\r\n }\r\n };\r\n // intercept for .on() that remembers handlers\r\n var bind = function (eventName, handler) {\r\n _this.on(eventName, handler);\r\n bindTuples.push([eventName, handler]);\r\n };\r\n // listen to dependency changes\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n bind('before:change:' + depName, function (val) {\r\n onBeforeDepChange(depName, val, isOptional);\r\n });\r\n bind('change:' + depName, function (val) {\r\n onDepChange(depName, val, isOptional);\r\n });\r\n });\r\n // process current dependency values\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n if (_this.has(depName)) {\r\n values[depName] = _this.get(depName);\r\n satisfyCnt++;\r\n }\r\n else if (isOptional) {\r\n satisfyCnt++;\r\n }\r\n });\r\n // initially satisfied\r\n if (satisfyCnt === depCnt) {\r\n startFunc(values);\r\n }\r\n return {\r\n teardown: function () {\r\n // remove all handlers\r\n for (var i = 0; i < bindTuples.length; i++) {\r\n _this.off(bindTuples[i][0], bindTuples[i][1]);\r\n }\r\n bindTuples = null;\r\n // was satisfied, so call stopFunc\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n }\r\n },\r\n flash: function () {\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n startFunc(values);\r\n }\r\n }\r\n };\r\n };\r\n Model.prototype.flash = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n watcher.flash();\r\n }\r\n };\r\n return Model;\r\n}(Class_1.default));\r\nexports.default = Model;\r\nModel.prototype._globalWatchArgs = {}; // mutation protection in Model.watch\r\nEmitterMixin_1.default.mixInto(Model);\r\nListenerMixin_1.default.mixInto(Model);\r\n\r\n\r\n/***/ }),\r\n/* 49 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nexports.default = {\r\n parse: function (eventInput, source) {\r\n if (util_1.isTimeString(eventInput.start) || moment.isDuration(eventInput.start) ||\r\n util_1.isTimeString(eventInput.end) || moment.isDuration(eventInput.end)) {\r\n return RecurringEventDef_1.default.parse(eventInput, source);\r\n }\r\n else {\r\n return SingleEventDef_1.default.parse(eventInput, source);\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 50 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDefDateMutation = /** @class */ (function () {\r\n function EventDefDateMutation() {\r\n this.clearEnd = false;\r\n this.forceTimed = false;\r\n this.forceAllDay = false;\r\n }\r\n EventDefDateMutation.createFromDiff = function (dateProfile0, dateProfile1, largeUnit) {\r\n var clearEnd = dateProfile0.end && !dateProfile1.end;\r\n var forceTimed = dateProfile0.isAllDay() && !dateProfile1.isAllDay();\r\n var forceAllDay = !dateProfile0.isAllDay() && dateProfile1.isAllDay();\r\n var dateDelta;\r\n var endDiff;\r\n var endDelta;\r\n var mutation;\r\n // subtracts the dates in the appropriate way, returning a duration\r\n function subtractDates(date1, date0) {\r\n if (largeUnit) {\r\n return util_1.diffByUnit(date1, date0, largeUnit); // poorly named\r\n }\r\n else if (dateProfile1.isAllDay()) {\r\n return util_1.diffDay(date1, date0); // poorly named\r\n }\r\n else {\r\n return util_1.diffDayTime(date1, date0); // poorly named\r\n }\r\n }\r\n dateDelta = subtractDates(dateProfile1.start, dateProfile0.start);\r\n if (dateProfile1.end) {\r\n // use unzonedRanges because dateProfile0.end might be null\r\n endDiff = subtractDates(dateProfile1.unzonedRange.getEnd(), dateProfile0.unzonedRange.getEnd());\r\n endDelta = endDiff.subtract(dateDelta);\r\n }\r\n mutation = new EventDefDateMutation();\r\n mutation.clearEnd = clearEnd;\r\n mutation.forceTimed = forceTimed;\r\n mutation.forceAllDay = forceAllDay;\r\n mutation.setDateDelta(dateDelta);\r\n mutation.setEndDelta(endDelta);\r\n return mutation;\r\n };\r\n /*\r\n returns an undo function.\r\n */\r\n EventDefDateMutation.prototype.buildNewDateProfile = function (eventDateProfile, calendar) {\r\n var start = eventDateProfile.start.clone();\r\n var end = null;\r\n var shouldRezone = false;\r\n if (eventDateProfile.end && !this.clearEnd) {\r\n end = eventDateProfile.end.clone();\r\n }\r\n else if (this.endDelta && !end) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n if (this.forceTimed) {\r\n shouldRezone = true;\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n else if (this.forceAllDay) {\r\n if (start.hasTime()) {\r\n start.stripTime();\r\n }\r\n if (end && end.hasTime()) {\r\n end.stripTime();\r\n }\r\n }\r\n if (this.dateDelta) {\r\n shouldRezone = true;\r\n start.add(this.dateDelta);\r\n if (end) {\r\n end.add(this.dateDelta);\r\n }\r\n }\r\n // do this before adding startDelta to start, so we can work off of start\r\n if (this.endDelta) {\r\n shouldRezone = true;\r\n end.add(this.endDelta);\r\n }\r\n if (this.startDelta) {\r\n shouldRezone = true;\r\n start.add(this.startDelta);\r\n }\r\n if (shouldRezone) {\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n }\r\n // TODO: okay to access calendar option?\r\n if (!end && calendar.opt('forceEventDuration')) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n return new EventDateProfile_1.default(start, end, calendar);\r\n };\r\n EventDefDateMutation.prototype.setDateDelta = function (dateDelta) {\r\n if (dateDelta && dateDelta.valueOf()) {\r\n this.dateDelta = dateDelta;\r\n }\r\n else {\r\n this.dateDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setStartDelta = function (startDelta) {\r\n if (startDelta && startDelta.valueOf()) {\r\n this.startDelta = startDelta;\r\n }\r\n else {\r\n this.startDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setEndDelta = function (endDelta) {\r\n if (endDelta && endDelta.valueOf()) {\r\n this.endDelta = endDelta;\r\n }\r\n else {\r\n this.endDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.isEmpty = function () {\r\n return !this.clearEnd && !this.forceTimed && !this.forceAllDay &&\r\n !this.dateDelta && !this.startDelta && !this.endDelta;\r\n };\r\n return EventDefDateMutation;\r\n}());\r\nexports.default = EventDefDateMutation;\r\n\r\n\r\n/***/ }),\r\n/* 51 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar themeClassHash = {};\r\nfunction defineThemeSystem(themeName, themeClass) {\r\n themeClassHash[themeName] = themeClass;\r\n}\r\nexports.defineThemeSystem = defineThemeSystem;\r\nfunction getThemeSystemClass(themeSetting) {\r\n if (!themeSetting) {\r\n return StandardTheme_1.default;\r\n }\r\n else if (themeSetting === true) {\r\n return JqueryUiTheme_1.default;\r\n }\r\n else {\r\n return themeClassHash[themeSetting];\r\n }\r\n}\r\nexports.getThemeSystemClass = getThemeSystemClass;\r\n\r\n\r\n/***/ }),\r\n/* 52 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar ArrayEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(ArrayEventSource, _super);\r\n function ArrayEventSource(calendar) {\r\n var _this = _super.call(this, calendar) || this;\r\n _this.eventDefs = []; // for if setRawEventDefs is never called\r\n return _this;\r\n }\r\n ArrayEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isArray(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isArray(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n ArrayEventSource.prototype.setRawEventDefs = function (rawEventDefs) {\r\n this.rawEventDefs = rawEventDefs;\r\n this.eventDefs = this.parseEventDefs(rawEventDefs);\r\n };\r\n ArrayEventSource.prototype.fetch = function (start, end, timezone) {\r\n var eventDefs = this.eventDefs;\r\n var i;\r\n if (this.currentTimezone != null &&\r\n this.currentTimezone !== timezone) {\r\n for (i = 0; i < eventDefs.length; i++) {\r\n if (eventDefs[i] instanceof SingleEventDef_1.default) {\r\n eventDefs[i].rezone();\r\n }\r\n }\r\n }\r\n this.currentTimezone = timezone;\r\n return Promise_1.default.resolve(eventDefs);\r\n };\r\n ArrayEventSource.prototype.addEventDef = function (eventDef) {\r\n this.eventDefs.push(eventDef);\r\n };\r\n /*\r\n eventDefId already normalized to a string\r\n */\r\n ArrayEventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n return util_1.removeMatching(this.eventDefs, function (eventDef) {\r\n return eventDef.id === eventDefId;\r\n });\r\n };\r\n ArrayEventSource.prototype.removeAllEventDefs = function () {\r\n this.eventDefs = [];\r\n };\r\n ArrayEventSource.prototype.getPrimitive = function () {\r\n return this.rawEventDefs;\r\n };\r\n ArrayEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.setRawEventDefs(rawProps.events);\r\n return superSuccess;\r\n };\r\n return ArrayEventSource;\r\n}(EventSource_1.default));\r\nexports.default = ArrayEventSource;\r\nArrayEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 53 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/*\r\nA cache for the left/right/top/bottom/width/height values for one or more elements.\r\nWorks with both offset (from topleft document) and position (from offsetParent).\r\n\r\noptions:\r\n- els\r\n- isHorizontal\r\n- isVertical\r\n*/\r\nvar CoordCache = /** @class */ (function () {\r\n function CoordCache(options) {\r\n this.isHorizontal = false; // whether to query for left/right/width\r\n this.isVertical = false; // whether to query for top/bottom/height\r\n this.els = $(options.els);\r\n this.isHorizontal = options.isHorizontal;\r\n this.isVertical = options.isVertical;\r\n this.forcedOffsetParentEl = options.offsetParent ? $(options.offsetParent) : null;\r\n }\r\n // Queries the els for coordinates and stores them.\r\n // Call this method before using and of the get* methods below.\r\n CoordCache.prototype.build = function () {\r\n var offsetParentEl = this.forcedOffsetParentEl;\r\n if (!offsetParentEl && this.els.length > 0) {\r\n offsetParentEl = this.els.eq(0).offsetParent();\r\n }\r\n this.origin = offsetParentEl ?\r\n offsetParentEl.offset() :\r\n null;\r\n this.boundingRect = this.queryBoundingRect();\r\n if (this.isHorizontal) {\r\n this.buildElHorizontals();\r\n }\r\n if (this.isVertical) {\r\n this.buildElVerticals();\r\n }\r\n };\r\n // Destroys all internal data about coordinates, freeing memory\r\n CoordCache.prototype.clear = function () {\r\n this.origin = null;\r\n this.boundingRect = null;\r\n this.lefts = null;\r\n this.rights = null;\r\n this.tops = null;\r\n this.bottoms = null;\r\n };\r\n // When called, if coord caches aren't built, builds them\r\n CoordCache.prototype.ensureBuilt = function () {\r\n if (!this.origin) {\r\n this.build();\r\n }\r\n };\r\n // Populates the left/right internal coordinate arrays\r\n CoordCache.prototype.buildElHorizontals = function () {\r\n var lefts = [];\r\n var rights = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var left = el.offset().left;\r\n var width = el.outerWidth();\r\n lefts.push(left);\r\n rights.push(left + width);\r\n });\r\n this.lefts = lefts;\r\n this.rights = rights;\r\n };\r\n // Populates the top/bottom internal coordinate arrays\r\n CoordCache.prototype.buildElVerticals = function () {\r\n var tops = [];\r\n var bottoms = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var top = el.offset().top;\r\n var height = el.outerHeight();\r\n tops.push(top);\r\n bottoms.push(top + height);\r\n });\r\n this.tops = tops;\r\n this.bottoms = bottoms;\r\n };\r\n // Given a left offset (from document left), returns the index of the el that it horizontally intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getHorizontalIndex = function (leftOffset) {\r\n this.ensureBuilt();\r\n var lefts = this.lefts;\r\n var rights = this.rights;\r\n var len = lefts.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (leftOffset >= lefts[i] && leftOffset < rights[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Given a top offset (from document top), returns the index of the el that it vertically intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getVerticalIndex = function (topOffset) {\r\n this.ensureBuilt();\r\n var tops = this.tops;\r\n var bottoms = this.bottoms;\r\n var len = tops.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (topOffset >= tops[i] && topOffset < bottoms[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Gets the left offset (from document left) of the element at the given index\r\n CoordCache.prototype.getLeftOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex];\r\n };\r\n // Gets the left position (from offsetParent left) of the element at the given index\r\n CoordCache.prototype.getLeftPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex] - this.origin.left;\r\n };\r\n // Gets the right offset (from document left) of the element at the given index.\r\n // This value is NOT relative to the document's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex];\r\n };\r\n // Gets the right position (from offsetParent left) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.origin.left;\r\n };\r\n // Gets the width of the element at the given index\r\n CoordCache.prototype.getWidth = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.lefts[leftIndex];\r\n };\r\n // Gets the top offset (from document top) of the element at the given index\r\n CoordCache.prototype.getTopOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex];\r\n };\r\n // Gets the top position (from offsetParent top) of the element at the given position\r\n CoordCache.prototype.getTopPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex] - this.origin.top;\r\n };\r\n // Gets the bottom offset (from the document top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex];\r\n };\r\n // Gets the bottom position (from the offsetParent top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.origin.top;\r\n };\r\n // Gets the height of the element at the given index\r\n CoordCache.prototype.getHeight = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.tops[topIndex];\r\n };\r\n // Bounding Rect\r\n // TODO: decouple this from CoordCache\r\n // Compute and return what the elements' bounding rectangle is, from the user's perspective.\r\n // Right now, only returns a rectangle if constrained by an overflow:scroll element.\r\n // Returns null if there are no elements\r\n CoordCache.prototype.queryBoundingRect = function () {\r\n var scrollParentEl;\r\n if (this.els.length > 0) {\r\n scrollParentEl = util_1.getScrollParent(this.els.eq(0));\r\n if (!scrollParentEl.is(document)) {\r\n return util_1.getClientRect(scrollParentEl);\r\n }\r\n }\r\n return null;\r\n };\r\n CoordCache.prototype.isPointInBounds = function (leftOffset, topOffset) {\r\n return this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);\r\n };\r\n CoordCache.prototype.isLeftInBounds = function (leftOffset) {\r\n return !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);\r\n };\r\n CoordCache.prototype.isTopInBounds = function (topOffset) {\r\n return !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);\r\n };\r\n return CoordCache;\r\n}());\r\nexports.default = CoordCache;\r\n\r\n\r\n/***/ }),\r\n/* 54 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\n/* Tracks a drag's mouse movement, firing various handlers\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// TODO: use Emitter\r\nvar DragListener = /** @class */ (function () {\r\n function DragListener(options) {\r\n this.isInteracting = false;\r\n this.isDistanceSurpassed = false;\r\n this.isDelayEnded = false;\r\n this.isDragging = false;\r\n this.isTouch = false;\r\n this.isGeneric = false; // initiated by 'dragstart' (jqui)\r\n this.shouldCancelTouchScroll = true;\r\n this.scrollAlwaysKills = false;\r\n this.isAutoScroll = false;\r\n // defaults\r\n this.scrollSensitivity = 30; // pixels from edge for scrolling to start\r\n this.scrollSpeed = 200; // pixels per second, at maximum speed\r\n this.scrollIntervalMs = 50; // millisecond wait between scroll increment\r\n this.options = options || {};\r\n }\r\n // Interaction (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startInteraction = function (ev, extraOptions) {\r\n if (extraOptions === void 0) { extraOptions = {}; }\r\n if (ev.type === 'mousedown') {\r\n if (GlobalEmitter_1.default.get().shouldIgnoreMouse()) {\r\n return;\r\n }\r\n else if (!util_1.isPrimaryMouseButton(ev)) {\r\n return;\r\n }\r\n else {\r\n ev.preventDefault(); // prevents native selection in most browsers\r\n }\r\n }\r\n if (!this.isInteracting) {\r\n // process options\r\n this.delay = util_1.firstDefined(extraOptions.delay, this.options.delay, 0);\r\n this.minDistance = util_1.firstDefined(extraOptions.distance, this.options.distance, 0);\r\n this.subjectEl = this.options.subjectEl;\r\n util_1.preventSelection($('body'));\r\n this.isInteracting = true;\r\n this.isTouch = util_1.getEvIsTouch(ev);\r\n this.isGeneric = ev.type === 'dragstart';\r\n this.isDelayEnded = false;\r\n this.isDistanceSurpassed = false;\r\n this.originX = util_1.getEvX(ev);\r\n this.originY = util_1.getEvY(ev);\r\n this.scrollEl = util_1.getScrollParent($(ev.target));\r\n this.bindHandlers();\r\n this.initAutoScroll();\r\n this.handleInteractionStart(ev);\r\n this.startDelay(ev);\r\n if (!this.minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n };\r\n DragListener.prototype.handleInteractionStart = function (ev) {\r\n this.trigger('interactionStart', ev);\r\n };\r\n DragListener.prototype.endInteraction = function (ev, isCancelled) {\r\n if (this.isInteracting) {\r\n this.endDrag(ev);\r\n if (this.delayTimeoutId) {\r\n clearTimeout(this.delayTimeoutId);\r\n this.delayTimeoutId = null;\r\n }\r\n this.destroyAutoScroll();\r\n this.unbindHandlers();\r\n this.isInteracting = false;\r\n this.handleInteractionEnd(ev, isCancelled);\r\n util_1.allowSelection($('body'));\r\n }\r\n };\r\n DragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n this.trigger('interactionEnd', ev, isCancelled || false);\r\n };\r\n // Binding To DOM\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.bindHandlers = function () {\r\n // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,\r\n // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.\r\n var globalEmitter = GlobalEmitter_1.default.get();\r\n if (this.isGeneric) {\r\n this.listenTo($(document), {\r\n drag: this.handleMove,\r\n dragstop: this.endInteraction\r\n });\r\n }\r\n else if (this.isTouch) {\r\n this.listenTo(globalEmitter, {\r\n touchmove: this.handleTouchMove,\r\n touchend: this.endInteraction,\r\n scroll: this.handleTouchScroll\r\n });\r\n }\r\n else {\r\n this.listenTo(globalEmitter, {\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.endInteraction\r\n });\r\n }\r\n this.listenTo(globalEmitter, {\r\n selectstart: util_1.preventDefault,\r\n contextmenu: util_1.preventDefault // long taps would open menu on Chrome dev tools\r\n });\r\n };\r\n DragListener.prototype.unbindHandlers = function () {\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n this.stopListeningTo($(document)); // for isGeneric\r\n };\r\n // Drag (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // extraOptions ignored if drag already started\r\n DragListener.prototype.startDrag = function (ev, extraOptions) {\r\n this.startInteraction(ev, extraOptions); // ensure interaction began\r\n if (!this.isDragging) {\r\n this.isDragging = true;\r\n this.handleDragStart(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragStart = function (ev) {\r\n this.trigger('dragStart', ev);\r\n };\r\n DragListener.prototype.handleMove = function (ev) {\r\n var dx = util_1.getEvX(ev) - this.originX;\r\n var dy = util_1.getEvY(ev) - this.originY;\r\n var minDistance = this.minDistance;\r\n var distanceSq; // current distance from the origin, squared\r\n if (!this.isDistanceSurpassed) {\r\n distanceSq = dx * dx + dy * dy;\r\n if (distanceSq >= minDistance * minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n if (this.isDragging) {\r\n this.handleDrag(dx, dy, ev);\r\n }\r\n };\r\n // Called while the mouse is being moved and when we know a legitimate drag is taking place\r\n DragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n this.trigger('drag', dx, dy, ev);\r\n this.updateAutoScroll(ev); // will possibly cause scrolling\r\n };\r\n DragListener.prototype.endDrag = function (ev) {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.handleDragEnd(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragEnd = function (ev) {\r\n this.trigger('dragEnd', ev);\r\n };\r\n // Delay\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startDelay = function (initialEv) {\r\n var _this = this;\r\n if (this.delay) {\r\n this.delayTimeoutId = setTimeout(function () {\r\n _this.handleDelayEnd(initialEv);\r\n }, this.delay);\r\n }\r\n else {\r\n this.handleDelayEnd(initialEv);\r\n }\r\n };\r\n DragListener.prototype.handleDelayEnd = function (initialEv) {\r\n this.isDelayEnded = true;\r\n if (this.isDistanceSurpassed) {\r\n this.startDrag(initialEv);\r\n }\r\n };\r\n // Distance\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleDistanceSurpassed = function (ev) {\r\n this.isDistanceSurpassed = true;\r\n if (this.isDelayEnded) {\r\n this.startDrag(ev);\r\n }\r\n };\r\n // Mouse / Touch\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchMove = function (ev) {\r\n // prevent inertia and touchmove-scrolling while dragging\r\n if (this.isDragging && this.shouldCancelTouchScroll) {\r\n ev.preventDefault();\r\n }\r\n this.handleMove(ev);\r\n };\r\n DragListener.prototype.handleMouseMove = function (ev) {\r\n this.handleMove(ev);\r\n };\r\n // Scrolling (unrelated to auto-scroll)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchScroll = function (ev) {\r\n // if the drag is being initiated by touch, but a scroll happens before\r\n // the drag-initiating delay is over, cancel the drag\r\n if (!this.isDragging || this.scrollAlwaysKills) {\r\n this.endInteraction(ev, true); // isCancelled=true\r\n }\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n DragListener.prototype.trigger = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n if (this.options[name]) {\r\n this.options[name].apply(this, args);\r\n }\r\n // makes _methods callable by event name. TODO: kill this\r\n if (this['_' + name]) {\r\n this['_' + name].apply(this, args);\r\n }\r\n };\r\n // Auto-scroll\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.initAutoScroll = function () {\r\n var scrollEl = this.scrollEl;\r\n this.isAutoScroll =\r\n this.options.scroll &&\r\n scrollEl &&\r\n !scrollEl.is(window) &&\r\n !scrollEl.is(document);\r\n if (this.isAutoScroll) {\r\n // debounce makes sure rapid calls don't happen\r\n this.listenTo(scrollEl, 'scroll', util_1.debounce(this.handleDebouncedScroll, 100));\r\n }\r\n };\r\n DragListener.prototype.destroyAutoScroll = function () {\r\n this.endAutoScroll(); // kill any animation loop\r\n // remove the scroll handler if there is a scrollEl\r\n if (this.isAutoScroll) {\r\n this.stopListeningTo(this.scrollEl, 'scroll'); // will probably get removed by unbindHandlers too :(\r\n }\r\n };\r\n // Computes and stores the bounding rectangle of scrollEl\r\n DragListener.prototype.computeScrollBounds = function () {\r\n if (this.isAutoScroll) {\r\n this.scrollBounds = util_1.getOuterRect(this.scrollEl);\r\n // TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars\r\n }\r\n };\r\n // Called when the dragging is in progress and scrolling should be updated\r\n DragListener.prototype.updateAutoScroll = function (ev) {\r\n var sensitivity = this.scrollSensitivity;\r\n var bounds = this.scrollBounds;\r\n var topCloseness;\r\n var bottomCloseness;\r\n var leftCloseness;\r\n var rightCloseness;\r\n var topVel = 0;\r\n var leftVel = 0;\r\n if (bounds) {\r\n // compute closeness to edges. valid range is from 0.0 - 1.0\r\n topCloseness = (sensitivity - (util_1.getEvY(ev) - bounds.top)) / sensitivity;\r\n bottomCloseness = (sensitivity - (bounds.bottom - util_1.getEvY(ev))) / sensitivity;\r\n leftCloseness = (sensitivity - (util_1.getEvX(ev) - bounds.left)) / sensitivity;\r\n rightCloseness = (sensitivity - (bounds.right - util_1.getEvX(ev))) / sensitivity;\r\n // translate vertical closeness into velocity.\r\n // mouse must be completely in bounds for velocity to happen.\r\n if (topCloseness >= 0 && topCloseness <= 1) {\r\n topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up\r\n }\r\n else if (bottomCloseness >= 0 && bottomCloseness <= 1) {\r\n topVel = bottomCloseness * this.scrollSpeed;\r\n }\r\n // translate horizontal closeness into velocity\r\n if (leftCloseness >= 0 && leftCloseness <= 1) {\r\n leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left\r\n }\r\n else if (rightCloseness >= 0 && rightCloseness <= 1) {\r\n leftVel = rightCloseness * this.scrollSpeed;\r\n }\r\n }\r\n this.setScrollVel(topVel, leftVel);\r\n };\r\n // Sets the speed-of-scrolling for the scrollEl\r\n DragListener.prototype.setScrollVel = function (topVel, leftVel) {\r\n this.scrollTopVel = topVel;\r\n this.scrollLeftVel = leftVel;\r\n this.constrainScrollVel(); // massages into realistic values\r\n // if there is non-zero velocity, and an animation loop hasn't already started, then START\r\n if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {\r\n this.scrollIntervalId = setInterval(util_1.proxy(this, 'scrollIntervalFunc'), // scope to `this`\r\n this.scrollIntervalMs);\r\n }\r\n };\r\n // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way\r\n DragListener.prototype.constrainScrollVel = function () {\r\n var el = this.scrollEl;\r\n if (this.scrollTopVel < 0) {\r\n if (el.scrollTop() <= 0) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n else if (this.scrollTopVel > 0) {\r\n if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n if (this.scrollLeftVel < 0) {\r\n if (el.scrollLeft() <= 0) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n else if (this.scrollLeftVel > 0) {\r\n if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n };\r\n // This function gets called during every iteration of the scrolling animation loop\r\n DragListener.prototype.scrollIntervalFunc = function () {\r\n var el = this.scrollEl;\r\n var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by\r\n // change the value of scrollEl's scroll\r\n if (this.scrollTopVel) {\r\n el.scrollTop(el.scrollTop() + this.scrollTopVel * frac);\r\n }\r\n if (this.scrollLeftVel) {\r\n el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);\r\n }\r\n this.constrainScrollVel(); // since the scroll values changed, recompute the velocities\r\n // if scrolled all the way, which causes the vels to be zero, stop the animation loop\r\n if (!this.scrollTopVel && !this.scrollLeftVel) {\r\n this.endAutoScroll();\r\n }\r\n };\r\n // Kills any existing scrolling animation loop\r\n DragListener.prototype.endAutoScroll = function () {\r\n if (this.scrollIntervalId) {\r\n clearInterval(this.scrollIntervalId);\r\n this.scrollIntervalId = null;\r\n this.handleScrollEnd();\r\n }\r\n };\r\n // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)\r\n DragListener.prototype.handleDebouncedScroll = function () {\r\n // recompute all coordinates, but *only* if this is *not* part of our scrolling animation\r\n if (!this.scrollIntervalId) {\r\n this.handleScrollEnd();\r\n }\r\n };\r\n DragListener.prototype.handleScrollEnd = function () {\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n };\r\n return DragListener;\r\n}());\r\nexports.default = DragListener;\r\nListenerMixin_1.default.mixInto(DragListener);\r\n\r\n\r\n/***/ }),\r\n/* 55 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\n/*\r\nA set of rendering and date-related methods for a visual component comprised of one or more rows of day columns.\r\nPrerequisite: the object being mixed into needs to be a *Grid*\r\n*/\r\nvar DayTableMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayTableMixin, _super);\r\n function DayTableMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Populates internal variables used for date calculation and rendering\r\n DayTableMixin.prototype.updateDayTable = function () {\r\n var t = this;\r\n var view = t.view;\r\n var calendar = view.calendar;\r\n var date = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.startMs, true);\r\n var end = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.endMs, true);\r\n var dayIndex = -1;\r\n var dayIndices = [];\r\n var dayDates = [];\r\n var daysPerRow;\r\n var firstDay;\r\n var rowCnt;\r\n while (date.isBefore(end)) {\r\n if (view.isHiddenDay(date)) {\r\n dayIndices.push(dayIndex + 0.5); // mark that it's between indices\r\n }\r\n else {\r\n dayIndex++;\r\n dayIndices.push(dayIndex);\r\n dayDates.push(date.clone());\r\n }\r\n date.add(1, 'days');\r\n }\r\n if (this.breakOnWeeks) {\r\n // count columns until the day-of-week repeats\r\n firstDay = dayDates[0].day();\r\n for (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {\r\n if (dayDates[daysPerRow].day() === firstDay) {\r\n break;\r\n }\r\n }\r\n rowCnt = Math.ceil(dayDates.length / daysPerRow);\r\n }\r\n else {\r\n rowCnt = 1;\r\n daysPerRow = dayDates.length;\r\n }\r\n this.dayDates = dayDates;\r\n this.dayIndices = dayIndices;\r\n this.daysPerRow = daysPerRow;\r\n this.rowCnt = rowCnt;\r\n this.updateDayTableCols();\r\n };\r\n // Computes and assigned the colCnt property and updates any options that may be computed from it\r\n DayTableMixin.prototype.updateDayTableCols = function () {\r\n this.colCnt = this.computeColCnt();\r\n this.colHeadFormat =\r\n this.opt('columnHeaderFormat') ||\r\n this.opt('columnFormat') || // deprecated\r\n this.computeColHeadFormat();\r\n };\r\n // Determines how many columns there should be in the table\r\n DayTableMixin.prototype.computeColCnt = function () {\r\n return this.daysPerRow;\r\n };\r\n // Computes the ambiguously-timed moment for the given cell\r\n DayTableMixin.prototype.getCellDate = function (row, col) {\r\n return this.dayDates[this.getCellDayIndex(row, col)].clone();\r\n };\r\n // Computes the ambiguously-timed date range for the given cell\r\n DayTableMixin.prototype.getCellRange = function (row, col) {\r\n var start = this.getCellDate(row, col);\r\n var end = start.clone().add(1, 'days');\r\n return { start: start, end: end };\r\n };\r\n // Returns the number of day cells, chronologically, from the first of the grid (0-based)\r\n DayTableMixin.prototype.getCellDayIndex = function (row, col) {\r\n return row * this.daysPerRow + this.getColDayIndex(col);\r\n };\r\n // Returns the numner of day cells, chronologically, from the first cell in *any given row*\r\n DayTableMixin.prototype.getColDayIndex = function (col) {\r\n if (this.isRTL) {\r\n return this.colCnt - 1 - col;\r\n }\r\n else {\r\n return col;\r\n }\r\n };\r\n // Given a date, returns its chronolocial cell-index from the first cell of the grid.\r\n // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\r\n // If before the first offset, returns a negative number.\r\n // If after the last offset, returns an offset past the last cell offset.\r\n // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\r\n DayTableMixin.prototype.getDateDayIndex = function (date) {\r\n var dayIndices = this.dayIndices;\r\n var dayOffset = date.diff(this.dayDates[0], 'days');\r\n if (dayOffset < 0) {\r\n return dayIndices[0] - 1;\r\n }\r\n else if (dayOffset >= dayIndices.length) {\r\n return dayIndices[dayIndices.length - 1] + 1;\r\n }\r\n else {\r\n return dayIndices[dayOffset];\r\n }\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes a default column header formatting string if `colFormat` is not explicitly defined\r\n DayTableMixin.prototype.computeColHeadFormat = function () {\r\n // if more than one week row, or if there are a lot of columns with not much space,\r\n // put just the day numbers will be in each cell\r\n if (this.rowCnt > 1 || this.colCnt > 10) {\r\n return 'ddd'; // \"Sat\"\r\n }\r\n else if (this.colCnt > 1) {\r\n return this.opt('dayOfMonthFormat'); // \"Sat 12/10\"\r\n }\r\n else {\r\n return 'dddd'; // \"Saturday\"\r\n }\r\n };\r\n /* Slicing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Slices up a date range into a segment for every week-row it intersects with\r\n DayTableMixin.prototype.sliceRangeByRow = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, rowFirst);\r\n segLast = Math.min(rangeLast, rowLast);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n // Slices up a date range into a segment for every day-cell it intersects with.\r\n // TODO: make more DRY with sliceRangeByRow somehow.\r\n DayTableMixin.prototype.sliceRangeByDay = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var i;\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n for (i = rowFirst; i <= rowLast; i++) {\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, i);\r\n segLast = Math.min(rangeLast, i);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Header Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderHeadHtml = function () {\r\n var theme = this.view.calendar.theme;\r\n return '' +\r\n '
' +\r\n '' +\r\n '' +\r\n this.renderHeadTrHtml() +\r\n '' +\r\n '
' +\r\n '
';\r\n };\r\n DayTableMixin.prototype.renderHeadIntroHtml = function () {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderHeadTrHtml = function () {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderHeadIntroHtml()) +\r\n this.renderHeadDateCellsHtml() +\r\n (this.isRTL ? this.renderHeadIntroHtml() : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderHeadDateCellsHtml = function () {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(0, col);\r\n htmls.push(this.renderHeadDateCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // TODO: when internalApiVersion, accept an object for HTML attributes\r\n // (colspan should be no different)\r\n DayTableMixin.prototype.renderHeadDateCellHtml = function (date, colspan, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classNames = [\r\n 'fc-day-header',\r\n view.calendar.theme.getClass('widgetHeader')\r\n ];\r\n var innerHtml;\r\n if (typeof t.opt('columnHeaderHtml') === 'function') {\r\n innerHtml = t.opt('columnHeaderHtml')(date);\r\n }\r\n else if (typeof t.opt('columnHeaderText') === 'function') {\r\n innerHtml = util_1.htmlEscape(t.opt('columnHeaderText')(date));\r\n }\r\n else {\r\n innerHtml = util_1.htmlEscape(date.format(t.colHeadFormat));\r\n }\r\n // if only one row of days, the classNames on the header can represent the specific days beneath\r\n if (t.rowCnt === 1) {\r\n classNames = classNames.concat(\r\n // includes the day-of-week class\r\n // noThemeHighlight=true (don't highlight the header)\r\n t.getDayClasses(date, true));\r\n }\r\n else {\r\n classNames.push('fc-' + util_1.dayIDs[date.day()]); // only add the day-of-week class\r\n }\r\n return '' +\r\n ' 1 ?\r\n ' colspan=\"' + colspan + '\"' :\r\n '') +\r\n (otherAttrs ?\r\n ' ' + otherAttrs :\r\n '') +\r\n '>' +\r\n (isDateValid ?\r\n // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)\r\n view.buildGotoAnchorHtml({ date: date, forceOff: t.rowCnt > 1 || t.colCnt === 1 }, innerHtml) :\r\n // if not valid, display text, but no link\r\n innerHtml) +\r\n '';\r\n };\r\n /* Background Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderBgTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderBgIntroHtml(row)) +\r\n this.renderBgCellsHtml(row) +\r\n (this.isRTL ? this.renderBgIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderBgIntroHtml = function (row) {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderBgCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderBgCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n DayTableMixin.prototype.renderBgCellHtml = function (date, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classes = t.getDayClasses(date);\r\n classes.unshift('fc-day', view.calendar.theme.getClass('widgetContent'));\r\n return '';\r\n };\r\n /* Generic\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderIntroHtml = function () {\r\n // Generates the default HTML intro for any row. User classes should override\r\n };\r\n // TODO: a generic method for dealing with , RTL, intro\r\n // when increment internalApiVersion\r\n // wrapTr (scheduler)\r\n /* Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Applies the generic \"intro\" and \"outro\" HTML to the given cells.\r\n // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.\r\n DayTableMixin.prototype.bookendCells = function (trEl) {\r\n var introHtml = this.renderIntroHtml();\r\n if (introHtml) {\r\n if (this.isRTL) {\r\n trEl.append(introHtml);\r\n }\r\n else {\r\n trEl.prepend(introHtml);\r\n }\r\n }\r\n };\r\n return DayTableMixin;\r\n}(Mixin_1.default));\r\nexports.default = DayTableMixin;\r\n\r\n\r\n/***/ }),\r\n/* 56 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar BusinessHourRenderer = /** @class */ (function () {\r\n /*\r\n component implements:\r\n - eventRangesToEventFootprints\r\n - eventFootprintsToSegs\r\n */\r\n function BusinessHourRenderer(component, fillRenderer) {\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n BusinessHourRenderer.prototype.render = function (businessHourGenerator) {\r\n var component = this.component;\r\n var unzonedRange = component._getDateProfile().activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(component.hasAllDayBusinessHours, unzonedRange);\r\n var eventFootprints = eventInstanceGroup ?\r\n component.eventRangesToEventFootprints(eventInstanceGroup.sliceRenderRanges(unzonedRange)) :\r\n [];\r\n this.renderEventFootprints(eventFootprints);\r\n };\r\n BusinessHourRenderer.prototype.renderEventFootprints = function (eventFootprints) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n this.renderSegs(segs);\r\n this.segs = segs;\r\n };\r\n BusinessHourRenderer.prototype.renderSegs = function (segs) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('businessHours', segs, {\r\n getClasses: function (seg) {\r\n return ['fc-nonbusiness', 'fc-bgevent'];\r\n }\r\n });\r\n }\r\n };\r\n BusinessHourRenderer.prototype.unrender = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('businessHours');\r\n }\r\n this.segs = null;\r\n };\r\n BusinessHourRenderer.prototype.getSegs = function () {\r\n return this.segs || [];\r\n };\r\n return BusinessHourRenderer;\r\n}());\r\nexports.default = BusinessHourRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 57 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar FillRenderer = /** @class */ (function () {\r\n function FillRenderer(component) {\r\n this.fillSegTag = 'div';\r\n this.component = component;\r\n this.elsByFill = {};\r\n }\r\n FillRenderer.prototype.renderFootprint = function (type, componentFootprint, props) {\r\n this.renderSegs(type, this.component.componentFootprintToSegs(componentFootprint), props);\r\n };\r\n FillRenderer.prototype.renderSegs = function (type, segs, props) {\r\n var els;\r\n segs = this.buildSegEls(type, segs, props); // assignes `.el` to each seg. returns successfully rendered segs\r\n els = this.attachSegEls(type, segs);\r\n if (els) {\r\n this.reportEls(type, els);\r\n }\r\n return segs;\r\n };\r\n // Unrenders a specific type of fill that is currently rendered on the grid\r\n FillRenderer.prototype.unrender = function (type) {\r\n var el = this.elsByFill[type];\r\n if (el) {\r\n el.remove();\r\n delete this.elsByFill[type];\r\n }\r\n };\r\n // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\r\n // Only returns segments that successfully rendered.\r\n FillRenderer.prototype.buildSegEls = function (type, segs, props) {\r\n var _this = this;\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n html += this.buildSegHtml(type, segs[i], props);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n // allow custom filter methods per-type\r\n if (props.filterEl) {\r\n el = props.filterEl(seg, el);\r\n }\r\n if (el) {\r\n el = $(el); // allow custom filter to return raw DOM node\r\n // correct element type? (would be bad if a non-TD were inserted into a table for example)\r\n if (el.is(_this.fillSegTag)) {\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n // Builds the HTML needed for one fill segment. Generic enough to work with different types.\r\n FillRenderer.prototype.buildSegHtml = function (type, seg, props) {\r\n // custom hooks per-type\r\n var classes = props.getClasses ? props.getClasses(seg) : [];\r\n var css = util_1.cssToStr(props.getCss ? props.getCss(seg) : {});\r\n return '<' + this.fillSegTag +\r\n (classes.length ? ' class=\"' + classes.join(' ') + '\"' : '') +\r\n (css ? ' style=\"' + css + '\"' : '') +\r\n ' />';\r\n };\r\n // Should return wrapping DOM structure\r\n FillRenderer.prototype.attachSegEls = function (type, segs) {\r\n // subclasses must implement\r\n };\r\n FillRenderer.prototype.reportEls = function (type, nodes) {\r\n if (this.elsByFill[type]) {\r\n this.elsByFill[type] = this.elsByFill[type].add(nodes);\r\n }\r\n else {\r\n this.elsByFill[type] = $(nodes);\r\n }\r\n };\r\n return FillRenderer;\r\n}());\r\nexports.default = FillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 58 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar HelperRenderer = /** @class */ (function () {\r\n function HelperRenderer(component, eventRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.eventRenderer = eventRenderer;\r\n }\r\n HelperRenderer.prototype.renderComponentFootprint = function (componentFootprint) {\r\n this.renderEventFootprints([\r\n this.fabricateEventFootprint(componentFootprint)\r\n ]);\r\n };\r\n HelperRenderer.prototype.renderEventDraggingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-dragging', isTouch ? null : this.view.opt('dragOpacity'));\r\n };\r\n HelperRenderer.prototype.renderEventResizingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-resizing');\r\n };\r\n HelperRenderer.prototype.renderEventFootprints = function (eventFootprints, sourceSeg, extraClassNames, opacity) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n var classNames = 'fc-helper ' + (extraClassNames || '');\r\n var i;\r\n // assigns each seg's el and returns a subset of segs that were rendered\r\n segs = this.eventRenderer.renderFgSegEls(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.addClass(classNames);\r\n }\r\n if (opacity != null) {\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.css('opacity', opacity);\r\n }\r\n }\r\n this.helperEls = this.renderSegs(segs, sourceSeg);\r\n };\r\n /*\r\n Must return all mock event elements\r\n */\r\n HelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n // Subclasses must implement\r\n };\r\n HelperRenderer.prototype.unrender = function () {\r\n if (this.helperEls) {\r\n this.helperEls.remove();\r\n this.helperEls = null;\r\n }\r\n };\r\n HelperRenderer.prototype.fabricateEventFootprint = function (componentFootprint) {\r\n var calendar = this.view.calendar;\r\n var eventDateProfile = calendar.footprintToDateProfile(componentFootprint);\r\n var dummyEvent = new SingleEventDef_1.default(new EventSource_1.default(calendar));\r\n var dummyInstance;\r\n dummyEvent.dateProfile = eventDateProfile;\r\n dummyInstance = dummyEvent.buildInstance();\r\n return new EventFootprint_1.default(componentFootprint, dummyEvent, dummyInstance);\r\n };\r\n return HelperRenderer;\r\n}());\r\nexports.default = HelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 59 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventPointing, _super);\r\n function EventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n component must implement:\r\n - publiclyTrigger\r\n */\r\n EventPointing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'click', this.handleClick.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseenter', this.handleMouseover.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseleave', this.handleMouseout.bind(this));\r\n };\r\n EventPointing.prototype.handleClick = function (seg, ev) {\r\n var res = this.component.publiclyTrigger('eventClick', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n if (res === false) {\r\n ev.preventDefault();\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused over\r\n EventPointing.prototype.handleMouseover = function (seg, ev) {\r\n if (!GlobalEmitter_1.default.get().shouldIgnoreMouse() &&\r\n !this.mousedOverSeg) {\r\n this.mousedOverSeg = seg;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.addClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseover', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused out.\r\n // Can be given no arguments, in which case it will mouseout the segment that was previously moused over.\r\n EventPointing.prototype.handleMouseout = function (seg, ev) {\r\n if (this.mousedOverSeg) {\r\n this.mousedOverSeg = null;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.removeClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseout', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev || {},\r\n this.view\r\n ]\r\n });\r\n }\r\n };\r\n EventPointing.prototype.end = function () {\r\n if (this.mousedOverSeg) {\r\n this.handleMouseout(this.mousedOverSeg);\r\n }\r\n };\r\n return EventPointing;\r\n}(Interaction_1.default));\r\nexports.default = EventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 60 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar DateClicking_1 = __webpack_require__(245);\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar EventDragging_1 = __webpack_require__(224);\r\nvar EventResizing_1 = __webpack_require__(223);\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nvar StandardInteractionsMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardInteractionsMixin, _super);\r\n function StandardInteractionsMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardInteractionsMixin;\r\n}(Mixin_1.default));\r\nexports.default = StandardInteractionsMixin;\r\nStandardInteractionsMixin.prototype.dateClickingClass = DateClicking_1.default;\r\nStandardInteractionsMixin.prototype.dateSelectingClass = DateSelecting_1.default;\r\nStandardInteractionsMixin.prototype.eventPointingClass = EventPointing_1.default;\r\nStandardInteractionsMixin.prototype.eventDraggingClass = EventDragging_1.default;\r\nStandardInteractionsMixin.prototype.eventResizingClass = EventResizing_1.default;\r\nStandardInteractionsMixin.prototype.externalDroppingClass = ExternalDropping_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 61 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar Popover_1 = __webpack_require__(249);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar DayGridEventRenderer_1 = __webpack_require__(250);\r\nvar DayGridHelperRenderer_1 = __webpack_require__(251);\r\nvar DayGridFillRenderer_1 = __webpack_require__(252);\r\n/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGrid, _super);\r\n function DayGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.cellWeekNumbersVisible = false; // display week numbers in day cell?\r\n _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid\r\n // isRigid determines whether the individual rows should ignore the contents and be a constant height.\r\n // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.\r\n _this.isRigid = false;\r\n _this.hasAllDayBusinessHours = true;\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n DayGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByRow(componentFootprint.unzonedRange);\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (this.isRTL) {\r\n seg.leftCol = this.daysPerRow - 1 - seg.lastRowDayIndex;\r\n seg.rightCol = this.daysPerRow - 1 - seg.firstRowDayIndex;\r\n }\r\n else {\r\n seg.leftCol = seg.firstRowDayIndex;\r\n seg.rightCol = seg.lastRowDayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderGrid();\r\n };\r\n DayGrid.prototype.unrenderDates = function () {\r\n this.removeSegPopover();\r\n };\r\n // Renders the rows and columns into the component's `this.el`, which should already be assigned.\r\n DayGrid.prototype.renderGrid = function () {\r\n var view = this.view;\r\n var rowCnt = this.rowCnt;\r\n var colCnt = this.colCnt;\r\n var html = '';\r\n var row;\r\n var col;\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n for (row = 0; row < rowCnt; row++) {\r\n html += this.renderDayRowHtml(row, this.isRigid);\r\n }\r\n this.el.html(html);\r\n this.rowEls = this.el.find('.fc-row');\r\n this.cellEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.rowCoordCache = new CoordCache_1.default({\r\n els: this.rowEls,\r\n isVertical: true\r\n });\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.cellEls.slice(0, this.colCnt),\r\n isHorizontal: true\r\n });\r\n // trigger dayRender with each cell's element\r\n for (row = 0; row < rowCnt; row++) {\r\n for (col = 0; col < colCnt; col++) {\r\n this.publiclyTrigger('dayRender', {\r\n context: view,\r\n args: [\r\n this.getCellDate(row, col),\r\n this.getCellEl(row, col),\r\n view\r\n ]\r\n });\r\n }\r\n }\r\n };\r\n // Generates the HTML for a single row, which is a div that wraps a table.\r\n // `row` is the row number.\r\n DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {\r\n var theme = this.view.calendar.theme;\r\n var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];\r\n if (isRigid) {\r\n classes.push('fc-rigid');\r\n }\r\n return '' +\r\n '
' +\r\n '
' +\r\n '' +\r\n this.renderBgTrHtml(row) +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n (this.getIsNumbersVisible() ?\r\n '' +\r\n this.renderNumberTrHtml(row) +\r\n '' :\r\n '') +\r\n '
' +\r\n '
' +\r\n '
';\r\n };\r\n DayGrid.prototype.getIsNumbersVisible = function () {\r\n return this.getIsDayNumbersVisible() || this.cellWeekNumbersVisible;\r\n };\r\n DayGrid.prototype.getIsDayNumbersVisible = function () {\r\n return this.rowCnt > 1;\r\n };\r\n /* Grid Number Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderNumberTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderNumberIntroHtml(row)) +\r\n this.renderNumberCellsHtml(row) +\r\n (this.isRTL ? this.renderNumberIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayGrid.prototype.renderNumberIntroHtml = function (row) {\r\n return this.renderIntroHtml();\r\n };\r\n DayGrid.prototype.renderNumberCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderNumberCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // Generates the HTML for the s of the \"number\" row in the DayGrid's content skeleton.\r\n // The number row will only exist if either day numbers or week numbers are turned on.\r\n DayGrid.prototype.renderNumberCellHtml = function (date) {\r\n var view = this.view;\r\n var html = '';\r\n var isDateValid = this.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;\r\n var classes;\r\n var weekCalcFirstDoW;\r\n if (!isDayNumberVisible && !this.cellWeekNumbersVisible) {\r\n // no numbers in day cell (week number must be along the side)\r\n return ''; // will create an empty space above events :(\r\n }\r\n classes = this.getDayClasses(date);\r\n classes.unshift('fc-day-top');\r\n if (this.cellWeekNumbersVisible) {\r\n // To determine the day of week number change under ISO, we cannot\r\n // rely on moment.js methods such as firstDayOfWeek() or weekday(),\r\n // because they rely on the locale's dow (possibly overridden by\r\n // our firstDay option), which may not be Monday. We cannot change\r\n // dow, because that would affect the calendar start day as well.\r\n if (date._locale._fullCalendar_weekCalc === 'ISO') {\r\n weekCalcFirstDoW = 1; // Monday by ISO 8601 definition\r\n }\r\n else {\r\n weekCalcFirstDoW = date._locale.firstDayOfWeek();\r\n }\r\n }\r\n html += '';\r\n if (this.cellWeekNumbersVisible && (date.day() === weekCalcFirstDoW)) {\r\n html += view.buildGotoAnchorHtml({ date: date, type: 'week' }, { 'class': 'fc-week-number' }, date.format('w') // inner HTML\r\n );\r\n }\r\n if (isDayNumberVisible) {\r\n html += view.buildGotoAnchorHtml(date, { 'class': 'fc-day-number' }, date.format('D') // inner HTML\r\n );\r\n }\r\n html += '';\r\n return html;\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.rowCoordCache.build();\r\n this.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack\r\n };\r\n DayGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n this.rowCoordCache.clear();\r\n };\r\n DayGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n if (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {\r\n var col = this.colCoordCache.getHorizontalIndex(leftOffset);\r\n var row = this.rowCoordCache.getVerticalIndex(topOffset);\r\n if (row != null && col != null) {\r\n return this.getCellHit(row, col);\r\n }\r\n }\r\n };\r\n DayGrid.prototype.getHitFootprint = function (hit) {\r\n var range = this.getCellRange(hit.row, hit.col);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(range.start, range.end), true // all-day?\r\n );\r\n };\r\n DayGrid.prototype.getHitEl = function (hit) {\r\n return this.getCellEl(hit.row, hit.col);\r\n };\r\n /* Cell System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // FYI: the first column is the leftmost column, regardless of date\r\n DayGrid.prototype.getCellHit = function (row, col) {\r\n return {\r\n row: row,\r\n col: col,\r\n component: this,\r\n left: this.colCoordCache.getLeftOffset(col),\r\n right: this.colCoordCache.getRightOffset(col),\r\n top: this.rowCoordCache.getTopOffset(row),\r\n bottom: this.rowCoordCache.getBottomOffset(row)\r\n };\r\n };\r\n DayGrid.prototype.getCellEl = function (row, col) {\r\n return this.cellEls.eq(row * this.colCnt + col);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Unrenders all events currently rendered on the grid\r\n DayGrid.prototype.executeEventUnrender = function () {\r\n this.removeSegPopover(); // removes the \"more..\" events popover\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n // Retrieves all rendered segment objects currently rendered on the grid\r\n DayGrid.prototype.getOwnEventSegs = function () {\r\n // append the segments from the \"more...\" popover\r\n return _super.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs || []);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event or external element being dragged.\r\n // `eventLocation` has zoned start and end (optional)\r\n DayGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n // render drags from OTHER components as helpers\r\n if (eventFootprints.length && seg && seg.component !== this) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n return true; // signal helpers rendered\r\n }\r\n };\r\n // Unrenders any visual indication of a hovering event\r\n DayGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n DayGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders a visual indication of an event being resized\r\n DayGrid.prototype.unrenderEventResize = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* More+ Link Popover\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.removeSegPopover = function () {\r\n if (this.segPopover) {\r\n this.segPopover.hide(); // in handler, will call segPopover's removeElement\r\n }\r\n };\r\n // Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\r\n // `levelLimit` can be false (don't limit), a number, or true (should be computed).\r\n DayGrid.prototype.limitRows = function (levelLimit) {\r\n var rowStructs = this.eventRenderer.rowStructs || [];\r\n var row; // row #\r\n var rowLevelLimit;\r\n for (row = 0; row < rowStructs.length; row++) {\r\n this.unlimitRow(row);\r\n if (!levelLimit) {\r\n rowLevelLimit = false;\r\n }\r\n else if (typeof levelLimit === 'number') {\r\n rowLevelLimit = levelLimit;\r\n }\r\n else {\r\n rowLevelLimit = this.computeRowLevelLimit(row);\r\n }\r\n if (rowLevelLimit !== false) {\r\n this.limitRow(row, rowLevelLimit);\r\n }\r\n }\r\n };\r\n // Computes the number of levels a row will accomodate without going outside its bounds.\r\n // Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\r\n // `row` is the row number.\r\n DayGrid.prototype.computeRowLevelLimit = function (row) {\r\n var rowEl = this.rowEls.eq(row); // the containing \"fake\" row div\r\n var rowHeight = rowEl.height(); // TODO: cache somehow?\r\n var trEls = this.eventRenderer.rowStructs[row].tbodyEl.children();\r\n var i;\r\n var trEl;\r\n var trHeight;\r\n function iterInnerHeights(i, childNode) {\r\n trHeight = Math.max(trHeight, $(childNode).outerHeight());\r\n }\r\n // Reveal one level at a time and stop when we find one out of bounds\r\n for (i = 0; i < trEls.length; i++) {\r\n trEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)\r\n // with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,\r\n // so instead, find the tallest inner content element.\r\n trHeight = 0;\r\n trEl.find('> td > :first-child').each(iterInnerHeights);\r\n if (trEl.position().top + trHeight > rowHeight) {\r\n return i;\r\n }\r\n }\r\n return false; // should not limit at all\r\n };\r\n // Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\r\n // `row` is the row number.\r\n // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\r\n DayGrid.prototype.limitRow = function (row, levelLimit) {\r\n var _this = this;\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n var moreNodes = []; // array of \"more\" links and DOM nodes\r\n var col = 0; // col #, left-to-right (not chronologically)\r\n var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\r\n var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row\r\n var limitedNodes; // array of temporarily hidden level and segment DOM nodes\r\n var i;\r\n var seg;\r\n var segsBelow; // array of segment objects below `seg` in the current `col`\r\n var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\r\n var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\r\n var td;\r\n var rowspan;\r\n var segMoreNodes; // array of \"more\" cells that will stand-in for the current seg's cell\r\n var j;\r\n var moreTd;\r\n var moreWrap;\r\n var moreLink;\r\n // Iterates through empty level cells and places \"more\" links inside if need be\r\n var emptyCellsUntil = function (endCol) {\r\n while (col < endCol) {\r\n segsBelow = _this.getCellSegs(row, col, levelLimit);\r\n if (segsBelow.length) {\r\n td = cellMatrix[levelLimit - 1][col];\r\n moreLink = _this.renderMoreLink(row, col, segsBelow);\r\n moreWrap = $('
').append(moreLink);\r\n td.append(moreWrap);\r\n moreNodes.push(moreWrap[0]);\r\n }\r\n col++;\r\n }\r\n };\r\n if (levelLimit && levelLimit < rowStruct.segLevels.length) {\r\n levelSegs = rowStruct.segLevels[levelLimit - 1];\r\n cellMatrix = rowStruct.cellMatrix;\r\n limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level elements past the limit\r\n .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array\r\n // iterate though segments in the last allowable level\r\n for (i = 0; i < levelSegs.length; i++) {\r\n seg = levelSegs[i];\r\n emptyCellsUntil(seg.leftCol); // process empty cells before the segment\r\n // determine *all* segments below `seg` that occupy the same columns\r\n colSegsBelow = [];\r\n totalSegsBelow = 0;\r\n while (col <= seg.rightCol) {\r\n segsBelow = this.getCellSegs(row, col, levelLimit);\r\n colSegsBelow.push(segsBelow);\r\n totalSegsBelow += segsBelow.length;\r\n col++;\r\n }\r\n if (totalSegsBelow) {\r\n td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell\r\n rowspan = td.attr('rowspan') || 1;\r\n segMoreNodes = [];\r\n // make a replacement for each column the segment occupies. will be one for each colspan\r\n for (j = 0; j < colSegsBelow.length; j++) {\r\n moreTd = $('').attr('rowspan', rowspan);\r\n segsBelow = colSegsBelow[j];\r\n moreLink = this.renderMoreLink(row, seg.leftCol + j, [seg].concat(segsBelow) // count seg as hidden too\r\n );\r\n moreWrap = $('
').append(moreLink);\r\n moreTd.append(moreWrap);\r\n segMoreNodes.push(moreTd[0]);\r\n moreNodes.push(moreTd[0]);\r\n }\r\n td.addClass('fc-limited').after($(segMoreNodes)); // hide original and inject replacements\r\n limitedNodes.push(td[0]);\r\n }\r\n }\r\n emptyCellsUntil(this.colCnt); // finish off the level\r\n rowStruct.moreEls = $(moreNodes); // for easy undoing later\r\n rowStruct.limitedEls = $(limitedNodes); // for easy undoing later\r\n }\r\n };\r\n // Reveals all levels and removes all \"more\"-related elements for a grid's row.\r\n // `row` is a row number.\r\n DayGrid.prototype.unlimitRow = function (row) {\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n if (rowStruct.moreEls) {\r\n rowStruct.moreEls.remove();\r\n rowStruct.moreEls = null;\r\n }\r\n if (rowStruct.limitedEls) {\r\n rowStruct.limitedEls.removeClass('fc-limited');\r\n rowStruct.limitedEls = null;\r\n }\r\n };\r\n // Renders an element that represents hidden event element for a cell.\r\n // Responsible for attaching click handler as well.\r\n DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {\r\n var _this = this;\r\n var view = this.view;\r\n return $('')\r\n .text(this.getMoreLinkText(hiddenSegs.length))\r\n .on('click', function (ev) {\r\n var clickOption = _this.opt('eventLimitClick');\r\n var date = _this.getCellDate(row, col);\r\n var moreEl = $(ev.currentTarget);\r\n var dayEl = _this.getCellEl(row, col);\r\n var allSegs = _this.getCellSegs(row, col);\r\n // rescope the segments to be within the cell's date\r\n var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\r\n var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\r\n if (typeof clickOption === 'function') {\r\n // the returned value can be an atomic option\r\n clickOption = _this.publiclyTrigger('eventLimitClick', {\r\n context: view,\r\n args: [\r\n {\r\n date: date.clone(),\r\n dayEl: dayEl,\r\n moreEl: moreEl,\r\n segs: reslicedAllSegs,\r\n hiddenSegs: reslicedHiddenSegs\r\n },\r\n ev,\r\n view\r\n ]\r\n });\r\n }\r\n if (clickOption === 'popover') {\r\n _this.showSegPopover(row, col, moreEl, reslicedAllSegs);\r\n }\r\n else if (typeof clickOption === 'string') {\r\n view.calendar.zoomTo(date, clickOption);\r\n }\r\n });\r\n };\r\n // Reveals the popover that displays all events within a cell\r\n DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {\r\n var _this = this;\r\n var view = this.view;\r\n var moreWrap = moreLink.parent(); // the
wrapper around the \r\n var topEl; // the element we want to match the top coordinate of\r\n var options;\r\n if (this.rowCnt === 1) {\r\n topEl = view.el; // will cause the popover to cover any sort of header\r\n }\r\n else {\r\n topEl = this.rowEls.eq(row); // will align with top of row\r\n }\r\n options = {\r\n className: 'fc-more-popover ' + view.calendar.theme.getClass('popover'),\r\n content: this.renderSegPopoverContent(row, col, segs),\r\n parentEl: view.el,\r\n top: topEl.offset().top,\r\n autoHide: true,\r\n viewportConstrain: this.opt('popoverViewportConstrain'),\r\n hide: function () {\r\n // kill everything when the popover is hidden\r\n // notify events to be removed\r\n if (_this.popoverSegs) {\r\n _this.triggerBeforeEventSegsDestroyed(_this.popoverSegs);\r\n }\r\n _this.segPopover.removeElement();\r\n _this.segPopover = null;\r\n _this.popoverSegs = null;\r\n }\r\n };\r\n // Determine horizontal coordinate.\r\n // We use the moreWrap instead of the to avoid border confusion.\r\n if (this.isRTL) {\r\n options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border\r\n }\r\n else {\r\n options.left = moreWrap.offset().left - 1; // -1 to be over cell border\r\n }\r\n this.segPopover = new Popover_1.default(options);\r\n this.segPopover.show();\r\n // the popover doesn't live within the grid's container element, and thus won't get the event\r\n // delegated-handlers for free. attach event-related handlers to the popover.\r\n this.bindAllSegHandlersToEl(this.segPopover.el);\r\n this.triggerAfterEventSegsRendered(segs);\r\n };\r\n // Builds the inner DOM contents of the segment popover\r\n DayGrid.prototype.renderSegPopoverContent = function (row, col, segs) {\r\n var view = this.view;\r\n var theme = view.calendar.theme;\r\n var title = this.getCellDate(row, col).format(this.opt('dayPopoverFormat'));\r\n var content = $('
' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(title) +\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
');\r\n var segContainer = content.find('.fc-event-container');\r\n var i;\r\n // render each seg's `el` and only return the visible segs\r\n segs = this.eventRenderer.renderFgSegEls(segs, true); // disableResizing=true\r\n this.popoverSegs = segs;\r\n for (i = 0; i < segs.length; i++) {\r\n // because segments in the popover are not part of a grid coordinate system, provide a hint to any\r\n // grids that want to do drag-n-drop about which cell it came from\r\n this.hitsNeeded();\r\n segs[i].hit = this.getCellHit(row, col);\r\n this.hitsNotNeeded();\r\n segContainer.append(segs[i].el);\r\n }\r\n return content;\r\n };\r\n // Given the events within an array of segment objects, reslice them to be in a single day\r\n DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {\r\n var dayStart = dayDate.clone();\r\n var dayEnd = dayStart.clone().add(1, 'days');\r\n var dayRange = new UnzonedRange_1.default(dayStart, dayEnd);\r\n var newSegs = [];\r\n var i;\r\n var seg;\r\n var slicedRange;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n slicedRange = seg.footprint.componentFootprint.unzonedRange.intersect(dayRange);\r\n if (slicedRange) {\r\n newSegs.push($.extend({}, seg, {\r\n footprint: new EventFootprint_1.default(new ComponentFootprint_1.default(slicedRange, seg.footprint.componentFootprint.isAllDay), seg.footprint.eventDef, seg.footprint.eventInstance),\r\n isStart: seg.isStart && slicedRange.isStart,\r\n isEnd: seg.isEnd && slicedRange.isEnd\r\n }));\r\n }\r\n }\r\n // force an order because eventsToSegs doesn't guarantee one\r\n // TODO: research if still needed\r\n this.eventRenderer.sortEventSegs(newSegs);\r\n return newSegs;\r\n };\r\n // Generates the text that should be inside a \"more\" link, given the number of events it represents\r\n DayGrid.prototype.getMoreLinkText = function (num) {\r\n var opt = this.opt('eventLimitText');\r\n if (typeof opt === 'function') {\r\n return opt(num);\r\n }\r\n else {\r\n return '+' + num + ' ' + opt;\r\n }\r\n };\r\n // Returns segments within a given cell.\r\n // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\r\n DayGrid.prototype.getCellSegs = function (row, col, startLevel) {\r\n var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;\r\n var level = startLevel || 0;\r\n var segs = [];\r\n var seg;\r\n while (level < segMatrix.length) {\r\n seg = segMatrix[level][col];\r\n if (seg) {\r\n segs.push(seg);\r\n }\r\n level++;\r\n }\r\n return segs;\r\n };\r\n return DayGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = DayGrid;\r\nDayGrid.prototype.eventRendererClass = DayGridEventRenderer_1.default;\r\nDayGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nDayGrid.prototype.helperRendererClass = DayGridHelperRenderer_1.default;\r\nDayGrid.prototype.fillRendererClass = DayGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(DayGrid);\r\nDayTableMixin_1.default.mixInto(DayGrid);\r\n\r\n\r\n/***/ }),\r\n/* 62 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar DayGrid_1 = __webpack_require__(61);\r\n/* An abstract class for the \"basic\" views, as well as month view. Renders one or more rows of day cells.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\r\n// It is responsible for managing width/height.\r\nvar BasicView = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicView, _super);\r\n function BasicView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.dayGrid = _this.instantiateDayGrid();\r\n _this.dayGrid.isRigid = _this.hasRigidRows();\r\n if (_this.opt('weekNumbers')) {\r\n if (_this.opt('weekNumbersWithinDays')) {\r\n _this.dayGrid.cellWeekNumbersVisible = true;\r\n _this.dayGrid.colWeekNumbersVisible = false;\r\n }\r\n else {\r\n _this.dayGrid.cellWeekNumbersVisible = false;\r\n _this.dayGrid.colWeekNumbersVisible = true;\r\n }\r\n }\r\n _this.addChild(_this.dayGrid);\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Generates the DayGrid object this view needs. Draws from this.dayGridClass\r\n BasicView.prototype.instantiateDayGrid = function () {\r\n // generate a subclass on the fly with BasicView-specific behavior\r\n // TODO: cache this subclass\r\n var subclass = makeDayGridSubclass(this.dayGridClass);\r\n return new subclass(this);\r\n };\r\n BasicView.prototype.executeDateRender = function (dateProfile) {\r\n this.dayGrid.breakOnWeeks = /year|month|week/.test(dateProfile.currentRangeUnit);\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n };\r\n BasicView.prototype.renderSkeleton = function () {\r\n var dayGridContainerEl;\r\n var dayGridEl;\r\n this.el.addClass('fc-basic-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container');\r\n dayGridEl = $('
').appendTo(dayGridContainerEl);\r\n this.el.find('.fc-body > tr > td').append(dayGridContainerEl);\r\n this.dayGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.dayGrid.setElement(dayGridEl);\r\n };\r\n BasicView.prototype.unrenderSkeleton = function () {\r\n this.dayGrid.removeElement();\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid component will render inside of a container defined by this HTML.\r\n BasicView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the week number column, if it is known\r\n BasicView.prototype.weekNumberStyleAttr = function () {\r\n if (this.weekNumberWidth != null) {\r\n return 'style=\"width:' + this.weekNumberWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n // Determines whether each row should have a constant height\r\n BasicView.prototype.hasRigidRows = function () {\r\n var eventLimit = this.opt('eventLimit');\r\n return eventLimit && typeof eventLimit !== 'number';\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Refreshes the horizontal dimensions of the view\r\n BasicView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit = this.opt('eventLimit');\r\n var headRowEl = this.dayGrid.headContainerEl.find('.fc-row');\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n // hack to give the view some height prior to dayGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS dayGrid.\r\n if (!this.dayGrid.rowEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n if (this.dayGrid.colWeekNumbersVisible) {\r\n // Make sure all week number cells running down the side have the same width.\r\n // Record the width for cells created later.\r\n this.weekNumberWidth = util_1.matchCellWidths(this.el.find('.fc-week-number'));\r\n }\r\n // reset all heights to be natural\r\n this.scroller.clear();\r\n util_1.uncompensateScroll(headRowEl);\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n // is the event limit a constant level number?\r\n if (eventLimit && typeof eventLimit === 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\r\n }\r\n // distribute the height to the rows\r\n // (totalHeight is a \"recommended\" value if isAuto)\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.setGridHeight(scrollerHeight, isAuto);\r\n // is the event limit dynamically calculated?\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\r\n }\r\n if (!isAuto) {\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n util_1.compensateScroll(headRowEl, scrollbarWidths);\r\n // doing the scrollbar compensation might have created text overflow which created more height. redo\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n BasicView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n // Sets the height of just the DayGrid component in this view\r\n BasicView.prototype.setGridHeight = function (height, isAuto) {\r\n if (isAuto) {\r\n util_1.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\r\n }\r\n else {\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\r\n }\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n BasicView.prototype.computeInitialDateScroll = function () {\r\n return { top: 0 };\r\n };\r\n BasicView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n BasicView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n return BasicView;\r\n}(View_1.default));\r\nexports.default = BasicView;\r\nBasicView.prototype.dateProfileGeneratorClass = BasicViewDateProfileGenerator_1.default;\r\nBasicView.prototype.dayGridClass = DayGrid_1.default;\r\n// customize the rendering behavior of BasicView's dayGrid\r\nfunction makeDayGridSubclass(SuperClass) {\r\n return /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.colWeekNumbersVisible = false; // display week numbers along the side?\r\n return _this;\r\n }\r\n // Generates the HTML that will go before the day-of week header cells\r\n SubClass.prototype.renderHeadIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n util_1.htmlEscape(this.opt('weekNumberTitle')) +\r\n '' +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that will go before content-skeleton cells that display the day/week numbers\r\n SubClass.prototype.renderNumberIntroHtml = function (row) {\r\n var view = this.view;\r\n var weekStart = this.getCellDate(row, 0);\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt === 1 }, weekStart.format('w') // inner HTML\r\n ) +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before the day bg cells for each day-row\r\n SubClass.prototype.renderBgIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before every other type of row generated by DayGrid.\r\n // Affects helper-skeleton and highlight-skeleton rows.\r\n SubClass.prototype.renderIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n SubClass.prototype.getIsNumbersVisible = function () {\r\n return DayGrid_1.default.prototype.getIsNumbersVisible.apply(this, arguments) || this.colWeekNumbersVisible;\r\n };\r\n return SubClass;\r\n }(SuperClass));\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 63 */,\r\n/* 64 */,\r\n/* 65 */,\r\n/* 66 */,\r\n/* 67 */,\r\n/* 68 */,\r\n/* 69 */,\r\n/* 70 */,\r\n/* 71 */,\r\n/* 72 */,\r\n/* 73 */,\r\n/* 74 */,\r\n/* 75 */,\r\n/* 76 */,\r\n/* 77 */,\r\n/* 78 */,\r\n/* 79 */,\r\n/* 80 */,\r\n/* 81 */,\r\n/* 82 */,\r\n/* 83 */,\r\n/* 84 */,\r\n/* 85 */,\r\n/* 86 */,\r\n/* 87 */,\r\n/* 88 */,\r\n/* 89 */,\r\n/* 90 */,\r\n/* 91 */,\r\n/* 92 */,\r\n/* 93 */,\r\n/* 94 */,\r\n/* 95 */,\r\n/* 96 */,\r\n/* 97 */,\r\n/* 98 */,\r\n/* 99 */,\r\n/* 100 */,\r\n/* 101 */,\r\n/* 102 */,\r\n/* 103 */,\r\n/* 104 */,\r\n/* 105 */,\r\n/* 106 */,\r\n/* 107 */,\r\n/* 108 */,\r\n/* 109 */,\r\n/* 110 */,\r\n/* 111 */,\r\n/* 112 */,\r\n/* 113 */,\r\n/* 114 */,\r\n/* 115 */,\r\n/* 116 */,\r\n/* 117 */,\r\n/* 118 */,\r\n/* 119 */,\r\n/* 120 */,\r\n/* 121 */,\r\n/* 122 */,\r\n/* 123 */,\r\n/* 124 */,\r\n/* 125 */,\r\n/* 126 */,\r\n/* 127 */,\r\n/* 128 */,\r\n/* 129 */,\r\n/* 130 */,\r\n/* 131 */,\r\n/* 132 */,\r\n/* 133 */,\r\n/* 134 */,\r\n/* 135 */,\r\n/* 136 */,\r\n/* 137 */,\r\n/* 138 */,\r\n/* 139 */,\r\n/* 140 */,\r\n/* 141 */,\r\n/* 142 */,\r\n/* 143 */,\r\n/* 144 */,\r\n/* 145 */,\r\n/* 146 */,\r\n/* 147 */,\r\n/* 148 */,\r\n/* 149 */,\r\n/* 150 */,\r\n/* 151 */,\r\n/* 152 */,\r\n/* 153 */,\r\n/* 154 */,\r\n/* 155 */,\r\n/* 156 */,\r\n/* 157 */,\r\n/* 158 */,\r\n/* 159 */,\r\n/* 160 */,\r\n/* 161 */,\r\n/* 162 */,\r\n/* 163 */,\r\n/* 164 */,\r\n/* 165 */,\r\n/* 166 */,\r\n/* 167 */,\r\n/* 168 */,\r\n/* 169 */,\r\n/* 170 */,\r\n/* 171 */,\r\n/* 172 */,\r\n/* 173 */,\r\n/* 174 */,\r\n/* 175 */,\r\n/* 176 */,\r\n/* 177 */,\r\n/* 178 */,\r\n/* 179 */,\r\n/* 180 */,\r\n/* 181 */,\r\n/* 182 */,\r\n/* 183 */,\r\n/* 184 */,\r\n/* 185 */,\r\n/* 186 */,\r\n/* 187 */,\r\n/* 188 */,\r\n/* 189 */,\r\n/* 190 */,\r\n/* 191 */,\r\n/* 192 */,\r\n/* 193 */,\r\n/* 194 */,\r\n/* 195 */,\r\n/* 196 */,\r\n/* 197 */,\r\n/* 198 */,\r\n/* 199 */,\r\n/* 200 */,\r\n/* 201 */,\r\n/* 202 */,\r\n/* 203 */,\r\n/* 204 */,\r\n/* 205 */,\r\n/* 206 */,\r\n/* 207 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar util_1 = __webpack_require__(35);\r\nvar Constraints = /** @class */ (function () {\r\n function Constraints(eventManager, _calendar) {\r\n this.eventManager = eventManager;\r\n this._calendar = _calendar;\r\n }\r\n Constraints.prototype.opt = function (name) {\r\n return this._calendar.opt(name);\r\n };\r\n /*\r\n determines if eventInstanceGroup is allowed,\r\n in relation to other EVENTS and business hours.\r\n */\r\n Constraints.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var eventDef = eventInstanceGroup.getEventDef();\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n var peerEventInstances = this.getPeerEventInstances(eventDef);\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var constraintVal = eventDef.getConstraint();\r\n var overlapVal = eventDef.getOverlap();\r\n var eventAllowFunc = this.opt('eventAllow');\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!this.isFootprintAllowed(eventFootprints[i].componentFootprint, peerEventFootprints, constraintVal, overlapVal, eventFootprints[i].eventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (eventAllowFunc) {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventAllowFunc(eventFootprints[i].componentFootprint.toLegacy(this._calendar), eventFootprints[i].getEventLegacy()) === false) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n Constraints.prototype.getPeerEventInstances = function (eventDef) {\r\n return this.eventManager.getEventInstancesWithoutId(eventDef.id);\r\n };\r\n Constraints.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n var peerEventInstances = this.eventManager.getEventInstances();\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var selectAllowFunc;\r\n if (this.isFootprintAllowed(componentFootprint, peerEventFootprints, this.opt('selectConstraint'), this.opt('selectOverlap'))) {\r\n selectAllowFunc = this.opt('selectAllow');\r\n if (selectAllowFunc) {\r\n return selectAllowFunc(componentFootprint.toLegacy(this._calendar)) !== false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.isFootprintAllowed = function (componentFootprint, peerEventFootprints, constraintVal, overlapVal, subjectEventInstance // optional\r\n ) {\r\n var constraintFootprints; // ComponentFootprint[]\r\n var overlapEventFootprints; // EventFootprint[]\r\n if (constraintVal != null) {\r\n constraintFootprints = this.constraintValToFootprints(constraintVal, componentFootprint.isAllDay);\r\n if (!this.isFootprintWithinConstraints(componentFootprint, constraintFootprints)) {\r\n return false;\r\n }\r\n }\r\n overlapEventFootprints = this.collectOverlapEventFootprints(peerEventFootprints, componentFootprint);\r\n if (overlapVal === false) {\r\n if (overlapEventFootprints.length) {\r\n return false;\r\n }\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!isOverlapsAllowedByFunc(overlapEventFootprints, overlapVal, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (subjectEventInstance) {\r\n if (!isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n // Constraint\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.isFootprintWithinConstraints = function (componentFootprint, constraintFootprints) {\r\n var i;\r\n for (i = 0; i < constraintFootprints.length; i++) {\r\n if (this.footprintContainsFootprint(constraintFootprints[i], componentFootprint)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.constraintValToFootprints = function (constraintVal, isAllDay) {\r\n var eventInstances;\r\n if (constraintVal === 'businessHours') {\r\n return this.buildCurrentBusinessFootprints(isAllDay);\r\n }\r\n else if (typeof constraintVal === 'object') {\r\n eventInstances = this.parseEventDefToInstances(constraintVal); // handles recurring events\r\n if (!eventInstances) {\r\n return this.parseFootprints(constraintVal);\r\n }\r\n else {\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n }\r\n else if (constraintVal != null) {\r\n eventInstances = this.eventManager.getEventInstancesWithId(constraintVal);\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n };\r\n // returns ComponentFootprint[]\r\n // uses current view's range\r\n Constraints.prototype.buildCurrentBusinessFootprints = function (isAllDay) {\r\n var view = this._calendar.view;\r\n var businessHourGenerator = view.get('businessHourGenerator');\r\n var unzonedRange = view.dateProfile.activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(isAllDay, unzonedRange);\r\n if (eventInstanceGroup) {\r\n return this.eventInstancesToFootprints(eventInstanceGroup.eventInstances);\r\n }\r\n else {\r\n return [];\r\n }\r\n };\r\n // conversion util\r\n Constraints.prototype.eventInstancesToFootprints = function (eventInstances) {\r\n var eventRanges = eventInstances.map(util_1.eventInstanceToEventRange);\r\n var eventFootprints = this.eventRangesToEventFootprints(eventRanges);\r\n return eventFootprints.map(util_1.eventFootprintToComponentFootprint);\r\n };\r\n // Overlap\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.collectOverlapEventFootprints = function (peerEventFootprints, targetFootprint) {\r\n var overlapEventFootprints = [];\r\n var i;\r\n for (i = 0; i < peerEventFootprints.length; i++) {\r\n if (this.footprintsIntersect(targetFootprint, peerEventFootprints[i].componentFootprint)) {\r\n overlapEventFootprints.push(peerEventFootprints[i]);\r\n }\r\n }\r\n return overlapEventFootprints;\r\n };\r\n // Conversion: eventDefs -> eventInstances -> eventRanges -> eventFootprints -> componentFootprints\r\n // ------------------------------------------------------------------------------------------------\r\n // NOTE: this might seem like repetitive code with the Grid class, however, this code is related to\r\n // constraints whereas the Grid code is related to rendering. Each approach might want to convert\r\n // eventRanges -> eventFootprints in a different way. Regardless, there are opportunities to make\r\n // this more DRY.\r\n /*\r\n Returns false on invalid input.\r\n */\r\n Constraints.prototype.parseEventDefToInstances = function (eventInput) {\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, new EventSource_1.default(this._calendar));\r\n if (!eventDef) {\r\n return false;\r\n }\r\n return eventDef.buildInstances(eventManager.currentPeriod.unzonedRange);\r\n };\r\n Constraints.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var i;\r\n var eventFootprints = [];\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// footprints\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n Constraints.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_1.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /*\r\n Parses footprints directly.\r\n Very similar to EventDateProfile::parse :(\r\n */\r\n Constraints.prototype.parseFootprints = function (rawInput) {\r\n var start;\r\n var end;\r\n if (rawInput.start) {\r\n start = this._calendar.moment(rawInput.start);\r\n if (!start.isValid()) {\r\n start = null;\r\n }\r\n }\r\n if (rawInput.end) {\r\n end = this._calendar.moment(rawInput.end);\r\n if (!end.isValid()) {\r\n end = null;\r\n }\r\n }\r\n return [\r\n new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), (start && !start.hasTime()) || (end && !end.hasTime()) // isAllDay\r\n )\r\n ];\r\n };\r\n // Footprint Utils\r\n // ----------------------------------------------------------------------------------------\r\n Constraints.prototype.footprintContainsFootprint = function (outerFootprint, innerFootprint) {\r\n return outerFootprint.unzonedRange.containsRange(innerFootprint.unzonedRange);\r\n };\r\n Constraints.prototype.footprintsIntersect = function (footprint0, footprint1) {\r\n return footprint0.unzonedRange.intersectsWith(footprint1.unzonedRange);\r\n };\r\n return Constraints;\r\n}());\r\nexports.default = Constraints;\r\n// optional subjectEventInstance\r\nfunction isOverlapsAllowedByFunc(overlapEventFootprints, overlapFunc, subjectEventInstance) {\r\n var i;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n if (!overlapFunc(overlapEventFootprints[i].eventInstance.toLegacy(), subjectEventInstance ? subjectEventInstance.toLegacy() : null)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance) {\r\n var subjectLegacyInstance = subjectEventInstance.toLegacy();\r\n var i;\r\n var overlapEventInstance;\r\n var overlapEventDef;\r\n var overlapVal;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n overlapEventInstance = overlapEventFootprints[i].eventInstance;\r\n overlapEventDef = overlapEventInstance.def;\r\n // don't need to pass in calendar, because don't want to consider global eventOverlap property,\r\n // because we already considered that earlier in the process.\r\n overlapVal = overlapEventDef.getOverlap();\r\n if (overlapVal === false) {\r\n return false;\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!overlapVal(overlapEventInstance.toLegacy(), subjectLegacyInstance)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 208 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as ParsableModelMixin, ParsableModelInterface } from './ParsableModelMixin'\r\nin class:\r\n applyProps: ParsableModelInterface['applyProps']\r\n applyManualStandardProps: ParsableModelInterface['applyManualStandardProps']\r\n applyMiscProps: ParsableModelInterface['applyMiscProps']\r\n isStandardProp: ParsableModelInterface['isStandardProp']\r\n static defineStandardProps = ParsableModelMixin.defineStandardProps\r\n static copyVerbatimStandardProps = ParsableModelMixin.copyVerbatimStandardProps\r\nafter class:\r\n ParsableModelMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar ParsableModelMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ParsableModelMixin, _super);\r\n function ParsableModelMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ParsableModelMixin.defineStandardProps = function (propDefs) {\r\n var proto = this.prototype;\r\n if (!proto.hasOwnProperty('standardPropMap')) {\r\n proto.standardPropMap = Object.create(proto.standardPropMap);\r\n }\r\n util_1.copyOwnProps(propDefs, proto.standardPropMap);\r\n };\r\n ParsableModelMixin.copyVerbatimStandardProps = function (src, dest) {\r\n var map = this.prototype.standardPropMap;\r\n var propName;\r\n for (propName in map) {\r\n if (src[propName] != null && // in the src object?\r\n map[propName] === true // false means \"copy verbatim\"\r\n ) {\r\n dest[propName] = src[propName];\r\n }\r\n }\r\n };\r\n /*\r\n Returns true/false for success.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyProps = function (rawProps) {\r\n var standardPropMap = this.standardPropMap;\r\n var manualProps = {};\r\n var miscProps = {};\r\n var propName;\r\n for (propName in rawProps) {\r\n if (standardPropMap[propName] === true) {\r\n this[propName] = rawProps[propName];\r\n }\r\n else if (standardPropMap[propName] === false) {\r\n manualProps[propName] = rawProps[propName];\r\n }\r\n else {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n this.applyMiscProps(miscProps);\r\n return this.applyManualStandardProps(manualProps);\r\n };\r\n /*\r\n If subclasses override, they must call this supermethod and return the boolean response.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyManualStandardProps = function (rawProps) {\r\n return true;\r\n };\r\n /*\r\n Can be called even after initial object creation.\r\n */\r\n ParsableModelMixin.prototype.applyMiscProps = function (rawProps) {\r\n // subclasses can implement\r\n };\r\n /*\r\n TODO: why is this a method when defineStandardProps is static\r\n */\r\n ParsableModelMixin.prototype.isStandardProp = function (propName) {\r\n return propName in this.standardPropMap;\r\n };\r\n return ParsableModelMixin;\r\n}(Mixin_1.default));\r\nexports.default = ParsableModelMixin;\r\nParsableModelMixin.prototype.standardPropMap = {}; // will be cloned by defineStandardProps\r\n\r\n\r\n/***/ }),\r\n/* 209 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventInstance = /** @class */ (function () {\r\n function EventInstance(def, dateProfile) {\r\n this.def = def;\r\n this.dateProfile = dateProfile;\r\n }\r\n EventInstance.prototype.toLegacy = function () {\r\n var dateProfile = this.dateProfile;\r\n var obj = this.def.toLegacy();\r\n obj.start = dateProfile.start.clone();\r\n obj.end = dateProfile.end ? dateProfile.end.clone() : null;\r\n return obj;\r\n };\r\n return EventInstance;\r\n}());\r\nexports.default = EventInstance;\r\n\r\n\r\n/***/ }),\r\n/* 210 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar RecurringEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(RecurringEventDef, _super);\r\n function RecurringEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n RecurringEventDef.prototype.isAllDay = function () {\r\n return !this.startTime && !this.endTime;\r\n };\r\n RecurringEventDef.prototype.buildInstances = function (unzonedRange) {\r\n var calendar = this.source.calendar;\r\n var unzonedDate = unzonedRange.getStart();\r\n var unzonedEnd = unzonedRange.getEnd();\r\n var zonedDayStart;\r\n var instanceStart;\r\n var instanceEnd;\r\n var instances = [];\r\n while (unzonedDate.isBefore(unzonedEnd)) {\r\n // if everyday, or this particular day-of-week\r\n if (!this.dowHash || this.dowHash[unzonedDate.day()]) {\r\n zonedDayStart = calendar.applyTimezone(unzonedDate);\r\n instanceStart = zonedDayStart.clone();\r\n instanceEnd = null;\r\n if (this.startTime) {\r\n instanceStart.time(this.startTime);\r\n }\r\n else {\r\n instanceStart.stripTime();\r\n }\r\n if (this.endTime) {\r\n instanceEnd = zonedDayStart.clone().time(this.endTime);\r\n }\r\n instances.push(new EventInstance_1.default(this, // definition\r\n new EventDateProfile_1.default(instanceStart, instanceEnd, calendar)));\r\n }\r\n unzonedDate.add(1, 'days');\r\n }\r\n return instances;\r\n };\r\n RecurringEventDef.prototype.setDow = function (dowNumbers) {\r\n if (!this.dowHash) {\r\n this.dowHash = {};\r\n }\r\n for (var i = 0; i < dowNumbers.length; i++) {\r\n this.dowHash[dowNumbers[i]] = true;\r\n }\r\n };\r\n RecurringEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n if (def.startTime) {\r\n def.startTime = moment.duration(this.startTime);\r\n }\r\n if (def.endTime) {\r\n def.endTime = moment.duration(this.endTime);\r\n }\r\n if (this.dowHash) {\r\n def.dowHash = $.extend({}, this.dowHash);\r\n }\r\n return def;\r\n };\r\n return RecurringEventDef;\r\n}(EventDef_1.default));\r\nexports.default = RecurringEventDef;\r\n/*\r\nHACK to work with TypeScript mixins\r\nNOTE: if super-method fails, should still attempt to apply\r\n*/\r\nRecurringEventDef.prototype.applyProps = function (rawProps) {\r\n var superSuccess = EventDef_1.default.prototype.applyProps.call(this, rawProps);\r\n if (rawProps.start) {\r\n this.startTime = moment.duration(rawProps.start);\r\n }\r\n if (rawProps.end) {\r\n this.endTime = moment.duration(rawProps.end);\r\n }\r\n if (rawProps.dow) {\r\n this.setDow(rawProps.dow);\r\n }\r\n return superSuccess;\r\n};\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nRecurringEventDef.defineStandardProps({\r\n start: false,\r\n end: false,\r\n dow: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 211 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange = /** @class */ (function () {\r\n function EventRange(unzonedRange, eventDef, eventInstance) {\r\n this.unzonedRange = unzonedRange;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n return EventRange;\r\n}());\r\nexports.default = EventRange;\r\n\r\n\r\n/***/ }),\r\n/* 212 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar BUSINESS_HOUR_EVENT_DEFAULTS = {\r\n start: '09:00',\r\n end: '17:00',\r\n dow: [1, 2, 3, 4, 5],\r\n rendering: 'inverse-background'\r\n // classNames are defined in businessHoursSegClasses\r\n};\r\nvar BusinessHourGenerator = /** @class */ (function () {\r\n function BusinessHourGenerator(rawComplexDef, calendar) {\r\n this.rawComplexDef = rawComplexDef;\r\n this.calendar = calendar;\r\n }\r\n BusinessHourGenerator.prototype.buildEventInstanceGroup = function (isAllDay, unzonedRange) {\r\n var eventDefs = this.buildEventDefs(isAllDay);\r\n var eventInstanceGroup;\r\n if (eventDefs.length) {\r\n eventInstanceGroup = new EventInstanceGroup_1.default(util_1.eventDefsToEventInstances(eventDefs, unzonedRange));\r\n // so that inverse-background rendering can happen even when no eventRanges in view\r\n eventInstanceGroup.explicitEventDef = eventDefs[0];\r\n return eventInstanceGroup;\r\n }\r\n };\r\n BusinessHourGenerator.prototype.buildEventDefs = function (isAllDay) {\r\n var rawComplexDef = this.rawComplexDef;\r\n var rawDefs = [];\r\n var requireDow = false;\r\n var i;\r\n var defs = [];\r\n if (rawComplexDef === true) {\r\n rawDefs = [{}]; // will get BUSINESS_HOUR_EVENT_DEFAULTS verbatim\r\n }\r\n else if ($.isPlainObject(rawComplexDef)) {\r\n rawDefs = [rawComplexDef];\r\n }\r\n else if ($.isArray(rawComplexDef)) {\r\n rawDefs = rawComplexDef;\r\n requireDow = true; // every sub-definition NEEDS a day-of-week\r\n }\r\n for (i = 0; i < rawDefs.length; i++) {\r\n if (!requireDow || rawDefs[i].dow) {\r\n defs.push(this.buildEventDef(isAllDay, rawDefs[i]));\r\n }\r\n }\r\n return defs;\r\n };\r\n BusinessHourGenerator.prototype.buildEventDef = function (isAllDay, rawDef) {\r\n var fullRawDef = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, rawDef);\r\n if (isAllDay) {\r\n fullRawDef.start = null;\r\n fullRawDef.end = null;\r\n }\r\n return RecurringEventDef_1.default.parse(fullRawDef, new EventSource_1.default(this.calendar) // dummy source\r\n );\r\n };\r\n return BusinessHourGenerator;\r\n}());\r\nexports.default = BusinessHourGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 213 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar StandardTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardTheme, _super);\r\n function StandardTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardTheme;\r\n}(Theme_1.default));\r\nexports.default = StandardTheme;\r\nStandardTheme.prototype.classes = {\r\n widget: 'fc-unthemed',\r\n widgetHeader: 'fc-widget-header',\r\n widgetContent: 'fc-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'fc-button',\r\n cornerLeft: 'fc-corner-left',\r\n cornerRight: 'fc-corner-right',\r\n stateDefault: 'fc-state-default',\r\n stateActive: 'fc-state-active',\r\n stateDisabled: 'fc-state-disabled',\r\n stateHover: 'fc-state-hover',\r\n stateDown: 'fc-state-down',\r\n popoverHeader: 'fc-widget-header',\r\n popoverContent: 'fc-widget-content',\r\n // day grid\r\n headerRow: 'fc-widget-header',\r\n dayRow: 'fc-widget-content',\r\n // list view\r\n listView: 'fc-widget-content'\r\n};\r\nStandardTheme.prototype.baseIconClass = 'fc-icon';\r\nStandardTheme.prototype.iconClasses = {\r\n close: 'fc-icon-x',\r\n prev: 'fc-icon-left-single-arrow',\r\n next: 'fc-icon-right-single-arrow',\r\n prevYear: 'fc-icon-left-double-arrow',\r\n nextYear: 'fc-icon-right-double-arrow'\r\n};\r\nStandardTheme.prototype.iconOverrideOption = 'buttonIcons';\r\nStandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';\r\nStandardTheme.prototype.iconOverridePrefix = 'fc-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 214 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar JqueryUiTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(JqueryUiTheme, _super);\r\n function JqueryUiTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return JqueryUiTheme;\r\n}(Theme_1.default));\r\nexports.default = JqueryUiTheme;\r\nJqueryUiTheme.prototype.classes = {\r\n widget: 'ui-widget',\r\n widgetHeader: 'ui-widget-header',\r\n widgetContent: 'ui-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'ui-button',\r\n cornerLeft: 'ui-corner-left',\r\n cornerRight: 'ui-corner-right',\r\n stateDefault: 'ui-state-default',\r\n stateActive: 'ui-state-active',\r\n stateDisabled: 'ui-state-disabled',\r\n stateHover: 'ui-state-hover',\r\n stateDown: 'ui-state-down',\r\n today: 'ui-state-highlight',\r\n popoverHeader: 'ui-widget-header',\r\n popoverContent: 'ui-widget-content',\r\n // day grid\r\n headerRow: 'ui-widget-header',\r\n dayRow: 'ui-widget-content',\r\n // list view\r\n listView: 'ui-widget-content'\r\n};\r\nJqueryUiTheme.prototype.baseIconClass = 'ui-icon';\r\nJqueryUiTheme.prototype.iconClasses = {\r\n close: 'ui-icon-closethick',\r\n prev: 'ui-icon-circle-triangle-w',\r\n next: 'ui-icon-circle-triangle-e',\r\n prevYear: 'ui-icon-seek-prev',\r\n nextYear: 'ui-icon-seek-next'\r\n};\r\nJqueryUiTheme.prototype.iconOverrideOption = 'themeButtonIcons';\r\nJqueryUiTheme.prototype.iconOverrideCustomButtonOption = 'themeIcon';\r\nJqueryUiTheme.prototype.iconOverridePrefix = 'ui-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 215 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar FuncEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(FuncEventSource, _super);\r\n function FuncEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n FuncEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isFunction(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isFunction(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n FuncEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.func.call(_this.calendar, start.clone(), end.clone(), timezone, function (rawEventDefs) {\r\n _this.calendar.popLoading();\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n });\r\n });\r\n };\r\n FuncEventSource.prototype.getPrimitive = function () {\r\n return this.func;\r\n };\r\n FuncEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.func = rawProps.events;\r\n return superSuccess;\r\n };\r\n return FuncEventSource;\r\n}(EventSource_1.default));\r\nexports.default = FuncEventSource;\r\nFuncEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 216 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar JsonFeedEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(JsonFeedEventSource, _super);\r\n function JsonFeedEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n JsonFeedEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if (typeof rawInput.url === 'string') {\r\n rawProps = rawInput;\r\n }\r\n else if (typeof rawInput === 'string') {\r\n rawProps = { url: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n JsonFeedEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n var ajaxSettings = this.ajaxSettings;\r\n var onSuccess = ajaxSettings.success;\r\n var onError = ajaxSettings.error;\r\n var requestParams = this.buildRequestParams(start, end, timezone);\r\n // todo: eventually handle the promise's then,\r\n // don't intercept success/error\r\n // tho will be a breaking API change\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve, onReject) {\r\n $.ajax($.extend({}, // destination\r\n JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {\r\n url: _this.url,\r\n data: requestParams,\r\n success: function (rawEventDefs, status, xhr) {\r\n var callbackRes;\r\n _this.calendar.popLoading();\r\n if (rawEventDefs) {\r\n callbackRes = util_1.applyAll(onSuccess, _this, [rawEventDefs, status, xhr]); // redirect `this`\r\n if ($.isArray(callbackRes)) {\r\n rawEventDefs = callbackRes;\r\n }\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n }\r\n else {\r\n onReject();\r\n }\r\n },\r\n error: function (xhr, statusText, errorThrown) {\r\n _this.calendar.popLoading();\r\n util_1.applyAll(onError, _this, [xhr, statusText, errorThrown]); // redirect `this`\r\n onReject();\r\n }\r\n }));\r\n });\r\n };\r\n JsonFeedEventSource.prototype.buildRequestParams = function (start, end, timezone) {\r\n var calendar = this.calendar;\r\n var ajaxSettings = this.ajaxSettings;\r\n var startParam;\r\n var endParam;\r\n var timezoneParam;\r\n var customRequestParams;\r\n var params = {};\r\n startParam = this.startParam;\r\n if (startParam == null) {\r\n startParam = calendar.opt('startParam');\r\n }\r\n endParam = this.endParam;\r\n if (endParam == null) {\r\n endParam = calendar.opt('endParam');\r\n }\r\n timezoneParam = this.timezoneParam;\r\n if (timezoneParam == null) {\r\n timezoneParam = calendar.opt('timezoneParam');\r\n }\r\n // retrieve any outbound GET/POST $.ajax data from the options\r\n if ($.isFunction(ajaxSettings.data)) {\r\n // supplied as a function that returns a key/value object\r\n customRequestParams = ajaxSettings.data();\r\n }\r\n else {\r\n // probably supplied as a straight key/value object\r\n customRequestParams = ajaxSettings.data || {};\r\n }\r\n $.extend(params, customRequestParams);\r\n/////////////// convert to UTC\r\n// params[startParam] = start.format();\r\n// params[endParam] = end.format();\r\n params[startParam] = start.toISOString();\r\n params[endParam] = end.toISOString();\r\n if (timezone && timezone !== 'local') {\r\n params[timezoneParam] = timezone;\r\n }\r\n return params;\r\n };\r\n JsonFeedEventSource.prototype.getPrimitive = function () {\r\n return this.url;\r\n };\r\n JsonFeedEventSource.prototype.applyMiscProps = function (rawProps) {\r\n this.ajaxSettings = rawProps;\r\n };\r\n JsonFeedEventSource.AJAX_DEFAULTS = {\r\n dataType: 'json',\r\n cache: false\r\n };\r\n return JsonFeedEventSource;\r\n}(EventSource_1.default));\r\nexports.default = JsonFeedEventSource;\r\nJsonFeedEventSource.defineStandardProps({\r\n // automatically transfer (true)...\r\n url: true,\r\n startParam: true,\r\n endParam: true,\r\n timezoneParam: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 217 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar TaskQueue = /** @class */ (function () {\r\n function TaskQueue() {\r\n this.q = [];\r\n this.isPaused = false;\r\n this.isRunning = false;\r\n }\r\n TaskQueue.prototype.queue = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this.q.push.apply(this.q, args); // append\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.pause = function () {\r\n this.isPaused = true;\r\n };\r\n TaskQueue.prototype.resume = function () {\r\n this.isPaused = false;\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.getIsIdle = function () {\r\n return !this.isRunning && !this.isPaused;\r\n };\r\n TaskQueue.prototype.tryStart = function () {\r\n if (!this.isRunning && this.canRunNext()) {\r\n this.isRunning = true;\r\n this.trigger('start');\r\n this.runRemaining();\r\n }\r\n };\r\n TaskQueue.prototype.canRunNext = function () {\r\n return !this.isPaused && this.q.length;\r\n };\r\n TaskQueue.prototype.runRemaining = function () {\r\n var _this = this;\r\n var task;\r\n var res;\r\n do {\r\n task = this.q.shift(); // always freshly reference q. might have been reassigned.\r\n res = this.runTask(task);\r\n if (res && res.then) {\r\n res.then(function () {\r\n if (_this.canRunNext()) {\r\n _this.runRemaining();\r\n }\r\n });\r\n return; // prevent marking as stopped\r\n }\r\n } while (this.canRunNext());\r\n this.trigger('stop'); // not really a 'stop' ... more of a 'drained'\r\n this.isRunning = false;\r\n // if 'stop' handler added more tasks.... TODO: write test for this\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.runTask = function (task) {\r\n return task(); // task *is* the function, but subclasses can change the format of a task\r\n };\r\n return TaskQueue;\r\n}());\r\nexports.default = TaskQueue;\r\nEmitterMixin_1.default.mixInto(TaskQueue);\r\n\r\n\r\n/***/ }),\r\n/* 218 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nvar RenderQueue = /** @class */ (function (_super) {\r\n tslib_1.__extends(RenderQueue, _super);\r\n function RenderQueue(waitsByNamespace) {\r\n var _this = _super.call(this) || this;\r\n _this.waitsByNamespace = waitsByNamespace || {};\r\n return _this;\r\n }\r\n RenderQueue.prototype.queue = function (taskFunc, namespace, type) {\r\n var task = {\r\n func: taskFunc,\r\n namespace: namespace,\r\n type: type\r\n };\r\n var waitMs;\r\n if (namespace) {\r\n waitMs = this.waitsByNamespace[namespace];\r\n }\r\n if (this.waitNamespace) {\r\n if (namespace === this.waitNamespace && waitMs != null) {\r\n this.delayWait(waitMs);\r\n }\r\n else {\r\n this.clearWait();\r\n this.tryStart();\r\n }\r\n }\r\n if (this.compoundTask(task)) {\r\n if (!this.waitNamespace && waitMs != null) {\r\n this.startWait(namespace, waitMs);\r\n }\r\n else {\r\n this.tryStart();\r\n }\r\n }\r\n };\r\n RenderQueue.prototype.startWait = function (namespace, waitMs) {\r\n this.waitNamespace = namespace;\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.delayWait = function (waitMs) {\r\n clearTimeout(this.waitId);\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.spawnWait = function (waitMs) {\r\n var _this = this;\r\n this.waitId = setTimeout(function () {\r\n _this.waitNamespace = null;\r\n _this.tryStart();\r\n }, waitMs);\r\n };\r\n RenderQueue.prototype.clearWait = function () {\r\n if (this.waitNamespace) {\r\n clearTimeout(this.waitId);\r\n this.waitId = null;\r\n this.waitNamespace = null;\r\n }\r\n };\r\n RenderQueue.prototype.canRunNext = function () {\r\n if (!_super.prototype.canRunNext.call(this)) {\r\n return false;\r\n }\r\n // waiting for a certain namespace to stop receiving tasks?\r\n if (this.waitNamespace) {\r\n var q = this.q;\r\n // if there was a different namespace task in the meantime,\r\n // that forces all previously-waiting tasks to suddenly execute.\r\n // TODO: find a way to do this in constant time.\r\n for (var i = 0; i < q.length; i++) {\r\n if (q[i].namespace !== this.waitNamespace) {\r\n return true; // allow execution\r\n }\r\n }\r\n return false;\r\n }\r\n return true;\r\n };\r\n RenderQueue.prototype.runTask = function (task) {\r\n task.func();\r\n };\r\n RenderQueue.prototype.compoundTask = function (newTask) {\r\n var q = this.q;\r\n var shouldAppend = true;\r\n var i;\r\n var task;\r\n if (newTask.namespace && newTask.type === 'destroy') {\r\n // remove all init/add/remove ops with same namespace, regardless of order\r\n for (i = q.length - 1; i >= 0; i--) {\r\n task = q[i];\r\n switch (task.type) {\r\n case 'init':\r\n shouldAppend = false;\r\n // the latest destroy is cancelled out by not doing the init\r\n /* falls through */\r\n case 'add':\r\n /* falls through */\r\n case 'remove':\r\n q.splice(i, 1); // remove task\r\n }\r\n }\r\n }\r\n if (shouldAppend) {\r\n q.push(newTask);\r\n }\r\n return shouldAppend;\r\n };\r\n return RenderQueue;\r\n}(TaskQueue_1.default));\r\nexports.default = RenderQueue;\r\n\r\n\r\n/***/ }),\r\n/* 219 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar date_formatting_1 = __webpack_require__(47);\r\nvar Component_1 = __webpack_require__(237);\r\nvar util_2 = __webpack_require__(35);\r\nvar DateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateComponent, _super);\r\n function DateComponent(_view, _options) {\r\n var _this = _super.call(this) || this;\r\n _this.isRTL = false; // frequently accessed options\r\n _this.hitsNeededDepth = 0; // necessary because multiple callers might need the same hits\r\n _this.hasAllDayBusinessHours = false; // TODO: unify with largeUnit and isTimeScale?\r\n _this.isDatesRendered = false;\r\n // hack to set options prior to the this.opt calls\r\n if (_view) {\r\n _this['view'] = _view;\r\n }\r\n if (_options) {\r\n _this['options'] = _options;\r\n }\r\n _this.uid = String(DateComponent.guid++);\r\n _this.childrenByUid = {};\r\n _this.nextDayThreshold = moment.duration(_this.opt('nextDayThreshold'));\r\n _this.isRTL = _this.opt('isRTL');\r\n if (_this.fillRendererClass) {\r\n _this.fillRenderer = new _this.fillRendererClass(_this);\r\n }\r\n if (_this.eventRendererClass) {\r\n _this.eventRenderer = new _this.eventRendererClass(_this, _this.fillRenderer);\r\n }\r\n if (_this.helperRendererClass && _this.eventRenderer) {\r\n _this.helperRenderer = new _this.helperRendererClass(_this, _this.eventRenderer);\r\n }\r\n if (_this.businessHourRendererClass && _this.fillRenderer) {\r\n _this.businessHourRenderer = new _this.businessHourRendererClass(_this, _this.fillRenderer);\r\n }\r\n return _this;\r\n }\r\n DateComponent.prototype.addChild = function (child) {\r\n if (!this.childrenByUid[child.uid]) {\r\n this.childrenByUid[child.uid] = child;\r\n return true;\r\n }\r\n return false;\r\n };\r\n DateComponent.prototype.removeChild = function (child) {\r\n if (this.childrenByUid[child.uid]) {\r\n delete this.childrenByUid[child.uid];\r\n return true;\r\n }\r\n return false;\r\n };\r\n // TODO: only do if isInDom?\r\n // TODO: make part of Component, along with children/batch-render system?\r\n DateComponent.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n this.callChildren('updateSize', arguments);\r\n };\r\n // Options\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.opt = function (name) {\r\n return this._getView().opt(name); // default implementation\r\n };\r\n DateComponent.prototype.publiclyTrigger = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.publiclyTrigger.apply(calendar, args);\r\n };\r\n DateComponent.prototype.hasPublicHandlers = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.hasPublicHandlers.apply(calendar, args);\r\n };\r\n // Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeDateRender = function (dateProfile) {\r\n this.dateProfile = dateProfile; // for rendering\r\n this.renderDates(dateProfile);\r\n this.isDatesRendered = true;\r\n this.callChildren('executeDateRender', arguments);\r\n };\r\n DateComponent.prototype.executeDateUnrender = function () {\r\n this.callChildren('executeDateUnrender', arguments);\r\n this.dateProfile = null;\r\n this.unrenderDates();\r\n this.isDatesRendered = false;\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.renderDates = function (dateProfile) {\r\n // subclasses should implement\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.unrenderDates = function () {\r\n // subclasses should override\r\n };\r\n // Now-Indicator\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator\r\n // should be refreshed. If something falsy is returned, no time indicator is rendered at all.\r\n DateComponent.prototype.getNowIndicatorUnit = function () {\r\n // subclasses should implement\r\n };\r\n // Renders a current time indicator at the given datetime\r\n DateComponent.prototype.renderNowIndicator = function (date) {\r\n this.callChildren('renderNowIndicator', arguments);\r\n };\r\n // Undoes the rendering actions from renderNowIndicator\r\n DateComponent.prototype.unrenderNowIndicator = function () {\r\n this.callChildren('unrenderNowIndicator', arguments);\r\n };\r\n // Business Hours\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.renderBusinessHours = function (businessHourGenerator) {\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.render(businessHourGenerator);\r\n }\r\n this.callChildren('renderBusinessHours', arguments);\r\n };\r\n // Unrenders previously-rendered business-hours\r\n DateComponent.prototype.unrenderBusinessHours = function () {\r\n this.callChildren('unrenderBusinessHours', arguments);\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.unrender();\r\n }\r\n };\r\n // Event Displaying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeEventRender = function (eventsPayload) {\r\n if (this.eventRenderer) {\r\n this.eventRenderer.rangeUpdated(); // poorly named now\r\n this.eventRenderer.render(eventsPayload);\r\n }\r\n else if (this['renderEvents']) {\r\n this['renderEvents'](convertEventsPayloadToLegacyArray(eventsPayload));\r\n }\r\n this.callChildren('executeEventRender', arguments);\r\n };\r\n DateComponent.prototype.executeEventUnrender = function () {\r\n this.callChildren('executeEventUnrender', arguments);\r\n if (this.eventRenderer) {\r\n this.eventRenderer.unrender();\r\n }\r\n else if (this['destroyEvents']) {\r\n this['destroyEvents']();\r\n }\r\n };\r\n DateComponent.prototype.getBusinessHourSegs = function () {\r\n var segs = this.getOwnBusinessHourSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getBusinessHourSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnBusinessHourSegs = function () {\r\n if (this.businessHourRenderer) {\r\n return this.businessHourRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n DateComponent.prototype.getEventSegs = function () {\r\n var segs = this.getOwnEventSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getEventSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnEventSegs = function () {\r\n if (this.eventRenderer) {\r\n return this.eventRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n // Event Rendering Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.triggerAfterEventsRendered = function () {\r\n this.triggerAfterEventSegsRendered(this.getEventSegs());\r\n this.publiclyTrigger('eventAfterAllRender', {\r\n context: this,\r\n args: [this]\r\n });\r\n };\r\n DateComponent.prototype.triggerAfterEventSegsRendered = function (segs) {\r\n var _this = this;\r\n // an optimization, because getEventLegacy is expensive\r\n if (this.hasPublicHandlers('eventAfterRender')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventAfterRender', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n DateComponent.prototype.triggerBeforeEventsDestroyed = function () {\r\n this.triggerBeforeEventSegsDestroyed(this.getEventSegs());\r\n };\r\n DateComponent.prototype.triggerBeforeEventSegsDestroyed = function (segs) {\r\n var _this = this;\r\n if (this.hasPublicHandlers('eventDestroy')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventDestroy', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n // Event Rendering Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Hides all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.showEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', '');\r\n }\r\n });\r\n this.callChildren('showEventsWithId', arguments);\r\n };\r\n // Shows all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.hideEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', 'hidden');\r\n }\r\n });\r\n this.callChildren('hideEventsWithId', arguments);\r\n };\r\n // Drag-n-Drop Rendering (for both events and external elements)\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of a event or external-element drag over the given drop zone.\r\n // If an external-element, seg will be `null`.\r\n // Must return elements used for any mock events.\r\n DateComponent.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var renderedHelper = false;\r\n this.iterChildren(function (child) {\r\n if (child.renderDrag(eventFootprints, seg, isTouch)) {\r\n renderedHelper = true;\r\n }\r\n });\r\n return renderedHelper;\r\n };\r\n // Unrenders a visual indication of an event or external-element being dragged.\r\n DateComponent.prototype.unrenderDrag = function () {\r\n this.callChildren('unrenderDrag', arguments);\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of an event being resized.\r\n DateComponent.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.callChildren('renderEventResize', arguments);\r\n };\r\n // Unrenders a visual indication of an event being resized.\r\n DateComponent.prototype.unrenderEventResize = function () {\r\n this.callChildren('unrenderEventResize', arguments);\r\n };\r\n // Selection\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of the selection\r\n // TODO: rename to `renderSelection` after legacy is gone\r\n DateComponent.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n this.renderHighlight(componentFootprint);\r\n this.callChildren('renderSelectionFootprint', arguments);\r\n };\r\n // Unrenders a visual indication of selection\r\n DateComponent.prototype.unrenderSelection = function () {\r\n this.unrenderHighlight();\r\n this.callChildren('unrenderSelection', arguments);\r\n };\r\n // Highlight\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data)\r\n DateComponent.prototype.renderHighlight = function (componentFootprint) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderFootprint('highlight', componentFootprint, {\r\n getClasses: function () {\r\n return ['fc-highlight'];\r\n }\r\n });\r\n }\r\n this.callChildren('renderHighlight', arguments);\r\n };\r\n // Unrenders the emphasis on a date range\r\n DateComponent.prototype.unrenderHighlight = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('highlight');\r\n }\r\n this.callChildren('unrenderHighlight', arguments);\r\n };\r\n // Hit Areas\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // just because all DateComponents support this interface\r\n // doesn't mean they need to have their own internal coord system. they can defer to sub-components.\r\n DateComponent.prototype.hitsNeeded = function () {\r\n if (!(this.hitsNeededDepth++)) {\r\n this.prepareHits();\r\n }\r\n this.callChildren('hitsNeeded', arguments);\r\n };\r\n DateComponent.prototype.hitsNotNeeded = function () {\r\n if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {\r\n this.releaseHits();\r\n }\r\n this.callChildren('hitsNotNeeded', arguments);\r\n };\r\n DateComponent.prototype.prepareHits = function () {\r\n // subclasses can implement\r\n };\r\n DateComponent.prototype.releaseHits = function () {\r\n // subclasses can implement\r\n };\r\n // Given coordinates from the topleft of the document, return data about the date-related area underneath.\r\n // Can return an object with arbitrary properties (although top/right/left/bottom are encouraged).\r\n // Must have a `grid` property, a reference to this current grid. TODO: avoid this\r\n // The returned object will be processed by getHitFootprint and getHitEl.\r\n DateComponent.prototype.queryHit = function (leftOffset, topOffset) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n var hit;\r\n for (uid in childrenByUid) {\r\n hit = childrenByUid[uid].queryHit(leftOffset, topOffset);\r\n if (hit) {\r\n break;\r\n }\r\n }\r\n return hit;\r\n };\r\n DateComponent.prototype.getSafeHitFootprint = function (hit) {\r\n var footprint = this.getHitFootprint(hit);\r\n if (!this.dateProfile.activeUnzonedRange.containsRange(footprint.unzonedRange)) {\r\n return null;\r\n }\r\n return footprint;\r\n };\r\n DateComponent.prototype.getHitFootprint = function (hit) {\r\n // what about being abstract!?\r\n };\r\n // Given position-level information about a date-related area within the grid,\r\n // should return a jQuery element that best represents it. passed to dayClick callback.\r\n DateComponent.prototype.getHitEl = function (hit) {\r\n // what about being abstract!?\r\n };\r\n /* Converting eventRange -> eventFootprint\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var eventFootprints = [];\r\n var i;\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// append\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n DateComponent.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_2.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /* Converting componentFootprint/eventFootprint -> segs\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventFootprintsToSegs = function (eventFootprints) {\r\n var segs = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n segs.push.apply(segs, this.eventFootprintToSegs(eventFootprints[i]));\r\n }\r\n return segs;\r\n };\r\n // Given an event's span (unzoned start/end and other misc data), and the event itself,\r\n // slices into segments and attaches event-derived properties to them.\r\n // eventSpan - { start, end, isStart, isEnd, otherthings... }\r\n DateComponent.prototype.eventFootprintToSegs = function (eventFootprint) {\r\n var unzonedRange = eventFootprint.componentFootprint.unzonedRange;\r\n var segs;\r\n var i;\r\n var seg;\r\n segs = this.componentFootprintToSegs(eventFootprint.componentFootprint);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (!unzonedRange.isStart) {\r\n seg.isStart = false;\r\n }\r\n if (!unzonedRange.isEnd) {\r\n seg.isEnd = false;\r\n }\r\n seg.footprint = eventFootprint;\r\n // TODO: rename to seg.eventFootprint\r\n }\r\n return segs;\r\n };\r\n DateComponent.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n return [];\r\n };\r\n // Utils\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.callChildren = function (methodName, args) {\r\n this.iterChildren(function (child) {\r\n child[methodName].apply(child, args);\r\n });\r\n };\r\n DateComponent.prototype.iterChildren = function (func) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n for (uid in childrenByUid) {\r\n func(childrenByUid[uid]);\r\n }\r\n };\r\n DateComponent.prototype._getCalendar = function () {\r\n var t = this;\r\n return t.calendar || t.view.calendar;\r\n };\r\n DateComponent.prototype._getView = function () {\r\n return this.view;\r\n };\r\n DateComponent.prototype._getDateProfile = function () {\r\n return this._getView().get('dateProfile');\r\n };\r\n // Generates HTML for an anchor to another view into the calendar.\r\n // Will either generate an
tag or a non-clickable tag, depending on enabled settings.\r\n // `gotoOptions` can either be a moment input, or an object with the form:\r\n // { date, type, forceOff }\r\n // `type` is a view-type like \"day\" or \"week\". default value is \"day\".\r\n // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.\r\n DateComponent.prototype.buildGotoAnchorHtml = function (gotoOptions, attrs, innerHtml) {\r\n var date;\r\n var type;\r\n var forceOff;\r\n var finalOptions;\r\n if ($.isPlainObject(gotoOptions)) {\r\n date = gotoOptions.date;\r\n type = gotoOptions.type;\r\n forceOff = gotoOptions.forceOff;\r\n }\r\n else {\r\n date = gotoOptions; // a single moment input\r\n }\r\n date = moment_ext_1.default(date); // if a string, parse it\r\n finalOptions = {\r\n date: date.format('YYYY-MM-DD'),\r\n type: type || 'day'\r\n };\r\n if (typeof attrs === 'string') {\r\n innerHtml = attrs;\r\n attrs = null;\r\n }\r\n attrs = attrs ? ' ' + util_1.attrsToStr(attrs) : ''; // will have a leading space\r\n innerHtml = innerHtml || '';\r\n if (!forceOff && this.opt('navLinks')) {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n else {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n };\r\n DateComponent.prototype.getAllDayHtml = function () {\r\n return this.opt('allDayHtml') || util_1.htmlEscape(this.opt('allDayText'));\r\n };\r\n // Computes HTML classNames for a single-day element\r\n DateComponent.prototype.getDayClasses = function (date, noThemeHighlight) {\r\n var view = this._getView();\r\n var classes = [];\r\n var today;\r\n if (!this.dateProfile.activeUnzonedRange.containsDate(date)) {\r\n classes.push('fc-disabled-day'); // TODO: jQuery UI theme?\r\n }\r\n else {\r\n classes.push('fc-' + util_1.dayIDs[date.day()]);\r\n if (view.isDateInOtherMonth(date, this.dateProfile)) {\r\n classes.push('fc-other-month');\r\n }\r\n today = view.calendar.getNow();\r\n if (date.isSame(today, 'day')) {\r\n classes.push('fc-today');\r\n if (noThemeHighlight !== true) {\r\n classes.push(view.calendar.theme.getClass('today'));\r\n }\r\n }\r\n else if (date < today) {\r\n classes.push('fc-past');\r\n }\r\n else {\r\n classes.push('fc-future');\r\n }\r\n }\r\n return classes;\r\n };\r\n // Utility for formatting a range. Accepts a range object, formatting string, and optional separator.\r\n // Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.\r\n // The timezones of the dates within `range` will be respected.\r\n DateComponent.prototype.formatRange = function (range, isAllDay, formatStr, separator) {\r\n var end = range.end;\r\n if (isAllDay) {\r\n end = end.clone().subtract(1); // convert to inclusive. last ms of previous day\r\n }\r\n return date_formatting_1.formatRange(range.start, end, formatStr, separator, this.isRTL);\r\n };\r\n // Compute the number of the give units in the \"current\" range.\r\n // Will return a floating-point number. Won't round.\r\n DateComponent.prototype.currentRangeAs = function (unit) {\r\n return this._getDateProfile().currentUnzonedRange.as(unit);\r\n };\r\n // Returns the date range of the full days the given range visually appears to occupy.\r\n // Returns a plain object with start/end, NOT an UnzonedRange!\r\n DateComponent.prototype.computeDayRange = function (unzonedRange) {\r\n var calendar = this._getCalendar();\r\n var startDay = calendar.msToUtcMoment(unzonedRange.startMs, true); // the beginning of the day the range starts\r\n var end = calendar.msToUtcMoment(unzonedRange.endMs);\r\n var endTimeMS = +end.time(); // # of milliseconds into `endDay`\r\n var endDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends\r\n // If the end time is actually inclusively part of the next day and is equal to or\r\n // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\r\n // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\r\n if (endTimeMS && endTimeMS >= this.nextDayThreshold) {\r\n endDay.add(1, 'days');\r\n }\r\n // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.\r\n if (endDay <= startDay) {\r\n endDay = startDay.clone().add(1, 'days');\r\n }\r\n return { start: startDay, end: endDay };\r\n };\r\n // Does the given range visually appear to occupy more than one day?\r\n DateComponent.prototype.isMultiDayRange = function (unzonedRange) {\r\n var dayRange = this.computeDayRange(unzonedRange);\r\n return dayRange.end.diff(dayRange.start, 'days') > 1;\r\n };\r\n DateComponent.guid = 0; // TODO: better system for this?\r\n return DateComponent;\r\n}(Component_1.default));\r\nexports.default = DateComponent;\r\n// legacy\r\nfunction convertEventsPayloadToLegacyArray(eventsPayload) {\r\n var eventDefId;\r\n var eventInstances;\r\n var legacyEvents = [];\r\n var i;\r\n for (eventDefId in eventsPayload) {\r\n eventInstances = eventsPayload[eventDefId].eventInstances;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n legacyEvents.push(eventInstances[i].toLegacy());\r\n }\r\n }\r\n return legacyEvents;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 220 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar Iterator_1 = __webpack_require__(238);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Toolbar_1 = __webpack_require__(239);\r\nvar OptionsManager_1 = __webpack_require__(240);\r\nvar ViewSpecManager_1 = __webpack_require__(241);\r\nvar Constraints_1 = __webpack_require__(207);\r\nvar locale_1 = __webpack_require__(31);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventManager_1 = __webpack_require__(242);\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar Calendar = /** @class */ (function () {\r\n function Calendar(el, overrides) {\r\n this.loadingLevel = 0; // number of simultaneous loading tasks\r\n this.ignoreUpdateViewSize = 0;\r\n this.freezeContentHeightDepth = 0;\r\n // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.\r\n // unneeded() is called in destroy.\r\n GlobalEmitter_1.default.needed();\r\n this.el = el;\r\n this.viewsByType = {};\r\n this.optionsManager = new OptionsManager_1.default(this, overrides);\r\n this.viewSpecManager = new ViewSpecManager_1.default(this.optionsManager, this);\r\n this.initMomentInternals(); // needs to happen after options hash initialized\r\n this.initCurrentDate();\r\n this.initEventManager();\r\n this.constraints = new Constraints_1.default(this.eventManager, this);\r\n this.constructed();\r\n }\r\n Calendar.prototype.constructed = function () {\r\n // useful for monkeypatching. used?\r\n };\r\n Calendar.prototype.getView = function () {\r\n return this.view;\r\n };\r\n Calendar.prototype.publiclyTrigger = function (name, triggerInfo) {\r\n var optHandler = this.opt(name);\r\n var context;\r\n var args;\r\n if ($.isPlainObject(triggerInfo)) {\r\n context = triggerInfo.context;\r\n args = triggerInfo.args;\r\n }\r\n else if ($.isArray(triggerInfo)) {\r\n args = triggerInfo;\r\n }\r\n if (context == null) {\r\n context = this.el[0]; // fallback context\r\n }\r\n if (!args) {\r\n args = [];\r\n }\r\n this.triggerWith(name, context, args); // Emitter's method\r\n if (optHandler) {\r\n return optHandler.apply(context, args);\r\n }\r\n };\r\n Calendar.prototype.hasPublicHandlers = function (name) {\r\n return this.hasHandlers(name) ||\r\n this.opt(name); // handler specified in options\r\n };\r\n // Options Public API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // public getter/setter\r\n Calendar.prototype.option = function (name, value) {\r\n var newOptionHash;\r\n if (typeof name === 'string') {\r\n if (value === undefined) {\r\n return this.optionsManager.get(name);\r\n }\r\n else {\r\n newOptionHash = {};\r\n newOptionHash[name] = value;\r\n this.optionsManager.add(newOptionHash);\r\n }\r\n }\r\n else if (typeof name === 'object') {\r\n this.optionsManager.add(name);\r\n }\r\n };\r\n // private getter\r\n Calendar.prototype.opt = function (name) {\r\n return this.optionsManager.get(name);\r\n };\r\n // View\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Given a view name for a custom view or a standard view, creates a ready-to-go View object\r\n Calendar.prototype.instantiateView = function (viewType) {\r\n var spec = this.viewSpecManager.getViewSpec(viewType);\r\n if (!spec) {\r\n throw new Error(\"View type \\\"\" + viewType + \"\\\" is not valid\");\r\n }\r\n return new spec['class'](this, spec);\r\n };\r\n // Returns a boolean about whether the view is okay to instantiate at some point\r\n Calendar.prototype.isValidViewType = function (viewType) {\r\n return Boolean(this.viewSpecManager.getViewSpec(viewType));\r\n };\r\n Calendar.prototype.changeView = function (viewName, dateOrRange) {\r\n if (dateOrRange) {\r\n if (dateOrRange.start && dateOrRange.end) {\r\n this.optionsManager.recordOverrides({\r\n visibleRange: dateOrRange\r\n });\r\n }\r\n else {\r\n this.currentDate = this.moment(dateOrRange).stripZone(); // just like gotoDate\r\n }\r\n }\r\n this.renderView(viewName);\r\n };\r\n // Forces navigation to a view for the given date.\r\n // `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\r\n Calendar.prototype.zoomTo = function (newDate, viewType) {\r\n var spec;\r\n viewType = viewType || 'day'; // day is default zoom\r\n spec = this.viewSpecManager.getViewSpec(viewType) ||\r\n this.viewSpecManager.getUnitViewSpec(viewType);\r\n this.currentDate = newDate.clone();\r\n this.renderView(spec ? spec.type : null);\r\n };\r\n // Current Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initCurrentDate = function () {\r\n var defaultDateInput = this.opt('defaultDate');\r\n // compute the initial ambig-timezone date\r\n if (defaultDateInput != null) {\r\n this.currentDate = this.moment(defaultDateInput).stripZone();\r\n }\r\n else {\r\n this.currentDate = this.getNow(); // getNow already returns unzoned\r\n }\r\n };\r\n Calendar.prototype.prev = function () {\r\n var view = this.view;\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n if (prevInfo.isValid) {\r\n this.currentDate = prevInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.next = function () {\r\n var view = this.view;\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n if (nextInfo.isValid) {\r\n this.currentDate = nextInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.prevYear = function () {\r\n this.currentDate.add(-1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.nextYear = function () {\r\n this.currentDate.add(1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.today = function () {\r\n this.currentDate = this.getNow(); // should deny like prev/next?\r\n this.renderView();\r\n };\r\n Calendar.prototype.gotoDate = function (zonedDateInput) {\r\n this.currentDate = this.moment(zonedDateInput).stripZone();\r\n this.renderView();\r\n };\r\n Calendar.prototype.incrementDate = function (delta) {\r\n this.currentDate.add(moment.duration(delta));\r\n this.renderView();\r\n };\r\n // for external API\r\n Calendar.prototype.getDate = function () {\r\n return this.applyTimezone(this.currentDate); // infuse the calendar's timezone\r\n };\r\n // Loading Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Should be called when any type of async data fetching begins\r\n Calendar.prototype.pushLoading = function () {\r\n if (!(this.loadingLevel++)) {\r\n this.publiclyTrigger('loading', [true, this.view]);\r\n }\r\n };\r\n // Should be called when any type of async data fetching completes\r\n Calendar.prototype.popLoading = function () {\r\n if (!(--this.loadingLevel)) {\r\n this.publiclyTrigger('loading', [false, this.view]);\r\n }\r\n };\r\n // High-level Rendering\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.render = function () {\r\n if (!this.contentEl) {\r\n this.initialRender();\r\n }\r\n else if (this.elementVisible()) {\r\n // mainly for the public API\r\n this.calcSize();\r\n this.updateViewSize();\r\n }\r\n };\r\n Calendar.prototype.initialRender = function () {\r\n var _this = this;\r\n var el = this.el;\r\n el.addClass('fc');\r\n // event delegation for nav links\r\n el.on('click.fc', 'a[data-goto]', function (ev) {\r\n var anchorEl = $(ev.currentTarget);\r\n var gotoOptions = anchorEl.data('goto'); // will automatically parse JSON\r\n var date = _this.moment(gotoOptions.date);\r\n var viewType = gotoOptions.type;\r\n // property like \"navLinkDayClick\". might be a string or a function\r\n var customAction = _this.view.opt('navLink' + util_1.capitaliseFirstLetter(viewType) + 'Click');\r\n if (typeof customAction === 'function') {\r\n customAction(date, ev);\r\n }\r\n else {\r\n if (typeof customAction === 'string') {\r\n viewType = customAction;\r\n }\r\n _this.zoomTo(date, viewType);\r\n }\r\n });\r\n // called immediately, and upon option change\r\n this.optionsManager.watch('settingTheme', ['?theme', '?themeSystem'], function (opts) {\r\n var themeClass = ThemeRegistry_1.getThemeSystemClass(opts.themeSystem || opts.theme);\r\n var theme = new themeClass(_this.optionsManager);\r\n var widgetClass = theme.getClass('widget');\r\n _this.theme = theme;\r\n if (widgetClass) {\r\n el.addClass(widgetClass);\r\n }\r\n }, function () {\r\n var widgetClass = _this.theme.getClass('widget');\r\n _this.theme = null;\r\n if (widgetClass) {\r\n el.removeClass(widgetClass);\r\n }\r\n });\r\n this.optionsManager.watch('settingBusinessHourGenerator', ['?businessHours'], function (deps) {\r\n _this.businessHourGenerator = new BusinessHourGenerator_1.default(deps.businessHours, _this);\r\n if (_this.view) {\r\n _this.view.set('businessHourGenerator', _this.businessHourGenerator);\r\n }\r\n }, function () {\r\n _this.businessHourGenerator = null;\r\n });\r\n // called immediately, and upon option change.\r\n // HACK: locale often affects isRTL, so we explicitly listen to that too.\r\n this.optionsManager.watch('applyingDirClasses', ['?isRTL', '?locale'], function (opts) {\r\n el.toggleClass('fc-ltr', !opts.isRTL);\r\n el.toggleClass('fc-rtl', opts.isRTL);\r\n });\r\n this.contentEl = $(\"
\").prependTo(el);\r\n this.initToolbars();\r\n this.renderHeader();\r\n this.renderFooter();\r\n this.renderView(this.opt('defaultView'));\r\n if (this.opt('handleWindowResize')) {\r\n $(window).resize(this.windowResizeProxy = util_1.debounce(// prevents rapid calls\r\n this.windowResize.bind(this), this.opt('windowResizeDelay')));\r\n }\r\n };\r\n Calendar.prototype.destroy = function () {\r\n if (this.view) {\r\n this.clearView();\r\n }\r\n this.toolbarsManager.proxyCall('removeElement');\r\n this.contentEl.remove();\r\n this.el.removeClass('fc fc-ltr fc-rtl');\r\n // removes theme-related root className\r\n this.optionsManager.unwatch('settingTheme');\r\n this.optionsManager.unwatch('settingBusinessHourGenerator');\r\n this.el.off('.fc'); // unbind nav link handlers\r\n if (this.windowResizeProxy) {\r\n $(window).unbind('resize', this.windowResizeProxy);\r\n this.windowResizeProxy = null;\r\n }\r\n GlobalEmitter_1.default.unneeded();\r\n };\r\n Calendar.prototype.elementVisible = function () {\r\n return this.el.is(':visible');\r\n };\r\n // Render Queue\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.bindViewHandlers = function (view) {\r\n var _this = this;\r\n view.watch('titleForCalendar', ['title'], function (deps) {\r\n if (view === _this.view) {\r\n _this.setToolbarsTitle(deps.title);\r\n }\r\n });\r\n view.watch('dateProfileForCalendar', ['dateProfile'], function (deps) {\r\n if (view === _this.view) {\r\n _this.currentDate = deps.dateProfile.date; // might have been constrained by view dates\r\n _this.updateToolbarButtons(deps.dateProfile);\r\n }\r\n });\r\n };\r\n Calendar.prototype.unbindViewHandlers = function (view) {\r\n view.unwatch('titleForCalendar');\r\n view.unwatch('dateProfileForCalendar');\r\n };\r\n // View Rendering\r\n // -----------------------------------------------------------------------------------\r\n // Renders a view because of a date change, view-type change, or for the first time.\r\n // If not given a viewType, keep the current view but render different dates.\r\n // Accepts an optional scroll state to restore to.\r\n Calendar.prototype.renderView = function (viewType) {\r\n var oldView = this.view;\r\n var newView;\r\n this.freezeContentHeight();\r\n if (oldView && viewType && oldView.type !== viewType) {\r\n this.clearView();\r\n }\r\n // if viewType changed, or the view was never created, create a fresh view\r\n if (!this.view && viewType) {\r\n newView = this.view =\r\n this.viewsByType[viewType] ||\r\n (this.viewsByType[viewType] = this.instantiateView(viewType));\r\n this.bindViewHandlers(newView);\r\n newView.startBatchRender(); // so that setElement+setDate rendering are joined\r\n newView.setElement($(\"
\").appendTo(this.contentEl));\r\n this.toolbarsManager.proxyCall('activateButton', viewType);\r\n }\r\n if (this.view) {\r\n // prevent unnecessary change firing\r\n if (this.view.get('businessHourGenerator') !== this.businessHourGenerator) {\r\n this.view.set('businessHourGenerator', this.businessHourGenerator);\r\n }\r\n this.view.setDate(this.currentDate);\r\n if (newView) {\r\n newView.stopBatchRender();\r\n }\r\n }\r\n this.thawContentHeight();\r\n };\r\n // Unrenders the current view and reflects this change in the Header.\r\n // Unregsiters the `view`, but does not remove from viewByType hash.\r\n Calendar.prototype.clearView = function () {\r\n var currentView = this.view;\r\n this.toolbarsManager.proxyCall('deactivateButton', currentView.type);\r\n this.unbindViewHandlers(currentView);\r\n currentView.removeElement();\r\n currentView.unsetDate(); // so bindViewHandlers doesn't fire with old values next time\r\n this.view = null;\r\n };\r\n // Destroys the view, including the view object. Then, re-instantiates it and renders it.\r\n // Maintains the same scroll state.\r\n // TODO: maintain any other user-manipulated state.\r\n Calendar.prototype.reinitView = function () {\r\n var oldView = this.view;\r\n var scroll = oldView.queryScroll(); // wouldn't be so complicated if Calendar owned the scroll\r\n this.freezeContentHeight();\r\n this.clearView();\r\n this.calcSize();\r\n this.renderView(oldView.type); // needs the type to freshly render\r\n this.view.applyScroll(scroll);\r\n this.thawContentHeight();\r\n };\r\n // Resizing\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.getSuggestedViewHeight = function () {\r\n if (this.suggestedViewHeight == null) {\r\n this.calcSize();\r\n }\r\n return this.suggestedViewHeight;\r\n };\r\n Calendar.prototype.isHeightAuto = function () {\r\n return this.opt('contentHeight') === 'auto' || this.opt('height') === 'auto';\r\n };\r\n Calendar.prototype.updateViewSize = function (isResize) {\r\n if (isResize === void 0) { isResize = false; }\r\n var view = this.view;\r\n var scroll;\r\n if (!this.ignoreUpdateViewSize && view) {\r\n if (isResize) {\r\n this.calcSize();\r\n scroll = view.queryScroll();\r\n }\r\n this.ignoreUpdateViewSize++;\r\n view.updateSize(this.getSuggestedViewHeight(), this.isHeightAuto(), isResize);\r\n this.ignoreUpdateViewSize--;\r\n if (isResize) {\r\n view.applyScroll(scroll);\r\n }\r\n return true; // signal success\r\n }\r\n };\r\n Calendar.prototype.calcSize = function () {\r\n if (this.elementVisible()) {\r\n this._calcSize();\r\n }\r\n };\r\n Calendar.prototype._calcSize = function () {\r\n var contentHeightInput = this.opt('contentHeight');\r\n var heightInput = this.opt('height');\r\n if (typeof contentHeightInput === 'number') {\r\n this.suggestedViewHeight = contentHeightInput;\r\n }\r\n else if (typeof contentHeightInput === 'function') {\r\n this.suggestedViewHeight = contentHeightInput();\r\n }\r\n else if (typeof heightInput === 'number') {\r\n this.suggestedViewHeight = heightInput - this.queryToolbarsHeight();\r\n }\r\n else if (typeof heightInput === 'function') {\r\n this.suggestedViewHeight = heightInput() - this.queryToolbarsHeight();\r\n }\r\n else if (heightInput === 'parent') {\r\n this.suggestedViewHeight = this.el.parent().height() - this.queryToolbarsHeight();\r\n }\r\n else {\r\n this.suggestedViewHeight = Math.round(this.contentEl.width() /\r\n Math.max(this.opt('aspectRatio'), .5));\r\n }\r\n };\r\n Calendar.prototype.windowResize = function (ev) {\r\n if (\r\n // the purpose: so we don't process jqui \"resize\" events that have bubbled up\r\n // cast to any because .target, which is Element, can't be compared to window for some reason.\r\n ev.target === window &&\r\n this.view &&\r\n this.view.isDatesRendered) {\r\n if (this.updateViewSize(true)) {\r\n this.publiclyTrigger('windowResize', [this.view]);\r\n }\r\n }\r\n };\r\n /* Height \"Freezing\"\r\n -----------------------------------------------------------------------------*/\r\n Calendar.prototype.freezeContentHeight = function () {\r\n if (!(this.freezeContentHeightDepth++)) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n Calendar.prototype.forceFreezeContentHeight = function () {\r\n this.contentEl.css({\r\n width: '100%',\r\n height: this.contentEl.height(),\r\n overflow: 'hidden'\r\n });\r\n };\r\n Calendar.prototype.thawContentHeight = function () {\r\n this.freezeContentHeightDepth--;\r\n // always bring back to natural height\r\n this.contentEl.css({\r\n width: '',\r\n height: '',\r\n overflow: ''\r\n });\r\n // but if there are future thaws, re-freeze\r\n if (this.freezeContentHeightDepth) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n // Toolbar\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initToolbars = function () {\r\n this.header = new Toolbar_1.default(this, this.computeHeaderOptions());\r\n this.footer = new Toolbar_1.default(this, this.computeFooterOptions());\r\n this.toolbarsManager = new Iterator_1.default([this.header, this.footer]);\r\n };\r\n Calendar.prototype.computeHeaderOptions = function () {\r\n return {\r\n extraClasses: 'fc-header-toolbar',\r\n layout: this.opt('header')\r\n };\r\n };\r\n Calendar.prototype.computeFooterOptions = function () {\r\n return {\r\n extraClasses: 'fc-footer-toolbar',\r\n layout: this.opt('footer')\r\n };\r\n };\r\n // can be called repeatedly and Header will rerender\r\n Calendar.prototype.renderHeader = function () {\r\n var header = this.header;\r\n header.setToolbarOptions(this.computeHeaderOptions());\r\n header.render();\r\n if (header.el) {\r\n this.el.prepend(header.el);\r\n }\r\n };\r\n // can be called repeatedly and Footer will rerender\r\n Calendar.prototype.renderFooter = function () {\r\n var footer = this.footer;\r\n footer.setToolbarOptions(this.computeFooterOptions());\r\n footer.render();\r\n if (footer.el) {\r\n this.el.append(footer.el);\r\n }\r\n };\r\n Calendar.prototype.setToolbarsTitle = function (title) {\r\n this.toolbarsManager.proxyCall('updateTitle', title);\r\n };\r\n Calendar.prototype.updateToolbarButtons = function (dateProfile) {\r\n var now = this.getNow();\r\n var view = this.view;\r\n var todayInfo = view.dateProfileGenerator.build(now);\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n this.toolbarsManager.proxyCall((todayInfo.isValid && !dateProfile.currentUnzonedRange.containsDate(now)) ?\r\n 'enableButton' :\r\n 'disableButton', 'today');\r\n this.toolbarsManager.proxyCall(prevInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'prev');\r\n this.toolbarsManager.proxyCall(nextInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'next');\r\n };\r\n Calendar.prototype.queryToolbarsHeight = function () {\r\n return this.toolbarsManager.items.reduce(function (accumulator, toolbar) {\r\n var toolbarHeight = toolbar.el ? toolbar.el.outerHeight(true) : 0; // includes margin\r\n return accumulator + toolbarHeight;\r\n }, 0);\r\n };\r\n // Selection\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // this public method receives start/end dates in any format, with any timezone\r\n Calendar.prototype.select = function (zonedStartInput, zonedEndInput) {\r\n this.view.select(this.buildSelectFootprint.apply(this, arguments));\r\n };\r\n Calendar.prototype.unselect = function () {\r\n if (this.view) {\r\n this.view.unselect();\r\n }\r\n };\r\n // Given arguments to the select method in the API, returns a span (unzoned start/end and other info)\r\n Calendar.prototype.buildSelectFootprint = function (zonedStartInput, zonedEndInput) {\r\n var start = this.moment(zonedStartInput).stripZone();\r\n var end;\r\n if (zonedEndInput) {\r\n end = this.moment(zonedEndInput).stripZone();\r\n }\r\n else if (start.hasTime()) {\r\n end = start.clone().add(this.defaultTimedEventDuration);\r\n }\r\n else {\r\n end = start.clone().add(this.defaultAllDayEventDuration);\r\n }\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), !start.hasTime());\r\n };\r\n // Date Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initMomentInternals = function () {\r\n var _this = this;\r\n this.defaultAllDayEventDuration = moment.duration(this.opt('defaultAllDayEventDuration'));\r\n this.defaultTimedEventDuration = moment.duration(this.opt('defaultTimedEventDuration'));\r\n // Called immediately, and when any of the options change.\r\n // Happens before any internal objects rebuild or rerender, because this is very core.\r\n this.optionsManager.watch('buildingMomentLocale', [\r\n '?locale', '?monthNames', '?monthNamesShort', '?dayNames', '?dayNamesShort',\r\n '?firstDay', '?weekNumberCalculation'\r\n ], function (opts) {\r\n var weekNumberCalculation = opts.weekNumberCalculation;\r\n var firstDay = opts.firstDay;\r\n var _week;\r\n // normalize\r\n if (weekNumberCalculation === 'iso') {\r\n weekNumberCalculation = 'ISO'; // normalize\r\n }\r\n var localeData = Object.create(// make a cheap copy\r\n locale_1.getMomentLocaleData(opts.locale) // will fall back to en\r\n );\r\n if (opts.monthNames) {\r\n localeData._months = opts.monthNames;\r\n }\r\n if (opts.monthNamesShort) {\r\n localeData._monthsShort = opts.monthNamesShort;\r\n }\r\n if (opts.dayNames) {\r\n localeData._weekdays = opts.dayNames;\r\n }\r\n if (opts.dayNamesShort) {\r\n localeData._weekdaysShort = opts.dayNamesShort;\r\n }\r\n if (firstDay == null && weekNumberCalculation === 'ISO') {\r\n firstDay = 1;\r\n }\r\n if (firstDay != null) {\r\n _week = Object.create(localeData._week); // _week: { dow: # }\r\n _week.dow = firstDay;\r\n localeData._week = _week;\r\n }\r\n if (weekNumberCalculation === 'ISO' ||\r\n weekNumberCalculation === 'local' ||\r\n typeof weekNumberCalculation === 'function') {\r\n localeData._fullCalendar_weekCalc = weekNumberCalculation; // moment-ext will know what to do with it\r\n }\r\n _this.localeData = localeData;\r\n // If the internal current date object already exists, move to new locale.\r\n // We do NOT need to do this technique for event dates, because this happens when converting to \"segments\".\r\n if (_this.currentDate) {\r\n _this.localizeMoment(_this.currentDate); // sets to localeData\r\n }\r\n });\r\n };\r\n // Builds a moment using the settings of the current calendar: timezone and locale.\r\n // Accepts anything the vanilla moment() constructor accepts.\r\n Calendar.prototype.moment = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var mom;\r\n if (this.opt('timezone') === 'local') {\r\n mom = moment_ext_1.default.apply(null, args);\r\n // Force the moment to be local, because momentExt doesn't guarantee it.\r\n if (mom.hasTime()) {\r\n mom.local();\r\n }\r\n }\r\n else if (this.opt('timezone') === 'UTC') {\r\n mom = moment_ext_1.default.utc.apply(null, args); // process as UTC\r\n }\r\n else {\r\n mom = moment_ext_1.default.parseZone.apply(null, args); // let the input decide the zone\r\n }\r\n this.localizeMoment(mom); // TODO\r\n return mom;\r\n };\r\n Calendar.prototype.msToMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n else {\r\n mom = this.applyTimezone(mom); // may or may not apply locale\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n Calendar.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n // Updates the given moment's locale settings to the current calendar locale settings.\r\n Calendar.prototype.localizeMoment = function (mom) {\r\n mom._locale = this.localeData;\r\n };\r\n // Returns a boolean about whether or not the calendar knows how to calculate\r\n // the timezone offset of arbitrary dates in the current timezone.\r\n Calendar.prototype.getIsAmbigTimezone = function () {\r\n return this.opt('timezone') !== 'local' && this.opt('timezone') !== 'UTC';\r\n };\r\n // Returns a copy of the given date in the current timezone. Has no effect on dates without times.\r\n Calendar.prototype.applyTimezone = function (date) {\r\n if (!date.hasTime()) {\r\n return date.clone();\r\n }\r\n var zonedDate = this.moment(date.toArray());\r\n var timeAdjust = date.time().asMilliseconds() - zonedDate.time().asMilliseconds();\r\n var adjustedZonedDate;\r\n // Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396)\r\n if (timeAdjust) {\r\n adjustedZonedDate = zonedDate.clone().add(timeAdjust); // add milliseconds\r\n if (date.time().asMilliseconds() - adjustedZonedDate.time().asMilliseconds() === 0) {\r\n zonedDate = adjustedZonedDate;\r\n }\r\n }\r\n return zonedDate;\r\n };\r\n /*\r\n Assumes the footprint is non-open-ended.\r\n */\r\n Calendar.prototype.footprintToDateProfile = function (componentFootprint, ignoreEnd) {\r\n if (ignoreEnd === void 0) { ignoreEnd = false; }\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs);\r\n var end;\r\n if (!ignoreEnd) {\r\n end = moment_ext_1.default.utc(componentFootprint.unzonedRange.endMs);\r\n }\r\n if (componentFootprint.isAllDay) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else {\r\n start = this.applyTimezone(start);\r\n if (end) {\r\n end = this.applyTimezone(end);\r\n }\r\n }\r\n return new EventDateProfile_1.default(start, end, this);\r\n };\r\n // Returns a moment for the current date, as defined by the client's computer or from the `now` option.\r\n // Will return an moment with an ambiguous timezone.\r\n Calendar.prototype.getNow = function () {\r\n var now = this.opt('now');\r\n if (typeof now === 'function') {\r\n now = now();\r\n }\r\n return this.moment(now).stripZone();\r\n };\r\n // Produces a human-readable string for the given duration.\r\n // Side-effect: changes the locale of the given duration.\r\n Calendar.prototype.humanizeDuration = function (duration) {\r\n return duration.locale(this.opt('locale')).humanize();\r\n };\r\n // will return `null` if invalid range\r\n Calendar.prototype.parseUnzonedRange = function (rangeInput) {\r\n var start = null;\r\n var end = null;\r\n if (rangeInput.start) {\r\n start = this.moment(rangeInput.start).stripZone();\r\n }\r\n if (rangeInput.end) {\r\n end = this.moment(rangeInput.end).stripZone();\r\n }\r\n if (!start && !end) {\r\n return null;\r\n }\r\n if (start && end && end.isBefore(start)) {\r\n return null;\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Event-Date Utilities\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initEventManager = function () {\r\n var _this = this;\r\n var eventManager = new EventManager_1.default(this);\r\n var rawSources = this.opt('eventSources') || [];\r\n var singleRawSource = this.opt('events');\r\n this.eventManager = eventManager;\r\n if (singleRawSource) {\r\n rawSources.unshift(singleRawSource);\r\n }\r\n eventManager.on('release', function (eventsPayload) {\r\n _this.trigger('eventsReset', eventsPayload);\r\n });\r\n eventManager.freeze();\r\n rawSources.forEach(function (rawSource) {\r\n var source = EventSourceParser_1.default.parse(rawSource, _this);\r\n if (source) {\r\n eventManager.addSource(source);\r\n }\r\n });\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.requestEvents = function (start, end) {\r\n return this.eventManager.requestEvents(start, end, this.opt('timezone'), !this.opt('lazyFetching'));\r\n };\r\n // Get an event's normalized end date. If not present, calculate it from the defaults.\r\n Calendar.prototype.getEventEnd = function (event) {\r\n if (event.end) {\r\n return event.end.clone();\r\n }\r\n else {\r\n return this.getDefaultEventEnd(event.allDay, event.start);\r\n }\r\n };\r\n // Given an event's allDay status and start date, return what its fallback end date should be.\r\n // TODO: rename to computeDefaultEventEnd\r\n Calendar.prototype.getDefaultEventEnd = function (allDay, zonedStart) {\r\n var end = zonedStart.clone();\r\n if (allDay) {\r\n end.stripTime().add(this.defaultAllDayEventDuration);\r\n }\r\n else {\r\n end.add(this.defaultTimedEventDuration);\r\n }\r\n if (this.getIsAmbigTimezone()) {\r\n end.stripZone(); // we don't know what the tzo should be\r\n }\r\n return end;\r\n };\r\n // Public Events API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.rerenderEvents = function () {\r\n this.view.flash('displayingEvents');\r\n };\r\n Calendar.prototype.refetchEvents = function () {\r\n this.eventManager.refetchAllSources();\r\n };\r\n Calendar.prototype.renderEvents = function (eventInputs, isSticky) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventInputs.length; i++) {\r\n this.renderEvent(eventInputs[i], isSticky);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.renderEvent = function (eventInput, isSticky) {\r\n if (isSticky === void 0) { isSticky = false; }\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, eventInput.source || eventManager.stickySource);\r\n if (eventDef) {\r\n eventManager.addEventDef(eventDef, isSticky);\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.removeEvents = function (legacyQuery) {\r\n var eventManager = this.eventManager;\r\n var legacyInstances = [];\r\n var idMap = {};\r\n var eventDef;\r\n var i;\r\n if (legacyQuery == null) {\r\n eventManager.removeAllEventDefs(); // persist=true\r\n }\r\n else {\r\n eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyInstances.push(eventInstance.toLegacy());\r\n });\r\n legacyInstances = filterLegacyEventInstances(legacyInstances, legacyQuery);\r\n // compute unique IDs\r\n for (i = 0; i < legacyInstances.length; i++) {\r\n eventDef = this.eventManager.getEventDefByUid(legacyInstances[i]._id);\r\n idMap[eventDef.id] = true;\r\n }\r\n eventManager.freeze();\r\n for (i in idMap) {\r\n eventManager.removeEventDefsById(i); // persist=true\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.clientEvents = function (legacyQuery) {\r\n var legacyEventInstances = [];\r\n this.eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyEventInstances.push(eventInstance.toLegacy());\r\n });\r\n return filterLegacyEventInstances(legacyEventInstances, legacyQuery);\r\n };\r\n Calendar.prototype.updateEvents = function (eventPropsArray) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventPropsArray.length; i++) {\r\n this.updateEvent(eventPropsArray[i]);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.updateEvent = function (eventProps) {\r\n var eventDef = this.eventManager.getEventDefByUid(eventProps._id);\r\n var eventInstance;\r\n var eventDefMutation;\r\n if (eventDef instanceof SingleEventDef_1.default) {\r\n eventInstance = eventDef.buildInstance();\r\n eventDefMutation = EventDefMutation_1.default.createFromRawProps(eventInstance, eventProps, // raw props\r\n null // largeUnit -- who uses it?\r\n );\r\n this.eventManager.mutateEventsWithId(eventDef.id, eventDefMutation); // will release\r\n }\r\n };\r\n // Public Event Sources API\r\n // ------------------------------------------------------------------------------------\r\n Calendar.prototype.getEventSources = function () {\r\n return this.eventManager.otherSources.slice(); // clone\r\n };\r\n Calendar.prototype.getEventSourceById = function (id) {\r\n return this.eventManager.getSourceById(EventSource_1.default.normalizeId(id));\r\n };\r\n Calendar.prototype.addEventSource = function (sourceInput) {\r\n var source = EventSourceParser_1.default.parse(sourceInput, this);\r\n if (source) {\r\n this.eventManager.addSource(source);\r\n }\r\n };\r\n Calendar.prototype.removeEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources;\r\n var i;\r\n if (sourceMultiQuery == null) {\r\n this.eventManager.removeAllSources();\r\n }\r\n else {\r\n sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n Calendar.prototype.removeEventSource = function (sourceQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.querySources(sourceQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.refetchEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.refetchSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n // not for internal use. use options module directly instead.\r\n Calendar.defaults = options_1.globalDefaults;\r\n Calendar.englishDefaults = options_1.englishDefaults;\r\n Calendar.rtlDefaults = options_1.rtlDefaults;\r\n return Calendar;\r\n}());\r\nexports.default = Calendar;\r\nEmitterMixin_1.default.mixInto(Calendar);\r\nListenerMixin_1.default.mixInto(Calendar);\r\nfunction filterLegacyEventInstances(legacyEventInstances, legacyQuery) {\r\n if (legacyQuery == null) {\r\n return legacyEventInstances;\r\n }\r\n else if ($.isFunction(legacyQuery)) {\r\n return legacyEventInstances.filter(legacyQuery);\r\n }\r\n else {\r\n legacyQuery += ''; // normalize to string\r\n return legacyEventInstances.filter(function (legacyEventInstance) {\r\n // soft comparison because id not be normalized to string\r\n // tslint:disable-next-line\r\n return legacyEventInstance.id == legacyQuery ||\r\n legacyEventInstance._id === legacyQuery; // can specify internal id, but must exactly match\r\n });\r\n }\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 221 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator = /** @class */ (function () {\r\n function DateProfileGenerator(_view) {\r\n this._view = _view;\r\n }\r\n DateProfileGenerator.prototype.opt = function (name) {\r\n return this._view.opt(name);\r\n };\r\n DateProfileGenerator.prototype.trimHiddenDays = function (unzonedRange) {\r\n return this._view.trimHiddenDays(unzonedRange);\r\n };\r\n DateProfileGenerator.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n return this._view.calendar.msToUtcMoment(ms, forceAllDay);\r\n };\r\n /* Date Range Computation\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Builds a structure with info about what the dates/ranges will be for the \"prev\" view.\r\n DateProfileGenerator.prototype.buildPrev = function (currentDateProfile) {\r\n var prevDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .subtract(currentDateProfile.dateIncrement);\r\n return this.build(prevDate, -1);\r\n };\r\n // Builds a structure with info about what the dates/ranges will be for the \"next\" view.\r\n DateProfileGenerator.prototype.buildNext = function (currentDateProfile) {\r\n var nextDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .add(currentDateProfile.dateIncrement);\r\n return this.build(nextDate, 1);\r\n };\r\n // Builds a structure holding dates/ranges for rendering around the given date.\r\n // Optional direction param indicates whether the date is being incremented/decremented\r\n // from its previous value. decremented = -1, incremented = 1 (default).\r\n DateProfileGenerator.prototype.build = function (date, direction, forceToValid) {\r\n if (forceToValid === void 0) { forceToValid = false; }\r\n var isDateAllDay = !date.hasTime();\r\n var validUnzonedRange;\r\n var minTime = null;\r\n var maxTime = null;\r\n var currentInfo;\r\n var isRangeAllDay;\r\n var renderUnzonedRange;\r\n var activeUnzonedRange;\r\n var isValid;\r\n validUnzonedRange = this.buildValidRange();\r\n validUnzonedRange = this.trimHiddenDays(validUnzonedRange);\r\n if (forceToValid) {\r\n date = this.msToUtcMoment(validUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n currentInfo = this.buildCurrentRangeInfo(date, direction);\r\n isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);\r\n renderUnzonedRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.unzonedRange), currentInfo.unit, isRangeAllDay);\r\n renderUnzonedRange = this.trimHiddenDays(renderUnzonedRange);\r\n activeUnzonedRange = renderUnzonedRange.clone();\r\n if (!this.opt('showNonCurrentDates')) {\r\n activeUnzonedRange = activeUnzonedRange.intersect(currentInfo.unzonedRange);\r\n }\r\n minTime = moment.duration(this.opt('minTime'));\r\n maxTime = moment.duration(this.opt('maxTime'));\r\n activeUnzonedRange = this.adjustActiveRange(activeUnzonedRange, minTime, maxTime);\r\n activeUnzonedRange = activeUnzonedRange.intersect(validUnzonedRange); // might return null\r\n if (activeUnzonedRange) {\r\n date = this.msToUtcMoment(activeUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n // it's invalid if the originally requested date is not contained,\r\n // or if the range is completely outside of the valid range.\r\n isValid = currentInfo.unzonedRange.intersectsWith(validUnzonedRange);\r\n return {\r\n // constraint for where prev/next operations can go and where events can be dragged/resized to.\r\n // an object with optional start and end properties.\r\n validUnzonedRange: validUnzonedRange,\r\n // range the view is formally responsible for.\r\n // for example, a month view might have 1st-31st, excluding padded dates\r\n currentUnzonedRange: currentInfo.unzonedRange,\r\n // name of largest unit being displayed, like \"month\" or \"week\"\r\n currentRangeUnit: currentInfo.unit,\r\n isRangeAllDay: isRangeAllDay,\r\n // dates that display events and accept drag-n-drop\r\n // will be `null` if no dates accept events\r\n activeUnzonedRange: activeUnzonedRange,\r\n // date range with a rendered skeleton\r\n // includes not-active days that need some sort of DOM\r\n renderUnzonedRange: renderUnzonedRange,\r\n // Duration object that denotes the first visible time of any given day\r\n minTime: minTime,\r\n // Duration object that denotes the exclusive visible end time of any given day\r\n maxTime: maxTime,\r\n isValid: isValid,\r\n date: date,\r\n // how far the current date will move for a prev/next operation\r\n dateIncrement: this.buildDateIncrement(currentInfo.duration)\r\n // pass a fallback (might be null) ^\r\n };\r\n };\r\n // Builds an object with optional start/end properties.\r\n // Indicates the minimum/maximum dates to display.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildValidRange = function () {\r\n return this._view.getUnzonedRangeOption('validRange', this._view.calendar.getNow()) ||\r\n new UnzonedRange_1.default(); // completely open-ended\r\n };\r\n // Builds a structure with info about the \"current\" range, the range that is\r\n // highlighted as being the current month for example.\r\n // See build() for a description of `direction`.\r\n // Guaranteed to have `range` and `unit` properties. `duration` is optional.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {\r\n var viewSpec = this._view.viewSpec;\r\n var duration = null;\r\n var unit = null;\r\n var unzonedRange = null;\r\n var dayCount;\r\n if (viewSpec.duration) {\r\n duration = viewSpec.duration;\r\n unit = viewSpec.durationUnit;\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n else if ((dayCount = this.opt('dayCount'))) {\r\n unit = 'day';\r\n unzonedRange = this.buildRangeFromDayCount(date, direction, dayCount);\r\n }\r\n else if ((unzonedRange = this.buildCustomVisibleRange(date))) {\r\n unit = util_1.computeGreatestUnit(unzonedRange.getStart(), unzonedRange.getEnd());\r\n }\r\n else {\r\n duration = this.getFallbackDuration();\r\n unit = util_1.computeGreatestUnit(duration);\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n return { duration: duration, unit: unit, unzonedRange: unzonedRange };\r\n };\r\n DateProfileGenerator.prototype.getFallbackDuration = function () {\r\n return moment.duration({ days: 1 });\r\n };\r\n // Returns a new activeUnzonedRange to have time values (un-ambiguate)\r\n // minTime or maxTime causes the range to expand.\r\n DateProfileGenerator.prototype.adjustActiveRange = function (unzonedRange, minTime, maxTime) {\r\n var start = unzonedRange.getStart();\r\n var end = unzonedRange.getEnd();\r\n if (this._view.usesMinMaxTime) {\r\n if (minTime < 0) {\r\n start.time(0).add(minTime);\r\n }\r\n if (maxTime > 24 * 60 * 60 * 1000) {\r\n end.time(maxTime - (24 * 60 * 60 * 1000));\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds the \"current\" range when it is specified as an explicit duration.\r\n // `unit` is the already-computed computeGreatestUnit value of duration.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {\r\n var alignment = this.opt('dateAlignment');\r\n var dateIncrementInput;\r\n var dateIncrementDuration;\r\n var start;\r\n var end;\r\n var res;\r\n // compute what the alignment should be\r\n if (!alignment) {\r\n dateIncrementInput = this.opt('dateIncrement');\r\n if (dateIncrementInput) {\r\n dateIncrementDuration = moment.duration(dateIncrementInput);\r\n // use the smaller of the two units\r\n if (dateIncrementDuration < duration) {\r\n alignment = util_1.computeDurationGreatestUnit(dateIncrementDuration, dateIncrementInput);\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n // if the view displays a single day or smaller\r\n if (duration.as('days') <= 1) {\r\n if (this._view.isHiddenDay(start)) {\r\n start = this._view.skipHiddenDays(start, direction);\r\n start.startOf('day');\r\n }\r\n }\r\n function computeRes() {\r\n start = date.clone().startOf(alignment);\r\n end = start.clone().add(duration);\r\n res = new UnzonedRange_1.default(start, end);\r\n }\r\n computeRes();\r\n // if range is completely enveloped by hidden days, go past the hidden days\r\n if (!this.trimHiddenDays(res)) {\r\n date = this._view.skipHiddenDays(date, direction);\r\n computeRes();\r\n }\r\n return res;\r\n };\r\n // Builds the \"current\" range when a dayCount is specified.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {\r\n var customAlignment = this.opt('dateAlignment');\r\n var runningCount = 0;\r\n var start = date.clone();\r\n var end;\r\n if (customAlignment) {\r\n start.startOf(customAlignment);\r\n }\r\n start.startOf('day');\r\n start = this._view.skipHiddenDays(start, direction);\r\n end = start.clone();\r\n do {\r\n end.add(1, 'day');\r\n if (!this._view.isHiddenDay(end)) {\r\n runningCount++;\r\n }\r\n } while (runningCount < dayCount);\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds a normalized range object for the \"visible\" range,\r\n // which is a way to define the currentUnzonedRange and activeUnzonedRange at the same time.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {\r\n var visibleUnzonedRange = this._view.getUnzonedRangeOption('visibleRange', this._view.calendar.applyTimezone(date) // correct zone. also generates new obj that avoids mutations\r\n );\r\n if (visibleUnzonedRange && (visibleUnzonedRange.startMs == null || visibleUnzonedRange.endMs == null)) {\r\n return null;\r\n }\r\n return visibleUnzonedRange;\r\n };\r\n // Computes the range that will represent the element/cells for *rendering*,\r\n // but which may have voided days/times.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n return currentUnzonedRange.clone();\r\n };\r\n // Compute the duration value that should be added/substracted to the current date\r\n // when a prev/next operation happens.\r\n DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {\r\n var dateIncrementInput = this.opt('dateIncrement');\r\n var customAlignment;\r\n if (dateIncrementInput) {\r\n return moment.duration(dateIncrementInput);\r\n }\r\n else if ((customAlignment = this.opt('dateAlignment'))) {\r\n return moment.duration(1, customAlignment);\r\n }\r\n else if (fallback) {\r\n return fallback;\r\n }\r\n else {\r\n return moment.duration({ days: 1 });\r\n }\r\n };\r\n return DateProfileGenerator;\r\n}());\r\nexports.default = DateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 222 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar ExternalDropping = /** @class */ (function (_super) {\r\n tslib_1.__extends(ExternalDropping, _super);\r\n function ExternalDropping() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.isDragging = false; // jqui-dragging an external element? boolean\r\n return _this;\r\n }\r\n /*\r\n component impements:\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - isExternalInstanceGroupAllowed\r\n - renderDrag\r\n - unrenderDrag\r\n */\r\n ExternalDropping.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n ExternalDropping.prototype.bindToDocument = function () {\r\n this.listenTo($(document), {\r\n dragstart: this.handleDragStart,\r\n sortstart: this.handleDragStart // jqui\r\n });\r\n };\r\n ExternalDropping.prototype.unbindFromDocument = function () {\r\n this.stopListeningTo($(document));\r\n };\r\n // Called when a jQuery UI drag is initiated anywhere in the DOM\r\n ExternalDropping.prototype.handleDragStart = function (ev, ui) {\r\n var el;\r\n var accept;\r\n if (this.opt('droppable')) {\r\n el = $((ui ? ui.item : null) || ev.target);\r\n // Test that the dragged element passes the dropAccept selector or filter function.\r\n // FYI, the default is \"*\" (matches all)\r\n accept = this.opt('dropAccept');\r\n if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {\r\n if (!this.isDragging) {\r\n this.listenToExternalDrag(el, ev, ui);\r\n }\r\n }\r\n }\r\n };\r\n // Called when a jQuery UI drag starts and it needs to be monitored for dropping\r\n ExternalDropping.prototype.listenToExternalDrag = function (el, ev, ui) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create\r\n var singleEventDef; // a null value signals an unsuccessful drag\r\n // listener that tracks mouse movement over date-associated pixel regions\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n interactionStart: function () {\r\n _this.isDragging = true;\r\n },\r\n hitOver: function (hit) {\r\n var isAllowed = true;\r\n var hitFootprint = hit.component.getSafeHitFootprint(hit); // hit might not belong to this grid\r\n var mutatedEventInstanceGroup;\r\n if (hitFootprint) {\r\n singleEventDef = _this.computeExternalDrop(hitFootprint, meta);\r\n if (singleEventDef) {\r\n mutatedEventInstanceGroup = new EventInstanceGroup_1.default(singleEventDef.buildInstances());\r\n isAllowed = meta.eventProps ? // isEvent?\r\n component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup) :\r\n component.isExternalInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n singleEventDef = null;\r\n util_1.disableCursor();\r\n }\r\n if (singleEventDef) {\r\n component.renderDrag(// called without a seg parameter\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, view.calendar)));\r\n }\r\n },\r\n hitOut: function () {\r\n singleEventDef = null; // signal unsuccessful\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n component.unrenderDrag();\r\n },\r\n interactionEnd: function (ev) {\r\n if (singleEventDef) {\r\n view.reportExternalDrop(singleEventDef, Boolean(meta.eventProps), // isEvent\r\n Boolean(meta.stick), // isSticky\r\n el, ev, ui);\r\n }\r\n _this.isDragging = false;\r\n _this.dragListener = null;\r\n }\r\n });\r\n dragListener.startDrag(ev); // start listening immediately\r\n };\r\n // Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),\r\n // returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null.\r\n // Returning a null value signals an invalid drop hit.\r\n // DOES NOT consider overlap/constraint.\r\n // Assumes both footprints are non-open-ended.\r\n ExternalDropping.prototype.computeExternalDrop = function (componentFootprint, meta) {\r\n var calendar = this.view.calendar;\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs).stripZone();\r\n var end;\r\n var eventDef;\r\n if (componentFootprint.isAllDay) {\r\n // if dropped on an all-day span, and element's metadata specified a time, set it\r\n if (meta.startTime) {\r\n start.time(meta.startTime);\r\n }\r\n else {\r\n start.stripTime();\r\n }\r\n }\r\n if (meta.duration) {\r\n end = start.clone().add(meta.duration);\r\n }\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n eventDef = SingleEventDef_1.default.parse($.extend({}, meta.eventProps, {\r\n start: start,\r\n end: end\r\n }), new EventSource_1.default(calendar));\r\n return eventDef;\r\n };\r\n return ExternalDropping;\r\n}(Interaction_1.default));\r\nexports.default = ExternalDropping;\r\nListenerMixin_1.default.mixInto(ExternalDropping);\r\n/* External-Dragging-Element Data\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.\r\n// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.\r\nexportHooks.dataAttrPrefix = '';\r\n// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure\r\n// to be used for Event Object creation.\r\n// A defined `.eventProps`, even when empty, indicates that an event should be created.\r\nfunction getDraggedElMeta(el) {\r\n var prefix = exportHooks.dataAttrPrefix;\r\n var eventProps; // properties for creating the event, not related to date/time\r\n var startTime; // a Duration\r\n var duration;\r\n var stick;\r\n if (prefix) {\r\n prefix += '-';\r\n }\r\n eventProps = el.data(prefix + 'event') || null;\r\n if (eventProps) {\r\n if (typeof eventProps === 'object') {\r\n eventProps = $.extend({}, eventProps); // make a copy\r\n }\r\n else {\r\n eventProps = {};\r\n }\r\n // pluck special-cased date/time properties\r\n startTime = eventProps.start;\r\n if (startTime == null) {\r\n startTime = eventProps.time;\r\n } // accept 'time' as well\r\n duration = eventProps.duration;\r\n stick = eventProps.stick;\r\n delete eventProps.start;\r\n delete eventProps.time;\r\n delete eventProps.duration;\r\n delete eventProps.stick;\r\n }\r\n // fallback to standalone attribute values for each of the date/time properties\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'start');\r\n }\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'time');\r\n } // accept 'time' as well\r\n if (duration == null) {\r\n duration = el.data(prefix + 'duration');\r\n }\r\n if (stick == null) {\r\n stick = el.data(prefix + 'stick');\r\n }\r\n // massage into correct data types\r\n startTime = startTime != null ? moment.duration(startTime) : null;\r\n duration = duration != null ? moment.duration(duration) : null;\r\n stick = Boolean(stick);\r\n return { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 223 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventResizing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventResizing, _super);\r\n /*\r\n component impements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - getSafeHitFootprint\r\n */\r\n function EventResizing(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isResizing = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventResizing.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventResizing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMouseDown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventResizing.prototype.handleMouseDown = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventResizing.prototype.handleTouchStart = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev);\r\n }\r\n };\r\n // Creates a listener that tracks the user as they resize an event segment.\r\n // Generic enough to work with any type of Grid.\r\n EventResizing.prototype.buildDragListener = function (seg, isStart) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance;\r\n var isDragging;\r\n var resizeMutation; // zoned event date properties. falsy if invalid resize\r\n // Tracks mouse movement over the *grid's* coordinate map\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n interactionStart: function () {\r\n isDragging = false;\r\n },\r\n dragStart: function (ev) {\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segResizeStart(seg, ev);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origHitFootprint = component.getSafeHitFootprint(origHit);\r\n var hitFootprint = component.getSafeHitFootprint(hit);\r\n var mutatedEventInstanceGroup;\r\n if (origHitFootprint && hitFootprint) {\r\n resizeMutation = isStart ?\r\n _this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, seg.footprint) :\r\n _this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, seg.footprint);\r\n if (resizeMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, resizeMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n resizeMutation = null;\r\n util_1.disableCursor();\r\n }\r\n else if (resizeMutation.isEmpty()) {\r\n // no change. (FYI, event dates might have zones)\r\n resizeMutation = null;\r\n }\r\n if (resizeMutation) {\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n view.renderEventResize(component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg);\r\n }\r\n },\r\n hitOut: function () {\r\n resizeMutation = null;\r\n },\r\n hitDone: function () {\r\n view.unrenderEventResize(seg);\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n if (isDragging) {\r\n _this.segResizeStop(seg, ev);\r\n }\r\n if (resizeMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventResize(eventInstance, resizeMutation, el, ev);\r\n }\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment resizing starts\r\n EventResizing.prototype.segResizeStart = function (seg, ev) {\r\n this.isResizing = true;\r\n this.component.publiclyTrigger('eventResizeStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment resizing stops\r\n EventResizing.prototype.segResizeStop = function (seg, ev) {\r\n this.isResizing = false;\r\n this.component.publiclyTrigger('eventResizeStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Returns new date-information for an event segment being resized from its start\r\n EventResizing.prototype.computeEventStartResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var startDelta = this.component.diffDates(endFootprint.unzonedRange.getStart(), startFootprint.unzonedRange.getStart());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getStart().add(startDelta) < origRange.getEnd()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setStartDelta(startDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n // Returns new date-information for an event segment being resized from its end\r\n EventResizing.prototype.computeEventEndResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var endDelta = this.component.diffDates(endFootprint.unzonedRange.getEnd(), startFootprint.unzonedRange.getEnd());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getEnd().add(endDelta) > origRange.getStart()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setEndDelta(endDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n return EventResizing;\r\n}(Interaction_1.default));\r\nexports.default = EventResizing;\r\n\r\n\r\n/***/ }),\r\n/* 224 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar DragListener_1 = __webpack_require__(54);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar MouseFollower_1 = __webpack_require__(244);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventDragging = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventDragging, _super);\r\n /*\r\n component implements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n */\r\n function EventDragging(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isDragging = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventDragging.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventDragging.prototype.getSelectionDelay = function () {\r\n var delay = this.opt('eventLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n EventDragging.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMousedown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventDragging.prototype.handleMousedown = function (seg, ev) {\r\n if (!this.component.shouldIgnoreMouse() &&\r\n this.component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventDragging.prototype.handleTouchStart = function (seg, ev) {\r\n var component = this.component;\r\n var settings = {\r\n delay: this.view.isEventDefSelected(seg.footprint.eventDef) ? // already selected?\r\n 0 : this.getSelectionDelay()\r\n };\r\n if (component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, settings);\r\n }\r\n else if (component.canStartSelection(seg, ev)) {\r\n this.buildSelectListener(seg).startInteraction(ev, settings);\r\n }\r\n };\r\n // seg isn't draggable, but let's use a generic DragListener\r\n // simply for the delay, so it can be selected.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildSelectListener = function (seg) {\r\n var _this = this;\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n var dragListener = this.dragListener = new DragListener_1.default({\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n },\r\n interactionEnd: function (ev) {\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Builds a listener that will track user-dragging on an event segment.\r\n // Generic enough to work with any type of Grid.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildDragListener = function (seg) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n var isDragging;\r\n var mouseFollower; // A clone of the original element that will move with the mouse\r\n var eventDefMutation;\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents\r\n // of the view.\r\n var dragListener = this.dragListener = new HitDragListener_1.default(view, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n subjectCenter: true,\r\n interactionStart: function (ev) {\r\n seg.component = component; // for renderDrag\r\n isDragging = false;\r\n mouseFollower = new MouseFollower_1.default(seg.el, {\r\n additionalClass: 'fc-dragging',\r\n parentEl: view.el,\r\n opacity: dragListener.isTouch ? null : _this.opt('dragOpacity'),\r\n revertDuration: _this.opt('dragRevertDuration'),\r\n zIndex: 2 // one above the .fc-view\r\n });\r\n mouseFollower.hide(); // don't show until we know this is a real drag\r\n mouseFollower.start(ev);\r\n },\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segDragStart(seg, ev);\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origFootprint;\r\n var footprint;\r\n var mutatedEventInstanceGroup;\r\n // starting hit could be forced (DayGrid.limit)\r\n if (seg.hit) {\r\n origHit = seg.hit;\r\n }\r\n // hit might not belong to this grid, so query origin grid\r\n origFootprint = origHit.component.getSafeHitFootprint(origHit);\r\n footprint = hit.component.getSafeHitFootprint(hit);\r\n if (origFootprint && footprint) {\r\n eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, eventDef);\r\n if (eventDefMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, eventDefMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n eventDefMutation = null;\r\n util_1.disableCursor();\r\n }\r\n // if a valid drop location, have the subclass render a visual indication\r\n if (eventDefMutation &&\r\n view.renderDrag(// truthy if rendered something\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg, dragListener.isTouch)) {\r\n mouseFollower.hide(); // if the subclass is already using a mock event \"helper\", hide our own\r\n }\r\n else {\r\n mouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)\r\n }\r\n if (isOrig) {\r\n // needs to have moved hits to be a valid drop\r\n eventDefMutation = null;\r\n }\r\n },\r\n hitOut: function () {\r\n view.unrenderDrag(seg); // unrender whatever was done in renderDrag\r\n mouseFollower.show(); // show in case we are moving out of all hits\r\n eventDefMutation = null;\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n delete seg.component; // prevent side effects\r\n // do revert animation if hasn't changed. calls a callback when finished (whether animation or not)\r\n mouseFollower.stop(!eventDefMutation, function () {\r\n if (isDragging) {\r\n view.unrenderDrag(seg);\r\n _this.segDragStop(seg, ev);\r\n }\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n if (eventDefMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventDrop(eventInstance, eventDefMutation, el, ev);\r\n }\r\n });\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment dragging starts\r\n EventDragging.prototype.segDragStart = function (seg, ev) {\r\n this.isDragging = true;\r\n this.component.publiclyTrigger('eventDragStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment dragging stops\r\n EventDragging.prototype.segDragStop = function (seg, ev) {\r\n this.isDragging = false;\r\n this.component.publiclyTrigger('eventDragStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // DOES NOT consider overlap/constraint\r\n EventDragging.prototype.computeEventDropMutation = function (startFootprint, endFootprint, eventDef) {\r\n var eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(this.computeEventDateMutation(startFootprint, endFootprint));\r\n return eventDefMutation;\r\n };\r\n EventDragging.prototype.computeEventDateMutation = function (startFootprint, endFootprint) {\r\n var date0 = startFootprint.unzonedRange.getStart();\r\n var date1 = endFootprint.unzonedRange.getStart();\r\n var clearEnd = false;\r\n var forceTimed = false;\r\n var forceAllDay = false;\r\n var dateDelta;\r\n var dateMutation;\r\n if (startFootprint.isAllDay !== endFootprint.isAllDay) {\r\n clearEnd = true;\r\n if (endFootprint.isAllDay) {\r\n forceAllDay = true;\r\n date0.stripTime();\r\n }\r\n else {\r\n forceTimed = true;\r\n }\r\n }\r\n dateDelta = this.component.diffDates(date1, date0);\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.clearEnd = clearEnd;\r\n dateMutation.forceTimed = forceTimed;\r\n dateMutation.forceAllDay = forceAllDay;\r\n dateMutation.setDateDelta(dateDelta);\r\n return dateMutation;\r\n };\r\n return EventDragging;\r\n}(Interaction_1.default));\r\nexports.default = EventDragging;\r\n\r\n\r\n/***/ }),\r\n/* 225 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateSelecting = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateSelecting, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - renderHighlight\r\n - unrenderHighlight\r\n */\r\n function DateSelecting(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateSelecting.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateSelecting.prototype.getDelay = function () {\r\n var delay = this.opt('selectLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n DateSelecting.prototype.bindToEl = function (el) {\r\n var _this = this;\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev, {\r\n distance: _this.opt('selectMinDistance')\r\n });\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev, {\r\n delay: _this.getDelay()\r\n });\r\n }\r\n });\r\n util_1.preventSelection(el);\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day selecting.\r\n DateSelecting.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var selectionFootprint; // null if invalid selection\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n selectionFootprint = null;\r\n },\r\n dragStart: function (ev) {\r\n _this.view.unselect(ev); // since we could be rendering a new selection, we want to clear any old one\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var origHitFootprint;\r\n var hitFootprint;\r\n if (origHit) {\r\n origHitFootprint = component.getSafeHitFootprint(origHit);\r\n hitFootprint = component.getSafeHitFootprint(hit);\r\n if (origHitFootprint && hitFootprint) {\r\n selectionFootprint = _this.computeSelection(origHitFootprint, hitFootprint);\r\n }\r\n else {\r\n selectionFootprint = null;\r\n }\r\n if (selectionFootprint) {\r\n component.renderSelectionFootprint(selectionFootprint);\r\n }\r\n else if (selectionFootprint === false) {\r\n util_1.disableCursor();\r\n }\r\n }\r\n },\r\n hitOut: function () {\r\n selectionFootprint = null;\r\n component.unrenderSelection();\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n if (!isCancelled && selectionFootprint) {\r\n // the selection will already have been rendered. just report it\r\n _this.view.reportSelection(selectionFootprint, ev);\r\n }\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Given the first and last date-spans of a selection, returns another date-span object.\r\n // Subclasses can override and provide additional data in the span object. Will be passed to renderSelectionFootprint().\r\n // Will return false if the selection is invalid and this should be indicated to the user.\r\n // Will return null/undefined if a selection invalid but no error should be reported.\r\n DateSelecting.prototype.computeSelection = function (footprint0, footprint1) {\r\n var wholeFootprint = this.computeSelectionFootprint(footprint0, footprint1);\r\n if (wholeFootprint && !this.isSelectionFootprintAllowed(wholeFootprint)) {\r\n return false;\r\n }\r\n return wholeFootprint;\r\n };\r\n // Given two spans, must return the combination of the two.\r\n // TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.\r\n // Assumes both footprints are non-open-ended.\r\n DateSelecting.prototype.computeSelectionFootprint = function (footprint0, footprint1) {\r\n var ms = [\r\n footprint0.unzonedRange.startMs,\r\n footprint0.unzonedRange.endMs,\r\n footprint1.unzonedRange.startMs,\r\n footprint1.unzonedRange.endMs\r\n ];\r\n ms.sort(util_1.compareNumbers);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(ms[0], ms[3]), footprint0.isAllDay);\r\n };\r\n DateSelecting.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n return this.component.dateProfile.validUnzonedRange.containsRange(componentFootprint.unzonedRange) &&\r\n this.view.calendar.constraints.isSelectionFootprintAllowed(componentFootprint);\r\n };\r\n return DateSelecting;\r\n}(Interaction_1.default));\r\nexports.default = DateSelecting;\r\n\r\n\r\n/***/ }),\r\n/* 226 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nvar DayGrid_1 = __webpack_require__(61);\r\nvar AGENDA_ALL_DAY_EVENT_LIMIT = 5;\r\nvar agendaTimeGridMethods;\r\nvar agendaDayGridMethods;\r\n/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\r\n// Responsible for managing width/height.\r\nvar AgendaView = /** @class */ (function (_super) {\r\n tslib_1.__extends(AgendaView, _super);\r\n function AgendaView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering\r\n _this.timeGrid = _this.instantiateTimeGrid();\r\n _this.addChild(_this.timeGrid);\r\n if (_this.opt('allDaySlot')) {\r\n _this.dayGrid = _this.instantiateDayGrid(); // the all-day subcomponent of this view\r\n _this.addChild(_this.dayGrid);\r\n }\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass\r\n AgendaView.prototype.instantiateTimeGrid = function () {\r\n var timeGrid = new this.timeGridClass(this);\r\n util_1.copyOwnProps(agendaTimeGridMethods, timeGrid);\r\n return timeGrid;\r\n };\r\n // Instantiates the DayGrid object this view might need. Draws from this.dayGridClass\r\n AgendaView.prototype.instantiateDayGrid = function () {\r\n var dayGrid = new this.dayGridClass(this);\r\n util_1.copyOwnProps(agendaDayGridMethods, dayGrid);\r\n return dayGrid;\r\n };\r\n /* Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.renderSkeleton = function () {\r\n var timeGridWrapEl;\r\n var timeGridEl;\r\n this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container');\r\n timeGridEl = $('
').appendTo(timeGridWrapEl);\r\n this.el.find('.fc-body > tr > td').append(timeGridWrapEl);\r\n this.timeGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.timeGrid.setElement(timeGridEl);\r\n if (this.dayGrid) {\r\n this.dayGrid.setElement(this.el.find('.fc-day-grid'));\r\n // have the day-grid extend it's coordinate area over the
dividing the two grids\r\n this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();\r\n }\r\n };\r\n AgendaView.prototype.unrenderSkeleton = function () {\r\n this.timeGrid.removeElement();\r\n if (this.dayGrid) {\r\n this.dayGrid.removeElement();\r\n }\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid and time-grid components will render inside containers defined by this HTML.\r\n AgendaView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
' +\r\n (this.dayGrid ?\r\n '
' +\r\n '
' :\r\n '') +\r\n '
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the axis, if it is known\r\n AgendaView.prototype.axisStyleAttr = function () {\r\n if (this.axisWidth != null) {\r\n return 'style=\"width:' + this.axisWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.getNowIndicatorUnit = function () {\r\n return this.timeGrid.getNowIndicatorUnit();\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Adjusts the vertical dimensions of the view to the specified values\r\n AgendaView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit;\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n // make all axis cells line up, and record the width so newly created axis cells will have it\r\n this.axisWidth = util_1.matchCellWidths(this.el.find('.fc-axis'));\r\n // hack to give the view some height prior to timeGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS timeGrid.\r\n if (!this.timeGrid.colEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n // set of fake row elements that must compensate when scroller has scrollbars\r\n var noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)');\r\n // reset all dimensions back to the original state\r\n this.timeGrid.bottomRuleEl.hide(); // .show() will be called later if this
is necessary\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n util_1.uncompensateScroll(noScrollRowEls);\r\n // limit number of events in the all-day area\r\n if (this.dayGrid) {\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n eventLimit = this.opt('eventLimit');\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\r\n }\r\n if (eventLimit) {\r\n this.dayGrid.limitRows(eventLimit);\r\n }\r\n }\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n // make the all-day and header rows lines up\r\n util_1.compensateScroll(noScrollRowEls, scrollbarWidths);\r\n // the scrollbar compensation might have changed text flow, which might affect height, so recalculate\r\n // and reapply the desired height to the scroller.\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n // if there's any space below the slats, show the horizontal rule.\r\n // this won't cause any new overflow, because lockOverflow already called.\r\n if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {\r\n this.timeGrid.bottomRuleEl.show();\r\n }\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n AgendaView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes the initial pre-configured scroll state prior to allowing the user to change it\r\n AgendaView.prototype.computeInitialDateScroll = function () {\r\n var scrollTime = moment.duration(this.opt('scrollTime'));\r\n var top = this.timeGrid.computeTimeTop(scrollTime);\r\n // zoom can give weird floating-point values. rather scroll a little bit further\r\n top = Math.ceil(top);\r\n if (top) {\r\n top++; // to overcome top border that slots beyond the first have. looks better\r\n }\r\n return { top: top };\r\n };\r\n AgendaView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n AgendaView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n /* Hit Areas\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // forward all hit-related method calls to the grids (dayGrid might not be defined)\r\n AgendaView.prototype.getHitFootprint = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitFootprint(hit);\r\n };\r\n AgendaView.prototype.getHitEl = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitEl(hit);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.executeEventRender = function (eventsPayload) {\r\n var dayEventsPayload = {};\r\n var timedEventsPayload = {};\r\n var id;\r\n var eventInstanceGroup;\r\n // separate the events into all-day and timed\r\n for (id in eventsPayload) {\r\n eventInstanceGroup = eventsPayload[id];\r\n if (eventInstanceGroup.getEventDef().isAllDay()) {\r\n dayEventsPayload[id] = eventInstanceGroup;\r\n }\r\n else {\r\n timedEventsPayload[id] = eventInstanceGroup;\r\n }\r\n }\r\n this.timeGrid.executeEventRender(timedEventsPayload);\r\n if (this.dayGrid) {\r\n this.dayGrid.executeEventRender(dayEventsPayload);\r\n }\r\n };\r\n /* Dragging/Resizing Routing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n AgendaView.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n var renderedHelper = false;\r\n renderedHelper = this.timeGrid.renderDrag(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n renderedHelper = this.dayGrid.renderDrag(groups.allDay, seg, isTouch) || renderedHelper;\r\n }\r\n return renderedHelper;\r\n };\r\n AgendaView.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n this.timeGrid.renderEventResize(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n this.dayGrid.renderEventResize(groups.allDay, seg, isTouch);\r\n }\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection\r\n AgendaView.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (!componentFootprint.isAllDay) {\r\n this.timeGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n else if (this.dayGrid) {\r\n this.dayGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n };\r\n return AgendaView;\r\n}(View_1.default));\r\nexports.default = AgendaView;\r\nAgendaView.prototype.timeGridClass = TimeGrid_1.default;\r\nAgendaView.prototype.dayGridClass = DayGrid_1.default;\r\n// Will customize the rendering behavior of the AgendaView's timeGrid\r\nagendaTimeGridMethods = {\r\n // Generates the HTML that will go before the day-of week header cells\r\n renderHeadIntroHtml: function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var weekStart = calendar.msToUtcMoment(this.dateProfile.renderUnzonedRange.startMs, true);\r\n var weekText;\r\n if (this.opt('weekNumbers')) {\r\n weekText = weekStart.format(this.opt('smallWeekFormat'));\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt > 1 }, util_1.htmlEscape(weekText) // inner HTML\r\n ) +\r\n '';\r\n }\r\n else {\r\n return '';\r\n }\r\n },\r\n // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\n// Will customize the rendering behavior of the AgendaView's dayGrid\r\nagendaDayGridMethods = {\r\n // Generates the HTML that goes before the all-day cells\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n view.getAllDayHtml() +\r\n '' +\r\n '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\nfunction groupEventFootprintsByAllDay(eventFootprints) {\r\n var allDay = [];\r\n var timed = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventFootprints[i].componentFootprint.isAllDay) {\r\n allDay.push(eventFootprints[i]);\r\n }\r\n else {\r\n timed.push(eventFootprints[i]);\r\n }\r\n }\r\n return { allDay: allDay, timed: timed };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 227 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar TimeGridEventRenderer_1 = __webpack_require__(246);\r\nvar TimeGridHelperRenderer_1 = __webpack_require__(247);\r\nvar TimeGridFillRenderer_1 = __webpack_require__(248);\r\n/* A component that renders one or more columns of vertical time slots\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// We mixin DayTable, even though there is only a single row of days\r\n// potential nice values for the slot-duration and interval-duration\r\n// from largest to smallest\r\nvar AGENDA_STOCK_SUB_DURATIONS = [\r\n { hours: 1 },\r\n { minutes: 30 },\r\n { minutes: 15 },\r\n { seconds: 30 },\r\n { seconds: 15 }\r\n];\r\nvar TimeGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGrid, _super);\r\n function TimeGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.processOptions();\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n TimeGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByTimes(componentFootprint.unzonedRange);\r\n var i;\r\n for (i = 0; i < segs.length; i++) {\r\n if (this.isRTL) {\r\n segs[i].col = this.daysPerRow - 1 - segs[i].dayIndex;\r\n }\r\n else {\r\n segs[i].col = segs[i].dayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Handling\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.sliceRangeByTimes = function (unzonedRange) {\r\n var segs = [];\r\n var segRange;\r\n var dayIndex;\r\n for (dayIndex = 0; dayIndex < this.daysPerRow; dayIndex++) {\r\n segRange = unzonedRange.intersect(this.dayRanges[dayIndex]);\r\n if (segRange) {\r\n segs.push({\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Parses various options into properties of this object\r\n TimeGrid.prototype.processOptions = function () {\r\n var slotDuration = this.opt('slotDuration');\r\n var snapDuration = this.opt('snapDuration');\r\n var input;\r\n slotDuration = moment.duration(slotDuration);\r\n snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;\r\n this.slotDuration = slotDuration;\r\n this.snapDuration = snapDuration;\r\n this.snapsPerSlot = slotDuration / snapDuration; // TODO: ensure an integer multiple?\r\n // might be an array value (for TimelineView).\r\n // if so, getting the most granular entry (the last one probably).\r\n input = this.opt('slotLabelFormat');\r\n if ($.isArray(input)) {\r\n input = input[input.length - 1];\r\n }\r\n this.labelFormat = input ||\r\n this.opt('smallTimeFormat'); // the computed default\r\n input = this.opt('slotLabelInterval');\r\n this.labelInterval = input ?\r\n moment.duration(input) :\r\n this.computeLabelInterval(slotDuration);\r\n };\r\n // Computes an automatic value for slotLabelInterval\r\n TimeGrid.prototype.computeLabelInterval = function (slotDuration) {\r\n var i;\r\n var labelInterval;\r\n var slotsPerLabel;\r\n // find the smallest stock label interval that results in more than one slots-per-label\r\n for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {\r\n labelInterval = moment.duration(AGENDA_STOCK_SUB_DURATIONS[i]);\r\n slotsPerLabel = util_1.divideDurationByDuration(labelInterval, slotDuration);\r\n if (util_1.isInt(slotsPerLabel) && slotsPerLabel > 1) {\r\n return labelInterval;\r\n }\r\n }\r\n return moment.duration(slotDuration); // fall back. clone\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderSlats();\r\n this.renderColumns();\r\n };\r\n TimeGrid.prototype.unrenderDates = function () {\r\n // this.unrenderSlats(); // don't need this because repeated .html() calls clear\r\n this.unrenderColumns();\r\n };\r\n TimeGrid.prototype.renderSkeleton = function () {\r\n var theme = this.view.calendar.theme;\r\n this.el.html('
' +\r\n '
' +\r\n '
');\r\n this.bottomRuleEl = this.el.find('hr');\r\n };\r\n TimeGrid.prototype.renderSlats = function () {\r\n var theme = this.view.calendar.theme;\r\n this.slatContainerEl = this.el.find('> .fc-slats')\r\n .html(// avoids needing ::unrenderSlats()\r\n '' +\r\n this.renderSlatRowHtml() +\r\n '
');\r\n this.slatEls = this.slatContainerEl.find('tr');\r\n this.slatCoordCache = new CoordCache_1.default({\r\n els: this.slatEls,\r\n isVertical: true\r\n });\r\n };\r\n // Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\r\n TimeGrid.prototype.renderSlatRowHtml = function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var isRTL = this.isRTL;\r\n var dateProfile = this.dateProfile;\r\n var html = '';\r\n var slotTime = moment.duration(+dateProfile.minTime); // wish there was .clone() for durations\r\n var slotIterator = moment.duration(0);\r\n var slotDate; // will be on the view's first day, but we only care about its time\r\n var isLabeled;\r\n var axisHtml;\r\n // Calculate the time for each slot\r\n while (slotTime < dateProfile.maxTime) {\r\n slotDate = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs).time(slotTime);\r\n isLabeled = util_1.isInt(util_1.divideDurationByDuration(slotIterator, this.labelInterval));\r\n axisHtml =\r\n '' +\r\n (isLabeled ?\r\n '' + // for matchCellWidths\r\n util_1.htmlEscape(slotDate.format(this.labelFormat)) +\r\n '' :\r\n '') +\r\n '';\r\n html +=\r\n '' +\r\n (!isRTL ? axisHtml : '') +\r\n '' +\r\n (isRTL ? axisHtml : '') +\r\n '';\r\n slotTime.add(this.slotDuration);\r\n slotIterator.add(this.slotDuration);\r\n }\r\n return html;\r\n };\r\n TimeGrid.prototype.renderColumns = function () {\r\n var dateProfile = this.dateProfile;\r\n var theme = this.view.calendar.theme;\r\n this.dayRanges = this.dayDates.map(function (dayDate) {\r\n return new UnzonedRange_1.default(dayDate.clone().add(dateProfile.minTime), dayDate.clone().add(dateProfile.maxTime));\r\n });\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n this.el.find('> .fc-bg').html('' +\r\n this.renderBgTrHtml(0) + // row=0\r\n '
');\r\n this.colEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.colEls,\r\n isHorizontal: true\r\n });\r\n this.renderContentSkeleton();\r\n };\r\n TimeGrid.prototype.unrenderColumns = function () {\r\n this.unrenderContentSkeleton();\r\n };\r\n /* Content Skeleton\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders the DOM that the view's content will live in\r\n TimeGrid.prototype.renderContentSkeleton = function () {\r\n var cellHtml = '';\r\n var i;\r\n var skeletonEl;\r\n for (i = 0; i < this.colCnt; i++) {\r\n cellHtml +=\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '';\r\n }\r\n skeletonEl = this.contentSkeletonEl = $('
' +\r\n '' +\r\n '' + cellHtml + '' +\r\n '
' +\r\n '
');\r\n this.colContainerEls = skeletonEl.find('.fc-content-col');\r\n this.helperContainerEls = skeletonEl.find('.fc-helper-container');\r\n this.fgContainerEls = skeletonEl.find('.fc-event-container:not(.fc-helper-container)');\r\n this.bgContainerEls = skeletonEl.find('.fc-bgevent-container');\r\n this.highlightContainerEls = skeletonEl.find('.fc-highlight-container');\r\n this.businessContainerEls = skeletonEl.find('.fc-business-container');\r\n this.bookendCells(skeletonEl.find('tr')); // TODO: do this on string level\r\n this.el.append(skeletonEl);\r\n };\r\n TimeGrid.prototype.unrenderContentSkeleton = function () {\r\n if (this.contentSkeletonEl) {\r\n this.contentSkeletonEl.remove();\r\n this.contentSkeletonEl = null;\r\n this.colContainerEls = null;\r\n this.helperContainerEls = null;\r\n this.fgContainerEls = null;\r\n this.bgContainerEls = null;\r\n this.highlightContainerEls = null;\r\n this.businessContainerEls = null;\r\n }\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\r\n TimeGrid.prototype.groupSegsByCol = function (segs) {\r\n var segsByCol = [];\r\n var i;\r\n for (i = 0; i < this.colCnt; i++) {\r\n segsByCol.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segsByCol[segs[i].col].push(segs[i]);\r\n }\r\n return segsByCol;\r\n };\r\n // Given segments grouped by column, insert the segments' elements into a parallel array of container\r\n // elements, each living within a column.\r\n TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {\r\n var col;\r\n var segs;\r\n var i;\r\n for (col = 0; col < this.colCnt; col++) {\r\n segs = segsByCol[col];\r\n for (i = 0; i < segs.length; i++) {\r\n containerEls.eq(col).append(segs[i].el);\r\n }\r\n }\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.getNowIndicatorUnit = function () {\r\n return 'minute'; // will refresh on the minute\r\n };\r\n TimeGrid.prototype.renderNowIndicator = function (date) {\r\n // HACK: if date columns not ready for some reason (scheduler)\r\n if (!this.colContainerEls) {\r\n return;\r\n }\r\n // seg system might be overkill, but it handles scenario where line needs to be rendered\r\n // more than once because of columns with the same date (resources columns for example)\r\n var segs = this.componentFootprintToSegs(new ComponentFootprint_1.default(new UnzonedRange_1.default(date, date.valueOf() + 1), // protect against null range\r\n false // all-day\r\n ));\r\n var top = this.computeDateTop(date, date);\r\n var nodes = [];\r\n var i;\r\n // render lines within the columns\r\n for (i = 0; i < segs.length; i++) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.colContainerEls.eq(segs[i].col))[0]);\r\n }\r\n // render an arrow over the axis\r\n if (segs.length > 0) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.el.find('.fc-content-skeleton'))[0]);\r\n }\r\n this.nowIndicatorEls = $(nodes);\r\n };\r\n TimeGrid.prototype.unrenderNowIndicator = function () {\r\n if (this.nowIndicatorEls) {\r\n this.nowIndicatorEls.remove();\r\n this.nowIndicatorEls = null;\r\n }\r\n };\r\n /* Coordinates\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.slatCoordCache.build();\r\n if (isResize) {\r\n this.updateSegVerticals([].concat(this.eventRenderer.getSegs(), this.businessSegs || []));\r\n }\r\n };\r\n TimeGrid.prototype.getTotalSlatHeight = function () {\r\n return this.slatContainerEl.outerHeight();\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given date.\r\n // `ms` can be a millisecond UTC time OR a UTC moment.\r\n // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\r\n TimeGrid.prototype.computeDateTop = function (ms, startOfDayDate) {\r\n return this.computeTimeTop(moment.duration(ms - startOfDayDate.clone().stripTime()));\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\r\n TimeGrid.prototype.computeTimeTop = function (time) {\r\n var len = this.slatEls.length;\r\n var dateProfile = this.dateProfile;\r\n var slatCoverage = (time - dateProfile.minTime) / this.slotDuration; // floating-point value of # of slots covered\r\n var slatIndex;\r\n var slatRemainder;\r\n // compute a floating-point number for how many slats should be progressed through.\r\n // from 0 to number of slats (inclusive)\r\n // constrained because minTime/maxTime might be customized.\r\n slatCoverage = Math.max(0, slatCoverage);\r\n slatCoverage = Math.min(len, slatCoverage);\r\n // an integer index of the furthest whole slat\r\n // from 0 to number slats (*exclusive*, so len-1)\r\n slatIndex = Math.floor(slatCoverage);\r\n slatIndex = Math.min(slatIndex, len - 1);\r\n // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.\r\n // could be 1.0 if slatCoverage is covering *all* the slots\r\n slatRemainder = slatCoverage - slatIndex;\r\n return this.slatCoordCache.getTopPosition(slatIndex) +\r\n this.slatCoordCache.getHeight(slatIndex) * slatRemainder;\r\n };\r\n // Refreshes the CSS top/bottom coordinates for each segment element.\r\n // Works when called after initial render, after a window resize/zoom for example.\r\n TimeGrid.prototype.updateSegVerticals = function (segs) {\r\n this.computeSegVerticals(segs);\r\n this.assignSegVerticals(segs);\r\n };\r\n // For each segment in an array, computes and assigns its top and bottom properties\r\n TimeGrid.prototype.computeSegVerticals = function (segs) {\r\n var eventMinHeight = this.opt('agendaEventMinHeight');\r\n var i;\r\n var seg;\r\n var dayDate;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n dayDate = this.dayDates[seg.dayIndex];\r\n seg.top = this.computeDateTop(seg.startMs, dayDate);\r\n seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.endMs, dayDate));\r\n }\r\n };\r\n // Given segments that already have their top/bottom properties computed, applies those values to\r\n // the segments' elements.\r\n TimeGrid.prototype.assignSegVerticals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateSegVerticalCss(seg));\r\n }\r\n };\r\n // Generates an object with CSS properties for the top/bottom coordinates of a segment element\r\n TimeGrid.prototype.generateSegVerticalCss = function (seg) {\r\n return {\r\n top: seg.top,\r\n bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\r\n };\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.slatCoordCache.build();\r\n };\r\n TimeGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n // NOTE: don't clear slatCoordCache because we rely on it for computeTimeTop\r\n };\r\n TimeGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n var snapsPerSlot = this.snapsPerSlot;\r\n var colCoordCache = this.colCoordCache;\r\n var slatCoordCache = this.slatCoordCache;\r\n if (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {\r\n var colIndex = colCoordCache.getHorizontalIndex(leftOffset);\r\n var slatIndex = slatCoordCache.getVerticalIndex(topOffset);\r\n if (colIndex != null && slatIndex != null) {\r\n var slatTop = slatCoordCache.getTopOffset(slatIndex);\r\n var slatHeight = slatCoordCache.getHeight(slatIndex);\r\n var partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1\r\n var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat\r\n var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;\r\n var snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;\r\n var snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;\r\n return {\r\n col: colIndex,\r\n snap: snapIndex,\r\n component: this,\r\n left: colCoordCache.getLeftOffset(colIndex),\r\n right: colCoordCache.getRightOffset(colIndex),\r\n top: snapTop,\r\n bottom: snapBottom\r\n };\r\n }\r\n }\r\n };\r\n TimeGrid.prototype.getHitFootprint = function (hit) {\r\n var start = this.getCellDate(0, hit.col); // row=0\r\n var time = this.computeSnapTime(hit.snap); // pass in the snap-index\r\n var end;\r\n start.time(time);\r\n end = start.clone().add(this.snapDuration);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), false // all-day?\r\n );\r\n };\r\n // Given a row number of the grid, representing a \"snap\", returns a time (Duration) from its start-of-day\r\n TimeGrid.prototype.computeSnapTime = function (snapIndex) {\r\n return moment.duration(this.dateProfile.minTime + this.snapDuration * snapIndex);\r\n };\r\n TimeGrid.prototype.getHitEl = function (hit) {\r\n return this.colEls.eq(hit.col);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being dragged over the specified date(s).\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n TimeGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n if (seg) {\r\n if (eventFootprints.length) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n // signal that a helper has been rendered\r\n return true;\r\n }\r\n }\r\n else {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n }\r\n };\r\n // Unrenders any visual indication of an event being dragged\r\n TimeGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n TimeGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders any visual indication of an event being resized\r\n TimeGrid.prototype.unrenderEventResize = function () {\r\n this.helperRenderer.unrender();\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\r\n TimeGrid.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (this.opt('selectHelper')) {\r\n this.helperRenderer.renderComponentFootprint(componentFootprint);\r\n }\r\n else {\r\n this.renderHighlight(componentFootprint);\r\n }\r\n };\r\n // Unrenders any visual indication of a selection\r\n TimeGrid.prototype.unrenderSelection = function () {\r\n this.helperRenderer.unrender();\r\n this.unrenderHighlight();\r\n };\r\n return TimeGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = TimeGrid;\r\nTimeGrid.prototype.eventRendererClass = TimeGridEventRenderer_1.default;\r\nTimeGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nTimeGrid.prototype.helperRendererClass = TimeGridHelperRenderer_1.default;\r\nTimeGrid.prototype.fillRendererClass = TimeGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(TimeGrid);\r\nDayTableMixin_1.default.mixInto(TimeGrid);\r\n\r\n\r\n/***/ }),\r\n/* 228 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar BasicViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicViewDateProfileGenerator, _super);\r\n function BasicViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n BasicViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay); // an UnzonedRange\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n // year and month views should be aligned with weeks. this is already done for week\r\n if (/^(year|month)$/.test(currentRangeUnit)) {\r\n start.startOf('week');\r\n // make end-of-week if not already\r\n if (end.weekday()) {\r\n end.add(1, 'week').startOf('week'); // exclusively move backwards\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return BasicViewDateProfileGenerator;\r\n}(DateProfileGenerator_1.default));\r\nexports.default = BasicViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 229 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthViewDateProfileGenerator_1 = __webpack_require__(253);\r\n/* A month view with day cells running in rows (one-per-week) and columns\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MonthView = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthView, _super);\r\n function MonthView() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Overrides the default BasicView behavior to have special multi-week auto-height logic\r\n MonthView.prototype.setGridHeight = function (height, isAuto) {\r\n // if auto, make the height of each row the height that it would be if there were 6 weeks\r\n if (isAuto) {\r\n height *= this.dayGrid.rowCnt / 6;\r\n }\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\r\n };\r\n MonthView.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return date.month() !== moment.utc(dateProfile.currentUnzonedRange.startMs).month(); // TODO: optimize\r\n };\r\n return MonthView;\r\n}(BasicView_1.default));\r\nexports.default = MonthView;\r\nMonthView.prototype.dateProfileGeneratorClass = MonthViewDateProfileGenerator_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 230 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar View_1 = __webpack_require__(41);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar ListEventRenderer_1 = __webpack_require__(254);\r\nvar ListEventPointing_1 = __webpack_require__(255);\r\n/*\r\nResponsible for the scroller, and forwarding event-related actions into the \"grid\".\r\n*/\r\nvar ListView = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListView, _super);\r\n function ListView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.segSelector = '.fc-list-item'; // which elements accept event actions\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n ListView.prototype.renderSkeleton = function () {\r\n this.el.addClass('fc-list-view ' +\r\n this.calendar.theme.getClass('listView'));\r\n this.scroller.render();\r\n this.scroller.el.appendTo(this.el);\r\n this.contentEl = this.scroller.scrollEl; // shortcut\r\n };\r\n ListView.prototype.unrenderSkeleton = function () {\r\n this.scroller.destroy(); // will remove the Grid too\r\n };\r\n ListView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n if (!isAuto) {\r\n this.scroller.setHeight(this.computeScrollerHeight(totalHeight));\r\n }\r\n };\r\n ListView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n ListView.prototype.renderDates = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var dayStart = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs, true);\r\n var viewEnd = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.endMs, true);\r\n var dayDates = [];\r\n var dayRanges = [];\r\n while (dayStart < viewEnd) {\r\n dayDates.push(dayStart.clone());\r\n dayRanges.push(new UnzonedRange_1.default(dayStart, dayStart.clone().add(1, 'day')));\r\n dayStart.add(1, 'day');\r\n }\r\n this.dayDates = dayDates;\r\n this.dayRanges = dayRanges;\r\n // all real rendering happens in EventRenderer\r\n };\r\n // slices by day\r\n ListView.prototype.componentFootprintToSegs = function (footprint) {\r\n var dayRanges = this.dayRanges;\r\n var dayIndex;\r\n var segRange;\r\n var seg;\r\n var segs = [];\r\n for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {\r\n segRange = footprint.unzonedRange.intersect(dayRanges[dayIndex]);\r\n if (segRange) {\r\n seg = {\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n };\r\n segs.push(seg);\r\n // detect when footprint won't go fully into the next day,\r\n // and mutate the latest seg to the be the end.\r\n if (!seg.isEnd && !footprint.isAllDay &&\r\n dayIndex + 1 < dayRanges.length &&\r\n footprint.unzonedRange.endMs < dayRanges[dayIndex + 1].startMs + this.nextDayThreshold) {\r\n seg.endMs = footprint.unzonedRange.endMs;\r\n seg.isEnd = true;\r\n break;\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n ListView.prototype.renderEmptyMessage = function () {\r\n this.contentEl.html('
' + // TODO: try less wraps\r\n '
' +\r\n '
' +\r\n util_1.htmlEscape(this.opt('noEventsMessage')) +\r\n '
' +\r\n '
' +\r\n '
');\r\n };\r\n // render the event segments in the view\r\n ListView.prototype.renderSegList = function (allSegs) {\r\n var segsByDay = this.groupSegsByDay(allSegs); // sparse array\r\n var dayIndex;\r\n var daySegs;\r\n var i;\r\n var tableEl = $('
');\r\n var tbodyEl = tableEl.find('tbody');\r\n for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {\r\n daySegs = segsByDay[dayIndex];\r\n if (daySegs) {\r\n // append a day header\r\n tbodyEl.append(this.dayHeaderHtml(this.dayDates[dayIndex]));\r\n this.eventRenderer.sortEventSegs(daySegs);\r\n for (i = 0; i < daySegs.length; i++) {\r\n tbodyEl.append(daySegs[i].el); // append event row\r\n }\r\n }\r\n }\r\n this.contentEl.empty().append(tableEl);\r\n };\r\n // Returns a sparse array of arrays, segs grouped by their dayIndex\r\n ListView.prototype.groupSegsByDay = function (segs) {\r\n var segsByDay = []; // sparse array\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))\r\n .push(seg);\r\n }\r\n return segsByDay;\r\n };\r\n // generates the HTML for the day headers that live amongst the event rows\r\n ListView.prototype.dayHeaderHtml = function (dayDate) {\r\n var mainFormat = this.opt('listDayFormat');\r\n var altFormat = this.opt('listDayAltFormat');\r\n return '' +\r\n '' +\r\n (mainFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-main' }, util_1.htmlEscape(dayDate.format(mainFormat)) // inner HTML\r\n ) :\r\n '') +\r\n (altFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-alt' }, util_1.htmlEscape(dayDate.format(altFormat)) // inner HTML\r\n ) :\r\n '') +\r\n '' +\r\n '';\r\n };\r\n return ListView;\r\n}(View_1.default));\r\nexports.default = ListView;\r\nListView.prototype.eventRendererClass = ListEventRenderer_1.default;\r\nListView.prototype.eventPointingClass = ListEventPointing_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 231 */,\r\n/* 232 */,\r\n/* 233 */,\r\n/* 234 */,\r\n/* 235 */,\r\n/* 236 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar Calendar_1 = __webpack_require__(220);\r\n// for intentional side-effects\r\n__webpack_require__(10);\r\n__webpack_require__(47);\r\n__webpack_require__(256);\r\n__webpack_require__(257);\r\n__webpack_require__(260);\r\n__webpack_require__(261);\r\n__webpack_require__(262);\r\n__webpack_require__(263);\r\n$.fullCalendar = exportHooks;\r\n$.fn.fullCalendar = function (options) {\r\n var args = Array.prototype.slice.call(arguments, 1); // for a possible method call\r\n var res = this; // what this function will return (this jQuery object by default)\r\n this.each(function (i, _element) {\r\n var element = $(_element);\r\n var calendar = element.data('fullCalendar'); // get the existing calendar object (if any)\r\n var singleRes; // the returned value of this single method call\r\n // a method call\r\n if (typeof options === 'string') {\r\n if (options === 'getCalendar') {\r\n if (!i) {\r\n res = calendar;\r\n }\r\n }\r\n else if (options === 'destroy') {\r\n if (calendar) {\r\n calendar.destroy();\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else if (!calendar) {\r\n util_1.warn('Attempting to call a FullCalendar method on an element with no calendar.');\r\n }\r\n else if ($.isFunction(calendar[options])) {\r\n singleRes = calendar[options].apply(calendar, args);\r\n if (!i) {\r\n res = singleRes; // record the first method call result\r\n }\r\n if (options === 'destroy') {\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else {\r\n util_1.warn(\"'\" + options + \"' is an unknown FullCalendar method.\");\r\n }\r\n }\r\n else if (!calendar) {\r\n calendar = new Calendar_1.default(element, options);\r\n element.data('fullCalendar', calendar);\r\n calendar.render();\r\n }\r\n });\r\n return res;\r\n};\r\nmodule.exports = exportHooks;\r\n\r\n\r\n/***/ }),\r\n/* 237 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Model_1 = __webpack_require__(48);\r\nvar Component = /** @class */ (function (_super) {\r\n tslib_1.__extends(Component, _super);\r\n function Component() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Component.prototype.setElement = function (el) {\r\n this.el = el;\r\n this.bindGlobalHandlers();\r\n this.renderSkeleton();\r\n this.set('isInDom', true);\r\n };\r\n Component.prototype.removeElement = function () {\r\n this.unset('isInDom');\r\n this.unrenderSkeleton();\r\n this.unbindGlobalHandlers();\r\n this.el.remove();\r\n // NOTE: don't null-out this.el in case the View was destroyed within an API callback.\r\n // We don't null-out the View's other jQuery element references upon destroy,\r\n // so we shouldn't kill this.el either.\r\n };\r\n Component.prototype.bindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n Component.prototype.unbindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n /*\r\n NOTE: Can't have a `render` method. Read the deprecation notice in View::executeDateRender\r\n */\r\n // Renders the basic structure of the view before any content is rendered\r\n Component.prototype.renderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n // Unrenders the basic structure of the view\r\n Component.prototype.unrenderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n return Component;\r\n}(Model_1.default));\r\nexports.default = Component;\r\n\r\n\r\n/***/ }),\r\n/* 238 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Iterator = /** @class */ (function () {\r\n function Iterator(items) {\r\n this.items = items || [];\r\n }\r\n /* Calls a method on every item passing the arguments through */\r\n Iterator.prototype.proxyCall = function (methodName) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n var results = [];\r\n this.items.forEach(function (item) {\r\n results.push(item[methodName].apply(item, args));\r\n });\r\n return results;\r\n };\r\n return Iterator;\r\n}());\r\nexports.default = Iterator;\r\n\r\n\r\n/***/ }),\r\n/* 239 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/* Toolbar with buttons and title\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar Toolbar = /** @class */ (function () {\r\n function Toolbar(calendar, toolbarOptions) {\r\n this.el = null; // mirrors local `el`\r\n this.viewsWithButtons = [];\r\n this.calendar = calendar;\r\n this.toolbarOptions = toolbarOptions;\r\n }\r\n // method to update toolbar-specific options, not calendar-wide options\r\n Toolbar.prototype.setToolbarOptions = function (newToolbarOptions) {\r\n this.toolbarOptions = newToolbarOptions;\r\n };\r\n // can be called repeatedly and will rerender\r\n Toolbar.prototype.render = function () {\r\n var sections = this.toolbarOptions.layout;\r\n var el = this.el;\r\n if (sections) {\r\n if (!el) {\r\n el = this.el = $(\"
\");\r\n }\r\n else {\r\n el.empty();\r\n }\r\n el.append(this.renderSection('left'))\r\n .append(this.renderSection('right'))\r\n .append(this.renderSection('center'))\r\n .append('
');\r\n }\r\n else {\r\n this.removeElement();\r\n }\r\n };\r\n Toolbar.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n Toolbar.prototype.renderSection = function (position) {\r\n var _this = this;\r\n var calendar = this.calendar;\r\n var theme = calendar.theme;\r\n var optionsManager = calendar.optionsManager;\r\n var viewSpecManager = calendar.viewSpecManager;\r\n var sectionEl = $('
');\r\n var buttonStr = this.toolbarOptions.layout[position];\r\n var calendarCustomButtons = optionsManager.get('customButtons') || {};\r\n var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};\r\n var calendarButtonText = optionsManager.get('buttonText') || {};\r\n if (buttonStr) {\r\n $.each(buttonStr.split(' '), function (i, buttonGroupStr) {\r\n var groupChildren = $();\r\n var isOnlyButtons = true;\r\n var groupEl;\r\n $.each(buttonGroupStr.split(','), function (j, buttonName) {\r\n var customButtonProps;\r\n var viewSpec;\r\n var buttonClick;\r\n var buttonIcon; // only one of these will be set\r\n var buttonText; // \"\r\n var buttonInnerHtml;\r\n var buttonClasses;\r\n var buttonEl;\r\n var buttonAriaAttr;\r\n if (buttonName === 'title') {\r\n groupChildren = groupChildren.add($('

 

')); // we always want it to take up height\r\n isOnlyButtons = false;\r\n }\r\n else {\r\n if ((customButtonProps = calendarCustomButtons[buttonName])) {\r\n buttonClick = function (ev) {\r\n if (customButtonProps.click) {\r\n customButtonProps.click.call(buttonEl[0], ev);\r\n }\r\n };\r\n (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = customButtonProps.text);\r\n }\r\n else if ((viewSpec = viewSpecManager.getViewSpec(buttonName))) {\r\n _this.viewsWithButtons.push(buttonName);\r\n buttonClick = function () {\r\n calendar.changeView(buttonName);\r\n };\r\n (buttonText = viewSpec.buttonTextOverride) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = viewSpec.buttonTextDefault);\r\n }\r\n else if (calendar[buttonName]) {\r\n buttonClick = function () {\r\n calendar[buttonName]();\r\n };\r\n (buttonText = calendarButtonTextOverrides[buttonName]) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = calendarButtonText[buttonName]);\r\n // ^ everything else is considered default\r\n }\r\n if (buttonClick) {\r\n buttonClasses = [\r\n 'fc-' + buttonName + '-button',\r\n theme.getClass('button'),\r\n theme.getClass('stateDefault')\r\n ];\r\n if (buttonText) {\r\n buttonInnerHtml = util_1.htmlEscape(buttonText);\r\n buttonAriaAttr = '';\r\n }\r\n else if (buttonIcon) {\r\n buttonInnerHtml = \"\";\r\n buttonAriaAttr = ' aria-label=\"' + buttonName + '\"';\r\n }\r\n buttonEl = $(// type=\"button\" so that it doesn't submit a form\r\n '')\r\n .click(function (ev) {\r\n // don't process clicks for disabled buttons\r\n if (!buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonClick(ev);\r\n // after the click action, if the button becomes the \"active\" tab, or disabled,\r\n // it should never have a hover class, so remove it now.\r\n if (buttonEl.hasClass(theme.getClass('stateActive')) ||\r\n buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonEl.removeClass(theme.getClass('stateHover'));\r\n }\r\n }\r\n })\r\n .mousedown(function () {\r\n // the *down* effect (mouse pressed in).\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateDown'));\r\n })\r\n .mouseup(function () {\r\n // undo the *down* effect\r\n buttonEl.removeClass(theme.getClass('stateDown'));\r\n })\r\n .hover(function () {\r\n // the *hover* effect.\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateHover'));\r\n }, function () {\r\n // undo the *hover* effect\r\n buttonEl\r\n .removeClass(theme.getClass('stateHover'))\r\n .removeClass(theme.getClass('stateDown')); // if mouseleave happens before mouseup\r\n });\r\n groupChildren = groupChildren.add(buttonEl);\r\n }\r\n }\r\n });\r\n if (isOnlyButtons) {\r\n groupChildren\r\n .first().addClass(theme.getClass('cornerLeft')).end()\r\n .last().addClass(theme.getClass('cornerRight')).end();\r\n }\r\n if (groupChildren.length > 1) {\r\n groupEl = $('
');\r\n if (isOnlyButtons) {\r\n groupEl.addClass(theme.getClass('buttonGroup'));\r\n }\r\n groupEl.append(groupChildren);\r\n sectionEl.append(groupEl);\r\n }\r\n else {\r\n sectionEl.append(groupChildren); // 1 or 0 children\r\n }\r\n });\r\n }\r\n return sectionEl;\r\n };\r\n Toolbar.prototype.updateTitle = function (text) {\r\n if (this.el) {\r\n this.el.find('h2').text(text);\r\n }\r\n };\r\n Toolbar.prototype.activateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .addClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.deactivateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .removeClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.disableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', true)\r\n .addClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.enableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', false)\r\n .removeClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.getViewsWithButtons = function () {\r\n return this.viewsWithButtons;\r\n };\r\n return Toolbar;\r\n}());\r\nexports.default = Toolbar;\r\n\r\n\r\n/***/ }),\r\n/* 240 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar Model_1 = __webpack_require__(48);\r\nvar OptionsManager = /** @class */ (function (_super) {\r\n tslib_1.__extends(OptionsManager, _super);\r\n function OptionsManager(_calendar, overrides) {\r\n var _this = _super.call(this) || this;\r\n _this._calendar = _calendar;\r\n _this.overrides = $.extend({}, overrides); // make a copy\r\n _this.dynamicOverrides = {};\r\n _this.compute();\r\n return _this;\r\n }\r\n OptionsManager.prototype.add = function (newOptionHash) {\r\n var optionCnt = 0;\r\n var optionName;\r\n this.recordOverrides(newOptionHash); // will trigger this model's watchers\r\n for (optionName in newOptionHash) {\r\n optionCnt++;\r\n }\r\n // special-case handling of single option change.\r\n // if only one option change, `optionName` will be its name.\r\n if (optionCnt === 1) {\r\n if (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') {\r\n this._calendar.updateViewSize(true); // isResize=true\r\n return;\r\n }\r\n else if (optionName === 'defaultDate') {\r\n return; // can't change date this way. use gotoDate instead\r\n }\r\n else if (optionName === 'businessHours') {\r\n return; // this model already reacts to this\r\n }\r\n else if (/^(event|select)(Overlap|Constraint|Allow)$/.test(optionName)) {\r\n return; // doesn't affect rendering. only interactions.\r\n }\r\n else if (optionName === 'timezone') {\r\n this._calendar.view.flash('initialEvents');\r\n return;\r\n }\r\n }\r\n // catch-all. rerender the header and footer and rebuild/rerender the current view\r\n this._calendar.renderHeader();\r\n this._calendar.renderFooter();\r\n // even non-current views will be affected by this option change. do before rerender\r\n // TODO: detangle\r\n this._calendar.viewsByType = {};\r\n this._calendar.reinitView();\r\n };\r\n // Computes the flattened options hash for the calendar and assigns to `this.options`.\r\n // Assumes this.overrides and this.dynamicOverrides have already been initialized.\r\n OptionsManager.prototype.compute = function () {\r\n var locale;\r\n var localeDefaults;\r\n var isRTL;\r\n var dirDefaults;\r\n var rawOptions;\r\n locale = util_1.firstDefined(// explicit locale option given?\r\n this.dynamicOverrides.locale, this.overrides.locale);\r\n localeDefaults = locale_1.localeOptionHash[locale];\r\n if (!localeDefaults) {\r\n locale = options_1.globalDefaults.locale;\r\n localeDefaults = locale_1.localeOptionHash[locale] || {};\r\n }\r\n isRTL = util_1.firstDefined(// based on options computed so far, is direction RTL?\r\n this.dynamicOverrides.isRTL, this.overrides.isRTL, localeDefaults.isRTL, options_1.globalDefaults.isRTL);\r\n dirDefaults = isRTL ? options_1.rtlDefaults : {};\r\n this.dirDefaults = dirDefaults;\r\n this.localeDefaults = localeDefaults;\r\n rawOptions = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n dirDefaults,\r\n localeDefaults,\r\n this.overrides,\r\n this.dynamicOverrides\r\n ]);\r\n locale_1.populateInstanceComputableOptions(rawOptions); // fill in gaps with computed options\r\n this.reset(rawOptions);\r\n };\r\n // stores the new options internally, but does not rerender anything.\r\n OptionsManager.prototype.recordOverrides = function (newOptionHash) {\r\n var optionName;\r\n for (optionName in newOptionHash) {\r\n this.dynamicOverrides[optionName] = newOptionHash[optionName];\r\n }\r\n this._calendar.viewSpecManager.clearCache(); // the dynamic override invalidates the options in this cache, so just clear it\r\n this.compute(); // this.options needs to be recomputed after the dynamic override\r\n };\r\n return OptionsManager;\r\n}(Model_1.default));\r\nexports.default = OptionsManager;\r\n\r\n\r\n/***/ }),\r\n/* 241 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar ViewSpecManager = /** @class */ (function () {\r\n function ViewSpecManager(optionsManager, _calendar) {\r\n this.optionsManager = optionsManager;\r\n this._calendar = _calendar;\r\n this.clearCache();\r\n }\r\n ViewSpecManager.prototype.clearCache = function () {\r\n this.viewSpecCache = {};\r\n };\r\n // Gets information about how to create a view. Will use a cache.\r\n ViewSpecManager.prototype.getViewSpec = function (viewType) {\r\n var cache = this.viewSpecCache;\r\n return cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));\r\n };\r\n // Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\r\n // Preference is given to views that have corresponding buttons.\r\n ViewSpecManager.prototype.getUnitViewSpec = function (unit) {\r\n var viewTypes;\r\n var i;\r\n var spec;\r\n if ($.inArray(unit, util_1.unitsDesc) !== -1) {\r\n // put views that have buttons first. there will be duplicates, but oh well\r\n viewTypes = this._calendar.header.getViewsWithButtons(); // TODO: include footer as well?\r\n $.each(ViewRegistry_1.viewHash, function (viewType) {\r\n viewTypes.push(viewType);\r\n });\r\n for (i = 0; i < viewTypes.length; i++) {\r\n spec = this.getViewSpec(viewTypes[i]);\r\n if (spec) {\r\n if (spec.singleUnit === unit) {\r\n return spec;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n // Builds an object with information on how to create a given view\r\n ViewSpecManager.prototype.buildViewSpec = function (requestedViewType) {\r\n var viewOverrides = this.optionsManager.overrides.views || {};\r\n var specChain = []; // for the view. lowest to highest priority\r\n var defaultsChain = []; // for the view. lowest to highest priority\r\n var overridesChain = []; // for the view. lowest to highest priority\r\n var viewType = requestedViewType;\r\n var spec; // for the view\r\n var overrides; // for the view\r\n var durationInput;\r\n var duration;\r\n var unit;\r\n // iterate from the specific view definition to a more general one until we hit an actual View class\r\n while (viewType) {\r\n spec = ViewRegistry_1.viewHash[viewType];\r\n overrides = viewOverrides[viewType];\r\n viewType = null; // clear. might repopulate for another iteration\r\n if (typeof spec === 'function') {\r\n spec = { 'class': spec };\r\n }\r\n if (spec) {\r\n specChain.unshift(spec);\r\n defaultsChain.unshift(spec.defaults || {});\r\n durationInput = durationInput || spec.duration;\r\n viewType = viewType || spec.type;\r\n }\r\n if (overrides) {\r\n overridesChain.unshift(overrides); // view-specific option hashes have options at zero-level\r\n durationInput = durationInput || overrides.duration;\r\n viewType = viewType || overrides.type;\r\n }\r\n }\r\n spec = util_1.mergeProps(specChain);\r\n spec.type = requestedViewType;\r\n if (!spec['class']) {\r\n return false;\r\n }\r\n // fall back to top-level `duration` option\r\n durationInput = durationInput ||\r\n this.optionsManager.dynamicOverrides.duration ||\r\n this.optionsManager.overrides.duration;\r\n if (durationInput) {\r\n duration = moment.duration(durationInput);\r\n if (duration.valueOf()) {\r\n unit = util_1.computeDurationGreatestUnit(duration, durationInput);\r\n spec.duration = duration;\r\n spec.durationUnit = unit;\r\n // view is a single-unit duration, like \"week\" or \"day\"\r\n // incorporate options for this. lowest priority\r\n if (duration.as(unit) === 1) {\r\n spec.singleUnit = unit;\r\n overridesChain.unshift(viewOverrides[unit] || {});\r\n }\r\n }\r\n }\r\n spec.defaults = options_1.mergeOptions(defaultsChain);\r\n spec.overrides = options_1.mergeOptions(overridesChain);\r\n this.buildViewSpecOptions(spec);\r\n this.buildViewSpecButtonText(spec, requestedViewType);\r\n return spec;\r\n };\r\n // Builds and assigns a view spec's options object from its already-assigned defaults and overrides\r\n ViewSpecManager.prototype.buildViewSpecOptions = function (spec) {\r\n var optionsManager = this.optionsManager;\r\n spec.options = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n spec.defaults,\r\n optionsManager.dirDefaults,\r\n optionsManager.localeDefaults,\r\n optionsManager.overrides,\r\n spec.overrides,\r\n optionsManager.dynamicOverrides // dynamically set via setter. highest precedence\r\n ]);\r\n locale_1.populateInstanceComputableOptions(spec.options);\r\n };\r\n // Computes and assigns a view spec's buttonText-related options\r\n ViewSpecManager.prototype.buildViewSpecButtonText = function (spec, requestedViewType) {\r\n var optionsManager = this.optionsManager;\r\n // given an options object with a possible `buttonText` hash, lookup the buttonText for the\r\n // requested view, falling back to a generic unit entry like \"week\" or \"day\"\r\n function queryButtonText(options) {\r\n var buttonText = options.buttonText || {};\r\n return buttonText[requestedViewType] ||\r\n // view can decide to look up a certain key\r\n (spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) ||\r\n // a key like \"month\"\r\n (spec.singleUnit ? buttonText[spec.singleUnit] : null);\r\n }\r\n // highest to lowest priority\r\n spec.buttonTextOverride =\r\n queryButtonText(optionsManager.dynamicOverrides) ||\r\n queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence\r\n spec.overrides.buttonText; // `buttonText` for view-specific options is a string\r\n // highest to lowest priority. mirrors buildViewSpecOptions\r\n spec.buttonTextDefault =\r\n queryButtonText(optionsManager.localeDefaults) ||\r\n queryButtonText(optionsManager.dirDefaults) ||\r\n spec.defaults.buttonText || // a single string. from ViewSubclass.defaults\r\n queryButtonText(options_1.globalDefaults) ||\r\n (spec.duration ? this._calendar.humanizeDuration(spec.duration) : null) || // like \"3 days\"\r\n requestedViewType; // fall back to given view name\r\n };\r\n return ViewSpecManager;\r\n}());\r\nexports.default = ViewSpecManager;\r\n\r\n\r\n/***/ }),\r\n/* 242 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventPeriod_1 = __webpack_require__(243);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(calendar) {\r\n this.calendar = calendar;\r\n this.stickySource = new ArrayEventSource_1.default(calendar);\r\n this.otherSources = [];\r\n }\r\n EventManager.prototype.requestEvents = function (start, end, timezone, force) {\r\n if (force ||\r\n !this.currentPeriod ||\r\n !this.currentPeriod.isWithinRange(start, end) ||\r\n timezone !== this.currentPeriod.timezone) {\r\n this.setPeriod(// will change this.currentPeriod\r\n new EventPeriod_1.default(start, end, timezone));\r\n }\r\n return this.currentPeriod.whenReleased();\r\n };\r\n // Source Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.addSource = function (eventSource) {\r\n this.otherSources.push(eventSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.requestSource(eventSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeSource = function (doomedSource) {\r\n util_1.removeExact(this.otherSources, doomedSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeSource(doomedSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllSources = function () {\r\n this.otherSources = [];\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeAllSources(); // might release\r\n }\r\n };\r\n // Source Refetching\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.refetchSource = function (eventSource) {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeSource(eventSource);\r\n currentPeriod.requestSource(eventSource);\r\n currentPeriod.thaw();\r\n }\r\n };\r\n EventManager.prototype.refetchAllSources = function () {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeAllSources();\r\n currentPeriod.requestSources(this.getSources());\r\n currentPeriod.thaw();\r\n }\r\n };\r\n // Source Querying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getSources = function () {\r\n return [this.stickySource].concat(this.otherSources);\r\n };\r\n // like querySources, but accepts multple match criteria (like multiple IDs)\r\n EventManager.prototype.multiQuerySources = function (matchInputs) {\r\n // coerce into an array\r\n if (!matchInputs) {\r\n matchInputs = [];\r\n }\r\n else if (!$.isArray(matchInputs)) {\r\n matchInputs = [matchInputs];\r\n }\r\n var matchingSources = [];\r\n var i;\r\n // resolve raw inputs to real event source objects\r\n for (i = 0; i < matchInputs.length; i++) {\r\n matchingSources.push.apply(// append\r\n matchingSources, this.querySources(matchInputs[i]));\r\n }\r\n return matchingSources;\r\n };\r\n // matchInput can either by a real event source object, an ID, or the function/URL for the source.\r\n // returns an array of matching source objects.\r\n EventManager.prototype.querySources = function (matchInput) {\r\n var sources = this.otherSources;\r\n var i;\r\n var source;\r\n // given a proper event source object\r\n for (i = 0; i < sources.length; i++) {\r\n source = sources[i];\r\n if (source === matchInput) {\r\n return [source];\r\n }\r\n }\r\n // an ID match\r\n source = this.getSourceById(EventSource_1.default.normalizeId(matchInput));\r\n if (source) {\r\n return [source];\r\n }\r\n // parse as an event source\r\n matchInput = EventSourceParser_1.default.parse(matchInput, this.calendar);\r\n if (matchInput) {\r\n return $.grep(sources, function (source) {\r\n return isSourcesEquivalent(matchInput, source);\r\n });\r\n }\r\n };\r\n /*\r\n ID assumed to already be normalized\r\n */\r\n EventManager.prototype.getSourceById = function (id) {\r\n return $.grep(this.otherSources, function (source) {\r\n return source.id && source.id === id;\r\n })[0];\r\n };\r\n // Event-Period\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.setPeriod = function (eventPeriod) {\r\n if (this.currentPeriod) {\r\n this.unbindPeriod(this.currentPeriod);\r\n this.currentPeriod = null;\r\n }\r\n this.currentPeriod = eventPeriod;\r\n this.bindPeriod(eventPeriod);\r\n eventPeriod.requestSources(this.getSources());\r\n };\r\n EventManager.prototype.bindPeriod = function (eventPeriod) {\r\n this.listenTo(eventPeriod, 'release', function (eventsPayload) {\r\n this.trigger('release', eventsPayload);\r\n });\r\n };\r\n EventManager.prototype.unbindPeriod = function (eventPeriod) {\r\n this.stopListeningTo(eventPeriod);\r\n };\r\n // Event Getting/Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getEventDefByUid = function (uid) {\r\n if (this.currentPeriod) {\r\n return this.currentPeriod.getEventDefByUid(uid);\r\n }\r\n };\r\n EventManager.prototype.addEventDef = function (eventDef, isSticky) {\r\n if (isSticky) {\r\n this.stickySource.addEventDef(eventDef);\r\n }\r\n if (this.currentPeriod) {\r\n this.currentPeriod.addEventDef(eventDef); // might release\r\n }\r\n };\r\n EventManager.prototype.removeEventDefsById = function (eventId) {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeEventDefsById(eventId);\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeEventDefsById(eventId); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllEventDefs = function () {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeAllEventDefs();\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeAllEventDefs();\r\n }\r\n };\r\n // Event Mutating\r\n // -----------------------------------------------------------------------------------------------------------------\r\n /*\r\n Returns an undo function.\r\n */\r\n EventManager.prototype.mutateEventsWithId = function (eventDefId, eventDefMutation) {\r\n var currentPeriod = this.currentPeriod;\r\n var eventDefs;\r\n var undoFuncs = [];\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n eventDefs = currentPeriod.getEventDefsById(eventDefId);\r\n eventDefs.forEach(function (eventDef) {\r\n // add/remove esp because id might change\r\n currentPeriod.removeEventDef(eventDef);\r\n undoFuncs.push(eventDefMutation.mutateSingle(eventDef));\r\n currentPeriod.addEventDef(eventDef);\r\n });\r\n currentPeriod.thaw();\r\n return function () {\r\n currentPeriod.freeze();\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n currentPeriod.removeEventDef(eventDefs[i]);\r\n undoFuncs[i]();\r\n currentPeriod.addEventDef(eventDefs[i]);\r\n }\r\n currentPeriod.thaw();\r\n };\r\n }\r\n return function () { };\r\n };\r\n /*\r\n copies and then mutates\r\n */\r\n EventManager.prototype.buildMutatedEventInstanceGroup = function (eventDefId, eventDefMutation) {\r\n var eventDefs = this.getEventDefsById(eventDefId);\r\n var i;\r\n var defCopy;\r\n var allInstances = [];\r\n for (i = 0; i < eventDefs.length; i++) {\r\n defCopy = eventDefs[i].clone();\r\n if (defCopy instanceof SingleEventDef_1.default) {\r\n eventDefMutation.mutateSingle(defCopy);\r\n allInstances.push.apply(allInstances, // append\r\n defCopy.buildInstances());\r\n }\r\n }\r\n return new EventInstanceGroup_1.default(allInstances);\r\n };\r\n // Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.freeze = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.freeze();\r\n }\r\n };\r\n EventManager.prototype.thaw = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.thaw();\r\n }\r\n };\r\n // methods that simply forward to EventPeriod\r\n EventManager.prototype.getEventDefsById = function (eventDefId) {\r\n return this.currentPeriod.getEventDefsById(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstances = function () {\r\n return this.currentPeriod.getEventInstances();\r\n };\r\n EventManager.prototype.getEventInstancesWithId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithId(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithoutId(eventDefId);\r\n };\r\n return EventManager;\r\n}());\r\nexports.default = EventManager;\r\nEmitterMixin_1.default.mixInto(EventManager);\r\nListenerMixin_1.default.mixInto(EventManager);\r\nfunction isSourcesEquivalent(source0, source1) {\r\n return source0.getPrimitive() === source1.getPrimitive();\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 243 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventPeriod = /** @class */ (function () {\r\n function EventPeriod(start, end, timezone) {\r\n this.pendingCnt = 0;\r\n this.freezeDepth = 0;\r\n this.stuntedReleaseCnt = 0;\r\n this.releaseCnt = 0;\r\n this.start = start;\r\n this.end = end;\r\n this.timezone = timezone;\r\n this.unzonedRange = new UnzonedRange_1.default(start.clone().stripZone(), end.clone().stripZone());\r\n this.requestsByUid = {};\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n }\r\n EventPeriod.prototype.isWithinRange = function (start, end) {\r\n // TODO: use a range util function?\r\n return !start.isBefore(this.start) && !end.isAfter(this.end);\r\n };\r\n // Requesting and Purging\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.requestSources = function (sources) {\r\n this.freeze();\r\n for (var i = 0; i < sources.length; i++) {\r\n this.requestSource(sources[i]);\r\n }\r\n this.thaw();\r\n };\r\n EventPeriod.prototype.requestSource = function (source) {\r\n var _this = this;\r\n var request = { source: source, status: 'pending', eventDefs: null };\r\n this.requestsByUid[source.uid] = request;\r\n this.pendingCnt += 1;\r\n source.fetch(this.start, this.end, this.timezone).then(function (eventDefs) {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'completed';\r\n request.eventDefs = eventDefs;\r\n _this.addEventDefs(eventDefs);\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n }, function () {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'failed';\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n });\r\n };\r\n EventPeriod.prototype.purgeSource = function (source) {\r\n var request = this.requestsByUid[source.uid];\r\n if (request) {\r\n delete this.requestsByUid[source.uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n this.pendingCnt--;\r\n this.tryRelease();\r\n }\r\n else if (request.status === 'completed') {\r\n request.eventDefs.forEach(this.removeEventDef.bind(this));\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.purgeAllSources = function () {\r\n var requestsByUid = this.requestsByUid;\r\n var uid;\r\n var request;\r\n var completedCnt = 0;\r\n for (uid in requestsByUid) {\r\n request = requestsByUid[uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n }\r\n else if (request.status === 'completed') {\r\n completedCnt++;\r\n }\r\n }\r\n this.requestsByUid = {};\r\n this.pendingCnt = 0;\r\n if (completedCnt) {\r\n this.removeAllEventDefs(); // might release\r\n }\r\n };\r\n // Event Definitions\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventDefByUid = function (eventDefUid) {\r\n return this.eventDefsByUid[eventDefUid];\r\n };\r\n EventPeriod.prototype.getEventDefsById = function (eventDefId) {\r\n var a = this.eventDefsById[eventDefId];\r\n if (a) {\r\n return a.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.addEventDefs = function (eventDefs) {\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n this.addEventDef(eventDefs[i]);\r\n }\r\n };\r\n EventPeriod.prototype.addEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefId = eventDef.id;\r\n var eventDefs = eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []);\r\n var eventInstances = eventDef.buildInstances(this.unzonedRange);\r\n var i;\r\n eventDefs.push(eventDef);\r\n this.eventDefsByUid[eventDef.uid] = eventDef;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n this.addEventInstance(eventInstances[i], eventDefId);\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDefsById = function (eventDefId) {\r\n var _this = this;\r\n this.getEventDefsById(eventDefId).forEach(function (eventDef) {\r\n _this.removeEventDef(eventDef);\r\n });\r\n };\r\n EventPeriod.prototype.removeAllEventDefs = function () {\r\n var isEmpty = $.isEmptyObject(this.eventDefsByUid);\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n if (!isEmpty) {\r\n this.tryRelease();\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefs = eventDefsById[eventDef.id];\r\n delete this.eventDefsByUid[eventDef.uid];\r\n if (eventDefs) {\r\n util_1.removeExact(eventDefs, eventDef);\r\n if (!eventDefs.length) {\r\n delete eventDefsById[eventDef.id];\r\n }\r\n this.removeEventInstancesForDef(eventDef);\r\n }\r\n };\r\n // Event Instances\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventInstances = function () {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n return eventInstances;\r\n };\r\n EventPeriod.prototype.getEventInstancesWithId = function (eventDefId) {\r\n var eventInstanceGroup = this.eventInstanceGroupsById[eventDefId];\r\n if (eventInstanceGroup) {\r\n return eventInstanceGroup.eventInstances.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var matchingInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n if (id !== eventDefId) {\r\n matchingInstances.push.apply(matchingInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n }\r\n return matchingInstances;\r\n };\r\n EventPeriod.prototype.addEventInstance = function (eventInstance, eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDefId] ||\r\n (eventInstanceGroupsById[eventDefId] = new EventInstanceGroup_1.default());\r\n eventInstanceGroup.eventInstances.push(eventInstance);\r\n this.tryRelease();\r\n };\r\n EventPeriod.prototype.removeEventInstancesForDef = function (eventDef) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDef.id];\r\n var removeCnt;\r\n if (eventInstanceGroup) {\r\n removeCnt = util_1.removeMatching(eventInstanceGroup.eventInstances, function (currentEventInstance) {\r\n return currentEventInstance.def === eventDef;\r\n });\r\n if (!eventInstanceGroup.eventInstances.length) {\r\n delete eventInstanceGroupsById[eventDef.id];\r\n }\r\n if (removeCnt) {\r\n this.tryRelease();\r\n }\r\n }\r\n };\r\n // Releasing and Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.tryRelease = function () {\r\n if (!this.pendingCnt) {\r\n if (!this.freezeDepth) {\r\n this.release();\r\n }\r\n else {\r\n this.stuntedReleaseCnt++;\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.release = function () {\r\n this.releaseCnt++;\r\n this.trigger('release', this.eventInstanceGroupsById);\r\n };\r\n EventPeriod.prototype.whenReleased = function () {\r\n var _this = this;\r\n if (this.releaseCnt) {\r\n return Promise_1.default.resolve(this.eventInstanceGroupsById);\r\n }\r\n else {\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.one('release', onResolve);\r\n });\r\n }\r\n };\r\n EventPeriod.prototype.freeze = function () {\r\n if (!(this.freezeDepth++)) {\r\n this.stuntedReleaseCnt = 0;\r\n }\r\n };\r\n EventPeriod.prototype.thaw = function () {\r\n if (!(--this.freezeDepth) && this.stuntedReleaseCnt && !this.pendingCnt) {\r\n this.release();\r\n }\r\n };\r\n return EventPeriod;\r\n}());\r\nexports.default = EventPeriod;\r\nEmitterMixin_1.default.mixInto(EventPeriod);\r\n\r\n\r\n/***/ }),\r\n/* 244 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\n/* Creates a clone of an element and lets it track the mouse as it moves\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MouseFollower = /** @class */ (function () {\r\n function MouseFollower(sourceEl, options) {\r\n this.isFollowing = false;\r\n this.isHidden = false;\r\n this.isAnimating = false; // doing the revert animation?\r\n this.options = options = options || {};\r\n this.sourceEl = sourceEl;\r\n this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent\r\n }\r\n // Causes the element to start following the mouse\r\n MouseFollower.prototype.start = function (ev) {\r\n if (!this.isFollowing) {\r\n this.isFollowing = true;\r\n this.y0 = util_1.getEvY(ev);\r\n this.x0 = util_1.getEvX(ev);\r\n this.topDelta = 0;\r\n this.leftDelta = 0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n if (util_1.getEvIsTouch(ev)) {\r\n this.listenTo($(document), 'touchmove', this.handleMove);\r\n }\r\n else {\r\n this.listenTo($(document), 'mousemove', this.handleMove);\r\n }\r\n }\r\n };\r\n // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.\r\n // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.\r\n MouseFollower.prototype.stop = function (shouldRevert, callback) {\r\n var _this = this;\r\n var revertDuration = this.options.revertDuration;\r\n var complete = function () {\r\n _this.isAnimating = false;\r\n _this.removeElement();\r\n _this.top0 = _this.left0 = null; // reset state for future updatePosition calls\r\n if (callback) {\r\n callback();\r\n }\r\n };\r\n if (this.isFollowing && !this.isAnimating) {\r\n this.isFollowing = false;\r\n this.stopListeningTo($(document));\r\n if (shouldRevert && revertDuration && !this.isHidden) {\r\n this.isAnimating = true;\r\n this.el.animate({\r\n top: this.top0,\r\n left: this.left0\r\n }, {\r\n duration: revertDuration,\r\n complete: complete\r\n });\r\n }\r\n else {\r\n complete();\r\n }\r\n }\r\n };\r\n // Gets the tracking element. Create it if necessary\r\n MouseFollower.prototype.getEl = function () {\r\n var el = this.el;\r\n if (!el) {\r\n el = this.el = this.sourceEl.clone()\r\n .addClass(this.options.additionalClass || '')\r\n .css({\r\n position: 'absolute',\r\n visibility: '',\r\n display: this.isHidden ? 'none' : '',\r\n margin: 0,\r\n right: 'auto',\r\n bottom: 'auto',\r\n width: this.sourceEl.width(),\r\n height: this.sourceEl.height(),\r\n opacity: this.options.opacity || '',\r\n zIndex: this.options.zIndex\r\n });\r\n // we don't want long taps or any mouse interaction causing selection/menus.\r\n // would use preventSelection(), but that prevents selectstart, causing problems.\r\n el.addClass('fc-unselectable');\r\n el.appendTo(this.parentEl);\r\n }\r\n return el;\r\n };\r\n // Removes the tracking element if it has already been created\r\n MouseFollower.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n // Update the CSS position of the tracking element\r\n MouseFollower.prototype.updatePosition = function () {\r\n var sourceOffset;\r\n var origin;\r\n this.getEl(); // ensure this.el\r\n // make sure origin info was computed\r\n if (this.top0 == null) {\r\n sourceOffset = this.sourceEl.offset();\r\n origin = this.el.offsetParent().offset();\r\n this.top0 = sourceOffset.top - origin.top;\r\n this.left0 = sourceOffset.left - origin.left;\r\n }\r\n this.el.css({\r\n top: this.top0 + this.topDelta,\r\n left: this.left0 + this.leftDelta\r\n });\r\n };\r\n // Gets called when the user moves the mouse\r\n MouseFollower.prototype.handleMove = function (ev) {\r\n this.topDelta = util_1.getEvY(ev) - this.y0;\r\n this.leftDelta = util_1.getEvX(ev) - this.x0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n };\r\n // Temporarily makes the tracking element invisible. Can be called before following starts\r\n MouseFollower.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.isHidden = true;\r\n if (this.el) {\r\n this.el.hide();\r\n }\r\n }\r\n };\r\n // Show the tracking element after it has been temporarily hidden\r\n MouseFollower.prototype.show = function () {\r\n if (this.isHidden) {\r\n this.isHidden = false;\r\n this.updatePosition();\r\n this.getEl().show();\r\n }\r\n };\r\n return MouseFollower;\r\n}());\r\nexports.default = MouseFollower;\r\nListenerMixin_1.default.mixInto(MouseFollower);\r\n\r\n\r\n/***/ }),\r\n/* 245 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateClicking = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateClicking, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - getHitEl\r\n */\r\n function DateClicking(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateClicking.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateClicking.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (!component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (!component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day clicking.\r\n DateClicking.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var dayClickHit; // null if invalid dayClick\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n dayClickHit = dragListener.origHit;\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n // if user dragged to another cell at any point, it can no longer be a dayClick\r\n if (!isOrig) {\r\n dayClickHit = null;\r\n }\r\n },\r\n hitOut: function () {\r\n dayClickHit = null;\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n var componentFootprint;\r\n if (!isCancelled && dayClickHit) {\r\n componentFootprint = component.getSafeHitFootprint(dayClickHit);\r\n if (componentFootprint) {\r\n _this.view.triggerDayClick(componentFootprint, component.getHitEl(dayClickHit), ev);\r\n }\r\n }\r\n }\r\n });\r\n // because dragListener won't be called with any time delay, \"dragging\" will begin immediately,\r\n // which will kill any touchmoving/scrolling. Prevent this.\r\n dragListener.shouldCancelTouchScroll = false;\r\n dragListener.scrollAlwaysKills = true;\r\n return dragListener;\r\n };\r\n return DateClicking;\r\n}(Interaction_1.default));\r\nexports.default = DateClicking;\r\n\r\n\r\n/***/ }),\r\n/* 246 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/*\r\nOnly handles foreground segs.\r\nDoes not own rendering. Use for low-level util methods by TimeGrid.\r\n*/\r\nvar TimeGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridEventRenderer, _super);\r\n function TimeGridEventRenderer(timeGrid, fillRenderer) {\r\n var _this = _super.call(this, timeGrid, fillRenderer) || this;\r\n _this.timeGrid = timeGrid;\r\n return _this;\r\n }\r\n TimeGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);\r\n };\r\n // Given an array of foreground segments, render a DOM element for each, computes position,\r\n // and attaches to the column inner-container elements.\r\n TimeGridEventRenderer.prototype.renderFgSegsIntoContainers = function (segs, containerEls) {\r\n var segsByCol;\r\n var col;\r\n segsByCol = this.timeGrid.groupSegsByCol(segs);\r\n for (col = 0; col < this.timeGrid.colCnt; col++) {\r\n this.updateFgSegCoords(segsByCol[col]);\r\n }\r\n this.timeGrid.attachSegsByCol(segsByCol, containerEls);\r\n };\r\n TimeGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n if (this.fgSegs) {\r\n this.fgSegs.forEach(function (seg) {\r\n seg.el.remove();\r\n });\r\n }\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('noMeridiemTimeFormat'); // like \"6:30\" (no AM/PM)\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n // Renders the HTML for a single event segment's default rendering\r\n TimeGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var componentFootprint = seg.footprint.componentFootprint;\r\n var isAllDay = componentFootprint.isAllDay;\r\n var eventDef = seg.footprint.eventDef;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeText;\r\n var fullTimeText; // more verbose time text. for the print stylesheet\r\n var startTimeText; // just the start time text\r\n classes.unshift('fc-time-grid-event', 'fc-v-event');\r\n // if the event appears to span more than one day...\r\n if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n // Don't display time text on segments that run entirely through a day.\r\n // That would appear as midnight-midnight and would look dumb.\r\n // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\r\n if (seg.isStart || seg.isEnd) {\r\n var zonedStart = calendar.msToMoment(seg.startMs);\r\n var zonedEnd = calendar.msToMoment(seg.endMs);\r\n timeText = this._getTimeText(zonedStart, zonedEnd, isAllDay);\r\n fullTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, 'LT');\r\n startTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, null, false); // displayEnd=false\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeText = this.getTimeText(seg.footprint);\r\n fullTimeText = this.getTimeText(seg.footprint, 'LT');\r\n startTimeText = this.getTimeText(seg.footprint, null, false); // displayEnd=false\r\n }\r\n return '' +\r\n '
' +\r\n (timeText ?\r\n '
' +\r\n '' + util_1.htmlEscape(timeText) + '' +\r\n '
' :\r\n '') +\r\n (eventDef.title ?\r\n '
' +\r\n util_1.htmlEscape(eventDef.title) +\r\n '
' :\r\n '') +\r\n '
' +\r\n '
' +\r\n /* TODO: write CSS for this\r\n (isResizableFromStart ?\r\n '
' :\r\n ''\r\n ) +\r\n */\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n // Given segments that are assumed to all live in the *same column*,\r\n // compute their verical/horizontal coordinates and assign to their elements.\r\n TimeGridEventRenderer.prototype.updateFgSegCoords = function (segs) {\r\n this.timeGrid.computeSegVerticals(segs); // horizontals relies on this\r\n this.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array\r\n this.timeGrid.assignSegVerticals(segs);\r\n this.assignFgSegHorizontals(segs);\r\n };\r\n // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\r\n // NOTE: Also reorders the given array by date!\r\n TimeGridEventRenderer.prototype.computeFgSegHorizontals = function (segs) {\r\n var levels;\r\n var level0;\r\n var i;\r\n this.sortEventSegs(segs); // order by certain criteria\r\n levels = buildSlotSegLevels(segs);\r\n computeForwardSlotSegs(levels);\r\n if ((level0 = levels[0])) {\r\n for (i = 0; i < level0.length; i++) {\r\n computeSlotSegPressures(level0[i]);\r\n }\r\n for (i = 0; i < level0.length; i++) {\r\n this.computeFgSegForwardBack(level0[i], 0, 0);\r\n }\r\n }\r\n };\r\n // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\r\n // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\r\n // seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\r\n //\r\n // The segment might be part of a \"series\", which means consecutive segments with the same pressure\r\n // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\r\n // segments behind this one in the current series, and `seriesBackwardCoord` is the starting\r\n // coordinate of the first segment in the series.\r\n TimeGridEventRenderer.prototype.computeFgSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {\r\n var forwardSegs = seg.forwardSegs;\r\n var i;\r\n if (seg.forwardCoord === undefined) {\r\n if (!forwardSegs.length) {\r\n // if there are no forward segments, this segment should butt up against the edge\r\n seg.forwardCoord = 1;\r\n }\r\n else {\r\n // sort highest pressure first\r\n this.sortForwardSegs(forwardSegs);\r\n // this segment's forwardCoord will be calculated from the backwardCoord of the\r\n // highest-pressure forward segment.\r\n this.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\r\n seg.forwardCoord = forwardSegs[0].backwardCoord;\r\n }\r\n // calculate the backwardCoord from the forwardCoord. consider the series\r\n seg.backwardCoord = seg.forwardCoord -\r\n (seg.forwardCoord - seriesBackwardCoord) / // available width for series\r\n (seriesBackwardPressure + 1); // # of segments in the series\r\n // use this segment's coordinates to computed the coordinates of the less-pressurized\r\n // forward segments\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n this.computeFgSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);\r\n }\r\n }\r\n };\r\n TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {\r\n forwardSegs.sort(util_1.proxy(this, 'compareForwardSegs'));\r\n };\r\n // A cmp function for determining which forward segment to rely on more when computing coordinates.\r\n TimeGridEventRenderer.prototype.compareForwardSegs = function (seg1, seg2) {\r\n // put higher-pressure first\r\n return seg2.forwardPressure - seg1.forwardPressure ||\r\n // put segments that are closer to initial edge first (and favor ones with no coords yet)\r\n (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) ||\r\n // do normal sorting...\r\n this.compareEventSegs(seg1, seg2);\r\n };\r\n // Given foreground event segments that have already had their position coordinates computed,\r\n // assigns position-related CSS values to their elements.\r\n TimeGridEventRenderer.prototype.assignFgSegHorizontals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateFgSegHorizontalCss(seg));\r\n // if the height is short, add a className for alternate styling\r\n if (seg.bottom - seg.top < 30) {\r\n seg.el.addClass('fc-short');\r\n }\r\n }\r\n };\r\n // Generates an object with CSS properties/values that should be applied to an event segment element.\r\n // Contains important positioning-related properties that should be applied to any event element, customized or not.\r\n TimeGridEventRenderer.prototype.generateFgSegHorizontalCss = function (seg) {\r\n var shouldOverlap = this.opt('slotEventOverlap');\r\n var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point\r\n var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point\r\n var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first\r\n var isRTL = this.timeGrid.isRTL;\r\n var left; // amount of space from left edge, a fraction of the total width\r\n var right; // amount of space from right edge, a fraction of the total width\r\n if (shouldOverlap) {\r\n // double the width, but don't go beyond the maximum forward coordinate (1.0)\r\n forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);\r\n }\r\n if (isRTL) {\r\n left = 1 - forwardCoord;\r\n right = backwardCoord;\r\n }\r\n else {\r\n left = backwardCoord;\r\n right = 1 - forwardCoord;\r\n }\r\n props.zIndex = seg.level + 1; // convert from 0-base to 1-based\r\n props.left = left * 100 + '%';\r\n props.right = right * 100 + '%';\r\n if (shouldOverlap && seg.forwardPressure) {\r\n // add padding to the edge so that forward stacked events don't cover the resizer's icon\r\n props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width\r\n }\r\n return props;\r\n };\r\n return TimeGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = TimeGridEventRenderer;\r\n// Builds an array of segments \"levels\". The first level will be the leftmost tier of segments if the calendar is\r\n// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.\r\nfunction buildSlotSegLevels(segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // go through all the levels and stop on the first level where there are no collisions\r\n for (j = 0; j < levels.length; j++) {\r\n if (!computeSlotSegCollisions(seg, levels[j]).length) {\r\n break;\r\n }\r\n }\r\n seg.level = j;\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n return levels;\r\n}\r\n// For every segment, figure out the other segments that are in subsequent\r\n// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs\r\nfunction computeForwardSlotSegs(levels) {\r\n var i;\r\n var level;\r\n var j;\r\n var seg;\r\n var k;\r\n for (i = 0; i < levels.length; i++) {\r\n level = levels[i];\r\n for (j = 0; j < level.length; j++) {\r\n seg = level[j];\r\n seg.forwardSegs = [];\r\n for (k = i + 1; k < levels.length; k++) {\r\n computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);\r\n }\r\n }\r\n }\r\n}\r\n// Figure out which path forward (via seg.forwardSegs) results in the longest path until\r\n// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure\r\nfunction computeSlotSegPressures(seg) {\r\n var forwardSegs = seg.forwardSegs;\r\n var forwardPressure = 0;\r\n var i;\r\n var forwardSeg;\r\n if (seg.forwardPressure === undefined) {\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n forwardSeg = forwardSegs[i];\r\n // figure out the child's maximum forward path\r\n computeSlotSegPressures(forwardSeg);\r\n // either use the existing maximum, or use the child's forward pressure\r\n // plus one (for the forwardSeg itself)\r\n forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);\r\n }\r\n seg.forwardPressure = forwardPressure;\r\n }\r\n}\r\n// Find all the segments in `otherSegs` that vertically collide with `seg`.\r\n// Append into an optionally-supplied `results` array and return.\r\nfunction computeSlotSegCollisions(seg, otherSegs, results) {\r\n if (results === void 0) { results = []; }\r\n for (var i = 0; i < otherSegs.length; i++) {\r\n if (isSlotSegCollision(seg, otherSegs[i])) {\r\n results.push(otherSegs[i]);\r\n }\r\n }\r\n return results;\r\n} \t\r\n// Do these segments occupy the same vertical space?\r\nfunction isSlotSegCollision(seg1, seg2) {\r\n/////////////// stop physics of segments\r\n// return seg1.bottom > seg2.top && seg1.top < seg2.bottom;\r\n return 0;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 247 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar TimeGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridHelperRenderer, _super);\r\n function TimeGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var i;\r\n var seg;\r\n var sourceEl;\r\n // TODO: not good to call eventRenderer this way\r\n this.eventRenderer.renderFgSegsIntoContainers(segs, this.component.helperContainerEls);\r\n // Try to make the segment that is in the same row as sourceSeg look the same\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (sourceSeg && sourceSeg.col === seg.col) {\r\n sourceEl = sourceSeg.el;\r\n seg.el.css({\r\n left: sourceEl.css('left'),\r\n right: sourceEl.css('right'),\r\n 'margin-left': sourceEl.css('margin-left'),\r\n 'margin-right': sourceEl.css('margin-right')\r\n });\r\n }\r\n helperNodes.push(seg.el[0]);\r\n }\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return TimeGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = TimeGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 248 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar TimeGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridFillRenderer, _super);\r\n function TimeGridFillRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var timeGrid = this.component;\r\n var containerEls;\r\n // TODO: more efficient lookup\r\n if (type === 'bgEvent') {\r\n containerEls = timeGrid.bgContainerEls;\r\n }\r\n else if (type === 'businessHours') {\r\n containerEls = timeGrid.businessContainerEls;\r\n }\r\n else if (type === 'highlight') {\r\n containerEls = timeGrid.highlightContainerEls;\r\n }\r\n timeGrid.updateSegVerticals(segs);\r\n timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);\r\n return segs.map(function (seg) {\r\n return seg.el[0];\r\n });\r\n };\r\n return TimeGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = TimeGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 249 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/* A rectangular panel that is absolutely positioned over other content\r\n------------------------------------------------------------------------------------------------------------------------\r\nOptions:\r\n - className (string)\r\n - content (HTML string or jQuery element set)\r\n - parentEl\r\n - top\r\n - left\r\n - right (the x coord of where the right edge should be. not a \"CSS\" right)\r\n - autoHide (boolean)\r\n - show (callback)\r\n - hide (callback)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Popover = /** @class */ (function () {\r\n function Popover(options) {\r\n this.isHidden = true;\r\n this.margin = 10; // the space required between the popover and the edges of the scroll container\r\n this.options = options || {};\r\n }\r\n // Shows the popover on the specified position. Renders it if not already\r\n Popover.prototype.show = function () {\r\n if (this.isHidden) {\r\n if (!this.el) {\r\n this.render();\r\n }\r\n this.el.show();\r\n this.position();\r\n this.isHidden = false;\r\n this.trigger('show');\r\n }\r\n };\r\n // Hides the popover, through CSS, but does not remove it from the DOM\r\n Popover.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.el.hide();\r\n this.isHidden = true;\r\n this.trigger('hide');\r\n }\r\n };\r\n // Creates `this.el` and renders content inside of it\r\n Popover.prototype.render = function () {\r\n var _this = this;\r\n var options = this.options;\r\n this.el = $('
')\r\n .addClass(options.className || '')\r\n .css({\r\n // position initially to the top left to avoid creating scrollbars\r\n top: 0,\r\n left: 0\r\n })\r\n .append(options.content)\r\n .appendTo(options.parentEl);\r\n // when a click happens on anything inside with a 'fc-close' className, hide the popover\r\n this.el.on('click', '.fc-close', function () {\r\n _this.hide();\r\n });\r\n if (options.autoHide) {\r\n this.listenTo($(document), 'mousedown', this.documentMousedown);\r\n }\r\n };\r\n // Triggered when the user clicks *anywhere* in the document, for the autoHide feature\r\n Popover.prototype.documentMousedown = function (ev) {\r\n // only hide the popover if the click happened outside the popover\r\n if (this.el && !$(ev.target).closest(this.el).length) {\r\n this.hide();\r\n }\r\n };\r\n // Hides and unregisters any handlers\r\n Popover.prototype.removeElement = function () {\r\n this.hide();\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n this.stopListeningTo($(document), 'mousedown');\r\n };\r\n // Positions the popover optimally, using the top/left/right options\r\n Popover.prototype.position = function () {\r\n var options = this.options;\r\n var origin = this.el.offsetParent().offset();\r\n var width = this.el.outerWidth();\r\n var height = this.el.outerHeight();\r\n var windowEl = $(window);\r\n var viewportEl = util_1.getScrollParent(this.el);\r\n var viewportTop;\r\n var viewportLeft;\r\n var viewportOffset;\r\n var top; // the \"position\" (not \"offset\") values for the popover\r\n var left; //\r\n // compute top and left\r\n top = options.top || 0;\r\n if (options.left !== undefined) {\r\n left = options.left;\r\n }\r\n else if (options.right !== undefined) {\r\n left = options.right - width; // derive the left value from the right value\r\n }\r\n else {\r\n left = 0;\r\n }\r\n if (viewportEl.is(window) || viewportEl.is(document)) {\r\n viewportEl = windowEl;\r\n viewportTop = 0; // the window is always at the top left\r\n viewportLeft = 0; // (and .offset() won't work if called here)\r\n }\r\n else {\r\n viewportOffset = viewportEl.offset();\r\n viewportTop = viewportOffset.top;\r\n viewportLeft = viewportOffset.left;\r\n }\r\n // if the window is scrolled, it causes the visible area to be further down\r\n viewportTop += windowEl.scrollTop();\r\n viewportLeft += windowEl.scrollLeft();\r\n // constrain to the view port. if constrained by two edges, give precedence to top/left\r\n if (options.viewportConstrain !== false) {\r\n top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);\r\n top = Math.max(top, viewportTop + this.margin);\r\n left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);\r\n left = Math.max(left, viewportLeft + this.margin);\r\n }\r\n this.el.css({\r\n top: top - origin.top,\r\n left: left - origin.left\r\n });\r\n };\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n // TODO: better code reuse for this. Repeat code\r\n Popover.prototype.trigger = function (name) {\r\n if (this.options[name]) {\r\n this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\r\n }\r\n };\r\n return Popover;\r\n}());\r\nexports.default = Popover;\r\nListenerMixin_1.default.mixInto(Popover);\r\n\r\n\r\n/***/ }),\r\n/* 250 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/* Event-rendering methods for the DayGrid class\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridEventRenderer, _super);\r\n function DayGridEventRenderer(dayGrid, fillRenderer) {\r\n var _this = _super.call(this, dayGrid, fillRenderer) || this;\r\n _this.dayGrid = dayGrid;\r\n return _this;\r\n }\r\n DayGridEventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n // don't render timed background events\r\n eventRanges = $.grep(eventRanges, function (eventRange) {\r\n return eventRange.eventDef.isAllDay();\r\n });\r\n _super.prototype.renderBgRanges.call(this, eventRanges);\r\n };\r\n // Renders the given foreground event segments onto the grid\r\n DayGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n var rowStructs = this.rowStructs = this.renderSegRows(segs);\r\n // append to each row's content skeleton\r\n this.dayGrid.rowEls.each(function (i, rowNode) {\r\n $(rowNode).find('.fc-content-skeleton > table').append(rowStructs[i].tbodyEl);\r\n });\r\n };\r\n // Unrenders all currently rendered foreground event segments\r\n DayGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n var rowStructs = this.rowStructs || [];\r\n var rowStruct;\r\n while ((rowStruct = rowStructs.pop())) {\r\n rowStruct.tbodyEl.remove();\r\n }\r\n this.rowStructs = null;\r\n };\r\n // Uses the given events array to generate elements that should be appended to each row's content skeleton.\r\n // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\r\n // PRECONDITION: each segment shoud already have a rendered and assigned `.el`\r\n DayGridEventRenderer.prototype.renderSegRows = function (segs) {\r\n var rowStructs = [];\r\n var segRows;\r\n var row;\r\n segRows = this.groupSegRows(segs); // group into nested arrays\r\n // iterate each row of segment groupings\r\n for (row = 0; row < segRows.length; row++) {\r\n rowStructs.push(this.renderSegRow(row, segRows[row]));\r\n }\r\n return rowStructs;\r\n };\r\n // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains\r\n // the segments. Returns object with a bunch of internal data about how the render was calculated.\r\n // NOTE: modifies rowSegs\r\n DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {\r\n var colCnt = this.dayGrid.colCnt;\r\n var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\r\n var levelCnt = Math.max(1, segLevels.length); // ensure at least one level\r\n var tbody = $('');\r\n var segMatrix = []; // lookup for which segments are rendered into which level+col cells\r\n var cellMatrix = []; // lookup for all elements of the level+col matrix\r\n var loneCellMatrix = []; // lookup for elements that only take up a single column\r\n var i;\r\n var levelSegs;\r\n var col;\r\n var tr;\r\n var j;\r\n var seg;\r\n var td;\r\n // populates empty cells from the current column (`col`) to `endCol`\r\n function emptyCellsUntil(endCol) {\r\n while (col < endCol) {\r\n // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\r\n td = (loneCellMatrix[i - 1] || [])[col];\r\n if (td) {\r\n td.attr('rowspan', parseInt(td.attr('rowspan') || 1, 10) + 1);\r\n }\r\n else {\r\n td = $('');\r\n tr.append(td);\r\n }\r\n cellMatrix[i][col] = td;\r\n loneCellMatrix[i][col] = td;\r\n col++;\r\n }\r\n }\r\n for (i = 0; i < levelCnt; i++) {\r\n levelSegs = segLevels[i];\r\n col = 0;\r\n tr = $('');\r\n segMatrix.push([]);\r\n cellMatrix.push([]);\r\n loneCellMatrix.push([]);\r\n // levelCnt might be 1 even though there are no actual levels. protect against this.\r\n // this single empty row is useful for styling.\r\n if (levelSegs) {\r\n for (j = 0; j < levelSegs.length; j++) {\r\n seg = levelSegs[j];\r\n emptyCellsUntil(seg.leftCol);\r\n // create a container that occupies or more columns. append the event element.\r\n td = $('').append(seg.el);\r\n if (seg.leftCol !== seg.rightCol) {\r\n td.attr('colspan', seg.rightCol - seg.leftCol + 1);\r\n }\r\n else {\r\n loneCellMatrix[i][col] = td;\r\n }\r\n while (col <= seg.rightCol) {\r\n cellMatrix[i][col] = td;\r\n segMatrix[i][col] = seg;\r\n col++;\r\n }\r\n tr.append(td);\r\n }\r\n }\r\n emptyCellsUntil(colCnt); // finish off the row\r\n this.dayGrid.bookendCells(tr);\r\n tbody.append(tr);\r\n }\r\n return {\r\n row: row,\r\n tbodyEl: tbody,\r\n cellMatrix: cellMatrix,\r\n segMatrix: segMatrix,\r\n segLevels: segLevels,\r\n segs: rowSegs\r\n };\r\n };\r\n // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\r\n // NOTE: modifies segs\r\n DayGridEventRenderer.prototype.buildSegLevels = function (segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n // Give preference to elements with certain criteria, so they have\r\n // a chance to be closer to the top.\r\n this.sortEventSegs(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // loop through levels, starting with the topmost, until the segment doesn't collide with other segments\r\n for (j = 0; j < levels.length; j++) {\r\n if (!isDaySegCollision(seg, levels[j])) {\r\n break;\r\n }\r\n }\r\n // `j` now holds the desired subrow index\r\n seg.level = j;\r\n // create new level array if needed and append segment\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n // order segments left-to-right. very important if calendar is RTL\r\n for (j = 0; j < levels.length; j++) {\r\n levels[j].sort(compareDaySegCols);\r\n }\r\n return levels;\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\r\n DayGridEventRenderer.prototype.groupSegRows = function (segs) {\r\n var segRows = [];\r\n var i;\r\n for (i = 0; i < this.dayGrid.rowCnt; i++) {\r\n segRows.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segRows[segs[i].row].push(segs[i]);\r\n }\r\n return segRows;\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n DayGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('extraSmallTimeFormat'); // like \"6p\" or \"6:30p\"\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day\r\n };\r\n // Builds the HTML to be used for the default element for an individual segment\r\n DayGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var isAllDay = seg.footprint.componentFootprint.isAllDay;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && isAllDay &&\r\n seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && isAllDay &&\r\n seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeHtml = '';\r\n var timeText;\r\n var titleHtml;\r\n classes.unshift('fc-day-grid-event', 'fc-h-event');\r\n // Only display a timed events time if it is the starting segment\r\n if (seg.isStart) {\r\n timeText = this.getTimeText(seg.footprint);\r\n if (timeText) {\r\n timeHtml = '' + util_1.htmlEscape(timeText) + '';\r\n }\r\n }\r\n titleHtml =\r\n '' +\r\n (util_1.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height\r\n '';\r\n return '' +\r\n '
' +\r\n (this.dayGrid.isRTL ?\r\n titleHtml + ' ' + timeHtml : // put a natural space in between\r\n timeHtml + ' ' + titleHtml //\r\n ) +\r\n '
' +\r\n (isResizableFromStart ?\r\n '
' :\r\n '') +\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n return DayGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = DayGridEventRenderer;\r\n// Computes whether two segments' columns collide. They are assumed to be in the same row.\r\nfunction isDaySegCollision(seg, otherSegs) {\r\n var i;\r\n var otherSeg;\r\n for (i = 0; i < otherSegs.length; i++) {\r\n otherSeg = otherSegs[i];\r\n if (otherSeg.leftCol <= seg.rightCol &&\r\n otherSeg.rightCol >= seg.leftCol) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n// A cmp function for determining the leftmost event\r\nfunction compareDaySegCols(a, b) {\r\n return a.leftCol - b.leftCol;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 251 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar DayGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridHelperRenderer, _super);\r\n function DayGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Renders a mock \"helper\" event. `sourceSeg` is the associated internal segment object. It can be null.\r\n DayGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var rowStructs;\r\n // TODO: not good to call eventRenderer this way\r\n rowStructs = this.eventRenderer.renderSegRows(segs);\r\n // inject each new event skeleton into each associated row\r\n this.component.rowEls.each(function (row, rowNode) {\r\n var rowEl = $(rowNode); // the .fc-row\r\n var skeletonEl = $('
'); // will be absolutely positioned\r\n var skeletonTopEl;\r\n var skeletonTop;\r\n // If there is an original segment, match the top position. Otherwise, put it at the row's top level\r\n if (sourceSeg && sourceSeg.row === row) {\r\n skeletonTop = sourceSeg.el.position().top;\r\n }\r\n else {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton tbody');\r\n if (!skeletonTopEl.length) {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton table');\r\n }\r\n skeletonTop = skeletonTopEl.position().top;\r\n }\r\n skeletonEl.css('top', skeletonTop)\r\n .find('table')\r\n .append(rowStructs[row].tbodyEl);\r\n rowEl.append(skeletonEl);\r\n helperNodes.push(skeletonEl[0]);\r\n });\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return DayGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = DayGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 252 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar DayGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridFillRenderer, _super);\r\n function DayGridFillRenderer() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.fillSegTag = 'td'; // override the default tag name\r\n return _this;\r\n }\r\n DayGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var nodes = [];\r\n var i;\r\n var seg;\r\n var skeletonEl;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n skeletonEl = this.renderFillRow(type, seg);\r\n this.component.rowEls.eq(seg.row).append(skeletonEl);\r\n nodes.push(skeletonEl[0]);\r\n }\r\n return nodes;\r\n };\r\n // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\r\n DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {\r\n var colCnt = this.component.colCnt;\r\n var startCol = seg.leftCol;\r\n var endCol = seg.rightCol + 1;\r\n var className;\r\n var skeletonEl;\r\n var trEl;\r\n if (type === 'businessHours') {\r\n className = 'bgevent';\r\n }\r\n else {\r\n className = type.toLowerCase();\r\n }\r\n skeletonEl = $('
' +\r\n '
' +\r\n '
');\r\n trEl = skeletonEl.find('tr');\r\n if (startCol > 0) {\r\n trEl.append('');\r\n }\r\n trEl.append(seg.el.attr('colspan', endCol - startCol));\r\n if (endCol < colCnt) {\r\n trEl.append('');\r\n }\r\n this.component.bookendCells(trEl);\r\n return skeletonEl;\r\n };\r\n return DayGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = DayGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 253 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar MonthViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthViewDateProfileGenerator, _super);\r\n function MonthViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n MonthViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay);\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n var rowCnt;\r\n // ensure 6 weeks\r\n if (this.opt('fixedWeekCount')) {\r\n rowCnt = Math.ceil(// could be partial weeks due to hiddenDays\r\n end.diff(start, 'weeks', true) // dontRound=true\r\n );\r\n end.add(6 - rowCnt, 'weeks');\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return MonthViewDateProfileGenerator;\r\n}(BasicViewDateProfileGenerator_1.default));\r\nexports.default = MonthViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 254 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nvar ListEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventRenderer, _super);\r\n function ListEventRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ListEventRenderer.prototype.renderFgSegs = function (segs) {\r\n if (!segs.length) {\r\n this.component.renderEmptyMessage();\r\n }\r\n else {\r\n this.component.renderSegList(segs);\r\n }\r\n };\r\n // generates the HTML for a single event row\r\n ListEventRenderer.prototype.fgSegHtml = function (seg) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var eventFootprint = seg.footprint;\r\n var eventDef = eventFootprint.eventDef;\r\n var componentFootprint = eventFootprint.componentFootprint;\r\n var url = eventDef.url;\r\n var classes = ['fc-list-item'].concat(this.getClasses(eventDef));\r\n var bgColor = this.getBgColor(eventDef);\r\n var timeHtml;\r\n if (componentFootprint.isAllDay) {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n else if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n if (seg.isStart || seg.isEnd) {\r\n timeHtml = util_1.htmlEscape(this._getTimeText(calendar.msToMoment(seg.startMs), calendar.msToMoment(seg.endMs), componentFootprint.isAllDay));\r\n }\r\n else {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeHtml = util_1.htmlEscape(this.getTimeText(eventFootprint));\r\n }\r\n if (url) {\r\n classes.push('fc-has-url');\r\n }\r\n return '' +\r\n (this.displayEventTime ?\r\n '' +\r\n (timeHtml || '') +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(eventDef.title || '') +\r\n '' +\r\n '' +\r\n '';\r\n };\r\n // like \"4:00am\"\r\n ListEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('mediumTimeFormat');\r\n };\r\n return ListEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = ListEventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 255 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar ListEventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventPointing, _super);\r\n function ListEventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // for events with a url, the whole should be clickable,\r\n // but it's impossible to wrap with an tag. simulate this.\r\n ListEventPointing.prototype.handleClick = function (seg, ev) {\r\n var url;\r\n _super.prototype.handleClick.call(this, seg, ev); // might prevent the default action\r\n // not clicking on or within an with an href\r\n if (!$(ev.target).closest('a[href]').length) {\r\n url = seg.footprint.eventDef.url;\r\n if (url && !ev.isDefaultPrevented()) {\r\n window.location.href = url; // simulate link click\r\n }\r\n }\r\n };\r\n return ListEventPointing;\r\n}(EventPointing_1.default));\r\nexports.default = ListEventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 256 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nEventSourceParser_1.default.registerClass(ArrayEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(FuncEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(JsonFeedEventSource_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 257 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar Bootstrap3Theme_1 = __webpack_require__(258);\r\nvar Bootstrap4Theme_1 = __webpack_require__(259);\r\nThemeRegistry_1.defineThemeSystem('standard', StandardTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('jquery-ui', JqueryUiTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap3', Bootstrap3Theme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap4', Bootstrap4Theme_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 258 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap3Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap3Theme, _super);\r\n function Bootstrap3Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap3Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap3Theme;\r\nBootstrap3Theme.prototype.classes = {\r\n widget: 'fc-bootstrap3',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-default',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'panel panel-default',\r\n popoverHeader: 'panel-heading',\r\n popoverContent: 'panel-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `panel` class b/c don't want margins/radius. only border color.\r\n headerRow: 'panel-default',\r\n dayRow: 'panel-default',\r\n // list view\r\n listView: 'panel panel-default'\r\n};\r\nBootstrap3Theme.prototype.baseIconClass = 'glyphicon';\r\nBootstrap3Theme.prototype.iconClasses = {\r\n close: 'glyphicon-remove',\r\n prev: 'glyphicon-chevron-left',\r\n next: 'glyphicon-chevron-right',\r\n prevYear: 'glyphicon-backward',\r\n nextYear: 'glyphicon-forward'\r\n};\r\nBootstrap3Theme.prototype.iconOverrideOption = 'bootstrapGlyphicons';\r\nBootstrap3Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapGlyphicon';\r\nBootstrap3Theme.prototype.iconOverridePrefix = 'glyphicon-';\r\n\r\n\r\n/***/ }),\r\n/* 259 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap4Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap4Theme, _super);\r\n function Bootstrap4Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap4Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap4Theme;\r\nBootstrap4Theme.prototype.classes = {\r\n widget: 'fc-bootstrap4',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'table-active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-primary',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'card card-primary',\r\n popoverHeader: 'card-header',\r\n popoverContent: 'card-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `table` class b/c don't want margins/padding/structure. only border color.\r\n headerRow: 'table-bordered',\r\n dayRow: 'table-bordered',\r\n // list view\r\n listView: 'card card-primary'\r\n};\r\nBootstrap4Theme.prototype.baseIconClass = 'fa';\r\nBootstrap4Theme.prototype.iconClasses = {\r\n close: 'fa-times',\r\n prev: 'fa-chevron-left',\r\n next: 'fa-chevron-right',\r\n prevYear: 'fa-angle-double-left',\r\n nextYear: 'fa-angle-double-right'\r\n};\r\nBootstrap4Theme.prototype.iconOverrideOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverridePrefix = 'fa-';\r\n\r\n\r\n/***/ }),\r\n/* 260 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthView_1 = __webpack_require__(229);\r\nViewRegistry_1.defineView('basic', {\r\n 'class': BasicView_1.default\r\n});\r\nViewRegistry_1.defineView('basicDay', {\r\n type: 'basic',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('basicWeek', {\r\n type: 'basic',\r\n duration: { weeks: 1 }\r\n});\r\nViewRegistry_1.defineView('month', {\r\n 'class': MonthView_1.default,\r\n duration: { months: 1 },\r\n defaults: {\r\n fixedWeekCount: true\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 261 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar AgendaView_1 = __webpack_require__(226);\r\nViewRegistry_1.defineView('agenda', {\r\n 'class': AgendaView_1.default,\r\n defaults: {\r\n allDaySlot: true,\r\n slotDuration: '00:30:00',\r\n slotEventOverlap: true // a bad name. confused with overlap/constraint system\r\n }\r\n});\r\nViewRegistry_1.defineView('agendaDay', {\r\n type: 'agenda',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('agendaWeek', {\r\n type: 'agenda',\r\n duration: { weeks: 1 }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 262 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar ListView_1 = __webpack_require__(230);\r\nViewRegistry_1.defineView('list', {\r\n 'class': ListView_1.default,\r\n buttonTextKey: 'list',\r\n defaults: {\r\n buttonText: 'list',\r\n listDayFormat: 'LL',\r\n noEventsMessage: 'No events to display'\r\n }\r\n});\r\nViewRegistry_1.defineView('listDay', {\r\n type: 'list',\r\n duration: { days: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header\r\n }\r\n});\r\nViewRegistry_1.defineView('listWeek', {\r\n type: 'list',\r\n duration: { weeks: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd',\r\n listDayAltFormat: 'LL'\r\n }\r\n});\r\nViewRegistry_1.defineView('listMonth', {\r\n type: 'list',\r\n duration: { month: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\nViewRegistry_1.defineView('listYear', {\r\n type: 'list',\r\n duration: { year: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 263 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n\r\n\r\n/***/ })\r\n/******/ ]);\r\n});\n\n/***/ }),\n/* 300 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('full-calendar-reserve',{attrs:{\"show-modal\":_vm.showModalReserve,\"startDate\":_vm.startDate,\"endDate\":_vm.endDate,\"resources-checkboxes\":_vm.resourcesCheckboxes,\"number-of-resources\":_vm.selectedResources.length,\"add-reservation\":_vm.addReservation},on:{\"close\":function($event){_vm.showModalReserve = false}}}),_vm._v(\" \"),_c('full-calendar-info',{attrs:{\"show-modal\":_vm.showModalInfo,\"reservation\":_vm.reservation,\"cancel\":_vm.cancelReservation,\"update\":_vm.updateReservation,\"refreshTasks\":_vm.refreshTasks,\"nodes\":_vm.nodes},on:{\"close\":function($event){_vm.showModalInfo = false},\"handleError\":_vm.handleError}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 301 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_MySchedule_vue__ = __webpack_require__(195);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_73dcc08a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_MySchedule_vue__ = __webpack_require__(306);\nfunction injectStyle (ssrContext) {\n __webpack_require__(302)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-73dcc08a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_MySchedule_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_73dcc08a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_MySchedule_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 303 */,\n/* 304 */,\n/* 305 */,\n/* 306 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"range-select-container\"},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"scale-transition\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},model:{value:(_vm.menu),callback:function ($$v) {_vm.menu=$$v},expression:\"menu\"}},[_c('v-text-field',{staticClass:\"date-input\",attrs:{\"slot\":\"activator\",\"label\":\"Schedule start date\",\"prepend-icon\":\"event\",\"readonly\":\"\"},slot:\"activator\",model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}}),_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.menu = false; _vm.changeSchedule()}},model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}})],1),_vm._v(\" \"),_c('v-text-field',{staticClass:\"range-input\",attrs:{\"min\":\"1\",\"step\":\"1\",\"type\":\"number\",\"label\":\"Schedule range in days\"},on:{\"input\":function($event){return _vm.changeSchedule()}},model:{value:(_vm.range),callback:function ($$v) {_vm.range=$$v},expression:\"range\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"container-header\"},[_c('div',{staticClass:\"left-table-header\"},[_vm._m(0),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":\"Change all\"},on:{\"change\":_vm.changeAll},model:{value:(_vm.changeAllCheckbox),callback:function ($$v) {_vm.changeAllCheckbox=$$v},expression:\"changeAllCheckbox\"}})],1)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"right-table-header\",attrs:{\"id\":\"right-header\"}},[_c('table',[_c('tbody',_vm._l((_vm.tableContent.header),function(header){return _c('th',{key:header.value},[_vm._v(_vm._s(header.value))])}),0)]),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',_vm._l((_vm.tableContent.hours),function(hours){return _c('td',{key:hours.id,staticClass:\"hours\"},[_vm._v(_vm._s(hours.value))])}),0)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"container-content\"},[_c('div',{staticClass:\"left-table\",attrs:{\"id\":\"left-table\"}},[_c('div',{key:_vm.leftTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('div',{staticClass:\"node-cell\"},[_c('v-checkbox',{staticClass:\"small-checkbox-node\",attrs:{\"color\":\"success\",\"label\":(\"\" + (node.nodeName)),\"input-value\":\"\"},on:{\"change\":function($event){return _vm.changeWholeNode(node.nodeName)}},model:{value:(node.selected),callback:function ($$v) {_vm.$set(node, \"selected\", $$v)},expression:\"node.selected\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"mx-2 small-button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"info\"},on:{\"click\":function($event){return _vm.toggle(node)}}},[(node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"add\")]):_vm._e(),_vm._v(\" \"),(!node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"remove\")]):_vm._e()],1)],1)])])]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":(\"\" + (_vm.tableContent.resources[resourceUUID].name))},on:{\"change\":function($event){return _vm.changeResource(node.nodeName, resourceUUID)}},model:{value:(_vm.tableContent.resources[resourceUUID].selected),callback:function ($$v) {_vm.$set(_vm.tableContent.resources[resourceUUID], \"selected\", $$v)},expression:\"tableContent.resources[resourceUUID].selected\"}})],1)])}),0)])}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"right-table\",attrs:{\"id\":\"right-table\"}},[_c('div',{key:_vm.rightTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',_vm._l((node.slots),function(slot){return _c('td',{key:slot.id},[_vm._v(_vm._s(slot.value))])}),0)]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},_vm._l((_vm.tableContent.resources[resourceUUID].slots),function(slot){return _c('td',{key:slot.id,class:{ 'reserved': slot.reserved, 'userReservation': slot.userReservation }},[_vm._v(_vm._s(slot.value))])}),0)}),0)])}),0)])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',[_c('tbody',[_c('th',{staticClass:\"first-column\"},[_vm._v(\"Resources\")])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 307 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-snackbar',{attrs:{\"color\":\"error\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"white\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"\\n Close\\n \")])],1),_vm._v(\" \"),(!_vm.showSchedule)?_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=true;}}},[_vm._v(\"\\n Select visible GPUs\\n \")]):_vm._e(),_vm._v(\" \"),_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showSchedule),expression:\"showSchedule\"}],attrs:{\"id\":\"schedule_section\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=false}}},[_vm._v(\"\\n Hide schedule\\n \")]),_vm._v(\" \"),_c('MySchedule',{attrs:{\"parsed-nodes\":_vm.parsedNodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)},\"loadResources\":function($event){return _vm.loadResources.apply(void 0, arguments)}}})],1),_vm._v(\" \"),_c('section',{attrs:{\"id\":\"calendar_section\"}},[_c('FullCalendar',{attrs:{\"update-calendar\":_vm.updateCalendar,\"selected-resources\":_vm.selectedResources,\"nodes\":_vm.nodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 308 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_NodesOverview_vue__ = __webpack_require__(197);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_18fc6060_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_NodesOverview_vue__ = __webpack_require__(320);\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_NodesOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_18fc6060_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_NodesOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 309 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchGenerator_vue__ = __webpack_require__(198);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_14692e23_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchGenerator_vue__ = __webpack_require__(319);\nfunction injectStyle (ssrContext) {\n __webpack_require__(310)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchGenerator_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_14692e23_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchGenerator_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 311 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchBox_vue__ = __webpack_require__(199);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4fc23b68_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchBox_vue__ = __webpack_require__(318);\nfunction injectStyle (ssrContext) {\n __webpack_require__(312)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchBox_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4fc23b68_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchBox_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 313 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_LineChart_vue__ = __webpack_require__(200);\n/* unused harmony namespace reexport */\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\nvar __vue_template__ = null\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_LineChart_vue__[\"a\" /* default */],\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 314 */,\n/* 315 */,\n/* 316 */,\n/* 317 */,\n/* 318 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"select_line\"},[_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.nodes},model:{value:(_vm.selectedNode),callback:function ($$v) {_vm.selectedNode=$$v},expression:\"selectedNode\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.resourceTypes},model:{value:(_vm.selectedResourceType),callback:function ($$v) {_vm.selectedResourceType=$$v},expression:\"selectedResourceType\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.metrics},model:{value:(_vm.selectedMetric),callback:function ($$v) {_vm.selectedMetric=$$v},expression:\"selectedMetric\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),(_vm.showProcesses === true)?_c('div',{staticClass:\"table_box\"},[_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.processes,\"item-key\":\"pid\",\"hide-actions\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',{on:{\"click\":function($event){props.expanded = !props.expanded}}},[_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.index))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.owner))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.command))])])]}},{key:\"expand\",fn:function(props){return [_c('v-card',{attrs:{\"flat\":\"\"}},[_c('v-card-text',[_vm._v(\"GPU UUID: \"+_vm._s(props.item.uuid))])],1)]}}],null,false,51043860)})],1):_c('div',[_c('LineChart',{staticClass:\"chart_box\",attrs:{\"chart-data\":_vm.metricData,\"options\":_vm.metricOptions,\"rerender-chart\":_vm.rerenderChart,\"update-chart\":_vm.updateChart}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 319 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"watch_table\"},[_vm._l((_vm.watches),function(watch){return _c('WatchBox',{key:watch.id,staticClass:\"watch_box\",attrs:{\"default-node\":watch.defaultNode,\"default-resource-type\":watch.defaultResourceType,\"default-metric\":watch.defaultMetric,\"resources-indexes\":_vm.resourcesIndexes,\"chart-datasets\":_vm.chartDatasets,\"update-chart\":_vm.updateChart,\"time\":_vm.time},on:{\"changeDefaultNode\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultNode.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultResourceType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultResourceType.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultMetric\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultMetric.apply(void 0, [ watch.id ].concat( argsArray ))},\"deleteWatch\":function($event){return _vm.deleteWatch(watch.id)}}})}),_vm._v(\" \"),_c('div',{staticClass:\"button_box\"},[_c('v-btn',{staticClass:\"big_button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"#b8bcc2\"},on:{\"click\":_vm.addWatch}},[_c('v-icon',{attrs:{\"size\":\"100px\",\"dark\":\"\"}},[_vm._v(\"add\")])],1)],1)],2)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 320 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('WatchGenerator')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 321 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TasksOverview_vue__ = __webpack_require__(201);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c0181bc6_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TasksOverview_vue__ = __webpack_require__(356);\nfunction injectStyle (ssrContext) {\n __webpack_require__(322)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TasksOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c0181bc6_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TasksOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 323 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskCreate_vue__ = __webpack_require__(202);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c5e32eee_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskCreate_vue__ = __webpack_require__(343);\nfunction injectStyle (ssrContext) {\n __webpack_require__(324)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-c5e32eee\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskCreate_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c5e32eee_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskCreate_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 325 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLine_vue__ = __webpack_require__(203);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_68056994_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLine_vue__ = __webpack_require__(342);\nfunction injectStyle (ssrContext) {\n __webpack_require__(326)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-68056994\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLine_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_68056994_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLine_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 327 */,\n/* 328 */,\n/* 329 */,\n/* 330 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineParameter_vue__ = __webpack_require__(204);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_dcbdcc6c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineParameter_vue__ = __webpack_require__(332);\nfunction injectStyle (ssrContext) {\n __webpack_require__(331)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineParameter_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_dcbdcc6c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineParameter_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 332 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newParameter,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 333 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineEnvVariable_vue__ = __webpack_require__(205);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_3a9cfdb2_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineEnvVariable_vue__ = __webpack_require__(335);\nfunction injectStyle (ssrContext) {\n __webpack_require__(334)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineEnvVariable_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_3a9cfdb2_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineEnvVariable_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 335 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newEnvVariable,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 336 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineTfConfig_vue__ = __webpack_require__(206);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ed523d5c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineTfConfig_vue__ = __webpack_require__(341);\nfunction injectStyle (ssrContext) {\n __webpack_require__(337)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ed523d5c\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineTfConfig_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ed523d5c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineTfConfig_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 338 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TfConfigEdit_vue__ = __webpack_require__(207);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1f240f3d_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TfConfigEdit_vue__ = __webpack_require__(340);\nfunction injectStyle (ssrContext) {\n __webpack_require__(339)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1f240f3d\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TfConfigEdit_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1f240f3d_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TfConfigEdit_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 340 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"TF_CONFIG editor\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-textarea',{attrs:{\"solo\":\"\",\"auto-grow\":\"\",\"label\":\"Enter TF_CONFIG JSON here\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-tooltip',{attrs:{\"disabled\":_vm.properJson,\"top\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('div',_vm._g({},on),[_c('v-btn',{attrs:{\"color\":\"success\",\"disabled\":!_vm.properJson},on:{\"click\":function($event){return _vm.save()}}},[_vm._v(\"\\n Save\\n \")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"TF_CONFIG needs to be proper JSON object\")])])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 341 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('TfConfigEdit',{attrs:{\"value\":_vm.newValue,\"show-modal\":_vm.showModalTfConfigEdit},on:{\"close\":function($event){_vm.showModalTfConfigEdit = false},\"updateValue\":function($event){return _vm.updateValue.apply(void 0, arguments)}}}),_vm._v(\" \"),(_vm.enableSmartTfConfig)?_c('v-layout',[_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Port\",\"small\":\"\"},model:{value:(_vm.newPort),callback:function ($$v) {_vm.newPort=$$v},expression:\"newPort\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-combobox',{staticClass:\"tf-wide\",attrs:{\"label\":\"Task type\",\"items\":_vm.taskTypeItems},model:{value:(_vm.newTaskType),callback:function ($$v) {_vm.newTaskType=$$v},expression:\"newTaskType\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),(_vm.newTaskIndex >= 0)?_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Index\",\"type\":\"number\",\"small\":\"\"},model:{value:(_vm.newTaskIndex),callback:function ($$v) {_vm.newTaskIndex=$$v},expression:\"newTaskIndex\"}}):_vm._e()],1):_c('v-btn',{staticClass:\"task-input\",attrs:{\"color\":\"info\",\"round\":\"\",\"medium\":\"\"},on:{\"click\":function($event){_vm.showModalTfConfigEdit = true}}},[_vm._v(\"\\n TF_CONFIG\\n \")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"bottom\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticClass:\"remove-button remove-button-tf\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},on),[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Delete TF_CONFIG\")])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 342 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-center\":\"\"}},[_c('div',{staticClass:\"task-preview\"},[_vm._v(\"\\n \"+_vm._s(_vm.taskPreview)+\"\\n \")])]),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostnames,\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostResources,\"label\":\"Resource\",\"small\":\"\"},model:{value:(_vm.newResource),callback:function ($$v) {_vm.newResource=$$v},expression:\"newResource\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[(_vm.newEnableTfConfig)?_c('TaskLineTfConfig',{attrs:{\"value\":_vm.tfConfig,\"port\":_vm.tfConfigPort,\"task-type\":_vm.tfConfigTaskType,\"task-index\":_vm.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeTfConfig\":function($event){return _vm.changeTfConfig.apply(void 0, arguments)},\"deleteTfConfig\":function($event){return _vm.deleteTfConfig()},\"updateTfConfigPort\":function($event){return _vm.updateTfConfigPort.apply(void 0, arguments)},\"updateTfConfigTaskType\":function($event){return _vm.updateTfConfigTaskType.apply(void 0, arguments)},\"updateTfConfigTaskIndex\":function($event){return _vm.updateTfConfigTaskIndex.apply(void 0, arguments)}}}):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.envVariables),function(envVariable){return _c('TaskLineEnvVariable',{key:envVariable.id,staticClass:\"task-input\",attrs:{\"envVariable\":envVariable.envVariable,\"value\":envVariable.value},on:{\"changeEnvVariable\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeEnvVariable.apply(void 0, [ envVariable.id ].concat( argsArray ))},\"deleteEnvVariable\":function($event){return _vm.deleteEnvVariable(envVariable.id)}}})}),1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.parameters),function(parameter){return _c('TaskLineParameter',{key:parameter.id,staticClass:\"task-input\",attrs:{\"parameter\":parameter.parameter,\"value\":parameter.value},on:{\"changeParameter\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeParameter.apply(void 0, [ parameter.id ].concat( argsArray ))},\"deleteParameter\":function($event){return _vm.deleteParameter(parameter.id)}}})}),1),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_vm._v(\"\\n Remove task\\n \")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 343 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({},on),[_vm._v(\"\\n info\\n \")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"CPU tasks can be run without making reservation.\\n \"),_c('br'),_vm._v(\"When you want to create a GPU task, you must\\n \"),_c('br'),_vm._v(\"first ensure that you are eligible to do so\\n \"),_c('br'),_vm._v(\"(having active reservation for that GPU).\\n \")])]),_vm._v(\" \"),(_vm.chosenTemplate === 'tf2')?_c('v-switch',{staticClass:\"float-right-button\",attrs:{\"label\":\"Smart TF_CONFIG\"},model:{value:(_vm.enableSmartTfConfig),callback:function ($$v) {_vm.enableSmartTfConfig=$$v},expression:\"enableSmartTfConfig\"}}):_vm._e()],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.lines),function(line){return _c('TaskLine',{key:line.id,attrs:{\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"host\":line.host,\"resource\":line.resource,\"envVariables\":line.envVariables,\"staticEnvVariables\":_vm.staticEnvVariables,\"command\":line.command,\"parameters\":line.parameters,\"staticParameters\":_vm.staticParameters,\"enable-tf-config\":line.enableTfConfig,\"tf-config\":line.tfConfig,\"tf-config-port\":line.tfConfigPort,\"tf-config-task-type\":line.tfConfigTaskType,\"tf-config-task-index\":line.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeLine\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeLine.apply(void 0, [ line.id ].concat( argsArray ))},\"deleteLine\":function($event){return _vm.deleteLine(line.id)},\"staticParameterChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"psWorkerParameterChanged\":function($event){return _vm.updatePsWorkerHosts(-1, '')},\"staticEnvVariableChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"staticParameterDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"staticEnvVariableDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigPort\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigPort.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskType.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskIndex\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskIndex.apply(void 0, [ line.id ].concat( argsArray ))}}})}),1),_vm._v(\" \"),_c('v-card-text',[_c('v-flex',{attrs:{\"xs12\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"block\":\"\",\"small\":\"\"},on:{\"click\":_vm.copyLine}},[_vm._v(\"\\n Add task\\n \")])],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"parameter-name-input\",attrs:{\"label\":\"Parameter name\",\"small\":\"\"},model:{value:(_vm.newParameter),callback:function ($$v) {_vm.newParameter=$$v},expression:\"newParameter\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addEnvVariable}},[_vm._v(\"\\n Add as ENV variable to all tasks\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addParameter}},[_vm._v(\"\\n Add as parameter to all tasks\\n \")]),_vm._v(\" \"),_c('v-checkbox',{attrs:{\"label\":\"Static\"},model:{value:(_vm.isNewFieldStatic),callback:function ($$v) {_vm.isNewFieldStatic=$$v},expression:\"isNewFieldStatic\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.addTasks}},[_vm._v(\"\\n Create all tasks\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 344 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskEdit_vue__ = __webpack_require__(208);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ab402584_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskEdit_vue__ = __webpack_require__(346);\nfunction injectStyle (ssrContext) {\n __webpack_require__(345)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ab402584\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskEdit_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ab402584_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskEdit_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 346 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Edit task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"host-input\",attrs:{\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"command-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.changeTask}},[_vm._v(\"\\n Edit task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 347 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskSchedule_vue__ = __webpack_require__(209);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_21a65550_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskSchedule_vue__ = __webpack_require__(349);\nfunction injectStyle (ssrContext) {\n __webpack_require__(348)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-21a65550\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskSchedule_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_21a65550_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskSchedule_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 349 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"40vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Schedule task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set spawn time\"},model:{value:(_vm.spawn),callback:function ($$v) {_vm.spawn=$$v},expression:\"spawn\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}},on))]}}]),model:{value:(_vm.spawnDateMenu),callback:function ($$v) {_vm.spawnDateMenu=$$v},expression:\"spawnDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.spawnDateMenu = false}},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"spawnMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newSpawnTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newSpawnTime=$event},\"update:return-value\":function($event){_vm.newSpawnTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}},on))]}}]),model:{value:(_vm.spawnTimeMenu),callback:function ($$v) {_vm.spawnTimeMenu=$$v},expression:\"spawnTimeMenu\"}},[_vm._v(\" \"),(_vm.spawnTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.spawnMenu.save(_vm.newSpawnTime)}},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set terminate time\"},model:{value:(_vm.terminate),callback:function ($$v) {_vm.terminate=$$v},expression:\"terminate\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}},on))]}}]),model:{value:(_vm.terminateDateMenu),callback:function ($$v) {_vm.terminateDateMenu=$$v},expression:\"terminateDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.terminateDateMenu = false}},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"terminateMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newTerminateTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newTerminateTime=$event},\"update:return-value\":function($event){_vm.newTerminateTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}},on))]}}]),model:{value:(_vm.terminateTimeMenu),callback:function ($$v) {_vm.terminateTimeMenu=$$v},expression:\"terminateTimeMenu\"}},[_vm._v(\" \"),(_vm.terminateTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.terminateMenu.save(_vm.newTerminateTime)}},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}}):_vm._e()],1)],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.checkActionFlag}},[_vm._v(\"\\n Schedule task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 350 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLog_vue__ = __webpack_require__(210);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4291c17c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLog_vue__ = __webpack_require__(352);\nfunction injectStyle (ssrContext) {\n __webpack_require__(351)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-4291c17c\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLog_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4291c17c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLog_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 352 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"\\n Task log\\n \"),_c('v-btn',{attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"green\"},on:{\"click\":function($event){return _vm.refresh()}}},[_c('v-icon',[_vm._v(\"refresh\")])],1)],1),_vm._v(\" \"),_c('span',{staticClass:\"subheading\"},[_c('v-checkbox',{staticStyle:{\"display\":\"inline\"},attrs:{\"flat\":\"\",\"label\":\"Tail mode\",\"hide-details\":\"\"},model:{value:(_vm.tailMode),callback:function ($$v) {_vm.tailMode=$$v},expression:\"tailMode\"}}),_vm._v(\" \"),_c('v-checkbox',_vm._g({staticStyle:{\"display\":\"inline\"},attrs:{\"flat\":\"\",\"label\":\"Auto-refresh\",\"disabled\":!_vm.tailMode,\"hide-details\":\"\"},model:{value:(_vm.autoRefresh),callback:function ($$v) {_vm.autoRefresh=$$v},expression:\"autoRefresh\"}},_vm.on))],1)],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n \"+_vm._s(_vm.path)+\"\\n \"),_c('div',{staticClass:\"log_box\"},_vm._l((_vm.lines),function(line,index){return _c('div',{key:index},[_vm._v(\"\\n \"+_vm._s(line)+\"\\n \")])}),0)])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 353 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskTemplateChooser_vue__ = __webpack_require__(211);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_d8f593d8_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskTemplateChooser_vue__ = __webpack_require__(355);\nfunction injectStyle (ssrContext) {\n __webpack_require__(354)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-d8f593d8\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskTemplateChooser_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_d8f593d8_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskTemplateChooser_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 355 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Choose framework template\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.possibleTemplates,\"label\":\"Choose template from list\",\"solo\":\"\"},on:{\"change\":_vm.setChosenTemplate}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":function($event){return _vm.goToCreate()}}},[_vm._v(\"\\n Go to task creator\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 356 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('TaskCreate',{attrs:{\"show-modal\":_vm.showModalCreate,\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"actionFlag\":_vm.actionFlag,\"chosen-template\":_vm.chosenTemplate},on:{\"close\":function($event){_vm.showModalCreate = false},\"getTasks\":_vm.getTasks}}),_vm._v(\" \"),_c('TaskTemplateChooser',{attrs:{\"show-modal\":_vm.showModalChooseTemplate},on:{\"close\":function($event){_vm.showModalChooseTemplate = false},\"openFromTemplate\":_vm.openFromTemplate}}),_vm._v(\" \"),_c('TaskEdit',{attrs:{\"show-modal\":_vm.showModalEdit,\"taskId\":_vm.taskId,\"hostname\":_vm.newHostname,\"command\":_vm.newCommand,\"actionFlag\":_vm.actionFlag},on:{\"close\":function($event){_vm.showModalEdit = false},\"getTask\":function($event){return _vm.getTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskSchedule',{attrs:{\"show-modal\":_vm.showModalSchedule,\"taskId\":_vm.taskId,\"spawnTime\":_vm.newSpawnTime,\"terminateTime\":_vm.newTerminateTime,\"actionFlag\":_vm.actionFlag,\"multipleFlag\":_vm.multipleFlag,\"selected\":_vm.selected},on:{\"close\":function($event){_vm.showModalSchedule = false},\"updateTask\":function($event){return _vm.updateTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)},\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskLog',{attrs:{\"show-modal\":_vm.showModalLog,\"lines\":_vm.logs,\"path\":_vm.path,\"taskId\":_vm.taskId},on:{\"close\":function($event){_vm.showModalLog = false},\"getLog\":function($event){return _vm.getLog.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"500\"},model:{value:(_vm.showModalHowItWorks),callback:function ($$v) {_vm.showModalHowItWorks=$$v},expression:\"showModalHowItWorks\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalHowItWorks = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"How it works\\n \")],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Your tasks are managed by `screen` program installed on each machine. You can attach\\n to/close them as they are running. Screen sessions created by TensorHive have custom\\n names so you won't be confused which is which.\\n \"),_c('br'),_vm._v(\" \"),_c('br'),_vm._v(\"When your task command stops executing, screen session will disappear from `screen -ls`\\n but stdout+stderr produced by your process will be redirected to a log file.\\n Logs are automatically gathered and stored on that machine under `~/TensorHiveLogs`.\\n \")])],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"Do you want to remove this task?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeTask()}}},[_vm._v(\"Yes\")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"table-container\"},[_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\",\"rows-per-page-items\":_vm.rowsPerPageItems},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}}),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){_vm.showModalHowItWorks = true}}},on),[_vm._v(\"info\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"How it works\")])])],1)],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\" \"),_c('span',{staticClass:\"dark-font\"},[_vm._v(_vm._s(header.text))])],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.hostname))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.status))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))]),_vm._v(\" \"),_c('td',[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(props.item)}}},on),[_vm._v(\"schedule\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(props.item.id)}}},on),[_vm._v(\"play_arrow\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, null)}}},on),[_vm._v(\"stop\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate task - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, false)}}},on),[_vm._v(\"💀\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill task - use when command is more stubborn\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.getLog(props.item.id)}}},on),[_vm._v(\"description\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Show log\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.editTask(props.item)}}},on),[_vm._v(\"edit\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Edit task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},on),[_vm._v(\"delete\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Remove task\")])])],1)])]}}]),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}])})],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){return _vm.openFromTemplate('')}}},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModalChooseTemplate=true}}},[_vm._v(\"Create tasks from template\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.getTasks(true)}}},on),[_vm._v(\"refresh\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Refresh\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(null)}}},on),[_vm._v(\"schedule\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(null)}}},on),[_vm._v(\"play_arrow\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(null, null)}}},on),[_vm._v(\"stop\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate selected tasks - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(null, false)}}},on),[_vm._v(\"💀\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill selected tasks - use when command is more stubborn\")])])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"amber\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_c('span',{staticStyle:{\"color\":\"black\"}},[_vm._v(\"Synchronization in progress. Actions are not allowed now.\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"Close\")])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"red\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbarError),callback:function ($$v) {_vm.snackbarError=$$v},expression:\"snackbarError\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbarError = false}}},[_vm._v(\"Close\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 357 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_UsersOverview_vue__ = __webpack_require__(212);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58aecb3a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_UsersOverview_vue__ = __webpack_require__(359);\nfunction injectStyle (ssrContext) {\n __webpack_require__(358)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-58aecb3a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_UsersOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58aecb3a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_UsersOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 359 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n User successfully created\\n \")]),_vm._v(\" \"),_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"500px\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create new user\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('v-card-text',[_vm._v(\"\\n Username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\"\\n Email\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\"\\n Password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\"\\n Repeat password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Create\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"\\n Do you want to remove this user?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeUser()}}},[_vm._v(\"\\n Yes\\n \")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',[_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModal=true}}},[_vm._v(\"Create user\")])],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"max-width\":\"500px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.dialog = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Edit user\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current username: \"+_vm._s(_vm.currentUser.username)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.username),expression:\"user.username\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"username\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current email: \"+_vm._s(_vm.currentUser.email)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New email\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.email),expression:\"user.email\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.email)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"email\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password),expression:\"user.password\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Repeat password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password2),expression:\"user.password2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password2\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Account roles:\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('v-checkbox',{attrs:{\"label\":\"admin\"},model:{value:(_vm.adminCheckbox),callback:function ($$v) {_vm.adminCheckbox=$$v},expression:\"adminCheckbox\"}})],1)],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-spacer'),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":_vm.updateUser}},[_vm._v(\"Edit\")])],1)],1)],1),_vm._v(\" \"),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.users,\"search\":_vm.search,\"pagination\":_vm.pagination,\"item-key\":\"id\",\"hide-actions\":\"\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',[_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.username))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.email))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.createdAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.role))]),_vm._v(\" \"),_c('td',[_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.editUser(props.item)}}},[_vm._v(\"\\n edit\\n \")]),_vm._v(\" \"),_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},[_vm._v(\"\\n delete\\n \")])],1)])]}}])}),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-pagination',{attrs:{\"length\":_vm.pages},model:{value:(_vm.pagination.page),callback:function ($$v) {_vm.$set(_vm.pagination, \"page\", $$v)},expression:\"pagination.page\"}})],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 360 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vuex__ = __webpack_require__(361);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__state__ = __webpack_require__(362);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__actions__ = __webpack_require__(363);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__mutations__ = __webpack_require__(364);\n\n\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_0_vue__[\"default\"].use(__WEBPACK_IMPORTED_MODULE_1_vuex__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (new __WEBPACK_IMPORTED_MODULE_1_vuex__[\"a\" /* default */].Store({\n state: __WEBPACK_IMPORTED_MODULE_2__state__[\"a\" /* default */],\n actions: __WEBPACK_IMPORTED_MODULE_3__actions__[\"a\" /* default */],\n mutations: __WEBPACK_IMPORTED_MODULE_4__mutations__[\"a\" /* default */]\n}));\n\n/***/ }),\n/* 361 */,\n/* 362 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n callingAPI: false,\n searching: '',\n serverURI: 'http://10.110.1.136:8080',\n user: null,\n role: null,\n id: null,\n accessToken: null,\n refreshToken: null,\n userInfo: {\n messages: [{ 1: 'test', 2: 'test' }],\n notifications: [],\n tasks: []\n }\n});\n\n/***/ }),\n/* 363 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({});\n\n/***/ }),\n/* 364 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n TOGGLE_LOADING: function TOGGLE_LOADING(state) {\n state.callingAPI = !state.callingAPI;\n },\n TOGGLE_SEARCHING: function TOGGLE_SEARCHING(state) {\n state.searching = state.searching === '' ? 'loading' : '';\n },\n SET_USER: function SET_USER(state, user) {\n state.user = user;\n },\n SET_ROLE: function SET_ROLE(state, role) {\n state.role = role;\n },\n SET_ID: function SET_ID(state, id) {\n state.id = id;\n },\n SET_ACCESS_TOKEN: function SET_ACCESS_TOKEN(state, token) {\n state.accessToken = token;\n },\n SET_REFRESH_TOKEN: function SET_REFRESH_TOKEN(state, token) {\n state.refreshToken = token;\n }\n});\n\n/***/ }),\n/* 365 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = domain;\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = count;\n/* harmony export (immutable) */ __webpack_exports__[\"d\"] = prettyDate;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = pluralize;\nvar urlParser = document.createElement('a');\n\nfunction domain(url) {\n urlParser.href = url;\n return urlParser.hostname;\n}\n\nfunction count(arr) {\n return arr.length;\n}\n\nfunction prettyDate(date) {\n var a = new Date(date);\n return a.toDateString();\n}\n\nfunction pluralize(time, label) {\n if (time === 1) {\n return time + label;\n }\n\n return time + label + 's';\n}\n\n/***/ }),\n/* 366 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(213);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_535f2ac0_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(367);\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_535f2ac0_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 367 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('v-app',[_c('router-view')],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 368 */,\n/* 369 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ })\n],[214]);\n\n\n// WEBPACK FOOTER //\n// static/js/app.3d22f1efa5bc05f6f25f.js","import axios from 'axios'\nimport config from '../config'\n\nexport default {\n request (method, uri, token, data = null) {\n if (!method) {\n console.error('API function call requires method argument')\n return\n }\n\n if (!uri) {\n console.error('API function call requires uri argument')\n return\n }\n\n var url = config.serverURI + uri\n if (token !== null) {\n axios.defaults.headers.common['Authorization'] = token\n }\n return axios({ method: method, url: url, data: data })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/api/index.js","export default {\n serverURI: '',\n apiVersion: '',\n version: '',\n fixedLayout: false,\n hideLogoOnMobile: false\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/config/index.js","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/TheDash.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/dash/BaseSidebar.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/dash/BaseSidebarMenu.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/TheLogin.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/404.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/ReservationsOverview.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/FullCalendar.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/FullCalendarReserve.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/FullCalendarInfo.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/MySchedule.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/NodesOverview.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/nodes_overview/WatchGenerator.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/nodes_overview/WatchBox.vue","\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/nodes_overview/LineChart.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/TasksOverview.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskCreate.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLine.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLineParameter.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLineEnvVariable.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLineTfConfig.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TfConfigEdit.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskEdit.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskSchedule.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLog.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskTemplateChooser.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/UsersOverview.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/App.vue","// Import ES6 Promise\nimport 'es6-promise/auto'\n\n// Import System requirements\nimport Vue from 'vue'\nimport VueRouter from 'vue-router'\n\nimport { sync } from 'vuex-router-sync'\nimport routes from './routes'\nimport store from './store'\nimport api from './api'\n\n// Import Helpers for filters\nimport { domain, count, prettyDate, pluralize } from './filters'\n\n// Import Views - Top level\nimport AppView from './components/App.vue'\n\nimport Vuetify from 'vuetify'\nimport 'vuetify/dist/vuetify.min.css'\nimport 'material-design-icons-iconfont/dist/material-design-icons.css'\n\nimport axios from 'axios'\nimport config from './config'\naxios.get('static/config.json').then(response => {\n config.serverURI = response.data.apiPath\n config.apiVersion = response.data.apiVersion\n config.version = response.data.version\n if (window.localStorage) {\n var apiVersion = JSON.parse(window.localStorage.getItem('apiVersion'))\n var version = JSON.parse(window.localStorage.getItem('version'))\n if (apiVersion === null) {\n if (config.apiVersion !== undefined) {\n window.localStorage.setItem('apiVersion', JSON.stringify(config.apiVersion))\n } else {\n window.localStorage.setItem('apiVersion', JSON.stringify('no data in config file'))\n }\n } else if (apiVersion !== config.apiVersion) {\n window.localStorage.clear()\n location.reload(true)\n }\n if (version === null) {\n if (config.version !== undefined) {\n window.localStorage.setItem('version', JSON.stringify(config.version))\n } else {\n window.localStorage.setItem('version', JSON.stringify('no data in config file'))\n }\n } else if (version !== config.version) {\n window.localStorage.clear()\n location.reload(true)\n }\n }\n\n Vue.use(Vuetify)\n\n // Import Install and register helper items\n Vue.filter('count', count)\n Vue.filter('domain', domain)\n Vue.filter('prettyDate', prettyDate)\n Vue.filter('pluralize', pluralize)\n\n Vue.use(VueRouter)\n\n // Routing logic\n var router = new VueRouter({\n routes: routes,\n mode: 'history',\n linkExactActiveClass: 'active',\n scrollBehavior: function (to, from, savedPosition) {\n return savedPosition || { x: 0, y: 0 }\n }\n })\n\n // Some middleware to help us ensure the user is authenticated.\n router.beforeEach((to, from, next) => {\n if (\n to.matched.some(record => record.meta.requiresAuth) &&\n (!router.app.$store.state.accessToken || router.app.$store.state.accessToken === 'null')\n ) {\n // this route requires auth, check if logged in\n // if not, redirect to login page.\n window.console.log('Not authenticated')\n next({\n path: '/login',\n query: { redirect: to.fullPath }\n })\n } else if (to.meta.role === 'admin') {\n if (router.app.$store.state.role === 'admin') {\n next()\n } else {\n next({\n path: '/',\n query: { redirect: to.fullPath }\n })\n }\n } else {\n next()\n }\n })\n\n sync(store, router)\n\n axios.interceptors.response.use(null, (error) => {\n if (error.config.url === config.serverURI + '/user/refresh') {\n if (window.localStorage) {\n window.localStorage.setItem('user', null)\n window.localStorage.setItem('role', null)\n window.localStorage.setItem('accessToken', null)\n window.localStorage.setItem('refreshToken', null)\n }\n store.commit('SET_USER', null)\n store.commit('SET_ROLE', null)\n store.commit('SET_ACCESS_TOKEN', null)\n store.commit('SET_REFRESH_TOKEN', null)\n router.push('/login')\n } else {\n if (error.config && error.response && error.response.status === 401 && error.config.url !== config.serverURI + '/user/login') {\n axios.defaults.headers.common['Authorization'] = store.state.refreshToken\n return axios({ method: 'get', url: config.serverURI + '/user/refresh', data: null })\n .then(response => {\n store.commit('SET_ACCESS_TOKEN', 'Bearer ' + response.data.access_token)\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', 'Bearer ' + response.data.access_token)\n }\n error.config.headers['Authorization'] = 'Bearer ' + response.data.access_token\n return axios.request(error.config)\n })\n .catch(error => {\n handleError(error)\n logout()\n })\n }\n }\n return Promise.reject(error)\n })\n // Check local storage to handle refreshes\n if (window.localStorage) {\n var localUserString = window.localStorage.getItem('user') || 'null'\n var localUser = JSON.parse(localUserString)\n\n if (localUser && store.state.user !== localUser) {\n store.commit('SET_USER', localUser)\n store.commit('SET_ACCESS_TOKEN', window.localStorage.getItem('accessToken'))\n store.commit('SET_REFRESH_TOKEN', window.localStorage.getItem('refreshToken'))\n store.commit('SET_ROLE', window.localStorage.getItem('role'))\n store.commit('SET_ID', parseInt(window.localStorage.getItem('userId')))\n }\n }\n function handleError (error) {\n if (!error.hasOwnProperty('response')) {\n console.log(error.message)\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n console.log(error.response.data)\n } else {\n console.log(error.response.data.msg)\n }\n }\n }\n\n function logout () {\n if (store.state.accessToken !== null) {\n api\n .request('delete', '/user/logout', store.state.accessToken)\n .then(response => {\n store.commit('SET_ACCESS_TOKEN', null)\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', null)\n }\n if (store.state.refreshToken !== null) {\n api\n .request('delete', '/user/logout/refresh_token', store.state.refreshToken)\n .then(response => {\n store.commit('SET_REFRESH_TOKEN', null)\n if (window.localStorage) {\n window.localStorage.setItem('refreshToken', null)\n }\n })\n .catch(error => {\n handleError(error)\n })\n }\n })\n .catch(error => {\n this.handleError(error)\n })\n }\n store.commit('SET_USER', null)\n store.commit('SET_ROLE', null)\n\n if (window.localStorage) {\n window.localStorage.setItem('user', null)\n window.localStorage.setItem('role', null)\n }\n router.push('/login')\n }\n // Start out app!\n // eslint-disable-next-line no-new\n new Vue({\n el: '#root',\n router: router,\n store: store,\n render: h => h(AppView)\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","import DashView from './components/TheDash.vue'\nimport LoginView from './components/TheLogin.vue'\nimport NotFoundView from './components/404.vue'\n// Import Views - Dash\nimport CalendarView from './components/views/ReservationsOverview.vue'\nimport WatchView from './components/views/NodesOverview.vue'\nimport TasksView from './components/views/TasksOverview.vue'\nimport UsersView from './components/views/UsersOverview.vue'\n// Routes\nconst routes = [\n {\n path: '/',\n component: DashView,\n children: [\n {\n path: '/reservations_overview',\n alias: '',\n component: CalendarView,\n name: 'Reservation Overview',\n meta: {\n description: 'Calendar with reservations',\n requiresAuth: true,\n role: 'user'\n }\n },\n {\n path: 'nodes_overview',\n alias: '',\n component: WatchView,\n name: 'Nodes overview',\n meta: {\n description: 'Informations about nodes',\n requiresAuth: true,\n role: 'user'\n }\n },\n {\n path: 'tasks_overview',\n alias: '',\n component: TasksView,\n name: 'Tasks overview',\n meta: {\n description: 'Tasks overview',\n requiresAuth: true,\n role: 'user'\n }\n },\n {\n path: 'users_overview',\n alias: '',\n component: UsersView,\n name: 'Users overview',\n meta: {\n description: 'Table users view for admin',\n requiresAuth: true,\n role: 'admin'\n }\n }\n ]\n },\n {\n path: '/login',\n component: LoginView,\n meta: {\n role: 'user'\n }\n },\n {\n path: '*',\n component: NotFoundView\n }\n]\n\nexport default routes\n\n\n\n// WEBPACK FOOTER //\n// ./src/routes.js","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ebd4a91c\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!sass-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TheDash.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheDash.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheDash.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ebd4a91c\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./TheDash.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/TheDash.vue\n// module id = 254\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-8c8911fe\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./BaseSidebar.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebar.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebar.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-8c8911fe\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./BaseSidebar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/dash/BaseSidebar.vue\n// module id = 257\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1ff073b3\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./BaseSidebarMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebarMenu.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebarMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1ff073b3\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./BaseSidebarMenu.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/dash/BaseSidebarMenu.vue\n// module id = 259\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"sidebar-menu\"},[_c('li',{staticClass:\"header\"},[_vm._v(\"SCHEDULE\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/reservations_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-calendar-check-o\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Reservations Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"RESOURCES\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/nodes_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-bar-chart\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Nodes Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"TASKS\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/tasks_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-tasks\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Tasks Overview\")])])]),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('li',{staticClass:\"header\"},[_vm._v(\"\\n ADMIN ZONE\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/users_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-users\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Users Overview\")])])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1ff073b3\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/dash/BaseSidebarMenu.vue\n// module id = 261\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{staticClass:\"main-sidebar\"},[_c('section',{staticClass:\"sidebar\"},[_c('BaseSidebarMenu')],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-8c8911fe\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/dash/BaseSidebar.vue\n// module id = 262\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:['wrapper', _vm.classes]},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('header',{staticClass:\"main-header\"},[_c('nav',{staticClass:\"navbar navbar-static-top\",attrs:{\"role\":\"navigation\"}},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"version_info\"},[_c('b',[_vm._v(\"TensorHive\")]),_vm._v(\" v\"+_vm._s(_vm.version)+\" \"),_c('b',[_vm._v(\"API\")]),_vm._v(\" v\"+_vm._s(_vm.apiVersion)+\"\\n \")]),_vm._v(\" \"),_c('v-menu',{staticClass:\"user_chip\",attrs:{\"close-on-content-click\":false,\"offset-y\":\"\"}},[_c('v-chip',{attrs:{\"slot\":\"activator\",\"color\":\"green\",\"text-color\":\"white\"},slot:\"activator\"},[_c('v-avatar',[_c('v-icon',[_vm._v(\"account_circle\")])],1),_vm._v(\"\\n \"+_vm._s(_vm.displayName)+\"\\n \")],1),_vm._v(\" \"),_c('v-card',[_c('v-card-actions',[_c('v-btn',{attrs:{\"flat\":\"\"},on:{\"click\":function($event){return _vm.logout()}}},[_vm._v(\"Logout\")])],1)],1)],1)],1)]),_vm._v(\" \"),_c('BaseSidebar'),_vm._v(\" \"),_c('div',{staticClass:\"content-wrapper\"},[_c('router-view')],1),_vm._v(\" \"),_c('v-footer',{attrs:{\"height\":\"auto\",\"color\":\"#222d32\"}},[_c('v-layout',{attrs:{\"justify-center\":\"\",\"row\":\"\",\"wrap\":\"\"}},[_c('v-flex',{attrs:{\"text-xs-center\":\"\",\"white--text\":\"\",\"xs12\":\"\"}},[_vm._v(\"\\n Found a bug or needs some improvements? Leave us an \"),_c('a',{attrs:{\"href\":\"https://github.com/roscisz/TensorHive/issues\"}},[_vm._v(\"issue on Github\")]),_vm._v(\")\\n \")])],1)],1)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{staticClass:\"sidebar-toggle\",attrs:{\"href\":\"javascript:;\",\"data-toggle\":\"offcanvas\",\"role\":\"button\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Toggle navigation\")])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ebd4a91c\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/TheDash.vue\n// module id = 282\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-67170a3e\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TheLogin.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheLogin.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheLogin.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-67170a3e\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./TheLogin.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-67170a3e\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/TheLogin.vue\n// module id = 283\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"login\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Register new account\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"UNIX username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Repeat password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\"\\n Please copy the key below and paste it into \"),_c('b',[_vm._v(\"~/.ssh/authorized_keys\")]),_vm._v(\".\"),_c('br'),_vm._v(\"It will allow TensorHive to confirm your identity and access machines with provided UNIX username.\\n \"),_c('v-textarea',{attrs:{\"solo\":\"\",\"name\":\"entry\",\"value\":_vm.entry,\"id\":\"entry\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\"},on:{\"click\":_vm.copyEntryToClipboard}},[_vm._v(\"Copy to clipboard\")]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Register\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-center col-sm-12\"},[_c('form',{staticClass:\"login-form\",on:{\"submit\":function($event){$event.preventDefault();return _vm.checkCreds($event)}}},[_vm._v(\"\\n Login to your account\\n \"),_c('div',{staticClass:\"input-group\"},[_vm._m(0),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.username),expression:\"username\"}],staticClass:\"form-control\",attrs:{\"name\":\"username\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.username=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_vm._m(1),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],staticClass:\"form-control\",attrs:{\"name\":\"password\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n Identity verification succeeded, account has been successfully created. You can now log in.\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\"},on:{\"click\":_vm.requestEntry}},[_vm._v(\"Register\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Login\\n \")])],1)])],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-67170a3e\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/TheLogin.vue\n// module id = 285\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-209d35e8\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./404.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./404.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./404.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-209d35e8\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./404.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/404.vue\n// module id = 286\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"notFound\"}},[_c('div',{staticClass:\"text-center col-sm-12\"},[_c('h1',[_vm._v(\"You are lost.\")]),_vm._v(\" \"),_c('h4',[_vm._v(\"This page doesn't exist.\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"vertical-5p lead\",attrs:{\"to\":\"/\"}},[_vm._v(\"Take me home.\")])],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-209d35e8\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/404.vue\n// module id = 288\n// module chunks = 1","var normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./ReservationsOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./ReservationsOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-a758ccee\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./ReservationsOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/ReservationsOverview.vue\n// module id = 289\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-f3e7eb0c\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./FullCalendar.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendar.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendar.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-f3e7eb0c\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./FullCalendar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/FullCalendar.vue\n// module id = 290\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6b687e6b\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./FullCalendarReserve.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarReserve.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarReserve.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6b687e6b\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./FullCalendarReserve.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-6b687e6b\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/FullCalendarReserve.vue\n// module id = 292\n// module chunks = 1","var map = {\n\t\"./af\": 66,\n\t\"./af.js\": 66,\n\t\"./ar\": 67,\n\t\"./ar-dz\": 68,\n\t\"./ar-dz.js\": 68,\n\t\"./ar-kw\": 69,\n\t\"./ar-kw.js\": 69,\n\t\"./ar-ly\": 70,\n\t\"./ar-ly.js\": 70,\n\t\"./ar-ma\": 71,\n\t\"./ar-ma.js\": 71,\n\t\"./ar-sa\": 72,\n\t\"./ar-sa.js\": 72,\n\t\"./ar-tn\": 73,\n\t\"./ar-tn.js\": 73,\n\t\"./ar.js\": 67,\n\t\"./az\": 74,\n\t\"./az.js\": 74,\n\t\"./be\": 75,\n\t\"./be.js\": 75,\n\t\"./bg\": 76,\n\t\"./bg.js\": 76,\n\t\"./bm\": 77,\n\t\"./bm.js\": 77,\n\t\"./bn\": 78,\n\t\"./bn.js\": 78,\n\t\"./bo\": 79,\n\t\"./bo.js\": 79,\n\t\"./br\": 80,\n\t\"./br.js\": 80,\n\t\"./bs\": 81,\n\t\"./bs.js\": 81,\n\t\"./ca\": 82,\n\t\"./ca.js\": 82,\n\t\"./cs\": 83,\n\t\"./cs.js\": 83,\n\t\"./cv\": 84,\n\t\"./cv.js\": 84,\n\t\"./cy\": 85,\n\t\"./cy.js\": 85,\n\t\"./da\": 86,\n\t\"./da.js\": 86,\n\t\"./de\": 87,\n\t\"./de-at\": 88,\n\t\"./de-at.js\": 88,\n\t\"./de-ch\": 89,\n\t\"./de-ch.js\": 89,\n\t\"./de.js\": 87,\n\t\"./dv\": 90,\n\t\"./dv.js\": 90,\n\t\"./el\": 91,\n\t\"./el.js\": 91,\n\t\"./en-SG\": 92,\n\t\"./en-SG.js\": 92,\n\t\"./en-au\": 93,\n\t\"./en-au.js\": 93,\n\t\"./en-ca\": 94,\n\t\"./en-ca.js\": 94,\n\t\"./en-gb\": 95,\n\t\"./en-gb.js\": 95,\n\t\"./en-ie\": 96,\n\t\"./en-ie.js\": 96,\n\t\"./en-il\": 97,\n\t\"./en-il.js\": 97,\n\t\"./en-nz\": 98,\n\t\"./en-nz.js\": 98,\n\t\"./eo\": 99,\n\t\"./eo.js\": 99,\n\t\"./es\": 100,\n\t\"./es-do\": 101,\n\t\"./es-do.js\": 101,\n\t\"./es-us\": 102,\n\t\"./es-us.js\": 102,\n\t\"./es.js\": 100,\n\t\"./et\": 103,\n\t\"./et.js\": 103,\n\t\"./eu\": 104,\n\t\"./eu.js\": 104,\n\t\"./fa\": 105,\n\t\"./fa.js\": 105,\n\t\"./fi\": 106,\n\t\"./fi.js\": 106,\n\t\"./fo\": 107,\n\t\"./fo.js\": 107,\n\t\"./fr\": 108,\n\t\"./fr-ca\": 109,\n\t\"./fr-ca.js\": 109,\n\t\"./fr-ch\": 110,\n\t\"./fr-ch.js\": 110,\n\t\"./fr.js\": 108,\n\t\"./fy\": 111,\n\t\"./fy.js\": 111,\n\t\"./ga\": 112,\n\t\"./ga.js\": 112,\n\t\"./gd\": 113,\n\t\"./gd.js\": 113,\n\t\"./gl\": 114,\n\t\"./gl.js\": 114,\n\t\"./gom-latn\": 115,\n\t\"./gom-latn.js\": 115,\n\t\"./gu\": 116,\n\t\"./gu.js\": 116,\n\t\"./he\": 117,\n\t\"./he.js\": 117,\n\t\"./hi\": 118,\n\t\"./hi.js\": 118,\n\t\"./hr\": 119,\n\t\"./hr.js\": 119,\n\t\"./hu\": 120,\n\t\"./hu.js\": 120,\n\t\"./hy-am\": 121,\n\t\"./hy-am.js\": 121,\n\t\"./id\": 122,\n\t\"./id.js\": 122,\n\t\"./is\": 123,\n\t\"./is.js\": 123,\n\t\"./it\": 124,\n\t\"./it-ch\": 125,\n\t\"./it-ch.js\": 125,\n\t\"./it.js\": 124,\n\t\"./ja\": 126,\n\t\"./ja.js\": 126,\n\t\"./jv\": 127,\n\t\"./jv.js\": 127,\n\t\"./ka\": 128,\n\t\"./ka.js\": 128,\n\t\"./kk\": 129,\n\t\"./kk.js\": 129,\n\t\"./km\": 130,\n\t\"./km.js\": 130,\n\t\"./kn\": 131,\n\t\"./kn.js\": 131,\n\t\"./ko\": 132,\n\t\"./ko.js\": 132,\n\t\"./ku\": 133,\n\t\"./ku.js\": 133,\n\t\"./ky\": 134,\n\t\"./ky.js\": 134,\n\t\"./lb\": 135,\n\t\"./lb.js\": 135,\n\t\"./lo\": 136,\n\t\"./lo.js\": 136,\n\t\"./lt\": 137,\n\t\"./lt.js\": 137,\n\t\"./lv\": 138,\n\t\"./lv.js\": 138,\n\t\"./me\": 139,\n\t\"./me.js\": 139,\n\t\"./mi\": 140,\n\t\"./mi.js\": 140,\n\t\"./mk\": 141,\n\t\"./mk.js\": 141,\n\t\"./ml\": 142,\n\t\"./ml.js\": 142,\n\t\"./mn\": 143,\n\t\"./mn.js\": 143,\n\t\"./mr\": 144,\n\t\"./mr.js\": 144,\n\t\"./ms\": 145,\n\t\"./ms-my\": 146,\n\t\"./ms-my.js\": 146,\n\t\"./ms.js\": 145,\n\t\"./mt\": 147,\n\t\"./mt.js\": 147,\n\t\"./my\": 148,\n\t\"./my.js\": 148,\n\t\"./nb\": 149,\n\t\"./nb.js\": 149,\n\t\"./ne\": 150,\n\t\"./ne.js\": 150,\n\t\"./nl\": 151,\n\t\"./nl-be\": 152,\n\t\"./nl-be.js\": 152,\n\t\"./nl.js\": 151,\n\t\"./nn\": 153,\n\t\"./nn.js\": 153,\n\t\"./pa-in\": 154,\n\t\"./pa-in.js\": 154,\n\t\"./pl\": 155,\n\t\"./pl.js\": 155,\n\t\"./pt\": 156,\n\t\"./pt-br\": 157,\n\t\"./pt-br.js\": 157,\n\t\"./pt.js\": 156,\n\t\"./ro\": 158,\n\t\"./ro.js\": 158,\n\t\"./ru\": 159,\n\t\"./ru.js\": 159,\n\t\"./sd\": 160,\n\t\"./sd.js\": 160,\n\t\"./se\": 161,\n\t\"./se.js\": 161,\n\t\"./si\": 162,\n\t\"./si.js\": 162,\n\t\"./sk\": 163,\n\t\"./sk.js\": 163,\n\t\"./sl\": 164,\n\t\"./sl.js\": 164,\n\t\"./sq\": 165,\n\t\"./sq.js\": 165,\n\t\"./sr\": 166,\n\t\"./sr-cyrl\": 167,\n\t\"./sr-cyrl.js\": 167,\n\t\"./sr.js\": 166,\n\t\"./ss\": 168,\n\t\"./ss.js\": 168,\n\t\"./sv\": 169,\n\t\"./sv.js\": 169,\n\t\"./sw\": 170,\n\t\"./sw.js\": 170,\n\t\"./ta\": 171,\n\t\"./ta.js\": 171,\n\t\"./te\": 172,\n\t\"./te.js\": 172,\n\t\"./tet\": 173,\n\t\"./tet.js\": 173,\n\t\"./tg\": 174,\n\t\"./tg.js\": 174,\n\t\"./th\": 175,\n\t\"./th.js\": 175,\n\t\"./tl-ph\": 176,\n\t\"./tl-ph.js\": 176,\n\t\"./tlh\": 177,\n\t\"./tlh.js\": 177,\n\t\"./tr\": 178,\n\t\"./tr.js\": 178,\n\t\"./tzl\": 179,\n\t\"./tzl.js\": 179,\n\t\"./tzm\": 180,\n\t\"./tzm-latn\": 181,\n\t\"./tzm-latn.js\": 181,\n\t\"./tzm.js\": 180,\n\t\"./ug-cn\": 182,\n\t\"./ug-cn.js\": 182,\n\t\"./uk\": 183,\n\t\"./uk.js\": 183,\n\t\"./ur\": 184,\n\t\"./ur.js\": 184,\n\t\"./uz\": 185,\n\t\"./uz-latn\": 186,\n\t\"./uz-latn.js\": 186,\n\t\"./uz.js\": 185,\n\t\"./vi\": 187,\n\t\"./vi.js\": 187,\n\t\"./x-pseudo\": 188,\n\t\"./x-pseudo.js\": 188,\n\t\"./yo\": 189,\n\t\"./yo.js\": 189,\n\t\"./zh-cn\": 190,\n\t\"./zh-cn.js\": 190,\n\t\"./zh-hk\": 191,\n\t\"./zh-hk.js\": 191,\n\t\"./zh-tw\": 192,\n\t\"./zh-tw.js\": 192\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 294;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale ^\\.\\/.*$\n// module id = 294\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Which resources do you want to reserve?\")])],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.resourcesCheckboxes),function(checkbox){return _c('div',{key:checkbox.uuid,staticClass:\"resources_row\"},[_c('v-checkbox',{attrs:{\"label\":((checkbox.nodeName) + \" GPU\" + (checkbox.index) + \" \" + (checkbox.name)),\"disabled\":checkbox.disabled},model:{value:(checkbox.checked),callback:function ($$v) {_vm.$set(checkbox, \"checked\", $$v)},expression:\"checkbox.checked\"}})],1)}),0),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}]),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}]),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}]),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}]),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.reservationTitle),callback:function ($$v) {_vm.reservationTitle=$$v},expression:\"reservationTitle\"}}),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.reservationDescription),callback:function ($$v) {_vm.reservationDescription=$$v},expression:\"reservationDescription\"}}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showInfo===true),expression:\"showInfo===true\"}],staticClass:\"text-red\"},[_c('p',{staticClass:\"vertical-5p lead\"},[_vm._v(\"You need to choose at least one resource to reserve\")])]),_vm._v(\" \"),_c('div',{staticClass:\"modal-footer text-right\"},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.reservation()}}},[_vm._v(\"\\n Reserve\\n \")])],1)],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6b687e6b\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/FullCalendarReserve.vue\n// module id = 295\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-7c5a8e25\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./FullCalendarInfo.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarInfo.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarInfo.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7c5a8e25\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./FullCalendarInfo.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/FullCalendarInfo.vue\n// module id = 296\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"indigo\",\"text-color\":\"white\"}},[_c('v-avatar',{attrs:{\"left\":\"\"}},[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"account_circle\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.userName))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"teal\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"dns\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.hostname))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"light-green\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"memory\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(\"GPU\"+_vm._s(_vm.reservation.resourceIndex)+\" \"+_vm._s(_vm.reservation.resourceName))])],1),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Title:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.title)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.newTitle),callback:function ($$v) {_vm.newTitle=$$v},expression:\"newTitle\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Description:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.description)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.newDescription),callback:function ($$v) {_vm.newDescription=$$v},expression:\"newDescription\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.gpuUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU memory utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.memUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Start:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.start))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}],null,false,710299969),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}],null,false,4222293411),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"End:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.end))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}],null,false,3230088161),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}],null,false,2362500227),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 5 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"GPU UUID:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.resourceId)+\"\\n \")]),_vm._v(\" \"),(_vm.tasksCard)?_c('v-card-text',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"warning\"},model:{value:(_vm.showAlert),callback:function ($$v) {_vm.showAlert=$$v},expression:\"showAlert\"}},[_vm._v(\"Synchronization in progress. Task assign is disabled now.\")])],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}})],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\"\\n \"+_vm._s(header.text)+\"\\n \")],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))])])]}}],null,false,4156683076),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}],null,false,63074868)})],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){return _vm.checkActionFlag()}}},[_vm._v(\"Assign selected\")]):_vm._e(),_vm._v(\" \"),(_vm.actionsAbility)?_c('v-card-text',{staticClass:\"container\"},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"yellow\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.tasksCard=!_vm.tasksCard; _vm.cancelCard=false; _vm.updateCard=false}}},[_vm._v(\"Schedule task(s) for this reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"error\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=!_vm.cancelCard; _vm.tasksCard=false; _vm.updateCard=false}}},[_vm._v(\"Cancel reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=!_vm.updateCard; _vm.tasksCard=false, _vm.cancelCard=false}}},[_vm._v(\"Edit reservation\")])],1):_vm._e(),_vm._v(\" \"),(_vm.cancelCard)?_c('v-card-text',[_vm._v(\"\\n Do you want to cancel selected reservation?\\n \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=false}}},[_vm._v(\"No\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.cancelReservation()}}},[_vm._v(\"Yes\")])],1):_vm._e(),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=false}}},[_vm._v(\"Back\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.updateReservation()}}},[_vm._v(\"Update\")])],1):_vm._e()],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7c5a8e25\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/FullCalendarInfo.vue\n// module id = 298\n// module chunks = 1","/*!\r\n * FullCalendar v3.9.0\r\n * Docs & License: https://fullcalendar.io/\r\n * (c) 2018 Adam Shaw\r\n */\r\n(function webpackUniversalModuleDefinition(root, factory) {\r\n\tif(typeof exports === 'object' && typeof module === 'object')\r\n\t\tmodule.exports = factory(require(\"moment\"), require(\"jquery\"));\r\n\telse if(typeof define === 'function' && define.amd)\r\n\t\tdefine([\"moment\", \"jquery\"], factory);\r\n\telse if(typeof exports === 'object')\r\n\t\texports[\"FullCalendar\"] = factory(require(\"moment\"), require(\"jquery\"));\r\n\telse\r\n\t\troot[\"FullCalendar\"] = factory(root[\"moment\"], root[\"jQuery\"]);\r\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3__) {\r\nreturn /******/ (function(modules) { // webpackBootstrap\r\n/******/ \t// The module cache\r\n/******/ \tvar installedModules = {};\r\n/******/\r\n/******/ \t// The require function\r\n/******/ \tfunction __webpack_require__(moduleId) {\r\n/******/\r\n/******/ \t\t// Check if module is in cache\r\n/******/ \t\tif(installedModules[moduleId]) {\r\n/******/ \t\t\treturn installedModules[moduleId].exports;\r\n/******/ \t\t}\r\n/******/ \t\t// Create a new module (and put it into the cache)\r\n/******/ \t\tvar module = installedModules[moduleId] = {\r\n/******/ \t\t\ti: moduleId,\r\n/******/ \t\t\tl: false,\r\n/******/ \t\t\texports: {}\r\n/******/ \t\t};\r\n/******/\r\n/******/ \t\t// Execute the module function\r\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n/******/\r\n/******/ \t\t// Flag the module as loaded\r\n/******/ \t\tmodule.l = true;\r\n/******/\r\n/******/ \t\t// Return the exports of the module\r\n/******/ \t\treturn module.exports;\r\n/******/ \t}\r\n/******/\r\n/******/\r\n/******/ \t// expose the modules object (__webpack_modules__)\r\n/******/ \t__webpack_require__.m = modules;\r\n/******/\r\n/******/ \t// expose the module cache\r\n/******/ \t__webpack_require__.c = installedModules;\r\n/******/\r\n/******/ \t// define getter function for harmony exports\r\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\r\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\r\n/******/ \t\t\tObject.defineProperty(exports, name, {\r\n/******/ \t\t\t\tconfigurable: false,\r\n/******/ \t\t\t\tenumerable: true,\r\n/******/ \t\t\t\tget: getter\r\n/******/ \t\t\t});\r\n/******/ \t\t}\r\n/******/ \t};\r\n/******/\r\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\r\n/******/ \t__webpack_require__.n = function(module) {\r\n/******/ \t\tvar getter = module && module.__esModule ?\r\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\r\n/******/ \t\t\tfunction getModuleExports() { return module; };\r\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\r\n/******/ \t\treturn getter;\r\n/******/ \t};\r\n/******/\r\n/******/ \t// Object.prototype.hasOwnProperty.call\r\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\r\n/******/\r\n/******/ \t// __webpack_public_path__\r\n/******/ \t__webpack_require__.p = \"\";\r\n/******/\r\n/******/ \t// Load entry module and return exports\r\n/******/ \treturn __webpack_require__(__webpack_require__.s = 236);\r\n/******/ })\r\n/************************************************************************/\r\n/******/ ([\r\n/* 0 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\r\n\r\n/***/ }),\r\n/* 1 */,\r\n/* 2 */\r\n/***/ (function(module, exports) {\r\n\r\n/*\r\nderived from:\r\nhttps://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js\r\n\r\nonly include the helpers we need, to keep down filesize\r\n*/\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b)\r\n if (b.hasOwnProperty(p))\r\n d[p] = b[p]; };\r\nexports.__extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 3 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\r\n\r\n/***/ }),\r\n/* 4 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\n/* FullCalendar-specific DOM Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\r\n// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\r\nfunction compensateScroll(rowEls, scrollbarWidths) {\r\n if (scrollbarWidths.left) {\r\n rowEls.css({\r\n 'border-left-width': 1,\r\n 'margin-left': scrollbarWidths.left - 1\r\n });\r\n }\r\n if (scrollbarWidths.right) {\r\n rowEls.css({\r\n 'border-right-width': 1,\r\n 'margin-right': scrollbarWidths.right - 1\r\n });\r\n }\r\n}\r\nexports.compensateScroll = compensateScroll;\r\n// Undoes compensateScroll and restores all borders/margins\r\nfunction uncompensateScroll(rowEls) {\r\n rowEls.css({\r\n 'margin-left': '',\r\n 'margin-right': '',\r\n 'border-left-width': '',\r\n 'border-right-width': ''\r\n });\r\n}\r\nexports.uncompensateScroll = uncompensateScroll;\r\n// Make the mouse cursor express that an event is not allowed in the current area\r\nfunction disableCursor() {\r\n $('body').addClass('fc-not-allowed');\r\n}\r\nexports.disableCursor = disableCursor;\r\n// Returns the mouse cursor to its original look\r\nfunction enableCursor() {\r\n $('body').removeClass('fc-not-allowed');\r\n}\r\nexports.enableCursor = enableCursor;\r\n// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\r\n// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\r\n// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and\r\n// reduces the available height.\r\nfunction distributeHeight(els, availableHeight, shouldRedistribute) {\r\n // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\r\n // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\r\n var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\r\n var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\r\n var flexEls = []; // elements that are allowed to expand. array of DOM nodes\r\n var flexOffsets = []; // amount of vertical space it takes up\r\n var flexHeights = []; // actual css height\r\n var usedHeight = 0;\r\n undistributeHeight(els); // give all elements their natural height\r\n // find elements that are below the recommended height (expandable).\r\n // important to query for heights in a single first pass (to avoid reflow oscillation).\r\n els.each(function (i, el) {\r\n var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = $(el).outerHeight(true);\r\n if (naturalOffset < minOffset) {\r\n flexEls.push(el);\r\n flexOffsets.push(naturalOffset);\r\n flexHeights.push($(el).height());\r\n }\r\n else {\r\n // this element stretches past recommended height (non-expandable). mark the space as occupied.\r\n usedHeight += naturalOffset;\r\n }\r\n });\r\n // readjust the recommended height to only consider the height available to non-maxed-out rows.\r\n if (shouldRedistribute) {\r\n availableHeight -= usedHeight;\r\n minOffset1 = Math.floor(availableHeight / flexEls.length);\r\n minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\r\n }\r\n // assign heights to all expandable elements\r\n $(flexEls).each(function (i, el) {\r\n var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = flexOffsets[i];\r\n var naturalHeight = flexHeights[i];\r\n var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\r\n if (naturalOffset < minOffset) {\r\n $(el).height(newHeight);\r\n }\r\n });\r\n}\r\nexports.distributeHeight = distributeHeight;\r\n// Undoes distrubuteHeight, restoring all els to their natural height\r\nfunction undistributeHeight(els) {\r\n els.height('');\r\n}\r\nexports.undistributeHeight = undistributeHeight;\r\n// Given `els`, a jQuery set of cells, find the cell with the largest natural width and set the widths of all the\r\n// cells to be that width.\r\n// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\r\nfunction matchCellWidths(els) {\r\n var maxInnerWidth = 0;\r\n els.find('> *').each(function (i, innerEl) {\r\n var innerWidth = $(innerEl).outerWidth();\r\n if (innerWidth > maxInnerWidth) {\r\n maxInnerWidth = innerWidth;\r\n }\r\n });\r\n maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\r\n els.width(maxInnerWidth);\r\n return maxInnerWidth;\r\n}\r\nexports.matchCellWidths = matchCellWidths;\r\n// Given one element that resides inside another,\r\n// Subtracts the height of the inner element from the outer element.\r\nfunction subtractInnerElHeight(outerEl, innerEl) {\r\n var both = outerEl.add(innerEl);\r\n var diff;\r\n // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\r\n both.css({\r\n position: 'relative',\r\n left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\r\n });\r\n diff = outerEl.outerHeight() - innerEl.outerHeight(); // grab the dimensions\r\n both.css({ position: '', left: '' }); // undo hack\r\n return diff;\r\n}\r\nexports.subtractInnerElHeight = subtractInnerElHeight;\r\n/* Element Geom Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51\r\nfunction getScrollParent(el) {\r\n var position = el.css('position');\r\n var scrollParent = el.parents().filter(function () {\r\n var parent = $(this);\r\n return (/(auto|scroll)/).test(parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x'));\r\n }).eq(0);\r\n return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;\r\n}\r\nexports.getScrollParent = getScrollParent;\r\n// Queries the outer bounding area of a jQuery element.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getOuterRect(el, origin) {\r\n var offset = el.offset();\r\n var left = offset.left - (origin ? origin.left : 0);\r\n var top = offset.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.outerWidth(),\r\n top: top,\r\n bottom: top + el.outerHeight()\r\n };\r\n}\r\nexports.getOuterRect = getOuterRect;\r\n// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\n// WARNING: given element can't have borders\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getClientRect(el, origin) {\r\n var offset = el.offset();\r\n var scrollbarWidths = getScrollbarWidths(el);\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left - (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el[0].clientWidth,\r\n top: top,\r\n bottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars\r\n };\r\n}\r\nexports.getClientRect = getClientRect;\r\n// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getContentRect(el, origin) {\r\n var offset = el.offset(); // just outside of border, margin not included\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left') -\r\n (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top') -\r\n (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.width(),\r\n top: top,\r\n bottom: top + el.height()\r\n };\r\n}\r\nexports.getContentRect = getContentRect;\r\n// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.\r\n// WARNING: given element can't have borders (which will cause offsetWidth/offsetHeight to be larger).\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getScrollbarWidths(el) {\r\n var leftRightWidth = el[0].offsetWidth - el[0].clientWidth;\r\n var bottomWidth = el[0].offsetHeight - el[0].clientHeight;\r\n var widths;\r\n leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);\r\n bottomWidth = sanitizeScrollbarWidth(bottomWidth);\r\n widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };\r\n if (getIsLeftRtlScrollbars() && el.css('direction') === 'rtl') {\r\n widths.left = leftRightWidth;\r\n }\r\n else {\r\n widths.right = leftRightWidth;\r\n }\r\n return widths;\r\n}\r\nexports.getScrollbarWidths = getScrollbarWidths;\r\n// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to\r\n// retina displays, rounding, and IE11. Massage them into a usable value.\r\nfunction sanitizeScrollbarWidth(width) {\r\n width = Math.max(0, width); // no negatives\r\n width = Math.round(width);\r\n return width;\r\n}\r\n// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\r\nvar _isLeftRtlScrollbars = null;\r\nfunction getIsLeftRtlScrollbars() {\r\n if (_isLeftRtlScrollbars === null) {\r\n _isLeftRtlScrollbars = computeIsLeftRtlScrollbars();\r\n }\r\n return _isLeftRtlScrollbars;\r\n}\r\nfunction computeIsLeftRtlScrollbars() {\r\n var el = $('
')\r\n .css({\r\n position: 'absolute',\r\n top: -1000,\r\n left: 0,\r\n border: 0,\r\n padding: 0,\r\n overflow: 'scroll',\r\n direction: 'rtl'\r\n })\r\n .appendTo('body');\r\n var innerEl = el.children();\r\n var res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?\r\n el.remove();\r\n return res;\r\n}\r\n// Retrieves a jQuery element's computed CSS value as a floating-point number.\r\n// If the queried value is non-numeric (ex: IE can return \"medium\" for border width), will just return zero.\r\nfunction getCssFloat(el, prop) {\r\n return parseFloat(el.css(prop)) || 0;\r\n}\r\n/* Mouse / Touch Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\r\nfunction isPrimaryMouseButton(ev) {\r\n return ev.which === 1 && !ev.ctrlKey;\r\n}\r\nexports.isPrimaryMouseButton = isPrimaryMouseButton;\r\nfunction getEvX(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageX;\r\n }\r\n return ev.pageX;\r\n}\r\nexports.getEvX = getEvX;\r\nfunction getEvY(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageY;\r\n }\r\n return ev.pageY;\r\n}\r\nexports.getEvY = getEvY;\r\nfunction getEvIsTouch(ev) {\r\n return /^touch/.test(ev.type);\r\n}\r\nexports.getEvIsTouch = getEvIsTouch;\r\nfunction preventSelection(el) {\r\n el.addClass('fc-unselectable')\r\n .on('selectstart', preventDefault);\r\n}\r\nexports.preventSelection = preventSelection;\r\nfunction allowSelection(el) {\r\n el.removeClass('fc-unselectable')\r\n .off('selectstart', preventDefault);\r\n}\r\nexports.allowSelection = allowSelection;\r\n// Stops a mouse/touch event from doing it's native browser action\r\nfunction preventDefault(ev) {\r\n ev.preventDefault();\r\n}\r\nexports.preventDefault = preventDefault;\r\n/* General Geometry Utils\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\r\nfunction intersectRects(rect1, rect2) {\r\n var res = {\r\n left: Math.max(rect1.left, rect2.left),\r\n right: Math.min(rect1.right, rect2.right),\r\n top: Math.max(rect1.top, rect2.top),\r\n bottom: Math.min(rect1.bottom, rect2.bottom)\r\n };\r\n if (res.left < res.right && res.top < res.bottom) {\r\n return res;\r\n }\r\n return false;\r\n}\r\nexports.intersectRects = intersectRects;\r\n// Returns a new point that will have been moved to reside within the given rectangle\r\nfunction constrainPoint(point, rect) {\r\n return {\r\n left: Math.min(Math.max(point.left, rect.left), rect.right),\r\n top: Math.min(Math.max(point.top, rect.top), rect.bottom)\r\n };\r\n}\r\nexports.constrainPoint = constrainPoint;\r\n// Returns a point that is the center of the given rectangle\r\nfunction getRectCenter(rect) {\r\n return {\r\n left: (rect.left + rect.right) / 2,\r\n top: (rect.top + rect.bottom) / 2\r\n };\r\n}\r\nexports.getRectCenter = getRectCenter;\r\n// Subtracts point2's coordinates from point1's coordinates, returning a delta\r\nfunction diffPoints(point1, point2) {\r\n return {\r\n left: point1.left - point2.left,\r\n top: point1.top - point2.top\r\n };\r\n}\r\nexports.diffPoints = diffPoints;\r\n/* Object Ordering by Field\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction parseFieldSpecs(input) {\r\n var specs = [];\r\n var tokens = [];\r\n var i;\r\n var token;\r\n if (typeof input === 'string') {\r\n tokens = input.split(/\\s*,\\s*/);\r\n }\r\n else if (typeof input === 'function') {\r\n tokens = [input];\r\n }\r\n else if ($.isArray(input)) {\r\n tokens = input;\r\n }\r\n for (i = 0; i < tokens.length; i++) {\r\n token = tokens[i];\r\n if (typeof token === 'string') {\r\n specs.push(token.charAt(0) === '-' ?\r\n { field: token.substring(1), order: -1 } :\r\n { field: token, order: 1 });\r\n }\r\n else if (typeof token === 'function') {\r\n specs.push({ func: token });\r\n }\r\n }\r\n return specs;\r\n}\r\nexports.parseFieldSpecs = parseFieldSpecs;\r\nfunction compareByFieldSpecs(obj1, obj2, fieldSpecs, obj1fallback, obj2fallback) {\r\n var i;\r\n var cmp;\r\n for (i = 0; i < fieldSpecs.length; i++) {\r\n cmp = compareByFieldSpec(obj1, obj2, fieldSpecs[i], obj1fallback, obj2fallback);\r\n if (cmp) {\r\n return cmp;\r\n }\r\n }\r\n return 0;\r\n}\r\nexports.compareByFieldSpecs = compareByFieldSpecs;\r\nfunction compareByFieldSpec(obj1, obj2, fieldSpec, obj1fallback, obj2fallback) {\r\n if (fieldSpec.func) {\r\n return fieldSpec.func(obj1, obj2);\r\n }\r\n var val1 = obj1[fieldSpec.field];\r\n var val2 = obj2[fieldSpec.field];\r\n if (val1 == null && obj1fallback) {\r\n val1 = obj1fallback[fieldSpec.field];\r\n }\r\n if (val2 == null && obj2fallback) {\r\n val2 = obj2fallback[fieldSpec.field];\r\n }\r\n return flexibleCompare(val1, val2) * (fieldSpec.order || 1);\r\n}\r\nexports.compareByFieldSpec = compareByFieldSpec;\r\nfunction flexibleCompare(a, b) {\r\n if (!a && !b) {\r\n return 0;\r\n }\r\n if (b == null) {\r\n return -1;\r\n }\r\n if (a == null) {\r\n return 1;\r\n }\r\n if ($.type(a) === 'string' || $.type(b) === 'string') {\r\n return String(a).localeCompare(String(b));\r\n }\r\n return a - b;\r\n}\r\nexports.flexibleCompare = flexibleCompare;\r\n/* Date Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nexports.dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\r\nexports.unitsDesc = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; // descending\r\n// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.\r\n// Moments will have their timezones normalized.\r\nfunction diffDayTime(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),\r\n ms: a.time() - b.time() // time-of-day from day start. disregards timezone\r\n });\r\n}\r\nexports.diffDayTime = diffDayTime;\r\n// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.\r\nfunction diffDay(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days')\r\n });\r\n}\r\nexports.diffDay = diffDay;\r\n// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.\r\nfunction diffByUnit(a, b, unit) {\r\n return moment.duration(Math.round(a.diff(b, unit, true)), // returnFloat=true\r\n unit);\r\n}\r\nexports.diffByUnit = diffByUnit;\r\n// Computes the unit name of the largest whole-unit period of time.\r\n// For example, 48 hours will be \"days\" whereas 49 hours will be \"hours\".\r\n// Accepts start/end, a range object, or an original duration object.\r\nfunction computeGreatestUnit(start, end) {\r\n var i;\r\n var unit;\r\n var val;\r\n for (i = 0; i < exports.unitsDesc.length; i++) {\r\n unit = exports.unitsDesc[i];\r\n val = computeRangeAs(unit, start, end);\r\n if (val >= 1 && isInt(val)) {\r\n break;\r\n }\r\n }\r\n return unit; // will be \"milliseconds\" if nothing else matches\r\n}\r\nexports.computeGreatestUnit = computeGreatestUnit;\r\n// like computeGreatestUnit, but has special abilities to interpret the source input for clues\r\nfunction computeDurationGreatestUnit(duration, durationInput) {\r\n var unit = computeGreatestUnit(duration);\r\n // prevent days:7 from being interpreted as a week\r\n if (unit === 'week' && typeof durationInput === 'object' && durationInput.days) {\r\n unit = 'day';\r\n }\r\n return unit;\r\n}\r\nexports.computeDurationGreatestUnit = computeDurationGreatestUnit;\r\n// Computes the number of units (like \"hours\") in the given range.\r\n// Range can be a {start,end} object, separate start/end args, or a Duration.\r\n// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling\r\n// of month-diffing logic (which tends to vary from version to version).\r\nfunction computeRangeAs(unit, start, end) {\r\n if (end != null) {\r\n return end.diff(start, unit, true);\r\n }\r\n else if (moment.isDuration(start)) {\r\n return start.as(unit);\r\n }\r\n else {\r\n return start.end.diff(start.start, unit, true);\r\n }\r\n}\r\n// Intelligently divides a range (specified by a start/end params) by a duration\r\nfunction divideRangeByDuration(start, end, dur) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return (end - start) / dur;\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return end.diff(start, 'months', true) / months;\r\n }\r\n return end.diff(start, 'days', true) / dur.asDays();\r\n}\r\nexports.divideRangeByDuration = divideRangeByDuration;\r\n// Intelligently divides one duration by another\r\nfunction divideDurationByDuration(dur1, dur2) {\r\n var months1;\r\n var months2;\r\n if (durationHasTime(dur1) || durationHasTime(dur2)) {\r\n return dur1 / dur2;\r\n }\r\n months1 = dur1.asMonths();\r\n months2 = dur2.asMonths();\r\n if (Math.abs(months1) >= 1 && isInt(months1) &&\r\n Math.abs(months2) >= 1 && isInt(months2)) {\r\n return months1 / months2;\r\n }\r\n return dur1.asDays() / dur2.asDays();\r\n}\r\nexports.divideDurationByDuration = divideDurationByDuration;\r\n// Intelligently multiplies a duration by a number\r\nfunction multiplyDuration(dur, n) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return moment.duration(dur * n);\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return moment.duration({ months: months * n });\r\n }\r\n return moment.duration({ days: dur.asDays() * n });\r\n}\r\nexports.multiplyDuration = multiplyDuration;\r\n// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)\r\nfunction durationHasTime(dur) {\r\n return Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());\r\n}\r\nexports.durationHasTime = durationHasTime;\r\nfunction isNativeDate(input) {\r\n return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;\r\n}\r\nexports.isNativeDate = isNativeDate;\r\n// Returns a boolean about whether the given input is a time string, like \"06:40:00\" or \"06:00\"\r\nfunction isTimeString(str) {\r\n return typeof str === 'string' &&\r\n /^\\d+\\:\\d+(?:\\:\\d+\\.?(?:\\d{3})?)?$/.test(str);\r\n}\r\nexports.isTimeString = isTimeString;\r\n/* Logging and Debug\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction log() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.log) {\r\n return console.log.apply(console, args);\r\n }\r\n}\r\nexports.log = log;\r\nfunction warn() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.warn) {\r\n return console.warn.apply(console, args);\r\n }\r\n else {\r\n return log.apply(null, args);\r\n }\r\n}\r\nexports.warn = warn;\r\n/* General Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar hasOwnPropMethod = {}.hasOwnProperty;\r\n// Merges an array of objects into a single object.\r\n// The second argument allows for an array of property names who's object values will be merged together.\r\nfunction mergeProps(propObjs, complexProps) {\r\n var dest = {};\r\n var i;\r\n var name;\r\n var complexObjs;\r\n var j;\r\n var val;\r\n var props;\r\n if (complexProps) {\r\n for (i = 0; i < complexProps.length; i++) {\r\n name = complexProps[i];\r\n complexObjs = [];\r\n // collect the trailing object values, stopping when a non-object is discovered\r\n for (j = propObjs.length - 1; j >= 0; j--) {\r\n val = propObjs[j][name];\r\n if (typeof val === 'object') {\r\n complexObjs.unshift(val);\r\n }\r\n else if (val !== undefined) {\r\n dest[name] = val; // if there were no objects, this value will be used\r\n break;\r\n }\r\n }\r\n // if the trailing values were objects, use the merged value\r\n if (complexObjs.length) {\r\n dest[name] = mergeProps(complexObjs);\r\n }\r\n }\r\n }\r\n // copy values into the destination, going from last to first\r\n for (i = propObjs.length - 1; i >= 0; i--) {\r\n props = propObjs[i];\r\n for (name in props) {\r\n if (!(name in dest)) {\r\n dest[name] = props[name];\r\n }\r\n }\r\n }\r\n return dest;\r\n}\r\nexports.mergeProps = mergeProps;\r\nfunction copyOwnProps(src, dest) {\r\n for (var name_1 in src) {\r\n if (hasOwnProp(src, name_1)) {\r\n dest[name_1] = src[name_1];\r\n }\r\n }\r\n}\r\nexports.copyOwnProps = copyOwnProps;\r\nfunction hasOwnProp(obj, name) {\r\n return hasOwnPropMethod.call(obj, name);\r\n}\r\nexports.hasOwnProp = hasOwnProp;\r\nfunction applyAll(functions, thisObj, args) {\r\n if ($.isFunction(functions)) {\r\n functions = [functions];\r\n }\r\n if (functions) {\r\n var i = void 0;\r\n var ret = void 0;\r\n for (i = 0; i < functions.length; i++) {\r\n ret = functions[i].apply(thisObj, args) || ret;\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.applyAll = applyAll;\r\nfunction removeMatching(array, testFunc) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (testFunc(array[i])) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeMatching = removeMatching;\r\nfunction removeExact(array, exactVal) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (array[i] === exactVal) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeExact = removeExact;\r\nfunction isArraysEqual(a0, a1) {\r\n var len = a0.length;\r\n var i;\r\n if (len == null || len !== a1.length) {\r\n return false;\r\n }\r\n for (i = 0; i < len; i++) {\r\n if (a0[i] !== a1[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nexports.isArraysEqual = isArraysEqual;\r\nfunction firstDefined() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n for (var i = 0; i < args.length; i++) {\r\n if (args[i] !== undefined) {\r\n return args[i];\r\n }\r\n }\r\n}\r\nexports.firstDefined = firstDefined;\r\nfunction htmlEscape(s) {\r\n return (s + '').replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/'/g, ''')\r\n .replace(/\"/g, '"')\r\n .replace(/\\n/g, '
');\r\n}\r\nexports.htmlEscape = htmlEscape;\r\nfunction stripHtmlEntities(text) {\r\n return text.replace(/&.*?;/g, '');\r\n}\r\nexports.stripHtmlEntities = stripHtmlEntities;\r\n// Given a hash of CSS properties, returns a string of CSS.\r\n// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\r\nfunction cssToStr(cssProps) {\r\n var statements = [];\r\n $.each(cssProps, function (name, val) {\r\n if (val != null) {\r\n statements.push(name + ':' + val);\r\n }\r\n });\r\n return statements.join(';');\r\n}\r\nexports.cssToStr = cssToStr;\r\n// Given an object hash of HTML attribute names to values,\r\n// generates a string that can be injected between < > in HTML\r\nfunction attrsToStr(attrs) {\r\n var parts = [];\r\n $.each(attrs, function (name, val) {\r\n if (val != null) {\r\n parts.push(name + '=\"' + htmlEscape(val) + '\"');\r\n }\r\n });\r\n return parts.join(' ');\r\n}\r\nexports.attrsToStr = attrsToStr;\r\nfunction capitaliseFirstLetter(str) {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\nexports.capitaliseFirstLetter = capitaliseFirstLetter;\r\nfunction compareNumbers(a, b) {\r\n return a - b;\r\n}\r\nexports.compareNumbers = compareNumbers;\r\nfunction isInt(n) {\r\n return n % 1 === 0;\r\n}\r\nexports.isInt = isInt;\r\n// Returns a method bound to the given object context.\r\n// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with\r\n// different contexts as identical when binding/unbinding events.\r\nfunction proxy(obj, methodName) {\r\n var method = obj[methodName];\r\n return function () {\r\n return method.apply(obj, arguments);\r\n };\r\n}\r\nexports.proxy = proxy;\r\n// Returns a function, that, as long as it continues to be invoked, will not\r\n// be triggered. The function will be called after it stops being called for\r\n// N milliseconds. If `immediate` is passed, trigger the function on the\r\n// leading edge, instead of the trailing.\r\n// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\r\nfunction debounce(func, wait, immediate) {\r\n if (immediate === void 0) { immediate = false; }\r\n var timeout;\r\n var args;\r\n var context;\r\n var timestamp;\r\n var result;\r\n var later = function () {\r\n var last = +new Date() - timestamp;\r\n if (last < wait) {\r\n timeout = setTimeout(later, wait - last);\r\n }\r\n else {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n }\r\n };\r\n return function () {\r\n context = this;\r\n args = arguments;\r\n timestamp = +new Date();\r\n var callNow = immediate && !timeout;\r\n if (!timeout) {\r\n timeout = setTimeout(later, wait);\r\n }\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n return result;\r\n };\r\n}\r\nexports.debounce = debounce;\r\n\r\n\r\n/***/ }),\r\n/* 5 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange = /** @class */ (function () {\r\n function UnzonedRange(startInput, endInput) {\r\n // TODO: move these into footprint.\r\n // Especially, doesn't make sense for null startMs/endMs.\r\n this.isStart = true;\r\n this.isEnd = true;\r\n if (moment.isMoment(startInput)) {\r\n startInput = startInput.clone().stripZone();\r\n }\r\n if (moment.isMoment(endInput)) {\r\n endInput = endInput.clone().stripZone();\r\n }\r\n if (startInput) {\r\n this.startMs = startInput.valueOf();\r\n }\r\n if (endInput) {\r\n this.endMs = endInput.valueOf();\r\n }\r\n }\r\n /*\r\n SIDEEFFECT: will mutate eventRanges.\r\n Will return a new array result.\r\n Only works for non-open-ended ranges.\r\n */\r\n UnzonedRange.invertRanges = function (ranges, constraintRange) {\r\n var invertedRanges = [];\r\n var startMs = constraintRange.startMs; // the end of the previous range. the start of the new range\r\n var i;\r\n var dateRange;\r\n // ranges need to be in order. required for our date-walking algorithm\r\n ranges.sort(compareUnzonedRanges);\r\n for (i = 0; i < ranges.length; i++) {\r\n dateRange = ranges[i];\r\n // add the span of time before the event (if there is any)\r\n if (dateRange.startMs > startMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, dateRange.startMs));\r\n }\r\n if (dateRange.endMs > startMs) {\r\n startMs = dateRange.endMs;\r\n }\r\n }\r\n // add the span of time after the last event (if there is any)\r\n if (startMs < constraintRange.endMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, constraintRange.endMs));\r\n }\r\n return invertedRanges;\r\n };\r\n UnzonedRange.prototype.intersect = function (otherRange) {\r\n var startMs = this.startMs;\r\n var endMs = this.endMs;\r\n var newRange = null;\r\n if (otherRange.startMs != null) {\r\n if (startMs == null) {\r\n startMs = otherRange.startMs;\r\n }\r\n else {\r\n startMs = Math.max(startMs, otherRange.startMs);\r\n }\r\n }\r\n if (otherRange.endMs != null) {\r\n if (endMs == null) {\r\n endMs = otherRange.endMs;\r\n }\r\n else {\r\n endMs = Math.min(endMs, otherRange.endMs);\r\n }\r\n }\r\n if (startMs == null || endMs == null || startMs < endMs) {\r\n newRange = new UnzonedRange(startMs, endMs);\r\n newRange.isStart = this.isStart && startMs === this.startMs;\r\n newRange.isEnd = this.isEnd && endMs === this.endMs;\r\n }\r\n return newRange;\r\n };\r\n UnzonedRange.prototype.intersectsWith = function (otherRange) {\r\n return (this.endMs == null || otherRange.startMs == null || this.endMs > otherRange.startMs) &&\r\n (this.startMs == null || otherRange.endMs == null || this.startMs < otherRange.endMs);\r\n };\r\n UnzonedRange.prototype.containsRange = function (innerRange) {\r\n return (this.startMs == null || (innerRange.startMs != null && innerRange.startMs >= this.startMs)) &&\r\n (this.endMs == null || (innerRange.endMs != null && innerRange.endMs <= this.endMs));\r\n };\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n UnzonedRange.prototype.containsDate = function (date) {\r\n var ms = date.valueOf();\r\n return (this.startMs == null || ms >= this.startMs) &&\r\n (this.endMs == null || ms < this.endMs);\r\n };\r\n // If the given date is not within the given range, move it inside.\r\n // (If it's past the end, make it one millisecond before the end).\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n // Returns a MS-time.\r\n UnzonedRange.prototype.constrainDate = function (date) {\r\n var ms = date.valueOf();\r\n if (this.startMs != null && ms < this.startMs) {\r\n ms = this.startMs;\r\n }\r\n if (this.endMs != null && ms >= this.endMs) {\r\n ms = this.endMs - 1;\r\n }\r\n return ms;\r\n };\r\n UnzonedRange.prototype.equals = function (otherRange) {\r\n return this.startMs === otherRange.startMs && this.endMs === otherRange.endMs;\r\n };\r\n UnzonedRange.prototype.clone = function () {\r\n var range = new UnzonedRange(this.startMs, this.endMs);\r\n range.isStart = this.isStart;\r\n range.isEnd = this.isEnd;\r\n return range;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getStart = function () {\r\n if (this.startMs != null) {\r\n return moment_ext_1.default.utc(this.startMs).stripZone();\r\n }\r\n return null;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getEnd = function () {\r\n if (this.endMs != null) {\r\n return moment_ext_1.default.utc(this.endMs).stripZone();\r\n }\r\n return null;\r\n };\r\n UnzonedRange.prototype.as = function (unit) {\r\n return moment.utc(this.endMs).diff(moment.utc(this.startMs), unit, true);\r\n };\r\n return UnzonedRange;\r\n}());\r\nexports.default = UnzonedRange;\r\n/*\r\nOnly works for non-open-ended ranges.\r\n*/\r\nfunction compareUnzonedRanges(range1, range2) {\r\n return range1.startMs - range2.startMs; // earlier ranges go first\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 6 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventSource, _super);\r\n // can we do away with calendar? at least for the abstract?\r\n // useful for buildEventDef\r\n function EventSource(calendar) {\r\n var _this = _super.call(this) || this;\r\n _this.calendar = calendar;\r\n _this.className = [];\r\n _this.uid = String(EventSource.uuid++);\r\n return _this;\r\n }\r\n /*\r\n rawInput can be any data type!\r\n */\r\n EventSource.parse = function (rawInput, calendar) {\r\n var source = new this(calendar);\r\n if (typeof rawInput === 'object') {\r\n if (source.applyProps(rawInput)) {\r\n return source;\r\n }\r\n }\r\n return false;\r\n };\r\n EventSource.normalizeId = function (id) {\r\n if (id) {\r\n return String(id);\r\n }\r\n return null;\r\n };\r\n EventSource.prototype.fetch = function (start, end, timezone) {\r\n // subclasses must implement. must return a promise.\r\n };\r\n EventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n // optional for subclasses to implement\r\n };\r\n EventSource.prototype.removeAllEventDefs = function () {\r\n // optional for subclasses to implement\r\n };\r\n /*\r\n For compairing/matching\r\n */\r\n EventSource.prototype.getPrimitive = function (otherSource) {\r\n // subclasses must implement\r\n };\r\n EventSource.prototype.parseEventDefs = function (rawEventDefs) {\r\n var i;\r\n var eventDef;\r\n var eventDefs = [];\r\n for (i = 0; i < rawEventDefs.length; i++) {\r\n eventDef = this.parseEventDef(rawEventDefs[i]);\r\n if (eventDef) {\r\n eventDefs.push(eventDef);\r\n }\r\n }\r\n return eventDefs;\r\n };\r\n EventSource.prototype.parseEventDef = function (rawInput) {\r\n var calendarTransform = this.calendar.opt('eventDataTransform');\r\n var sourceTransform = this.eventDataTransform;\r\n if (calendarTransform) {\r\n rawInput = calendarTransform(rawInput, this.calendar);\r\n }\r\n if (sourceTransform) {\r\n rawInput = sourceTransform(rawInput, this.calendar);\r\n }\r\n return EventDefParser_1.default.parse(rawInput, this);\r\n };\r\n EventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventSource.normalizeId(rawProps.id);\r\n }\r\n // TODO: converge with EventDef\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n else if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventSource.uuid = 0;\r\n EventSource.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventSource.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventSource;\r\n}(Class_1.default));\r\nexports.default = EventSource;\r\nParsableModelMixin_1.default.mixInto(EventSource);\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nEventSource.defineStandardProps({\r\n // manually process...\r\n id: false,\r\n className: false,\r\n // automatically transfer...\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n rendering: true,\r\n overlap: true,\r\n constraint: true,\r\n allDayDefault: true,\r\n eventDataTransform: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 7 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUtility methods for easily listening to events on another object,\r\nand more importantly, easily unlistening from them.\r\n\r\nUSAGE:\r\n import { default as ListenerMixin, ListenerInterface } from './ListenerMixin'\r\nin class:\r\n listenTo: ListenerInterface['listenTo']\r\n stopListeningTo: ListenerInterface['stopListeningTo']\r\nafter class:\r\n ListenerMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar guid = 0;\r\nvar ListenerMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListenerMixin, _super);\r\n function ListenerMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Given an `other` object that has on/off methods, bind the given `callback` to an event by the given name.\r\n The `callback` will be called with the `this` context of the object that .listenTo is being called on.\r\n Can be called:\r\n .listenTo(other, eventName, callback)\r\n OR\r\n .listenTo(other, {\r\n eventName1: callback1,\r\n eventName2: callback2\r\n })\r\n */\r\n ListenerMixin.prototype.listenTo = function (other, arg, callback) {\r\n if (typeof arg === 'object') {\r\n for (var eventName in arg) {\r\n if (arg.hasOwnProperty(eventName)) {\r\n this.listenTo(other, eventName, arg[eventName]);\r\n }\r\n }\r\n }\r\n else if (typeof arg === 'string') {\r\n other.on(arg + '.' + this.getListenerNamespace(), // use event namespacing to identify this object\r\n $.proxy(callback, this) // always use `this` context\r\n // the usually-undesired jQuery guid behavior doesn't matter,\r\n // because we always unbind via namespace\r\n );\r\n }\r\n };\r\n /*\r\n Causes the current object to stop listening to events on the `other` object.\r\n `eventName` is optional. If omitted, will stop listening to ALL events on `other`.\r\n */\r\n ListenerMixin.prototype.stopListeningTo = function (other, eventName) {\r\n other.off((eventName || '') + '.' + this.getListenerNamespace());\r\n };\r\n /*\r\n Returns a string, unique to this object, to be used for event namespacing\r\n */\r\n ListenerMixin.prototype.getListenerNamespace = function () {\r\n if (this.listenerId == null) {\r\n this.listenerId = guid++;\r\n }\r\n return '_listener' + this.listenerId;\r\n };\r\n return ListenerMixin;\r\n}(Mixin_1.default));\r\nexports.default = ListenerMixin;\r\n\r\n\r\n/***/ }),\r\n/* 8 */,\r\n/* 9 */,\r\n/* 10 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ambigDateOfMonthRegex = /^\\s*\\d{4}-\\d\\d$/;\r\nvar ambigTimeOrZoneRegex = /^\\s*\\d{4}-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?)?$/;\r\nvar newMomentProto = moment.fn; // where we will attach our new methods\r\nexports.newMomentProto = newMomentProto;\r\nvar oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods\r\nexports.oldMomentProto = oldMomentProto;\r\n// tell momentjs to transfer these properties upon clone\r\nvar momentProperties = moment.momentProperties;\r\nmomentProperties.push('_fullCalendar');\r\nmomentProperties.push('_ambigTime');\r\nmomentProperties.push('_ambigZone');\r\n/*\r\nCall this if you want Moment's original format method to be used\r\n*/\r\nfunction oldMomentFormat(mom, formatStr) {\r\n return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js\r\n}\r\nexports.oldMomentFormat = oldMomentFormat;\r\n// Creating\r\n// -------------------------------------------------------------------------------------------------\r\n// Creates a new moment, similar to the vanilla moment(...) constructor, but with\r\n// extra features (ambiguous time, enhanced formatting). When given an existing moment,\r\n// it will function as a clone (and retain the zone of the moment). Anything else will\r\n// result in a moment in the local zone.\r\nvar momentExt = function () {\r\n return makeMoment(arguments);\r\n};\r\nexports.default = momentExt;\r\n// Sames as momentExt, but forces the resulting moment to be in the UTC timezone.\r\nmomentExt.utc = function () {\r\n var mom = makeMoment(arguments, true);\r\n // Force it into UTC because makeMoment doesn't guarantee it\r\n // (if given a pre-existing moment for example)\r\n if (mom.hasTime()) {\r\n mom.utc();\r\n }\r\n return mom;\r\n};\r\n// Same as momentExt, but when given an ISO8601 string, the timezone offset is preserved.\r\n// ISO8601 strings with no timezone offset will become ambiguously zoned.\r\nmomentExt.parseZone = function () {\r\n return makeMoment(arguments, true, true);\r\n};\r\n// Builds an enhanced moment from args. When given an existing moment, it clones. When given a\r\n// native Date, or called with no arguments (the current time), the resulting moment will be local.\r\n// Anything else needs to be \"parsed\" (a string or an array), and will be affected by:\r\n// parseAsUTC - if there is no zone information, should we parse the input in UTC?\r\n// parseZone - if there is zone information, should we force the zone of the moment?\r\nfunction makeMoment(args, parseAsUTC, parseZone) {\r\n if (parseAsUTC === void 0) { parseAsUTC = false; }\r\n if (parseZone === void 0) { parseZone = false; }\r\n var input = args[0];\r\n var isSingleString = args.length === 1 && typeof input === 'string';\r\n var isAmbigTime;\r\n var isAmbigZone;\r\n var ambigMatch;\r\n var mom;\r\n if (moment.isMoment(input) || util_1.isNativeDate(input) || input === undefined) {\r\n mom = moment.apply(null, args);\r\n }\r\n else {\r\n isAmbigTime = false;\r\n isAmbigZone = false;\r\n if (isSingleString) {\r\n if (ambigDateOfMonthRegex.test(input)) {\r\n // accept strings like '2014-05', but convert to the first of the month\r\n input += '-01';\r\n args = [input]; // for when we pass it on to moment's constructor\r\n isAmbigTime = true;\r\n isAmbigZone = true;\r\n }\r\n else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {\r\n isAmbigTime = !ambigMatch[5]; // no time part?\r\n isAmbigZone = true;\r\n }\r\n }\r\n else if ($.isArray(input)) {\r\n // arrays have no timezone information, so assume ambiguous zone\r\n isAmbigZone = true;\r\n }\r\n // otherwise, probably a string with a format\r\n if (parseAsUTC || isAmbigTime) {\r\n mom = moment.utc.apply(moment, args);\r\n }\r\n else {\r\n mom = moment.apply(null, args);\r\n }\r\n if (isAmbigTime) {\r\n mom._ambigTime = true;\r\n mom._ambigZone = true; // ambiguous time always means ambiguous zone\r\n }\r\n else if (parseZone) {\r\n if (isAmbigZone) {\r\n mom._ambigZone = true;\r\n }\r\n else if (isSingleString) {\r\n mom.utcOffset(input); // if not a valid zone, will assign UTC\r\n }\r\n }\r\n }\r\n mom._fullCalendar = true; // flag for extended functionality\r\n return mom;\r\n}\r\n// Week Number\r\n// -------------------------------------------------------------------------------------------------\r\n// Returns the week number, considering the locale's custom week number calcuation\r\n// `weeks` is an alias for `week`\r\nnewMomentProto.week = newMomentProto.weeks = function (input) {\r\n var weekCalc = this._locale._fullCalendar_weekCalc;\r\n if (input == null && typeof weekCalc === 'function') {\r\n return weekCalc(this);\r\n }\r\n else if (weekCalc === 'ISO') {\r\n return oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter\r\n }\r\n return oldMomentProto.week.apply(this, arguments); // local getter/setter\r\n};\r\n// Time-of-day\r\n// -------------------------------------------------------------------------------------------------\r\n// GETTER\r\n// Returns a Duration with the hours/minutes/seconds/ms values of the moment.\r\n// If the moment has an ambiguous time, a duration of 00:00 will be returned.\r\n//\r\n// SETTER\r\n// You can supply a Duration, a Moment, or a Duration-like argument.\r\n// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.\r\nnewMomentProto.time = function (time) {\r\n // Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.\r\n // `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.\r\n if (!this._fullCalendar) {\r\n return oldMomentProto.time.apply(this, arguments);\r\n }\r\n if (time == null) {\r\n return moment.duration({\r\n hours: this.hours(),\r\n minutes: this.minutes(),\r\n seconds: this.seconds(),\r\n milliseconds: this.milliseconds()\r\n });\r\n }\r\n else {\r\n this._ambigTime = false; // mark that the moment now has a time\r\n if (!moment.isDuration(time) && !moment.isMoment(time)) {\r\n time = moment.duration(time);\r\n }\r\n // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).\r\n // Only for Duration times, not Moment times.\r\n var dayHours = 0;\r\n if (moment.isDuration(time)) {\r\n dayHours = Math.floor(time.asDays()) * 24;\r\n }\r\n // We need to set the individual fields.\r\n // Can't use startOf('day') then add duration. In case of DST at start of day.\r\n return this.hours(dayHours + time.hours())\r\n .minutes(time.minutes())\r\n .seconds(time.seconds())\r\n .milliseconds(time.milliseconds());\r\n }\r\n};\r\n// Converts the moment to UTC, stripping out its time-of-day and timezone offset,\r\n// but preserving its YMD. A moment with a stripped time will display no time\r\n// nor timezone offset when .format() is called.\r\nnewMomentProto.stripTime = function () {\r\n if (!this._ambigTime) {\r\n this.utc(true); // keepLocalTime=true (for keeping *date* value)\r\n // set time to zero\r\n this.set({\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n ms: 0\r\n });\r\n // Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears all ambig flags.\r\n this._ambigTime = true;\r\n this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns if the moment has a non-ambiguous time (boolean)\r\nnewMomentProto.hasTime = function () {\r\n return !this._ambigTime;\r\n};\r\n// Timezone\r\n// -------------------------------------------------------------------------------------------------\r\n// Converts the moment to UTC, stripping out its timezone offset, but preserving its\r\n// YMD and time-of-day. A moment with a stripped timezone offset will display no\r\n// timezone offset when .format() is called.\r\nnewMomentProto.stripZone = function () {\r\n var wasAmbigTime;\r\n if (!this._ambigZone) {\r\n wasAmbigTime = this._ambigTime;\r\n this.utc(true); // keepLocalTime=true (for keeping date and time values)\r\n // the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore\r\n this._ambigTime = wasAmbigTime || false;\r\n // Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears the ambig flags.\r\n this._ambigZone = true;\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns of the moment has a non-ambiguous timezone offset (boolean)\r\nnewMomentProto.hasZone = function () {\r\n return !this._ambigZone;\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.local = function (keepLocalTime) {\r\n // for when converting from ambiguously-zoned to local,\r\n // keep the time values when converting from UTC -> local\r\n oldMomentProto.local.call(this, this._ambigZone || keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this; // for chaining\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.utc = function (keepLocalTime) {\r\n oldMomentProto.utc.call(this, keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this;\r\n};\r\n// implicitly marks a zone (will probably get called upon .utc() and .local())\r\nnewMomentProto.utcOffset = function (tzo) {\r\n if (tzo != null) {\r\n // these assignments needs to happen before the original zone method is called.\r\n // I forget why, something to do with a browser crash.\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n }\r\n return oldMomentProto.utcOffset.apply(this, arguments);\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 11 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'\r\nin class:\r\n on: EmitterInterface['on']\r\n one: EmitterInterface['one']\r\n off: EmitterInterface['off']\r\n trigger: EmitterInterface['trigger']\r\n triggerWith: EmitterInterface['triggerWith']\r\n hasHandlers: EmitterInterface['hasHandlers']\r\nafter class:\r\n EmitterMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar EmitterMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(EmitterMixin, _super);\r\n function EmitterMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // jQuery-ification via $(this) allows a non-DOM object to have\r\n // the same event handling capabilities (including namespaces).\r\n EmitterMixin.prototype.on = function (types, handler) {\r\n $(this).on(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.one = function (types, handler) {\r\n $(this).one(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype._prepareIntercept = function (handler) {\r\n // handlers are always called with an \"event\" object as their first param.\r\n // sneak the `this` context and arguments into the extra parameter object\r\n // and forward them on to the original handler.\r\n var intercept = function (ev, extra) {\r\n return handler.apply(extra.context || this, extra.args || []);\r\n };\r\n // mimick jQuery's internal \"proxy\" system (risky, I know)\r\n // causing all functions with the same .guid to appear to be the same.\r\n // https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448\r\n // this is needed for calling .off with the original non-intercept handler.\r\n if (!handler.guid) {\r\n handler.guid = $.guid++;\r\n }\r\n intercept.guid = handler.guid;\r\n return intercept;\r\n };\r\n EmitterMixin.prototype.off = function (types, handler) {\r\n $(this).off(types, handler);\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.trigger = function (types) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // pass in \"extra\" info to the intercept\r\n $(this).triggerHandler(types, { args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.triggerWith = function (types, context, args) {\r\n // `triggerHandler` is less reliant on the DOM compared to `trigger`.\r\n // pass in \"extra\" info to the intercept.\r\n $(this).triggerHandler(types, { context: context, args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.hasHandlers = function (type) {\r\n var hash = $._data(this, 'events'); // http://blog.jquery.com/2012/08/09/jquery-1-8-released/\r\n return hash && hash[type] && hash[type].length > 0;\r\n };\r\n return EmitterMixin;\r\n}(Mixin_1.default));\r\nexports.default = EmitterMixin;\r\n\r\n\r\n/***/ }),\r\n/* 12 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar ComponentFootprint = /** @class */ (function () {\r\n function ComponentFootprint(unzonedRange, isAllDay) {\r\n this.isAllDay = false; // component can choose to ignore this\r\n this.unzonedRange = unzonedRange;\r\n this.isAllDay = isAllDay;\r\n }\r\n /*\r\n Only works for non-open-ended ranges.\r\n */\r\n ComponentFootprint.prototype.toLegacy = function (calendar) {\r\n return {\r\n start: calendar.msToMoment(this.unzonedRange.startMs, this.isAllDay),\r\n end: calendar.msToMoment(this.unzonedRange.endMs, this.isAllDay)\r\n };\r\n };\r\n return ComponentFootprint;\r\n}());\r\nexports.default = ComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 13 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar SingleEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(SingleEventDef, _super);\r\n function SingleEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Will receive start/end params, but will be ignored.\r\n */\r\n SingleEventDef.prototype.buildInstances = function () {\r\n return [this.buildInstance()];\r\n };\r\n SingleEventDef.prototype.buildInstance = function () {\r\n return new EventInstance_1.default(this, // definition\r\n this.dateProfile);\r\n };\r\n SingleEventDef.prototype.isAllDay = function () {\r\n return this.dateProfile.isAllDay();\r\n };\r\n SingleEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n def.dateProfile = this.dateProfile;\r\n return def;\r\n };\r\n SingleEventDef.prototype.rezone = function () {\r\n var calendar = this.source.calendar;\r\n var dateProfile = this.dateProfile;\r\n this.dateProfile = new EventDateProfile_1.default(calendar.moment(dateProfile.start), dateProfile.end ? calendar.moment(dateProfile.end) : null, calendar);\r\n };\r\n /*\r\n NOTE: if super-method fails, should still attempt to apply\r\n */\r\n SingleEventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n var dateProfile = EventDateProfile_1.default.parse(rawProps, this.source); // returns null on failure\r\n if (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n // make sure `date` shows up in the legacy event objects as-is\r\n if (rawProps.date != null) {\r\n this.miscProps.date = rawProps.date;\r\n }\r\n return superSuccess;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n return SingleEventDef;\r\n}(EventDef_1.default));\r\nexports.default = SingleEventDef;\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nSingleEventDef.defineStandardProps({\r\n start: false,\r\n date: false,\r\n end: false,\r\n allDay: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 14 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Mixin = /** @class */ (function () {\r\n function Mixin() {\r\n }\r\n Mixin.mixInto = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n if (!destClass.prototype[name]) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n }\r\n });\r\n };\r\n /*\r\n will override existing methods\r\n TODO: remove! not used anymore\r\n */\r\n Mixin.mixOver = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n });\r\n };\r\n return Mixin;\r\n}());\r\nexports.default = Mixin;\r\n\r\n\r\n/***/ }),\r\n/* 15 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Interaction = /** @class */ (function () {\r\n function Interaction(component) {\r\n this.view = component._getView();\r\n this.component = component;\r\n }\r\n Interaction.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n Interaction.prototype.end = function () {\r\n // subclasses can implement\r\n };\r\n return Interaction;\r\n}());\r\nexports.default = Interaction;\r\n\r\n\r\n/***/ }),\r\n/* 16 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.version = '3.9.0';\r\n// When introducing internal API incompatibilities (where fullcalendar plugins would break),\r\n// the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)\r\n// and the below integer should be incremented.\r\nexports.internalApiVersion = 12;\r\nvar util_1 = __webpack_require__(4);\r\nexports.applyAll = util_1.applyAll;\r\nexports.debounce = util_1.debounce;\r\nexports.isInt = util_1.isInt;\r\nexports.htmlEscape = util_1.htmlEscape;\r\nexports.cssToStr = util_1.cssToStr;\r\nexports.proxy = util_1.proxy;\r\nexports.capitaliseFirstLetter = util_1.capitaliseFirstLetter;\r\nexports.getOuterRect = util_1.getOuterRect;\r\nexports.getClientRect = util_1.getClientRect;\r\nexports.getContentRect = util_1.getContentRect;\r\nexports.getScrollbarWidths = util_1.getScrollbarWidths;\r\nexports.preventDefault = util_1.preventDefault;\r\nexports.parseFieldSpecs = util_1.parseFieldSpecs;\r\nexports.compareByFieldSpecs = util_1.compareByFieldSpecs;\r\nexports.compareByFieldSpec = util_1.compareByFieldSpec;\r\nexports.flexibleCompare = util_1.flexibleCompare;\r\nexports.computeGreatestUnit = util_1.computeGreatestUnit;\r\nexports.divideRangeByDuration = util_1.divideRangeByDuration;\r\nexports.divideDurationByDuration = util_1.divideDurationByDuration;\r\nexports.multiplyDuration = util_1.multiplyDuration;\r\nexports.durationHasTime = util_1.durationHasTime;\r\nexports.log = util_1.log;\r\nexports.warn = util_1.warn;\r\nexports.removeExact = util_1.removeExact;\r\nexports.intersectRects = util_1.intersectRects;\r\nvar date_formatting_1 = __webpack_require__(47);\r\nexports.formatDate = date_formatting_1.formatDate;\r\nexports.formatRange = date_formatting_1.formatRange;\r\nexports.queryMostGranularFormatUnit = date_formatting_1.queryMostGranularFormatUnit;\r\nvar locale_1 = __webpack_require__(31);\r\nexports.datepickerLocale = locale_1.datepickerLocale;\r\nexports.locale = locale_1.locale;\r\nvar moment_ext_1 = __webpack_require__(10);\r\nexports.moment = moment_ext_1.default;\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nexports.EmitterMixin = EmitterMixin_1.default;\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexports.ListenerMixin = ListenerMixin_1.default;\r\nvar Model_1 = __webpack_require__(48);\r\nexports.Model = Model_1.default;\r\nvar Constraints_1 = __webpack_require__(207);\r\nexports.Constraints = Constraints_1.default;\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nexports.UnzonedRange = UnzonedRange_1.default;\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nexports.ComponentFootprint = ComponentFootprint_1.default;\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nexports.BusinessHourGenerator = BusinessHourGenerator_1.default;\r\nvar EventDef_1 = __webpack_require__(34);\r\nexports.EventDef = EventDef_1.default;\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nexports.EventDefMutation = EventDefMutation_1.default;\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nexports.EventSourceParser = EventSourceParser_1.default;\r\nvar EventSource_1 = __webpack_require__(6);\r\nexports.EventSource = EventSource_1.default;\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nexports.defineThemeSystem = ThemeRegistry_1.defineThemeSystem;\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nexports.EventInstanceGroup = EventInstanceGroup_1.default;\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nexports.ArrayEventSource = ArrayEventSource_1.default;\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nexports.FuncEventSource = FuncEventSource_1.default;\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nexports.JsonFeedEventSource = JsonFeedEventSource_1.default;\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nexports.EventFootprint = EventFootprint_1.default;\r\nvar Class_1 = __webpack_require__(33);\r\nexports.Class = Class_1.default;\r\nvar Mixin_1 = __webpack_require__(14);\r\nexports.Mixin = Mixin_1.default;\r\nvar CoordCache_1 = __webpack_require__(53);\r\nexports.CoordCache = CoordCache_1.default;\r\nvar DragListener_1 = __webpack_require__(54);\r\nexports.DragListener = DragListener_1.default;\r\nvar Promise_1 = __webpack_require__(20);\r\nexports.Promise = Promise_1.default;\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nexports.TaskQueue = TaskQueue_1.default;\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nexports.RenderQueue = RenderQueue_1.default;\r\nvar Scroller_1 = __webpack_require__(39);\r\nexports.Scroller = Scroller_1.default;\r\nvar Theme_1 = __webpack_require__(19);\r\nexports.Theme = Theme_1.default;\r\nvar DateComponent_1 = __webpack_require__(219);\r\nexports.DateComponent = DateComponent_1.default;\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nexports.InteractiveDateComponent = InteractiveDateComponent_1.default;\r\nvar Calendar_1 = __webpack_require__(220);\r\nexports.Calendar = Calendar_1.default;\r\nvar View_1 = __webpack_require__(41);\r\nexports.View = View_1.default;\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nexports.defineView = ViewRegistry_1.defineView;\r\nexports.getViewConfig = ViewRegistry_1.getViewConfig;\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nexports.DayTableMixin = DayTableMixin_1.default;\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nexports.BusinessHourRenderer = BusinessHourRenderer_1.default;\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nexports.EventRenderer = EventRenderer_1.default;\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nexports.FillRenderer = FillRenderer_1.default;\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nexports.HelperRenderer = HelperRenderer_1.default;\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nexports.ExternalDropping = ExternalDropping_1.default;\r\nvar EventResizing_1 = __webpack_require__(223);\r\nexports.EventResizing = EventResizing_1.default;\r\nvar EventPointing_1 = __webpack_require__(59);\r\nexports.EventPointing = EventPointing_1.default;\r\nvar EventDragging_1 = __webpack_require__(224);\r\nexports.EventDragging = EventDragging_1.default;\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nexports.DateSelecting = DateSelecting_1.default;\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nexports.StandardInteractionsMixin = StandardInteractionsMixin_1.default;\r\nvar AgendaView_1 = __webpack_require__(226);\r\nexports.AgendaView = AgendaView_1.default;\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nexports.TimeGrid = TimeGrid_1.default;\r\nvar DayGrid_1 = __webpack_require__(61);\r\nexports.DayGrid = DayGrid_1.default;\r\nvar BasicView_1 = __webpack_require__(62);\r\nexports.BasicView = BasicView_1.default;\r\nvar MonthView_1 = __webpack_require__(229);\r\nexports.MonthView = MonthView_1.default;\r\nvar ListView_1 = __webpack_require__(230);\r\nexports.ListView = ListView_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 17 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar EventDateProfile = /** @class */ (function () {\r\n function EventDateProfile(start, end, calendar) {\r\n this.start = start;\r\n this.end = end || null;\r\n this.unzonedRange = this.buildUnzonedRange(calendar);\r\n }\r\n /*\r\n Needs an EventSource object\r\n */\r\n EventDateProfile.parse = function (rawProps, source) {\r\n var startInput = rawProps.start || rawProps.date;\r\n var endInput = rawProps.end;\r\n if (!startInput) {\r\n return false;\r\n }\r\n var calendar = source.calendar;\r\n var start = calendar.moment(startInput);\r\n var end = endInput ? calendar.moment(endInput) : null;\r\n var forcedAllDay = rawProps.allDay;\r\n var forceEventDuration = calendar.opt('forceEventDuration');\r\n if (!start.isValid()) {\r\n return false;\r\n }\r\n if (end && (!end.isValid() || !end.isAfter(start))) {\r\n end = null;\r\n }\r\n if (forcedAllDay == null) {\r\n forcedAllDay = source.allDayDefault;\r\n if (forcedAllDay == null) {\r\n forcedAllDay = calendar.opt('allDayDefault');\r\n }\r\n }\r\n if (forcedAllDay === true) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else if (forcedAllDay === false) {\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n if (!end && forceEventDuration) {\r\n end = calendar.getDefaultEventEnd(!start.hasTime(), start);\r\n }\r\n return new EventDateProfile(start, end, calendar);\r\n };\r\n EventDateProfile.isStandardProp = function (propName) {\r\n return propName === 'start' || propName === 'date' || propName === 'end' || propName === 'allDay';\r\n };\r\n EventDateProfile.prototype.isAllDay = function () {\r\n return !(this.start.hasTime() || (this.end && this.end.hasTime()));\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.buildUnzonedRange = function (calendar) {\r\n var startMs = this.start.clone().stripZone().valueOf();\r\n var endMs = this.getEnd(calendar).stripZone().valueOf();\r\n return new UnzonedRange_1.default(startMs, endMs);\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.getEnd = function (calendar) {\r\n return this.end ?\r\n this.end.clone() :\r\n // derive the end from the start and allDay. compute allDay if necessary\r\n calendar.getDefaultEventEnd(this.isAllDay(), this.start);\r\n };\r\n return EventDateProfile;\r\n}());\r\nexports.default = EventDateProfile;\r\n\r\n\r\n/***/ }),\r\n/* 18 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventRange_1 = __webpack_require__(211);\r\n/*\r\nIt's expected that there will be at least one EventInstance,\r\nOR that an explicitEventDef is assigned.\r\n*/\r\nvar EventInstanceGroup = /** @class */ (function () {\r\n function EventInstanceGroup(eventInstances) {\r\n this.eventInstances = eventInstances || [];\r\n }\r\n EventInstanceGroup.prototype.getAllEventRanges = function (constraintRange) {\r\n if (constraintRange) {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.eventInstances.map(util_1.eventInstanceToEventRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceRenderRanges = function (constraintRange) {\r\n if (this.isInverse()) {\r\n return this.sliceInverseRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceNormalRenderRanges = function (constraintRange) {\r\n var eventInstances = this.eventInstances;\r\n var i;\r\n var eventInstance;\r\n var slicedRange;\r\n var slicedEventRanges = [];\r\n for (i = 0; i < eventInstances.length; i++) {\r\n eventInstance = eventInstances[i];\r\n slicedRange = eventInstance.dateProfile.unzonedRange.intersect(constraintRange);\r\n if (slicedRange) {\r\n slicedEventRanges.push(new EventRange_1.default(slicedRange, eventInstance.def, eventInstance));\r\n }\r\n }\r\n return slicedEventRanges;\r\n };\r\n EventInstanceGroup.prototype.sliceInverseRenderRanges = function (constraintRange) {\r\n var unzonedRanges = this.eventInstances.map(util_1.eventInstanceToUnzonedRange);\r\n var ownerDef = this.getEventDef();\r\n unzonedRanges = UnzonedRange_1.default.invertRanges(unzonedRanges, constraintRange);\r\n return unzonedRanges.map(function (unzonedRange) {\r\n return new EventRange_1.default(unzonedRange, ownerDef); // don't give an EventInstance\r\n });\r\n };\r\n EventInstanceGroup.prototype.isInverse = function () {\r\n return this.getEventDef().hasInverseRendering();\r\n };\r\n EventInstanceGroup.prototype.getEventDef = function () {\r\n return this.explicitEventDef || this.eventInstances[0].def;\r\n };\r\n return EventInstanceGroup;\r\n}());\r\nexports.default = EventInstanceGroup;\r\n\r\n\r\n/***/ }),\r\n/* 19 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar Theme = /** @class */ (function () {\r\n function Theme(optionsManager) {\r\n this.optionsManager = optionsManager;\r\n this.processIconOverride();\r\n }\r\n Theme.prototype.processIconOverride = function () {\r\n if (this.iconOverrideOption) {\r\n this.setIconOverride(this.optionsManager.get(this.iconOverrideOption));\r\n }\r\n };\r\n Theme.prototype.setIconOverride = function (iconOverrideHash) {\r\n var iconClassesCopy;\r\n var buttonName;\r\n if ($.isPlainObject(iconOverrideHash)) {\r\n iconClassesCopy = $.extend({}, this.iconClasses);\r\n for (buttonName in iconOverrideHash) {\r\n iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);\r\n }\r\n this.iconClasses = iconClassesCopy;\r\n }\r\n else if (iconOverrideHash === false) {\r\n this.iconClasses = {};\r\n }\r\n };\r\n Theme.prototype.applyIconOverridePrefix = function (className) {\r\n var prefix = this.iconOverridePrefix;\r\n if (prefix && className.indexOf(prefix) !== 0) {\r\n className = prefix + className;\r\n }\r\n return className;\r\n };\r\n Theme.prototype.getClass = function (key) {\r\n return this.classes[key] || '';\r\n };\r\n Theme.prototype.getIconClass = function (buttonName) {\r\n var className = this.iconClasses[buttonName];\r\n if (className) {\r\n return this.baseIconClass + ' ' + className;\r\n }\r\n return '';\r\n };\r\n Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {\r\n var className;\r\n if (this.iconOverrideCustomButtonOption) {\r\n className = customButtonProps[this.iconOverrideCustomButtonOption];\r\n if (className) {\r\n return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);\r\n }\r\n }\r\n return '';\r\n };\r\n return Theme;\r\n}());\r\nexports.default = Theme;\r\nTheme.prototype.classes = {};\r\nTheme.prototype.iconClasses = {};\r\nTheme.prototype.baseIconClass = '';\r\nTheme.prototype.iconOverridePrefix = '';\r\n\r\n\r\n/***/ }),\r\n/* 20 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar PromiseStub = {\r\n construct: function (executor) {\r\n var deferred = $.Deferred();\r\n var promise = deferred.promise();\r\n if (typeof executor === 'function') {\r\n executor(function (val) {\r\n deferred.resolve(val);\r\n attachImmediatelyResolvingThen(promise, val);\r\n }, function () {\r\n deferred.reject();\r\n attachImmediatelyRejectingThen(promise);\r\n });\r\n }\r\n return promise;\r\n },\r\n resolve: function (val) {\r\n var deferred = $.Deferred().resolve(val);\r\n var promise = deferred.promise();\r\n attachImmediatelyResolvingThen(promise, val);\r\n return promise;\r\n },\r\n reject: function () {\r\n var deferred = $.Deferred().reject();\r\n var promise = deferred.promise();\r\n attachImmediatelyRejectingThen(promise);\r\n return promise;\r\n }\r\n};\r\nexports.default = PromiseStub;\r\nfunction attachImmediatelyResolvingThen(promise, val) {\r\n promise.then = function (onResolve) {\r\n if (typeof onResolve === 'function') {\r\n return PromiseStub.resolve(onResolve(val));\r\n }\r\n return promise;\r\n };\r\n}\r\nfunction attachImmediatelyRejectingThen(promise) {\r\n promise.then = function (onResolve, onReject) {\r\n if (typeof onReject === 'function') {\r\n onReject();\r\n }\r\n return promise;\r\n };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 21 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexportHooks.touchMouseIgnoreWait = 500;\r\nvar globalEmitter = null;\r\nvar neededCount = 0;\r\n/*\r\nListens to document and window-level user-interaction events, like touch events and mouse events,\r\nand fires these events as-is to whoever is observing a GlobalEmitter.\r\nBest when used as a singleton via GlobalEmitter.get()\r\n\r\nNormalizes mouse/touch events. For examples:\r\n- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click\r\n- compensates for various buggy scenarios where a touchend does not fire\r\n*/\r\nvar GlobalEmitter = /** @class */ (function () {\r\n function GlobalEmitter() {\r\n this.isTouching = false;\r\n this.mouseIgnoreDepth = 0;\r\n }\r\n // gets the singleton\r\n GlobalEmitter.get = function () {\r\n if (!globalEmitter) {\r\n globalEmitter = new GlobalEmitter();\r\n globalEmitter.bind();\r\n }\r\n return globalEmitter;\r\n };\r\n // called when an object knows it will need a GlobalEmitter in the near future.\r\n GlobalEmitter.needed = function () {\r\n GlobalEmitter.get(); // ensures globalEmitter\r\n neededCount++;\r\n };\r\n // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.\r\n GlobalEmitter.unneeded = function () {\r\n neededCount--;\r\n if (!neededCount) {\r\n globalEmitter.unbind();\r\n globalEmitter = null;\r\n }\r\n };\r\n GlobalEmitter.prototype.bind = function () {\r\n var _this = this;\r\n this.listenTo($(document), {\r\n touchstart: this.handleTouchStart,\r\n touchcancel: this.handleTouchCancel,\r\n touchend: this.handleTouchEnd,\r\n mousedown: this.handleMouseDown,\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.handleMouseUp,\r\n click: this.handleClick,\r\n selectstart: this.handleSelectStart,\r\n contextmenu: this.handleContextMenu\r\n });\r\n // because we need to call preventDefault\r\n // because https://www.chromestatus.com/features/5093566007214080\r\n // TODO: investigate performance because this is a global handler\r\n window.addEventListener('touchmove', this.handleTouchMoveProxy = function (ev) {\r\n _this.handleTouchMove($.Event(ev));\r\n }, { passive: false } // allows preventDefault()\r\n );\r\n // attach a handler to get called when ANY scroll action happens on the page.\r\n // this was impossible to do with normal on/off because 'scroll' doesn't bubble.\r\n // http://stackoverflow.com/a/32954565/96342\r\n window.addEventListener('scroll', this.handleScrollProxy = function (ev) {\r\n _this.handleScroll($.Event(ev));\r\n }, true // useCapture\r\n );\r\n };\r\n GlobalEmitter.prototype.unbind = function () {\r\n this.stopListeningTo($(document));\r\n window.removeEventListener('touchmove', this.handleTouchMoveProxy);\r\n window.removeEventListener('scroll', this.handleScrollProxy, true // useCapture\r\n );\r\n };\r\n // Touch Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleTouchStart = function (ev) {\r\n // if a previous touch interaction never ended with a touchend, then implicitly end it,\r\n // but since a new touch interaction is about to begin, don't start the mouse ignore period.\r\n this.stopTouch(ev, true); // skipMouseIgnore=true\r\n this.isTouching = true;\r\n this.trigger('touchstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleTouchMove = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchmove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchCancel = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchcancel', ev);\r\n // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.\r\n // If touchend fires later, it won't have any effect b/c isTouching will be false.\r\n this.stopTouch(ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchEnd = function (ev) {\r\n this.stopTouch(ev);\r\n };\r\n // Mouse Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleMouseDown = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousedown', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseMove = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousemove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseUp = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mouseup', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleClick = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('click', ev);\r\n }\r\n };\r\n // Misc Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleSelectStart = function (ev) {\r\n this.trigger('selectstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleContextMenu = function (ev) {\r\n this.trigger('contextmenu', ev);\r\n };\r\n GlobalEmitter.prototype.handleScroll = function (ev) {\r\n this.trigger('scroll', ev);\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.stopTouch = function (ev, skipMouseIgnore) {\r\n if (skipMouseIgnore === void 0) { skipMouseIgnore = false; }\r\n if (this.isTouching) {\r\n this.isTouching = false;\r\n this.trigger('touchend', ev);\r\n if (!skipMouseIgnore) {\r\n this.startTouchMouseIgnore();\r\n }\r\n }\r\n };\r\n GlobalEmitter.prototype.startTouchMouseIgnore = function () {\r\n var _this = this;\r\n var wait = exportHooks.touchMouseIgnoreWait;\r\n if (wait) {\r\n this.mouseIgnoreDepth++;\r\n setTimeout(function () {\r\n _this.mouseIgnoreDepth--;\r\n }, wait);\r\n }\r\n };\r\n GlobalEmitter.prototype.shouldIgnoreMouse = function () {\r\n return this.isTouching || Boolean(this.mouseIgnoreDepth);\r\n };\r\n return GlobalEmitter;\r\n}());\r\nexports.default = GlobalEmitter;\r\nListenerMixin_1.default.mixInto(GlobalEmitter);\r\nEmitterMixin_1.default.mixInto(GlobalEmitter);\r\n\r\n\r\n/***/ }),\r\n/* 22 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar exportHooks = __webpack_require__(16);\r\nexports.viewHash = {};\r\nexportHooks.views = exports.viewHash;\r\nfunction defineView(viewName, viewConfig) {\r\n exports.viewHash[viewName] = viewConfig;\r\n}\r\nexports.defineView = defineView;\r\nfunction getViewConfig(viewName) {\r\n return exports.viewHash[viewName];\r\n}\r\nexports.getViewConfig = getViewConfig;\r\n\r\n\r\n/***/ }),\r\n/* 23 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar DragListener_1 = __webpack_require__(54);\r\n/* Tracks mouse movements over a component and raises events about which hit the mouse is over.\r\n------------------------------------------------------------------------------------------------------------------------\r\noptions:\r\n- subjectEl\r\n- subjectCenter\r\n*/\r\nvar HitDragListener = /** @class */ (function (_super) {\r\n tslib_1.__extends(HitDragListener, _super);\r\n function HitDragListener(component, options) {\r\n var _this = _super.call(this, options) || this;\r\n _this.component = component;\r\n return _this;\r\n }\r\n // Called when drag listening starts (but a real drag has not necessarily began).\r\n // ev might be undefined if dragging was started manually.\r\n HitDragListener.prototype.handleInteractionStart = function (ev) {\r\n var subjectEl = this.subjectEl;\r\n var subjectRect;\r\n var origPoint;\r\n var point;\r\n this.component.hitsNeeded();\r\n this.computeScrollBounds(); // for autoscroll\r\n if (ev) {\r\n origPoint = { left: util_1.getEvX(ev), top: util_1.getEvY(ev) };\r\n point = origPoint;\r\n // constrain the point to bounds of the element being dragged\r\n if (subjectEl) {\r\n subjectRect = util_1.getOuterRect(subjectEl); // used for centering as well\r\n point = util_1.constrainPoint(point, subjectRect);\r\n }\r\n this.origHit = this.queryHit(point.left, point.top);\r\n // treat the center of the subject as the collision point?\r\n if (subjectEl && this.options.subjectCenter) {\r\n // only consider the area the subject overlaps the hit. best for large subjects.\r\n // TODO: skip this if hit didn't supply left/right/top/bottom\r\n if (this.origHit) {\r\n subjectRect = util_1.intersectRects(this.origHit, subjectRect) ||\r\n subjectRect; // in case there is no intersection\r\n }\r\n point = util_1.getRectCenter(subjectRect);\r\n }\r\n this.coordAdjust = util_1.diffPoints(point, origPoint); // point - origPoint\r\n }\r\n else {\r\n this.origHit = null;\r\n this.coordAdjust = null;\r\n }\r\n // call the super-method. do it after origHit has been computed\r\n _super.prototype.handleInteractionStart.call(this, ev);\r\n };\r\n // Called when the actual drag has started\r\n HitDragListener.prototype.handleDragStart = function (ev) {\r\n var hit;\r\n _super.prototype.handleDragStart.call(this, ev);\r\n // might be different from this.origHit if the min-distance is large\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n // report the initial hit the mouse is over\r\n // especially important if no min-distance and drag starts immediately\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n };\r\n // Called when the drag moves\r\n HitDragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n var hit;\r\n _super.prototype.handleDrag.call(this, dx, dy, ev);\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n if (!isHitsEqual(hit, this.hit)) {\r\n if (this.hit) {\r\n this.handleHitOut();\r\n }\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n }\r\n };\r\n // Called when dragging has been stopped\r\n HitDragListener.prototype.handleDragEnd = function (ev) {\r\n this.handleHitDone();\r\n _super.prototype.handleDragEnd.call(this, ev);\r\n };\r\n // Called when a the mouse has just moved over a new hit\r\n HitDragListener.prototype.handleHitOver = function (hit) {\r\n var isOrig = isHitsEqual(hit, this.origHit);\r\n this.hit = hit;\r\n this.trigger('hitOver', this.hit, isOrig, this.origHit);\r\n };\r\n // Called when the mouse has just moved out of a hit\r\n HitDragListener.prototype.handleHitOut = function () {\r\n if (this.hit) {\r\n this.trigger('hitOut', this.hit);\r\n this.handleHitDone();\r\n this.hit = null;\r\n }\r\n };\r\n // Called after a hitOut. Also called before a dragStop\r\n HitDragListener.prototype.handleHitDone = function () {\r\n if (this.hit) {\r\n this.trigger('hitDone', this.hit);\r\n }\r\n };\r\n // Called when the interaction ends, whether there was a real drag or not\r\n HitDragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n _super.prototype.handleInteractionEnd.call(this, ev, isCancelled);\r\n this.origHit = null;\r\n this.hit = null;\r\n this.component.hitsNotNeeded();\r\n };\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n HitDragListener.prototype.handleScrollEnd = function () {\r\n _super.prototype.handleScrollEnd.call(this);\r\n // hits' absolute positions will be in new places after a user's scroll.\r\n // HACK for recomputing.\r\n if (this.isDragging) {\r\n this.component.releaseHits();\r\n this.component.prepareHits();\r\n }\r\n };\r\n // Gets the hit underneath the coordinates for the given mouse event\r\n HitDragListener.prototype.queryHit = function (left, top) {\r\n if (this.coordAdjust) {\r\n left += this.coordAdjust.left;\r\n top += this.coordAdjust.top;\r\n }\r\n return this.component.queryHit(left, top);\r\n };\r\n return HitDragListener;\r\n}(DragListener_1.default));\r\nexports.default = HitDragListener;\r\n// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component.\r\n// Two null values will be considered equal, as two \"out of the component\" states are the same.\r\nfunction isHitsEqual(hit0, hit1) {\r\n if (!hit0 && !hit1) {\r\n return true;\r\n }\r\n if (hit0 && hit1) {\r\n return hit0.component === hit1.component &&\r\n isHitPropsWithin(hit0, hit1) &&\r\n isHitPropsWithin(hit1, hit0); // ensures all props are identical\r\n }\r\n return false;\r\n}\r\n// Returns true if all of subHit's non-standard properties are within superHit\r\nfunction isHitPropsWithin(subHit, superHit) {\r\n for (var propName in subHit) {\r\n if (!/^(component|left|right|top|bottom)$/.test(propName)) {\r\n if (subHit[propName] !== superHit[propName]) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 24 */,\r\n/* 25 */,\r\n/* 26 */,\r\n/* 27 */,\r\n/* 28 */,\r\n/* 29 */,\r\n/* 30 */,\r\n/* 31 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar options_1 = __webpack_require__(32);\r\nvar util_1 = __webpack_require__(4);\r\nexports.localeOptionHash = {};\r\nexportHooks.locales = exports.localeOptionHash;\r\n// NOTE: can't guarantee any of these computations will run because not every locale has datepicker\r\n// configs, so make sure there are English fallbacks for these in the defaults file.\r\nvar dpComputableOptions = {\r\n buttonText: function (dpOptions) {\r\n return {\r\n // the translations sometimes wrongly contain HTML entities\r\n prev: util_1.stripHtmlEntities(dpOptions.prevText),\r\n next: util_1.stripHtmlEntities(dpOptions.nextText),\r\n today: util_1.stripHtmlEntities(dpOptions.currentText)\r\n };\r\n },\r\n // Produces format strings like \"MMMM YYYY\" -> \"September 2014\"\r\n monthYearFormat: function (dpOptions) {\r\n return dpOptions.showMonthAfterYear ?\r\n 'YYYY[' + dpOptions.yearSuffix + '] MMMM' :\r\n 'MMMM YYYY[' + dpOptions.yearSuffix + ']';\r\n }\r\n};\r\nvar momComputableOptions = {\r\n // Produces format strings like \"ddd M/D\" -> \"Fri 9/15\"\r\n dayOfMonthFormat: function (momOptions, fcOptions) {\r\n var format = momOptions.longDateFormat('l'); // for the format like \"M/D/YYYY\"\r\n // strip the year off the edge, as well as other misc non-whitespace chars\r\n format = format.replace(/^Y+[^\\w\\s]*|[^\\w\\s]*Y+$/g, '');\r\n if (fcOptions.isRTL) {\r\n format += ' ddd'; // for RTL, add day-of-week to end\r\n }\r\n else {\r\n format = 'ddd ' + format; // for LTR, add day-of-week to beginning\r\n }\r\n return format;\r\n },\r\n // Produces format strings like \"h:mma\" -> \"6:00pm\"\r\n mediumTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)a\" -> \"6pm\" / \"6:30pm\"\r\n smallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)t\" -> \"6p\" / \"6:30p\"\r\n extraSmallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"ha\" / \"H\" -> \"6pm\" / \"18\"\r\n hourFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '')\r\n .replace(/(\\Wmm)$/, '') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h:mm\" -> \"6:30\" (with no AM/PM)\r\n noMeridiemTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, ''); // remove trailing AM/PM\r\n }\r\n};\r\n// options that should be computed off live calendar options (considers override options)\r\n// TODO: best place for this? related to locale?\r\n// TODO: flipping text based on isRTL is a bad idea because the CSS `direction` might want to handle it\r\nvar instanceComputableOptions = {\r\n // Produces format strings for results like \"Mo 16\"\r\n smallDayDateFormat: function (options) {\r\n return options.isRTL ?\r\n 'D dd' :\r\n 'dd D';\r\n },\r\n // Produces format strings for results like \"Wk 5\"\r\n weekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[ ' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ' ]w';\r\n },\r\n // Produces format strings for results like \"Wk5\"\r\n smallWeekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ']w';\r\n }\r\n};\r\n// TODO: make these computable properties in optionsManager\r\nfunction populateInstanceComputableOptions(options) {\r\n $.each(instanceComputableOptions, function (name, func) {\r\n if (options[name] == null) {\r\n options[name] = func(options);\r\n }\r\n });\r\n}\r\nexports.populateInstanceComputableOptions = populateInstanceComputableOptions;\r\n// Initialize jQuery UI datepicker translations while using some of the translations\r\n// Will set this as the default locales for datepicker.\r\nfunction datepickerLocale(localeCode, dpLocaleCode, dpOptions) {\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n var fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // transfer some simple options from datepicker to fc\r\n fcOptions.isRTL = dpOptions.isRTL;\r\n fcOptions.weekNumberTitle = dpOptions.weekHeader;\r\n // compute some more complex options from datepicker\r\n $.each(dpComputableOptions, function (name, func) {\r\n fcOptions[name] = func(dpOptions);\r\n });\r\n var jqDatePicker = $.datepicker;\r\n // is jQuery UI Datepicker is on the page?\r\n if (jqDatePicker) {\r\n // Register the locale data.\r\n // FullCalendar and MomentJS use locale codes like \"pt-br\" but Datepicker\r\n // does it like \"pt-BR\" or if it doesn't have the locale, maybe just \"pt\".\r\n // Make an alias so the locale can be referenced either way.\r\n jqDatePicker.regional[dpLocaleCode] =\r\n jqDatePicker.regional[localeCode] = // alias\r\n dpOptions;\r\n // Alias 'en' to the default locale data. Do this every time.\r\n jqDatePicker.regional.en = jqDatePicker.regional[''];\r\n // Set as Datepicker's global defaults.\r\n jqDatePicker.setDefaults(dpOptions);\r\n }\r\n}\r\nexports.datepickerLocale = datepickerLocale;\r\n// Sets FullCalendar-specific translations. Will set the locales as the global default.\r\nfunction locale(localeCode, newFcOptions) {\r\n var fcOptions;\r\n var momOptions;\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // provided new options for this locales? merge them in\r\n if (newFcOptions) {\r\n fcOptions = exports.localeOptionHash[localeCode] = options_1.mergeOptions([fcOptions, newFcOptions]);\r\n }\r\n // compute locale options that weren't defined.\r\n // always do this. newFcOptions can be undefined when initializing from i18n file,\r\n // so no way to tell if this is an initialization or a default-setting.\r\n momOptions = getMomentLocaleData(localeCode); // will fall back to en\r\n $.each(momComputableOptions, function (name, func) {\r\n if (fcOptions[name] == null) {\r\n fcOptions[name] = (func)(momOptions, fcOptions);\r\n }\r\n });\r\n // set it as the default locale for FullCalendar\r\n options_1.globalDefaults.locale = localeCode;\r\n}\r\nexports.locale = locale;\r\n// Returns moment's internal locale data. If doesn't exist, returns English.\r\nfunction getMomentLocaleData(localeCode) {\r\n return moment.localeData(localeCode) || moment.localeData('en');\r\n}\r\nexports.getMomentLocaleData = getMomentLocaleData;\r\n// Initialize English by forcing computation of moment-derived options.\r\n// Also, sets it as the default.\r\nlocale('en', options_1.englishDefaults);\r\n\r\n\r\n/***/ }),\r\n/* 32 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nexports.globalDefaults = {\r\n titleRangeSeparator: ' \\u2013 ',\r\n monthYearFormat: 'MMMM YYYY',\r\n defaultTimedEventDuration: '02:00:00',\r\n defaultAllDayEventDuration: { days: 1 },\r\n forceEventDuration: false,\r\n nextDayThreshold: '09:00:00',\r\n // display\r\n columnHeader: true,\r\n defaultView: 'month',\r\n aspectRatio: 1.35,\r\n header: {\r\n left: 'title',\r\n center: '',\r\n right: 'today prev,next'\r\n },\r\n weekends: true,\r\n weekNumbers: false,\r\n weekNumberTitle: 'W',\r\n weekNumberCalculation: 'local',\r\n // editable: false,\r\n // nowIndicator: false,\r\n scrollTime: '06:00:00',\r\n minTime: '00:00:00',\r\n maxTime: '24:00:00',\r\n showNonCurrentDates: true,\r\n // event ajax\r\n lazyFetching: true,\r\n startParam: 'start',\r\n endParam: 'end',\r\n timezoneParam: 'timezone',\r\n timezone: false,\r\n // allDayDefault: undefined,\r\n // locale\r\n locale: null,\r\n isRTL: false,\r\n buttonText: {\r\n prev: 'prev',\r\n next: 'next',\r\n prevYear: 'prev year',\r\n nextYear: 'next year',\r\n year: 'year',\r\n today: 'today',\r\n month: 'month',\r\n week: 'week',\r\n day: 'day'\r\n },\r\n // buttonIcons: null,\r\n allDayText: 'all-day',\r\n // allows setting a min-height to the event segment to prevent short events overlapping each other\r\n agendaEventMinHeight: 0,\r\n // jquery-ui theming\r\n theme: false,\r\n // themeButtonIcons: null,\r\n // eventResizableFromStart: false,\r\n dragOpacity: .75,\r\n dragRevertDuration: 500,\r\n dragScroll: true,\r\n // selectable: false,\r\n unselectAuto: true,\r\n // selectMinDistance: 0,\r\n dropAccept: '*',\r\n eventOrder: 'title',\r\n // eventRenderWait: null,\r\n eventLimit: false,\r\n eventLimitText: 'more',\r\n eventLimitClick: 'popover',\r\n dayPopoverFormat: 'LL',\r\n handleWindowResize: true,\r\n windowResizeDelay: 100,\r\n longPressDelay: 1000\r\n};\r\nexports.englishDefaults = {\r\n dayPopoverFormat: 'dddd, MMMM D'\r\n};\r\nexports.rtlDefaults = {\r\n header: {\r\n left: 'next,prev today',\r\n center: '',\r\n right: 'title'\r\n },\r\n buttonIcons: {\r\n prev: 'right-single-arrow',\r\n next: 'left-single-arrow',\r\n prevYear: 'right-double-arrow',\r\n nextYear: 'left-double-arrow'\r\n },\r\n themeButtonIcons: {\r\n prev: 'circle-triangle-e',\r\n next: 'circle-triangle-w',\r\n nextYear: 'seek-prev',\r\n prevYear: 'seek-next'\r\n }\r\n};\r\nvar complexOptions = [\r\n 'header',\r\n 'footer',\r\n 'buttonText',\r\n 'buttonIcons',\r\n 'themeButtonIcons'\r\n];\r\n// Merges an array of option objects into a single object\r\nfunction mergeOptions(optionObjs) {\r\n return util_1.mergeProps(optionObjs, complexOptions);\r\n}\r\nexports.mergeOptions = mergeOptions;\r\n\r\n\r\n/***/ }),\r\n/* 33 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\n// Class that all other classes will inherit from\r\nvar Class = /** @class */ (function () {\r\n function Class() {\r\n }\r\n // Called on a class to create a subclass.\r\n // LIMITATION: cannot provide a constructor!\r\n Class.extend = function (members) {\r\n var SubClass = /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return SubClass;\r\n }(this));\r\n util_1.copyOwnProps(members, SubClass.prototype);\r\n return SubClass;\r\n };\r\n // Adds new member variables/methods to the class's prototype.\r\n // Can be called with another class, or a plain object hash containing new members.\r\n Class.mixin = function (members) {\r\n util_1.copyOwnProps(members, this.prototype);\r\n };\r\n return Class;\r\n}());\r\nexports.default = Class;\r\n\r\n\r\n/***/ }),\r\n/* 34 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar EventDef = /** @class */ (function () {\r\n function EventDef(source) {\r\n this.source = source;\r\n this.className = [];\r\n this.miscProps = {};\r\n }\r\n EventDef.parse = function (rawInput, source) {\r\n var def = new this(source);\r\n if (def.applyProps(rawInput)) {\r\n return def;\r\n }\r\n return false;\r\n };\r\n EventDef.normalizeId = function (id) {\r\n return String(id);\r\n };\r\n EventDef.generateId = function () {\r\n return '_fc' + (EventDef.uuid++);\r\n };\r\n EventDef.prototype.clone = function () {\r\n var copy = new this.constructor(this.source);\r\n copy.id = this.id;\r\n copy.rawId = this.rawId;\r\n copy.uid = this.uid; // not really unique anymore :(\r\n EventDef.copyVerbatimStandardProps(this, copy);\r\n copy.className = this.className.slice(); // copy\r\n copy.miscProps = $.extend({}, this.miscProps);\r\n return copy;\r\n };\r\n EventDef.prototype.hasInverseRendering = function () {\r\n return this.getRendering() === 'inverse-background';\r\n };\r\n EventDef.prototype.hasBgRendering = function () {\r\n var rendering = this.getRendering();\r\n return rendering === 'inverse-background' || rendering === 'background';\r\n };\r\n EventDef.prototype.getRendering = function () {\r\n if (this.rendering != null) {\r\n return this.rendering;\r\n }\r\n return this.source.rendering;\r\n };\r\n EventDef.prototype.getConstraint = function () {\r\n if (this.constraint != null) {\r\n return this.constraint;\r\n }\r\n if (this.source.constraint != null) {\r\n return this.source.constraint;\r\n }\r\n return this.source.calendar.opt('eventConstraint'); // what about View option?\r\n };\r\n EventDef.prototype.getOverlap = function () {\r\n if (this.overlap != null) {\r\n return this.overlap;\r\n }\r\n if (this.source.overlap != null) {\r\n return this.source.overlap;\r\n }\r\n return this.source.calendar.opt('eventOverlap'); // what about View option?\r\n };\r\n EventDef.prototype.isStartExplicitlyEditable = function () {\r\n if (this.startEditable != null) {\r\n return this.startEditable;\r\n }\r\n return this.source.startEditable;\r\n };\r\n EventDef.prototype.isDurationExplicitlyEditable = function () {\r\n if (this.durationEditable != null) {\r\n return this.durationEditable;\r\n }\r\n return this.source.durationEditable;\r\n };\r\n EventDef.prototype.isExplicitlyEditable = function () {\r\n if (this.editable != null) {\r\n return this.editable;\r\n }\r\n return this.source.editable;\r\n };\r\n EventDef.prototype.toLegacy = function () {\r\n var obj = $.extend({}, this.miscProps);\r\n obj._id = this.uid;\r\n obj.source = this.source;\r\n obj.className = this.className.slice(); // copy\r\n obj.allDay = this.isAllDay();\r\n if (this.rawId != null) {\r\n obj.id = this.rawId;\r\n }\r\n EventDef.copyVerbatimStandardProps(this, obj);\r\n return obj;\r\n };\r\n EventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventDef.normalizeId((this.rawId = rawProps.id));\r\n }\r\n else {\r\n this.id = EventDef.generateId();\r\n }\r\n if (rawProps._id != null) {\r\n this.uid = String(rawProps._id);\r\n }\r\n else {\r\n this.uid = EventDef.generateId();\r\n }\r\n // TODO: converge with EventSource\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventDef.prototype.applyMiscProps = function (rawProps) {\r\n $.extend(this.miscProps, rawProps);\r\n };\r\n EventDef.uuid = 0;\r\n EventDef.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventDef.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventDef;\r\n}());\r\nexports.default = EventDef;\r\nParsableModelMixin_1.default.mixInto(EventDef);\r\nEventDef.defineStandardProps({\r\n // not automatically assigned (`false`)\r\n _id: false,\r\n id: false,\r\n className: false,\r\n source: false,\r\n // automatically assigned (`true`)\r\n title: true,\r\n url: true,\r\n rendering: true,\r\n constraint: true,\r\n overlap: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 35 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange_1 = __webpack_require__(211);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nfunction eventDefsToEventInstances(eventDefs, unzonedRange) {\r\n var eventInstances = [];\r\n var i;\r\n for (i = 0; i < eventDefs.length; i++) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventDefs[i].buildInstances(unzonedRange));\r\n }\r\n return eventInstances;\r\n}\r\nexports.eventDefsToEventInstances = eventDefsToEventInstances;\r\nfunction eventInstanceToEventRange(eventInstance) {\r\n return new EventRange_1.default(eventInstance.dateProfile.unzonedRange, eventInstance.def, eventInstance);\r\n}\r\nexports.eventInstanceToEventRange = eventInstanceToEventRange;\r\nfunction eventRangeToEventFootprint(eventRange) {\r\n return new EventFootprint_1.default(new ComponentFootprint_1.default(eventRange.unzonedRange, eventRange.eventDef.isAllDay()), eventRange.eventDef, eventRange.eventInstance // might not exist\r\n );\r\n}\r\nexports.eventRangeToEventFootprint = eventRangeToEventFootprint;\r\nfunction eventInstanceToUnzonedRange(eventInstance) {\r\n return eventInstance.dateProfile.unzonedRange;\r\n}\r\nexports.eventInstanceToUnzonedRange = eventInstanceToUnzonedRange;\r\nfunction eventFootprintToComponentFootprint(eventFootprint) {\r\n return eventFootprint.componentFootprint;\r\n}\r\nexports.eventFootprintToComponentFootprint = eventFootprintToComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 36 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventFootprint = /** @class */ (function () {\r\n function EventFootprint(componentFootprint, eventDef, eventInstance) {\r\n this.componentFootprint = componentFootprint;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n EventFootprint.prototype.getEventLegacy = function () {\r\n return (this.eventInstance || this.eventDef).toLegacy();\r\n };\r\n return EventFootprint;\r\n}());\r\nexports.default = EventFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 37 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation = /** @class */ (function () {\r\n function EventDefMutation() {\r\n }\r\n EventDefMutation.createFromRawProps = function (eventInstance, rawProps, largeUnit) {\r\n var eventDef = eventInstance.def;\r\n var dateProps = {};\r\n var standardProps = {};\r\n var miscProps = {};\r\n var verbatimStandardProps = {};\r\n var eventDefId = null;\r\n var className = null;\r\n var propName;\r\n var dateProfile;\r\n var dateMutation;\r\n var defMutation;\r\n for (propName in rawProps) {\r\n if (EventDateProfile_1.default.isStandardProp(propName)) {\r\n dateProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.isStandardProp(propName)) {\r\n standardProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.miscProps[propName] !== rawProps[propName]) {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n dateProfile = EventDateProfile_1.default.parse(dateProps, eventDef.source);\r\n if (dateProfile) {\r\n dateMutation = EventDefDateMutation_1.default.createFromDiff(eventInstance.dateProfile, dateProfile, largeUnit);\r\n }\r\n if (standardProps.id !== eventDef.id) {\r\n eventDefId = standardProps.id; // only apply if there's a change\r\n }\r\n if (!util_1.isArraysEqual(standardProps.className, eventDef.className)) {\r\n className = standardProps.className; // only apply if there's a change\r\n }\r\n EventDef_1.default.copyVerbatimStandardProps(standardProps, // src\r\n verbatimStandardProps // dest\r\n );\r\n defMutation = new EventDefMutation();\r\n defMutation.eventDefId = eventDefId;\r\n defMutation.className = className;\r\n defMutation.verbatimStandardProps = verbatimStandardProps;\r\n defMutation.miscProps = miscProps;\r\n if (dateMutation) {\r\n defMutation.dateMutation = dateMutation;\r\n }\r\n return defMutation;\r\n };\r\n /*\r\n eventDef assumed to be a SingleEventDef.\r\n returns an undo function.\r\n */\r\n EventDefMutation.prototype.mutateSingle = function (eventDef) {\r\n var origDateProfile;\r\n if (this.dateMutation) {\r\n origDateProfile = eventDef.dateProfile;\r\n eventDef.dateProfile = this.dateMutation.buildNewDateProfile(origDateProfile, eventDef.source.calendar);\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.eventDefId != null) {\r\n eventDef.id = EventDef_1.default.normalizeId((eventDef.rawId = this.eventDefId));\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.className) {\r\n eventDef.className = this.className;\r\n }\r\n // can't undo\r\n if (this.verbatimStandardProps) {\r\n SingleEventDef_1.default.copyVerbatimStandardProps(this.verbatimStandardProps, // src\r\n eventDef // dest\r\n );\r\n }\r\n // can't undo\r\n if (this.miscProps) {\r\n eventDef.applyMiscProps(this.miscProps);\r\n }\r\n if (origDateProfile) {\r\n return function () {\r\n eventDef.dateProfile = origDateProfile;\r\n };\r\n }\r\n else {\r\n return function () { };\r\n }\r\n };\r\n EventDefMutation.prototype.setDateMutation = function (dateMutation) {\r\n if (dateMutation && !dateMutation.isEmpty()) {\r\n this.dateMutation = dateMutation;\r\n }\r\n else {\r\n this.dateMutation = null;\r\n }\r\n };\r\n EventDefMutation.prototype.isEmpty = function () {\r\n return !this.dateMutation;\r\n };\r\n return EventDefMutation;\r\n}());\r\nexports.default = EventDefMutation;\r\n\r\n\r\n/***/ }),\r\n/* 38 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.default = {\r\n sourceClasses: [],\r\n registerClass: function (EventSourceClass) {\r\n this.sourceClasses.unshift(EventSourceClass); // give highest priority\r\n },\r\n parse: function (rawInput, calendar) {\r\n var sourceClasses = this.sourceClasses;\r\n var i;\r\n var eventSource;\r\n for (i = 0; i < sourceClasses.length; i++) {\r\n eventSource = sourceClasses[i].parse(rawInput, calendar);\r\n if (eventSource) {\r\n return eventSource;\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 39 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Class_1 = __webpack_require__(33);\r\n/*\r\nEmbodies a div that has potential scrollbars\r\n*/\r\nvar Scroller = /** @class */ (function (_super) {\r\n tslib_1.__extends(Scroller, _super);\r\n function Scroller(options) {\r\n var _this = _super.call(this) || this;\r\n options = options || {};\r\n _this.overflowX = options.overflowX || options.overflow || 'auto';\r\n _this.overflowY = options.overflowY || options.overflow || 'auto';\r\n return _this;\r\n }\r\n Scroller.prototype.render = function () {\r\n this.el = this.renderEl();\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.renderEl = function () {\r\n return (this.scrollEl = $('
'));\r\n };\r\n // sets to natural height, unlocks overflow\r\n Scroller.prototype.clear = function () {\r\n this.setHeight('auto');\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.destroy = function () {\r\n this.el.remove();\r\n };\r\n // Overflow\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.applyOverflow = function () {\r\n this.scrollEl.css({\r\n 'overflow-x': this.overflowX,\r\n 'overflow-y': this.overflowY\r\n });\r\n };\r\n // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.\r\n // Useful for preserving scrollbar widths regardless of future resizes.\r\n // Can pass in scrollbarWidths for optimization.\r\n Scroller.prototype.lockOverflow = function (scrollbarWidths) {\r\n var overflowX = this.overflowX;\r\n var overflowY = this.overflowY;\r\n scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();\r\n if (overflowX === 'auto') {\r\n overflowX = (scrollbarWidths.top || scrollbarWidths.bottom || // horizontal scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth) ? 'scroll' : 'hidden';\r\n }\r\n if (overflowY === 'auto') {\r\n overflowY = (scrollbarWidths.left || scrollbarWidths.right || // vertical scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight) ? 'scroll' : 'hidden';\r\n }\r\n this.scrollEl.css({ 'overflow-x': overflowX, 'overflow-y': overflowY });\r\n };\r\n // Getters / Setters\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.setHeight = function (height) {\r\n this.scrollEl.height(height);\r\n };\r\n Scroller.prototype.getScrollTop = function () {\r\n return this.scrollEl.scrollTop();\r\n };\r\n Scroller.prototype.setScrollTop = function (top) {\r\n this.scrollEl.scrollTop(top);\r\n };\r\n Scroller.prototype.getClientWidth = function () {\r\n return this.scrollEl[0].clientWidth;\r\n };\r\n Scroller.prototype.getClientHeight = function () {\r\n return this.scrollEl[0].clientHeight;\r\n };\r\n Scroller.prototype.getScrollbarWidths = function () {\r\n return util_1.getScrollbarWidths(this.scrollEl);\r\n };\r\n return Scroller;\r\n}(Class_1.default));\r\nexports.default = Scroller;\r\n\r\n\r\n/***/ }),\r\n/* 40 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar DateComponent_1 = __webpack_require__(219);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar InteractiveDateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(InteractiveDateComponent, _super);\r\n function InteractiveDateComponent(_view, _options) {\r\n var _this = _super.call(this, _view, _options) || this;\r\n // self-config, overridable by subclasses\r\n _this.segSelector = '.fc-event-container > *'; // what constitutes an event element?\r\n if (_this.dateSelectingClass) {\r\n _this.dateClicking = new _this.dateClickingClass(_this);\r\n }\r\n if (_this.dateSelectingClass) {\r\n _this.dateSelecting = new _this.dateSelectingClass(_this);\r\n }\r\n if (_this.eventPointingClass) {\r\n _this.eventPointing = new _this.eventPointingClass(_this);\r\n }\r\n if (_this.eventDraggingClass && _this.eventPointing) {\r\n _this.eventDragging = new _this.eventDraggingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.eventResizingClass && _this.eventPointing) {\r\n _this.eventResizing = new _this.eventResizingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.externalDroppingClass) {\r\n _this.externalDropping = new _this.externalDroppingClass(_this);\r\n }\r\n return _this;\r\n }\r\n // Sets the container element that the view should render inside of, does global DOM-related initializations,\r\n // and renders all the non-date-related content inside.\r\n InteractiveDateComponent.prototype.setElement = function (el) {\r\n _super.prototype.setElement.call(this, el);\r\n if (this.dateClicking) {\r\n this.dateClicking.bindToEl(el);\r\n }\r\n if (this.dateSelecting) {\r\n this.dateSelecting.bindToEl(el);\r\n }\r\n this.bindAllSegHandlersToEl(el);\r\n };\r\n InteractiveDateComponent.prototype.removeElement = function () {\r\n this.endInteractions();\r\n _super.prototype.removeElement.call(this);\r\n };\r\n InteractiveDateComponent.prototype.executeEventUnrender = function () {\r\n this.endInteractions();\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n InteractiveDateComponent.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.bindToDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.unbindFromDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.bindDateHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n // attach a handler to the grid's root element.\r\n // jQuery will take care of unregistering them when removeElement gets called.\r\n this.el.on(name, function (ev) {\r\n if (!$(ev.target).is(_this.segSelector + ':not(.fc-helper),' + // directly on an event element\r\n _this.segSelector + ':not(.fc-helper) *,' + // within an event element\r\n '.fc-more,' + // a \"more..\" link\r\n 'a[data-goto]' // a clickable nav link\r\n )) {\r\n return handler.call(_this, ev);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindAllSegHandlersToEl = function (el) {\r\n [\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (eventInteraction) {\r\n if (eventInteraction) {\r\n eventInteraction.bindToEl(el);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindSegHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n el.on(name, this.segSelector, function (ev) {\r\n var segEl = $(ev.currentTarget);\r\n if (!segEl.is('.fc-helper')) {\r\n var seg = segEl.data('fc-seg'); // grab segment data. put there by View::renderEventsPayload\r\n if (seg && !_this.shouldIgnoreEventPointing()) {\r\n return handler.call(_this, seg, ev); // context will be the Grid\r\n }\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreMouse = function () {\r\n // HACK\r\n // This will still work even though bindDateHandlerToEl doesn't use GlobalEmitter.\r\n return GlobalEmitter_1.default.get().shouldIgnoreMouse();\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreTouch = function () {\r\n var view = this._getView();\r\n // On iOS (and Android?) when a new selection is initiated overtop another selection,\r\n // the touchend never fires because the elements gets removed mid-touch-interaction (my theory).\r\n // HACK: simply don't allow this to happen.\r\n // ALSO: prevent selection when an *event* is already raised.\r\n return view.isSelected || view.selectedEvent;\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreEventPointing = function () {\r\n // only call the handlers if there is not a drag/resize in progress\r\n return (this.eventDragging && this.eventDragging.isDragging) ||\r\n (this.eventResizing && this.eventResizing.isResizing);\r\n };\r\n InteractiveDateComponent.prototype.canStartSelection = function (seg, ev) {\r\n return util_1.getEvIsTouch(ev) &&\r\n !this.canStartResize(seg, ev) &&\r\n (this.isEventDefDraggable(seg.footprint.eventDef) ||\r\n this.isEventDefResizable(seg.footprint.eventDef));\r\n };\r\n InteractiveDateComponent.prototype.canStartDrag = function (seg, ev) {\r\n return !this.canStartResize(seg, ev) &&\r\n this.isEventDefDraggable(seg.footprint.eventDef);\r\n };\r\n InteractiveDateComponent.prototype.canStartResize = function (seg, ev) {\r\n var view = this._getView();\r\n var eventDef = seg.footprint.eventDef;\r\n return (!util_1.getEvIsTouch(ev) || view.isEventDefSelected(eventDef)) &&\r\n this.isEventDefResizable(eventDef) &&\r\n $(ev.target).is('.fc-resizer');\r\n };\r\n // Kills all in-progress dragging.\r\n // Useful for when public API methods that result in re-rendering are invoked during a drag.\r\n // Also useful for when touch devices misbehave and don't fire their touchend.\r\n InteractiveDateComponent.prototype.endInteractions = function () {\r\n [\r\n this.dateClicking,\r\n this.dateSelecting,\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (interaction) {\r\n if (interaction) {\r\n interaction.end();\r\n }\r\n });\r\n };\r\n // Event Drag-n-Drop\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be dragged by the user\r\n InteractiveDateComponent.prototype.isEventDefDraggable = function (eventDef) {\r\n return this.isEventDefStartEditable(eventDef);\r\n };\r\n InteractiveDateComponent.prototype.isEventDefStartEditable = function (eventDef) {\r\n var isEditable = eventDef.isStartExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('eventStartEditable');\r\n if (isEditable == null) {\r\n isEditable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isEditable;\r\n };\r\n InteractiveDateComponent.prototype.isEventDefGenerallyEditable = function (eventDef) {\r\n var isEditable = eventDef.isExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('editable');\r\n }\r\n return isEditable;\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be resized from its starting edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromStart = function (eventDef) {\r\n return this.opt('eventResizableFromStart') && this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized from its ending edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromEnd = function (eventDef) {\r\n return this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized by the user at all\r\n InteractiveDateComponent.prototype.isEventDefResizable = function (eventDef) {\r\n var isResizable = eventDef.isDurationExplicitlyEditable();\r\n if (isResizable == null) {\r\n isResizable = this.opt('eventDurationEditable');\r\n if (isResizable == null) {\r\n isResizable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isResizable;\r\n };\r\n // Event Mutation / Constraints\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Diffs the two dates, returning a duration, based on granularity of the grid\r\n // TODO: port isTimeScale into this system?\r\n InteractiveDateComponent.prototype.diffDates = function (a, b) {\r\n if (this.largeUnit) {\r\n return util_1.diffByUnit(a, b, this.largeUnit);\r\n }\r\n else {\r\n return util_1.diffDayTime(a, b);\r\n }\r\n };\r\n // is it allowed, in relation to the view's validRange?\r\n // NOTE: very similar to isExternalInstanceGroupAllowed\r\n InteractiveDateComponent.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // TODO: just use getAllEventRanges directly\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n return view.calendar.constraints.isEventInstanceGroupAllowed(eventInstanceGroup);\r\n };\r\n // NOTE: very similar to isEventInstanceGroupAllowed\r\n // when it's a completely anonymous external drag, no event.\r\n InteractiveDateComponent.prototype.isExternalInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // treat it as a selection\r\n // TODO: pass in eventInstanceGroup instead\r\n // because we don't want calendar's constraint system to depend on a component's\r\n // determination of footprints.\r\n if (!view.calendar.constraints.isSelectionFootprintAllowed(eventFootprints[i].componentFootprint)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n return InteractiveDateComponent;\r\n}(DateComponent_1.default));\r\nexports.default = InteractiveDateComponent;\r\n\r\n\r\n/***/ }),\r\n/* 41 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/* An abstract class from which other views inherit from\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar View = /** @class */ (function (_super) {\r\n tslib_1.__extends(View, _super);\r\n function View(calendar, viewSpec) {\r\n var _this = _super.call(this, null, viewSpec.options) || this;\r\n _this.batchRenderDepth = 0;\r\n _this.isSelected = false; // boolean whether a range of time is user-selected or not\r\n _this.calendar = calendar;\r\n _this.viewSpec = viewSpec;\r\n // shortcuts\r\n _this.type = viewSpec.type;\r\n // .name is deprecated\r\n _this.name = _this.type;\r\n _this.initRenderQueue();\r\n _this.initHiddenDays();\r\n _this.dateProfileGenerator = new _this.dateProfileGeneratorClass(_this);\r\n _this.bindBaseRenderHandlers();\r\n _this.eventOrderSpecs = util_1.parseFieldSpecs(_this.opt('eventOrder'));\r\n // legacy\r\n if (_this['initialize']) {\r\n _this['initialize']();\r\n }\r\n return _this;\r\n }\r\n View.prototype._getView = function () {\r\n return this;\r\n };\r\n // Retrieves an option with the given name\r\n View.prototype.opt = function (name) {\r\n return this.options[name];\r\n };\r\n /* Render Queue\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.initRenderQueue = function () {\r\n this.renderQueue = new RenderQueue_1.default({\r\n event: this.opt('eventRenderWait')\r\n });\r\n this.renderQueue.on('start', this.onRenderQueueStart.bind(this));\r\n this.renderQueue.on('stop', this.onRenderQueueStop.bind(this));\r\n this.on('before:change', this.startBatchRender);\r\n this.on('change', this.stopBatchRender);\r\n };\r\n View.prototype.onRenderQueueStart = function () {\r\n this.calendar.freezeContentHeight();\r\n this.addScroll(this.queryScroll());\r\n };\r\n View.prototype.onRenderQueueStop = function () {\r\n if (this.calendar.updateViewSize()) {\r\n this.popScroll();\r\n }\r\n this.calendar.thawContentHeight();\r\n };\r\n View.prototype.startBatchRender = function () {\r\n if (!(this.batchRenderDepth++)) {\r\n this.renderQueue.pause();\r\n }\r\n };\r\n View.prototype.stopBatchRender = function () {\r\n if (!(--this.batchRenderDepth)) {\r\n this.renderQueue.resume();\r\n }\r\n };\r\n View.prototype.requestRender = function (func, namespace, actionType) {\r\n this.renderQueue.queue(func, namespace, actionType);\r\n };\r\n // given func will auto-bind to `this`\r\n View.prototype.whenSizeUpdated = function (func) {\r\n if (this.renderQueue.isRunning) {\r\n this.renderQueue.one('stop', func.bind(this));\r\n }\r\n else {\r\n func.call(this);\r\n }\r\n };\r\n /* Title and Date Formatting\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes what the title at the top of the calendar should be for this view\r\n View.prototype.computeTitle = function (dateProfile) {\r\n var unzonedRange;\r\n // for views that span a large unit of time, show the proper interval, ignoring stray days before and after\r\n if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {\r\n unzonedRange = dateProfile.currentUnzonedRange;\r\n }\r\n else {\r\n unzonedRange = dateProfile.activeUnzonedRange;\r\n }\r\n return this.formatRange({\r\n start: this.calendar.msToMoment(unzonedRange.startMs, dateProfile.isRangeAllDay),\r\n end: this.calendar.msToMoment(unzonedRange.endMs, dateProfile.isRangeAllDay)\r\n }, dateProfile.isRangeAllDay, this.opt('titleFormat') || this.computeTitleFormat(dateProfile), this.opt('titleRangeSeparator'));\r\n };\r\n // Generates the format string that should be used to generate the title for the current date range.\r\n // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\r\n View.prototype.computeTitleFormat = function (dateProfile) {\r\n var currentRangeUnit = dateProfile.currentRangeUnit;\r\n if (currentRangeUnit === 'year') {\r\n return 'YYYY';\r\n }\r\n else if (currentRangeUnit === 'month') {\r\n return this.opt('monthYearFormat'); // like \"September 2014\"\r\n }\r\n else if (dateProfile.currentUnzonedRange.as('days') > 1) {\r\n return 'll'; // multi-day range. shorter, like \"Sep 9 - 10 2014\"\r\n }\r\n else {\r\n return 'LL'; // one day. longer, like \"September 9 2014\"\r\n }\r\n };\r\n // Date Setting/Unsetting\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.setDate = function (date) {\r\n var currentDateProfile = this.get('dateProfile');\r\n var newDateProfile = this.dateProfileGenerator.build(date, undefined, true); // forceToValid=true\r\n if (!currentDateProfile ||\r\n !currentDateProfile.activeUnzonedRange.equals(newDateProfile.activeUnzonedRange)) {\r\n this.set('dateProfile', newDateProfile);\r\n }\r\n };\r\n View.prototype.unsetDate = function () {\r\n this.unset('dateProfile');\r\n };\r\n // Event Data\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.fetchInitialEvents = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var forceAllDay = dateProfile.isRangeAllDay && !this.usesMinMaxTime;\r\n return calendar.requestEvents(calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, forceAllDay), calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, forceAllDay));\r\n };\r\n View.prototype.bindEventChanges = function () {\r\n this.listenTo(this.calendar, 'eventsReset', this.resetEvents); // TODO: make this a real event\r\n };\r\n View.prototype.unbindEventChanges = function () {\r\n this.stopListeningTo(this.calendar, 'eventsReset');\r\n };\r\n View.prototype.setEvents = function (eventsPayload) {\r\n this.set('currentEvents', eventsPayload);\r\n this.set('hasEvents', true);\r\n };\r\n View.prototype.unsetEvents = function () {\r\n this.unset('currentEvents');\r\n this.unset('hasEvents');\r\n };\r\n View.prototype.resetEvents = function (eventsPayload) {\r\n this.startBatchRender();\r\n this.unsetEvents();\r\n this.setEvents(eventsPayload);\r\n this.stopBatchRender();\r\n };\r\n // Date High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestDateRender = function (dateProfile) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateRender(dateProfile);\r\n }, 'date', 'init');\r\n };\r\n View.prototype.requestDateUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateUnrender();\r\n }, 'date', 'destroy');\r\n };\r\n // if dateProfile not specified, uses current\r\n View.prototype.executeDateRender = function (dateProfile) {\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n if (this['render']) {\r\n this['render'](); // TODO: deprecate\r\n }\r\n this.trigger('datesRendered');\r\n this.addScroll({ isDateInit: true });\r\n this.startNowIndicator(); // shouldn't render yet because updateSize will be called soon\r\n };\r\n View.prototype.executeDateUnrender = function () {\r\n this.unselect();\r\n this.stopNowIndicator();\r\n this.trigger('before:datesUnrendered');\r\n if (this['destroy']) {\r\n this['destroy'](); // TODO: deprecate\r\n }\r\n _super.prototype.executeDateUnrender.call(this);\r\n };\r\n // \"Base\" rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.bindBaseRenderHandlers = function () {\r\n var _this = this;\r\n this.on('datesRendered', function () {\r\n _this.whenSizeUpdated(_this.triggerViewRender);\r\n });\r\n this.on('before:datesUnrendered', function () {\r\n _this.triggerViewDestroy();\r\n });\r\n };\r\n View.prototype.triggerViewRender = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerViewDestroy = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Event High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestEventsRender = function (eventsPayload) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeEventRender(eventsPayload);\r\n _this.whenSizeUpdated(_this.triggerAfterEventsRendered);\r\n }, 'event', 'init');\r\n };\r\n View.prototype.requestEventsUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.triggerBeforeEventsDestroyed();\r\n _this.executeEventUnrender();\r\n }, 'event', 'destroy');\r\n };\r\n // Business Hour High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestBusinessHoursRender = function (businessHourGenerator) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.renderBusinessHours(businessHourGenerator);\r\n }, 'businessHours', 'init');\r\n };\r\n View.prototype.requestBusinessHoursUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.unrenderBusinessHours();\r\n }, 'businessHours', 'destroy');\r\n };\r\n // Misc view rendering utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Binds DOM handlers to elements that reside outside the view container, such as the document\r\n View.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n this.listenTo(GlobalEmitter_1.default.get(), {\r\n touchstart: this.processUnselect,\r\n mousedown: this.handleDocumentMousedown\r\n });\r\n };\r\n // Unbinds DOM handlers from elements that reside outside the view container\r\n View.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Immediately render the current time indicator and begins re-rendering it at an interval,\r\n // which is defined by this.getNowIndicatorUnit().\r\n // TODO: somehow do this for the current whole day's background too\r\n View.prototype.startNowIndicator = function () {\r\n var _this = this;\r\n var unit;\r\n var update;\r\n var delay; // ms wait value\r\n if (this.opt('nowIndicator')) {\r\n unit = this.getNowIndicatorUnit();\r\n if (unit) {\r\n update = util_1.proxy(this, 'updateNowIndicator'); // bind to `this`\r\n this.initialNowDate = this.calendar.getNow();\r\n this.initialNowQueriedMs = new Date().valueOf();\r\n // wait until the beginning of the next interval\r\n delay = this.initialNowDate.clone().startOf(unit).add(1, unit).valueOf() - this.initialNowDate.valueOf();\r\n this.nowIndicatorTimeoutID = setTimeout(function () {\r\n _this.nowIndicatorTimeoutID = null;\r\n update();\r\n delay = +moment.duration(1, unit);\r\n delay = Math.max(100, delay); // prevent too frequent\r\n _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval\r\n }, delay);\r\n }\r\n // rendering will be initiated in updateSize\r\n }\r\n };\r\n // rerenders the now indicator, computing the new current time from the amount of time that has passed\r\n // since the initial getNow call.\r\n View.prototype.updateNowIndicator = function () {\r\n if (this.isDatesRendered &&\r\n this.initialNowDate // activated before?\r\n ) {\r\n this.unrenderNowIndicator(); // won't unrender if unnecessary\r\n this.renderNowIndicator(this.initialNowDate.clone().add(new Date().valueOf() - this.initialNowQueriedMs) // add ms\r\n );\r\n this.isNowIndicatorRendered = true;\r\n }\r\n };\r\n // Immediately unrenders the view's current time indicator and stops any re-rendering timers.\r\n // Won't cause side effects if indicator isn't rendered.\r\n View.prototype.stopNowIndicator = function () {\r\n if (this.isNowIndicatorRendered) {\r\n if (this.nowIndicatorTimeoutID) {\r\n clearTimeout(this.nowIndicatorTimeoutID);\r\n this.nowIndicatorTimeoutID = null;\r\n }\r\n if (this.nowIndicatorIntervalID) {\r\n clearInterval(this.nowIndicatorIntervalID);\r\n this.nowIndicatorIntervalID = null;\r\n }\r\n this.unrenderNowIndicator();\r\n this.isNowIndicatorRendered = false;\r\n }\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n if (this['setHeight']) {\r\n this['setHeight'](totalHeight, isAuto);\r\n }\r\n else {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n }\r\n this.updateNowIndicator();\r\n };\r\n /* Scroller\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.addScroll = function (scroll) {\r\n var queuedScroll = this.queuedScroll || (this.queuedScroll = {});\r\n $.extend(queuedScroll, scroll);\r\n };\r\n View.prototype.popScroll = function () {\r\n this.applyQueuedScroll();\r\n this.queuedScroll = null;\r\n };\r\n View.prototype.applyQueuedScroll = function () {\r\n if (this.queuedScroll) {\r\n this.applyScroll(this.queuedScroll);\r\n }\r\n };\r\n View.prototype.queryScroll = function () {\r\n var scroll = {};\r\n if (this.isDatesRendered) {\r\n $.extend(scroll, this.queryDateScroll());\r\n }\r\n return scroll;\r\n };\r\n View.prototype.applyScroll = function (scroll) {\r\n if (scroll.isDateInit && this.isDatesRendered) {\r\n $.extend(scroll, this.computeInitialDateScroll());\r\n }\r\n if (this.isDatesRendered) {\r\n this.applyDateScroll(scroll);\r\n }\r\n };\r\n View.prototype.computeInitialDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.queryDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.applyDateScroll = function (scroll) {\r\n // subclasses must implement\r\n };\r\n /* Event Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.reportEventDrop = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n var dateMutation = eventMutation.dateMutation;\r\n // update the EventInstance, for handlers\r\n if (dateMutation) {\r\n eventInstance.dateProfile = dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n }\r\n this.triggerEventDrop(eventInstance, \r\n // a drop doesn't necessarily mean a date mutation (ex: resource change)\r\n (dateMutation && dateMutation.dateDelta) || moment.duration(), undoFunc, el, ev);\r\n };\r\n // Triggers event-drop handlers that have subscribed via the API\r\n View.prototype.triggerEventDrop = function (eventInstance, dateDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventDrop', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n dateDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* External Element Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an external element, via jQuery UI, has been dropped onto the calendar.\r\n // `meta` is the parsed data that has been embedded into the dragging event.\r\n // `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.\r\n View.prototype.reportExternalDrop = function (singleEventDef, isEvent, isSticky, el, ev, ui) {\r\n if (isEvent) {\r\n this.calendar.eventManager.addEventDef(singleEventDef, isSticky);\r\n }\r\n this.triggerExternalDrop(singleEventDef, isEvent, el, ev, ui);\r\n };\r\n // Triggers external-drop handlers that have subscribed via the API\r\n View.prototype.triggerExternalDrop = function (singleEventDef, isEvent, el, ev, ui) {\r\n // trigger 'drop' regardless of whether element represents an event\r\n this.publiclyTrigger('drop', {\r\n context: el[0],\r\n args: [\r\n singleEventDef.dateProfile.start.clone(),\r\n ev,\r\n ui,\r\n this\r\n ]\r\n });\r\n if (isEvent) {\r\n // signal an external event landed\r\n this.publiclyTrigger('eventReceive', {\r\n context: this,\r\n args: [\r\n singleEventDef.buildInstance().toLegacy(),\r\n this\r\n ]\r\n });\r\n }\r\n };\r\n /* Event Resizing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an event in the view has been resized to a new length\r\n View.prototype.reportEventResize = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n // update the EventInstance, for handlers\r\n eventInstance.dateProfile = eventMutation.dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n this.triggerEventResize(eventInstance, eventMutation.dateMutation.endDelta, undoFunc, el, ev);\r\n };\r\n // Triggers event-resize handlers that have subscribed via the API\r\n View.prototype.triggerEventResize = function (eventInstance, durationDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventResize', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n durationDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* Selection (time range)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Selects a date span on the view. `start` and `end` are both Moments.\r\n // `ev` is the native mouse event that begin the interaction.\r\n View.prototype.select = function (footprint, ev) {\r\n this.unselect(ev);\r\n this.renderSelectionFootprint(footprint);\r\n this.reportSelection(footprint, ev);\r\n };\r\n View.prototype.renderSelectionFootprint = function (footprint) {\r\n if (this['renderSelection']) {\r\n this['renderSelection'](footprint.toLegacy(this.calendar));\r\n }\r\n else {\r\n _super.prototype.renderSelectionFootprint.call(this, footprint);\r\n }\r\n };\r\n // Called when a new selection is made. Updates internal state and triggers handlers.\r\n View.prototype.reportSelection = function (footprint, ev) {\r\n this.isSelected = true;\r\n this.triggerSelect(footprint, ev);\r\n };\r\n // Triggers handlers to 'select'\r\n View.prototype.triggerSelect = function (footprint, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('select', {\r\n context: this,\r\n args: [\r\n dateProfile.start,\r\n dateProfile.end,\r\n ev,\r\n this\r\n ]\r\n });\r\n };\r\n // Undoes a selection. updates in the internal state and triggers handlers.\r\n // `ev` is the native mouse event that began the interaction.\r\n View.prototype.unselect = function (ev) {\r\n if (this.isSelected) {\r\n this.isSelected = false;\r\n if (this['destroySelection']) {\r\n this['destroySelection'](); // TODO: deprecate\r\n }\r\n this.unrenderSelection();\r\n this.publiclyTrigger('unselect', {\r\n context: this,\r\n args: [ev, this]\r\n });\r\n }\r\n };\r\n /* Event Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.selectEventInstance = function (eventInstance) {\r\n if (!this.selectedEventInstance ||\r\n this.selectedEventInstance !== eventInstance) {\r\n this.unselectEventInstance();\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventInstance === eventInstance &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.addClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = eventInstance;\r\n }\r\n };\r\n View.prototype.unselectEventInstance = function () {\r\n if (this.selectedEventInstance) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.el) {\r\n seg.el.removeClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = null;\r\n }\r\n };\r\n View.prototype.isEventDefSelected = function (eventDef) {\r\n // event references might change on refetchEvents(), while selectedEventInstance doesn't,\r\n // so compare IDs\r\n return this.selectedEventInstance && this.selectedEventInstance.def.id === eventDef.id;\r\n };\r\n /* Mouse / Touch Unselecting (time range & event unselection)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // TODO: move consistently to down/start or up/end?\r\n // TODO: don't kill previous selection if touch scrolling\r\n View.prototype.handleDocumentMousedown = function (ev) {\r\n if (util_1.isPrimaryMouseButton(ev)) {\r\n this.processUnselect(ev);\r\n }\r\n };\r\n View.prototype.processUnselect = function (ev) {\r\n this.processRangeUnselect(ev);\r\n this.processEventUnselect(ev);\r\n };\r\n View.prototype.processRangeUnselect = function (ev) {\r\n var ignore;\r\n // is there a time-range selection?\r\n if (this.isSelected && this.opt('unselectAuto')) {\r\n // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element\r\n ignore = this.opt('unselectCancel');\r\n if (!ignore || !$(ev.target).closest(ignore).length) {\r\n this.unselect(ev);\r\n }\r\n }\r\n };\r\n View.prototype.processEventUnselect = function (ev) {\r\n if (this.selectedEventInstance) {\r\n if (!$(ev.target).closest('.fc-selected').length) {\r\n this.unselectEventInstance();\r\n }\r\n }\r\n };\r\n /* Triggers\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.triggerBaseRendered = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerBaseUnrendered = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Triggers handlers to 'dayClick'\r\n // Span has start/end of the clicked area. Only the start is useful.\r\n View.prototype.triggerDayClick = function (footprint, dayEl, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('dayClick', {\r\n context: dayEl,\r\n args: [dateProfile.start, ev, this]\r\n });\r\n };\r\n /* Date Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // For DateComponent::getDayClasses\r\n View.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return false;\r\n };\r\n // Arguments after name will be forwarded to a hypothetical function value\r\n // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.\r\n // Always clone your objects if you fear mutation.\r\n View.prototype.getUnzonedRangeOption = function (name) {\r\n var val = this.opt(name);\r\n if (typeof val === 'function') {\r\n val = val.apply(null, Array.prototype.slice.call(arguments, 1));\r\n }\r\n if (val) {\r\n return this.calendar.parseUnzonedRange(val);\r\n }\r\n };\r\n /* Hidden Days\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Initializes internal variables related to calculating hidden days-of-week\r\n View.prototype.initHiddenDays = function () {\r\n var hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden\r\n var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\r\n var dayCnt = 0;\r\n var i;\r\n if (this.opt('weekends') === false) {\r\n hiddenDays.push(0, 6); // 0=sunday, 6=saturday\r\n }\r\n for (i = 0; i < 7; i++) {\r\n if (!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)) {\r\n dayCnt++;\r\n }\r\n }\r\n if (!dayCnt) {\r\n throw new Error('invalid hiddenDays'); // all days were hidden? bad.\r\n }\r\n this.isHiddenDayHash = isHiddenDayHash;\r\n };\r\n // Remove days from the beginning and end of the range that are computed as hidden.\r\n // If the whole range is trimmed off, returns null\r\n View.prototype.trimHiddenDays = function (inputUnzonedRange) {\r\n var start = inputUnzonedRange.getStart();\r\n var end = inputUnzonedRange.getEnd();\r\n if (start) {\r\n start = this.skipHiddenDays(start);\r\n }\r\n if (end) {\r\n end = this.skipHiddenDays(end, -1, true);\r\n }\r\n if (start === null || end === null || start < end) {\r\n return new UnzonedRange_1.default(start, end);\r\n }\r\n return null;\r\n };\r\n // Is the current day hidden?\r\n // `day` is a day-of-week index (0-6), or a Moment\r\n View.prototype.isHiddenDay = function (day) {\r\n if (moment.isMoment(day)) {\r\n day = day.day();\r\n }\r\n return this.isHiddenDayHash[day];\r\n };\r\n // Incrementing the current day until it is no longer a hidden day, returning a copy.\r\n // DOES NOT CONSIDER validUnzonedRange!\r\n // If the initial value of `date` is not a hidden day, don't do anything.\r\n // Pass `isExclusive` as `true` if you are dealing with an end date.\r\n // `inc` defaults to `1` (increment one day forward each time)\r\n View.prototype.skipHiddenDays = function (date, inc, isExclusive) {\r\n if (inc === void 0) { inc = 1; }\r\n if (isExclusive === void 0) { isExclusive = false; }\r\n var out = date.clone();\r\n while (this.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]) {\r\n out.add(inc, 'days');\r\n }\r\n return out;\r\n };\r\n return View;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = View;\r\nView.prototype.usesMinMaxTime = false;\r\nView.prototype.dateProfileGeneratorClass = DateProfileGenerator_1.default;\r\nView.watch('displayingDates', ['isInDom', 'dateProfile'], function (deps) {\r\n this.requestDateRender(deps.dateProfile);\r\n}, function () {\r\n this.requestDateUnrender();\r\n});\r\nView.watch('displayingBusinessHours', ['displayingDates', 'businessHourGenerator'], function (deps) {\r\n this.requestBusinessHoursRender(deps.businessHourGenerator);\r\n}, function () {\r\n this.requestBusinessHoursUnrender();\r\n});\r\nView.watch('initialEvents', ['dateProfile'], function (deps) {\r\n return this.fetchInitialEvents(deps.dateProfile);\r\n});\r\nView.watch('bindingEvents', ['initialEvents'], function (deps) {\r\n this.setEvents(deps.initialEvents);\r\n this.bindEventChanges();\r\n}, function () {\r\n this.unbindEventChanges();\r\n this.unsetEvents();\r\n});\r\nView.watch('displayingEvents', ['displayingDates', 'hasEvents'], function () {\r\n this.requestEventsRender(this.get('currentEvents'));\r\n}, function () {\r\n this.requestEventsUnrender();\r\n});\r\nView.watch('title', ['dateProfile'], function (deps) {\r\n return (this.title = this.computeTitle(deps.dateProfile)); // assign to View for legacy reasons\r\n});\r\nView.watch('legacyDateProps', ['dateProfile'], function (deps) {\r\n var calendar = this.calendar;\r\n var dateProfile = deps.dateProfile;\r\n // DEPRECATED, but we need to keep it updated...\r\n this.start = calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.end = calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n this.intervalStart = calendar.msToMoment(dateProfile.currentUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.intervalEnd = calendar.msToMoment(dateProfile.currentUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 42 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer = /** @class */ (function () {\r\n function EventRenderer(component, fillRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n EventRenderer.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n // Updates values that rely on options and also relate to range\r\n EventRenderer.prototype.rangeUpdated = function () {\r\n var displayEventTime;\r\n var displayEventEnd;\r\n this.eventTimeFormat =\r\n this.opt('eventTimeFormat') ||\r\n this.opt('timeFormat') || // deprecated\r\n this.computeEventTimeFormat();\r\n displayEventTime = this.opt('displayEventTime');\r\n if (displayEventTime == null) {\r\n displayEventTime = this.computeDisplayEventTime(); // might be based off of range\r\n }\r\n displayEventEnd = this.opt('displayEventEnd');\r\n if (displayEventEnd == null) {\r\n displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\r\n }\r\n this.displayEventTime = displayEventTime;\r\n this.displayEventEnd = displayEventEnd;\r\n };\r\n EventRenderer.prototype.render = function (eventsPayload) {\r\n var dateProfile = this.component._getDateProfile();\r\n var eventDefId;\r\n var instanceGroup;\r\n var eventRanges;\r\n var bgRanges = [];\r\n var fgRanges = [];\r\n for (eventDefId in eventsPayload) {\r\n instanceGroup = eventsPayload[eventDefId];\r\n eventRanges = instanceGroup.sliceRenderRanges(dateProfile.activeUnzonedRange);\r\n if (instanceGroup.getEventDef().hasBgRendering()) {\r\n bgRanges.push.apply(bgRanges, eventRanges);\r\n }\r\n else {\r\n fgRanges.push.apply(fgRanges, eventRanges);\r\n }\r\n }\r\n this.renderBgRanges(bgRanges);\r\n this.renderFgRanges(fgRanges);\r\n };\r\n EventRenderer.prototype.unrender = function () {\r\n this.unrenderBgRanges();\r\n this.unrenderFgRanges();\r\n };\r\n EventRenderer.prototype.renderFgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n // render an `.el` on each seg\r\n // returns a subset of the segs. segs that were actually rendered\r\n segs = this.renderFgSegEls(segs);\r\n if (this.renderFgSegs(segs) !== false) {\r\n this.fgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderFgRanges = function () {\r\n this.unrenderFgSegs(this.fgSegs || []);\r\n this.fgSegs = null;\r\n };\r\n EventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n if (this.renderBgSegs(segs) !== false) {\r\n this.bgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgRanges = function () {\r\n this.unrenderBgSegs();\r\n this.bgSegs = null;\r\n };\r\n EventRenderer.prototype.getSegs = function () {\r\n return (this.bgSegs || []).concat(this.fgSegs || []);\r\n };\r\n // Renders foreground event segments onto the grid\r\n EventRenderer.prototype.renderFgSegs = function (segs) {\r\n // subclasses must implement\r\n // segs already has rendered els, and has been filtered.\r\n return false; // signal failure if not implemented\r\n };\r\n // Unrenders all currently rendered foreground segments\r\n EventRenderer.prototype.unrenderFgSegs = function (segs) {\r\n // subclasses must implement\r\n };\r\n EventRenderer.prototype.renderBgSegs = function (segs) {\r\n var _this = this;\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('bgEvent', segs, {\r\n getClasses: function (seg) {\r\n return _this.getBgClasses(seg.footprint.eventDef);\r\n },\r\n getCss: function (seg) {\r\n return {\r\n 'background-color': _this.getBgColor(seg.footprint.eventDef)\r\n };\r\n },\r\n filterEl: function (seg, el) {\r\n return _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n });\r\n }\r\n else {\r\n return false; // signal failure if no fillRenderer\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgSegs = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('bgEvent');\r\n }\r\n };\r\n // Renders and assigns an `el` property for each foreground event segment.\r\n // Only returns segments that successfully rendered.\r\n EventRenderer.prototype.renderFgSegEls = function (segs, disableResizing) {\r\n var _this = this;\r\n if (disableResizing === void 0) { disableResizing = false; }\r\n var hasEventRenderHandlers = this.view.hasPublicHandlers('eventRender');\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of event segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n this.beforeFgSegHtml(segs[i]);\r\n html += this.fgSegHtml(segs[i], disableResizing);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n if (hasEventRenderHandlers) {\r\n el = _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n if (el) {\r\n el.data('fc-seg', seg); // used by handlers\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n EventRenderer.prototype.beforeFgSegHtml = function (seg) {\r\n };\r\n // Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()\r\n EventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n // subclasses should implement\r\n };\r\n // Generic utility for generating the HTML classNames for an event segment's element\r\n EventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable) {\r\n var classes = [\r\n 'fc-event',\r\n seg.isStart ? 'fc-start' : 'fc-not-start',\r\n seg.isEnd ? 'fc-end' : 'fc-not-end'\r\n ].concat(this.getClasses(seg.footprint.eventDef));\r\n if (isDraggable) {\r\n classes.push('fc-draggable');\r\n }\r\n if (isResizable) {\r\n classes.push('fc-resizable');\r\n }\r\n // event is currently selected? attach a className.\r\n if (this.view.isEventDefSelected(seg.footprint.eventDef)) {\r\n classes.push('fc-selected');\r\n }\r\n return classes;\r\n };\r\n // Given an event and the default element used for rendering, returns the element that should actually be used.\r\n // Basically runs events and elements through the eventRender hook.\r\n EventRenderer.prototype.filterEventRenderEl = function (eventFootprint, el) {\r\n var legacy = eventFootprint.getEventLegacy();\r\n var custom = this.view.publiclyTrigger('eventRender', {\r\n context: legacy,\r\n args: [legacy, el, this.view]\r\n });\r\n if (custom === false) {\r\n el = null;\r\n }\r\n else if (custom && custom !== true) {\r\n el = $(custom);\r\n }\r\n return el;\r\n };\r\n // Compute the text that should be displayed on an event's element.\r\n // `range` can be the Event object itself, or something range-like, with at least a `start`.\r\n // If event times are disabled, or the event has no time, will return a blank string.\r\n // If not specified, formatStr will default to the eventTimeFormat setting,\r\n // and displayEnd will default to the displayEventEnd setting.\r\n EventRenderer.prototype.getTimeText = function (eventFootprint, formatStr, displayEnd) {\r\n return this._getTimeText(eventFootprint.eventInstance.dateProfile.start, eventFootprint.eventInstance.dateProfile.end, eventFootprint.componentFootprint.isAllDay, formatStr, displayEnd);\r\n };\r\n EventRenderer.prototype._getTimeText = function (start, end, isAllDay, formatStr, displayEnd) {\r\n if (formatStr == null) {\r\n formatStr = this.eventTimeFormat;\r\n }\r\n if (displayEnd == null) {\r\n displayEnd = this.displayEventEnd;\r\n }\r\n if (this.displayEventTime && !isAllDay) {\r\n if (displayEnd && end) {\r\n return this.view.formatRange({ start: start, end: end }, false, // allDay\r\n formatStr);\r\n }\r\n else {\r\n return start.format(formatStr);\r\n }\r\n }\r\n return '';\r\n };\r\n EventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('smallTimeFormat');\r\n };\r\n EventRenderer.prototype.computeDisplayEventTime = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.getBgClasses = function (eventDef) {\r\n var classNames = this.getClasses(eventDef);\r\n classNames.push('fc-bgevent');\r\n return classNames;\r\n };\r\n EventRenderer.prototype.getClasses = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var classNames = [];\r\n for (i = 0; i < objs.length; i++) {\r\n classNames.push.apply(// append\r\n classNames, objs[i].eventClassName || objs[i].className || []);\r\n }\r\n return classNames;\r\n };\r\n // Utility for generating event skin-related CSS properties\r\n EventRenderer.prototype.getSkinCss = function (eventDef) {\r\n return {\r\n 'background-color': this.getBgColor(eventDef),\r\n 'border-color': this.getBorderColor(eventDef),\r\n color: this.getTextColor(eventDef)\r\n };\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBgColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBackgroundColor || objs[i].eventColor ||\r\n objs[i].backgroundColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBackgroundColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBorderColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBorderColor || objs[i].eventColor ||\r\n objs[i].borderColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBorderColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getTextColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventTextColor ||\r\n objs[i].textColor;\r\n }\r\n if (!val) {\r\n val = this.opt('eventTextColor');\r\n }\r\n return val;\r\n };\r\n EventRenderer.prototype.getStylingObjs = function (eventDef) {\r\n var objs = this.getFallbackStylingObjs(eventDef);\r\n objs.unshift(eventDef);\r\n return objs;\r\n };\r\n EventRenderer.prototype.getFallbackStylingObjs = function (eventDef) {\r\n return [eventDef.source];\r\n };\r\n EventRenderer.prototype.sortEventSegs = function (segs) {\r\n segs.sort(util_1.proxy(this, 'compareEventSegs'));\r\n };\r\n // A cmp function for determining which segments should take visual priority\r\n EventRenderer.prototype.compareEventSegs = function (seg1, seg2) {\r\n var f1 = seg1.footprint;\r\n var f2 = seg2.footprint;\r\n var cf1 = f1.componentFootprint;\r\n var cf2 = f2.componentFootprint;\r\n var r1 = cf1.unzonedRange;\r\n var r2 = cf2.unzonedRange;\r\n return r1.startMs - r2.startMs || // earlier events go first\r\n (r2.endMs - r2.startMs) - (r1.endMs - r1.startMs) || // tie? longer events go first\r\n cf2.isAllDay - cf1.isAllDay || // tie? put all-day events first (booleans cast to 0/1)\r\n util_1.compareByFieldSpecs(f1.eventDef, f2.eventDef, this.view.eventOrderSpecs, f1.eventDef.miscProps, f2.eventDef.miscProps);\r\n };\r\n return EventRenderer;\r\n}());\r\nexports.default = EventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 43 */,\r\n/* 44 */,\r\n/* 45 */,\r\n/* 46 */,\r\n/* 47 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment_ext_1 = __webpack_require__(10);\r\n// Plugin\r\n// -------------------------------------------------------------------------------------------------\r\nmoment_ext_1.newMomentProto.format = function () {\r\n if (this._fullCalendar && arguments[0]) {\r\n return formatDate(this, arguments[0]); // our extended formatting\r\n }\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // moment.format() doesn't ensure english, but we want to.\r\n return moment_ext_1.oldMomentFormat(englishMoment(this));\r\n }\r\n return moment_ext_1.oldMomentProto.format.apply(this, arguments);\r\n};\r\nmoment_ext_1.newMomentProto.toISOString = function () {\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // depending on browser, moment might not output english. ensure english.\r\n // https://github.com/moment/moment/blob/2.18.1/src/lib/moment/format.js#L22\r\n return moment_ext_1.oldMomentProto.toISOString.apply(englishMoment(this), arguments);\r\n }\r\n return moment_ext_1.oldMomentProto.toISOString.apply(this, arguments);\r\n};\r\nfunction englishMoment(mom) {\r\n if (mom.locale() !== 'en') {\r\n return mom.clone().locale('en');\r\n }\r\n return mom;\r\n}\r\n// Config\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nInserted between chunks in the fake (\"intermediate\") formatting string.\r\nImportant that it passes as whitespace (\\s) because moment often identifies non-standalone months\r\nvia a regexp with an \\s.\r\n*/\r\nvar PART_SEPARATOR = '\\u000b'; // vertical tab\r\n/*\r\nInserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,\r\nbut rather, a \"special\" token that has custom rendering (see specialTokens map).\r\n*/\r\nvar SPECIAL_TOKEN_MARKER = '\\u001f'; // information separator 1\r\n/*\r\nInserted at the beginning and end of a span of text that must have non-zero numeric characters.\r\nHandling of these markers is done in a post-processing step at the very end of text rendering.\r\n*/\r\nvar MAYBE_MARKER = '\\u001e'; // information separator 2\r\nvar MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global\r\n/*\r\nAddition formatting tokens we want recognized\r\n*/\r\nvar specialTokens = {\r\n t: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'a').charAt(0);\r\n },\r\n T: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'A').charAt(0);\r\n }\r\n};\r\n/*\r\nThe first characters of formatting tokens for units that are 1 day or larger.\r\n`value` is for ranking relative size (lower means bigger).\r\n`unit` is a normalized unit, used for comparing moments.\r\n*/\r\nvar largeTokenMap = {\r\n Y: { value: 1, unit: 'year' },\r\n M: { value: 2, unit: 'month' },\r\n W: { value: 3, unit: 'week' },\r\n w: { value: 3, unit: 'week' },\r\n D: { value: 4, unit: 'day' },\r\n d: { value: 4, unit: 'day' } // day of week\r\n};\r\n// Single Date Formatting\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats `date` with a Moment formatting string, but allow our non-zero areas and special token\r\n*/\r\nfunction formatDate(date, formatStr) {\r\n return renderFakeFormatString(getParsedFormatString(formatStr).fakeFormatString, date);\r\n}\r\nexports.formatDate = formatDate;\r\n// Date Range Formatting\r\n// -------------------------------------------------------------------------------------------------\r\n// TODO: make it work with timezone offset\r\n/*\r\nUsing a formatting string meant for a single date, generate a range string, like\r\n\"Sep 2 - 9 2013\", that intelligently inserts a separator where the dates differ.\r\nIf the dates are the same as far as the format string is concerned, just return a single\r\nrendering of one date, without any separator.\r\n*/\r\nfunction formatRange(date1, date2, formatStr, separator, isRTL) {\r\n var localeData;\r\n date1 = moment_ext_1.default.parseZone(date1);\r\n date2 = moment_ext_1.default.parseZone(date2);\r\n localeData = date1.localeData();\r\n // Expand localized format strings, like \"LL\" -> \"MMMM D YYYY\".\r\n // BTW, this is not important for `formatDate` because it is impossible to put custom tokens\r\n // or non-zero areas in Moment's localized format strings.\r\n formatStr = localeData.longDateFormat(formatStr) || formatStr;\r\n return renderParsedFormat(getParsedFormatString(formatStr), date1, date2, separator || ' - ', isRTL);\r\n}\r\nexports.formatRange = formatRange;\r\n/*\r\nRenders a range with an already-parsed format string.\r\n*/\r\nfunction renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {\r\n var sameUnits = parsedFormat.sameUnits;\r\n var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons\r\n var unzonedDate2 = date2.clone().stripZone(); // \"\r\n var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);\r\n var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);\r\n var leftI;\r\n var leftStr = '';\r\n var rightI;\r\n var rightStr = '';\r\n var middleI;\r\n var middleStr1 = '';\r\n var middleStr2 = '';\r\n var middleStr = '';\r\n // Start at the leftmost side of the formatting string and continue until you hit a token\r\n // that is not the same between dates.\r\n for (leftI = 0; leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI])); leftI++) {\r\n leftStr += renderedParts1[leftI];\r\n }\r\n // Similarly, start at the rightmost side of the formatting string and move left\r\n for (rightI = sameUnits.length - 1; rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI])); rightI--) {\r\n // If current chunk is on the boundary of unique date-content, and is a special-case\r\n // date-formatting postfix character, then don't consume it. Consider it unique date-content.\r\n // TODO: make configurable\r\n if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {\r\n break;\r\n }\r\n rightStr = renderedParts1[rightI] + rightStr;\r\n }\r\n // The area in the middle is different for both of the dates.\r\n // Collect them distinctly so we can jam them together later.\r\n for (middleI = leftI; middleI <= rightI; middleI++) {\r\n middleStr1 += renderedParts1[middleI];\r\n middleStr2 += renderedParts2[middleI];\r\n }\r\n if (middleStr1 || middleStr2) {\r\n if (isRTL) {\r\n middleStr = middleStr2 + separator + middleStr1;\r\n }\r\n else {\r\n middleStr = middleStr1 + separator + middleStr2;\r\n }\r\n }\r\n return processMaybeMarkers(leftStr + middleStr + rightStr);\r\n}\r\n// Format String Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nvar parsedFormatStrCache = {};\r\n/*\r\nReturns a parsed format string, leveraging a cache.\r\n*/\r\nfunction getParsedFormatString(formatStr) {\r\n return parsedFormatStrCache[formatStr] ||\r\n (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));\r\n}\r\n/*\r\nParses a format string into the following:\r\n- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.\r\n- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like \"day\"),\r\n that indicates how similar a range's start & end must be in order to share the same formatted text.\r\n If not a token, then the value is null.\r\n Always a flat array (not nested liked \"chunks\").\r\n*/\r\nfunction parseFormatString(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n return {\r\n fakeFormatString: buildFakeFormatString(chunks),\r\n sameUnits: buildSameUnits(chunks)\r\n };\r\n}\r\n/*\r\nBreak the formatting string into an array of chunks.\r\nA 'maybe' chunk will have nested chunks.\r\n*/\r\nfunction chunkFormatString(formatStr) {\r\n var chunks = [];\r\n var match;\r\n // TODO: more descrimination\r\n // \\4 is a backreference to the first character of a multi-character set.\r\n var chunker = /\\[([^\\]]*)\\]|\\(([^\\)]*)\\)|(LTS|LT|(\\w)\\4*o?)|([^\\w\\[\\(]+)/g;\r\n while ((match = chunker.exec(formatStr))) {\r\n if (match[1]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[1]));\r\n }\r\n else if (match[2]) {\r\n chunks.push({ maybe: chunkFormatString(match[2]) });\r\n }\r\n else if (match[3]) {\r\n chunks.push({ token: match[3] });\r\n }\r\n else if (match[5]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[5]));\r\n }\r\n }\r\n return chunks;\r\n}\r\n/*\r\nPotentially splits a literal-text string into multiple parts. For special cases.\r\n*/\r\nfunction splitStringLiteral(s) {\r\n if (s === '. ') {\r\n return ['.', ' ']; // for locales with periods bound to the end of each year/month/date\r\n }\r\n else {\r\n return [s];\r\n }\r\n}\r\n/*\r\nGiven chunks parsed from a real format string, generate a fake (aka \"intermediate\") format string with special control\r\ncharacters that will eventually be given to moment for formatting, and then post-processed.\r\n*/\r\nfunction buildFakeFormatString(chunks) {\r\n var parts = [];\r\n var i;\r\n var chunk;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (typeof chunk === 'string') {\r\n parts.push('[' + chunk + ']');\r\n }\r\n else if (chunk.token) {\r\n if (chunk.token in specialTokens) {\r\n parts.push(SPECIAL_TOKEN_MARKER + // useful during post-processing\r\n '[' + chunk.token + ']' // preserve as literal text\r\n );\r\n }\r\n else {\r\n parts.push(chunk.token); // unprotected text implies a format string\r\n }\r\n }\r\n else if (chunk.maybe) {\r\n parts.push(MAYBE_MARKER + // useful during post-processing\r\n buildFakeFormatString(chunk.maybe) +\r\n MAYBE_MARKER);\r\n }\r\n }\r\n return parts.join(PART_SEPARATOR);\r\n}\r\n/*\r\nGiven parsed chunks from a real formatting string, generates an array of unit strings (like \"day\") that indicate\r\nin which regard two dates must be similar in order to share range formatting text.\r\nThe `chunks` can be nested (because of \"maybe\" chunks), however, the returned array will be flat.\r\n*/\r\nfunction buildSameUnits(chunks) {\r\n var units = [];\r\n var i;\r\n var chunk;\r\n var tokenInfo;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n tokenInfo = largeTokenMap[chunk.token.charAt(0)];\r\n units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second\r\n }\r\n else if (chunk.maybe) {\r\n units.push.apply(units, // append\r\n buildSameUnits(chunk.maybe));\r\n }\r\n else {\r\n units.push(null);\r\n }\r\n }\r\n return units;\r\n}\r\n// Rendering to text\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats a date with a fake format string, post-processes the control characters, then returns.\r\n*/\r\nfunction renderFakeFormatString(fakeFormatString, date) {\r\n return processMaybeMarkers(renderFakeFormatStringParts(fakeFormatString, date).join(''));\r\n}\r\n/*\r\nFormats a date into parts that will have been post-processed, EXCEPT for the \"maybe\" markers.\r\n*/\r\nfunction renderFakeFormatStringParts(fakeFormatString, date) {\r\n var parts = [];\r\n var fakeRender = moment_ext_1.oldMomentFormat(date, fakeFormatString);\r\n var fakeParts = fakeRender.split(PART_SEPARATOR);\r\n var i;\r\n var fakePart;\r\n for (i = 0; i < fakeParts.length; i++) {\r\n fakePart = fakeParts[i];\r\n if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {\r\n parts.push(\r\n // the literal string IS the token's name.\r\n // call special token's registered function.\r\n specialTokens[fakePart.substring(1)](date));\r\n }\r\n else {\r\n parts.push(fakePart);\r\n }\r\n }\r\n return parts;\r\n}\r\n/*\r\nAccepts an almost-finally-formatted string and processes the \"maybe\" control characters, returning a new string.\r\n*/\r\nfunction processMaybeMarkers(s) {\r\n return s.replace(MAYBE_REGEXP, function (m0, m1) {\r\n if (m1.match(/[1-9]/)) {\r\n return m1;\r\n }\r\n else {\r\n return '';\r\n }\r\n });\r\n}\r\n// Misc Utils\r\n// -------------------------------------------------------------------------------------------------\r\n/*\r\nReturns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.\r\n*/\r\nfunction queryMostGranularFormatUnit(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n var i;\r\n var chunk;\r\n var candidate;\r\n var best;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n candidate = largeTokenMap[chunk.token.charAt(0)];\r\n if (candidate) {\r\n if (!best || candidate.value > best.value) {\r\n best = candidate;\r\n }\r\n }\r\n }\r\n }\r\n if (best) {\r\n return best.unit;\r\n }\r\n return null;\r\n}\r\nexports.queryMostGranularFormatUnit = queryMostGranularFormatUnit;\r\n\r\n\r\n/***/ }),\r\n/* 48 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Model = /** @class */ (function (_super) {\r\n tslib_1.__extends(Model, _super);\r\n function Model() {\r\n var _this = _super.call(this) || this;\r\n _this._watchers = {};\r\n _this._props = {};\r\n _this.applyGlobalWatchers();\r\n _this.constructed();\r\n return _this;\r\n }\r\n Model.watch = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // subclasses should make a masked-copy of the superclass's map\r\n // TODO: write test\r\n if (!this.prototype.hasOwnProperty('_globalWatchArgs')) {\r\n this.prototype._globalWatchArgs = Object.create(this.prototype._globalWatchArgs);\r\n }\r\n this.prototype._globalWatchArgs[name] = args;\r\n };\r\n Model.prototype.constructed = function () {\r\n // useful for monkeypatching. TODO: BaseClass?\r\n };\r\n Model.prototype.applyGlobalWatchers = function () {\r\n var map = this._globalWatchArgs;\r\n var name;\r\n for (name in map) {\r\n this.watch.apply(this, [name].concat(map[name]));\r\n }\r\n };\r\n Model.prototype.has = function (name) {\r\n return name in this._props;\r\n };\r\n Model.prototype.get = function (name) {\r\n if (name === undefined) {\r\n return this._props;\r\n }\r\n return this._props[name];\r\n };\r\n Model.prototype.set = function (name, val) {\r\n var newProps;\r\n if (typeof name === 'string') {\r\n newProps = {};\r\n newProps[name] = val === undefined ? null : val;\r\n }\r\n else {\r\n newProps = name;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.reset = function (newProps) {\r\n var oldProps = this._props;\r\n var changeset = {}; // will have undefined's to signal unsets\r\n var name;\r\n for (name in oldProps) {\r\n changeset[name] = undefined;\r\n }\r\n for (name in newProps) {\r\n changeset[name] = newProps[name];\r\n }\r\n this.setProps(changeset);\r\n };\r\n Model.prototype.unset = function (name) {\r\n var newProps = {};\r\n var names;\r\n var i;\r\n if (typeof name === 'string') {\r\n names = [name];\r\n }\r\n else {\r\n names = name;\r\n }\r\n for (i = 0; i < names.length; i++) {\r\n newProps[names[i]] = undefined;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.setProps = function (newProps) {\r\n var changedProps = {};\r\n var changedCnt = 0;\r\n var name;\r\n var val;\r\n for (name in newProps) {\r\n val = newProps[name];\r\n // a change in value?\r\n // if an object, don't check equality, because might have been mutated internally.\r\n // TODO: eventually enforce immutability.\r\n if (typeof val === 'object' ||\r\n val !== this._props[name]) {\r\n changedProps[name] = val;\r\n changedCnt++;\r\n }\r\n }\r\n if (changedCnt) {\r\n this.trigger('before:batchChange', changedProps);\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n this.trigger('before:change', name, val);\r\n this.trigger('before:change:' + name, val);\r\n }\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n if (val === undefined) {\r\n delete this._props[name];\r\n }\r\n else {\r\n this._props[name] = val;\r\n }\r\n this.trigger('change:' + name, val);\r\n this.trigger('change', name, val);\r\n }\r\n this.trigger('batchChange', changedProps);\r\n }\r\n };\r\n Model.prototype.watch = function (name, depList, startFunc, stopFunc) {\r\n var _this = this;\r\n this.unwatch(name);\r\n this._watchers[name] = this._watchDeps(depList, function (deps) {\r\n var res = startFunc.call(_this, deps);\r\n if (res && res.then) {\r\n _this.unset(name); // put in an unset state while resolving\r\n res.then(function (val) {\r\n _this.set(name, val);\r\n });\r\n }\r\n else {\r\n _this.set(name, res);\r\n }\r\n }, function (deps) {\r\n _this.unset(name);\r\n if (stopFunc) {\r\n stopFunc.call(_this, deps);\r\n }\r\n });\r\n };\r\n Model.prototype.unwatch = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n delete this._watchers[name];\r\n watcher.teardown();\r\n }\r\n };\r\n Model.prototype._watchDeps = function (depList, startFunc, stopFunc) {\r\n var _this = this;\r\n var queuedChangeCnt = 0;\r\n var depCnt = depList.length;\r\n var satisfyCnt = 0;\r\n var values = {}; // what's passed as the `deps` arguments\r\n var bindTuples = []; // array of [ eventName, handlerFunc ] arrays\r\n var isCallingStop = false;\r\n var onBeforeDepChange = function (depName, val, isOptional) {\r\n queuedChangeCnt++;\r\n if (queuedChangeCnt === 1) {\r\n if (satisfyCnt === depCnt) {\r\n isCallingStop = true;\r\n stopFunc(values);\r\n isCallingStop = false;\r\n }\r\n }\r\n };\r\n var onDepChange = function (depName, val, isOptional) {\r\n if (val === undefined) {\r\n // required dependency that was previously set?\r\n if (!isOptional && values[depName] !== undefined) {\r\n satisfyCnt--;\r\n }\r\n delete values[depName];\r\n }\r\n else {\r\n // required dependency that was previously unset?\r\n if (!isOptional && values[depName] === undefined) {\r\n satisfyCnt++;\r\n }\r\n values[depName] = val;\r\n }\r\n queuedChangeCnt--;\r\n if (!queuedChangeCnt) {\r\n // now finally satisfied or satisfied all along?\r\n if (satisfyCnt === depCnt) {\r\n // if the stopFunc initiated another value change, ignore it.\r\n // it will be processed by another change event anyway.\r\n if (!isCallingStop) {\r\n startFunc(values);\r\n }\r\n }\r\n }\r\n };\r\n // intercept for .on() that remembers handlers\r\n var bind = function (eventName, handler) {\r\n _this.on(eventName, handler);\r\n bindTuples.push([eventName, handler]);\r\n };\r\n // listen to dependency changes\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n bind('before:change:' + depName, function (val) {\r\n onBeforeDepChange(depName, val, isOptional);\r\n });\r\n bind('change:' + depName, function (val) {\r\n onDepChange(depName, val, isOptional);\r\n });\r\n });\r\n // process current dependency values\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n if (_this.has(depName)) {\r\n values[depName] = _this.get(depName);\r\n satisfyCnt++;\r\n }\r\n else if (isOptional) {\r\n satisfyCnt++;\r\n }\r\n });\r\n // initially satisfied\r\n if (satisfyCnt === depCnt) {\r\n startFunc(values);\r\n }\r\n return {\r\n teardown: function () {\r\n // remove all handlers\r\n for (var i = 0; i < bindTuples.length; i++) {\r\n _this.off(bindTuples[i][0], bindTuples[i][1]);\r\n }\r\n bindTuples = null;\r\n // was satisfied, so call stopFunc\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n }\r\n },\r\n flash: function () {\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n startFunc(values);\r\n }\r\n }\r\n };\r\n };\r\n Model.prototype.flash = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n watcher.flash();\r\n }\r\n };\r\n return Model;\r\n}(Class_1.default));\r\nexports.default = Model;\r\nModel.prototype._globalWatchArgs = {}; // mutation protection in Model.watch\r\nEmitterMixin_1.default.mixInto(Model);\r\nListenerMixin_1.default.mixInto(Model);\r\n\r\n\r\n/***/ }),\r\n/* 49 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nexports.default = {\r\n parse: function (eventInput, source) {\r\n if (util_1.isTimeString(eventInput.start) || moment.isDuration(eventInput.start) ||\r\n util_1.isTimeString(eventInput.end) || moment.isDuration(eventInput.end)) {\r\n return RecurringEventDef_1.default.parse(eventInput, source);\r\n }\r\n else {\r\n return SingleEventDef_1.default.parse(eventInput, source);\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 50 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDefDateMutation = /** @class */ (function () {\r\n function EventDefDateMutation() {\r\n this.clearEnd = false;\r\n this.forceTimed = false;\r\n this.forceAllDay = false;\r\n }\r\n EventDefDateMutation.createFromDiff = function (dateProfile0, dateProfile1, largeUnit) {\r\n var clearEnd = dateProfile0.end && !dateProfile1.end;\r\n var forceTimed = dateProfile0.isAllDay() && !dateProfile1.isAllDay();\r\n var forceAllDay = !dateProfile0.isAllDay() && dateProfile1.isAllDay();\r\n var dateDelta;\r\n var endDiff;\r\n var endDelta;\r\n var mutation;\r\n // subtracts the dates in the appropriate way, returning a duration\r\n function subtractDates(date1, date0) {\r\n if (largeUnit) {\r\n return util_1.diffByUnit(date1, date0, largeUnit); // poorly named\r\n }\r\n else if (dateProfile1.isAllDay()) {\r\n return util_1.diffDay(date1, date0); // poorly named\r\n }\r\n else {\r\n return util_1.diffDayTime(date1, date0); // poorly named\r\n }\r\n }\r\n dateDelta = subtractDates(dateProfile1.start, dateProfile0.start);\r\n if (dateProfile1.end) {\r\n // use unzonedRanges because dateProfile0.end might be null\r\n endDiff = subtractDates(dateProfile1.unzonedRange.getEnd(), dateProfile0.unzonedRange.getEnd());\r\n endDelta = endDiff.subtract(dateDelta);\r\n }\r\n mutation = new EventDefDateMutation();\r\n mutation.clearEnd = clearEnd;\r\n mutation.forceTimed = forceTimed;\r\n mutation.forceAllDay = forceAllDay;\r\n mutation.setDateDelta(dateDelta);\r\n mutation.setEndDelta(endDelta);\r\n return mutation;\r\n };\r\n /*\r\n returns an undo function.\r\n */\r\n EventDefDateMutation.prototype.buildNewDateProfile = function (eventDateProfile, calendar) {\r\n var start = eventDateProfile.start.clone();\r\n var end = null;\r\n var shouldRezone = false;\r\n if (eventDateProfile.end && !this.clearEnd) {\r\n end = eventDateProfile.end.clone();\r\n }\r\n else if (this.endDelta && !end) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n if (this.forceTimed) {\r\n shouldRezone = true;\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n else if (this.forceAllDay) {\r\n if (start.hasTime()) {\r\n start.stripTime();\r\n }\r\n if (end && end.hasTime()) {\r\n end.stripTime();\r\n }\r\n }\r\n if (this.dateDelta) {\r\n shouldRezone = true;\r\n start.add(this.dateDelta);\r\n if (end) {\r\n end.add(this.dateDelta);\r\n }\r\n }\r\n // do this before adding startDelta to start, so we can work off of start\r\n if (this.endDelta) {\r\n shouldRezone = true;\r\n end.add(this.endDelta);\r\n }\r\n if (this.startDelta) {\r\n shouldRezone = true;\r\n start.add(this.startDelta);\r\n }\r\n if (shouldRezone) {\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n }\r\n // TODO: okay to access calendar option?\r\n if (!end && calendar.opt('forceEventDuration')) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n return new EventDateProfile_1.default(start, end, calendar);\r\n };\r\n EventDefDateMutation.prototype.setDateDelta = function (dateDelta) {\r\n if (dateDelta && dateDelta.valueOf()) {\r\n this.dateDelta = dateDelta;\r\n }\r\n else {\r\n this.dateDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setStartDelta = function (startDelta) {\r\n if (startDelta && startDelta.valueOf()) {\r\n this.startDelta = startDelta;\r\n }\r\n else {\r\n this.startDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setEndDelta = function (endDelta) {\r\n if (endDelta && endDelta.valueOf()) {\r\n this.endDelta = endDelta;\r\n }\r\n else {\r\n this.endDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.isEmpty = function () {\r\n return !this.clearEnd && !this.forceTimed && !this.forceAllDay &&\r\n !this.dateDelta && !this.startDelta && !this.endDelta;\r\n };\r\n return EventDefDateMutation;\r\n}());\r\nexports.default = EventDefDateMutation;\r\n\r\n\r\n/***/ }),\r\n/* 51 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar themeClassHash = {};\r\nfunction defineThemeSystem(themeName, themeClass) {\r\n themeClassHash[themeName] = themeClass;\r\n}\r\nexports.defineThemeSystem = defineThemeSystem;\r\nfunction getThemeSystemClass(themeSetting) {\r\n if (!themeSetting) {\r\n return StandardTheme_1.default;\r\n }\r\n else if (themeSetting === true) {\r\n return JqueryUiTheme_1.default;\r\n }\r\n else {\r\n return themeClassHash[themeSetting];\r\n }\r\n}\r\nexports.getThemeSystemClass = getThemeSystemClass;\r\n\r\n\r\n/***/ }),\r\n/* 52 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar ArrayEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(ArrayEventSource, _super);\r\n function ArrayEventSource(calendar) {\r\n var _this = _super.call(this, calendar) || this;\r\n _this.eventDefs = []; // for if setRawEventDefs is never called\r\n return _this;\r\n }\r\n ArrayEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isArray(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isArray(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n ArrayEventSource.prototype.setRawEventDefs = function (rawEventDefs) {\r\n this.rawEventDefs = rawEventDefs;\r\n this.eventDefs = this.parseEventDefs(rawEventDefs);\r\n };\r\n ArrayEventSource.prototype.fetch = function (start, end, timezone) {\r\n var eventDefs = this.eventDefs;\r\n var i;\r\n if (this.currentTimezone != null &&\r\n this.currentTimezone !== timezone) {\r\n for (i = 0; i < eventDefs.length; i++) {\r\n if (eventDefs[i] instanceof SingleEventDef_1.default) {\r\n eventDefs[i].rezone();\r\n }\r\n }\r\n }\r\n this.currentTimezone = timezone;\r\n return Promise_1.default.resolve(eventDefs);\r\n };\r\n ArrayEventSource.prototype.addEventDef = function (eventDef) {\r\n this.eventDefs.push(eventDef);\r\n };\r\n /*\r\n eventDefId already normalized to a string\r\n */\r\n ArrayEventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n return util_1.removeMatching(this.eventDefs, function (eventDef) {\r\n return eventDef.id === eventDefId;\r\n });\r\n };\r\n ArrayEventSource.prototype.removeAllEventDefs = function () {\r\n this.eventDefs = [];\r\n };\r\n ArrayEventSource.prototype.getPrimitive = function () {\r\n return this.rawEventDefs;\r\n };\r\n ArrayEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.setRawEventDefs(rawProps.events);\r\n return superSuccess;\r\n };\r\n return ArrayEventSource;\r\n}(EventSource_1.default));\r\nexports.default = ArrayEventSource;\r\nArrayEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 53 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/*\r\nA cache for the left/right/top/bottom/width/height values for one or more elements.\r\nWorks with both offset (from topleft document) and position (from offsetParent).\r\n\r\noptions:\r\n- els\r\n- isHorizontal\r\n- isVertical\r\n*/\r\nvar CoordCache = /** @class */ (function () {\r\n function CoordCache(options) {\r\n this.isHorizontal = false; // whether to query for left/right/width\r\n this.isVertical = false; // whether to query for top/bottom/height\r\n this.els = $(options.els);\r\n this.isHorizontal = options.isHorizontal;\r\n this.isVertical = options.isVertical;\r\n this.forcedOffsetParentEl = options.offsetParent ? $(options.offsetParent) : null;\r\n }\r\n // Queries the els for coordinates and stores them.\r\n // Call this method before using and of the get* methods below.\r\n CoordCache.prototype.build = function () {\r\n var offsetParentEl = this.forcedOffsetParentEl;\r\n if (!offsetParentEl && this.els.length > 0) {\r\n offsetParentEl = this.els.eq(0).offsetParent();\r\n }\r\n this.origin = offsetParentEl ?\r\n offsetParentEl.offset() :\r\n null;\r\n this.boundingRect = this.queryBoundingRect();\r\n if (this.isHorizontal) {\r\n this.buildElHorizontals();\r\n }\r\n if (this.isVertical) {\r\n this.buildElVerticals();\r\n }\r\n };\r\n // Destroys all internal data about coordinates, freeing memory\r\n CoordCache.prototype.clear = function () {\r\n this.origin = null;\r\n this.boundingRect = null;\r\n this.lefts = null;\r\n this.rights = null;\r\n this.tops = null;\r\n this.bottoms = null;\r\n };\r\n // When called, if coord caches aren't built, builds them\r\n CoordCache.prototype.ensureBuilt = function () {\r\n if (!this.origin) {\r\n this.build();\r\n }\r\n };\r\n // Populates the left/right internal coordinate arrays\r\n CoordCache.prototype.buildElHorizontals = function () {\r\n var lefts = [];\r\n var rights = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var left = el.offset().left;\r\n var width = el.outerWidth();\r\n lefts.push(left);\r\n rights.push(left + width);\r\n });\r\n this.lefts = lefts;\r\n this.rights = rights;\r\n };\r\n // Populates the top/bottom internal coordinate arrays\r\n CoordCache.prototype.buildElVerticals = function () {\r\n var tops = [];\r\n var bottoms = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var top = el.offset().top;\r\n var height = el.outerHeight();\r\n tops.push(top);\r\n bottoms.push(top + height);\r\n });\r\n this.tops = tops;\r\n this.bottoms = bottoms;\r\n };\r\n // Given a left offset (from document left), returns the index of the el that it horizontally intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getHorizontalIndex = function (leftOffset) {\r\n this.ensureBuilt();\r\n var lefts = this.lefts;\r\n var rights = this.rights;\r\n var len = lefts.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (leftOffset >= lefts[i] && leftOffset < rights[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Given a top offset (from document top), returns the index of the el that it vertically intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getVerticalIndex = function (topOffset) {\r\n this.ensureBuilt();\r\n var tops = this.tops;\r\n var bottoms = this.bottoms;\r\n var len = tops.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (topOffset >= tops[i] && topOffset < bottoms[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Gets the left offset (from document left) of the element at the given index\r\n CoordCache.prototype.getLeftOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex];\r\n };\r\n // Gets the left position (from offsetParent left) of the element at the given index\r\n CoordCache.prototype.getLeftPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex] - this.origin.left;\r\n };\r\n // Gets the right offset (from document left) of the element at the given index.\r\n // This value is NOT relative to the document's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex];\r\n };\r\n // Gets the right position (from offsetParent left) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.origin.left;\r\n };\r\n // Gets the width of the element at the given index\r\n CoordCache.prototype.getWidth = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.lefts[leftIndex];\r\n };\r\n // Gets the top offset (from document top) of the element at the given index\r\n CoordCache.prototype.getTopOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex];\r\n };\r\n // Gets the top position (from offsetParent top) of the element at the given position\r\n CoordCache.prototype.getTopPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex] - this.origin.top;\r\n };\r\n // Gets the bottom offset (from the document top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex];\r\n };\r\n // Gets the bottom position (from the offsetParent top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.origin.top;\r\n };\r\n // Gets the height of the element at the given index\r\n CoordCache.prototype.getHeight = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.tops[topIndex];\r\n };\r\n // Bounding Rect\r\n // TODO: decouple this from CoordCache\r\n // Compute and return what the elements' bounding rectangle is, from the user's perspective.\r\n // Right now, only returns a rectangle if constrained by an overflow:scroll element.\r\n // Returns null if there are no elements\r\n CoordCache.prototype.queryBoundingRect = function () {\r\n var scrollParentEl;\r\n if (this.els.length > 0) {\r\n scrollParentEl = util_1.getScrollParent(this.els.eq(0));\r\n if (!scrollParentEl.is(document)) {\r\n return util_1.getClientRect(scrollParentEl);\r\n }\r\n }\r\n return null;\r\n };\r\n CoordCache.prototype.isPointInBounds = function (leftOffset, topOffset) {\r\n return this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);\r\n };\r\n CoordCache.prototype.isLeftInBounds = function (leftOffset) {\r\n return !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);\r\n };\r\n CoordCache.prototype.isTopInBounds = function (topOffset) {\r\n return !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);\r\n };\r\n return CoordCache;\r\n}());\r\nexports.default = CoordCache;\r\n\r\n\r\n/***/ }),\r\n/* 54 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\n/* Tracks a drag's mouse movement, firing various handlers\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// TODO: use Emitter\r\nvar DragListener = /** @class */ (function () {\r\n function DragListener(options) {\r\n this.isInteracting = false;\r\n this.isDistanceSurpassed = false;\r\n this.isDelayEnded = false;\r\n this.isDragging = false;\r\n this.isTouch = false;\r\n this.isGeneric = false; // initiated by 'dragstart' (jqui)\r\n this.shouldCancelTouchScroll = true;\r\n this.scrollAlwaysKills = false;\r\n this.isAutoScroll = false;\r\n // defaults\r\n this.scrollSensitivity = 30; // pixels from edge for scrolling to start\r\n this.scrollSpeed = 200; // pixels per second, at maximum speed\r\n this.scrollIntervalMs = 50; // millisecond wait between scroll increment\r\n this.options = options || {};\r\n }\r\n // Interaction (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startInteraction = function (ev, extraOptions) {\r\n if (extraOptions === void 0) { extraOptions = {}; }\r\n if (ev.type === 'mousedown') {\r\n if (GlobalEmitter_1.default.get().shouldIgnoreMouse()) {\r\n return;\r\n }\r\n else if (!util_1.isPrimaryMouseButton(ev)) {\r\n return;\r\n }\r\n else {\r\n ev.preventDefault(); // prevents native selection in most browsers\r\n }\r\n }\r\n if (!this.isInteracting) {\r\n // process options\r\n this.delay = util_1.firstDefined(extraOptions.delay, this.options.delay, 0);\r\n this.minDistance = util_1.firstDefined(extraOptions.distance, this.options.distance, 0);\r\n this.subjectEl = this.options.subjectEl;\r\n util_1.preventSelection($('body'));\r\n this.isInteracting = true;\r\n this.isTouch = util_1.getEvIsTouch(ev);\r\n this.isGeneric = ev.type === 'dragstart';\r\n this.isDelayEnded = false;\r\n this.isDistanceSurpassed = false;\r\n this.originX = util_1.getEvX(ev);\r\n this.originY = util_1.getEvY(ev);\r\n this.scrollEl = util_1.getScrollParent($(ev.target));\r\n this.bindHandlers();\r\n this.initAutoScroll();\r\n this.handleInteractionStart(ev);\r\n this.startDelay(ev);\r\n if (!this.minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n };\r\n DragListener.prototype.handleInteractionStart = function (ev) {\r\n this.trigger('interactionStart', ev);\r\n };\r\n DragListener.prototype.endInteraction = function (ev, isCancelled) {\r\n if (this.isInteracting) {\r\n this.endDrag(ev);\r\n if (this.delayTimeoutId) {\r\n clearTimeout(this.delayTimeoutId);\r\n this.delayTimeoutId = null;\r\n }\r\n this.destroyAutoScroll();\r\n this.unbindHandlers();\r\n this.isInteracting = false;\r\n this.handleInteractionEnd(ev, isCancelled);\r\n util_1.allowSelection($('body'));\r\n }\r\n };\r\n DragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n this.trigger('interactionEnd', ev, isCancelled || false);\r\n };\r\n // Binding To DOM\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.bindHandlers = function () {\r\n // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,\r\n // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.\r\n var globalEmitter = GlobalEmitter_1.default.get();\r\n if (this.isGeneric) {\r\n this.listenTo($(document), {\r\n drag: this.handleMove,\r\n dragstop: this.endInteraction\r\n });\r\n }\r\n else if (this.isTouch) {\r\n this.listenTo(globalEmitter, {\r\n touchmove: this.handleTouchMove,\r\n touchend: this.endInteraction,\r\n scroll: this.handleTouchScroll\r\n });\r\n }\r\n else {\r\n this.listenTo(globalEmitter, {\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.endInteraction\r\n });\r\n }\r\n this.listenTo(globalEmitter, {\r\n selectstart: util_1.preventDefault,\r\n contextmenu: util_1.preventDefault // long taps would open menu on Chrome dev tools\r\n });\r\n };\r\n DragListener.prototype.unbindHandlers = function () {\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n this.stopListeningTo($(document)); // for isGeneric\r\n };\r\n // Drag (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // extraOptions ignored if drag already started\r\n DragListener.prototype.startDrag = function (ev, extraOptions) {\r\n this.startInteraction(ev, extraOptions); // ensure interaction began\r\n if (!this.isDragging) {\r\n this.isDragging = true;\r\n this.handleDragStart(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragStart = function (ev) {\r\n this.trigger('dragStart', ev);\r\n };\r\n DragListener.prototype.handleMove = function (ev) {\r\n var dx = util_1.getEvX(ev) - this.originX;\r\n var dy = util_1.getEvY(ev) - this.originY;\r\n var minDistance = this.minDistance;\r\n var distanceSq; // current distance from the origin, squared\r\n if (!this.isDistanceSurpassed) {\r\n distanceSq = dx * dx + dy * dy;\r\n if (distanceSq >= minDistance * minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n if (this.isDragging) {\r\n this.handleDrag(dx, dy, ev);\r\n }\r\n };\r\n // Called while the mouse is being moved and when we know a legitimate drag is taking place\r\n DragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n this.trigger('drag', dx, dy, ev);\r\n this.updateAutoScroll(ev); // will possibly cause scrolling\r\n };\r\n DragListener.prototype.endDrag = function (ev) {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.handleDragEnd(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragEnd = function (ev) {\r\n this.trigger('dragEnd', ev);\r\n };\r\n // Delay\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startDelay = function (initialEv) {\r\n var _this = this;\r\n if (this.delay) {\r\n this.delayTimeoutId = setTimeout(function () {\r\n _this.handleDelayEnd(initialEv);\r\n }, this.delay);\r\n }\r\n else {\r\n this.handleDelayEnd(initialEv);\r\n }\r\n };\r\n DragListener.prototype.handleDelayEnd = function (initialEv) {\r\n this.isDelayEnded = true;\r\n if (this.isDistanceSurpassed) {\r\n this.startDrag(initialEv);\r\n }\r\n };\r\n // Distance\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleDistanceSurpassed = function (ev) {\r\n this.isDistanceSurpassed = true;\r\n if (this.isDelayEnded) {\r\n this.startDrag(ev);\r\n }\r\n };\r\n // Mouse / Touch\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchMove = function (ev) {\r\n // prevent inertia and touchmove-scrolling while dragging\r\n if (this.isDragging && this.shouldCancelTouchScroll) {\r\n ev.preventDefault();\r\n }\r\n this.handleMove(ev);\r\n };\r\n DragListener.prototype.handleMouseMove = function (ev) {\r\n this.handleMove(ev);\r\n };\r\n // Scrolling (unrelated to auto-scroll)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchScroll = function (ev) {\r\n // if the drag is being initiated by touch, but a scroll happens before\r\n // the drag-initiating delay is over, cancel the drag\r\n if (!this.isDragging || this.scrollAlwaysKills) {\r\n this.endInteraction(ev, true); // isCancelled=true\r\n }\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n DragListener.prototype.trigger = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n if (this.options[name]) {\r\n this.options[name].apply(this, args);\r\n }\r\n // makes _methods callable by event name. TODO: kill this\r\n if (this['_' + name]) {\r\n this['_' + name].apply(this, args);\r\n }\r\n };\r\n // Auto-scroll\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.initAutoScroll = function () {\r\n var scrollEl = this.scrollEl;\r\n this.isAutoScroll =\r\n this.options.scroll &&\r\n scrollEl &&\r\n !scrollEl.is(window) &&\r\n !scrollEl.is(document);\r\n if (this.isAutoScroll) {\r\n // debounce makes sure rapid calls don't happen\r\n this.listenTo(scrollEl, 'scroll', util_1.debounce(this.handleDebouncedScroll, 100));\r\n }\r\n };\r\n DragListener.prototype.destroyAutoScroll = function () {\r\n this.endAutoScroll(); // kill any animation loop\r\n // remove the scroll handler if there is a scrollEl\r\n if (this.isAutoScroll) {\r\n this.stopListeningTo(this.scrollEl, 'scroll'); // will probably get removed by unbindHandlers too :(\r\n }\r\n };\r\n // Computes and stores the bounding rectangle of scrollEl\r\n DragListener.prototype.computeScrollBounds = function () {\r\n if (this.isAutoScroll) {\r\n this.scrollBounds = util_1.getOuterRect(this.scrollEl);\r\n // TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars\r\n }\r\n };\r\n // Called when the dragging is in progress and scrolling should be updated\r\n DragListener.prototype.updateAutoScroll = function (ev) {\r\n var sensitivity = this.scrollSensitivity;\r\n var bounds = this.scrollBounds;\r\n var topCloseness;\r\n var bottomCloseness;\r\n var leftCloseness;\r\n var rightCloseness;\r\n var topVel = 0;\r\n var leftVel = 0;\r\n if (bounds) {\r\n // compute closeness to edges. valid range is from 0.0 - 1.0\r\n topCloseness = (sensitivity - (util_1.getEvY(ev) - bounds.top)) / sensitivity;\r\n bottomCloseness = (sensitivity - (bounds.bottom - util_1.getEvY(ev))) / sensitivity;\r\n leftCloseness = (sensitivity - (util_1.getEvX(ev) - bounds.left)) / sensitivity;\r\n rightCloseness = (sensitivity - (bounds.right - util_1.getEvX(ev))) / sensitivity;\r\n // translate vertical closeness into velocity.\r\n // mouse must be completely in bounds for velocity to happen.\r\n if (topCloseness >= 0 && topCloseness <= 1) {\r\n topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up\r\n }\r\n else if (bottomCloseness >= 0 && bottomCloseness <= 1) {\r\n topVel = bottomCloseness * this.scrollSpeed;\r\n }\r\n // translate horizontal closeness into velocity\r\n if (leftCloseness >= 0 && leftCloseness <= 1) {\r\n leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left\r\n }\r\n else if (rightCloseness >= 0 && rightCloseness <= 1) {\r\n leftVel = rightCloseness * this.scrollSpeed;\r\n }\r\n }\r\n this.setScrollVel(topVel, leftVel);\r\n };\r\n // Sets the speed-of-scrolling for the scrollEl\r\n DragListener.prototype.setScrollVel = function (topVel, leftVel) {\r\n this.scrollTopVel = topVel;\r\n this.scrollLeftVel = leftVel;\r\n this.constrainScrollVel(); // massages into realistic values\r\n // if there is non-zero velocity, and an animation loop hasn't already started, then START\r\n if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {\r\n this.scrollIntervalId = setInterval(util_1.proxy(this, 'scrollIntervalFunc'), // scope to `this`\r\n this.scrollIntervalMs);\r\n }\r\n };\r\n // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way\r\n DragListener.prototype.constrainScrollVel = function () {\r\n var el = this.scrollEl;\r\n if (this.scrollTopVel < 0) {\r\n if (el.scrollTop() <= 0) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n else if (this.scrollTopVel > 0) {\r\n if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n if (this.scrollLeftVel < 0) {\r\n if (el.scrollLeft() <= 0) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n else if (this.scrollLeftVel > 0) {\r\n if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n };\r\n // This function gets called during every iteration of the scrolling animation loop\r\n DragListener.prototype.scrollIntervalFunc = function () {\r\n var el = this.scrollEl;\r\n var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by\r\n // change the value of scrollEl's scroll\r\n if (this.scrollTopVel) {\r\n el.scrollTop(el.scrollTop() + this.scrollTopVel * frac);\r\n }\r\n if (this.scrollLeftVel) {\r\n el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);\r\n }\r\n this.constrainScrollVel(); // since the scroll values changed, recompute the velocities\r\n // if scrolled all the way, which causes the vels to be zero, stop the animation loop\r\n if (!this.scrollTopVel && !this.scrollLeftVel) {\r\n this.endAutoScroll();\r\n }\r\n };\r\n // Kills any existing scrolling animation loop\r\n DragListener.prototype.endAutoScroll = function () {\r\n if (this.scrollIntervalId) {\r\n clearInterval(this.scrollIntervalId);\r\n this.scrollIntervalId = null;\r\n this.handleScrollEnd();\r\n }\r\n };\r\n // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)\r\n DragListener.prototype.handleDebouncedScroll = function () {\r\n // recompute all coordinates, but *only* if this is *not* part of our scrolling animation\r\n if (!this.scrollIntervalId) {\r\n this.handleScrollEnd();\r\n }\r\n };\r\n DragListener.prototype.handleScrollEnd = function () {\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n };\r\n return DragListener;\r\n}());\r\nexports.default = DragListener;\r\nListenerMixin_1.default.mixInto(DragListener);\r\n\r\n\r\n/***/ }),\r\n/* 55 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\n/*\r\nA set of rendering and date-related methods for a visual component comprised of one or more rows of day columns.\r\nPrerequisite: the object being mixed into needs to be a *Grid*\r\n*/\r\nvar DayTableMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayTableMixin, _super);\r\n function DayTableMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Populates internal variables used for date calculation and rendering\r\n DayTableMixin.prototype.updateDayTable = function () {\r\n var t = this;\r\n var view = t.view;\r\n var calendar = view.calendar;\r\n var date = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.startMs, true);\r\n var end = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.endMs, true);\r\n var dayIndex = -1;\r\n var dayIndices = [];\r\n var dayDates = [];\r\n var daysPerRow;\r\n var firstDay;\r\n var rowCnt;\r\n while (date.isBefore(end)) {\r\n if (view.isHiddenDay(date)) {\r\n dayIndices.push(dayIndex + 0.5); // mark that it's between indices\r\n }\r\n else {\r\n dayIndex++;\r\n dayIndices.push(dayIndex);\r\n dayDates.push(date.clone());\r\n }\r\n date.add(1, 'days');\r\n }\r\n if (this.breakOnWeeks) {\r\n // count columns until the day-of-week repeats\r\n firstDay = dayDates[0].day();\r\n for (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {\r\n if (dayDates[daysPerRow].day() === firstDay) {\r\n break;\r\n }\r\n }\r\n rowCnt = Math.ceil(dayDates.length / daysPerRow);\r\n }\r\n else {\r\n rowCnt = 1;\r\n daysPerRow = dayDates.length;\r\n }\r\n this.dayDates = dayDates;\r\n this.dayIndices = dayIndices;\r\n this.daysPerRow = daysPerRow;\r\n this.rowCnt = rowCnt;\r\n this.updateDayTableCols();\r\n };\r\n // Computes and assigned the colCnt property and updates any options that may be computed from it\r\n DayTableMixin.prototype.updateDayTableCols = function () {\r\n this.colCnt = this.computeColCnt();\r\n this.colHeadFormat =\r\n this.opt('columnHeaderFormat') ||\r\n this.opt('columnFormat') || // deprecated\r\n this.computeColHeadFormat();\r\n };\r\n // Determines how many columns there should be in the table\r\n DayTableMixin.prototype.computeColCnt = function () {\r\n return this.daysPerRow;\r\n };\r\n // Computes the ambiguously-timed moment for the given cell\r\n DayTableMixin.prototype.getCellDate = function (row, col) {\r\n return this.dayDates[this.getCellDayIndex(row, col)].clone();\r\n };\r\n // Computes the ambiguously-timed date range for the given cell\r\n DayTableMixin.prototype.getCellRange = function (row, col) {\r\n var start = this.getCellDate(row, col);\r\n var end = start.clone().add(1, 'days');\r\n return { start: start, end: end };\r\n };\r\n // Returns the number of day cells, chronologically, from the first of the grid (0-based)\r\n DayTableMixin.prototype.getCellDayIndex = function (row, col) {\r\n return row * this.daysPerRow + this.getColDayIndex(col);\r\n };\r\n // Returns the numner of day cells, chronologically, from the first cell in *any given row*\r\n DayTableMixin.prototype.getColDayIndex = function (col) {\r\n if (this.isRTL) {\r\n return this.colCnt - 1 - col;\r\n }\r\n else {\r\n return col;\r\n }\r\n };\r\n // Given a date, returns its chronolocial cell-index from the first cell of the grid.\r\n // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\r\n // If before the first offset, returns a negative number.\r\n // If after the last offset, returns an offset past the last cell offset.\r\n // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\r\n DayTableMixin.prototype.getDateDayIndex = function (date) {\r\n var dayIndices = this.dayIndices;\r\n var dayOffset = date.diff(this.dayDates[0], 'days');\r\n if (dayOffset < 0) {\r\n return dayIndices[0] - 1;\r\n }\r\n else if (dayOffset >= dayIndices.length) {\r\n return dayIndices[dayIndices.length - 1] + 1;\r\n }\r\n else {\r\n return dayIndices[dayOffset];\r\n }\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes a default column header formatting string if `colFormat` is not explicitly defined\r\n DayTableMixin.prototype.computeColHeadFormat = function () {\r\n // if more than one week row, or if there are a lot of columns with not much space,\r\n // put just the day numbers will be in each cell\r\n if (this.rowCnt > 1 || this.colCnt > 10) {\r\n return 'ddd'; // \"Sat\"\r\n }\r\n else if (this.colCnt > 1) {\r\n return this.opt('dayOfMonthFormat'); // \"Sat 12/10\"\r\n }\r\n else {\r\n return 'dddd'; // \"Saturday\"\r\n }\r\n };\r\n /* Slicing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Slices up a date range into a segment for every week-row it intersects with\r\n DayTableMixin.prototype.sliceRangeByRow = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, rowFirst);\r\n segLast = Math.min(rangeLast, rowLast);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n // Slices up a date range into a segment for every day-cell it intersects with.\r\n // TODO: make more DRY with sliceRangeByRow somehow.\r\n DayTableMixin.prototype.sliceRangeByDay = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var i;\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n for (i = rowFirst; i <= rowLast; i++) {\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, i);\r\n segLast = Math.min(rangeLast, i);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Header Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderHeadHtml = function () {\r\n var theme = this.view.calendar.theme;\r\n return '' +\r\n '
' +\r\n '' +\r\n '' +\r\n this.renderHeadTrHtml() +\r\n '' +\r\n '
' +\r\n '
';\r\n };\r\n DayTableMixin.prototype.renderHeadIntroHtml = function () {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderHeadTrHtml = function () {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderHeadIntroHtml()) +\r\n this.renderHeadDateCellsHtml() +\r\n (this.isRTL ? this.renderHeadIntroHtml() : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderHeadDateCellsHtml = function () {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(0, col);\r\n htmls.push(this.renderHeadDateCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // TODO: when internalApiVersion, accept an object for HTML attributes\r\n // (colspan should be no different)\r\n DayTableMixin.prototype.renderHeadDateCellHtml = function (date, colspan, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classNames = [\r\n 'fc-day-header',\r\n view.calendar.theme.getClass('widgetHeader')\r\n ];\r\n var innerHtml;\r\n if (typeof t.opt('columnHeaderHtml') === 'function') {\r\n innerHtml = t.opt('columnHeaderHtml')(date);\r\n }\r\n else if (typeof t.opt('columnHeaderText') === 'function') {\r\n innerHtml = util_1.htmlEscape(t.opt('columnHeaderText')(date));\r\n }\r\n else {\r\n innerHtml = util_1.htmlEscape(date.format(t.colHeadFormat));\r\n }\r\n // if only one row of days, the classNames on the header can represent the specific days beneath\r\n if (t.rowCnt === 1) {\r\n classNames = classNames.concat(\r\n // includes the day-of-week class\r\n // noThemeHighlight=true (don't highlight the header)\r\n t.getDayClasses(date, true));\r\n }\r\n else {\r\n classNames.push('fc-' + util_1.dayIDs[date.day()]); // only add the day-of-week class\r\n }\r\n return '' +\r\n ' 1 ?\r\n ' colspan=\"' + colspan + '\"' :\r\n '') +\r\n (otherAttrs ?\r\n ' ' + otherAttrs :\r\n '') +\r\n '>' +\r\n (isDateValid ?\r\n // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)\r\n view.buildGotoAnchorHtml({ date: date, forceOff: t.rowCnt > 1 || t.colCnt === 1 }, innerHtml) :\r\n // if not valid, display text, but no link\r\n innerHtml) +\r\n '';\r\n };\r\n /* Background Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderBgTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderBgIntroHtml(row)) +\r\n this.renderBgCellsHtml(row) +\r\n (this.isRTL ? this.renderBgIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderBgIntroHtml = function (row) {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderBgCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderBgCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n DayTableMixin.prototype.renderBgCellHtml = function (date, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classes = t.getDayClasses(date);\r\n classes.unshift('fc-day', view.calendar.theme.getClass('widgetContent'));\r\n return '';\r\n };\r\n /* Generic\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderIntroHtml = function () {\r\n // Generates the default HTML intro for any row. User classes should override\r\n };\r\n // TODO: a generic method for dealing with , RTL, intro\r\n // when increment internalApiVersion\r\n // wrapTr (scheduler)\r\n /* Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Applies the generic \"intro\" and \"outro\" HTML to the given cells.\r\n // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.\r\n DayTableMixin.prototype.bookendCells = function (trEl) {\r\n var introHtml = this.renderIntroHtml();\r\n if (introHtml) {\r\n if (this.isRTL) {\r\n trEl.append(introHtml);\r\n }\r\n else {\r\n trEl.prepend(introHtml);\r\n }\r\n }\r\n };\r\n return DayTableMixin;\r\n}(Mixin_1.default));\r\nexports.default = DayTableMixin;\r\n\r\n\r\n/***/ }),\r\n/* 56 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar BusinessHourRenderer = /** @class */ (function () {\r\n /*\r\n component implements:\r\n - eventRangesToEventFootprints\r\n - eventFootprintsToSegs\r\n */\r\n function BusinessHourRenderer(component, fillRenderer) {\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n BusinessHourRenderer.prototype.render = function (businessHourGenerator) {\r\n var component = this.component;\r\n var unzonedRange = component._getDateProfile().activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(component.hasAllDayBusinessHours, unzonedRange);\r\n var eventFootprints = eventInstanceGroup ?\r\n component.eventRangesToEventFootprints(eventInstanceGroup.sliceRenderRanges(unzonedRange)) :\r\n [];\r\n this.renderEventFootprints(eventFootprints);\r\n };\r\n BusinessHourRenderer.prototype.renderEventFootprints = function (eventFootprints) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n this.renderSegs(segs);\r\n this.segs = segs;\r\n };\r\n BusinessHourRenderer.prototype.renderSegs = function (segs) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('businessHours', segs, {\r\n getClasses: function (seg) {\r\n return ['fc-nonbusiness', 'fc-bgevent'];\r\n }\r\n });\r\n }\r\n };\r\n BusinessHourRenderer.prototype.unrender = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('businessHours');\r\n }\r\n this.segs = null;\r\n };\r\n BusinessHourRenderer.prototype.getSegs = function () {\r\n return this.segs || [];\r\n };\r\n return BusinessHourRenderer;\r\n}());\r\nexports.default = BusinessHourRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 57 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar FillRenderer = /** @class */ (function () {\r\n function FillRenderer(component) {\r\n this.fillSegTag = 'div';\r\n this.component = component;\r\n this.elsByFill = {};\r\n }\r\n FillRenderer.prototype.renderFootprint = function (type, componentFootprint, props) {\r\n this.renderSegs(type, this.component.componentFootprintToSegs(componentFootprint), props);\r\n };\r\n FillRenderer.prototype.renderSegs = function (type, segs, props) {\r\n var els;\r\n segs = this.buildSegEls(type, segs, props); // assignes `.el` to each seg. returns successfully rendered segs\r\n els = this.attachSegEls(type, segs);\r\n if (els) {\r\n this.reportEls(type, els);\r\n }\r\n return segs;\r\n };\r\n // Unrenders a specific type of fill that is currently rendered on the grid\r\n FillRenderer.prototype.unrender = function (type) {\r\n var el = this.elsByFill[type];\r\n if (el) {\r\n el.remove();\r\n delete this.elsByFill[type];\r\n }\r\n };\r\n // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\r\n // Only returns segments that successfully rendered.\r\n FillRenderer.prototype.buildSegEls = function (type, segs, props) {\r\n var _this = this;\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n html += this.buildSegHtml(type, segs[i], props);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n // allow custom filter methods per-type\r\n if (props.filterEl) {\r\n el = props.filterEl(seg, el);\r\n }\r\n if (el) {\r\n el = $(el); // allow custom filter to return raw DOM node\r\n // correct element type? (would be bad if a non-TD were inserted into a table for example)\r\n if (el.is(_this.fillSegTag)) {\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n // Builds the HTML needed for one fill segment. Generic enough to work with different types.\r\n FillRenderer.prototype.buildSegHtml = function (type, seg, props) {\r\n // custom hooks per-type\r\n var classes = props.getClasses ? props.getClasses(seg) : [];\r\n var css = util_1.cssToStr(props.getCss ? props.getCss(seg) : {});\r\n return '<' + this.fillSegTag +\r\n (classes.length ? ' class=\"' + classes.join(' ') + '\"' : '') +\r\n (css ? ' style=\"' + css + '\"' : '') +\r\n ' />';\r\n };\r\n // Should return wrapping DOM structure\r\n FillRenderer.prototype.attachSegEls = function (type, segs) {\r\n // subclasses must implement\r\n };\r\n FillRenderer.prototype.reportEls = function (type, nodes) {\r\n if (this.elsByFill[type]) {\r\n this.elsByFill[type] = this.elsByFill[type].add(nodes);\r\n }\r\n else {\r\n this.elsByFill[type] = $(nodes);\r\n }\r\n };\r\n return FillRenderer;\r\n}());\r\nexports.default = FillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 58 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar HelperRenderer = /** @class */ (function () {\r\n function HelperRenderer(component, eventRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.eventRenderer = eventRenderer;\r\n }\r\n HelperRenderer.prototype.renderComponentFootprint = function (componentFootprint) {\r\n this.renderEventFootprints([\r\n this.fabricateEventFootprint(componentFootprint)\r\n ]);\r\n };\r\n HelperRenderer.prototype.renderEventDraggingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-dragging', isTouch ? null : this.view.opt('dragOpacity'));\r\n };\r\n HelperRenderer.prototype.renderEventResizingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-resizing');\r\n };\r\n HelperRenderer.prototype.renderEventFootprints = function (eventFootprints, sourceSeg, extraClassNames, opacity) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n var classNames = 'fc-helper ' + (extraClassNames || '');\r\n var i;\r\n // assigns each seg's el and returns a subset of segs that were rendered\r\n segs = this.eventRenderer.renderFgSegEls(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.addClass(classNames);\r\n }\r\n if (opacity != null) {\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.css('opacity', opacity);\r\n }\r\n }\r\n this.helperEls = this.renderSegs(segs, sourceSeg);\r\n };\r\n /*\r\n Must return all mock event elements\r\n */\r\n HelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n // Subclasses must implement\r\n };\r\n HelperRenderer.prototype.unrender = function () {\r\n if (this.helperEls) {\r\n this.helperEls.remove();\r\n this.helperEls = null;\r\n }\r\n };\r\n HelperRenderer.prototype.fabricateEventFootprint = function (componentFootprint) {\r\n var calendar = this.view.calendar;\r\n var eventDateProfile = calendar.footprintToDateProfile(componentFootprint);\r\n var dummyEvent = new SingleEventDef_1.default(new EventSource_1.default(calendar));\r\n var dummyInstance;\r\n dummyEvent.dateProfile = eventDateProfile;\r\n dummyInstance = dummyEvent.buildInstance();\r\n return new EventFootprint_1.default(componentFootprint, dummyEvent, dummyInstance);\r\n };\r\n return HelperRenderer;\r\n}());\r\nexports.default = HelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 59 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventPointing, _super);\r\n function EventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n component must implement:\r\n - publiclyTrigger\r\n */\r\n EventPointing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'click', this.handleClick.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseenter', this.handleMouseover.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseleave', this.handleMouseout.bind(this));\r\n };\r\n EventPointing.prototype.handleClick = function (seg, ev) {\r\n var res = this.component.publiclyTrigger('eventClick', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n if (res === false) {\r\n ev.preventDefault();\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused over\r\n EventPointing.prototype.handleMouseover = function (seg, ev) {\r\n if (!GlobalEmitter_1.default.get().shouldIgnoreMouse() &&\r\n !this.mousedOverSeg) {\r\n this.mousedOverSeg = seg;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.addClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseover', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused out.\r\n // Can be given no arguments, in which case it will mouseout the segment that was previously moused over.\r\n EventPointing.prototype.handleMouseout = function (seg, ev) {\r\n if (this.mousedOverSeg) {\r\n this.mousedOverSeg = null;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.removeClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseout', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev || {},\r\n this.view\r\n ]\r\n });\r\n }\r\n };\r\n EventPointing.prototype.end = function () {\r\n if (this.mousedOverSeg) {\r\n this.handleMouseout(this.mousedOverSeg);\r\n }\r\n };\r\n return EventPointing;\r\n}(Interaction_1.default));\r\nexports.default = EventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 60 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar DateClicking_1 = __webpack_require__(245);\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar EventDragging_1 = __webpack_require__(224);\r\nvar EventResizing_1 = __webpack_require__(223);\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nvar StandardInteractionsMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardInteractionsMixin, _super);\r\n function StandardInteractionsMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardInteractionsMixin;\r\n}(Mixin_1.default));\r\nexports.default = StandardInteractionsMixin;\r\nStandardInteractionsMixin.prototype.dateClickingClass = DateClicking_1.default;\r\nStandardInteractionsMixin.prototype.dateSelectingClass = DateSelecting_1.default;\r\nStandardInteractionsMixin.prototype.eventPointingClass = EventPointing_1.default;\r\nStandardInteractionsMixin.prototype.eventDraggingClass = EventDragging_1.default;\r\nStandardInteractionsMixin.prototype.eventResizingClass = EventResizing_1.default;\r\nStandardInteractionsMixin.prototype.externalDroppingClass = ExternalDropping_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 61 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar Popover_1 = __webpack_require__(249);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar DayGridEventRenderer_1 = __webpack_require__(250);\r\nvar DayGridHelperRenderer_1 = __webpack_require__(251);\r\nvar DayGridFillRenderer_1 = __webpack_require__(252);\r\n/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGrid, _super);\r\n function DayGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.cellWeekNumbersVisible = false; // display week numbers in day cell?\r\n _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid\r\n // isRigid determines whether the individual rows should ignore the contents and be a constant height.\r\n // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.\r\n _this.isRigid = false;\r\n _this.hasAllDayBusinessHours = true;\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n DayGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByRow(componentFootprint.unzonedRange);\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (this.isRTL) {\r\n seg.leftCol = this.daysPerRow - 1 - seg.lastRowDayIndex;\r\n seg.rightCol = this.daysPerRow - 1 - seg.firstRowDayIndex;\r\n }\r\n else {\r\n seg.leftCol = seg.firstRowDayIndex;\r\n seg.rightCol = seg.lastRowDayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderGrid();\r\n };\r\n DayGrid.prototype.unrenderDates = function () {\r\n this.removeSegPopover();\r\n };\r\n // Renders the rows and columns into the component's `this.el`, which should already be assigned.\r\n DayGrid.prototype.renderGrid = function () {\r\n var view = this.view;\r\n var rowCnt = this.rowCnt;\r\n var colCnt = this.colCnt;\r\n var html = '';\r\n var row;\r\n var col;\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n for (row = 0; row < rowCnt; row++) {\r\n html += this.renderDayRowHtml(row, this.isRigid);\r\n }\r\n this.el.html(html);\r\n this.rowEls = this.el.find('.fc-row');\r\n this.cellEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.rowCoordCache = new CoordCache_1.default({\r\n els: this.rowEls,\r\n isVertical: true\r\n });\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.cellEls.slice(0, this.colCnt),\r\n isHorizontal: true\r\n });\r\n // trigger dayRender with each cell's element\r\n for (row = 0; row < rowCnt; row++) {\r\n for (col = 0; col < colCnt; col++) {\r\n this.publiclyTrigger('dayRender', {\r\n context: view,\r\n args: [\r\n this.getCellDate(row, col),\r\n this.getCellEl(row, col),\r\n view\r\n ]\r\n });\r\n }\r\n }\r\n };\r\n // Generates the HTML for a single row, which is a div that wraps a table.\r\n // `row` is the row number.\r\n DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {\r\n var theme = this.view.calendar.theme;\r\n var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];\r\n if (isRigid) {\r\n classes.push('fc-rigid');\r\n }\r\n return '' +\r\n '
' +\r\n '
' +\r\n '' +\r\n this.renderBgTrHtml(row) +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n (this.getIsNumbersVisible() ?\r\n '' +\r\n this.renderNumberTrHtml(row) +\r\n '' :\r\n '') +\r\n '
' +\r\n '
' +\r\n '
';\r\n };\r\n DayGrid.prototype.getIsNumbersVisible = function () {\r\n return this.getIsDayNumbersVisible() || this.cellWeekNumbersVisible;\r\n };\r\n DayGrid.prototype.getIsDayNumbersVisible = function () {\r\n return this.rowCnt > 1;\r\n };\r\n /* Grid Number Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderNumberTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderNumberIntroHtml(row)) +\r\n this.renderNumberCellsHtml(row) +\r\n (this.isRTL ? this.renderNumberIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayGrid.prototype.renderNumberIntroHtml = function (row) {\r\n return this.renderIntroHtml();\r\n };\r\n DayGrid.prototype.renderNumberCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderNumberCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // Generates the HTML for the s of the \"number\" row in the DayGrid's content skeleton.\r\n // The number row will only exist if either day numbers or week numbers are turned on.\r\n DayGrid.prototype.renderNumberCellHtml = function (date) {\r\n var view = this.view;\r\n var html = '';\r\n var isDateValid = this.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;\r\n var classes;\r\n var weekCalcFirstDoW;\r\n if (!isDayNumberVisible && !this.cellWeekNumbersVisible) {\r\n // no numbers in day cell (week number must be along the side)\r\n return ''; // will create an empty space above events :(\r\n }\r\n classes = this.getDayClasses(date);\r\n classes.unshift('fc-day-top');\r\n if (this.cellWeekNumbersVisible) {\r\n // To determine the day of week number change under ISO, we cannot\r\n // rely on moment.js methods such as firstDayOfWeek() or weekday(),\r\n // because they rely on the locale's dow (possibly overridden by\r\n // our firstDay option), which may not be Monday. We cannot change\r\n // dow, because that would affect the calendar start day as well.\r\n if (date._locale._fullCalendar_weekCalc === 'ISO') {\r\n weekCalcFirstDoW = 1; // Monday by ISO 8601 definition\r\n }\r\n else {\r\n weekCalcFirstDoW = date._locale.firstDayOfWeek();\r\n }\r\n }\r\n html += '';\r\n if (this.cellWeekNumbersVisible && (date.day() === weekCalcFirstDoW)) {\r\n html += view.buildGotoAnchorHtml({ date: date, type: 'week' }, { 'class': 'fc-week-number' }, date.format('w') // inner HTML\r\n );\r\n }\r\n if (isDayNumberVisible) {\r\n html += view.buildGotoAnchorHtml(date, { 'class': 'fc-day-number' }, date.format('D') // inner HTML\r\n );\r\n }\r\n html += '';\r\n return html;\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.rowCoordCache.build();\r\n this.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack\r\n };\r\n DayGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n this.rowCoordCache.clear();\r\n };\r\n DayGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n if (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {\r\n var col = this.colCoordCache.getHorizontalIndex(leftOffset);\r\n var row = this.rowCoordCache.getVerticalIndex(topOffset);\r\n if (row != null && col != null) {\r\n return this.getCellHit(row, col);\r\n }\r\n }\r\n };\r\n DayGrid.prototype.getHitFootprint = function (hit) {\r\n var range = this.getCellRange(hit.row, hit.col);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(range.start, range.end), true // all-day?\r\n );\r\n };\r\n DayGrid.prototype.getHitEl = function (hit) {\r\n return this.getCellEl(hit.row, hit.col);\r\n };\r\n /* Cell System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // FYI: the first column is the leftmost column, regardless of date\r\n DayGrid.prototype.getCellHit = function (row, col) {\r\n return {\r\n row: row,\r\n col: col,\r\n component: this,\r\n left: this.colCoordCache.getLeftOffset(col),\r\n right: this.colCoordCache.getRightOffset(col),\r\n top: this.rowCoordCache.getTopOffset(row),\r\n bottom: this.rowCoordCache.getBottomOffset(row)\r\n };\r\n };\r\n DayGrid.prototype.getCellEl = function (row, col) {\r\n return this.cellEls.eq(row * this.colCnt + col);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Unrenders all events currently rendered on the grid\r\n DayGrid.prototype.executeEventUnrender = function () {\r\n this.removeSegPopover(); // removes the \"more..\" events popover\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n // Retrieves all rendered segment objects currently rendered on the grid\r\n DayGrid.prototype.getOwnEventSegs = function () {\r\n // append the segments from the \"more...\" popover\r\n return _super.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs || []);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event or external element being dragged.\r\n // `eventLocation` has zoned start and end (optional)\r\n DayGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n // render drags from OTHER components as helpers\r\n if (eventFootprints.length && seg && seg.component !== this) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n return true; // signal helpers rendered\r\n }\r\n };\r\n // Unrenders any visual indication of a hovering event\r\n DayGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n DayGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders a visual indication of an event being resized\r\n DayGrid.prototype.unrenderEventResize = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* More+ Link Popover\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.removeSegPopover = function () {\r\n if (this.segPopover) {\r\n this.segPopover.hide(); // in handler, will call segPopover's removeElement\r\n }\r\n };\r\n // Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\r\n // `levelLimit` can be false (don't limit), a number, or true (should be computed).\r\n DayGrid.prototype.limitRows = function (levelLimit) {\r\n var rowStructs = this.eventRenderer.rowStructs || [];\r\n var row; // row #\r\n var rowLevelLimit;\r\n for (row = 0; row < rowStructs.length; row++) {\r\n this.unlimitRow(row);\r\n if (!levelLimit) {\r\n rowLevelLimit = false;\r\n }\r\n else if (typeof levelLimit === 'number') {\r\n rowLevelLimit = levelLimit;\r\n }\r\n else {\r\n rowLevelLimit = this.computeRowLevelLimit(row);\r\n }\r\n if (rowLevelLimit !== false) {\r\n this.limitRow(row, rowLevelLimit);\r\n }\r\n }\r\n };\r\n // Computes the number of levels a row will accomodate without going outside its bounds.\r\n // Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\r\n // `row` is the row number.\r\n DayGrid.prototype.computeRowLevelLimit = function (row) {\r\n var rowEl = this.rowEls.eq(row); // the containing \"fake\" row div\r\n var rowHeight = rowEl.height(); // TODO: cache somehow?\r\n var trEls = this.eventRenderer.rowStructs[row].tbodyEl.children();\r\n var i;\r\n var trEl;\r\n var trHeight;\r\n function iterInnerHeights(i, childNode) {\r\n trHeight = Math.max(trHeight, $(childNode).outerHeight());\r\n }\r\n // Reveal one level at a time and stop when we find one out of bounds\r\n for (i = 0; i < trEls.length; i++) {\r\n trEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)\r\n // with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,\r\n // so instead, find the tallest inner content element.\r\n trHeight = 0;\r\n trEl.find('> td > :first-child').each(iterInnerHeights);\r\n if (trEl.position().top + trHeight > rowHeight) {\r\n return i;\r\n }\r\n }\r\n return false; // should not limit at all\r\n };\r\n // Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\r\n // `row` is the row number.\r\n // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\r\n DayGrid.prototype.limitRow = function (row, levelLimit) {\r\n var _this = this;\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n var moreNodes = []; // array of \"more\"
links and DOM nodes\r\n var col = 0; // col #, left-to-right (not chronologically)\r\n var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\r\n var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row\r\n var limitedNodes; // array of temporarily hidden level and segment DOM nodes\r\n var i;\r\n var seg;\r\n var segsBelow; // array of segment objects below `seg` in the current `col`\r\n var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\r\n var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\r\n var td;\r\n var rowspan;\r\n var segMoreNodes; // array of \"more\" cells that will stand-in for the current seg's cell\r\n var j;\r\n var moreTd;\r\n var moreWrap;\r\n var moreLink;\r\n // Iterates through empty level cells and places \"more\" links inside if need be\r\n var emptyCellsUntil = function (endCol) {\r\n while (col < endCol) {\r\n segsBelow = _this.getCellSegs(row, col, levelLimit);\r\n if (segsBelow.length) {\r\n td = cellMatrix[levelLimit - 1][col];\r\n moreLink = _this.renderMoreLink(row, col, segsBelow);\r\n moreWrap = $('
').append(moreLink);\r\n td.append(moreWrap);\r\n moreNodes.push(moreWrap[0]);\r\n }\r\n col++;\r\n }\r\n };\r\n if (levelLimit && levelLimit < rowStruct.segLevels.length) {\r\n levelSegs = rowStruct.segLevels[levelLimit - 1];\r\n cellMatrix = rowStruct.cellMatrix;\r\n limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level elements past the limit\r\n .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array\r\n // iterate though segments in the last allowable level\r\n for (i = 0; i < levelSegs.length; i++) {\r\n seg = levelSegs[i];\r\n emptyCellsUntil(seg.leftCol); // process empty cells before the segment\r\n // determine *all* segments below `seg` that occupy the same columns\r\n colSegsBelow = [];\r\n totalSegsBelow = 0;\r\n while (col <= seg.rightCol) {\r\n segsBelow = this.getCellSegs(row, col, levelLimit);\r\n colSegsBelow.push(segsBelow);\r\n totalSegsBelow += segsBelow.length;\r\n col++;\r\n }\r\n if (totalSegsBelow) {\r\n td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell\r\n rowspan = td.attr('rowspan') || 1;\r\n segMoreNodes = [];\r\n // make a replacement for each column the segment occupies. will be one for each colspan\r\n for (j = 0; j < colSegsBelow.length; j++) {\r\n moreTd = $('').attr('rowspan', rowspan);\r\n segsBelow = colSegsBelow[j];\r\n moreLink = this.renderMoreLink(row, seg.leftCol + j, [seg].concat(segsBelow) // count seg as hidden too\r\n );\r\n moreWrap = $('
').append(moreLink);\r\n moreTd.append(moreWrap);\r\n segMoreNodes.push(moreTd[0]);\r\n moreNodes.push(moreTd[0]);\r\n }\r\n td.addClass('fc-limited').after($(segMoreNodes)); // hide original and inject replacements\r\n limitedNodes.push(td[0]);\r\n }\r\n }\r\n emptyCellsUntil(this.colCnt); // finish off the level\r\n rowStruct.moreEls = $(moreNodes); // for easy undoing later\r\n rowStruct.limitedEls = $(limitedNodes); // for easy undoing later\r\n }\r\n };\r\n // Reveals all levels and removes all \"more\"-related elements for a grid's row.\r\n // `row` is a row number.\r\n DayGrid.prototype.unlimitRow = function (row) {\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n if (rowStruct.moreEls) {\r\n rowStruct.moreEls.remove();\r\n rowStruct.moreEls = null;\r\n }\r\n if (rowStruct.limitedEls) {\r\n rowStruct.limitedEls.removeClass('fc-limited');\r\n rowStruct.limitedEls = null;\r\n }\r\n };\r\n // Renders an element that represents hidden event element for a cell.\r\n // Responsible for attaching click handler as well.\r\n DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {\r\n var _this = this;\r\n var view = this.view;\r\n return $('')\r\n .text(this.getMoreLinkText(hiddenSegs.length))\r\n .on('click', function (ev) {\r\n var clickOption = _this.opt('eventLimitClick');\r\n var date = _this.getCellDate(row, col);\r\n var moreEl = $(ev.currentTarget);\r\n var dayEl = _this.getCellEl(row, col);\r\n var allSegs = _this.getCellSegs(row, col);\r\n // rescope the segments to be within the cell's date\r\n var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\r\n var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\r\n if (typeof clickOption === 'function') {\r\n // the returned value can be an atomic option\r\n clickOption = _this.publiclyTrigger('eventLimitClick', {\r\n context: view,\r\n args: [\r\n {\r\n date: date.clone(),\r\n dayEl: dayEl,\r\n moreEl: moreEl,\r\n segs: reslicedAllSegs,\r\n hiddenSegs: reslicedHiddenSegs\r\n },\r\n ev,\r\n view\r\n ]\r\n });\r\n }\r\n if (clickOption === 'popover') {\r\n _this.showSegPopover(row, col, moreEl, reslicedAllSegs);\r\n }\r\n else if (typeof clickOption === 'string') {\r\n view.calendar.zoomTo(date, clickOption);\r\n }\r\n });\r\n };\r\n // Reveals the popover that displays all events within a cell\r\n DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {\r\n var _this = this;\r\n var view = this.view;\r\n var moreWrap = moreLink.parent(); // the
wrapper around the \r\n var topEl; // the element we want to match the top coordinate of\r\n var options;\r\n if (this.rowCnt === 1) {\r\n topEl = view.el; // will cause the popover to cover any sort of header\r\n }\r\n else {\r\n topEl = this.rowEls.eq(row); // will align with top of row\r\n }\r\n options = {\r\n className: 'fc-more-popover ' + view.calendar.theme.getClass('popover'),\r\n content: this.renderSegPopoverContent(row, col, segs),\r\n parentEl: view.el,\r\n top: topEl.offset().top,\r\n autoHide: true,\r\n viewportConstrain: this.opt('popoverViewportConstrain'),\r\n hide: function () {\r\n // kill everything when the popover is hidden\r\n // notify events to be removed\r\n if (_this.popoverSegs) {\r\n _this.triggerBeforeEventSegsDestroyed(_this.popoverSegs);\r\n }\r\n _this.segPopover.removeElement();\r\n _this.segPopover = null;\r\n _this.popoverSegs = null;\r\n }\r\n };\r\n // Determine horizontal coordinate.\r\n // We use the moreWrap instead of the to avoid border confusion.\r\n if (this.isRTL) {\r\n options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border\r\n }\r\n else {\r\n options.left = moreWrap.offset().left - 1; // -1 to be over cell border\r\n }\r\n this.segPopover = new Popover_1.default(options);\r\n this.segPopover.show();\r\n // the popover doesn't live within the grid's container element, and thus won't get the event\r\n // delegated-handlers for free. attach event-related handlers to the popover.\r\n this.bindAllSegHandlersToEl(this.segPopover.el);\r\n this.triggerAfterEventSegsRendered(segs);\r\n };\r\n // Builds the inner DOM contents of the segment popover\r\n DayGrid.prototype.renderSegPopoverContent = function (row, col, segs) {\r\n var view = this.view;\r\n var theme = view.calendar.theme;\r\n var title = this.getCellDate(row, col).format(this.opt('dayPopoverFormat'));\r\n var content = $('
' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(title) +\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
');\r\n var segContainer = content.find('.fc-event-container');\r\n var i;\r\n // render each seg's `el` and only return the visible segs\r\n segs = this.eventRenderer.renderFgSegEls(segs, true); // disableResizing=true\r\n this.popoverSegs = segs;\r\n for (i = 0; i < segs.length; i++) {\r\n // because segments in the popover are not part of a grid coordinate system, provide a hint to any\r\n // grids that want to do drag-n-drop about which cell it came from\r\n this.hitsNeeded();\r\n segs[i].hit = this.getCellHit(row, col);\r\n this.hitsNotNeeded();\r\n segContainer.append(segs[i].el);\r\n }\r\n return content;\r\n };\r\n // Given the events within an array of segment objects, reslice them to be in a single day\r\n DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {\r\n var dayStart = dayDate.clone();\r\n var dayEnd = dayStart.clone().add(1, 'days');\r\n var dayRange = new UnzonedRange_1.default(dayStart, dayEnd);\r\n var newSegs = [];\r\n var i;\r\n var seg;\r\n var slicedRange;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n slicedRange = seg.footprint.componentFootprint.unzonedRange.intersect(dayRange);\r\n if (slicedRange) {\r\n newSegs.push($.extend({}, seg, {\r\n footprint: new EventFootprint_1.default(new ComponentFootprint_1.default(slicedRange, seg.footprint.componentFootprint.isAllDay), seg.footprint.eventDef, seg.footprint.eventInstance),\r\n isStart: seg.isStart && slicedRange.isStart,\r\n isEnd: seg.isEnd && slicedRange.isEnd\r\n }));\r\n }\r\n }\r\n // force an order because eventsToSegs doesn't guarantee one\r\n // TODO: research if still needed\r\n this.eventRenderer.sortEventSegs(newSegs);\r\n return newSegs;\r\n };\r\n // Generates the text that should be inside a \"more\" link, given the number of events it represents\r\n DayGrid.prototype.getMoreLinkText = function (num) {\r\n var opt = this.opt('eventLimitText');\r\n if (typeof opt === 'function') {\r\n return opt(num);\r\n }\r\n else {\r\n return '+' + num + ' ' + opt;\r\n }\r\n };\r\n // Returns segments within a given cell.\r\n // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\r\n DayGrid.prototype.getCellSegs = function (row, col, startLevel) {\r\n var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;\r\n var level = startLevel || 0;\r\n var segs = [];\r\n var seg;\r\n while (level < segMatrix.length) {\r\n seg = segMatrix[level][col];\r\n if (seg) {\r\n segs.push(seg);\r\n }\r\n level++;\r\n }\r\n return segs;\r\n };\r\n return DayGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = DayGrid;\r\nDayGrid.prototype.eventRendererClass = DayGridEventRenderer_1.default;\r\nDayGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nDayGrid.prototype.helperRendererClass = DayGridHelperRenderer_1.default;\r\nDayGrid.prototype.fillRendererClass = DayGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(DayGrid);\r\nDayTableMixin_1.default.mixInto(DayGrid);\r\n\r\n\r\n/***/ }),\r\n/* 62 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar DayGrid_1 = __webpack_require__(61);\r\n/* An abstract class for the \"basic\" views, as well as month view. Renders one or more rows of day cells.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\r\n// It is responsible for managing width/height.\r\nvar BasicView = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicView, _super);\r\n function BasicView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.dayGrid = _this.instantiateDayGrid();\r\n _this.dayGrid.isRigid = _this.hasRigidRows();\r\n if (_this.opt('weekNumbers')) {\r\n if (_this.opt('weekNumbersWithinDays')) {\r\n _this.dayGrid.cellWeekNumbersVisible = true;\r\n _this.dayGrid.colWeekNumbersVisible = false;\r\n }\r\n else {\r\n _this.dayGrid.cellWeekNumbersVisible = false;\r\n _this.dayGrid.colWeekNumbersVisible = true;\r\n }\r\n }\r\n _this.addChild(_this.dayGrid);\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Generates the DayGrid object this view needs. Draws from this.dayGridClass\r\n BasicView.prototype.instantiateDayGrid = function () {\r\n // generate a subclass on the fly with BasicView-specific behavior\r\n // TODO: cache this subclass\r\n var subclass = makeDayGridSubclass(this.dayGridClass);\r\n return new subclass(this);\r\n };\r\n BasicView.prototype.executeDateRender = function (dateProfile) {\r\n this.dayGrid.breakOnWeeks = /year|month|week/.test(dateProfile.currentRangeUnit);\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n };\r\n BasicView.prototype.renderSkeleton = function () {\r\n var dayGridContainerEl;\r\n var dayGridEl;\r\n this.el.addClass('fc-basic-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container');\r\n dayGridEl = $('
').appendTo(dayGridContainerEl);\r\n this.el.find('.fc-body > tr > td').append(dayGridContainerEl);\r\n this.dayGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.dayGrid.setElement(dayGridEl);\r\n };\r\n BasicView.prototype.unrenderSkeleton = function () {\r\n this.dayGrid.removeElement();\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid component will render inside of a container defined by this HTML.\r\n BasicView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the week number column, if it is known\r\n BasicView.prototype.weekNumberStyleAttr = function () {\r\n if (this.weekNumberWidth != null) {\r\n return 'style=\"width:' + this.weekNumberWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n // Determines whether each row should have a constant height\r\n BasicView.prototype.hasRigidRows = function () {\r\n var eventLimit = this.opt('eventLimit');\r\n return eventLimit && typeof eventLimit !== 'number';\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Refreshes the horizontal dimensions of the view\r\n BasicView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit = this.opt('eventLimit');\r\n var headRowEl = this.dayGrid.headContainerEl.find('.fc-row');\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n // hack to give the view some height prior to dayGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS dayGrid.\r\n if (!this.dayGrid.rowEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n if (this.dayGrid.colWeekNumbersVisible) {\r\n // Make sure all week number cells running down the side have the same width.\r\n // Record the width for cells created later.\r\n this.weekNumberWidth = util_1.matchCellWidths(this.el.find('.fc-week-number'));\r\n }\r\n // reset all heights to be natural\r\n this.scroller.clear();\r\n util_1.uncompensateScroll(headRowEl);\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n // is the event limit a constant level number?\r\n if (eventLimit && typeof eventLimit === 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\r\n }\r\n // distribute the height to the rows\r\n // (totalHeight is a \"recommended\" value if isAuto)\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.setGridHeight(scrollerHeight, isAuto);\r\n // is the event limit dynamically calculated?\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\r\n }\r\n if (!isAuto) {\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n util_1.compensateScroll(headRowEl, scrollbarWidths);\r\n // doing the scrollbar compensation might have created text overflow which created more height. redo\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n BasicView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n // Sets the height of just the DayGrid component in this view\r\n BasicView.prototype.setGridHeight = function (height, isAuto) {\r\n if (isAuto) {\r\n util_1.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\r\n }\r\n else {\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\r\n }\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n BasicView.prototype.computeInitialDateScroll = function () {\r\n return { top: 0 };\r\n };\r\n BasicView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n BasicView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n return BasicView;\r\n}(View_1.default));\r\nexports.default = BasicView;\r\nBasicView.prototype.dateProfileGeneratorClass = BasicViewDateProfileGenerator_1.default;\r\nBasicView.prototype.dayGridClass = DayGrid_1.default;\r\n// customize the rendering behavior of BasicView's dayGrid\r\nfunction makeDayGridSubclass(SuperClass) {\r\n return /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.colWeekNumbersVisible = false; // display week numbers along the side?\r\n return _this;\r\n }\r\n // Generates the HTML that will go before the day-of week header cells\r\n SubClass.prototype.renderHeadIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n util_1.htmlEscape(this.opt('weekNumberTitle')) +\r\n '' +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that will go before content-skeleton cells that display the day/week numbers\r\n SubClass.prototype.renderNumberIntroHtml = function (row) {\r\n var view = this.view;\r\n var weekStart = this.getCellDate(row, 0);\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt === 1 }, weekStart.format('w') // inner HTML\r\n ) +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before the day bg cells for each day-row\r\n SubClass.prototype.renderBgIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before every other type of row generated by DayGrid.\r\n // Affects helper-skeleton and highlight-skeleton rows.\r\n SubClass.prototype.renderIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n SubClass.prototype.getIsNumbersVisible = function () {\r\n return DayGrid_1.default.prototype.getIsNumbersVisible.apply(this, arguments) || this.colWeekNumbersVisible;\r\n };\r\n return SubClass;\r\n }(SuperClass));\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 63 */,\r\n/* 64 */,\r\n/* 65 */,\r\n/* 66 */,\r\n/* 67 */,\r\n/* 68 */,\r\n/* 69 */,\r\n/* 70 */,\r\n/* 71 */,\r\n/* 72 */,\r\n/* 73 */,\r\n/* 74 */,\r\n/* 75 */,\r\n/* 76 */,\r\n/* 77 */,\r\n/* 78 */,\r\n/* 79 */,\r\n/* 80 */,\r\n/* 81 */,\r\n/* 82 */,\r\n/* 83 */,\r\n/* 84 */,\r\n/* 85 */,\r\n/* 86 */,\r\n/* 87 */,\r\n/* 88 */,\r\n/* 89 */,\r\n/* 90 */,\r\n/* 91 */,\r\n/* 92 */,\r\n/* 93 */,\r\n/* 94 */,\r\n/* 95 */,\r\n/* 96 */,\r\n/* 97 */,\r\n/* 98 */,\r\n/* 99 */,\r\n/* 100 */,\r\n/* 101 */,\r\n/* 102 */,\r\n/* 103 */,\r\n/* 104 */,\r\n/* 105 */,\r\n/* 106 */,\r\n/* 107 */,\r\n/* 108 */,\r\n/* 109 */,\r\n/* 110 */,\r\n/* 111 */,\r\n/* 112 */,\r\n/* 113 */,\r\n/* 114 */,\r\n/* 115 */,\r\n/* 116 */,\r\n/* 117 */,\r\n/* 118 */,\r\n/* 119 */,\r\n/* 120 */,\r\n/* 121 */,\r\n/* 122 */,\r\n/* 123 */,\r\n/* 124 */,\r\n/* 125 */,\r\n/* 126 */,\r\n/* 127 */,\r\n/* 128 */,\r\n/* 129 */,\r\n/* 130 */,\r\n/* 131 */,\r\n/* 132 */,\r\n/* 133 */,\r\n/* 134 */,\r\n/* 135 */,\r\n/* 136 */,\r\n/* 137 */,\r\n/* 138 */,\r\n/* 139 */,\r\n/* 140 */,\r\n/* 141 */,\r\n/* 142 */,\r\n/* 143 */,\r\n/* 144 */,\r\n/* 145 */,\r\n/* 146 */,\r\n/* 147 */,\r\n/* 148 */,\r\n/* 149 */,\r\n/* 150 */,\r\n/* 151 */,\r\n/* 152 */,\r\n/* 153 */,\r\n/* 154 */,\r\n/* 155 */,\r\n/* 156 */,\r\n/* 157 */,\r\n/* 158 */,\r\n/* 159 */,\r\n/* 160 */,\r\n/* 161 */,\r\n/* 162 */,\r\n/* 163 */,\r\n/* 164 */,\r\n/* 165 */,\r\n/* 166 */,\r\n/* 167 */,\r\n/* 168 */,\r\n/* 169 */,\r\n/* 170 */,\r\n/* 171 */,\r\n/* 172 */,\r\n/* 173 */,\r\n/* 174 */,\r\n/* 175 */,\r\n/* 176 */,\r\n/* 177 */,\r\n/* 178 */,\r\n/* 179 */,\r\n/* 180 */,\r\n/* 181 */,\r\n/* 182 */,\r\n/* 183 */,\r\n/* 184 */,\r\n/* 185 */,\r\n/* 186 */,\r\n/* 187 */,\r\n/* 188 */,\r\n/* 189 */,\r\n/* 190 */,\r\n/* 191 */,\r\n/* 192 */,\r\n/* 193 */,\r\n/* 194 */,\r\n/* 195 */,\r\n/* 196 */,\r\n/* 197 */,\r\n/* 198 */,\r\n/* 199 */,\r\n/* 200 */,\r\n/* 201 */,\r\n/* 202 */,\r\n/* 203 */,\r\n/* 204 */,\r\n/* 205 */,\r\n/* 206 */,\r\n/* 207 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar util_1 = __webpack_require__(35);\r\nvar Constraints = /** @class */ (function () {\r\n function Constraints(eventManager, _calendar) {\r\n this.eventManager = eventManager;\r\n this._calendar = _calendar;\r\n }\r\n Constraints.prototype.opt = function (name) {\r\n return this._calendar.opt(name);\r\n };\r\n /*\r\n determines if eventInstanceGroup is allowed,\r\n in relation to other EVENTS and business hours.\r\n */\r\n Constraints.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var eventDef = eventInstanceGroup.getEventDef();\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n var peerEventInstances = this.getPeerEventInstances(eventDef);\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var constraintVal = eventDef.getConstraint();\r\n var overlapVal = eventDef.getOverlap();\r\n var eventAllowFunc = this.opt('eventAllow');\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!this.isFootprintAllowed(eventFootprints[i].componentFootprint, peerEventFootprints, constraintVal, overlapVal, eventFootprints[i].eventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (eventAllowFunc) {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventAllowFunc(eventFootprints[i].componentFootprint.toLegacy(this._calendar), eventFootprints[i].getEventLegacy()) === false) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n Constraints.prototype.getPeerEventInstances = function (eventDef) {\r\n return this.eventManager.getEventInstancesWithoutId(eventDef.id);\r\n };\r\n Constraints.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n var peerEventInstances = this.eventManager.getEventInstances();\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var selectAllowFunc;\r\n if (this.isFootprintAllowed(componentFootprint, peerEventFootprints, this.opt('selectConstraint'), this.opt('selectOverlap'))) {\r\n selectAllowFunc = this.opt('selectAllow');\r\n if (selectAllowFunc) {\r\n return selectAllowFunc(componentFootprint.toLegacy(this._calendar)) !== false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.isFootprintAllowed = function (componentFootprint, peerEventFootprints, constraintVal, overlapVal, subjectEventInstance // optional\r\n ) {\r\n var constraintFootprints; // ComponentFootprint[]\r\n var overlapEventFootprints; // EventFootprint[]\r\n if (constraintVal != null) {\r\n constraintFootprints = this.constraintValToFootprints(constraintVal, componentFootprint.isAllDay);\r\n if (!this.isFootprintWithinConstraints(componentFootprint, constraintFootprints)) {\r\n return false;\r\n }\r\n }\r\n overlapEventFootprints = this.collectOverlapEventFootprints(peerEventFootprints, componentFootprint);\r\n if (overlapVal === false) {\r\n if (overlapEventFootprints.length) {\r\n return false;\r\n }\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!isOverlapsAllowedByFunc(overlapEventFootprints, overlapVal, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (subjectEventInstance) {\r\n if (!isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n // Constraint\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.isFootprintWithinConstraints = function (componentFootprint, constraintFootprints) {\r\n var i;\r\n for (i = 0; i < constraintFootprints.length; i++) {\r\n if (this.footprintContainsFootprint(constraintFootprints[i], componentFootprint)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.constraintValToFootprints = function (constraintVal, isAllDay) {\r\n var eventInstances;\r\n if (constraintVal === 'businessHours') {\r\n return this.buildCurrentBusinessFootprints(isAllDay);\r\n }\r\n else if (typeof constraintVal === 'object') {\r\n eventInstances = this.parseEventDefToInstances(constraintVal); // handles recurring events\r\n if (!eventInstances) {\r\n return this.parseFootprints(constraintVal);\r\n }\r\n else {\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n }\r\n else if (constraintVal != null) {\r\n eventInstances = this.eventManager.getEventInstancesWithId(constraintVal);\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n };\r\n // returns ComponentFootprint[]\r\n // uses current view's range\r\n Constraints.prototype.buildCurrentBusinessFootprints = function (isAllDay) {\r\n var view = this._calendar.view;\r\n var businessHourGenerator = view.get('businessHourGenerator');\r\n var unzonedRange = view.dateProfile.activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(isAllDay, unzonedRange);\r\n if (eventInstanceGroup) {\r\n return this.eventInstancesToFootprints(eventInstanceGroup.eventInstances);\r\n }\r\n else {\r\n return [];\r\n }\r\n };\r\n // conversion util\r\n Constraints.prototype.eventInstancesToFootprints = function (eventInstances) {\r\n var eventRanges = eventInstances.map(util_1.eventInstanceToEventRange);\r\n var eventFootprints = this.eventRangesToEventFootprints(eventRanges);\r\n return eventFootprints.map(util_1.eventFootprintToComponentFootprint);\r\n };\r\n // Overlap\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.collectOverlapEventFootprints = function (peerEventFootprints, targetFootprint) {\r\n var overlapEventFootprints = [];\r\n var i;\r\n for (i = 0; i < peerEventFootprints.length; i++) {\r\n if (this.footprintsIntersect(targetFootprint, peerEventFootprints[i].componentFootprint)) {\r\n overlapEventFootprints.push(peerEventFootprints[i]);\r\n }\r\n }\r\n return overlapEventFootprints;\r\n };\r\n // Conversion: eventDefs -> eventInstances -> eventRanges -> eventFootprints -> componentFootprints\r\n // ------------------------------------------------------------------------------------------------\r\n // NOTE: this might seem like repetitive code with the Grid class, however, this code is related to\r\n // constraints whereas the Grid code is related to rendering. Each approach might want to convert\r\n // eventRanges -> eventFootprints in a different way. Regardless, there are opportunities to make\r\n // this more DRY.\r\n /*\r\n Returns false on invalid input.\r\n */\r\n Constraints.prototype.parseEventDefToInstances = function (eventInput) {\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, new EventSource_1.default(this._calendar));\r\n if (!eventDef) {\r\n return false;\r\n }\r\n return eventDef.buildInstances(eventManager.currentPeriod.unzonedRange);\r\n };\r\n Constraints.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var i;\r\n var eventFootprints = [];\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// footprints\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n Constraints.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_1.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /*\r\n Parses footprints directly.\r\n Very similar to EventDateProfile::parse :(\r\n */\r\n Constraints.prototype.parseFootprints = function (rawInput) {\r\n var start;\r\n var end;\r\n if (rawInput.start) {\r\n start = this._calendar.moment(rawInput.start);\r\n if (!start.isValid()) {\r\n start = null;\r\n }\r\n }\r\n if (rawInput.end) {\r\n end = this._calendar.moment(rawInput.end);\r\n if (!end.isValid()) {\r\n end = null;\r\n }\r\n }\r\n return [\r\n new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), (start && !start.hasTime()) || (end && !end.hasTime()) // isAllDay\r\n )\r\n ];\r\n };\r\n // Footprint Utils\r\n // ----------------------------------------------------------------------------------------\r\n Constraints.prototype.footprintContainsFootprint = function (outerFootprint, innerFootprint) {\r\n return outerFootprint.unzonedRange.containsRange(innerFootprint.unzonedRange);\r\n };\r\n Constraints.prototype.footprintsIntersect = function (footprint0, footprint1) {\r\n return footprint0.unzonedRange.intersectsWith(footprint1.unzonedRange);\r\n };\r\n return Constraints;\r\n}());\r\nexports.default = Constraints;\r\n// optional subjectEventInstance\r\nfunction isOverlapsAllowedByFunc(overlapEventFootprints, overlapFunc, subjectEventInstance) {\r\n var i;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n if (!overlapFunc(overlapEventFootprints[i].eventInstance.toLegacy(), subjectEventInstance ? subjectEventInstance.toLegacy() : null)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance) {\r\n var subjectLegacyInstance = subjectEventInstance.toLegacy();\r\n var i;\r\n var overlapEventInstance;\r\n var overlapEventDef;\r\n var overlapVal;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n overlapEventInstance = overlapEventFootprints[i].eventInstance;\r\n overlapEventDef = overlapEventInstance.def;\r\n // don't need to pass in calendar, because don't want to consider global eventOverlap property,\r\n // because we already considered that earlier in the process.\r\n overlapVal = overlapEventDef.getOverlap();\r\n if (overlapVal === false) {\r\n return false;\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!overlapVal(overlapEventInstance.toLegacy(), subjectLegacyInstance)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 208 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as ParsableModelMixin, ParsableModelInterface } from './ParsableModelMixin'\r\nin class:\r\n applyProps: ParsableModelInterface['applyProps']\r\n applyManualStandardProps: ParsableModelInterface['applyManualStandardProps']\r\n applyMiscProps: ParsableModelInterface['applyMiscProps']\r\n isStandardProp: ParsableModelInterface['isStandardProp']\r\n static defineStandardProps = ParsableModelMixin.defineStandardProps\r\n static copyVerbatimStandardProps = ParsableModelMixin.copyVerbatimStandardProps\r\nafter class:\r\n ParsableModelMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar ParsableModelMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ParsableModelMixin, _super);\r\n function ParsableModelMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ParsableModelMixin.defineStandardProps = function (propDefs) {\r\n var proto = this.prototype;\r\n if (!proto.hasOwnProperty('standardPropMap')) {\r\n proto.standardPropMap = Object.create(proto.standardPropMap);\r\n }\r\n util_1.copyOwnProps(propDefs, proto.standardPropMap);\r\n };\r\n ParsableModelMixin.copyVerbatimStandardProps = function (src, dest) {\r\n var map = this.prototype.standardPropMap;\r\n var propName;\r\n for (propName in map) {\r\n if (src[propName] != null && // in the src object?\r\n map[propName] === true // false means \"copy verbatim\"\r\n ) {\r\n dest[propName] = src[propName];\r\n }\r\n }\r\n };\r\n /*\r\n Returns true/false for success.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyProps = function (rawProps) {\r\n var standardPropMap = this.standardPropMap;\r\n var manualProps = {};\r\n var miscProps = {};\r\n var propName;\r\n for (propName in rawProps) {\r\n if (standardPropMap[propName] === true) {\r\n this[propName] = rawProps[propName];\r\n }\r\n else if (standardPropMap[propName] === false) {\r\n manualProps[propName] = rawProps[propName];\r\n }\r\n else {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n this.applyMiscProps(miscProps);\r\n return this.applyManualStandardProps(manualProps);\r\n };\r\n /*\r\n If subclasses override, they must call this supermethod and return the boolean response.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyManualStandardProps = function (rawProps) {\r\n return true;\r\n };\r\n /*\r\n Can be called even after initial object creation.\r\n */\r\n ParsableModelMixin.prototype.applyMiscProps = function (rawProps) {\r\n // subclasses can implement\r\n };\r\n /*\r\n TODO: why is this a method when defineStandardProps is static\r\n */\r\n ParsableModelMixin.prototype.isStandardProp = function (propName) {\r\n return propName in this.standardPropMap;\r\n };\r\n return ParsableModelMixin;\r\n}(Mixin_1.default));\r\nexports.default = ParsableModelMixin;\r\nParsableModelMixin.prototype.standardPropMap = {}; // will be cloned by defineStandardProps\r\n\r\n\r\n/***/ }),\r\n/* 209 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventInstance = /** @class */ (function () {\r\n function EventInstance(def, dateProfile) {\r\n this.def = def;\r\n this.dateProfile = dateProfile;\r\n }\r\n EventInstance.prototype.toLegacy = function () {\r\n var dateProfile = this.dateProfile;\r\n var obj = this.def.toLegacy();\r\n obj.start = dateProfile.start.clone();\r\n obj.end = dateProfile.end ? dateProfile.end.clone() : null;\r\n return obj;\r\n };\r\n return EventInstance;\r\n}());\r\nexports.default = EventInstance;\r\n\r\n\r\n/***/ }),\r\n/* 210 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar RecurringEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(RecurringEventDef, _super);\r\n function RecurringEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n RecurringEventDef.prototype.isAllDay = function () {\r\n return !this.startTime && !this.endTime;\r\n };\r\n RecurringEventDef.prototype.buildInstances = function (unzonedRange) {\r\n var calendar = this.source.calendar;\r\n var unzonedDate = unzonedRange.getStart();\r\n var unzonedEnd = unzonedRange.getEnd();\r\n var zonedDayStart;\r\n var instanceStart;\r\n var instanceEnd;\r\n var instances = [];\r\n while (unzonedDate.isBefore(unzonedEnd)) {\r\n // if everyday, or this particular day-of-week\r\n if (!this.dowHash || this.dowHash[unzonedDate.day()]) {\r\n zonedDayStart = calendar.applyTimezone(unzonedDate);\r\n instanceStart = zonedDayStart.clone();\r\n instanceEnd = null;\r\n if (this.startTime) {\r\n instanceStart.time(this.startTime);\r\n }\r\n else {\r\n instanceStart.stripTime();\r\n }\r\n if (this.endTime) {\r\n instanceEnd = zonedDayStart.clone().time(this.endTime);\r\n }\r\n instances.push(new EventInstance_1.default(this, // definition\r\n new EventDateProfile_1.default(instanceStart, instanceEnd, calendar)));\r\n }\r\n unzonedDate.add(1, 'days');\r\n }\r\n return instances;\r\n };\r\n RecurringEventDef.prototype.setDow = function (dowNumbers) {\r\n if (!this.dowHash) {\r\n this.dowHash = {};\r\n }\r\n for (var i = 0; i < dowNumbers.length; i++) {\r\n this.dowHash[dowNumbers[i]] = true;\r\n }\r\n };\r\n RecurringEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n if (def.startTime) {\r\n def.startTime = moment.duration(this.startTime);\r\n }\r\n if (def.endTime) {\r\n def.endTime = moment.duration(this.endTime);\r\n }\r\n if (this.dowHash) {\r\n def.dowHash = $.extend({}, this.dowHash);\r\n }\r\n return def;\r\n };\r\n return RecurringEventDef;\r\n}(EventDef_1.default));\r\nexports.default = RecurringEventDef;\r\n/*\r\nHACK to work with TypeScript mixins\r\nNOTE: if super-method fails, should still attempt to apply\r\n*/\r\nRecurringEventDef.prototype.applyProps = function (rawProps) {\r\n var superSuccess = EventDef_1.default.prototype.applyProps.call(this, rawProps);\r\n if (rawProps.start) {\r\n this.startTime = moment.duration(rawProps.start);\r\n }\r\n if (rawProps.end) {\r\n this.endTime = moment.duration(rawProps.end);\r\n }\r\n if (rawProps.dow) {\r\n this.setDow(rawProps.dow);\r\n }\r\n return superSuccess;\r\n};\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nRecurringEventDef.defineStandardProps({\r\n start: false,\r\n end: false,\r\n dow: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 211 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange = /** @class */ (function () {\r\n function EventRange(unzonedRange, eventDef, eventInstance) {\r\n this.unzonedRange = unzonedRange;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n return EventRange;\r\n}());\r\nexports.default = EventRange;\r\n\r\n\r\n/***/ }),\r\n/* 212 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar BUSINESS_HOUR_EVENT_DEFAULTS = {\r\n start: '09:00',\r\n end: '17:00',\r\n dow: [1, 2, 3, 4, 5],\r\n rendering: 'inverse-background'\r\n // classNames are defined in businessHoursSegClasses\r\n};\r\nvar BusinessHourGenerator = /** @class */ (function () {\r\n function BusinessHourGenerator(rawComplexDef, calendar) {\r\n this.rawComplexDef = rawComplexDef;\r\n this.calendar = calendar;\r\n }\r\n BusinessHourGenerator.prototype.buildEventInstanceGroup = function (isAllDay, unzonedRange) {\r\n var eventDefs = this.buildEventDefs(isAllDay);\r\n var eventInstanceGroup;\r\n if (eventDefs.length) {\r\n eventInstanceGroup = new EventInstanceGroup_1.default(util_1.eventDefsToEventInstances(eventDefs, unzonedRange));\r\n // so that inverse-background rendering can happen even when no eventRanges in view\r\n eventInstanceGroup.explicitEventDef = eventDefs[0];\r\n return eventInstanceGroup;\r\n }\r\n };\r\n BusinessHourGenerator.prototype.buildEventDefs = function (isAllDay) {\r\n var rawComplexDef = this.rawComplexDef;\r\n var rawDefs = [];\r\n var requireDow = false;\r\n var i;\r\n var defs = [];\r\n if (rawComplexDef === true) {\r\n rawDefs = [{}]; // will get BUSINESS_HOUR_EVENT_DEFAULTS verbatim\r\n }\r\n else if ($.isPlainObject(rawComplexDef)) {\r\n rawDefs = [rawComplexDef];\r\n }\r\n else if ($.isArray(rawComplexDef)) {\r\n rawDefs = rawComplexDef;\r\n requireDow = true; // every sub-definition NEEDS a day-of-week\r\n }\r\n for (i = 0; i < rawDefs.length; i++) {\r\n if (!requireDow || rawDefs[i].dow) {\r\n defs.push(this.buildEventDef(isAllDay, rawDefs[i]));\r\n }\r\n }\r\n return defs;\r\n };\r\n BusinessHourGenerator.prototype.buildEventDef = function (isAllDay, rawDef) {\r\n var fullRawDef = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, rawDef);\r\n if (isAllDay) {\r\n fullRawDef.start = null;\r\n fullRawDef.end = null;\r\n }\r\n return RecurringEventDef_1.default.parse(fullRawDef, new EventSource_1.default(this.calendar) // dummy source\r\n );\r\n };\r\n return BusinessHourGenerator;\r\n}());\r\nexports.default = BusinessHourGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 213 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar StandardTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardTheme, _super);\r\n function StandardTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardTheme;\r\n}(Theme_1.default));\r\nexports.default = StandardTheme;\r\nStandardTheme.prototype.classes = {\r\n widget: 'fc-unthemed',\r\n widgetHeader: 'fc-widget-header',\r\n widgetContent: 'fc-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'fc-button',\r\n cornerLeft: 'fc-corner-left',\r\n cornerRight: 'fc-corner-right',\r\n stateDefault: 'fc-state-default',\r\n stateActive: 'fc-state-active',\r\n stateDisabled: 'fc-state-disabled',\r\n stateHover: 'fc-state-hover',\r\n stateDown: 'fc-state-down',\r\n popoverHeader: 'fc-widget-header',\r\n popoverContent: 'fc-widget-content',\r\n // day grid\r\n headerRow: 'fc-widget-header',\r\n dayRow: 'fc-widget-content',\r\n // list view\r\n listView: 'fc-widget-content'\r\n};\r\nStandardTheme.prototype.baseIconClass = 'fc-icon';\r\nStandardTheme.prototype.iconClasses = {\r\n close: 'fc-icon-x',\r\n prev: 'fc-icon-left-single-arrow',\r\n next: 'fc-icon-right-single-arrow',\r\n prevYear: 'fc-icon-left-double-arrow',\r\n nextYear: 'fc-icon-right-double-arrow'\r\n};\r\nStandardTheme.prototype.iconOverrideOption = 'buttonIcons';\r\nStandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';\r\nStandardTheme.prototype.iconOverridePrefix = 'fc-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 214 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar JqueryUiTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(JqueryUiTheme, _super);\r\n function JqueryUiTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return JqueryUiTheme;\r\n}(Theme_1.default));\r\nexports.default = JqueryUiTheme;\r\nJqueryUiTheme.prototype.classes = {\r\n widget: 'ui-widget',\r\n widgetHeader: 'ui-widget-header',\r\n widgetContent: 'ui-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'ui-button',\r\n cornerLeft: 'ui-corner-left',\r\n cornerRight: 'ui-corner-right',\r\n stateDefault: 'ui-state-default',\r\n stateActive: 'ui-state-active',\r\n stateDisabled: 'ui-state-disabled',\r\n stateHover: 'ui-state-hover',\r\n stateDown: 'ui-state-down',\r\n today: 'ui-state-highlight',\r\n popoverHeader: 'ui-widget-header',\r\n popoverContent: 'ui-widget-content',\r\n // day grid\r\n headerRow: 'ui-widget-header',\r\n dayRow: 'ui-widget-content',\r\n // list view\r\n listView: 'ui-widget-content'\r\n};\r\nJqueryUiTheme.prototype.baseIconClass = 'ui-icon';\r\nJqueryUiTheme.prototype.iconClasses = {\r\n close: 'ui-icon-closethick',\r\n prev: 'ui-icon-circle-triangle-w',\r\n next: 'ui-icon-circle-triangle-e',\r\n prevYear: 'ui-icon-seek-prev',\r\n nextYear: 'ui-icon-seek-next'\r\n};\r\nJqueryUiTheme.prototype.iconOverrideOption = 'themeButtonIcons';\r\nJqueryUiTheme.prototype.iconOverrideCustomButtonOption = 'themeIcon';\r\nJqueryUiTheme.prototype.iconOverridePrefix = 'ui-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 215 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar FuncEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(FuncEventSource, _super);\r\n function FuncEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n FuncEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isFunction(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isFunction(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n FuncEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.func.call(_this.calendar, start.clone(), end.clone(), timezone, function (rawEventDefs) {\r\n _this.calendar.popLoading();\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n });\r\n });\r\n };\r\n FuncEventSource.prototype.getPrimitive = function () {\r\n return this.func;\r\n };\r\n FuncEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.func = rawProps.events;\r\n return superSuccess;\r\n };\r\n return FuncEventSource;\r\n}(EventSource_1.default));\r\nexports.default = FuncEventSource;\r\nFuncEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 216 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar JsonFeedEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(JsonFeedEventSource, _super);\r\n function JsonFeedEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n JsonFeedEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if (typeof rawInput.url === 'string') {\r\n rawProps = rawInput;\r\n }\r\n else if (typeof rawInput === 'string') {\r\n rawProps = { url: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n JsonFeedEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n var ajaxSettings = this.ajaxSettings;\r\n var onSuccess = ajaxSettings.success;\r\n var onError = ajaxSettings.error;\r\n var requestParams = this.buildRequestParams(start, end, timezone);\r\n // todo: eventually handle the promise's then,\r\n // don't intercept success/error\r\n // tho will be a breaking API change\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve, onReject) {\r\n $.ajax($.extend({}, // destination\r\n JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {\r\n url: _this.url,\r\n data: requestParams,\r\n success: function (rawEventDefs, status, xhr) {\r\n var callbackRes;\r\n _this.calendar.popLoading();\r\n if (rawEventDefs) {\r\n callbackRes = util_1.applyAll(onSuccess, _this, [rawEventDefs, status, xhr]); // redirect `this`\r\n if ($.isArray(callbackRes)) {\r\n rawEventDefs = callbackRes;\r\n }\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n }\r\n else {\r\n onReject();\r\n }\r\n },\r\n error: function (xhr, statusText, errorThrown) {\r\n _this.calendar.popLoading();\r\n util_1.applyAll(onError, _this, [xhr, statusText, errorThrown]); // redirect `this`\r\n onReject();\r\n }\r\n }));\r\n });\r\n };\r\n JsonFeedEventSource.prototype.buildRequestParams = function (start, end, timezone) {\r\n var calendar = this.calendar;\r\n var ajaxSettings = this.ajaxSettings;\r\n var startParam;\r\n var endParam;\r\n var timezoneParam;\r\n var customRequestParams;\r\n var params = {};\r\n startParam = this.startParam;\r\n if (startParam == null) {\r\n startParam = calendar.opt('startParam');\r\n }\r\n endParam = this.endParam;\r\n if (endParam == null) {\r\n endParam = calendar.opt('endParam');\r\n }\r\n timezoneParam = this.timezoneParam;\r\n if (timezoneParam == null) {\r\n timezoneParam = calendar.opt('timezoneParam');\r\n }\r\n // retrieve any outbound GET/POST $.ajax data from the options\r\n if ($.isFunction(ajaxSettings.data)) {\r\n // supplied as a function that returns a key/value object\r\n customRequestParams = ajaxSettings.data();\r\n }\r\n else {\r\n // probably supplied as a straight key/value object\r\n customRequestParams = ajaxSettings.data || {};\r\n }\r\n $.extend(params, customRequestParams);\r\n/////////////// convert to UTC\r\n// params[startParam] = start.format();\r\n// params[endParam] = end.format();\r\n params[startParam] = start.toISOString();\r\n params[endParam] = end.toISOString();\r\n if (timezone && timezone !== 'local') {\r\n params[timezoneParam] = timezone;\r\n }\r\n return params;\r\n };\r\n JsonFeedEventSource.prototype.getPrimitive = function () {\r\n return this.url;\r\n };\r\n JsonFeedEventSource.prototype.applyMiscProps = function (rawProps) {\r\n this.ajaxSettings = rawProps;\r\n };\r\n JsonFeedEventSource.AJAX_DEFAULTS = {\r\n dataType: 'json',\r\n cache: false\r\n };\r\n return JsonFeedEventSource;\r\n}(EventSource_1.default));\r\nexports.default = JsonFeedEventSource;\r\nJsonFeedEventSource.defineStandardProps({\r\n // automatically transfer (true)...\r\n url: true,\r\n startParam: true,\r\n endParam: true,\r\n timezoneParam: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 217 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar TaskQueue = /** @class */ (function () {\r\n function TaskQueue() {\r\n this.q = [];\r\n this.isPaused = false;\r\n this.isRunning = false;\r\n }\r\n TaskQueue.prototype.queue = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this.q.push.apply(this.q, args); // append\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.pause = function () {\r\n this.isPaused = true;\r\n };\r\n TaskQueue.prototype.resume = function () {\r\n this.isPaused = false;\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.getIsIdle = function () {\r\n return !this.isRunning && !this.isPaused;\r\n };\r\n TaskQueue.prototype.tryStart = function () {\r\n if (!this.isRunning && this.canRunNext()) {\r\n this.isRunning = true;\r\n this.trigger('start');\r\n this.runRemaining();\r\n }\r\n };\r\n TaskQueue.prototype.canRunNext = function () {\r\n return !this.isPaused && this.q.length;\r\n };\r\n TaskQueue.prototype.runRemaining = function () {\r\n var _this = this;\r\n var task;\r\n var res;\r\n do {\r\n task = this.q.shift(); // always freshly reference q. might have been reassigned.\r\n res = this.runTask(task);\r\n if (res && res.then) {\r\n res.then(function () {\r\n if (_this.canRunNext()) {\r\n _this.runRemaining();\r\n }\r\n });\r\n return; // prevent marking as stopped\r\n }\r\n } while (this.canRunNext());\r\n this.trigger('stop'); // not really a 'stop' ... more of a 'drained'\r\n this.isRunning = false;\r\n // if 'stop' handler added more tasks.... TODO: write test for this\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.runTask = function (task) {\r\n return task(); // task *is* the function, but subclasses can change the format of a task\r\n };\r\n return TaskQueue;\r\n}());\r\nexports.default = TaskQueue;\r\nEmitterMixin_1.default.mixInto(TaskQueue);\r\n\r\n\r\n/***/ }),\r\n/* 218 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nvar RenderQueue = /** @class */ (function (_super) {\r\n tslib_1.__extends(RenderQueue, _super);\r\n function RenderQueue(waitsByNamespace) {\r\n var _this = _super.call(this) || this;\r\n _this.waitsByNamespace = waitsByNamespace || {};\r\n return _this;\r\n }\r\n RenderQueue.prototype.queue = function (taskFunc, namespace, type) {\r\n var task = {\r\n func: taskFunc,\r\n namespace: namespace,\r\n type: type\r\n };\r\n var waitMs;\r\n if (namespace) {\r\n waitMs = this.waitsByNamespace[namespace];\r\n }\r\n if (this.waitNamespace) {\r\n if (namespace === this.waitNamespace && waitMs != null) {\r\n this.delayWait(waitMs);\r\n }\r\n else {\r\n this.clearWait();\r\n this.tryStart();\r\n }\r\n }\r\n if (this.compoundTask(task)) {\r\n if (!this.waitNamespace && waitMs != null) {\r\n this.startWait(namespace, waitMs);\r\n }\r\n else {\r\n this.tryStart();\r\n }\r\n }\r\n };\r\n RenderQueue.prototype.startWait = function (namespace, waitMs) {\r\n this.waitNamespace = namespace;\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.delayWait = function (waitMs) {\r\n clearTimeout(this.waitId);\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.spawnWait = function (waitMs) {\r\n var _this = this;\r\n this.waitId = setTimeout(function () {\r\n _this.waitNamespace = null;\r\n _this.tryStart();\r\n }, waitMs);\r\n };\r\n RenderQueue.prototype.clearWait = function () {\r\n if (this.waitNamespace) {\r\n clearTimeout(this.waitId);\r\n this.waitId = null;\r\n this.waitNamespace = null;\r\n }\r\n };\r\n RenderQueue.prototype.canRunNext = function () {\r\n if (!_super.prototype.canRunNext.call(this)) {\r\n return false;\r\n }\r\n // waiting for a certain namespace to stop receiving tasks?\r\n if (this.waitNamespace) {\r\n var q = this.q;\r\n // if there was a different namespace task in the meantime,\r\n // that forces all previously-waiting tasks to suddenly execute.\r\n // TODO: find a way to do this in constant time.\r\n for (var i = 0; i < q.length; i++) {\r\n if (q[i].namespace !== this.waitNamespace) {\r\n return true; // allow execution\r\n }\r\n }\r\n return false;\r\n }\r\n return true;\r\n };\r\n RenderQueue.prototype.runTask = function (task) {\r\n task.func();\r\n };\r\n RenderQueue.prototype.compoundTask = function (newTask) {\r\n var q = this.q;\r\n var shouldAppend = true;\r\n var i;\r\n var task;\r\n if (newTask.namespace && newTask.type === 'destroy') {\r\n // remove all init/add/remove ops with same namespace, regardless of order\r\n for (i = q.length - 1; i >= 0; i--) {\r\n task = q[i];\r\n switch (task.type) {\r\n case 'init':\r\n shouldAppend = false;\r\n // the latest destroy is cancelled out by not doing the init\r\n /* falls through */\r\n case 'add':\r\n /* falls through */\r\n case 'remove':\r\n q.splice(i, 1); // remove task\r\n }\r\n }\r\n }\r\n if (shouldAppend) {\r\n q.push(newTask);\r\n }\r\n return shouldAppend;\r\n };\r\n return RenderQueue;\r\n}(TaskQueue_1.default));\r\nexports.default = RenderQueue;\r\n\r\n\r\n/***/ }),\r\n/* 219 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar date_formatting_1 = __webpack_require__(47);\r\nvar Component_1 = __webpack_require__(237);\r\nvar util_2 = __webpack_require__(35);\r\nvar DateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateComponent, _super);\r\n function DateComponent(_view, _options) {\r\n var _this = _super.call(this) || this;\r\n _this.isRTL = false; // frequently accessed options\r\n _this.hitsNeededDepth = 0; // necessary because multiple callers might need the same hits\r\n _this.hasAllDayBusinessHours = false; // TODO: unify with largeUnit and isTimeScale?\r\n _this.isDatesRendered = false;\r\n // hack to set options prior to the this.opt calls\r\n if (_view) {\r\n _this['view'] = _view;\r\n }\r\n if (_options) {\r\n _this['options'] = _options;\r\n }\r\n _this.uid = String(DateComponent.guid++);\r\n _this.childrenByUid = {};\r\n _this.nextDayThreshold = moment.duration(_this.opt('nextDayThreshold'));\r\n _this.isRTL = _this.opt('isRTL');\r\n if (_this.fillRendererClass) {\r\n _this.fillRenderer = new _this.fillRendererClass(_this);\r\n }\r\n if (_this.eventRendererClass) {\r\n _this.eventRenderer = new _this.eventRendererClass(_this, _this.fillRenderer);\r\n }\r\n if (_this.helperRendererClass && _this.eventRenderer) {\r\n _this.helperRenderer = new _this.helperRendererClass(_this, _this.eventRenderer);\r\n }\r\n if (_this.businessHourRendererClass && _this.fillRenderer) {\r\n _this.businessHourRenderer = new _this.businessHourRendererClass(_this, _this.fillRenderer);\r\n }\r\n return _this;\r\n }\r\n DateComponent.prototype.addChild = function (child) {\r\n if (!this.childrenByUid[child.uid]) {\r\n this.childrenByUid[child.uid] = child;\r\n return true;\r\n }\r\n return false;\r\n };\r\n DateComponent.prototype.removeChild = function (child) {\r\n if (this.childrenByUid[child.uid]) {\r\n delete this.childrenByUid[child.uid];\r\n return true;\r\n }\r\n return false;\r\n };\r\n // TODO: only do if isInDom?\r\n // TODO: make part of Component, along with children/batch-render system?\r\n DateComponent.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n this.callChildren('updateSize', arguments);\r\n };\r\n // Options\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.opt = function (name) {\r\n return this._getView().opt(name); // default implementation\r\n };\r\n DateComponent.prototype.publiclyTrigger = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.publiclyTrigger.apply(calendar, args);\r\n };\r\n DateComponent.prototype.hasPublicHandlers = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.hasPublicHandlers.apply(calendar, args);\r\n };\r\n // Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeDateRender = function (dateProfile) {\r\n this.dateProfile = dateProfile; // for rendering\r\n this.renderDates(dateProfile);\r\n this.isDatesRendered = true;\r\n this.callChildren('executeDateRender', arguments);\r\n };\r\n DateComponent.prototype.executeDateUnrender = function () {\r\n this.callChildren('executeDateUnrender', arguments);\r\n this.dateProfile = null;\r\n this.unrenderDates();\r\n this.isDatesRendered = false;\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.renderDates = function (dateProfile) {\r\n // subclasses should implement\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.unrenderDates = function () {\r\n // subclasses should override\r\n };\r\n // Now-Indicator\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator\r\n // should be refreshed. If something falsy is returned, no time indicator is rendered at all.\r\n DateComponent.prototype.getNowIndicatorUnit = function () {\r\n // subclasses should implement\r\n };\r\n // Renders a current time indicator at the given datetime\r\n DateComponent.prototype.renderNowIndicator = function (date) {\r\n this.callChildren('renderNowIndicator', arguments);\r\n };\r\n // Undoes the rendering actions from renderNowIndicator\r\n DateComponent.prototype.unrenderNowIndicator = function () {\r\n this.callChildren('unrenderNowIndicator', arguments);\r\n };\r\n // Business Hours\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.renderBusinessHours = function (businessHourGenerator) {\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.render(businessHourGenerator);\r\n }\r\n this.callChildren('renderBusinessHours', arguments);\r\n };\r\n // Unrenders previously-rendered business-hours\r\n DateComponent.prototype.unrenderBusinessHours = function () {\r\n this.callChildren('unrenderBusinessHours', arguments);\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.unrender();\r\n }\r\n };\r\n // Event Displaying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeEventRender = function (eventsPayload) {\r\n if (this.eventRenderer) {\r\n this.eventRenderer.rangeUpdated(); // poorly named now\r\n this.eventRenderer.render(eventsPayload);\r\n }\r\n else if (this['renderEvents']) {\r\n this['renderEvents'](convertEventsPayloadToLegacyArray(eventsPayload));\r\n }\r\n this.callChildren('executeEventRender', arguments);\r\n };\r\n DateComponent.prototype.executeEventUnrender = function () {\r\n this.callChildren('executeEventUnrender', arguments);\r\n if (this.eventRenderer) {\r\n this.eventRenderer.unrender();\r\n }\r\n else if (this['destroyEvents']) {\r\n this['destroyEvents']();\r\n }\r\n };\r\n DateComponent.prototype.getBusinessHourSegs = function () {\r\n var segs = this.getOwnBusinessHourSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getBusinessHourSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnBusinessHourSegs = function () {\r\n if (this.businessHourRenderer) {\r\n return this.businessHourRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n DateComponent.prototype.getEventSegs = function () {\r\n var segs = this.getOwnEventSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getEventSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnEventSegs = function () {\r\n if (this.eventRenderer) {\r\n return this.eventRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n // Event Rendering Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.triggerAfterEventsRendered = function () {\r\n this.triggerAfterEventSegsRendered(this.getEventSegs());\r\n this.publiclyTrigger('eventAfterAllRender', {\r\n context: this,\r\n args: [this]\r\n });\r\n };\r\n DateComponent.prototype.triggerAfterEventSegsRendered = function (segs) {\r\n var _this = this;\r\n // an optimization, because getEventLegacy is expensive\r\n if (this.hasPublicHandlers('eventAfterRender')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventAfterRender', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n DateComponent.prototype.triggerBeforeEventsDestroyed = function () {\r\n this.triggerBeforeEventSegsDestroyed(this.getEventSegs());\r\n };\r\n DateComponent.prototype.triggerBeforeEventSegsDestroyed = function (segs) {\r\n var _this = this;\r\n if (this.hasPublicHandlers('eventDestroy')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventDestroy', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n // Event Rendering Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Hides all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.showEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', '');\r\n }\r\n });\r\n this.callChildren('showEventsWithId', arguments);\r\n };\r\n // Shows all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.hideEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', 'hidden');\r\n }\r\n });\r\n this.callChildren('hideEventsWithId', arguments);\r\n };\r\n // Drag-n-Drop Rendering (for both events and external elements)\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of a event or external-element drag over the given drop zone.\r\n // If an external-element, seg will be `null`.\r\n // Must return elements used for any mock events.\r\n DateComponent.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var renderedHelper = false;\r\n this.iterChildren(function (child) {\r\n if (child.renderDrag(eventFootprints, seg, isTouch)) {\r\n renderedHelper = true;\r\n }\r\n });\r\n return renderedHelper;\r\n };\r\n // Unrenders a visual indication of an event or external-element being dragged.\r\n DateComponent.prototype.unrenderDrag = function () {\r\n this.callChildren('unrenderDrag', arguments);\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of an event being resized.\r\n DateComponent.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.callChildren('renderEventResize', arguments);\r\n };\r\n // Unrenders a visual indication of an event being resized.\r\n DateComponent.prototype.unrenderEventResize = function () {\r\n this.callChildren('unrenderEventResize', arguments);\r\n };\r\n // Selection\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of the selection\r\n // TODO: rename to `renderSelection` after legacy is gone\r\n DateComponent.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n this.renderHighlight(componentFootprint);\r\n this.callChildren('renderSelectionFootprint', arguments);\r\n };\r\n // Unrenders a visual indication of selection\r\n DateComponent.prototype.unrenderSelection = function () {\r\n this.unrenderHighlight();\r\n this.callChildren('unrenderSelection', arguments);\r\n };\r\n // Highlight\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data)\r\n DateComponent.prototype.renderHighlight = function (componentFootprint) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderFootprint('highlight', componentFootprint, {\r\n getClasses: function () {\r\n return ['fc-highlight'];\r\n }\r\n });\r\n }\r\n this.callChildren('renderHighlight', arguments);\r\n };\r\n // Unrenders the emphasis on a date range\r\n DateComponent.prototype.unrenderHighlight = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('highlight');\r\n }\r\n this.callChildren('unrenderHighlight', arguments);\r\n };\r\n // Hit Areas\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // just because all DateComponents support this interface\r\n // doesn't mean they need to have their own internal coord system. they can defer to sub-components.\r\n DateComponent.prototype.hitsNeeded = function () {\r\n if (!(this.hitsNeededDepth++)) {\r\n this.prepareHits();\r\n }\r\n this.callChildren('hitsNeeded', arguments);\r\n };\r\n DateComponent.prototype.hitsNotNeeded = function () {\r\n if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {\r\n this.releaseHits();\r\n }\r\n this.callChildren('hitsNotNeeded', arguments);\r\n };\r\n DateComponent.prototype.prepareHits = function () {\r\n // subclasses can implement\r\n };\r\n DateComponent.prototype.releaseHits = function () {\r\n // subclasses can implement\r\n };\r\n // Given coordinates from the topleft of the document, return data about the date-related area underneath.\r\n // Can return an object with arbitrary properties (although top/right/left/bottom are encouraged).\r\n // Must have a `grid` property, a reference to this current grid. TODO: avoid this\r\n // The returned object will be processed by getHitFootprint and getHitEl.\r\n DateComponent.prototype.queryHit = function (leftOffset, topOffset) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n var hit;\r\n for (uid in childrenByUid) {\r\n hit = childrenByUid[uid].queryHit(leftOffset, topOffset);\r\n if (hit) {\r\n break;\r\n }\r\n }\r\n return hit;\r\n };\r\n DateComponent.prototype.getSafeHitFootprint = function (hit) {\r\n var footprint = this.getHitFootprint(hit);\r\n if (!this.dateProfile.activeUnzonedRange.containsRange(footprint.unzonedRange)) {\r\n return null;\r\n }\r\n return footprint;\r\n };\r\n DateComponent.prototype.getHitFootprint = function (hit) {\r\n // what about being abstract!?\r\n };\r\n // Given position-level information about a date-related area within the grid,\r\n // should return a jQuery element that best represents it. passed to dayClick callback.\r\n DateComponent.prototype.getHitEl = function (hit) {\r\n // what about being abstract!?\r\n };\r\n /* Converting eventRange -> eventFootprint\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var eventFootprints = [];\r\n var i;\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// append\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n DateComponent.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_2.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /* Converting componentFootprint/eventFootprint -> segs\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventFootprintsToSegs = function (eventFootprints) {\r\n var segs = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n segs.push.apply(segs, this.eventFootprintToSegs(eventFootprints[i]));\r\n }\r\n return segs;\r\n };\r\n // Given an event's span (unzoned start/end and other misc data), and the event itself,\r\n // slices into segments and attaches event-derived properties to them.\r\n // eventSpan - { start, end, isStart, isEnd, otherthings... }\r\n DateComponent.prototype.eventFootprintToSegs = function (eventFootprint) {\r\n var unzonedRange = eventFootprint.componentFootprint.unzonedRange;\r\n var segs;\r\n var i;\r\n var seg;\r\n segs = this.componentFootprintToSegs(eventFootprint.componentFootprint);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (!unzonedRange.isStart) {\r\n seg.isStart = false;\r\n }\r\n if (!unzonedRange.isEnd) {\r\n seg.isEnd = false;\r\n }\r\n seg.footprint = eventFootprint;\r\n // TODO: rename to seg.eventFootprint\r\n }\r\n return segs;\r\n };\r\n DateComponent.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n return [];\r\n };\r\n // Utils\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.callChildren = function (methodName, args) {\r\n this.iterChildren(function (child) {\r\n child[methodName].apply(child, args);\r\n });\r\n };\r\n DateComponent.prototype.iterChildren = function (func) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n for (uid in childrenByUid) {\r\n func(childrenByUid[uid]);\r\n }\r\n };\r\n DateComponent.prototype._getCalendar = function () {\r\n var t = this;\r\n return t.calendar || t.view.calendar;\r\n };\r\n DateComponent.prototype._getView = function () {\r\n return this.view;\r\n };\r\n DateComponent.prototype._getDateProfile = function () {\r\n return this._getView().get('dateProfile');\r\n };\r\n // Generates HTML for an anchor to another view into the calendar.\r\n // Will either generate an
tag or a non-clickable tag, depending on enabled settings.\r\n // `gotoOptions` can either be a moment input, or an object with the form:\r\n // { date, type, forceOff }\r\n // `type` is a view-type like \"day\" or \"week\". default value is \"day\".\r\n // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.\r\n DateComponent.prototype.buildGotoAnchorHtml = function (gotoOptions, attrs, innerHtml) {\r\n var date;\r\n var type;\r\n var forceOff;\r\n var finalOptions;\r\n if ($.isPlainObject(gotoOptions)) {\r\n date = gotoOptions.date;\r\n type = gotoOptions.type;\r\n forceOff = gotoOptions.forceOff;\r\n }\r\n else {\r\n date = gotoOptions; // a single moment input\r\n }\r\n date = moment_ext_1.default(date); // if a string, parse it\r\n finalOptions = {\r\n date: date.format('YYYY-MM-DD'),\r\n type: type || 'day'\r\n };\r\n if (typeof attrs === 'string') {\r\n innerHtml = attrs;\r\n attrs = null;\r\n }\r\n attrs = attrs ? ' ' + util_1.attrsToStr(attrs) : ''; // will have a leading space\r\n innerHtml = innerHtml || '';\r\n if (!forceOff && this.opt('navLinks')) {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n else {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n };\r\n DateComponent.prototype.getAllDayHtml = function () {\r\n return this.opt('allDayHtml') || util_1.htmlEscape(this.opt('allDayText'));\r\n };\r\n // Computes HTML classNames for a single-day element\r\n DateComponent.prototype.getDayClasses = function (date, noThemeHighlight) {\r\n var view = this._getView();\r\n var classes = [];\r\n var today;\r\n if (!this.dateProfile.activeUnzonedRange.containsDate(date)) {\r\n classes.push('fc-disabled-day'); // TODO: jQuery UI theme?\r\n }\r\n else {\r\n classes.push('fc-' + util_1.dayIDs[date.day()]);\r\n if (view.isDateInOtherMonth(date, this.dateProfile)) {\r\n classes.push('fc-other-month');\r\n }\r\n today = view.calendar.getNow();\r\n if (date.isSame(today, 'day')) {\r\n classes.push('fc-today');\r\n if (noThemeHighlight !== true) {\r\n classes.push(view.calendar.theme.getClass('today'));\r\n }\r\n }\r\n else if (date < today) {\r\n classes.push('fc-past');\r\n }\r\n else {\r\n classes.push('fc-future');\r\n }\r\n }\r\n return classes;\r\n };\r\n // Utility for formatting a range. Accepts a range object, formatting string, and optional separator.\r\n // Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.\r\n // The timezones of the dates within `range` will be respected.\r\n DateComponent.prototype.formatRange = function (range, isAllDay, formatStr, separator) {\r\n var end = range.end;\r\n if (isAllDay) {\r\n end = end.clone().subtract(1); // convert to inclusive. last ms of previous day\r\n }\r\n return date_formatting_1.formatRange(range.start, end, formatStr, separator, this.isRTL);\r\n };\r\n // Compute the number of the give units in the \"current\" range.\r\n // Will return a floating-point number. Won't round.\r\n DateComponent.prototype.currentRangeAs = function (unit) {\r\n return this._getDateProfile().currentUnzonedRange.as(unit);\r\n };\r\n // Returns the date range of the full days the given range visually appears to occupy.\r\n // Returns a plain object with start/end, NOT an UnzonedRange!\r\n DateComponent.prototype.computeDayRange = function (unzonedRange) {\r\n var calendar = this._getCalendar();\r\n var startDay = calendar.msToUtcMoment(unzonedRange.startMs, true); // the beginning of the day the range starts\r\n var end = calendar.msToUtcMoment(unzonedRange.endMs);\r\n var endTimeMS = +end.time(); // # of milliseconds into `endDay`\r\n var endDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends\r\n // If the end time is actually inclusively part of the next day and is equal to or\r\n // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\r\n // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\r\n if (endTimeMS && endTimeMS >= this.nextDayThreshold) {\r\n endDay.add(1, 'days');\r\n }\r\n // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.\r\n if (endDay <= startDay) {\r\n endDay = startDay.clone().add(1, 'days');\r\n }\r\n return { start: startDay, end: endDay };\r\n };\r\n // Does the given range visually appear to occupy more than one day?\r\n DateComponent.prototype.isMultiDayRange = function (unzonedRange) {\r\n var dayRange = this.computeDayRange(unzonedRange);\r\n return dayRange.end.diff(dayRange.start, 'days') > 1;\r\n };\r\n DateComponent.guid = 0; // TODO: better system for this?\r\n return DateComponent;\r\n}(Component_1.default));\r\nexports.default = DateComponent;\r\n// legacy\r\nfunction convertEventsPayloadToLegacyArray(eventsPayload) {\r\n var eventDefId;\r\n var eventInstances;\r\n var legacyEvents = [];\r\n var i;\r\n for (eventDefId in eventsPayload) {\r\n eventInstances = eventsPayload[eventDefId].eventInstances;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n legacyEvents.push(eventInstances[i].toLegacy());\r\n }\r\n }\r\n return legacyEvents;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 220 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar Iterator_1 = __webpack_require__(238);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Toolbar_1 = __webpack_require__(239);\r\nvar OptionsManager_1 = __webpack_require__(240);\r\nvar ViewSpecManager_1 = __webpack_require__(241);\r\nvar Constraints_1 = __webpack_require__(207);\r\nvar locale_1 = __webpack_require__(31);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventManager_1 = __webpack_require__(242);\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar Calendar = /** @class */ (function () {\r\n function Calendar(el, overrides) {\r\n this.loadingLevel = 0; // number of simultaneous loading tasks\r\n this.ignoreUpdateViewSize = 0;\r\n this.freezeContentHeightDepth = 0;\r\n // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.\r\n // unneeded() is called in destroy.\r\n GlobalEmitter_1.default.needed();\r\n this.el = el;\r\n this.viewsByType = {};\r\n this.optionsManager = new OptionsManager_1.default(this, overrides);\r\n this.viewSpecManager = new ViewSpecManager_1.default(this.optionsManager, this);\r\n this.initMomentInternals(); // needs to happen after options hash initialized\r\n this.initCurrentDate();\r\n this.initEventManager();\r\n this.constraints = new Constraints_1.default(this.eventManager, this);\r\n this.constructed();\r\n }\r\n Calendar.prototype.constructed = function () {\r\n // useful for monkeypatching. used?\r\n };\r\n Calendar.prototype.getView = function () {\r\n return this.view;\r\n };\r\n Calendar.prototype.publiclyTrigger = function (name, triggerInfo) {\r\n var optHandler = this.opt(name);\r\n var context;\r\n var args;\r\n if ($.isPlainObject(triggerInfo)) {\r\n context = triggerInfo.context;\r\n args = triggerInfo.args;\r\n }\r\n else if ($.isArray(triggerInfo)) {\r\n args = triggerInfo;\r\n }\r\n if (context == null) {\r\n context = this.el[0]; // fallback context\r\n }\r\n if (!args) {\r\n args = [];\r\n }\r\n this.triggerWith(name, context, args); // Emitter's method\r\n if (optHandler) {\r\n return optHandler.apply(context, args);\r\n }\r\n };\r\n Calendar.prototype.hasPublicHandlers = function (name) {\r\n return this.hasHandlers(name) ||\r\n this.opt(name); // handler specified in options\r\n };\r\n // Options Public API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // public getter/setter\r\n Calendar.prototype.option = function (name, value) {\r\n var newOptionHash;\r\n if (typeof name === 'string') {\r\n if (value === undefined) {\r\n return this.optionsManager.get(name);\r\n }\r\n else {\r\n newOptionHash = {};\r\n newOptionHash[name] = value;\r\n this.optionsManager.add(newOptionHash);\r\n }\r\n }\r\n else if (typeof name === 'object') {\r\n this.optionsManager.add(name);\r\n }\r\n };\r\n // private getter\r\n Calendar.prototype.opt = function (name) {\r\n return this.optionsManager.get(name);\r\n };\r\n // View\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Given a view name for a custom view or a standard view, creates a ready-to-go View object\r\n Calendar.prototype.instantiateView = function (viewType) {\r\n var spec = this.viewSpecManager.getViewSpec(viewType);\r\n if (!spec) {\r\n throw new Error(\"View type \\\"\" + viewType + \"\\\" is not valid\");\r\n }\r\n return new spec['class'](this, spec);\r\n };\r\n // Returns a boolean about whether the view is okay to instantiate at some point\r\n Calendar.prototype.isValidViewType = function (viewType) {\r\n return Boolean(this.viewSpecManager.getViewSpec(viewType));\r\n };\r\n Calendar.prototype.changeView = function (viewName, dateOrRange) {\r\n if (dateOrRange) {\r\n if (dateOrRange.start && dateOrRange.end) {\r\n this.optionsManager.recordOverrides({\r\n visibleRange: dateOrRange\r\n });\r\n }\r\n else {\r\n this.currentDate = this.moment(dateOrRange).stripZone(); // just like gotoDate\r\n }\r\n }\r\n this.renderView(viewName);\r\n };\r\n // Forces navigation to a view for the given date.\r\n // `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\r\n Calendar.prototype.zoomTo = function (newDate, viewType) {\r\n var spec;\r\n viewType = viewType || 'day'; // day is default zoom\r\n spec = this.viewSpecManager.getViewSpec(viewType) ||\r\n this.viewSpecManager.getUnitViewSpec(viewType);\r\n this.currentDate = newDate.clone();\r\n this.renderView(spec ? spec.type : null);\r\n };\r\n // Current Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initCurrentDate = function () {\r\n var defaultDateInput = this.opt('defaultDate');\r\n // compute the initial ambig-timezone date\r\n if (defaultDateInput != null) {\r\n this.currentDate = this.moment(defaultDateInput).stripZone();\r\n }\r\n else {\r\n this.currentDate = this.getNow(); // getNow already returns unzoned\r\n }\r\n };\r\n Calendar.prototype.prev = function () {\r\n var view = this.view;\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n if (prevInfo.isValid) {\r\n this.currentDate = prevInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.next = function () {\r\n var view = this.view;\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n if (nextInfo.isValid) {\r\n this.currentDate = nextInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.prevYear = function () {\r\n this.currentDate.add(-1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.nextYear = function () {\r\n this.currentDate.add(1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.today = function () {\r\n this.currentDate = this.getNow(); // should deny like prev/next?\r\n this.renderView();\r\n };\r\n Calendar.prototype.gotoDate = function (zonedDateInput) {\r\n this.currentDate = this.moment(zonedDateInput).stripZone();\r\n this.renderView();\r\n };\r\n Calendar.prototype.incrementDate = function (delta) {\r\n this.currentDate.add(moment.duration(delta));\r\n this.renderView();\r\n };\r\n // for external API\r\n Calendar.prototype.getDate = function () {\r\n return this.applyTimezone(this.currentDate); // infuse the calendar's timezone\r\n };\r\n // Loading Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Should be called when any type of async data fetching begins\r\n Calendar.prototype.pushLoading = function () {\r\n if (!(this.loadingLevel++)) {\r\n this.publiclyTrigger('loading', [true, this.view]);\r\n }\r\n };\r\n // Should be called when any type of async data fetching completes\r\n Calendar.prototype.popLoading = function () {\r\n if (!(--this.loadingLevel)) {\r\n this.publiclyTrigger('loading', [false, this.view]);\r\n }\r\n };\r\n // High-level Rendering\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.render = function () {\r\n if (!this.contentEl) {\r\n this.initialRender();\r\n }\r\n else if (this.elementVisible()) {\r\n // mainly for the public API\r\n this.calcSize();\r\n this.updateViewSize();\r\n }\r\n };\r\n Calendar.prototype.initialRender = function () {\r\n var _this = this;\r\n var el = this.el;\r\n el.addClass('fc');\r\n // event delegation for nav links\r\n el.on('click.fc', 'a[data-goto]', function (ev) {\r\n var anchorEl = $(ev.currentTarget);\r\n var gotoOptions = anchorEl.data('goto'); // will automatically parse JSON\r\n var date = _this.moment(gotoOptions.date);\r\n var viewType = gotoOptions.type;\r\n // property like \"navLinkDayClick\". might be a string or a function\r\n var customAction = _this.view.opt('navLink' + util_1.capitaliseFirstLetter(viewType) + 'Click');\r\n if (typeof customAction === 'function') {\r\n customAction(date, ev);\r\n }\r\n else {\r\n if (typeof customAction === 'string') {\r\n viewType = customAction;\r\n }\r\n _this.zoomTo(date, viewType);\r\n }\r\n });\r\n // called immediately, and upon option change\r\n this.optionsManager.watch('settingTheme', ['?theme', '?themeSystem'], function (opts) {\r\n var themeClass = ThemeRegistry_1.getThemeSystemClass(opts.themeSystem || opts.theme);\r\n var theme = new themeClass(_this.optionsManager);\r\n var widgetClass = theme.getClass('widget');\r\n _this.theme = theme;\r\n if (widgetClass) {\r\n el.addClass(widgetClass);\r\n }\r\n }, function () {\r\n var widgetClass = _this.theme.getClass('widget');\r\n _this.theme = null;\r\n if (widgetClass) {\r\n el.removeClass(widgetClass);\r\n }\r\n });\r\n this.optionsManager.watch('settingBusinessHourGenerator', ['?businessHours'], function (deps) {\r\n _this.businessHourGenerator = new BusinessHourGenerator_1.default(deps.businessHours, _this);\r\n if (_this.view) {\r\n _this.view.set('businessHourGenerator', _this.businessHourGenerator);\r\n }\r\n }, function () {\r\n _this.businessHourGenerator = null;\r\n });\r\n // called immediately, and upon option change.\r\n // HACK: locale often affects isRTL, so we explicitly listen to that too.\r\n this.optionsManager.watch('applyingDirClasses', ['?isRTL', '?locale'], function (opts) {\r\n el.toggleClass('fc-ltr', !opts.isRTL);\r\n el.toggleClass('fc-rtl', opts.isRTL);\r\n });\r\n this.contentEl = $(\"
\").prependTo(el);\r\n this.initToolbars();\r\n this.renderHeader();\r\n this.renderFooter();\r\n this.renderView(this.opt('defaultView'));\r\n if (this.opt('handleWindowResize')) {\r\n $(window).resize(this.windowResizeProxy = util_1.debounce(// prevents rapid calls\r\n this.windowResize.bind(this), this.opt('windowResizeDelay')));\r\n }\r\n };\r\n Calendar.prototype.destroy = function () {\r\n if (this.view) {\r\n this.clearView();\r\n }\r\n this.toolbarsManager.proxyCall('removeElement');\r\n this.contentEl.remove();\r\n this.el.removeClass('fc fc-ltr fc-rtl');\r\n // removes theme-related root className\r\n this.optionsManager.unwatch('settingTheme');\r\n this.optionsManager.unwatch('settingBusinessHourGenerator');\r\n this.el.off('.fc'); // unbind nav link handlers\r\n if (this.windowResizeProxy) {\r\n $(window).unbind('resize', this.windowResizeProxy);\r\n this.windowResizeProxy = null;\r\n }\r\n GlobalEmitter_1.default.unneeded();\r\n };\r\n Calendar.prototype.elementVisible = function () {\r\n return this.el.is(':visible');\r\n };\r\n // Render Queue\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.bindViewHandlers = function (view) {\r\n var _this = this;\r\n view.watch('titleForCalendar', ['title'], function (deps) {\r\n if (view === _this.view) {\r\n _this.setToolbarsTitle(deps.title);\r\n }\r\n });\r\n view.watch('dateProfileForCalendar', ['dateProfile'], function (deps) {\r\n if (view === _this.view) {\r\n _this.currentDate = deps.dateProfile.date; // might have been constrained by view dates\r\n _this.updateToolbarButtons(deps.dateProfile);\r\n }\r\n });\r\n };\r\n Calendar.prototype.unbindViewHandlers = function (view) {\r\n view.unwatch('titleForCalendar');\r\n view.unwatch('dateProfileForCalendar');\r\n };\r\n // View Rendering\r\n // -----------------------------------------------------------------------------------\r\n // Renders a view because of a date change, view-type change, or for the first time.\r\n // If not given a viewType, keep the current view but render different dates.\r\n // Accepts an optional scroll state to restore to.\r\n Calendar.prototype.renderView = function (viewType) {\r\n var oldView = this.view;\r\n var newView;\r\n this.freezeContentHeight();\r\n if (oldView && viewType && oldView.type !== viewType) {\r\n this.clearView();\r\n }\r\n // if viewType changed, or the view was never created, create a fresh view\r\n if (!this.view && viewType) {\r\n newView = this.view =\r\n this.viewsByType[viewType] ||\r\n (this.viewsByType[viewType] = this.instantiateView(viewType));\r\n this.bindViewHandlers(newView);\r\n newView.startBatchRender(); // so that setElement+setDate rendering are joined\r\n newView.setElement($(\"
\").appendTo(this.contentEl));\r\n this.toolbarsManager.proxyCall('activateButton', viewType);\r\n }\r\n if (this.view) {\r\n // prevent unnecessary change firing\r\n if (this.view.get('businessHourGenerator') !== this.businessHourGenerator) {\r\n this.view.set('businessHourGenerator', this.businessHourGenerator);\r\n }\r\n this.view.setDate(this.currentDate);\r\n if (newView) {\r\n newView.stopBatchRender();\r\n }\r\n }\r\n this.thawContentHeight();\r\n };\r\n // Unrenders the current view and reflects this change in the Header.\r\n // Unregsiters the `view`, but does not remove from viewByType hash.\r\n Calendar.prototype.clearView = function () {\r\n var currentView = this.view;\r\n this.toolbarsManager.proxyCall('deactivateButton', currentView.type);\r\n this.unbindViewHandlers(currentView);\r\n currentView.removeElement();\r\n currentView.unsetDate(); // so bindViewHandlers doesn't fire with old values next time\r\n this.view = null;\r\n };\r\n // Destroys the view, including the view object. Then, re-instantiates it and renders it.\r\n // Maintains the same scroll state.\r\n // TODO: maintain any other user-manipulated state.\r\n Calendar.prototype.reinitView = function () {\r\n var oldView = this.view;\r\n var scroll = oldView.queryScroll(); // wouldn't be so complicated if Calendar owned the scroll\r\n this.freezeContentHeight();\r\n this.clearView();\r\n this.calcSize();\r\n this.renderView(oldView.type); // needs the type to freshly render\r\n this.view.applyScroll(scroll);\r\n this.thawContentHeight();\r\n };\r\n // Resizing\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.getSuggestedViewHeight = function () {\r\n if (this.suggestedViewHeight == null) {\r\n this.calcSize();\r\n }\r\n return this.suggestedViewHeight;\r\n };\r\n Calendar.prototype.isHeightAuto = function () {\r\n return this.opt('contentHeight') === 'auto' || this.opt('height') === 'auto';\r\n };\r\n Calendar.prototype.updateViewSize = function (isResize) {\r\n if (isResize === void 0) { isResize = false; }\r\n var view = this.view;\r\n var scroll;\r\n if (!this.ignoreUpdateViewSize && view) {\r\n if (isResize) {\r\n this.calcSize();\r\n scroll = view.queryScroll();\r\n }\r\n this.ignoreUpdateViewSize++;\r\n view.updateSize(this.getSuggestedViewHeight(), this.isHeightAuto(), isResize);\r\n this.ignoreUpdateViewSize--;\r\n if (isResize) {\r\n view.applyScroll(scroll);\r\n }\r\n return true; // signal success\r\n }\r\n };\r\n Calendar.prototype.calcSize = function () {\r\n if (this.elementVisible()) {\r\n this._calcSize();\r\n }\r\n };\r\n Calendar.prototype._calcSize = function () {\r\n var contentHeightInput = this.opt('contentHeight');\r\n var heightInput = this.opt('height');\r\n if (typeof contentHeightInput === 'number') {\r\n this.suggestedViewHeight = contentHeightInput;\r\n }\r\n else if (typeof contentHeightInput === 'function') {\r\n this.suggestedViewHeight = contentHeightInput();\r\n }\r\n else if (typeof heightInput === 'number') {\r\n this.suggestedViewHeight = heightInput - this.queryToolbarsHeight();\r\n }\r\n else if (typeof heightInput === 'function') {\r\n this.suggestedViewHeight = heightInput() - this.queryToolbarsHeight();\r\n }\r\n else if (heightInput === 'parent') {\r\n this.suggestedViewHeight = this.el.parent().height() - this.queryToolbarsHeight();\r\n }\r\n else {\r\n this.suggestedViewHeight = Math.round(this.contentEl.width() /\r\n Math.max(this.opt('aspectRatio'), .5));\r\n }\r\n };\r\n Calendar.prototype.windowResize = function (ev) {\r\n if (\r\n // the purpose: so we don't process jqui \"resize\" events that have bubbled up\r\n // cast to any because .target, which is Element, can't be compared to window for some reason.\r\n ev.target === window &&\r\n this.view &&\r\n this.view.isDatesRendered) {\r\n if (this.updateViewSize(true)) {\r\n this.publiclyTrigger('windowResize', [this.view]);\r\n }\r\n }\r\n };\r\n /* Height \"Freezing\"\r\n -----------------------------------------------------------------------------*/\r\n Calendar.prototype.freezeContentHeight = function () {\r\n if (!(this.freezeContentHeightDepth++)) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n Calendar.prototype.forceFreezeContentHeight = function () {\r\n this.contentEl.css({\r\n width: '100%',\r\n height: this.contentEl.height(),\r\n overflow: 'hidden'\r\n });\r\n };\r\n Calendar.prototype.thawContentHeight = function () {\r\n this.freezeContentHeightDepth--;\r\n // always bring back to natural height\r\n this.contentEl.css({\r\n width: '',\r\n height: '',\r\n overflow: ''\r\n });\r\n // but if there are future thaws, re-freeze\r\n if (this.freezeContentHeightDepth) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n // Toolbar\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initToolbars = function () {\r\n this.header = new Toolbar_1.default(this, this.computeHeaderOptions());\r\n this.footer = new Toolbar_1.default(this, this.computeFooterOptions());\r\n this.toolbarsManager = new Iterator_1.default([this.header, this.footer]);\r\n };\r\n Calendar.prototype.computeHeaderOptions = function () {\r\n return {\r\n extraClasses: 'fc-header-toolbar',\r\n layout: this.opt('header')\r\n };\r\n };\r\n Calendar.prototype.computeFooterOptions = function () {\r\n return {\r\n extraClasses: 'fc-footer-toolbar',\r\n layout: this.opt('footer')\r\n };\r\n };\r\n // can be called repeatedly and Header will rerender\r\n Calendar.prototype.renderHeader = function () {\r\n var header = this.header;\r\n header.setToolbarOptions(this.computeHeaderOptions());\r\n header.render();\r\n if (header.el) {\r\n this.el.prepend(header.el);\r\n }\r\n };\r\n // can be called repeatedly and Footer will rerender\r\n Calendar.prototype.renderFooter = function () {\r\n var footer = this.footer;\r\n footer.setToolbarOptions(this.computeFooterOptions());\r\n footer.render();\r\n if (footer.el) {\r\n this.el.append(footer.el);\r\n }\r\n };\r\n Calendar.prototype.setToolbarsTitle = function (title) {\r\n this.toolbarsManager.proxyCall('updateTitle', title);\r\n };\r\n Calendar.prototype.updateToolbarButtons = function (dateProfile) {\r\n var now = this.getNow();\r\n var view = this.view;\r\n var todayInfo = view.dateProfileGenerator.build(now);\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n this.toolbarsManager.proxyCall((todayInfo.isValid && !dateProfile.currentUnzonedRange.containsDate(now)) ?\r\n 'enableButton' :\r\n 'disableButton', 'today');\r\n this.toolbarsManager.proxyCall(prevInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'prev');\r\n this.toolbarsManager.proxyCall(nextInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'next');\r\n };\r\n Calendar.prototype.queryToolbarsHeight = function () {\r\n return this.toolbarsManager.items.reduce(function (accumulator, toolbar) {\r\n var toolbarHeight = toolbar.el ? toolbar.el.outerHeight(true) : 0; // includes margin\r\n return accumulator + toolbarHeight;\r\n }, 0);\r\n };\r\n // Selection\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // this public method receives start/end dates in any format, with any timezone\r\n Calendar.prototype.select = function (zonedStartInput, zonedEndInput) {\r\n this.view.select(this.buildSelectFootprint.apply(this, arguments));\r\n };\r\n Calendar.prototype.unselect = function () {\r\n if (this.view) {\r\n this.view.unselect();\r\n }\r\n };\r\n // Given arguments to the select method in the API, returns a span (unzoned start/end and other info)\r\n Calendar.prototype.buildSelectFootprint = function (zonedStartInput, zonedEndInput) {\r\n var start = this.moment(zonedStartInput).stripZone();\r\n var end;\r\n if (zonedEndInput) {\r\n end = this.moment(zonedEndInput).stripZone();\r\n }\r\n else if (start.hasTime()) {\r\n end = start.clone().add(this.defaultTimedEventDuration);\r\n }\r\n else {\r\n end = start.clone().add(this.defaultAllDayEventDuration);\r\n }\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), !start.hasTime());\r\n };\r\n // Date Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initMomentInternals = function () {\r\n var _this = this;\r\n this.defaultAllDayEventDuration = moment.duration(this.opt('defaultAllDayEventDuration'));\r\n this.defaultTimedEventDuration = moment.duration(this.opt('defaultTimedEventDuration'));\r\n // Called immediately, and when any of the options change.\r\n // Happens before any internal objects rebuild or rerender, because this is very core.\r\n this.optionsManager.watch('buildingMomentLocale', [\r\n '?locale', '?monthNames', '?monthNamesShort', '?dayNames', '?dayNamesShort',\r\n '?firstDay', '?weekNumberCalculation'\r\n ], function (opts) {\r\n var weekNumberCalculation = opts.weekNumberCalculation;\r\n var firstDay = opts.firstDay;\r\n var _week;\r\n // normalize\r\n if (weekNumberCalculation === 'iso') {\r\n weekNumberCalculation = 'ISO'; // normalize\r\n }\r\n var localeData = Object.create(// make a cheap copy\r\n locale_1.getMomentLocaleData(opts.locale) // will fall back to en\r\n );\r\n if (opts.monthNames) {\r\n localeData._months = opts.monthNames;\r\n }\r\n if (opts.monthNamesShort) {\r\n localeData._monthsShort = opts.monthNamesShort;\r\n }\r\n if (opts.dayNames) {\r\n localeData._weekdays = opts.dayNames;\r\n }\r\n if (opts.dayNamesShort) {\r\n localeData._weekdaysShort = opts.dayNamesShort;\r\n }\r\n if (firstDay == null && weekNumberCalculation === 'ISO') {\r\n firstDay = 1;\r\n }\r\n if (firstDay != null) {\r\n _week = Object.create(localeData._week); // _week: { dow: # }\r\n _week.dow = firstDay;\r\n localeData._week = _week;\r\n }\r\n if (weekNumberCalculation === 'ISO' ||\r\n weekNumberCalculation === 'local' ||\r\n typeof weekNumberCalculation === 'function') {\r\n localeData._fullCalendar_weekCalc = weekNumberCalculation; // moment-ext will know what to do with it\r\n }\r\n _this.localeData = localeData;\r\n // If the internal current date object already exists, move to new locale.\r\n // We do NOT need to do this technique for event dates, because this happens when converting to \"segments\".\r\n if (_this.currentDate) {\r\n _this.localizeMoment(_this.currentDate); // sets to localeData\r\n }\r\n });\r\n };\r\n // Builds a moment using the settings of the current calendar: timezone and locale.\r\n // Accepts anything the vanilla moment() constructor accepts.\r\n Calendar.prototype.moment = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var mom;\r\n if (this.opt('timezone') === 'local') {\r\n mom = moment_ext_1.default.apply(null, args);\r\n // Force the moment to be local, because momentExt doesn't guarantee it.\r\n if (mom.hasTime()) {\r\n mom.local();\r\n }\r\n }\r\n else if (this.opt('timezone') === 'UTC') {\r\n mom = moment_ext_1.default.utc.apply(null, args); // process as UTC\r\n }\r\n else {\r\n mom = moment_ext_1.default.parseZone.apply(null, args); // let the input decide the zone\r\n }\r\n this.localizeMoment(mom); // TODO\r\n return mom;\r\n };\r\n Calendar.prototype.msToMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n else {\r\n mom = this.applyTimezone(mom); // may or may not apply locale\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n Calendar.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n // Updates the given moment's locale settings to the current calendar locale settings.\r\n Calendar.prototype.localizeMoment = function (mom) {\r\n mom._locale = this.localeData;\r\n };\r\n // Returns a boolean about whether or not the calendar knows how to calculate\r\n // the timezone offset of arbitrary dates in the current timezone.\r\n Calendar.prototype.getIsAmbigTimezone = function () {\r\n return this.opt('timezone') !== 'local' && this.opt('timezone') !== 'UTC';\r\n };\r\n // Returns a copy of the given date in the current timezone. Has no effect on dates without times.\r\n Calendar.prototype.applyTimezone = function (date) {\r\n if (!date.hasTime()) {\r\n return date.clone();\r\n }\r\n var zonedDate = this.moment(date.toArray());\r\n var timeAdjust = date.time().asMilliseconds() - zonedDate.time().asMilliseconds();\r\n var adjustedZonedDate;\r\n // Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396)\r\n if (timeAdjust) {\r\n adjustedZonedDate = zonedDate.clone().add(timeAdjust); // add milliseconds\r\n if (date.time().asMilliseconds() - adjustedZonedDate.time().asMilliseconds() === 0) {\r\n zonedDate = adjustedZonedDate;\r\n }\r\n }\r\n return zonedDate;\r\n };\r\n /*\r\n Assumes the footprint is non-open-ended.\r\n */\r\n Calendar.prototype.footprintToDateProfile = function (componentFootprint, ignoreEnd) {\r\n if (ignoreEnd === void 0) { ignoreEnd = false; }\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs);\r\n var end;\r\n if (!ignoreEnd) {\r\n end = moment_ext_1.default.utc(componentFootprint.unzonedRange.endMs);\r\n }\r\n if (componentFootprint.isAllDay) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else {\r\n start = this.applyTimezone(start);\r\n if (end) {\r\n end = this.applyTimezone(end);\r\n }\r\n }\r\n return new EventDateProfile_1.default(start, end, this);\r\n };\r\n // Returns a moment for the current date, as defined by the client's computer or from the `now` option.\r\n // Will return an moment with an ambiguous timezone.\r\n Calendar.prototype.getNow = function () {\r\n var now = this.opt('now');\r\n if (typeof now === 'function') {\r\n now = now();\r\n }\r\n return this.moment(now).stripZone();\r\n };\r\n // Produces a human-readable string for the given duration.\r\n // Side-effect: changes the locale of the given duration.\r\n Calendar.prototype.humanizeDuration = function (duration) {\r\n return duration.locale(this.opt('locale')).humanize();\r\n };\r\n // will return `null` if invalid range\r\n Calendar.prototype.parseUnzonedRange = function (rangeInput) {\r\n var start = null;\r\n var end = null;\r\n if (rangeInput.start) {\r\n start = this.moment(rangeInput.start).stripZone();\r\n }\r\n if (rangeInput.end) {\r\n end = this.moment(rangeInput.end).stripZone();\r\n }\r\n if (!start && !end) {\r\n return null;\r\n }\r\n if (start && end && end.isBefore(start)) {\r\n return null;\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Event-Date Utilities\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initEventManager = function () {\r\n var _this = this;\r\n var eventManager = new EventManager_1.default(this);\r\n var rawSources = this.opt('eventSources') || [];\r\n var singleRawSource = this.opt('events');\r\n this.eventManager = eventManager;\r\n if (singleRawSource) {\r\n rawSources.unshift(singleRawSource);\r\n }\r\n eventManager.on('release', function (eventsPayload) {\r\n _this.trigger('eventsReset', eventsPayload);\r\n });\r\n eventManager.freeze();\r\n rawSources.forEach(function (rawSource) {\r\n var source = EventSourceParser_1.default.parse(rawSource, _this);\r\n if (source) {\r\n eventManager.addSource(source);\r\n }\r\n });\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.requestEvents = function (start, end) {\r\n return this.eventManager.requestEvents(start, end, this.opt('timezone'), !this.opt('lazyFetching'));\r\n };\r\n // Get an event's normalized end date. If not present, calculate it from the defaults.\r\n Calendar.prototype.getEventEnd = function (event) {\r\n if (event.end) {\r\n return event.end.clone();\r\n }\r\n else {\r\n return this.getDefaultEventEnd(event.allDay, event.start);\r\n }\r\n };\r\n // Given an event's allDay status and start date, return what its fallback end date should be.\r\n // TODO: rename to computeDefaultEventEnd\r\n Calendar.prototype.getDefaultEventEnd = function (allDay, zonedStart) {\r\n var end = zonedStart.clone();\r\n if (allDay) {\r\n end.stripTime().add(this.defaultAllDayEventDuration);\r\n }\r\n else {\r\n end.add(this.defaultTimedEventDuration);\r\n }\r\n if (this.getIsAmbigTimezone()) {\r\n end.stripZone(); // we don't know what the tzo should be\r\n }\r\n return end;\r\n };\r\n // Public Events API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.rerenderEvents = function () {\r\n this.view.flash('displayingEvents');\r\n };\r\n Calendar.prototype.refetchEvents = function () {\r\n this.eventManager.refetchAllSources();\r\n };\r\n Calendar.prototype.renderEvents = function (eventInputs, isSticky) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventInputs.length; i++) {\r\n this.renderEvent(eventInputs[i], isSticky);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.renderEvent = function (eventInput, isSticky) {\r\n if (isSticky === void 0) { isSticky = false; }\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, eventInput.source || eventManager.stickySource);\r\n if (eventDef) {\r\n eventManager.addEventDef(eventDef, isSticky);\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.removeEvents = function (legacyQuery) {\r\n var eventManager = this.eventManager;\r\n var legacyInstances = [];\r\n var idMap = {};\r\n var eventDef;\r\n var i;\r\n if (legacyQuery == null) {\r\n eventManager.removeAllEventDefs(); // persist=true\r\n }\r\n else {\r\n eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyInstances.push(eventInstance.toLegacy());\r\n });\r\n legacyInstances = filterLegacyEventInstances(legacyInstances, legacyQuery);\r\n // compute unique IDs\r\n for (i = 0; i < legacyInstances.length; i++) {\r\n eventDef = this.eventManager.getEventDefByUid(legacyInstances[i]._id);\r\n idMap[eventDef.id] = true;\r\n }\r\n eventManager.freeze();\r\n for (i in idMap) {\r\n eventManager.removeEventDefsById(i); // persist=true\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.clientEvents = function (legacyQuery) {\r\n var legacyEventInstances = [];\r\n this.eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyEventInstances.push(eventInstance.toLegacy());\r\n });\r\n return filterLegacyEventInstances(legacyEventInstances, legacyQuery);\r\n };\r\n Calendar.prototype.updateEvents = function (eventPropsArray) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventPropsArray.length; i++) {\r\n this.updateEvent(eventPropsArray[i]);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.updateEvent = function (eventProps) {\r\n var eventDef = this.eventManager.getEventDefByUid(eventProps._id);\r\n var eventInstance;\r\n var eventDefMutation;\r\n if (eventDef instanceof SingleEventDef_1.default) {\r\n eventInstance = eventDef.buildInstance();\r\n eventDefMutation = EventDefMutation_1.default.createFromRawProps(eventInstance, eventProps, // raw props\r\n null // largeUnit -- who uses it?\r\n );\r\n this.eventManager.mutateEventsWithId(eventDef.id, eventDefMutation); // will release\r\n }\r\n };\r\n // Public Event Sources API\r\n // ------------------------------------------------------------------------------------\r\n Calendar.prototype.getEventSources = function () {\r\n return this.eventManager.otherSources.slice(); // clone\r\n };\r\n Calendar.prototype.getEventSourceById = function (id) {\r\n return this.eventManager.getSourceById(EventSource_1.default.normalizeId(id));\r\n };\r\n Calendar.prototype.addEventSource = function (sourceInput) {\r\n var source = EventSourceParser_1.default.parse(sourceInput, this);\r\n if (source) {\r\n this.eventManager.addSource(source);\r\n }\r\n };\r\n Calendar.prototype.removeEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources;\r\n var i;\r\n if (sourceMultiQuery == null) {\r\n this.eventManager.removeAllSources();\r\n }\r\n else {\r\n sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n Calendar.prototype.removeEventSource = function (sourceQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.querySources(sourceQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.refetchEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.refetchSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n // not for internal use. use options module directly instead.\r\n Calendar.defaults = options_1.globalDefaults;\r\n Calendar.englishDefaults = options_1.englishDefaults;\r\n Calendar.rtlDefaults = options_1.rtlDefaults;\r\n return Calendar;\r\n}());\r\nexports.default = Calendar;\r\nEmitterMixin_1.default.mixInto(Calendar);\r\nListenerMixin_1.default.mixInto(Calendar);\r\nfunction filterLegacyEventInstances(legacyEventInstances, legacyQuery) {\r\n if (legacyQuery == null) {\r\n return legacyEventInstances;\r\n }\r\n else if ($.isFunction(legacyQuery)) {\r\n return legacyEventInstances.filter(legacyQuery);\r\n }\r\n else {\r\n legacyQuery += ''; // normalize to string\r\n return legacyEventInstances.filter(function (legacyEventInstance) {\r\n // soft comparison because id not be normalized to string\r\n // tslint:disable-next-line\r\n return legacyEventInstance.id == legacyQuery ||\r\n legacyEventInstance._id === legacyQuery; // can specify internal id, but must exactly match\r\n });\r\n }\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 221 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator = /** @class */ (function () {\r\n function DateProfileGenerator(_view) {\r\n this._view = _view;\r\n }\r\n DateProfileGenerator.prototype.opt = function (name) {\r\n return this._view.opt(name);\r\n };\r\n DateProfileGenerator.prototype.trimHiddenDays = function (unzonedRange) {\r\n return this._view.trimHiddenDays(unzonedRange);\r\n };\r\n DateProfileGenerator.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n return this._view.calendar.msToUtcMoment(ms, forceAllDay);\r\n };\r\n /* Date Range Computation\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Builds a structure with info about what the dates/ranges will be for the \"prev\" view.\r\n DateProfileGenerator.prototype.buildPrev = function (currentDateProfile) {\r\n var prevDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .subtract(currentDateProfile.dateIncrement);\r\n return this.build(prevDate, -1);\r\n };\r\n // Builds a structure with info about what the dates/ranges will be for the \"next\" view.\r\n DateProfileGenerator.prototype.buildNext = function (currentDateProfile) {\r\n var nextDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .add(currentDateProfile.dateIncrement);\r\n return this.build(nextDate, 1);\r\n };\r\n // Builds a structure holding dates/ranges for rendering around the given date.\r\n // Optional direction param indicates whether the date is being incremented/decremented\r\n // from its previous value. decremented = -1, incremented = 1 (default).\r\n DateProfileGenerator.prototype.build = function (date, direction, forceToValid) {\r\n if (forceToValid === void 0) { forceToValid = false; }\r\n var isDateAllDay = !date.hasTime();\r\n var validUnzonedRange;\r\n var minTime = null;\r\n var maxTime = null;\r\n var currentInfo;\r\n var isRangeAllDay;\r\n var renderUnzonedRange;\r\n var activeUnzonedRange;\r\n var isValid;\r\n validUnzonedRange = this.buildValidRange();\r\n validUnzonedRange = this.trimHiddenDays(validUnzonedRange);\r\n if (forceToValid) {\r\n date = this.msToUtcMoment(validUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n currentInfo = this.buildCurrentRangeInfo(date, direction);\r\n isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);\r\n renderUnzonedRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.unzonedRange), currentInfo.unit, isRangeAllDay);\r\n renderUnzonedRange = this.trimHiddenDays(renderUnzonedRange);\r\n activeUnzonedRange = renderUnzonedRange.clone();\r\n if (!this.opt('showNonCurrentDates')) {\r\n activeUnzonedRange = activeUnzonedRange.intersect(currentInfo.unzonedRange);\r\n }\r\n minTime = moment.duration(this.opt('minTime'));\r\n maxTime = moment.duration(this.opt('maxTime'));\r\n activeUnzonedRange = this.adjustActiveRange(activeUnzonedRange, minTime, maxTime);\r\n activeUnzonedRange = activeUnzonedRange.intersect(validUnzonedRange); // might return null\r\n if (activeUnzonedRange) {\r\n date = this.msToUtcMoment(activeUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n // it's invalid if the originally requested date is not contained,\r\n // or if the range is completely outside of the valid range.\r\n isValid = currentInfo.unzonedRange.intersectsWith(validUnzonedRange);\r\n return {\r\n // constraint for where prev/next operations can go and where events can be dragged/resized to.\r\n // an object with optional start and end properties.\r\n validUnzonedRange: validUnzonedRange,\r\n // range the view is formally responsible for.\r\n // for example, a month view might have 1st-31st, excluding padded dates\r\n currentUnzonedRange: currentInfo.unzonedRange,\r\n // name of largest unit being displayed, like \"month\" or \"week\"\r\n currentRangeUnit: currentInfo.unit,\r\n isRangeAllDay: isRangeAllDay,\r\n // dates that display events and accept drag-n-drop\r\n // will be `null` if no dates accept events\r\n activeUnzonedRange: activeUnzonedRange,\r\n // date range with a rendered skeleton\r\n // includes not-active days that need some sort of DOM\r\n renderUnzonedRange: renderUnzonedRange,\r\n // Duration object that denotes the first visible time of any given day\r\n minTime: minTime,\r\n // Duration object that denotes the exclusive visible end time of any given day\r\n maxTime: maxTime,\r\n isValid: isValid,\r\n date: date,\r\n // how far the current date will move for a prev/next operation\r\n dateIncrement: this.buildDateIncrement(currentInfo.duration)\r\n // pass a fallback (might be null) ^\r\n };\r\n };\r\n // Builds an object with optional start/end properties.\r\n // Indicates the minimum/maximum dates to display.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildValidRange = function () {\r\n return this._view.getUnzonedRangeOption('validRange', this._view.calendar.getNow()) ||\r\n new UnzonedRange_1.default(); // completely open-ended\r\n };\r\n // Builds a structure with info about the \"current\" range, the range that is\r\n // highlighted as being the current month for example.\r\n // See build() for a description of `direction`.\r\n // Guaranteed to have `range` and `unit` properties. `duration` is optional.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {\r\n var viewSpec = this._view.viewSpec;\r\n var duration = null;\r\n var unit = null;\r\n var unzonedRange = null;\r\n var dayCount;\r\n if (viewSpec.duration) {\r\n duration = viewSpec.duration;\r\n unit = viewSpec.durationUnit;\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n else if ((dayCount = this.opt('dayCount'))) {\r\n unit = 'day';\r\n unzonedRange = this.buildRangeFromDayCount(date, direction, dayCount);\r\n }\r\n else if ((unzonedRange = this.buildCustomVisibleRange(date))) {\r\n unit = util_1.computeGreatestUnit(unzonedRange.getStart(), unzonedRange.getEnd());\r\n }\r\n else {\r\n duration = this.getFallbackDuration();\r\n unit = util_1.computeGreatestUnit(duration);\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n return { duration: duration, unit: unit, unzonedRange: unzonedRange };\r\n };\r\n DateProfileGenerator.prototype.getFallbackDuration = function () {\r\n return moment.duration({ days: 1 });\r\n };\r\n // Returns a new activeUnzonedRange to have time values (un-ambiguate)\r\n // minTime or maxTime causes the range to expand.\r\n DateProfileGenerator.prototype.adjustActiveRange = function (unzonedRange, minTime, maxTime) {\r\n var start = unzonedRange.getStart();\r\n var end = unzonedRange.getEnd();\r\n if (this._view.usesMinMaxTime) {\r\n if (minTime < 0) {\r\n start.time(0).add(minTime);\r\n }\r\n if (maxTime > 24 * 60 * 60 * 1000) {\r\n end.time(maxTime - (24 * 60 * 60 * 1000));\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds the \"current\" range when it is specified as an explicit duration.\r\n // `unit` is the already-computed computeGreatestUnit value of duration.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {\r\n var alignment = this.opt('dateAlignment');\r\n var dateIncrementInput;\r\n var dateIncrementDuration;\r\n var start;\r\n var end;\r\n var res;\r\n // compute what the alignment should be\r\n if (!alignment) {\r\n dateIncrementInput = this.opt('dateIncrement');\r\n if (dateIncrementInput) {\r\n dateIncrementDuration = moment.duration(dateIncrementInput);\r\n // use the smaller of the two units\r\n if (dateIncrementDuration < duration) {\r\n alignment = util_1.computeDurationGreatestUnit(dateIncrementDuration, dateIncrementInput);\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n // if the view displays a single day or smaller\r\n if (duration.as('days') <= 1) {\r\n if (this._view.isHiddenDay(start)) {\r\n start = this._view.skipHiddenDays(start, direction);\r\n start.startOf('day');\r\n }\r\n }\r\n function computeRes() {\r\n start = date.clone().startOf(alignment);\r\n end = start.clone().add(duration);\r\n res = new UnzonedRange_1.default(start, end);\r\n }\r\n computeRes();\r\n // if range is completely enveloped by hidden days, go past the hidden days\r\n if (!this.trimHiddenDays(res)) {\r\n date = this._view.skipHiddenDays(date, direction);\r\n computeRes();\r\n }\r\n return res;\r\n };\r\n // Builds the \"current\" range when a dayCount is specified.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {\r\n var customAlignment = this.opt('dateAlignment');\r\n var runningCount = 0;\r\n var start = date.clone();\r\n var end;\r\n if (customAlignment) {\r\n start.startOf(customAlignment);\r\n }\r\n start.startOf('day');\r\n start = this._view.skipHiddenDays(start, direction);\r\n end = start.clone();\r\n do {\r\n end.add(1, 'day');\r\n if (!this._view.isHiddenDay(end)) {\r\n runningCount++;\r\n }\r\n } while (runningCount < dayCount);\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds a normalized range object for the \"visible\" range,\r\n // which is a way to define the currentUnzonedRange and activeUnzonedRange at the same time.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {\r\n var visibleUnzonedRange = this._view.getUnzonedRangeOption('visibleRange', this._view.calendar.applyTimezone(date) // correct zone. also generates new obj that avoids mutations\r\n );\r\n if (visibleUnzonedRange && (visibleUnzonedRange.startMs == null || visibleUnzonedRange.endMs == null)) {\r\n return null;\r\n }\r\n return visibleUnzonedRange;\r\n };\r\n // Computes the range that will represent the element/cells for *rendering*,\r\n // but which may have voided days/times.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n return currentUnzonedRange.clone();\r\n };\r\n // Compute the duration value that should be added/substracted to the current date\r\n // when a prev/next operation happens.\r\n DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {\r\n var dateIncrementInput = this.opt('dateIncrement');\r\n var customAlignment;\r\n if (dateIncrementInput) {\r\n return moment.duration(dateIncrementInput);\r\n }\r\n else if ((customAlignment = this.opt('dateAlignment'))) {\r\n return moment.duration(1, customAlignment);\r\n }\r\n else if (fallback) {\r\n return fallback;\r\n }\r\n else {\r\n return moment.duration({ days: 1 });\r\n }\r\n };\r\n return DateProfileGenerator;\r\n}());\r\nexports.default = DateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 222 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar ExternalDropping = /** @class */ (function (_super) {\r\n tslib_1.__extends(ExternalDropping, _super);\r\n function ExternalDropping() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.isDragging = false; // jqui-dragging an external element? boolean\r\n return _this;\r\n }\r\n /*\r\n component impements:\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - isExternalInstanceGroupAllowed\r\n - renderDrag\r\n - unrenderDrag\r\n */\r\n ExternalDropping.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n ExternalDropping.prototype.bindToDocument = function () {\r\n this.listenTo($(document), {\r\n dragstart: this.handleDragStart,\r\n sortstart: this.handleDragStart // jqui\r\n });\r\n };\r\n ExternalDropping.prototype.unbindFromDocument = function () {\r\n this.stopListeningTo($(document));\r\n };\r\n // Called when a jQuery UI drag is initiated anywhere in the DOM\r\n ExternalDropping.prototype.handleDragStart = function (ev, ui) {\r\n var el;\r\n var accept;\r\n if (this.opt('droppable')) {\r\n el = $((ui ? ui.item : null) || ev.target);\r\n // Test that the dragged element passes the dropAccept selector or filter function.\r\n // FYI, the default is \"*\" (matches all)\r\n accept = this.opt('dropAccept');\r\n if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {\r\n if (!this.isDragging) {\r\n this.listenToExternalDrag(el, ev, ui);\r\n }\r\n }\r\n }\r\n };\r\n // Called when a jQuery UI drag starts and it needs to be monitored for dropping\r\n ExternalDropping.prototype.listenToExternalDrag = function (el, ev, ui) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create\r\n var singleEventDef; // a null value signals an unsuccessful drag\r\n // listener that tracks mouse movement over date-associated pixel regions\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n interactionStart: function () {\r\n _this.isDragging = true;\r\n },\r\n hitOver: function (hit) {\r\n var isAllowed = true;\r\n var hitFootprint = hit.component.getSafeHitFootprint(hit); // hit might not belong to this grid\r\n var mutatedEventInstanceGroup;\r\n if (hitFootprint) {\r\n singleEventDef = _this.computeExternalDrop(hitFootprint, meta);\r\n if (singleEventDef) {\r\n mutatedEventInstanceGroup = new EventInstanceGroup_1.default(singleEventDef.buildInstances());\r\n isAllowed = meta.eventProps ? // isEvent?\r\n component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup) :\r\n component.isExternalInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n singleEventDef = null;\r\n util_1.disableCursor();\r\n }\r\n if (singleEventDef) {\r\n component.renderDrag(// called without a seg parameter\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, view.calendar)));\r\n }\r\n },\r\n hitOut: function () {\r\n singleEventDef = null; // signal unsuccessful\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n component.unrenderDrag();\r\n },\r\n interactionEnd: function (ev) {\r\n if (singleEventDef) {\r\n view.reportExternalDrop(singleEventDef, Boolean(meta.eventProps), // isEvent\r\n Boolean(meta.stick), // isSticky\r\n el, ev, ui);\r\n }\r\n _this.isDragging = false;\r\n _this.dragListener = null;\r\n }\r\n });\r\n dragListener.startDrag(ev); // start listening immediately\r\n };\r\n // Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),\r\n // returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null.\r\n // Returning a null value signals an invalid drop hit.\r\n // DOES NOT consider overlap/constraint.\r\n // Assumes both footprints are non-open-ended.\r\n ExternalDropping.prototype.computeExternalDrop = function (componentFootprint, meta) {\r\n var calendar = this.view.calendar;\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs).stripZone();\r\n var end;\r\n var eventDef;\r\n if (componentFootprint.isAllDay) {\r\n // if dropped on an all-day span, and element's metadata specified a time, set it\r\n if (meta.startTime) {\r\n start.time(meta.startTime);\r\n }\r\n else {\r\n start.stripTime();\r\n }\r\n }\r\n if (meta.duration) {\r\n end = start.clone().add(meta.duration);\r\n }\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n eventDef = SingleEventDef_1.default.parse($.extend({}, meta.eventProps, {\r\n start: start,\r\n end: end\r\n }), new EventSource_1.default(calendar));\r\n return eventDef;\r\n };\r\n return ExternalDropping;\r\n}(Interaction_1.default));\r\nexports.default = ExternalDropping;\r\nListenerMixin_1.default.mixInto(ExternalDropping);\r\n/* External-Dragging-Element Data\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.\r\n// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.\r\nexportHooks.dataAttrPrefix = '';\r\n// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure\r\n// to be used for Event Object creation.\r\n// A defined `.eventProps`, even when empty, indicates that an event should be created.\r\nfunction getDraggedElMeta(el) {\r\n var prefix = exportHooks.dataAttrPrefix;\r\n var eventProps; // properties for creating the event, not related to date/time\r\n var startTime; // a Duration\r\n var duration;\r\n var stick;\r\n if (prefix) {\r\n prefix += '-';\r\n }\r\n eventProps = el.data(prefix + 'event') || null;\r\n if (eventProps) {\r\n if (typeof eventProps === 'object') {\r\n eventProps = $.extend({}, eventProps); // make a copy\r\n }\r\n else {\r\n eventProps = {};\r\n }\r\n // pluck special-cased date/time properties\r\n startTime = eventProps.start;\r\n if (startTime == null) {\r\n startTime = eventProps.time;\r\n } // accept 'time' as well\r\n duration = eventProps.duration;\r\n stick = eventProps.stick;\r\n delete eventProps.start;\r\n delete eventProps.time;\r\n delete eventProps.duration;\r\n delete eventProps.stick;\r\n }\r\n // fallback to standalone attribute values for each of the date/time properties\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'start');\r\n }\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'time');\r\n } // accept 'time' as well\r\n if (duration == null) {\r\n duration = el.data(prefix + 'duration');\r\n }\r\n if (stick == null) {\r\n stick = el.data(prefix + 'stick');\r\n }\r\n // massage into correct data types\r\n startTime = startTime != null ? moment.duration(startTime) : null;\r\n duration = duration != null ? moment.duration(duration) : null;\r\n stick = Boolean(stick);\r\n return { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 223 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventResizing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventResizing, _super);\r\n /*\r\n component impements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - getSafeHitFootprint\r\n */\r\n function EventResizing(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isResizing = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventResizing.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventResizing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMouseDown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventResizing.prototype.handleMouseDown = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventResizing.prototype.handleTouchStart = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev);\r\n }\r\n };\r\n // Creates a listener that tracks the user as they resize an event segment.\r\n // Generic enough to work with any type of Grid.\r\n EventResizing.prototype.buildDragListener = function (seg, isStart) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance;\r\n var isDragging;\r\n var resizeMutation; // zoned event date properties. falsy if invalid resize\r\n // Tracks mouse movement over the *grid's* coordinate map\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n interactionStart: function () {\r\n isDragging = false;\r\n },\r\n dragStart: function (ev) {\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segResizeStart(seg, ev);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origHitFootprint = component.getSafeHitFootprint(origHit);\r\n var hitFootprint = component.getSafeHitFootprint(hit);\r\n var mutatedEventInstanceGroup;\r\n if (origHitFootprint && hitFootprint) {\r\n resizeMutation = isStart ?\r\n _this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, seg.footprint) :\r\n _this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, seg.footprint);\r\n if (resizeMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, resizeMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n resizeMutation = null;\r\n util_1.disableCursor();\r\n }\r\n else if (resizeMutation.isEmpty()) {\r\n // no change. (FYI, event dates might have zones)\r\n resizeMutation = null;\r\n }\r\n if (resizeMutation) {\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n view.renderEventResize(component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg);\r\n }\r\n },\r\n hitOut: function () {\r\n resizeMutation = null;\r\n },\r\n hitDone: function () {\r\n view.unrenderEventResize(seg);\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n if (isDragging) {\r\n _this.segResizeStop(seg, ev);\r\n }\r\n if (resizeMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventResize(eventInstance, resizeMutation, el, ev);\r\n }\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment resizing starts\r\n EventResizing.prototype.segResizeStart = function (seg, ev) {\r\n this.isResizing = true;\r\n this.component.publiclyTrigger('eventResizeStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment resizing stops\r\n EventResizing.prototype.segResizeStop = function (seg, ev) {\r\n this.isResizing = false;\r\n this.component.publiclyTrigger('eventResizeStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Returns new date-information for an event segment being resized from its start\r\n EventResizing.prototype.computeEventStartResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var startDelta = this.component.diffDates(endFootprint.unzonedRange.getStart(), startFootprint.unzonedRange.getStart());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getStart().add(startDelta) < origRange.getEnd()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setStartDelta(startDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n // Returns new date-information for an event segment being resized from its end\r\n EventResizing.prototype.computeEventEndResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var endDelta = this.component.diffDates(endFootprint.unzonedRange.getEnd(), startFootprint.unzonedRange.getEnd());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getEnd().add(endDelta) > origRange.getStart()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setEndDelta(endDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n return EventResizing;\r\n}(Interaction_1.default));\r\nexports.default = EventResizing;\r\n\r\n\r\n/***/ }),\r\n/* 224 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar DragListener_1 = __webpack_require__(54);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar MouseFollower_1 = __webpack_require__(244);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventDragging = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventDragging, _super);\r\n /*\r\n component implements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n */\r\n function EventDragging(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isDragging = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventDragging.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventDragging.prototype.getSelectionDelay = function () {\r\n var delay = this.opt('eventLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n EventDragging.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMousedown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventDragging.prototype.handleMousedown = function (seg, ev) {\r\n if (!this.component.shouldIgnoreMouse() &&\r\n this.component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventDragging.prototype.handleTouchStart = function (seg, ev) {\r\n var component = this.component;\r\n var settings = {\r\n delay: this.view.isEventDefSelected(seg.footprint.eventDef) ? // already selected?\r\n 0 : this.getSelectionDelay()\r\n };\r\n if (component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, settings);\r\n }\r\n else if (component.canStartSelection(seg, ev)) {\r\n this.buildSelectListener(seg).startInteraction(ev, settings);\r\n }\r\n };\r\n // seg isn't draggable, but let's use a generic DragListener\r\n // simply for the delay, so it can be selected.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildSelectListener = function (seg) {\r\n var _this = this;\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n var dragListener = this.dragListener = new DragListener_1.default({\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n },\r\n interactionEnd: function (ev) {\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Builds a listener that will track user-dragging on an event segment.\r\n // Generic enough to work with any type of Grid.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildDragListener = function (seg) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n var isDragging;\r\n var mouseFollower; // A clone of the original element that will move with the mouse\r\n var eventDefMutation;\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents\r\n // of the view.\r\n var dragListener = this.dragListener = new HitDragListener_1.default(view, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n subjectCenter: true,\r\n interactionStart: function (ev) {\r\n seg.component = component; // for renderDrag\r\n isDragging = false;\r\n mouseFollower = new MouseFollower_1.default(seg.el, {\r\n additionalClass: 'fc-dragging',\r\n parentEl: view.el,\r\n opacity: dragListener.isTouch ? null : _this.opt('dragOpacity'),\r\n revertDuration: _this.opt('dragRevertDuration'),\r\n zIndex: 2 // one above the .fc-view\r\n });\r\n mouseFollower.hide(); // don't show until we know this is a real drag\r\n mouseFollower.start(ev);\r\n },\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segDragStart(seg, ev);\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origFootprint;\r\n var footprint;\r\n var mutatedEventInstanceGroup;\r\n // starting hit could be forced (DayGrid.limit)\r\n if (seg.hit) {\r\n origHit = seg.hit;\r\n }\r\n // hit might not belong to this grid, so query origin grid\r\n origFootprint = origHit.component.getSafeHitFootprint(origHit);\r\n footprint = hit.component.getSafeHitFootprint(hit);\r\n if (origFootprint && footprint) {\r\n eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, eventDef);\r\n if (eventDefMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, eventDefMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n eventDefMutation = null;\r\n util_1.disableCursor();\r\n }\r\n // if a valid drop location, have the subclass render a visual indication\r\n if (eventDefMutation &&\r\n view.renderDrag(// truthy if rendered something\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg, dragListener.isTouch)) {\r\n mouseFollower.hide(); // if the subclass is already using a mock event \"helper\", hide our own\r\n }\r\n else {\r\n mouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)\r\n }\r\n if (isOrig) {\r\n // needs to have moved hits to be a valid drop\r\n eventDefMutation = null;\r\n }\r\n },\r\n hitOut: function () {\r\n view.unrenderDrag(seg); // unrender whatever was done in renderDrag\r\n mouseFollower.show(); // show in case we are moving out of all hits\r\n eventDefMutation = null;\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n delete seg.component; // prevent side effects\r\n // do revert animation if hasn't changed. calls a callback when finished (whether animation or not)\r\n mouseFollower.stop(!eventDefMutation, function () {\r\n if (isDragging) {\r\n view.unrenderDrag(seg);\r\n _this.segDragStop(seg, ev);\r\n }\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n if (eventDefMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventDrop(eventInstance, eventDefMutation, el, ev);\r\n }\r\n });\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment dragging starts\r\n EventDragging.prototype.segDragStart = function (seg, ev) {\r\n this.isDragging = true;\r\n this.component.publiclyTrigger('eventDragStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment dragging stops\r\n EventDragging.prototype.segDragStop = function (seg, ev) {\r\n this.isDragging = false;\r\n this.component.publiclyTrigger('eventDragStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // DOES NOT consider overlap/constraint\r\n EventDragging.prototype.computeEventDropMutation = function (startFootprint, endFootprint, eventDef) {\r\n var eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(this.computeEventDateMutation(startFootprint, endFootprint));\r\n return eventDefMutation;\r\n };\r\n EventDragging.prototype.computeEventDateMutation = function (startFootprint, endFootprint) {\r\n var date0 = startFootprint.unzonedRange.getStart();\r\n var date1 = endFootprint.unzonedRange.getStart();\r\n var clearEnd = false;\r\n var forceTimed = false;\r\n var forceAllDay = false;\r\n var dateDelta;\r\n var dateMutation;\r\n if (startFootprint.isAllDay !== endFootprint.isAllDay) {\r\n clearEnd = true;\r\n if (endFootprint.isAllDay) {\r\n forceAllDay = true;\r\n date0.stripTime();\r\n }\r\n else {\r\n forceTimed = true;\r\n }\r\n }\r\n dateDelta = this.component.diffDates(date1, date0);\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.clearEnd = clearEnd;\r\n dateMutation.forceTimed = forceTimed;\r\n dateMutation.forceAllDay = forceAllDay;\r\n dateMutation.setDateDelta(dateDelta);\r\n return dateMutation;\r\n };\r\n return EventDragging;\r\n}(Interaction_1.default));\r\nexports.default = EventDragging;\r\n\r\n\r\n/***/ }),\r\n/* 225 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateSelecting = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateSelecting, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - renderHighlight\r\n - unrenderHighlight\r\n */\r\n function DateSelecting(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateSelecting.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateSelecting.prototype.getDelay = function () {\r\n var delay = this.opt('selectLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n DateSelecting.prototype.bindToEl = function (el) {\r\n var _this = this;\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev, {\r\n distance: _this.opt('selectMinDistance')\r\n });\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev, {\r\n delay: _this.getDelay()\r\n });\r\n }\r\n });\r\n util_1.preventSelection(el);\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day selecting.\r\n DateSelecting.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var selectionFootprint; // null if invalid selection\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n selectionFootprint = null;\r\n },\r\n dragStart: function (ev) {\r\n _this.view.unselect(ev); // since we could be rendering a new selection, we want to clear any old one\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var origHitFootprint;\r\n var hitFootprint;\r\n if (origHit) {\r\n origHitFootprint = component.getSafeHitFootprint(origHit);\r\n hitFootprint = component.getSafeHitFootprint(hit);\r\n if (origHitFootprint && hitFootprint) {\r\n selectionFootprint = _this.computeSelection(origHitFootprint, hitFootprint);\r\n }\r\n else {\r\n selectionFootprint = null;\r\n }\r\n if (selectionFootprint) {\r\n component.renderSelectionFootprint(selectionFootprint);\r\n }\r\n else if (selectionFootprint === false) {\r\n util_1.disableCursor();\r\n }\r\n }\r\n },\r\n hitOut: function () {\r\n selectionFootprint = null;\r\n component.unrenderSelection();\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n if (!isCancelled && selectionFootprint) {\r\n // the selection will already have been rendered. just report it\r\n _this.view.reportSelection(selectionFootprint, ev);\r\n }\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Given the first and last date-spans of a selection, returns another date-span object.\r\n // Subclasses can override and provide additional data in the span object. Will be passed to renderSelectionFootprint().\r\n // Will return false if the selection is invalid and this should be indicated to the user.\r\n // Will return null/undefined if a selection invalid but no error should be reported.\r\n DateSelecting.prototype.computeSelection = function (footprint0, footprint1) {\r\n var wholeFootprint = this.computeSelectionFootprint(footprint0, footprint1);\r\n if (wholeFootprint && !this.isSelectionFootprintAllowed(wholeFootprint)) {\r\n return false;\r\n }\r\n return wholeFootprint;\r\n };\r\n // Given two spans, must return the combination of the two.\r\n // TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.\r\n // Assumes both footprints are non-open-ended.\r\n DateSelecting.prototype.computeSelectionFootprint = function (footprint0, footprint1) {\r\n var ms = [\r\n footprint0.unzonedRange.startMs,\r\n footprint0.unzonedRange.endMs,\r\n footprint1.unzonedRange.startMs,\r\n footprint1.unzonedRange.endMs\r\n ];\r\n ms.sort(util_1.compareNumbers);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(ms[0], ms[3]), footprint0.isAllDay);\r\n };\r\n DateSelecting.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n return this.component.dateProfile.validUnzonedRange.containsRange(componentFootprint.unzonedRange) &&\r\n this.view.calendar.constraints.isSelectionFootprintAllowed(componentFootprint);\r\n };\r\n return DateSelecting;\r\n}(Interaction_1.default));\r\nexports.default = DateSelecting;\r\n\r\n\r\n/***/ }),\r\n/* 226 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nvar DayGrid_1 = __webpack_require__(61);\r\nvar AGENDA_ALL_DAY_EVENT_LIMIT = 5;\r\nvar agendaTimeGridMethods;\r\nvar agendaDayGridMethods;\r\n/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\r\n// Responsible for managing width/height.\r\nvar AgendaView = /** @class */ (function (_super) {\r\n tslib_1.__extends(AgendaView, _super);\r\n function AgendaView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering\r\n _this.timeGrid = _this.instantiateTimeGrid();\r\n _this.addChild(_this.timeGrid);\r\n if (_this.opt('allDaySlot')) {\r\n _this.dayGrid = _this.instantiateDayGrid(); // the all-day subcomponent of this view\r\n _this.addChild(_this.dayGrid);\r\n }\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass\r\n AgendaView.prototype.instantiateTimeGrid = function () {\r\n var timeGrid = new this.timeGridClass(this);\r\n util_1.copyOwnProps(agendaTimeGridMethods, timeGrid);\r\n return timeGrid;\r\n };\r\n // Instantiates the DayGrid object this view might need. Draws from this.dayGridClass\r\n AgendaView.prototype.instantiateDayGrid = function () {\r\n var dayGrid = new this.dayGridClass(this);\r\n util_1.copyOwnProps(agendaDayGridMethods, dayGrid);\r\n return dayGrid;\r\n };\r\n /* Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.renderSkeleton = function () {\r\n var timeGridWrapEl;\r\n var timeGridEl;\r\n this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container');\r\n timeGridEl = $('
').appendTo(timeGridWrapEl);\r\n this.el.find('.fc-body > tr > td').append(timeGridWrapEl);\r\n this.timeGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.timeGrid.setElement(timeGridEl);\r\n if (this.dayGrid) {\r\n this.dayGrid.setElement(this.el.find('.fc-day-grid'));\r\n // have the day-grid extend it's coordinate area over the
dividing the two grids\r\n this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();\r\n }\r\n };\r\n AgendaView.prototype.unrenderSkeleton = function () {\r\n this.timeGrid.removeElement();\r\n if (this.dayGrid) {\r\n this.dayGrid.removeElement();\r\n }\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid and time-grid components will render inside containers defined by this HTML.\r\n AgendaView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
' +\r\n (this.dayGrid ?\r\n '
' +\r\n '
' :\r\n '') +\r\n '
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the axis, if it is known\r\n AgendaView.prototype.axisStyleAttr = function () {\r\n if (this.axisWidth != null) {\r\n return 'style=\"width:' + this.axisWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.getNowIndicatorUnit = function () {\r\n return this.timeGrid.getNowIndicatorUnit();\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Adjusts the vertical dimensions of the view to the specified values\r\n AgendaView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit;\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n // make all axis cells line up, and record the width so newly created axis cells will have it\r\n this.axisWidth = util_1.matchCellWidths(this.el.find('.fc-axis'));\r\n // hack to give the view some height prior to timeGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS timeGrid.\r\n if (!this.timeGrid.colEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n // set of fake row elements that must compensate when scroller has scrollbars\r\n var noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)');\r\n // reset all dimensions back to the original state\r\n this.timeGrid.bottomRuleEl.hide(); // .show() will be called later if this
is necessary\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n util_1.uncompensateScroll(noScrollRowEls);\r\n // limit number of events in the all-day area\r\n if (this.dayGrid) {\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n eventLimit = this.opt('eventLimit');\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\r\n }\r\n if (eventLimit) {\r\n this.dayGrid.limitRows(eventLimit);\r\n }\r\n }\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n // make the all-day and header rows lines up\r\n util_1.compensateScroll(noScrollRowEls, scrollbarWidths);\r\n // the scrollbar compensation might have changed text flow, which might affect height, so recalculate\r\n // and reapply the desired height to the scroller.\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n // if there's any space below the slats, show the horizontal rule.\r\n // this won't cause any new overflow, because lockOverflow already called.\r\n if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {\r\n this.timeGrid.bottomRuleEl.show();\r\n }\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n AgendaView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes the initial pre-configured scroll state prior to allowing the user to change it\r\n AgendaView.prototype.computeInitialDateScroll = function () {\r\n var scrollTime = moment.duration(this.opt('scrollTime'));\r\n var top = this.timeGrid.computeTimeTop(scrollTime);\r\n // zoom can give weird floating-point values. rather scroll a little bit further\r\n top = Math.ceil(top);\r\n if (top) {\r\n top++; // to overcome top border that slots beyond the first have. looks better\r\n }\r\n return { top: top };\r\n };\r\n AgendaView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n AgendaView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n /* Hit Areas\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // forward all hit-related method calls to the grids (dayGrid might not be defined)\r\n AgendaView.prototype.getHitFootprint = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitFootprint(hit);\r\n };\r\n AgendaView.prototype.getHitEl = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitEl(hit);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.executeEventRender = function (eventsPayload) {\r\n var dayEventsPayload = {};\r\n var timedEventsPayload = {};\r\n var id;\r\n var eventInstanceGroup;\r\n // separate the events into all-day and timed\r\n for (id in eventsPayload) {\r\n eventInstanceGroup = eventsPayload[id];\r\n if (eventInstanceGroup.getEventDef().isAllDay()) {\r\n dayEventsPayload[id] = eventInstanceGroup;\r\n }\r\n else {\r\n timedEventsPayload[id] = eventInstanceGroup;\r\n }\r\n }\r\n this.timeGrid.executeEventRender(timedEventsPayload);\r\n if (this.dayGrid) {\r\n this.dayGrid.executeEventRender(dayEventsPayload);\r\n }\r\n };\r\n /* Dragging/Resizing Routing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n AgendaView.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n var renderedHelper = false;\r\n renderedHelper = this.timeGrid.renderDrag(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n renderedHelper = this.dayGrid.renderDrag(groups.allDay, seg, isTouch) || renderedHelper;\r\n }\r\n return renderedHelper;\r\n };\r\n AgendaView.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n this.timeGrid.renderEventResize(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n this.dayGrid.renderEventResize(groups.allDay, seg, isTouch);\r\n }\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection\r\n AgendaView.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (!componentFootprint.isAllDay) {\r\n this.timeGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n else if (this.dayGrid) {\r\n this.dayGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n };\r\n return AgendaView;\r\n}(View_1.default));\r\nexports.default = AgendaView;\r\nAgendaView.prototype.timeGridClass = TimeGrid_1.default;\r\nAgendaView.prototype.dayGridClass = DayGrid_1.default;\r\n// Will customize the rendering behavior of the AgendaView's timeGrid\r\nagendaTimeGridMethods = {\r\n // Generates the HTML that will go before the day-of week header cells\r\n renderHeadIntroHtml: function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var weekStart = calendar.msToUtcMoment(this.dateProfile.renderUnzonedRange.startMs, true);\r\n var weekText;\r\n if (this.opt('weekNumbers')) {\r\n weekText = weekStart.format(this.opt('smallWeekFormat'));\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt > 1 }, util_1.htmlEscape(weekText) // inner HTML\r\n ) +\r\n '';\r\n }\r\n else {\r\n return '';\r\n }\r\n },\r\n // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\n// Will customize the rendering behavior of the AgendaView's dayGrid\r\nagendaDayGridMethods = {\r\n // Generates the HTML that goes before the all-day cells\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n view.getAllDayHtml() +\r\n '' +\r\n '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\nfunction groupEventFootprintsByAllDay(eventFootprints) {\r\n var allDay = [];\r\n var timed = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventFootprints[i].componentFootprint.isAllDay) {\r\n allDay.push(eventFootprints[i]);\r\n }\r\n else {\r\n timed.push(eventFootprints[i]);\r\n }\r\n }\r\n return { allDay: allDay, timed: timed };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 227 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar TimeGridEventRenderer_1 = __webpack_require__(246);\r\nvar TimeGridHelperRenderer_1 = __webpack_require__(247);\r\nvar TimeGridFillRenderer_1 = __webpack_require__(248);\r\n/* A component that renders one or more columns of vertical time slots\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// We mixin DayTable, even though there is only a single row of days\r\n// potential nice values for the slot-duration and interval-duration\r\n// from largest to smallest\r\nvar AGENDA_STOCK_SUB_DURATIONS = [\r\n { hours: 1 },\r\n { minutes: 30 },\r\n { minutes: 15 },\r\n { seconds: 30 },\r\n { seconds: 15 }\r\n];\r\nvar TimeGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGrid, _super);\r\n function TimeGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.processOptions();\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n TimeGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByTimes(componentFootprint.unzonedRange);\r\n var i;\r\n for (i = 0; i < segs.length; i++) {\r\n if (this.isRTL) {\r\n segs[i].col = this.daysPerRow - 1 - segs[i].dayIndex;\r\n }\r\n else {\r\n segs[i].col = segs[i].dayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Handling\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.sliceRangeByTimes = function (unzonedRange) {\r\n var segs = [];\r\n var segRange;\r\n var dayIndex;\r\n for (dayIndex = 0; dayIndex < this.daysPerRow; dayIndex++) {\r\n segRange = unzonedRange.intersect(this.dayRanges[dayIndex]);\r\n if (segRange) {\r\n segs.push({\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Parses various options into properties of this object\r\n TimeGrid.prototype.processOptions = function () {\r\n var slotDuration = this.opt('slotDuration');\r\n var snapDuration = this.opt('snapDuration');\r\n var input;\r\n slotDuration = moment.duration(slotDuration);\r\n snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;\r\n this.slotDuration = slotDuration;\r\n this.snapDuration = snapDuration;\r\n this.snapsPerSlot = slotDuration / snapDuration; // TODO: ensure an integer multiple?\r\n // might be an array value (for TimelineView).\r\n // if so, getting the most granular entry (the last one probably).\r\n input = this.opt('slotLabelFormat');\r\n if ($.isArray(input)) {\r\n input = input[input.length - 1];\r\n }\r\n this.labelFormat = input ||\r\n this.opt('smallTimeFormat'); // the computed default\r\n input = this.opt('slotLabelInterval');\r\n this.labelInterval = input ?\r\n moment.duration(input) :\r\n this.computeLabelInterval(slotDuration);\r\n };\r\n // Computes an automatic value for slotLabelInterval\r\n TimeGrid.prototype.computeLabelInterval = function (slotDuration) {\r\n var i;\r\n var labelInterval;\r\n var slotsPerLabel;\r\n // find the smallest stock label interval that results in more than one slots-per-label\r\n for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {\r\n labelInterval = moment.duration(AGENDA_STOCK_SUB_DURATIONS[i]);\r\n slotsPerLabel = util_1.divideDurationByDuration(labelInterval, slotDuration);\r\n if (util_1.isInt(slotsPerLabel) && slotsPerLabel > 1) {\r\n return labelInterval;\r\n }\r\n }\r\n return moment.duration(slotDuration); // fall back. clone\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderSlats();\r\n this.renderColumns();\r\n };\r\n TimeGrid.prototype.unrenderDates = function () {\r\n // this.unrenderSlats(); // don't need this because repeated .html() calls clear\r\n this.unrenderColumns();\r\n };\r\n TimeGrid.prototype.renderSkeleton = function () {\r\n var theme = this.view.calendar.theme;\r\n this.el.html('
' +\r\n '
' +\r\n '
');\r\n this.bottomRuleEl = this.el.find('hr');\r\n };\r\n TimeGrid.prototype.renderSlats = function () {\r\n var theme = this.view.calendar.theme;\r\n this.slatContainerEl = this.el.find('> .fc-slats')\r\n .html(// avoids needing ::unrenderSlats()\r\n '' +\r\n this.renderSlatRowHtml() +\r\n '
');\r\n this.slatEls = this.slatContainerEl.find('tr');\r\n this.slatCoordCache = new CoordCache_1.default({\r\n els: this.slatEls,\r\n isVertical: true\r\n });\r\n };\r\n // Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\r\n TimeGrid.prototype.renderSlatRowHtml = function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var isRTL = this.isRTL;\r\n var dateProfile = this.dateProfile;\r\n var html = '';\r\n var slotTime = moment.duration(+dateProfile.minTime); // wish there was .clone() for durations\r\n var slotIterator = moment.duration(0);\r\n var slotDate; // will be on the view's first day, but we only care about its time\r\n var isLabeled;\r\n var axisHtml;\r\n // Calculate the time for each slot\r\n while (slotTime < dateProfile.maxTime) {\r\n slotDate = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs).time(slotTime);\r\n isLabeled = util_1.isInt(util_1.divideDurationByDuration(slotIterator, this.labelInterval));\r\n axisHtml =\r\n '' +\r\n (isLabeled ?\r\n '' + // for matchCellWidths\r\n util_1.htmlEscape(slotDate.format(this.labelFormat)) +\r\n '' :\r\n '') +\r\n '';\r\n html +=\r\n '' +\r\n (!isRTL ? axisHtml : '') +\r\n '' +\r\n (isRTL ? axisHtml : '') +\r\n '';\r\n slotTime.add(this.slotDuration);\r\n slotIterator.add(this.slotDuration);\r\n }\r\n return html;\r\n };\r\n TimeGrid.prototype.renderColumns = function () {\r\n var dateProfile = this.dateProfile;\r\n var theme = this.view.calendar.theme;\r\n this.dayRanges = this.dayDates.map(function (dayDate) {\r\n return new UnzonedRange_1.default(dayDate.clone().add(dateProfile.minTime), dayDate.clone().add(dateProfile.maxTime));\r\n });\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n this.el.find('> .fc-bg').html('' +\r\n this.renderBgTrHtml(0) + // row=0\r\n '
');\r\n this.colEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.colEls,\r\n isHorizontal: true\r\n });\r\n this.renderContentSkeleton();\r\n };\r\n TimeGrid.prototype.unrenderColumns = function () {\r\n this.unrenderContentSkeleton();\r\n };\r\n /* Content Skeleton\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders the DOM that the view's content will live in\r\n TimeGrid.prototype.renderContentSkeleton = function () {\r\n var cellHtml = '';\r\n var i;\r\n var skeletonEl;\r\n for (i = 0; i < this.colCnt; i++) {\r\n cellHtml +=\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '';\r\n }\r\n skeletonEl = this.contentSkeletonEl = $('
' +\r\n '' +\r\n '' + cellHtml + '' +\r\n '
' +\r\n '
');\r\n this.colContainerEls = skeletonEl.find('.fc-content-col');\r\n this.helperContainerEls = skeletonEl.find('.fc-helper-container');\r\n this.fgContainerEls = skeletonEl.find('.fc-event-container:not(.fc-helper-container)');\r\n this.bgContainerEls = skeletonEl.find('.fc-bgevent-container');\r\n this.highlightContainerEls = skeletonEl.find('.fc-highlight-container');\r\n this.businessContainerEls = skeletonEl.find('.fc-business-container');\r\n this.bookendCells(skeletonEl.find('tr')); // TODO: do this on string level\r\n this.el.append(skeletonEl);\r\n };\r\n TimeGrid.prototype.unrenderContentSkeleton = function () {\r\n if (this.contentSkeletonEl) {\r\n this.contentSkeletonEl.remove();\r\n this.contentSkeletonEl = null;\r\n this.colContainerEls = null;\r\n this.helperContainerEls = null;\r\n this.fgContainerEls = null;\r\n this.bgContainerEls = null;\r\n this.highlightContainerEls = null;\r\n this.businessContainerEls = null;\r\n }\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\r\n TimeGrid.prototype.groupSegsByCol = function (segs) {\r\n var segsByCol = [];\r\n var i;\r\n for (i = 0; i < this.colCnt; i++) {\r\n segsByCol.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segsByCol[segs[i].col].push(segs[i]);\r\n }\r\n return segsByCol;\r\n };\r\n // Given segments grouped by column, insert the segments' elements into a parallel array of container\r\n // elements, each living within a column.\r\n TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {\r\n var col;\r\n var segs;\r\n var i;\r\n for (col = 0; col < this.colCnt; col++) {\r\n segs = segsByCol[col];\r\n for (i = 0; i < segs.length; i++) {\r\n containerEls.eq(col).append(segs[i].el);\r\n }\r\n }\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.getNowIndicatorUnit = function () {\r\n return 'minute'; // will refresh on the minute\r\n };\r\n TimeGrid.prototype.renderNowIndicator = function (date) {\r\n // HACK: if date columns not ready for some reason (scheduler)\r\n if (!this.colContainerEls) {\r\n return;\r\n }\r\n // seg system might be overkill, but it handles scenario where line needs to be rendered\r\n // more than once because of columns with the same date (resources columns for example)\r\n var segs = this.componentFootprintToSegs(new ComponentFootprint_1.default(new UnzonedRange_1.default(date, date.valueOf() + 1), // protect against null range\r\n false // all-day\r\n ));\r\n var top = this.computeDateTop(date, date);\r\n var nodes = [];\r\n var i;\r\n // render lines within the columns\r\n for (i = 0; i < segs.length; i++) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.colContainerEls.eq(segs[i].col))[0]);\r\n }\r\n // render an arrow over the axis\r\n if (segs.length > 0) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.el.find('.fc-content-skeleton'))[0]);\r\n }\r\n this.nowIndicatorEls = $(nodes);\r\n };\r\n TimeGrid.prototype.unrenderNowIndicator = function () {\r\n if (this.nowIndicatorEls) {\r\n this.nowIndicatorEls.remove();\r\n this.nowIndicatorEls = null;\r\n }\r\n };\r\n /* Coordinates\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.slatCoordCache.build();\r\n if (isResize) {\r\n this.updateSegVerticals([].concat(this.eventRenderer.getSegs(), this.businessSegs || []));\r\n }\r\n };\r\n TimeGrid.prototype.getTotalSlatHeight = function () {\r\n return this.slatContainerEl.outerHeight();\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given date.\r\n // `ms` can be a millisecond UTC time OR a UTC moment.\r\n // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\r\n TimeGrid.prototype.computeDateTop = function (ms, startOfDayDate) {\r\n return this.computeTimeTop(moment.duration(ms - startOfDayDate.clone().stripTime()));\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\r\n TimeGrid.prototype.computeTimeTop = function (time) {\r\n var len = this.slatEls.length;\r\n var dateProfile = this.dateProfile;\r\n var slatCoverage = (time - dateProfile.minTime) / this.slotDuration; // floating-point value of # of slots covered\r\n var slatIndex;\r\n var slatRemainder;\r\n // compute a floating-point number for how many slats should be progressed through.\r\n // from 0 to number of slats (inclusive)\r\n // constrained because minTime/maxTime might be customized.\r\n slatCoverage = Math.max(0, slatCoverage);\r\n slatCoverage = Math.min(len, slatCoverage);\r\n // an integer index of the furthest whole slat\r\n // from 0 to number slats (*exclusive*, so len-1)\r\n slatIndex = Math.floor(slatCoverage);\r\n slatIndex = Math.min(slatIndex, len - 1);\r\n // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.\r\n // could be 1.0 if slatCoverage is covering *all* the slots\r\n slatRemainder = slatCoverage - slatIndex;\r\n return this.slatCoordCache.getTopPosition(slatIndex) +\r\n this.slatCoordCache.getHeight(slatIndex) * slatRemainder;\r\n };\r\n // Refreshes the CSS top/bottom coordinates for each segment element.\r\n // Works when called after initial render, after a window resize/zoom for example.\r\n TimeGrid.prototype.updateSegVerticals = function (segs) {\r\n this.computeSegVerticals(segs);\r\n this.assignSegVerticals(segs);\r\n };\r\n // For each segment in an array, computes and assigns its top and bottom properties\r\n TimeGrid.prototype.computeSegVerticals = function (segs) {\r\n var eventMinHeight = this.opt('agendaEventMinHeight');\r\n var i;\r\n var seg;\r\n var dayDate;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n dayDate = this.dayDates[seg.dayIndex];\r\n seg.top = this.computeDateTop(seg.startMs, dayDate);\r\n seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.endMs, dayDate));\r\n }\r\n };\r\n // Given segments that already have their top/bottom properties computed, applies those values to\r\n // the segments' elements.\r\n TimeGrid.prototype.assignSegVerticals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateSegVerticalCss(seg));\r\n }\r\n };\r\n // Generates an object with CSS properties for the top/bottom coordinates of a segment element\r\n TimeGrid.prototype.generateSegVerticalCss = function (seg) {\r\n return {\r\n top: seg.top,\r\n bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\r\n };\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.slatCoordCache.build();\r\n };\r\n TimeGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n // NOTE: don't clear slatCoordCache because we rely on it for computeTimeTop\r\n };\r\n TimeGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n var snapsPerSlot = this.snapsPerSlot;\r\n var colCoordCache = this.colCoordCache;\r\n var slatCoordCache = this.slatCoordCache;\r\n if (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {\r\n var colIndex = colCoordCache.getHorizontalIndex(leftOffset);\r\n var slatIndex = slatCoordCache.getVerticalIndex(topOffset);\r\n if (colIndex != null && slatIndex != null) {\r\n var slatTop = slatCoordCache.getTopOffset(slatIndex);\r\n var slatHeight = slatCoordCache.getHeight(slatIndex);\r\n var partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1\r\n var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat\r\n var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;\r\n var snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;\r\n var snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;\r\n return {\r\n col: colIndex,\r\n snap: snapIndex,\r\n component: this,\r\n left: colCoordCache.getLeftOffset(colIndex),\r\n right: colCoordCache.getRightOffset(colIndex),\r\n top: snapTop,\r\n bottom: snapBottom\r\n };\r\n }\r\n }\r\n };\r\n TimeGrid.prototype.getHitFootprint = function (hit) {\r\n var start = this.getCellDate(0, hit.col); // row=0\r\n var time = this.computeSnapTime(hit.snap); // pass in the snap-index\r\n var end;\r\n start.time(time);\r\n end = start.clone().add(this.snapDuration);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), false // all-day?\r\n );\r\n };\r\n // Given a row number of the grid, representing a \"snap\", returns a time (Duration) from its start-of-day\r\n TimeGrid.prototype.computeSnapTime = function (snapIndex) {\r\n return moment.duration(this.dateProfile.minTime + this.snapDuration * snapIndex);\r\n };\r\n TimeGrid.prototype.getHitEl = function (hit) {\r\n return this.colEls.eq(hit.col);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being dragged over the specified date(s).\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n TimeGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n if (seg) {\r\n if (eventFootprints.length) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n // signal that a helper has been rendered\r\n return true;\r\n }\r\n }\r\n else {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n }\r\n };\r\n // Unrenders any visual indication of an event being dragged\r\n TimeGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n TimeGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders any visual indication of an event being resized\r\n TimeGrid.prototype.unrenderEventResize = function () {\r\n this.helperRenderer.unrender();\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\r\n TimeGrid.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (this.opt('selectHelper')) {\r\n this.helperRenderer.renderComponentFootprint(componentFootprint);\r\n }\r\n else {\r\n this.renderHighlight(componentFootprint);\r\n }\r\n };\r\n // Unrenders any visual indication of a selection\r\n TimeGrid.prototype.unrenderSelection = function () {\r\n this.helperRenderer.unrender();\r\n this.unrenderHighlight();\r\n };\r\n return TimeGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = TimeGrid;\r\nTimeGrid.prototype.eventRendererClass = TimeGridEventRenderer_1.default;\r\nTimeGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nTimeGrid.prototype.helperRendererClass = TimeGridHelperRenderer_1.default;\r\nTimeGrid.prototype.fillRendererClass = TimeGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(TimeGrid);\r\nDayTableMixin_1.default.mixInto(TimeGrid);\r\n\r\n\r\n/***/ }),\r\n/* 228 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar BasicViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicViewDateProfileGenerator, _super);\r\n function BasicViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n BasicViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay); // an UnzonedRange\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n // year and month views should be aligned with weeks. this is already done for week\r\n if (/^(year|month)$/.test(currentRangeUnit)) {\r\n start.startOf('week');\r\n // make end-of-week if not already\r\n if (end.weekday()) {\r\n end.add(1, 'week').startOf('week'); // exclusively move backwards\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return BasicViewDateProfileGenerator;\r\n}(DateProfileGenerator_1.default));\r\nexports.default = BasicViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 229 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthViewDateProfileGenerator_1 = __webpack_require__(253);\r\n/* A month view with day cells running in rows (one-per-week) and columns\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MonthView = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthView, _super);\r\n function MonthView() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Overrides the default BasicView behavior to have special multi-week auto-height logic\r\n MonthView.prototype.setGridHeight = function (height, isAuto) {\r\n // if auto, make the height of each row the height that it would be if there were 6 weeks\r\n if (isAuto) {\r\n height *= this.dayGrid.rowCnt / 6;\r\n }\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\r\n };\r\n MonthView.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return date.month() !== moment.utc(dateProfile.currentUnzonedRange.startMs).month(); // TODO: optimize\r\n };\r\n return MonthView;\r\n}(BasicView_1.default));\r\nexports.default = MonthView;\r\nMonthView.prototype.dateProfileGeneratorClass = MonthViewDateProfileGenerator_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 230 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar View_1 = __webpack_require__(41);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar ListEventRenderer_1 = __webpack_require__(254);\r\nvar ListEventPointing_1 = __webpack_require__(255);\r\n/*\r\nResponsible for the scroller, and forwarding event-related actions into the \"grid\".\r\n*/\r\nvar ListView = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListView, _super);\r\n function ListView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.segSelector = '.fc-list-item'; // which elements accept event actions\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n ListView.prototype.renderSkeleton = function () {\r\n this.el.addClass('fc-list-view ' +\r\n this.calendar.theme.getClass('listView'));\r\n this.scroller.render();\r\n this.scroller.el.appendTo(this.el);\r\n this.contentEl = this.scroller.scrollEl; // shortcut\r\n };\r\n ListView.prototype.unrenderSkeleton = function () {\r\n this.scroller.destroy(); // will remove the Grid too\r\n };\r\n ListView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n if (!isAuto) {\r\n this.scroller.setHeight(this.computeScrollerHeight(totalHeight));\r\n }\r\n };\r\n ListView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n ListView.prototype.renderDates = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var dayStart = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs, true);\r\n var viewEnd = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.endMs, true);\r\n var dayDates = [];\r\n var dayRanges = [];\r\n while (dayStart < viewEnd) {\r\n dayDates.push(dayStart.clone());\r\n dayRanges.push(new UnzonedRange_1.default(dayStart, dayStart.clone().add(1, 'day')));\r\n dayStart.add(1, 'day');\r\n }\r\n this.dayDates = dayDates;\r\n this.dayRanges = dayRanges;\r\n // all real rendering happens in EventRenderer\r\n };\r\n // slices by day\r\n ListView.prototype.componentFootprintToSegs = function (footprint) {\r\n var dayRanges = this.dayRanges;\r\n var dayIndex;\r\n var segRange;\r\n var seg;\r\n var segs = [];\r\n for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {\r\n segRange = footprint.unzonedRange.intersect(dayRanges[dayIndex]);\r\n if (segRange) {\r\n seg = {\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n };\r\n segs.push(seg);\r\n // detect when footprint won't go fully into the next day,\r\n // and mutate the latest seg to the be the end.\r\n if (!seg.isEnd && !footprint.isAllDay &&\r\n dayIndex + 1 < dayRanges.length &&\r\n footprint.unzonedRange.endMs < dayRanges[dayIndex + 1].startMs + this.nextDayThreshold) {\r\n seg.endMs = footprint.unzonedRange.endMs;\r\n seg.isEnd = true;\r\n break;\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n ListView.prototype.renderEmptyMessage = function () {\r\n this.contentEl.html('
' + // TODO: try less wraps\r\n '
' +\r\n '
' +\r\n util_1.htmlEscape(this.opt('noEventsMessage')) +\r\n '
' +\r\n '
' +\r\n '
');\r\n };\r\n // render the event segments in the view\r\n ListView.prototype.renderSegList = function (allSegs) {\r\n var segsByDay = this.groupSegsByDay(allSegs); // sparse array\r\n var dayIndex;\r\n var daySegs;\r\n var i;\r\n var tableEl = $('
');\r\n var tbodyEl = tableEl.find('tbody');\r\n for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {\r\n daySegs = segsByDay[dayIndex];\r\n if (daySegs) {\r\n // append a day header\r\n tbodyEl.append(this.dayHeaderHtml(this.dayDates[dayIndex]));\r\n this.eventRenderer.sortEventSegs(daySegs);\r\n for (i = 0; i < daySegs.length; i++) {\r\n tbodyEl.append(daySegs[i].el); // append event row\r\n }\r\n }\r\n }\r\n this.contentEl.empty().append(tableEl);\r\n };\r\n // Returns a sparse array of arrays, segs grouped by their dayIndex\r\n ListView.prototype.groupSegsByDay = function (segs) {\r\n var segsByDay = []; // sparse array\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))\r\n .push(seg);\r\n }\r\n return segsByDay;\r\n };\r\n // generates the HTML for the day headers that live amongst the event rows\r\n ListView.prototype.dayHeaderHtml = function (dayDate) {\r\n var mainFormat = this.opt('listDayFormat');\r\n var altFormat = this.opt('listDayAltFormat');\r\n return '' +\r\n '' +\r\n (mainFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-main' }, util_1.htmlEscape(dayDate.format(mainFormat)) // inner HTML\r\n ) :\r\n '') +\r\n (altFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-alt' }, util_1.htmlEscape(dayDate.format(altFormat)) // inner HTML\r\n ) :\r\n '') +\r\n '' +\r\n '';\r\n };\r\n return ListView;\r\n}(View_1.default));\r\nexports.default = ListView;\r\nListView.prototype.eventRendererClass = ListEventRenderer_1.default;\r\nListView.prototype.eventPointingClass = ListEventPointing_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 231 */,\r\n/* 232 */,\r\n/* 233 */,\r\n/* 234 */,\r\n/* 235 */,\r\n/* 236 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar Calendar_1 = __webpack_require__(220);\r\n// for intentional side-effects\r\n__webpack_require__(10);\r\n__webpack_require__(47);\r\n__webpack_require__(256);\r\n__webpack_require__(257);\r\n__webpack_require__(260);\r\n__webpack_require__(261);\r\n__webpack_require__(262);\r\n__webpack_require__(263);\r\n$.fullCalendar = exportHooks;\r\n$.fn.fullCalendar = function (options) {\r\n var args = Array.prototype.slice.call(arguments, 1); // for a possible method call\r\n var res = this; // what this function will return (this jQuery object by default)\r\n this.each(function (i, _element) {\r\n var element = $(_element);\r\n var calendar = element.data('fullCalendar'); // get the existing calendar object (if any)\r\n var singleRes; // the returned value of this single method call\r\n // a method call\r\n if (typeof options === 'string') {\r\n if (options === 'getCalendar') {\r\n if (!i) {\r\n res = calendar;\r\n }\r\n }\r\n else if (options === 'destroy') {\r\n if (calendar) {\r\n calendar.destroy();\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else if (!calendar) {\r\n util_1.warn('Attempting to call a FullCalendar method on an element with no calendar.');\r\n }\r\n else if ($.isFunction(calendar[options])) {\r\n singleRes = calendar[options].apply(calendar, args);\r\n if (!i) {\r\n res = singleRes; // record the first method call result\r\n }\r\n if (options === 'destroy') {\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else {\r\n util_1.warn(\"'\" + options + \"' is an unknown FullCalendar method.\");\r\n }\r\n }\r\n else if (!calendar) {\r\n calendar = new Calendar_1.default(element, options);\r\n element.data('fullCalendar', calendar);\r\n calendar.render();\r\n }\r\n });\r\n return res;\r\n};\r\nmodule.exports = exportHooks;\r\n\r\n\r\n/***/ }),\r\n/* 237 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Model_1 = __webpack_require__(48);\r\nvar Component = /** @class */ (function (_super) {\r\n tslib_1.__extends(Component, _super);\r\n function Component() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Component.prototype.setElement = function (el) {\r\n this.el = el;\r\n this.bindGlobalHandlers();\r\n this.renderSkeleton();\r\n this.set('isInDom', true);\r\n };\r\n Component.prototype.removeElement = function () {\r\n this.unset('isInDom');\r\n this.unrenderSkeleton();\r\n this.unbindGlobalHandlers();\r\n this.el.remove();\r\n // NOTE: don't null-out this.el in case the View was destroyed within an API callback.\r\n // We don't null-out the View's other jQuery element references upon destroy,\r\n // so we shouldn't kill this.el either.\r\n };\r\n Component.prototype.bindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n Component.prototype.unbindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n /*\r\n NOTE: Can't have a `render` method. Read the deprecation notice in View::executeDateRender\r\n */\r\n // Renders the basic structure of the view before any content is rendered\r\n Component.prototype.renderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n // Unrenders the basic structure of the view\r\n Component.prototype.unrenderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n return Component;\r\n}(Model_1.default));\r\nexports.default = Component;\r\n\r\n\r\n/***/ }),\r\n/* 238 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Iterator = /** @class */ (function () {\r\n function Iterator(items) {\r\n this.items = items || [];\r\n }\r\n /* Calls a method on every item passing the arguments through */\r\n Iterator.prototype.proxyCall = function (methodName) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n var results = [];\r\n this.items.forEach(function (item) {\r\n results.push(item[methodName].apply(item, args));\r\n });\r\n return results;\r\n };\r\n return Iterator;\r\n}());\r\nexports.default = Iterator;\r\n\r\n\r\n/***/ }),\r\n/* 239 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/* Toolbar with buttons and title\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar Toolbar = /** @class */ (function () {\r\n function Toolbar(calendar, toolbarOptions) {\r\n this.el = null; // mirrors local `el`\r\n this.viewsWithButtons = [];\r\n this.calendar = calendar;\r\n this.toolbarOptions = toolbarOptions;\r\n }\r\n // method to update toolbar-specific options, not calendar-wide options\r\n Toolbar.prototype.setToolbarOptions = function (newToolbarOptions) {\r\n this.toolbarOptions = newToolbarOptions;\r\n };\r\n // can be called repeatedly and will rerender\r\n Toolbar.prototype.render = function () {\r\n var sections = this.toolbarOptions.layout;\r\n var el = this.el;\r\n if (sections) {\r\n if (!el) {\r\n el = this.el = $(\"
\");\r\n }\r\n else {\r\n el.empty();\r\n }\r\n el.append(this.renderSection('left'))\r\n .append(this.renderSection('right'))\r\n .append(this.renderSection('center'))\r\n .append('
');\r\n }\r\n else {\r\n this.removeElement();\r\n }\r\n };\r\n Toolbar.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n Toolbar.prototype.renderSection = function (position) {\r\n var _this = this;\r\n var calendar = this.calendar;\r\n var theme = calendar.theme;\r\n var optionsManager = calendar.optionsManager;\r\n var viewSpecManager = calendar.viewSpecManager;\r\n var sectionEl = $('
');\r\n var buttonStr = this.toolbarOptions.layout[position];\r\n var calendarCustomButtons = optionsManager.get('customButtons') || {};\r\n var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};\r\n var calendarButtonText = optionsManager.get('buttonText') || {};\r\n if (buttonStr) {\r\n $.each(buttonStr.split(' '), function (i, buttonGroupStr) {\r\n var groupChildren = $();\r\n var isOnlyButtons = true;\r\n var groupEl;\r\n $.each(buttonGroupStr.split(','), function (j, buttonName) {\r\n var customButtonProps;\r\n var viewSpec;\r\n var buttonClick;\r\n var buttonIcon; // only one of these will be set\r\n var buttonText; // \"\r\n var buttonInnerHtml;\r\n var buttonClasses;\r\n var buttonEl;\r\n var buttonAriaAttr;\r\n if (buttonName === 'title') {\r\n groupChildren = groupChildren.add($('

 

')); // we always want it to take up height\r\n isOnlyButtons = false;\r\n }\r\n else {\r\n if ((customButtonProps = calendarCustomButtons[buttonName])) {\r\n buttonClick = function (ev) {\r\n if (customButtonProps.click) {\r\n customButtonProps.click.call(buttonEl[0], ev);\r\n }\r\n };\r\n (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = customButtonProps.text);\r\n }\r\n else if ((viewSpec = viewSpecManager.getViewSpec(buttonName))) {\r\n _this.viewsWithButtons.push(buttonName);\r\n buttonClick = function () {\r\n calendar.changeView(buttonName);\r\n };\r\n (buttonText = viewSpec.buttonTextOverride) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = viewSpec.buttonTextDefault);\r\n }\r\n else if (calendar[buttonName]) {\r\n buttonClick = function () {\r\n calendar[buttonName]();\r\n };\r\n (buttonText = calendarButtonTextOverrides[buttonName]) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = calendarButtonText[buttonName]);\r\n // ^ everything else is considered default\r\n }\r\n if (buttonClick) {\r\n buttonClasses = [\r\n 'fc-' + buttonName + '-button',\r\n theme.getClass('button'),\r\n theme.getClass('stateDefault')\r\n ];\r\n if (buttonText) {\r\n buttonInnerHtml = util_1.htmlEscape(buttonText);\r\n buttonAriaAttr = '';\r\n }\r\n else if (buttonIcon) {\r\n buttonInnerHtml = \"\";\r\n buttonAriaAttr = ' aria-label=\"' + buttonName + '\"';\r\n }\r\n buttonEl = $(// type=\"button\" so that it doesn't submit a form\r\n '')\r\n .click(function (ev) {\r\n // don't process clicks for disabled buttons\r\n if (!buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonClick(ev);\r\n // after the click action, if the button becomes the \"active\" tab, or disabled,\r\n // it should never have a hover class, so remove it now.\r\n if (buttonEl.hasClass(theme.getClass('stateActive')) ||\r\n buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonEl.removeClass(theme.getClass('stateHover'));\r\n }\r\n }\r\n })\r\n .mousedown(function () {\r\n // the *down* effect (mouse pressed in).\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateDown'));\r\n })\r\n .mouseup(function () {\r\n // undo the *down* effect\r\n buttonEl.removeClass(theme.getClass('stateDown'));\r\n })\r\n .hover(function () {\r\n // the *hover* effect.\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateHover'));\r\n }, function () {\r\n // undo the *hover* effect\r\n buttonEl\r\n .removeClass(theme.getClass('stateHover'))\r\n .removeClass(theme.getClass('stateDown')); // if mouseleave happens before mouseup\r\n });\r\n groupChildren = groupChildren.add(buttonEl);\r\n }\r\n }\r\n });\r\n if (isOnlyButtons) {\r\n groupChildren\r\n .first().addClass(theme.getClass('cornerLeft')).end()\r\n .last().addClass(theme.getClass('cornerRight')).end();\r\n }\r\n if (groupChildren.length > 1) {\r\n groupEl = $('
');\r\n if (isOnlyButtons) {\r\n groupEl.addClass(theme.getClass('buttonGroup'));\r\n }\r\n groupEl.append(groupChildren);\r\n sectionEl.append(groupEl);\r\n }\r\n else {\r\n sectionEl.append(groupChildren); // 1 or 0 children\r\n }\r\n });\r\n }\r\n return sectionEl;\r\n };\r\n Toolbar.prototype.updateTitle = function (text) {\r\n if (this.el) {\r\n this.el.find('h2').text(text);\r\n }\r\n };\r\n Toolbar.prototype.activateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .addClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.deactivateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .removeClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.disableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', true)\r\n .addClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.enableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', false)\r\n .removeClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.getViewsWithButtons = function () {\r\n return this.viewsWithButtons;\r\n };\r\n return Toolbar;\r\n}());\r\nexports.default = Toolbar;\r\n\r\n\r\n/***/ }),\r\n/* 240 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar Model_1 = __webpack_require__(48);\r\nvar OptionsManager = /** @class */ (function (_super) {\r\n tslib_1.__extends(OptionsManager, _super);\r\n function OptionsManager(_calendar, overrides) {\r\n var _this = _super.call(this) || this;\r\n _this._calendar = _calendar;\r\n _this.overrides = $.extend({}, overrides); // make a copy\r\n _this.dynamicOverrides = {};\r\n _this.compute();\r\n return _this;\r\n }\r\n OptionsManager.prototype.add = function (newOptionHash) {\r\n var optionCnt = 0;\r\n var optionName;\r\n this.recordOverrides(newOptionHash); // will trigger this model's watchers\r\n for (optionName in newOptionHash) {\r\n optionCnt++;\r\n }\r\n // special-case handling of single option change.\r\n // if only one option change, `optionName` will be its name.\r\n if (optionCnt === 1) {\r\n if (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') {\r\n this._calendar.updateViewSize(true); // isResize=true\r\n return;\r\n }\r\n else if (optionName === 'defaultDate') {\r\n return; // can't change date this way. use gotoDate instead\r\n }\r\n else if (optionName === 'businessHours') {\r\n return; // this model already reacts to this\r\n }\r\n else if (/^(event|select)(Overlap|Constraint|Allow)$/.test(optionName)) {\r\n return; // doesn't affect rendering. only interactions.\r\n }\r\n else if (optionName === 'timezone') {\r\n this._calendar.view.flash('initialEvents');\r\n return;\r\n }\r\n }\r\n // catch-all. rerender the header and footer and rebuild/rerender the current view\r\n this._calendar.renderHeader();\r\n this._calendar.renderFooter();\r\n // even non-current views will be affected by this option change. do before rerender\r\n // TODO: detangle\r\n this._calendar.viewsByType = {};\r\n this._calendar.reinitView();\r\n };\r\n // Computes the flattened options hash for the calendar and assigns to `this.options`.\r\n // Assumes this.overrides and this.dynamicOverrides have already been initialized.\r\n OptionsManager.prototype.compute = function () {\r\n var locale;\r\n var localeDefaults;\r\n var isRTL;\r\n var dirDefaults;\r\n var rawOptions;\r\n locale = util_1.firstDefined(// explicit locale option given?\r\n this.dynamicOverrides.locale, this.overrides.locale);\r\n localeDefaults = locale_1.localeOptionHash[locale];\r\n if (!localeDefaults) {\r\n locale = options_1.globalDefaults.locale;\r\n localeDefaults = locale_1.localeOptionHash[locale] || {};\r\n }\r\n isRTL = util_1.firstDefined(// based on options computed so far, is direction RTL?\r\n this.dynamicOverrides.isRTL, this.overrides.isRTL, localeDefaults.isRTL, options_1.globalDefaults.isRTL);\r\n dirDefaults = isRTL ? options_1.rtlDefaults : {};\r\n this.dirDefaults = dirDefaults;\r\n this.localeDefaults = localeDefaults;\r\n rawOptions = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n dirDefaults,\r\n localeDefaults,\r\n this.overrides,\r\n this.dynamicOverrides\r\n ]);\r\n locale_1.populateInstanceComputableOptions(rawOptions); // fill in gaps with computed options\r\n this.reset(rawOptions);\r\n };\r\n // stores the new options internally, but does not rerender anything.\r\n OptionsManager.prototype.recordOverrides = function (newOptionHash) {\r\n var optionName;\r\n for (optionName in newOptionHash) {\r\n this.dynamicOverrides[optionName] = newOptionHash[optionName];\r\n }\r\n this._calendar.viewSpecManager.clearCache(); // the dynamic override invalidates the options in this cache, so just clear it\r\n this.compute(); // this.options needs to be recomputed after the dynamic override\r\n };\r\n return OptionsManager;\r\n}(Model_1.default));\r\nexports.default = OptionsManager;\r\n\r\n\r\n/***/ }),\r\n/* 241 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar ViewSpecManager = /** @class */ (function () {\r\n function ViewSpecManager(optionsManager, _calendar) {\r\n this.optionsManager = optionsManager;\r\n this._calendar = _calendar;\r\n this.clearCache();\r\n }\r\n ViewSpecManager.prototype.clearCache = function () {\r\n this.viewSpecCache = {};\r\n };\r\n // Gets information about how to create a view. Will use a cache.\r\n ViewSpecManager.prototype.getViewSpec = function (viewType) {\r\n var cache = this.viewSpecCache;\r\n return cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));\r\n };\r\n // Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\r\n // Preference is given to views that have corresponding buttons.\r\n ViewSpecManager.prototype.getUnitViewSpec = function (unit) {\r\n var viewTypes;\r\n var i;\r\n var spec;\r\n if ($.inArray(unit, util_1.unitsDesc) !== -1) {\r\n // put views that have buttons first. there will be duplicates, but oh well\r\n viewTypes = this._calendar.header.getViewsWithButtons(); // TODO: include footer as well?\r\n $.each(ViewRegistry_1.viewHash, function (viewType) {\r\n viewTypes.push(viewType);\r\n });\r\n for (i = 0; i < viewTypes.length; i++) {\r\n spec = this.getViewSpec(viewTypes[i]);\r\n if (spec) {\r\n if (spec.singleUnit === unit) {\r\n return spec;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n // Builds an object with information on how to create a given view\r\n ViewSpecManager.prototype.buildViewSpec = function (requestedViewType) {\r\n var viewOverrides = this.optionsManager.overrides.views || {};\r\n var specChain = []; // for the view. lowest to highest priority\r\n var defaultsChain = []; // for the view. lowest to highest priority\r\n var overridesChain = []; // for the view. lowest to highest priority\r\n var viewType = requestedViewType;\r\n var spec; // for the view\r\n var overrides; // for the view\r\n var durationInput;\r\n var duration;\r\n var unit;\r\n // iterate from the specific view definition to a more general one until we hit an actual View class\r\n while (viewType) {\r\n spec = ViewRegistry_1.viewHash[viewType];\r\n overrides = viewOverrides[viewType];\r\n viewType = null; // clear. might repopulate for another iteration\r\n if (typeof spec === 'function') {\r\n spec = { 'class': spec };\r\n }\r\n if (spec) {\r\n specChain.unshift(spec);\r\n defaultsChain.unshift(spec.defaults || {});\r\n durationInput = durationInput || spec.duration;\r\n viewType = viewType || spec.type;\r\n }\r\n if (overrides) {\r\n overridesChain.unshift(overrides); // view-specific option hashes have options at zero-level\r\n durationInput = durationInput || overrides.duration;\r\n viewType = viewType || overrides.type;\r\n }\r\n }\r\n spec = util_1.mergeProps(specChain);\r\n spec.type = requestedViewType;\r\n if (!spec['class']) {\r\n return false;\r\n }\r\n // fall back to top-level `duration` option\r\n durationInput = durationInput ||\r\n this.optionsManager.dynamicOverrides.duration ||\r\n this.optionsManager.overrides.duration;\r\n if (durationInput) {\r\n duration = moment.duration(durationInput);\r\n if (duration.valueOf()) {\r\n unit = util_1.computeDurationGreatestUnit(duration, durationInput);\r\n spec.duration = duration;\r\n spec.durationUnit = unit;\r\n // view is a single-unit duration, like \"week\" or \"day\"\r\n // incorporate options for this. lowest priority\r\n if (duration.as(unit) === 1) {\r\n spec.singleUnit = unit;\r\n overridesChain.unshift(viewOverrides[unit] || {});\r\n }\r\n }\r\n }\r\n spec.defaults = options_1.mergeOptions(defaultsChain);\r\n spec.overrides = options_1.mergeOptions(overridesChain);\r\n this.buildViewSpecOptions(spec);\r\n this.buildViewSpecButtonText(spec, requestedViewType);\r\n return spec;\r\n };\r\n // Builds and assigns a view spec's options object from its already-assigned defaults and overrides\r\n ViewSpecManager.prototype.buildViewSpecOptions = function (spec) {\r\n var optionsManager = this.optionsManager;\r\n spec.options = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n spec.defaults,\r\n optionsManager.dirDefaults,\r\n optionsManager.localeDefaults,\r\n optionsManager.overrides,\r\n spec.overrides,\r\n optionsManager.dynamicOverrides // dynamically set via setter. highest precedence\r\n ]);\r\n locale_1.populateInstanceComputableOptions(spec.options);\r\n };\r\n // Computes and assigns a view spec's buttonText-related options\r\n ViewSpecManager.prototype.buildViewSpecButtonText = function (spec, requestedViewType) {\r\n var optionsManager = this.optionsManager;\r\n // given an options object with a possible `buttonText` hash, lookup the buttonText for the\r\n // requested view, falling back to a generic unit entry like \"week\" or \"day\"\r\n function queryButtonText(options) {\r\n var buttonText = options.buttonText || {};\r\n return buttonText[requestedViewType] ||\r\n // view can decide to look up a certain key\r\n (spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) ||\r\n // a key like \"month\"\r\n (spec.singleUnit ? buttonText[spec.singleUnit] : null);\r\n }\r\n // highest to lowest priority\r\n spec.buttonTextOverride =\r\n queryButtonText(optionsManager.dynamicOverrides) ||\r\n queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence\r\n spec.overrides.buttonText; // `buttonText` for view-specific options is a string\r\n // highest to lowest priority. mirrors buildViewSpecOptions\r\n spec.buttonTextDefault =\r\n queryButtonText(optionsManager.localeDefaults) ||\r\n queryButtonText(optionsManager.dirDefaults) ||\r\n spec.defaults.buttonText || // a single string. from ViewSubclass.defaults\r\n queryButtonText(options_1.globalDefaults) ||\r\n (spec.duration ? this._calendar.humanizeDuration(spec.duration) : null) || // like \"3 days\"\r\n requestedViewType; // fall back to given view name\r\n };\r\n return ViewSpecManager;\r\n}());\r\nexports.default = ViewSpecManager;\r\n\r\n\r\n/***/ }),\r\n/* 242 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventPeriod_1 = __webpack_require__(243);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(calendar) {\r\n this.calendar = calendar;\r\n this.stickySource = new ArrayEventSource_1.default(calendar);\r\n this.otherSources = [];\r\n }\r\n EventManager.prototype.requestEvents = function (start, end, timezone, force) {\r\n if (force ||\r\n !this.currentPeriod ||\r\n !this.currentPeriod.isWithinRange(start, end) ||\r\n timezone !== this.currentPeriod.timezone) {\r\n this.setPeriod(// will change this.currentPeriod\r\n new EventPeriod_1.default(start, end, timezone));\r\n }\r\n return this.currentPeriod.whenReleased();\r\n };\r\n // Source Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.addSource = function (eventSource) {\r\n this.otherSources.push(eventSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.requestSource(eventSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeSource = function (doomedSource) {\r\n util_1.removeExact(this.otherSources, doomedSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeSource(doomedSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllSources = function () {\r\n this.otherSources = [];\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeAllSources(); // might release\r\n }\r\n };\r\n // Source Refetching\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.refetchSource = function (eventSource) {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeSource(eventSource);\r\n currentPeriod.requestSource(eventSource);\r\n currentPeriod.thaw();\r\n }\r\n };\r\n EventManager.prototype.refetchAllSources = function () {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeAllSources();\r\n currentPeriod.requestSources(this.getSources());\r\n currentPeriod.thaw();\r\n }\r\n };\r\n // Source Querying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getSources = function () {\r\n return [this.stickySource].concat(this.otherSources);\r\n };\r\n // like querySources, but accepts multple match criteria (like multiple IDs)\r\n EventManager.prototype.multiQuerySources = function (matchInputs) {\r\n // coerce into an array\r\n if (!matchInputs) {\r\n matchInputs = [];\r\n }\r\n else if (!$.isArray(matchInputs)) {\r\n matchInputs = [matchInputs];\r\n }\r\n var matchingSources = [];\r\n var i;\r\n // resolve raw inputs to real event source objects\r\n for (i = 0; i < matchInputs.length; i++) {\r\n matchingSources.push.apply(// append\r\n matchingSources, this.querySources(matchInputs[i]));\r\n }\r\n return matchingSources;\r\n };\r\n // matchInput can either by a real event source object, an ID, or the function/URL for the source.\r\n // returns an array of matching source objects.\r\n EventManager.prototype.querySources = function (matchInput) {\r\n var sources = this.otherSources;\r\n var i;\r\n var source;\r\n // given a proper event source object\r\n for (i = 0; i < sources.length; i++) {\r\n source = sources[i];\r\n if (source === matchInput) {\r\n return [source];\r\n }\r\n }\r\n // an ID match\r\n source = this.getSourceById(EventSource_1.default.normalizeId(matchInput));\r\n if (source) {\r\n return [source];\r\n }\r\n // parse as an event source\r\n matchInput = EventSourceParser_1.default.parse(matchInput, this.calendar);\r\n if (matchInput) {\r\n return $.grep(sources, function (source) {\r\n return isSourcesEquivalent(matchInput, source);\r\n });\r\n }\r\n };\r\n /*\r\n ID assumed to already be normalized\r\n */\r\n EventManager.prototype.getSourceById = function (id) {\r\n return $.grep(this.otherSources, function (source) {\r\n return source.id && source.id === id;\r\n })[0];\r\n };\r\n // Event-Period\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.setPeriod = function (eventPeriod) {\r\n if (this.currentPeriod) {\r\n this.unbindPeriod(this.currentPeriod);\r\n this.currentPeriod = null;\r\n }\r\n this.currentPeriod = eventPeriod;\r\n this.bindPeriod(eventPeriod);\r\n eventPeriod.requestSources(this.getSources());\r\n };\r\n EventManager.prototype.bindPeriod = function (eventPeriod) {\r\n this.listenTo(eventPeriod, 'release', function (eventsPayload) {\r\n this.trigger('release', eventsPayload);\r\n });\r\n };\r\n EventManager.prototype.unbindPeriod = function (eventPeriod) {\r\n this.stopListeningTo(eventPeriod);\r\n };\r\n // Event Getting/Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getEventDefByUid = function (uid) {\r\n if (this.currentPeriod) {\r\n return this.currentPeriod.getEventDefByUid(uid);\r\n }\r\n };\r\n EventManager.prototype.addEventDef = function (eventDef, isSticky) {\r\n if (isSticky) {\r\n this.stickySource.addEventDef(eventDef);\r\n }\r\n if (this.currentPeriod) {\r\n this.currentPeriod.addEventDef(eventDef); // might release\r\n }\r\n };\r\n EventManager.prototype.removeEventDefsById = function (eventId) {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeEventDefsById(eventId);\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeEventDefsById(eventId); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllEventDefs = function () {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeAllEventDefs();\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeAllEventDefs();\r\n }\r\n };\r\n // Event Mutating\r\n // -----------------------------------------------------------------------------------------------------------------\r\n /*\r\n Returns an undo function.\r\n */\r\n EventManager.prototype.mutateEventsWithId = function (eventDefId, eventDefMutation) {\r\n var currentPeriod = this.currentPeriod;\r\n var eventDefs;\r\n var undoFuncs = [];\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n eventDefs = currentPeriod.getEventDefsById(eventDefId);\r\n eventDefs.forEach(function (eventDef) {\r\n // add/remove esp because id might change\r\n currentPeriod.removeEventDef(eventDef);\r\n undoFuncs.push(eventDefMutation.mutateSingle(eventDef));\r\n currentPeriod.addEventDef(eventDef);\r\n });\r\n currentPeriod.thaw();\r\n return function () {\r\n currentPeriod.freeze();\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n currentPeriod.removeEventDef(eventDefs[i]);\r\n undoFuncs[i]();\r\n currentPeriod.addEventDef(eventDefs[i]);\r\n }\r\n currentPeriod.thaw();\r\n };\r\n }\r\n return function () { };\r\n };\r\n /*\r\n copies and then mutates\r\n */\r\n EventManager.prototype.buildMutatedEventInstanceGroup = function (eventDefId, eventDefMutation) {\r\n var eventDefs = this.getEventDefsById(eventDefId);\r\n var i;\r\n var defCopy;\r\n var allInstances = [];\r\n for (i = 0; i < eventDefs.length; i++) {\r\n defCopy = eventDefs[i].clone();\r\n if (defCopy instanceof SingleEventDef_1.default) {\r\n eventDefMutation.mutateSingle(defCopy);\r\n allInstances.push.apply(allInstances, // append\r\n defCopy.buildInstances());\r\n }\r\n }\r\n return new EventInstanceGroup_1.default(allInstances);\r\n };\r\n // Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.freeze = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.freeze();\r\n }\r\n };\r\n EventManager.prototype.thaw = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.thaw();\r\n }\r\n };\r\n // methods that simply forward to EventPeriod\r\n EventManager.prototype.getEventDefsById = function (eventDefId) {\r\n return this.currentPeriod.getEventDefsById(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstances = function () {\r\n return this.currentPeriod.getEventInstances();\r\n };\r\n EventManager.prototype.getEventInstancesWithId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithId(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithoutId(eventDefId);\r\n };\r\n return EventManager;\r\n}());\r\nexports.default = EventManager;\r\nEmitterMixin_1.default.mixInto(EventManager);\r\nListenerMixin_1.default.mixInto(EventManager);\r\nfunction isSourcesEquivalent(source0, source1) {\r\n return source0.getPrimitive() === source1.getPrimitive();\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 243 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventPeriod = /** @class */ (function () {\r\n function EventPeriod(start, end, timezone) {\r\n this.pendingCnt = 0;\r\n this.freezeDepth = 0;\r\n this.stuntedReleaseCnt = 0;\r\n this.releaseCnt = 0;\r\n this.start = start;\r\n this.end = end;\r\n this.timezone = timezone;\r\n this.unzonedRange = new UnzonedRange_1.default(start.clone().stripZone(), end.clone().stripZone());\r\n this.requestsByUid = {};\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n }\r\n EventPeriod.prototype.isWithinRange = function (start, end) {\r\n // TODO: use a range util function?\r\n return !start.isBefore(this.start) && !end.isAfter(this.end);\r\n };\r\n // Requesting and Purging\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.requestSources = function (sources) {\r\n this.freeze();\r\n for (var i = 0; i < sources.length; i++) {\r\n this.requestSource(sources[i]);\r\n }\r\n this.thaw();\r\n };\r\n EventPeriod.prototype.requestSource = function (source) {\r\n var _this = this;\r\n var request = { source: source, status: 'pending', eventDefs: null };\r\n this.requestsByUid[source.uid] = request;\r\n this.pendingCnt += 1;\r\n source.fetch(this.start, this.end, this.timezone).then(function (eventDefs) {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'completed';\r\n request.eventDefs = eventDefs;\r\n _this.addEventDefs(eventDefs);\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n }, function () {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'failed';\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n });\r\n };\r\n EventPeriod.prototype.purgeSource = function (source) {\r\n var request = this.requestsByUid[source.uid];\r\n if (request) {\r\n delete this.requestsByUid[source.uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n this.pendingCnt--;\r\n this.tryRelease();\r\n }\r\n else if (request.status === 'completed') {\r\n request.eventDefs.forEach(this.removeEventDef.bind(this));\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.purgeAllSources = function () {\r\n var requestsByUid = this.requestsByUid;\r\n var uid;\r\n var request;\r\n var completedCnt = 0;\r\n for (uid in requestsByUid) {\r\n request = requestsByUid[uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n }\r\n else if (request.status === 'completed') {\r\n completedCnt++;\r\n }\r\n }\r\n this.requestsByUid = {};\r\n this.pendingCnt = 0;\r\n if (completedCnt) {\r\n this.removeAllEventDefs(); // might release\r\n }\r\n };\r\n // Event Definitions\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventDefByUid = function (eventDefUid) {\r\n return this.eventDefsByUid[eventDefUid];\r\n };\r\n EventPeriod.prototype.getEventDefsById = function (eventDefId) {\r\n var a = this.eventDefsById[eventDefId];\r\n if (a) {\r\n return a.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.addEventDefs = function (eventDefs) {\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n this.addEventDef(eventDefs[i]);\r\n }\r\n };\r\n EventPeriod.prototype.addEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefId = eventDef.id;\r\n var eventDefs = eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []);\r\n var eventInstances = eventDef.buildInstances(this.unzonedRange);\r\n var i;\r\n eventDefs.push(eventDef);\r\n this.eventDefsByUid[eventDef.uid] = eventDef;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n this.addEventInstance(eventInstances[i], eventDefId);\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDefsById = function (eventDefId) {\r\n var _this = this;\r\n this.getEventDefsById(eventDefId).forEach(function (eventDef) {\r\n _this.removeEventDef(eventDef);\r\n });\r\n };\r\n EventPeriod.prototype.removeAllEventDefs = function () {\r\n var isEmpty = $.isEmptyObject(this.eventDefsByUid);\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n if (!isEmpty) {\r\n this.tryRelease();\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefs = eventDefsById[eventDef.id];\r\n delete this.eventDefsByUid[eventDef.uid];\r\n if (eventDefs) {\r\n util_1.removeExact(eventDefs, eventDef);\r\n if (!eventDefs.length) {\r\n delete eventDefsById[eventDef.id];\r\n }\r\n this.removeEventInstancesForDef(eventDef);\r\n }\r\n };\r\n // Event Instances\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventInstances = function () {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n return eventInstances;\r\n };\r\n EventPeriod.prototype.getEventInstancesWithId = function (eventDefId) {\r\n var eventInstanceGroup = this.eventInstanceGroupsById[eventDefId];\r\n if (eventInstanceGroup) {\r\n return eventInstanceGroup.eventInstances.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var matchingInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n if (id !== eventDefId) {\r\n matchingInstances.push.apply(matchingInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n }\r\n return matchingInstances;\r\n };\r\n EventPeriod.prototype.addEventInstance = function (eventInstance, eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDefId] ||\r\n (eventInstanceGroupsById[eventDefId] = new EventInstanceGroup_1.default());\r\n eventInstanceGroup.eventInstances.push(eventInstance);\r\n this.tryRelease();\r\n };\r\n EventPeriod.prototype.removeEventInstancesForDef = function (eventDef) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDef.id];\r\n var removeCnt;\r\n if (eventInstanceGroup) {\r\n removeCnt = util_1.removeMatching(eventInstanceGroup.eventInstances, function (currentEventInstance) {\r\n return currentEventInstance.def === eventDef;\r\n });\r\n if (!eventInstanceGroup.eventInstances.length) {\r\n delete eventInstanceGroupsById[eventDef.id];\r\n }\r\n if (removeCnt) {\r\n this.tryRelease();\r\n }\r\n }\r\n };\r\n // Releasing and Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.tryRelease = function () {\r\n if (!this.pendingCnt) {\r\n if (!this.freezeDepth) {\r\n this.release();\r\n }\r\n else {\r\n this.stuntedReleaseCnt++;\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.release = function () {\r\n this.releaseCnt++;\r\n this.trigger('release', this.eventInstanceGroupsById);\r\n };\r\n EventPeriod.prototype.whenReleased = function () {\r\n var _this = this;\r\n if (this.releaseCnt) {\r\n return Promise_1.default.resolve(this.eventInstanceGroupsById);\r\n }\r\n else {\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.one('release', onResolve);\r\n });\r\n }\r\n };\r\n EventPeriod.prototype.freeze = function () {\r\n if (!(this.freezeDepth++)) {\r\n this.stuntedReleaseCnt = 0;\r\n }\r\n };\r\n EventPeriod.prototype.thaw = function () {\r\n if (!(--this.freezeDepth) && this.stuntedReleaseCnt && !this.pendingCnt) {\r\n this.release();\r\n }\r\n };\r\n return EventPeriod;\r\n}());\r\nexports.default = EventPeriod;\r\nEmitterMixin_1.default.mixInto(EventPeriod);\r\n\r\n\r\n/***/ }),\r\n/* 244 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\n/* Creates a clone of an element and lets it track the mouse as it moves\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MouseFollower = /** @class */ (function () {\r\n function MouseFollower(sourceEl, options) {\r\n this.isFollowing = false;\r\n this.isHidden = false;\r\n this.isAnimating = false; // doing the revert animation?\r\n this.options = options = options || {};\r\n this.sourceEl = sourceEl;\r\n this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent\r\n }\r\n // Causes the element to start following the mouse\r\n MouseFollower.prototype.start = function (ev) {\r\n if (!this.isFollowing) {\r\n this.isFollowing = true;\r\n this.y0 = util_1.getEvY(ev);\r\n this.x0 = util_1.getEvX(ev);\r\n this.topDelta = 0;\r\n this.leftDelta = 0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n if (util_1.getEvIsTouch(ev)) {\r\n this.listenTo($(document), 'touchmove', this.handleMove);\r\n }\r\n else {\r\n this.listenTo($(document), 'mousemove', this.handleMove);\r\n }\r\n }\r\n };\r\n // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.\r\n // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.\r\n MouseFollower.prototype.stop = function (shouldRevert, callback) {\r\n var _this = this;\r\n var revertDuration = this.options.revertDuration;\r\n var complete = function () {\r\n _this.isAnimating = false;\r\n _this.removeElement();\r\n _this.top0 = _this.left0 = null; // reset state for future updatePosition calls\r\n if (callback) {\r\n callback();\r\n }\r\n };\r\n if (this.isFollowing && !this.isAnimating) {\r\n this.isFollowing = false;\r\n this.stopListeningTo($(document));\r\n if (shouldRevert && revertDuration && !this.isHidden) {\r\n this.isAnimating = true;\r\n this.el.animate({\r\n top: this.top0,\r\n left: this.left0\r\n }, {\r\n duration: revertDuration,\r\n complete: complete\r\n });\r\n }\r\n else {\r\n complete();\r\n }\r\n }\r\n };\r\n // Gets the tracking element. Create it if necessary\r\n MouseFollower.prototype.getEl = function () {\r\n var el = this.el;\r\n if (!el) {\r\n el = this.el = this.sourceEl.clone()\r\n .addClass(this.options.additionalClass || '')\r\n .css({\r\n position: 'absolute',\r\n visibility: '',\r\n display: this.isHidden ? 'none' : '',\r\n margin: 0,\r\n right: 'auto',\r\n bottom: 'auto',\r\n width: this.sourceEl.width(),\r\n height: this.sourceEl.height(),\r\n opacity: this.options.opacity || '',\r\n zIndex: this.options.zIndex\r\n });\r\n // we don't want long taps or any mouse interaction causing selection/menus.\r\n // would use preventSelection(), but that prevents selectstart, causing problems.\r\n el.addClass('fc-unselectable');\r\n el.appendTo(this.parentEl);\r\n }\r\n return el;\r\n };\r\n // Removes the tracking element if it has already been created\r\n MouseFollower.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n // Update the CSS position of the tracking element\r\n MouseFollower.prototype.updatePosition = function () {\r\n var sourceOffset;\r\n var origin;\r\n this.getEl(); // ensure this.el\r\n // make sure origin info was computed\r\n if (this.top0 == null) {\r\n sourceOffset = this.sourceEl.offset();\r\n origin = this.el.offsetParent().offset();\r\n this.top0 = sourceOffset.top - origin.top;\r\n this.left0 = sourceOffset.left - origin.left;\r\n }\r\n this.el.css({\r\n top: this.top0 + this.topDelta,\r\n left: this.left0 + this.leftDelta\r\n });\r\n };\r\n // Gets called when the user moves the mouse\r\n MouseFollower.prototype.handleMove = function (ev) {\r\n this.topDelta = util_1.getEvY(ev) - this.y0;\r\n this.leftDelta = util_1.getEvX(ev) - this.x0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n };\r\n // Temporarily makes the tracking element invisible. Can be called before following starts\r\n MouseFollower.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.isHidden = true;\r\n if (this.el) {\r\n this.el.hide();\r\n }\r\n }\r\n };\r\n // Show the tracking element after it has been temporarily hidden\r\n MouseFollower.prototype.show = function () {\r\n if (this.isHidden) {\r\n this.isHidden = false;\r\n this.updatePosition();\r\n this.getEl().show();\r\n }\r\n };\r\n return MouseFollower;\r\n}());\r\nexports.default = MouseFollower;\r\nListenerMixin_1.default.mixInto(MouseFollower);\r\n\r\n\r\n/***/ }),\r\n/* 245 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateClicking = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateClicking, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - getHitEl\r\n */\r\n function DateClicking(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateClicking.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateClicking.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (!component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (!component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day clicking.\r\n DateClicking.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var dayClickHit; // null if invalid dayClick\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n dayClickHit = dragListener.origHit;\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n // if user dragged to another cell at any point, it can no longer be a dayClick\r\n if (!isOrig) {\r\n dayClickHit = null;\r\n }\r\n },\r\n hitOut: function () {\r\n dayClickHit = null;\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n var componentFootprint;\r\n if (!isCancelled && dayClickHit) {\r\n componentFootprint = component.getSafeHitFootprint(dayClickHit);\r\n if (componentFootprint) {\r\n _this.view.triggerDayClick(componentFootprint, component.getHitEl(dayClickHit), ev);\r\n }\r\n }\r\n }\r\n });\r\n // because dragListener won't be called with any time delay, \"dragging\" will begin immediately,\r\n // which will kill any touchmoving/scrolling. Prevent this.\r\n dragListener.shouldCancelTouchScroll = false;\r\n dragListener.scrollAlwaysKills = true;\r\n return dragListener;\r\n };\r\n return DateClicking;\r\n}(Interaction_1.default));\r\nexports.default = DateClicking;\r\n\r\n\r\n/***/ }),\r\n/* 246 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/*\r\nOnly handles foreground segs.\r\nDoes not own rendering. Use for low-level util methods by TimeGrid.\r\n*/\r\nvar TimeGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridEventRenderer, _super);\r\n function TimeGridEventRenderer(timeGrid, fillRenderer) {\r\n var _this = _super.call(this, timeGrid, fillRenderer) || this;\r\n _this.timeGrid = timeGrid;\r\n return _this;\r\n }\r\n TimeGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);\r\n };\r\n // Given an array of foreground segments, render a DOM element for each, computes position,\r\n // and attaches to the column inner-container elements.\r\n TimeGridEventRenderer.prototype.renderFgSegsIntoContainers = function (segs, containerEls) {\r\n var segsByCol;\r\n var col;\r\n segsByCol = this.timeGrid.groupSegsByCol(segs);\r\n for (col = 0; col < this.timeGrid.colCnt; col++) {\r\n this.updateFgSegCoords(segsByCol[col]);\r\n }\r\n this.timeGrid.attachSegsByCol(segsByCol, containerEls);\r\n };\r\n TimeGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n if (this.fgSegs) {\r\n this.fgSegs.forEach(function (seg) {\r\n seg.el.remove();\r\n });\r\n }\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('noMeridiemTimeFormat'); // like \"6:30\" (no AM/PM)\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n // Renders the HTML for a single event segment's default rendering\r\n TimeGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var componentFootprint = seg.footprint.componentFootprint;\r\n var isAllDay = componentFootprint.isAllDay;\r\n var eventDef = seg.footprint.eventDef;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeText;\r\n var fullTimeText; // more verbose time text. for the print stylesheet\r\n var startTimeText; // just the start time text\r\n classes.unshift('fc-time-grid-event', 'fc-v-event');\r\n // if the event appears to span more than one day...\r\n if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n // Don't display time text on segments that run entirely through a day.\r\n // That would appear as midnight-midnight and would look dumb.\r\n // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\r\n if (seg.isStart || seg.isEnd) {\r\n var zonedStart = calendar.msToMoment(seg.startMs);\r\n var zonedEnd = calendar.msToMoment(seg.endMs);\r\n timeText = this._getTimeText(zonedStart, zonedEnd, isAllDay);\r\n fullTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, 'LT');\r\n startTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, null, false); // displayEnd=false\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeText = this.getTimeText(seg.footprint);\r\n fullTimeText = this.getTimeText(seg.footprint, 'LT');\r\n startTimeText = this.getTimeText(seg.footprint, null, false); // displayEnd=false\r\n }\r\n return '' +\r\n '
' +\r\n (timeText ?\r\n '
' +\r\n '' + util_1.htmlEscape(timeText) + '' +\r\n '
' :\r\n '') +\r\n (eventDef.title ?\r\n '
' +\r\n util_1.htmlEscape(eventDef.title) +\r\n '
' :\r\n '') +\r\n '
' +\r\n '
' +\r\n /* TODO: write CSS for this\r\n (isResizableFromStart ?\r\n '
' :\r\n ''\r\n ) +\r\n */\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n // Given segments that are assumed to all live in the *same column*,\r\n // compute their verical/horizontal coordinates and assign to their elements.\r\n TimeGridEventRenderer.prototype.updateFgSegCoords = function (segs) {\r\n this.timeGrid.computeSegVerticals(segs); // horizontals relies on this\r\n this.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array\r\n this.timeGrid.assignSegVerticals(segs);\r\n this.assignFgSegHorizontals(segs);\r\n };\r\n // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\r\n // NOTE: Also reorders the given array by date!\r\n TimeGridEventRenderer.prototype.computeFgSegHorizontals = function (segs) {\r\n var levels;\r\n var level0;\r\n var i;\r\n this.sortEventSegs(segs); // order by certain criteria\r\n levels = buildSlotSegLevels(segs);\r\n computeForwardSlotSegs(levels);\r\n if ((level0 = levels[0])) {\r\n for (i = 0; i < level0.length; i++) {\r\n computeSlotSegPressures(level0[i]);\r\n }\r\n for (i = 0; i < level0.length; i++) {\r\n this.computeFgSegForwardBack(level0[i], 0, 0);\r\n }\r\n }\r\n };\r\n // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\r\n // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\r\n // seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\r\n //\r\n // The segment might be part of a \"series\", which means consecutive segments with the same pressure\r\n // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\r\n // segments behind this one in the current series, and `seriesBackwardCoord` is the starting\r\n // coordinate of the first segment in the series.\r\n TimeGridEventRenderer.prototype.computeFgSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {\r\n var forwardSegs = seg.forwardSegs;\r\n var i;\r\n if (seg.forwardCoord === undefined) {\r\n if (!forwardSegs.length) {\r\n // if there are no forward segments, this segment should butt up against the edge\r\n seg.forwardCoord = 1;\r\n }\r\n else {\r\n // sort highest pressure first\r\n this.sortForwardSegs(forwardSegs);\r\n // this segment's forwardCoord will be calculated from the backwardCoord of the\r\n // highest-pressure forward segment.\r\n this.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\r\n seg.forwardCoord = forwardSegs[0].backwardCoord;\r\n }\r\n // calculate the backwardCoord from the forwardCoord. consider the series\r\n seg.backwardCoord = seg.forwardCoord -\r\n (seg.forwardCoord - seriesBackwardCoord) / // available width for series\r\n (seriesBackwardPressure + 1); // # of segments in the series\r\n // use this segment's coordinates to computed the coordinates of the less-pressurized\r\n // forward segments\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n this.computeFgSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);\r\n }\r\n }\r\n };\r\n TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {\r\n forwardSegs.sort(util_1.proxy(this, 'compareForwardSegs'));\r\n };\r\n // A cmp function for determining which forward segment to rely on more when computing coordinates.\r\n TimeGridEventRenderer.prototype.compareForwardSegs = function (seg1, seg2) {\r\n // put higher-pressure first\r\n return seg2.forwardPressure - seg1.forwardPressure ||\r\n // put segments that are closer to initial edge first (and favor ones with no coords yet)\r\n (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) ||\r\n // do normal sorting...\r\n this.compareEventSegs(seg1, seg2);\r\n };\r\n // Given foreground event segments that have already had their position coordinates computed,\r\n // assigns position-related CSS values to their elements.\r\n TimeGridEventRenderer.prototype.assignFgSegHorizontals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateFgSegHorizontalCss(seg));\r\n // if the height is short, add a className for alternate styling\r\n if (seg.bottom - seg.top < 30) {\r\n seg.el.addClass('fc-short');\r\n }\r\n }\r\n };\r\n // Generates an object with CSS properties/values that should be applied to an event segment element.\r\n // Contains important positioning-related properties that should be applied to any event element, customized or not.\r\n TimeGridEventRenderer.prototype.generateFgSegHorizontalCss = function (seg) {\r\n var shouldOverlap = this.opt('slotEventOverlap');\r\n var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point\r\n var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point\r\n var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first\r\n var isRTL = this.timeGrid.isRTL;\r\n var left; // amount of space from left edge, a fraction of the total width\r\n var right; // amount of space from right edge, a fraction of the total width\r\n if (shouldOverlap) {\r\n // double the width, but don't go beyond the maximum forward coordinate (1.0)\r\n forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);\r\n }\r\n if (isRTL) {\r\n left = 1 - forwardCoord;\r\n right = backwardCoord;\r\n }\r\n else {\r\n left = backwardCoord;\r\n right = 1 - forwardCoord;\r\n }\r\n props.zIndex = seg.level + 1; // convert from 0-base to 1-based\r\n props.left = left * 100 + '%';\r\n props.right = right * 100 + '%';\r\n if (shouldOverlap && seg.forwardPressure) {\r\n // add padding to the edge so that forward stacked events don't cover the resizer's icon\r\n props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width\r\n }\r\n return props;\r\n };\r\n return TimeGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = TimeGridEventRenderer;\r\n// Builds an array of segments \"levels\". The first level will be the leftmost tier of segments if the calendar is\r\n// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.\r\nfunction buildSlotSegLevels(segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // go through all the levels and stop on the first level where there are no collisions\r\n for (j = 0; j < levels.length; j++) {\r\n if (!computeSlotSegCollisions(seg, levels[j]).length) {\r\n break;\r\n }\r\n }\r\n seg.level = j;\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n return levels;\r\n}\r\n// For every segment, figure out the other segments that are in subsequent\r\n// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs\r\nfunction computeForwardSlotSegs(levels) {\r\n var i;\r\n var level;\r\n var j;\r\n var seg;\r\n var k;\r\n for (i = 0; i < levels.length; i++) {\r\n level = levels[i];\r\n for (j = 0; j < level.length; j++) {\r\n seg = level[j];\r\n seg.forwardSegs = [];\r\n for (k = i + 1; k < levels.length; k++) {\r\n computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);\r\n }\r\n }\r\n }\r\n}\r\n// Figure out which path forward (via seg.forwardSegs) results in the longest path until\r\n// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure\r\nfunction computeSlotSegPressures(seg) {\r\n var forwardSegs = seg.forwardSegs;\r\n var forwardPressure = 0;\r\n var i;\r\n var forwardSeg;\r\n if (seg.forwardPressure === undefined) {\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n forwardSeg = forwardSegs[i];\r\n // figure out the child's maximum forward path\r\n computeSlotSegPressures(forwardSeg);\r\n // either use the existing maximum, or use the child's forward pressure\r\n // plus one (for the forwardSeg itself)\r\n forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);\r\n }\r\n seg.forwardPressure = forwardPressure;\r\n }\r\n}\r\n// Find all the segments in `otherSegs` that vertically collide with `seg`.\r\n// Append into an optionally-supplied `results` array and return.\r\nfunction computeSlotSegCollisions(seg, otherSegs, results) {\r\n if (results === void 0) { results = []; }\r\n for (var i = 0; i < otherSegs.length; i++) {\r\n if (isSlotSegCollision(seg, otherSegs[i])) {\r\n results.push(otherSegs[i]);\r\n }\r\n }\r\n return results;\r\n} \t\r\n// Do these segments occupy the same vertical space?\r\nfunction isSlotSegCollision(seg1, seg2) {\r\n/////////////// stop physics of segments\r\n// return seg1.bottom > seg2.top && seg1.top < seg2.bottom;\r\n return 0;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 247 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar TimeGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridHelperRenderer, _super);\r\n function TimeGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var i;\r\n var seg;\r\n var sourceEl;\r\n // TODO: not good to call eventRenderer this way\r\n this.eventRenderer.renderFgSegsIntoContainers(segs, this.component.helperContainerEls);\r\n // Try to make the segment that is in the same row as sourceSeg look the same\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (sourceSeg && sourceSeg.col === seg.col) {\r\n sourceEl = sourceSeg.el;\r\n seg.el.css({\r\n left: sourceEl.css('left'),\r\n right: sourceEl.css('right'),\r\n 'margin-left': sourceEl.css('margin-left'),\r\n 'margin-right': sourceEl.css('margin-right')\r\n });\r\n }\r\n helperNodes.push(seg.el[0]);\r\n }\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return TimeGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = TimeGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 248 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar TimeGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridFillRenderer, _super);\r\n function TimeGridFillRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var timeGrid = this.component;\r\n var containerEls;\r\n // TODO: more efficient lookup\r\n if (type === 'bgEvent') {\r\n containerEls = timeGrid.bgContainerEls;\r\n }\r\n else if (type === 'businessHours') {\r\n containerEls = timeGrid.businessContainerEls;\r\n }\r\n else if (type === 'highlight') {\r\n containerEls = timeGrid.highlightContainerEls;\r\n }\r\n timeGrid.updateSegVerticals(segs);\r\n timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);\r\n return segs.map(function (seg) {\r\n return seg.el[0];\r\n });\r\n };\r\n return TimeGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = TimeGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 249 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/* A rectangular panel that is absolutely positioned over other content\r\n------------------------------------------------------------------------------------------------------------------------\r\nOptions:\r\n - className (string)\r\n - content (HTML string or jQuery element set)\r\n - parentEl\r\n - top\r\n - left\r\n - right (the x coord of where the right edge should be. not a \"CSS\" right)\r\n - autoHide (boolean)\r\n - show (callback)\r\n - hide (callback)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Popover = /** @class */ (function () {\r\n function Popover(options) {\r\n this.isHidden = true;\r\n this.margin = 10; // the space required between the popover and the edges of the scroll container\r\n this.options = options || {};\r\n }\r\n // Shows the popover on the specified position. Renders it if not already\r\n Popover.prototype.show = function () {\r\n if (this.isHidden) {\r\n if (!this.el) {\r\n this.render();\r\n }\r\n this.el.show();\r\n this.position();\r\n this.isHidden = false;\r\n this.trigger('show');\r\n }\r\n };\r\n // Hides the popover, through CSS, but does not remove it from the DOM\r\n Popover.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.el.hide();\r\n this.isHidden = true;\r\n this.trigger('hide');\r\n }\r\n };\r\n // Creates `this.el` and renders content inside of it\r\n Popover.prototype.render = function () {\r\n var _this = this;\r\n var options = this.options;\r\n this.el = $('
')\r\n .addClass(options.className || '')\r\n .css({\r\n // position initially to the top left to avoid creating scrollbars\r\n top: 0,\r\n left: 0\r\n })\r\n .append(options.content)\r\n .appendTo(options.parentEl);\r\n // when a click happens on anything inside with a 'fc-close' className, hide the popover\r\n this.el.on('click', '.fc-close', function () {\r\n _this.hide();\r\n });\r\n if (options.autoHide) {\r\n this.listenTo($(document), 'mousedown', this.documentMousedown);\r\n }\r\n };\r\n // Triggered when the user clicks *anywhere* in the document, for the autoHide feature\r\n Popover.prototype.documentMousedown = function (ev) {\r\n // only hide the popover if the click happened outside the popover\r\n if (this.el && !$(ev.target).closest(this.el).length) {\r\n this.hide();\r\n }\r\n };\r\n // Hides and unregisters any handlers\r\n Popover.prototype.removeElement = function () {\r\n this.hide();\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n this.stopListeningTo($(document), 'mousedown');\r\n };\r\n // Positions the popover optimally, using the top/left/right options\r\n Popover.prototype.position = function () {\r\n var options = this.options;\r\n var origin = this.el.offsetParent().offset();\r\n var width = this.el.outerWidth();\r\n var height = this.el.outerHeight();\r\n var windowEl = $(window);\r\n var viewportEl = util_1.getScrollParent(this.el);\r\n var viewportTop;\r\n var viewportLeft;\r\n var viewportOffset;\r\n var top; // the \"position\" (not \"offset\") values for the popover\r\n var left; //\r\n // compute top and left\r\n top = options.top || 0;\r\n if (options.left !== undefined) {\r\n left = options.left;\r\n }\r\n else if (options.right !== undefined) {\r\n left = options.right - width; // derive the left value from the right value\r\n }\r\n else {\r\n left = 0;\r\n }\r\n if (viewportEl.is(window) || viewportEl.is(document)) {\r\n viewportEl = windowEl;\r\n viewportTop = 0; // the window is always at the top left\r\n viewportLeft = 0; // (and .offset() won't work if called here)\r\n }\r\n else {\r\n viewportOffset = viewportEl.offset();\r\n viewportTop = viewportOffset.top;\r\n viewportLeft = viewportOffset.left;\r\n }\r\n // if the window is scrolled, it causes the visible area to be further down\r\n viewportTop += windowEl.scrollTop();\r\n viewportLeft += windowEl.scrollLeft();\r\n // constrain to the view port. if constrained by two edges, give precedence to top/left\r\n if (options.viewportConstrain !== false) {\r\n top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);\r\n top = Math.max(top, viewportTop + this.margin);\r\n left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);\r\n left = Math.max(left, viewportLeft + this.margin);\r\n }\r\n this.el.css({\r\n top: top - origin.top,\r\n left: left - origin.left\r\n });\r\n };\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n // TODO: better code reuse for this. Repeat code\r\n Popover.prototype.trigger = function (name) {\r\n if (this.options[name]) {\r\n this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\r\n }\r\n };\r\n return Popover;\r\n}());\r\nexports.default = Popover;\r\nListenerMixin_1.default.mixInto(Popover);\r\n\r\n\r\n/***/ }),\r\n/* 250 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/* Event-rendering methods for the DayGrid class\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridEventRenderer, _super);\r\n function DayGridEventRenderer(dayGrid, fillRenderer) {\r\n var _this = _super.call(this, dayGrid, fillRenderer) || this;\r\n _this.dayGrid = dayGrid;\r\n return _this;\r\n }\r\n DayGridEventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n // don't render timed background events\r\n eventRanges = $.grep(eventRanges, function (eventRange) {\r\n return eventRange.eventDef.isAllDay();\r\n });\r\n _super.prototype.renderBgRanges.call(this, eventRanges);\r\n };\r\n // Renders the given foreground event segments onto the grid\r\n DayGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n var rowStructs = this.rowStructs = this.renderSegRows(segs);\r\n // append to each row's content skeleton\r\n this.dayGrid.rowEls.each(function (i, rowNode) {\r\n $(rowNode).find('.fc-content-skeleton > table').append(rowStructs[i].tbodyEl);\r\n });\r\n };\r\n // Unrenders all currently rendered foreground event segments\r\n DayGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n var rowStructs = this.rowStructs || [];\r\n var rowStruct;\r\n while ((rowStruct = rowStructs.pop())) {\r\n rowStruct.tbodyEl.remove();\r\n }\r\n this.rowStructs = null;\r\n };\r\n // Uses the given events array to generate elements that should be appended to each row's content skeleton.\r\n // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\r\n // PRECONDITION: each segment shoud already have a rendered and assigned `.el`\r\n DayGridEventRenderer.prototype.renderSegRows = function (segs) {\r\n var rowStructs = [];\r\n var segRows;\r\n var row;\r\n segRows = this.groupSegRows(segs); // group into nested arrays\r\n // iterate each row of segment groupings\r\n for (row = 0; row < segRows.length; row++) {\r\n rowStructs.push(this.renderSegRow(row, segRows[row]));\r\n }\r\n return rowStructs;\r\n };\r\n // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains\r\n // the segments. Returns object with a bunch of internal data about how the render was calculated.\r\n // NOTE: modifies rowSegs\r\n DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {\r\n var colCnt = this.dayGrid.colCnt;\r\n var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\r\n var levelCnt = Math.max(1, segLevels.length); // ensure at least one level\r\n var tbody = $('');\r\n var segMatrix = []; // lookup for which segments are rendered into which level+col cells\r\n var cellMatrix = []; // lookup for all elements of the level+col matrix\r\n var loneCellMatrix = []; // lookup for elements that only take up a single column\r\n var i;\r\n var levelSegs;\r\n var col;\r\n var tr;\r\n var j;\r\n var seg;\r\n var td;\r\n // populates empty cells from the current column (`col`) to `endCol`\r\n function emptyCellsUntil(endCol) {\r\n while (col < endCol) {\r\n // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\r\n td = (loneCellMatrix[i - 1] || [])[col];\r\n if (td) {\r\n td.attr('rowspan', parseInt(td.attr('rowspan') || 1, 10) + 1);\r\n }\r\n else {\r\n td = $('');\r\n tr.append(td);\r\n }\r\n cellMatrix[i][col] = td;\r\n loneCellMatrix[i][col] = td;\r\n col++;\r\n }\r\n }\r\n for (i = 0; i < levelCnt; i++) {\r\n levelSegs = segLevels[i];\r\n col = 0;\r\n tr = $('');\r\n segMatrix.push([]);\r\n cellMatrix.push([]);\r\n loneCellMatrix.push([]);\r\n // levelCnt might be 1 even though there are no actual levels. protect against this.\r\n // this single empty row is useful for styling.\r\n if (levelSegs) {\r\n for (j = 0; j < levelSegs.length; j++) {\r\n seg = levelSegs[j];\r\n emptyCellsUntil(seg.leftCol);\r\n // create a container that occupies or more columns. append the event element.\r\n td = $('').append(seg.el);\r\n if (seg.leftCol !== seg.rightCol) {\r\n td.attr('colspan', seg.rightCol - seg.leftCol + 1);\r\n }\r\n else {\r\n loneCellMatrix[i][col] = td;\r\n }\r\n while (col <= seg.rightCol) {\r\n cellMatrix[i][col] = td;\r\n segMatrix[i][col] = seg;\r\n col++;\r\n }\r\n tr.append(td);\r\n }\r\n }\r\n emptyCellsUntil(colCnt); // finish off the row\r\n this.dayGrid.bookendCells(tr);\r\n tbody.append(tr);\r\n }\r\n return {\r\n row: row,\r\n tbodyEl: tbody,\r\n cellMatrix: cellMatrix,\r\n segMatrix: segMatrix,\r\n segLevels: segLevels,\r\n segs: rowSegs\r\n };\r\n };\r\n // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\r\n // NOTE: modifies segs\r\n DayGridEventRenderer.prototype.buildSegLevels = function (segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n // Give preference to elements with certain criteria, so they have\r\n // a chance to be closer to the top.\r\n this.sortEventSegs(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // loop through levels, starting with the topmost, until the segment doesn't collide with other segments\r\n for (j = 0; j < levels.length; j++) {\r\n if (!isDaySegCollision(seg, levels[j])) {\r\n break;\r\n }\r\n }\r\n // `j` now holds the desired subrow index\r\n seg.level = j;\r\n // create new level array if needed and append segment\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n // order segments left-to-right. very important if calendar is RTL\r\n for (j = 0; j < levels.length; j++) {\r\n levels[j].sort(compareDaySegCols);\r\n }\r\n return levels;\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\r\n DayGridEventRenderer.prototype.groupSegRows = function (segs) {\r\n var segRows = [];\r\n var i;\r\n for (i = 0; i < this.dayGrid.rowCnt; i++) {\r\n segRows.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segRows[segs[i].row].push(segs[i]);\r\n }\r\n return segRows;\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n DayGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('extraSmallTimeFormat'); // like \"6p\" or \"6:30p\"\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day\r\n };\r\n // Builds the HTML to be used for the default element for an individual segment\r\n DayGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var isAllDay = seg.footprint.componentFootprint.isAllDay;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && isAllDay &&\r\n seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && isAllDay &&\r\n seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeHtml = '';\r\n var timeText;\r\n var titleHtml;\r\n classes.unshift('fc-day-grid-event', 'fc-h-event');\r\n // Only display a timed events time if it is the starting segment\r\n if (seg.isStart) {\r\n timeText = this.getTimeText(seg.footprint);\r\n if (timeText) {\r\n timeHtml = '' + util_1.htmlEscape(timeText) + '';\r\n }\r\n }\r\n titleHtml =\r\n '' +\r\n (util_1.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height\r\n '';\r\n return '' +\r\n '
' +\r\n (this.dayGrid.isRTL ?\r\n titleHtml + ' ' + timeHtml : // put a natural space in between\r\n timeHtml + ' ' + titleHtml //\r\n ) +\r\n '
' +\r\n (isResizableFromStart ?\r\n '
' :\r\n '') +\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n return DayGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = DayGridEventRenderer;\r\n// Computes whether two segments' columns collide. They are assumed to be in the same row.\r\nfunction isDaySegCollision(seg, otherSegs) {\r\n var i;\r\n var otherSeg;\r\n for (i = 0; i < otherSegs.length; i++) {\r\n otherSeg = otherSegs[i];\r\n if (otherSeg.leftCol <= seg.rightCol &&\r\n otherSeg.rightCol >= seg.leftCol) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n// A cmp function for determining the leftmost event\r\nfunction compareDaySegCols(a, b) {\r\n return a.leftCol - b.leftCol;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 251 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar DayGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridHelperRenderer, _super);\r\n function DayGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Renders a mock \"helper\" event. `sourceSeg` is the associated internal segment object. It can be null.\r\n DayGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var rowStructs;\r\n // TODO: not good to call eventRenderer this way\r\n rowStructs = this.eventRenderer.renderSegRows(segs);\r\n // inject each new event skeleton into each associated row\r\n this.component.rowEls.each(function (row, rowNode) {\r\n var rowEl = $(rowNode); // the .fc-row\r\n var skeletonEl = $('
'); // will be absolutely positioned\r\n var skeletonTopEl;\r\n var skeletonTop;\r\n // If there is an original segment, match the top position. Otherwise, put it at the row's top level\r\n if (sourceSeg && sourceSeg.row === row) {\r\n skeletonTop = sourceSeg.el.position().top;\r\n }\r\n else {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton tbody');\r\n if (!skeletonTopEl.length) {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton table');\r\n }\r\n skeletonTop = skeletonTopEl.position().top;\r\n }\r\n skeletonEl.css('top', skeletonTop)\r\n .find('table')\r\n .append(rowStructs[row].tbodyEl);\r\n rowEl.append(skeletonEl);\r\n helperNodes.push(skeletonEl[0]);\r\n });\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return DayGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = DayGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 252 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar DayGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridFillRenderer, _super);\r\n function DayGridFillRenderer() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.fillSegTag = 'td'; // override the default tag name\r\n return _this;\r\n }\r\n DayGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var nodes = [];\r\n var i;\r\n var seg;\r\n var skeletonEl;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n skeletonEl = this.renderFillRow(type, seg);\r\n this.component.rowEls.eq(seg.row).append(skeletonEl);\r\n nodes.push(skeletonEl[0]);\r\n }\r\n return nodes;\r\n };\r\n // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\r\n DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {\r\n var colCnt = this.component.colCnt;\r\n var startCol = seg.leftCol;\r\n var endCol = seg.rightCol + 1;\r\n var className;\r\n var skeletonEl;\r\n var trEl;\r\n if (type === 'businessHours') {\r\n className = 'bgevent';\r\n }\r\n else {\r\n className = type.toLowerCase();\r\n }\r\n skeletonEl = $('
' +\r\n '
' +\r\n '
');\r\n trEl = skeletonEl.find('tr');\r\n if (startCol > 0) {\r\n trEl.append('');\r\n }\r\n trEl.append(seg.el.attr('colspan', endCol - startCol));\r\n if (endCol < colCnt) {\r\n trEl.append('');\r\n }\r\n this.component.bookendCells(trEl);\r\n return skeletonEl;\r\n };\r\n return DayGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = DayGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 253 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar MonthViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthViewDateProfileGenerator, _super);\r\n function MonthViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n MonthViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay);\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n var rowCnt;\r\n // ensure 6 weeks\r\n if (this.opt('fixedWeekCount')) {\r\n rowCnt = Math.ceil(// could be partial weeks due to hiddenDays\r\n end.diff(start, 'weeks', true) // dontRound=true\r\n );\r\n end.add(6 - rowCnt, 'weeks');\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return MonthViewDateProfileGenerator;\r\n}(BasicViewDateProfileGenerator_1.default));\r\nexports.default = MonthViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 254 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nvar ListEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventRenderer, _super);\r\n function ListEventRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ListEventRenderer.prototype.renderFgSegs = function (segs) {\r\n if (!segs.length) {\r\n this.component.renderEmptyMessage();\r\n }\r\n else {\r\n this.component.renderSegList(segs);\r\n }\r\n };\r\n // generates the HTML for a single event row\r\n ListEventRenderer.prototype.fgSegHtml = function (seg) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var eventFootprint = seg.footprint;\r\n var eventDef = eventFootprint.eventDef;\r\n var componentFootprint = eventFootprint.componentFootprint;\r\n var url = eventDef.url;\r\n var classes = ['fc-list-item'].concat(this.getClasses(eventDef));\r\n var bgColor = this.getBgColor(eventDef);\r\n var timeHtml;\r\n if (componentFootprint.isAllDay) {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n else if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n if (seg.isStart || seg.isEnd) {\r\n timeHtml = util_1.htmlEscape(this._getTimeText(calendar.msToMoment(seg.startMs), calendar.msToMoment(seg.endMs), componentFootprint.isAllDay));\r\n }\r\n else {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeHtml = util_1.htmlEscape(this.getTimeText(eventFootprint));\r\n }\r\n if (url) {\r\n classes.push('fc-has-url');\r\n }\r\n return '' +\r\n (this.displayEventTime ?\r\n '' +\r\n (timeHtml || '') +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(eventDef.title || '') +\r\n '' +\r\n '' +\r\n '';\r\n };\r\n // like \"4:00am\"\r\n ListEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('mediumTimeFormat');\r\n };\r\n return ListEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = ListEventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 255 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar ListEventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventPointing, _super);\r\n function ListEventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // for events with a url, the whole should be clickable,\r\n // but it's impossible to wrap with an tag. simulate this.\r\n ListEventPointing.prototype.handleClick = function (seg, ev) {\r\n var url;\r\n _super.prototype.handleClick.call(this, seg, ev); // might prevent the default action\r\n // not clicking on or within an with an href\r\n if (!$(ev.target).closest('a[href]').length) {\r\n url = seg.footprint.eventDef.url;\r\n if (url && !ev.isDefaultPrevented()) {\r\n window.location.href = url; // simulate link click\r\n }\r\n }\r\n };\r\n return ListEventPointing;\r\n}(EventPointing_1.default));\r\nexports.default = ListEventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 256 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nEventSourceParser_1.default.registerClass(ArrayEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(FuncEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(JsonFeedEventSource_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 257 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar Bootstrap3Theme_1 = __webpack_require__(258);\r\nvar Bootstrap4Theme_1 = __webpack_require__(259);\r\nThemeRegistry_1.defineThemeSystem('standard', StandardTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('jquery-ui', JqueryUiTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap3', Bootstrap3Theme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap4', Bootstrap4Theme_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 258 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap3Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap3Theme, _super);\r\n function Bootstrap3Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap3Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap3Theme;\r\nBootstrap3Theme.prototype.classes = {\r\n widget: 'fc-bootstrap3',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-default',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'panel panel-default',\r\n popoverHeader: 'panel-heading',\r\n popoverContent: 'panel-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `panel` class b/c don't want margins/radius. only border color.\r\n headerRow: 'panel-default',\r\n dayRow: 'panel-default',\r\n // list view\r\n listView: 'panel panel-default'\r\n};\r\nBootstrap3Theme.prototype.baseIconClass = 'glyphicon';\r\nBootstrap3Theme.prototype.iconClasses = {\r\n close: 'glyphicon-remove',\r\n prev: 'glyphicon-chevron-left',\r\n next: 'glyphicon-chevron-right',\r\n prevYear: 'glyphicon-backward',\r\n nextYear: 'glyphicon-forward'\r\n};\r\nBootstrap3Theme.prototype.iconOverrideOption = 'bootstrapGlyphicons';\r\nBootstrap3Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapGlyphicon';\r\nBootstrap3Theme.prototype.iconOverridePrefix = 'glyphicon-';\r\n\r\n\r\n/***/ }),\r\n/* 259 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap4Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap4Theme, _super);\r\n function Bootstrap4Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap4Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap4Theme;\r\nBootstrap4Theme.prototype.classes = {\r\n widget: 'fc-bootstrap4',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'table-active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-primary',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'card card-primary',\r\n popoverHeader: 'card-header',\r\n popoverContent: 'card-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `table` class b/c don't want margins/padding/structure. only border color.\r\n headerRow: 'table-bordered',\r\n dayRow: 'table-bordered',\r\n // list view\r\n listView: 'card card-primary'\r\n};\r\nBootstrap4Theme.prototype.baseIconClass = 'fa';\r\nBootstrap4Theme.prototype.iconClasses = {\r\n close: 'fa-times',\r\n prev: 'fa-chevron-left',\r\n next: 'fa-chevron-right',\r\n prevYear: 'fa-angle-double-left',\r\n nextYear: 'fa-angle-double-right'\r\n};\r\nBootstrap4Theme.prototype.iconOverrideOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverridePrefix = 'fa-';\r\n\r\n\r\n/***/ }),\r\n/* 260 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthView_1 = __webpack_require__(229);\r\nViewRegistry_1.defineView('basic', {\r\n 'class': BasicView_1.default\r\n});\r\nViewRegistry_1.defineView('basicDay', {\r\n type: 'basic',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('basicWeek', {\r\n type: 'basic',\r\n duration: { weeks: 1 }\r\n});\r\nViewRegistry_1.defineView('month', {\r\n 'class': MonthView_1.default,\r\n duration: { months: 1 },\r\n defaults: {\r\n fixedWeekCount: true\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 261 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar AgendaView_1 = __webpack_require__(226);\r\nViewRegistry_1.defineView('agenda', {\r\n 'class': AgendaView_1.default,\r\n defaults: {\r\n allDaySlot: true,\r\n slotDuration: '00:30:00',\r\n slotEventOverlap: true // a bad name. confused with overlap/constraint system\r\n }\r\n});\r\nViewRegistry_1.defineView('agendaDay', {\r\n type: 'agenda',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('agendaWeek', {\r\n type: 'agenda',\r\n duration: { weeks: 1 }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 262 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar ListView_1 = __webpack_require__(230);\r\nViewRegistry_1.defineView('list', {\r\n 'class': ListView_1.default,\r\n buttonTextKey: 'list',\r\n defaults: {\r\n buttonText: 'list',\r\n listDayFormat: 'LL',\r\n noEventsMessage: 'No events to display'\r\n }\r\n});\r\nViewRegistry_1.defineView('listDay', {\r\n type: 'list',\r\n duration: { days: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header\r\n }\r\n});\r\nViewRegistry_1.defineView('listWeek', {\r\n type: 'list',\r\n duration: { weeks: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd',\r\n listDayAltFormat: 'LL'\r\n }\r\n});\r\nViewRegistry_1.defineView('listMonth', {\r\n type: 'list',\r\n duration: { month: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\nViewRegistry_1.defineView('listYear', {\r\n type: 'list',\r\n duration: { year: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 263 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n\r\n\r\n/***/ })\r\n/******/ ]);\r\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/fullcalendar/fullcalendar.js\n// module id = 299\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('full-calendar-reserve',{attrs:{\"show-modal\":_vm.showModalReserve,\"startDate\":_vm.startDate,\"endDate\":_vm.endDate,\"resources-checkboxes\":_vm.resourcesCheckboxes,\"number-of-resources\":_vm.selectedResources.length,\"add-reservation\":_vm.addReservation},on:{\"close\":function($event){_vm.showModalReserve = false}}}),_vm._v(\" \"),_c('full-calendar-info',{attrs:{\"show-modal\":_vm.showModalInfo,\"reservation\":_vm.reservation,\"cancel\":_vm.cancelReservation,\"update\":_vm.updateReservation,\"refreshTasks\":_vm.refreshTasks,\"nodes\":_vm.nodes},on:{\"close\":function($event){_vm.showModalInfo = false},\"handleError\":_vm.handleError}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-f3e7eb0c\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/FullCalendar.vue\n// module id = 300\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-73dcc08a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./MySchedule.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./MySchedule.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./MySchedule.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-73dcc08a\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./MySchedule.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-73dcc08a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/MySchedule.vue\n// module id = 301\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"range-select-container\"},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"scale-transition\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},model:{value:(_vm.menu),callback:function ($$v) {_vm.menu=$$v},expression:\"menu\"}},[_c('v-text-field',{staticClass:\"date-input\",attrs:{\"slot\":\"activator\",\"label\":\"Schedule start date\",\"prepend-icon\":\"event\",\"readonly\":\"\"},slot:\"activator\",model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}}),_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.menu = false; _vm.changeSchedule()}},model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}})],1),_vm._v(\" \"),_c('v-text-field',{staticClass:\"range-input\",attrs:{\"min\":\"1\",\"step\":\"1\",\"type\":\"number\",\"label\":\"Schedule range in days\"},on:{\"input\":function($event){return _vm.changeSchedule()}},model:{value:(_vm.range),callback:function ($$v) {_vm.range=$$v},expression:\"range\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"container-header\"},[_c('div',{staticClass:\"left-table-header\"},[_vm._m(0),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":\"Change all\"},on:{\"change\":_vm.changeAll},model:{value:(_vm.changeAllCheckbox),callback:function ($$v) {_vm.changeAllCheckbox=$$v},expression:\"changeAllCheckbox\"}})],1)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"right-table-header\",attrs:{\"id\":\"right-header\"}},[_c('table',[_c('tbody',_vm._l((_vm.tableContent.header),function(header){return _c('th',{key:header.value},[_vm._v(_vm._s(header.value))])}),0)]),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',_vm._l((_vm.tableContent.hours),function(hours){return _c('td',{key:hours.id,staticClass:\"hours\"},[_vm._v(_vm._s(hours.value))])}),0)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"container-content\"},[_c('div',{staticClass:\"left-table\",attrs:{\"id\":\"left-table\"}},[_c('div',{key:_vm.leftTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('div',{staticClass:\"node-cell\"},[_c('v-checkbox',{staticClass:\"small-checkbox-node\",attrs:{\"color\":\"success\",\"label\":(\"\" + (node.nodeName)),\"input-value\":\"\"},on:{\"change\":function($event){return _vm.changeWholeNode(node.nodeName)}},model:{value:(node.selected),callback:function ($$v) {_vm.$set(node, \"selected\", $$v)},expression:\"node.selected\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"mx-2 small-button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"info\"},on:{\"click\":function($event){return _vm.toggle(node)}}},[(node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"add\")]):_vm._e(),_vm._v(\" \"),(!node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"remove\")]):_vm._e()],1)],1)])])]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":(\"\" + (_vm.tableContent.resources[resourceUUID].name))},on:{\"change\":function($event){return _vm.changeResource(node.nodeName, resourceUUID)}},model:{value:(_vm.tableContent.resources[resourceUUID].selected),callback:function ($$v) {_vm.$set(_vm.tableContent.resources[resourceUUID], \"selected\", $$v)},expression:\"tableContent.resources[resourceUUID].selected\"}})],1)])}),0)])}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"right-table\",attrs:{\"id\":\"right-table\"}},[_c('div',{key:_vm.rightTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',_vm._l((node.slots),function(slot){return _c('td',{key:slot.id},[_vm._v(_vm._s(slot.value))])}),0)]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},_vm._l((_vm.tableContent.resources[resourceUUID].slots),function(slot){return _c('td',{key:slot.id,class:{ 'reserved': slot.reserved, 'userReservation': slot.userReservation }},[_vm._v(_vm._s(slot.value))])}),0)}),0)])}),0)])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',[_c('tbody',[_c('th',{staticClass:\"first-column\"},[_vm._v(\"Resources\")])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-73dcc08a\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/MySchedule.vue\n// module id = 306\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-snackbar',{attrs:{\"color\":\"error\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"white\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"\\n Close\\n \")])],1),_vm._v(\" \"),(!_vm.showSchedule)?_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=true;}}},[_vm._v(\"\\n Select visible GPUs\\n \")]):_vm._e(),_vm._v(\" \"),_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showSchedule),expression:\"showSchedule\"}],attrs:{\"id\":\"schedule_section\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=false}}},[_vm._v(\"\\n Hide schedule\\n \")]),_vm._v(\" \"),_c('MySchedule',{attrs:{\"parsed-nodes\":_vm.parsedNodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)},\"loadResources\":function($event){return _vm.loadResources.apply(void 0, arguments)}}})],1),_vm._v(\" \"),_c('section',{attrs:{\"id\":\"calendar_section\"}},[_c('FullCalendar',{attrs:{\"update-calendar\":_vm.updateCalendar,\"selected-resources\":_vm.selectedResources,\"nodes\":_vm.nodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-a758ccee\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/ReservationsOverview.vue\n// module id = 307\n// module chunks = 1","var normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./NodesOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./NodesOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-18fc6060\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./NodesOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/NodesOverview.vue\n// module id = 308\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-14692e23\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WatchGenerator.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchGenerator.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchGenerator.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-14692e23\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./WatchGenerator.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/nodes_overview/WatchGenerator.vue\n// module id = 309\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4fc23b68\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WatchBox.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchBox.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchBox.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4fc23b68\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./WatchBox.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/nodes_overview/WatchBox.vue\n// module id = 311\n// module chunks = 1","var normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./LineChart.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./LineChart.vue\"\n/* template */\nvar __vue_template__ = null\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/nodes_overview/LineChart.vue\n// module id = 313\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"select_line\"},[_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.nodes},model:{value:(_vm.selectedNode),callback:function ($$v) {_vm.selectedNode=$$v},expression:\"selectedNode\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.resourceTypes},model:{value:(_vm.selectedResourceType),callback:function ($$v) {_vm.selectedResourceType=$$v},expression:\"selectedResourceType\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.metrics},model:{value:(_vm.selectedMetric),callback:function ($$v) {_vm.selectedMetric=$$v},expression:\"selectedMetric\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),(_vm.showProcesses === true)?_c('div',{staticClass:\"table_box\"},[_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.processes,\"item-key\":\"pid\",\"hide-actions\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',{on:{\"click\":function($event){props.expanded = !props.expanded}}},[_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.index))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.owner))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.command))])])]}},{key:\"expand\",fn:function(props){return [_c('v-card',{attrs:{\"flat\":\"\"}},[_c('v-card-text',[_vm._v(\"GPU UUID: \"+_vm._s(props.item.uuid))])],1)]}}],null,false,51043860)})],1):_c('div',[_c('LineChart',{staticClass:\"chart_box\",attrs:{\"chart-data\":_vm.metricData,\"options\":_vm.metricOptions,\"rerender-chart\":_vm.rerenderChart,\"update-chart\":_vm.updateChart}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4fc23b68\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/nodes_overview/WatchBox.vue\n// module id = 318\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"watch_table\"},[_vm._l((_vm.watches),function(watch){return _c('WatchBox',{key:watch.id,staticClass:\"watch_box\",attrs:{\"default-node\":watch.defaultNode,\"default-resource-type\":watch.defaultResourceType,\"default-metric\":watch.defaultMetric,\"resources-indexes\":_vm.resourcesIndexes,\"chart-datasets\":_vm.chartDatasets,\"update-chart\":_vm.updateChart,\"time\":_vm.time},on:{\"changeDefaultNode\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultNode.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultResourceType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultResourceType.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultMetric\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultMetric.apply(void 0, [ watch.id ].concat( argsArray ))},\"deleteWatch\":function($event){return _vm.deleteWatch(watch.id)}}})}),_vm._v(\" \"),_c('div',{staticClass:\"button_box\"},[_c('v-btn',{staticClass:\"big_button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"#b8bcc2\"},on:{\"click\":_vm.addWatch}},[_c('v-icon',{attrs:{\"size\":\"100px\",\"dark\":\"\"}},[_vm._v(\"add\")])],1)],1)],2)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-14692e23\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/nodes_overview/WatchGenerator.vue\n// module id = 319\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('WatchGenerator')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-18fc6060\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/NodesOverview.vue\n// module id = 320\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-c0181bc6\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TasksOverview.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TasksOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TasksOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c0181bc6\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TasksOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/TasksOverview.vue\n// module id = 321\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-c5e32eee\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskCreate.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskCreate.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskCreate.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c5e32eee\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskCreate.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-c5e32eee\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskCreate.vue\n// module id = 323\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-68056994\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLine.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLine.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLine.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-68056994\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLine.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-68056994\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLine.vue\n// module id = 325\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-dcbdcc6c\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLineParameter.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineParameter.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineParameter.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-dcbdcc6c\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLineParameter.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLineParameter.vue\n// module id = 330\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newParameter,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-dcbdcc6c\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLineParameter.vue\n// module id = 332\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-3a9cfdb2\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLineEnvVariable.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineEnvVariable.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineEnvVariable.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3a9cfdb2\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLineEnvVariable.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLineEnvVariable.vue\n// module id = 333\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newEnvVariable,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-3a9cfdb2\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLineEnvVariable.vue\n// module id = 335\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ed523d5c\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLineTfConfig.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineTfConfig.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineTfConfig.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ed523d5c\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLineTfConfig.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ed523d5c\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLineTfConfig.vue\n// module id = 336\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1f240f3d\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TfConfigEdit.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TfConfigEdit.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TfConfigEdit.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1f240f3d\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TfConfigEdit.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1f240f3d\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TfConfigEdit.vue\n// module id = 338\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"TF_CONFIG editor\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-textarea',{attrs:{\"solo\":\"\",\"auto-grow\":\"\",\"label\":\"Enter TF_CONFIG JSON here\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-tooltip',{attrs:{\"disabled\":_vm.properJson,\"top\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('div',_vm._g({},on),[_c('v-btn',{attrs:{\"color\":\"success\",\"disabled\":!_vm.properJson},on:{\"click\":function($event){return _vm.save()}}},[_vm._v(\"\\n Save\\n \")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"TF_CONFIG needs to be proper JSON object\")])])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1f240f3d\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TfConfigEdit.vue\n// module id = 340\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('TfConfigEdit',{attrs:{\"value\":_vm.newValue,\"show-modal\":_vm.showModalTfConfigEdit},on:{\"close\":function($event){_vm.showModalTfConfigEdit = false},\"updateValue\":function($event){return _vm.updateValue.apply(void 0, arguments)}}}),_vm._v(\" \"),(_vm.enableSmartTfConfig)?_c('v-layout',[_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Port\",\"small\":\"\"},model:{value:(_vm.newPort),callback:function ($$v) {_vm.newPort=$$v},expression:\"newPort\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-combobox',{staticClass:\"tf-wide\",attrs:{\"label\":\"Task type\",\"items\":_vm.taskTypeItems},model:{value:(_vm.newTaskType),callback:function ($$v) {_vm.newTaskType=$$v},expression:\"newTaskType\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),(_vm.newTaskIndex >= 0)?_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Index\",\"type\":\"number\",\"small\":\"\"},model:{value:(_vm.newTaskIndex),callback:function ($$v) {_vm.newTaskIndex=$$v},expression:\"newTaskIndex\"}}):_vm._e()],1):_c('v-btn',{staticClass:\"task-input\",attrs:{\"color\":\"info\",\"round\":\"\",\"medium\":\"\"},on:{\"click\":function($event){_vm.showModalTfConfigEdit = true}}},[_vm._v(\"\\n TF_CONFIG\\n \")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"bottom\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticClass:\"remove-button remove-button-tf\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},on),[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Delete TF_CONFIG\")])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ed523d5c\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLineTfConfig.vue\n// module id = 341\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-center\":\"\"}},[_c('div',{staticClass:\"task-preview\"},[_vm._v(\"\\n \"+_vm._s(_vm.taskPreview)+\"\\n \")])]),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostnames,\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostResources,\"label\":\"Resource\",\"small\":\"\"},model:{value:(_vm.newResource),callback:function ($$v) {_vm.newResource=$$v},expression:\"newResource\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[(_vm.newEnableTfConfig)?_c('TaskLineTfConfig',{attrs:{\"value\":_vm.tfConfig,\"port\":_vm.tfConfigPort,\"task-type\":_vm.tfConfigTaskType,\"task-index\":_vm.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeTfConfig\":function($event){return _vm.changeTfConfig.apply(void 0, arguments)},\"deleteTfConfig\":function($event){return _vm.deleteTfConfig()},\"updateTfConfigPort\":function($event){return _vm.updateTfConfigPort.apply(void 0, arguments)},\"updateTfConfigTaskType\":function($event){return _vm.updateTfConfigTaskType.apply(void 0, arguments)},\"updateTfConfigTaskIndex\":function($event){return _vm.updateTfConfigTaskIndex.apply(void 0, arguments)}}}):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.envVariables),function(envVariable){return _c('TaskLineEnvVariable',{key:envVariable.id,staticClass:\"task-input\",attrs:{\"envVariable\":envVariable.envVariable,\"value\":envVariable.value},on:{\"changeEnvVariable\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeEnvVariable.apply(void 0, [ envVariable.id ].concat( argsArray ))},\"deleteEnvVariable\":function($event){return _vm.deleteEnvVariable(envVariable.id)}}})}),1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.parameters),function(parameter){return _c('TaskLineParameter',{key:parameter.id,staticClass:\"task-input\",attrs:{\"parameter\":parameter.parameter,\"value\":parameter.value},on:{\"changeParameter\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeParameter.apply(void 0, [ parameter.id ].concat( argsArray ))},\"deleteParameter\":function($event){return _vm.deleteParameter(parameter.id)}}})}),1),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_vm._v(\"\\n Remove task\\n \")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-68056994\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLine.vue\n// module id = 342\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({},on),[_vm._v(\"\\n info\\n \")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"CPU tasks can be run without making reservation.\\n \"),_c('br'),_vm._v(\"When you want to create a GPU task, you must\\n \"),_c('br'),_vm._v(\"first ensure that you are eligible to do so\\n \"),_c('br'),_vm._v(\"(having active reservation for that GPU).\\n \")])]),_vm._v(\" \"),(_vm.chosenTemplate === 'tf2')?_c('v-switch',{staticClass:\"float-right-button\",attrs:{\"label\":\"Smart TF_CONFIG\"},model:{value:(_vm.enableSmartTfConfig),callback:function ($$v) {_vm.enableSmartTfConfig=$$v},expression:\"enableSmartTfConfig\"}}):_vm._e()],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.lines),function(line){return _c('TaskLine',{key:line.id,attrs:{\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"host\":line.host,\"resource\":line.resource,\"envVariables\":line.envVariables,\"staticEnvVariables\":_vm.staticEnvVariables,\"command\":line.command,\"parameters\":line.parameters,\"staticParameters\":_vm.staticParameters,\"enable-tf-config\":line.enableTfConfig,\"tf-config\":line.tfConfig,\"tf-config-port\":line.tfConfigPort,\"tf-config-task-type\":line.tfConfigTaskType,\"tf-config-task-index\":line.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeLine\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeLine.apply(void 0, [ line.id ].concat( argsArray ))},\"deleteLine\":function($event){return _vm.deleteLine(line.id)},\"staticParameterChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"psWorkerParameterChanged\":function($event){return _vm.updatePsWorkerHosts(-1, '')},\"staticEnvVariableChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"staticParameterDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"staticEnvVariableDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigPort\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigPort.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskType.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskIndex\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskIndex.apply(void 0, [ line.id ].concat( argsArray ))}}})}),1),_vm._v(\" \"),_c('v-card-text',[_c('v-flex',{attrs:{\"xs12\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"block\":\"\",\"small\":\"\"},on:{\"click\":_vm.copyLine}},[_vm._v(\"\\n Add task\\n \")])],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"parameter-name-input\",attrs:{\"label\":\"Parameter name\",\"small\":\"\"},model:{value:(_vm.newParameter),callback:function ($$v) {_vm.newParameter=$$v},expression:\"newParameter\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addEnvVariable}},[_vm._v(\"\\n Add as ENV variable to all tasks\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addParameter}},[_vm._v(\"\\n Add as parameter to all tasks\\n \")]),_vm._v(\" \"),_c('v-checkbox',{attrs:{\"label\":\"Static\"},model:{value:(_vm.isNewFieldStatic),callback:function ($$v) {_vm.isNewFieldStatic=$$v},expression:\"isNewFieldStatic\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.addTasks}},[_vm._v(\"\\n Create all tasks\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-c5e32eee\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskCreate.vue\n// module id = 343\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ab402584\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskEdit.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskEdit.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskEdit.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ab402584\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskEdit.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ab402584\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskEdit.vue\n// module id = 344\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Edit task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"host-input\",attrs:{\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"command-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.changeTask}},[_vm._v(\"\\n Edit task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ab402584\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskEdit.vue\n// module id = 346\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-21a65550\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskSchedule.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskSchedule.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskSchedule.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-21a65550\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskSchedule.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-21a65550\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskSchedule.vue\n// module id = 347\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"40vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Schedule task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set spawn time\"},model:{value:(_vm.spawn),callback:function ($$v) {_vm.spawn=$$v},expression:\"spawn\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}},on))]}}]),model:{value:(_vm.spawnDateMenu),callback:function ($$v) {_vm.spawnDateMenu=$$v},expression:\"spawnDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.spawnDateMenu = false}},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"spawnMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newSpawnTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newSpawnTime=$event},\"update:return-value\":function($event){_vm.newSpawnTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}},on))]}}]),model:{value:(_vm.spawnTimeMenu),callback:function ($$v) {_vm.spawnTimeMenu=$$v},expression:\"spawnTimeMenu\"}},[_vm._v(\" \"),(_vm.spawnTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.spawnMenu.save(_vm.newSpawnTime)}},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set terminate time\"},model:{value:(_vm.terminate),callback:function ($$v) {_vm.terminate=$$v},expression:\"terminate\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}},on))]}}]),model:{value:(_vm.terminateDateMenu),callback:function ($$v) {_vm.terminateDateMenu=$$v},expression:\"terminateDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.terminateDateMenu = false}},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"terminateMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newTerminateTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newTerminateTime=$event},\"update:return-value\":function($event){_vm.newTerminateTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}},on))]}}]),model:{value:(_vm.terminateTimeMenu),callback:function ($$v) {_vm.terminateTimeMenu=$$v},expression:\"terminateTimeMenu\"}},[_vm._v(\" \"),(_vm.terminateTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.terminateMenu.save(_vm.newTerminateTime)}},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}}):_vm._e()],1)],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.checkActionFlag}},[_vm._v(\"\\n Schedule task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-21a65550\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskSchedule.vue\n// module id = 349\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4291c17c\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLog.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLog.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLog.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4291c17c\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLog.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-4291c17c\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLog.vue\n// module id = 350\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"\\n Task log\\n \"),_c('v-btn',{attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"green\"},on:{\"click\":function($event){return _vm.refresh()}}},[_c('v-icon',[_vm._v(\"refresh\")])],1)],1),_vm._v(\" \"),_c('span',{staticClass:\"subheading\"},[_c('v-checkbox',{staticStyle:{\"display\":\"inline\"},attrs:{\"flat\":\"\",\"label\":\"Tail mode\",\"hide-details\":\"\"},model:{value:(_vm.tailMode),callback:function ($$v) {_vm.tailMode=$$v},expression:\"tailMode\"}}),_vm._v(\" \"),_c('v-checkbox',_vm._g({staticStyle:{\"display\":\"inline\"},attrs:{\"flat\":\"\",\"label\":\"Auto-refresh\",\"disabled\":!_vm.tailMode,\"hide-details\":\"\"},model:{value:(_vm.autoRefresh),callback:function ($$v) {_vm.autoRefresh=$$v},expression:\"autoRefresh\"}},_vm.on))],1)],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n \"+_vm._s(_vm.path)+\"\\n \"),_c('div',{staticClass:\"log_box\"},_vm._l((_vm.lines),function(line,index){return _c('div',{key:index},[_vm._v(\"\\n \"+_vm._s(line)+\"\\n \")])}),0)])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4291c17c\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLog.vue\n// module id = 352\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-d8f593d8\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskTemplateChooser.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskTemplateChooser.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskTemplateChooser.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-d8f593d8\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskTemplateChooser.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-d8f593d8\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskTemplateChooser.vue\n// module id = 353\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Choose framework template\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.possibleTemplates,\"label\":\"Choose template from list\",\"solo\":\"\"},on:{\"change\":_vm.setChosenTemplate}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":function($event){return _vm.goToCreate()}}},[_vm._v(\"\\n Go to task creator\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-d8f593d8\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskTemplateChooser.vue\n// module id = 355\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('TaskCreate',{attrs:{\"show-modal\":_vm.showModalCreate,\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"actionFlag\":_vm.actionFlag,\"chosen-template\":_vm.chosenTemplate},on:{\"close\":function($event){_vm.showModalCreate = false},\"getTasks\":_vm.getTasks}}),_vm._v(\" \"),_c('TaskTemplateChooser',{attrs:{\"show-modal\":_vm.showModalChooseTemplate},on:{\"close\":function($event){_vm.showModalChooseTemplate = false},\"openFromTemplate\":_vm.openFromTemplate}}),_vm._v(\" \"),_c('TaskEdit',{attrs:{\"show-modal\":_vm.showModalEdit,\"taskId\":_vm.taskId,\"hostname\":_vm.newHostname,\"command\":_vm.newCommand,\"actionFlag\":_vm.actionFlag},on:{\"close\":function($event){_vm.showModalEdit = false},\"getTask\":function($event){return _vm.getTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskSchedule',{attrs:{\"show-modal\":_vm.showModalSchedule,\"taskId\":_vm.taskId,\"spawnTime\":_vm.newSpawnTime,\"terminateTime\":_vm.newTerminateTime,\"actionFlag\":_vm.actionFlag,\"multipleFlag\":_vm.multipleFlag,\"selected\":_vm.selected},on:{\"close\":function($event){_vm.showModalSchedule = false},\"updateTask\":function($event){return _vm.updateTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)},\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskLog',{attrs:{\"show-modal\":_vm.showModalLog,\"lines\":_vm.logs,\"path\":_vm.path,\"taskId\":_vm.taskId},on:{\"close\":function($event){_vm.showModalLog = false},\"getLog\":function($event){return _vm.getLog.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"500\"},model:{value:(_vm.showModalHowItWorks),callback:function ($$v) {_vm.showModalHowItWorks=$$v},expression:\"showModalHowItWorks\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalHowItWorks = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"How it works\\n \")],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Your tasks are managed by `screen` program installed on each machine. You can attach\\n to/close them as they are running. Screen sessions created by TensorHive have custom\\n names so you won't be confused which is which.\\n \"),_c('br'),_vm._v(\" \"),_c('br'),_vm._v(\"When your task command stops executing, screen session will disappear from `screen -ls`\\n but stdout+stderr produced by your process will be redirected to a log file.\\n Logs are automatically gathered and stored on that machine under `~/TensorHiveLogs`.\\n \")])],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"Do you want to remove this task?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeTask()}}},[_vm._v(\"Yes\")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"table-container\"},[_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\",\"rows-per-page-items\":_vm.rowsPerPageItems},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}}),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){_vm.showModalHowItWorks = true}}},on),[_vm._v(\"info\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"How it works\")])])],1)],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\" \"),_c('span',{staticClass:\"dark-font\"},[_vm._v(_vm._s(header.text))])],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.hostname))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.status))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))]),_vm._v(\" \"),_c('td',[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(props.item)}}},on),[_vm._v(\"schedule\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(props.item.id)}}},on),[_vm._v(\"play_arrow\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, null)}}},on),[_vm._v(\"stop\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate task - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, false)}}},on),[_vm._v(\"💀\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill task - use when command is more stubborn\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.getLog(props.item.id)}}},on),[_vm._v(\"description\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Show log\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.editTask(props.item)}}},on),[_vm._v(\"edit\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Edit task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},on),[_vm._v(\"delete\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Remove task\")])])],1)])]}}]),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}])})],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){return _vm.openFromTemplate('')}}},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModalChooseTemplate=true}}},[_vm._v(\"Create tasks from template\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.getTasks(true)}}},on),[_vm._v(\"refresh\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Refresh\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(null)}}},on),[_vm._v(\"schedule\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(null)}}},on),[_vm._v(\"play_arrow\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(null, null)}}},on),[_vm._v(\"stop\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate selected tasks - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(null, false)}}},on),[_vm._v(\"💀\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill selected tasks - use when command is more stubborn\")])])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"amber\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_c('span',{staticStyle:{\"color\":\"black\"}},[_vm._v(\"Synchronization in progress. Actions are not allowed now.\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"Close\")])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"red\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbarError),callback:function ($$v) {_vm.snackbarError=$$v},expression:\"snackbarError\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbarError = false}}},[_vm._v(\"Close\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-c0181bc6\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/TasksOverview.vue\n// module id = 356\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-58aecb3a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./UsersOverview.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./UsersOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./UsersOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-58aecb3a\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./UsersOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-58aecb3a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/UsersOverview.vue\n// module id = 357\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n User successfully created\\n \")]),_vm._v(\" \"),_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"500px\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create new user\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('v-card-text',[_vm._v(\"\\n Username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\"\\n Email\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\"\\n Password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\"\\n Repeat password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Create\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"\\n Do you want to remove this user?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeUser()}}},[_vm._v(\"\\n Yes\\n \")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',[_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModal=true}}},[_vm._v(\"Create user\")])],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"max-width\":\"500px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.dialog = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Edit user\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current username: \"+_vm._s(_vm.currentUser.username)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.username),expression:\"user.username\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"username\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current email: \"+_vm._s(_vm.currentUser.email)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New email\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.email),expression:\"user.email\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.email)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"email\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password),expression:\"user.password\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Repeat password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password2),expression:\"user.password2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password2\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Account roles:\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('v-checkbox',{attrs:{\"label\":\"admin\"},model:{value:(_vm.adminCheckbox),callback:function ($$v) {_vm.adminCheckbox=$$v},expression:\"adminCheckbox\"}})],1)],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-spacer'),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":_vm.updateUser}},[_vm._v(\"Edit\")])],1)],1)],1),_vm._v(\" \"),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.users,\"search\":_vm.search,\"pagination\":_vm.pagination,\"item-key\":\"id\",\"hide-actions\":\"\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',[_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.username))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.email))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.createdAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.role))]),_vm._v(\" \"),_c('td',[_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.editUser(props.item)}}},[_vm._v(\"\\n edit\\n \")]),_vm._v(\" \"),_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},[_vm._v(\"\\n delete\\n \")])],1)])]}}])}),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-pagination',{attrs:{\"length\":_vm.pages},model:{value:(_vm.pagination.page),callback:function ($$v) {_vm.$set(_vm.pagination, \"page\", $$v)},expression:\"pagination.page\"}})],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-58aecb3a\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/UsersOverview.vue\n// module id = 359\n// module chunks = 1","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport state from './state'\nimport actions from './actions'\nimport mutations from './mutations'\n\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n state,\n actions,\n mutations\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/index.js","export default {\n callingAPI: false,\n searching: '',\n serverURI: 'http://10.110.1.136:8080',\n user: null,\n role: null,\n id: null,\n accessToken: null,\n refreshToken: null,\n userInfo: {\n messages: [{1: 'test', 2: 'test'}],\n notifications: [],\n tasks: []\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/state.js","export default {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/actions.js","export default {\n TOGGLE_LOADING (state) {\n state.callingAPI = !state.callingAPI\n },\n TOGGLE_SEARCHING (state) {\n state.searching = (state.searching === '') ? 'loading' : ''\n },\n SET_USER (state, user) {\n state.user = user\n },\n SET_ROLE (state, role) {\n state.role = role\n },\n SET_ID (state, id) {\n state.id = id\n },\n SET_ACCESS_TOKEN (state, token) {\n state.accessToken = token\n },\n SET_REFRESH_TOKEN (state, token) {\n state.refreshToken = token\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/mutations.js","const urlParser = document.createElement('a')\n\nexport function domain (url) {\n urlParser.href = url\n return urlParser.hostname\n}\n\nexport function count (arr) {\n return arr.length\n}\n\nexport function prettyDate (date) {\n var a = new Date(date)\n return a.toDateString()\n}\n\nexport function pluralize (time, label) {\n if (time === 1) {\n return time + label\n }\n\n return time + label + 's'\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/filters/index.js","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-535f2ac0\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/App.vue\n// module id = 366\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('v-app',[_c('router-view')],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-535f2ac0\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/App.vue\n// module id = 367\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file diff --git a/tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js.map b/tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js.map deleted file mode 100644 index 6bb830fb..00000000 --- a/tensorhive/app/web/dist/static/js/app.923c89f30ff332c6de66.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///static/js/app.923c89f30ff332c6de66.js","webpack:///./src/api/index.js","webpack:///./src/config/index.js","webpack:///src/components/TheDash.vue","webpack:///src/components/dash/BaseSidebar.vue","webpack:///src/components/dash/BaseSidebarMenu.vue","webpack:///src/components/TheLogin.vue","webpack:///src/components/404.vue","webpack:///src/components/views/ReservationsOverview.vue","webpack:///src/components/views/reserve_resources/FullCalendar.vue","webpack:///src/components/views/reserve_resources/FullCalendarReserve.vue","webpack:///src/components/views/reserve_resources/FullCalendarInfo.vue","webpack:///src/components/views/reserve_resources/MySchedule.vue","webpack:///src/components/views/NodesOverview.vue","webpack:///src/components/views/nodes_overview/WatchGenerator.vue","webpack:///src/components/views/nodes_overview/WatchBox.vue","webpack:///src/components/views/nodes_overview/LineChart.vue","webpack:///src/components/views/TasksOverview.vue","webpack:///src/components/views/tasks_overview/TaskCreate.vue","webpack:///src/components/views/tasks_overview/TaskLine.vue","webpack:///src/components/views/tasks_overview/TaskLineParameter.vue","webpack:///src/components/views/tasks_overview/TaskLineEnvVariable.vue","webpack:///src/components/views/tasks_overview/TaskLineTfConfig.vue","webpack:///src/components/views/tasks_overview/TfConfigEdit.vue","webpack:///src/components/views/tasks_overview/TaskEdit.vue","webpack:///src/components/views/tasks_overview/TaskSchedule.vue","webpack:///src/components/views/tasks_overview/TaskLog.vue","webpack:///src/components/views/tasks_overview/TaskTemplateChooser.vue","webpack:///src/components/views/UsersOverview.vue","webpack:///src/components/App.vue","webpack:///./src/main.js","webpack:///./src/routes.js","webpack:///./src/components/TheDash.vue","webpack:///./src/components/dash/BaseSidebar.vue","webpack:///./src/components/dash/BaseSidebarMenu.vue","webpack:///./src/components/dash/BaseSidebarMenu.vue?ea08","webpack:///./src/components/dash/BaseSidebar.vue?593a","webpack:///./src/components/TheDash.vue?4fff","webpack:///./src/components/TheLogin.vue","webpack:///./src/components/TheLogin.vue?889c","webpack:///./src/components/404.vue","webpack:///./src/components/404.vue?a49b","webpack:///./src/components/views/ReservationsOverview.vue","webpack:///./src/components/views/reserve_resources/FullCalendar.vue","webpack:///./src/components/views/reserve_resources/FullCalendarReserve.vue","webpack:///./node_modules/moment/locale ^\\.\\/.*$","webpack:///./src/components/views/reserve_resources/FullCalendarReserve.vue?f0bb","webpack:///./src/components/views/reserve_resources/FullCalendarInfo.vue","webpack:///./src/components/views/reserve_resources/FullCalendarInfo.vue?d6f1","webpack:///./static/fullcalendar/fullcalendar.js","webpack:///./src/components/views/reserve_resources/FullCalendar.vue?e112","webpack:///./src/components/views/reserve_resources/MySchedule.vue","webpack:///./src/components/views/reserve_resources/MySchedule.vue?d990","webpack:///./src/components/views/ReservationsOverview.vue?83a8","webpack:///./src/components/views/NodesOverview.vue","webpack:///./src/components/views/nodes_overview/WatchGenerator.vue","webpack:///./src/components/views/nodes_overview/WatchBox.vue","webpack:///./src/components/views/nodes_overview/LineChart.vue","webpack:///./src/components/views/nodes_overview/WatchBox.vue?df61","webpack:///./src/components/views/nodes_overview/WatchGenerator.vue?ebb9","webpack:///./src/components/views/NodesOverview.vue?bbc4","webpack:///./src/components/views/TasksOverview.vue","webpack:///./src/components/views/tasks_overview/TaskCreate.vue","webpack:///./src/components/views/tasks_overview/TaskLine.vue","webpack:///./src/components/views/tasks_overview/TaskLineParameter.vue","webpack:///./src/components/views/tasks_overview/TaskLineParameter.vue?2ad6","webpack:///./src/components/views/tasks_overview/TaskLineEnvVariable.vue","webpack:///./src/components/views/tasks_overview/TaskLineEnvVariable.vue?f44b","webpack:///./src/components/views/tasks_overview/TaskLineTfConfig.vue","webpack:///./src/components/views/tasks_overview/TfConfigEdit.vue","webpack:///./src/components/views/tasks_overview/TfConfigEdit.vue?f8ad","webpack:///./src/components/views/tasks_overview/TaskLineTfConfig.vue?e748","webpack:///./src/components/views/tasks_overview/TaskLine.vue?40e0","webpack:///./src/components/views/tasks_overview/TaskCreate.vue?85fd","webpack:///./src/components/views/tasks_overview/TaskEdit.vue","webpack:///./src/components/views/tasks_overview/TaskEdit.vue?7932","webpack:///./src/components/views/tasks_overview/TaskSchedule.vue","webpack:///./src/components/views/tasks_overview/TaskSchedule.vue?c038","webpack:///./src/components/views/tasks_overview/TaskLog.vue","webpack:///./src/components/views/tasks_overview/TaskLog.vue?d826","webpack:///./src/components/views/tasks_overview/TaskTemplateChooser.vue","webpack:///./src/components/views/tasks_overview/TaskTemplateChooser.vue?80f0","webpack:///./src/components/views/TasksOverview.vue?bc7a","webpack:///./src/components/views/UsersOverview.vue","webpack:///./src/components/views/UsersOverview.vue?c94b","webpack:///./src/store/index.js","webpack:///./src/store/state.js","webpack:///./src/store/actions.js","webpack:///./src/store/mutations.js","webpack:///./src/filters/index.js","webpack:///./src/components/App.vue","webpack:///./src/components/App.vue?6735"],"names":["webpackJsonp","module","__webpack_exports__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0_axios__","__WEBPACK_IMPORTED_MODULE_0_axios___default","n","__WEBPACK_IMPORTED_MODULE_1__config__","request","method","uri","token","data","arguments","length","undefined","console","error","url","config","serverURI","axios","defaults","headers","common","apiVersion","version","fixedLayout","hideLogoOnMobile","__WEBPACK_IMPORTED_MODULE_0__config__","__WEBPACK_IMPORTED_MODULE_1__dash_BaseSidebar_vue__","__WEBPACK_IMPORTED_MODULE_2_hideseek__","__WEBPACK_IMPORTED_MODULE_3__api__","name","components","BaseSidebar","year","Date","getFullYear","classes","fixed_layout","hide_logo","alert","errorMessage","computed","displayName","this","$store","state","user","methods","handleError","hasOwnProperty","response","msg","message","changeloading","commit","logout","_this","accessToken","then","window","localStorage","setItem","refreshToken","catch","$router","push","__WEBPACK_IMPORTED_MODULE_0__BaseSidebarMenu_vue__","BaseSidebarMenu","mounted","jQuery","off","hideseek","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default","__WEBPACK_IMPORTED_MODULE_1__api__","router","section","username","password","modalUsername","modalEmail","modalPassword","modalPassword2","modalAlert","created","showModal","entry","requestEntry","copyEntryToClipboard","entryInput","document","querySelector","setAttribute","select","execCommand","e","getSelection","removeAllRanges","createUser","_this2","email","checkCreds","_this3","toggleLoading","resetResponse","errorName","access_token","refresh_token","object","JSON","parse","atob","split","id","identity","role","user_claims","roles","loading","__WEBPACK_IMPORTED_MODULE_0__api__","__WEBPACK_IMPORTED_MODULE_1_lodash__","__WEBPACK_IMPORTED_MODULE_1_lodash___default","__WEBPACK_IMPORTED_MODULE_2__reserve_resources_FullCalendar_vue__","__WEBPACK_IMPORTED_MODULE_3__reserve_resources_MySchedule_vue__","FullCalendar","MySchedule","nodes","parsedNodes","snackbar","updateCalendar","selectedResources","nodeCheckbox","resourceTypeCheckbox","resourceCheckbox","showSchedule","interval","time","parseData","self","setInterval","showSnackbar","loadResources","resources","selected","obj","nodeName","resourceName","uuid","index","resourceIndex","toggle","node","open","resourceType","resourceTypes","tempResource","tempResourceType","tempNode","orderedResources","resourceTypeName","resourceUUID","metrics","a","orderBy","checked","loadCalendar","resource","i","j","k","__WEBPACK_IMPORTED_MODULE_0__FullCalendarReserve_vue__","__WEBPACK_IMPORTED_MODULE_1__FullCalendarInfo_vue__","__WEBPACK_IMPORTED_MODULE_2__api__","__WEBPACK_IMPORTED_MODULE_3_jquery__","__WEBPACK_IMPORTED_MODULE_3_jquery___default","__WEBPACK_IMPORTED_MODULE_4_moment__","__WEBPACK_IMPORTED_MODULE_4_moment___default","__WEBPACK_IMPORTED_MODULE_5_lodash__","__WEBPACK_IMPORTED_MODULE_5_lodash___default","FullCalendarReserve","FullCalendarInfo","props","Object","Array","Boolean","watch","calendar","fullCalendar","showModalReserve","showModalInfo","reservation","title","description","resourceId","start","end","reservationId","startDate","endDate","resourcesCheckboxes","refreshTasks","parsedNodeNames","$emit","getEvents","callback","resourcesString","toISOString","disabled","addResourcesHeader","dayStart","cloneDeep","tempReservation","allDay","userId","add","parseNodeNames","setColor","resourceNodeName","colors","colorIndex","updateReservation","newTime","newTitle","newDescription","toUpdate","empty","key","cancelReservation","toString","addReservation","_this4","$el","resize","allDaySlot","allDayText","height","selectable","selectOverlap","slotEventOverlap","editable","nowIndicator","firstDay","timezone","defaultView","header","left","center","right","views","week","columnHeaderFormat","buttonText","week2","type","duration","days","dateIncrement","events","eventRender","event","element","_this5","find","append","css","prepend","bold","big","italics","eventAfterRender","view","columnIndex","width","el","clientWidth","dayWidth","eventSlotWidth","eventWidth","Math","round","margin","c","color","_ambigTime","toDate","setTimeout","eventClick","calEvent","jsEvent","viewRender","__WEBPACK_IMPORTED_MODULE_0_moment__","__WEBPACK_IMPORTED_MODULE_0_moment___default","numberOfResources","Number","Function","show","close","startTime","newStartDate","format","newStartTime","endTime","newEndDate","newEndTime","startTimeMenu","startDateMenu","endTimeMenu","endDateMenu","showInfo","reservationTitle","reservationDescription","anyChecked","checkbox","parseInt","__WEBPACK_IMPORTED_MODULE_1_moment__","__WEBPACK_IMPORTED_MODULE_1_moment___default","cancel","update","actionsAbility","gpuUtilAvg","memUtilAvg","reservationStart","reservationEnd","gpuUUID","GPU","getTasks","tasksCard","cancelCard","updateCard","pagination","sortBy","tasks","selectedIndex","text","value","tableKey","actionFlag","showAlert","prettyDate","date","checkActionFlag","scheduleTasks","newTask","adjustHostAndCommand","getTask","hostname","command","setCommand","splitCommand","join","updateTask","task","newData","splice","toggleAll","slice","changeSort","column","descending","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default","tableContent","hours","scheduleStart","scheduleEnd","resourcesIds","startMoment","leftTableKey","rightTableKey","picker","substr","menu","landscape","reactive","range","changeAllCheckbox","selectedNodes","allFlag","nodeFlag","fillTable","changeAll","changeWholeNode","checkIfAllNodesSelected","changeResource","checkIfAllResourcesSelected","forceRerenderTables","changeSchedule","adjustTimezone","headerName","resourceIds","nodeIndex","nodeSlots","reserved","userReservation","hidden","slots","resourceTypeIndex","getReservations","dayDifferenceStart","diff","hoursDifferenceStart","minutesDifferenceStart","dayDifferenceEnd","hoursDifferenceEnd","minutesDifferenceEnd","startSlot","endSlot","slot","getTimezoneOffset","leftTable","getElementById","rightTable","rightHeader","onscroll","scrollTop","scrollLeft","__WEBPACK_IMPORTED_MODULE_0__nodes_overview_WatchGenerator_vue__","WatchGenerator","__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__","__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default","__WEBPACK_IMPORTED_MODULE_2__WatchBox_vue__","__WEBPACK_IMPORTED_MODULE_4_lodash__","__WEBPACK_IMPORTED_MODULE_4_lodash___default","WatchBox","watches","chartDatasets","chartLength","space","updateChart","resourcesIndexes","watchIds","loadData","$route","fullPath","clearInterval","changeData","saveWatches","changeDefaultNode","defaultNode","changeDefaultResourceType","defaultResourceType","changeDefaultMetric","defaultMetric","deleteWatch","step","colorToInt","nstep","isNaN","ncolor","test","getItem","host","isVisible","metric","metricName","apiResponse","uniqueMetricNames","findMetrics","tempMetrics","uniqueMetrics","unit","visible","uniqueMetricName","createMetric","labels","totalMemory","datasets","orderedDatasets","createDataset","options","createOptions","label","defaultData","fill","borderColor","pointBackgroundColor","backgroundColor","responsive","maintainAspectRatio","legend","position","display","tooltips","mode","xPadding","yPadding","bodySpacing","scales","xAxes","scaleLabel","labelString","yAxes","suggestedMin","max","suggestedMax","counter","apiRequest","toLowerCase","has","shift","addWatch","__WEBPACK_IMPORTED_MODULE_0__LineChart_vue__","LineChart","String","selectedNode","selectedResourceType","selectedMetric","rerenderChart","metricData","metricOptions","showProcesses","processes","sendDefaultNode","newDefault","sendDefaultResourceType","sendDefaultMetric","removeMe","loadOptions","fillNodes","fillResourceTypes","fillMetrics","metricIndex","checkProcesses","tempProcess","__WEBPACK_IMPORTED_MODULE_0_vue_chartjs__","extends","chartData","$data","_chart","destroy","renderChart","__WEBPACK_IMPORTED_MODULE_2__tasks_overview_TaskCreate_vue__","__WEBPACK_IMPORTED_MODULE_3__tasks_overview_TaskEdit_vue__","__WEBPACK_IMPORTED_MODULE_4__tasks_overview_TaskSchedule_vue__","__WEBPACK_IMPORTED_MODULE_5__tasks_overview_TaskLog_vue__","__WEBPACK_IMPORTED_MODULE_6__tasks_overview_TaskTemplateChooser__","TaskTemplateChooser","TaskCreate","TaskEdit","TaskSchedule","TaskLog","sortable","hostnames","hosts","showModalCreate","chosenTemplate","showModalChooseTemplate","showModalEdit","showModalSchedule","showModalHowItWorks","showModalRemove","showModalLog","taskId","newHostname","newCommand","newSpawnTime","newTerminateTime","initialSyncFlag","snackbarError","multipleFlag","logs","path","actionType","gracefully","rowsPerPageItems","getHosts","showError","changeActionFlag","bool","changeSnackbar","convertHostsInfo","hostsInfo","sync","spawnTasks","prepareActionLoop","terminateTasks","actionLoop","actionPath","getTaskLoop","resumeLoop","spawnAt","terminateAt","editTask","showConfirmationDialog","removeTask","_this6","getLog","_this7","output_lines","openFromTemplate","__WEBPACK_IMPORTED_MODULE_1__TaskLine_vue__","TaskLine","newParameter","linesIds","lines","parameters","envVariables","parameterIds","envVariableIds","enableTfConfig","tfConfig","tfConfigPort","tfConfigTaskType","tfConfigTaskIndex","tfCluster","staticParameters","staticEnvVariables","isNewFieldStatic","enableSmartTfConfig","emptyParametersAndEnvVariables","addParameter","addEnvVariable","addTasks","lineIndex","line","convertResource","envIndex","envVariable","parameterIndex","parameter","parameterNameLength","charAt","parameterName","parameterValue","taskIndex","variableName","variableValue","newName","substring","machinePorts","updateTfConfigTaskType","updateTfConfigPort","copyLine","addLine","lineToCopy","parametersToCopy","newParameters","parameterToCopy","envVariablesToCopy","newEnvVariables","EnvIndex","envVariableToCopy","newEnvVariable","machineHosts","changeLine","updateTfConfigHost","updatePsWorkerHosts","deleteLine","staticParameterChanged","staticParameterDeleted","staticIndex","indexOf","staticEnvVariableChanged","variable","variableIndex","staticEnvVariableDeleted","psHosts","workerHosts","currentPort","currLine","jobName","paramIndex","_paramIndex","lineHost","psHostsParam","workerHostsParam","pHost","replace","wHost","_line","_paramIndex2","taskType","__ob__","dep","notify","port","oldTaskType","oldTaskIndex","otherLineIndex","updateTfConfigTaskIndex","newTaskIndex","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default","__WEBPACK_IMPORTED_MODULE_1__TaskLineParameter_vue__","__WEBPACK_IMPORTED_MODULE_2__TaskLineEnvVariable_vue__","__WEBPACK_IMPORTED_MODULE_3__TaskLineTfConfig__","TaskLineTfConfig","TaskLineParameter","TaskLineEnvVariable","newHost","newResource","newEnableTfConfig","newTfConfig","hostResources","taskPreview","updateLine","changeParameter","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","next","done","staticParameterName","err","return","deleteParameter","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","changeEnvVariable","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","staticEnvVariableName","deleteEnvVariable","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","changeTfConfig","deleteTfConfig","newPort","newTaskType","newValue","showModalTfConfigEdit","updateValue","__WEBPACK_IMPORTED_MODULE_1__TfConfigEdit__","TfConfigEdit","taskTypeItems","localEnableSmartTfConfig","cluster","properJson","desanitize","save","sanitize","changeTask","spawnTime","terminateTime","spawnTimeMenu","spawnDateMenu","terminateTimeMenu","terminateDateMenu","spawn","terminate","newSpawnDate","newTerminateDate","actionSave","$refs","possibleTemplates","setChosenTemplate","templateName","goToCreate","dialog","search","users","password2","currentUser","userCheckbox","adminCheckbox","pages","rowsPerPage","totalItems","ceil","checkUsers","editUser","admin","updateUser","updatedUser","removeUser","defineProperty","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__","__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default","__WEBPACK_IMPORTED_MODULE_2_es6_promise_auto__","__WEBPACK_IMPORTED_MODULE_3_vue__","__WEBPACK_IMPORTED_MODULE_4_vue_router__","__WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__","__WEBPACK_IMPORTED_MODULE_6__routes__","__WEBPACK_IMPORTED_MODULE_7__store__","__WEBPACK_IMPORTED_MODULE_8__api__","__WEBPACK_IMPORTED_MODULE_9__filters__","__WEBPACK_IMPORTED_MODULE_10__components_App_vue__","__WEBPACK_IMPORTED_MODULE_11_vuetify__","__WEBPACK_IMPORTED_MODULE_11_vuetify___default","__WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css__","__WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css__","__WEBPACK_IMPORTED_MODULE_14_axios__","__WEBPACK_IMPORTED_MODULE_14_axios___default","__WEBPACK_IMPORTED_MODULE_15__config__","get","log","store","api","apiPath","clear","location","reload","Vue","use","Vuetify","filter","count","domain","pluralize","VueRouter","routes","linkExactActiveClass","scrollBehavior","to","from","savedPosition","x","y","beforeEach","matched","some","record","meta","requiresAuth","app","query","redirect","interceptors","status","reject","localUserString","localUser","render","h","AppView","__WEBPACK_IMPORTED_MODULE_0__components_TheDash_vue__","__WEBPACK_IMPORTED_MODULE_1__components_TheLogin_vue__","__WEBPACK_IMPORTED_MODULE_2__components_404_vue__","__WEBPACK_IMPORTED_MODULE_3__components_views_ReservationsOverview_vue__","__WEBPACK_IMPORTED_MODULE_4__components_views_NodesOverview_vue__","__WEBPACK_IMPORTED_MODULE_5__components_views_TasksOverview_vue__","__WEBPACK_IMPORTED_MODULE_6__components_views_UsersOverview_vue__","component","DashView","children","alias","CalendarView","WatchView","TasksView","UsersView","LoginView","NotFoundView","injectStyle","ssrContext","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheDash_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ebd4a91c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheDash_vue__","normalizeComponent","__vue_styles__","Component","exports","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebar_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_8c8911fe_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebar_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebarMenu_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1ff073b3_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebarMenu_vue__","_vm","_h","$createElement","_c","_self","staticClass","_v","attrs","tag","_e","staticRenderFns","esExports","class","dismissible","model","$$v","expression","_s","_m","close-on-content-click","offset-y","text-color","flat","on","click","$event","justify-center","row","wrap","text-xs-center","white--text","xs12","href","data-toggle","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheLogin_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_67170a3e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheLogin_vue__","icon","submit","preventDefault","directives","rawName","placeholder","domProps","input","target","composing","solo","small","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_404_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_209d35e8_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_404_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_ReservationsOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_a758ccee_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_ReservationsOverview_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendar_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_17877d92_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendar_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarReserve_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1d62e0bd_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarReserve_vue__","webpackContext","req","webpackContextResolve","map","Error","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","keys","resolve","_l","$set","align-center","justify-start","nudge-right","lazy","transition","full-width","min-width","scopedSlots","_u","fn","ref","_g","prepend-icon","return-value","max-width","update:returnValue","update:return-value","allowed-minutes","m","click:minute","startMenu","endMenu","outline","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarInfo_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58652693_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarInfo_vue__","large","userName","items","select-all","item-key","update:pagination","input-value","all","indeterminate","primary","hide-details","stopPropagation","active","item","proxy","root","factory","__WEBPACK_EXTERNAL_MODULE_0__","__WEBPACK_EXTERNAL_MODULE_3__","modules","moduleId","installedModules","l","call","d","getter","o","configurable","enumerable","__esModule","property","prototype","p","s","extendStatics","setPrototypeOf","__proto__","b","__extends","__","constructor","create","compensateScroll","rowEls","scrollbarWidths","border-left-width","margin-left","border-right-width","margin-right","uncompensateScroll","disableCursor","$","addClass","enableCursor","removeClass","distributeHeight","els","availableHeight","shouldRedistribute","minOffset1","floor","minOffset2","flexEls","flexOffsets","flexHeights","usedHeight","undistributeHeight","each","minOffset","naturalOffset","outerHeight","naturalHeight","newHeight","matchCellWidths","maxInnerWidth","innerEl","innerWidth","outerWidth","subtractInnerElHeight","outerEl","both","getScrollParent","scrollParent","parents","parent","eq","ownerDocument","getOuterRect","origin","offset","top","bottom","getClientRect","getScrollbarWidths","getCssFloat","clientHeight","getContentRect","widths","leftRightWidth","offsetWidth","bottomWidth","offsetHeight","sanitizeScrollbarWidth","getIsLeftRtlScrollbars","_isLeftRtlScrollbars","computeIsLeftRtlScrollbars","border","padding","overflow","direction","appendTo","res","remove","prop","parseFloat","isPrimaryMouseButton","ev","which","ctrlKey","getEvX","touches","originalEvent","pageX","getEvY","pageY","getEvIsTouch","preventSelection","allowSelection","intersectRects","rect1","rect2","min","constrainPoint","point","rect","getRectCenter","diffPoints","point1","point2","parseFieldSpecs","specs","tokens","isArray","field","order","func","compareByFieldSpecs","obj1","obj2","fieldSpecs","obj1fallback","obj2fallback","cmp","compareByFieldSpec","fieldSpec","val1","val2","flexibleCompare","localeCompare","diffDayTime","moment","clone","stripTime","ms","diffDay","diffByUnit","computeGreatestUnit","val","unitsDesc","computeRangeAs","isInt","computeDurationGreatestUnit","durationInput","isDuration","as","divideRangeByDuration","dur","months","durationHasTime","asMonths","abs","asDays","divideDurationByDuration","dur1","dur2","months1","months2","multiplyDuration","minutes","seconds","milliseconds","isNativeDate","isTimeString","str","args","_i","apply","warn","mergeProps","propObjs","complexProps","complexObjs","dest","unshift","copyOwnProps","src","name_1","hasOwnProp","hasOwnPropMethod","applyAll","functions","thisObj","isFunction","ret","removeMatching","array","testFunc","removeCnt","removeExact","exactVal","isArraysEqual","a0","a1","len","firstDefined","htmlEscape","stripHtmlEntities","cssToStr","cssProps","statements","attrsToStr","parts","capitaliseFirstLetter","toUpperCase","compareNumbers","methodName","debounce","wait","immediate","timeout","context","timestamp","result","later","last","callNow","dayIDs","compareUnzonedRanges","range1","range2","startMs","moment_ext_1","UnzonedRange","startInput","endInput","isStart","isEnd","isMoment","stripZone","valueOf","endMs","invertRanges","ranges","constraintRange","dateRange","invertedRanges","sort","intersect","otherRange","newRange","intersectsWith","containsRange","innerRange","containsDate","constrainDate","equals","getStart","default","utc","getEnd","tslib_1","ParsableModelMixin_1","Class_1","EventDefParser_1","EventSource","_super","className","uid","rawInput","source","applyProps","normalizeId","fetch","removeEventDefsById","eventDefId","removeAllEventDefs","getPrimitive","otherSource","parseEventDefs","rawEventDefs","eventDef","eventDefs","parseEventDef","calendarTransform","opt","sourceTransform","eventDataTransform","applyManualStandardProps","rawProps","defineStandardProps","copyVerbatimStandardProps","mixInto","textColor","startEditable","durationEditable","rendering","overlap","constraint","allDayDefault","Mixin_1","guid","ListenerMixin","listenTo","other","arg","eventName","getListenerNamespace","stopListeningTo","listenerId","oldMomentFormat","mom","formatStr","oldMomentProto","makeMoment","parseAsUTC","parseZone","isAmbigTime","isAmbigZone","ambigMatch","isSingleString","util_1","ambigDateOfMonthRegex","ambigTimeOrZoneRegex","exec","_ambigZone","utcOffset","_fullCalendar","newMomentProto","extend","momentProperties","momentExt","hasTime","weeks","weekCalc","_locale","_fullCalendar_weekCalc","isoWeek","dayHours","set","wasAmbigTime","hasZone","local","keepLocalTime","tzo","EmitterMixin","types","handler","_prepareIntercept","one","intercept","extra","trigger","triggerHandler","triggerWith","hasHandlers","hash","_data","ComponentFootprint","unzonedRange","isAllDay","toLegacy","msToMoment","EventDef_1","EventInstance_1","EventDateProfile_1","SingleEventDef","buildInstances","buildInstance","dateProfile","def","rezone","superSuccess","miscProps","Mixin","destClass","getOwnPropertyNames","forEach","mixOver","Interaction","_getView","internalApiVersion","date_formatting_1","formatDate","formatRange","queryMostGranularFormatUnit","locale_1","datepickerLocale","locale","EmitterMixin_1","ListenerMixin_1","Model_1","Model","Constraints_1","Constraints","UnzonedRange_1","ComponentFootprint_1","BusinessHourGenerator_1","BusinessHourGenerator","EventDef","EventDefMutation_1","EventDefMutation","EventSourceParser_1","EventSourceParser","EventSource_1","ThemeRegistry_1","defineThemeSystem","EventInstanceGroup_1","EventInstanceGroup","ArrayEventSource_1","ArrayEventSource","FuncEventSource_1","FuncEventSource","JsonFeedEventSource_1","JsonFeedEventSource","EventFootprint_1","EventFootprint","Class","CoordCache_1","CoordCache","DragListener_1","DragListener","Promise_1","Promise","TaskQueue_1","TaskQueue","RenderQueue_1","RenderQueue","Scroller_1","Scroller","Theme_1","Theme","DateComponent_1","DateComponent","InteractiveDateComponent_1","InteractiveDateComponent","Calendar_1","Calendar","View_1","View","ViewRegistry_1","defineView","getViewConfig","DayTableMixin_1","DayTableMixin","BusinessHourRenderer_1","BusinessHourRenderer","EventRenderer_1","EventRenderer","FillRenderer_1","FillRenderer","HelperRenderer_1","HelperRenderer","ExternalDropping_1","ExternalDropping","EventResizing_1","EventResizing","EventPointing_1","EventPointing","EventDragging_1","EventDragging","DateSelecting_1","DateSelecting","StandardInteractionsMixin_1","StandardInteractionsMixin","AgendaView_1","AgendaView","TimeGrid_1","TimeGrid","DayGrid_1","DayGrid","BasicView_1","BasicView","MonthView_1","MonthView","ListView_1","ListView","EventDateProfile","buildUnzonedRange","forcedAllDay","forceEventDuration","isValid","isAfter","getDefaultEventEnd","isStandardProp","propName","EventRange_1","eventInstances","getAllEventRanges","sliceNormalRenderRanges","eventInstanceToEventRange","sliceRenderRanges","isInverse","sliceInverseRenderRanges","eventInstance","slicedRange","slicedEventRanges","unzonedRanges","eventInstanceToUnzonedRange","ownerDef","getEventDef","hasInverseRendering","explicitEventDef","optionsManager","processIconOverride","iconOverrideOption","setIconOverride","iconOverrideHash","iconClassesCopy","buttonName","isPlainObject","iconClasses","applyIconOverridePrefix","prefix","iconOverridePrefix","getClass","getIconClass","baseIconClass","getCustomButtonIconClass","customButtonProps","iconOverrideCustomButtonOption","attachImmediatelyResolvingThen","promise","onResolve","PromiseStub","attachImmediatelyRejectingThen","onReject","construct","executor","deferred","Deferred","exportHooks","touchMouseIgnoreWait","globalEmitter","neededCount","GlobalEmitter","isTouching","mouseIgnoreDepth","bind","needed","unneeded","unbind","touchstart","handleTouchStart","touchcancel","handleTouchCancel","touchend","handleTouchEnd","mousedown","handleMouseDown","mousemove","handleMouseMove","mouseup","handleMouseUp","handleClick","selectstart","handleSelectStart","contextmenu","handleContextMenu","addEventListener","handleTouchMoveProxy","handleTouchMove","Event","passive","handleScrollProxy","handleScroll","removeEventListener","stopTouch","shouldIgnoreMouse","skipMouseIgnore","startTouchMouseIgnore","viewName","viewConfig","viewHash","isHitsEqual","hit0","hit1","isHitPropsWithin","subHit","superHit","HitDragListener","handleInteractionStart","subjectRect","origPoint","subjectEl","hitsNeeded","computeScrollBounds","origHit","queryHit","subjectCenter","coordAdjust","handleDragStart","hit","handleHitOver","handleDrag","dx","dy","handleHitOut","handleDragEnd","handleHitDone","isOrig","handleInteractionEnd","isCancelled","hitsNotNeeded","handleScrollEnd","isDragging","releaseHits","prepareHits","populateInstanceComputableOptions","instanceComputableOptions","localeCode","dpLocaleCode","dpOptions","fcOptions","localeOptionHash","isRTL","weekNumberTitle","weekHeader","dpComputableOptions","jqDatePicker","datepicker","regional","en","setDefaults","newFcOptions","momOptions","options_1","mergeOptions","getMomentLocaleData","momComputableOptions","globalDefaults","localeData","locales","prev","prevText","nextText","today","currentText","monthYearFormat","showMonthAfterYear","yearSuffix","dayOfMonthFormat","longDateFormat","mediumTimeFormat","smallTimeFormat","extraSmallTimeFormat","hourFormat","noMeridiemTimeFormat","smallDayDateFormat","weekFormat","smallWeekFormat","englishDefaults","optionObjs","complexOptions","titleRangeSeparator","defaultTimedEventDuration","defaultAllDayEventDuration","nextDayThreshold","columnHeader","aspectRatio","weekends","weekNumbers","weekNumberCalculation","scrollTime","minTime","maxTime","showNonCurrentDates","lazyFetching","startParam","endParam","timezoneParam","prevYear","nextYear","month","day","agendaEventMinHeight","theme","dragOpacity","dragRevertDuration","dragScroll","unselectAuto","dropAccept","eventOrder","eventLimit","eventLimitText","eventLimitClick","dayPopoverFormat","handleWindowResize","windowResizeDelay","longPressDelay","rtlDefaults","buttonIcons","themeButtonIcons","members","SubClass","mixin","generateId","copy","rawId","getRendering","hasBgRendering","getConstraint","getOverlap","isStartExplicitlyEditable","isDurationExplicitlyEditable","isExplicitlyEditable","_id","applyMiscProps","eventDefsToEventInstances","eventRangeToEventFootprint","eventRange","eventFootprintToComponentFootprint","eventFootprint","componentFootprint","getEventLegacy","EventDefDateMutation_1","SingleEventDef_1","createFromRawProps","largeUnit","dateMutation","defMutation","dateProps","standardProps","verbatimStandardProps","createFromDiff","mutateSingle","origDateProfile","buildNewDateProfile","setDateMutation","isEmpty","sourceClasses","registerClass","EventSourceClass","eventSource","overflowX","overflowY","renderEl","applyOverflow","scrollEl","setHeight","overflow-x","overflow-y","lockOverflow","scrollWidth","scrollHeight","getScrollTop","setScrollTop","getClientWidth","getClientHeight","GlobalEmitter_1","_view","_options","segSelector","dateSelectingClass","dateClicking","dateClickingClass","dateSelecting","eventPointingClass","eventPointing","eventDraggingClass","eventDragging","eventResizingClass","eventResizing","externalDroppingClass","externalDropping","setElement","bindToEl","bindAllSegHandlersToEl","removeElement","endInteractions","executeEventUnrender","bindGlobalHandlers","bindToDocument","unbindGlobalHandlers","unbindFromDocument","bindDateHandlerToEl","is","eventInteraction","bindSegHandlerToEl","segEl","currentTarget","seg","shouldIgnoreEventPointing","shouldIgnoreTouch","isSelected","selectedEvent","isResizing","canStartSelection","canStartResize","isEventDefDraggable","footprint","isEventDefResizable","canStartDrag","isEventDefSelected","interaction","isEventDefStartEditable","isEditable","isEventDefGenerallyEditable","isEventDefResizableFromStart","isEventDefResizableFromEnd","isResizable","diffDates","isEventInstanceGroupAllowed","eventInstanceGroup","eventFootprints","eventRangesToEventFootprints","validUnzonedRange","constraints","isExternalInstanceGroupAllowed","isSelectionFootprintAllowed","DateProfileGenerator_1","viewSpec","batchRenderDepth","initRenderQueue","initHiddenDays","dateProfileGenerator","dateProfileGeneratorClass","bindBaseRenderHandlers","eventOrderSpecs","renderQueue","onRenderQueueStart","onRenderQueueStop","startBatchRender","stopBatchRender","freezeContentHeight","addScroll","queryScroll","updateViewSize","popScroll","thawContentHeight","pause","resume","requestRender","namespace","queue","whenSizeUpdated","isRunning","computeTitle","currentRangeUnit","currentUnzonedRange","activeUnzonedRange","isRangeAllDay","computeTitleFormat","setDate","currentDateProfile","newDateProfile","build","unsetDate","unset","fetchInitialEvents","forceAllDay","usesMinMaxTime","requestEvents","bindEventChanges","resetEvents","unbindEventChanges","setEvents","eventsPayload","unsetEvents","requestDateRender","executeDateRender","requestDateUnrender","executeDateUnrender","isDateInit","startNowIndicator","unselect","stopNowIndicator","triggerViewRender","triggerViewDestroy","publiclyTrigger","requestEventsRender","executeEventRender","triggerAfterEventsRendered","requestEventsUnrender","triggerBeforeEventsDestroyed","requestBusinessHoursRender","businessHourGenerator","renderBusinessHours","requestBusinessHoursUnrender","unrenderBusinessHours","processUnselect","handleDocumentMousedown","delay","getNowIndicatorUnit","initialNowDate","getNow","initialNowQueriedMs","startOf","nowIndicatorTimeoutID","nowIndicatorIntervalID","updateNowIndicator","isDatesRendered","unrenderNowIndicator","renderNowIndicator","isNowIndicatorRendered","clearTimeout","updateSize","totalHeight","isAuto","isResize","scroll","queuedScroll","applyQueuedScroll","applyScroll","queryDateScroll","computeInitialDateScroll","applyDateScroll","reportEventDrop","eventMutation","eventManager","undoFunc","mutateEventsWithId","triggerEventDrop","dateDelta","reportExternalDrop","singleEventDef","isEvent","isSticky","ui","addEventDef","triggerExternalDrop","reportEventResize","triggerEventResize","endDelta","durationDelta","renderSelectionFootprint","reportSelection","triggerSelect","footprintToDateProfile","unrenderSelection","selectEventInstance","selectedEventInstance","unselectEventInstance","getEventSegs","processRangeUnselect","processEventUnselect","ignore","closest","triggerBaseRendered","triggerBaseUnrendered","triggerDayClick","dayEl","isDateInOtherMonth","getUnzonedRangeOption","parseUnzonedRange","hiddenDays","isHiddenDayHash","dayCnt","inArray","trimHiddenDays","inputUnzonedRange","skipHiddenDays","isHiddenDay","inc","isExclusive","out","deps","initialEvents","intervalStart","intervalEnd","fillRenderer","rangeUpdated","displayEventTime","displayEventEnd","eventTimeFormat","computeEventTimeFormat","computeDisplayEventTime","computeDisplayEventEnd","instanceGroup","eventRanges","_getDateProfile","bgRanges","fgRanges","renderBgRanges","renderFgRanges","unrender","unrenderBgRanges","unrenderFgRanges","segs","eventFootprintsToSegs","renderFgSegEls","renderFgSegs","fgSegs","unrenderFgSegs","renderBgSegs","bgSegs","unrenderBgSegs","getSegs","concat","renderSegs","getClasses","getBgClasses","getCss","background-color","getBgColor","filterEl","filterEventRenderEl","disableResizing","hasEventRenderHandlers","hasPublicHandlers","html","renderedSegs","beforeFgSegHtml","fgSegHtml","getSegClasses","isDraggable","legacy","custom","getTimeText","displayEnd","_getTimeText","classNames","objs","getStylingObjs","eventClassName","getSkinCss","border-color","getBorderColor","getTextColor","eventBackgroundColor","eventColor","eventBorderColor","eventTextColor","getFallbackStylingObjs","sortEventSegs","compareEventSegs","seg1","seg2","f1","f2","cf1","cf2","r1","r2","englishMoment","renderFakeFormatString","getParsedFormatString","fakeFormatString","date1","date2","separator","renderParsedFormat","parsedFormat","leftI","rightI","middleI","sameUnits","unzonedDate1","unzonedDate2","renderedParts1","renderFakeFormatStringParts","renderedParts2","leftStr","rightStr","middleStr1","middleStr2","middleStr","isSame","processMaybeMarkers","parsedFormatStrCache","parseFormatString","chunks","chunkFormatString","buildFakeFormatString","buildSameUnits","match","chunker","splitStringLiteral","maybe","chunk","specialTokens","SPECIAL_TOKEN_MARKER","MAYBE_MARKER","PART_SEPARATOR","tokenInfo","units","largeTokenMap","fakePart","fakeRender","fakeParts","MAYBE_REGEXP","m0","m1","candidate","best","RegExp","t","T","Y","M","W","w","D","_watchers","_props","applyGlobalWatchers","constructed","_globalWatchArgs","newProps","setProps","reset","oldProps","changeset","names","changedProps","changedCnt","depList","startFunc","stopFunc","unwatch","_watchDeps","watcher","teardown","queuedChangeCnt","depCnt","satisfyCnt","values","bindTuples","isCallingStop","onBeforeDepChange","depName","isOptional","onDepChange","flash","RecurringEventDef_1","eventInput","EventDefDateMutation","clearEnd","forceTimed","dateProfile0","dateProfile1","subtractDates","date0","endDiff","mutation","subtract","setDateDelta","setEndDelta","eventDateProfile","shouldRezone","startDelta","applyTimezone","setStartDelta","themeName","themeClass","themeClassHash","getThemeSystemClass","themeSetting","JqueryUiTheme_1","StandardTheme_1","setRawEventDefs","currentTimezone","isHorizontal","isVertical","forcedOffsetParentEl","offsetParent","offsetParentEl","boundingRect","queryBoundingRect","buildElHorizontals","buildElVerticals","lefts","rights","tops","bottoms","ensureBuilt","getHorizontalIndex","leftOffset","getVerticalIndex","topOffset","getLeftOffset","leftIndex","getLeftPosition","getRightOffset","getRightPosition","getWidth","getTopOffset","topIndex","getTopPosition","getBottomOffset","getBottomPosition","getHeight","scrollParentEl","isPointInBounds","isLeftInBounds","isTopInBounds","isInteracting","isDistanceSurpassed","isDelayEnded","isTouch","isGeneric","shouldCancelTouchScroll","scrollAlwaysKills","isAutoScroll","scrollSensitivity","scrollSpeed","scrollIntervalMs","startInteraction","extraOptions","minDistance","distance","originX","originY","bindHandlers","initAutoScroll","startDelay","handleDistanceSurpassed","endInteraction","endDrag","delayTimeoutId","destroyAutoScroll","unbindHandlers","drag","handleMove","dragstop","touchmove","handleTouchScroll","startDrag","updateAutoScroll","initialEv","handleDelayEnd","handleDebouncedScroll","endAutoScroll","scrollBounds","topCloseness","bottomCloseness","leftCloseness","rightCloseness","sensitivity","bounds","topVel","leftVel","setScrollVel","scrollTopVel","scrollLeftVel","constrainScrollVel","scrollIntervalId","scrollIntervalFunc","frac","updateDayTable","daysPerRow","rowCnt","msToUtcMoment","renderUnzonedRange","dayIndex","dayIndices","dayDates","isBefore","breakOnWeeks","updateDayTableCols","colCnt","computeColCnt","colHeadFormat","computeColHeadFormat","getCellDate","col","getCellDayIndex","getCellRange","getColDayIndex","getDateDayIndex","dayOffset","sliceRangeByRow","rowFirst","rowLast","segFirst","segLast","normalRange","computeDayRange","rangeFirst","rangeLast","firstRowDayIndex","lastRowDayIndex","sliceRangeByDay","renderHeadHtml","renderHeadTrHtml","renderHeadIntroHtml","renderIntroHtml","renderHeadDateCellsHtml","htmls","renderHeadDateCellHtml","colspan","otherAttrs","innerHtml","isDateValid","getDayClasses","buildGotoAnchorHtml","forceOff","renderBgTrHtml","renderBgIntroHtml","renderBgCellsHtml","renderBgCellHtml","bookendCells","trEl","introHtml","buildEventInstanceGroup","hasAllDayBusinessHours","renderEventFootprints","fillSegTag","elsByFill","renderFootprint","componentFootprintToSegs","buildSegEls","attachSegEls","reportEls","buildSegHtml","eventRenderer","renderComponentFootprint","fabricateEventFootprint","renderEventDraggingFootprints","sourceSeg","renderEventResizingFootprints","extraClassNames","opacity","helperEls","dummyInstance","dummyEvent","Interaction_1","handleMouseover","handleMouseout","mousedOverSeg","DateClicking_1","Popover_1","DayGridEventRenderer_1","DayGridHelperRenderer_1","DayGridFillRenderer_1","cellWeekNumbersVisible","bottomCoordPadding","isRigid","leftCol","rightCol","renderDates","renderGrid","unrenderDates","removeSegPopover","headContainerEl","renderDayRowHtml","cellEls","rowCoordCache","colCoordCache","getCellEl","getIsNumbersVisible","renderNumberTrHtml","getIsDayNumbersVisible","renderNumberIntroHtml","renderNumberCellsHtml","renderNumberCellHtml","weekCalcFirstDoW","isDayNumberVisible","firstDayOfWeek","getCellHit","getHitFootprint","getHitEl","getOwnEventSegs","popoverSegs","renderDrag","renderHighlight","helperRenderer","unrenderDrag","unrenderHighlight","renderEventResize","unrenderEventResize","segPopover","hide","limitRows","levelLimit","rowLevelLimit","rowStructs","unlimitRow","computeRowLevelLimit","limitRow","iterInnerHeights","childNode","trHeight","rowEl","rowHeight","trEls","tbodyEl","levelSegs","cellMatrix","limitedNodes","segsBelow","totalSegsBelow","colSegsBelow","td","rowspan","segMoreNodes","moreTd","moreWrap","moreLink","rowStruct","moreNodes","emptyCellsUntil","endCol","getCellSegs","renderMoreLink","segLevels","attr","after","moreEls","limitedEls","hiddenSegs","getMoreLinkText","clickOption","moreEl","allSegs","reslicedAllSegs","resliceDaySegs","reslicedHiddenSegs","showSegPopover","zoomTo","topEl","content","renderSegPopoverContent","parentEl","autoHide","viewportConstrain","triggerBeforeEventSegsDestroyed","triggerAfterEventSegsRendered","segContainer","dayDate","dayEnd","dayRange","newSegs","num","startLevel","segMatrix","level","eventRendererClass","businessHourRendererClass","helperRendererClass","fillRendererClass","makeDayGridSubclass","SuperClass","colWeekNumbersVisible","weekNumberStyleAttr","weekStart","BasicViewDateProfileGenerator_1","dayGrid","instantiateDayGrid","hasRigidRows","addChild","scroller","dayGridClass","renderSkeleton","dayGridContainerEl","dayGridEl","renderSkeletonHtml","unrenderSkeleton","weekNumberWidth","scrollerHeight","headRowEl","computeScrollerHeight","setGridHeight","isOverlapsAllowedByFunc","overlapEventFootprints","overlapFunc","subjectEventInstance","isOverlapEventInstancesAllowed","overlapEventInstance","overlapEventDef","overlapVal","subjectLegacyInstance","_calendar","peerEventInstances","getPeerEventInstances","peerEventRanges","peerEventFootprints","constraintVal","eventAllowFunc","isFootprintAllowed","getEventInstancesWithoutId","selectAllowFunc","getEventInstances","constraintFootprints","constraintValToFootprints","isFootprintWithinConstraints","collectOverlapEventFootprints","footprintContainsFootprint","buildCurrentBusinessFootprints","parseEventDefToInstances","eventInstancesToFootprints","parseFootprints","getEventInstancesWithId","targetFootprint","footprintsIntersect","currentPeriod","eventRangeToEventFootprints","outerFootprint","innerFootprint","footprint0","footprint1","ParsableModelMixin","propDefs","proto","standardPropMap","manualProps","EventInstance","RecurringEventDef","zonedDayStart","instanceStart","instanceEnd","unzonedDate","unzonedEnd","instances","dowHash","setDow","dowNumbers","dow","EventRange","BUSINESS_HOUR_EVENT_DEFAULTS","rawComplexDef","buildEventDefs","rawDefs","requireDow","defs","buildEventDef","rawDef","fullRawDef","StandardTheme","widget","widgetHeader","widgetContent","buttonGroup","button","cornerLeft","cornerRight","stateDefault","stateActive","stateDisabled","stateHover","stateDown","popoverHeader","popoverContent","headerRow","dayRow","listView","JqueryUiTheme","pushLoading","popLoading","ajaxSettings","onSuccess","success","onError","requestParams","buildRequestParams","ajax","AJAX_DEFAULTS","xhr","callbackRes","statusText","errorThrown","customRequestParams","params","dataType","cache","q","isPaused","tryStart","getIsIdle","canRunNext","runRemaining","runTask","waitsByNamespace","taskFunc","waitMs","waitNamespace","delayWait","clearWait","compoundTask","startWait","spawnWait","waitId","shouldAppend","convertEventsPayloadToLegacyArray","legacyEvents","Component_1","util_2","hitsNeededDepth","childrenByUid","businessHourRenderer","child","removeChild","callChildren","_getCalendar","getBusinessHourSegs","getOwnBusinessHourSegs","iterChildren","showEventsWithId","hideEventsWithId","renderedHelper","getSafeHitFootprint","eventFootprintToSegs","gotoOptions","finalOptions","stringify","getAllDayHtml","noThemeHighlight","currentRangeAs","startDay","endTimeMS","endDay","isMultiDayRange","filterLegacyEventInstances","legacyEventInstances","legacyQuery","legacyEventInstance","Iterator_1","Toolbar_1","OptionsManager_1","ViewSpecManager_1","EventManager_1","overrides","loadingLevel","ignoreUpdateViewSize","freezeContentHeightDepth","viewsByType","viewSpecManager","initMomentInternals","initCurrentDate","initEventManager","getView","triggerInfo","optHandler","option","newOptionHash","instantiateView","viewType","spec","getViewSpec","isValidViewType","changeView","dateOrRange","recordOverrides","visibleRange","currentDate","renderView","newDate","getUnitViewSpec","defaultDateInput","prevInfo","buildPrev","nextInfo","buildNext","gotoDate","zonedDateInput","incrementDate","delta","getDate","contentEl","elementVisible","calcSize","initialRender","anchorEl","customAction","opts","themeSystem","widgetClass","businessHours","toggleClass","prependTo","initToolbars","renderHeader","renderFooter","windowResizeProxy","windowResize","clearView","toolbarsManager","proxyCall","bindViewHandlers","setToolbarsTitle","updateToolbarButtons","unbindViewHandlers","newView","oldView","currentView","reinitView","getSuggestedViewHeight","suggestedViewHeight","isHeightAuto","_calcSize","contentHeightInput","heightInput","queryToolbarsHeight","forceFreezeContentHeight","computeHeaderOptions","footer","computeFooterOptions","extraClasses","layout","setToolbarOptions","now","todayInfo","reduce","accumulator","toolbar","zonedStartInput","zonedEndInput","buildSelectFootprint","_week","monthNames","_months","monthNamesShort","_monthsShort","dayNames","_weekdays","dayNamesShort","_weekdaysShort","localizeMoment","getIsAmbigTimezone","adjustedZonedDate","zonedDate","toArray","timeAdjust","asMilliseconds","ignoreEnd","humanizeDuration","humanize","rangeInput","rawSources","singleRawSource","freeze","rawSource","addSource","thaw","getEventEnd","zonedStart","rerenderEvents","refetchEvents","refetchAllSources","renderEvents","eventInputs","renderEvent","stickySource","removeEvents","legacyInstances","idMap","getEventDefByUid","clientEvents","updateEvents","eventPropsArray","updateEvent","eventProps","eventDefMutation","getEventSources","otherSources","getEventSourceById","getSourceById","addEventSource","sourceInput","removeEventSources","sourceMultiQuery","sources","removeAllSources","multiQuerySources","removeSource","removeEventSource","sourceQuery","querySources","refetchEventSources","refetchSource","DateProfileGenerator","prevDate","nextDate","forceToValid","currentInfo","isDateAllDay","buildValidRange","buildCurrentRangeInfo","buildRenderRange","adjustActiveRange","buildDateIncrement","dayCount","durationUnit","buildRangeFromDuration","buildRangeFromDayCount","buildCustomVisibleRange","getFallbackDuration","computeRes","alignment","dateIncrementInput","dateIncrementDuration","customAlignment","runningCount","visibleUnzonedRange","fallback","getDraggedElMeta","stick","dataAttrPrefix","HitDragListener_1","dragListener","dragstart","sortstart","accept","listenToExternalDrag","interactionStart","hitOver","mutatedEventInstanceGroup","isAllowed","hitFootprint","computeExternalDrop","hitOut","hitDone","interactionEnd","buildDragListener","resizeMutation","dragStart","segResizeStart","origHitFootprint","computeEventStartResizeMutation","computeEventEndResizeMutation","buildMutatedEventInstanceGroup","segResizeStop","startFootprint","endFootprint","origEventFootprint","origRange","MouseFollower_1","getSelectionDelay","handleMousedown","settings","buildSelectListener","mouseFollower","additionalClass","revertDuration","zIndex","segDragStart","origFootprint","computeEventDropMutation","stop","segDragStop","computeEventDateMutation","getDelay","selectionFootprint","computeSelection","wholeFootprint","computeSelectionFootprint","groupEventFootprintsByAllDay","timed","agendaTimeGridMethods","agendaDayGridMethods","timeGrid","instantiateTimeGrid","timeGridClass","timeGridWrapEl","timeGridEl","axisStyleAttr","axisWidth","colEls","noScrollRowEls","bottomRuleEl","getTotalSlatHeight","computeTimeTop","dayEventsPayload","timedEventsPayload","groups","weekText","TimeGridEventRenderer_1","TimeGridHelperRenderer_1","TimeGridFillRenderer_1","AGENDA_STOCK_SUB_DURATIONS","processOptions","sliceRangeByTimes","segRange","dayRanges","slotDuration","snapDuration","snapsPerSlot","labelFormat","labelInterval","computeLabelInterval","slotsPerLabel","renderSlats","renderColumns","unrenderColumns","slatContainerEl","renderSlatRowHtml","slatEls","slatCoordCache","slotDate","isLabeled","axisHtml","slotTime","slotIterator","renderContentSkeleton","unrenderContentSkeleton","skeletonEl","cellHtml","contentSkeletonEl","colContainerEls","helperContainerEls","fgContainerEls","bgContainerEls","highlightContainerEls","businessContainerEls","groupSegsByCol","segsByCol","attachSegsByCol","containerEls","computeDateTop","nowIndicatorEls","updateSegVerticals","businessSegs","startOfDayDate","slatIndex","slatRemainder","slatCoverage","computeSegVerticals","assignSegVerticals","eventMinHeight","generateSegVerticalCss","colIndex","slatTop","slatHeight","partial","localSnapIndex","snapIndex","snapTop","snapBottom","snap","computeSnapTime","BasicViewDateProfileGenerator","weekday","MonthViewDateProfileGenerator_1","ListEventRenderer_1","ListEventPointing_1","viewEnd","renderEmptyMessage","renderSegList","daySegs","segsByDay","groupSegsByDay","tableEl","dayHeaderHtml","mainFormat","altFormat","_element","singleRes","removeData","Iterator","results","Toolbar","toolbarOptions","viewsWithButtons","newToolbarOptions","sections","renderSection","sectionEl","buttonStr","calendarCustomButtons","calendarButtonTextOverrides","calendarButtonText","buttonGroupStr","groupEl","groupChildren","isOnlyButtons","buttonClick","buttonIcon","buttonInnerHtml","buttonClasses","buttonEl","buttonAriaAttr","buttonTextOverride","buttonTextDefault","hasClass","not","hover","first","updateTitle","activateButton","deactivateButton","disableButton","enableButton","getViewsWithButtons","OptionsManager","dynamicOverrides","compute","optionName","optionCnt","localeDefaults","dirDefaults","rawOptions","clearCache","ViewSpecManager","viewSpecCache","buildViewSpec","viewTypes","singleUnit","requestedViewType","viewOverrides","specChain","defaultsChain","overridesChain","buildViewSpecOptions","buildViewSpecButtonText","queryButtonText","buttonTextKey","isSourcesEquivalent","source0","source1","EventPeriod_1","EventManager","force","isWithinRange","setPeriod","whenReleased","requestSource","doomedSource","purgeSource","purgeAllSources","requestSources","getSources","matchInputs","matchingSources","matchInput","grep","eventPeriod","unbindPeriod","bindPeriod","eventId","undoFuncs","getEventDefsById","removeEventDef","defCopy","allInstances","EventPeriod","pendingCnt","freezeDepth","stuntedReleaseCnt","releaseCnt","requestsByUid","eventDefsByUid","eventDefsById","eventInstanceGroupsById","addEventDefs","tryRelease","completedCnt","eventDefUid","addEventInstance","isEmptyObject","removeEventInstancesForDef","matchingInstances","currentEventInstance","release","MouseFollower","sourceEl","isFollowing","isHidden","isAnimating","y0","x0","topDelta","leftDelta","updatePosition","shouldRevert","complete","top0","left0","animate","getEl","visibility","sourceOffset","DateClicking","dayClickHit","buildSlotSegLevels","levels","computeSlotSegCollisions","computeForwardSlotSegs","forwardSegs","computeSlotSegPressures","forwardSeg","forwardPressure","otherSegs","TimeGridEventRenderer","renderFgSegsIntoContainers","updateFgSegCoords","timeText","fullTimeText","startTimeText","isResizableFromStart","isResizableFromEnd","skinCss","zonedEnd","computeFgSegHorizontals","assignFgSegHorizontals","level0","computeFgSegForwardBack","seriesBackwardPressure","seriesBackwardCoord","forwardCoord","sortForwardSegs","backwardCoord","compareForwardSegs","generateFgSegHorizontalCss","shouldOverlap","TimeGridHelperRenderer","helperNodes","TimeGridFillRenderer","Popover","documentMousedown","viewportTop","viewportLeft","viewportOffset","windowEl","viewportEl","isDaySegCollision","otherSeg","compareDaySegCols","DayGridEventRenderer","renderSegRows","rowNode","pop","segRows","groupSegRows","renderSegRow","rowSegs","loneCellMatrix","tr","buildSegLevels","levelCnt","tbody","titleHtml","timeHtml","DayGridHelperRenderer","skeletonTopEl","skeletonTop","DayGridFillRenderer","renderFillRow","startCol","MonthViewDateProfileGenerator","ListEventRenderer","bgColor","ListEventPointing","isDefaultPrevented","Bootstrap3Theme_1","Bootstrap4Theme_1","Bootstrap3Theme","tableGrid","tableList","tableListHeading","popover","Bootstrap4Theme","fixedWeekCount","listDayFormat","noEventsMessage","listDayAltFormat","show-modal","resources-checkboxes","number-of-resources","add-reservation","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_MySchedule_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_73dcc08a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_MySchedule_vue__","readonly","change","fab","dark","multi-line","parsed-nodes","update-calendar","selected-resources","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_NodesOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_18fc6060_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_NodesOverview_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchGenerator_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_14692e23_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchGenerator_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchBox_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4fc23b68_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchBox_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_LineChart_vue__","hide-actions","expanded","owner","pid","chart-data","rerender-chart","update-chart","default-node","default-resource-type","default-metric","resources-indexes","chart-datasets","argsArray","size","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TasksOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_682605b4_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TasksOverview_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskCreate_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c5e32eee_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskCreate_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLine_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_68056994_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLine_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineParameter_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_dcbdcc6c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineParameter_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineEnvVariable_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_3a9cfdb2_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineEnvVariable_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineTfConfig_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ed523d5c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineTfConfig_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TfConfigEdit_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1f240f3d_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TfConfigEdit_vue__","auto-grow","justify-end","medium","task-type","task-index","tf-cluster","enable-smart-tf-config","enable-tf-config","tf-config","tf-config-port","tf-config-task-type","tf-config-task-index","psWorkerParameterChanged","block","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskEdit_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ab402584_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskEdit_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskSchedule_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_21a65550_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskSchedule_vue__","spawnMenu","terminateMenu","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLog_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_246122fb_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLog_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskTemplateChooser_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_775c6214_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskTemplateChooser_vue__","chosen-template","primary-title","rows-per-page-items","staticStyle","font-size","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_UsersOverview_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58aecb3a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_UsersOverview_vue__","createdAt","__WEBPACK_IMPORTED_MODULE_0_vue__","__WEBPACK_IMPORTED_MODULE_1_vuex__","__WEBPACK_IMPORTED_MODULE_2__state__","__WEBPACK_IMPORTED_MODULE_3__actions__","__WEBPACK_IMPORTED_MODULE_4__mutations__","Vuex","Store","actions","mutations","callingAPI","searching","userInfo","messages","1","2","notifications","TOGGLE_LOADING","TOGGLE_SEARCHING","SET_USER","SET_ROLE","SET_ID","SET_ACCESS_TOKEN","SET_REFRESH_TOKEN","urlParser","arr","toDateString","createElement","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_535f2ac0_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__"],"mappings":"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pJ,QAAA,CACAmJ,GAAA,CACA,OAGA,MAAAA,IAGAzH,YAAA,WACA,GAAAqB,EACA,IAAAxK,KAAA4Q,aACA,OAAAhJ,GAAA,EAAAA,EAAA5H,KAAAyP,kBAAA7H,IACA5H,KAAA4J,oBAAAhC,GAAAH,UACA+C,GACApB,MAAApJ,KAAA0Q,iBACArH,YAAArJ,KAAA2Q,uBACApH,MAAAiG,IAAAxP,KAAA+P,aAAA,IAAA/P,KAAAiQ,cAAA9F,cACAX,IAAAgG,IAAAxP,KAAAmQ,WAAA,IAAAnQ,KAAAoQ,YAAAjG,cACAb,WAAAtJ,KAAA4J,oBAAAhC,GAAApB,KACAkE,OAAAoG,SAAA9Q,KAAAC,OAAAC,MAAAoE,KAEAtE,KAAA0L,eAAAlB,QAIAxK,MAAAyQ,UAAA,MV6vCQ,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACC,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CAEH,SAAUtT,EAAQC,EAAqBC,GAE7C,YACqB,IAAIuH,GAAqCvH,EAAoB,GACzD0T,EAAuC1T,EAAoB,GAC3D2T,EAA+C3T,EAAoBG,EAAEuT,EW53C9F3T,GAAA,GACA+B,KAAA,m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,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,gBAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,UAAA,IACAC,aAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,UAAA,IACAC,aAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,aAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA,IACAC,OAAA,IACAC,UAAA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ACApkE,KAAAokE,EAAA7zB,KACAxuC,KAAAkkF,SAAAvrB,aAAA0J,EAAA7zB,MAGAiZ,GACClC,EAAApL,QACDlnB,GAAAknB,QAAAsN,EACAA,EAAA5c,UAAAoyB,0BAAA4mB,EAAA1pC,QACAsN,EAAA5c,UAAAs5C,aAAA78B,EAAAnN,SAgEA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CAEA,SAAAh9C,EAAA81B,EAAA51B,GA0NA,QAAAynF,GAAAC,EAAAC,EAAAC,GACA,GAAAr9E,EACA,KAAAA,EAAA,EAAeA,EAAAm9E,EAAA/mF,OAAmC4J,IAClD,IAAAo9E,EAAAD,EAAAn9E,GAAAmhD,cAAArI,WAAAukC,IAAAvkC,WAAA,MACA,QAGA,UAEA,QAAAwkC,GAAAH,EAAAE,GACA,GACAr9E,GACAu9E,EACAC,EACAC,EAJAC,EAAAL,EAAAvkC,UAKA,KAAA94C,EAAA,EAAeA,EA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","file":"static/js/app.923c89f30ff332c6de66.js","sourcesContent":["webpackJsonp([1],[\n/* 0 */,\n/* 1 */,\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_axios__ = __webpack_require__(54);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_axios___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_axios__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(31);\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n request: function request(method, uri, token) {\n var data = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n if (!method) {\n console.error('API function call requires method argument');\n return;\n }\n\n if (!uri) {\n console.error('API function call requires uri argument');\n return;\n }\n\n var url = __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].serverURI + uri;\n if (token !== null) {\n __WEBPACK_IMPORTED_MODULE_0_axios___default.a.defaults.headers.common['Authorization'] = token;\n }\n return __WEBPACK_IMPORTED_MODULE_0_axios___default()({ method: method, url: url, data: data });\n }\n});\n\n/***/ }),\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */,\n/* 7 */,\n/* 8 */,\n/* 9 */,\n/* 10 */,\n/* 11 */,\n/* 12 */,\n/* 13 */,\n/* 14 */,\n/* 15 */,\n/* 16 */,\n/* 17 */,\n/* 18 */,\n/* 19 */,\n/* 20 */,\n/* 21 */,\n/* 22 */,\n/* 23 */,\n/* 24 */,\n/* 25 */,\n/* 26 */,\n/* 27 */,\n/* 28 */,\n/* 29 */,\n/* 30 */,\n/* 31 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n serverURI: '',\n apiVersion: '',\n version: '',\n fixedLayout: false,\n hideLogoOnMobile: false\n});\n\n/***/ }),\n/* 32 */,\n/* 33 */,\n/* 34 */,\n/* 35 */,\n/* 36 */,\n/* 37 */,\n/* 38 */,\n/* 39 */,\n/* 40 */,\n/* 41 */,\n/* 42 */,\n/* 43 */,\n/* 44 */,\n/* 45 */,\n/* 46 */,\n/* 47 */,\n/* 48 */,\n/* 49 */,\n/* 50 */,\n/* 51 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__config__ = __webpack_require__(31);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__dash_BaseSidebar_vue__ = __webpack_require__(257);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hideseek__ = __webpack_require__(263);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_hideseek___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_hideseek__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__api__ = __webpack_require__(2);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'TheDash',\n\n components: {\n BaseSidebar: __WEBPACK_IMPORTED_MODULE_1__dash_BaseSidebar_vue__[\"a\" /* default */]\n },\n\n data: function data() {\n return {\n year: new Date().getFullYear(),\n classes: {\n fixed_layout: __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].fixedLayout,\n hide_logo: __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].hideLogoOnMobile\n },\n alert: false,\n errorMessage: ''\n };\n },\n\n computed: {\n displayName: function displayName() {\n return this.$store.state.user;\n },\n version: function version() {\n return __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].version;\n },\n apiVersion: function apiVersion() {\n return __WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* default */].apiVersion;\n }\n },\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n this.alert = true;\n },\n\n changeloading: function changeloading() {\n this.$store.commit('TOGGLE_SEARCHING');\n },\n\n\n logout: function logout() {\n var _this = this;\n\n if (this.$store.state.accessToken !== null) {\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('delete', '/user/logout', this.$store.state.accessToken).then(function (response) {\n _this.$store.commit('SET_ACCESS_TOKEN', null);\n\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', null);\n }\n if (_this.$store.state.refreshToken !== null) {\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('delete', '/user/logout/refresh_token', _this.$store.state.refreshToken).then(function (response) {\n _this.$store.commit('SET_REFRESH_TOKEN', null);\n if (window.localStorage) {\n window.localStorage.setItem('refreshToken', null);\n }\n }).catch(function (error) {\n _this.handleError(error);\n });\n }\n }).catch(function (error) {\n _this.handleError(error);\n });\n }\n this.$store.commit('SET_USER', null);\n this.$store.commit('SET_ROLE', null);\n\n if (window.localStorage) {\n window.localStorage.setItem('user', null);\n window.localStorage.setItem('role', null);\n }\n this.$router.push('/login');\n }\n }\n});\n\n/***/ }),\n/* 52 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BaseSidebarMenu_vue__ = __webpack_require__(259);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'BaseSidebar',\n\n components: { BaseSidebarMenu: __WEBPACK_IMPORTED_MODULE_0__BaseSidebarMenu_vue__[\"a\" /* default */] },\n\n mounted: function mounted() {\n window.jQuery('[data-toggle=\"hideseek\"]').off().hideseek();\n }\n});\n\n/***/ }),\n/* 53 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'BaseSidebarMenu'\n});\n\n/***/ }),\n/* 54 */,\n/* 55 */,\n/* 56 */,\n/* 57 */,\n/* 58 */,\n/* 59 */,\n/* 60 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__api__ = __webpack_require__(2);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'Login',\n\n data: function data(router) {\n return {\n section: 'Login',\n username: '',\n password: '',\n modalUsername: '',\n modalEmail: '',\n modalPassword: '',\n modalPassword2: '',\n alert: false,\n modalAlert: false,\n created: false,\n errorMessage: '',\n showModal: false,\n entry: ''\n };\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n },\n\n requestEntry: function requestEntry() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('get', '/user/authorized_keys_entry', this.$store.state.accessToken).then(function (response) {\n _this.entry = response.data;\n _this.showModal = true;\n }).catch(function (error) {\n _this.handleError(error);\n _this.modalAlert = true;\n });\n },\n copyEntryToClipboard: function copyEntryToClipboard() {\n var entryInput = document.querySelector('#entry');\n entryInput.setAttribute('type', 'text');\n entryInput.select();\n try {\n if (document.execCommand('copy')) {\n alert('Authorized keys entry is in your clipboard');\n } else {\n alert('Something went wrong, try again');\n }\n } catch (e) {\n alert('Unable to copy');\n }\n window.getSelection().removeAllRanges();\n },\n createUser: function createUser() {\n var _this2 = this;\n\n if (this.modalPassword === this.modalPassword2) {\n var modalUsername = this.modalUsername,\n modalEmail = this.modalEmail,\n modalPassword = this.modalPassword;\n\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('post', '/user/ssh_signup', this.$store.state.accessToken, { 'username': modalUsername, 'email': modalEmail, 'password': modalPassword }).then(function (response) {\n _this2.showModal = false;\n _this2.created = true;\n }).catch(function (error) {\n _this2.handleError(error);\n _this2.modalAlert = true;\n });\n } else {\n this.errorMessage = 'Passwords do not match';\n this.modalAlert = true;\n }\n },\n checkCreds: function checkCreds() {\n var _this3 = this;\n\n var username = this.username,\n password = this.password;\n\n\n this.toggleLoading();\n this.resetResponse();\n this.$store.commit('TOGGLE_LOADING');\n /* Making API call to authenticate a user */\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('post', '/user/login', this.$store.state.accessToken, { 'username': username, 'password': password }).then(function (response) {\n _this3.toggleLoading();\n\n var data = response.data;\n /* Checking if error object was returned from the server */\n if (data.error) {\n var errorName = data.error.name;\n if (errorName) {\n _this3.response = errorName === 'InvalidCredentialsError' ? 'Username/Password incorrect. Please try again.' : errorName;\n } else {\n _this3.response = data.error;\n }\n\n return;\n }\n /* Setting user in the state and caching record to the localStorage */\n if (username) {\n var accessToken = 'Bearer ' + data.access_token;\n var refreshToken = 'Bearer ' + data.refresh_token;\n var object = JSON.parse(atob(data.access_token.split('.')[1]));\n var id = object.identity;\n var role = object.user_claims.roles.length === 2 ? 'admin' : 'user';\n _this3.$store.commit('SET_USER', username);\n _this3.$store.commit('SET_ROLE', role);\n _this3.$store.commit('SET_ID', id);\n _this3.$store.commit('SET_ACCESS_TOKEN', accessToken);\n _this3.$store.commit('SET_REFRESH_TOKEN', refreshToken);\n\n if (window.localStorage) {\n window.localStorage.setItem('user', __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(username));\n window.localStorage.setItem('accessToken', accessToken);\n window.localStorage.setItem('refreshToken', refreshToken);\n window.localStorage.setItem('role', role);\n window.localStorage.setItem('userId', id);\n }\n _this3.$router.push('/');\n }\n }).catch(function (error) {\n _this3.handleError(error);\n _this3.alert = true;\n });\n },\n toggleLoading: function toggleLoading() {\n this.loading = this.loading === '' ? 'loading' : '';\n },\n resetResponse: function resetResponse() {\n this.response = '';\n }\n }\n});\n\n/***/ }),\n/* 61 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'NotFound'\n});\n\n/***/ }),\n/* 62 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_lodash__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reserve_resources_FullCalendar_vue__ = __webpack_require__(290);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reserve_resources_MySchedule_vue__ = __webpack_require__(301);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n FullCalendar: __WEBPACK_IMPORTED_MODULE_2__reserve_resources_FullCalendar_vue__[\"a\" /* default */],\n MySchedule: __WEBPACK_IMPORTED_MODULE_3__reserve_resources_MySchedule_vue__[\"a\" /* default */]\n },\n\n data: function data() {\n return {\n nodes: {},\n parsedNodes: [],\n alert: false,\n snackbar: false,\n errorMessage: '',\n updateCalendar: false,\n selectedResources: [],\n nodeCheckbox: false,\n resourceTypeCheckbox: false,\n resourceCheckbox: false,\n showSchedule: false,\n interval: null,\n time: 30000\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/nodes/metrics', this.$store.state.accessToken).then(function (response) {\n _this.nodes = response.data;\n _this.parseData();\n }).catch(function (error) {\n _this.handleError(error);\n });\n var self = this;\n this.interval = setInterval(function () {\n self.updateCalendar = !self.updateCalendar;\n }, this.time);\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.showSnackbar(error.message);\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.showSnackbar(error.response.data);\n } else {\n this.showSnackbar(error.response.data.msg);\n }\n }\n },\n\n showSnackbar: function showSnackbar(message) {\n this.errorMessage = message;\n this.snackbar = true;\n },\n\n\n loadResources: function loadResources(resources) {\n this.selectedResources = [];\n for (var id in resources) {\n if (resources[id].selected) {\n var obj = {\n nodeName: resources[id].nodeName,\n name: resources[id].resourceName,\n uuid: id,\n index: resources[id].resourceIndex\n };\n this.selectedResources.push(obj);\n }\n }\n this.updateCalendar = !this.updateCalendar;\n },\n\n toggle: function toggle(node) {\n node.open = !node.open;\n },\n\n parseData: function parseData() {\n var node, resourceType, resources, resourceTypes, tempResource, tempResourceType, tempNode, orderedResources;\n for (var nodeName in this.nodes) {\n resourceTypes = [];\n node = this.nodes[nodeName];\n resources = [];\n for (var resourceTypeName in node) {\n if (resourceTypeName === 'GPU') {\n resourceType = node[resourceTypeName];\n for (var resourceUUID in resourceType) {\n tempResource = {\n nodeName: nodeName,\n resourceUUID: resourceUUID,\n resourceName: resourceType[resourceUUID].name,\n resourceIndex: resourceType[resourceUUID].index,\n metrics: resourceType[resourceUUID].metrics\n };\n tempResource.metrics['checked'] = true;\n resources.push(tempResource);\n }\n }\n orderedResources = __WEBPACK_IMPORTED_MODULE_1_lodash___default.a.orderBy(resources, 'resourceIndex');\n tempResourceType = {\n name: resourceTypeName,\n checked: true,\n open: false,\n resources: orderedResources\n };\n resourceTypes.push(tempResourceType);\n }\n tempNode = {\n nodeName: nodeName,\n checked: true,\n open: false,\n resourceTypes: resourceTypes\n };\n this.parsedNodes.push(tempNode);\n }\n this.loadCalendar();\n },\n loadCalendar: function loadCalendar() {\n var node, resourceType, resource, obj;\n this.selectedResources = [];\n for (var i = 0; i < this.parsedNodes.length; i++) {\n node = this.parsedNodes[i];\n for (var j = 0; j < node.resourceTypes.length; j++) {\n resourceType = node.resourceTypes[j];\n for (var k = 0; k < resourceType.resources.length; k++) {\n resource = resourceType.resources[k];\n if (resource.metrics.checked) {\n obj = {\n nodeName: resource.nodeName,\n name: resource.resourceName,\n uuid: resource.resourceUUID,\n index: resource.resourceIndex\n };\n this.selectedResources.push(obj);\n }\n }\n }\n }\n this.updateCalendar = !this.updateCalendar;\n }\n }\n});\n\n/***/ }),\n/* 63 */,\n/* 64 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__FullCalendarReserve_vue__ = __webpack_require__(292);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__FullCalendarInfo_vue__ = __webpack_require__(296);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jquery__ = __webpack_require__(194);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_jquery__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_moment__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_lodash__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n__webpack_require__(299);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n FullCalendarReserve: __WEBPACK_IMPORTED_MODULE_0__FullCalendarReserve_vue__[\"a\" /* default */],\n FullCalendarInfo: __WEBPACK_IMPORTED_MODULE_1__FullCalendarInfo_vue__[\"a\" /* default */]\n },\n\n props: {\n nodes: Object,\n selectedResources: Array,\n updateCalendar: Boolean\n },\n\n watch: {\n updateCalendar: function updateCalendar() {\n this.calendar.fullCalendar('refetchEvents');\n }\n },\n\n data: function data() {\n return {\n calendar: null,\n showModalReserve: false,\n showModalInfo: false,\n reservation: {\n title: '',\n description: '',\n resourceId: '',\n start: new Date(),\n end: new Date()\n },\n reservationId: -1,\n startDate: null,\n endDate: null,\n resourcesCheckboxes: [],\n refreshTasks: false,\n parsedNodeNames: []\n };\n },\n\n\n methods: {\n handleError: function handleError(error) {\n this.$emit('handleError', error);\n },\n\n getEvents: function getEvents(start, end, callback) {\n var _this = this;\n\n var resourcesString = '';\n if (this.selectedResources.length > 0) {\n resourcesString = this.selectedResources[0].uuid;\n for (var i = 1; i < this.selectedResources.length; i++) {\n resourcesString += ',' + this.selectedResources[i].uuid;\n }\n }\n var self = this;\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('get', '/reservations?resources_ids=' + resourcesString + '&start=' + start.toISOString() + '&end=' + end.toISOString(), this.$store.state.accessToken).then(function (response) {\n if (self.reservationId !== -1) {\n for (var reservation in response.data) {\n if (response.data[reservation].id === self.reservationId) {\n self.reservation = response.data[reservation];\n self.reservation.start = __WEBPACK_IMPORTED_MODULE_4_moment___default()(self.reservation.start);\n self.reservation.end = __WEBPACK_IMPORTED_MODULE_4_moment___default()(self.reservation.end);\n }\n }\n self.reservationId = -1;\n }\n callback(response.data);\n }).catch(function (error) {\n _this.$emit('handleError', error);\n });\n var obj;\n this.resourcesCheckboxes = [];\n for (i = 0; i < this.selectedResources.length; i++) {\n obj = {\n nodeName: this.selectedResources[i].nodeName,\n name: this.selectedResources[i].name,\n uuid: this.selectedResources[i].uuid,\n index: this.selectedResources[i].index,\n checked: false,\n disabled: false\n };\n this.resourcesCheckboxes[i] = obj;\n }\n this.addResourcesHeader();\n },\n\n addResourcesHeader: function addResourcesHeader() {\n var dayStart = __WEBPACK_IMPORTED_MODULE_5_lodash___default.a.cloneDeep(this.calendar.fullCalendar('getView').start);\n for (var i = 0; i < 7; i++) {\n for (var j = 0; j < this.selectedResources.length; j++) {\n var tempReservation = {\n title: 'GPU' + this.selectedResources[j].index,\n description: this.selectedResources[j].nodeName,\n start: dayStart,\n allDay: true,\n resourceId: this.selectedResources[j].uuid,\n userId: -1\n };\n this.calendar.fullCalendar('renderEvent', tempReservation);\n }\n if (dayStart) dayStart = dayStart.add(1, 'days');\n }\n },\n\n parseNodeNames: function parseNodeNames() {\n for (var nodeName in this.nodes) {\n this.parsedNodeNames.push(nodeName);\n }\n },\n\n setColor: function setColor(resourceIndex, resourceNodeName) {\n var colors = [['#00AA00', '#00AA55', '#28A228', '#26A65B'], // green\n ['#1E90FF', '#00A4A6', '#1F3A93', '#008080'], // blue\n ['#545454', '#708090', '#696969', '#6C7A89'] // gray\n ];\n if (this.parsedNodeNames.length === 0) {\n this.parseNodeNames();\n }\n var colorIndex;\n for (var index in this.parsedNodeNames) {\n if (this.parsedNodeNames[index] === resourceNodeName) {\n colorIndex = index % colors.length;\n }\n }\n var color = colors[colorIndex][resourceIndex % colors[colorIndex].length];\n return color;\n },\n\n updateReservation: function updateReservation(reservation, newTime, newTitle, newDescription) {\n var _this2 = this;\n\n var toUpdate = {};\n if (reservation.start.toISOString() !== newTime[0].toISOString()) {\n toUpdate['start'] = newTime[0].toISOString();\n }\n if (reservation.end.toISOString() !== newTime[1].toISOString()) {\n toUpdate['end'] = newTime[1].toISOString();\n }\n if (reservation.title !== newTitle && newTitle !== '') {\n toUpdate['title'] = newTitle;\n }\n if (reservation.description !== newDescription && newDescription !== '') {\n toUpdate['description'] = newDescription;\n }\n var empty = true;\n for (var key in toUpdate) {\n if (toUpdate.hasOwnProperty(key)) {\n empty = false;\n }\n }\n if (!empty) {\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('put', '/reservations/' + reservation.id, this.$store.state.accessToken, toUpdate).then(function (response) {\n _this2.calendar.fullCalendar('refetchEvents');\n _this2.showModalInfo = false;\n }).catch(function (error) {\n _this2.$emit('handleError', error);\n });\n }\n },\n\n cancelReservation: function cancelReservation(reservation) {\n var _this3 = this;\n\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('delete', '/reservations/' + reservation.id.toString(), this.$store.state.accessToken).then(function (response) {\n _this3.calendar.fullCalendar('refetchEvents');\n _this3.showModalInfo = false;\n }).catch(function (error) {\n _this3.$emit('handleError', error);\n });\n },\n\n addReservation: function addReservation(reservation) {\n var _this4 = this;\n\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('post', '/reservations', this.$store.state.accessToken, reservation).then(function (response) {\n _this4.calendar.fullCalendar('refetchEvents');\n _this4.showModalReserve = false;\n }).catch(function (error) {\n _this4.$emit('handleError', error);\n });\n }\n },\n\n mounted: function mounted() {\n var self = this;\n this.calendar = __WEBPACK_IMPORTED_MODULE_3_jquery___default()(self.$el);\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(window).resize(function () {\n self.calendar.fullCalendar('rerenderEvents');\n });\n this.calendar.fullCalendar({\n allDaySlot: true,\n allDayText: '',\n height: 'auto',\n selectable: true,\n selectOverlap: true,\n slotEventOverlap: false,\n editable: false,\n nowIndicator: true,\n firstDay: 1,\n timezone: 'local',\n defaultView: 'agendaWeek',\n header: {\n left: 'prev,next, today, agendaWeek, week2',\n center: 'title',\n right: ''\n },\n views: {\n week: {\n columnHeaderFormat: 'ddd D/M',\n buttonText: 'One week jump'\n },\n week2: {\n type: 'agendaWeek',\n duration: { days: 7 },\n buttonText: 'One day jump',\n dateIncrement: { days: 1 },\n columnHeaderFormat: 'ddd D/M'\n }\n },\n events: function events(start, end, timezone, callback) {\n self.getEvents(start, end, callback);\n },\n eventRender: function eventRender(event, element) {\n var _this5 = this;\n\n element.find('.fc-title').append('
' + event.description);\n if (self.selectedResources.length > 6) {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('color', 'rgba(0, 0, 0, 0)');\n }\n if (!event.allDay) {\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('get', '/users/' + event.userId, self.$store.state.accessToken).then(function (response) {\n element.find('.fc-title').prepend(response.data.username.bold().big().italics() + '
');\n }).catch(function (error) {\n _this5.$emit('handleError', error);\n });\n }\n },\n eventAfterRender: function eventAfterRender(event, element, view) {\n var columnIndex;\n var resourceIndex;\n var resourceNodeName;\n for (var i = 0; i < self.selectedResources.length; i++) {\n if (self.selectedResources[i].uuid === event.resourceId) {\n columnIndex = i;\n resourceIndex = self.selectedResources[i].index;\n resourceNodeName = self.selectedResources[i].nodeName;\n }\n }\n var hoursWidth = 42;\n var scrollWidth = 16;\n var width = view.el[0].clientWidth;\n var dayWidth = (width - scrollWidth - hoursWidth) / 7;\n var eventSlotWidth = dayWidth / self.selectedResources.length;\n var eventWidth = Math.round(eventSlotWidth - 1).toString() + 'px';\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('width', eventWidth);\n if (columnIndex !== 0) {\n var margin = (Math.round(columnIndex * eventSlotWidth) - 2).toString() + 'px';\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-left', margin);\n } else {\n if (event.allDay) {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-left', '1px');\n } else {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-left', '-2px');\n }\n }\n if (event.allDay) {\n if (columnIndex) {\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('margin-top', '-36px');\n }\n __WEBPACK_IMPORTED_MODULE_3_jquery___default()(element).css('height', 17 * 2);\n }\n var c = self.setColor(resourceIndex, resourceNodeName);\n if (event.userId === self.$store.state.id) {\n c = '#15C02C'; // user specified color: green\n }\n if (event.color !== c) {\n event.color = c;\n self.calendar.fullCalendar('updateEvent', event);\n }\n },\n\n select: function select(startDate, endDate) {\n if (!startDate._ambigTime) {\n for (var i = 0; i < self.selectedResources.length; i++) {\n self.resourcesCheckboxes[i].checked = false;\n self.resourcesCheckboxes[i].disabled = false;\n }\n var events = self.calendar.fullCalendar('clientEvents');\n var id;\n for (i = 0; i < events.length; i++) {\n if (!events[i].allDay) {\n if (events[i].end > startDate && events[i].start < endDate) {\n for (var j = 0; j < self.selectedResources.length; j++) {\n if (self.selectedResources[j].uuid === events[i].resourceId) {\n id = j;\n }\n }\n self.resourcesCheckboxes[id].disabled = true;\n }\n }\n }\n self.startDate = startDate.toDate();\n self.endDate = endDate.toDate();\n setTimeout(function () {\n self.showModalReserve = true;\n }, 100);\n }\n },\n\n eventClick: function eventClick(calEvent, jsEvent, view) {\n if (!calEvent.allDay) {\n self.reservationId = calEvent.id;\n self.calendar.fullCalendar('refetchEvents');\n self.refreshTasks = !self.refreshTasks;\n self.showModalInfo = true;\n }\n },\n viewRender: function viewRender(view, element) {\n self.calendar.fullCalendar('refetchEvents');\n }\n });\n }\n});\n\n/***/ }),\n/* 65 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'FullCalendarReserve',\n\n props: {\n showModal: Boolean,\n startDate: Date,\n endDate: Date,\n resourcesCheckboxes: Array,\n numberOfResources: Number,\n addReservation: Function\n\n },\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n startDate: function startDate() {\n if (this.startTime !== null) {\n this.newStartDate = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.startDate).format('YYYY-MM-DD');\n this.newStartTime = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.startDate).format('HH:mm');\n } else {\n this.newStartDate = '';\n this.newStartTime = '';\n }\n },\n endDate: function endDate() {\n if (this.endTime !== null) {\n this.newEndDate = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.endDate).format('YYYY-MM-DD');\n this.newEndTime = __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.endDate).format('HH:mm');\n } else {\n this.newEndDate = '';\n this.newEndTime = '';\n }\n }\n },\n\n data: function data() {\n return {\n startTimeMenu: false,\n startDateMenu: false,\n endTimeMenu: false,\n endDateMenu: false,\n newStartDate: '',\n newStartTime: '',\n newEndDate: '',\n newEndTime: '',\n showInfo: false,\n reservationTitle: '',\n reservationDescription: '',\n show: false\n };\n },\n\n\n methods: {\n close: function close() {\n this.showInfo = false;\n this.$emit('close');\n },\n\n anyChecked: function anyChecked() {\n var anyChecked = false;\n for (var checkbox in this.resourcesCheckboxes) {\n if (this.resourcesCheckboxes[checkbox].checked) {\n anyChecked = true;\n break;\n }\n }\n return anyChecked;\n },\n\n reservation: function reservation() {\n var tempReservation;\n if (this.anyChecked()) {\n for (var i = 0; i < this.numberOfResources; i++) {\n if (this.resourcesCheckboxes[i].checked) {\n tempReservation = {\n title: this.reservationTitle,\n description: this.reservationDescription,\n start: __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.newStartDate + 'T' + this.newStartTime).toISOString(),\n end: __WEBPACK_IMPORTED_MODULE_0_moment___default()(this.newEndDate + 'T' + this.newEndTime).toISOString(),\n resourceId: this.resourcesCheckboxes[i].uuid,\n userId: parseInt(this.$store.state.id)\n };\n this.addReservation(tempReservation);\n }\n }\n } else {\n this.showInfo = true;\n }\n }\n }\n});\n\n/***/ }),\n/* 66 */,\n/* 67 */,\n/* 68 */,\n/* 69 */,\n/* 70 */,\n/* 71 */,\n/* 72 */,\n/* 73 */,\n/* 74 */,\n/* 75 */,\n/* 76 */,\n/* 77 */,\n/* 78 */,\n/* 79 */,\n/* 80 */,\n/* 81 */,\n/* 82 */,\n/* 83 */,\n/* 84 */,\n/* 85 */,\n/* 86 */,\n/* 87 */,\n/* 88 */,\n/* 89 */,\n/* 90 */,\n/* 91 */,\n/* 92 */,\n/* 93 */,\n/* 94 */,\n/* 95 */,\n/* 96 */,\n/* 97 */,\n/* 98 */,\n/* 99 */,\n/* 100 */,\n/* 101 */,\n/* 102 */,\n/* 103 */,\n/* 104 */,\n/* 105 */,\n/* 106 */,\n/* 107 */,\n/* 108 */,\n/* 109 */,\n/* 110 */,\n/* 111 */,\n/* 112 */,\n/* 113 */,\n/* 114 */,\n/* 115 */,\n/* 116 */,\n/* 117 */,\n/* 118 */,\n/* 119 */,\n/* 120 */,\n/* 121 */,\n/* 122 */,\n/* 123 */,\n/* 124 */,\n/* 125 */,\n/* 126 */,\n/* 127 */,\n/* 128 */,\n/* 129 */,\n/* 130 */,\n/* 131 */,\n/* 132 */,\n/* 133 */,\n/* 134 */,\n/* 135 */,\n/* 136 */,\n/* 137 */,\n/* 138 */,\n/* 139 */,\n/* 140 */,\n/* 141 */,\n/* 142 */,\n/* 143 */,\n/* 144 */,\n/* 145 */,\n/* 146 */,\n/* 147 */,\n/* 148 */,\n/* 149 */,\n/* 150 */,\n/* 151 */,\n/* 152 */,\n/* 153 */,\n/* 154 */,\n/* 155 */,\n/* 156 */,\n/* 157 */,\n/* 158 */,\n/* 159 */,\n/* 160 */,\n/* 161 */,\n/* 162 */,\n/* 163 */,\n/* 164 */,\n/* 165 */,\n/* 166 */,\n/* 167 */,\n/* 168 */,\n/* 169 */,\n/* 170 */,\n/* 171 */,\n/* 172 */,\n/* 173 */,\n/* 174 */,\n/* 175 */,\n/* 176 */,\n/* 177 */,\n/* 178 */,\n/* 179 */,\n/* 180 */,\n/* 181 */,\n/* 182 */,\n/* 183 */,\n/* 184 */,\n/* 185 */,\n/* 186 */,\n/* 187 */,\n/* 188 */,\n/* 189 */,\n/* 190 */,\n/* 191 */,\n/* 192 */,\n/* 193 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'FullCalendarInfo',\n\n props: {\n showModal: Boolean,\n reservation: Object,\n cancel: Function,\n update: Function,\n refreshTasks: Boolean,\n nodes: Object\n },\n\n computed: {\n actionsAbility: function actionsAbility() {\n return this.reservation.userId === this.$store.state.id || this.$store.state.role === 'admin';\n },\n gpuUtilAvg: function gpuUtilAvg() {\n if (this.reservation.gpuUtilAvg === null) {\n return 'Reservation is not completed yet, no data';\n } else if (this.reservation.gpuUtilAvg === -1) {\n return 'This GPU does not support NVIDIA-SMI';\n } else {\n return this.reservation.gpuUtilAvg + '%';\n }\n },\n memUtilAvg: function memUtilAvg() {\n if (this.reservation.memUtilAvg === null) {\n return 'Reservation is not completed yet, no data';\n } else if (this.reservation.memUtilAvg === -1) {\n return 'This GPU does not support NVIDIA-SMI';\n } else {\n return this.reservation.memUtilAvg + '%';\n }\n },\n reservationTitle: function reservationTitle() {\n return this.reservation.title;\n },\n reservationDescription: function reservationDescription() {\n return this.reservation.description;\n },\n reservationStart: function reservationStart() {\n return this.reservation.start;\n },\n reservationEnd: function reservationEnd() {\n return this.reservation.end;\n }\n },\n\n watch: {\n reservation: function reservation() {\n for (var nodeName in this.nodes) {\n for (var gpuUUID in this.nodes[nodeName].GPU) {\n if (gpuUUID === this.reservation.resourceId) {\n var resource = this.nodes[nodeName].GPU[gpuUUID];\n this.reservation['hostname'] = nodeName;\n this.reservation['resourceIndex'] = resource.index;\n this.reservation['resourceName'] = resource.name;\n }\n }\n }\n },\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n refreshTasks: function refreshTasks() {\n this.getTasks();\n },\n reservationTitle: function reservationTitle() {\n this.newTitle = this.reservationTitle;\n },\n reservationDescription: function reservationDescription() {\n this.newDescription = this.reservationDescription;\n },\n reservationStart: function reservationStart() {\n if (this.reservationStart !== null) {\n this.newStartDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationStart).format('YYYY-MM-DD');\n this.newStartTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationStart).format('HH:mm');\n } else {\n this.newStartDate = '';\n this.newStartTime = '';\n }\n },\n reservationEnd: function reservationEnd() {\n if (this.reservationEnd !== null) {\n this.newEndDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationEnd).format('YYYY-MM-DD');\n this.newEndTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.reservationEnd).format('HH:mm');\n } else {\n this.newEndDate = '';\n this.newEndTime = '';\n }\n }\n },\n\n data: function data() {\n return {\n tasksCard: false,\n cancelCard: false,\n updateCard: false,\n newTitle: '',\n newDescription: '',\n startTimeMenu: false,\n startDateMenu: false,\n endTimeMenu: false,\n endDateMenu: false,\n newStartDate: '',\n newStartTime: '',\n newEndDate: '',\n newEndTime: '',\n pagination: {\n sortBy: 'name'\n },\n tasks: [],\n selected: [],\n selectedIndex: 0,\n headers: [{ text: 'ID', value: 'id' }, { text: 'Command', value: 'command' }, { text: 'Spawn at', value: 'spawnAt' }, { text: 'Terminate at', value: 'terminateAt' }],\n tableKey: 0,\n actionFlag: false,\n showAlert: false,\n show: false\n };\n },\n\n\n methods: {\n prettyDate: function prettyDate(date) {\n if (date !== null) {\n return __WEBPACK_IMPORTED_MODULE_1_moment___default()(date).format('dddd, MMMM Do, HH:mm');\n } else {\n return null;\n }\n },\n\n\n getTasks: function getTasks() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks?userId=' + this.$store.state.id + '&syncAll=false', this.$store.state.accessToken).then(function (response) {\n _this.tasks = response.data.tasks;\n }).catch(function (error) {\n _this.$emit('handleError', error);\n });\n },\n\n checkActionFlag: function checkActionFlag() {\n if (this.actionFlag === false) {\n this.actionFlag = true;\n this.showAlert = true;\n this.scheduleTasks();\n }\n },\n\n scheduleTasks: function scheduleTasks() {\n var _this2 = this;\n\n var id;\n id = this.selected[this.selectedIndex].id;\n var newTask = this.adjustHostAndCommand();\n newTask['spawnAt'] = this.reservation.start;\n newTask['terminateAt'] = this.reservation.end;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/tasks/' + id, this.$store.state.accessToken, newTask).then(function (response) {\n _this2.getTask(id);\n }).catch(function (error) {\n _this2.$emit('handleError', error);\n _this2.getTask(id);\n });\n },\n\n adjustHostAndCommand: function adjustHostAndCommand() {\n for (var nodeName in this.nodes) {\n for (var gpuUUID in this.nodes[nodeName].GPU) {\n if (gpuUUID === this.reservation.resourceId) {\n return {\n hostname: nodeName,\n command: this.setCommand(this.nodes[nodeName].GPU[gpuUUID].index)\n };\n }\n }\n }\n return {};\n },\n\n setCommand: function setCommand(index) {\n var command = this.selected[this.selectedIndex].command;\n var splitCommand = command.split(' ');\n splitCommand[0] = 'CUDA_VISIBLE_DEVICES=' + index;\n return splitCommand.join(' ');\n },\n\n getTask: function getTask(id) {\n var _this3 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this3.updateTask(id, response.data.task);\n _this3.selectedIndex++;\n if (_this3.selectedIndex < _this3.selected.length) {\n _this3.scheduleTasks();\n } else {\n _this3.selectedIndex = 0;\n _this3.actionFlag = false;\n _this3.showAlert = false;\n }\n }).catch(function (error) {\n _this3.$emit('handleError', error);\n _this3.selectedIndex++;\n if (_this3.selectedIndex < _this3.selected.length) {\n _this3.scheduleTasks();\n } else {\n _this3.selectedIndex = 0;\n _this3.actionFlag = false;\n _this3.showAlert = false;\n }\n });\n },\n\n updateTask: function updateTask(id, newData) {\n for (var index in this.tasks) {\n if (this.tasks[index].id === id) {\n if (newData !== null) {\n this.tasks[index] = newData;\n } else {\n this.tasks.splice(index, 1);\n }\n }\n }\n this.tableKey++;\n },\n\n toggleAll: function toggleAll() {\n if (this.selected.length) this.selected = [];else this.selected = this.tasks.slice();\n },\n changeSort: function changeSort(column) {\n if (this.pagination.sortBy === column) {\n this.pagination.descending = !this.pagination.descending;\n } else {\n this.pagination.sortBy = column;\n this.pagination.descending = false;\n }\n },\n\n\n close: function close() {\n this.$emit('close');\n },\n\n cancelReservation: function cancelReservation() {\n this.cancel(this.reservation);\n },\n\n updateReservation: function updateReservation() {\n var newTime = [__WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newStartDate + 'T' + this.newStartTime), __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newEndDate + 'T' + this.newEndTime)];\n this.update(this.reservation, newTime, this.newTitle, this.newDescription);\n }\n }\n});\n\n/***/ }),\n/* 194 */,\n/* 195 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(196);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__api__ = __webpack_require__(2);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n data: function data() {\n return {\n tableContent: {\n nodes: {},\n resources: {},\n header: [],\n hours: []\n },\n scheduleStart: '',\n scheduleEnd: '',\n resourcesIds: [],\n startMoment: {},\n leftTableKey: 0,\n rightTableKey: 0,\n picker: new Date().toISOString().substr(0, 10),\n menu: false,\n landscape: false,\n reactive: false,\n range: 7,\n changeAllCheckbox: true,\n selectedNodes: 0,\n allFlag: false,\n nodeFlag: false\n };\n },\n\n\n props: {\n parsedNodes: Array\n },\n\n watch: {\n parsedNodes: function parsedNodes() {\n this.fillTable();\n }\n },\n\n methods: {\n changeAll: function changeAll() {\n this.allFlag = true;\n for (var nodeName in this.tableContent.nodes) {\n this.tableContent.nodes[nodeName].selected = this.changeAllCheckbox;\n this.changeWholeNode(nodeName);\n }\n this.allFlag = false;\n this.loadResources();\n },\n\n changeWholeNode: function changeWholeNode(nodeName) {\n this.nodeFlag = true;\n for (var resourceId in this.tableContent.nodes[nodeName].resources) {\n var resourceName = this.tableContent.nodes[nodeName].resources[resourceId];\n var resource = this.tableContent.resources[resourceName];\n resource.selected = this.tableContent.nodes[nodeName].selected;\n }\n if (!this.allFlag) {\n if (this.tableContent.nodes[nodeName].selected) {\n this.selectedNodes += 1;\n } else {\n this.selectedNodes -= 1;\n }\n this.checkIfAllNodesSelected();\n this.loadResources();\n }\n this.nodeFlag = false;\n },\n\n checkIfAllNodesSelected: function checkIfAllNodesSelected() {\n if (this.selectedNodes === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes).length) {\n this.changeAllCheckbox = true;\n } else {\n this.changeAllCheckbox = false;\n }\n },\n\n changeResource: function changeResource(nodeName, resourceUUID) {\n if (!this.allFlag && !this.nodeFlag) {\n if (this.tableContent.resources[resourceUUID].selected) {\n this.tableContent.nodes[nodeName].selectedResources += 1;\n } else {\n this.tableContent.nodes[nodeName].selectedResources -= 1;\n }\n this.checkIfAllResourcesSelected(nodeName);\n this.checkIfAllNodesSelected();\n this.forceRerenderTables();\n this.loadResources();\n }\n },\n\n checkIfAllResourcesSelected: function checkIfAllResourcesSelected(nodeName) {\n if (this.tableContent.nodes[nodeName].selectedResources === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes[nodeName].resources).length) {\n this.tableContent.nodes[nodeName].selected = true;\n this.selectedNodes += 1;\n } else {\n this.tableContent.nodes[nodeName].selected = false;\n this.selectedNodes -= 1;\n }\n },\n\n loadResources: function loadResources() {\n this.$emit('loadResources', this.tableContent.resources);\n },\n\n changeSchedule: function changeSchedule() {\n var start = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.picker + 'T00:00:00.000Z').add(this.adjustTimezone(), 'hours');\n this.startMoment = start;\n this.scheduleStart = start.toISOString();\n this.scheduleEnd = __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(this.range, 'days').toISOString();\n var header = [];\n header.push({ value: start.format('dddd, MMMM Do YYYY'), id: 1 });\n for (var i = 1; i < this.range; i++) {\n header.push({ value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(i, 'days').format('dddd, MMMM Do YYYY'), id: i + 1 });\n }\n var hours = [];\n for (var headerName in header) {\n for (i = 0; i < 24; i++) {\n hours.push({ value: i + ':00', id: headerName + ' hour ' + i });\n }\n }\n this.tableContent.header = header;\n this.tableContent.hours = hours;\n this.fillTable();\n },\n\n fillTable: function fillTable() {\n this.resourceIds = [];\n this.tableContent.nodes = {};\n this.tableContent.resources = [];\n for (var nodeIndex in this.parsedNodes) {\n var node = this.parsedNodes[nodeIndex];\n var nodeSlots = [];\n for (var i = 0; i < 48 * this.range; i++) {\n nodeSlots.push({ value: '', id: 'slot ' + i, reserved: false, userReservation: false });\n }\n this.tableContent.nodes[node.nodeName] = {\n nodeName: node.nodeName,\n hidden: true,\n resources: [],\n selected: true,\n selectedResources: 0,\n slots: nodeSlots\n };\n for (var resourceTypeIndex in node.resourceTypes) {\n var resourceType = node.resourceTypes[resourceTypeIndex];\n for (var resourceIndex in resourceType.resources) {\n var resource = resourceType.resources[resourceIndex];\n resource.name = resource.nodeName + ' GPU' + resourceIndex;\n resource['selected'] = true;\n this.tableContent.nodes[node.nodeName].selectedResources += 1;\n this.resourcesIds.push(resource.resourceUUID);\n var slots = [];\n for (i = 0; i < 48 * this.range; i++) {\n slots.push({ value: '', id: 'slot ' + i, reserved: false, userReservation: false });\n }\n resource['slots'] = slots;\n this.tableContent.nodes[node.nodeName].resources.push(resource.resourceUUID);\n this.tableContent.resources[resource.resourceUUID] = resource;\n }\n }\n this.tableContent.nodes[node.nodeName].selectedResources = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes[node.nodeName].resources).length;\n }\n this.selectedNodes = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.tableContent.nodes).length;\n this.getReservations();\n },\n\n getReservations: function getReservations() {\n var _this = this;\n\n var resourcesString = '';\n for (var i in this.resourcesIds) {\n resourcesString += this.resourcesIds[i] + ',';\n }\n resourcesString = resourcesString.slice(0, -1);\n __WEBPACK_IMPORTED_MODULE_2__api__[\"a\" /* default */].request('get', '/reservations?resources_ids=' + resourcesString + '&start=' + this.scheduleStart + '&end=' + this.scheduleEnd, this.$store.state.accessToken).then(function (response) {\n if (response.data.length !== 0) {\n _this.parseData(response.data);\n }\n }).catch(function (error) {\n _this.$emit('handleError', error);\n });\n },\n\n parseData: function parseData(data) {\n for (var i in data) {\n var start = __WEBPACK_IMPORTED_MODULE_1_moment___default()(data[i].start);\n var dayDifferenceStart = this.startMoment.diff(start, 'days');\n var hoursDifferenceStart = this.startMoment.diff(start, 'hours') % 24;\n var minutesDifferenceStart = this.startMoment.diff(start, 'minutes') % 60;\n if (minutesDifferenceStart !== 0) minutesDifferenceStart = 1;\n var end = __WEBPACK_IMPORTED_MODULE_1_moment___default()(data[i].end);\n var dayDifferenceEnd = this.startMoment.diff(end, 'days');\n var hoursDifferenceEnd = this.startMoment.diff(end, 'hours') % 24;\n var minutesDifferenceEnd = this.startMoment.diff(end, 'minutes') % 60;\n if (minutesDifferenceEnd !== 0) minutesDifferenceEnd = 1;\n var startSlot = -dayDifferenceStart * 48 - hoursDifferenceStart * 2 + minutesDifferenceStart;\n var endSlot = -dayDifferenceEnd * 48 - hoursDifferenceEnd * 2 + minutesDifferenceEnd;\n if (startSlot < 0) startSlot = 0;\n if (endSlot > 48 * this.range) endSlot = 48 * this.range;\n for (var slot = startSlot; slot < endSlot; slot++) {\n if (parseInt(this.$store.state.id) === parseInt(data[i].userId)) {\n this.tableContent.resources[data[i].resourceId].slots[slot].userReservation = true;\n } else {\n this.tableContent.resources[data[i].resourceId].slots[slot].reserved = true;\n }\n }\n this.forceRerenderTables();\n }\n },\n\n forceRerenderTables: function forceRerenderTables(key) {\n this.leftTableKey = !this.leftTableKey;\n this.rightTableKey = !this.rightTableKey;\n },\n\n adjustTimezone: function adjustTimezone() {\n var d = new Date();\n var v = d.getTimezoneOffset(); // in minutes for example GMT+1 = -60\n return v / 60;\n },\n\n toggle: function toggle(node) {\n this.tableContent.nodes[node.nodeName].hidden = !this.tableContent.nodes[node.nodeName].hidden;\n this.forceRerenderTables();\n }\n },\n\n mounted: function mounted() {\n // synchronise scrolls\n var leftTable = document.getElementById('left-table');\n var rightTable = document.getElementById('right-table');\n var rightHeader = document.getElementById('right-header');\n rightTable.onscroll = function () {\n leftTable.scrollTop = this.scrollTop;\n rightHeader.scrollLeft = this.scrollLeft;\n };\n\n var start = __WEBPACK_IMPORTED_MODULE_1_moment___default()(new Date().toISOString()).add(this.adjustTimezone(), 'hours');\n this.startMoment = start;\n this.scheduleStart = start.toISOString();\n this.scheduleEnd = __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(7, 'days').toISOString();\n var header = [{ value: start.format('dddd, MMMM Do YYYY'), id: 1 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(1, 'days').format('dddd, MMMM Do YYYY'), id: 2 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(2, 'days').format('dddd, MMMM Do YYYY'), id: 3 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(3, 'days').format('dddd, MMMM Do YYYY'), id: 4 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(4, 'days').format('dddd, MMMM Do YYYY'), id: 5 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(5, 'days').format('dddd, MMMM Do YYYY'), id: 6 }, { value: __WEBPACK_IMPORTED_MODULE_1_moment___default()(start).add(6, 'days').format('dddd, MMMM Do YYYY'), id: 7 }];\n var hours = [];\n for (var headerName in header) {\n for (var i = 0; i < 24; i++) {\n hours.push({ value: i + ':00', id: headerName + ' hour ' + i });\n }\n }\n this.tableContent = {\n nodes: {},\n resources: [],\n header: header,\n hours: hours\n };\n this.fillTable();\n }\n});\n\n/***/ }),\n/* 196 */,\n/* 197 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__nodes_overview_WatchGenerator_vue__ = __webpack_require__(309);\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n WatchGenerator: __WEBPACK_IMPORTED_MODULE_0__nodes_overview_WatchGenerator_vue__[\"a\" /* default */]\n }\n});\n\n/***/ }),\n/* 198 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(196);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__WatchBox_vue__ = __webpack_require__(311);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_lodash__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_lodash___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash__);\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n WatchBox: __WEBPACK_IMPORTED_MODULE_2__WatchBox_vue__[\"a\" /* default */]\n },\n\n data: function data() {\n return {\n watches: [],\n chartDatasets: {},\n time: 5000,\n chartLength: 25,\n space: 2,\n interval: null,\n alert: false,\n errorMessage: '',\n updateChart: false,\n resourcesIndexes: {},\n watchIds: 3\n };\n },\n created: function created() {\n this.loadData();\n var self = this;\n this.interval = setInterval(function () {\n if (self.$route.fullPath !== '/nodes_overview') {\n clearInterval(self.interval);\n }\n self.changeData();\n }, this.time);\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n this.alert = true;\n },\n\n saveWatches: function saveWatches() {\n window.localStorage.setItem('watches', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(this.watches));\n window.localStorage.setItem('watchIds', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(this.watchIds));\n },\n changeDefaultNode: function changeDefaultNode(id, name) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches[index].defaultNode = name;\n }\n }\n this.saveWatches();\n },\n changeDefaultResourceType: function changeDefaultResourceType(id, name) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches[index].defaultResourceType = name;\n }\n }\n this.saveWatches();\n },\n changeDefaultMetric: function changeDefaultMetric(id, name) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches[index].defaultMetric = name;\n }\n }\n this.saveWatches();\n },\n deleteWatch: function deleteWatch(id) {\n for (var index in this.watches) {\n if (this.watches[index].id === id) {\n this.watches.splice(index, 1);\n }\n }\n this.saveWatches();\n },\n\n setColor: function setColor(node) {\n var color = '#123456';\n var step = node * 123456;\n var colorToInt = parseInt(color.substr(1), 16);\n var nstep = parseInt(step);\n if (!isNaN(colorToInt) && !isNaN(nstep)) {\n colorToInt += nstep;\n var ncolor = colorToInt.toString(16);\n ncolor = '#' + new Array(7 - ncolor.length).join(0) + ncolor;\n if (/^#[0-9a-f]{6}$/i.test(ncolor)) {\n return ncolor;\n }\n }\n return color;\n },\n\n loadData: function loadData() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('get', '/nodes/metrics', this.$store.state.accessToken).then(function (response) {\n if (JSON.parse(window.localStorage.getItem('watches')) === null) {\n var id = 0;\n _this.watches = [];\n for (var host in response.data) {\n var hostData = response.data[host];\n if ('GPU' in hostData) {\n _this.watches.push({\n id: id++,\n defaultNode: host,\n defaultResourceType: 'GPU',\n defaultMetric: 'utilization'\n });\n _this.watches.push({\n id: id++,\n defaultNode: host,\n defaultResourceType: 'GPU',\n defaultMetric: 'mem_used'\n });\n _this.watches.push({\n id: id,\n defaultNode: host,\n defaultResourceType: 'GPU',\n defaultMetric: 'processes'\n });\n } else {\n _this.watches.push({\n id: id++,\n defaultNode: host,\n defaultResourceType: 'CPU',\n defaultMetric: 'utilization'\n });\n }\n }\n } else {\n _this.watches = JSON.parse(window.localStorage.getItem('watches'));\n _this.watchIds = JSON.parse(window.localStorage.getItem('watchIds'));\n }\n _this.parseData(response.data);\n }).catch(function (error) {\n _this.handleError(error);\n });\n },\n\n isVisible: function isVisible(metric, metricName) {\n if (metric.value === null) {\n return false;\n } else {\n if (metricName === 'mem_total') return false;\n return true;\n }\n },\n\n parseData: function parseData(apiResponse) {\n var node, resourceType, metrics, resourceTypes, uniqueMetricNames;\n uniqueMetricNames = [];\n for (var nodeName in apiResponse) {\n resourceTypes = {};\n node = apiResponse[nodeName];\n if (node !== null) {\n for (var resourceTypeName in node) {\n uniqueMetricNames = [];\n resourceType = node[resourceTypeName];\n if (resourceType !== null) {\n metrics = this.findMetrics(resourceType, resourceTypeName);\n for (var metricName in metrics) {\n uniqueMetricNames.push(metricName);\n }\n resourceTypes[resourceTypeName] = {\n metrics: metrics,\n uniqueMetricNames: uniqueMetricNames\n };\n }\n }\n }\n this.chartDatasets[nodeName] = resourceTypes;\n }\n },\n\n findMetrics: function findMetrics(resourceType, resourceTypeName) {\n var resource, metric, tempMetrics, uniqueMetrics;\n tempMetrics = {};\n uniqueMetrics = {};\n for (var resourceUUID in resourceType) {\n if (resourceType[resourceUUID] !== null) {\n this.resourcesIndexes[resourceUUID] = resourceType[resourceUUID].index;\n resource = resourceType[resourceUUID];\n for (var metricName in resource.metrics) {\n if (isNaN(resource.metrics[metricName])) {\n metric = resource.metrics[metricName];\n metric['visible'] = this.isVisible(resource.metrics[metricName], metricName);\n } else {\n metric = {\n value: resource.metrics[metricName],\n unit: '',\n visible: this.isVisible(resource.metrics[metricName], metricName)\n };\n }\n if (uniqueMetrics.hasOwnProperty(metricName)) {\n if (uniqueMetrics[metricName].visible === false) {\n uniqueMetrics[metricName] = metric;\n }\n } else {\n uniqueMetrics[metricName] = metric;\n }\n }\n }\n }\n for (var uniqueMetricName in uniqueMetrics) {\n if (uniqueMetrics[uniqueMetricName].visible === true) {\n tempMetrics[uniqueMetricName] = this.createMetric(resourceType, resourceTypeName, uniqueMetricName);\n }\n }\n return tempMetrics;\n },\n\n createMetric: function createMetric(resourceType, resourceTypeName, metricName) {\n var labels, totalMemory, value, unit, datasets, orderedDatasets;\n labels = [];\n for (var i = (this.chartLength - 1) * this.time / 1000; i >= 0; i -= this.time / 1000) {\n if (i % ((this.space + 1) * this.time / 1000) === 0) {\n labels.push(i);\n } else {\n labels.push('');\n }\n }\n datasets = [];\n for (var resourceUUID in resourceType) {\n if (resourceType[resourceUUID].metrics[metricName] !== null && this.isVisible(resourceType[resourceUUID].metrics[metricName], metricName)) {\n value = isNaN(resourceType[resourceUUID].metrics[metricName]) ? resourceType[resourceUUID].metrics[metricName].value : resourceType[resourceUUID].metrics[metricName];\n unit = isNaN(resourceType[resourceUUID].metrics[metricName]) ? resourceType[resourceUUID].metrics[metricName].unit : '';\n totalMemory = resourceType[resourceUUID].metrics['mem_total'].value;\n datasets.push(this.createDataset(resourceUUID, resourceTypeName + resourceType[resourceUUID].index, this.setColor(resourceType[resourceUUID].index + 1), value));\n }\n }\n orderedDatasets = __WEBPACK_IMPORTED_MODULE_4_lodash___default.a.orderBy(datasets, 'label');\n var obj = {\n metricName: metricName,\n data: {\n labels: labels,\n datasets: orderedDatasets\n },\n options: this.createOptions(totalMemory, metricName, unit)\n };\n return obj;\n },\n\n createDataset: function createDataset(uuid, label, color, data) {\n var defaultData = [];\n for (var i = 0; i < this.chartLength - 1; i++) {\n defaultData.push(0);\n }\n if (data !== null) {\n defaultData.push(data);\n } else {\n defaultData.push(-1);\n }\n var obj = {\n uuid: uuid,\n label: label,\n fill: true,\n borderColor: color,\n pointBackgroundColor: color,\n backgroundColor: 'rgba(0, 0, 0, 0)',\n data: defaultData\n };\n return obj;\n },\n\n createOptions: function createOptions(totalMemory, metricName, unit) {\n var obj = {\n responsive: true,\n maintainAspectRatio: false,\n legend: {\n position: 'bottom',\n display: true\n },\n tooltips: {\n mode: 'label',\n xPadding: 10,\n yPadding: 10,\n bodySpacing: 10\n },\n scales: {\n xAxes: [{\n scaleLabel: {\n display: true,\n labelString: 'seconds ago'\n }\n }],\n yAxes: [{\n id: 'y-axis-1',\n type: 'linear',\n position: 'left',\n scaleLabel: {\n display: true,\n labelString: ''\n }\n }]\n }\n };\n obj['scales']['yAxes'][0]['scaleLabel']['labelString'] = unit;\n if (metricName === 'mem_util' || metricName === 'utilization' || metricName === 'fan_speed') {\n obj['scales']['yAxes'][0]['ticks'] = {\n suggestedMin: 0,\n max: 100\n };\n }\n if (metricName === 'mem_used' || metricName === 'mem_free') {\n obj['scales']['yAxes'][0]['ticks'] = {\n suggestedMin: 0,\n suggestedMax: totalMemory\n };\n }\n return obj;\n },\n\n changeData: function changeData() {\n var node, counter;\n counter = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.chartDatasets).length;\n for (var nodeName in this.chartDatasets) {\n counter--;\n node = this.chartDatasets[nodeName];\n this.apiRequest(node, nodeName, counter);\n }\n },\n\n apiRequest: function apiRequest(node, nodeName, counter) {\n var _this2 = this;\n\n var metric, resourceType, value;\n var data = [];\n for (var resourceTypeName in node) {\n resourceType = node[resourceTypeName];\n __WEBPACK_IMPORTED_MODULE_3__api__[\"a\" /* default */].request('get', '/nodes/' + nodeName + '/' + resourceTypeName.toLowerCase() + '/metrics', this.$store.state.accessToken).then(function (response) {\n data = response.data;\n for (var resourceTypeName in node) {\n resourceType = node[resourceTypeName];\n for (var metricName in resourceType.metrics) {\n metric = resourceType.metrics[metricName];\n for (var i = 0; i < metric.data.datasets.length; i++) {\n if (__WEBPACK_IMPORTED_MODULE_4_lodash___default.a.has(data, metric.data.datasets[i].uuid)) {\n value = isNaN(data[metric.data.datasets[i].uuid][metric.metricName]) ? data[metric.data.datasets[i].uuid][metric.metricName].value : data[metric.data.datasets[i].uuid][metric.metricName];\n metric.data.datasets[i].data.shift();\n metric.data.datasets[i].data.push(value);\n }\n }\n }\n }\n if (!counter) {\n _this2.updateChart = !_this2.updateChart;\n }\n }).catch(function (error) {\n _this2.handleError(error);\n });\n }\n },\n\n addWatch: function addWatch() {\n this.watches.push({\n id: this.watchIds,\n defaultNode: '',\n defaultResourceType: 'GPU',\n defaultMetric: ''\n });\n this.watchIds++;\n this.saveWatches();\n }\n }\n});\n\n/***/ }),\n/* 199 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__LineChart_vue__ = __webpack_require__(313);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__api__ = __webpack_require__(2);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n LineChart: __WEBPACK_IMPORTED_MODULE_0__LineChart_vue__[\"a\" /* default */]\n },\n\n props: {\n defaultNode: String,\n defaultResourceType: String,\n defaultMetric: String,\n resourcesIndexes: Object,\n chartDatasets: Object,\n updateChart: Boolean,\n time: Number\n },\n\n data: function data() {\n return {\n selectedNode: '',\n nodes: [],\n selectedResourceType: '',\n resourceTypes: [],\n selectedMetric: '',\n metrics: [],\n rerenderChart: false,\n metricData: null,\n metricOptions: null,\n showProcesses: false,\n interval: null,\n headers: [{ text: 'GPU index', value: 'index' }, { text: 'owner', value: 'owner' }, { text: 'pid', value: 'pid' }, { text: 'command', value: 'command' }],\n processes: [],\n alert: false,\n errorMessage: ''\n };\n },\n\n\n methods: {\n sendDefaultNode: function sendDefaultNode(newDefault) {\n this.$emit('changeDefaultNode', newDefault);\n },\n sendDefaultResourceType: function sendDefaultResourceType(newDefault) {\n this.$emit('changeDefaultResourceType', newDefault);\n },\n sendDefaultMetric: function sendDefaultMetric(newDefault) {\n this.$emit('changeDefaultMetric', newDefault);\n },\n removeMe: function removeMe() {\n this.$emit('deleteWatch');\n },\n\n loadData: function loadData() {\n return this.chartDatasets[this.selectedNode][this.selectedResourceType].metrics[this.selectedMetric].data;\n },\n\n loadOptions: function loadOptions() {\n return this.chartDatasets[this.selectedNode][this.selectedResourceType].metrics[this.selectedMetric].options;\n },\n\n fillNodes: function fillNodes() {\n this.nodes = [];\n var nodes = this.chartDatasets;\n for (var nodeName in nodes) {\n this.nodes.push(nodeName);\n }\n if (this.defaultNode === '') {\n this.selectedNode = this.nodes[0];\n } else {\n this.selectedNode = this.defaultNode;\n }\n this.fillResourceTypes();\n },\n\n fillResourceTypes: function fillResourceTypes() {\n this.resourceTypes = [];\n var resourceTypes = this.chartDatasets[this.selectedNode];\n for (var resourceTypeName in resourceTypes) {\n this.resourceTypes.push(resourceTypeName);\n }\n if (this.defaultResourceType === '') {\n this.selectedResourceType = this.resourceTypes[0];\n } else {\n this.selectedResourceType = this.defaultResourceType;\n }\n this.fillMetrics();\n },\n\n fillMetrics: function fillMetrics() {\n this.metrics = [];\n var metrics = this.chartDatasets[this.selectedNode][this.selectedResourceType].uniqueMetricNames;\n for (var metricIndex in metrics) {\n this.metrics.push(metrics[metricIndex]);\n }\n if (this.selectedResourceType === 'GPU') {\n this.metrics.push('processes');\n }\n if (this.defaultMetric === '') {\n var metric = this.metrics[0];\n for (metricIndex in this.metrics) {\n var metricName = this.metrics[metricIndex];\n if (metricName === 'utilization') {\n metric = metricName;\n break;\n } else if (metricName === 'mem_used') {\n metric = metricName;\n }\n }\n this.selectedMetric = metric;\n } else {\n this.selectedMetric = this.defaultMetric;\n }\n if (this.selectedNode !== '' && this.selectedResourceType !== '' && this.selectedMetric !== '' && this.selectedMetric !== 'processes') {\n this.metricData = this.loadData();\n this.metricOptions = this.loadOptions();\n this.rerenderChart = !this.rerenderChart;\n }\n },\n\n checkProcesses: function checkProcesses() {\n var _this = this;\n\n var data, processes, tempProcess;\n processes = [];\n __WEBPACK_IMPORTED_MODULE_1__api__[\"a\" /* default */].request('get', '/nodes/' + this.selectedNode + '/gpu/processes', this.$store.state.accessToken).then(function (response) {\n data = response.data;\n for (var resourceUUID in data) {\n if (data[resourceUUID] !== null) {\n for (var i = 0; i < data[resourceUUID].length; i++) {\n tempProcess = data[resourceUUID][i];\n tempProcess['index'] = _this.resourcesIndexes[resourceUUID];\n tempProcess['uuid'] = resourceUUID;\n processes.push(tempProcess);\n }\n }\n }\n _this.processes = processes;\n }).catch(function (error) {\n if (!error.hasOwnProperty('response')) {\n _this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n _this.errorMessage = error.response.data;\n } else {\n _this.errorMessage = error.response.data.msg;\n }\n }\n _this.alert = true;\n });\n }\n },\n\n watch: {\n selectedNode: function selectedNode() {\n this.sendDefaultNode(this.selectedNode);\n this.fillResourceTypes();\n },\n selectedResourceType: function selectedResourceType() {\n this.sendDefaultResourceType(this.selectedResourceType);\n this.fillMetrics();\n },\n selectedMetric: function selectedMetric() {\n this.sendDefaultMetric(this.selectedMetric);\n if (this.selectedMetric === 'processes') {\n this.checkProcesses();\n var self = this;\n this.interval = setInterval(function () {\n if (self.$route.fullPath !== '/nodes_overview') {\n clearInterval(self.interval);\n }\n self.checkProcesses();\n }, this.time);\n this.showProcesses = true;\n } else {\n this.showProcesses = false;\n this.metricData = this.loadData();\n this.metricOptions = this.loadOptions();\n this.rerenderChart = !this.rerenderChart;\n if (this.interval !== null) {\n clearInterval(this.interval);\n }\n }\n }\n },\n\n created: function created() {\n this.fillNodes();\n }\n});\n\n/***/ }),\n/* 200 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue_chartjs__ = __webpack_require__(314);\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n extends: __WEBPACK_IMPORTED_MODULE_0_vue_chartjs__[\"a\" /* Line */],\n props: {\n chartData: Object,\n options: Object,\n rerenderChart: Boolean,\n updateChart: Boolean\n },\n\n watch: {\n rerenderChart: function rerenderChart() {\n this.$data._chart.destroy();\n this.renderChart(this.chartData, this.options);\n },\n updateChart: function updateChart() {\n this.$data._chart.update();\n }\n },\n\n mounted: function mounted() {\n // this.chartData is created in the mixin.\n // If you want to pass options please create a local options object\n this.renderChart(this.chartData, this.options);\n }\n});\n\n/***/ }),\n/* 201 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__tasks_overview_TaskCreate_vue__ = __webpack_require__(323);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__tasks_overview_TaskEdit_vue__ = __webpack_require__(344);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__tasks_overview_TaskSchedule_vue__ = __webpack_require__(347);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__tasks_overview_TaskLog_vue__ = __webpack_require__(350);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__tasks_overview_TaskTemplateChooser__ = __webpack_require__(353);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n TaskTemplateChooser: __WEBPACK_IMPORTED_MODULE_6__tasks_overview_TaskTemplateChooser__[\"a\" /* default */],\n TaskCreate: __WEBPACK_IMPORTED_MODULE_2__tasks_overview_TaskCreate_vue__[\"a\" /* default */],\n TaskEdit: __WEBPACK_IMPORTED_MODULE_3__tasks_overview_TaskEdit_vue__[\"a\" /* default */],\n TaskSchedule: __WEBPACK_IMPORTED_MODULE_4__tasks_overview_TaskSchedule_vue__[\"a\" /* default */],\n TaskLog: __WEBPACK_IMPORTED_MODULE_5__tasks_overview_TaskLog_vue__[\"a\" /* default */]\n },\n data: function data() {\n return {\n pagination: {\n sortBy: 'name'\n },\n selected: [],\n headers: [{ text: 'ID', value: 'id' }, { text: 'hostname', value: 'hostname' }, { text: 'command', value: 'command' }, { text: 'pid', value: 'pid' }, { text: 'status', value: 'status' }, { text: 'spawn at', value: 'spawnAt' }, { text: 'terminate at', value: 'terminateAt' }, { text: 'actions', value: 'id', sortable: false }],\n tasks: [],\n hostnames: [],\n hosts: {},\n showModalCreate: false,\n chosenTemplate: '',\n showModalChooseTemplate: false,\n showModalEdit: false,\n showModalSchedule: false,\n showModalHowItWorks: false,\n showModalRemove: false,\n showModalLog: false,\n taskId: -1,\n newHostname: '',\n newCommand: '',\n newSpawnTime: '',\n newTerminateTime: '',\n tableKey: 0,\n interval: null,\n time: 60000,\n initialSyncFlag: false,\n snackbar: false,\n snackbarError: false,\n errorMessage: '',\n selectedIndex: 0,\n actionFlag: false,\n multipleFlag: false,\n logs: [],\n path: '',\n actionType: '',\n gracefully: null,\n rowsPerPageItems: [{ 'text': '$vuetify.dataIterator.rowsPerPageAll', 'value': -1 }, 25, 10, 5]\n };\n },\n\n\n watch: {\n initialSyncFlag: function initialSyncFlag() {\n this.getTasks(true);\n }\n },\n\n created: function created() {\n var self = this;\n this.interval = setInterval(function () {\n if (self.$route.fullPath !== '/tasks_overview') {\n clearInterval(self.interval);\n }\n self.getTasks(true);\n }, this.time);\n },\n mounted: function mounted() {\n this.getHosts();\n this.getTasks(false);\n },\n\n\n methods: {\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.showError(error.message);\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.showError(error.response.data);\n } else {\n this.showError(error.response.data.msg);\n }\n }\n },\n\n showError: function showError(message) {\n this.errorMessage = message;\n this.snackbarError = true;\n },\n prettyDate: function prettyDate(date) {\n if (date !== null) {\n return __WEBPACK_IMPORTED_MODULE_1_moment___default()(date).format('dddd, MMMM Do, HH:mm');\n } else {\n return null;\n }\n },\n changeActionFlag: function changeActionFlag(bool) {\n this.actionFlag = bool;\n },\n changeSnackbar: function changeSnackbar(bool) {\n this.snackbar = bool;\n },\n toggleAll: function toggleAll() {\n if (this.selected.length) this.selected = [];else this.selected = this.tasks.slice();\n },\n changeSort: function changeSort(column) {\n if (this.pagination.sortBy === column) {\n this.pagination.descending = !this.pagination.descending;\n } else {\n this.pagination.sortBy = column;\n this.pagination.descending = false;\n }\n },\n\n\n getHosts: function getHosts() {\n var _this = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/nodes/hostnames', this.$store.state.accessToken).then(function (response) {\n _this.hostnames = response.data;\n });\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/nodes/metrics', this.$store.state.accessToken).then(function (response) {\n _this.convertHostsInfo(response.data);\n });\n },\n\n convertHostsInfo: function convertHostsInfo(hostsInfo) {\n var hosts = {};\n for (var hostname in hostsInfo) {\n var host = hostsInfo[hostname];\n var resources = ['CPU'];\n for (var gpuUUID in host.GPU) {\n resources.push('GPU' + host.GPU[gpuUUID].index);\n }\n hosts[hostname] = { resources: resources };\n }\n this.hosts = hosts;\n },\n\n getTasks: function getTasks(sync) {\n var _this2 = this;\n\n if (!this.actionFlag) {\n this.snackbar = true;\n this.actionFlag = true;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks?userId=' + this.$store.state.id + '&syncAll=' + sync, this.$store.state.accessToken).then(function (response) {\n _this2.snackbar = false;\n _this2.actionFlag = false;\n _this2.tasks = response.data.tasks;\n if (!sync) {\n _this2.initialSyncFlag = !_this2.initialSyncFlag;\n }\n }).catch(function (error) {\n _this2.handleError(error);\n _this2.snackbar = false;\n _this2.actionFlag = false;\n });\n }\n },\n\n spawnTasks: function spawnTasks(id) {\n this.actionType = 'spawn';\n this.prepareActionLoop(id);\n },\n\n terminateTasks: function terminateTasks(id, gracefully) {\n this.gracefully = gracefully;\n this.actionType = 'terminate';\n this.prepareActionLoop(id);\n },\n\n prepareActionLoop: function prepareActionLoop(id, actionType) {\n if (id !== null) {\n this.multipleFlag = false;\n this.taskId = id;\n } else {\n this.multipleFlag = true;\n }\n if (!this.actionFlag) {\n if (!this.multipleFlag) {\n this.actionFlag = true;\n this.snackbar = true;\n this.actionLoop();\n } else if (this.selected.length) {\n this.actionFlag = true;\n this.snackbar = true;\n this.actionLoop();\n }\n }\n },\n\n actionLoop: function actionLoop() {\n var _this3 = this;\n\n var id;\n if (this.multipleFlag) {\n id = this.selected[this.selectedIndex].id;\n } else {\n id = this.taskId;\n }\n var actionPath;\n switch (this.actionType) {\n case 'spawn':\n actionPath = '/tasks/' + id + '/spawn';break;\n case 'terminate':\n actionPath = '/tasks/' + id + '/terminate?gracefully=' + this.gracefully;break;\n }\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', actionPath, this.$store.state.accessToken).then(function (response) {\n _this3.getTaskLoop(id);\n }).catch(function (error) {\n _this3.handleError(error);\n _this3.getTaskLoop(id);\n });\n },\n\n getTaskLoop: function getTaskLoop(id, actionType) {\n var _this4 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this4.updateTask(id, response.data.task);\n _this4.resumeLoop();\n }).catch(function (error) {\n _this4.handleError(error);\n _this4.resumeLoop();\n });\n },\n\n resumeLoop: function resumeLoop() {\n if (this.multipleFlag) {\n this.selectedIndex++;\n if (this.selectedIndex < this.selected.length) {\n switch (this.actionType) {\n case 'spawn':\n this.actionLoop();break;\n case 'terminate':\n this.actionLoop();break;\n }\n } else {\n this.selectedIndex = 0;\n this.snackbar = false;\n this.actionFlag = false;\n }\n } else {\n this.snackbar = false;\n this.actionFlag = false;\n }\n },\n\n scheduleTasks: function scheduleTasks(task) {\n if (task != null) {\n this.multipleFlag = false;\n this.taskId = task.id;\n this.newSpawnTime = task.spawnAt;\n this.newTerminateTime = task.terminateAt;\n } else {\n this.multipleFlag = true;\n }\n if (!this.multipleFlag) {\n this.showModalSchedule = true;\n } else if (this.selected.length) {\n this.showModalSchedule = true;\n }\n },\n\n editTask: function editTask(task) {\n this.taskId = task.id;\n this.newHostname = task.hostname;\n this.newCommand = task.command;\n this.showModalEdit = true;\n },\n\n getTask: function getTask(id) {\n var _this5 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this5.updateTask(id, response.data.task);\n _this5.snackbar = false;\n _this5.actionFlag = false;\n }).catch(function (error) {\n _this5.handleError(error);\n _this5.snackbar = false;\n _this5.actionFlag = false;\n });\n },\n\n updateTask: function updateTask(id, newData) {\n for (var index in this.tasks) {\n if (this.tasks[index].id === id) {\n if (newData !== null) {\n this.tasks[index] = newData;\n } else {\n this.tasks.splice(index, 1);\n }\n }\n }\n this.tableKey++;\n },\n\n showConfirmationDialog: function showConfirmationDialog(id) {\n this.taskId = id;\n this.showModalRemove = true;\n },\n\n\n removeTask: function removeTask() {\n var _this6 = this;\n\n var id = this.taskId;\n if (!this.actionFlag) {\n this.snackbar = true;\n this.actionFlag = true;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('delete', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this6.showModalRemove = false;\n _this6.snackbar = false;\n _this6.actionFlag = false;\n _this6.updateTask(id, null);\n }).catch(function (error) {\n _this6.handleError(error);\n _this6.snackbar = false;\n _this6.actionFlag = false;\n });\n }\n },\n\n getLog: function getLog(id) {\n var _this7 = this;\n\n if (!this.actionFlag) {\n this.snackbar = true;\n this.actionFlag = true;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id + '/log', this.$store.state.accessToken).then(function (response) {\n _this7.logs = response.data.output_lines;\n _this7.path = response.data.path;\n _this7.showModalLog = true;\n _this7.snackbar = false;\n _this7.actionFlag = false;\n }).catch(function (error) {\n _this7.handleError(error);\n _this7.snackbar = false;\n _this7.actionFlag = false;\n });\n }\n },\n\n openFromTemplate: function openFromTemplate(chosenTemplate) {\n this.chosenTemplate = chosenTemplate;\n this.showModalCreate = true;\n }\n }\n});\n\n/***/ }),\n/* 202 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__TaskLine_vue__ = __webpack_require__(325);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n TaskLine: __WEBPACK_IMPORTED_MODULE_1__TaskLine_vue__[\"a\" /* default */]\n },\n\n props: {\n showModal: Boolean,\n hostnames: Array,\n hosts: Object,\n actionFlag: Boolean,\n chosenTemplate: String\n },\n\n data: function data() {\n return {\n newParameter: '',\n linesIds: 1,\n lines: [{\n id: 0,\n host: '',\n resource: '',\n command: '',\n parameters: [],\n envVariables: [],\n parameterIds: 0,\n envVariableIds: 0,\n enableTfConfig: false,\n tfConfig: '',\n tfConfigPort: '',\n tfConfigTaskType: '',\n tfConfigTaskIndex: -1\n }],\n tfCluster: {},\n staticParameters: [],\n staticEnvVariables: [],\n isNewFieldStatic: false,\n enableSmartTfConfig: false,\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();else {\n this.emptyParametersAndEnvVariables();\n switch (this.chosenTemplate) {\n case 'tf1':\n this.addParameter(undefined, '--ps_hosts=');\n this.addParameter(undefined, '--worker_hosts=');\n this.addParameter(undefined, '--job_name=', 'worker');\n this.addParameter(undefined, '--task_index=');\n this.staticParameters = ['--ps_hosts=', '--worker_hosts='];\n break;\n case 'tf2':\n this.enableSmartTfConfig = true;\n this.addEnvVariable(undefined, 'TF_CONFIG');\n break;\n case 'torch':\n this.addParameter(undefined, '--init-method=');\n this.addParameter(undefined, '--backend=', 'gloo');\n this.addParameter(undefined, '--rank=');\n this.addParameter(undefined, '--world-size=');\n this.staticParameters = ['--init-method=', '--backend=', '--world-size='];\n break;\n default:\n break;\n }\n }\n }\n },\n\n methods: {\n close: function close() {\n this.$emit('close');\n },\n\n addTasks: function addTasks() {\n var _this = this;\n\n for (var lineIndex in this.lines) {\n var line = this.lines[lineIndex];\n var command = this.convertResource(line.resource);\n if (line.enableTfConfig) {\n command += ' TF_CONFIG=' + line.tfConfig;\n }\n for (var envIndex in line.envVariables) {\n var envVariable = line.envVariables[envIndex];\n command += ' ' + envVariable.envVariable + '=' + envVariable.value;\n }\n command += ' ' + line.command;\n for (var parameterIndex in line.parameters) {\n var parameter = line.parameters[parameterIndex];\n var parameterNameLength = parameter.parameter.length;\n if (parameter.parameter.charAt(parameterNameLength - 1) === ' ' || parameter.parameter.charAt(parameterNameLength - 1) === '=') {\n command += ' ' + parameter.parameter + parameter.value;\n } else {\n command += ' ' + parameter.parameter + ' ' + parameter.value;\n }\n }\n var task = {\n userId: this.$store.state.id,\n hostname: line.host,\n command: command\n };\n if (!this.actionFlag) {\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('post', '/tasks', this.$store.state.accessToken, task).then(function (response) {\n _this.close();\n _this.$emit('getTasks', false);\n });\n }\n }\n },\n\n addParameter: function addParameter(event, parameterName, parameterValue) {\n var taskIndex = 0;\n for (var line in this.lines) {\n var parameter = {\n id: this.lines[line].parameterIds,\n parameter: parameterName || this.newParameter,\n value: parameterValue || ''\n };\n if (this.chosenTemplate === 'tf1' && parameterName === '--task_index=' || this.chosenTemplate === 'torch' && parameterName === '--rank=' || this.chosenTemplate === 'torch' && parameterName === '--world-size=') {\n if (parameterName === '--world-size=') {\n taskIndex++;\n parameter.value = taskIndex.toString();\n } else {\n parameter.value = taskIndex.toString();\n taskIndex++;\n }\n }\n this.lines[line].parameterIds++;\n this.lines[line].parameters.push(parameter);\n }\n if (this.isNewFieldStatic) {\n this.staticParameters.push(parameterName || this.newParameter);\n }\n },\n\n addEnvVariable: function addEnvVariable(event, variableName, variableValue) {\n var newName = variableName || this.newParameter;\n if (newName.charAt(newName.length - 1) === '=') {\n newName = newName.substring(0, newName.length - 1);\n }\n var line;\n if (newName === 'TF_CONFIG') {\n this.chosenTemplate = 'tf2';\n for (line in this.lines) {\n this.lines[line].enableTfConfig = true;\n this.lines[line].tfConfig = '';\n }\n var machinePorts = {};\n for (line in this.lines) {\n var host = this.lines[line].host;\n this.updateTfConfigTaskType(this.lines[line].id, 'worker');\n if (host) {\n if (machinePorts.hasOwnProperty(host)) {\n this.updateTfConfigPort(this.lines[line].id, machinePorts[host].toString());\n machinePorts[host]++;\n } else {\n this.updateTfConfigPort(this.lines[line].id, '2222');\n machinePorts[host] = 2223;\n }\n }\n }\n } else {\n for (line in this.lines) {\n var envVariable = {\n id: this.lines[line].envVariableIds,\n envVariable: newName,\n value: variableValue || ''\n };\n this.lines[line].envVariableIds++;\n this.lines[line].envVariables.push(envVariable);\n }\n if (this.isNewFieldStatic) {\n this.staticEnvVariables.push(newName);\n }\n }\n },\n\n copyLine: function copyLine() {\n if (this.lines.length === 0) {\n this.addLine();\n } else {\n var lineToCopy = this.lines[this.lines.length - 1];\n var parametersToCopy = lineToCopy.parameters;\n var newParameters = [];\n for (var index in parametersToCopy) {\n var parameterToCopy = parametersToCopy[index];\n var newParameter = {\n id: index,\n parameter: parameterToCopy.parameter,\n value: parameterToCopy.value\n };\n if (this.chosenTemplate === 'tf1' && newParameter.parameter === '--task_index=' || this.chosenTemplate === 'torch' && newParameter.parameter === '--rank=' || this.chosenTemplate === 'torch' && newParameter.parameter === '--world-size=') {\n newParameter.value = (parseInt(newParameter.value) + 1).toString();\n }\n newParameters.push(newParameter);\n }\n\n var envVariablesToCopy = lineToCopy.envVariables;\n var newEnvVariables = [];\n for (var EnvIndex in envVariablesToCopy) {\n var envVariableToCopy = envVariablesToCopy[EnvIndex];\n var newEnvVariable = {\n id: EnvIndex,\n envVariable: envVariableToCopy.envVariable,\n value: envVariableToCopy.value\n };\n newEnvVariables.push(newEnvVariable);\n }\n var line = {\n id: this.linesIds,\n host: lineToCopy.host,\n resource: lineToCopy.resource,\n command: lineToCopy.command,\n parameters: newParameters,\n envVariables: newEnvVariables,\n enableTfConfig: lineToCopy.enableTfConfig,\n tfConfig: lineToCopy.tfConfig,\n tfConfigPort: '',\n tfConfigTaskType: '',\n tfConfigTaskIndex: -1\n };\n this.linesIds++;\n this.lines.push(line);\n\n if (lineToCopy.enableTfConfig && this.enableSmartTfConfig) {\n this.updateTfConfigTaskType(line.id, lineToCopy.tfConfigTaskType);\n if (line.host) {\n var machineHosts = {};\n machineHosts[line.host] = 2221;\n for (var lineIndex in this.lines) {\n if (this.lines[lineIndex].host && this.lines[lineIndex].tfConfigPort) {\n if (machineHosts.hasOwnProperty(this.lines[lineIndex].host)) {\n machineHosts[this.lines[lineIndex].host] = Math.max(machineHosts[this.lines[lineIndex].host], parseInt(this.lines[lineIndex].tfConfigPort));\n } else {\n machineHosts[this.lines[lineIndex].host] = 2221;\n }\n }\n }\n this.updateTfConfigPort(line.id, (machineHosts[line.host] + 1).toString());\n }\n }\n }\n },\n\n addLine: function addLine() {\n var line = {\n id: this.linesIds,\n host: '',\n resource: '',\n command: '',\n envVariables: [],\n parameters: [],\n parameterIds: 0,\n envVariableIds: 0,\n enableTfConfig: false,\n tfConfig: '',\n tfConfigPort: '',\n tfConfigTaskType: '',\n tfConfigTaskIndex: -1\n };\n this.linesIds++;\n this.lines.push(line);\n },\n\n changeLine: function changeLine(id, host, resource, command, parameters, envVariables, enableTfConfig, tfConfig) {\n for (var index in this.lines) {\n if (this.lines[index].id === id) {\n if (host !== this.lines[index].host && enableTfConfig && this.enableSmartTfConfig) {\n this.updateTfConfigHost(id, host);\n }\n if (this.chosenTemplate === 'tf1') {\n this.updatePsWorkerHosts(index, host);\n }\n this.lines[index].host = host;\n this.lines[index].resource = resource;\n this.lines[index].command = command;\n this.lines[index].parameters = parameters;\n this.lines[index].envVariables = envVariables;\n this.lines[index].enableTfConfig = enableTfConfig;\n this.lines[index].tfConfig = tfConfig;\n }\n }\n },\n\n deleteLine: function deleteLine(id) {\n for (var index in this.lines) {\n if (this.lines[index].id === id) {\n if (this.lines[index].enableTfConfig && this.enableSmartTfConfig) {\n this.updateTfConfigTaskType(this.lines[index].id, '');\n }\n this.lines.splice(index, 1);\n }\n }\n },\n\n staticParameterChanged: function staticParameterChanged(id, parameter, value) {\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var parameterIndex in this.lines[index].parameters) {\n if (this.lines[index].parameters[parameterIndex].parameter === parameter) {\n this.lines[index].parameters[parameterIndex].value = value;\n }\n }\n }\n }\n },\n\n staticParameterDeleted: function staticParameterDeleted(id, parameter) {\n var staticIndex = this.staticParameters.indexOf(parameter);\n if (staticIndex !== -1) this.staticParameters.splice(staticIndex, 1);\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var parameterIndex in this.lines[index].parameters) {\n if (this.lines[index].parameters[parameterIndex].parameter === parameter) {\n this.lines[index].parameters.splice(parameterIndex, 1);\n }\n }\n }\n }\n },\n\n staticEnvVariableChanged: function staticEnvVariableChanged(id, variable, value) {\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var variableIndex in this.lines[index].envVariables) {\n if (this.lines[index].envVariables[variableIndex].envVariable === variable) {\n this.lines[index].envVariables[variableIndex].value = value;\n }\n }\n }\n }\n },\n\n staticEnvVariableDeleted: function staticEnvVariableDeleted(id, variable) {\n var staticIndex = this.staticEnvVariables.indexOf(variable);\n if (staticIndex !== -1) this.staticEnvVariables.splice(staticIndex, 1);\n for (var index in this.lines) {\n if (this.lines[index].id !== id) {\n for (var variableIndex in this.lines[index].envVariables) {\n if (this.lines[index].envVariables[variableIndex].envVariable === variable) {\n this.lines[index].envVariables.splice(variableIndex, 1);\n }\n }\n }\n }\n },\n\n updatePsWorkerHosts: function updatePsWorkerHosts(index, host) {\n var psHosts = [];\n var workerHosts = [];\n var currentPort = 2222;\n\n for (var line in this.lines) {\n var currLine = this.lines[line];\n var jobName = '';\n for (var paramIndex in currLine.parameters) {\n if (currLine.parameters[paramIndex].parameter === '--job_name=') {\n jobName = currLine.parameters[paramIndex].value;\n }\n }\n for (var _paramIndex in currLine.parameters) {\n if (currLine.parameters[_paramIndex].parameter === '--task_index=') {\n var lineHost = '';\n if (line === index) {\n lineHost = host;\n } else {\n lineHost = currLine.host;\n }\n if (jobName === 'worker') {\n workerHosts[currLine.parameters[_paramIndex].value] = lineHost + ':' + currentPort.toString();\n currentPort++;\n } else if (jobName === 'ps') {\n psHosts[currLine.parameters[_paramIndex].value] = lineHost + ':' + currentPort.toString();\n currentPort++;\n }\n }\n }\n }\n\n var psHostsParam = '';\n var workerHostsParam = '';\n\n for (var pHost in psHosts) {\n psHostsParam += psHosts[pHost] + ',';\n }\n psHostsParam = psHostsParam.replace(/,\\s*$/, '');\n for (var wHost in workerHosts) {\n workerHostsParam += workerHosts[wHost] + ',';\n }\n workerHostsParam = workerHostsParam.replace(/,\\s*$/, '');\n\n for (var _line in this.lines) {\n for (var _paramIndex2 in this.lines[_line].parameters) {\n if (this.lines[_line].parameters[_paramIndex2].parameter === '--ps_hosts=') {\n this.lines[_line].parameters[_paramIndex2].value = psHostsParam;\n } else if (this.lines[_line].parameters[_paramIndex2].parameter === '--worker_hosts=') {\n this.lines[_line].parameters[_paramIndex2].value = workerHostsParam;\n }\n }\n }\n },\n\n updateTfConfigHost: function updateTfConfigHost(id, host) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n // set new config port\n var machineHosts = {};\n machineHosts[host] = 2221;\n for (var line in this.lines) {\n if (this.lines[line].id !== id && this.lines[line].host && this.lines[line].tfConfigPort) {\n if (machineHosts.hasOwnProperty(this.lines[line].host)) {\n machineHosts[this.lines[line].host] = Math.max(machineHosts[this.lines[line].host], parseInt(this.lines[line].tfConfigPort));\n } else {\n machineHosts[this.lines[line].host] = 2221;\n }\n }\n }\n this.lines[lineIndex].tfConfigPort = (machineHosts[host] + 1).toString();\n\n // check if given line has taskIndex set\n var taskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n if (taskIndex !== -1) {\n var taskType = this.lines[lineIndex].tfConfigTaskType;\n this.tfCluster[taskType][taskIndex] = host + ':' + this.lines[lineIndex].tfConfigPort;\n this.tfCluster.__ob__.dep.notify();\n }\n },\n\n updateTfConfigPort: function updateTfConfigPort(id, port) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n if (!this.lines[lineIndex].enableTfConfig || !this.enableSmartTfConfig) {\n return;\n }\n\n this.lines[lineIndex].tfConfigPort = port;\n\n // check if given line has taskIndex set\n var taskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n if (taskIndex !== -1) {\n var taskType = this.lines[lineIndex].tfConfigTaskType;\n this.tfCluster[taskType][taskIndex] = this.lines[lineIndex].host + ':' + this.lines[lineIndex].tfConfigPort;\n this.tfCluster.__ob__.dep.notify();\n }\n },\n\n updateTfConfigTaskType: function updateTfConfigTaskType(id, taskType) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n if (!this.lines[lineIndex].enableTfConfig || !this.enableSmartTfConfig) {\n return;\n }\n\n // remove from old list of cluster tasks\n var oldTaskType = this.lines[lineIndex].tfConfigTaskType;\n if (oldTaskType && oldTaskType.length !== 0) {\n var oldTaskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n this.tfCluster[oldTaskType].splice(oldTaskIndex, 1);\n if (this.tfCluster[oldTaskType].length !== 0) {\n for (var otherLineIndex in this.lines) {\n if (this.lines[otherLineIndex].tfConfigTaskType === oldTaskType && this.lines[otherLineIndex].tfConfigTaskIndex > oldTaskIndex) {\n this.lines[otherLineIndex].tfConfigTaskIndex -= 1;\n }\n }\n } else {\n delete this.tfCluster[oldTaskType];\n }\n }\n\n // Assign new taskType and taskIndex\n if (!taskType || taskType.length === 0) {\n this.lines[lineIndex].tfConfigTaskType = taskType;\n this.lines[lineIndex].tfConfigTaskIndex = -1;\n } else {\n // check if there is a list with new taskType\n if (!this.tfCluster.hasOwnProperty(taskType)) {\n this.tfCluster[taskType] = [];\n }\n\n this.lines[lineIndex].tfConfigTaskType = taskType;\n this.lines[lineIndex].tfConfigTaskIndex = this.tfCluster[taskType].length;\n\n this.tfCluster[taskType].push(this.lines[lineIndex].host + ':' + this.lines[lineIndex].tfConfigPort);\n }\n this.tfCluster.__ob__.dep.notify();\n },\n\n updateTfConfigTaskIndex: function updateTfConfigTaskIndex(id, newTaskIndex) {\n // search for line\n var lineIndex;\n for (lineIndex in this.lines) {\n if (this.lines[lineIndex].id === id) {\n break;\n }\n }\n\n if (!this.lines[lineIndex].enableTfConfig || !this.enableSmartTfConfig || newTaskIndex === this.lines[lineIndex].tfConfigTaskIndex) {\n return;\n }\n\n var taskType = this.lines[lineIndex].tfConfigTaskType;\n var oldTaskIndex = this.lines[lineIndex].tfConfigTaskIndex;\n if (this.tfCluster[taskType].length <= newTaskIndex) {\n newTaskIndex = 0;\n } else if (newTaskIndex < 0) {\n newTaskIndex = this.tfCluster[taskType].length - 1;\n }\n if (newTaskIndex === this.lines[lineIndex].tfConfigTaskIndex) {\n return;\n }\n\n var value = this.tfCluster[taskType][oldTaskIndex];\n this.tfCluster[taskType].splice(oldTaskIndex, 1);\n for (var otherLineIndex in this.lines) {\n if (this.lines[otherLineIndex].tfConfigTaskType === taskType && this.lines[otherLineIndex].tfConfigTaskIndex > oldTaskIndex) {\n this.lines[otherLineIndex].tfConfigTaskIndex -= 1;\n }\n if (this.lines[otherLineIndex].tfConfigTaskType === taskType && this.lines[otherLineIndex].tfConfigTaskIndex >= newTaskIndex) {\n this.lines[otherLineIndex].tfConfigTaskIndex += 1;\n }\n }\n this.tfCluster[taskType].splice(newTaskIndex, 0, value);\n this.lines[lineIndex].tfConfigTaskIndex = newTaskIndex;\n this.tfCluster.__ob__.dep.notify();\n },\n\n convertResource: function convertResource(resource) {\n if (resource !== '' && resource !== null) {\n if (resource === 'CPU') {\n return 'CUDA_VISIBLE_DEVICES=';\n } else {\n return 'CUDA_VISIBLE_DEVICES=' + resource[3];\n }\n } else {\n return '';\n }\n },\n\n emptyParametersAndEnvVariables: function emptyParametersAndEnvVariables() {\n this.enableSmartTfConfig = false;\n this.isNewFieldStatic = false;\n this.staticParameters = [];\n this.staticEnvVariables = [];\n for (var lineIndex in this.lines) {\n this.lines[lineIndex].tfConfigTaskIndex = 0;\n this.lines[lineIndex].tfConfigTaskType = '';\n this.lines[lineIndex].tfConfigPort = '';\n this.lines[lineIndex].enableTfConfig = false;\n this.lines[lineIndex].parameters = [];\n this.lines[lineIndex].parameterIds = 0;\n this.lines[lineIndex].envVariables = [];\n this.lines[lineIndex].envVariableIds = 0;\n }\n this.tfCluster = {};\n }\n }\n});\n\n/***/ }),\n/* 203 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__ = __webpack_require__(327);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__TaskLineParameter_vue__ = __webpack_require__(330);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__TaskLineEnvVariable_vue__ = __webpack_require__(333);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__TaskLineTfConfig__ = __webpack_require__(336);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: {\n TaskLineTfConfig: __WEBPACK_IMPORTED_MODULE_3__TaskLineTfConfig__[\"a\" /* default */],\n TaskLineParameter: __WEBPACK_IMPORTED_MODULE_1__TaskLineParameter_vue__[\"a\" /* default */],\n TaskLineEnvVariable: __WEBPACK_IMPORTED_MODULE_2__TaskLineEnvVariable_vue__[\"a\" /* default */]\n },\n\n props: {\n hostnames: Array,\n hosts: Object,\n host: String,\n resource: String,\n command: String,\n parameters: Array,\n staticParameters: Array,\n envVariables: Array,\n staticEnvVariables: Array,\n enableTfConfig: Boolean,\n tfConfig: String,\n tfConfigPort: String,\n tfConfigTaskType: String,\n tfConfigTaskIndex: Number,\n tfCluster: Object,\n enableSmartTfConfig: Boolean\n },\n\n data: function data() {\n return {\n newHost: '',\n newResource: '',\n newEnvVariables: [{\n id: 0,\n envVariable: '',\n value: ''\n }],\n newCommand: '',\n newParameters: [{\n id: 0,\n parameter: '',\n value: ''\n }],\n newEnableTfConfig: false,\n newTfConfig: '',\n showModal: false\n };\n },\n created: function created() {\n this.newHost = this.host;\n this.newResource = this.resource;\n this.newEnvVariables = this.envVariables;\n this.envVariableIds = this.envVariables.length;\n this.newCommand = this.command;\n this.newParameters = this.parameters;\n this.parameterIds = this.parameters.length;\n this.newEnableTfConfig = this.enableTfConfig;\n this.newTfConfig = this.tfConfig;\n },\n\n\n computed: {\n hostResources: function hostResources() {\n if (this.newHost !== '') {\n return this.hosts[this.newHost].resources;\n } else {\n return [];\n }\n },\n taskPreview: function taskPreview() {\n var parameters = '';\n for (var index in this.parameters) {\n var parameterNameLength = this.parameters[index].parameter.length;\n if (this.parameters[index].parameter.charAt(parameterNameLength - 1) === ' ' || this.parameters[index].parameter.charAt(parameterNameLength - 1) === '=') {\n parameters += this.parameters[index].parameter + this.parameters[index].value + ' ';\n } else {\n parameters += this.parameters[index].parameter + ' ' + this.parameters[index].value + ' ';\n }\n }\n var envVariables = '';\n if (this.newEnableTfConfig) {\n envVariables += 'TF_CONFIG=' + this.newTfConfig + ' ';\n }\n for (var envIndex in this.envVariables) {\n envVariables += this.envVariables[envIndex].envVariable + '=' + this.envVariables[envIndex].value + ' ';\n }\n return this.host + ' ' + this.convertResource(this.resource) + ' ' + envVariables + ' ' + this.command + ' ' + parameters;\n }\n },\n\n watch: {\n parameters: function parameters() {\n this.newParameters = this.parameters;\n },\n envVariables: function envVariables() {\n this.newEnvVariables = this.envVariables;\n },\n enableTfConfig: function enableTfConfig() {\n this.newEnableTfConfig = this.enableTfConfig;\n },\n tfConfig: function tfConfig() {\n this.newTfConfig = this.tfConfig;\n },\n newHost: function newHost() {\n this.newResource = this.hosts[this.newHost].resources[0];\n this.updateLine();\n },\n newResource: function newResource() {\n this.updateLine();\n },\n newCommand: function newCommand() {\n this.updateLine();\n },\n newParameters: function newParameters() {\n this.updateLine();\n },\n newEnvVariables: function newEnvVariables() {\n this.updateLine();\n },\n newEnableTfConfig: function newEnableTfConfig() {\n this.updateLine();\n },\n newTfConfig: function newTfConfig() {\n this.updateLine();\n }\n },\n\n methods: {\n convertResource: function convertResource(resource) {\n if (resource !== '' && resource !== null) {\n if (resource === 'CPU') {\n return 'CUDA_VISIBLE_DEVICES=';\n } else {\n return 'CUDA_VISIBLE_DEVICES=' + resource[3];\n }\n } else {\n return '';\n }\n },\n\n\n changeParameter: function changeParameter(id, parameter, value) {\n for (var index in this.parameters) {\n if (this.parameters[index].id === id) {\n this.parameters[index].parameter = parameter;\n this.parameters[index].value = value;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticParameters), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var staticParameterName = _step.value;\n\n if (parameter === staticParameterName) {\n this.$emit('staticParameterChanged', parameter, value);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n if (parameter === '--job_name=' || parameter === '--task_index=') {\n this.$emit('psWorkerParameterChanged');\n }\n }\n }\n },\n\n deleteParameter: function deleteParameter(id) {\n for (var index in this.parameters) {\n if (this.parameters[index].id === id) {\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticParameters), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var staticParameterName = _step2.value;\n\n if (this.parameters[index].parameter === staticParameterName) {\n this.$emit('staticParameterDeleted', staticParameterName);\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n this.parameters.splice(index, 1);\n }\n }\n },\n\n changeEnvVariable: function changeEnvVariable(id, envVariable, value) {\n for (var index in this.envVariables) {\n if (this.envVariables[index].id === id) {\n this.envVariables[index].envVariable = envVariable;\n this.envVariables[index].value = value;\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticEnvVariables), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var staticEnvVariableName = _step3.value;\n\n if (envVariable === staticEnvVariableName) {\n this.$emit('staticEnvVariableChanged', envVariable, value);\n }\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n }\n }\n },\n\n deleteEnvVariable: function deleteEnvVariable(id) {\n for (var index in this.envVariables) {\n if (this.envVariables[index].id === id) {\n var _iteratorNormalCompletion4 = true;\n var _didIteratorError4 = false;\n var _iteratorError4 = undefined;\n\n try {\n for (var _iterator4 = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_get_iterator___default()(this.staticEnvVariables), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n var staticEnvVariableName = _step4.value;\n\n if (this.envVariables[index].envVariable === staticEnvVariableName) {\n this.$emit('staticEnvVariableDeleted', staticEnvVariableName);\n }\n }\n } catch (err) {\n _didIteratorError4 = true;\n _iteratorError4 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion4 && _iterator4.return) {\n _iterator4.return();\n }\n } finally {\n if (_didIteratorError4) {\n throw _iteratorError4;\n }\n }\n }\n\n this.envVariables.splice(index, 1);\n }\n }\n },\n\n changeTfConfig: function changeTfConfig(value) {\n this.newTfConfig = value;\n },\n\n deleteTfConfig: function deleteTfConfig() {\n this.$emit('updateTfConfigTaskType', '');\n this.newEnableTfConfig = false;\n this.newTfConfig = '';\n },\n\n updateTfConfigPort: function updateTfConfigPort(newPort) {\n this.$emit('updateTfConfigPort', newPort);\n },\n\n updateTfConfigTaskType: function updateTfConfigTaskType(newTaskType) {\n this.$emit('updateTfConfigTaskType', newTaskType);\n },\n\n updateTfConfigTaskIndex: function updateTfConfigTaskIndex(newTaskIndex) {\n this.$emit('updateTfConfigTaskIndex', newTaskIndex);\n },\n\n updateLine: function updateLine() {\n this.$emit('changeLine', this.newHost, this.newResource, this.newCommand, this.newParameters, this.newEnvVariables, this.newEnableTfConfig, this.newTfConfig);\n },\n\n removeMe: function removeMe() {\n this.$emit('deleteLine');\n }\n }\n});\n\n/***/ }),\n/* 204 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n parameter: String,\n value: String\n },\n\n data: function data() {\n return {\n newParameter: '',\n newValue: ''\n };\n },\n created: function created() {\n this.newParameter = this.parameter;\n this.newValue = this.value;\n },\n\n\n watch: {\n value: function value() {\n this.newValue = this.value;\n },\n newParameter: function newParameter() {\n this.$emit('changeParameter', this.newParameter, this.newValue);\n },\n newValue: function newValue() {\n this.$emit('changeParameter', this.newParameter, this.newValue);\n }\n },\n\n methods: {\n removeMe: function removeMe() {\n this.$emit('deleteParameter');\n }\n }\n});\n\n/***/ }),\n/* 205 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n envVariable: String,\n value: String\n },\n\n data: function data() {\n return {\n newEnvVariable: '',\n newValue: '',\n showModalTfConfigEdit: false\n };\n },\n created: function created() {\n this.newEnvVariable = this.envVariable;\n this.newValue = this.value;\n },\n\n\n watch: {\n value: function value() {\n this.newValue = this.value;\n },\n newEnvVariable: function newEnvVariable() {\n this.$emit('changeEnvVariable', this.newEnvVariable, this.newValue);\n },\n newValue: function newValue() {\n this.$emit('changeEnvVariable', this.newEnvVariable, this.newValue);\n }\n },\n\n methods: {\n removeMe: function removeMe() {\n this.$emit('deleteEnvVariable');\n },\n\n updateValue: function updateValue(newValue) {\n this.newValue = newValue;\n }\n }\n});\n\n/***/ }),\n/* 206 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__TfConfigEdit__ = __webpack_require__(338);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n components: { TfConfigEdit: __WEBPACK_IMPORTED_MODULE_1__TfConfigEdit__[\"a\" /* default */] },\n\n name: 'TaskLineTfConfig',\n\n props: {\n value: String,\n port: String,\n taskType: String,\n taskIndex: Number,\n tfCluster: Object,\n enableSmartTfConfig: Boolean\n },\n\n data: function data() {\n return {\n newValue: '',\n newPort: '',\n newTaskType: '',\n taskTypeItems: ['chief', 'evaluator', 'master', 'ps', 'worker'],\n newTaskIndex: -1,\n localEnableSmartTfConfig: false,\n showModalTfConfigEdit: false\n };\n },\n created: function created() {\n this.newValue = this.value;\n this.newPort = this.port;\n this.newTaskType = this.taskType;\n this.newTaskIndex = this.taskIndex;\n this.localEnableSmartTfConfig = this.enableSmartTfConfig;\n },\n\n\n watch: {\n value: function value() {\n this.newValue = this.value;\n },\n port: function port() {\n this.newPort = this.port;\n },\n taskType: function taskType() {\n this.newTaskType = this.taskType;\n },\n taskIndex: function taskIndex() {\n this.newTaskIndex = this.taskIndex;\n },\n tfCluster: function tfCluster() {\n if (this.newTaskIndex >= 0) {\n var value = {\n cluster: this.tfCluster,\n task: {\n type: this.newTaskType,\n index: this.newTaskIndex\n }\n };\n this.updateValue('\\'' + __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(value).split('\"').join('\\\\\"') + '\\'');\n } else {\n this.updateValue('');\n }\n },\n enableSmartTfConfig: function enableSmartTfConfig() {\n this.localEnableSmartTfConfig = this.enableSmartTfConfig;\n },\n newValue: function newValue() {\n this.$emit('changeTfConfig', this.newValue);\n },\n newPort: function newPort() {\n this.$emit('updateTfConfigPort', this.newPort);\n },\n newTaskType: function newTaskType() {\n this.$emit('updateTfConfigTaskType', this.newTaskType);\n },\n newTaskIndex: function newTaskIndex() {\n if (isNaN(parseInt(this.newTaskIndex))) {\n this.newTaskIndex = this.taskIndex;\n } else {\n // FIXME there is edge case when index is 0 and it's the only task of this type - it occurs when you change by button\n this.$emit('updateTfConfigTaskIndex', parseInt(this.newTaskIndex));\n }\n }\n },\n\n methods: {\n removeMe: function removeMe() {\n this.$emit('deleteTfConfig');\n },\n\n updateValue: function updateValue(newValue) {\n this.newValue = newValue;\n }\n }\n});\n\n/***/ }),\n/* 207 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify__);\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'TfConfigEdit',\n\n props: {\n value: String,\n showModal: Boolean\n },\n\n data: function data() {\n return {\n newValue: '',\n properJson: false,\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();else this.newValue = this.desanitize(this.value);\n },\n newValue: function newValue() {\n try {\n JSON.parse(this.newValue);\n this.properJson = true;\n } catch (e) {\n this.properJson = false;\n }\n }\n },\n\n methods: {\n close: function close() {\n this.$emit('close');\n },\n\n save: function save() {\n this.close();\n this.$emit('updateValue', this.sanitize(this.newValue));\n },\n\n sanitize: function sanitize(value) {\n value = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(JSON.parse(value));\n return '\\'' + value.split('\"').join('\\\\\"') + '\\'';\n },\n\n desanitize: function desanitize(value) {\n try {\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_json_stringify___default()(JSON.parse(value.split('\\'').join('').split('\\\\\"').join('\"')), null, 2);\n } catch (e) {\n return value;\n }\n }\n }\n});\n\n/***/ }),\n/* 208 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n showModal: Boolean,\n taskId: Number,\n hostname: String,\n command: String,\n actionFlag: Boolean\n },\n\n data: function data() {\n return {\n newHost: '',\n newCommand: '',\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n hostname: function hostname() {\n this.newHost = this.hostname;\n },\n command: function command() {\n this.newCommand = this.command;\n }\n },\n\n methods: {\n changeTask: function changeTask() {\n var _this = this;\n\n var newTask = {\n hostname: this.newHost,\n command: this.newCommand\n };\n if (!this.actionFlag) {\n this.$emit('changeActionFlag', true);\n this.$emit('changeSnackbar', true);\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/tasks/' + this.taskId, this.$store.state.accessToken, newTask).then(function (response) {\n _this.close();\n _this.$emit('getTask', _this.taskId, true);\n });\n }\n },\n\n close: function close() {\n this.$emit('close');\n }\n }\n});\n\n/***/ }),\n/* 209 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n showModal: Boolean,\n taskId: Number,\n spawnTime: String,\n terminateTime: String,\n actionFlag: Boolean,\n multipleFlag: Boolean,\n selected: Array\n },\n\n data: function data() {\n return {\n spawnTimeMenu: false,\n spawnDateMenu: false,\n terminateTimeMenu: false,\n terminateDateMenu: false,\n spawn: false,\n terminate: false,\n newSpawnDate: '',\n newSpawnTime: '',\n newTerminateDate: '',\n newTerminateTime: '',\n selectedIndex: 0,\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n },\n spawnTime: function spawnTime() {\n if (this.spawnTime !== null) {\n this.newSpawnDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.spawnTime).format('YYYY-MM-DD');\n this.newSpawnTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.spawnTime).format('HH:mm');\n } else {\n this.newSpawnDate = '';\n this.newSpawnTime = '';\n }\n },\n terminateTime: function terminateTime() {\n if (this.terminateTime !== null) {\n this.newTerminateDate = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.terminateTime).format('YYYY-MM-DD');\n this.newTerminateTime = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.terminateTime).format('HH:mm');\n } else {\n this.newTerminateDate = '';\n this.newTerminateTime = '';\n }\n }\n },\n\n methods: {\n actionSave: function actionSave() {\n this.$refs.menu.save(this.newSpawnTime);\n },\n\n checkActionFlag: function checkActionFlag() {\n if (this.actionFlag === false) {\n this.$emit('changeActionFlag', true);\n this.$emit('changeSnackbar', true);\n this.scheduleTasks();\n }\n },\n\n scheduleTasks: function scheduleTasks() {\n var _this = this;\n\n var newTask = {};\n if (this.newSpawnTime !== '' && this.newSpawnTime !== null && this.newSpawnTime !== undefined) {\n newTask['spawnAt'] = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newSpawnDate + 'T' + this.newSpawnTime).toISOString();\n }\n if (this.newTerminateTime !== '' && this.newTerminateTime !== null && this.newTerminateTime !== undefined) {\n newTask['terminateAt'] = __WEBPACK_IMPORTED_MODULE_1_moment___default()(this.newTerminateDate + 'T' + this.newTerminateTime).toISOString();\n }\n if (!this.spawn) {\n newTask['spawnAt'] = null;\n }\n if (!this.terminate) {\n newTask['terminateAt'] = null;\n }\n var id;\n if (this.multipleFlag) {\n id = this.selected[this.selectedIndex].id;\n } else {\n id = this.taskId;\n }\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/tasks/' + id, this.$store.state.accessToken, newTask).then(function (response) {\n _this.close();\n _this.getTask(id);\n }).catch(function (error) {\n _this.$emit('handleError', error);\n _this.close();\n _this.getTask(id);\n });\n },\n\n getTask: function getTask(id) {\n var _this2 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/tasks/' + id, this.$store.state.accessToken).then(function (response) {\n _this2.$emit('updateTask', id, response.data.task);\n if (_this2.multipleFlag) {\n _this2.selectedIndex++;\n if (_this2.selectedIndex < _this2.selected.length) {\n _this2.scheduleTasks();\n } else {\n _this2.selectedIndex = 0;\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n } else {\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n }).catch(function (error) {\n _this2.$emit('handleError', error);\n if (_this2.multipleFlag) {\n _this2.selectedIndex++;\n if (_this2.selectedIndex < _this2.selected.length) {\n _this2.scheduleTasks();\n } else {\n _this2.selectedIndex = 0;\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n } else {\n _this2.$emit('changeActionFlag', false);\n _this2.$emit('changeSnackbar', false);\n }\n });\n },\n\n close: function close() {\n this.$emit('close');\n }\n }\n});\n\n/***/ }),\n/* 210 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n props: {\n showModal: Boolean,\n lines: Array,\n path: String\n },\n data: function data() {\n return {\n show: false\n };\n },\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n }\n },\n methods: {\n close: function close() {\n this.$emit('close');\n }\n }\n});\n\n/***/ }),\n/* 211 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'TaskTemplateChooser',\n\n props: {\n showModal: Boolean\n },\n\n data: function data() {\n return {\n chosenTemplate: '',\n possibleTemplates: ['No template', 'Tensorflow - cluster parameters', 'Tensorflow - TF_CONFIG', 'PyTorch'],\n show: false\n };\n },\n\n\n watch: {\n showModal: function showModal() {\n this.show = this.showModal;\n },\n show: function show() {\n if (this.show === false) this.close();\n }\n },\n\n methods: {\n close: function close() {\n this.$emit('close');\n },\n\n setChosenTemplate: function setChosenTemplate(templateName) {\n switch (templateName) {\n case 'Tensorflow - cluster parameters':\n this.chosenTemplate = 'tf1';\n break;\n case 'Tensorflow - TF_CONFIG':\n this.chosenTemplate = 'tf2';\n break;\n case 'PyTorch':\n this.chosenTemplate = 'torch';\n break;\n default:\n this.chosenTemplate = '';\n }\n },\n\n goToCreate: function goToCreate() {\n this.close();\n this.$emit('openFromTemplate', this.chosenTemplate);\n }\n }\n});\n\n/***/ }),\n/* 212 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_moment___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_moment__);\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n data: function data() {\n return {\n dialog: false,\n search: '',\n pagination: {},\n selected: [],\n headers: [{ text: 'User id', value: 'id' }, { text: 'Username', value: 'username' }, { text: 'Email', value: 'email' }, { text: 'Created at', value: 'createdAt' }, { text: 'Role', value: 'role' }, { text: 'Actions', value: 'id' }],\n users: [],\n user: {\n id: -1,\n username: '',\n email: '',\n password: '',\n password2: '',\n roles: []\n },\n currentUser: {},\n time: 1000,\n alert: false,\n errorMessage: '',\n userCheckbox: false,\n adminCheckbox: false,\n modalUsername: '',\n modalEmail: '',\n modalPassword: '',\n modalPassword2: '',\n modalAlert: false,\n showModalRemove: false,\n userId: -1,\n created: false,\n showModal: false\n };\n },\n\n\n computed: {\n pages: function pages() {\n if (this.pagination.rowsPerPage == null || this.pagination.totalItems == null) return 0;\n\n return Math.ceil(this.pagination.totalItems / this.pagination.rowsPerPage);\n }\n },\n\n mounted: function mounted() {\n this.checkUsers();\n },\n\n\n methods: {\n prettyDate: function prettyDate(date) {\n if (date !== null) {\n return __WEBPACK_IMPORTED_MODULE_1_moment___default()(date).format('dddd, MMMM Do, HH:mm');\n } else {\n return null;\n }\n },\n\n\n handleError: function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n this.errorMessage = error.message;\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n this.errorMessage = error.response.data;\n } else {\n this.errorMessage = error.response.data.msg;\n }\n }\n },\n\n createUser: function createUser() {\n var _this = this;\n\n if (this.modalPassword === this.modalPassword2) {\n var modalUsername = this.modalUsername,\n modalEmail = this.modalEmail,\n modalPassword = this.modalPassword;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('post', '/user/create', this.$store.state.accessToken, { 'username': modalUsername, 'email': modalEmail, 'password': modalPassword }).then(function (response) {\n _this.showModal = false;\n _this.created = true;\n _this.checkUsers();\n }).catch(function (error) {\n _this.handleError(error);\n _this.modalAlert = true;\n });\n } else {\n this.errorMessage = 'Passwords do not match';\n this.modalAlert = true;\n }\n },\n\n\n editUser: function editUser(currentUser) {\n this.dialog = true;\n this.user.id = currentUser.id;\n this.user.username = currentUser.username;\n this.user.email = currentUser.email;\n var admin = false;\n for (var role in currentUser.roles) {\n if (currentUser.roles[role] === 'admin') {\n admin = true;\n }\n }\n this.adminCheckbox = admin;\n this.currentUser = currentUser;\n },\n\n updateUser: function updateUser() {\n var _this2 = this;\n\n if (this.user.password === this.user.password2) {\n if (this.adminCheckbox) {\n this.user.roles.push('admin');\n }\n this.user.roles.push('user');\n var updatedUser = {\n id: this.user.id\n };\n if (this.user.username !== this.currentUser.username && this.user.username !== '') {\n updatedUser['username'] = this.user.username;\n }\n if (this.user.email !== this.currentUser.email && this.user.email !== '') {\n updatedUser['email'] = this.user.email;\n }\n if (this.user.password !== '') {\n updatedUser['password'] = this.user.password;\n }\n if (this.user.roles.length !== this.currentUser.roles.length) {\n updatedUser['roles'] = this.user.roles;\n }\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('put', '/user', this.$store.state.accessToken, updatedUser).then(function (response) {\n _this2.user = {\n id: -1,\n username: '',\n email: '',\n password: '',\n password2: '',\n roles: []\n };\n _this2.adminCheckbox = false;\n _this2.userCheckbox = false;\n _this2.dialog = false;\n _this2.checkUsers();\n }).catch(function (error) {\n _this2.pagination = {};\n _this2.handleError(error);\n _this2.alert = true;\n });\n } else {\n this.errorMessage = 'Passwords do not match';\n this.alert = true;\n }\n },\n checkUsers: function checkUsers() {\n var _this3 = this;\n\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('get', '/users', this.$store.state.accessToken).then(function (response) {\n _this3.users = response.data;\n for (var user in _this3.users) {\n var admin = false;\n for (var role in _this3.users[user].roles) {\n if (_this3.users[user].roles[role] === 'admin') {\n admin = true;\n }\n }\n if (admin) {\n _this3.users[user]['role'] = 'admin';\n } else {\n _this3.users[user]['role'] = 'user';\n }\n }\n _this3.pagination['totalItems'] = _this3.users.length;\n _this3.pagination['rowsPerPage'] = 30;\n }).catch(function (error) {\n _this3.pagination = {};\n _this3.handleError(error);\n _this3.alert = true;\n });\n },\n\n showConfirmationDialog: function showConfirmationDialog(id) {\n this.userId = id;\n this.showModalRemove = true;\n },\n\n\n removeUser: function removeUser() {\n var _this4 = this;\n\n var userId = this.userId;\n __WEBPACK_IMPORTED_MODULE_0__api__[\"a\" /* default */].request('delete', '/user/delete/' + userId, this.$store.state.accessToken).then(function (response) {\n _this4.showModalRemove = false;\n _this4.checkUsers();\n }).catch(function (error) {\n _this4.handleError(error);\n _this4.alert = true;\n });\n }\n }\n});\n\n/***/ }),\n/* 213 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n//\n//\n//\n//\n//\n//\n//\n//\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n name: 'App',\n\n data: function data() {\n return {\n section: 'Head'\n };\n }\n});\n\n/***/ }),\n/* 214 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__ = __webpack_require__(215);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_es6_promise_auto__ = __webpack_require__(247);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_es6_promise_auto___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_es6_promise_auto__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_vue__ = __webpack_require__(30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_vue_router__ = __webpack_require__(251);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__ = __webpack_require__(252);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_vuex_router_sync___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__routes__ = __webpack_require__(253);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__store__ = __webpack_require__(360);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__api__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__filters__ = __webpack_require__(365);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__components_App_vue__ = __webpack_require__(366);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_vuetify__ = __webpack_require__(368);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_vuetify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_vuetify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css__ = __webpack_require__(369);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_12_vuetify_dist_vuetify_min_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css__ = __webpack_require__(370);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_13_material_design_icons_iconfont_dist_material_design_icons_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14_axios__ = __webpack_require__(54);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14_axios___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_14_axios__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__config__ = __webpack_require__(31);\n\n\n// Import ES6 Promise\n\n\n// Import System requirements\n\n\n\n\n\n\n\n\n// Import Helpers for filters\n\n\n// Import Views - Top level\n\n\n\n\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_14_axios___default.a.get('static/config.json').then(function (response) {\n __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI = response.data.apiPath;\n __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion = response.data.apiVersion;\n __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version = response.data.version;\n if (window.localStorage) {\n var apiVersion = JSON.parse(window.localStorage.getItem('apiVersion'));\n var version = JSON.parse(window.localStorage.getItem('version'));\n if (apiVersion === null) {\n if (__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion !== undefined) {\n window.localStorage.setItem('apiVersion', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion));\n } else {\n window.localStorage.setItem('apiVersion', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()('no data in config file'));\n }\n } else if (apiVersion !== __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion) {\n window.localStorage.clear();\n location.reload(true);\n }\n if (version === null) {\n if (__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version !== undefined) {\n window.localStorage.setItem('version', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(__WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].apiVersion));\n } else {\n window.localStorage.setItem('version', __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()('no data in config file'));\n }\n } else if (version !== __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].version) {\n window.localStorage.clear();\n location.reload(true);\n }\n }\n\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].use(__WEBPACK_IMPORTED_MODULE_11_vuetify___default.a);\n\n // Import Install and register helper items\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('count', __WEBPACK_IMPORTED_MODULE_9__filters__[\"a\" /* count */]);\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('domain', __WEBPACK_IMPORTED_MODULE_9__filters__[\"b\" /* domain */]);\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('prettyDate', __WEBPACK_IMPORTED_MODULE_9__filters__[\"d\" /* prettyDate */]);\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].filter('pluralize', __WEBPACK_IMPORTED_MODULE_9__filters__[\"c\" /* pluralize */]);\n\n __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"].use(__WEBPACK_IMPORTED_MODULE_4_vue_router__[\"a\" /* default */]);\n\n // Routing logic\n var router = new __WEBPACK_IMPORTED_MODULE_4_vue_router__[\"a\" /* default */]({\n routes: __WEBPACK_IMPORTED_MODULE_6__routes__[\"a\" /* default */],\n mode: 'history',\n linkExactActiveClass: 'active',\n scrollBehavior: function scrollBehavior(to, from, savedPosition) {\n return savedPosition || { x: 0, y: 0 };\n }\n });\n\n // Some middleware to help us ensure the user is authenticated.\n router.beforeEach(function (to, from, next) {\n if (to.matched.some(function (record) {\n return record.meta.requiresAuth;\n }) && (!router.app.$store.state.accessToken || router.app.$store.state.accessToken === 'null')) {\n // this route requires auth, check if logged in\n // if not, redirect to login page.\n window.console.log('Not authenticated');\n next({\n path: '/login',\n query: { redirect: to.fullPath }\n });\n } else if (to.meta.role === 'admin') {\n if (router.app.$store.state.role === 'admin') {\n next();\n } else {\n next({\n path: '/',\n query: { redirect: to.fullPath }\n });\n }\n } else {\n next();\n }\n });\n\n Object(__WEBPACK_IMPORTED_MODULE_5_vuex_router_sync__[\"sync\"])(__WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */], router);\n\n __WEBPACK_IMPORTED_MODULE_14_axios___default.a.interceptors.response.use(null, function (error) {\n if (error.config.url === __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI + '/user/refresh') {\n if (window.localStorage) {\n window.localStorage.setItem('user', null);\n window.localStorage.setItem('role', null);\n window.localStorage.setItem('accessToken', null);\n window.localStorage.setItem('refreshToken', null);\n }\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_USER', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ROLE', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_REFRESH_TOKEN', null);\n router.push('/login');\n } else {\n if (error.config && error.response && error.response.status === 401 && error.config.url !== __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI + '/user/login') {\n __WEBPACK_IMPORTED_MODULE_14_axios___default.a.defaults.headers.common['Authorization'] = __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.refreshToken;\n return __WEBPACK_IMPORTED_MODULE_14_axios___default()({ method: 'get', url: __WEBPACK_IMPORTED_MODULE_15__config__[\"a\" /* default */].serverURI + '/user/refresh', data: null }).then(function (response) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', 'Bearer ' + response.data.access_token);\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', 'Bearer ' + response.data.access_token);\n }\n error.config.headers['Authorization'] = 'Bearer ' + response.data.access_token;\n return __WEBPACK_IMPORTED_MODULE_14_axios___default.a.request(error.config);\n }).catch(function (error) {\n handleError(error);\n logout();\n });\n }\n }\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default.a.reject(error);\n });\n // Check local storage to handle refreshes\n if (window.localStorage) {\n var localUserString = window.localStorage.getItem('user') || 'null';\n var localUser = JSON.parse(localUserString);\n\n if (localUser && __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.user !== localUser) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_USER', localUser);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', window.localStorage.getItem('accessToken'));\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_REFRESH_TOKEN', window.localStorage.getItem('refreshToken'));\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ROLE', window.localStorage.getItem('role'));\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ID', parseInt(window.localStorage.getItem('userId')));\n }\n }\n function handleError(error) {\n if (!error.hasOwnProperty('response')) {\n console.log(error.message);\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n console.log(error.response.data);\n } else {\n console.log(error.response.data.msg);\n }\n }\n }\n\n function logout() {\n var _this = this;\n\n if (__WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.accessToken !== null) {\n __WEBPACK_IMPORTED_MODULE_8__api__[\"a\" /* default */].request('delete', '/user/logout', __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.accessToken).then(function (response) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ACCESS_TOKEN', null);\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', null);\n }\n if (__WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.refreshToken !== null) {\n __WEBPACK_IMPORTED_MODULE_8__api__[\"a\" /* default */].request('delete', '/user/logout/refresh_token', __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].state.refreshToken).then(function (response) {\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_REFRESH_TOKEN', null);\n if (window.localStorage) {\n window.localStorage.setItem('refreshToken', null);\n }\n }).catch(function (error) {\n handleError(error);\n });\n }\n }).catch(function (error) {\n _this.handleError(error);\n });\n }\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_USER', null);\n __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */].commit('SET_ROLE', null);\n\n if (window.localStorage) {\n window.localStorage.setItem('user', null);\n window.localStorage.setItem('role', null);\n }\n router.push('/login');\n }\n // Start out app!\n // eslint-disable-next-line no-new\n new __WEBPACK_IMPORTED_MODULE_3_vue__[\"default\"]({\n el: '#root',\n router: router,\n store: __WEBPACK_IMPORTED_MODULE_7__store__[\"a\" /* default */],\n render: function render(h) {\n return h(__WEBPACK_IMPORTED_MODULE_10__components_App_vue__[\"a\" /* default */]);\n }\n });\n});\n\n/***/ }),\n/* 215 */,\n/* 216 */,\n/* 217 */,\n/* 218 */,\n/* 219 */,\n/* 220 */,\n/* 221 */,\n/* 222 */,\n/* 223 */,\n/* 224 */,\n/* 225 */,\n/* 226 */,\n/* 227 */,\n/* 228 */,\n/* 229 */,\n/* 230 */,\n/* 231 */,\n/* 232 */,\n/* 233 */,\n/* 234 */,\n/* 235 */,\n/* 236 */,\n/* 237 */,\n/* 238 */,\n/* 239 */,\n/* 240 */,\n/* 241 */,\n/* 242 */,\n/* 243 */,\n/* 244 */,\n/* 245 */,\n/* 246 */,\n/* 247 */,\n/* 248 */,\n/* 249 */,\n/* 250 */,\n/* 251 */,\n/* 252 */,\n/* 253 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__components_TheDash_vue__ = __webpack_require__(254);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__components_TheLogin_vue__ = __webpack_require__(283);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__components_404_vue__ = __webpack_require__(286);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__components_views_ReservationsOverview_vue__ = __webpack_require__(289);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__components_views_NodesOverview_vue__ = __webpack_require__(308);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__components_views_TasksOverview_vue__ = __webpack_require__(321);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__components_views_UsersOverview_vue__ = __webpack_require__(357);\n\n\n\n// Import Views - Dash\n\n\n\n\n// Routes\nvar routes = [{\n path: '/',\n component: __WEBPACK_IMPORTED_MODULE_0__components_TheDash_vue__[\"a\" /* default */],\n children: [{\n path: '/reservations_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_3__components_views_ReservationsOverview_vue__[\"a\" /* default */],\n name: 'Reservation Overview',\n meta: {\n description: 'Calendar with reservations',\n requiresAuth: true,\n role: 'user'\n }\n }, {\n path: 'nodes_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_4__components_views_NodesOverview_vue__[\"a\" /* default */],\n name: 'Nodes overview',\n meta: {\n description: 'Informations about nodes',\n requiresAuth: true,\n role: 'user'\n }\n }, {\n path: 'tasks_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_5__components_views_TasksOverview_vue__[\"a\" /* default */],\n name: 'Tasks overview',\n meta: {\n description: 'Tasks overview',\n requiresAuth: true,\n role: 'user'\n }\n }, {\n path: 'users_overview',\n alias: '',\n component: __WEBPACK_IMPORTED_MODULE_6__components_views_UsersOverview_vue__[\"a\" /* default */],\n name: 'Users overview',\n meta: {\n description: 'Table users view for admin',\n requiresAuth: true,\n role: 'admin'\n }\n }]\n}, {\n path: '/login',\n component: __WEBPACK_IMPORTED_MODULE_1__components_TheLogin_vue__[\"a\" /* default */],\n meta: {\n role: 'user'\n }\n}, {\n path: '*',\n component: __WEBPACK_IMPORTED_MODULE_2__components_404_vue__[\"a\" /* default */]\n}];\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (routes);\n\n/***/ }),\n/* 254 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheDash_vue__ = __webpack_require__(51);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ebd4a91c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheDash_vue__ = __webpack_require__(282);\nfunction injectStyle (ssrContext) {\n __webpack_require__(255)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheDash_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ebd4a91c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheDash_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 256 */,\n/* 257 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebar_vue__ = __webpack_require__(52);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_8c8911fe_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebar_vue__ = __webpack_require__(262);\nfunction injectStyle (ssrContext) {\n __webpack_require__(258)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebar_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_8c8911fe_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebar_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 259 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebarMenu_vue__ = __webpack_require__(53);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1ff073b3_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebarMenu_vue__ = __webpack_require__(261);\nfunction injectStyle (ssrContext) {\n __webpack_require__(260)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_BaseSidebarMenu_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1ff073b3_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_BaseSidebarMenu_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 261 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"sidebar-menu\"},[_c('li',{staticClass:\"header\"},[_vm._v(\"SCHEDULE\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/reservations_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-calendar-check-o\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Reservations Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"RESOURCES\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/nodes_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-bar-chart\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Nodes Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"TASKS\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/tasks_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-tasks\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Tasks Overview\")])])]),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('li',{staticClass:\"header\"},[_vm._v(\"\\n ADMIN ZONE\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/users_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-users\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Users Overview\")])])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 262 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{staticClass:\"main-sidebar\"},[_c('section',{staticClass:\"sidebar\"},[_c('BaseSidebarMenu')],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 263 */,\n/* 264 */,\n/* 265 */,\n/* 266 */,\n/* 267 */,\n/* 268 */,\n/* 269 */,\n/* 270 */,\n/* 271 */,\n/* 272 */,\n/* 273 */,\n/* 274 */,\n/* 275 */,\n/* 276 */,\n/* 277 */,\n/* 278 */,\n/* 279 */,\n/* 280 */,\n/* 281 */,\n/* 282 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:['wrapper', _vm.classes]},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('header',{staticClass:\"main-header\"},[_c('nav',{staticClass:\"navbar navbar-static-top\",attrs:{\"role\":\"navigation\"}},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"version_info\"},[_c('b',[_vm._v(\"TensorHive\")]),_vm._v(\" v\"+_vm._s(_vm.version)+\" \"),_c('b',[_vm._v(\"API\")]),_vm._v(\" v\"+_vm._s(_vm.apiVersion)+\"\\n \")]),_vm._v(\" \"),_c('v-menu',{staticClass:\"user_chip\",attrs:{\"close-on-content-click\":false,\"offset-y\":\"\"}},[_c('v-chip',{attrs:{\"slot\":\"activator\",\"color\":\"green\",\"text-color\":\"white\"},slot:\"activator\"},[_c('v-avatar',[_c('v-icon',[_vm._v(\"account_circle\")])],1),_vm._v(\"\\n \"+_vm._s(_vm.displayName)+\"\\n \")],1),_vm._v(\" \"),_c('v-card',[_c('v-card-actions',[_c('v-btn',{attrs:{\"flat\":\"\"},on:{\"click\":function($event){return _vm.logout()}}},[_vm._v(\"Logout\")])],1)],1)],1)],1)]),_vm._v(\" \"),_c('BaseSidebar'),_vm._v(\" \"),_c('div',{staticClass:\"content-wrapper\"},[_c('router-view')],1),_vm._v(\" \"),_c('v-footer',{attrs:{\"height\":\"auto\",\"color\":\"#222d32\"}},[_c('v-layout',{attrs:{\"justify-center\":\"\",\"row\":\"\",\"wrap\":\"\"}},[_c('v-flex',{attrs:{\"text-xs-center\":\"\",\"white--text\":\"\",\"xs12\":\"\"}},[_vm._v(\"\\n Found a bug or needs some improvements? Leave us an \"),_c('a',{attrs:{\"href\":\"https://github.com/roscisz/TensorHive/issues\"}},[_vm._v(\"issue on Github\")]),_vm._v(\")\\n \")])],1)],1)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{staticClass:\"sidebar-toggle\",attrs:{\"href\":\"javascript:;\",\"data-toggle\":\"offcanvas\",\"role\":\"button\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Toggle navigation\")])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 283 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheLogin_vue__ = __webpack_require__(60);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_67170a3e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheLogin_vue__ = __webpack_require__(285);\nfunction injectStyle (ssrContext) {\n __webpack_require__(284)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-67170a3e\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TheLogin_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_67170a3e_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TheLogin_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 285 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"login\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Register new account\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"UNIX username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Repeat password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\"\\n Please copy the key below and paste it into \"),_c('b',[_vm._v(\"~/.ssh/authorized_keys\")]),_vm._v(\".\"),_c('br'),_vm._v(\"It will allow TensorHive to confirm your identity and access machines with provided UNIX username.\\n \"),_c('v-textarea',{attrs:{\"solo\":\"\",\"name\":\"entry\",\"value\":_vm.entry,\"id\":\"entry\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\"},on:{\"click\":_vm.copyEntryToClipboard}},[_vm._v(\"Copy to clipboard\")]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Register\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-center col-sm-12\"},[_c('form',{staticClass:\"login-form\",on:{\"submit\":function($event){$event.preventDefault();return _vm.checkCreds($event)}}},[_vm._v(\"\\n Login to your account\\n \"),_c('div',{staticClass:\"input-group\"},[_vm._m(0),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.username),expression:\"username\"}],staticClass:\"form-control\",attrs:{\"name\":\"username\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.username=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_vm._m(1),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],staticClass:\"form-control\",attrs:{\"name\":\"password\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n Identity verification succeeded, account has been successfully created. You can now log in.\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\"},on:{\"click\":_vm.requestEntry}},[_vm._v(\"Register\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Login\\n \")])],1)])],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 286 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_404_vue__ = __webpack_require__(61);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_209d35e8_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_404_vue__ = __webpack_require__(288);\nfunction injectStyle (ssrContext) {\n __webpack_require__(287)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_404_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_209d35e8_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_404_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 288 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"notFound\"}},[_c('div',{staticClass:\"text-center col-sm-12\"},[_c('h1',[_vm._v(\"You are lost.\")]),_vm._v(\" \"),_c('h4',[_vm._v(\"This page doesn't exist.\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"vertical-5p lead\",attrs:{\"to\":\"/\"}},[_vm._v(\"Take me home.\")])],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 289 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_ReservationsOverview_vue__ = __webpack_require__(62);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_a758ccee_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_ReservationsOverview_vue__ = __webpack_require__(307);\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_ReservationsOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_a758ccee_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_ReservationsOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 290 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendar_vue__ = __webpack_require__(64);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_17877d92_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendar_vue__ = __webpack_require__(300);\nfunction injectStyle (ssrContext) {\n __webpack_require__(291)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendar_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_17877d92_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendar_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 292 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarReserve_vue__ = __webpack_require__(65);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1d62e0bd_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarReserve_vue__ = __webpack_require__(295);\nfunction injectStyle (ssrContext) {\n __webpack_require__(293)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1d62e0bd\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarReserve_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1d62e0bd_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarReserve_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./af\": 66,\n\t\"./af.js\": 66,\n\t\"./ar\": 67,\n\t\"./ar-dz\": 68,\n\t\"./ar-dz.js\": 68,\n\t\"./ar-kw\": 69,\n\t\"./ar-kw.js\": 69,\n\t\"./ar-ly\": 70,\n\t\"./ar-ly.js\": 70,\n\t\"./ar-ma\": 71,\n\t\"./ar-ma.js\": 71,\n\t\"./ar-sa\": 72,\n\t\"./ar-sa.js\": 72,\n\t\"./ar-tn\": 73,\n\t\"./ar-tn.js\": 73,\n\t\"./ar.js\": 67,\n\t\"./az\": 74,\n\t\"./az.js\": 74,\n\t\"./be\": 75,\n\t\"./be.js\": 75,\n\t\"./bg\": 76,\n\t\"./bg.js\": 76,\n\t\"./bm\": 77,\n\t\"./bm.js\": 77,\n\t\"./bn\": 78,\n\t\"./bn.js\": 78,\n\t\"./bo\": 79,\n\t\"./bo.js\": 79,\n\t\"./br\": 80,\n\t\"./br.js\": 80,\n\t\"./bs\": 81,\n\t\"./bs.js\": 81,\n\t\"./ca\": 82,\n\t\"./ca.js\": 82,\n\t\"./cs\": 83,\n\t\"./cs.js\": 83,\n\t\"./cv\": 84,\n\t\"./cv.js\": 84,\n\t\"./cy\": 85,\n\t\"./cy.js\": 85,\n\t\"./da\": 86,\n\t\"./da.js\": 86,\n\t\"./de\": 87,\n\t\"./de-at\": 88,\n\t\"./de-at.js\": 88,\n\t\"./de-ch\": 89,\n\t\"./de-ch.js\": 89,\n\t\"./de.js\": 87,\n\t\"./dv\": 90,\n\t\"./dv.js\": 90,\n\t\"./el\": 91,\n\t\"./el.js\": 91,\n\t\"./en-SG\": 92,\n\t\"./en-SG.js\": 92,\n\t\"./en-au\": 93,\n\t\"./en-au.js\": 93,\n\t\"./en-ca\": 94,\n\t\"./en-ca.js\": 94,\n\t\"./en-gb\": 95,\n\t\"./en-gb.js\": 95,\n\t\"./en-ie\": 96,\n\t\"./en-ie.js\": 96,\n\t\"./en-il\": 97,\n\t\"./en-il.js\": 97,\n\t\"./en-nz\": 98,\n\t\"./en-nz.js\": 98,\n\t\"./eo\": 99,\n\t\"./eo.js\": 99,\n\t\"./es\": 100,\n\t\"./es-do\": 101,\n\t\"./es-do.js\": 101,\n\t\"./es-us\": 102,\n\t\"./es-us.js\": 102,\n\t\"./es.js\": 100,\n\t\"./et\": 103,\n\t\"./et.js\": 103,\n\t\"./eu\": 104,\n\t\"./eu.js\": 104,\n\t\"./fa\": 105,\n\t\"./fa.js\": 105,\n\t\"./fi\": 106,\n\t\"./fi.js\": 106,\n\t\"./fo\": 107,\n\t\"./fo.js\": 107,\n\t\"./fr\": 108,\n\t\"./fr-ca\": 109,\n\t\"./fr-ca.js\": 109,\n\t\"./fr-ch\": 110,\n\t\"./fr-ch.js\": 110,\n\t\"./fr.js\": 108,\n\t\"./fy\": 111,\n\t\"./fy.js\": 111,\n\t\"./ga\": 112,\n\t\"./ga.js\": 112,\n\t\"./gd\": 113,\n\t\"./gd.js\": 113,\n\t\"./gl\": 114,\n\t\"./gl.js\": 114,\n\t\"./gom-latn\": 115,\n\t\"./gom-latn.js\": 115,\n\t\"./gu\": 116,\n\t\"./gu.js\": 116,\n\t\"./he\": 117,\n\t\"./he.js\": 117,\n\t\"./hi\": 118,\n\t\"./hi.js\": 118,\n\t\"./hr\": 119,\n\t\"./hr.js\": 119,\n\t\"./hu\": 120,\n\t\"./hu.js\": 120,\n\t\"./hy-am\": 121,\n\t\"./hy-am.js\": 121,\n\t\"./id\": 122,\n\t\"./id.js\": 122,\n\t\"./is\": 123,\n\t\"./is.js\": 123,\n\t\"./it\": 124,\n\t\"./it-ch\": 125,\n\t\"./it-ch.js\": 125,\n\t\"./it.js\": 124,\n\t\"./ja\": 126,\n\t\"./ja.js\": 126,\n\t\"./jv\": 127,\n\t\"./jv.js\": 127,\n\t\"./ka\": 128,\n\t\"./ka.js\": 128,\n\t\"./kk\": 129,\n\t\"./kk.js\": 129,\n\t\"./km\": 130,\n\t\"./km.js\": 130,\n\t\"./kn\": 131,\n\t\"./kn.js\": 131,\n\t\"./ko\": 132,\n\t\"./ko.js\": 132,\n\t\"./ku\": 133,\n\t\"./ku.js\": 133,\n\t\"./ky\": 134,\n\t\"./ky.js\": 134,\n\t\"./lb\": 135,\n\t\"./lb.js\": 135,\n\t\"./lo\": 136,\n\t\"./lo.js\": 136,\n\t\"./lt\": 137,\n\t\"./lt.js\": 137,\n\t\"./lv\": 138,\n\t\"./lv.js\": 138,\n\t\"./me\": 139,\n\t\"./me.js\": 139,\n\t\"./mi\": 140,\n\t\"./mi.js\": 140,\n\t\"./mk\": 141,\n\t\"./mk.js\": 141,\n\t\"./ml\": 142,\n\t\"./ml.js\": 142,\n\t\"./mn\": 143,\n\t\"./mn.js\": 143,\n\t\"./mr\": 144,\n\t\"./mr.js\": 144,\n\t\"./ms\": 145,\n\t\"./ms-my\": 146,\n\t\"./ms-my.js\": 146,\n\t\"./ms.js\": 145,\n\t\"./mt\": 147,\n\t\"./mt.js\": 147,\n\t\"./my\": 148,\n\t\"./my.js\": 148,\n\t\"./nb\": 149,\n\t\"./nb.js\": 149,\n\t\"./ne\": 150,\n\t\"./ne.js\": 150,\n\t\"./nl\": 151,\n\t\"./nl-be\": 152,\n\t\"./nl-be.js\": 152,\n\t\"./nl.js\": 151,\n\t\"./nn\": 153,\n\t\"./nn.js\": 153,\n\t\"./pa-in\": 154,\n\t\"./pa-in.js\": 154,\n\t\"./pl\": 155,\n\t\"./pl.js\": 155,\n\t\"./pt\": 156,\n\t\"./pt-br\": 157,\n\t\"./pt-br.js\": 157,\n\t\"./pt.js\": 156,\n\t\"./ro\": 158,\n\t\"./ro.js\": 158,\n\t\"./ru\": 159,\n\t\"./ru.js\": 159,\n\t\"./sd\": 160,\n\t\"./sd.js\": 160,\n\t\"./se\": 161,\n\t\"./se.js\": 161,\n\t\"./si\": 162,\n\t\"./si.js\": 162,\n\t\"./sk\": 163,\n\t\"./sk.js\": 163,\n\t\"./sl\": 164,\n\t\"./sl.js\": 164,\n\t\"./sq\": 165,\n\t\"./sq.js\": 165,\n\t\"./sr\": 166,\n\t\"./sr-cyrl\": 167,\n\t\"./sr-cyrl.js\": 167,\n\t\"./sr.js\": 166,\n\t\"./ss\": 168,\n\t\"./ss.js\": 168,\n\t\"./sv\": 169,\n\t\"./sv.js\": 169,\n\t\"./sw\": 170,\n\t\"./sw.js\": 170,\n\t\"./ta\": 171,\n\t\"./ta.js\": 171,\n\t\"./te\": 172,\n\t\"./te.js\": 172,\n\t\"./tet\": 173,\n\t\"./tet.js\": 173,\n\t\"./tg\": 174,\n\t\"./tg.js\": 174,\n\t\"./th\": 175,\n\t\"./th.js\": 175,\n\t\"./tl-ph\": 176,\n\t\"./tl-ph.js\": 176,\n\t\"./tlh\": 177,\n\t\"./tlh.js\": 177,\n\t\"./tr\": 178,\n\t\"./tr.js\": 178,\n\t\"./tzl\": 179,\n\t\"./tzl.js\": 179,\n\t\"./tzm\": 180,\n\t\"./tzm-latn\": 181,\n\t\"./tzm-latn.js\": 181,\n\t\"./tzm.js\": 180,\n\t\"./ug-cn\": 182,\n\t\"./ug-cn.js\": 182,\n\t\"./uk\": 183,\n\t\"./uk.js\": 183,\n\t\"./ur\": 184,\n\t\"./ur.js\": 184,\n\t\"./uz\": 185,\n\t\"./uz-latn\": 186,\n\t\"./uz-latn.js\": 186,\n\t\"./uz.js\": 185,\n\t\"./vi\": 187,\n\t\"./vi.js\": 187,\n\t\"./x-pseudo\": 188,\n\t\"./x-pseudo.js\": 188,\n\t\"./yo\": 189,\n\t\"./yo.js\": 189,\n\t\"./zh-cn\": 190,\n\t\"./zh-cn.js\": 190,\n\t\"./zh-hk\": 191,\n\t\"./zh-hk.js\": 191,\n\t\"./zh-tw\": 192,\n\t\"./zh-tw.js\": 192\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 294;\n\n/***/ }),\n/* 295 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Which resources do you want to reserve?\")])],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.resourcesCheckboxes),function(checkbox){return _c('div',{key:checkbox.uuid,staticClass:\"resources_row\"},[_c('v-checkbox',{attrs:{\"label\":((checkbox.nodeName) + \" GPU\" + (checkbox.index) + \" \" + (checkbox.name)),\"disabled\":checkbox.disabled},model:{value:(checkbox.checked),callback:function ($$v) {_vm.$set(checkbox, \"checked\", $$v)},expression:\"checkbox.checked\"}})],1)}),0),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}]),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}]),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}]),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}]),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.reservationTitle),callback:function ($$v) {_vm.reservationTitle=$$v},expression:\"reservationTitle\"}}),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.reservationDescription),callback:function ($$v) {_vm.reservationDescription=$$v},expression:\"reservationDescription\"}}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showInfo===true),expression:\"showInfo===true\"}],staticClass:\"text-red\"},[_c('p',{staticClass:\"vertical-5p lead\"},[_vm._v(\"You need to choose at least one resource to reserve\")])]),_vm._v(\" \"),_c('div',{staticClass:\"modal-footer text-right\"},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.reservation()}}},[_vm._v(\"\\n Reserve\\n \")])],1)],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 296 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarInfo_vue__ = __webpack_require__(193);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58652693_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarInfo_vue__ = __webpack_require__(298);\nfunction injectStyle (ssrContext) {\n __webpack_require__(297)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_FullCalendarInfo_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58652693_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_FullCalendarInfo_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 298 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"indigo\",\"text-color\":\"white\"}},[_c('v-avatar',{attrs:{\"left\":\"\"}},[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"account_circle\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.userName))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"teal\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"dns\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.hostname))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"light-green\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"memory\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(\"GPU\"+_vm._s(_vm.reservation.resourceIndex)+\" \"+_vm._s(_vm.reservation.resourceName))])],1),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Title:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.title)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.newTitle),callback:function ($$v) {_vm.newTitle=$$v},expression:\"newTitle\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Description:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.description)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.newDescription),callback:function ($$v) {_vm.newDescription=$$v},expression:\"newDescription\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.gpuUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU memory utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.memUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Start:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.start))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}],null,false,710299969),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}],null,false,4222293411),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"End:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.end))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}],null,false,3230088161),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}],null,false,2362500227),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"GPU UUID:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.resourceId)+\"\\n \")]),_vm._v(\" \"),(_vm.tasksCard)?_c('v-card-text',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"warning\"},model:{value:(_vm.showAlert),callback:function ($$v) {_vm.showAlert=$$v},expression:\"showAlert\"}},[_vm._v(\"Synchronization in progress. Task assign is disabled now.\")])],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}})],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\"\\n \"+_vm._s(header.text)+\"\\n \")],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))])])]}}],null,false,4156683076),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}],null,false,63074868)})],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){return _vm.checkActionFlag()}}},[_vm._v(\"Assign selected\")]):_vm._e(),_vm._v(\" \"),(_vm.actionsAbility)?_c('v-card-text',{staticClass:\"container\"},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"yellow\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.tasksCard=!_vm.tasksCard; _vm.cancelCard=false; _vm.updateCard=false}}},[_vm._v(\"Schedule task(s) for this reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"error\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=!_vm.cancelCard; _vm.tasksCard=false; _vm.updateCard=false}}},[_vm._v(\"Cancel reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=!_vm.updateCard; _vm.tasksCard=false, _vm.cancelCard=false}}},[_vm._v(\"Edit reservation\")])],1):_vm._e(),_vm._v(\" \"),(_vm.cancelCard)?_c('v-card-text',[_vm._v(\"\\n Do you want to cancel selected reservation?\\n \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=false}}},[_vm._v(\"No\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.cancelReservation()}}},[_vm._v(\"Yes\")])],1):_vm._e(),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=false}}},[_vm._v(\"Back\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.updateReservation()}}},[_vm._v(\"Update\")])],1):_vm._e()],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\r\n * FullCalendar v3.9.0\r\n * Docs & License: https://fullcalendar.io/\r\n * (c) 2018 Adam Shaw\r\n */\r\n(function webpackUniversalModuleDefinition(root, factory) {\r\n\tif(true)\r\n\t\tmodule.exports = factory(__webpack_require__(0), __webpack_require__(194));\r\n\telse if(typeof define === 'function' && define.amd)\r\n\t\tdefine([\"moment\", \"jquery\"], factory);\r\n\telse if(typeof exports === 'object')\r\n\t\texports[\"FullCalendar\"] = factory(require(\"moment\"), require(\"jquery\"));\r\n\telse\r\n\t\troot[\"FullCalendar\"] = factory(root[\"moment\"], root[\"jQuery\"]);\r\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3__) {\r\nreturn /******/ (function(modules) { // webpackBootstrap\r\n/******/ \t// The module cache\r\n/******/ \tvar installedModules = {};\r\n/******/\r\n/******/ \t// The require function\r\n/******/ \tfunction __webpack_require__(moduleId) {\r\n/******/\r\n/******/ \t\t// Check if module is in cache\r\n/******/ \t\tif(installedModules[moduleId]) {\r\n/******/ \t\t\treturn installedModules[moduleId].exports;\r\n/******/ \t\t}\r\n/******/ \t\t// Create a new module (and put it into the cache)\r\n/******/ \t\tvar module = installedModules[moduleId] = {\r\n/******/ \t\t\ti: moduleId,\r\n/******/ \t\t\tl: false,\r\n/******/ \t\t\texports: {}\r\n/******/ \t\t};\r\n/******/\r\n/******/ \t\t// Execute the module function\r\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n/******/\r\n/******/ \t\t// Flag the module as loaded\r\n/******/ \t\tmodule.l = true;\r\n/******/\r\n/******/ \t\t// Return the exports of the module\r\n/******/ \t\treturn module.exports;\r\n/******/ \t}\r\n/******/\r\n/******/\r\n/******/ \t// expose the modules object (__webpack_modules__)\r\n/******/ \t__webpack_require__.m = modules;\r\n/******/\r\n/******/ \t// expose the module cache\r\n/******/ \t__webpack_require__.c = installedModules;\r\n/******/\r\n/******/ \t// define getter function for harmony exports\r\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\r\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\r\n/******/ \t\t\tObject.defineProperty(exports, name, {\r\n/******/ \t\t\t\tconfigurable: false,\r\n/******/ \t\t\t\tenumerable: true,\r\n/******/ \t\t\t\tget: getter\r\n/******/ \t\t\t});\r\n/******/ \t\t}\r\n/******/ \t};\r\n/******/\r\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\r\n/******/ \t__webpack_require__.n = function(module) {\r\n/******/ \t\tvar getter = module && module.__esModule ?\r\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\r\n/******/ \t\t\tfunction getModuleExports() { return module; };\r\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\r\n/******/ \t\treturn getter;\r\n/******/ \t};\r\n/******/\r\n/******/ \t// Object.prototype.hasOwnProperty.call\r\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\r\n/******/\r\n/******/ \t// __webpack_public_path__\r\n/******/ \t__webpack_require__.p = \"\";\r\n/******/\r\n/******/ \t// Load entry module and return exports\r\n/******/ \treturn __webpack_require__(__webpack_require__.s = 236);\r\n/******/ })\r\n/************************************************************************/\r\n/******/ ([\r\n/* 0 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\r\n\r\n/***/ }),\r\n/* 1 */,\r\n/* 2 */\r\n/***/ (function(module, exports) {\r\n\r\n/*\r\nderived from:\r\nhttps://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js\r\n\r\nonly include the helpers we need, to keep down filesize\r\n*/\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b)\r\n if (b.hasOwnProperty(p))\r\n d[p] = b[p]; };\r\nexports.__extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 3 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\r\n\r\n/***/ }),\r\n/* 4 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\n/* FullCalendar-specific DOM Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\r\n// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\r\nfunction compensateScroll(rowEls, scrollbarWidths) {\r\n if (scrollbarWidths.left) {\r\n rowEls.css({\r\n 'border-left-width': 1,\r\n 'margin-left': scrollbarWidths.left - 1\r\n });\r\n }\r\n if (scrollbarWidths.right) {\r\n rowEls.css({\r\n 'border-right-width': 1,\r\n 'margin-right': scrollbarWidths.right - 1\r\n });\r\n }\r\n}\r\nexports.compensateScroll = compensateScroll;\r\n// Undoes compensateScroll and restores all borders/margins\r\nfunction uncompensateScroll(rowEls) {\r\n rowEls.css({\r\n 'margin-left': '',\r\n 'margin-right': '',\r\n 'border-left-width': '',\r\n 'border-right-width': ''\r\n });\r\n}\r\nexports.uncompensateScroll = uncompensateScroll;\r\n// Make the mouse cursor express that an event is not allowed in the current area\r\nfunction disableCursor() {\r\n $('body').addClass('fc-not-allowed');\r\n}\r\nexports.disableCursor = disableCursor;\r\n// Returns the mouse cursor to its original look\r\nfunction enableCursor() {\r\n $('body').removeClass('fc-not-allowed');\r\n}\r\nexports.enableCursor = enableCursor;\r\n// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\r\n// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\r\n// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and\r\n// reduces the available height.\r\nfunction distributeHeight(els, availableHeight, shouldRedistribute) {\r\n // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\r\n // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\r\n var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\r\n var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\r\n var flexEls = []; // elements that are allowed to expand. array of DOM nodes\r\n var flexOffsets = []; // amount of vertical space it takes up\r\n var flexHeights = []; // actual css height\r\n var usedHeight = 0;\r\n undistributeHeight(els); // give all elements their natural height\r\n // find elements that are below the recommended height (expandable).\r\n // important to query for heights in a single first pass (to avoid reflow oscillation).\r\n els.each(function (i, el) {\r\n var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = $(el).outerHeight(true);\r\n if (naturalOffset < minOffset) {\r\n flexEls.push(el);\r\n flexOffsets.push(naturalOffset);\r\n flexHeights.push($(el).height());\r\n }\r\n else {\r\n // this element stretches past recommended height (non-expandable). mark the space as occupied.\r\n usedHeight += naturalOffset;\r\n }\r\n });\r\n // readjust the recommended height to only consider the height available to non-maxed-out rows.\r\n if (shouldRedistribute) {\r\n availableHeight -= usedHeight;\r\n minOffset1 = Math.floor(availableHeight / flexEls.length);\r\n minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\r\n }\r\n // assign heights to all expandable elements\r\n $(flexEls).each(function (i, el) {\r\n var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = flexOffsets[i];\r\n var naturalHeight = flexHeights[i];\r\n var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\r\n if (naturalOffset < minOffset) {\r\n $(el).height(newHeight);\r\n }\r\n });\r\n}\r\nexports.distributeHeight = distributeHeight;\r\n// Undoes distrubuteHeight, restoring all els to their natural height\r\nfunction undistributeHeight(els) {\r\n els.height('');\r\n}\r\nexports.undistributeHeight = undistributeHeight;\r\n// Given `els`, a jQuery set of cells, find the cell with the largest natural width and set the widths of all the\r\n// cells to be that width.\r\n// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\r\nfunction matchCellWidths(els) {\r\n var maxInnerWidth = 0;\r\n els.find('> *').each(function (i, innerEl) {\r\n var innerWidth = $(innerEl).outerWidth();\r\n if (innerWidth > maxInnerWidth) {\r\n maxInnerWidth = innerWidth;\r\n }\r\n });\r\n maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\r\n els.width(maxInnerWidth);\r\n return maxInnerWidth;\r\n}\r\nexports.matchCellWidths = matchCellWidths;\r\n// Given one element that resides inside another,\r\n// Subtracts the height of the inner element from the outer element.\r\nfunction subtractInnerElHeight(outerEl, innerEl) {\r\n var both = outerEl.add(innerEl);\r\n var diff;\r\n // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\r\n both.css({\r\n position: 'relative',\r\n left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\r\n });\r\n diff = outerEl.outerHeight() - innerEl.outerHeight(); // grab the dimensions\r\n both.css({ position: '', left: '' }); // undo hack\r\n return diff;\r\n}\r\nexports.subtractInnerElHeight = subtractInnerElHeight;\r\n/* Element Geom Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51\r\nfunction getScrollParent(el) {\r\n var position = el.css('position');\r\n var scrollParent = el.parents().filter(function () {\r\n var parent = $(this);\r\n return (/(auto|scroll)/).test(parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x'));\r\n }).eq(0);\r\n return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;\r\n}\r\nexports.getScrollParent = getScrollParent;\r\n// Queries the outer bounding area of a jQuery element.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getOuterRect(el, origin) {\r\n var offset = el.offset();\r\n var left = offset.left - (origin ? origin.left : 0);\r\n var top = offset.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.outerWidth(),\r\n top: top,\r\n bottom: top + el.outerHeight()\r\n };\r\n}\r\nexports.getOuterRect = getOuterRect;\r\n// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\n// WARNING: given element can't have borders\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getClientRect(el, origin) {\r\n var offset = el.offset();\r\n var scrollbarWidths = getScrollbarWidths(el);\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left - (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el[0].clientWidth,\r\n top: top,\r\n bottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars\r\n };\r\n}\r\nexports.getClientRect = getClientRect;\r\n// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getContentRect(el, origin) {\r\n var offset = el.offset(); // just outside of border, margin not included\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left') -\r\n (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top') -\r\n (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.width(),\r\n top: top,\r\n bottom: top + el.height()\r\n };\r\n}\r\nexports.getContentRect = getContentRect;\r\n// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.\r\n// WARNING: given element can't have borders (which will cause offsetWidth/offsetHeight to be larger).\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getScrollbarWidths(el) {\r\n var leftRightWidth = el[0].offsetWidth - el[0].clientWidth;\r\n var bottomWidth = el[0].offsetHeight - el[0].clientHeight;\r\n var widths;\r\n leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);\r\n bottomWidth = sanitizeScrollbarWidth(bottomWidth);\r\n widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };\r\n if (getIsLeftRtlScrollbars() && el.css('direction') === 'rtl') {\r\n widths.left = leftRightWidth;\r\n }\r\n else {\r\n widths.right = leftRightWidth;\r\n }\r\n return widths;\r\n}\r\nexports.getScrollbarWidths = getScrollbarWidths;\r\n// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to\r\n// retina displays, rounding, and IE11. Massage them into a usable value.\r\nfunction sanitizeScrollbarWidth(width) {\r\n width = Math.max(0, width); // no negatives\r\n width = Math.round(width);\r\n return width;\r\n}\r\n// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\r\nvar _isLeftRtlScrollbars = null;\r\nfunction getIsLeftRtlScrollbars() {\r\n if (_isLeftRtlScrollbars === null) {\r\n _isLeftRtlScrollbars = computeIsLeftRtlScrollbars();\r\n }\r\n return _isLeftRtlScrollbars;\r\n}\r\nfunction computeIsLeftRtlScrollbars() {\r\n var el = $('
')\r\n .css({\r\n position: 'absolute',\r\n top: -1000,\r\n left: 0,\r\n border: 0,\r\n padding: 0,\r\n overflow: 'scroll',\r\n direction: 'rtl'\r\n })\r\n .appendTo('body');\r\n var innerEl = el.children();\r\n var res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?\r\n el.remove();\r\n return res;\r\n}\r\n// Retrieves a jQuery element's computed CSS value as a floating-point number.\r\n// If the queried value is non-numeric (ex: IE can return \"medium\" for border width), will just return zero.\r\nfunction getCssFloat(el, prop) {\r\n return parseFloat(el.css(prop)) || 0;\r\n}\r\n/* Mouse / Touch Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\r\nfunction isPrimaryMouseButton(ev) {\r\n return ev.which === 1 && !ev.ctrlKey;\r\n}\r\nexports.isPrimaryMouseButton = isPrimaryMouseButton;\r\nfunction getEvX(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageX;\r\n }\r\n return ev.pageX;\r\n}\r\nexports.getEvX = getEvX;\r\nfunction getEvY(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageY;\r\n }\r\n return ev.pageY;\r\n}\r\nexports.getEvY = getEvY;\r\nfunction getEvIsTouch(ev) {\r\n return /^touch/.test(ev.type);\r\n}\r\nexports.getEvIsTouch = getEvIsTouch;\r\nfunction preventSelection(el) {\r\n el.addClass('fc-unselectable')\r\n .on('selectstart', preventDefault);\r\n}\r\nexports.preventSelection = preventSelection;\r\nfunction allowSelection(el) {\r\n el.removeClass('fc-unselectable')\r\n .off('selectstart', preventDefault);\r\n}\r\nexports.allowSelection = allowSelection;\r\n// Stops a mouse/touch event from doing it's native browser action\r\nfunction preventDefault(ev) {\r\n ev.preventDefault();\r\n}\r\nexports.preventDefault = preventDefault;\r\n/* General Geometry Utils\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\r\nfunction intersectRects(rect1, rect2) {\r\n var res = {\r\n left: Math.max(rect1.left, rect2.left),\r\n right: Math.min(rect1.right, rect2.right),\r\n top: Math.max(rect1.top, rect2.top),\r\n bottom: Math.min(rect1.bottom, rect2.bottom)\r\n };\r\n if (res.left < res.right && res.top < res.bottom) {\r\n return res;\r\n }\r\n return false;\r\n}\r\nexports.intersectRects = intersectRects;\r\n// Returns a new point that will have been moved to reside within the given rectangle\r\nfunction constrainPoint(point, rect) {\r\n return {\r\n left: Math.min(Math.max(point.left, rect.left), rect.right),\r\n top: Math.min(Math.max(point.top, rect.top), rect.bottom)\r\n };\r\n}\r\nexports.constrainPoint = constrainPoint;\r\n// Returns a point that is the center of the given rectangle\r\nfunction getRectCenter(rect) {\r\n return {\r\n left: (rect.left + rect.right) / 2,\r\n top: (rect.top + rect.bottom) / 2\r\n };\r\n}\r\nexports.getRectCenter = getRectCenter;\r\n// Subtracts point2's coordinates from point1's coordinates, returning a delta\r\nfunction diffPoints(point1, point2) {\r\n return {\r\n left: point1.left - point2.left,\r\n top: point1.top - point2.top\r\n };\r\n}\r\nexports.diffPoints = diffPoints;\r\n/* Object Ordering by Field\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction parseFieldSpecs(input) {\r\n var specs = [];\r\n var tokens = [];\r\n var i;\r\n var token;\r\n if (typeof input === 'string') {\r\n tokens = input.split(/\\s*,\\s*/);\r\n }\r\n else if (typeof input === 'function') {\r\n tokens = [input];\r\n }\r\n else if ($.isArray(input)) {\r\n tokens = input;\r\n }\r\n for (i = 0; i < tokens.length; i++) {\r\n token = tokens[i];\r\n if (typeof token === 'string') {\r\n specs.push(token.charAt(0) === '-' ?\r\n { field: token.substring(1), order: -1 } :\r\n { field: token, order: 1 });\r\n }\r\n else if (typeof token === 'function') {\r\n specs.push({ func: token });\r\n }\r\n }\r\n return specs;\r\n}\r\nexports.parseFieldSpecs = parseFieldSpecs;\r\nfunction compareByFieldSpecs(obj1, obj2, fieldSpecs, obj1fallback, obj2fallback) {\r\n var i;\r\n var cmp;\r\n for (i = 0; i < fieldSpecs.length; i++) {\r\n cmp = compareByFieldSpec(obj1, obj2, fieldSpecs[i], obj1fallback, obj2fallback);\r\n if (cmp) {\r\n return cmp;\r\n }\r\n }\r\n return 0;\r\n}\r\nexports.compareByFieldSpecs = compareByFieldSpecs;\r\nfunction compareByFieldSpec(obj1, obj2, fieldSpec, obj1fallback, obj2fallback) {\r\n if (fieldSpec.func) {\r\n return fieldSpec.func(obj1, obj2);\r\n }\r\n var val1 = obj1[fieldSpec.field];\r\n var val2 = obj2[fieldSpec.field];\r\n if (val1 == null && obj1fallback) {\r\n val1 = obj1fallback[fieldSpec.field];\r\n }\r\n if (val2 == null && obj2fallback) {\r\n val2 = obj2fallback[fieldSpec.field];\r\n }\r\n return flexibleCompare(val1, val2) * (fieldSpec.order || 1);\r\n}\r\nexports.compareByFieldSpec = compareByFieldSpec;\r\nfunction flexibleCompare(a, b) {\r\n if (!a && !b) {\r\n return 0;\r\n }\r\n if (b == null) {\r\n return -1;\r\n }\r\n if (a == null) {\r\n return 1;\r\n }\r\n if ($.type(a) === 'string' || $.type(b) === 'string') {\r\n return String(a).localeCompare(String(b));\r\n }\r\n return a - b;\r\n}\r\nexports.flexibleCompare = flexibleCompare;\r\n/* Date Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nexports.dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\r\nexports.unitsDesc = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; // descending\r\n// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.\r\n// Moments will have their timezones normalized.\r\nfunction diffDayTime(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),\r\n ms: a.time() - b.time() // time-of-day from day start. disregards timezone\r\n });\r\n}\r\nexports.diffDayTime = diffDayTime;\r\n// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.\r\nfunction diffDay(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days')\r\n });\r\n}\r\nexports.diffDay = diffDay;\r\n// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.\r\nfunction diffByUnit(a, b, unit) {\r\n return moment.duration(Math.round(a.diff(b, unit, true)), // returnFloat=true\r\n unit);\r\n}\r\nexports.diffByUnit = diffByUnit;\r\n// Computes the unit name of the largest whole-unit period of time.\r\n// For example, 48 hours will be \"days\" whereas 49 hours will be \"hours\".\r\n// Accepts start/end, a range object, or an original duration object.\r\nfunction computeGreatestUnit(start, end) {\r\n var i;\r\n var unit;\r\n var val;\r\n for (i = 0; i < exports.unitsDesc.length; i++) {\r\n unit = exports.unitsDesc[i];\r\n val = computeRangeAs(unit, start, end);\r\n if (val >= 1 && isInt(val)) {\r\n break;\r\n }\r\n }\r\n return unit; // will be \"milliseconds\" if nothing else matches\r\n}\r\nexports.computeGreatestUnit = computeGreatestUnit;\r\n// like computeGreatestUnit, but has special abilities to interpret the source input for clues\r\nfunction computeDurationGreatestUnit(duration, durationInput) {\r\n var unit = computeGreatestUnit(duration);\r\n // prevent days:7 from being interpreted as a week\r\n if (unit === 'week' && typeof durationInput === 'object' && durationInput.days) {\r\n unit = 'day';\r\n }\r\n return unit;\r\n}\r\nexports.computeDurationGreatestUnit = computeDurationGreatestUnit;\r\n// Computes the number of units (like \"hours\") in the given range.\r\n// Range can be a {start,end} object, separate start/end args, or a Duration.\r\n// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling\r\n// of month-diffing logic (which tends to vary from version to version).\r\nfunction computeRangeAs(unit, start, end) {\r\n if (end != null) {\r\n return end.diff(start, unit, true);\r\n }\r\n else if (moment.isDuration(start)) {\r\n return start.as(unit);\r\n }\r\n else {\r\n return start.end.diff(start.start, unit, true);\r\n }\r\n}\r\n// Intelligently divides a range (specified by a start/end params) by a duration\r\nfunction divideRangeByDuration(start, end, dur) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return (end - start) / dur;\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return end.diff(start, 'months', true) / months;\r\n }\r\n return end.diff(start, 'days', true) / dur.asDays();\r\n}\r\nexports.divideRangeByDuration = divideRangeByDuration;\r\n// Intelligently divides one duration by another\r\nfunction divideDurationByDuration(dur1, dur2) {\r\n var months1;\r\n var months2;\r\n if (durationHasTime(dur1) || durationHasTime(dur2)) {\r\n return dur1 / dur2;\r\n }\r\n months1 = dur1.asMonths();\r\n months2 = dur2.asMonths();\r\n if (Math.abs(months1) >= 1 && isInt(months1) &&\r\n Math.abs(months2) >= 1 && isInt(months2)) {\r\n return months1 / months2;\r\n }\r\n return dur1.asDays() / dur2.asDays();\r\n}\r\nexports.divideDurationByDuration = divideDurationByDuration;\r\n// Intelligently multiplies a duration by a number\r\nfunction multiplyDuration(dur, n) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return moment.duration(dur * n);\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return moment.duration({ months: months * n });\r\n }\r\n return moment.duration({ days: dur.asDays() * n });\r\n}\r\nexports.multiplyDuration = multiplyDuration;\r\n// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)\r\nfunction durationHasTime(dur) {\r\n return Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());\r\n}\r\nexports.durationHasTime = durationHasTime;\r\nfunction isNativeDate(input) {\r\n return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;\r\n}\r\nexports.isNativeDate = isNativeDate;\r\n// Returns a boolean about whether the given input is a time string, like \"06:40:00\" or \"06:00\"\r\nfunction isTimeString(str) {\r\n return typeof str === 'string' &&\r\n /^\\d+\\:\\d+(?:\\:\\d+\\.?(?:\\d{3})?)?$/.test(str);\r\n}\r\nexports.isTimeString = isTimeString;\r\n/* Logging and Debug\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction log() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.log) {\r\n return console.log.apply(console, args);\r\n }\r\n}\r\nexports.log = log;\r\nfunction warn() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.warn) {\r\n return console.warn.apply(console, args);\r\n }\r\n else {\r\n return log.apply(null, args);\r\n }\r\n}\r\nexports.warn = warn;\r\n/* General Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar hasOwnPropMethod = {}.hasOwnProperty;\r\n// Merges an array of objects into a single object.\r\n// The second argument allows for an array of property names who's object values will be merged together.\r\nfunction mergeProps(propObjs, complexProps) {\r\n var dest = {};\r\n var i;\r\n var name;\r\n var complexObjs;\r\n var j;\r\n var val;\r\n var props;\r\n if (complexProps) {\r\n for (i = 0; i < complexProps.length; i++) {\r\n name = complexProps[i];\r\n complexObjs = [];\r\n // collect the trailing object values, stopping when a non-object is discovered\r\n for (j = propObjs.length - 1; j >= 0; j--) {\r\n val = propObjs[j][name];\r\n if (typeof val === 'object') {\r\n complexObjs.unshift(val);\r\n }\r\n else if (val !== undefined) {\r\n dest[name] = val; // if there were no objects, this value will be used\r\n break;\r\n }\r\n }\r\n // if the trailing values were objects, use the merged value\r\n if (complexObjs.length) {\r\n dest[name] = mergeProps(complexObjs);\r\n }\r\n }\r\n }\r\n // copy values into the destination, going from last to first\r\n for (i = propObjs.length - 1; i >= 0; i--) {\r\n props = propObjs[i];\r\n for (name in props) {\r\n if (!(name in dest)) {\r\n dest[name] = props[name];\r\n }\r\n }\r\n }\r\n return dest;\r\n}\r\nexports.mergeProps = mergeProps;\r\nfunction copyOwnProps(src, dest) {\r\n for (var name_1 in src) {\r\n if (hasOwnProp(src, name_1)) {\r\n dest[name_1] = src[name_1];\r\n }\r\n }\r\n}\r\nexports.copyOwnProps = copyOwnProps;\r\nfunction hasOwnProp(obj, name) {\r\n return hasOwnPropMethod.call(obj, name);\r\n}\r\nexports.hasOwnProp = hasOwnProp;\r\nfunction applyAll(functions, thisObj, args) {\r\n if ($.isFunction(functions)) {\r\n functions = [functions];\r\n }\r\n if (functions) {\r\n var i = void 0;\r\n var ret = void 0;\r\n for (i = 0; i < functions.length; i++) {\r\n ret = functions[i].apply(thisObj, args) || ret;\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.applyAll = applyAll;\r\nfunction removeMatching(array, testFunc) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (testFunc(array[i])) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeMatching = removeMatching;\r\nfunction removeExact(array, exactVal) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (array[i] === exactVal) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeExact = removeExact;\r\nfunction isArraysEqual(a0, a1) {\r\n var len = a0.length;\r\n var i;\r\n if (len == null || len !== a1.length) {\r\n return false;\r\n }\r\n for (i = 0; i < len; i++) {\r\n if (a0[i] !== a1[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nexports.isArraysEqual = isArraysEqual;\r\nfunction firstDefined() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n for (var i = 0; i < args.length; i++) {\r\n if (args[i] !== undefined) {\r\n return args[i];\r\n }\r\n }\r\n}\r\nexports.firstDefined = firstDefined;\r\nfunction htmlEscape(s) {\r\n return (s + '').replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/'/g, ''')\r\n .replace(/\"/g, '"')\r\n .replace(/\\n/g, '
');\r\n}\r\nexports.htmlEscape = htmlEscape;\r\nfunction stripHtmlEntities(text) {\r\n return text.replace(/&.*?;/g, '');\r\n}\r\nexports.stripHtmlEntities = stripHtmlEntities;\r\n// Given a hash of CSS properties, returns a string of CSS.\r\n// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\r\nfunction cssToStr(cssProps) {\r\n var statements = [];\r\n $.each(cssProps, function (name, val) {\r\n if (val != null) {\r\n statements.push(name + ':' + val);\r\n }\r\n });\r\n return statements.join(';');\r\n}\r\nexports.cssToStr = cssToStr;\r\n// Given an object hash of HTML attribute names to values,\r\n// generates a string that can be injected between < > in HTML\r\nfunction attrsToStr(attrs) {\r\n var parts = [];\r\n $.each(attrs, function (name, val) {\r\n if (val != null) {\r\n parts.push(name + '=\"' + htmlEscape(val) + '\"');\r\n }\r\n });\r\n return parts.join(' ');\r\n}\r\nexports.attrsToStr = attrsToStr;\r\nfunction capitaliseFirstLetter(str) {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\nexports.capitaliseFirstLetter = capitaliseFirstLetter;\r\nfunction compareNumbers(a, b) {\r\n return a - b;\r\n}\r\nexports.compareNumbers = compareNumbers;\r\nfunction isInt(n) {\r\n return n % 1 === 0;\r\n}\r\nexports.isInt = isInt;\r\n// Returns a method bound to the given object context.\r\n// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with\r\n// different contexts as identical when binding/unbinding events.\r\nfunction proxy(obj, methodName) {\r\n var method = obj[methodName];\r\n return function () {\r\n return method.apply(obj, arguments);\r\n };\r\n}\r\nexports.proxy = proxy;\r\n// Returns a function, that, as long as it continues to be invoked, will not\r\n// be triggered. The function will be called after it stops being called for\r\n// N milliseconds. If `immediate` is passed, trigger the function on the\r\n// leading edge, instead of the trailing.\r\n// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\r\nfunction debounce(func, wait, immediate) {\r\n if (immediate === void 0) { immediate = false; }\r\n var timeout;\r\n var args;\r\n var context;\r\n var timestamp;\r\n var result;\r\n var later = function () {\r\n var last = +new Date() - timestamp;\r\n if (last < wait) {\r\n timeout = setTimeout(later, wait - last);\r\n }\r\n else {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n }\r\n };\r\n return function () {\r\n context = this;\r\n args = arguments;\r\n timestamp = +new Date();\r\n var callNow = immediate && !timeout;\r\n if (!timeout) {\r\n timeout = setTimeout(later, wait);\r\n }\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n return result;\r\n };\r\n}\r\nexports.debounce = debounce;\r\n\r\n\r\n/***/ }),\r\n/* 5 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange = /** @class */ (function () {\r\n function UnzonedRange(startInput, endInput) {\r\n // TODO: move these into footprint.\r\n // Especially, doesn't make sense for null startMs/endMs.\r\n this.isStart = true;\r\n this.isEnd = true;\r\n if (moment.isMoment(startInput)) {\r\n startInput = startInput.clone().stripZone();\r\n }\r\n if (moment.isMoment(endInput)) {\r\n endInput = endInput.clone().stripZone();\r\n }\r\n if (startInput) {\r\n this.startMs = startInput.valueOf();\r\n }\r\n if (endInput) {\r\n this.endMs = endInput.valueOf();\r\n }\r\n }\r\n /*\r\n SIDEEFFECT: will mutate eventRanges.\r\n Will return a new array result.\r\n Only works for non-open-ended ranges.\r\n */\r\n UnzonedRange.invertRanges = function (ranges, constraintRange) {\r\n var invertedRanges = [];\r\n var startMs = constraintRange.startMs; // the end of the previous range. the start of the new range\r\n var i;\r\n var dateRange;\r\n // ranges need to be in order. required for our date-walking algorithm\r\n ranges.sort(compareUnzonedRanges);\r\n for (i = 0; i < ranges.length; i++) {\r\n dateRange = ranges[i];\r\n // add the span of time before the event (if there is any)\r\n if (dateRange.startMs > startMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, dateRange.startMs));\r\n }\r\n if (dateRange.endMs > startMs) {\r\n startMs = dateRange.endMs;\r\n }\r\n }\r\n // add the span of time after the last event (if there is any)\r\n if (startMs < constraintRange.endMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, constraintRange.endMs));\r\n }\r\n return invertedRanges;\r\n };\r\n UnzonedRange.prototype.intersect = function (otherRange) {\r\n var startMs = this.startMs;\r\n var endMs = this.endMs;\r\n var newRange = null;\r\n if (otherRange.startMs != null) {\r\n if (startMs == null) {\r\n startMs = otherRange.startMs;\r\n }\r\n else {\r\n startMs = Math.max(startMs, otherRange.startMs);\r\n }\r\n }\r\n if (otherRange.endMs != null) {\r\n if (endMs == null) {\r\n endMs = otherRange.endMs;\r\n }\r\n else {\r\n endMs = Math.min(endMs, otherRange.endMs);\r\n }\r\n }\r\n if (startMs == null || endMs == null || startMs < endMs) {\r\n newRange = new UnzonedRange(startMs, endMs);\r\n newRange.isStart = this.isStart && startMs === this.startMs;\r\n newRange.isEnd = this.isEnd && endMs === this.endMs;\r\n }\r\n return newRange;\r\n };\r\n UnzonedRange.prototype.intersectsWith = function (otherRange) {\r\n return (this.endMs == null || otherRange.startMs == null || this.endMs > otherRange.startMs) &&\r\n (this.startMs == null || otherRange.endMs == null || this.startMs < otherRange.endMs);\r\n };\r\n UnzonedRange.prototype.containsRange = function (innerRange) {\r\n return (this.startMs == null || (innerRange.startMs != null && innerRange.startMs >= this.startMs)) &&\r\n (this.endMs == null || (innerRange.endMs != null && innerRange.endMs <= this.endMs));\r\n };\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n UnzonedRange.prototype.containsDate = function (date) {\r\n var ms = date.valueOf();\r\n return (this.startMs == null || ms >= this.startMs) &&\r\n (this.endMs == null || ms < this.endMs);\r\n };\r\n // If the given date is not within the given range, move it inside.\r\n // (If it's past the end, make it one millisecond before the end).\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n // Returns a MS-time.\r\n UnzonedRange.prototype.constrainDate = function (date) {\r\n var ms = date.valueOf();\r\n if (this.startMs != null && ms < this.startMs) {\r\n ms = this.startMs;\r\n }\r\n if (this.endMs != null && ms >= this.endMs) {\r\n ms = this.endMs - 1;\r\n }\r\n return ms;\r\n };\r\n UnzonedRange.prototype.equals = function (otherRange) {\r\n return this.startMs === otherRange.startMs && this.endMs === otherRange.endMs;\r\n };\r\n UnzonedRange.prototype.clone = function () {\r\n var range = new UnzonedRange(this.startMs, this.endMs);\r\n range.isStart = this.isStart;\r\n range.isEnd = this.isEnd;\r\n return range;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getStart = function () {\r\n if (this.startMs != null) {\r\n return moment_ext_1.default.utc(this.startMs).stripZone();\r\n }\r\n return null;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getEnd = function () {\r\n if (this.endMs != null) {\r\n return moment_ext_1.default.utc(this.endMs).stripZone();\r\n }\r\n return null;\r\n };\r\n UnzonedRange.prototype.as = function (unit) {\r\n return moment.utc(this.endMs).diff(moment.utc(this.startMs), unit, true);\r\n };\r\n return UnzonedRange;\r\n}());\r\nexports.default = UnzonedRange;\r\n/*\r\nOnly works for non-open-ended ranges.\r\n*/\r\nfunction compareUnzonedRanges(range1, range2) {\r\n return range1.startMs - range2.startMs; // earlier ranges go first\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 6 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventSource, _super);\r\n // can we do away with calendar? at least for the abstract?\r\n // useful for buildEventDef\r\n function EventSource(calendar) {\r\n var _this = _super.call(this) || this;\r\n _this.calendar = calendar;\r\n _this.className = [];\r\n _this.uid = String(EventSource.uuid++);\r\n return _this;\r\n }\r\n /*\r\n rawInput can be any data type!\r\n */\r\n EventSource.parse = function (rawInput, calendar) {\r\n var source = new this(calendar);\r\n if (typeof rawInput === 'object') {\r\n if (source.applyProps(rawInput)) {\r\n return source;\r\n }\r\n }\r\n return false;\r\n };\r\n EventSource.normalizeId = function (id) {\r\n if (id) {\r\n return String(id);\r\n }\r\n return null;\r\n };\r\n EventSource.prototype.fetch = function (start, end, timezone) {\r\n // subclasses must implement. must return a promise.\r\n };\r\n EventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n // optional for subclasses to implement\r\n };\r\n EventSource.prototype.removeAllEventDefs = function () {\r\n // optional for subclasses to implement\r\n };\r\n /*\r\n For compairing/matching\r\n */\r\n EventSource.prototype.getPrimitive = function (otherSource) {\r\n // subclasses must implement\r\n };\r\n EventSource.prototype.parseEventDefs = function (rawEventDefs) {\r\n var i;\r\n var eventDef;\r\n var eventDefs = [];\r\n for (i = 0; i < rawEventDefs.length; i++) {\r\n eventDef = this.parseEventDef(rawEventDefs[i]);\r\n if (eventDef) {\r\n eventDefs.push(eventDef);\r\n }\r\n }\r\n return eventDefs;\r\n };\r\n EventSource.prototype.parseEventDef = function (rawInput) {\r\n var calendarTransform = this.calendar.opt('eventDataTransform');\r\n var sourceTransform = this.eventDataTransform;\r\n if (calendarTransform) {\r\n rawInput = calendarTransform(rawInput, this.calendar);\r\n }\r\n if (sourceTransform) {\r\n rawInput = sourceTransform(rawInput, this.calendar);\r\n }\r\n return EventDefParser_1.default.parse(rawInput, this);\r\n };\r\n EventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventSource.normalizeId(rawProps.id);\r\n }\r\n // TODO: converge with EventDef\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n else if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventSource.uuid = 0;\r\n EventSource.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventSource.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventSource;\r\n}(Class_1.default));\r\nexports.default = EventSource;\r\nParsableModelMixin_1.default.mixInto(EventSource);\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nEventSource.defineStandardProps({\r\n // manually process...\r\n id: false,\r\n className: false,\r\n // automatically transfer...\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n rendering: true,\r\n overlap: true,\r\n constraint: true,\r\n allDayDefault: true,\r\n eventDataTransform: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 7 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUtility methods for easily listening to events on another object,\r\nand more importantly, easily unlistening from them.\r\n\r\nUSAGE:\r\n import { default as ListenerMixin, ListenerInterface } from './ListenerMixin'\r\nin class:\r\n listenTo: ListenerInterface['listenTo']\r\n stopListeningTo: ListenerInterface['stopListeningTo']\r\nafter class:\r\n ListenerMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar guid = 0;\r\nvar ListenerMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListenerMixin, _super);\r\n function ListenerMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Given an `other` object that has on/off methods, bind the given `callback` to an event by the given name.\r\n The `callback` will be called with the `this` context of the object that .listenTo is being called on.\r\n Can be called:\r\n .listenTo(other, eventName, callback)\r\n OR\r\n .listenTo(other, {\r\n eventName1: callback1,\r\n eventName2: callback2\r\n })\r\n */\r\n ListenerMixin.prototype.listenTo = function (other, arg, callback) {\r\n if (typeof arg === 'object') {\r\n for (var eventName in arg) {\r\n if (arg.hasOwnProperty(eventName)) {\r\n this.listenTo(other, eventName, arg[eventName]);\r\n }\r\n }\r\n }\r\n else if (typeof arg === 'string') {\r\n other.on(arg + '.' + this.getListenerNamespace(), // use event namespacing to identify this object\r\n $.proxy(callback, this) // always use `this` context\r\n // the usually-undesired jQuery guid behavior doesn't matter,\r\n // because we always unbind via namespace\r\n );\r\n }\r\n };\r\n /*\r\n Causes the current object to stop listening to events on the `other` object.\r\n `eventName` is optional. If omitted, will stop listening to ALL events on `other`.\r\n */\r\n ListenerMixin.prototype.stopListeningTo = function (other, eventName) {\r\n other.off((eventName || '') + '.' + this.getListenerNamespace());\r\n };\r\n /*\r\n Returns a string, unique to this object, to be used for event namespacing\r\n */\r\n ListenerMixin.prototype.getListenerNamespace = function () {\r\n if (this.listenerId == null) {\r\n this.listenerId = guid++;\r\n }\r\n return '_listener' + this.listenerId;\r\n };\r\n return ListenerMixin;\r\n}(Mixin_1.default));\r\nexports.default = ListenerMixin;\r\n\r\n\r\n/***/ }),\r\n/* 8 */,\r\n/* 9 */,\r\n/* 10 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ambigDateOfMonthRegex = /^\\s*\\d{4}-\\d\\d$/;\r\nvar ambigTimeOrZoneRegex = /^\\s*\\d{4}-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?)?$/;\r\nvar newMomentProto = moment.fn; // where we will attach our new methods\r\nexports.newMomentProto = newMomentProto;\r\nvar oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods\r\nexports.oldMomentProto = oldMomentProto;\r\n// tell momentjs to transfer these properties upon clone\r\nvar momentProperties = moment.momentProperties;\r\nmomentProperties.push('_fullCalendar');\r\nmomentProperties.push('_ambigTime');\r\nmomentProperties.push('_ambigZone');\r\n/*\r\nCall this if you want Moment's original format method to be used\r\n*/\r\nfunction oldMomentFormat(mom, formatStr) {\r\n return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js\r\n}\r\nexports.oldMomentFormat = oldMomentFormat;\r\n// Creating\r\n// -------------------------------------------------------------------------------------------------\r\n// Creates a new moment, similar to the vanilla moment(...) constructor, but with\r\n// extra features (ambiguous time, enhanced formatting). When given an existing moment,\r\n// it will function as a clone (and retain the zone of the moment). Anything else will\r\n// result in a moment in the local zone.\r\nvar momentExt = function () {\r\n return makeMoment(arguments);\r\n};\r\nexports.default = momentExt;\r\n// Sames as momentExt, but forces the resulting moment to be in the UTC timezone.\r\nmomentExt.utc = function () {\r\n var mom = makeMoment(arguments, true);\r\n // Force it into UTC because makeMoment doesn't guarantee it\r\n // (if given a pre-existing moment for example)\r\n if (mom.hasTime()) {\r\n mom.utc();\r\n }\r\n return mom;\r\n};\r\n// Same as momentExt, but when given an ISO8601 string, the timezone offset is preserved.\r\n// ISO8601 strings with no timezone offset will become ambiguously zoned.\r\nmomentExt.parseZone = function () {\r\n return makeMoment(arguments, true, true);\r\n};\r\n// Builds an enhanced moment from args. When given an existing moment, it clones. When given a\r\n// native Date, or called with no arguments (the current time), the resulting moment will be local.\r\n// Anything else needs to be \"parsed\" (a string or an array), and will be affected by:\r\n// parseAsUTC - if there is no zone information, should we parse the input in UTC?\r\n// parseZone - if there is zone information, should we force the zone of the moment?\r\nfunction makeMoment(args, parseAsUTC, parseZone) {\r\n if (parseAsUTC === void 0) { parseAsUTC = false; }\r\n if (parseZone === void 0) { parseZone = false; }\r\n var input = args[0];\r\n var isSingleString = args.length === 1 && typeof input === 'string';\r\n var isAmbigTime;\r\n var isAmbigZone;\r\n var ambigMatch;\r\n var mom;\r\n if (moment.isMoment(input) || util_1.isNativeDate(input) || input === undefined) {\r\n mom = moment.apply(null, args);\r\n }\r\n else {\r\n isAmbigTime = false;\r\n isAmbigZone = false;\r\n if (isSingleString) {\r\n if (ambigDateOfMonthRegex.test(input)) {\r\n // accept strings like '2014-05', but convert to the first of the month\r\n input += '-01';\r\n args = [input]; // for when we pass it on to moment's constructor\r\n isAmbigTime = true;\r\n isAmbigZone = true;\r\n }\r\n else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {\r\n isAmbigTime = !ambigMatch[5]; // no time part?\r\n isAmbigZone = true;\r\n }\r\n }\r\n else if ($.isArray(input)) {\r\n // arrays have no timezone information, so assume ambiguous zone\r\n isAmbigZone = true;\r\n }\r\n // otherwise, probably a string with a format\r\n if (parseAsUTC || isAmbigTime) {\r\n mom = moment.utc.apply(moment, args);\r\n }\r\n else {\r\n mom = moment.apply(null, args);\r\n }\r\n if (isAmbigTime) {\r\n mom._ambigTime = true;\r\n mom._ambigZone = true; // ambiguous time always means ambiguous zone\r\n }\r\n else if (parseZone) {\r\n if (isAmbigZone) {\r\n mom._ambigZone = true;\r\n }\r\n else if (isSingleString) {\r\n mom.utcOffset(input); // if not a valid zone, will assign UTC\r\n }\r\n }\r\n }\r\n mom._fullCalendar = true; // flag for extended functionality\r\n return mom;\r\n}\r\n// Week Number\r\n// -------------------------------------------------------------------------------------------------\r\n// Returns the week number, considering the locale's custom week number calcuation\r\n// `weeks` is an alias for `week`\r\nnewMomentProto.week = newMomentProto.weeks = function (input) {\r\n var weekCalc = this._locale._fullCalendar_weekCalc;\r\n if (input == null && typeof weekCalc === 'function') {\r\n return weekCalc(this);\r\n }\r\n else if (weekCalc === 'ISO') {\r\n return oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter\r\n }\r\n return oldMomentProto.week.apply(this, arguments); // local getter/setter\r\n};\r\n// Time-of-day\r\n// -------------------------------------------------------------------------------------------------\r\n// GETTER\r\n// Returns a Duration with the hours/minutes/seconds/ms values of the moment.\r\n// If the moment has an ambiguous time, a duration of 00:00 will be returned.\r\n//\r\n// SETTER\r\n// You can supply a Duration, a Moment, or a Duration-like argument.\r\n// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.\r\nnewMomentProto.time = function (time) {\r\n // Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.\r\n // `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.\r\n if (!this._fullCalendar) {\r\n return oldMomentProto.time.apply(this, arguments);\r\n }\r\n if (time == null) {\r\n return moment.duration({\r\n hours: this.hours(),\r\n minutes: this.minutes(),\r\n seconds: this.seconds(),\r\n milliseconds: this.milliseconds()\r\n });\r\n }\r\n else {\r\n this._ambigTime = false; // mark that the moment now has a time\r\n if (!moment.isDuration(time) && !moment.isMoment(time)) {\r\n time = moment.duration(time);\r\n }\r\n // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).\r\n // Only for Duration times, not Moment times.\r\n var dayHours = 0;\r\n if (moment.isDuration(time)) {\r\n dayHours = Math.floor(time.asDays()) * 24;\r\n }\r\n // We need to set the individual fields.\r\n // Can't use startOf('day') then add duration. In case of DST at start of day.\r\n return this.hours(dayHours + time.hours())\r\n .minutes(time.minutes())\r\n .seconds(time.seconds())\r\n .milliseconds(time.milliseconds());\r\n }\r\n};\r\n// Converts the moment to UTC, stripping out its time-of-day and timezone offset,\r\n// but preserving its YMD. A moment with a stripped time will display no time\r\n// nor timezone offset when .format() is called.\r\nnewMomentProto.stripTime = function () {\r\n if (!this._ambigTime) {\r\n this.utc(true); // keepLocalTime=true (for keeping *date* value)\r\n // set time to zero\r\n this.set({\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n ms: 0\r\n });\r\n // Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears all ambig flags.\r\n this._ambigTime = true;\r\n this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns if the moment has a non-ambiguous time (boolean)\r\nnewMomentProto.hasTime = function () {\r\n return !this._ambigTime;\r\n};\r\n// Timezone\r\n// -------------------------------------------------------------------------------------------------\r\n// Converts the moment to UTC, stripping out its timezone offset, but preserving its\r\n// YMD and time-of-day. A moment with a stripped timezone offset will display no\r\n// timezone offset when .format() is called.\r\nnewMomentProto.stripZone = function () {\r\n var wasAmbigTime;\r\n if (!this._ambigZone) {\r\n wasAmbigTime = this._ambigTime;\r\n this.utc(true); // keepLocalTime=true (for keeping date and time values)\r\n // the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore\r\n this._ambigTime = wasAmbigTime || false;\r\n // Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears the ambig flags.\r\n this._ambigZone = true;\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns of the moment has a non-ambiguous timezone offset (boolean)\r\nnewMomentProto.hasZone = function () {\r\n return !this._ambigZone;\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.local = function (keepLocalTime) {\r\n // for when converting from ambiguously-zoned to local,\r\n // keep the time values when converting from UTC -> local\r\n oldMomentProto.local.call(this, this._ambigZone || keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this; // for chaining\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.utc = function (keepLocalTime) {\r\n oldMomentProto.utc.call(this, keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this;\r\n};\r\n// implicitly marks a zone (will probably get called upon .utc() and .local())\r\nnewMomentProto.utcOffset = function (tzo) {\r\n if (tzo != null) {\r\n // these assignments needs to happen before the original zone method is called.\r\n // I forget why, something to do with a browser crash.\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n }\r\n return oldMomentProto.utcOffset.apply(this, arguments);\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 11 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'\r\nin class:\r\n on: EmitterInterface['on']\r\n one: EmitterInterface['one']\r\n off: EmitterInterface['off']\r\n trigger: EmitterInterface['trigger']\r\n triggerWith: EmitterInterface['triggerWith']\r\n hasHandlers: EmitterInterface['hasHandlers']\r\nafter class:\r\n EmitterMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar EmitterMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(EmitterMixin, _super);\r\n function EmitterMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // jQuery-ification via $(this) allows a non-DOM object to have\r\n // the same event handling capabilities (including namespaces).\r\n EmitterMixin.prototype.on = function (types, handler) {\r\n $(this).on(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.one = function (types, handler) {\r\n $(this).one(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype._prepareIntercept = function (handler) {\r\n // handlers are always called with an \"event\" object as their first param.\r\n // sneak the `this` context and arguments into the extra parameter object\r\n // and forward them on to the original handler.\r\n var intercept = function (ev, extra) {\r\n return handler.apply(extra.context || this, extra.args || []);\r\n };\r\n // mimick jQuery's internal \"proxy\" system (risky, I know)\r\n // causing all functions with the same .guid to appear to be the same.\r\n // https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448\r\n // this is needed for calling .off with the original non-intercept handler.\r\n if (!handler.guid) {\r\n handler.guid = $.guid++;\r\n }\r\n intercept.guid = handler.guid;\r\n return intercept;\r\n };\r\n EmitterMixin.prototype.off = function (types, handler) {\r\n $(this).off(types, handler);\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.trigger = function (types) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // pass in \"extra\" info to the intercept\r\n $(this).triggerHandler(types, { args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.triggerWith = function (types, context, args) {\r\n // `triggerHandler` is less reliant on the DOM compared to `trigger`.\r\n // pass in \"extra\" info to the intercept.\r\n $(this).triggerHandler(types, { context: context, args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.hasHandlers = function (type) {\r\n var hash = $._data(this, 'events'); // http://blog.jquery.com/2012/08/09/jquery-1-8-released/\r\n return hash && hash[type] && hash[type].length > 0;\r\n };\r\n return EmitterMixin;\r\n}(Mixin_1.default));\r\nexports.default = EmitterMixin;\r\n\r\n\r\n/***/ }),\r\n/* 12 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar ComponentFootprint = /** @class */ (function () {\r\n function ComponentFootprint(unzonedRange, isAllDay) {\r\n this.isAllDay = false; // component can choose to ignore this\r\n this.unzonedRange = unzonedRange;\r\n this.isAllDay = isAllDay;\r\n }\r\n /*\r\n Only works for non-open-ended ranges.\r\n */\r\n ComponentFootprint.prototype.toLegacy = function (calendar) {\r\n return {\r\n start: calendar.msToMoment(this.unzonedRange.startMs, this.isAllDay),\r\n end: calendar.msToMoment(this.unzonedRange.endMs, this.isAllDay)\r\n };\r\n };\r\n return ComponentFootprint;\r\n}());\r\nexports.default = ComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 13 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar SingleEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(SingleEventDef, _super);\r\n function SingleEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Will receive start/end params, but will be ignored.\r\n */\r\n SingleEventDef.prototype.buildInstances = function () {\r\n return [this.buildInstance()];\r\n };\r\n SingleEventDef.prototype.buildInstance = function () {\r\n return new EventInstance_1.default(this, // definition\r\n this.dateProfile);\r\n };\r\n SingleEventDef.prototype.isAllDay = function () {\r\n return this.dateProfile.isAllDay();\r\n };\r\n SingleEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n def.dateProfile = this.dateProfile;\r\n return def;\r\n };\r\n SingleEventDef.prototype.rezone = function () {\r\n var calendar = this.source.calendar;\r\n var dateProfile = this.dateProfile;\r\n this.dateProfile = new EventDateProfile_1.default(calendar.moment(dateProfile.start), dateProfile.end ? calendar.moment(dateProfile.end) : null, calendar);\r\n };\r\n /*\r\n NOTE: if super-method fails, should still attempt to apply\r\n */\r\n SingleEventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n var dateProfile = EventDateProfile_1.default.parse(rawProps, this.source); // returns null on failure\r\n if (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n // make sure `date` shows up in the legacy event objects as-is\r\n if (rawProps.date != null) {\r\n this.miscProps.date = rawProps.date;\r\n }\r\n return superSuccess;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n return SingleEventDef;\r\n}(EventDef_1.default));\r\nexports.default = SingleEventDef;\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nSingleEventDef.defineStandardProps({\r\n start: false,\r\n date: false,\r\n end: false,\r\n allDay: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 14 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Mixin = /** @class */ (function () {\r\n function Mixin() {\r\n }\r\n Mixin.mixInto = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n if (!destClass.prototype[name]) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n }\r\n });\r\n };\r\n /*\r\n will override existing methods\r\n TODO: remove! not used anymore\r\n */\r\n Mixin.mixOver = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n });\r\n };\r\n return Mixin;\r\n}());\r\nexports.default = Mixin;\r\n\r\n\r\n/***/ }),\r\n/* 15 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Interaction = /** @class */ (function () {\r\n function Interaction(component) {\r\n this.view = component._getView();\r\n this.component = component;\r\n }\r\n Interaction.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n Interaction.prototype.end = function () {\r\n // subclasses can implement\r\n };\r\n return Interaction;\r\n}());\r\nexports.default = Interaction;\r\n\r\n\r\n/***/ }),\r\n/* 16 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.version = '3.9.0';\r\n// When introducing internal API incompatibilities (where fullcalendar plugins would break),\r\n// the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)\r\n// and the below integer should be incremented.\r\nexports.internalApiVersion = 12;\r\nvar util_1 = __webpack_require__(4);\r\nexports.applyAll = util_1.applyAll;\r\nexports.debounce = util_1.debounce;\r\nexports.isInt = util_1.isInt;\r\nexports.htmlEscape = util_1.htmlEscape;\r\nexports.cssToStr = util_1.cssToStr;\r\nexports.proxy = util_1.proxy;\r\nexports.capitaliseFirstLetter = util_1.capitaliseFirstLetter;\r\nexports.getOuterRect = util_1.getOuterRect;\r\nexports.getClientRect = util_1.getClientRect;\r\nexports.getContentRect = util_1.getContentRect;\r\nexports.getScrollbarWidths = util_1.getScrollbarWidths;\r\nexports.preventDefault = util_1.preventDefault;\r\nexports.parseFieldSpecs = util_1.parseFieldSpecs;\r\nexports.compareByFieldSpecs = util_1.compareByFieldSpecs;\r\nexports.compareByFieldSpec = util_1.compareByFieldSpec;\r\nexports.flexibleCompare = util_1.flexibleCompare;\r\nexports.computeGreatestUnit = util_1.computeGreatestUnit;\r\nexports.divideRangeByDuration = util_1.divideRangeByDuration;\r\nexports.divideDurationByDuration = util_1.divideDurationByDuration;\r\nexports.multiplyDuration = util_1.multiplyDuration;\r\nexports.durationHasTime = util_1.durationHasTime;\r\nexports.log = util_1.log;\r\nexports.warn = util_1.warn;\r\nexports.removeExact = util_1.removeExact;\r\nexports.intersectRects = util_1.intersectRects;\r\nvar date_formatting_1 = __webpack_require__(47);\r\nexports.formatDate = date_formatting_1.formatDate;\r\nexports.formatRange = date_formatting_1.formatRange;\r\nexports.queryMostGranularFormatUnit = date_formatting_1.queryMostGranularFormatUnit;\r\nvar locale_1 = __webpack_require__(31);\r\nexports.datepickerLocale = locale_1.datepickerLocale;\r\nexports.locale = locale_1.locale;\r\nvar moment_ext_1 = __webpack_require__(10);\r\nexports.moment = moment_ext_1.default;\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nexports.EmitterMixin = EmitterMixin_1.default;\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexports.ListenerMixin = ListenerMixin_1.default;\r\nvar Model_1 = __webpack_require__(48);\r\nexports.Model = Model_1.default;\r\nvar Constraints_1 = __webpack_require__(207);\r\nexports.Constraints = Constraints_1.default;\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nexports.UnzonedRange = UnzonedRange_1.default;\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nexports.ComponentFootprint = ComponentFootprint_1.default;\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nexports.BusinessHourGenerator = BusinessHourGenerator_1.default;\r\nvar EventDef_1 = __webpack_require__(34);\r\nexports.EventDef = EventDef_1.default;\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nexports.EventDefMutation = EventDefMutation_1.default;\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nexports.EventSourceParser = EventSourceParser_1.default;\r\nvar EventSource_1 = __webpack_require__(6);\r\nexports.EventSource = EventSource_1.default;\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nexports.defineThemeSystem = ThemeRegistry_1.defineThemeSystem;\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nexports.EventInstanceGroup = EventInstanceGroup_1.default;\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nexports.ArrayEventSource = ArrayEventSource_1.default;\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nexports.FuncEventSource = FuncEventSource_1.default;\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nexports.JsonFeedEventSource = JsonFeedEventSource_1.default;\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nexports.EventFootprint = EventFootprint_1.default;\r\nvar Class_1 = __webpack_require__(33);\r\nexports.Class = Class_1.default;\r\nvar Mixin_1 = __webpack_require__(14);\r\nexports.Mixin = Mixin_1.default;\r\nvar CoordCache_1 = __webpack_require__(53);\r\nexports.CoordCache = CoordCache_1.default;\r\nvar DragListener_1 = __webpack_require__(54);\r\nexports.DragListener = DragListener_1.default;\r\nvar Promise_1 = __webpack_require__(20);\r\nexports.Promise = Promise_1.default;\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nexports.TaskQueue = TaskQueue_1.default;\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nexports.RenderQueue = RenderQueue_1.default;\r\nvar Scroller_1 = __webpack_require__(39);\r\nexports.Scroller = Scroller_1.default;\r\nvar Theme_1 = __webpack_require__(19);\r\nexports.Theme = Theme_1.default;\r\nvar DateComponent_1 = __webpack_require__(219);\r\nexports.DateComponent = DateComponent_1.default;\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nexports.InteractiveDateComponent = InteractiveDateComponent_1.default;\r\nvar Calendar_1 = __webpack_require__(220);\r\nexports.Calendar = Calendar_1.default;\r\nvar View_1 = __webpack_require__(41);\r\nexports.View = View_1.default;\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nexports.defineView = ViewRegistry_1.defineView;\r\nexports.getViewConfig = ViewRegistry_1.getViewConfig;\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nexports.DayTableMixin = DayTableMixin_1.default;\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nexports.BusinessHourRenderer = BusinessHourRenderer_1.default;\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nexports.EventRenderer = EventRenderer_1.default;\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nexports.FillRenderer = FillRenderer_1.default;\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nexports.HelperRenderer = HelperRenderer_1.default;\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nexports.ExternalDropping = ExternalDropping_1.default;\r\nvar EventResizing_1 = __webpack_require__(223);\r\nexports.EventResizing = EventResizing_1.default;\r\nvar EventPointing_1 = __webpack_require__(59);\r\nexports.EventPointing = EventPointing_1.default;\r\nvar EventDragging_1 = __webpack_require__(224);\r\nexports.EventDragging = EventDragging_1.default;\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nexports.DateSelecting = DateSelecting_1.default;\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nexports.StandardInteractionsMixin = StandardInteractionsMixin_1.default;\r\nvar AgendaView_1 = __webpack_require__(226);\r\nexports.AgendaView = AgendaView_1.default;\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nexports.TimeGrid = TimeGrid_1.default;\r\nvar DayGrid_1 = __webpack_require__(61);\r\nexports.DayGrid = DayGrid_1.default;\r\nvar BasicView_1 = __webpack_require__(62);\r\nexports.BasicView = BasicView_1.default;\r\nvar MonthView_1 = __webpack_require__(229);\r\nexports.MonthView = MonthView_1.default;\r\nvar ListView_1 = __webpack_require__(230);\r\nexports.ListView = ListView_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 17 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar EventDateProfile = /** @class */ (function () {\r\n function EventDateProfile(start, end, calendar) {\r\n this.start = start;\r\n this.end = end || null;\r\n this.unzonedRange = this.buildUnzonedRange(calendar);\r\n }\r\n /*\r\n Needs an EventSource object\r\n */\r\n EventDateProfile.parse = function (rawProps, source) {\r\n var startInput = rawProps.start || rawProps.date;\r\n var endInput = rawProps.end;\r\n if (!startInput) {\r\n return false;\r\n }\r\n var calendar = source.calendar;\r\n var start = calendar.moment(startInput);\r\n var end = endInput ? calendar.moment(endInput) : null;\r\n var forcedAllDay = rawProps.allDay;\r\n var forceEventDuration = calendar.opt('forceEventDuration');\r\n if (!start.isValid()) {\r\n return false;\r\n }\r\n if (end && (!end.isValid() || !end.isAfter(start))) {\r\n end = null;\r\n }\r\n if (forcedAllDay == null) {\r\n forcedAllDay = source.allDayDefault;\r\n if (forcedAllDay == null) {\r\n forcedAllDay = calendar.opt('allDayDefault');\r\n }\r\n }\r\n if (forcedAllDay === true) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else if (forcedAllDay === false) {\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n if (!end && forceEventDuration) {\r\n end = calendar.getDefaultEventEnd(!start.hasTime(), start);\r\n }\r\n return new EventDateProfile(start, end, calendar);\r\n };\r\n EventDateProfile.isStandardProp = function (propName) {\r\n return propName === 'start' || propName === 'date' || propName === 'end' || propName === 'allDay';\r\n };\r\n EventDateProfile.prototype.isAllDay = function () {\r\n return !(this.start.hasTime() || (this.end && this.end.hasTime()));\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.buildUnzonedRange = function (calendar) {\r\n var startMs = this.start.clone().stripZone().valueOf();\r\n var endMs = this.getEnd(calendar).stripZone().valueOf();\r\n return new UnzonedRange_1.default(startMs, endMs);\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.getEnd = function (calendar) {\r\n return this.end ?\r\n this.end.clone() :\r\n // derive the end from the start and allDay. compute allDay if necessary\r\n calendar.getDefaultEventEnd(this.isAllDay(), this.start);\r\n };\r\n return EventDateProfile;\r\n}());\r\nexports.default = EventDateProfile;\r\n\r\n\r\n/***/ }),\r\n/* 18 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventRange_1 = __webpack_require__(211);\r\n/*\r\nIt's expected that there will be at least one EventInstance,\r\nOR that an explicitEventDef is assigned.\r\n*/\r\nvar EventInstanceGroup = /** @class */ (function () {\r\n function EventInstanceGroup(eventInstances) {\r\n this.eventInstances = eventInstances || [];\r\n }\r\n EventInstanceGroup.prototype.getAllEventRanges = function (constraintRange) {\r\n if (constraintRange) {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.eventInstances.map(util_1.eventInstanceToEventRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceRenderRanges = function (constraintRange) {\r\n if (this.isInverse()) {\r\n return this.sliceInverseRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceNormalRenderRanges = function (constraintRange) {\r\n var eventInstances = this.eventInstances;\r\n var i;\r\n var eventInstance;\r\n var slicedRange;\r\n var slicedEventRanges = [];\r\n for (i = 0; i < eventInstances.length; i++) {\r\n eventInstance = eventInstances[i];\r\n slicedRange = eventInstance.dateProfile.unzonedRange.intersect(constraintRange);\r\n if (slicedRange) {\r\n slicedEventRanges.push(new EventRange_1.default(slicedRange, eventInstance.def, eventInstance));\r\n }\r\n }\r\n return slicedEventRanges;\r\n };\r\n EventInstanceGroup.prototype.sliceInverseRenderRanges = function (constraintRange) {\r\n var unzonedRanges = this.eventInstances.map(util_1.eventInstanceToUnzonedRange);\r\n var ownerDef = this.getEventDef();\r\n unzonedRanges = UnzonedRange_1.default.invertRanges(unzonedRanges, constraintRange);\r\n return unzonedRanges.map(function (unzonedRange) {\r\n return new EventRange_1.default(unzonedRange, ownerDef); // don't give an EventInstance\r\n });\r\n };\r\n EventInstanceGroup.prototype.isInverse = function () {\r\n return this.getEventDef().hasInverseRendering();\r\n };\r\n EventInstanceGroup.prototype.getEventDef = function () {\r\n return this.explicitEventDef || this.eventInstances[0].def;\r\n };\r\n return EventInstanceGroup;\r\n}());\r\nexports.default = EventInstanceGroup;\r\n\r\n\r\n/***/ }),\r\n/* 19 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar Theme = /** @class */ (function () {\r\n function Theme(optionsManager) {\r\n this.optionsManager = optionsManager;\r\n this.processIconOverride();\r\n }\r\n Theme.prototype.processIconOverride = function () {\r\n if (this.iconOverrideOption) {\r\n this.setIconOverride(this.optionsManager.get(this.iconOverrideOption));\r\n }\r\n };\r\n Theme.prototype.setIconOverride = function (iconOverrideHash) {\r\n var iconClassesCopy;\r\n var buttonName;\r\n if ($.isPlainObject(iconOverrideHash)) {\r\n iconClassesCopy = $.extend({}, this.iconClasses);\r\n for (buttonName in iconOverrideHash) {\r\n iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);\r\n }\r\n this.iconClasses = iconClassesCopy;\r\n }\r\n else if (iconOverrideHash === false) {\r\n this.iconClasses = {};\r\n }\r\n };\r\n Theme.prototype.applyIconOverridePrefix = function (className) {\r\n var prefix = this.iconOverridePrefix;\r\n if (prefix && className.indexOf(prefix) !== 0) {\r\n className = prefix + className;\r\n }\r\n return className;\r\n };\r\n Theme.prototype.getClass = function (key) {\r\n return this.classes[key] || '';\r\n };\r\n Theme.prototype.getIconClass = function (buttonName) {\r\n var className = this.iconClasses[buttonName];\r\n if (className) {\r\n return this.baseIconClass + ' ' + className;\r\n }\r\n return '';\r\n };\r\n Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {\r\n var className;\r\n if (this.iconOverrideCustomButtonOption) {\r\n className = customButtonProps[this.iconOverrideCustomButtonOption];\r\n if (className) {\r\n return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);\r\n }\r\n }\r\n return '';\r\n };\r\n return Theme;\r\n}());\r\nexports.default = Theme;\r\nTheme.prototype.classes = {};\r\nTheme.prototype.iconClasses = {};\r\nTheme.prototype.baseIconClass = '';\r\nTheme.prototype.iconOverridePrefix = '';\r\n\r\n\r\n/***/ }),\r\n/* 20 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar PromiseStub = {\r\n construct: function (executor) {\r\n var deferred = $.Deferred();\r\n var promise = deferred.promise();\r\n if (typeof executor === 'function') {\r\n executor(function (val) {\r\n deferred.resolve(val);\r\n attachImmediatelyResolvingThen(promise, val);\r\n }, function () {\r\n deferred.reject();\r\n attachImmediatelyRejectingThen(promise);\r\n });\r\n }\r\n return promise;\r\n },\r\n resolve: function (val) {\r\n var deferred = $.Deferred().resolve(val);\r\n var promise = deferred.promise();\r\n attachImmediatelyResolvingThen(promise, val);\r\n return promise;\r\n },\r\n reject: function () {\r\n var deferred = $.Deferred().reject();\r\n var promise = deferred.promise();\r\n attachImmediatelyRejectingThen(promise);\r\n return promise;\r\n }\r\n};\r\nexports.default = PromiseStub;\r\nfunction attachImmediatelyResolvingThen(promise, val) {\r\n promise.then = function (onResolve) {\r\n if (typeof onResolve === 'function') {\r\n return PromiseStub.resolve(onResolve(val));\r\n }\r\n return promise;\r\n };\r\n}\r\nfunction attachImmediatelyRejectingThen(promise) {\r\n promise.then = function (onResolve, onReject) {\r\n if (typeof onReject === 'function') {\r\n onReject();\r\n }\r\n return promise;\r\n };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 21 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexportHooks.touchMouseIgnoreWait = 500;\r\nvar globalEmitter = null;\r\nvar neededCount = 0;\r\n/*\r\nListens to document and window-level user-interaction events, like touch events and mouse events,\r\nand fires these events as-is to whoever is observing a GlobalEmitter.\r\nBest when used as a singleton via GlobalEmitter.get()\r\n\r\nNormalizes mouse/touch events. For examples:\r\n- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click\r\n- compensates for various buggy scenarios where a touchend does not fire\r\n*/\r\nvar GlobalEmitter = /** @class */ (function () {\r\n function GlobalEmitter() {\r\n this.isTouching = false;\r\n this.mouseIgnoreDepth = 0;\r\n }\r\n // gets the singleton\r\n GlobalEmitter.get = function () {\r\n if (!globalEmitter) {\r\n globalEmitter = new GlobalEmitter();\r\n globalEmitter.bind();\r\n }\r\n return globalEmitter;\r\n };\r\n // called when an object knows it will need a GlobalEmitter in the near future.\r\n GlobalEmitter.needed = function () {\r\n GlobalEmitter.get(); // ensures globalEmitter\r\n neededCount++;\r\n };\r\n // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.\r\n GlobalEmitter.unneeded = function () {\r\n neededCount--;\r\n if (!neededCount) {\r\n globalEmitter.unbind();\r\n globalEmitter = null;\r\n }\r\n };\r\n GlobalEmitter.prototype.bind = function () {\r\n var _this = this;\r\n this.listenTo($(document), {\r\n touchstart: this.handleTouchStart,\r\n touchcancel: this.handleTouchCancel,\r\n touchend: this.handleTouchEnd,\r\n mousedown: this.handleMouseDown,\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.handleMouseUp,\r\n click: this.handleClick,\r\n selectstart: this.handleSelectStart,\r\n contextmenu: this.handleContextMenu\r\n });\r\n // because we need to call preventDefault\r\n // because https://www.chromestatus.com/features/5093566007214080\r\n // TODO: investigate performance because this is a global handler\r\n window.addEventListener('touchmove', this.handleTouchMoveProxy = function (ev) {\r\n _this.handleTouchMove($.Event(ev));\r\n }, { passive: false } // allows preventDefault()\r\n );\r\n // attach a handler to get called when ANY scroll action happens on the page.\r\n // this was impossible to do with normal on/off because 'scroll' doesn't bubble.\r\n // http://stackoverflow.com/a/32954565/96342\r\n window.addEventListener('scroll', this.handleScrollProxy = function (ev) {\r\n _this.handleScroll($.Event(ev));\r\n }, true // useCapture\r\n );\r\n };\r\n GlobalEmitter.prototype.unbind = function () {\r\n this.stopListeningTo($(document));\r\n window.removeEventListener('touchmove', this.handleTouchMoveProxy);\r\n window.removeEventListener('scroll', this.handleScrollProxy, true // useCapture\r\n );\r\n };\r\n // Touch Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleTouchStart = function (ev) {\r\n // if a previous touch interaction never ended with a touchend, then implicitly end it,\r\n // but since a new touch interaction is about to begin, don't start the mouse ignore period.\r\n this.stopTouch(ev, true); // skipMouseIgnore=true\r\n this.isTouching = true;\r\n this.trigger('touchstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleTouchMove = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchmove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchCancel = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchcancel', ev);\r\n // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.\r\n // If touchend fires later, it won't have any effect b/c isTouching will be false.\r\n this.stopTouch(ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchEnd = function (ev) {\r\n this.stopTouch(ev);\r\n };\r\n // Mouse Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleMouseDown = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousedown', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseMove = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousemove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseUp = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mouseup', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleClick = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('click', ev);\r\n }\r\n };\r\n // Misc Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleSelectStart = function (ev) {\r\n this.trigger('selectstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleContextMenu = function (ev) {\r\n this.trigger('contextmenu', ev);\r\n };\r\n GlobalEmitter.prototype.handleScroll = function (ev) {\r\n this.trigger('scroll', ev);\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.stopTouch = function (ev, skipMouseIgnore) {\r\n if (skipMouseIgnore === void 0) { skipMouseIgnore = false; }\r\n if (this.isTouching) {\r\n this.isTouching = false;\r\n this.trigger('touchend', ev);\r\n if (!skipMouseIgnore) {\r\n this.startTouchMouseIgnore();\r\n }\r\n }\r\n };\r\n GlobalEmitter.prototype.startTouchMouseIgnore = function () {\r\n var _this = this;\r\n var wait = exportHooks.touchMouseIgnoreWait;\r\n if (wait) {\r\n this.mouseIgnoreDepth++;\r\n setTimeout(function () {\r\n _this.mouseIgnoreDepth--;\r\n }, wait);\r\n }\r\n };\r\n GlobalEmitter.prototype.shouldIgnoreMouse = function () {\r\n return this.isTouching || Boolean(this.mouseIgnoreDepth);\r\n };\r\n return GlobalEmitter;\r\n}());\r\nexports.default = GlobalEmitter;\r\nListenerMixin_1.default.mixInto(GlobalEmitter);\r\nEmitterMixin_1.default.mixInto(GlobalEmitter);\r\n\r\n\r\n/***/ }),\r\n/* 22 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar exportHooks = __webpack_require__(16);\r\nexports.viewHash = {};\r\nexportHooks.views = exports.viewHash;\r\nfunction defineView(viewName, viewConfig) {\r\n exports.viewHash[viewName] = viewConfig;\r\n}\r\nexports.defineView = defineView;\r\nfunction getViewConfig(viewName) {\r\n return exports.viewHash[viewName];\r\n}\r\nexports.getViewConfig = getViewConfig;\r\n\r\n\r\n/***/ }),\r\n/* 23 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar DragListener_1 = __webpack_require__(54);\r\n/* Tracks mouse movements over a component and raises events about which hit the mouse is over.\r\n------------------------------------------------------------------------------------------------------------------------\r\noptions:\r\n- subjectEl\r\n- subjectCenter\r\n*/\r\nvar HitDragListener = /** @class */ (function (_super) {\r\n tslib_1.__extends(HitDragListener, _super);\r\n function HitDragListener(component, options) {\r\n var _this = _super.call(this, options) || this;\r\n _this.component = component;\r\n return _this;\r\n }\r\n // Called when drag listening starts (but a real drag has not necessarily began).\r\n // ev might be undefined if dragging was started manually.\r\n HitDragListener.prototype.handleInteractionStart = function (ev) {\r\n var subjectEl = this.subjectEl;\r\n var subjectRect;\r\n var origPoint;\r\n var point;\r\n this.component.hitsNeeded();\r\n this.computeScrollBounds(); // for autoscroll\r\n if (ev) {\r\n origPoint = { left: util_1.getEvX(ev), top: util_1.getEvY(ev) };\r\n point = origPoint;\r\n // constrain the point to bounds of the element being dragged\r\n if (subjectEl) {\r\n subjectRect = util_1.getOuterRect(subjectEl); // used for centering as well\r\n point = util_1.constrainPoint(point, subjectRect);\r\n }\r\n this.origHit = this.queryHit(point.left, point.top);\r\n // treat the center of the subject as the collision point?\r\n if (subjectEl && this.options.subjectCenter) {\r\n // only consider the area the subject overlaps the hit. best for large subjects.\r\n // TODO: skip this if hit didn't supply left/right/top/bottom\r\n if (this.origHit) {\r\n subjectRect = util_1.intersectRects(this.origHit, subjectRect) ||\r\n subjectRect; // in case there is no intersection\r\n }\r\n point = util_1.getRectCenter(subjectRect);\r\n }\r\n this.coordAdjust = util_1.diffPoints(point, origPoint); // point - origPoint\r\n }\r\n else {\r\n this.origHit = null;\r\n this.coordAdjust = null;\r\n }\r\n // call the super-method. do it after origHit has been computed\r\n _super.prototype.handleInteractionStart.call(this, ev);\r\n };\r\n // Called when the actual drag has started\r\n HitDragListener.prototype.handleDragStart = function (ev) {\r\n var hit;\r\n _super.prototype.handleDragStart.call(this, ev);\r\n // might be different from this.origHit if the min-distance is large\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n // report the initial hit the mouse is over\r\n // especially important if no min-distance and drag starts immediately\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n };\r\n // Called when the drag moves\r\n HitDragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n var hit;\r\n _super.prototype.handleDrag.call(this, dx, dy, ev);\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n if (!isHitsEqual(hit, this.hit)) {\r\n if (this.hit) {\r\n this.handleHitOut();\r\n }\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n }\r\n };\r\n // Called when dragging has been stopped\r\n HitDragListener.prototype.handleDragEnd = function (ev) {\r\n this.handleHitDone();\r\n _super.prototype.handleDragEnd.call(this, ev);\r\n };\r\n // Called when a the mouse has just moved over a new hit\r\n HitDragListener.prototype.handleHitOver = function (hit) {\r\n var isOrig = isHitsEqual(hit, this.origHit);\r\n this.hit = hit;\r\n this.trigger('hitOver', this.hit, isOrig, this.origHit);\r\n };\r\n // Called when the mouse has just moved out of a hit\r\n HitDragListener.prototype.handleHitOut = function () {\r\n if (this.hit) {\r\n this.trigger('hitOut', this.hit);\r\n this.handleHitDone();\r\n this.hit = null;\r\n }\r\n };\r\n // Called after a hitOut. Also called before a dragStop\r\n HitDragListener.prototype.handleHitDone = function () {\r\n if (this.hit) {\r\n this.trigger('hitDone', this.hit);\r\n }\r\n };\r\n // Called when the interaction ends, whether there was a real drag or not\r\n HitDragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n _super.prototype.handleInteractionEnd.call(this, ev, isCancelled);\r\n this.origHit = null;\r\n this.hit = null;\r\n this.component.hitsNotNeeded();\r\n };\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n HitDragListener.prototype.handleScrollEnd = function () {\r\n _super.prototype.handleScrollEnd.call(this);\r\n // hits' absolute positions will be in new places after a user's scroll.\r\n // HACK for recomputing.\r\n if (this.isDragging) {\r\n this.component.releaseHits();\r\n this.component.prepareHits();\r\n }\r\n };\r\n // Gets the hit underneath the coordinates for the given mouse event\r\n HitDragListener.prototype.queryHit = function (left, top) {\r\n if (this.coordAdjust) {\r\n left += this.coordAdjust.left;\r\n top += this.coordAdjust.top;\r\n }\r\n return this.component.queryHit(left, top);\r\n };\r\n return HitDragListener;\r\n}(DragListener_1.default));\r\nexports.default = HitDragListener;\r\n// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component.\r\n// Two null values will be considered equal, as two \"out of the component\" states are the same.\r\nfunction isHitsEqual(hit0, hit1) {\r\n if (!hit0 && !hit1) {\r\n return true;\r\n }\r\n if (hit0 && hit1) {\r\n return hit0.component === hit1.component &&\r\n isHitPropsWithin(hit0, hit1) &&\r\n isHitPropsWithin(hit1, hit0); // ensures all props are identical\r\n }\r\n return false;\r\n}\r\n// Returns true if all of subHit's non-standard properties are within superHit\r\nfunction isHitPropsWithin(subHit, superHit) {\r\n for (var propName in subHit) {\r\n if (!/^(component|left|right|top|bottom)$/.test(propName)) {\r\n if (subHit[propName] !== superHit[propName]) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 24 */,\r\n/* 25 */,\r\n/* 26 */,\r\n/* 27 */,\r\n/* 28 */,\r\n/* 29 */,\r\n/* 30 */,\r\n/* 31 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar options_1 = __webpack_require__(32);\r\nvar util_1 = __webpack_require__(4);\r\nexports.localeOptionHash = {};\r\nexportHooks.locales = exports.localeOptionHash;\r\n// NOTE: can't guarantee any of these computations will run because not every locale has datepicker\r\n// configs, so make sure there are English fallbacks for these in the defaults file.\r\nvar dpComputableOptions = {\r\n buttonText: function (dpOptions) {\r\n return {\r\n // the translations sometimes wrongly contain HTML entities\r\n prev: util_1.stripHtmlEntities(dpOptions.prevText),\r\n next: util_1.stripHtmlEntities(dpOptions.nextText),\r\n today: util_1.stripHtmlEntities(dpOptions.currentText)\r\n };\r\n },\r\n // Produces format strings like \"MMMM YYYY\" -> \"September 2014\"\r\n monthYearFormat: function (dpOptions) {\r\n return dpOptions.showMonthAfterYear ?\r\n 'YYYY[' + dpOptions.yearSuffix + '] MMMM' :\r\n 'MMMM YYYY[' + dpOptions.yearSuffix + ']';\r\n }\r\n};\r\nvar momComputableOptions = {\r\n // Produces format strings like \"ddd M/D\" -> \"Fri 9/15\"\r\n dayOfMonthFormat: function (momOptions, fcOptions) {\r\n var format = momOptions.longDateFormat('l'); // for the format like \"M/D/YYYY\"\r\n // strip the year off the edge, as well as other misc non-whitespace chars\r\n format = format.replace(/^Y+[^\\w\\s]*|[^\\w\\s]*Y+$/g, '');\r\n if (fcOptions.isRTL) {\r\n format += ' ddd'; // for RTL, add day-of-week to end\r\n }\r\n else {\r\n format = 'ddd ' + format; // for LTR, add day-of-week to beginning\r\n }\r\n return format;\r\n },\r\n // Produces format strings like \"h:mma\" -> \"6:00pm\"\r\n mediumTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)a\" -> \"6pm\" / \"6:30pm\"\r\n smallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)t\" -> \"6p\" / \"6:30p\"\r\n extraSmallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"ha\" / \"H\" -> \"6pm\" / \"18\"\r\n hourFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '')\r\n .replace(/(\\Wmm)$/, '') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h:mm\" -> \"6:30\" (with no AM/PM)\r\n noMeridiemTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, ''); // remove trailing AM/PM\r\n }\r\n};\r\n// options that should be computed off live calendar options (considers override options)\r\n// TODO: best place for this? related to locale?\r\n// TODO: flipping text based on isRTL is a bad idea because the CSS `direction` might want to handle it\r\nvar instanceComputableOptions = {\r\n // Produces format strings for results like \"Mo 16\"\r\n smallDayDateFormat: function (options) {\r\n return options.isRTL ?\r\n 'D dd' :\r\n 'dd D';\r\n },\r\n // Produces format strings for results like \"Wk 5\"\r\n weekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[ ' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ' ]w';\r\n },\r\n // Produces format strings for results like \"Wk5\"\r\n smallWeekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ']w';\r\n }\r\n};\r\n// TODO: make these computable properties in optionsManager\r\nfunction populateInstanceComputableOptions(options) {\r\n $.each(instanceComputableOptions, function (name, func) {\r\n if (options[name] == null) {\r\n options[name] = func(options);\r\n }\r\n });\r\n}\r\nexports.populateInstanceComputableOptions = populateInstanceComputableOptions;\r\n// Initialize jQuery UI datepicker translations while using some of the translations\r\n// Will set this as the default locales for datepicker.\r\nfunction datepickerLocale(localeCode, dpLocaleCode, dpOptions) {\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n var fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // transfer some simple options from datepicker to fc\r\n fcOptions.isRTL = dpOptions.isRTL;\r\n fcOptions.weekNumberTitle = dpOptions.weekHeader;\r\n // compute some more complex options from datepicker\r\n $.each(dpComputableOptions, function (name, func) {\r\n fcOptions[name] = func(dpOptions);\r\n });\r\n var jqDatePicker = $.datepicker;\r\n // is jQuery UI Datepicker is on the page?\r\n if (jqDatePicker) {\r\n // Register the locale data.\r\n // FullCalendar and MomentJS use locale codes like \"pt-br\" but Datepicker\r\n // does it like \"pt-BR\" or if it doesn't have the locale, maybe just \"pt\".\r\n // Make an alias so the locale can be referenced either way.\r\n jqDatePicker.regional[dpLocaleCode] =\r\n jqDatePicker.regional[localeCode] = // alias\r\n dpOptions;\r\n // Alias 'en' to the default locale data. Do this every time.\r\n jqDatePicker.regional.en = jqDatePicker.regional[''];\r\n // Set as Datepicker's global defaults.\r\n jqDatePicker.setDefaults(dpOptions);\r\n }\r\n}\r\nexports.datepickerLocale = datepickerLocale;\r\n// Sets FullCalendar-specific translations. Will set the locales as the global default.\r\nfunction locale(localeCode, newFcOptions) {\r\n var fcOptions;\r\n var momOptions;\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // provided new options for this locales? merge them in\r\n if (newFcOptions) {\r\n fcOptions = exports.localeOptionHash[localeCode] = options_1.mergeOptions([fcOptions, newFcOptions]);\r\n }\r\n // compute locale options that weren't defined.\r\n // always do this. newFcOptions can be undefined when initializing from i18n file,\r\n // so no way to tell if this is an initialization or a default-setting.\r\n momOptions = getMomentLocaleData(localeCode); // will fall back to en\r\n $.each(momComputableOptions, function (name, func) {\r\n if (fcOptions[name] == null) {\r\n fcOptions[name] = (func)(momOptions, fcOptions);\r\n }\r\n });\r\n // set it as the default locale for FullCalendar\r\n options_1.globalDefaults.locale = localeCode;\r\n}\r\nexports.locale = locale;\r\n// Returns moment's internal locale data. If doesn't exist, returns English.\r\nfunction getMomentLocaleData(localeCode) {\r\n return moment.localeData(localeCode) || moment.localeData('en');\r\n}\r\nexports.getMomentLocaleData = getMomentLocaleData;\r\n// Initialize English by forcing computation of moment-derived options.\r\n// Also, sets it as the default.\r\nlocale('en', options_1.englishDefaults);\r\n\r\n\r\n/***/ }),\r\n/* 32 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nexports.globalDefaults = {\r\n titleRangeSeparator: ' \\u2013 ',\r\n monthYearFormat: 'MMMM YYYY',\r\n defaultTimedEventDuration: '02:00:00',\r\n defaultAllDayEventDuration: { days: 1 },\r\n forceEventDuration: false,\r\n nextDayThreshold: '09:00:00',\r\n // display\r\n columnHeader: true,\r\n defaultView: 'month',\r\n aspectRatio: 1.35,\r\n header: {\r\n left: 'title',\r\n center: '',\r\n right: 'today prev,next'\r\n },\r\n weekends: true,\r\n weekNumbers: false,\r\n weekNumberTitle: 'W',\r\n weekNumberCalculation: 'local',\r\n // editable: false,\r\n // nowIndicator: false,\r\n scrollTime: '06:00:00',\r\n minTime: '00:00:00',\r\n maxTime: '24:00:00',\r\n showNonCurrentDates: true,\r\n // event ajax\r\n lazyFetching: true,\r\n startParam: 'start',\r\n endParam: 'end',\r\n timezoneParam: 'timezone',\r\n timezone: false,\r\n // allDayDefault: undefined,\r\n // locale\r\n locale: null,\r\n isRTL: false,\r\n buttonText: {\r\n prev: 'prev',\r\n next: 'next',\r\n prevYear: 'prev year',\r\n nextYear: 'next year',\r\n year: 'year',\r\n today: 'today',\r\n month: 'month',\r\n week: 'week',\r\n day: 'day'\r\n },\r\n // buttonIcons: null,\r\n allDayText: 'all-day',\r\n // allows setting a min-height to the event segment to prevent short events overlapping each other\r\n agendaEventMinHeight: 0,\r\n // jquery-ui theming\r\n theme: false,\r\n // themeButtonIcons: null,\r\n // eventResizableFromStart: false,\r\n dragOpacity: .75,\r\n dragRevertDuration: 500,\r\n dragScroll: true,\r\n // selectable: false,\r\n unselectAuto: true,\r\n // selectMinDistance: 0,\r\n dropAccept: '*',\r\n eventOrder: 'title',\r\n // eventRenderWait: null,\r\n eventLimit: false,\r\n eventLimitText: 'more',\r\n eventLimitClick: 'popover',\r\n dayPopoverFormat: 'LL',\r\n handleWindowResize: true,\r\n windowResizeDelay: 100,\r\n longPressDelay: 1000\r\n};\r\nexports.englishDefaults = {\r\n dayPopoverFormat: 'dddd, MMMM D'\r\n};\r\nexports.rtlDefaults = {\r\n header: {\r\n left: 'next,prev today',\r\n center: '',\r\n right: 'title'\r\n },\r\n buttonIcons: {\r\n prev: 'right-single-arrow',\r\n next: 'left-single-arrow',\r\n prevYear: 'right-double-arrow',\r\n nextYear: 'left-double-arrow'\r\n },\r\n themeButtonIcons: {\r\n prev: 'circle-triangle-e',\r\n next: 'circle-triangle-w',\r\n nextYear: 'seek-prev',\r\n prevYear: 'seek-next'\r\n }\r\n};\r\nvar complexOptions = [\r\n 'header',\r\n 'footer',\r\n 'buttonText',\r\n 'buttonIcons',\r\n 'themeButtonIcons'\r\n];\r\n// Merges an array of option objects into a single object\r\nfunction mergeOptions(optionObjs) {\r\n return util_1.mergeProps(optionObjs, complexOptions);\r\n}\r\nexports.mergeOptions = mergeOptions;\r\n\r\n\r\n/***/ }),\r\n/* 33 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\n// Class that all other classes will inherit from\r\nvar Class = /** @class */ (function () {\r\n function Class() {\r\n }\r\n // Called on a class to create a subclass.\r\n // LIMITATION: cannot provide a constructor!\r\n Class.extend = function (members) {\r\n var SubClass = /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return SubClass;\r\n }(this));\r\n util_1.copyOwnProps(members, SubClass.prototype);\r\n return SubClass;\r\n };\r\n // Adds new member variables/methods to the class's prototype.\r\n // Can be called with another class, or a plain object hash containing new members.\r\n Class.mixin = function (members) {\r\n util_1.copyOwnProps(members, this.prototype);\r\n };\r\n return Class;\r\n}());\r\nexports.default = Class;\r\n\r\n\r\n/***/ }),\r\n/* 34 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar EventDef = /** @class */ (function () {\r\n function EventDef(source) {\r\n this.source = source;\r\n this.className = [];\r\n this.miscProps = {};\r\n }\r\n EventDef.parse = function (rawInput, source) {\r\n var def = new this(source);\r\n if (def.applyProps(rawInput)) {\r\n return def;\r\n }\r\n return false;\r\n };\r\n EventDef.normalizeId = function (id) {\r\n return String(id);\r\n };\r\n EventDef.generateId = function () {\r\n return '_fc' + (EventDef.uuid++);\r\n };\r\n EventDef.prototype.clone = function () {\r\n var copy = new this.constructor(this.source);\r\n copy.id = this.id;\r\n copy.rawId = this.rawId;\r\n copy.uid = this.uid; // not really unique anymore :(\r\n EventDef.copyVerbatimStandardProps(this, copy);\r\n copy.className = this.className.slice(); // copy\r\n copy.miscProps = $.extend({}, this.miscProps);\r\n return copy;\r\n };\r\n EventDef.prototype.hasInverseRendering = function () {\r\n return this.getRendering() === 'inverse-background';\r\n };\r\n EventDef.prototype.hasBgRendering = function () {\r\n var rendering = this.getRendering();\r\n return rendering === 'inverse-background' || rendering === 'background';\r\n };\r\n EventDef.prototype.getRendering = function () {\r\n if (this.rendering != null) {\r\n return this.rendering;\r\n }\r\n return this.source.rendering;\r\n };\r\n EventDef.prototype.getConstraint = function () {\r\n if (this.constraint != null) {\r\n return this.constraint;\r\n }\r\n if (this.source.constraint != null) {\r\n return this.source.constraint;\r\n }\r\n return this.source.calendar.opt('eventConstraint'); // what about View option?\r\n };\r\n EventDef.prototype.getOverlap = function () {\r\n if (this.overlap != null) {\r\n return this.overlap;\r\n }\r\n if (this.source.overlap != null) {\r\n return this.source.overlap;\r\n }\r\n return this.source.calendar.opt('eventOverlap'); // what about View option?\r\n };\r\n EventDef.prototype.isStartExplicitlyEditable = function () {\r\n if (this.startEditable != null) {\r\n return this.startEditable;\r\n }\r\n return this.source.startEditable;\r\n };\r\n EventDef.prototype.isDurationExplicitlyEditable = function () {\r\n if (this.durationEditable != null) {\r\n return this.durationEditable;\r\n }\r\n return this.source.durationEditable;\r\n };\r\n EventDef.prototype.isExplicitlyEditable = function () {\r\n if (this.editable != null) {\r\n return this.editable;\r\n }\r\n return this.source.editable;\r\n };\r\n EventDef.prototype.toLegacy = function () {\r\n var obj = $.extend({}, this.miscProps);\r\n obj._id = this.uid;\r\n obj.source = this.source;\r\n obj.className = this.className.slice(); // copy\r\n obj.allDay = this.isAllDay();\r\n if (this.rawId != null) {\r\n obj.id = this.rawId;\r\n }\r\n EventDef.copyVerbatimStandardProps(this, obj);\r\n return obj;\r\n };\r\n EventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventDef.normalizeId((this.rawId = rawProps.id));\r\n }\r\n else {\r\n this.id = EventDef.generateId();\r\n }\r\n if (rawProps._id != null) {\r\n this.uid = String(rawProps._id);\r\n }\r\n else {\r\n this.uid = EventDef.generateId();\r\n }\r\n // TODO: converge with EventSource\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventDef.prototype.applyMiscProps = function (rawProps) {\r\n $.extend(this.miscProps, rawProps);\r\n };\r\n EventDef.uuid = 0;\r\n EventDef.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventDef.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventDef;\r\n}());\r\nexports.default = EventDef;\r\nParsableModelMixin_1.default.mixInto(EventDef);\r\nEventDef.defineStandardProps({\r\n // not automatically assigned (`false`)\r\n _id: false,\r\n id: false,\r\n className: false,\r\n source: false,\r\n // automatically assigned (`true`)\r\n title: true,\r\n url: true,\r\n rendering: true,\r\n constraint: true,\r\n overlap: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 35 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange_1 = __webpack_require__(211);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nfunction eventDefsToEventInstances(eventDefs, unzonedRange) {\r\n var eventInstances = [];\r\n var i;\r\n for (i = 0; i < eventDefs.length; i++) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventDefs[i].buildInstances(unzonedRange));\r\n }\r\n return eventInstances;\r\n}\r\nexports.eventDefsToEventInstances = eventDefsToEventInstances;\r\nfunction eventInstanceToEventRange(eventInstance) {\r\n return new EventRange_1.default(eventInstance.dateProfile.unzonedRange, eventInstance.def, eventInstance);\r\n}\r\nexports.eventInstanceToEventRange = eventInstanceToEventRange;\r\nfunction eventRangeToEventFootprint(eventRange) {\r\n return new EventFootprint_1.default(new ComponentFootprint_1.default(eventRange.unzonedRange, eventRange.eventDef.isAllDay()), eventRange.eventDef, eventRange.eventInstance // might not exist\r\n );\r\n}\r\nexports.eventRangeToEventFootprint = eventRangeToEventFootprint;\r\nfunction eventInstanceToUnzonedRange(eventInstance) {\r\n return eventInstance.dateProfile.unzonedRange;\r\n}\r\nexports.eventInstanceToUnzonedRange = eventInstanceToUnzonedRange;\r\nfunction eventFootprintToComponentFootprint(eventFootprint) {\r\n return eventFootprint.componentFootprint;\r\n}\r\nexports.eventFootprintToComponentFootprint = eventFootprintToComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 36 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventFootprint = /** @class */ (function () {\r\n function EventFootprint(componentFootprint, eventDef, eventInstance) {\r\n this.componentFootprint = componentFootprint;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n EventFootprint.prototype.getEventLegacy = function () {\r\n return (this.eventInstance || this.eventDef).toLegacy();\r\n };\r\n return EventFootprint;\r\n}());\r\nexports.default = EventFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 37 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation = /** @class */ (function () {\r\n function EventDefMutation() {\r\n }\r\n EventDefMutation.createFromRawProps = function (eventInstance, rawProps, largeUnit) {\r\n var eventDef = eventInstance.def;\r\n var dateProps = {};\r\n var standardProps = {};\r\n var miscProps = {};\r\n var verbatimStandardProps = {};\r\n var eventDefId = null;\r\n var className = null;\r\n var propName;\r\n var dateProfile;\r\n var dateMutation;\r\n var defMutation;\r\n for (propName in rawProps) {\r\n if (EventDateProfile_1.default.isStandardProp(propName)) {\r\n dateProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.isStandardProp(propName)) {\r\n standardProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.miscProps[propName] !== rawProps[propName]) {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n dateProfile = EventDateProfile_1.default.parse(dateProps, eventDef.source);\r\n if (dateProfile) {\r\n dateMutation = EventDefDateMutation_1.default.createFromDiff(eventInstance.dateProfile, dateProfile, largeUnit);\r\n }\r\n if (standardProps.id !== eventDef.id) {\r\n eventDefId = standardProps.id; // only apply if there's a change\r\n }\r\n if (!util_1.isArraysEqual(standardProps.className, eventDef.className)) {\r\n className = standardProps.className; // only apply if there's a change\r\n }\r\n EventDef_1.default.copyVerbatimStandardProps(standardProps, // src\r\n verbatimStandardProps // dest\r\n );\r\n defMutation = new EventDefMutation();\r\n defMutation.eventDefId = eventDefId;\r\n defMutation.className = className;\r\n defMutation.verbatimStandardProps = verbatimStandardProps;\r\n defMutation.miscProps = miscProps;\r\n if (dateMutation) {\r\n defMutation.dateMutation = dateMutation;\r\n }\r\n return defMutation;\r\n };\r\n /*\r\n eventDef assumed to be a SingleEventDef.\r\n returns an undo function.\r\n */\r\n EventDefMutation.prototype.mutateSingle = function (eventDef) {\r\n var origDateProfile;\r\n if (this.dateMutation) {\r\n origDateProfile = eventDef.dateProfile;\r\n eventDef.dateProfile = this.dateMutation.buildNewDateProfile(origDateProfile, eventDef.source.calendar);\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.eventDefId != null) {\r\n eventDef.id = EventDef_1.default.normalizeId((eventDef.rawId = this.eventDefId));\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.className) {\r\n eventDef.className = this.className;\r\n }\r\n // can't undo\r\n if (this.verbatimStandardProps) {\r\n SingleEventDef_1.default.copyVerbatimStandardProps(this.verbatimStandardProps, // src\r\n eventDef // dest\r\n );\r\n }\r\n // can't undo\r\n if (this.miscProps) {\r\n eventDef.applyMiscProps(this.miscProps);\r\n }\r\n if (origDateProfile) {\r\n return function () {\r\n eventDef.dateProfile = origDateProfile;\r\n };\r\n }\r\n else {\r\n return function () { };\r\n }\r\n };\r\n EventDefMutation.prototype.setDateMutation = function (dateMutation) {\r\n if (dateMutation && !dateMutation.isEmpty()) {\r\n this.dateMutation = dateMutation;\r\n }\r\n else {\r\n this.dateMutation = null;\r\n }\r\n };\r\n EventDefMutation.prototype.isEmpty = function () {\r\n return !this.dateMutation;\r\n };\r\n return EventDefMutation;\r\n}());\r\nexports.default = EventDefMutation;\r\n\r\n\r\n/***/ }),\r\n/* 38 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.default = {\r\n sourceClasses: [],\r\n registerClass: function (EventSourceClass) {\r\n this.sourceClasses.unshift(EventSourceClass); // give highest priority\r\n },\r\n parse: function (rawInput, calendar) {\r\n var sourceClasses = this.sourceClasses;\r\n var i;\r\n var eventSource;\r\n for (i = 0; i < sourceClasses.length; i++) {\r\n eventSource = sourceClasses[i].parse(rawInput, calendar);\r\n if (eventSource) {\r\n return eventSource;\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 39 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Class_1 = __webpack_require__(33);\r\n/*\r\nEmbodies a div that has potential scrollbars\r\n*/\r\nvar Scroller = /** @class */ (function (_super) {\r\n tslib_1.__extends(Scroller, _super);\r\n function Scroller(options) {\r\n var _this = _super.call(this) || this;\r\n options = options || {};\r\n _this.overflowX = options.overflowX || options.overflow || 'auto';\r\n _this.overflowY = options.overflowY || options.overflow || 'auto';\r\n return _this;\r\n }\r\n Scroller.prototype.render = function () {\r\n this.el = this.renderEl();\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.renderEl = function () {\r\n return (this.scrollEl = $('
'));\r\n };\r\n // sets to natural height, unlocks overflow\r\n Scroller.prototype.clear = function () {\r\n this.setHeight('auto');\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.destroy = function () {\r\n this.el.remove();\r\n };\r\n // Overflow\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.applyOverflow = function () {\r\n this.scrollEl.css({\r\n 'overflow-x': this.overflowX,\r\n 'overflow-y': this.overflowY\r\n });\r\n };\r\n // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.\r\n // Useful for preserving scrollbar widths regardless of future resizes.\r\n // Can pass in scrollbarWidths for optimization.\r\n Scroller.prototype.lockOverflow = function (scrollbarWidths) {\r\n var overflowX = this.overflowX;\r\n var overflowY = this.overflowY;\r\n scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();\r\n if (overflowX === 'auto') {\r\n overflowX = (scrollbarWidths.top || scrollbarWidths.bottom || // horizontal scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth) ? 'scroll' : 'hidden';\r\n }\r\n if (overflowY === 'auto') {\r\n overflowY = (scrollbarWidths.left || scrollbarWidths.right || // vertical scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight) ? 'scroll' : 'hidden';\r\n }\r\n this.scrollEl.css({ 'overflow-x': overflowX, 'overflow-y': overflowY });\r\n };\r\n // Getters / Setters\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.setHeight = function (height) {\r\n this.scrollEl.height(height);\r\n };\r\n Scroller.prototype.getScrollTop = function () {\r\n return this.scrollEl.scrollTop();\r\n };\r\n Scroller.prototype.setScrollTop = function (top) {\r\n this.scrollEl.scrollTop(top);\r\n };\r\n Scroller.prototype.getClientWidth = function () {\r\n return this.scrollEl[0].clientWidth;\r\n };\r\n Scroller.prototype.getClientHeight = function () {\r\n return this.scrollEl[0].clientHeight;\r\n };\r\n Scroller.prototype.getScrollbarWidths = function () {\r\n return util_1.getScrollbarWidths(this.scrollEl);\r\n };\r\n return Scroller;\r\n}(Class_1.default));\r\nexports.default = Scroller;\r\n\r\n\r\n/***/ }),\r\n/* 40 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar DateComponent_1 = __webpack_require__(219);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar InteractiveDateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(InteractiveDateComponent, _super);\r\n function InteractiveDateComponent(_view, _options) {\r\n var _this = _super.call(this, _view, _options) || this;\r\n // self-config, overridable by subclasses\r\n _this.segSelector = '.fc-event-container > *'; // what constitutes an event element?\r\n if (_this.dateSelectingClass) {\r\n _this.dateClicking = new _this.dateClickingClass(_this);\r\n }\r\n if (_this.dateSelectingClass) {\r\n _this.dateSelecting = new _this.dateSelectingClass(_this);\r\n }\r\n if (_this.eventPointingClass) {\r\n _this.eventPointing = new _this.eventPointingClass(_this);\r\n }\r\n if (_this.eventDraggingClass && _this.eventPointing) {\r\n _this.eventDragging = new _this.eventDraggingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.eventResizingClass && _this.eventPointing) {\r\n _this.eventResizing = new _this.eventResizingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.externalDroppingClass) {\r\n _this.externalDropping = new _this.externalDroppingClass(_this);\r\n }\r\n return _this;\r\n }\r\n // Sets the container element that the view should render inside of, does global DOM-related initializations,\r\n // and renders all the non-date-related content inside.\r\n InteractiveDateComponent.prototype.setElement = function (el) {\r\n _super.prototype.setElement.call(this, el);\r\n if (this.dateClicking) {\r\n this.dateClicking.bindToEl(el);\r\n }\r\n if (this.dateSelecting) {\r\n this.dateSelecting.bindToEl(el);\r\n }\r\n this.bindAllSegHandlersToEl(el);\r\n };\r\n InteractiveDateComponent.prototype.removeElement = function () {\r\n this.endInteractions();\r\n _super.prototype.removeElement.call(this);\r\n };\r\n InteractiveDateComponent.prototype.executeEventUnrender = function () {\r\n this.endInteractions();\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n InteractiveDateComponent.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.bindToDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.unbindFromDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.bindDateHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n // attach a handler to the grid's root element.\r\n // jQuery will take care of unregistering them when removeElement gets called.\r\n this.el.on(name, function (ev) {\r\n if (!$(ev.target).is(_this.segSelector + ':not(.fc-helper),' + // directly on an event element\r\n _this.segSelector + ':not(.fc-helper) *,' + // within an event element\r\n '.fc-more,' + // a \"more..\" link\r\n 'a[data-goto]' // a clickable nav link\r\n )) {\r\n return handler.call(_this, ev);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindAllSegHandlersToEl = function (el) {\r\n [\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (eventInteraction) {\r\n if (eventInteraction) {\r\n eventInteraction.bindToEl(el);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindSegHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n el.on(name, this.segSelector, function (ev) {\r\n var segEl = $(ev.currentTarget);\r\n if (!segEl.is('.fc-helper')) {\r\n var seg = segEl.data('fc-seg'); // grab segment data. put there by View::renderEventsPayload\r\n if (seg && !_this.shouldIgnoreEventPointing()) {\r\n return handler.call(_this, seg, ev); // context will be the Grid\r\n }\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreMouse = function () {\r\n // HACK\r\n // This will still work even though bindDateHandlerToEl doesn't use GlobalEmitter.\r\n return GlobalEmitter_1.default.get().shouldIgnoreMouse();\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreTouch = function () {\r\n var view = this._getView();\r\n // On iOS (and Android?) when a new selection is initiated overtop another selection,\r\n // the touchend never fires because the elements gets removed mid-touch-interaction (my theory).\r\n // HACK: simply don't allow this to happen.\r\n // ALSO: prevent selection when an *event* is already raised.\r\n return view.isSelected || view.selectedEvent;\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreEventPointing = function () {\r\n // only call the handlers if there is not a drag/resize in progress\r\n return (this.eventDragging && this.eventDragging.isDragging) ||\r\n (this.eventResizing && this.eventResizing.isResizing);\r\n };\r\n InteractiveDateComponent.prototype.canStartSelection = function (seg, ev) {\r\n return util_1.getEvIsTouch(ev) &&\r\n !this.canStartResize(seg, ev) &&\r\n (this.isEventDefDraggable(seg.footprint.eventDef) ||\r\n this.isEventDefResizable(seg.footprint.eventDef));\r\n };\r\n InteractiveDateComponent.prototype.canStartDrag = function (seg, ev) {\r\n return !this.canStartResize(seg, ev) &&\r\n this.isEventDefDraggable(seg.footprint.eventDef);\r\n };\r\n InteractiveDateComponent.prototype.canStartResize = function (seg, ev) {\r\n var view = this._getView();\r\n var eventDef = seg.footprint.eventDef;\r\n return (!util_1.getEvIsTouch(ev) || view.isEventDefSelected(eventDef)) &&\r\n this.isEventDefResizable(eventDef) &&\r\n $(ev.target).is('.fc-resizer');\r\n };\r\n // Kills all in-progress dragging.\r\n // Useful for when public API methods that result in re-rendering are invoked during a drag.\r\n // Also useful for when touch devices misbehave and don't fire their touchend.\r\n InteractiveDateComponent.prototype.endInteractions = function () {\r\n [\r\n this.dateClicking,\r\n this.dateSelecting,\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (interaction) {\r\n if (interaction) {\r\n interaction.end();\r\n }\r\n });\r\n };\r\n // Event Drag-n-Drop\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be dragged by the user\r\n InteractiveDateComponent.prototype.isEventDefDraggable = function (eventDef) {\r\n return this.isEventDefStartEditable(eventDef);\r\n };\r\n InteractiveDateComponent.prototype.isEventDefStartEditable = function (eventDef) {\r\n var isEditable = eventDef.isStartExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('eventStartEditable');\r\n if (isEditable == null) {\r\n isEditable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isEditable;\r\n };\r\n InteractiveDateComponent.prototype.isEventDefGenerallyEditable = function (eventDef) {\r\n var isEditable = eventDef.isExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('editable');\r\n }\r\n return isEditable;\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be resized from its starting edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromStart = function (eventDef) {\r\n return this.opt('eventResizableFromStart') && this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized from its ending edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromEnd = function (eventDef) {\r\n return this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized by the user at all\r\n InteractiveDateComponent.prototype.isEventDefResizable = function (eventDef) {\r\n var isResizable = eventDef.isDurationExplicitlyEditable();\r\n if (isResizable == null) {\r\n isResizable = this.opt('eventDurationEditable');\r\n if (isResizable == null) {\r\n isResizable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isResizable;\r\n };\r\n // Event Mutation / Constraints\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Diffs the two dates, returning a duration, based on granularity of the grid\r\n // TODO: port isTimeScale into this system?\r\n InteractiveDateComponent.prototype.diffDates = function (a, b) {\r\n if (this.largeUnit) {\r\n return util_1.diffByUnit(a, b, this.largeUnit);\r\n }\r\n else {\r\n return util_1.diffDayTime(a, b);\r\n }\r\n };\r\n // is it allowed, in relation to the view's validRange?\r\n // NOTE: very similar to isExternalInstanceGroupAllowed\r\n InteractiveDateComponent.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // TODO: just use getAllEventRanges directly\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n return view.calendar.constraints.isEventInstanceGroupAllowed(eventInstanceGroup);\r\n };\r\n // NOTE: very similar to isEventInstanceGroupAllowed\r\n // when it's a completely anonymous external drag, no event.\r\n InteractiveDateComponent.prototype.isExternalInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // treat it as a selection\r\n // TODO: pass in eventInstanceGroup instead\r\n // because we don't want calendar's constraint system to depend on a component's\r\n // determination of footprints.\r\n if (!view.calendar.constraints.isSelectionFootprintAllowed(eventFootprints[i].componentFootprint)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n return InteractiveDateComponent;\r\n}(DateComponent_1.default));\r\nexports.default = InteractiveDateComponent;\r\n\r\n\r\n/***/ }),\r\n/* 41 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/* An abstract class from which other views inherit from\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar View = /** @class */ (function (_super) {\r\n tslib_1.__extends(View, _super);\r\n function View(calendar, viewSpec) {\r\n var _this = _super.call(this, null, viewSpec.options) || this;\r\n _this.batchRenderDepth = 0;\r\n _this.isSelected = false; // boolean whether a range of time is user-selected or not\r\n _this.calendar = calendar;\r\n _this.viewSpec = viewSpec;\r\n // shortcuts\r\n _this.type = viewSpec.type;\r\n // .name is deprecated\r\n _this.name = _this.type;\r\n _this.initRenderQueue();\r\n _this.initHiddenDays();\r\n _this.dateProfileGenerator = new _this.dateProfileGeneratorClass(_this);\r\n _this.bindBaseRenderHandlers();\r\n _this.eventOrderSpecs = util_1.parseFieldSpecs(_this.opt('eventOrder'));\r\n // legacy\r\n if (_this['initialize']) {\r\n _this['initialize']();\r\n }\r\n return _this;\r\n }\r\n View.prototype._getView = function () {\r\n return this;\r\n };\r\n // Retrieves an option with the given name\r\n View.prototype.opt = function (name) {\r\n return this.options[name];\r\n };\r\n /* Render Queue\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.initRenderQueue = function () {\r\n this.renderQueue = new RenderQueue_1.default({\r\n event: this.opt('eventRenderWait')\r\n });\r\n this.renderQueue.on('start', this.onRenderQueueStart.bind(this));\r\n this.renderQueue.on('stop', this.onRenderQueueStop.bind(this));\r\n this.on('before:change', this.startBatchRender);\r\n this.on('change', this.stopBatchRender);\r\n };\r\n View.prototype.onRenderQueueStart = function () {\r\n this.calendar.freezeContentHeight();\r\n this.addScroll(this.queryScroll());\r\n };\r\n View.prototype.onRenderQueueStop = function () {\r\n if (this.calendar.updateViewSize()) {\r\n this.popScroll();\r\n }\r\n this.calendar.thawContentHeight();\r\n };\r\n View.prototype.startBatchRender = function () {\r\n if (!(this.batchRenderDepth++)) {\r\n this.renderQueue.pause();\r\n }\r\n };\r\n View.prototype.stopBatchRender = function () {\r\n if (!(--this.batchRenderDepth)) {\r\n this.renderQueue.resume();\r\n }\r\n };\r\n View.prototype.requestRender = function (func, namespace, actionType) {\r\n this.renderQueue.queue(func, namespace, actionType);\r\n };\r\n // given func will auto-bind to `this`\r\n View.prototype.whenSizeUpdated = function (func) {\r\n if (this.renderQueue.isRunning) {\r\n this.renderQueue.one('stop', func.bind(this));\r\n }\r\n else {\r\n func.call(this);\r\n }\r\n };\r\n /* Title and Date Formatting\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes what the title at the top of the calendar should be for this view\r\n View.prototype.computeTitle = function (dateProfile) {\r\n var unzonedRange;\r\n // for views that span a large unit of time, show the proper interval, ignoring stray days before and after\r\n if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {\r\n unzonedRange = dateProfile.currentUnzonedRange;\r\n }\r\n else {\r\n unzonedRange = dateProfile.activeUnzonedRange;\r\n }\r\n return this.formatRange({\r\n start: this.calendar.msToMoment(unzonedRange.startMs, dateProfile.isRangeAllDay),\r\n end: this.calendar.msToMoment(unzonedRange.endMs, dateProfile.isRangeAllDay)\r\n }, dateProfile.isRangeAllDay, this.opt('titleFormat') || this.computeTitleFormat(dateProfile), this.opt('titleRangeSeparator'));\r\n };\r\n // Generates the format string that should be used to generate the title for the current date range.\r\n // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\r\n View.prototype.computeTitleFormat = function (dateProfile) {\r\n var currentRangeUnit = dateProfile.currentRangeUnit;\r\n if (currentRangeUnit === 'year') {\r\n return 'YYYY';\r\n }\r\n else if (currentRangeUnit === 'month') {\r\n return this.opt('monthYearFormat'); // like \"September 2014\"\r\n }\r\n else if (dateProfile.currentUnzonedRange.as('days') > 1) {\r\n return 'll'; // multi-day range. shorter, like \"Sep 9 - 10 2014\"\r\n }\r\n else {\r\n return 'LL'; // one day. longer, like \"September 9 2014\"\r\n }\r\n };\r\n // Date Setting/Unsetting\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.setDate = function (date) {\r\n var currentDateProfile = this.get('dateProfile');\r\n var newDateProfile = this.dateProfileGenerator.build(date, undefined, true); // forceToValid=true\r\n if (!currentDateProfile ||\r\n !currentDateProfile.activeUnzonedRange.equals(newDateProfile.activeUnzonedRange)) {\r\n this.set('dateProfile', newDateProfile);\r\n }\r\n };\r\n View.prototype.unsetDate = function () {\r\n this.unset('dateProfile');\r\n };\r\n // Event Data\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.fetchInitialEvents = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var forceAllDay = dateProfile.isRangeAllDay && !this.usesMinMaxTime;\r\n return calendar.requestEvents(calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, forceAllDay), calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, forceAllDay));\r\n };\r\n View.prototype.bindEventChanges = function () {\r\n this.listenTo(this.calendar, 'eventsReset', this.resetEvents); // TODO: make this a real event\r\n };\r\n View.prototype.unbindEventChanges = function () {\r\n this.stopListeningTo(this.calendar, 'eventsReset');\r\n };\r\n View.prototype.setEvents = function (eventsPayload) {\r\n this.set('currentEvents', eventsPayload);\r\n this.set('hasEvents', true);\r\n };\r\n View.prototype.unsetEvents = function () {\r\n this.unset('currentEvents');\r\n this.unset('hasEvents');\r\n };\r\n View.prototype.resetEvents = function (eventsPayload) {\r\n this.startBatchRender();\r\n this.unsetEvents();\r\n this.setEvents(eventsPayload);\r\n this.stopBatchRender();\r\n };\r\n // Date High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestDateRender = function (dateProfile) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateRender(dateProfile);\r\n }, 'date', 'init');\r\n };\r\n View.prototype.requestDateUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateUnrender();\r\n }, 'date', 'destroy');\r\n };\r\n // if dateProfile not specified, uses current\r\n View.prototype.executeDateRender = function (dateProfile) {\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n if (this['render']) {\r\n this['render'](); // TODO: deprecate\r\n }\r\n this.trigger('datesRendered');\r\n this.addScroll({ isDateInit: true });\r\n this.startNowIndicator(); // shouldn't render yet because updateSize will be called soon\r\n };\r\n View.prototype.executeDateUnrender = function () {\r\n this.unselect();\r\n this.stopNowIndicator();\r\n this.trigger('before:datesUnrendered');\r\n if (this['destroy']) {\r\n this['destroy'](); // TODO: deprecate\r\n }\r\n _super.prototype.executeDateUnrender.call(this);\r\n };\r\n // \"Base\" rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.bindBaseRenderHandlers = function () {\r\n var _this = this;\r\n this.on('datesRendered', function () {\r\n _this.whenSizeUpdated(_this.triggerViewRender);\r\n });\r\n this.on('before:datesUnrendered', function () {\r\n _this.triggerViewDestroy();\r\n });\r\n };\r\n View.prototype.triggerViewRender = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerViewDestroy = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Event High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestEventsRender = function (eventsPayload) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeEventRender(eventsPayload);\r\n _this.whenSizeUpdated(_this.triggerAfterEventsRendered);\r\n }, 'event', 'init');\r\n };\r\n View.prototype.requestEventsUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.triggerBeforeEventsDestroyed();\r\n _this.executeEventUnrender();\r\n }, 'event', 'destroy');\r\n };\r\n // Business Hour High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestBusinessHoursRender = function (businessHourGenerator) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.renderBusinessHours(businessHourGenerator);\r\n }, 'businessHours', 'init');\r\n };\r\n View.prototype.requestBusinessHoursUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.unrenderBusinessHours();\r\n }, 'businessHours', 'destroy');\r\n };\r\n // Misc view rendering utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Binds DOM handlers to elements that reside outside the view container, such as the document\r\n View.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n this.listenTo(GlobalEmitter_1.default.get(), {\r\n touchstart: this.processUnselect,\r\n mousedown: this.handleDocumentMousedown\r\n });\r\n };\r\n // Unbinds DOM handlers from elements that reside outside the view container\r\n View.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Immediately render the current time indicator and begins re-rendering it at an interval,\r\n // which is defined by this.getNowIndicatorUnit().\r\n // TODO: somehow do this for the current whole day's background too\r\n View.prototype.startNowIndicator = function () {\r\n var _this = this;\r\n var unit;\r\n var update;\r\n var delay; // ms wait value\r\n if (this.opt('nowIndicator')) {\r\n unit = this.getNowIndicatorUnit();\r\n if (unit) {\r\n update = util_1.proxy(this, 'updateNowIndicator'); // bind to `this`\r\n this.initialNowDate = this.calendar.getNow();\r\n this.initialNowQueriedMs = new Date().valueOf();\r\n // wait until the beginning of the next interval\r\n delay = this.initialNowDate.clone().startOf(unit).add(1, unit).valueOf() - this.initialNowDate.valueOf();\r\n this.nowIndicatorTimeoutID = setTimeout(function () {\r\n _this.nowIndicatorTimeoutID = null;\r\n update();\r\n delay = +moment.duration(1, unit);\r\n delay = Math.max(100, delay); // prevent too frequent\r\n _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval\r\n }, delay);\r\n }\r\n // rendering will be initiated in updateSize\r\n }\r\n };\r\n // rerenders the now indicator, computing the new current time from the amount of time that has passed\r\n // since the initial getNow call.\r\n View.prototype.updateNowIndicator = function () {\r\n if (this.isDatesRendered &&\r\n this.initialNowDate // activated before?\r\n ) {\r\n this.unrenderNowIndicator(); // won't unrender if unnecessary\r\n this.renderNowIndicator(this.initialNowDate.clone().add(new Date().valueOf() - this.initialNowQueriedMs) // add ms\r\n );\r\n this.isNowIndicatorRendered = true;\r\n }\r\n };\r\n // Immediately unrenders the view's current time indicator and stops any re-rendering timers.\r\n // Won't cause side effects if indicator isn't rendered.\r\n View.prototype.stopNowIndicator = function () {\r\n if (this.isNowIndicatorRendered) {\r\n if (this.nowIndicatorTimeoutID) {\r\n clearTimeout(this.nowIndicatorTimeoutID);\r\n this.nowIndicatorTimeoutID = null;\r\n }\r\n if (this.nowIndicatorIntervalID) {\r\n clearInterval(this.nowIndicatorIntervalID);\r\n this.nowIndicatorIntervalID = null;\r\n }\r\n this.unrenderNowIndicator();\r\n this.isNowIndicatorRendered = false;\r\n }\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n if (this['setHeight']) {\r\n this['setHeight'](totalHeight, isAuto);\r\n }\r\n else {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n }\r\n this.updateNowIndicator();\r\n };\r\n /* Scroller\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.addScroll = function (scroll) {\r\n var queuedScroll = this.queuedScroll || (this.queuedScroll = {});\r\n $.extend(queuedScroll, scroll);\r\n };\r\n View.prototype.popScroll = function () {\r\n this.applyQueuedScroll();\r\n this.queuedScroll = null;\r\n };\r\n View.prototype.applyQueuedScroll = function () {\r\n if (this.queuedScroll) {\r\n this.applyScroll(this.queuedScroll);\r\n }\r\n };\r\n View.prototype.queryScroll = function () {\r\n var scroll = {};\r\n if (this.isDatesRendered) {\r\n $.extend(scroll, this.queryDateScroll());\r\n }\r\n return scroll;\r\n };\r\n View.prototype.applyScroll = function (scroll) {\r\n if (scroll.isDateInit && this.isDatesRendered) {\r\n $.extend(scroll, this.computeInitialDateScroll());\r\n }\r\n if (this.isDatesRendered) {\r\n this.applyDateScroll(scroll);\r\n }\r\n };\r\n View.prototype.computeInitialDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.queryDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.applyDateScroll = function (scroll) {\r\n // subclasses must implement\r\n };\r\n /* Event Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.reportEventDrop = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n var dateMutation = eventMutation.dateMutation;\r\n // update the EventInstance, for handlers\r\n if (dateMutation) {\r\n eventInstance.dateProfile = dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n }\r\n this.triggerEventDrop(eventInstance, \r\n // a drop doesn't necessarily mean a date mutation (ex: resource change)\r\n (dateMutation && dateMutation.dateDelta) || moment.duration(), undoFunc, el, ev);\r\n };\r\n // Triggers event-drop handlers that have subscribed via the API\r\n View.prototype.triggerEventDrop = function (eventInstance, dateDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventDrop', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n dateDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* External Element Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an external element, via jQuery UI, has been dropped onto the calendar.\r\n // `meta` is the parsed data that has been embedded into the dragging event.\r\n // `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.\r\n View.prototype.reportExternalDrop = function (singleEventDef, isEvent, isSticky, el, ev, ui) {\r\n if (isEvent) {\r\n this.calendar.eventManager.addEventDef(singleEventDef, isSticky);\r\n }\r\n this.triggerExternalDrop(singleEventDef, isEvent, el, ev, ui);\r\n };\r\n // Triggers external-drop handlers that have subscribed via the API\r\n View.prototype.triggerExternalDrop = function (singleEventDef, isEvent, el, ev, ui) {\r\n // trigger 'drop' regardless of whether element represents an event\r\n this.publiclyTrigger('drop', {\r\n context: el[0],\r\n args: [\r\n singleEventDef.dateProfile.start.clone(),\r\n ev,\r\n ui,\r\n this\r\n ]\r\n });\r\n if (isEvent) {\r\n // signal an external event landed\r\n this.publiclyTrigger('eventReceive', {\r\n context: this,\r\n args: [\r\n singleEventDef.buildInstance().toLegacy(),\r\n this\r\n ]\r\n });\r\n }\r\n };\r\n /* Event Resizing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an event in the view has been resized to a new length\r\n View.prototype.reportEventResize = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n // update the EventInstance, for handlers\r\n eventInstance.dateProfile = eventMutation.dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n this.triggerEventResize(eventInstance, eventMutation.dateMutation.endDelta, undoFunc, el, ev);\r\n };\r\n // Triggers event-resize handlers that have subscribed via the API\r\n View.prototype.triggerEventResize = function (eventInstance, durationDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventResize', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n durationDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* Selection (time range)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Selects a date span on the view. `start` and `end` are both Moments.\r\n // `ev` is the native mouse event that begin the interaction.\r\n View.prototype.select = function (footprint, ev) {\r\n this.unselect(ev);\r\n this.renderSelectionFootprint(footprint);\r\n this.reportSelection(footprint, ev);\r\n };\r\n View.prototype.renderSelectionFootprint = function (footprint) {\r\n if (this['renderSelection']) {\r\n this['renderSelection'](footprint.toLegacy(this.calendar));\r\n }\r\n else {\r\n _super.prototype.renderSelectionFootprint.call(this, footprint);\r\n }\r\n };\r\n // Called when a new selection is made. Updates internal state and triggers handlers.\r\n View.prototype.reportSelection = function (footprint, ev) {\r\n this.isSelected = true;\r\n this.triggerSelect(footprint, ev);\r\n };\r\n // Triggers handlers to 'select'\r\n View.prototype.triggerSelect = function (footprint, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('select', {\r\n context: this,\r\n args: [\r\n dateProfile.start,\r\n dateProfile.end,\r\n ev,\r\n this\r\n ]\r\n });\r\n };\r\n // Undoes a selection. updates in the internal state and triggers handlers.\r\n // `ev` is the native mouse event that began the interaction.\r\n View.prototype.unselect = function (ev) {\r\n if (this.isSelected) {\r\n this.isSelected = false;\r\n if (this['destroySelection']) {\r\n this['destroySelection'](); // TODO: deprecate\r\n }\r\n this.unrenderSelection();\r\n this.publiclyTrigger('unselect', {\r\n context: this,\r\n args: [ev, this]\r\n });\r\n }\r\n };\r\n /* Event Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.selectEventInstance = function (eventInstance) {\r\n if (!this.selectedEventInstance ||\r\n this.selectedEventInstance !== eventInstance) {\r\n this.unselectEventInstance();\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventInstance === eventInstance &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.addClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = eventInstance;\r\n }\r\n };\r\n View.prototype.unselectEventInstance = function () {\r\n if (this.selectedEventInstance) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.el) {\r\n seg.el.removeClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = null;\r\n }\r\n };\r\n View.prototype.isEventDefSelected = function (eventDef) {\r\n // event references might change on refetchEvents(), while selectedEventInstance doesn't,\r\n // so compare IDs\r\n return this.selectedEventInstance && this.selectedEventInstance.def.id === eventDef.id;\r\n };\r\n /* Mouse / Touch Unselecting (time range & event unselection)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // TODO: move consistently to down/start or up/end?\r\n // TODO: don't kill previous selection if touch scrolling\r\n View.prototype.handleDocumentMousedown = function (ev) {\r\n if (util_1.isPrimaryMouseButton(ev)) {\r\n this.processUnselect(ev);\r\n }\r\n };\r\n View.prototype.processUnselect = function (ev) {\r\n this.processRangeUnselect(ev);\r\n this.processEventUnselect(ev);\r\n };\r\n View.prototype.processRangeUnselect = function (ev) {\r\n var ignore;\r\n // is there a time-range selection?\r\n if (this.isSelected && this.opt('unselectAuto')) {\r\n // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element\r\n ignore = this.opt('unselectCancel');\r\n if (!ignore || !$(ev.target).closest(ignore).length) {\r\n this.unselect(ev);\r\n }\r\n }\r\n };\r\n View.prototype.processEventUnselect = function (ev) {\r\n if (this.selectedEventInstance) {\r\n if (!$(ev.target).closest('.fc-selected').length) {\r\n this.unselectEventInstance();\r\n }\r\n }\r\n };\r\n /* Triggers\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.triggerBaseRendered = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerBaseUnrendered = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Triggers handlers to 'dayClick'\r\n // Span has start/end of the clicked area. Only the start is useful.\r\n View.prototype.triggerDayClick = function (footprint, dayEl, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('dayClick', {\r\n context: dayEl,\r\n args: [dateProfile.start, ev, this]\r\n });\r\n };\r\n /* Date Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // For DateComponent::getDayClasses\r\n View.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return false;\r\n };\r\n // Arguments after name will be forwarded to a hypothetical function value\r\n // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.\r\n // Always clone your objects if you fear mutation.\r\n View.prototype.getUnzonedRangeOption = function (name) {\r\n var val = this.opt(name);\r\n if (typeof val === 'function') {\r\n val = val.apply(null, Array.prototype.slice.call(arguments, 1));\r\n }\r\n if (val) {\r\n return this.calendar.parseUnzonedRange(val);\r\n }\r\n };\r\n /* Hidden Days\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Initializes internal variables related to calculating hidden days-of-week\r\n View.prototype.initHiddenDays = function () {\r\n var hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden\r\n var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\r\n var dayCnt = 0;\r\n var i;\r\n if (this.opt('weekends') === false) {\r\n hiddenDays.push(0, 6); // 0=sunday, 6=saturday\r\n }\r\n for (i = 0; i < 7; i++) {\r\n if (!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)) {\r\n dayCnt++;\r\n }\r\n }\r\n if (!dayCnt) {\r\n throw new Error('invalid hiddenDays'); // all days were hidden? bad.\r\n }\r\n this.isHiddenDayHash = isHiddenDayHash;\r\n };\r\n // Remove days from the beginning and end of the range that are computed as hidden.\r\n // If the whole range is trimmed off, returns null\r\n View.prototype.trimHiddenDays = function (inputUnzonedRange) {\r\n var start = inputUnzonedRange.getStart();\r\n var end = inputUnzonedRange.getEnd();\r\n if (start) {\r\n start = this.skipHiddenDays(start);\r\n }\r\n if (end) {\r\n end = this.skipHiddenDays(end, -1, true);\r\n }\r\n if (start === null || end === null || start < end) {\r\n return new UnzonedRange_1.default(start, end);\r\n }\r\n return null;\r\n };\r\n // Is the current day hidden?\r\n // `day` is a day-of-week index (0-6), or a Moment\r\n View.prototype.isHiddenDay = function (day) {\r\n if (moment.isMoment(day)) {\r\n day = day.day();\r\n }\r\n return this.isHiddenDayHash[day];\r\n };\r\n // Incrementing the current day until it is no longer a hidden day, returning a copy.\r\n // DOES NOT CONSIDER validUnzonedRange!\r\n // If the initial value of `date` is not a hidden day, don't do anything.\r\n // Pass `isExclusive` as `true` if you are dealing with an end date.\r\n // `inc` defaults to `1` (increment one day forward each time)\r\n View.prototype.skipHiddenDays = function (date, inc, isExclusive) {\r\n if (inc === void 0) { inc = 1; }\r\n if (isExclusive === void 0) { isExclusive = false; }\r\n var out = date.clone();\r\n while (this.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]) {\r\n out.add(inc, 'days');\r\n }\r\n return out;\r\n };\r\n return View;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = View;\r\nView.prototype.usesMinMaxTime = false;\r\nView.prototype.dateProfileGeneratorClass = DateProfileGenerator_1.default;\r\nView.watch('displayingDates', ['isInDom', 'dateProfile'], function (deps) {\r\n this.requestDateRender(deps.dateProfile);\r\n}, function () {\r\n this.requestDateUnrender();\r\n});\r\nView.watch('displayingBusinessHours', ['displayingDates', 'businessHourGenerator'], function (deps) {\r\n this.requestBusinessHoursRender(deps.businessHourGenerator);\r\n}, function () {\r\n this.requestBusinessHoursUnrender();\r\n});\r\nView.watch('initialEvents', ['dateProfile'], function (deps) {\r\n return this.fetchInitialEvents(deps.dateProfile);\r\n});\r\nView.watch('bindingEvents', ['initialEvents'], function (deps) {\r\n this.setEvents(deps.initialEvents);\r\n this.bindEventChanges();\r\n}, function () {\r\n this.unbindEventChanges();\r\n this.unsetEvents();\r\n});\r\nView.watch('displayingEvents', ['displayingDates', 'hasEvents'], function () {\r\n this.requestEventsRender(this.get('currentEvents'));\r\n}, function () {\r\n this.requestEventsUnrender();\r\n});\r\nView.watch('title', ['dateProfile'], function (deps) {\r\n return (this.title = this.computeTitle(deps.dateProfile)); // assign to View for legacy reasons\r\n});\r\nView.watch('legacyDateProps', ['dateProfile'], function (deps) {\r\n var calendar = this.calendar;\r\n var dateProfile = deps.dateProfile;\r\n // DEPRECATED, but we need to keep it updated...\r\n this.start = calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.end = calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n this.intervalStart = calendar.msToMoment(dateProfile.currentUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.intervalEnd = calendar.msToMoment(dateProfile.currentUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 42 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer = /** @class */ (function () {\r\n function EventRenderer(component, fillRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n EventRenderer.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n // Updates values that rely on options and also relate to range\r\n EventRenderer.prototype.rangeUpdated = function () {\r\n var displayEventTime;\r\n var displayEventEnd;\r\n this.eventTimeFormat =\r\n this.opt('eventTimeFormat') ||\r\n this.opt('timeFormat') || // deprecated\r\n this.computeEventTimeFormat();\r\n displayEventTime = this.opt('displayEventTime');\r\n if (displayEventTime == null) {\r\n displayEventTime = this.computeDisplayEventTime(); // might be based off of range\r\n }\r\n displayEventEnd = this.opt('displayEventEnd');\r\n if (displayEventEnd == null) {\r\n displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\r\n }\r\n this.displayEventTime = displayEventTime;\r\n this.displayEventEnd = displayEventEnd;\r\n };\r\n EventRenderer.prototype.render = function (eventsPayload) {\r\n var dateProfile = this.component._getDateProfile();\r\n var eventDefId;\r\n var instanceGroup;\r\n var eventRanges;\r\n var bgRanges = [];\r\n var fgRanges = [];\r\n for (eventDefId in eventsPayload) {\r\n instanceGroup = eventsPayload[eventDefId];\r\n eventRanges = instanceGroup.sliceRenderRanges(dateProfile.activeUnzonedRange);\r\n if (instanceGroup.getEventDef().hasBgRendering()) {\r\n bgRanges.push.apply(bgRanges, eventRanges);\r\n }\r\n else {\r\n fgRanges.push.apply(fgRanges, eventRanges);\r\n }\r\n }\r\n this.renderBgRanges(bgRanges);\r\n this.renderFgRanges(fgRanges);\r\n };\r\n EventRenderer.prototype.unrender = function () {\r\n this.unrenderBgRanges();\r\n this.unrenderFgRanges();\r\n };\r\n EventRenderer.prototype.renderFgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n // render an `.el` on each seg\r\n // returns a subset of the segs. segs that were actually rendered\r\n segs = this.renderFgSegEls(segs);\r\n if (this.renderFgSegs(segs) !== false) {\r\n this.fgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderFgRanges = function () {\r\n this.unrenderFgSegs(this.fgSegs || []);\r\n this.fgSegs = null;\r\n };\r\n EventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n if (this.renderBgSegs(segs) !== false) {\r\n this.bgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgRanges = function () {\r\n this.unrenderBgSegs();\r\n this.bgSegs = null;\r\n };\r\n EventRenderer.prototype.getSegs = function () {\r\n return (this.bgSegs || []).concat(this.fgSegs || []);\r\n };\r\n // Renders foreground event segments onto the grid\r\n EventRenderer.prototype.renderFgSegs = function (segs) {\r\n // subclasses must implement\r\n // segs already has rendered els, and has been filtered.\r\n return false; // signal failure if not implemented\r\n };\r\n // Unrenders all currently rendered foreground segments\r\n EventRenderer.prototype.unrenderFgSegs = function (segs) {\r\n // subclasses must implement\r\n };\r\n EventRenderer.prototype.renderBgSegs = function (segs) {\r\n var _this = this;\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('bgEvent', segs, {\r\n getClasses: function (seg) {\r\n return _this.getBgClasses(seg.footprint.eventDef);\r\n },\r\n getCss: function (seg) {\r\n return {\r\n 'background-color': _this.getBgColor(seg.footprint.eventDef)\r\n };\r\n },\r\n filterEl: function (seg, el) {\r\n return _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n });\r\n }\r\n else {\r\n return false; // signal failure if no fillRenderer\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgSegs = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('bgEvent');\r\n }\r\n };\r\n // Renders and assigns an `el` property for each foreground event segment.\r\n // Only returns segments that successfully rendered.\r\n EventRenderer.prototype.renderFgSegEls = function (segs, disableResizing) {\r\n var _this = this;\r\n if (disableResizing === void 0) { disableResizing = false; }\r\n var hasEventRenderHandlers = this.view.hasPublicHandlers('eventRender');\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of event segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n this.beforeFgSegHtml(segs[i]);\r\n html += this.fgSegHtml(segs[i], disableResizing);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n if (hasEventRenderHandlers) {\r\n el = _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n if (el) {\r\n el.data('fc-seg', seg); // used by handlers\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n EventRenderer.prototype.beforeFgSegHtml = function (seg) {\r\n };\r\n // Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()\r\n EventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n // subclasses should implement\r\n };\r\n // Generic utility for generating the HTML classNames for an event segment's element\r\n EventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable) {\r\n var classes = [\r\n 'fc-event',\r\n seg.isStart ? 'fc-start' : 'fc-not-start',\r\n seg.isEnd ? 'fc-end' : 'fc-not-end'\r\n ].concat(this.getClasses(seg.footprint.eventDef));\r\n if (isDraggable) {\r\n classes.push('fc-draggable');\r\n }\r\n if (isResizable) {\r\n classes.push('fc-resizable');\r\n }\r\n // event is currently selected? attach a className.\r\n if (this.view.isEventDefSelected(seg.footprint.eventDef)) {\r\n classes.push('fc-selected');\r\n }\r\n return classes;\r\n };\r\n // Given an event and the default element used for rendering, returns the element that should actually be used.\r\n // Basically runs events and elements through the eventRender hook.\r\n EventRenderer.prototype.filterEventRenderEl = function (eventFootprint, el) {\r\n var legacy = eventFootprint.getEventLegacy();\r\n var custom = this.view.publiclyTrigger('eventRender', {\r\n context: legacy,\r\n args: [legacy, el, this.view]\r\n });\r\n if (custom === false) {\r\n el = null;\r\n }\r\n else if (custom && custom !== true) {\r\n el = $(custom);\r\n }\r\n return el;\r\n };\r\n // Compute the text that should be displayed on an event's element.\r\n // `range` can be the Event object itself, or something range-like, with at least a `start`.\r\n // If event times are disabled, or the event has no time, will return a blank string.\r\n // If not specified, formatStr will default to the eventTimeFormat setting,\r\n // and displayEnd will default to the displayEventEnd setting.\r\n EventRenderer.prototype.getTimeText = function (eventFootprint, formatStr, displayEnd) {\r\n return this._getTimeText(eventFootprint.eventInstance.dateProfile.start, eventFootprint.eventInstance.dateProfile.end, eventFootprint.componentFootprint.isAllDay, formatStr, displayEnd);\r\n };\r\n EventRenderer.prototype._getTimeText = function (start, end, isAllDay, formatStr, displayEnd) {\r\n if (formatStr == null) {\r\n formatStr = this.eventTimeFormat;\r\n }\r\n if (displayEnd == null) {\r\n displayEnd = this.displayEventEnd;\r\n }\r\n if (this.displayEventTime && !isAllDay) {\r\n if (displayEnd && end) {\r\n return this.view.formatRange({ start: start, end: end }, false, // allDay\r\n formatStr);\r\n }\r\n else {\r\n return start.format(formatStr);\r\n }\r\n }\r\n return '';\r\n };\r\n EventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('smallTimeFormat');\r\n };\r\n EventRenderer.prototype.computeDisplayEventTime = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.getBgClasses = function (eventDef) {\r\n var classNames = this.getClasses(eventDef);\r\n classNames.push('fc-bgevent');\r\n return classNames;\r\n };\r\n EventRenderer.prototype.getClasses = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var classNames = [];\r\n for (i = 0; i < objs.length; i++) {\r\n classNames.push.apply(// append\r\n classNames, objs[i].eventClassName || objs[i].className || []);\r\n }\r\n return classNames;\r\n };\r\n // Utility for generating event skin-related CSS properties\r\n EventRenderer.prototype.getSkinCss = function (eventDef) {\r\n return {\r\n 'background-color': this.getBgColor(eventDef),\r\n 'border-color': this.getBorderColor(eventDef),\r\n color: this.getTextColor(eventDef)\r\n };\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBgColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBackgroundColor || objs[i].eventColor ||\r\n objs[i].backgroundColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBackgroundColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBorderColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBorderColor || objs[i].eventColor ||\r\n objs[i].borderColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBorderColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getTextColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventTextColor ||\r\n objs[i].textColor;\r\n }\r\n if (!val) {\r\n val = this.opt('eventTextColor');\r\n }\r\n return val;\r\n };\r\n EventRenderer.prototype.getStylingObjs = function (eventDef) {\r\n var objs = this.getFallbackStylingObjs(eventDef);\r\n objs.unshift(eventDef);\r\n return objs;\r\n };\r\n EventRenderer.prototype.getFallbackStylingObjs = function (eventDef) {\r\n return [eventDef.source];\r\n };\r\n EventRenderer.prototype.sortEventSegs = function (segs) {\r\n segs.sort(util_1.proxy(this, 'compareEventSegs'));\r\n };\r\n // A cmp function for determining which segments should take visual priority\r\n EventRenderer.prototype.compareEventSegs = function (seg1, seg2) {\r\n var f1 = seg1.footprint;\r\n var f2 = seg2.footprint;\r\n var cf1 = f1.componentFootprint;\r\n var cf2 = f2.componentFootprint;\r\n var r1 = cf1.unzonedRange;\r\n var r2 = cf2.unzonedRange;\r\n return r1.startMs - r2.startMs || // earlier events go first\r\n (r2.endMs - r2.startMs) - (r1.endMs - r1.startMs) || // tie? longer events go first\r\n cf2.isAllDay - cf1.isAllDay || // tie? put all-day events first (booleans cast to 0/1)\r\n util_1.compareByFieldSpecs(f1.eventDef, f2.eventDef, this.view.eventOrderSpecs, f1.eventDef.miscProps, f2.eventDef.miscProps);\r\n };\r\n return EventRenderer;\r\n}());\r\nexports.default = EventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 43 */,\r\n/* 44 */,\r\n/* 45 */,\r\n/* 46 */,\r\n/* 47 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment_ext_1 = __webpack_require__(10);\r\n// Plugin\r\n// -------------------------------------------------------------------------------------------------\r\nmoment_ext_1.newMomentProto.format = function () {\r\n if (this._fullCalendar && arguments[0]) {\r\n return formatDate(this, arguments[0]); // our extended formatting\r\n }\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // moment.format() doesn't ensure english, but we want to.\r\n return moment_ext_1.oldMomentFormat(englishMoment(this));\r\n }\r\n return moment_ext_1.oldMomentProto.format.apply(this, arguments);\r\n};\r\nmoment_ext_1.newMomentProto.toISOString = function () {\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // depending on browser, moment might not output english. ensure english.\r\n // https://github.com/moment/moment/blob/2.18.1/src/lib/moment/format.js#L22\r\n return moment_ext_1.oldMomentProto.toISOString.apply(englishMoment(this), arguments);\r\n }\r\n return moment_ext_1.oldMomentProto.toISOString.apply(this, arguments);\r\n};\r\nfunction englishMoment(mom) {\r\n if (mom.locale() !== 'en') {\r\n return mom.clone().locale('en');\r\n }\r\n return mom;\r\n}\r\n// Config\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nInserted between chunks in the fake (\"intermediate\") formatting string.\r\nImportant that it passes as whitespace (\\s) because moment often identifies non-standalone months\r\nvia a regexp with an \\s.\r\n*/\r\nvar PART_SEPARATOR = '\\u000b'; // vertical tab\r\n/*\r\nInserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,\r\nbut rather, a \"special\" token that has custom rendering (see specialTokens map).\r\n*/\r\nvar SPECIAL_TOKEN_MARKER = '\\u001f'; // information separator 1\r\n/*\r\nInserted at the beginning and end of a span of text that must have non-zero numeric characters.\r\nHandling of these markers is done in a post-processing step at the very end of text rendering.\r\n*/\r\nvar MAYBE_MARKER = '\\u001e'; // information separator 2\r\nvar MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global\r\n/*\r\nAddition formatting tokens we want recognized\r\n*/\r\nvar specialTokens = {\r\n t: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'a').charAt(0);\r\n },\r\n T: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'A').charAt(0);\r\n }\r\n};\r\n/*\r\nThe first characters of formatting tokens for units that are 1 day or larger.\r\n`value` is for ranking relative size (lower means bigger).\r\n`unit` is a normalized unit, used for comparing moments.\r\n*/\r\nvar largeTokenMap = {\r\n Y: { value: 1, unit: 'year' },\r\n M: { value: 2, unit: 'month' },\r\n W: { value: 3, unit: 'week' },\r\n w: { value: 3, unit: 'week' },\r\n D: { value: 4, unit: 'day' },\r\n d: { value: 4, unit: 'day' } // day of week\r\n};\r\n// Single Date Formatting\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats `date` with a Moment formatting string, but allow our non-zero areas and special token\r\n*/\r\nfunction formatDate(date, formatStr) {\r\n return renderFakeFormatString(getParsedFormatString(formatStr).fakeFormatString, date);\r\n}\r\nexports.formatDate = formatDate;\r\n// Date Range Formatting\r\n// -------------------------------------------------------------------------------------------------\r\n// TODO: make it work with timezone offset\r\n/*\r\nUsing a formatting string meant for a single date, generate a range string, like\r\n\"Sep 2 - 9 2013\", that intelligently inserts a separator where the dates differ.\r\nIf the dates are the same as far as the format string is concerned, just return a single\r\nrendering of one date, without any separator.\r\n*/\r\nfunction formatRange(date1, date2, formatStr, separator, isRTL) {\r\n var localeData;\r\n date1 = moment_ext_1.default.parseZone(date1);\r\n date2 = moment_ext_1.default.parseZone(date2);\r\n localeData = date1.localeData();\r\n // Expand localized format strings, like \"LL\" -> \"MMMM D YYYY\".\r\n // BTW, this is not important for `formatDate` because it is impossible to put custom tokens\r\n // or non-zero areas in Moment's localized format strings.\r\n formatStr = localeData.longDateFormat(formatStr) || formatStr;\r\n return renderParsedFormat(getParsedFormatString(formatStr), date1, date2, separator || ' - ', isRTL);\r\n}\r\nexports.formatRange = formatRange;\r\n/*\r\nRenders a range with an already-parsed format string.\r\n*/\r\nfunction renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {\r\n var sameUnits = parsedFormat.sameUnits;\r\n var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons\r\n var unzonedDate2 = date2.clone().stripZone(); // \"\r\n var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);\r\n var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);\r\n var leftI;\r\n var leftStr = '';\r\n var rightI;\r\n var rightStr = '';\r\n var middleI;\r\n var middleStr1 = '';\r\n var middleStr2 = '';\r\n var middleStr = '';\r\n // Start at the leftmost side of the formatting string and continue until you hit a token\r\n // that is not the same between dates.\r\n for (leftI = 0; leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI])); leftI++) {\r\n leftStr += renderedParts1[leftI];\r\n }\r\n // Similarly, start at the rightmost side of the formatting string and move left\r\n for (rightI = sameUnits.length - 1; rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI])); rightI--) {\r\n // If current chunk is on the boundary of unique date-content, and is a special-case\r\n // date-formatting postfix character, then don't consume it. Consider it unique date-content.\r\n // TODO: make configurable\r\n if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {\r\n break;\r\n }\r\n rightStr = renderedParts1[rightI] + rightStr;\r\n }\r\n // The area in the middle is different for both of the dates.\r\n // Collect them distinctly so we can jam them together later.\r\n for (middleI = leftI; middleI <= rightI; middleI++) {\r\n middleStr1 += renderedParts1[middleI];\r\n middleStr2 += renderedParts2[middleI];\r\n }\r\n if (middleStr1 || middleStr2) {\r\n if (isRTL) {\r\n middleStr = middleStr2 + separator + middleStr1;\r\n }\r\n else {\r\n middleStr = middleStr1 + separator + middleStr2;\r\n }\r\n }\r\n return processMaybeMarkers(leftStr + middleStr + rightStr);\r\n}\r\n// Format String Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nvar parsedFormatStrCache = {};\r\n/*\r\nReturns a parsed format string, leveraging a cache.\r\n*/\r\nfunction getParsedFormatString(formatStr) {\r\n return parsedFormatStrCache[formatStr] ||\r\n (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));\r\n}\r\n/*\r\nParses a format string into the following:\r\n- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.\r\n- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like \"day\"),\r\n that indicates how similar a range's start & end must be in order to share the same formatted text.\r\n If not a token, then the value is null.\r\n Always a flat array (not nested liked \"chunks\").\r\n*/\r\nfunction parseFormatString(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n return {\r\n fakeFormatString: buildFakeFormatString(chunks),\r\n sameUnits: buildSameUnits(chunks)\r\n };\r\n}\r\n/*\r\nBreak the formatting string into an array of chunks.\r\nA 'maybe' chunk will have nested chunks.\r\n*/\r\nfunction chunkFormatString(formatStr) {\r\n var chunks = [];\r\n var match;\r\n // TODO: more descrimination\r\n // \\4 is a backreference to the first character of a multi-character set.\r\n var chunker = /\\[([^\\]]*)\\]|\\(([^\\)]*)\\)|(LTS|LT|(\\w)\\4*o?)|([^\\w\\[\\(]+)/g;\r\n while ((match = chunker.exec(formatStr))) {\r\n if (match[1]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[1]));\r\n }\r\n else if (match[2]) {\r\n chunks.push({ maybe: chunkFormatString(match[2]) });\r\n }\r\n else if (match[3]) {\r\n chunks.push({ token: match[3] });\r\n }\r\n else if (match[5]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[5]));\r\n }\r\n }\r\n return chunks;\r\n}\r\n/*\r\nPotentially splits a literal-text string into multiple parts. For special cases.\r\n*/\r\nfunction splitStringLiteral(s) {\r\n if (s === '. ') {\r\n return ['.', ' ']; // for locales with periods bound to the end of each year/month/date\r\n }\r\n else {\r\n return [s];\r\n }\r\n}\r\n/*\r\nGiven chunks parsed from a real format string, generate a fake (aka \"intermediate\") format string with special control\r\ncharacters that will eventually be given to moment for formatting, and then post-processed.\r\n*/\r\nfunction buildFakeFormatString(chunks) {\r\n var parts = [];\r\n var i;\r\n var chunk;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (typeof chunk === 'string') {\r\n parts.push('[' + chunk + ']');\r\n }\r\n else if (chunk.token) {\r\n if (chunk.token in specialTokens) {\r\n parts.push(SPECIAL_TOKEN_MARKER + // useful during post-processing\r\n '[' + chunk.token + ']' // preserve as literal text\r\n );\r\n }\r\n else {\r\n parts.push(chunk.token); // unprotected text implies a format string\r\n }\r\n }\r\n else if (chunk.maybe) {\r\n parts.push(MAYBE_MARKER + // useful during post-processing\r\n buildFakeFormatString(chunk.maybe) +\r\n MAYBE_MARKER);\r\n }\r\n }\r\n return parts.join(PART_SEPARATOR);\r\n}\r\n/*\r\nGiven parsed chunks from a real formatting string, generates an array of unit strings (like \"day\") that indicate\r\nin which regard two dates must be similar in order to share range formatting text.\r\nThe `chunks` can be nested (because of \"maybe\" chunks), however, the returned array will be flat.\r\n*/\r\nfunction buildSameUnits(chunks) {\r\n var units = [];\r\n var i;\r\n var chunk;\r\n var tokenInfo;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n tokenInfo = largeTokenMap[chunk.token.charAt(0)];\r\n units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second\r\n }\r\n else if (chunk.maybe) {\r\n units.push.apply(units, // append\r\n buildSameUnits(chunk.maybe));\r\n }\r\n else {\r\n units.push(null);\r\n }\r\n }\r\n return units;\r\n}\r\n// Rendering to text\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats a date with a fake format string, post-processes the control characters, then returns.\r\n*/\r\nfunction renderFakeFormatString(fakeFormatString, date) {\r\n return processMaybeMarkers(renderFakeFormatStringParts(fakeFormatString, date).join(''));\r\n}\r\n/*\r\nFormats a date into parts that will have been post-processed, EXCEPT for the \"maybe\" markers.\r\n*/\r\nfunction renderFakeFormatStringParts(fakeFormatString, date) {\r\n var parts = [];\r\n var fakeRender = moment_ext_1.oldMomentFormat(date, fakeFormatString);\r\n var fakeParts = fakeRender.split(PART_SEPARATOR);\r\n var i;\r\n var fakePart;\r\n for (i = 0; i < fakeParts.length; i++) {\r\n fakePart = fakeParts[i];\r\n if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {\r\n parts.push(\r\n // the literal string IS the token's name.\r\n // call special token's registered function.\r\n specialTokens[fakePart.substring(1)](date));\r\n }\r\n else {\r\n parts.push(fakePart);\r\n }\r\n }\r\n return parts;\r\n}\r\n/*\r\nAccepts an almost-finally-formatted string and processes the \"maybe\" control characters, returning a new string.\r\n*/\r\nfunction processMaybeMarkers(s) {\r\n return s.replace(MAYBE_REGEXP, function (m0, m1) {\r\n if (m1.match(/[1-9]/)) {\r\n return m1;\r\n }\r\n else {\r\n return '';\r\n }\r\n });\r\n}\r\n// Misc Utils\r\n// -------------------------------------------------------------------------------------------------\r\n/*\r\nReturns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.\r\n*/\r\nfunction queryMostGranularFormatUnit(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n var i;\r\n var chunk;\r\n var candidate;\r\n var best;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n candidate = largeTokenMap[chunk.token.charAt(0)];\r\n if (candidate) {\r\n if (!best || candidate.value > best.value) {\r\n best = candidate;\r\n }\r\n }\r\n }\r\n }\r\n if (best) {\r\n return best.unit;\r\n }\r\n return null;\r\n}\r\nexports.queryMostGranularFormatUnit = queryMostGranularFormatUnit;\r\n\r\n\r\n/***/ }),\r\n/* 48 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Model = /** @class */ (function (_super) {\r\n tslib_1.__extends(Model, _super);\r\n function Model() {\r\n var _this = _super.call(this) || this;\r\n _this._watchers = {};\r\n _this._props = {};\r\n _this.applyGlobalWatchers();\r\n _this.constructed();\r\n return _this;\r\n }\r\n Model.watch = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // subclasses should make a masked-copy of the superclass's map\r\n // TODO: write test\r\n if (!this.prototype.hasOwnProperty('_globalWatchArgs')) {\r\n this.prototype._globalWatchArgs = Object.create(this.prototype._globalWatchArgs);\r\n }\r\n this.prototype._globalWatchArgs[name] = args;\r\n };\r\n Model.prototype.constructed = function () {\r\n // useful for monkeypatching. TODO: BaseClass?\r\n };\r\n Model.prototype.applyGlobalWatchers = function () {\r\n var map = this._globalWatchArgs;\r\n var name;\r\n for (name in map) {\r\n this.watch.apply(this, [name].concat(map[name]));\r\n }\r\n };\r\n Model.prototype.has = function (name) {\r\n return name in this._props;\r\n };\r\n Model.prototype.get = function (name) {\r\n if (name === undefined) {\r\n return this._props;\r\n }\r\n return this._props[name];\r\n };\r\n Model.prototype.set = function (name, val) {\r\n var newProps;\r\n if (typeof name === 'string') {\r\n newProps = {};\r\n newProps[name] = val === undefined ? null : val;\r\n }\r\n else {\r\n newProps = name;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.reset = function (newProps) {\r\n var oldProps = this._props;\r\n var changeset = {}; // will have undefined's to signal unsets\r\n var name;\r\n for (name in oldProps) {\r\n changeset[name] = undefined;\r\n }\r\n for (name in newProps) {\r\n changeset[name] = newProps[name];\r\n }\r\n this.setProps(changeset);\r\n };\r\n Model.prototype.unset = function (name) {\r\n var newProps = {};\r\n var names;\r\n var i;\r\n if (typeof name === 'string') {\r\n names = [name];\r\n }\r\n else {\r\n names = name;\r\n }\r\n for (i = 0; i < names.length; i++) {\r\n newProps[names[i]] = undefined;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.setProps = function (newProps) {\r\n var changedProps = {};\r\n var changedCnt = 0;\r\n var name;\r\n var val;\r\n for (name in newProps) {\r\n val = newProps[name];\r\n // a change in value?\r\n // if an object, don't check equality, because might have been mutated internally.\r\n // TODO: eventually enforce immutability.\r\n if (typeof val === 'object' ||\r\n val !== this._props[name]) {\r\n changedProps[name] = val;\r\n changedCnt++;\r\n }\r\n }\r\n if (changedCnt) {\r\n this.trigger('before:batchChange', changedProps);\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n this.trigger('before:change', name, val);\r\n this.trigger('before:change:' + name, val);\r\n }\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n if (val === undefined) {\r\n delete this._props[name];\r\n }\r\n else {\r\n this._props[name] = val;\r\n }\r\n this.trigger('change:' + name, val);\r\n this.trigger('change', name, val);\r\n }\r\n this.trigger('batchChange', changedProps);\r\n }\r\n };\r\n Model.prototype.watch = function (name, depList, startFunc, stopFunc) {\r\n var _this = this;\r\n this.unwatch(name);\r\n this._watchers[name] = this._watchDeps(depList, function (deps) {\r\n var res = startFunc.call(_this, deps);\r\n if (res && res.then) {\r\n _this.unset(name); // put in an unset state while resolving\r\n res.then(function (val) {\r\n _this.set(name, val);\r\n });\r\n }\r\n else {\r\n _this.set(name, res);\r\n }\r\n }, function (deps) {\r\n _this.unset(name);\r\n if (stopFunc) {\r\n stopFunc.call(_this, deps);\r\n }\r\n });\r\n };\r\n Model.prototype.unwatch = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n delete this._watchers[name];\r\n watcher.teardown();\r\n }\r\n };\r\n Model.prototype._watchDeps = function (depList, startFunc, stopFunc) {\r\n var _this = this;\r\n var queuedChangeCnt = 0;\r\n var depCnt = depList.length;\r\n var satisfyCnt = 0;\r\n var values = {}; // what's passed as the `deps` arguments\r\n var bindTuples = []; // array of [ eventName, handlerFunc ] arrays\r\n var isCallingStop = false;\r\n var onBeforeDepChange = function (depName, val, isOptional) {\r\n queuedChangeCnt++;\r\n if (queuedChangeCnt === 1) {\r\n if (satisfyCnt === depCnt) {\r\n isCallingStop = true;\r\n stopFunc(values);\r\n isCallingStop = false;\r\n }\r\n }\r\n };\r\n var onDepChange = function (depName, val, isOptional) {\r\n if (val === undefined) {\r\n // required dependency that was previously set?\r\n if (!isOptional && values[depName] !== undefined) {\r\n satisfyCnt--;\r\n }\r\n delete values[depName];\r\n }\r\n else {\r\n // required dependency that was previously unset?\r\n if (!isOptional && values[depName] === undefined) {\r\n satisfyCnt++;\r\n }\r\n values[depName] = val;\r\n }\r\n queuedChangeCnt--;\r\n if (!queuedChangeCnt) {\r\n // now finally satisfied or satisfied all along?\r\n if (satisfyCnt === depCnt) {\r\n // if the stopFunc initiated another value change, ignore it.\r\n // it will be processed by another change event anyway.\r\n if (!isCallingStop) {\r\n startFunc(values);\r\n }\r\n }\r\n }\r\n };\r\n // intercept for .on() that remembers handlers\r\n var bind = function (eventName, handler) {\r\n _this.on(eventName, handler);\r\n bindTuples.push([eventName, handler]);\r\n };\r\n // listen to dependency changes\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n bind('before:change:' + depName, function (val) {\r\n onBeforeDepChange(depName, val, isOptional);\r\n });\r\n bind('change:' + depName, function (val) {\r\n onDepChange(depName, val, isOptional);\r\n });\r\n });\r\n // process current dependency values\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n if (_this.has(depName)) {\r\n values[depName] = _this.get(depName);\r\n satisfyCnt++;\r\n }\r\n else if (isOptional) {\r\n satisfyCnt++;\r\n }\r\n });\r\n // initially satisfied\r\n if (satisfyCnt === depCnt) {\r\n startFunc(values);\r\n }\r\n return {\r\n teardown: function () {\r\n // remove all handlers\r\n for (var i = 0; i < bindTuples.length; i++) {\r\n _this.off(bindTuples[i][0], bindTuples[i][1]);\r\n }\r\n bindTuples = null;\r\n // was satisfied, so call stopFunc\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n }\r\n },\r\n flash: function () {\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n startFunc(values);\r\n }\r\n }\r\n };\r\n };\r\n Model.prototype.flash = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n watcher.flash();\r\n }\r\n };\r\n return Model;\r\n}(Class_1.default));\r\nexports.default = Model;\r\nModel.prototype._globalWatchArgs = {}; // mutation protection in Model.watch\r\nEmitterMixin_1.default.mixInto(Model);\r\nListenerMixin_1.default.mixInto(Model);\r\n\r\n\r\n/***/ }),\r\n/* 49 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nexports.default = {\r\n parse: function (eventInput, source) {\r\n if (util_1.isTimeString(eventInput.start) || moment.isDuration(eventInput.start) ||\r\n util_1.isTimeString(eventInput.end) || moment.isDuration(eventInput.end)) {\r\n return RecurringEventDef_1.default.parse(eventInput, source);\r\n }\r\n else {\r\n return SingleEventDef_1.default.parse(eventInput, source);\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 50 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDefDateMutation = /** @class */ (function () {\r\n function EventDefDateMutation() {\r\n this.clearEnd = false;\r\n this.forceTimed = false;\r\n this.forceAllDay = false;\r\n }\r\n EventDefDateMutation.createFromDiff = function (dateProfile0, dateProfile1, largeUnit) {\r\n var clearEnd = dateProfile0.end && !dateProfile1.end;\r\n var forceTimed = dateProfile0.isAllDay() && !dateProfile1.isAllDay();\r\n var forceAllDay = !dateProfile0.isAllDay() && dateProfile1.isAllDay();\r\n var dateDelta;\r\n var endDiff;\r\n var endDelta;\r\n var mutation;\r\n // subtracts the dates in the appropriate way, returning a duration\r\n function subtractDates(date1, date0) {\r\n if (largeUnit) {\r\n return util_1.diffByUnit(date1, date0, largeUnit); // poorly named\r\n }\r\n else if (dateProfile1.isAllDay()) {\r\n return util_1.diffDay(date1, date0); // poorly named\r\n }\r\n else {\r\n return util_1.diffDayTime(date1, date0); // poorly named\r\n }\r\n }\r\n dateDelta = subtractDates(dateProfile1.start, dateProfile0.start);\r\n if (dateProfile1.end) {\r\n // use unzonedRanges because dateProfile0.end might be null\r\n endDiff = subtractDates(dateProfile1.unzonedRange.getEnd(), dateProfile0.unzonedRange.getEnd());\r\n endDelta = endDiff.subtract(dateDelta);\r\n }\r\n mutation = new EventDefDateMutation();\r\n mutation.clearEnd = clearEnd;\r\n mutation.forceTimed = forceTimed;\r\n mutation.forceAllDay = forceAllDay;\r\n mutation.setDateDelta(dateDelta);\r\n mutation.setEndDelta(endDelta);\r\n return mutation;\r\n };\r\n /*\r\n returns an undo function.\r\n */\r\n EventDefDateMutation.prototype.buildNewDateProfile = function (eventDateProfile, calendar) {\r\n var start = eventDateProfile.start.clone();\r\n var end = null;\r\n var shouldRezone = false;\r\n if (eventDateProfile.end && !this.clearEnd) {\r\n end = eventDateProfile.end.clone();\r\n }\r\n else if (this.endDelta && !end) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n if (this.forceTimed) {\r\n shouldRezone = true;\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n else if (this.forceAllDay) {\r\n if (start.hasTime()) {\r\n start.stripTime();\r\n }\r\n if (end && end.hasTime()) {\r\n end.stripTime();\r\n }\r\n }\r\n if (this.dateDelta) {\r\n shouldRezone = true;\r\n start.add(this.dateDelta);\r\n if (end) {\r\n end.add(this.dateDelta);\r\n }\r\n }\r\n // do this before adding startDelta to start, so we can work off of start\r\n if (this.endDelta) {\r\n shouldRezone = true;\r\n end.add(this.endDelta);\r\n }\r\n if (this.startDelta) {\r\n shouldRezone = true;\r\n start.add(this.startDelta);\r\n }\r\n if (shouldRezone) {\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n }\r\n // TODO: okay to access calendar option?\r\n if (!end && calendar.opt('forceEventDuration')) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n return new EventDateProfile_1.default(start, end, calendar);\r\n };\r\n EventDefDateMutation.prototype.setDateDelta = function (dateDelta) {\r\n if (dateDelta && dateDelta.valueOf()) {\r\n this.dateDelta = dateDelta;\r\n }\r\n else {\r\n this.dateDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setStartDelta = function (startDelta) {\r\n if (startDelta && startDelta.valueOf()) {\r\n this.startDelta = startDelta;\r\n }\r\n else {\r\n this.startDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setEndDelta = function (endDelta) {\r\n if (endDelta && endDelta.valueOf()) {\r\n this.endDelta = endDelta;\r\n }\r\n else {\r\n this.endDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.isEmpty = function () {\r\n return !this.clearEnd && !this.forceTimed && !this.forceAllDay &&\r\n !this.dateDelta && !this.startDelta && !this.endDelta;\r\n };\r\n return EventDefDateMutation;\r\n}());\r\nexports.default = EventDefDateMutation;\r\n\r\n\r\n/***/ }),\r\n/* 51 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar themeClassHash = {};\r\nfunction defineThemeSystem(themeName, themeClass) {\r\n themeClassHash[themeName] = themeClass;\r\n}\r\nexports.defineThemeSystem = defineThemeSystem;\r\nfunction getThemeSystemClass(themeSetting) {\r\n if (!themeSetting) {\r\n return StandardTheme_1.default;\r\n }\r\n else if (themeSetting === true) {\r\n return JqueryUiTheme_1.default;\r\n }\r\n else {\r\n return themeClassHash[themeSetting];\r\n }\r\n}\r\nexports.getThemeSystemClass = getThemeSystemClass;\r\n\r\n\r\n/***/ }),\r\n/* 52 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar ArrayEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(ArrayEventSource, _super);\r\n function ArrayEventSource(calendar) {\r\n var _this = _super.call(this, calendar) || this;\r\n _this.eventDefs = []; // for if setRawEventDefs is never called\r\n return _this;\r\n }\r\n ArrayEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isArray(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isArray(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n ArrayEventSource.prototype.setRawEventDefs = function (rawEventDefs) {\r\n this.rawEventDefs = rawEventDefs;\r\n this.eventDefs = this.parseEventDefs(rawEventDefs);\r\n };\r\n ArrayEventSource.prototype.fetch = function (start, end, timezone) {\r\n var eventDefs = this.eventDefs;\r\n var i;\r\n if (this.currentTimezone != null &&\r\n this.currentTimezone !== timezone) {\r\n for (i = 0; i < eventDefs.length; i++) {\r\n if (eventDefs[i] instanceof SingleEventDef_1.default) {\r\n eventDefs[i].rezone();\r\n }\r\n }\r\n }\r\n this.currentTimezone = timezone;\r\n return Promise_1.default.resolve(eventDefs);\r\n };\r\n ArrayEventSource.prototype.addEventDef = function (eventDef) {\r\n this.eventDefs.push(eventDef);\r\n };\r\n /*\r\n eventDefId already normalized to a string\r\n */\r\n ArrayEventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n return util_1.removeMatching(this.eventDefs, function (eventDef) {\r\n return eventDef.id === eventDefId;\r\n });\r\n };\r\n ArrayEventSource.prototype.removeAllEventDefs = function () {\r\n this.eventDefs = [];\r\n };\r\n ArrayEventSource.prototype.getPrimitive = function () {\r\n return this.rawEventDefs;\r\n };\r\n ArrayEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.setRawEventDefs(rawProps.events);\r\n return superSuccess;\r\n };\r\n return ArrayEventSource;\r\n}(EventSource_1.default));\r\nexports.default = ArrayEventSource;\r\nArrayEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 53 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/*\r\nA cache for the left/right/top/bottom/width/height values for one or more elements.\r\nWorks with both offset (from topleft document) and position (from offsetParent).\r\n\r\noptions:\r\n- els\r\n- isHorizontal\r\n- isVertical\r\n*/\r\nvar CoordCache = /** @class */ (function () {\r\n function CoordCache(options) {\r\n this.isHorizontal = false; // whether to query for left/right/width\r\n this.isVertical = false; // whether to query for top/bottom/height\r\n this.els = $(options.els);\r\n this.isHorizontal = options.isHorizontal;\r\n this.isVertical = options.isVertical;\r\n this.forcedOffsetParentEl = options.offsetParent ? $(options.offsetParent) : null;\r\n }\r\n // Queries the els for coordinates and stores them.\r\n // Call this method before using and of the get* methods below.\r\n CoordCache.prototype.build = function () {\r\n var offsetParentEl = this.forcedOffsetParentEl;\r\n if (!offsetParentEl && this.els.length > 0) {\r\n offsetParentEl = this.els.eq(0).offsetParent();\r\n }\r\n this.origin = offsetParentEl ?\r\n offsetParentEl.offset() :\r\n null;\r\n this.boundingRect = this.queryBoundingRect();\r\n if (this.isHorizontal) {\r\n this.buildElHorizontals();\r\n }\r\n if (this.isVertical) {\r\n this.buildElVerticals();\r\n }\r\n };\r\n // Destroys all internal data about coordinates, freeing memory\r\n CoordCache.prototype.clear = function () {\r\n this.origin = null;\r\n this.boundingRect = null;\r\n this.lefts = null;\r\n this.rights = null;\r\n this.tops = null;\r\n this.bottoms = null;\r\n };\r\n // When called, if coord caches aren't built, builds them\r\n CoordCache.prototype.ensureBuilt = function () {\r\n if (!this.origin) {\r\n this.build();\r\n }\r\n };\r\n // Populates the left/right internal coordinate arrays\r\n CoordCache.prototype.buildElHorizontals = function () {\r\n var lefts = [];\r\n var rights = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var left = el.offset().left;\r\n var width = el.outerWidth();\r\n lefts.push(left);\r\n rights.push(left + width);\r\n });\r\n this.lefts = lefts;\r\n this.rights = rights;\r\n };\r\n // Populates the top/bottom internal coordinate arrays\r\n CoordCache.prototype.buildElVerticals = function () {\r\n var tops = [];\r\n var bottoms = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var top = el.offset().top;\r\n var height = el.outerHeight();\r\n tops.push(top);\r\n bottoms.push(top + height);\r\n });\r\n this.tops = tops;\r\n this.bottoms = bottoms;\r\n };\r\n // Given a left offset (from document left), returns the index of the el that it horizontally intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getHorizontalIndex = function (leftOffset) {\r\n this.ensureBuilt();\r\n var lefts = this.lefts;\r\n var rights = this.rights;\r\n var len = lefts.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (leftOffset >= lefts[i] && leftOffset < rights[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Given a top offset (from document top), returns the index of the el that it vertically intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getVerticalIndex = function (topOffset) {\r\n this.ensureBuilt();\r\n var tops = this.tops;\r\n var bottoms = this.bottoms;\r\n var len = tops.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (topOffset >= tops[i] && topOffset < bottoms[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Gets the left offset (from document left) of the element at the given index\r\n CoordCache.prototype.getLeftOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex];\r\n };\r\n // Gets the left position (from offsetParent left) of the element at the given index\r\n CoordCache.prototype.getLeftPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex] - this.origin.left;\r\n };\r\n // Gets the right offset (from document left) of the element at the given index.\r\n // This value is NOT relative to the document's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex];\r\n };\r\n // Gets the right position (from offsetParent left) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.origin.left;\r\n };\r\n // Gets the width of the element at the given index\r\n CoordCache.prototype.getWidth = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.lefts[leftIndex];\r\n };\r\n // Gets the top offset (from document top) of the element at the given index\r\n CoordCache.prototype.getTopOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex];\r\n };\r\n // Gets the top position (from offsetParent top) of the element at the given position\r\n CoordCache.prototype.getTopPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex] - this.origin.top;\r\n };\r\n // Gets the bottom offset (from the document top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex];\r\n };\r\n // Gets the bottom position (from the offsetParent top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.origin.top;\r\n };\r\n // Gets the height of the element at the given index\r\n CoordCache.prototype.getHeight = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.tops[topIndex];\r\n };\r\n // Bounding Rect\r\n // TODO: decouple this from CoordCache\r\n // Compute and return what the elements' bounding rectangle is, from the user's perspective.\r\n // Right now, only returns a rectangle if constrained by an overflow:scroll element.\r\n // Returns null if there are no elements\r\n CoordCache.prototype.queryBoundingRect = function () {\r\n var scrollParentEl;\r\n if (this.els.length > 0) {\r\n scrollParentEl = util_1.getScrollParent(this.els.eq(0));\r\n if (!scrollParentEl.is(document)) {\r\n return util_1.getClientRect(scrollParentEl);\r\n }\r\n }\r\n return null;\r\n };\r\n CoordCache.prototype.isPointInBounds = function (leftOffset, topOffset) {\r\n return this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);\r\n };\r\n CoordCache.prototype.isLeftInBounds = function (leftOffset) {\r\n return !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);\r\n };\r\n CoordCache.prototype.isTopInBounds = function (topOffset) {\r\n return !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);\r\n };\r\n return CoordCache;\r\n}());\r\nexports.default = CoordCache;\r\n\r\n\r\n/***/ }),\r\n/* 54 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\n/* Tracks a drag's mouse movement, firing various handlers\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// TODO: use Emitter\r\nvar DragListener = /** @class */ (function () {\r\n function DragListener(options) {\r\n this.isInteracting = false;\r\n this.isDistanceSurpassed = false;\r\n this.isDelayEnded = false;\r\n this.isDragging = false;\r\n this.isTouch = false;\r\n this.isGeneric = false; // initiated by 'dragstart' (jqui)\r\n this.shouldCancelTouchScroll = true;\r\n this.scrollAlwaysKills = false;\r\n this.isAutoScroll = false;\r\n // defaults\r\n this.scrollSensitivity = 30; // pixels from edge for scrolling to start\r\n this.scrollSpeed = 200; // pixels per second, at maximum speed\r\n this.scrollIntervalMs = 50; // millisecond wait between scroll increment\r\n this.options = options || {};\r\n }\r\n // Interaction (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startInteraction = function (ev, extraOptions) {\r\n if (extraOptions === void 0) { extraOptions = {}; }\r\n if (ev.type === 'mousedown') {\r\n if (GlobalEmitter_1.default.get().shouldIgnoreMouse()) {\r\n return;\r\n }\r\n else if (!util_1.isPrimaryMouseButton(ev)) {\r\n return;\r\n }\r\n else {\r\n ev.preventDefault(); // prevents native selection in most browsers\r\n }\r\n }\r\n if (!this.isInteracting) {\r\n // process options\r\n this.delay = util_1.firstDefined(extraOptions.delay, this.options.delay, 0);\r\n this.minDistance = util_1.firstDefined(extraOptions.distance, this.options.distance, 0);\r\n this.subjectEl = this.options.subjectEl;\r\n util_1.preventSelection($('body'));\r\n this.isInteracting = true;\r\n this.isTouch = util_1.getEvIsTouch(ev);\r\n this.isGeneric = ev.type === 'dragstart';\r\n this.isDelayEnded = false;\r\n this.isDistanceSurpassed = false;\r\n this.originX = util_1.getEvX(ev);\r\n this.originY = util_1.getEvY(ev);\r\n this.scrollEl = util_1.getScrollParent($(ev.target));\r\n this.bindHandlers();\r\n this.initAutoScroll();\r\n this.handleInteractionStart(ev);\r\n this.startDelay(ev);\r\n if (!this.minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n };\r\n DragListener.prototype.handleInteractionStart = function (ev) {\r\n this.trigger('interactionStart', ev);\r\n };\r\n DragListener.prototype.endInteraction = function (ev, isCancelled) {\r\n if (this.isInteracting) {\r\n this.endDrag(ev);\r\n if (this.delayTimeoutId) {\r\n clearTimeout(this.delayTimeoutId);\r\n this.delayTimeoutId = null;\r\n }\r\n this.destroyAutoScroll();\r\n this.unbindHandlers();\r\n this.isInteracting = false;\r\n this.handleInteractionEnd(ev, isCancelled);\r\n util_1.allowSelection($('body'));\r\n }\r\n };\r\n DragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n this.trigger('interactionEnd', ev, isCancelled || false);\r\n };\r\n // Binding To DOM\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.bindHandlers = function () {\r\n // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,\r\n // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.\r\n var globalEmitter = GlobalEmitter_1.default.get();\r\n if (this.isGeneric) {\r\n this.listenTo($(document), {\r\n drag: this.handleMove,\r\n dragstop: this.endInteraction\r\n });\r\n }\r\n else if (this.isTouch) {\r\n this.listenTo(globalEmitter, {\r\n touchmove: this.handleTouchMove,\r\n touchend: this.endInteraction,\r\n scroll: this.handleTouchScroll\r\n });\r\n }\r\n else {\r\n this.listenTo(globalEmitter, {\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.endInteraction\r\n });\r\n }\r\n this.listenTo(globalEmitter, {\r\n selectstart: util_1.preventDefault,\r\n contextmenu: util_1.preventDefault // long taps would open menu on Chrome dev tools\r\n });\r\n };\r\n DragListener.prototype.unbindHandlers = function () {\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n this.stopListeningTo($(document)); // for isGeneric\r\n };\r\n // Drag (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // extraOptions ignored if drag already started\r\n DragListener.prototype.startDrag = function (ev, extraOptions) {\r\n this.startInteraction(ev, extraOptions); // ensure interaction began\r\n if (!this.isDragging) {\r\n this.isDragging = true;\r\n this.handleDragStart(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragStart = function (ev) {\r\n this.trigger('dragStart', ev);\r\n };\r\n DragListener.prototype.handleMove = function (ev) {\r\n var dx = util_1.getEvX(ev) - this.originX;\r\n var dy = util_1.getEvY(ev) - this.originY;\r\n var minDistance = this.minDistance;\r\n var distanceSq; // current distance from the origin, squared\r\n if (!this.isDistanceSurpassed) {\r\n distanceSq = dx * dx + dy * dy;\r\n if (distanceSq >= minDistance * minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n if (this.isDragging) {\r\n this.handleDrag(dx, dy, ev);\r\n }\r\n };\r\n // Called while the mouse is being moved and when we know a legitimate drag is taking place\r\n DragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n this.trigger('drag', dx, dy, ev);\r\n this.updateAutoScroll(ev); // will possibly cause scrolling\r\n };\r\n DragListener.prototype.endDrag = function (ev) {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.handleDragEnd(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragEnd = function (ev) {\r\n this.trigger('dragEnd', ev);\r\n };\r\n // Delay\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startDelay = function (initialEv) {\r\n var _this = this;\r\n if (this.delay) {\r\n this.delayTimeoutId = setTimeout(function () {\r\n _this.handleDelayEnd(initialEv);\r\n }, this.delay);\r\n }\r\n else {\r\n this.handleDelayEnd(initialEv);\r\n }\r\n };\r\n DragListener.prototype.handleDelayEnd = function (initialEv) {\r\n this.isDelayEnded = true;\r\n if (this.isDistanceSurpassed) {\r\n this.startDrag(initialEv);\r\n }\r\n };\r\n // Distance\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleDistanceSurpassed = function (ev) {\r\n this.isDistanceSurpassed = true;\r\n if (this.isDelayEnded) {\r\n this.startDrag(ev);\r\n }\r\n };\r\n // Mouse / Touch\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchMove = function (ev) {\r\n // prevent inertia and touchmove-scrolling while dragging\r\n if (this.isDragging && this.shouldCancelTouchScroll) {\r\n ev.preventDefault();\r\n }\r\n this.handleMove(ev);\r\n };\r\n DragListener.prototype.handleMouseMove = function (ev) {\r\n this.handleMove(ev);\r\n };\r\n // Scrolling (unrelated to auto-scroll)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchScroll = function (ev) {\r\n // if the drag is being initiated by touch, but a scroll happens before\r\n // the drag-initiating delay is over, cancel the drag\r\n if (!this.isDragging || this.scrollAlwaysKills) {\r\n this.endInteraction(ev, true); // isCancelled=true\r\n }\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n DragListener.prototype.trigger = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n if (this.options[name]) {\r\n this.options[name].apply(this, args);\r\n }\r\n // makes _methods callable by event name. TODO: kill this\r\n if (this['_' + name]) {\r\n this['_' + name].apply(this, args);\r\n }\r\n };\r\n // Auto-scroll\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.initAutoScroll = function () {\r\n var scrollEl = this.scrollEl;\r\n this.isAutoScroll =\r\n this.options.scroll &&\r\n scrollEl &&\r\n !scrollEl.is(window) &&\r\n !scrollEl.is(document);\r\n if (this.isAutoScroll) {\r\n // debounce makes sure rapid calls don't happen\r\n this.listenTo(scrollEl, 'scroll', util_1.debounce(this.handleDebouncedScroll, 100));\r\n }\r\n };\r\n DragListener.prototype.destroyAutoScroll = function () {\r\n this.endAutoScroll(); // kill any animation loop\r\n // remove the scroll handler if there is a scrollEl\r\n if (this.isAutoScroll) {\r\n this.stopListeningTo(this.scrollEl, 'scroll'); // will probably get removed by unbindHandlers too :(\r\n }\r\n };\r\n // Computes and stores the bounding rectangle of scrollEl\r\n DragListener.prototype.computeScrollBounds = function () {\r\n if (this.isAutoScroll) {\r\n this.scrollBounds = util_1.getOuterRect(this.scrollEl);\r\n // TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars\r\n }\r\n };\r\n // Called when the dragging is in progress and scrolling should be updated\r\n DragListener.prototype.updateAutoScroll = function (ev) {\r\n var sensitivity = this.scrollSensitivity;\r\n var bounds = this.scrollBounds;\r\n var topCloseness;\r\n var bottomCloseness;\r\n var leftCloseness;\r\n var rightCloseness;\r\n var topVel = 0;\r\n var leftVel = 0;\r\n if (bounds) {\r\n // compute closeness to edges. valid range is from 0.0 - 1.0\r\n topCloseness = (sensitivity - (util_1.getEvY(ev) - bounds.top)) / sensitivity;\r\n bottomCloseness = (sensitivity - (bounds.bottom - util_1.getEvY(ev))) / sensitivity;\r\n leftCloseness = (sensitivity - (util_1.getEvX(ev) - bounds.left)) / sensitivity;\r\n rightCloseness = (sensitivity - (bounds.right - util_1.getEvX(ev))) / sensitivity;\r\n // translate vertical closeness into velocity.\r\n // mouse must be completely in bounds for velocity to happen.\r\n if (topCloseness >= 0 && topCloseness <= 1) {\r\n topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up\r\n }\r\n else if (bottomCloseness >= 0 && bottomCloseness <= 1) {\r\n topVel = bottomCloseness * this.scrollSpeed;\r\n }\r\n // translate horizontal closeness into velocity\r\n if (leftCloseness >= 0 && leftCloseness <= 1) {\r\n leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left\r\n }\r\n else if (rightCloseness >= 0 && rightCloseness <= 1) {\r\n leftVel = rightCloseness * this.scrollSpeed;\r\n }\r\n }\r\n this.setScrollVel(topVel, leftVel);\r\n };\r\n // Sets the speed-of-scrolling for the scrollEl\r\n DragListener.prototype.setScrollVel = function (topVel, leftVel) {\r\n this.scrollTopVel = topVel;\r\n this.scrollLeftVel = leftVel;\r\n this.constrainScrollVel(); // massages into realistic values\r\n // if there is non-zero velocity, and an animation loop hasn't already started, then START\r\n if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {\r\n this.scrollIntervalId = setInterval(util_1.proxy(this, 'scrollIntervalFunc'), // scope to `this`\r\n this.scrollIntervalMs);\r\n }\r\n };\r\n // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way\r\n DragListener.prototype.constrainScrollVel = function () {\r\n var el = this.scrollEl;\r\n if (this.scrollTopVel < 0) {\r\n if (el.scrollTop() <= 0) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n else if (this.scrollTopVel > 0) {\r\n if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n if (this.scrollLeftVel < 0) {\r\n if (el.scrollLeft() <= 0) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n else if (this.scrollLeftVel > 0) {\r\n if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n };\r\n // This function gets called during every iteration of the scrolling animation loop\r\n DragListener.prototype.scrollIntervalFunc = function () {\r\n var el = this.scrollEl;\r\n var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by\r\n // change the value of scrollEl's scroll\r\n if (this.scrollTopVel) {\r\n el.scrollTop(el.scrollTop() + this.scrollTopVel * frac);\r\n }\r\n if (this.scrollLeftVel) {\r\n el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);\r\n }\r\n this.constrainScrollVel(); // since the scroll values changed, recompute the velocities\r\n // if scrolled all the way, which causes the vels to be zero, stop the animation loop\r\n if (!this.scrollTopVel && !this.scrollLeftVel) {\r\n this.endAutoScroll();\r\n }\r\n };\r\n // Kills any existing scrolling animation loop\r\n DragListener.prototype.endAutoScroll = function () {\r\n if (this.scrollIntervalId) {\r\n clearInterval(this.scrollIntervalId);\r\n this.scrollIntervalId = null;\r\n this.handleScrollEnd();\r\n }\r\n };\r\n // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)\r\n DragListener.prototype.handleDebouncedScroll = function () {\r\n // recompute all coordinates, but *only* if this is *not* part of our scrolling animation\r\n if (!this.scrollIntervalId) {\r\n this.handleScrollEnd();\r\n }\r\n };\r\n DragListener.prototype.handleScrollEnd = function () {\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n };\r\n return DragListener;\r\n}());\r\nexports.default = DragListener;\r\nListenerMixin_1.default.mixInto(DragListener);\r\n\r\n\r\n/***/ }),\r\n/* 55 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\n/*\r\nA set of rendering and date-related methods for a visual component comprised of one or more rows of day columns.\r\nPrerequisite: the object being mixed into needs to be a *Grid*\r\n*/\r\nvar DayTableMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayTableMixin, _super);\r\n function DayTableMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Populates internal variables used for date calculation and rendering\r\n DayTableMixin.prototype.updateDayTable = function () {\r\n var t = this;\r\n var view = t.view;\r\n var calendar = view.calendar;\r\n var date = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.startMs, true);\r\n var end = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.endMs, true);\r\n var dayIndex = -1;\r\n var dayIndices = [];\r\n var dayDates = [];\r\n var daysPerRow;\r\n var firstDay;\r\n var rowCnt;\r\n while (date.isBefore(end)) {\r\n if (view.isHiddenDay(date)) {\r\n dayIndices.push(dayIndex + 0.5); // mark that it's between indices\r\n }\r\n else {\r\n dayIndex++;\r\n dayIndices.push(dayIndex);\r\n dayDates.push(date.clone());\r\n }\r\n date.add(1, 'days');\r\n }\r\n if (this.breakOnWeeks) {\r\n // count columns until the day-of-week repeats\r\n firstDay = dayDates[0].day();\r\n for (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {\r\n if (dayDates[daysPerRow].day() === firstDay) {\r\n break;\r\n }\r\n }\r\n rowCnt = Math.ceil(dayDates.length / daysPerRow);\r\n }\r\n else {\r\n rowCnt = 1;\r\n daysPerRow = dayDates.length;\r\n }\r\n this.dayDates = dayDates;\r\n this.dayIndices = dayIndices;\r\n this.daysPerRow = daysPerRow;\r\n this.rowCnt = rowCnt;\r\n this.updateDayTableCols();\r\n };\r\n // Computes and assigned the colCnt property and updates any options that may be computed from it\r\n DayTableMixin.prototype.updateDayTableCols = function () {\r\n this.colCnt = this.computeColCnt();\r\n this.colHeadFormat =\r\n this.opt('columnHeaderFormat') ||\r\n this.opt('columnFormat') || // deprecated\r\n this.computeColHeadFormat();\r\n };\r\n // Determines how many columns there should be in the table\r\n DayTableMixin.prototype.computeColCnt = function () {\r\n return this.daysPerRow;\r\n };\r\n // Computes the ambiguously-timed moment for the given cell\r\n DayTableMixin.prototype.getCellDate = function (row, col) {\r\n return this.dayDates[this.getCellDayIndex(row, col)].clone();\r\n };\r\n // Computes the ambiguously-timed date range for the given cell\r\n DayTableMixin.prototype.getCellRange = function (row, col) {\r\n var start = this.getCellDate(row, col);\r\n var end = start.clone().add(1, 'days');\r\n return { start: start, end: end };\r\n };\r\n // Returns the number of day cells, chronologically, from the first of the grid (0-based)\r\n DayTableMixin.prototype.getCellDayIndex = function (row, col) {\r\n return row * this.daysPerRow + this.getColDayIndex(col);\r\n };\r\n // Returns the numner of day cells, chronologically, from the first cell in *any given row*\r\n DayTableMixin.prototype.getColDayIndex = function (col) {\r\n if (this.isRTL) {\r\n return this.colCnt - 1 - col;\r\n }\r\n else {\r\n return col;\r\n }\r\n };\r\n // Given a date, returns its chronolocial cell-index from the first cell of the grid.\r\n // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\r\n // If before the first offset, returns a negative number.\r\n // If after the last offset, returns an offset past the last cell offset.\r\n // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\r\n DayTableMixin.prototype.getDateDayIndex = function (date) {\r\n var dayIndices = this.dayIndices;\r\n var dayOffset = date.diff(this.dayDates[0], 'days');\r\n if (dayOffset < 0) {\r\n return dayIndices[0] - 1;\r\n }\r\n else if (dayOffset >= dayIndices.length) {\r\n return dayIndices[dayIndices.length - 1] + 1;\r\n }\r\n else {\r\n return dayIndices[dayOffset];\r\n }\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes a default column header formatting string if `colFormat` is not explicitly defined\r\n DayTableMixin.prototype.computeColHeadFormat = function () {\r\n // if more than one week row, or if there are a lot of columns with not much space,\r\n // put just the day numbers will be in each cell\r\n if (this.rowCnt > 1 || this.colCnt > 10) {\r\n return 'ddd'; // \"Sat\"\r\n }\r\n else if (this.colCnt > 1) {\r\n return this.opt('dayOfMonthFormat'); // \"Sat 12/10\"\r\n }\r\n else {\r\n return 'dddd'; // \"Saturday\"\r\n }\r\n };\r\n /* Slicing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Slices up a date range into a segment for every week-row it intersects with\r\n DayTableMixin.prototype.sliceRangeByRow = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, rowFirst);\r\n segLast = Math.min(rangeLast, rowLast);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n // Slices up a date range into a segment for every day-cell it intersects with.\r\n // TODO: make more DRY with sliceRangeByRow somehow.\r\n DayTableMixin.prototype.sliceRangeByDay = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var i;\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n for (i = rowFirst; i <= rowLast; i++) {\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, i);\r\n segLast = Math.min(rangeLast, i);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Header Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderHeadHtml = function () {\r\n var theme = this.view.calendar.theme;\r\n return '' +\r\n '
' +\r\n '' +\r\n '' +\r\n this.renderHeadTrHtml() +\r\n '' +\r\n '
' +\r\n '
';\r\n };\r\n DayTableMixin.prototype.renderHeadIntroHtml = function () {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderHeadTrHtml = function () {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderHeadIntroHtml()) +\r\n this.renderHeadDateCellsHtml() +\r\n (this.isRTL ? this.renderHeadIntroHtml() : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderHeadDateCellsHtml = function () {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(0, col);\r\n htmls.push(this.renderHeadDateCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // TODO: when internalApiVersion, accept an object for HTML attributes\r\n // (colspan should be no different)\r\n DayTableMixin.prototype.renderHeadDateCellHtml = function (date, colspan, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classNames = [\r\n 'fc-day-header',\r\n view.calendar.theme.getClass('widgetHeader')\r\n ];\r\n var innerHtml;\r\n if (typeof t.opt('columnHeaderHtml') === 'function') {\r\n innerHtml = t.opt('columnHeaderHtml')(date);\r\n }\r\n else if (typeof t.opt('columnHeaderText') === 'function') {\r\n innerHtml = util_1.htmlEscape(t.opt('columnHeaderText')(date));\r\n }\r\n else {\r\n innerHtml = util_1.htmlEscape(date.format(t.colHeadFormat));\r\n }\r\n // if only one row of days, the classNames on the header can represent the specific days beneath\r\n if (t.rowCnt === 1) {\r\n classNames = classNames.concat(\r\n // includes the day-of-week class\r\n // noThemeHighlight=true (don't highlight the header)\r\n t.getDayClasses(date, true));\r\n }\r\n else {\r\n classNames.push('fc-' + util_1.dayIDs[date.day()]); // only add the day-of-week class\r\n }\r\n return '' +\r\n ' 1 ?\r\n ' colspan=\"' + colspan + '\"' :\r\n '') +\r\n (otherAttrs ?\r\n ' ' + otherAttrs :\r\n '') +\r\n '>' +\r\n (isDateValid ?\r\n // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)\r\n view.buildGotoAnchorHtml({ date: date, forceOff: t.rowCnt > 1 || t.colCnt === 1 }, innerHtml) :\r\n // if not valid, display text, but no link\r\n innerHtml) +\r\n '';\r\n };\r\n /* Background Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderBgTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderBgIntroHtml(row)) +\r\n this.renderBgCellsHtml(row) +\r\n (this.isRTL ? this.renderBgIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderBgIntroHtml = function (row) {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderBgCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderBgCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n DayTableMixin.prototype.renderBgCellHtml = function (date, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classes = t.getDayClasses(date);\r\n classes.unshift('fc-day', view.calendar.theme.getClass('widgetContent'));\r\n return '';\r\n };\r\n /* Generic\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderIntroHtml = function () {\r\n // Generates the default HTML intro for any row. User classes should override\r\n };\r\n // TODO: a generic method for dealing with , RTL, intro\r\n // when increment internalApiVersion\r\n // wrapTr (scheduler)\r\n /* Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Applies the generic \"intro\" and \"outro\" HTML to the given cells.\r\n // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.\r\n DayTableMixin.prototype.bookendCells = function (trEl) {\r\n var introHtml = this.renderIntroHtml();\r\n if (introHtml) {\r\n if (this.isRTL) {\r\n trEl.append(introHtml);\r\n }\r\n else {\r\n trEl.prepend(introHtml);\r\n }\r\n }\r\n };\r\n return DayTableMixin;\r\n}(Mixin_1.default));\r\nexports.default = DayTableMixin;\r\n\r\n\r\n/***/ }),\r\n/* 56 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar BusinessHourRenderer = /** @class */ (function () {\r\n /*\r\n component implements:\r\n - eventRangesToEventFootprints\r\n - eventFootprintsToSegs\r\n */\r\n function BusinessHourRenderer(component, fillRenderer) {\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n BusinessHourRenderer.prototype.render = function (businessHourGenerator) {\r\n var component = this.component;\r\n var unzonedRange = component._getDateProfile().activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(component.hasAllDayBusinessHours, unzonedRange);\r\n var eventFootprints = eventInstanceGroup ?\r\n component.eventRangesToEventFootprints(eventInstanceGroup.sliceRenderRanges(unzonedRange)) :\r\n [];\r\n this.renderEventFootprints(eventFootprints);\r\n };\r\n BusinessHourRenderer.prototype.renderEventFootprints = function (eventFootprints) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n this.renderSegs(segs);\r\n this.segs = segs;\r\n };\r\n BusinessHourRenderer.prototype.renderSegs = function (segs) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('businessHours', segs, {\r\n getClasses: function (seg) {\r\n return ['fc-nonbusiness', 'fc-bgevent'];\r\n }\r\n });\r\n }\r\n };\r\n BusinessHourRenderer.prototype.unrender = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('businessHours');\r\n }\r\n this.segs = null;\r\n };\r\n BusinessHourRenderer.prototype.getSegs = function () {\r\n return this.segs || [];\r\n };\r\n return BusinessHourRenderer;\r\n}());\r\nexports.default = BusinessHourRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 57 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar FillRenderer = /** @class */ (function () {\r\n function FillRenderer(component) {\r\n this.fillSegTag = 'div';\r\n this.component = component;\r\n this.elsByFill = {};\r\n }\r\n FillRenderer.prototype.renderFootprint = function (type, componentFootprint, props) {\r\n this.renderSegs(type, this.component.componentFootprintToSegs(componentFootprint), props);\r\n };\r\n FillRenderer.prototype.renderSegs = function (type, segs, props) {\r\n var els;\r\n segs = this.buildSegEls(type, segs, props); // assignes `.el` to each seg. returns successfully rendered segs\r\n els = this.attachSegEls(type, segs);\r\n if (els) {\r\n this.reportEls(type, els);\r\n }\r\n return segs;\r\n };\r\n // Unrenders a specific type of fill that is currently rendered on the grid\r\n FillRenderer.prototype.unrender = function (type) {\r\n var el = this.elsByFill[type];\r\n if (el) {\r\n el.remove();\r\n delete this.elsByFill[type];\r\n }\r\n };\r\n // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\r\n // Only returns segments that successfully rendered.\r\n FillRenderer.prototype.buildSegEls = function (type, segs, props) {\r\n var _this = this;\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n html += this.buildSegHtml(type, segs[i], props);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n // allow custom filter methods per-type\r\n if (props.filterEl) {\r\n el = props.filterEl(seg, el);\r\n }\r\n if (el) {\r\n el = $(el); // allow custom filter to return raw DOM node\r\n // correct element type? (would be bad if a non-TD were inserted into a table for example)\r\n if (el.is(_this.fillSegTag)) {\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n // Builds the HTML needed for one fill segment. Generic enough to work with different types.\r\n FillRenderer.prototype.buildSegHtml = function (type, seg, props) {\r\n // custom hooks per-type\r\n var classes = props.getClasses ? props.getClasses(seg) : [];\r\n var css = util_1.cssToStr(props.getCss ? props.getCss(seg) : {});\r\n return '<' + this.fillSegTag +\r\n (classes.length ? ' class=\"' + classes.join(' ') + '\"' : '') +\r\n (css ? ' style=\"' + css + '\"' : '') +\r\n ' />';\r\n };\r\n // Should return wrapping DOM structure\r\n FillRenderer.prototype.attachSegEls = function (type, segs) {\r\n // subclasses must implement\r\n };\r\n FillRenderer.prototype.reportEls = function (type, nodes) {\r\n if (this.elsByFill[type]) {\r\n this.elsByFill[type] = this.elsByFill[type].add(nodes);\r\n }\r\n else {\r\n this.elsByFill[type] = $(nodes);\r\n }\r\n };\r\n return FillRenderer;\r\n}());\r\nexports.default = FillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 58 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar HelperRenderer = /** @class */ (function () {\r\n function HelperRenderer(component, eventRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.eventRenderer = eventRenderer;\r\n }\r\n HelperRenderer.prototype.renderComponentFootprint = function (componentFootprint) {\r\n this.renderEventFootprints([\r\n this.fabricateEventFootprint(componentFootprint)\r\n ]);\r\n };\r\n HelperRenderer.prototype.renderEventDraggingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-dragging', isTouch ? null : this.view.opt('dragOpacity'));\r\n };\r\n HelperRenderer.prototype.renderEventResizingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-resizing');\r\n };\r\n HelperRenderer.prototype.renderEventFootprints = function (eventFootprints, sourceSeg, extraClassNames, opacity) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n var classNames = 'fc-helper ' + (extraClassNames || '');\r\n var i;\r\n // assigns each seg's el and returns a subset of segs that were rendered\r\n segs = this.eventRenderer.renderFgSegEls(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.addClass(classNames);\r\n }\r\n if (opacity != null) {\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.css('opacity', opacity);\r\n }\r\n }\r\n this.helperEls = this.renderSegs(segs, sourceSeg);\r\n };\r\n /*\r\n Must return all mock event elements\r\n */\r\n HelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n // Subclasses must implement\r\n };\r\n HelperRenderer.prototype.unrender = function () {\r\n if (this.helperEls) {\r\n this.helperEls.remove();\r\n this.helperEls = null;\r\n }\r\n };\r\n HelperRenderer.prototype.fabricateEventFootprint = function (componentFootprint) {\r\n var calendar = this.view.calendar;\r\n var eventDateProfile = calendar.footprintToDateProfile(componentFootprint);\r\n var dummyEvent = new SingleEventDef_1.default(new EventSource_1.default(calendar));\r\n var dummyInstance;\r\n dummyEvent.dateProfile = eventDateProfile;\r\n dummyInstance = dummyEvent.buildInstance();\r\n return new EventFootprint_1.default(componentFootprint, dummyEvent, dummyInstance);\r\n };\r\n return HelperRenderer;\r\n}());\r\nexports.default = HelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 59 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventPointing, _super);\r\n function EventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n component must implement:\r\n - publiclyTrigger\r\n */\r\n EventPointing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'click', this.handleClick.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseenter', this.handleMouseover.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseleave', this.handleMouseout.bind(this));\r\n };\r\n EventPointing.prototype.handleClick = function (seg, ev) {\r\n var res = this.component.publiclyTrigger('eventClick', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n if (res === false) {\r\n ev.preventDefault();\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused over\r\n EventPointing.prototype.handleMouseover = function (seg, ev) {\r\n if (!GlobalEmitter_1.default.get().shouldIgnoreMouse() &&\r\n !this.mousedOverSeg) {\r\n this.mousedOverSeg = seg;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.addClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseover', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused out.\r\n // Can be given no arguments, in which case it will mouseout the segment that was previously moused over.\r\n EventPointing.prototype.handleMouseout = function (seg, ev) {\r\n if (this.mousedOverSeg) {\r\n this.mousedOverSeg = null;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.removeClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseout', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev || {},\r\n this.view\r\n ]\r\n });\r\n }\r\n };\r\n EventPointing.prototype.end = function () {\r\n if (this.mousedOverSeg) {\r\n this.handleMouseout(this.mousedOverSeg);\r\n }\r\n };\r\n return EventPointing;\r\n}(Interaction_1.default));\r\nexports.default = EventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 60 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar DateClicking_1 = __webpack_require__(245);\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar EventDragging_1 = __webpack_require__(224);\r\nvar EventResizing_1 = __webpack_require__(223);\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nvar StandardInteractionsMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardInteractionsMixin, _super);\r\n function StandardInteractionsMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardInteractionsMixin;\r\n}(Mixin_1.default));\r\nexports.default = StandardInteractionsMixin;\r\nStandardInteractionsMixin.prototype.dateClickingClass = DateClicking_1.default;\r\nStandardInteractionsMixin.prototype.dateSelectingClass = DateSelecting_1.default;\r\nStandardInteractionsMixin.prototype.eventPointingClass = EventPointing_1.default;\r\nStandardInteractionsMixin.prototype.eventDraggingClass = EventDragging_1.default;\r\nStandardInteractionsMixin.prototype.eventResizingClass = EventResizing_1.default;\r\nStandardInteractionsMixin.prototype.externalDroppingClass = ExternalDropping_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 61 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar Popover_1 = __webpack_require__(249);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar DayGridEventRenderer_1 = __webpack_require__(250);\r\nvar DayGridHelperRenderer_1 = __webpack_require__(251);\r\nvar DayGridFillRenderer_1 = __webpack_require__(252);\r\n/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGrid, _super);\r\n function DayGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.cellWeekNumbersVisible = false; // display week numbers in day cell?\r\n _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid\r\n // isRigid determines whether the individual rows should ignore the contents and be a constant height.\r\n // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.\r\n _this.isRigid = false;\r\n _this.hasAllDayBusinessHours = true;\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n DayGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByRow(componentFootprint.unzonedRange);\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (this.isRTL) {\r\n seg.leftCol = this.daysPerRow - 1 - seg.lastRowDayIndex;\r\n seg.rightCol = this.daysPerRow - 1 - seg.firstRowDayIndex;\r\n }\r\n else {\r\n seg.leftCol = seg.firstRowDayIndex;\r\n seg.rightCol = seg.lastRowDayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderGrid();\r\n };\r\n DayGrid.prototype.unrenderDates = function () {\r\n this.removeSegPopover();\r\n };\r\n // Renders the rows and columns into the component's `this.el`, which should already be assigned.\r\n DayGrid.prototype.renderGrid = function () {\r\n var view = this.view;\r\n var rowCnt = this.rowCnt;\r\n var colCnt = this.colCnt;\r\n var html = '';\r\n var row;\r\n var col;\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n for (row = 0; row < rowCnt; row++) {\r\n html += this.renderDayRowHtml(row, this.isRigid);\r\n }\r\n this.el.html(html);\r\n this.rowEls = this.el.find('.fc-row');\r\n this.cellEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.rowCoordCache = new CoordCache_1.default({\r\n els: this.rowEls,\r\n isVertical: true\r\n });\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.cellEls.slice(0, this.colCnt),\r\n isHorizontal: true\r\n });\r\n // trigger dayRender with each cell's element\r\n for (row = 0; row < rowCnt; row++) {\r\n for (col = 0; col < colCnt; col++) {\r\n this.publiclyTrigger('dayRender', {\r\n context: view,\r\n args: [\r\n this.getCellDate(row, col),\r\n this.getCellEl(row, col),\r\n view\r\n ]\r\n });\r\n }\r\n }\r\n };\r\n // Generates the HTML for a single row, which is a div that wraps a table.\r\n // `row` is the row number.\r\n DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {\r\n var theme = this.view.calendar.theme;\r\n var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];\r\n if (isRigid) {\r\n classes.push('fc-rigid');\r\n }\r\n return '' +\r\n '
' +\r\n '
' +\r\n '' +\r\n this.renderBgTrHtml(row) +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n (this.getIsNumbersVisible() ?\r\n '' +\r\n this.renderNumberTrHtml(row) +\r\n '' :\r\n '') +\r\n '
' +\r\n '
' +\r\n '
';\r\n };\r\n DayGrid.prototype.getIsNumbersVisible = function () {\r\n return this.getIsDayNumbersVisible() || this.cellWeekNumbersVisible;\r\n };\r\n DayGrid.prototype.getIsDayNumbersVisible = function () {\r\n return this.rowCnt > 1;\r\n };\r\n /* Grid Number Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderNumberTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderNumberIntroHtml(row)) +\r\n this.renderNumberCellsHtml(row) +\r\n (this.isRTL ? this.renderNumberIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayGrid.prototype.renderNumberIntroHtml = function (row) {\r\n return this.renderIntroHtml();\r\n };\r\n DayGrid.prototype.renderNumberCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderNumberCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // Generates the HTML for the s of the \"number\" row in the DayGrid's content skeleton.\r\n // The number row will only exist if either day numbers or week numbers are turned on.\r\n DayGrid.prototype.renderNumberCellHtml = function (date) {\r\n var view = this.view;\r\n var html = '';\r\n var isDateValid = this.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;\r\n var classes;\r\n var weekCalcFirstDoW;\r\n if (!isDayNumberVisible && !this.cellWeekNumbersVisible) {\r\n // no numbers in day cell (week number must be along the side)\r\n return ''; // will create an empty space above events :(\r\n }\r\n classes = this.getDayClasses(date);\r\n classes.unshift('fc-day-top');\r\n if (this.cellWeekNumbersVisible) {\r\n // To determine the day of week number change under ISO, we cannot\r\n // rely on moment.js methods such as firstDayOfWeek() or weekday(),\r\n // because they rely on the locale's dow (possibly overridden by\r\n // our firstDay option), which may not be Monday. We cannot change\r\n // dow, because that would affect the calendar start day as well.\r\n if (date._locale._fullCalendar_weekCalc === 'ISO') {\r\n weekCalcFirstDoW = 1; // Monday by ISO 8601 definition\r\n }\r\n else {\r\n weekCalcFirstDoW = date._locale.firstDayOfWeek();\r\n }\r\n }\r\n html += '';\r\n if (this.cellWeekNumbersVisible && (date.day() === weekCalcFirstDoW)) {\r\n html += view.buildGotoAnchorHtml({ date: date, type: 'week' }, { 'class': 'fc-week-number' }, date.format('w') // inner HTML\r\n );\r\n }\r\n if (isDayNumberVisible) {\r\n html += view.buildGotoAnchorHtml(date, { 'class': 'fc-day-number' }, date.format('D') // inner HTML\r\n );\r\n }\r\n html += '';\r\n return html;\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.rowCoordCache.build();\r\n this.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack\r\n };\r\n DayGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n this.rowCoordCache.clear();\r\n };\r\n DayGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n if (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {\r\n var col = this.colCoordCache.getHorizontalIndex(leftOffset);\r\n var row = this.rowCoordCache.getVerticalIndex(topOffset);\r\n if (row != null && col != null) {\r\n return this.getCellHit(row, col);\r\n }\r\n }\r\n };\r\n DayGrid.prototype.getHitFootprint = function (hit) {\r\n var range = this.getCellRange(hit.row, hit.col);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(range.start, range.end), true // all-day?\r\n );\r\n };\r\n DayGrid.prototype.getHitEl = function (hit) {\r\n return this.getCellEl(hit.row, hit.col);\r\n };\r\n /* Cell System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // FYI: the first column is the leftmost column, regardless of date\r\n DayGrid.prototype.getCellHit = function (row, col) {\r\n return {\r\n row: row,\r\n col: col,\r\n component: this,\r\n left: this.colCoordCache.getLeftOffset(col),\r\n right: this.colCoordCache.getRightOffset(col),\r\n top: this.rowCoordCache.getTopOffset(row),\r\n bottom: this.rowCoordCache.getBottomOffset(row)\r\n };\r\n };\r\n DayGrid.prototype.getCellEl = function (row, col) {\r\n return this.cellEls.eq(row * this.colCnt + col);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Unrenders all events currently rendered on the grid\r\n DayGrid.prototype.executeEventUnrender = function () {\r\n this.removeSegPopover(); // removes the \"more..\" events popover\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n // Retrieves all rendered segment objects currently rendered on the grid\r\n DayGrid.prototype.getOwnEventSegs = function () {\r\n // append the segments from the \"more...\" popover\r\n return _super.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs || []);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event or external element being dragged.\r\n // `eventLocation` has zoned start and end (optional)\r\n DayGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n // render drags from OTHER components as helpers\r\n if (eventFootprints.length && seg && seg.component !== this) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n return true; // signal helpers rendered\r\n }\r\n };\r\n // Unrenders any visual indication of a hovering event\r\n DayGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n DayGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders a visual indication of an event being resized\r\n DayGrid.prototype.unrenderEventResize = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* More+ Link Popover\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.removeSegPopover = function () {\r\n if (this.segPopover) {\r\n this.segPopover.hide(); // in handler, will call segPopover's removeElement\r\n }\r\n };\r\n // Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\r\n // `levelLimit` can be false (don't limit), a number, or true (should be computed).\r\n DayGrid.prototype.limitRows = function (levelLimit) {\r\n var rowStructs = this.eventRenderer.rowStructs || [];\r\n var row; // row #\r\n var rowLevelLimit;\r\n for (row = 0; row < rowStructs.length; row++) {\r\n this.unlimitRow(row);\r\n if (!levelLimit) {\r\n rowLevelLimit = false;\r\n }\r\n else if (typeof levelLimit === 'number') {\r\n rowLevelLimit = levelLimit;\r\n }\r\n else {\r\n rowLevelLimit = this.computeRowLevelLimit(row);\r\n }\r\n if (rowLevelLimit !== false) {\r\n this.limitRow(row, rowLevelLimit);\r\n }\r\n }\r\n };\r\n // Computes the number of levels a row will accomodate without going outside its bounds.\r\n // Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\r\n // `row` is the row number.\r\n DayGrid.prototype.computeRowLevelLimit = function (row) {\r\n var rowEl = this.rowEls.eq(row); // the containing \"fake\" row div\r\n var rowHeight = rowEl.height(); // TODO: cache somehow?\r\n var trEls = this.eventRenderer.rowStructs[row].tbodyEl.children();\r\n var i;\r\n var trEl;\r\n var trHeight;\r\n function iterInnerHeights(i, childNode) {\r\n trHeight = Math.max(trHeight, $(childNode).outerHeight());\r\n }\r\n // Reveal one level at a time and stop when we find one out of bounds\r\n for (i = 0; i < trEls.length; i++) {\r\n trEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)\r\n // with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,\r\n // so instead, find the tallest inner content element.\r\n trHeight = 0;\r\n trEl.find('> td > :first-child').each(iterInnerHeights);\r\n if (trEl.position().top + trHeight > rowHeight) {\r\n return i;\r\n }\r\n }\r\n return false; // should not limit at all\r\n };\r\n // Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\r\n // `row` is the row number.\r\n // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\r\n DayGrid.prototype.limitRow = function (row, levelLimit) {\r\n var _this = this;\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n var moreNodes = []; // array of \"more\"
links and DOM nodes\r\n var col = 0; // col #, left-to-right (not chronologically)\r\n var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\r\n var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row\r\n var limitedNodes; // array of temporarily hidden level and segment DOM nodes\r\n var i;\r\n var seg;\r\n var segsBelow; // array of segment objects below `seg` in the current `col`\r\n var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\r\n var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\r\n var td;\r\n var rowspan;\r\n var segMoreNodes; // array of \"more\" cells that will stand-in for the current seg's cell\r\n var j;\r\n var moreTd;\r\n var moreWrap;\r\n var moreLink;\r\n // Iterates through empty level cells and places \"more\" links inside if need be\r\n var emptyCellsUntil = function (endCol) {\r\n while (col < endCol) {\r\n segsBelow = _this.getCellSegs(row, col, levelLimit);\r\n if (segsBelow.length) {\r\n td = cellMatrix[levelLimit - 1][col];\r\n moreLink = _this.renderMoreLink(row, col, segsBelow);\r\n moreWrap = $('
').append(moreLink);\r\n td.append(moreWrap);\r\n moreNodes.push(moreWrap[0]);\r\n }\r\n col++;\r\n }\r\n };\r\n if (levelLimit && levelLimit < rowStruct.segLevels.length) {\r\n levelSegs = rowStruct.segLevels[levelLimit - 1];\r\n cellMatrix = rowStruct.cellMatrix;\r\n limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level elements past the limit\r\n .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array\r\n // iterate though segments in the last allowable level\r\n for (i = 0; i < levelSegs.length; i++) {\r\n seg = levelSegs[i];\r\n emptyCellsUntil(seg.leftCol); // process empty cells before the segment\r\n // determine *all* segments below `seg` that occupy the same columns\r\n colSegsBelow = [];\r\n totalSegsBelow = 0;\r\n while (col <= seg.rightCol) {\r\n segsBelow = this.getCellSegs(row, col, levelLimit);\r\n colSegsBelow.push(segsBelow);\r\n totalSegsBelow += segsBelow.length;\r\n col++;\r\n }\r\n if (totalSegsBelow) {\r\n td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell\r\n rowspan = td.attr('rowspan') || 1;\r\n segMoreNodes = [];\r\n // make a replacement for each column the segment occupies. will be one for each colspan\r\n for (j = 0; j < colSegsBelow.length; j++) {\r\n moreTd = $('').attr('rowspan', rowspan);\r\n segsBelow = colSegsBelow[j];\r\n moreLink = this.renderMoreLink(row, seg.leftCol + j, [seg].concat(segsBelow) // count seg as hidden too\r\n );\r\n moreWrap = $('
').append(moreLink);\r\n moreTd.append(moreWrap);\r\n segMoreNodes.push(moreTd[0]);\r\n moreNodes.push(moreTd[0]);\r\n }\r\n td.addClass('fc-limited').after($(segMoreNodes)); // hide original and inject replacements\r\n limitedNodes.push(td[0]);\r\n }\r\n }\r\n emptyCellsUntil(this.colCnt); // finish off the level\r\n rowStruct.moreEls = $(moreNodes); // for easy undoing later\r\n rowStruct.limitedEls = $(limitedNodes); // for easy undoing later\r\n }\r\n };\r\n // Reveals all levels and removes all \"more\"-related elements for a grid's row.\r\n // `row` is a row number.\r\n DayGrid.prototype.unlimitRow = function (row) {\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n if (rowStruct.moreEls) {\r\n rowStruct.moreEls.remove();\r\n rowStruct.moreEls = null;\r\n }\r\n if (rowStruct.limitedEls) {\r\n rowStruct.limitedEls.removeClass('fc-limited');\r\n rowStruct.limitedEls = null;\r\n }\r\n };\r\n // Renders an element that represents hidden event element for a cell.\r\n // Responsible for attaching click handler as well.\r\n DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {\r\n var _this = this;\r\n var view = this.view;\r\n return $('')\r\n .text(this.getMoreLinkText(hiddenSegs.length))\r\n .on('click', function (ev) {\r\n var clickOption = _this.opt('eventLimitClick');\r\n var date = _this.getCellDate(row, col);\r\n var moreEl = $(ev.currentTarget);\r\n var dayEl = _this.getCellEl(row, col);\r\n var allSegs = _this.getCellSegs(row, col);\r\n // rescope the segments to be within the cell's date\r\n var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\r\n var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\r\n if (typeof clickOption === 'function') {\r\n // the returned value can be an atomic option\r\n clickOption = _this.publiclyTrigger('eventLimitClick', {\r\n context: view,\r\n args: [\r\n {\r\n date: date.clone(),\r\n dayEl: dayEl,\r\n moreEl: moreEl,\r\n segs: reslicedAllSegs,\r\n hiddenSegs: reslicedHiddenSegs\r\n },\r\n ev,\r\n view\r\n ]\r\n });\r\n }\r\n if (clickOption === 'popover') {\r\n _this.showSegPopover(row, col, moreEl, reslicedAllSegs);\r\n }\r\n else if (typeof clickOption === 'string') {\r\n view.calendar.zoomTo(date, clickOption);\r\n }\r\n });\r\n };\r\n // Reveals the popover that displays all events within a cell\r\n DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {\r\n var _this = this;\r\n var view = this.view;\r\n var moreWrap = moreLink.parent(); // the
wrapper around the \r\n var topEl; // the element we want to match the top coordinate of\r\n var options;\r\n if (this.rowCnt === 1) {\r\n topEl = view.el; // will cause the popover to cover any sort of header\r\n }\r\n else {\r\n topEl = this.rowEls.eq(row); // will align with top of row\r\n }\r\n options = {\r\n className: 'fc-more-popover ' + view.calendar.theme.getClass('popover'),\r\n content: this.renderSegPopoverContent(row, col, segs),\r\n parentEl: view.el,\r\n top: topEl.offset().top,\r\n autoHide: true,\r\n viewportConstrain: this.opt('popoverViewportConstrain'),\r\n hide: function () {\r\n // kill everything when the popover is hidden\r\n // notify events to be removed\r\n if (_this.popoverSegs) {\r\n _this.triggerBeforeEventSegsDestroyed(_this.popoverSegs);\r\n }\r\n _this.segPopover.removeElement();\r\n _this.segPopover = null;\r\n _this.popoverSegs = null;\r\n }\r\n };\r\n // Determine horizontal coordinate.\r\n // We use the moreWrap instead of the to avoid border confusion.\r\n if (this.isRTL) {\r\n options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border\r\n }\r\n else {\r\n options.left = moreWrap.offset().left - 1; // -1 to be over cell border\r\n }\r\n this.segPopover = new Popover_1.default(options);\r\n this.segPopover.show();\r\n // the popover doesn't live within the grid's container element, and thus won't get the event\r\n // delegated-handlers for free. attach event-related handlers to the popover.\r\n this.bindAllSegHandlersToEl(this.segPopover.el);\r\n this.triggerAfterEventSegsRendered(segs);\r\n };\r\n // Builds the inner DOM contents of the segment popover\r\n DayGrid.prototype.renderSegPopoverContent = function (row, col, segs) {\r\n var view = this.view;\r\n var theme = view.calendar.theme;\r\n var title = this.getCellDate(row, col).format(this.opt('dayPopoverFormat'));\r\n var content = $('
' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(title) +\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
');\r\n var segContainer = content.find('.fc-event-container');\r\n var i;\r\n // render each seg's `el` and only return the visible segs\r\n segs = this.eventRenderer.renderFgSegEls(segs, true); // disableResizing=true\r\n this.popoverSegs = segs;\r\n for (i = 0; i < segs.length; i++) {\r\n // because segments in the popover are not part of a grid coordinate system, provide a hint to any\r\n // grids that want to do drag-n-drop about which cell it came from\r\n this.hitsNeeded();\r\n segs[i].hit = this.getCellHit(row, col);\r\n this.hitsNotNeeded();\r\n segContainer.append(segs[i].el);\r\n }\r\n return content;\r\n };\r\n // Given the events within an array of segment objects, reslice them to be in a single day\r\n DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {\r\n var dayStart = dayDate.clone();\r\n var dayEnd = dayStart.clone().add(1, 'days');\r\n var dayRange = new UnzonedRange_1.default(dayStart, dayEnd);\r\n var newSegs = [];\r\n var i;\r\n var seg;\r\n var slicedRange;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n slicedRange = seg.footprint.componentFootprint.unzonedRange.intersect(dayRange);\r\n if (slicedRange) {\r\n newSegs.push($.extend({}, seg, {\r\n footprint: new EventFootprint_1.default(new ComponentFootprint_1.default(slicedRange, seg.footprint.componentFootprint.isAllDay), seg.footprint.eventDef, seg.footprint.eventInstance),\r\n isStart: seg.isStart && slicedRange.isStart,\r\n isEnd: seg.isEnd && slicedRange.isEnd\r\n }));\r\n }\r\n }\r\n // force an order because eventsToSegs doesn't guarantee one\r\n // TODO: research if still needed\r\n this.eventRenderer.sortEventSegs(newSegs);\r\n return newSegs;\r\n };\r\n // Generates the text that should be inside a \"more\" link, given the number of events it represents\r\n DayGrid.prototype.getMoreLinkText = function (num) {\r\n var opt = this.opt('eventLimitText');\r\n if (typeof opt === 'function') {\r\n return opt(num);\r\n }\r\n else {\r\n return '+' + num + ' ' + opt;\r\n }\r\n };\r\n // Returns segments within a given cell.\r\n // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\r\n DayGrid.prototype.getCellSegs = function (row, col, startLevel) {\r\n var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;\r\n var level = startLevel || 0;\r\n var segs = [];\r\n var seg;\r\n while (level < segMatrix.length) {\r\n seg = segMatrix[level][col];\r\n if (seg) {\r\n segs.push(seg);\r\n }\r\n level++;\r\n }\r\n return segs;\r\n };\r\n return DayGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = DayGrid;\r\nDayGrid.prototype.eventRendererClass = DayGridEventRenderer_1.default;\r\nDayGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nDayGrid.prototype.helperRendererClass = DayGridHelperRenderer_1.default;\r\nDayGrid.prototype.fillRendererClass = DayGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(DayGrid);\r\nDayTableMixin_1.default.mixInto(DayGrid);\r\n\r\n\r\n/***/ }),\r\n/* 62 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar DayGrid_1 = __webpack_require__(61);\r\n/* An abstract class for the \"basic\" views, as well as month view. Renders one or more rows of day cells.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\r\n// It is responsible for managing width/height.\r\nvar BasicView = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicView, _super);\r\n function BasicView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.dayGrid = _this.instantiateDayGrid();\r\n _this.dayGrid.isRigid = _this.hasRigidRows();\r\n if (_this.opt('weekNumbers')) {\r\n if (_this.opt('weekNumbersWithinDays')) {\r\n _this.dayGrid.cellWeekNumbersVisible = true;\r\n _this.dayGrid.colWeekNumbersVisible = false;\r\n }\r\n else {\r\n _this.dayGrid.cellWeekNumbersVisible = false;\r\n _this.dayGrid.colWeekNumbersVisible = true;\r\n }\r\n }\r\n _this.addChild(_this.dayGrid);\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Generates the DayGrid object this view needs. Draws from this.dayGridClass\r\n BasicView.prototype.instantiateDayGrid = function () {\r\n // generate a subclass on the fly with BasicView-specific behavior\r\n // TODO: cache this subclass\r\n var subclass = makeDayGridSubclass(this.dayGridClass);\r\n return new subclass(this);\r\n };\r\n BasicView.prototype.executeDateRender = function (dateProfile) {\r\n this.dayGrid.breakOnWeeks = /year|month|week/.test(dateProfile.currentRangeUnit);\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n };\r\n BasicView.prototype.renderSkeleton = function () {\r\n var dayGridContainerEl;\r\n var dayGridEl;\r\n this.el.addClass('fc-basic-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container');\r\n dayGridEl = $('
').appendTo(dayGridContainerEl);\r\n this.el.find('.fc-body > tr > td').append(dayGridContainerEl);\r\n this.dayGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.dayGrid.setElement(dayGridEl);\r\n };\r\n BasicView.prototype.unrenderSkeleton = function () {\r\n this.dayGrid.removeElement();\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid component will render inside of a container defined by this HTML.\r\n BasicView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the week number column, if it is known\r\n BasicView.prototype.weekNumberStyleAttr = function () {\r\n if (this.weekNumberWidth != null) {\r\n return 'style=\"width:' + this.weekNumberWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n // Determines whether each row should have a constant height\r\n BasicView.prototype.hasRigidRows = function () {\r\n var eventLimit = this.opt('eventLimit');\r\n return eventLimit && typeof eventLimit !== 'number';\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Refreshes the horizontal dimensions of the view\r\n BasicView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit = this.opt('eventLimit');\r\n var headRowEl = this.dayGrid.headContainerEl.find('.fc-row');\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n // hack to give the view some height prior to dayGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS dayGrid.\r\n if (!this.dayGrid.rowEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n if (this.dayGrid.colWeekNumbersVisible) {\r\n // Make sure all week number cells running down the side have the same width.\r\n // Record the width for cells created later.\r\n this.weekNumberWidth = util_1.matchCellWidths(this.el.find('.fc-week-number'));\r\n }\r\n // reset all heights to be natural\r\n this.scroller.clear();\r\n util_1.uncompensateScroll(headRowEl);\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n // is the event limit a constant level number?\r\n if (eventLimit && typeof eventLimit === 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\r\n }\r\n // distribute the height to the rows\r\n // (totalHeight is a \"recommended\" value if isAuto)\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.setGridHeight(scrollerHeight, isAuto);\r\n // is the event limit dynamically calculated?\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\r\n }\r\n if (!isAuto) {\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n util_1.compensateScroll(headRowEl, scrollbarWidths);\r\n // doing the scrollbar compensation might have created text overflow which created more height. redo\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n BasicView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n // Sets the height of just the DayGrid component in this view\r\n BasicView.prototype.setGridHeight = function (height, isAuto) {\r\n if (isAuto) {\r\n util_1.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\r\n }\r\n else {\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\r\n }\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n BasicView.prototype.computeInitialDateScroll = function () {\r\n return { top: 0 };\r\n };\r\n BasicView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n BasicView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n return BasicView;\r\n}(View_1.default));\r\nexports.default = BasicView;\r\nBasicView.prototype.dateProfileGeneratorClass = BasicViewDateProfileGenerator_1.default;\r\nBasicView.prototype.dayGridClass = DayGrid_1.default;\r\n// customize the rendering behavior of BasicView's dayGrid\r\nfunction makeDayGridSubclass(SuperClass) {\r\n return /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.colWeekNumbersVisible = false; // display week numbers along the side?\r\n return _this;\r\n }\r\n // Generates the HTML that will go before the day-of week header cells\r\n SubClass.prototype.renderHeadIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n util_1.htmlEscape(this.opt('weekNumberTitle')) +\r\n '' +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that will go before content-skeleton cells that display the day/week numbers\r\n SubClass.prototype.renderNumberIntroHtml = function (row) {\r\n var view = this.view;\r\n var weekStart = this.getCellDate(row, 0);\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt === 1 }, weekStart.format('w') // inner HTML\r\n ) +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before the day bg cells for each day-row\r\n SubClass.prototype.renderBgIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before every other type of row generated by DayGrid.\r\n // Affects helper-skeleton and highlight-skeleton rows.\r\n SubClass.prototype.renderIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n SubClass.prototype.getIsNumbersVisible = function () {\r\n return DayGrid_1.default.prototype.getIsNumbersVisible.apply(this, arguments) || this.colWeekNumbersVisible;\r\n };\r\n return SubClass;\r\n }(SuperClass));\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 63 */,\r\n/* 64 */,\r\n/* 65 */,\r\n/* 66 */,\r\n/* 67 */,\r\n/* 68 */,\r\n/* 69 */,\r\n/* 70 */,\r\n/* 71 */,\r\n/* 72 */,\r\n/* 73 */,\r\n/* 74 */,\r\n/* 75 */,\r\n/* 76 */,\r\n/* 77 */,\r\n/* 78 */,\r\n/* 79 */,\r\n/* 80 */,\r\n/* 81 */,\r\n/* 82 */,\r\n/* 83 */,\r\n/* 84 */,\r\n/* 85 */,\r\n/* 86 */,\r\n/* 87 */,\r\n/* 88 */,\r\n/* 89 */,\r\n/* 90 */,\r\n/* 91 */,\r\n/* 92 */,\r\n/* 93 */,\r\n/* 94 */,\r\n/* 95 */,\r\n/* 96 */,\r\n/* 97 */,\r\n/* 98 */,\r\n/* 99 */,\r\n/* 100 */,\r\n/* 101 */,\r\n/* 102 */,\r\n/* 103 */,\r\n/* 104 */,\r\n/* 105 */,\r\n/* 106 */,\r\n/* 107 */,\r\n/* 108 */,\r\n/* 109 */,\r\n/* 110 */,\r\n/* 111 */,\r\n/* 112 */,\r\n/* 113 */,\r\n/* 114 */,\r\n/* 115 */,\r\n/* 116 */,\r\n/* 117 */,\r\n/* 118 */,\r\n/* 119 */,\r\n/* 120 */,\r\n/* 121 */,\r\n/* 122 */,\r\n/* 123 */,\r\n/* 124 */,\r\n/* 125 */,\r\n/* 126 */,\r\n/* 127 */,\r\n/* 128 */,\r\n/* 129 */,\r\n/* 130 */,\r\n/* 131 */,\r\n/* 132 */,\r\n/* 133 */,\r\n/* 134 */,\r\n/* 135 */,\r\n/* 136 */,\r\n/* 137 */,\r\n/* 138 */,\r\n/* 139 */,\r\n/* 140 */,\r\n/* 141 */,\r\n/* 142 */,\r\n/* 143 */,\r\n/* 144 */,\r\n/* 145 */,\r\n/* 146 */,\r\n/* 147 */,\r\n/* 148 */,\r\n/* 149 */,\r\n/* 150 */,\r\n/* 151 */,\r\n/* 152 */,\r\n/* 153 */,\r\n/* 154 */,\r\n/* 155 */,\r\n/* 156 */,\r\n/* 157 */,\r\n/* 158 */,\r\n/* 159 */,\r\n/* 160 */,\r\n/* 161 */,\r\n/* 162 */,\r\n/* 163 */,\r\n/* 164 */,\r\n/* 165 */,\r\n/* 166 */,\r\n/* 167 */,\r\n/* 168 */,\r\n/* 169 */,\r\n/* 170 */,\r\n/* 171 */,\r\n/* 172 */,\r\n/* 173 */,\r\n/* 174 */,\r\n/* 175 */,\r\n/* 176 */,\r\n/* 177 */,\r\n/* 178 */,\r\n/* 179 */,\r\n/* 180 */,\r\n/* 181 */,\r\n/* 182 */,\r\n/* 183 */,\r\n/* 184 */,\r\n/* 185 */,\r\n/* 186 */,\r\n/* 187 */,\r\n/* 188 */,\r\n/* 189 */,\r\n/* 190 */,\r\n/* 191 */,\r\n/* 192 */,\r\n/* 193 */,\r\n/* 194 */,\r\n/* 195 */,\r\n/* 196 */,\r\n/* 197 */,\r\n/* 198 */,\r\n/* 199 */,\r\n/* 200 */,\r\n/* 201 */,\r\n/* 202 */,\r\n/* 203 */,\r\n/* 204 */,\r\n/* 205 */,\r\n/* 206 */,\r\n/* 207 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar util_1 = __webpack_require__(35);\r\nvar Constraints = /** @class */ (function () {\r\n function Constraints(eventManager, _calendar) {\r\n this.eventManager = eventManager;\r\n this._calendar = _calendar;\r\n }\r\n Constraints.prototype.opt = function (name) {\r\n return this._calendar.opt(name);\r\n };\r\n /*\r\n determines if eventInstanceGroup is allowed,\r\n in relation to other EVENTS and business hours.\r\n */\r\n Constraints.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var eventDef = eventInstanceGroup.getEventDef();\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n var peerEventInstances = this.getPeerEventInstances(eventDef);\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var constraintVal = eventDef.getConstraint();\r\n var overlapVal = eventDef.getOverlap();\r\n var eventAllowFunc = this.opt('eventAllow');\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!this.isFootprintAllowed(eventFootprints[i].componentFootprint, peerEventFootprints, constraintVal, overlapVal, eventFootprints[i].eventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (eventAllowFunc) {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventAllowFunc(eventFootprints[i].componentFootprint.toLegacy(this._calendar), eventFootprints[i].getEventLegacy()) === false) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n Constraints.prototype.getPeerEventInstances = function (eventDef) {\r\n return this.eventManager.getEventInstancesWithoutId(eventDef.id);\r\n };\r\n Constraints.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n var peerEventInstances = this.eventManager.getEventInstances();\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var selectAllowFunc;\r\n if (this.isFootprintAllowed(componentFootprint, peerEventFootprints, this.opt('selectConstraint'), this.opt('selectOverlap'))) {\r\n selectAllowFunc = this.opt('selectAllow');\r\n if (selectAllowFunc) {\r\n return selectAllowFunc(componentFootprint.toLegacy(this._calendar)) !== false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.isFootprintAllowed = function (componentFootprint, peerEventFootprints, constraintVal, overlapVal, subjectEventInstance // optional\r\n ) {\r\n var constraintFootprints; // ComponentFootprint[]\r\n var overlapEventFootprints; // EventFootprint[]\r\n if (constraintVal != null) {\r\n constraintFootprints = this.constraintValToFootprints(constraintVal, componentFootprint.isAllDay);\r\n if (!this.isFootprintWithinConstraints(componentFootprint, constraintFootprints)) {\r\n return false;\r\n }\r\n }\r\n overlapEventFootprints = this.collectOverlapEventFootprints(peerEventFootprints, componentFootprint);\r\n if (overlapVal === false) {\r\n if (overlapEventFootprints.length) {\r\n return false;\r\n }\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!isOverlapsAllowedByFunc(overlapEventFootprints, overlapVal, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (subjectEventInstance) {\r\n if (!isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n // Constraint\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.isFootprintWithinConstraints = function (componentFootprint, constraintFootprints) {\r\n var i;\r\n for (i = 0; i < constraintFootprints.length; i++) {\r\n if (this.footprintContainsFootprint(constraintFootprints[i], componentFootprint)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.constraintValToFootprints = function (constraintVal, isAllDay) {\r\n var eventInstances;\r\n if (constraintVal === 'businessHours') {\r\n return this.buildCurrentBusinessFootprints(isAllDay);\r\n }\r\n else if (typeof constraintVal === 'object') {\r\n eventInstances = this.parseEventDefToInstances(constraintVal); // handles recurring events\r\n if (!eventInstances) {\r\n return this.parseFootprints(constraintVal);\r\n }\r\n else {\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n }\r\n else if (constraintVal != null) {\r\n eventInstances = this.eventManager.getEventInstancesWithId(constraintVal);\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n };\r\n // returns ComponentFootprint[]\r\n // uses current view's range\r\n Constraints.prototype.buildCurrentBusinessFootprints = function (isAllDay) {\r\n var view = this._calendar.view;\r\n var businessHourGenerator = view.get('businessHourGenerator');\r\n var unzonedRange = view.dateProfile.activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(isAllDay, unzonedRange);\r\n if (eventInstanceGroup) {\r\n return this.eventInstancesToFootprints(eventInstanceGroup.eventInstances);\r\n }\r\n else {\r\n return [];\r\n }\r\n };\r\n // conversion util\r\n Constraints.prototype.eventInstancesToFootprints = function (eventInstances) {\r\n var eventRanges = eventInstances.map(util_1.eventInstanceToEventRange);\r\n var eventFootprints = this.eventRangesToEventFootprints(eventRanges);\r\n return eventFootprints.map(util_1.eventFootprintToComponentFootprint);\r\n };\r\n // Overlap\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.collectOverlapEventFootprints = function (peerEventFootprints, targetFootprint) {\r\n var overlapEventFootprints = [];\r\n var i;\r\n for (i = 0; i < peerEventFootprints.length; i++) {\r\n if (this.footprintsIntersect(targetFootprint, peerEventFootprints[i].componentFootprint)) {\r\n overlapEventFootprints.push(peerEventFootprints[i]);\r\n }\r\n }\r\n return overlapEventFootprints;\r\n };\r\n // Conversion: eventDefs -> eventInstances -> eventRanges -> eventFootprints -> componentFootprints\r\n // ------------------------------------------------------------------------------------------------\r\n // NOTE: this might seem like repetitive code with the Grid class, however, this code is related to\r\n // constraints whereas the Grid code is related to rendering. Each approach might want to convert\r\n // eventRanges -> eventFootprints in a different way. Regardless, there are opportunities to make\r\n // this more DRY.\r\n /*\r\n Returns false on invalid input.\r\n */\r\n Constraints.prototype.parseEventDefToInstances = function (eventInput) {\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, new EventSource_1.default(this._calendar));\r\n if (!eventDef) {\r\n return false;\r\n }\r\n return eventDef.buildInstances(eventManager.currentPeriod.unzonedRange);\r\n };\r\n Constraints.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var i;\r\n var eventFootprints = [];\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// footprints\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n Constraints.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_1.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /*\r\n Parses footprints directly.\r\n Very similar to EventDateProfile::parse :(\r\n */\r\n Constraints.prototype.parseFootprints = function (rawInput) {\r\n var start;\r\n var end;\r\n if (rawInput.start) {\r\n start = this._calendar.moment(rawInput.start);\r\n if (!start.isValid()) {\r\n start = null;\r\n }\r\n }\r\n if (rawInput.end) {\r\n end = this._calendar.moment(rawInput.end);\r\n if (!end.isValid()) {\r\n end = null;\r\n }\r\n }\r\n return [\r\n new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), (start && !start.hasTime()) || (end && !end.hasTime()) // isAllDay\r\n )\r\n ];\r\n };\r\n // Footprint Utils\r\n // ----------------------------------------------------------------------------------------\r\n Constraints.prototype.footprintContainsFootprint = function (outerFootprint, innerFootprint) {\r\n return outerFootprint.unzonedRange.containsRange(innerFootprint.unzonedRange);\r\n };\r\n Constraints.prototype.footprintsIntersect = function (footprint0, footprint1) {\r\n return footprint0.unzonedRange.intersectsWith(footprint1.unzonedRange);\r\n };\r\n return Constraints;\r\n}());\r\nexports.default = Constraints;\r\n// optional subjectEventInstance\r\nfunction isOverlapsAllowedByFunc(overlapEventFootprints, overlapFunc, subjectEventInstance) {\r\n var i;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n if (!overlapFunc(overlapEventFootprints[i].eventInstance.toLegacy(), subjectEventInstance ? subjectEventInstance.toLegacy() : null)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance) {\r\n var subjectLegacyInstance = subjectEventInstance.toLegacy();\r\n var i;\r\n var overlapEventInstance;\r\n var overlapEventDef;\r\n var overlapVal;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n overlapEventInstance = overlapEventFootprints[i].eventInstance;\r\n overlapEventDef = overlapEventInstance.def;\r\n // don't need to pass in calendar, because don't want to consider global eventOverlap property,\r\n // because we already considered that earlier in the process.\r\n overlapVal = overlapEventDef.getOverlap();\r\n if (overlapVal === false) {\r\n return false;\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!overlapVal(overlapEventInstance.toLegacy(), subjectLegacyInstance)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 208 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as ParsableModelMixin, ParsableModelInterface } from './ParsableModelMixin'\r\nin class:\r\n applyProps: ParsableModelInterface['applyProps']\r\n applyManualStandardProps: ParsableModelInterface['applyManualStandardProps']\r\n applyMiscProps: ParsableModelInterface['applyMiscProps']\r\n isStandardProp: ParsableModelInterface['isStandardProp']\r\n static defineStandardProps = ParsableModelMixin.defineStandardProps\r\n static copyVerbatimStandardProps = ParsableModelMixin.copyVerbatimStandardProps\r\nafter class:\r\n ParsableModelMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar ParsableModelMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ParsableModelMixin, _super);\r\n function ParsableModelMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ParsableModelMixin.defineStandardProps = function (propDefs) {\r\n var proto = this.prototype;\r\n if (!proto.hasOwnProperty('standardPropMap')) {\r\n proto.standardPropMap = Object.create(proto.standardPropMap);\r\n }\r\n util_1.copyOwnProps(propDefs, proto.standardPropMap);\r\n };\r\n ParsableModelMixin.copyVerbatimStandardProps = function (src, dest) {\r\n var map = this.prototype.standardPropMap;\r\n var propName;\r\n for (propName in map) {\r\n if (src[propName] != null && // in the src object?\r\n map[propName] === true // false means \"copy verbatim\"\r\n ) {\r\n dest[propName] = src[propName];\r\n }\r\n }\r\n };\r\n /*\r\n Returns true/false for success.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyProps = function (rawProps) {\r\n var standardPropMap = this.standardPropMap;\r\n var manualProps = {};\r\n var miscProps = {};\r\n var propName;\r\n for (propName in rawProps) {\r\n if (standardPropMap[propName] === true) {\r\n this[propName] = rawProps[propName];\r\n }\r\n else if (standardPropMap[propName] === false) {\r\n manualProps[propName] = rawProps[propName];\r\n }\r\n else {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n this.applyMiscProps(miscProps);\r\n return this.applyManualStandardProps(manualProps);\r\n };\r\n /*\r\n If subclasses override, they must call this supermethod and return the boolean response.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyManualStandardProps = function (rawProps) {\r\n return true;\r\n };\r\n /*\r\n Can be called even after initial object creation.\r\n */\r\n ParsableModelMixin.prototype.applyMiscProps = function (rawProps) {\r\n // subclasses can implement\r\n };\r\n /*\r\n TODO: why is this a method when defineStandardProps is static\r\n */\r\n ParsableModelMixin.prototype.isStandardProp = function (propName) {\r\n return propName in this.standardPropMap;\r\n };\r\n return ParsableModelMixin;\r\n}(Mixin_1.default));\r\nexports.default = ParsableModelMixin;\r\nParsableModelMixin.prototype.standardPropMap = {}; // will be cloned by defineStandardProps\r\n\r\n\r\n/***/ }),\r\n/* 209 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventInstance = /** @class */ (function () {\r\n function EventInstance(def, dateProfile) {\r\n this.def = def;\r\n this.dateProfile = dateProfile;\r\n }\r\n EventInstance.prototype.toLegacy = function () {\r\n var dateProfile = this.dateProfile;\r\n var obj = this.def.toLegacy();\r\n obj.start = dateProfile.start.clone();\r\n obj.end = dateProfile.end ? dateProfile.end.clone() : null;\r\n return obj;\r\n };\r\n return EventInstance;\r\n}());\r\nexports.default = EventInstance;\r\n\r\n\r\n/***/ }),\r\n/* 210 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar RecurringEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(RecurringEventDef, _super);\r\n function RecurringEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n RecurringEventDef.prototype.isAllDay = function () {\r\n return !this.startTime && !this.endTime;\r\n };\r\n RecurringEventDef.prototype.buildInstances = function (unzonedRange) {\r\n var calendar = this.source.calendar;\r\n var unzonedDate = unzonedRange.getStart();\r\n var unzonedEnd = unzonedRange.getEnd();\r\n var zonedDayStart;\r\n var instanceStart;\r\n var instanceEnd;\r\n var instances = [];\r\n while (unzonedDate.isBefore(unzonedEnd)) {\r\n // if everyday, or this particular day-of-week\r\n if (!this.dowHash || this.dowHash[unzonedDate.day()]) {\r\n zonedDayStart = calendar.applyTimezone(unzonedDate);\r\n instanceStart = zonedDayStart.clone();\r\n instanceEnd = null;\r\n if (this.startTime) {\r\n instanceStart.time(this.startTime);\r\n }\r\n else {\r\n instanceStart.stripTime();\r\n }\r\n if (this.endTime) {\r\n instanceEnd = zonedDayStart.clone().time(this.endTime);\r\n }\r\n instances.push(new EventInstance_1.default(this, // definition\r\n new EventDateProfile_1.default(instanceStart, instanceEnd, calendar)));\r\n }\r\n unzonedDate.add(1, 'days');\r\n }\r\n return instances;\r\n };\r\n RecurringEventDef.prototype.setDow = function (dowNumbers) {\r\n if (!this.dowHash) {\r\n this.dowHash = {};\r\n }\r\n for (var i = 0; i < dowNumbers.length; i++) {\r\n this.dowHash[dowNumbers[i]] = true;\r\n }\r\n };\r\n RecurringEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n if (def.startTime) {\r\n def.startTime = moment.duration(this.startTime);\r\n }\r\n if (def.endTime) {\r\n def.endTime = moment.duration(this.endTime);\r\n }\r\n if (this.dowHash) {\r\n def.dowHash = $.extend({}, this.dowHash);\r\n }\r\n return def;\r\n };\r\n return RecurringEventDef;\r\n}(EventDef_1.default));\r\nexports.default = RecurringEventDef;\r\n/*\r\nHACK to work with TypeScript mixins\r\nNOTE: if super-method fails, should still attempt to apply\r\n*/\r\nRecurringEventDef.prototype.applyProps = function (rawProps) {\r\n var superSuccess = EventDef_1.default.prototype.applyProps.call(this, rawProps);\r\n if (rawProps.start) {\r\n this.startTime = moment.duration(rawProps.start);\r\n }\r\n if (rawProps.end) {\r\n this.endTime = moment.duration(rawProps.end);\r\n }\r\n if (rawProps.dow) {\r\n this.setDow(rawProps.dow);\r\n }\r\n return superSuccess;\r\n};\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nRecurringEventDef.defineStandardProps({\r\n start: false,\r\n end: false,\r\n dow: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 211 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange = /** @class */ (function () {\r\n function EventRange(unzonedRange, eventDef, eventInstance) {\r\n this.unzonedRange = unzonedRange;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n return EventRange;\r\n}());\r\nexports.default = EventRange;\r\n\r\n\r\n/***/ }),\r\n/* 212 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar BUSINESS_HOUR_EVENT_DEFAULTS = {\r\n start: '09:00',\r\n end: '17:00',\r\n dow: [1, 2, 3, 4, 5],\r\n rendering: 'inverse-background'\r\n // classNames are defined in businessHoursSegClasses\r\n};\r\nvar BusinessHourGenerator = /** @class */ (function () {\r\n function BusinessHourGenerator(rawComplexDef, calendar) {\r\n this.rawComplexDef = rawComplexDef;\r\n this.calendar = calendar;\r\n }\r\n BusinessHourGenerator.prototype.buildEventInstanceGroup = function (isAllDay, unzonedRange) {\r\n var eventDefs = this.buildEventDefs(isAllDay);\r\n var eventInstanceGroup;\r\n if (eventDefs.length) {\r\n eventInstanceGroup = new EventInstanceGroup_1.default(util_1.eventDefsToEventInstances(eventDefs, unzonedRange));\r\n // so that inverse-background rendering can happen even when no eventRanges in view\r\n eventInstanceGroup.explicitEventDef = eventDefs[0];\r\n return eventInstanceGroup;\r\n }\r\n };\r\n BusinessHourGenerator.prototype.buildEventDefs = function (isAllDay) {\r\n var rawComplexDef = this.rawComplexDef;\r\n var rawDefs = [];\r\n var requireDow = false;\r\n var i;\r\n var defs = [];\r\n if (rawComplexDef === true) {\r\n rawDefs = [{}]; // will get BUSINESS_HOUR_EVENT_DEFAULTS verbatim\r\n }\r\n else if ($.isPlainObject(rawComplexDef)) {\r\n rawDefs = [rawComplexDef];\r\n }\r\n else if ($.isArray(rawComplexDef)) {\r\n rawDefs = rawComplexDef;\r\n requireDow = true; // every sub-definition NEEDS a day-of-week\r\n }\r\n for (i = 0; i < rawDefs.length; i++) {\r\n if (!requireDow || rawDefs[i].dow) {\r\n defs.push(this.buildEventDef(isAllDay, rawDefs[i]));\r\n }\r\n }\r\n return defs;\r\n };\r\n BusinessHourGenerator.prototype.buildEventDef = function (isAllDay, rawDef) {\r\n var fullRawDef = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, rawDef);\r\n if (isAllDay) {\r\n fullRawDef.start = null;\r\n fullRawDef.end = null;\r\n }\r\n return RecurringEventDef_1.default.parse(fullRawDef, new EventSource_1.default(this.calendar) // dummy source\r\n );\r\n };\r\n return BusinessHourGenerator;\r\n}());\r\nexports.default = BusinessHourGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 213 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar StandardTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardTheme, _super);\r\n function StandardTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardTheme;\r\n}(Theme_1.default));\r\nexports.default = StandardTheme;\r\nStandardTheme.prototype.classes = {\r\n widget: 'fc-unthemed',\r\n widgetHeader: 'fc-widget-header',\r\n widgetContent: 'fc-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'fc-button',\r\n cornerLeft: 'fc-corner-left',\r\n cornerRight: 'fc-corner-right',\r\n stateDefault: 'fc-state-default',\r\n stateActive: 'fc-state-active',\r\n stateDisabled: 'fc-state-disabled',\r\n stateHover: 'fc-state-hover',\r\n stateDown: 'fc-state-down',\r\n popoverHeader: 'fc-widget-header',\r\n popoverContent: 'fc-widget-content',\r\n // day grid\r\n headerRow: 'fc-widget-header',\r\n dayRow: 'fc-widget-content',\r\n // list view\r\n listView: 'fc-widget-content'\r\n};\r\nStandardTheme.prototype.baseIconClass = 'fc-icon';\r\nStandardTheme.prototype.iconClasses = {\r\n close: 'fc-icon-x',\r\n prev: 'fc-icon-left-single-arrow',\r\n next: 'fc-icon-right-single-arrow',\r\n prevYear: 'fc-icon-left-double-arrow',\r\n nextYear: 'fc-icon-right-double-arrow'\r\n};\r\nStandardTheme.prototype.iconOverrideOption = 'buttonIcons';\r\nStandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';\r\nStandardTheme.prototype.iconOverridePrefix = 'fc-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 214 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar JqueryUiTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(JqueryUiTheme, _super);\r\n function JqueryUiTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return JqueryUiTheme;\r\n}(Theme_1.default));\r\nexports.default = JqueryUiTheme;\r\nJqueryUiTheme.prototype.classes = {\r\n widget: 'ui-widget',\r\n widgetHeader: 'ui-widget-header',\r\n widgetContent: 'ui-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'ui-button',\r\n cornerLeft: 'ui-corner-left',\r\n cornerRight: 'ui-corner-right',\r\n stateDefault: 'ui-state-default',\r\n stateActive: 'ui-state-active',\r\n stateDisabled: 'ui-state-disabled',\r\n stateHover: 'ui-state-hover',\r\n stateDown: 'ui-state-down',\r\n today: 'ui-state-highlight',\r\n popoverHeader: 'ui-widget-header',\r\n popoverContent: 'ui-widget-content',\r\n // day grid\r\n headerRow: 'ui-widget-header',\r\n dayRow: 'ui-widget-content',\r\n // list view\r\n listView: 'ui-widget-content'\r\n};\r\nJqueryUiTheme.prototype.baseIconClass = 'ui-icon';\r\nJqueryUiTheme.prototype.iconClasses = {\r\n close: 'ui-icon-closethick',\r\n prev: 'ui-icon-circle-triangle-w',\r\n next: 'ui-icon-circle-triangle-e',\r\n prevYear: 'ui-icon-seek-prev',\r\n nextYear: 'ui-icon-seek-next'\r\n};\r\nJqueryUiTheme.prototype.iconOverrideOption = 'themeButtonIcons';\r\nJqueryUiTheme.prototype.iconOverrideCustomButtonOption = 'themeIcon';\r\nJqueryUiTheme.prototype.iconOverridePrefix = 'ui-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 215 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar FuncEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(FuncEventSource, _super);\r\n function FuncEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n FuncEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isFunction(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isFunction(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n FuncEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.func.call(_this.calendar, start.clone(), end.clone(), timezone, function (rawEventDefs) {\r\n _this.calendar.popLoading();\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n });\r\n });\r\n };\r\n FuncEventSource.prototype.getPrimitive = function () {\r\n return this.func;\r\n };\r\n FuncEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.func = rawProps.events;\r\n return superSuccess;\r\n };\r\n return FuncEventSource;\r\n}(EventSource_1.default));\r\nexports.default = FuncEventSource;\r\nFuncEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 216 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar JsonFeedEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(JsonFeedEventSource, _super);\r\n function JsonFeedEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n JsonFeedEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if (typeof rawInput.url === 'string') {\r\n rawProps = rawInput;\r\n }\r\n else if (typeof rawInput === 'string') {\r\n rawProps = { url: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n JsonFeedEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n var ajaxSettings = this.ajaxSettings;\r\n var onSuccess = ajaxSettings.success;\r\n var onError = ajaxSettings.error;\r\n var requestParams = this.buildRequestParams(start, end, timezone);\r\n // todo: eventually handle the promise's then,\r\n // don't intercept success/error\r\n // tho will be a breaking API change\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve, onReject) {\r\n $.ajax($.extend({}, // destination\r\n JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {\r\n url: _this.url,\r\n data: requestParams,\r\n success: function (rawEventDefs, status, xhr) {\r\n var callbackRes;\r\n _this.calendar.popLoading();\r\n if (rawEventDefs) {\r\n callbackRes = util_1.applyAll(onSuccess, _this, [rawEventDefs, status, xhr]); // redirect `this`\r\n if ($.isArray(callbackRes)) {\r\n rawEventDefs = callbackRes;\r\n }\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n }\r\n else {\r\n onReject();\r\n }\r\n },\r\n error: function (xhr, statusText, errorThrown) {\r\n _this.calendar.popLoading();\r\n util_1.applyAll(onError, _this, [xhr, statusText, errorThrown]); // redirect `this`\r\n onReject();\r\n }\r\n }));\r\n });\r\n };\r\n JsonFeedEventSource.prototype.buildRequestParams = function (start, end, timezone) {\r\n var calendar = this.calendar;\r\n var ajaxSettings = this.ajaxSettings;\r\n var startParam;\r\n var endParam;\r\n var timezoneParam;\r\n var customRequestParams;\r\n var params = {};\r\n startParam = this.startParam;\r\n if (startParam == null) {\r\n startParam = calendar.opt('startParam');\r\n }\r\n endParam = this.endParam;\r\n if (endParam == null) {\r\n endParam = calendar.opt('endParam');\r\n }\r\n timezoneParam = this.timezoneParam;\r\n if (timezoneParam == null) {\r\n timezoneParam = calendar.opt('timezoneParam');\r\n }\r\n // retrieve any outbound GET/POST $.ajax data from the options\r\n if ($.isFunction(ajaxSettings.data)) {\r\n // supplied as a function that returns a key/value object\r\n customRequestParams = ajaxSettings.data();\r\n }\r\n else {\r\n // probably supplied as a straight key/value object\r\n customRequestParams = ajaxSettings.data || {};\r\n }\r\n $.extend(params, customRequestParams);\r\n/////////////// convert to UTC\r\n// params[startParam] = start.format();\r\n// params[endParam] = end.format();\r\n params[startParam] = start.toISOString();\r\n params[endParam] = end.toISOString();\r\n if (timezone && timezone !== 'local') {\r\n params[timezoneParam] = timezone;\r\n }\r\n return params;\r\n };\r\n JsonFeedEventSource.prototype.getPrimitive = function () {\r\n return this.url;\r\n };\r\n JsonFeedEventSource.prototype.applyMiscProps = function (rawProps) {\r\n this.ajaxSettings = rawProps;\r\n };\r\n JsonFeedEventSource.AJAX_DEFAULTS = {\r\n dataType: 'json',\r\n cache: false\r\n };\r\n return JsonFeedEventSource;\r\n}(EventSource_1.default));\r\nexports.default = JsonFeedEventSource;\r\nJsonFeedEventSource.defineStandardProps({\r\n // automatically transfer (true)...\r\n url: true,\r\n startParam: true,\r\n endParam: true,\r\n timezoneParam: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 217 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar TaskQueue = /** @class */ (function () {\r\n function TaskQueue() {\r\n this.q = [];\r\n this.isPaused = false;\r\n this.isRunning = false;\r\n }\r\n TaskQueue.prototype.queue = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this.q.push.apply(this.q, args); // append\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.pause = function () {\r\n this.isPaused = true;\r\n };\r\n TaskQueue.prototype.resume = function () {\r\n this.isPaused = false;\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.getIsIdle = function () {\r\n return !this.isRunning && !this.isPaused;\r\n };\r\n TaskQueue.prototype.tryStart = function () {\r\n if (!this.isRunning && this.canRunNext()) {\r\n this.isRunning = true;\r\n this.trigger('start');\r\n this.runRemaining();\r\n }\r\n };\r\n TaskQueue.prototype.canRunNext = function () {\r\n return !this.isPaused && this.q.length;\r\n };\r\n TaskQueue.prototype.runRemaining = function () {\r\n var _this = this;\r\n var task;\r\n var res;\r\n do {\r\n task = this.q.shift(); // always freshly reference q. might have been reassigned.\r\n res = this.runTask(task);\r\n if (res && res.then) {\r\n res.then(function () {\r\n if (_this.canRunNext()) {\r\n _this.runRemaining();\r\n }\r\n });\r\n return; // prevent marking as stopped\r\n }\r\n } while (this.canRunNext());\r\n this.trigger('stop'); // not really a 'stop' ... more of a 'drained'\r\n this.isRunning = false;\r\n // if 'stop' handler added more tasks.... TODO: write test for this\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.runTask = function (task) {\r\n return task(); // task *is* the function, but subclasses can change the format of a task\r\n };\r\n return TaskQueue;\r\n}());\r\nexports.default = TaskQueue;\r\nEmitterMixin_1.default.mixInto(TaskQueue);\r\n\r\n\r\n/***/ }),\r\n/* 218 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nvar RenderQueue = /** @class */ (function (_super) {\r\n tslib_1.__extends(RenderQueue, _super);\r\n function RenderQueue(waitsByNamespace) {\r\n var _this = _super.call(this) || this;\r\n _this.waitsByNamespace = waitsByNamespace || {};\r\n return _this;\r\n }\r\n RenderQueue.prototype.queue = function (taskFunc, namespace, type) {\r\n var task = {\r\n func: taskFunc,\r\n namespace: namespace,\r\n type: type\r\n };\r\n var waitMs;\r\n if (namespace) {\r\n waitMs = this.waitsByNamespace[namespace];\r\n }\r\n if (this.waitNamespace) {\r\n if (namespace === this.waitNamespace && waitMs != null) {\r\n this.delayWait(waitMs);\r\n }\r\n else {\r\n this.clearWait();\r\n this.tryStart();\r\n }\r\n }\r\n if (this.compoundTask(task)) {\r\n if (!this.waitNamespace && waitMs != null) {\r\n this.startWait(namespace, waitMs);\r\n }\r\n else {\r\n this.tryStart();\r\n }\r\n }\r\n };\r\n RenderQueue.prototype.startWait = function (namespace, waitMs) {\r\n this.waitNamespace = namespace;\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.delayWait = function (waitMs) {\r\n clearTimeout(this.waitId);\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.spawnWait = function (waitMs) {\r\n var _this = this;\r\n this.waitId = setTimeout(function () {\r\n _this.waitNamespace = null;\r\n _this.tryStart();\r\n }, waitMs);\r\n };\r\n RenderQueue.prototype.clearWait = function () {\r\n if (this.waitNamespace) {\r\n clearTimeout(this.waitId);\r\n this.waitId = null;\r\n this.waitNamespace = null;\r\n }\r\n };\r\n RenderQueue.prototype.canRunNext = function () {\r\n if (!_super.prototype.canRunNext.call(this)) {\r\n return false;\r\n }\r\n // waiting for a certain namespace to stop receiving tasks?\r\n if (this.waitNamespace) {\r\n var q = this.q;\r\n // if there was a different namespace task in the meantime,\r\n // that forces all previously-waiting tasks to suddenly execute.\r\n // TODO: find a way to do this in constant time.\r\n for (var i = 0; i < q.length; i++) {\r\n if (q[i].namespace !== this.waitNamespace) {\r\n return true; // allow execution\r\n }\r\n }\r\n return false;\r\n }\r\n return true;\r\n };\r\n RenderQueue.prototype.runTask = function (task) {\r\n task.func();\r\n };\r\n RenderQueue.prototype.compoundTask = function (newTask) {\r\n var q = this.q;\r\n var shouldAppend = true;\r\n var i;\r\n var task;\r\n if (newTask.namespace && newTask.type === 'destroy') {\r\n // remove all init/add/remove ops with same namespace, regardless of order\r\n for (i = q.length - 1; i >= 0; i--) {\r\n task = q[i];\r\n switch (task.type) {\r\n case 'init':\r\n shouldAppend = false;\r\n // the latest destroy is cancelled out by not doing the init\r\n /* falls through */\r\n case 'add':\r\n /* falls through */\r\n case 'remove':\r\n q.splice(i, 1); // remove task\r\n }\r\n }\r\n }\r\n if (shouldAppend) {\r\n q.push(newTask);\r\n }\r\n return shouldAppend;\r\n };\r\n return RenderQueue;\r\n}(TaskQueue_1.default));\r\nexports.default = RenderQueue;\r\n\r\n\r\n/***/ }),\r\n/* 219 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar date_formatting_1 = __webpack_require__(47);\r\nvar Component_1 = __webpack_require__(237);\r\nvar util_2 = __webpack_require__(35);\r\nvar DateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateComponent, _super);\r\n function DateComponent(_view, _options) {\r\n var _this = _super.call(this) || this;\r\n _this.isRTL = false; // frequently accessed options\r\n _this.hitsNeededDepth = 0; // necessary because multiple callers might need the same hits\r\n _this.hasAllDayBusinessHours = false; // TODO: unify with largeUnit and isTimeScale?\r\n _this.isDatesRendered = false;\r\n // hack to set options prior to the this.opt calls\r\n if (_view) {\r\n _this['view'] = _view;\r\n }\r\n if (_options) {\r\n _this['options'] = _options;\r\n }\r\n _this.uid = String(DateComponent.guid++);\r\n _this.childrenByUid = {};\r\n _this.nextDayThreshold = moment.duration(_this.opt('nextDayThreshold'));\r\n _this.isRTL = _this.opt('isRTL');\r\n if (_this.fillRendererClass) {\r\n _this.fillRenderer = new _this.fillRendererClass(_this);\r\n }\r\n if (_this.eventRendererClass) {\r\n _this.eventRenderer = new _this.eventRendererClass(_this, _this.fillRenderer);\r\n }\r\n if (_this.helperRendererClass && _this.eventRenderer) {\r\n _this.helperRenderer = new _this.helperRendererClass(_this, _this.eventRenderer);\r\n }\r\n if (_this.businessHourRendererClass && _this.fillRenderer) {\r\n _this.businessHourRenderer = new _this.businessHourRendererClass(_this, _this.fillRenderer);\r\n }\r\n return _this;\r\n }\r\n DateComponent.prototype.addChild = function (child) {\r\n if (!this.childrenByUid[child.uid]) {\r\n this.childrenByUid[child.uid] = child;\r\n return true;\r\n }\r\n return false;\r\n };\r\n DateComponent.prototype.removeChild = function (child) {\r\n if (this.childrenByUid[child.uid]) {\r\n delete this.childrenByUid[child.uid];\r\n return true;\r\n }\r\n return false;\r\n };\r\n // TODO: only do if isInDom?\r\n // TODO: make part of Component, along with children/batch-render system?\r\n DateComponent.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n this.callChildren('updateSize', arguments);\r\n };\r\n // Options\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.opt = function (name) {\r\n return this._getView().opt(name); // default implementation\r\n };\r\n DateComponent.prototype.publiclyTrigger = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.publiclyTrigger.apply(calendar, args);\r\n };\r\n DateComponent.prototype.hasPublicHandlers = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.hasPublicHandlers.apply(calendar, args);\r\n };\r\n // Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeDateRender = function (dateProfile) {\r\n this.dateProfile = dateProfile; // for rendering\r\n this.renderDates(dateProfile);\r\n this.isDatesRendered = true;\r\n this.callChildren('executeDateRender', arguments);\r\n };\r\n DateComponent.prototype.executeDateUnrender = function () {\r\n this.callChildren('executeDateUnrender', arguments);\r\n this.dateProfile = null;\r\n this.unrenderDates();\r\n this.isDatesRendered = false;\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.renderDates = function (dateProfile) {\r\n // subclasses should implement\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.unrenderDates = function () {\r\n // subclasses should override\r\n };\r\n // Now-Indicator\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator\r\n // should be refreshed. If something falsy is returned, no time indicator is rendered at all.\r\n DateComponent.prototype.getNowIndicatorUnit = function () {\r\n // subclasses should implement\r\n };\r\n // Renders a current time indicator at the given datetime\r\n DateComponent.prototype.renderNowIndicator = function (date) {\r\n this.callChildren('renderNowIndicator', arguments);\r\n };\r\n // Undoes the rendering actions from renderNowIndicator\r\n DateComponent.prototype.unrenderNowIndicator = function () {\r\n this.callChildren('unrenderNowIndicator', arguments);\r\n };\r\n // Business Hours\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.renderBusinessHours = function (businessHourGenerator) {\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.render(businessHourGenerator);\r\n }\r\n this.callChildren('renderBusinessHours', arguments);\r\n };\r\n // Unrenders previously-rendered business-hours\r\n DateComponent.prototype.unrenderBusinessHours = function () {\r\n this.callChildren('unrenderBusinessHours', arguments);\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.unrender();\r\n }\r\n };\r\n // Event Displaying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeEventRender = function (eventsPayload) {\r\n if (this.eventRenderer) {\r\n this.eventRenderer.rangeUpdated(); // poorly named now\r\n this.eventRenderer.render(eventsPayload);\r\n }\r\n else if (this['renderEvents']) {\r\n this['renderEvents'](convertEventsPayloadToLegacyArray(eventsPayload));\r\n }\r\n this.callChildren('executeEventRender', arguments);\r\n };\r\n DateComponent.prototype.executeEventUnrender = function () {\r\n this.callChildren('executeEventUnrender', arguments);\r\n if (this.eventRenderer) {\r\n this.eventRenderer.unrender();\r\n }\r\n else if (this['destroyEvents']) {\r\n this['destroyEvents']();\r\n }\r\n };\r\n DateComponent.prototype.getBusinessHourSegs = function () {\r\n var segs = this.getOwnBusinessHourSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getBusinessHourSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnBusinessHourSegs = function () {\r\n if (this.businessHourRenderer) {\r\n return this.businessHourRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n DateComponent.prototype.getEventSegs = function () {\r\n var segs = this.getOwnEventSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getEventSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnEventSegs = function () {\r\n if (this.eventRenderer) {\r\n return this.eventRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n // Event Rendering Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.triggerAfterEventsRendered = function () {\r\n this.triggerAfterEventSegsRendered(this.getEventSegs());\r\n this.publiclyTrigger('eventAfterAllRender', {\r\n context: this,\r\n args: [this]\r\n });\r\n };\r\n DateComponent.prototype.triggerAfterEventSegsRendered = function (segs) {\r\n var _this = this;\r\n // an optimization, because getEventLegacy is expensive\r\n if (this.hasPublicHandlers('eventAfterRender')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventAfterRender', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n DateComponent.prototype.triggerBeforeEventsDestroyed = function () {\r\n this.triggerBeforeEventSegsDestroyed(this.getEventSegs());\r\n };\r\n DateComponent.prototype.triggerBeforeEventSegsDestroyed = function (segs) {\r\n var _this = this;\r\n if (this.hasPublicHandlers('eventDestroy')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventDestroy', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n // Event Rendering Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Hides all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.showEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', '');\r\n }\r\n });\r\n this.callChildren('showEventsWithId', arguments);\r\n };\r\n // Shows all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.hideEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', 'hidden');\r\n }\r\n });\r\n this.callChildren('hideEventsWithId', arguments);\r\n };\r\n // Drag-n-Drop Rendering (for both events and external elements)\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of a event or external-element drag over the given drop zone.\r\n // If an external-element, seg will be `null`.\r\n // Must return elements used for any mock events.\r\n DateComponent.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var renderedHelper = false;\r\n this.iterChildren(function (child) {\r\n if (child.renderDrag(eventFootprints, seg, isTouch)) {\r\n renderedHelper = true;\r\n }\r\n });\r\n return renderedHelper;\r\n };\r\n // Unrenders a visual indication of an event or external-element being dragged.\r\n DateComponent.prototype.unrenderDrag = function () {\r\n this.callChildren('unrenderDrag', arguments);\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of an event being resized.\r\n DateComponent.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.callChildren('renderEventResize', arguments);\r\n };\r\n // Unrenders a visual indication of an event being resized.\r\n DateComponent.prototype.unrenderEventResize = function () {\r\n this.callChildren('unrenderEventResize', arguments);\r\n };\r\n // Selection\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of the selection\r\n // TODO: rename to `renderSelection` after legacy is gone\r\n DateComponent.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n this.renderHighlight(componentFootprint);\r\n this.callChildren('renderSelectionFootprint', arguments);\r\n };\r\n // Unrenders a visual indication of selection\r\n DateComponent.prototype.unrenderSelection = function () {\r\n this.unrenderHighlight();\r\n this.callChildren('unrenderSelection', arguments);\r\n };\r\n // Highlight\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data)\r\n DateComponent.prototype.renderHighlight = function (componentFootprint) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderFootprint('highlight', componentFootprint, {\r\n getClasses: function () {\r\n return ['fc-highlight'];\r\n }\r\n });\r\n }\r\n this.callChildren('renderHighlight', arguments);\r\n };\r\n // Unrenders the emphasis on a date range\r\n DateComponent.prototype.unrenderHighlight = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('highlight');\r\n }\r\n this.callChildren('unrenderHighlight', arguments);\r\n };\r\n // Hit Areas\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // just because all DateComponents support this interface\r\n // doesn't mean they need to have their own internal coord system. they can defer to sub-components.\r\n DateComponent.prototype.hitsNeeded = function () {\r\n if (!(this.hitsNeededDepth++)) {\r\n this.prepareHits();\r\n }\r\n this.callChildren('hitsNeeded', arguments);\r\n };\r\n DateComponent.prototype.hitsNotNeeded = function () {\r\n if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {\r\n this.releaseHits();\r\n }\r\n this.callChildren('hitsNotNeeded', arguments);\r\n };\r\n DateComponent.prototype.prepareHits = function () {\r\n // subclasses can implement\r\n };\r\n DateComponent.prototype.releaseHits = function () {\r\n // subclasses can implement\r\n };\r\n // Given coordinates from the topleft of the document, return data about the date-related area underneath.\r\n // Can return an object with arbitrary properties (although top/right/left/bottom are encouraged).\r\n // Must have a `grid` property, a reference to this current grid. TODO: avoid this\r\n // The returned object will be processed by getHitFootprint and getHitEl.\r\n DateComponent.prototype.queryHit = function (leftOffset, topOffset) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n var hit;\r\n for (uid in childrenByUid) {\r\n hit = childrenByUid[uid].queryHit(leftOffset, topOffset);\r\n if (hit) {\r\n break;\r\n }\r\n }\r\n return hit;\r\n };\r\n DateComponent.prototype.getSafeHitFootprint = function (hit) {\r\n var footprint = this.getHitFootprint(hit);\r\n if (!this.dateProfile.activeUnzonedRange.containsRange(footprint.unzonedRange)) {\r\n return null;\r\n }\r\n return footprint;\r\n };\r\n DateComponent.prototype.getHitFootprint = function (hit) {\r\n // what about being abstract!?\r\n };\r\n // Given position-level information about a date-related area within the grid,\r\n // should return a jQuery element that best represents it. passed to dayClick callback.\r\n DateComponent.prototype.getHitEl = function (hit) {\r\n // what about being abstract!?\r\n };\r\n /* Converting eventRange -> eventFootprint\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var eventFootprints = [];\r\n var i;\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// append\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n DateComponent.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_2.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /* Converting componentFootprint/eventFootprint -> segs\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventFootprintsToSegs = function (eventFootprints) {\r\n var segs = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n segs.push.apply(segs, this.eventFootprintToSegs(eventFootprints[i]));\r\n }\r\n return segs;\r\n };\r\n // Given an event's span (unzoned start/end and other misc data), and the event itself,\r\n // slices into segments and attaches event-derived properties to them.\r\n // eventSpan - { start, end, isStart, isEnd, otherthings... }\r\n DateComponent.prototype.eventFootprintToSegs = function (eventFootprint) {\r\n var unzonedRange = eventFootprint.componentFootprint.unzonedRange;\r\n var segs;\r\n var i;\r\n var seg;\r\n segs = this.componentFootprintToSegs(eventFootprint.componentFootprint);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (!unzonedRange.isStart) {\r\n seg.isStart = false;\r\n }\r\n if (!unzonedRange.isEnd) {\r\n seg.isEnd = false;\r\n }\r\n seg.footprint = eventFootprint;\r\n // TODO: rename to seg.eventFootprint\r\n }\r\n return segs;\r\n };\r\n DateComponent.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n return [];\r\n };\r\n // Utils\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.callChildren = function (methodName, args) {\r\n this.iterChildren(function (child) {\r\n child[methodName].apply(child, args);\r\n });\r\n };\r\n DateComponent.prototype.iterChildren = function (func) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n for (uid in childrenByUid) {\r\n func(childrenByUid[uid]);\r\n }\r\n };\r\n DateComponent.prototype._getCalendar = function () {\r\n var t = this;\r\n return t.calendar || t.view.calendar;\r\n };\r\n DateComponent.prototype._getView = function () {\r\n return this.view;\r\n };\r\n DateComponent.prototype._getDateProfile = function () {\r\n return this._getView().get('dateProfile');\r\n };\r\n // Generates HTML for an anchor to another view into the calendar.\r\n // Will either generate an
tag or a non-clickable tag, depending on enabled settings.\r\n // `gotoOptions` can either be a moment input, or an object with the form:\r\n // { date, type, forceOff }\r\n // `type` is a view-type like \"day\" or \"week\". default value is \"day\".\r\n // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.\r\n DateComponent.prototype.buildGotoAnchorHtml = function (gotoOptions, attrs, innerHtml) {\r\n var date;\r\n var type;\r\n var forceOff;\r\n var finalOptions;\r\n if ($.isPlainObject(gotoOptions)) {\r\n date = gotoOptions.date;\r\n type = gotoOptions.type;\r\n forceOff = gotoOptions.forceOff;\r\n }\r\n else {\r\n date = gotoOptions; // a single moment input\r\n }\r\n date = moment_ext_1.default(date); // if a string, parse it\r\n finalOptions = {\r\n date: date.format('YYYY-MM-DD'),\r\n type: type || 'day'\r\n };\r\n if (typeof attrs === 'string') {\r\n innerHtml = attrs;\r\n attrs = null;\r\n }\r\n attrs = attrs ? ' ' + util_1.attrsToStr(attrs) : ''; // will have a leading space\r\n innerHtml = innerHtml || '';\r\n if (!forceOff && this.opt('navLinks')) {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n else {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n };\r\n DateComponent.prototype.getAllDayHtml = function () {\r\n return this.opt('allDayHtml') || util_1.htmlEscape(this.opt('allDayText'));\r\n };\r\n // Computes HTML classNames for a single-day element\r\n DateComponent.prototype.getDayClasses = function (date, noThemeHighlight) {\r\n var view = this._getView();\r\n var classes = [];\r\n var today;\r\n if (!this.dateProfile.activeUnzonedRange.containsDate(date)) {\r\n classes.push('fc-disabled-day'); // TODO: jQuery UI theme?\r\n }\r\n else {\r\n classes.push('fc-' + util_1.dayIDs[date.day()]);\r\n if (view.isDateInOtherMonth(date, this.dateProfile)) {\r\n classes.push('fc-other-month');\r\n }\r\n today = view.calendar.getNow();\r\n if (date.isSame(today, 'day')) {\r\n classes.push('fc-today');\r\n if (noThemeHighlight !== true) {\r\n classes.push(view.calendar.theme.getClass('today'));\r\n }\r\n }\r\n else if (date < today) {\r\n classes.push('fc-past');\r\n }\r\n else {\r\n classes.push('fc-future');\r\n }\r\n }\r\n return classes;\r\n };\r\n // Utility for formatting a range. Accepts a range object, formatting string, and optional separator.\r\n // Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.\r\n // The timezones of the dates within `range` will be respected.\r\n DateComponent.prototype.formatRange = function (range, isAllDay, formatStr, separator) {\r\n var end = range.end;\r\n if (isAllDay) {\r\n end = end.clone().subtract(1); // convert to inclusive. last ms of previous day\r\n }\r\n return date_formatting_1.formatRange(range.start, end, formatStr, separator, this.isRTL);\r\n };\r\n // Compute the number of the give units in the \"current\" range.\r\n // Will return a floating-point number. Won't round.\r\n DateComponent.prototype.currentRangeAs = function (unit) {\r\n return this._getDateProfile().currentUnzonedRange.as(unit);\r\n };\r\n // Returns the date range of the full days the given range visually appears to occupy.\r\n // Returns a plain object with start/end, NOT an UnzonedRange!\r\n DateComponent.prototype.computeDayRange = function (unzonedRange) {\r\n var calendar = this._getCalendar();\r\n var startDay = calendar.msToUtcMoment(unzonedRange.startMs, true); // the beginning of the day the range starts\r\n var end = calendar.msToUtcMoment(unzonedRange.endMs);\r\n var endTimeMS = +end.time(); // # of milliseconds into `endDay`\r\n var endDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends\r\n // If the end time is actually inclusively part of the next day and is equal to or\r\n // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\r\n // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\r\n if (endTimeMS && endTimeMS >= this.nextDayThreshold) {\r\n endDay.add(1, 'days');\r\n }\r\n // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.\r\n if (endDay <= startDay) {\r\n endDay = startDay.clone().add(1, 'days');\r\n }\r\n return { start: startDay, end: endDay };\r\n };\r\n // Does the given range visually appear to occupy more than one day?\r\n DateComponent.prototype.isMultiDayRange = function (unzonedRange) {\r\n var dayRange = this.computeDayRange(unzonedRange);\r\n return dayRange.end.diff(dayRange.start, 'days') > 1;\r\n };\r\n DateComponent.guid = 0; // TODO: better system for this?\r\n return DateComponent;\r\n}(Component_1.default));\r\nexports.default = DateComponent;\r\n// legacy\r\nfunction convertEventsPayloadToLegacyArray(eventsPayload) {\r\n var eventDefId;\r\n var eventInstances;\r\n var legacyEvents = [];\r\n var i;\r\n for (eventDefId in eventsPayload) {\r\n eventInstances = eventsPayload[eventDefId].eventInstances;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n legacyEvents.push(eventInstances[i].toLegacy());\r\n }\r\n }\r\n return legacyEvents;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 220 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar Iterator_1 = __webpack_require__(238);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Toolbar_1 = __webpack_require__(239);\r\nvar OptionsManager_1 = __webpack_require__(240);\r\nvar ViewSpecManager_1 = __webpack_require__(241);\r\nvar Constraints_1 = __webpack_require__(207);\r\nvar locale_1 = __webpack_require__(31);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventManager_1 = __webpack_require__(242);\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar Calendar = /** @class */ (function () {\r\n function Calendar(el, overrides) {\r\n this.loadingLevel = 0; // number of simultaneous loading tasks\r\n this.ignoreUpdateViewSize = 0;\r\n this.freezeContentHeightDepth = 0;\r\n // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.\r\n // unneeded() is called in destroy.\r\n GlobalEmitter_1.default.needed();\r\n this.el = el;\r\n this.viewsByType = {};\r\n this.optionsManager = new OptionsManager_1.default(this, overrides);\r\n this.viewSpecManager = new ViewSpecManager_1.default(this.optionsManager, this);\r\n this.initMomentInternals(); // needs to happen after options hash initialized\r\n this.initCurrentDate();\r\n this.initEventManager();\r\n this.constraints = new Constraints_1.default(this.eventManager, this);\r\n this.constructed();\r\n }\r\n Calendar.prototype.constructed = function () {\r\n // useful for monkeypatching. used?\r\n };\r\n Calendar.prototype.getView = function () {\r\n return this.view;\r\n };\r\n Calendar.prototype.publiclyTrigger = function (name, triggerInfo) {\r\n var optHandler = this.opt(name);\r\n var context;\r\n var args;\r\n if ($.isPlainObject(triggerInfo)) {\r\n context = triggerInfo.context;\r\n args = triggerInfo.args;\r\n }\r\n else if ($.isArray(triggerInfo)) {\r\n args = triggerInfo;\r\n }\r\n if (context == null) {\r\n context = this.el[0]; // fallback context\r\n }\r\n if (!args) {\r\n args = [];\r\n }\r\n this.triggerWith(name, context, args); // Emitter's method\r\n if (optHandler) {\r\n return optHandler.apply(context, args);\r\n }\r\n };\r\n Calendar.prototype.hasPublicHandlers = function (name) {\r\n return this.hasHandlers(name) ||\r\n this.opt(name); // handler specified in options\r\n };\r\n // Options Public API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // public getter/setter\r\n Calendar.prototype.option = function (name, value) {\r\n var newOptionHash;\r\n if (typeof name === 'string') {\r\n if (value === undefined) {\r\n return this.optionsManager.get(name);\r\n }\r\n else {\r\n newOptionHash = {};\r\n newOptionHash[name] = value;\r\n this.optionsManager.add(newOptionHash);\r\n }\r\n }\r\n else if (typeof name === 'object') {\r\n this.optionsManager.add(name);\r\n }\r\n };\r\n // private getter\r\n Calendar.prototype.opt = function (name) {\r\n return this.optionsManager.get(name);\r\n };\r\n // View\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Given a view name for a custom view or a standard view, creates a ready-to-go View object\r\n Calendar.prototype.instantiateView = function (viewType) {\r\n var spec = this.viewSpecManager.getViewSpec(viewType);\r\n if (!spec) {\r\n throw new Error(\"View type \\\"\" + viewType + \"\\\" is not valid\");\r\n }\r\n return new spec['class'](this, spec);\r\n };\r\n // Returns a boolean about whether the view is okay to instantiate at some point\r\n Calendar.prototype.isValidViewType = function (viewType) {\r\n return Boolean(this.viewSpecManager.getViewSpec(viewType));\r\n };\r\n Calendar.prototype.changeView = function (viewName, dateOrRange) {\r\n if (dateOrRange) {\r\n if (dateOrRange.start && dateOrRange.end) {\r\n this.optionsManager.recordOverrides({\r\n visibleRange: dateOrRange\r\n });\r\n }\r\n else {\r\n this.currentDate = this.moment(dateOrRange).stripZone(); // just like gotoDate\r\n }\r\n }\r\n this.renderView(viewName);\r\n };\r\n // Forces navigation to a view for the given date.\r\n // `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\r\n Calendar.prototype.zoomTo = function (newDate, viewType) {\r\n var spec;\r\n viewType = viewType || 'day'; // day is default zoom\r\n spec = this.viewSpecManager.getViewSpec(viewType) ||\r\n this.viewSpecManager.getUnitViewSpec(viewType);\r\n this.currentDate = newDate.clone();\r\n this.renderView(spec ? spec.type : null);\r\n };\r\n // Current Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initCurrentDate = function () {\r\n var defaultDateInput = this.opt('defaultDate');\r\n // compute the initial ambig-timezone date\r\n if (defaultDateInput != null) {\r\n this.currentDate = this.moment(defaultDateInput).stripZone();\r\n }\r\n else {\r\n this.currentDate = this.getNow(); // getNow already returns unzoned\r\n }\r\n };\r\n Calendar.prototype.prev = function () {\r\n var view = this.view;\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n if (prevInfo.isValid) {\r\n this.currentDate = prevInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.next = function () {\r\n var view = this.view;\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n if (nextInfo.isValid) {\r\n this.currentDate = nextInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.prevYear = function () {\r\n this.currentDate.add(-1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.nextYear = function () {\r\n this.currentDate.add(1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.today = function () {\r\n this.currentDate = this.getNow(); // should deny like prev/next?\r\n this.renderView();\r\n };\r\n Calendar.prototype.gotoDate = function (zonedDateInput) {\r\n this.currentDate = this.moment(zonedDateInput).stripZone();\r\n this.renderView();\r\n };\r\n Calendar.prototype.incrementDate = function (delta) {\r\n this.currentDate.add(moment.duration(delta));\r\n this.renderView();\r\n };\r\n // for external API\r\n Calendar.prototype.getDate = function () {\r\n return this.applyTimezone(this.currentDate); // infuse the calendar's timezone\r\n };\r\n // Loading Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Should be called when any type of async data fetching begins\r\n Calendar.prototype.pushLoading = function () {\r\n if (!(this.loadingLevel++)) {\r\n this.publiclyTrigger('loading', [true, this.view]);\r\n }\r\n };\r\n // Should be called when any type of async data fetching completes\r\n Calendar.prototype.popLoading = function () {\r\n if (!(--this.loadingLevel)) {\r\n this.publiclyTrigger('loading', [false, this.view]);\r\n }\r\n };\r\n // High-level Rendering\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.render = function () {\r\n if (!this.contentEl) {\r\n this.initialRender();\r\n }\r\n else if (this.elementVisible()) {\r\n // mainly for the public API\r\n this.calcSize();\r\n this.updateViewSize();\r\n }\r\n };\r\n Calendar.prototype.initialRender = function () {\r\n var _this = this;\r\n var el = this.el;\r\n el.addClass('fc');\r\n // event delegation for nav links\r\n el.on('click.fc', 'a[data-goto]', function (ev) {\r\n var anchorEl = $(ev.currentTarget);\r\n var gotoOptions = anchorEl.data('goto'); // will automatically parse JSON\r\n var date = _this.moment(gotoOptions.date);\r\n var viewType = gotoOptions.type;\r\n // property like \"navLinkDayClick\". might be a string or a function\r\n var customAction = _this.view.opt('navLink' + util_1.capitaliseFirstLetter(viewType) + 'Click');\r\n if (typeof customAction === 'function') {\r\n customAction(date, ev);\r\n }\r\n else {\r\n if (typeof customAction === 'string') {\r\n viewType = customAction;\r\n }\r\n _this.zoomTo(date, viewType);\r\n }\r\n });\r\n // called immediately, and upon option change\r\n this.optionsManager.watch('settingTheme', ['?theme', '?themeSystem'], function (opts) {\r\n var themeClass = ThemeRegistry_1.getThemeSystemClass(opts.themeSystem || opts.theme);\r\n var theme = new themeClass(_this.optionsManager);\r\n var widgetClass = theme.getClass('widget');\r\n _this.theme = theme;\r\n if (widgetClass) {\r\n el.addClass(widgetClass);\r\n }\r\n }, function () {\r\n var widgetClass = _this.theme.getClass('widget');\r\n _this.theme = null;\r\n if (widgetClass) {\r\n el.removeClass(widgetClass);\r\n }\r\n });\r\n this.optionsManager.watch('settingBusinessHourGenerator', ['?businessHours'], function (deps) {\r\n _this.businessHourGenerator = new BusinessHourGenerator_1.default(deps.businessHours, _this);\r\n if (_this.view) {\r\n _this.view.set('businessHourGenerator', _this.businessHourGenerator);\r\n }\r\n }, function () {\r\n _this.businessHourGenerator = null;\r\n });\r\n // called immediately, and upon option change.\r\n // HACK: locale often affects isRTL, so we explicitly listen to that too.\r\n this.optionsManager.watch('applyingDirClasses', ['?isRTL', '?locale'], function (opts) {\r\n el.toggleClass('fc-ltr', !opts.isRTL);\r\n el.toggleClass('fc-rtl', opts.isRTL);\r\n });\r\n this.contentEl = $(\"
\").prependTo(el);\r\n this.initToolbars();\r\n this.renderHeader();\r\n this.renderFooter();\r\n this.renderView(this.opt('defaultView'));\r\n if (this.opt('handleWindowResize')) {\r\n $(window).resize(this.windowResizeProxy = util_1.debounce(// prevents rapid calls\r\n this.windowResize.bind(this), this.opt('windowResizeDelay')));\r\n }\r\n };\r\n Calendar.prototype.destroy = function () {\r\n if (this.view) {\r\n this.clearView();\r\n }\r\n this.toolbarsManager.proxyCall('removeElement');\r\n this.contentEl.remove();\r\n this.el.removeClass('fc fc-ltr fc-rtl');\r\n // removes theme-related root className\r\n this.optionsManager.unwatch('settingTheme');\r\n this.optionsManager.unwatch('settingBusinessHourGenerator');\r\n this.el.off('.fc'); // unbind nav link handlers\r\n if (this.windowResizeProxy) {\r\n $(window).unbind('resize', this.windowResizeProxy);\r\n this.windowResizeProxy = null;\r\n }\r\n GlobalEmitter_1.default.unneeded();\r\n };\r\n Calendar.prototype.elementVisible = function () {\r\n return this.el.is(':visible');\r\n };\r\n // Render Queue\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.bindViewHandlers = function (view) {\r\n var _this = this;\r\n view.watch('titleForCalendar', ['title'], function (deps) {\r\n if (view === _this.view) {\r\n _this.setToolbarsTitle(deps.title);\r\n }\r\n });\r\n view.watch('dateProfileForCalendar', ['dateProfile'], function (deps) {\r\n if (view === _this.view) {\r\n _this.currentDate = deps.dateProfile.date; // might have been constrained by view dates\r\n _this.updateToolbarButtons(deps.dateProfile);\r\n }\r\n });\r\n };\r\n Calendar.prototype.unbindViewHandlers = function (view) {\r\n view.unwatch('titleForCalendar');\r\n view.unwatch('dateProfileForCalendar');\r\n };\r\n // View Rendering\r\n // -----------------------------------------------------------------------------------\r\n // Renders a view because of a date change, view-type change, or for the first time.\r\n // If not given a viewType, keep the current view but render different dates.\r\n // Accepts an optional scroll state to restore to.\r\n Calendar.prototype.renderView = function (viewType) {\r\n var oldView = this.view;\r\n var newView;\r\n this.freezeContentHeight();\r\n if (oldView && viewType && oldView.type !== viewType) {\r\n this.clearView();\r\n }\r\n // if viewType changed, or the view was never created, create a fresh view\r\n if (!this.view && viewType) {\r\n newView = this.view =\r\n this.viewsByType[viewType] ||\r\n (this.viewsByType[viewType] = this.instantiateView(viewType));\r\n this.bindViewHandlers(newView);\r\n newView.startBatchRender(); // so that setElement+setDate rendering are joined\r\n newView.setElement($(\"
\").appendTo(this.contentEl));\r\n this.toolbarsManager.proxyCall('activateButton', viewType);\r\n }\r\n if (this.view) {\r\n // prevent unnecessary change firing\r\n if (this.view.get('businessHourGenerator') !== this.businessHourGenerator) {\r\n this.view.set('businessHourGenerator', this.businessHourGenerator);\r\n }\r\n this.view.setDate(this.currentDate);\r\n if (newView) {\r\n newView.stopBatchRender();\r\n }\r\n }\r\n this.thawContentHeight();\r\n };\r\n // Unrenders the current view and reflects this change in the Header.\r\n // Unregsiters the `view`, but does not remove from viewByType hash.\r\n Calendar.prototype.clearView = function () {\r\n var currentView = this.view;\r\n this.toolbarsManager.proxyCall('deactivateButton', currentView.type);\r\n this.unbindViewHandlers(currentView);\r\n currentView.removeElement();\r\n currentView.unsetDate(); // so bindViewHandlers doesn't fire with old values next time\r\n this.view = null;\r\n };\r\n // Destroys the view, including the view object. Then, re-instantiates it and renders it.\r\n // Maintains the same scroll state.\r\n // TODO: maintain any other user-manipulated state.\r\n Calendar.prototype.reinitView = function () {\r\n var oldView = this.view;\r\n var scroll = oldView.queryScroll(); // wouldn't be so complicated if Calendar owned the scroll\r\n this.freezeContentHeight();\r\n this.clearView();\r\n this.calcSize();\r\n this.renderView(oldView.type); // needs the type to freshly render\r\n this.view.applyScroll(scroll);\r\n this.thawContentHeight();\r\n };\r\n // Resizing\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.getSuggestedViewHeight = function () {\r\n if (this.suggestedViewHeight == null) {\r\n this.calcSize();\r\n }\r\n return this.suggestedViewHeight;\r\n };\r\n Calendar.prototype.isHeightAuto = function () {\r\n return this.opt('contentHeight') === 'auto' || this.opt('height') === 'auto';\r\n };\r\n Calendar.prototype.updateViewSize = function (isResize) {\r\n if (isResize === void 0) { isResize = false; }\r\n var view = this.view;\r\n var scroll;\r\n if (!this.ignoreUpdateViewSize && view) {\r\n if (isResize) {\r\n this.calcSize();\r\n scroll = view.queryScroll();\r\n }\r\n this.ignoreUpdateViewSize++;\r\n view.updateSize(this.getSuggestedViewHeight(), this.isHeightAuto(), isResize);\r\n this.ignoreUpdateViewSize--;\r\n if (isResize) {\r\n view.applyScroll(scroll);\r\n }\r\n return true; // signal success\r\n }\r\n };\r\n Calendar.prototype.calcSize = function () {\r\n if (this.elementVisible()) {\r\n this._calcSize();\r\n }\r\n };\r\n Calendar.prototype._calcSize = function () {\r\n var contentHeightInput = this.opt('contentHeight');\r\n var heightInput = this.opt('height');\r\n if (typeof contentHeightInput === 'number') {\r\n this.suggestedViewHeight = contentHeightInput;\r\n }\r\n else if (typeof contentHeightInput === 'function') {\r\n this.suggestedViewHeight = contentHeightInput();\r\n }\r\n else if (typeof heightInput === 'number') {\r\n this.suggestedViewHeight = heightInput - this.queryToolbarsHeight();\r\n }\r\n else if (typeof heightInput === 'function') {\r\n this.suggestedViewHeight = heightInput() - this.queryToolbarsHeight();\r\n }\r\n else if (heightInput === 'parent') {\r\n this.suggestedViewHeight = this.el.parent().height() - this.queryToolbarsHeight();\r\n }\r\n else {\r\n this.suggestedViewHeight = Math.round(this.contentEl.width() /\r\n Math.max(this.opt('aspectRatio'), .5));\r\n }\r\n };\r\n Calendar.prototype.windowResize = function (ev) {\r\n if (\r\n // the purpose: so we don't process jqui \"resize\" events that have bubbled up\r\n // cast to any because .target, which is Element, can't be compared to window for some reason.\r\n ev.target === window &&\r\n this.view &&\r\n this.view.isDatesRendered) {\r\n if (this.updateViewSize(true)) {\r\n this.publiclyTrigger('windowResize', [this.view]);\r\n }\r\n }\r\n };\r\n /* Height \"Freezing\"\r\n -----------------------------------------------------------------------------*/\r\n Calendar.prototype.freezeContentHeight = function () {\r\n if (!(this.freezeContentHeightDepth++)) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n Calendar.prototype.forceFreezeContentHeight = function () {\r\n this.contentEl.css({\r\n width: '100%',\r\n height: this.contentEl.height(),\r\n overflow: 'hidden'\r\n });\r\n };\r\n Calendar.prototype.thawContentHeight = function () {\r\n this.freezeContentHeightDepth--;\r\n // always bring back to natural height\r\n this.contentEl.css({\r\n width: '',\r\n height: '',\r\n overflow: ''\r\n });\r\n // but if there are future thaws, re-freeze\r\n if (this.freezeContentHeightDepth) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n // Toolbar\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initToolbars = function () {\r\n this.header = new Toolbar_1.default(this, this.computeHeaderOptions());\r\n this.footer = new Toolbar_1.default(this, this.computeFooterOptions());\r\n this.toolbarsManager = new Iterator_1.default([this.header, this.footer]);\r\n };\r\n Calendar.prototype.computeHeaderOptions = function () {\r\n return {\r\n extraClasses: 'fc-header-toolbar',\r\n layout: this.opt('header')\r\n };\r\n };\r\n Calendar.prototype.computeFooterOptions = function () {\r\n return {\r\n extraClasses: 'fc-footer-toolbar',\r\n layout: this.opt('footer')\r\n };\r\n };\r\n // can be called repeatedly and Header will rerender\r\n Calendar.prototype.renderHeader = function () {\r\n var header = this.header;\r\n header.setToolbarOptions(this.computeHeaderOptions());\r\n header.render();\r\n if (header.el) {\r\n this.el.prepend(header.el);\r\n }\r\n };\r\n // can be called repeatedly and Footer will rerender\r\n Calendar.prototype.renderFooter = function () {\r\n var footer = this.footer;\r\n footer.setToolbarOptions(this.computeFooterOptions());\r\n footer.render();\r\n if (footer.el) {\r\n this.el.append(footer.el);\r\n }\r\n };\r\n Calendar.prototype.setToolbarsTitle = function (title) {\r\n this.toolbarsManager.proxyCall('updateTitle', title);\r\n };\r\n Calendar.prototype.updateToolbarButtons = function (dateProfile) {\r\n var now = this.getNow();\r\n var view = this.view;\r\n var todayInfo = view.dateProfileGenerator.build(now);\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n this.toolbarsManager.proxyCall((todayInfo.isValid && !dateProfile.currentUnzonedRange.containsDate(now)) ?\r\n 'enableButton' :\r\n 'disableButton', 'today');\r\n this.toolbarsManager.proxyCall(prevInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'prev');\r\n this.toolbarsManager.proxyCall(nextInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'next');\r\n };\r\n Calendar.prototype.queryToolbarsHeight = function () {\r\n return this.toolbarsManager.items.reduce(function (accumulator, toolbar) {\r\n var toolbarHeight = toolbar.el ? toolbar.el.outerHeight(true) : 0; // includes margin\r\n return accumulator + toolbarHeight;\r\n }, 0);\r\n };\r\n // Selection\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // this public method receives start/end dates in any format, with any timezone\r\n Calendar.prototype.select = function (zonedStartInput, zonedEndInput) {\r\n this.view.select(this.buildSelectFootprint.apply(this, arguments));\r\n };\r\n Calendar.prototype.unselect = function () {\r\n if (this.view) {\r\n this.view.unselect();\r\n }\r\n };\r\n // Given arguments to the select method in the API, returns a span (unzoned start/end and other info)\r\n Calendar.prototype.buildSelectFootprint = function (zonedStartInput, zonedEndInput) {\r\n var start = this.moment(zonedStartInput).stripZone();\r\n var end;\r\n if (zonedEndInput) {\r\n end = this.moment(zonedEndInput).stripZone();\r\n }\r\n else if (start.hasTime()) {\r\n end = start.clone().add(this.defaultTimedEventDuration);\r\n }\r\n else {\r\n end = start.clone().add(this.defaultAllDayEventDuration);\r\n }\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), !start.hasTime());\r\n };\r\n // Date Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initMomentInternals = function () {\r\n var _this = this;\r\n this.defaultAllDayEventDuration = moment.duration(this.opt('defaultAllDayEventDuration'));\r\n this.defaultTimedEventDuration = moment.duration(this.opt('defaultTimedEventDuration'));\r\n // Called immediately, and when any of the options change.\r\n // Happens before any internal objects rebuild or rerender, because this is very core.\r\n this.optionsManager.watch('buildingMomentLocale', [\r\n '?locale', '?monthNames', '?monthNamesShort', '?dayNames', '?dayNamesShort',\r\n '?firstDay', '?weekNumberCalculation'\r\n ], function (opts) {\r\n var weekNumberCalculation = opts.weekNumberCalculation;\r\n var firstDay = opts.firstDay;\r\n var _week;\r\n // normalize\r\n if (weekNumberCalculation === 'iso') {\r\n weekNumberCalculation = 'ISO'; // normalize\r\n }\r\n var localeData = Object.create(// make a cheap copy\r\n locale_1.getMomentLocaleData(opts.locale) // will fall back to en\r\n );\r\n if (opts.monthNames) {\r\n localeData._months = opts.monthNames;\r\n }\r\n if (opts.monthNamesShort) {\r\n localeData._monthsShort = opts.monthNamesShort;\r\n }\r\n if (opts.dayNames) {\r\n localeData._weekdays = opts.dayNames;\r\n }\r\n if (opts.dayNamesShort) {\r\n localeData._weekdaysShort = opts.dayNamesShort;\r\n }\r\n if (firstDay == null && weekNumberCalculation === 'ISO') {\r\n firstDay = 1;\r\n }\r\n if (firstDay != null) {\r\n _week = Object.create(localeData._week); // _week: { dow: # }\r\n _week.dow = firstDay;\r\n localeData._week = _week;\r\n }\r\n if (weekNumberCalculation === 'ISO' ||\r\n weekNumberCalculation === 'local' ||\r\n typeof weekNumberCalculation === 'function') {\r\n localeData._fullCalendar_weekCalc = weekNumberCalculation; // moment-ext will know what to do with it\r\n }\r\n _this.localeData = localeData;\r\n // If the internal current date object already exists, move to new locale.\r\n // We do NOT need to do this technique for event dates, because this happens when converting to \"segments\".\r\n if (_this.currentDate) {\r\n _this.localizeMoment(_this.currentDate); // sets to localeData\r\n }\r\n });\r\n };\r\n // Builds a moment using the settings of the current calendar: timezone and locale.\r\n // Accepts anything the vanilla moment() constructor accepts.\r\n Calendar.prototype.moment = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var mom;\r\n if (this.opt('timezone') === 'local') {\r\n mom = moment_ext_1.default.apply(null, args);\r\n // Force the moment to be local, because momentExt doesn't guarantee it.\r\n if (mom.hasTime()) {\r\n mom.local();\r\n }\r\n }\r\n else if (this.opt('timezone') === 'UTC') {\r\n mom = moment_ext_1.default.utc.apply(null, args); // process as UTC\r\n }\r\n else {\r\n mom = moment_ext_1.default.parseZone.apply(null, args); // let the input decide the zone\r\n }\r\n this.localizeMoment(mom); // TODO\r\n return mom;\r\n };\r\n Calendar.prototype.msToMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n else {\r\n mom = this.applyTimezone(mom); // may or may not apply locale\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n Calendar.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n // Updates the given moment's locale settings to the current calendar locale settings.\r\n Calendar.prototype.localizeMoment = function (mom) {\r\n mom._locale = this.localeData;\r\n };\r\n // Returns a boolean about whether or not the calendar knows how to calculate\r\n // the timezone offset of arbitrary dates in the current timezone.\r\n Calendar.prototype.getIsAmbigTimezone = function () {\r\n return this.opt('timezone') !== 'local' && this.opt('timezone') !== 'UTC';\r\n };\r\n // Returns a copy of the given date in the current timezone. Has no effect on dates without times.\r\n Calendar.prototype.applyTimezone = function (date) {\r\n if (!date.hasTime()) {\r\n return date.clone();\r\n }\r\n var zonedDate = this.moment(date.toArray());\r\n var timeAdjust = date.time().asMilliseconds() - zonedDate.time().asMilliseconds();\r\n var adjustedZonedDate;\r\n // Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396)\r\n if (timeAdjust) {\r\n adjustedZonedDate = zonedDate.clone().add(timeAdjust); // add milliseconds\r\n if (date.time().asMilliseconds() - adjustedZonedDate.time().asMilliseconds() === 0) {\r\n zonedDate = adjustedZonedDate;\r\n }\r\n }\r\n return zonedDate;\r\n };\r\n /*\r\n Assumes the footprint is non-open-ended.\r\n */\r\n Calendar.prototype.footprintToDateProfile = function (componentFootprint, ignoreEnd) {\r\n if (ignoreEnd === void 0) { ignoreEnd = false; }\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs);\r\n var end;\r\n if (!ignoreEnd) {\r\n end = moment_ext_1.default.utc(componentFootprint.unzonedRange.endMs);\r\n }\r\n if (componentFootprint.isAllDay) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else {\r\n start = this.applyTimezone(start);\r\n if (end) {\r\n end = this.applyTimezone(end);\r\n }\r\n }\r\n return new EventDateProfile_1.default(start, end, this);\r\n };\r\n // Returns a moment for the current date, as defined by the client's computer or from the `now` option.\r\n // Will return an moment with an ambiguous timezone.\r\n Calendar.prototype.getNow = function () {\r\n var now = this.opt('now');\r\n if (typeof now === 'function') {\r\n now = now();\r\n }\r\n return this.moment(now).stripZone();\r\n };\r\n // Produces a human-readable string for the given duration.\r\n // Side-effect: changes the locale of the given duration.\r\n Calendar.prototype.humanizeDuration = function (duration) {\r\n return duration.locale(this.opt('locale')).humanize();\r\n };\r\n // will return `null` if invalid range\r\n Calendar.prototype.parseUnzonedRange = function (rangeInput) {\r\n var start = null;\r\n var end = null;\r\n if (rangeInput.start) {\r\n start = this.moment(rangeInput.start).stripZone();\r\n }\r\n if (rangeInput.end) {\r\n end = this.moment(rangeInput.end).stripZone();\r\n }\r\n if (!start && !end) {\r\n return null;\r\n }\r\n if (start && end && end.isBefore(start)) {\r\n return null;\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Event-Date Utilities\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initEventManager = function () {\r\n var _this = this;\r\n var eventManager = new EventManager_1.default(this);\r\n var rawSources = this.opt('eventSources') || [];\r\n var singleRawSource = this.opt('events');\r\n this.eventManager = eventManager;\r\n if (singleRawSource) {\r\n rawSources.unshift(singleRawSource);\r\n }\r\n eventManager.on('release', function (eventsPayload) {\r\n _this.trigger('eventsReset', eventsPayload);\r\n });\r\n eventManager.freeze();\r\n rawSources.forEach(function (rawSource) {\r\n var source = EventSourceParser_1.default.parse(rawSource, _this);\r\n if (source) {\r\n eventManager.addSource(source);\r\n }\r\n });\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.requestEvents = function (start, end) {\r\n return this.eventManager.requestEvents(start, end, this.opt('timezone'), !this.opt('lazyFetching'));\r\n };\r\n // Get an event's normalized end date. If not present, calculate it from the defaults.\r\n Calendar.prototype.getEventEnd = function (event) {\r\n if (event.end) {\r\n return event.end.clone();\r\n }\r\n else {\r\n return this.getDefaultEventEnd(event.allDay, event.start);\r\n }\r\n };\r\n // Given an event's allDay status and start date, return what its fallback end date should be.\r\n // TODO: rename to computeDefaultEventEnd\r\n Calendar.prototype.getDefaultEventEnd = function (allDay, zonedStart) {\r\n var end = zonedStart.clone();\r\n if (allDay) {\r\n end.stripTime().add(this.defaultAllDayEventDuration);\r\n }\r\n else {\r\n end.add(this.defaultTimedEventDuration);\r\n }\r\n if (this.getIsAmbigTimezone()) {\r\n end.stripZone(); // we don't know what the tzo should be\r\n }\r\n return end;\r\n };\r\n // Public Events API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.rerenderEvents = function () {\r\n this.view.flash('displayingEvents');\r\n };\r\n Calendar.prototype.refetchEvents = function () {\r\n this.eventManager.refetchAllSources();\r\n };\r\n Calendar.prototype.renderEvents = function (eventInputs, isSticky) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventInputs.length; i++) {\r\n this.renderEvent(eventInputs[i], isSticky);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.renderEvent = function (eventInput, isSticky) {\r\n if (isSticky === void 0) { isSticky = false; }\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, eventInput.source || eventManager.stickySource);\r\n if (eventDef) {\r\n eventManager.addEventDef(eventDef, isSticky);\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.removeEvents = function (legacyQuery) {\r\n var eventManager = this.eventManager;\r\n var legacyInstances = [];\r\n var idMap = {};\r\n var eventDef;\r\n var i;\r\n if (legacyQuery == null) {\r\n eventManager.removeAllEventDefs(); // persist=true\r\n }\r\n else {\r\n eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyInstances.push(eventInstance.toLegacy());\r\n });\r\n legacyInstances = filterLegacyEventInstances(legacyInstances, legacyQuery);\r\n // compute unique IDs\r\n for (i = 0; i < legacyInstances.length; i++) {\r\n eventDef = this.eventManager.getEventDefByUid(legacyInstances[i]._id);\r\n idMap[eventDef.id] = true;\r\n }\r\n eventManager.freeze();\r\n for (i in idMap) {\r\n eventManager.removeEventDefsById(i); // persist=true\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.clientEvents = function (legacyQuery) {\r\n var legacyEventInstances = [];\r\n this.eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyEventInstances.push(eventInstance.toLegacy());\r\n });\r\n return filterLegacyEventInstances(legacyEventInstances, legacyQuery);\r\n };\r\n Calendar.prototype.updateEvents = function (eventPropsArray) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventPropsArray.length; i++) {\r\n this.updateEvent(eventPropsArray[i]);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.updateEvent = function (eventProps) {\r\n var eventDef = this.eventManager.getEventDefByUid(eventProps._id);\r\n var eventInstance;\r\n var eventDefMutation;\r\n if (eventDef instanceof SingleEventDef_1.default) {\r\n eventInstance = eventDef.buildInstance();\r\n eventDefMutation = EventDefMutation_1.default.createFromRawProps(eventInstance, eventProps, // raw props\r\n null // largeUnit -- who uses it?\r\n );\r\n this.eventManager.mutateEventsWithId(eventDef.id, eventDefMutation); // will release\r\n }\r\n };\r\n // Public Event Sources API\r\n // ------------------------------------------------------------------------------------\r\n Calendar.prototype.getEventSources = function () {\r\n return this.eventManager.otherSources.slice(); // clone\r\n };\r\n Calendar.prototype.getEventSourceById = function (id) {\r\n return this.eventManager.getSourceById(EventSource_1.default.normalizeId(id));\r\n };\r\n Calendar.prototype.addEventSource = function (sourceInput) {\r\n var source = EventSourceParser_1.default.parse(sourceInput, this);\r\n if (source) {\r\n this.eventManager.addSource(source);\r\n }\r\n };\r\n Calendar.prototype.removeEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources;\r\n var i;\r\n if (sourceMultiQuery == null) {\r\n this.eventManager.removeAllSources();\r\n }\r\n else {\r\n sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n Calendar.prototype.removeEventSource = function (sourceQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.querySources(sourceQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.refetchEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.refetchSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n // not for internal use. use options module directly instead.\r\n Calendar.defaults = options_1.globalDefaults;\r\n Calendar.englishDefaults = options_1.englishDefaults;\r\n Calendar.rtlDefaults = options_1.rtlDefaults;\r\n return Calendar;\r\n}());\r\nexports.default = Calendar;\r\nEmitterMixin_1.default.mixInto(Calendar);\r\nListenerMixin_1.default.mixInto(Calendar);\r\nfunction filterLegacyEventInstances(legacyEventInstances, legacyQuery) {\r\n if (legacyQuery == null) {\r\n return legacyEventInstances;\r\n }\r\n else if ($.isFunction(legacyQuery)) {\r\n return legacyEventInstances.filter(legacyQuery);\r\n }\r\n else {\r\n legacyQuery += ''; // normalize to string\r\n return legacyEventInstances.filter(function (legacyEventInstance) {\r\n // soft comparison because id not be normalized to string\r\n // tslint:disable-next-line\r\n return legacyEventInstance.id == legacyQuery ||\r\n legacyEventInstance._id === legacyQuery; // can specify internal id, but must exactly match\r\n });\r\n }\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 221 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator = /** @class */ (function () {\r\n function DateProfileGenerator(_view) {\r\n this._view = _view;\r\n }\r\n DateProfileGenerator.prototype.opt = function (name) {\r\n return this._view.opt(name);\r\n };\r\n DateProfileGenerator.prototype.trimHiddenDays = function (unzonedRange) {\r\n return this._view.trimHiddenDays(unzonedRange);\r\n };\r\n DateProfileGenerator.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n return this._view.calendar.msToUtcMoment(ms, forceAllDay);\r\n };\r\n /* Date Range Computation\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Builds a structure with info about what the dates/ranges will be for the \"prev\" view.\r\n DateProfileGenerator.prototype.buildPrev = function (currentDateProfile) {\r\n var prevDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .subtract(currentDateProfile.dateIncrement);\r\n return this.build(prevDate, -1);\r\n };\r\n // Builds a structure with info about what the dates/ranges will be for the \"next\" view.\r\n DateProfileGenerator.prototype.buildNext = function (currentDateProfile) {\r\n var nextDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .add(currentDateProfile.dateIncrement);\r\n return this.build(nextDate, 1);\r\n };\r\n // Builds a structure holding dates/ranges for rendering around the given date.\r\n // Optional direction param indicates whether the date is being incremented/decremented\r\n // from its previous value. decremented = -1, incremented = 1 (default).\r\n DateProfileGenerator.prototype.build = function (date, direction, forceToValid) {\r\n if (forceToValid === void 0) { forceToValid = false; }\r\n var isDateAllDay = !date.hasTime();\r\n var validUnzonedRange;\r\n var minTime = null;\r\n var maxTime = null;\r\n var currentInfo;\r\n var isRangeAllDay;\r\n var renderUnzonedRange;\r\n var activeUnzonedRange;\r\n var isValid;\r\n validUnzonedRange = this.buildValidRange();\r\n validUnzonedRange = this.trimHiddenDays(validUnzonedRange);\r\n if (forceToValid) {\r\n date = this.msToUtcMoment(validUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n currentInfo = this.buildCurrentRangeInfo(date, direction);\r\n isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);\r\n renderUnzonedRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.unzonedRange), currentInfo.unit, isRangeAllDay);\r\n renderUnzonedRange = this.trimHiddenDays(renderUnzonedRange);\r\n activeUnzonedRange = renderUnzonedRange.clone();\r\n if (!this.opt('showNonCurrentDates')) {\r\n activeUnzonedRange = activeUnzonedRange.intersect(currentInfo.unzonedRange);\r\n }\r\n minTime = moment.duration(this.opt('minTime'));\r\n maxTime = moment.duration(this.opt('maxTime'));\r\n activeUnzonedRange = this.adjustActiveRange(activeUnzonedRange, minTime, maxTime);\r\n activeUnzonedRange = activeUnzonedRange.intersect(validUnzonedRange); // might return null\r\n if (activeUnzonedRange) {\r\n date = this.msToUtcMoment(activeUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n // it's invalid if the originally requested date is not contained,\r\n // or if the range is completely outside of the valid range.\r\n isValid = currentInfo.unzonedRange.intersectsWith(validUnzonedRange);\r\n return {\r\n // constraint for where prev/next operations can go and where events can be dragged/resized to.\r\n // an object with optional start and end properties.\r\n validUnzonedRange: validUnzonedRange,\r\n // range the view is formally responsible for.\r\n // for example, a month view might have 1st-31st, excluding padded dates\r\n currentUnzonedRange: currentInfo.unzonedRange,\r\n // name of largest unit being displayed, like \"month\" or \"week\"\r\n currentRangeUnit: currentInfo.unit,\r\n isRangeAllDay: isRangeAllDay,\r\n // dates that display events and accept drag-n-drop\r\n // will be `null` if no dates accept events\r\n activeUnzonedRange: activeUnzonedRange,\r\n // date range with a rendered skeleton\r\n // includes not-active days that need some sort of DOM\r\n renderUnzonedRange: renderUnzonedRange,\r\n // Duration object that denotes the first visible time of any given day\r\n minTime: minTime,\r\n // Duration object that denotes the exclusive visible end time of any given day\r\n maxTime: maxTime,\r\n isValid: isValid,\r\n date: date,\r\n // how far the current date will move for a prev/next operation\r\n dateIncrement: this.buildDateIncrement(currentInfo.duration)\r\n // pass a fallback (might be null) ^\r\n };\r\n };\r\n // Builds an object with optional start/end properties.\r\n // Indicates the minimum/maximum dates to display.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildValidRange = function () {\r\n return this._view.getUnzonedRangeOption('validRange', this._view.calendar.getNow()) ||\r\n new UnzonedRange_1.default(); // completely open-ended\r\n };\r\n // Builds a structure with info about the \"current\" range, the range that is\r\n // highlighted as being the current month for example.\r\n // See build() for a description of `direction`.\r\n // Guaranteed to have `range` and `unit` properties. `duration` is optional.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {\r\n var viewSpec = this._view.viewSpec;\r\n var duration = null;\r\n var unit = null;\r\n var unzonedRange = null;\r\n var dayCount;\r\n if (viewSpec.duration) {\r\n duration = viewSpec.duration;\r\n unit = viewSpec.durationUnit;\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n else if ((dayCount = this.opt('dayCount'))) {\r\n unit = 'day';\r\n unzonedRange = this.buildRangeFromDayCount(date, direction, dayCount);\r\n }\r\n else if ((unzonedRange = this.buildCustomVisibleRange(date))) {\r\n unit = util_1.computeGreatestUnit(unzonedRange.getStart(), unzonedRange.getEnd());\r\n }\r\n else {\r\n duration = this.getFallbackDuration();\r\n unit = util_1.computeGreatestUnit(duration);\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n return { duration: duration, unit: unit, unzonedRange: unzonedRange };\r\n };\r\n DateProfileGenerator.prototype.getFallbackDuration = function () {\r\n return moment.duration({ days: 1 });\r\n };\r\n // Returns a new activeUnzonedRange to have time values (un-ambiguate)\r\n // minTime or maxTime causes the range to expand.\r\n DateProfileGenerator.prototype.adjustActiveRange = function (unzonedRange, minTime, maxTime) {\r\n var start = unzonedRange.getStart();\r\n var end = unzonedRange.getEnd();\r\n if (this._view.usesMinMaxTime) {\r\n if (minTime < 0) {\r\n start.time(0).add(minTime);\r\n }\r\n if (maxTime > 24 * 60 * 60 * 1000) {\r\n end.time(maxTime - (24 * 60 * 60 * 1000));\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds the \"current\" range when it is specified as an explicit duration.\r\n // `unit` is the already-computed computeGreatestUnit value of duration.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {\r\n var alignment = this.opt('dateAlignment');\r\n var dateIncrementInput;\r\n var dateIncrementDuration;\r\n var start;\r\n var end;\r\n var res;\r\n // compute what the alignment should be\r\n if (!alignment) {\r\n dateIncrementInput = this.opt('dateIncrement');\r\n if (dateIncrementInput) {\r\n dateIncrementDuration = moment.duration(dateIncrementInput);\r\n // use the smaller of the two units\r\n if (dateIncrementDuration < duration) {\r\n alignment = util_1.computeDurationGreatestUnit(dateIncrementDuration, dateIncrementInput);\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n // if the view displays a single day or smaller\r\n if (duration.as('days') <= 1) {\r\n if (this._view.isHiddenDay(start)) {\r\n start = this._view.skipHiddenDays(start, direction);\r\n start.startOf('day');\r\n }\r\n }\r\n function computeRes() {\r\n start = date.clone().startOf(alignment);\r\n end = start.clone().add(duration);\r\n res = new UnzonedRange_1.default(start, end);\r\n }\r\n computeRes();\r\n // if range is completely enveloped by hidden days, go past the hidden days\r\n if (!this.trimHiddenDays(res)) {\r\n date = this._view.skipHiddenDays(date, direction);\r\n computeRes();\r\n }\r\n return res;\r\n };\r\n // Builds the \"current\" range when a dayCount is specified.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {\r\n var customAlignment = this.opt('dateAlignment');\r\n var runningCount = 0;\r\n var start = date.clone();\r\n var end;\r\n if (customAlignment) {\r\n start.startOf(customAlignment);\r\n }\r\n start.startOf('day');\r\n start = this._view.skipHiddenDays(start, direction);\r\n end = start.clone();\r\n do {\r\n end.add(1, 'day');\r\n if (!this._view.isHiddenDay(end)) {\r\n runningCount++;\r\n }\r\n } while (runningCount < dayCount);\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds a normalized range object for the \"visible\" range,\r\n // which is a way to define the currentUnzonedRange and activeUnzonedRange at the same time.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {\r\n var visibleUnzonedRange = this._view.getUnzonedRangeOption('visibleRange', this._view.calendar.applyTimezone(date) // correct zone. also generates new obj that avoids mutations\r\n );\r\n if (visibleUnzonedRange && (visibleUnzonedRange.startMs == null || visibleUnzonedRange.endMs == null)) {\r\n return null;\r\n }\r\n return visibleUnzonedRange;\r\n };\r\n // Computes the range that will represent the element/cells for *rendering*,\r\n // but which may have voided days/times.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n return currentUnzonedRange.clone();\r\n };\r\n // Compute the duration value that should be added/substracted to the current date\r\n // when a prev/next operation happens.\r\n DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {\r\n var dateIncrementInput = this.opt('dateIncrement');\r\n var customAlignment;\r\n if (dateIncrementInput) {\r\n return moment.duration(dateIncrementInput);\r\n }\r\n else if ((customAlignment = this.opt('dateAlignment'))) {\r\n return moment.duration(1, customAlignment);\r\n }\r\n else if (fallback) {\r\n return fallback;\r\n }\r\n else {\r\n return moment.duration({ days: 1 });\r\n }\r\n };\r\n return DateProfileGenerator;\r\n}());\r\nexports.default = DateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 222 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar ExternalDropping = /** @class */ (function (_super) {\r\n tslib_1.__extends(ExternalDropping, _super);\r\n function ExternalDropping() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.isDragging = false; // jqui-dragging an external element? boolean\r\n return _this;\r\n }\r\n /*\r\n component impements:\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - isExternalInstanceGroupAllowed\r\n - renderDrag\r\n - unrenderDrag\r\n */\r\n ExternalDropping.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n ExternalDropping.prototype.bindToDocument = function () {\r\n this.listenTo($(document), {\r\n dragstart: this.handleDragStart,\r\n sortstart: this.handleDragStart // jqui\r\n });\r\n };\r\n ExternalDropping.prototype.unbindFromDocument = function () {\r\n this.stopListeningTo($(document));\r\n };\r\n // Called when a jQuery UI drag is initiated anywhere in the DOM\r\n ExternalDropping.prototype.handleDragStart = function (ev, ui) {\r\n var el;\r\n var accept;\r\n if (this.opt('droppable')) {\r\n el = $((ui ? ui.item : null) || ev.target);\r\n // Test that the dragged element passes the dropAccept selector or filter function.\r\n // FYI, the default is \"*\" (matches all)\r\n accept = this.opt('dropAccept');\r\n if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {\r\n if (!this.isDragging) {\r\n this.listenToExternalDrag(el, ev, ui);\r\n }\r\n }\r\n }\r\n };\r\n // Called when a jQuery UI drag starts and it needs to be monitored for dropping\r\n ExternalDropping.prototype.listenToExternalDrag = function (el, ev, ui) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create\r\n var singleEventDef; // a null value signals an unsuccessful drag\r\n // listener that tracks mouse movement over date-associated pixel regions\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n interactionStart: function () {\r\n _this.isDragging = true;\r\n },\r\n hitOver: function (hit) {\r\n var isAllowed = true;\r\n var hitFootprint = hit.component.getSafeHitFootprint(hit); // hit might not belong to this grid\r\n var mutatedEventInstanceGroup;\r\n if (hitFootprint) {\r\n singleEventDef = _this.computeExternalDrop(hitFootprint, meta);\r\n if (singleEventDef) {\r\n mutatedEventInstanceGroup = new EventInstanceGroup_1.default(singleEventDef.buildInstances());\r\n isAllowed = meta.eventProps ? // isEvent?\r\n component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup) :\r\n component.isExternalInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n singleEventDef = null;\r\n util_1.disableCursor();\r\n }\r\n if (singleEventDef) {\r\n component.renderDrag(// called without a seg parameter\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, view.calendar)));\r\n }\r\n },\r\n hitOut: function () {\r\n singleEventDef = null; // signal unsuccessful\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n component.unrenderDrag();\r\n },\r\n interactionEnd: function (ev) {\r\n if (singleEventDef) {\r\n view.reportExternalDrop(singleEventDef, Boolean(meta.eventProps), // isEvent\r\n Boolean(meta.stick), // isSticky\r\n el, ev, ui);\r\n }\r\n _this.isDragging = false;\r\n _this.dragListener = null;\r\n }\r\n });\r\n dragListener.startDrag(ev); // start listening immediately\r\n };\r\n // Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),\r\n // returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null.\r\n // Returning a null value signals an invalid drop hit.\r\n // DOES NOT consider overlap/constraint.\r\n // Assumes both footprints are non-open-ended.\r\n ExternalDropping.prototype.computeExternalDrop = function (componentFootprint, meta) {\r\n var calendar = this.view.calendar;\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs).stripZone();\r\n var end;\r\n var eventDef;\r\n if (componentFootprint.isAllDay) {\r\n // if dropped on an all-day span, and element's metadata specified a time, set it\r\n if (meta.startTime) {\r\n start.time(meta.startTime);\r\n }\r\n else {\r\n start.stripTime();\r\n }\r\n }\r\n if (meta.duration) {\r\n end = start.clone().add(meta.duration);\r\n }\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n eventDef = SingleEventDef_1.default.parse($.extend({}, meta.eventProps, {\r\n start: start,\r\n end: end\r\n }), new EventSource_1.default(calendar));\r\n return eventDef;\r\n };\r\n return ExternalDropping;\r\n}(Interaction_1.default));\r\nexports.default = ExternalDropping;\r\nListenerMixin_1.default.mixInto(ExternalDropping);\r\n/* External-Dragging-Element Data\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.\r\n// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.\r\nexportHooks.dataAttrPrefix = '';\r\n// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure\r\n// to be used for Event Object creation.\r\n// A defined `.eventProps`, even when empty, indicates that an event should be created.\r\nfunction getDraggedElMeta(el) {\r\n var prefix = exportHooks.dataAttrPrefix;\r\n var eventProps; // properties for creating the event, not related to date/time\r\n var startTime; // a Duration\r\n var duration;\r\n var stick;\r\n if (prefix) {\r\n prefix += '-';\r\n }\r\n eventProps = el.data(prefix + 'event') || null;\r\n if (eventProps) {\r\n if (typeof eventProps === 'object') {\r\n eventProps = $.extend({}, eventProps); // make a copy\r\n }\r\n else {\r\n eventProps = {};\r\n }\r\n // pluck special-cased date/time properties\r\n startTime = eventProps.start;\r\n if (startTime == null) {\r\n startTime = eventProps.time;\r\n } // accept 'time' as well\r\n duration = eventProps.duration;\r\n stick = eventProps.stick;\r\n delete eventProps.start;\r\n delete eventProps.time;\r\n delete eventProps.duration;\r\n delete eventProps.stick;\r\n }\r\n // fallback to standalone attribute values for each of the date/time properties\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'start');\r\n }\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'time');\r\n } // accept 'time' as well\r\n if (duration == null) {\r\n duration = el.data(prefix + 'duration');\r\n }\r\n if (stick == null) {\r\n stick = el.data(prefix + 'stick');\r\n }\r\n // massage into correct data types\r\n startTime = startTime != null ? moment.duration(startTime) : null;\r\n duration = duration != null ? moment.duration(duration) : null;\r\n stick = Boolean(stick);\r\n return { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 223 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventResizing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventResizing, _super);\r\n /*\r\n component impements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - getSafeHitFootprint\r\n */\r\n function EventResizing(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isResizing = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventResizing.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventResizing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMouseDown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventResizing.prototype.handleMouseDown = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventResizing.prototype.handleTouchStart = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev);\r\n }\r\n };\r\n // Creates a listener that tracks the user as they resize an event segment.\r\n // Generic enough to work with any type of Grid.\r\n EventResizing.prototype.buildDragListener = function (seg, isStart) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance;\r\n var isDragging;\r\n var resizeMutation; // zoned event date properties. falsy if invalid resize\r\n // Tracks mouse movement over the *grid's* coordinate map\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n interactionStart: function () {\r\n isDragging = false;\r\n },\r\n dragStart: function (ev) {\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segResizeStart(seg, ev);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origHitFootprint = component.getSafeHitFootprint(origHit);\r\n var hitFootprint = component.getSafeHitFootprint(hit);\r\n var mutatedEventInstanceGroup;\r\n if (origHitFootprint && hitFootprint) {\r\n resizeMutation = isStart ?\r\n _this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, seg.footprint) :\r\n _this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, seg.footprint);\r\n if (resizeMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, resizeMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n resizeMutation = null;\r\n util_1.disableCursor();\r\n }\r\n else if (resizeMutation.isEmpty()) {\r\n // no change. (FYI, event dates might have zones)\r\n resizeMutation = null;\r\n }\r\n if (resizeMutation) {\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n view.renderEventResize(component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg);\r\n }\r\n },\r\n hitOut: function () {\r\n resizeMutation = null;\r\n },\r\n hitDone: function () {\r\n view.unrenderEventResize(seg);\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n if (isDragging) {\r\n _this.segResizeStop(seg, ev);\r\n }\r\n if (resizeMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventResize(eventInstance, resizeMutation, el, ev);\r\n }\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment resizing starts\r\n EventResizing.prototype.segResizeStart = function (seg, ev) {\r\n this.isResizing = true;\r\n this.component.publiclyTrigger('eventResizeStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment resizing stops\r\n EventResizing.prototype.segResizeStop = function (seg, ev) {\r\n this.isResizing = false;\r\n this.component.publiclyTrigger('eventResizeStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Returns new date-information for an event segment being resized from its start\r\n EventResizing.prototype.computeEventStartResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var startDelta = this.component.diffDates(endFootprint.unzonedRange.getStart(), startFootprint.unzonedRange.getStart());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getStart().add(startDelta) < origRange.getEnd()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setStartDelta(startDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n // Returns new date-information for an event segment being resized from its end\r\n EventResizing.prototype.computeEventEndResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var endDelta = this.component.diffDates(endFootprint.unzonedRange.getEnd(), startFootprint.unzonedRange.getEnd());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getEnd().add(endDelta) > origRange.getStart()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setEndDelta(endDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n return EventResizing;\r\n}(Interaction_1.default));\r\nexports.default = EventResizing;\r\n\r\n\r\n/***/ }),\r\n/* 224 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar DragListener_1 = __webpack_require__(54);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar MouseFollower_1 = __webpack_require__(244);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventDragging = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventDragging, _super);\r\n /*\r\n component implements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n */\r\n function EventDragging(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isDragging = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventDragging.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventDragging.prototype.getSelectionDelay = function () {\r\n var delay = this.opt('eventLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n EventDragging.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMousedown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventDragging.prototype.handleMousedown = function (seg, ev) {\r\n if (!this.component.shouldIgnoreMouse() &&\r\n this.component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventDragging.prototype.handleTouchStart = function (seg, ev) {\r\n var component = this.component;\r\n var settings = {\r\n delay: this.view.isEventDefSelected(seg.footprint.eventDef) ? // already selected?\r\n 0 : this.getSelectionDelay()\r\n };\r\n if (component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, settings);\r\n }\r\n else if (component.canStartSelection(seg, ev)) {\r\n this.buildSelectListener(seg).startInteraction(ev, settings);\r\n }\r\n };\r\n // seg isn't draggable, but let's use a generic DragListener\r\n // simply for the delay, so it can be selected.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildSelectListener = function (seg) {\r\n var _this = this;\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n var dragListener = this.dragListener = new DragListener_1.default({\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n },\r\n interactionEnd: function (ev) {\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Builds a listener that will track user-dragging on an event segment.\r\n // Generic enough to work with any type of Grid.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildDragListener = function (seg) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n var isDragging;\r\n var mouseFollower; // A clone of the original element that will move with the mouse\r\n var eventDefMutation;\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents\r\n // of the view.\r\n var dragListener = this.dragListener = new HitDragListener_1.default(view, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n subjectCenter: true,\r\n interactionStart: function (ev) {\r\n seg.component = component; // for renderDrag\r\n isDragging = false;\r\n mouseFollower = new MouseFollower_1.default(seg.el, {\r\n additionalClass: 'fc-dragging',\r\n parentEl: view.el,\r\n opacity: dragListener.isTouch ? null : _this.opt('dragOpacity'),\r\n revertDuration: _this.opt('dragRevertDuration'),\r\n zIndex: 2 // one above the .fc-view\r\n });\r\n mouseFollower.hide(); // don't show until we know this is a real drag\r\n mouseFollower.start(ev);\r\n },\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segDragStart(seg, ev);\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origFootprint;\r\n var footprint;\r\n var mutatedEventInstanceGroup;\r\n // starting hit could be forced (DayGrid.limit)\r\n if (seg.hit) {\r\n origHit = seg.hit;\r\n }\r\n // hit might not belong to this grid, so query origin grid\r\n origFootprint = origHit.component.getSafeHitFootprint(origHit);\r\n footprint = hit.component.getSafeHitFootprint(hit);\r\n if (origFootprint && footprint) {\r\n eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, eventDef);\r\n if (eventDefMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, eventDefMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n eventDefMutation = null;\r\n util_1.disableCursor();\r\n }\r\n // if a valid drop location, have the subclass render a visual indication\r\n if (eventDefMutation &&\r\n view.renderDrag(// truthy if rendered something\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg, dragListener.isTouch)) {\r\n mouseFollower.hide(); // if the subclass is already using a mock event \"helper\", hide our own\r\n }\r\n else {\r\n mouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)\r\n }\r\n if (isOrig) {\r\n // needs to have moved hits to be a valid drop\r\n eventDefMutation = null;\r\n }\r\n },\r\n hitOut: function () {\r\n view.unrenderDrag(seg); // unrender whatever was done in renderDrag\r\n mouseFollower.show(); // show in case we are moving out of all hits\r\n eventDefMutation = null;\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n delete seg.component; // prevent side effects\r\n // do revert animation if hasn't changed. calls a callback when finished (whether animation or not)\r\n mouseFollower.stop(!eventDefMutation, function () {\r\n if (isDragging) {\r\n view.unrenderDrag(seg);\r\n _this.segDragStop(seg, ev);\r\n }\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n if (eventDefMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventDrop(eventInstance, eventDefMutation, el, ev);\r\n }\r\n });\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment dragging starts\r\n EventDragging.prototype.segDragStart = function (seg, ev) {\r\n this.isDragging = true;\r\n this.component.publiclyTrigger('eventDragStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment dragging stops\r\n EventDragging.prototype.segDragStop = function (seg, ev) {\r\n this.isDragging = false;\r\n this.component.publiclyTrigger('eventDragStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // DOES NOT consider overlap/constraint\r\n EventDragging.prototype.computeEventDropMutation = function (startFootprint, endFootprint, eventDef) {\r\n var eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(this.computeEventDateMutation(startFootprint, endFootprint));\r\n return eventDefMutation;\r\n };\r\n EventDragging.prototype.computeEventDateMutation = function (startFootprint, endFootprint) {\r\n var date0 = startFootprint.unzonedRange.getStart();\r\n var date1 = endFootprint.unzonedRange.getStart();\r\n var clearEnd = false;\r\n var forceTimed = false;\r\n var forceAllDay = false;\r\n var dateDelta;\r\n var dateMutation;\r\n if (startFootprint.isAllDay !== endFootprint.isAllDay) {\r\n clearEnd = true;\r\n if (endFootprint.isAllDay) {\r\n forceAllDay = true;\r\n date0.stripTime();\r\n }\r\n else {\r\n forceTimed = true;\r\n }\r\n }\r\n dateDelta = this.component.diffDates(date1, date0);\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.clearEnd = clearEnd;\r\n dateMutation.forceTimed = forceTimed;\r\n dateMutation.forceAllDay = forceAllDay;\r\n dateMutation.setDateDelta(dateDelta);\r\n return dateMutation;\r\n };\r\n return EventDragging;\r\n}(Interaction_1.default));\r\nexports.default = EventDragging;\r\n\r\n\r\n/***/ }),\r\n/* 225 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateSelecting = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateSelecting, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - renderHighlight\r\n - unrenderHighlight\r\n */\r\n function DateSelecting(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateSelecting.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateSelecting.prototype.getDelay = function () {\r\n var delay = this.opt('selectLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n DateSelecting.prototype.bindToEl = function (el) {\r\n var _this = this;\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev, {\r\n distance: _this.opt('selectMinDistance')\r\n });\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev, {\r\n delay: _this.getDelay()\r\n });\r\n }\r\n });\r\n util_1.preventSelection(el);\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day selecting.\r\n DateSelecting.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var selectionFootprint; // null if invalid selection\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n selectionFootprint = null;\r\n },\r\n dragStart: function (ev) {\r\n _this.view.unselect(ev); // since we could be rendering a new selection, we want to clear any old one\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var origHitFootprint;\r\n var hitFootprint;\r\n if (origHit) {\r\n origHitFootprint = component.getSafeHitFootprint(origHit);\r\n hitFootprint = component.getSafeHitFootprint(hit);\r\n if (origHitFootprint && hitFootprint) {\r\n selectionFootprint = _this.computeSelection(origHitFootprint, hitFootprint);\r\n }\r\n else {\r\n selectionFootprint = null;\r\n }\r\n if (selectionFootprint) {\r\n component.renderSelectionFootprint(selectionFootprint);\r\n }\r\n else if (selectionFootprint === false) {\r\n util_1.disableCursor();\r\n }\r\n }\r\n },\r\n hitOut: function () {\r\n selectionFootprint = null;\r\n component.unrenderSelection();\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n if (!isCancelled && selectionFootprint) {\r\n // the selection will already have been rendered. just report it\r\n _this.view.reportSelection(selectionFootprint, ev);\r\n }\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Given the first and last date-spans of a selection, returns another date-span object.\r\n // Subclasses can override and provide additional data in the span object. Will be passed to renderSelectionFootprint().\r\n // Will return false if the selection is invalid and this should be indicated to the user.\r\n // Will return null/undefined if a selection invalid but no error should be reported.\r\n DateSelecting.prototype.computeSelection = function (footprint0, footprint1) {\r\n var wholeFootprint = this.computeSelectionFootprint(footprint0, footprint1);\r\n if (wholeFootprint && !this.isSelectionFootprintAllowed(wholeFootprint)) {\r\n return false;\r\n }\r\n return wholeFootprint;\r\n };\r\n // Given two spans, must return the combination of the two.\r\n // TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.\r\n // Assumes both footprints are non-open-ended.\r\n DateSelecting.prototype.computeSelectionFootprint = function (footprint0, footprint1) {\r\n var ms = [\r\n footprint0.unzonedRange.startMs,\r\n footprint0.unzonedRange.endMs,\r\n footprint1.unzonedRange.startMs,\r\n footprint1.unzonedRange.endMs\r\n ];\r\n ms.sort(util_1.compareNumbers);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(ms[0], ms[3]), footprint0.isAllDay);\r\n };\r\n DateSelecting.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n return this.component.dateProfile.validUnzonedRange.containsRange(componentFootprint.unzonedRange) &&\r\n this.view.calendar.constraints.isSelectionFootprintAllowed(componentFootprint);\r\n };\r\n return DateSelecting;\r\n}(Interaction_1.default));\r\nexports.default = DateSelecting;\r\n\r\n\r\n/***/ }),\r\n/* 226 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nvar DayGrid_1 = __webpack_require__(61);\r\nvar AGENDA_ALL_DAY_EVENT_LIMIT = 5;\r\nvar agendaTimeGridMethods;\r\nvar agendaDayGridMethods;\r\n/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\r\n// Responsible for managing width/height.\r\nvar AgendaView = /** @class */ (function (_super) {\r\n tslib_1.__extends(AgendaView, _super);\r\n function AgendaView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering\r\n _this.timeGrid = _this.instantiateTimeGrid();\r\n _this.addChild(_this.timeGrid);\r\n if (_this.opt('allDaySlot')) {\r\n _this.dayGrid = _this.instantiateDayGrid(); // the all-day subcomponent of this view\r\n _this.addChild(_this.dayGrid);\r\n }\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass\r\n AgendaView.prototype.instantiateTimeGrid = function () {\r\n var timeGrid = new this.timeGridClass(this);\r\n util_1.copyOwnProps(agendaTimeGridMethods, timeGrid);\r\n return timeGrid;\r\n };\r\n // Instantiates the DayGrid object this view might need. Draws from this.dayGridClass\r\n AgendaView.prototype.instantiateDayGrid = function () {\r\n var dayGrid = new this.dayGridClass(this);\r\n util_1.copyOwnProps(agendaDayGridMethods, dayGrid);\r\n return dayGrid;\r\n };\r\n /* Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.renderSkeleton = function () {\r\n var timeGridWrapEl;\r\n var timeGridEl;\r\n this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container');\r\n timeGridEl = $('
').appendTo(timeGridWrapEl);\r\n this.el.find('.fc-body > tr > td').append(timeGridWrapEl);\r\n this.timeGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.timeGrid.setElement(timeGridEl);\r\n if (this.dayGrid) {\r\n this.dayGrid.setElement(this.el.find('.fc-day-grid'));\r\n // have the day-grid extend it's coordinate area over the
dividing the two grids\r\n this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();\r\n }\r\n };\r\n AgendaView.prototype.unrenderSkeleton = function () {\r\n this.timeGrid.removeElement();\r\n if (this.dayGrid) {\r\n this.dayGrid.removeElement();\r\n }\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid and time-grid components will render inside containers defined by this HTML.\r\n AgendaView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
' +\r\n (this.dayGrid ?\r\n '
' +\r\n '
' :\r\n '') +\r\n '
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the axis, if it is known\r\n AgendaView.prototype.axisStyleAttr = function () {\r\n if (this.axisWidth != null) {\r\n return 'style=\"width:' + this.axisWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.getNowIndicatorUnit = function () {\r\n return this.timeGrid.getNowIndicatorUnit();\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Adjusts the vertical dimensions of the view to the specified values\r\n AgendaView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit;\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n // make all axis cells line up, and record the width so newly created axis cells will have it\r\n this.axisWidth = util_1.matchCellWidths(this.el.find('.fc-axis'));\r\n // hack to give the view some height prior to timeGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS timeGrid.\r\n if (!this.timeGrid.colEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n // set of fake row elements that must compensate when scroller has scrollbars\r\n var noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)');\r\n // reset all dimensions back to the original state\r\n this.timeGrid.bottomRuleEl.hide(); // .show() will be called later if this
is necessary\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n util_1.uncompensateScroll(noScrollRowEls);\r\n // limit number of events in the all-day area\r\n if (this.dayGrid) {\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n eventLimit = this.opt('eventLimit');\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\r\n }\r\n if (eventLimit) {\r\n this.dayGrid.limitRows(eventLimit);\r\n }\r\n }\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n // make the all-day and header rows lines up\r\n util_1.compensateScroll(noScrollRowEls, scrollbarWidths);\r\n // the scrollbar compensation might have changed text flow, which might affect height, so recalculate\r\n // and reapply the desired height to the scroller.\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n // if there's any space below the slats, show the horizontal rule.\r\n // this won't cause any new overflow, because lockOverflow already called.\r\n if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {\r\n this.timeGrid.bottomRuleEl.show();\r\n }\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n AgendaView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes the initial pre-configured scroll state prior to allowing the user to change it\r\n AgendaView.prototype.computeInitialDateScroll = function () {\r\n var scrollTime = moment.duration(this.opt('scrollTime'));\r\n var top = this.timeGrid.computeTimeTop(scrollTime);\r\n // zoom can give weird floating-point values. rather scroll a little bit further\r\n top = Math.ceil(top);\r\n if (top) {\r\n top++; // to overcome top border that slots beyond the first have. looks better\r\n }\r\n return { top: top };\r\n };\r\n AgendaView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n AgendaView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n /* Hit Areas\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // forward all hit-related method calls to the grids (dayGrid might not be defined)\r\n AgendaView.prototype.getHitFootprint = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitFootprint(hit);\r\n };\r\n AgendaView.prototype.getHitEl = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitEl(hit);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.executeEventRender = function (eventsPayload) {\r\n var dayEventsPayload = {};\r\n var timedEventsPayload = {};\r\n var id;\r\n var eventInstanceGroup;\r\n // separate the events into all-day and timed\r\n for (id in eventsPayload) {\r\n eventInstanceGroup = eventsPayload[id];\r\n if (eventInstanceGroup.getEventDef().isAllDay()) {\r\n dayEventsPayload[id] = eventInstanceGroup;\r\n }\r\n else {\r\n timedEventsPayload[id] = eventInstanceGroup;\r\n }\r\n }\r\n this.timeGrid.executeEventRender(timedEventsPayload);\r\n if (this.dayGrid) {\r\n this.dayGrid.executeEventRender(dayEventsPayload);\r\n }\r\n };\r\n /* Dragging/Resizing Routing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n AgendaView.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n var renderedHelper = false;\r\n renderedHelper = this.timeGrid.renderDrag(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n renderedHelper = this.dayGrid.renderDrag(groups.allDay, seg, isTouch) || renderedHelper;\r\n }\r\n return renderedHelper;\r\n };\r\n AgendaView.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n this.timeGrid.renderEventResize(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n this.dayGrid.renderEventResize(groups.allDay, seg, isTouch);\r\n }\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection\r\n AgendaView.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (!componentFootprint.isAllDay) {\r\n this.timeGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n else if (this.dayGrid) {\r\n this.dayGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n };\r\n return AgendaView;\r\n}(View_1.default));\r\nexports.default = AgendaView;\r\nAgendaView.prototype.timeGridClass = TimeGrid_1.default;\r\nAgendaView.prototype.dayGridClass = DayGrid_1.default;\r\n// Will customize the rendering behavior of the AgendaView's timeGrid\r\nagendaTimeGridMethods = {\r\n // Generates the HTML that will go before the day-of week header cells\r\n renderHeadIntroHtml: function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var weekStart = calendar.msToUtcMoment(this.dateProfile.renderUnzonedRange.startMs, true);\r\n var weekText;\r\n if (this.opt('weekNumbers')) {\r\n weekText = weekStart.format(this.opt('smallWeekFormat'));\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt > 1 }, util_1.htmlEscape(weekText) // inner HTML\r\n ) +\r\n '';\r\n }\r\n else {\r\n return '';\r\n }\r\n },\r\n // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\n// Will customize the rendering behavior of the AgendaView's dayGrid\r\nagendaDayGridMethods = {\r\n // Generates the HTML that goes before the all-day cells\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n view.getAllDayHtml() +\r\n '' +\r\n '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\nfunction groupEventFootprintsByAllDay(eventFootprints) {\r\n var allDay = [];\r\n var timed = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventFootprints[i].componentFootprint.isAllDay) {\r\n allDay.push(eventFootprints[i]);\r\n }\r\n else {\r\n timed.push(eventFootprints[i]);\r\n }\r\n }\r\n return { allDay: allDay, timed: timed };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 227 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar TimeGridEventRenderer_1 = __webpack_require__(246);\r\nvar TimeGridHelperRenderer_1 = __webpack_require__(247);\r\nvar TimeGridFillRenderer_1 = __webpack_require__(248);\r\n/* A component that renders one or more columns of vertical time slots\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// We mixin DayTable, even though there is only a single row of days\r\n// potential nice values for the slot-duration and interval-duration\r\n// from largest to smallest\r\nvar AGENDA_STOCK_SUB_DURATIONS = [\r\n { hours: 1 },\r\n { minutes: 30 },\r\n { minutes: 15 },\r\n { seconds: 30 },\r\n { seconds: 15 }\r\n];\r\nvar TimeGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGrid, _super);\r\n function TimeGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.processOptions();\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n TimeGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByTimes(componentFootprint.unzonedRange);\r\n var i;\r\n for (i = 0; i < segs.length; i++) {\r\n if (this.isRTL) {\r\n segs[i].col = this.daysPerRow - 1 - segs[i].dayIndex;\r\n }\r\n else {\r\n segs[i].col = segs[i].dayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Handling\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.sliceRangeByTimes = function (unzonedRange) {\r\n var segs = [];\r\n var segRange;\r\n var dayIndex;\r\n for (dayIndex = 0; dayIndex < this.daysPerRow; dayIndex++) {\r\n segRange = unzonedRange.intersect(this.dayRanges[dayIndex]);\r\n if (segRange) {\r\n segs.push({\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Parses various options into properties of this object\r\n TimeGrid.prototype.processOptions = function () {\r\n var slotDuration = this.opt('slotDuration');\r\n var snapDuration = this.opt('snapDuration');\r\n var input;\r\n slotDuration = moment.duration(slotDuration);\r\n snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;\r\n this.slotDuration = slotDuration;\r\n this.snapDuration = snapDuration;\r\n this.snapsPerSlot = slotDuration / snapDuration; // TODO: ensure an integer multiple?\r\n // might be an array value (for TimelineView).\r\n // if so, getting the most granular entry (the last one probably).\r\n input = this.opt('slotLabelFormat');\r\n if ($.isArray(input)) {\r\n input = input[input.length - 1];\r\n }\r\n this.labelFormat = input ||\r\n this.opt('smallTimeFormat'); // the computed default\r\n input = this.opt('slotLabelInterval');\r\n this.labelInterval = input ?\r\n moment.duration(input) :\r\n this.computeLabelInterval(slotDuration);\r\n };\r\n // Computes an automatic value for slotLabelInterval\r\n TimeGrid.prototype.computeLabelInterval = function (slotDuration) {\r\n var i;\r\n var labelInterval;\r\n var slotsPerLabel;\r\n // find the smallest stock label interval that results in more than one slots-per-label\r\n for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {\r\n labelInterval = moment.duration(AGENDA_STOCK_SUB_DURATIONS[i]);\r\n slotsPerLabel = util_1.divideDurationByDuration(labelInterval, slotDuration);\r\n if (util_1.isInt(slotsPerLabel) && slotsPerLabel > 1) {\r\n return labelInterval;\r\n }\r\n }\r\n return moment.duration(slotDuration); // fall back. clone\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderSlats();\r\n this.renderColumns();\r\n };\r\n TimeGrid.prototype.unrenderDates = function () {\r\n // this.unrenderSlats(); // don't need this because repeated .html() calls clear\r\n this.unrenderColumns();\r\n };\r\n TimeGrid.prototype.renderSkeleton = function () {\r\n var theme = this.view.calendar.theme;\r\n this.el.html('
' +\r\n '
' +\r\n '
');\r\n this.bottomRuleEl = this.el.find('hr');\r\n };\r\n TimeGrid.prototype.renderSlats = function () {\r\n var theme = this.view.calendar.theme;\r\n this.slatContainerEl = this.el.find('> .fc-slats')\r\n .html(// avoids needing ::unrenderSlats()\r\n '' +\r\n this.renderSlatRowHtml() +\r\n '
');\r\n this.slatEls = this.slatContainerEl.find('tr');\r\n this.slatCoordCache = new CoordCache_1.default({\r\n els: this.slatEls,\r\n isVertical: true\r\n });\r\n };\r\n // Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\r\n TimeGrid.prototype.renderSlatRowHtml = function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var isRTL = this.isRTL;\r\n var dateProfile = this.dateProfile;\r\n var html = '';\r\n var slotTime = moment.duration(+dateProfile.minTime); // wish there was .clone() for durations\r\n var slotIterator = moment.duration(0);\r\n var slotDate; // will be on the view's first day, but we only care about its time\r\n var isLabeled;\r\n var axisHtml;\r\n // Calculate the time for each slot\r\n while (slotTime < dateProfile.maxTime) {\r\n slotDate = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs).time(slotTime);\r\n isLabeled = util_1.isInt(util_1.divideDurationByDuration(slotIterator, this.labelInterval));\r\n axisHtml =\r\n '' +\r\n (isLabeled ?\r\n '' + // for matchCellWidths\r\n util_1.htmlEscape(slotDate.format(this.labelFormat)) +\r\n '' :\r\n '') +\r\n '';\r\n html +=\r\n '' +\r\n (!isRTL ? axisHtml : '') +\r\n '' +\r\n (isRTL ? axisHtml : '') +\r\n '';\r\n slotTime.add(this.slotDuration);\r\n slotIterator.add(this.slotDuration);\r\n }\r\n return html;\r\n };\r\n TimeGrid.prototype.renderColumns = function () {\r\n var dateProfile = this.dateProfile;\r\n var theme = this.view.calendar.theme;\r\n this.dayRanges = this.dayDates.map(function (dayDate) {\r\n return new UnzonedRange_1.default(dayDate.clone().add(dateProfile.minTime), dayDate.clone().add(dateProfile.maxTime));\r\n });\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n this.el.find('> .fc-bg').html('' +\r\n this.renderBgTrHtml(0) + // row=0\r\n '
');\r\n this.colEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.colEls,\r\n isHorizontal: true\r\n });\r\n this.renderContentSkeleton();\r\n };\r\n TimeGrid.prototype.unrenderColumns = function () {\r\n this.unrenderContentSkeleton();\r\n };\r\n /* Content Skeleton\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders the DOM that the view's content will live in\r\n TimeGrid.prototype.renderContentSkeleton = function () {\r\n var cellHtml = '';\r\n var i;\r\n var skeletonEl;\r\n for (i = 0; i < this.colCnt; i++) {\r\n cellHtml +=\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '';\r\n }\r\n skeletonEl = this.contentSkeletonEl = $('
' +\r\n '' +\r\n '' + cellHtml + '' +\r\n '
' +\r\n '
');\r\n this.colContainerEls = skeletonEl.find('.fc-content-col');\r\n this.helperContainerEls = skeletonEl.find('.fc-helper-container');\r\n this.fgContainerEls = skeletonEl.find('.fc-event-container:not(.fc-helper-container)');\r\n this.bgContainerEls = skeletonEl.find('.fc-bgevent-container');\r\n this.highlightContainerEls = skeletonEl.find('.fc-highlight-container');\r\n this.businessContainerEls = skeletonEl.find('.fc-business-container');\r\n this.bookendCells(skeletonEl.find('tr')); // TODO: do this on string level\r\n this.el.append(skeletonEl);\r\n };\r\n TimeGrid.prototype.unrenderContentSkeleton = function () {\r\n if (this.contentSkeletonEl) {\r\n this.contentSkeletonEl.remove();\r\n this.contentSkeletonEl = null;\r\n this.colContainerEls = null;\r\n this.helperContainerEls = null;\r\n this.fgContainerEls = null;\r\n this.bgContainerEls = null;\r\n this.highlightContainerEls = null;\r\n this.businessContainerEls = null;\r\n }\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\r\n TimeGrid.prototype.groupSegsByCol = function (segs) {\r\n var segsByCol = [];\r\n var i;\r\n for (i = 0; i < this.colCnt; i++) {\r\n segsByCol.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segsByCol[segs[i].col].push(segs[i]);\r\n }\r\n return segsByCol;\r\n };\r\n // Given segments grouped by column, insert the segments' elements into a parallel array of container\r\n // elements, each living within a column.\r\n TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {\r\n var col;\r\n var segs;\r\n var i;\r\n for (col = 0; col < this.colCnt; col++) {\r\n segs = segsByCol[col];\r\n for (i = 0; i < segs.length; i++) {\r\n containerEls.eq(col).append(segs[i].el);\r\n }\r\n }\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.getNowIndicatorUnit = function () {\r\n return 'minute'; // will refresh on the minute\r\n };\r\n TimeGrid.prototype.renderNowIndicator = function (date) {\r\n // HACK: if date columns not ready for some reason (scheduler)\r\n if (!this.colContainerEls) {\r\n return;\r\n }\r\n // seg system might be overkill, but it handles scenario where line needs to be rendered\r\n // more than once because of columns with the same date (resources columns for example)\r\n var segs = this.componentFootprintToSegs(new ComponentFootprint_1.default(new UnzonedRange_1.default(date, date.valueOf() + 1), // protect against null range\r\n false // all-day\r\n ));\r\n var top = this.computeDateTop(date, date);\r\n var nodes = [];\r\n var i;\r\n // render lines within the columns\r\n for (i = 0; i < segs.length; i++) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.colContainerEls.eq(segs[i].col))[0]);\r\n }\r\n // render an arrow over the axis\r\n if (segs.length > 0) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.el.find('.fc-content-skeleton'))[0]);\r\n }\r\n this.nowIndicatorEls = $(nodes);\r\n };\r\n TimeGrid.prototype.unrenderNowIndicator = function () {\r\n if (this.nowIndicatorEls) {\r\n this.nowIndicatorEls.remove();\r\n this.nowIndicatorEls = null;\r\n }\r\n };\r\n /* Coordinates\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.slatCoordCache.build();\r\n if (isResize) {\r\n this.updateSegVerticals([].concat(this.eventRenderer.getSegs(), this.businessSegs || []));\r\n }\r\n };\r\n TimeGrid.prototype.getTotalSlatHeight = function () {\r\n return this.slatContainerEl.outerHeight();\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given date.\r\n // `ms` can be a millisecond UTC time OR a UTC moment.\r\n // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\r\n TimeGrid.prototype.computeDateTop = function (ms, startOfDayDate) {\r\n return this.computeTimeTop(moment.duration(ms - startOfDayDate.clone().stripTime()));\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\r\n TimeGrid.prototype.computeTimeTop = function (time) {\r\n var len = this.slatEls.length;\r\n var dateProfile = this.dateProfile;\r\n var slatCoverage = (time - dateProfile.minTime) / this.slotDuration; // floating-point value of # of slots covered\r\n var slatIndex;\r\n var slatRemainder;\r\n // compute a floating-point number for how many slats should be progressed through.\r\n // from 0 to number of slats (inclusive)\r\n // constrained because minTime/maxTime might be customized.\r\n slatCoverage = Math.max(0, slatCoverage);\r\n slatCoverage = Math.min(len, slatCoverage);\r\n // an integer index of the furthest whole slat\r\n // from 0 to number slats (*exclusive*, so len-1)\r\n slatIndex = Math.floor(slatCoverage);\r\n slatIndex = Math.min(slatIndex, len - 1);\r\n // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.\r\n // could be 1.0 if slatCoverage is covering *all* the slots\r\n slatRemainder = slatCoverage - slatIndex;\r\n return this.slatCoordCache.getTopPosition(slatIndex) +\r\n this.slatCoordCache.getHeight(slatIndex) * slatRemainder;\r\n };\r\n // Refreshes the CSS top/bottom coordinates for each segment element.\r\n // Works when called after initial render, after a window resize/zoom for example.\r\n TimeGrid.prototype.updateSegVerticals = function (segs) {\r\n this.computeSegVerticals(segs);\r\n this.assignSegVerticals(segs);\r\n };\r\n // For each segment in an array, computes and assigns its top and bottom properties\r\n TimeGrid.prototype.computeSegVerticals = function (segs) {\r\n var eventMinHeight = this.opt('agendaEventMinHeight');\r\n var i;\r\n var seg;\r\n var dayDate;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n dayDate = this.dayDates[seg.dayIndex];\r\n seg.top = this.computeDateTop(seg.startMs, dayDate);\r\n seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.endMs, dayDate));\r\n }\r\n };\r\n // Given segments that already have their top/bottom properties computed, applies those values to\r\n // the segments' elements.\r\n TimeGrid.prototype.assignSegVerticals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateSegVerticalCss(seg));\r\n }\r\n };\r\n // Generates an object with CSS properties for the top/bottom coordinates of a segment element\r\n TimeGrid.prototype.generateSegVerticalCss = function (seg) {\r\n return {\r\n top: seg.top,\r\n bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\r\n };\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.slatCoordCache.build();\r\n };\r\n TimeGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n // NOTE: don't clear slatCoordCache because we rely on it for computeTimeTop\r\n };\r\n TimeGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n var snapsPerSlot = this.snapsPerSlot;\r\n var colCoordCache = this.colCoordCache;\r\n var slatCoordCache = this.slatCoordCache;\r\n if (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {\r\n var colIndex = colCoordCache.getHorizontalIndex(leftOffset);\r\n var slatIndex = slatCoordCache.getVerticalIndex(topOffset);\r\n if (colIndex != null && slatIndex != null) {\r\n var slatTop = slatCoordCache.getTopOffset(slatIndex);\r\n var slatHeight = slatCoordCache.getHeight(slatIndex);\r\n var partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1\r\n var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat\r\n var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;\r\n var snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;\r\n var snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;\r\n return {\r\n col: colIndex,\r\n snap: snapIndex,\r\n component: this,\r\n left: colCoordCache.getLeftOffset(colIndex),\r\n right: colCoordCache.getRightOffset(colIndex),\r\n top: snapTop,\r\n bottom: snapBottom\r\n };\r\n }\r\n }\r\n };\r\n TimeGrid.prototype.getHitFootprint = function (hit) {\r\n var start = this.getCellDate(0, hit.col); // row=0\r\n var time = this.computeSnapTime(hit.snap); // pass in the snap-index\r\n var end;\r\n start.time(time);\r\n end = start.clone().add(this.snapDuration);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), false // all-day?\r\n );\r\n };\r\n // Given a row number of the grid, representing a \"snap\", returns a time (Duration) from its start-of-day\r\n TimeGrid.prototype.computeSnapTime = function (snapIndex) {\r\n return moment.duration(this.dateProfile.minTime + this.snapDuration * snapIndex);\r\n };\r\n TimeGrid.prototype.getHitEl = function (hit) {\r\n return this.colEls.eq(hit.col);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being dragged over the specified date(s).\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n TimeGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n if (seg) {\r\n if (eventFootprints.length) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n // signal that a helper has been rendered\r\n return true;\r\n }\r\n }\r\n else {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n }\r\n };\r\n // Unrenders any visual indication of an event being dragged\r\n TimeGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n TimeGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders any visual indication of an event being resized\r\n TimeGrid.prototype.unrenderEventResize = function () {\r\n this.helperRenderer.unrender();\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\r\n TimeGrid.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (this.opt('selectHelper')) {\r\n this.helperRenderer.renderComponentFootprint(componentFootprint);\r\n }\r\n else {\r\n this.renderHighlight(componentFootprint);\r\n }\r\n };\r\n // Unrenders any visual indication of a selection\r\n TimeGrid.prototype.unrenderSelection = function () {\r\n this.helperRenderer.unrender();\r\n this.unrenderHighlight();\r\n };\r\n return TimeGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = TimeGrid;\r\nTimeGrid.prototype.eventRendererClass = TimeGridEventRenderer_1.default;\r\nTimeGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nTimeGrid.prototype.helperRendererClass = TimeGridHelperRenderer_1.default;\r\nTimeGrid.prototype.fillRendererClass = TimeGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(TimeGrid);\r\nDayTableMixin_1.default.mixInto(TimeGrid);\r\n\r\n\r\n/***/ }),\r\n/* 228 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar BasicViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicViewDateProfileGenerator, _super);\r\n function BasicViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n BasicViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay); // an UnzonedRange\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n // year and month views should be aligned with weeks. this is already done for week\r\n if (/^(year|month)$/.test(currentRangeUnit)) {\r\n start.startOf('week');\r\n // make end-of-week if not already\r\n if (end.weekday()) {\r\n end.add(1, 'week').startOf('week'); // exclusively move backwards\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return BasicViewDateProfileGenerator;\r\n}(DateProfileGenerator_1.default));\r\nexports.default = BasicViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 229 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthViewDateProfileGenerator_1 = __webpack_require__(253);\r\n/* A month view with day cells running in rows (one-per-week) and columns\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MonthView = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthView, _super);\r\n function MonthView() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Overrides the default BasicView behavior to have special multi-week auto-height logic\r\n MonthView.prototype.setGridHeight = function (height, isAuto) {\r\n // if auto, make the height of each row the height that it would be if there were 6 weeks\r\n if (isAuto) {\r\n height *= this.dayGrid.rowCnt / 6;\r\n }\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\r\n };\r\n MonthView.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return date.month() !== moment.utc(dateProfile.currentUnzonedRange.startMs).month(); // TODO: optimize\r\n };\r\n return MonthView;\r\n}(BasicView_1.default));\r\nexports.default = MonthView;\r\nMonthView.prototype.dateProfileGeneratorClass = MonthViewDateProfileGenerator_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 230 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar View_1 = __webpack_require__(41);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar ListEventRenderer_1 = __webpack_require__(254);\r\nvar ListEventPointing_1 = __webpack_require__(255);\r\n/*\r\nResponsible for the scroller, and forwarding event-related actions into the \"grid\".\r\n*/\r\nvar ListView = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListView, _super);\r\n function ListView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.segSelector = '.fc-list-item'; // which elements accept event actions\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n ListView.prototype.renderSkeleton = function () {\r\n this.el.addClass('fc-list-view ' +\r\n this.calendar.theme.getClass('listView'));\r\n this.scroller.render();\r\n this.scroller.el.appendTo(this.el);\r\n this.contentEl = this.scroller.scrollEl; // shortcut\r\n };\r\n ListView.prototype.unrenderSkeleton = function () {\r\n this.scroller.destroy(); // will remove the Grid too\r\n };\r\n ListView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n if (!isAuto) {\r\n this.scroller.setHeight(this.computeScrollerHeight(totalHeight));\r\n }\r\n };\r\n ListView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n ListView.prototype.renderDates = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var dayStart = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs, true);\r\n var viewEnd = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.endMs, true);\r\n var dayDates = [];\r\n var dayRanges = [];\r\n while (dayStart < viewEnd) {\r\n dayDates.push(dayStart.clone());\r\n dayRanges.push(new UnzonedRange_1.default(dayStart, dayStart.clone().add(1, 'day')));\r\n dayStart.add(1, 'day');\r\n }\r\n this.dayDates = dayDates;\r\n this.dayRanges = dayRanges;\r\n // all real rendering happens in EventRenderer\r\n };\r\n // slices by day\r\n ListView.prototype.componentFootprintToSegs = function (footprint) {\r\n var dayRanges = this.dayRanges;\r\n var dayIndex;\r\n var segRange;\r\n var seg;\r\n var segs = [];\r\n for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {\r\n segRange = footprint.unzonedRange.intersect(dayRanges[dayIndex]);\r\n if (segRange) {\r\n seg = {\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n };\r\n segs.push(seg);\r\n // detect when footprint won't go fully into the next day,\r\n // and mutate the latest seg to the be the end.\r\n if (!seg.isEnd && !footprint.isAllDay &&\r\n dayIndex + 1 < dayRanges.length &&\r\n footprint.unzonedRange.endMs < dayRanges[dayIndex + 1].startMs + this.nextDayThreshold) {\r\n seg.endMs = footprint.unzonedRange.endMs;\r\n seg.isEnd = true;\r\n break;\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n ListView.prototype.renderEmptyMessage = function () {\r\n this.contentEl.html('
' + // TODO: try less wraps\r\n '
' +\r\n '
' +\r\n util_1.htmlEscape(this.opt('noEventsMessage')) +\r\n '
' +\r\n '
' +\r\n '
');\r\n };\r\n // render the event segments in the view\r\n ListView.prototype.renderSegList = function (allSegs) {\r\n var segsByDay = this.groupSegsByDay(allSegs); // sparse array\r\n var dayIndex;\r\n var daySegs;\r\n var i;\r\n var tableEl = $('
');\r\n var tbodyEl = tableEl.find('tbody');\r\n for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {\r\n daySegs = segsByDay[dayIndex];\r\n if (daySegs) {\r\n // append a day header\r\n tbodyEl.append(this.dayHeaderHtml(this.dayDates[dayIndex]));\r\n this.eventRenderer.sortEventSegs(daySegs);\r\n for (i = 0; i < daySegs.length; i++) {\r\n tbodyEl.append(daySegs[i].el); // append event row\r\n }\r\n }\r\n }\r\n this.contentEl.empty().append(tableEl);\r\n };\r\n // Returns a sparse array of arrays, segs grouped by their dayIndex\r\n ListView.prototype.groupSegsByDay = function (segs) {\r\n var segsByDay = []; // sparse array\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))\r\n .push(seg);\r\n }\r\n return segsByDay;\r\n };\r\n // generates the HTML for the day headers that live amongst the event rows\r\n ListView.prototype.dayHeaderHtml = function (dayDate) {\r\n var mainFormat = this.opt('listDayFormat');\r\n var altFormat = this.opt('listDayAltFormat');\r\n return '' +\r\n '' +\r\n (mainFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-main' }, util_1.htmlEscape(dayDate.format(mainFormat)) // inner HTML\r\n ) :\r\n '') +\r\n (altFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-alt' }, util_1.htmlEscape(dayDate.format(altFormat)) // inner HTML\r\n ) :\r\n '') +\r\n '' +\r\n '';\r\n };\r\n return ListView;\r\n}(View_1.default));\r\nexports.default = ListView;\r\nListView.prototype.eventRendererClass = ListEventRenderer_1.default;\r\nListView.prototype.eventPointingClass = ListEventPointing_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 231 */,\r\n/* 232 */,\r\n/* 233 */,\r\n/* 234 */,\r\n/* 235 */,\r\n/* 236 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar Calendar_1 = __webpack_require__(220);\r\n// for intentional side-effects\r\n__webpack_require__(10);\r\n__webpack_require__(47);\r\n__webpack_require__(256);\r\n__webpack_require__(257);\r\n__webpack_require__(260);\r\n__webpack_require__(261);\r\n__webpack_require__(262);\r\n__webpack_require__(263);\r\n$.fullCalendar = exportHooks;\r\n$.fn.fullCalendar = function (options) {\r\n var args = Array.prototype.slice.call(arguments, 1); // for a possible method call\r\n var res = this; // what this function will return (this jQuery object by default)\r\n this.each(function (i, _element) {\r\n var element = $(_element);\r\n var calendar = element.data('fullCalendar'); // get the existing calendar object (if any)\r\n var singleRes; // the returned value of this single method call\r\n // a method call\r\n if (typeof options === 'string') {\r\n if (options === 'getCalendar') {\r\n if (!i) {\r\n res = calendar;\r\n }\r\n }\r\n else if (options === 'destroy') {\r\n if (calendar) {\r\n calendar.destroy();\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else if (!calendar) {\r\n util_1.warn('Attempting to call a FullCalendar method on an element with no calendar.');\r\n }\r\n else if ($.isFunction(calendar[options])) {\r\n singleRes = calendar[options].apply(calendar, args);\r\n if (!i) {\r\n res = singleRes; // record the first method call result\r\n }\r\n if (options === 'destroy') {\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else {\r\n util_1.warn(\"'\" + options + \"' is an unknown FullCalendar method.\");\r\n }\r\n }\r\n else if (!calendar) {\r\n calendar = new Calendar_1.default(element, options);\r\n element.data('fullCalendar', calendar);\r\n calendar.render();\r\n }\r\n });\r\n return res;\r\n};\r\nmodule.exports = exportHooks;\r\n\r\n\r\n/***/ }),\r\n/* 237 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Model_1 = __webpack_require__(48);\r\nvar Component = /** @class */ (function (_super) {\r\n tslib_1.__extends(Component, _super);\r\n function Component() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Component.prototype.setElement = function (el) {\r\n this.el = el;\r\n this.bindGlobalHandlers();\r\n this.renderSkeleton();\r\n this.set('isInDom', true);\r\n };\r\n Component.prototype.removeElement = function () {\r\n this.unset('isInDom');\r\n this.unrenderSkeleton();\r\n this.unbindGlobalHandlers();\r\n this.el.remove();\r\n // NOTE: don't null-out this.el in case the View was destroyed within an API callback.\r\n // We don't null-out the View's other jQuery element references upon destroy,\r\n // so we shouldn't kill this.el either.\r\n };\r\n Component.prototype.bindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n Component.prototype.unbindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n /*\r\n NOTE: Can't have a `render` method. Read the deprecation notice in View::executeDateRender\r\n */\r\n // Renders the basic structure of the view before any content is rendered\r\n Component.prototype.renderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n // Unrenders the basic structure of the view\r\n Component.prototype.unrenderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n return Component;\r\n}(Model_1.default));\r\nexports.default = Component;\r\n\r\n\r\n/***/ }),\r\n/* 238 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Iterator = /** @class */ (function () {\r\n function Iterator(items) {\r\n this.items = items || [];\r\n }\r\n /* Calls a method on every item passing the arguments through */\r\n Iterator.prototype.proxyCall = function (methodName) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n var results = [];\r\n this.items.forEach(function (item) {\r\n results.push(item[methodName].apply(item, args));\r\n });\r\n return results;\r\n };\r\n return Iterator;\r\n}());\r\nexports.default = Iterator;\r\n\r\n\r\n/***/ }),\r\n/* 239 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/* Toolbar with buttons and title\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar Toolbar = /** @class */ (function () {\r\n function Toolbar(calendar, toolbarOptions) {\r\n this.el = null; // mirrors local `el`\r\n this.viewsWithButtons = [];\r\n this.calendar = calendar;\r\n this.toolbarOptions = toolbarOptions;\r\n }\r\n // method to update toolbar-specific options, not calendar-wide options\r\n Toolbar.prototype.setToolbarOptions = function (newToolbarOptions) {\r\n this.toolbarOptions = newToolbarOptions;\r\n };\r\n // can be called repeatedly and will rerender\r\n Toolbar.prototype.render = function () {\r\n var sections = this.toolbarOptions.layout;\r\n var el = this.el;\r\n if (sections) {\r\n if (!el) {\r\n el = this.el = $(\"
\");\r\n }\r\n else {\r\n el.empty();\r\n }\r\n el.append(this.renderSection('left'))\r\n .append(this.renderSection('right'))\r\n .append(this.renderSection('center'))\r\n .append('
');\r\n }\r\n else {\r\n this.removeElement();\r\n }\r\n };\r\n Toolbar.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n Toolbar.prototype.renderSection = function (position) {\r\n var _this = this;\r\n var calendar = this.calendar;\r\n var theme = calendar.theme;\r\n var optionsManager = calendar.optionsManager;\r\n var viewSpecManager = calendar.viewSpecManager;\r\n var sectionEl = $('
');\r\n var buttonStr = this.toolbarOptions.layout[position];\r\n var calendarCustomButtons = optionsManager.get('customButtons') || {};\r\n var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};\r\n var calendarButtonText = optionsManager.get('buttonText') || {};\r\n if (buttonStr) {\r\n $.each(buttonStr.split(' '), function (i, buttonGroupStr) {\r\n var groupChildren = $();\r\n var isOnlyButtons = true;\r\n var groupEl;\r\n $.each(buttonGroupStr.split(','), function (j, buttonName) {\r\n var customButtonProps;\r\n var viewSpec;\r\n var buttonClick;\r\n var buttonIcon; // only one of these will be set\r\n var buttonText; // \"\r\n var buttonInnerHtml;\r\n var buttonClasses;\r\n var buttonEl;\r\n var buttonAriaAttr;\r\n if (buttonName === 'title') {\r\n groupChildren = groupChildren.add($('

 

')); // we always want it to take up height\r\n isOnlyButtons = false;\r\n }\r\n else {\r\n if ((customButtonProps = calendarCustomButtons[buttonName])) {\r\n buttonClick = function (ev) {\r\n if (customButtonProps.click) {\r\n customButtonProps.click.call(buttonEl[0], ev);\r\n }\r\n };\r\n (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = customButtonProps.text);\r\n }\r\n else if ((viewSpec = viewSpecManager.getViewSpec(buttonName))) {\r\n _this.viewsWithButtons.push(buttonName);\r\n buttonClick = function () {\r\n calendar.changeView(buttonName);\r\n };\r\n (buttonText = viewSpec.buttonTextOverride) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = viewSpec.buttonTextDefault);\r\n }\r\n else if (calendar[buttonName]) {\r\n buttonClick = function () {\r\n calendar[buttonName]();\r\n };\r\n (buttonText = calendarButtonTextOverrides[buttonName]) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = calendarButtonText[buttonName]);\r\n // ^ everything else is considered default\r\n }\r\n if (buttonClick) {\r\n buttonClasses = [\r\n 'fc-' + buttonName + '-button',\r\n theme.getClass('button'),\r\n theme.getClass('stateDefault')\r\n ];\r\n if (buttonText) {\r\n buttonInnerHtml = util_1.htmlEscape(buttonText);\r\n buttonAriaAttr = '';\r\n }\r\n else if (buttonIcon) {\r\n buttonInnerHtml = \"\";\r\n buttonAriaAttr = ' aria-label=\"' + buttonName + '\"';\r\n }\r\n buttonEl = $(// type=\"button\" so that it doesn't submit a form\r\n '')\r\n .click(function (ev) {\r\n // don't process clicks for disabled buttons\r\n if (!buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonClick(ev);\r\n // after the click action, if the button becomes the \"active\" tab, or disabled,\r\n // it should never have a hover class, so remove it now.\r\n if (buttonEl.hasClass(theme.getClass('stateActive')) ||\r\n buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonEl.removeClass(theme.getClass('stateHover'));\r\n }\r\n }\r\n })\r\n .mousedown(function () {\r\n // the *down* effect (mouse pressed in).\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateDown'));\r\n })\r\n .mouseup(function () {\r\n // undo the *down* effect\r\n buttonEl.removeClass(theme.getClass('stateDown'));\r\n })\r\n .hover(function () {\r\n // the *hover* effect.\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateHover'));\r\n }, function () {\r\n // undo the *hover* effect\r\n buttonEl\r\n .removeClass(theme.getClass('stateHover'))\r\n .removeClass(theme.getClass('stateDown')); // if mouseleave happens before mouseup\r\n });\r\n groupChildren = groupChildren.add(buttonEl);\r\n }\r\n }\r\n });\r\n if (isOnlyButtons) {\r\n groupChildren\r\n .first().addClass(theme.getClass('cornerLeft')).end()\r\n .last().addClass(theme.getClass('cornerRight')).end();\r\n }\r\n if (groupChildren.length > 1) {\r\n groupEl = $('
');\r\n if (isOnlyButtons) {\r\n groupEl.addClass(theme.getClass('buttonGroup'));\r\n }\r\n groupEl.append(groupChildren);\r\n sectionEl.append(groupEl);\r\n }\r\n else {\r\n sectionEl.append(groupChildren); // 1 or 0 children\r\n }\r\n });\r\n }\r\n return sectionEl;\r\n };\r\n Toolbar.prototype.updateTitle = function (text) {\r\n if (this.el) {\r\n this.el.find('h2').text(text);\r\n }\r\n };\r\n Toolbar.prototype.activateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .addClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.deactivateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .removeClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.disableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', true)\r\n .addClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.enableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', false)\r\n .removeClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.getViewsWithButtons = function () {\r\n return this.viewsWithButtons;\r\n };\r\n return Toolbar;\r\n}());\r\nexports.default = Toolbar;\r\n\r\n\r\n/***/ }),\r\n/* 240 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar Model_1 = __webpack_require__(48);\r\nvar OptionsManager = /** @class */ (function (_super) {\r\n tslib_1.__extends(OptionsManager, _super);\r\n function OptionsManager(_calendar, overrides) {\r\n var _this = _super.call(this) || this;\r\n _this._calendar = _calendar;\r\n _this.overrides = $.extend({}, overrides); // make a copy\r\n _this.dynamicOverrides = {};\r\n _this.compute();\r\n return _this;\r\n }\r\n OptionsManager.prototype.add = function (newOptionHash) {\r\n var optionCnt = 0;\r\n var optionName;\r\n this.recordOverrides(newOptionHash); // will trigger this model's watchers\r\n for (optionName in newOptionHash) {\r\n optionCnt++;\r\n }\r\n // special-case handling of single option change.\r\n // if only one option change, `optionName` will be its name.\r\n if (optionCnt === 1) {\r\n if (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') {\r\n this._calendar.updateViewSize(true); // isResize=true\r\n return;\r\n }\r\n else if (optionName === 'defaultDate') {\r\n return; // can't change date this way. use gotoDate instead\r\n }\r\n else if (optionName === 'businessHours') {\r\n return; // this model already reacts to this\r\n }\r\n else if (/^(event|select)(Overlap|Constraint|Allow)$/.test(optionName)) {\r\n return; // doesn't affect rendering. only interactions.\r\n }\r\n else if (optionName === 'timezone') {\r\n this._calendar.view.flash('initialEvents');\r\n return;\r\n }\r\n }\r\n // catch-all. rerender the header and footer and rebuild/rerender the current view\r\n this._calendar.renderHeader();\r\n this._calendar.renderFooter();\r\n // even non-current views will be affected by this option change. do before rerender\r\n // TODO: detangle\r\n this._calendar.viewsByType = {};\r\n this._calendar.reinitView();\r\n };\r\n // Computes the flattened options hash for the calendar and assigns to `this.options`.\r\n // Assumes this.overrides and this.dynamicOverrides have already been initialized.\r\n OptionsManager.prototype.compute = function () {\r\n var locale;\r\n var localeDefaults;\r\n var isRTL;\r\n var dirDefaults;\r\n var rawOptions;\r\n locale = util_1.firstDefined(// explicit locale option given?\r\n this.dynamicOverrides.locale, this.overrides.locale);\r\n localeDefaults = locale_1.localeOptionHash[locale];\r\n if (!localeDefaults) {\r\n locale = options_1.globalDefaults.locale;\r\n localeDefaults = locale_1.localeOptionHash[locale] || {};\r\n }\r\n isRTL = util_1.firstDefined(// based on options computed so far, is direction RTL?\r\n this.dynamicOverrides.isRTL, this.overrides.isRTL, localeDefaults.isRTL, options_1.globalDefaults.isRTL);\r\n dirDefaults = isRTL ? options_1.rtlDefaults : {};\r\n this.dirDefaults = dirDefaults;\r\n this.localeDefaults = localeDefaults;\r\n rawOptions = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n dirDefaults,\r\n localeDefaults,\r\n this.overrides,\r\n this.dynamicOverrides\r\n ]);\r\n locale_1.populateInstanceComputableOptions(rawOptions); // fill in gaps with computed options\r\n this.reset(rawOptions);\r\n };\r\n // stores the new options internally, but does not rerender anything.\r\n OptionsManager.prototype.recordOverrides = function (newOptionHash) {\r\n var optionName;\r\n for (optionName in newOptionHash) {\r\n this.dynamicOverrides[optionName] = newOptionHash[optionName];\r\n }\r\n this._calendar.viewSpecManager.clearCache(); // the dynamic override invalidates the options in this cache, so just clear it\r\n this.compute(); // this.options needs to be recomputed after the dynamic override\r\n };\r\n return OptionsManager;\r\n}(Model_1.default));\r\nexports.default = OptionsManager;\r\n\r\n\r\n/***/ }),\r\n/* 241 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar ViewSpecManager = /** @class */ (function () {\r\n function ViewSpecManager(optionsManager, _calendar) {\r\n this.optionsManager = optionsManager;\r\n this._calendar = _calendar;\r\n this.clearCache();\r\n }\r\n ViewSpecManager.prototype.clearCache = function () {\r\n this.viewSpecCache = {};\r\n };\r\n // Gets information about how to create a view. Will use a cache.\r\n ViewSpecManager.prototype.getViewSpec = function (viewType) {\r\n var cache = this.viewSpecCache;\r\n return cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));\r\n };\r\n // Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\r\n // Preference is given to views that have corresponding buttons.\r\n ViewSpecManager.prototype.getUnitViewSpec = function (unit) {\r\n var viewTypes;\r\n var i;\r\n var spec;\r\n if ($.inArray(unit, util_1.unitsDesc) !== -1) {\r\n // put views that have buttons first. there will be duplicates, but oh well\r\n viewTypes = this._calendar.header.getViewsWithButtons(); // TODO: include footer as well?\r\n $.each(ViewRegistry_1.viewHash, function (viewType) {\r\n viewTypes.push(viewType);\r\n });\r\n for (i = 0; i < viewTypes.length; i++) {\r\n spec = this.getViewSpec(viewTypes[i]);\r\n if (spec) {\r\n if (spec.singleUnit === unit) {\r\n return spec;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n // Builds an object with information on how to create a given view\r\n ViewSpecManager.prototype.buildViewSpec = function (requestedViewType) {\r\n var viewOverrides = this.optionsManager.overrides.views || {};\r\n var specChain = []; // for the view. lowest to highest priority\r\n var defaultsChain = []; // for the view. lowest to highest priority\r\n var overridesChain = []; // for the view. lowest to highest priority\r\n var viewType = requestedViewType;\r\n var spec; // for the view\r\n var overrides; // for the view\r\n var durationInput;\r\n var duration;\r\n var unit;\r\n // iterate from the specific view definition to a more general one until we hit an actual View class\r\n while (viewType) {\r\n spec = ViewRegistry_1.viewHash[viewType];\r\n overrides = viewOverrides[viewType];\r\n viewType = null; // clear. might repopulate for another iteration\r\n if (typeof spec === 'function') {\r\n spec = { 'class': spec };\r\n }\r\n if (spec) {\r\n specChain.unshift(spec);\r\n defaultsChain.unshift(spec.defaults || {});\r\n durationInput = durationInput || spec.duration;\r\n viewType = viewType || spec.type;\r\n }\r\n if (overrides) {\r\n overridesChain.unshift(overrides); // view-specific option hashes have options at zero-level\r\n durationInput = durationInput || overrides.duration;\r\n viewType = viewType || overrides.type;\r\n }\r\n }\r\n spec = util_1.mergeProps(specChain);\r\n spec.type = requestedViewType;\r\n if (!spec['class']) {\r\n return false;\r\n }\r\n // fall back to top-level `duration` option\r\n durationInput = durationInput ||\r\n this.optionsManager.dynamicOverrides.duration ||\r\n this.optionsManager.overrides.duration;\r\n if (durationInput) {\r\n duration = moment.duration(durationInput);\r\n if (duration.valueOf()) {\r\n unit = util_1.computeDurationGreatestUnit(duration, durationInput);\r\n spec.duration = duration;\r\n spec.durationUnit = unit;\r\n // view is a single-unit duration, like \"week\" or \"day\"\r\n // incorporate options for this. lowest priority\r\n if (duration.as(unit) === 1) {\r\n spec.singleUnit = unit;\r\n overridesChain.unshift(viewOverrides[unit] || {});\r\n }\r\n }\r\n }\r\n spec.defaults = options_1.mergeOptions(defaultsChain);\r\n spec.overrides = options_1.mergeOptions(overridesChain);\r\n this.buildViewSpecOptions(spec);\r\n this.buildViewSpecButtonText(spec, requestedViewType);\r\n return spec;\r\n };\r\n // Builds and assigns a view spec's options object from its already-assigned defaults and overrides\r\n ViewSpecManager.prototype.buildViewSpecOptions = function (spec) {\r\n var optionsManager = this.optionsManager;\r\n spec.options = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n spec.defaults,\r\n optionsManager.dirDefaults,\r\n optionsManager.localeDefaults,\r\n optionsManager.overrides,\r\n spec.overrides,\r\n optionsManager.dynamicOverrides // dynamically set via setter. highest precedence\r\n ]);\r\n locale_1.populateInstanceComputableOptions(spec.options);\r\n };\r\n // Computes and assigns a view spec's buttonText-related options\r\n ViewSpecManager.prototype.buildViewSpecButtonText = function (spec, requestedViewType) {\r\n var optionsManager = this.optionsManager;\r\n // given an options object with a possible `buttonText` hash, lookup the buttonText for the\r\n // requested view, falling back to a generic unit entry like \"week\" or \"day\"\r\n function queryButtonText(options) {\r\n var buttonText = options.buttonText || {};\r\n return buttonText[requestedViewType] ||\r\n // view can decide to look up a certain key\r\n (spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) ||\r\n // a key like \"month\"\r\n (spec.singleUnit ? buttonText[spec.singleUnit] : null);\r\n }\r\n // highest to lowest priority\r\n spec.buttonTextOverride =\r\n queryButtonText(optionsManager.dynamicOverrides) ||\r\n queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence\r\n spec.overrides.buttonText; // `buttonText` for view-specific options is a string\r\n // highest to lowest priority. mirrors buildViewSpecOptions\r\n spec.buttonTextDefault =\r\n queryButtonText(optionsManager.localeDefaults) ||\r\n queryButtonText(optionsManager.dirDefaults) ||\r\n spec.defaults.buttonText || // a single string. from ViewSubclass.defaults\r\n queryButtonText(options_1.globalDefaults) ||\r\n (spec.duration ? this._calendar.humanizeDuration(spec.duration) : null) || // like \"3 days\"\r\n requestedViewType; // fall back to given view name\r\n };\r\n return ViewSpecManager;\r\n}());\r\nexports.default = ViewSpecManager;\r\n\r\n\r\n/***/ }),\r\n/* 242 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventPeriod_1 = __webpack_require__(243);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(calendar) {\r\n this.calendar = calendar;\r\n this.stickySource = new ArrayEventSource_1.default(calendar);\r\n this.otherSources = [];\r\n }\r\n EventManager.prototype.requestEvents = function (start, end, timezone, force) {\r\n if (force ||\r\n !this.currentPeriod ||\r\n !this.currentPeriod.isWithinRange(start, end) ||\r\n timezone !== this.currentPeriod.timezone) {\r\n this.setPeriod(// will change this.currentPeriod\r\n new EventPeriod_1.default(start, end, timezone));\r\n }\r\n return this.currentPeriod.whenReleased();\r\n };\r\n // Source Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.addSource = function (eventSource) {\r\n this.otherSources.push(eventSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.requestSource(eventSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeSource = function (doomedSource) {\r\n util_1.removeExact(this.otherSources, doomedSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeSource(doomedSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllSources = function () {\r\n this.otherSources = [];\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeAllSources(); // might release\r\n }\r\n };\r\n // Source Refetching\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.refetchSource = function (eventSource) {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeSource(eventSource);\r\n currentPeriod.requestSource(eventSource);\r\n currentPeriod.thaw();\r\n }\r\n };\r\n EventManager.prototype.refetchAllSources = function () {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeAllSources();\r\n currentPeriod.requestSources(this.getSources());\r\n currentPeriod.thaw();\r\n }\r\n };\r\n // Source Querying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getSources = function () {\r\n return [this.stickySource].concat(this.otherSources);\r\n };\r\n // like querySources, but accepts multple match criteria (like multiple IDs)\r\n EventManager.prototype.multiQuerySources = function (matchInputs) {\r\n // coerce into an array\r\n if (!matchInputs) {\r\n matchInputs = [];\r\n }\r\n else if (!$.isArray(matchInputs)) {\r\n matchInputs = [matchInputs];\r\n }\r\n var matchingSources = [];\r\n var i;\r\n // resolve raw inputs to real event source objects\r\n for (i = 0; i < matchInputs.length; i++) {\r\n matchingSources.push.apply(// append\r\n matchingSources, this.querySources(matchInputs[i]));\r\n }\r\n return matchingSources;\r\n };\r\n // matchInput can either by a real event source object, an ID, or the function/URL for the source.\r\n // returns an array of matching source objects.\r\n EventManager.prototype.querySources = function (matchInput) {\r\n var sources = this.otherSources;\r\n var i;\r\n var source;\r\n // given a proper event source object\r\n for (i = 0; i < sources.length; i++) {\r\n source = sources[i];\r\n if (source === matchInput) {\r\n return [source];\r\n }\r\n }\r\n // an ID match\r\n source = this.getSourceById(EventSource_1.default.normalizeId(matchInput));\r\n if (source) {\r\n return [source];\r\n }\r\n // parse as an event source\r\n matchInput = EventSourceParser_1.default.parse(matchInput, this.calendar);\r\n if (matchInput) {\r\n return $.grep(sources, function (source) {\r\n return isSourcesEquivalent(matchInput, source);\r\n });\r\n }\r\n };\r\n /*\r\n ID assumed to already be normalized\r\n */\r\n EventManager.prototype.getSourceById = function (id) {\r\n return $.grep(this.otherSources, function (source) {\r\n return source.id && source.id === id;\r\n })[0];\r\n };\r\n // Event-Period\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.setPeriod = function (eventPeriod) {\r\n if (this.currentPeriod) {\r\n this.unbindPeriod(this.currentPeriod);\r\n this.currentPeriod = null;\r\n }\r\n this.currentPeriod = eventPeriod;\r\n this.bindPeriod(eventPeriod);\r\n eventPeriod.requestSources(this.getSources());\r\n };\r\n EventManager.prototype.bindPeriod = function (eventPeriod) {\r\n this.listenTo(eventPeriod, 'release', function (eventsPayload) {\r\n this.trigger('release', eventsPayload);\r\n });\r\n };\r\n EventManager.prototype.unbindPeriod = function (eventPeriod) {\r\n this.stopListeningTo(eventPeriod);\r\n };\r\n // Event Getting/Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getEventDefByUid = function (uid) {\r\n if (this.currentPeriod) {\r\n return this.currentPeriod.getEventDefByUid(uid);\r\n }\r\n };\r\n EventManager.prototype.addEventDef = function (eventDef, isSticky) {\r\n if (isSticky) {\r\n this.stickySource.addEventDef(eventDef);\r\n }\r\n if (this.currentPeriod) {\r\n this.currentPeriod.addEventDef(eventDef); // might release\r\n }\r\n };\r\n EventManager.prototype.removeEventDefsById = function (eventId) {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeEventDefsById(eventId);\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeEventDefsById(eventId); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllEventDefs = function () {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeAllEventDefs();\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeAllEventDefs();\r\n }\r\n };\r\n // Event Mutating\r\n // -----------------------------------------------------------------------------------------------------------------\r\n /*\r\n Returns an undo function.\r\n */\r\n EventManager.prototype.mutateEventsWithId = function (eventDefId, eventDefMutation) {\r\n var currentPeriod = this.currentPeriod;\r\n var eventDefs;\r\n var undoFuncs = [];\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n eventDefs = currentPeriod.getEventDefsById(eventDefId);\r\n eventDefs.forEach(function (eventDef) {\r\n // add/remove esp because id might change\r\n currentPeriod.removeEventDef(eventDef);\r\n undoFuncs.push(eventDefMutation.mutateSingle(eventDef));\r\n currentPeriod.addEventDef(eventDef);\r\n });\r\n currentPeriod.thaw();\r\n return function () {\r\n currentPeriod.freeze();\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n currentPeriod.removeEventDef(eventDefs[i]);\r\n undoFuncs[i]();\r\n currentPeriod.addEventDef(eventDefs[i]);\r\n }\r\n currentPeriod.thaw();\r\n };\r\n }\r\n return function () { };\r\n };\r\n /*\r\n copies and then mutates\r\n */\r\n EventManager.prototype.buildMutatedEventInstanceGroup = function (eventDefId, eventDefMutation) {\r\n var eventDefs = this.getEventDefsById(eventDefId);\r\n var i;\r\n var defCopy;\r\n var allInstances = [];\r\n for (i = 0; i < eventDefs.length; i++) {\r\n defCopy = eventDefs[i].clone();\r\n if (defCopy instanceof SingleEventDef_1.default) {\r\n eventDefMutation.mutateSingle(defCopy);\r\n allInstances.push.apply(allInstances, // append\r\n defCopy.buildInstances());\r\n }\r\n }\r\n return new EventInstanceGroup_1.default(allInstances);\r\n };\r\n // Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.freeze = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.freeze();\r\n }\r\n };\r\n EventManager.prototype.thaw = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.thaw();\r\n }\r\n };\r\n // methods that simply forward to EventPeriod\r\n EventManager.prototype.getEventDefsById = function (eventDefId) {\r\n return this.currentPeriod.getEventDefsById(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstances = function () {\r\n return this.currentPeriod.getEventInstances();\r\n };\r\n EventManager.prototype.getEventInstancesWithId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithId(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithoutId(eventDefId);\r\n };\r\n return EventManager;\r\n}());\r\nexports.default = EventManager;\r\nEmitterMixin_1.default.mixInto(EventManager);\r\nListenerMixin_1.default.mixInto(EventManager);\r\nfunction isSourcesEquivalent(source0, source1) {\r\n return source0.getPrimitive() === source1.getPrimitive();\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 243 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventPeriod = /** @class */ (function () {\r\n function EventPeriod(start, end, timezone) {\r\n this.pendingCnt = 0;\r\n this.freezeDepth = 0;\r\n this.stuntedReleaseCnt = 0;\r\n this.releaseCnt = 0;\r\n this.start = start;\r\n this.end = end;\r\n this.timezone = timezone;\r\n this.unzonedRange = new UnzonedRange_1.default(start.clone().stripZone(), end.clone().stripZone());\r\n this.requestsByUid = {};\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n }\r\n EventPeriod.prototype.isWithinRange = function (start, end) {\r\n // TODO: use a range util function?\r\n return !start.isBefore(this.start) && !end.isAfter(this.end);\r\n };\r\n // Requesting and Purging\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.requestSources = function (sources) {\r\n this.freeze();\r\n for (var i = 0; i < sources.length; i++) {\r\n this.requestSource(sources[i]);\r\n }\r\n this.thaw();\r\n };\r\n EventPeriod.prototype.requestSource = function (source) {\r\n var _this = this;\r\n var request = { source: source, status: 'pending', eventDefs: null };\r\n this.requestsByUid[source.uid] = request;\r\n this.pendingCnt += 1;\r\n source.fetch(this.start, this.end, this.timezone).then(function (eventDefs) {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'completed';\r\n request.eventDefs = eventDefs;\r\n _this.addEventDefs(eventDefs);\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n }, function () {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'failed';\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n });\r\n };\r\n EventPeriod.prototype.purgeSource = function (source) {\r\n var request = this.requestsByUid[source.uid];\r\n if (request) {\r\n delete this.requestsByUid[source.uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n this.pendingCnt--;\r\n this.tryRelease();\r\n }\r\n else if (request.status === 'completed') {\r\n request.eventDefs.forEach(this.removeEventDef.bind(this));\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.purgeAllSources = function () {\r\n var requestsByUid = this.requestsByUid;\r\n var uid;\r\n var request;\r\n var completedCnt = 0;\r\n for (uid in requestsByUid) {\r\n request = requestsByUid[uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n }\r\n else if (request.status === 'completed') {\r\n completedCnt++;\r\n }\r\n }\r\n this.requestsByUid = {};\r\n this.pendingCnt = 0;\r\n if (completedCnt) {\r\n this.removeAllEventDefs(); // might release\r\n }\r\n };\r\n // Event Definitions\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventDefByUid = function (eventDefUid) {\r\n return this.eventDefsByUid[eventDefUid];\r\n };\r\n EventPeriod.prototype.getEventDefsById = function (eventDefId) {\r\n var a = this.eventDefsById[eventDefId];\r\n if (a) {\r\n return a.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.addEventDefs = function (eventDefs) {\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n this.addEventDef(eventDefs[i]);\r\n }\r\n };\r\n EventPeriod.prototype.addEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefId = eventDef.id;\r\n var eventDefs = eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []);\r\n var eventInstances = eventDef.buildInstances(this.unzonedRange);\r\n var i;\r\n eventDefs.push(eventDef);\r\n this.eventDefsByUid[eventDef.uid] = eventDef;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n this.addEventInstance(eventInstances[i], eventDefId);\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDefsById = function (eventDefId) {\r\n var _this = this;\r\n this.getEventDefsById(eventDefId).forEach(function (eventDef) {\r\n _this.removeEventDef(eventDef);\r\n });\r\n };\r\n EventPeriod.prototype.removeAllEventDefs = function () {\r\n var isEmpty = $.isEmptyObject(this.eventDefsByUid);\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n if (!isEmpty) {\r\n this.tryRelease();\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefs = eventDefsById[eventDef.id];\r\n delete this.eventDefsByUid[eventDef.uid];\r\n if (eventDefs) {\r\n util_1.removeExact(eventDefs, eventDef);\r\n if (!eventDefs.length) {\r\n delete eventDefsById[eventDef.id];\r\n }\r\n this.removeEventInstancesForDef(eventDef);\r\n }\r\n };\r\n // Event Instances\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventInstances = function () {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n return eventInstances;\r\n };\r\n EventPeriod.prototype.getEventInstancesWithId = function (eventDefId) {\r\n var eventInstanceGroup = this.eventInstanceGroupsById[eventDefId];\r\n if (eventInstanceGroup) {\r\n return eventInstanceGroup.eventInstances.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var matchingInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n if (id !== eventDefId) {\r\n matchingInstances.push.apply(matchingInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n }\r\n return matchingInstances;\r\n };\r\n EventPeriod.prototype.addEventInstance = function (eventInstance, eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDefId] ||\r\n (eventInstanceGroupsById[eventDefId] = new EventInstanceGroup_1.default());\r\n eventInstanceGroup.eventInstances.push(eventInstance);\r\n this.tryRelease();\r\n };\r\n EventPeriod.prototype.removeEventInstancesForDef = function (eventDef) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDef.id];\r\n var removeCnt;\r\n if (eventInstanceGroup) {\r\n removeCnt = util_1.removeMatching(eventInstanceGroup.eventInstances, function (currentEventInstance) {\r\n return currentEventInstance.def === eventDef;\r\n });\r\n if (!eventInstanceGroup.eventInstances.length) {\r\n delete eventInstanceGroupsById[eventDef.id];\r\n }\r\n if (removeCnt) {\r\n this.tryRelease();\r\n }\r\n }\r\n };\r\n // Releasing and Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.tryRelease = function () {\r\n if (!this.pendingCnt) {\r\n if (!this.freezeDepth) {\r\n this.release();\r\n }\r\n else {\r\n this.stuntedReleaseCnt++;\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.release = function () {\r\n this.releaseCnt++;\r\n this.trigger('release', this.eventInstanceGroupsById);\r\n };\r\n EventPeriod.prototype.whenReleased = function () {\r\n var _this = this;\r\n if (this.releaseCnt) {\r\n return Promise_1.default.resolve(this.eventInstanceGroupsById);\r\n }\r\n else {\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.one('release', onResolve);\r\n });\r\n }\r\n };\r\n EventPeriod.prototype.freeze = function () {\r\n if (!(this.freezeDepth++)) {\r\n this.stuntedReleaseCnt = 0;\r\n }\r\n };\r\n EventPeriod.prototype.thaw = function () {\r\n if (!(--this.freezeDepth) && this.stuntedReleaseCnt && !this.pendingCnt) {\r\n this.release();\r\n }\r\n };\r\n return EventPeriod;\r\n}());\r\nexports.default = EventPeriod;\r\nEmitterMixin_1.default.mixInto(EventPeriod);\r\n\r\n\r\n/***/ }),\r\n/* 244 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\n/* Creates a clone of an element and lets it track the mouse as it moves\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MouseFollower = /** @class */ (function () {\r\n function MouseFollower(sourceEl, options) {\r\n this.isFollowing = false;\r\n this.isHidden = false;\r\n this.isAnimating = false; // doing the revert animation?\r\n this.options = options = options || {};\r\n this.sourceEl = sourceEl;\r\n this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent\r\n }\r\n // Causes the element to start following the mouse\r\n MouseFollower.prototype.start = function (ev) {\r\n if (!this.isFollowing) {\r\n this.isFollowing = true;\r\n this.y0 = util_1.getEvY(ev);\r\n this.x0 = util_1.getEvX(ev);\r\n this.topDelta = 0;\r\n this.leftDelta = 0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n if (util_1.getEvIsTouch(ev)) {\r\n this.listenTo($(document), 'touchmove', this.handleMove);\r\n }\r\n else {\r\n this.listenTo($(document), 'mousemove', this.handleMove);\r\n }\r\n }\r\n };\r\n // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.\r\n // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.\r\n MouseFollower.prototype.stop = function (shouldRevert, callback) {\r\n var _this = this;\r\n var revertDuration = this.options.revertDuration;\r\n var complete = function () {\r\n _this.isAnimating = false;\r\n _this.removeElement();\r\n _this.top0 = _this.left0 = null; // reset state for future updatePosition calls\r\n if (callback) {\r\n callback();\r\n }\r\n };\r\n if (this.isFollowing && !this.isAnimating) {\r\n this.isFollowing = false;\r\n this.stopListeningTo($(document));\r\n if (shouldRevert && revertDuration && !this.isHidden) {\r\n this.isAnimating = true;\r\n this.el.animate({\r\n top: this.top0,\r\n left: this.left0\r\n }, {\r\n duration: revertDuration,\r\n complete: complete\r\n });\r\n }\r\n else {\r\n complete();\r\n }\r\n }\r\n };\r\n // Gets the tracking element. Create it if necessary\r\n MouseFollower.prototype.getEl = function () {\r\n var el = this.el;\r\n if (!el) {\r\n el = this.el = this.sourceEl.clone()\r\n .addClass(this.options.additionalClass || '')\r\n .css({\r\n position: 'absolute',\r\n visibility: '',\r\n display: this.isHidden ? 'none' : '',\r\n margin: 0,\r\n right: 'auto',\r\n bottom: 'auto',\r\n width: this.sourceEl.width(),\r\n height: this.sourceEl.height(),\r\n opacity: this.options.opacity || '',\r\n zIndex: this.options.zIndex\r\n });\r\n // we don't want long taps or any mouse interaction causing selection/menus.\r\n // would use preventSelection(), but that prevents selectstart, causing problems.\r\n el.addClass('fc-unselectable');\r\n el.appendTo(this.parentEl);\r\n }\r\n return el;\r\n };\r\n // Removes the tracking element if it has already been created\r\n MouseFollower.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n // Update the CSS position of the tracking element\r\n MouseFollower.prototype.updatePosition = function () {\r\n var sourceOffset;\r\n var origin;\r\n this.getEl(); // ensure this.el\r\n // make sure origin info was computed\r\n if (this.top0 == null) {\r\n sourceOffset = this.sourceEl.offset();\r\n origin = this.el.offsetParent().offset();\r\n this.top0 = sourceOffset.top - origin.top;\r\n this.left0 = sourceOffset.left - origin.left;\r\n }\r\n this.el.css({\r\n top: this.top0 + this.topDelta,\r\n left: this.left0 + this.leftDelta\r\n });\r\n };\r\n // Gets called when the user moves the mouse\r\n MouseFollower.prototype.handleMove = function (ev) {\r\n this.topDelta = util_1.getEvY(ev) - this.y0;\r\n this.leftDelta = util_1.getEvX(ev) - this.x0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n };\r\n // Temporarily makes the tracking element invisible. Can be called before following starts\r\n MouseFollower.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.isHidden = true;\r\n if (this.el) {\r\n this.el.hide();\r\n }\r\n }\r\n };\r\n // Show the tracking element after it has been temporarily hidden\r\n MouseFollower.prototype.show = function () {\r\n if (this.isHidden) {\r\n this.isHidden = false;\r\n this.updatePosition();\r\n this.getEl().show();\r\n }\r\n };\r\n return MouseFollower;\r\n}());\r\nexports.default = MouseFollower;\r\nListenerMixin_1.default.mixInto(MouseFollower);\r\n\r\n\r\n/***/ }),\r\n/* 245 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateClicking = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateClicking, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - getHitEl\r\n */\r\n function DateClicking(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateClicking.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateClicking.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (!component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (!component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day clicking.\r\n DateClicking.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var dayClickHit; // null if invalid dayClick\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n dayClickHit = dragListener.origHit;\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n // if user dragged to another cell at any point, it can no longer be a dayClick\r\n if (!isOrig) {\r\n dayClickHit = null;\r\n }\r\n },\r\n hitOut: function () {\r\n dayClickHit = null;\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n var componentFootprint;\r\n if (!isCancelled && dayClickHit) {\r\n componentFootprint = component.getSafeHitFootprint(dayClickHit);\r\n if (componentFootprint) {\r\n _this.view.triggerDayClick(componentFootprint, component.getHitEl(dayClickHit), ev);\r\n }\r\n }\r\n }\r\n });\r\n // because dragListener won't be called with any time delay, \"dragging\" will begin immediately,\r\n // which will kill any touchmoving/scrolling. Prevent this.\r\n dragListener.shouldCancelTouchScroll = false;\r\n dragListener.scrollAlwaysKills = true;\r\n return dragListener;\r\n };\r\n return DateClicking;\r\n}(Interaction_1.default));\r\nexports.default = DateClicking;\r\n\r\n\r\n/***/ }),\r\n/* 246 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/*\r\nOnly handles foreground segs.\r\nDoes not own rendering. Use for low-level util methods by TimeGrid.\r\n*/\r\nvar TimeGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridEventRenderer, _super);\r\n function TimeGridEventRenderer(timeGrid, fillRenderer) {\r\n var _this = _super.call(this, timeGrid, fillRenderer) || this;\r\n _this.timeGrid = timeGrid;\r\n return _this;\r\n }\r\n TimeGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);\r\n };\r\n // Given an array of foreground segments, render a DOM element for each, computes position,\r\n // and attaches to the column inner-container elements.\r\n TimeGridEventRenderer.prototype.renderFgSegsIntoContainers = function (segs, containerEls) {\r\n var segsByCol;\r\n var col;\r\n segsByCol = this.timeGrid.groupSegsByCol(segs);\r\n for (col = 0; col < this.timeGrid.colCnt; col++) {\r\n this.updateFgSegCoords(segsByCol[col]);\r\n }\r\n this.timeGrid.attachSegsByCol(segsByCol, containerEls);\r\n };\r\n TimeGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n if (this.fgSegs) {\r\n this.fgSegs.forEach(function (seg) {\r\n seg.el.remove();\r\n });\r\n }\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('noMeridiemTimeFormat'); // like \"6:30\" (no AM/PM)\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n // Renders the HTML for a single event segment's default rendering\r\n TimeGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var componentFootprint = seg.footprint.componentFootprint;\r\n var isAllDay = componentFootprint.isAllDay;\r\n var eventDef = seg.footprint.eventDef;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeText;\r\n var fullTimeText; // more verbose time text. for the print stylesheet\r\n var startTimeText; // just the start time text\r\n classes.unshift('fc-time-grid-event', 'fc-v-event');\r\n // if the event appears to span more than one day...\r\n if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n // Don't display time text on segments that run entirely through a day.\r\n // That would appear as midnight-midnight and would look dumb.\r\n // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\r\n if (seg.isStart || seg.isEnd) {\r\n var zonedStart = calendar.msToMoment(seg.startMs);\r\n var zonedEnd = calendar.msToMoment(seg.endMs);\r\n timeText = this._getTimeText(zonedStart, zonedEnd, isAllDay);\r\n fullTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, 'LT');\r\n startTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, null, false); // displayEnd=false\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeText = this.getTimeText(seg.footprint);\r\n fullTimeText = this.getTimeText(seg.footprint, 'LT');\r\n startTimeText = this.getTimeText(seg.footprint, null, false); // displayEnd=false\r\n }\r\n return '' +\r\n '
' +\r\n (timeText ?\r\n '
' +\r\n '' + util_1.htmlEscape(timeText) + '' +\r\n '
' :\r\n '') +\r\n (eventDef.title ?\r\n '
' +\r\n util_1.htmlEscape(eventDef.title) +\r\n '
' :\r\n '') +\r\n '
' +\r\n '
' +\r\n /* TODO: write CSS for this\r\n (isResizableFromStart ?\r\n '
' :\r\n ''\r\n ) +\r\n */\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n // Given segments that are assumed to all live in the *same column*,\r\n // compute their verical/horizontal coordinates and assign to their elements.\r\n TimeGridEventRenderer.prototype.updateFgSegCoords = function (segs) {\r\n this.timeGrid.computeSegVerticals(segs); // horizontals relies on this\r\n this.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array\r\n this.timeGrid.assignSegVerticals(segs);\r\n this.assignFgSegHorizontals(segs);\r\n };\r\n // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\r\n // NOTE: Also reorders the given array by date!\r\n TimeGridEventRenderer.prototype.computeFgSegHorizontals = function (segs) {\r\n var levels;\r\n var level0;\r\n var i;\r\n this.sortEventSegs(segs); // order by certain criteria\r\n levels = buildSlotSegLevels(segs);\r\n computeForwardSlotSegs(levels);\r\n if ((level0 = levels[0])) {\r\n for (i = 0; i < level0.length; i++) {\r\n computeSlotSegPressures(level0[i]);\r\n }\r\n for (i = 0; i < level0.length; i++) {\r\n this.computeFgSegForwardBack(level0[i], 0, 0);\r\n }\r\n }\r\n };\r\n // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\r\n // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\r\n // seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\r\n //\r\n // The segment might be part of a \"series\", which means consecutive segments with the same pressure\r\n // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\r\n // segments behind this one in the current series, and `seriesBackwardCoord` is the starting\r\n // coordinate of the first segment in the series.\r\n TimeGridEventRenderer.prototype.computeFgSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {\r\n var forwardSegs = seg.forwardSegs;\r\n var i;\r\n if (seg.forwardCoord === undefined) {\r\n if (!forwardSegs.length) {\r\n // if there are no forward segments, this segment should butt up against the edge\r\n seg.forwardCoord = 1;\r\n }\r\n else {\r\n // sort highest pressure first\r\n this.sortForwardSegs(forwardSegs);\r\n // this segment's forwardCoord will be calculated from the backwardCoord of the\r\n // highest-pressure forward segment.\r\n this.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\r\n seg.forwardCoord = forwardSegs[0].backwardCoord;\r\n }\r\n // calculate the backwardCoord from the forwardCoord. consider the series\r\n seg.backwardCoord = seg.forwardCoord -\r\n (seg.forwardCoord - seriesBackwardCoord) / // available width for series\r\n (seriesBackwardPressure + 1); // # of segments in the series\r\n // use this segment's coordinates to computed the coordinates of the less-pressurized\r\n // forward segments\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n this.computeFgSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);\r\n }\r\n }\r\n };\r\n TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {\r\n forwardSegs.sort(util_1.proxy(this, 'compareForwardSegs'));\r\n };\r\n // A cmp function for determining which forward segment to rely on more when computing coordinates.\r\n TimeGridEventRenderer.prototype.compareForwardSegs = function (seg1, seg2) {\r\n // put higher-pressure first\r\n return seg2.forwardPressure - seg1.forwardPressure ||\r\n // put segments that are closer to initial edge first (and favor ones with no coords yet)\r\n (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) ||\r\n // do normal sorting...\r\n this.compareEventSegs(seg1, seg2);\r\n };\r\n // Given foreground event segments that have already had their position coordinates computed,\r\n // assigns position-related CSS values to their elements.\r\n TimeGridEventRenderer.prototype.assignFgSegHorizontals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateFgSegHorizontalCss(seg));\r\n // if the height is short, add a className for alternate styling\r\n if (seg.bottom - seg.top < 30) {\r\n seg.el.addClass('fc-short');\r\n }\r\n }\r\n };\r\n // Generates an object with CSS properties/values that should be applied to an event segment element.\r\n // Contains important positioning-related properties that should be applied to any event element, customized or not.\r\n TimeGridEventRenderer.prototype.generateFgSegHorizontalCss = function (seg) {\r\n var shouldOverlap = this.opt('slotEventOverlap');\r\n var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point\r\n var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point\r\n var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first\r\n var isRTL = this.timeGrid.isRTL;\r\n var left; // amount of space from left edge, a fraction of the total width\r\n var right; // amount of space from right edge, a fraction of the total width\r\n if (shouldOverlap) {\r\n // double the width, but don't go beyond the maximum forward coordinate (1.0)\r\n forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);\r\n }\r\n if (isRTL) {\r\n left = 1 - forwardCoord;\r\n right = backwardCoord;\r\n }\r\n else {\r\n left = backwardCoord;\r\n right = 1 - forwardCoord;\r\n }\r\n props.zIndex = seg.level + 1; // convert from 0-base to 1-based\r\n props.left = left * 100 + '%';\r\n props.right = right * 100 + '%';\r\n if (shouldOverlap && seg.forwardPressure) {\r\n // add padding to the edge so that forward stacked events don't cover the resizer's icon\r\n props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width\r\n }\r\n return props;\r\n };\r\n return TimeGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = TimeGridEventRenderer;\r\n// Builds an array of segments \"levels\". The first level will be the leftmost tier of segments if the calendar is\r\n// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.\r\nfunction buildSlotSegLevels(segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // go through all the levels and stop on the first level where there are no collisions\r\n for (j = 0; j < levels.length; j++) {\r\n if (!computeSlotSegCollisions(seg, levels[j]).length) {\r\n break;\r\n }\r\n }\r\n seg.level = j;\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n return levels;\r\n}\r\n// For every segment, figure out the other segments that are in subsequent\r\n// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs\r\nfunction computeForwardSlotSegs(levels) {\r\n var i;\r\n var level;\r\n var j;\r\n var seg;\r\n var k;\r\n for (i = 0; i < levels.length; i++) {\r\n level = levels[i];\r\n for (j = 0; j < level.length; j++) {\r\n seg = level[j];\r\n seg.forwardSegs = [];\r\n for (k = i + 1; k < levels.length; k++) {\r\n computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);\r\n }\r\n }\r\n }\r\n}\r\n// Figure out which path forward (via seg.forwardSegs) results in the longest path until\r\n// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure\r\nfunction computeSlotSegPressures(seg) {\r\n var forwardSegs = seg.forwardSegs;\r\n var forwardPressure = 0;\r\n var i;\r\n var forwardSeg;\r\n if (seg.forwardPressure === undefined) {\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n forwardSeg = forwardSegs[i];\r\n // figure out the child's maximum forward path\r\n computeSlotSegPressures(forwardSeg);\r\n // either use the existing maximum, or use the child's forward pressure\r\n // plus one (for the forwardSeg itself)\r\n forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);\r\n }\r\n seg.forwardPressure = forwardPressure;\r\n }\r\n}\r\n// Find all the segments in `otherSegs` that vertically collide with `seg`.\r\n// Append into an optionally-supplied `results` array and return.\r\nfunction computeSlotSegCollisions(seg, otherSegs, results) {\r\n if (results === void 0) { results = []; }\r\n for (var i = 0; i < otherSegs.length; i++) {\r\n if (isSlotSegCollision(seg, otherSegs[i])) {\r\n results.push(otherSegs[i]);\r\n }\r\n }\r\n return results;\r\n} \t\r\n// Do these segments occupy the same vertical space?\r\nfunction isSlotSegCollision(seg1, seg2) {\r\n/////////////// stop physics of segments\r\n// return seg1.bottom > seg2.top && seg1.top < seg2.bottom;\r\n return 0;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 247 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar TimeGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridHelperRenderer, _super);\r\n function TimeGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var i;\r\n var seg;\r\n var sourceEl;\r\n // TODO: not good to call eventRenderer this way\r\n this.eventRenderer.renderFgSegsIntoContainers(segs, this.component.helperContainerEls);\r\n // Try to make the segment that is in the same row as sourceSeg look the same\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (sourceSeg && sourceSeg.col === seg.col) {\r\n sourceEl = sourceSeg.el;\r\n seg.el.css({\r\n left: sourceEl.css('left'),\r\n right: sourceEl.css('right'),\r\n 'margin-left': sourceEl.css('margin-left'),\r\n 'margin-right': sourceEl.css('margin-right')\r\n });\r\n }\r\n helperNodes.push(seg.el[0]);\r\n }\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return TimeGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = TimeGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 248 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar TimeGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridFillRenderer, _super);\r\n function TimeGridFillRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var timeGrid = this.component;\r\n var containerEls;\r\n // TODO: more efficient lookup\r\n if (type === 'bgEvent') {\r\n containerEls = timeGrid.bgContainerEls;\r\n }\r\n else if (type === 'businessHours') {\r\n containerEls = timeGrid.businessContainerEls;\r\n }\r\n else if (type === 'highlight') {\r\n containerEls = timeGrid.highlightContainerEls;\r\n }\r\n timeGrid.updateSegVerticals(segs);\r\n timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);\r\n return segs.map(function (seg) {\r\n return seg.el[0];\r\n });\r\n };\r\n return TimeGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = TimeGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 249 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/* A rectangular panel that is absolutely positioned over other content\r\n------------------------------------------------------------------------------------------------------------------------\r\nOptions:\r\n - className (string)\r\n - content (HTML string or jQuery element set)\r\n - parentEl\r\n - top\r\n - left\r\n - right (the x coord of where the right edge should be. not a \"CSS\" right)\r\n - autoHide (boolean)\r\n - show (callback)\r\n - hide (callback)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Popover = /** @class */ (function () {\r\n function Popover(options) {\r\n this.isHidden = true;\r\n this.margin = 10; // the space required between the popover and the edges of the scroll container\r\n this.options = options || {};\r\n }\r\n // Shows the popover on the specified position. Renders it if not already\r\n Popover.prototype.show = function () {\r\n if (this.isHidden) {\r\n if (!this.el) {\r\n this.render();\r\n }\r\n this.el.show();\r\n this.position();\r\n this.isHidden = false;\r\n this.trigger('show');\r\n }\r\n };\r\n // Hides the popover, through CSS, but does not remove it from the DOM\r\n Popover.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.el.hide();\r\n this.isHidden = true;\r\n this.trigger('hide');\r\n }\r\n };\r\n // Creates `this.el` and renders content inside of it\r\n Popover.prototype.render = function () {\r\n var _this = this;\r\n var options = this.options;\r\n this.el = $('
')\r\n .addClass(options.className || '')\r\n .css({\r\n // position initially to the top left to avoid creating scrollbars\r\n top: 0,\r\n left: 0\r\n })\r\n .append(options.content)\r\n .appendTo(options.parentEl);\r\n // when a click happens on anything inside with a 'fc-close' className, hide the popover\r\n this.el.on('click', '.fc-close', function () {\r\n _this.hide();\r\n });\r\n if (options.autoHide) {\r\n this.listenTo($(document), 'mousedown', this.documentMousedown);\r\n }\r\n };\r\n // Triggered when the user clicks *anywhere* in the document, for the autoHide feature\r\n Popover.prototype.documentMousedown = function (ev) {\r\n // only hide the popover if the click happened outside the popover\r\n if (this.el && !$(ev.target).closest(this.el).length) {\r\n this.hide();\r\n }\r\n };\r\n // Hides and unregisters any handlers\r\n Popover.prototype.removeElement = function () {\r\n this.hide();\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n this.stopListeningTo($(document), 'mousedown');\r\n };\r\n // Positions the popover optimally, using the top/left/right options\r\n Popover.prototype.position = function () {\r\n var options = this.options;\r\n var origin = this.el.offsetParent().offset();\r\n var width = this.el.outerWidth();\r\n var height = this.el.outerHeight();\r\n var windowEl = $(window);\r\n var viewportEl = util_1.getScrollParent(this.el);\r\n var viewportTop;\r\n var viewportLeft;\r\n var viewportOffset;\r\n var top; // the \"position\" (not \"offset\") values for the popover\r\n var left; //\r\n // compute top and left\r\n top = options.top || 0;\r\n if (options.left !== undefined) {\r\n left = options.left;\r\n }\r\n else if (options.right !== undefined) {\r\n left = options.right - width; // derive the left value from the right value\r\n }\r\n else {\r\n left = 0;\r\n }\r\n if (viewportEl.is(window) || viewportEl.is(document)) {\r\n viewportEl = windowEl;\r\n viewportTop = 0; // the window is always at the top left\r\n viewportLeft = 0; // (and .offset() won't work if called here)\r\n }\r\n else {\r\n viewportOffset = viewportEl.offset();\r\n viewportTop = viewportOffset.top;\r\n viewportLeft = viewportOffset.left;\r\n }\r\n // if the window is scrolled, it causes the visible area to be further down\r\n viewportTop += windowEl.scrollTop();\r\n viewportLeft += windowEl.scrollLeft();\r\n // constrain to the view port. if constrained by two edges, give precedence to top/left\r\n if (options.viewportConstrain !== false) {\r\n top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);\r\n top = Math.max(top, viewportTop + this.margin);\r\n left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);\r\n left = Math.max(left, viewportLeft + this.margin);\r\n }\r\n this.el.css({\r\n top: top - origin.top,\r\n left: left - origin.left\r\n });\r\n };\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n // TODO: better code reuse for this. Repeat code\r\n Popover.prototype.trigger = function (name) {\r\n if (this.options[name]) {\r\n this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\r\n }\r\n };\r\n return Popover;\r\n}());\r\nexports.default = Popover;\r\nListenerMixin_1.default.mixInto(Popover);\r\n\r\n\r\n/***/ }),\r\n/* 250 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/* Event-rendering methods for the DayGrid class\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridEventRenderer, _super);\r\n function DayGridEventRenderer(dayGrid, fillRenderer) {\r\n var _this = _super.call(this, dayGrid, fillRenderer) || this;\r\n _this.dayGrid = dayGrid;\r\n return _this;\r\n }\r\n DayGridEventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n // don't render timed background events\r\n eventRanges = $.grep(eventRanges, function (eventRange) {\r\n return eventRange.eventDef.isAllDay();\r\n });\r\n _super.prototype.renderBgRanges.call(this, eventRanges);\r\n };\r\n // Renders the given foreground event segments onto the grid\r\n DayGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n var rowStructs = this.rowStructs = this.renderSegRows(segs);\r\n // append to each row's content skeleton\r\n this.dayGrid.rowEls.each(function (i, rowNode) {\r\n $(rowNode).find('.fc-content-skeleton > table').append(rowStructs[i].tbodyEl);\r\n });\r\n };\r\n // Unrenders all currently rendered foreground event segments\r\n DayGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n var rowStructs = this.rowStructs || [];\r\n var rowStruct;\r\n while ((rowStruct = rowStructs.pop())) {\r\n rowStruct.tbodyEl.remove();\r\n }\r\n this.rowStructs = null;\r\n };\r\n // Uses the given events array to generate elements that should be appended to each row's content skeleton.\r\n // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\r\n // PRECONDITION: each segment shoud already have a rendered and assigned `.el`\r\n DayGridEventRenderer.prototype.renderSegRows = function (segs) {\r\n var rowStructs = [];\r\n var segRows;\r\n var row;\r\n segRows = this.groupSegRows(segs); // group into nested arrays\r\n // iterate each row of segment groupings\r\n for (row = 0; row < segRows.length; row++) {\r\n rowStructs.push(this.renderSegRow(row, segRows[row]));\r\n }\r\n return rowStructs;\r\n };\r\n // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains\r\n // the segments. Returns object with a bunch of internal data about how the render was calculated.\r\n // NOTE: modifies rowSegs\r\n DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {\r\n var colCnt = this.dayGrid.colCnt;\r\n var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\r\n var levelCnt = Math.max(1, segLevels.length); // ensure at least one level\r\n var tbody = $('');\r\n var segMatrix = []; // lookup for which segments are rendered into which level+col cells\r\n var cellMatrix = []; // lookup for all elements of the level+col matrix\r\n var loneCellMatrix = []; // lookup for elements that only take up a single column\r\n var i;\r\n var levelSegs;\r\n var col;\r\n var tr;\r\n var j;\r\n var seg;\r\n var td;\r\n // populates empty cells from the current column (`col`) to `endCol`\r\n function emptyCellsUntil(endCol) {\r\n while (col < endCol) {\r\n // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\r\n td = (loneCellMatrix[i - 1] || [])[col];\r\n if (td) {\r\n td.attr('rowspan', parseInt(td.attr('rowspan') || 1, 10) + 1);\r\n }\r\n else {\r\n td = $('');\r\n tr.append(td);\r\n }\r\n cellMatrix[i][col] = td;\r\n loneCellMatrix[i][col] = td;\r\n col++;\r\n }\r\n }\r\n for (i = 0; i < levelCnt; i++) {\r\n levelSegs = segLevels[i];\r\n col = 0;\r\n tr = $('');\r\n segMatrix.push([]);\r\n cellMatrix.push([]);\r\n loneCellMatrix.push([]);\r\n // levelCnt might be 1 even though there are no actual levels. protect against this.\r\n // this single empty row is useful for styling.\r\n if (levelSegs) {\r\n for (j = 0; j < levelSegs.length; j++) {\r\n seg = levelSegs[j];\r\n emptyCellsUntil(seg.leftCol);\r\n // create a container that occupies or more columns. append the event element.\r\n td = $('').append(seg.el);\r\n if (seg.leftCol !== seg.rightCol) {\r\n td.attr('colspan', seg.rightCol - seg.leftCol + 1);\r\n }\r\n else {\r\n loneCellMatrix[i][col] = td;\r\n }\r\n while (col <= seg.rightCol) {\r\n cellMatrix[i][col] = td;\r\n segMatrix[i][col] = seg;\r\n col++;\r\n }\r\n tr.append(td);\r\n }\r\n }\r\n emptyCellsUntil(colCnt); // finish off the row\r\n this.dayGrid.bookendCells(tr);\r\n tbody.append(tr);\r\n }\r\n return {\r\n row: row,\r\n tbodyEl: tbody,\r\n cellMatrix: cellMatrix,\r\n segMatrix: segMatrix,\r\n segLevels: segLevels,\r\n segs: rowSegs\r\n };\r\n };\r\n // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\r\n // NOTE: modifies segs\r\n DayGridEventRenderer.prototype.buildSegLevels = function (segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n // Give preference to elements with certain criteria, so they have\r\n // a chance to be closer to the top.\r\n this.sortEventSegs(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // loop through levels, starting with the topmost, until the segment doesn't collide with other segments\r\n for (j = 0; j < levels.length; j++) {\r\n if (!isDaySegCollision(seg, levels[j])) {\r\n break;\r\n }\r\n }\r\n // `j` now holds the desired subrow index\r\n seg.level = j;\r\n // create new level array if needed and append segment\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n // order segments left-to-right. very important if calendar is RTL\r\n for (j = 0; j < levels.length; j++) {\r\n levels[j].sort(compareDaySegCols);\r\n }\r\n return levels;\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\r\n DayGridEventRenderer.prototype.groupSegRows = function (segs) {\r\n var segRows = [];\r\n var i;\r\n for (i = 0; i < this.dayGrid.rowCnt; i++) {\r\n segRows.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segRows[segs[i].row].push(segs[i]);\r\n }\r\n return segRows;\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n DayGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('extraSmallTimeFormat'); // like \"6p\" or \"6:30p\"\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day\r\n };\r\n // Builds the HTML to be used for the default element for an individual segment\r\n DayGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var isAllDay = seg.footprint.componentFootprint.isAllDay;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && isAllDay &&\r\n seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && isAllDay &&\r\n seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeHtml = '';\r\n var timeText;\r\n var titleHtml;\r\n classes.unshift('fc-day-grid-event', 'fc-h-event');\r\n // Only display a timed events time if it is the starting segment\r\n if (seg.isStart) {\r\n timeText = this.getTimeText(seg.footprint);\r\n if (timeText) {\r\n timeHtml = '' + util_1.htmlEscape(timeText) + '';\r\n }\r\n }\r\n titleHtml =\r\n '' +\r\n (util_1.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height\r\n '';\r\n return '' +\r\n '
' +\r\n (this.dayGrid.isRTL ?\r\n titleHtml + ' ' + timeHtml : // put a natural space in between\r\n timeHtml + ' ' + titleHtml //\r\n ) +\r\n '
' +\r\n (isResizableFromStart ?\r\n '
' :\r\n '') +\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n return DayGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = DayGridEventRenderer;\r\n// Computes whether two segments' columns collide. They are assumed to be in the same row.\r\nfunction isDaySegCollision(seg, otherSegs) {\r\n var i;\r\n var otherSeg;\r\n for (i = 0; i < otherSegs.length; i++) {\r\n otherSeg = otherSegs[i];\r\n if (otherSeg.leftCol <= seg.rightCol &&\r\n otherSeg.rightCol >= seg.leftCol) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n// A cmp function for determining the leftmost event\r\nfunction compareDaySegCols(a, b) {\r\n return a.leftCol - b.leftCol;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 251 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar DayGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridHelperRenderer, _super);\r\n function DayGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Renders a mock \"helper\" event. `sourceSeg` is the associated internal segment object. It can be null.\r\n DayGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var rowStructs;\r\n // TODO: not good to call eventRenderer this way\r\n rowStructs = this.eventRenderer.renderSegRows(segs);\r\n // inject each new event skeleton into each associated row\r\n this.component.rowEls.each(function (row, rowNode) {\r\n var rowEl = $(rowNode); // the .fc-row\r\n var skeletonEl = $('
'); // will be absolutely positioned\r\n var skeletonTopEl;\r\n var skeletonTop;\r\n // If there is an original segment, match the top position. Otherwise, put it at the row's top level\r\n if (sourceSeg && sourceSeg.row === row) {\r\n skeletonTop = sourceSeg.el.position().top;\r\n }\r\n else {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton tbody');\r\n if (!skeletonTopEl.length) {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton table');\r\n }\r\n skeletonTop = skeletonTopEl.position().top;\r\n }\r\n skeletonEl.css('top', skeletonTop)\r\n .find('table')\r\n .append(rowStructs[row].tbodyEl);\r\n rowEl.append(skeletonEl);\r\n helperNodes.push(skeletonEl[0]);\r\n });\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return DayGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = DayGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 252 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar DayGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridFillRenderer, _super);\r\n function DayGridFillRenderer() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.fillSegTag = 'td'; // override the default tag name\r\n return _this;\r\n }\r\n DayGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var nodes = [];\r\n var i;\r\n var seg;\r\n var skeletonEl;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n skeletonEl = this.renderFillRow(type, seg);\r\n this.component.rowEls.eq(seg.row).append(skeletonEl);\r\n nodes.push(skeletonEl[0]);\r\n }\r\n return nodes;\r\n };\r\n // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\r\n DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {\r\n var colCnt = this.component.colCnt;\r\n var startCol = seg.leftCol;\r\n var endCol = seg.rightCol + 1;\r\n var className;\r\n var skeletonEl;\r\n var trEl;\r\n if (type === 'businessHours') {\r\n className = 'bgevent';\r\n }\r\n else {\r\n className = type.toLowerCase();\r\n }\r\n skeletonEl = $('
' +\r\n '
' +\r\n '
');\r\n trEl = skeletonEl.find('tr');\r\n if (startCol > 0) {\r\n trEl.append('');\r\n }\r\n trEl.append(seg.el.attr('colspan', endCol - startCol));\r\n if (endCol < colCnt) {\r\n trEl.append('');\r\n }\r\n this.component.bookendCells(trEl);\r\n return skeletonEl;\r\n };\r\n return DayGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = DayGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 253 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar MonthViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthViewDateProfileGenerator, _super);\r\n function MonthViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n MonthViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay);\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n var rowCnt;\r\n // ensure 6 weeks\r\n if (this.opt('fixedWeekCount')) {\r\n rowCnt = Math.ceil(// could be partial weeks due to hiddenDays\r\n end.diff(start, 'weeks', true) // dontRound=true\r\n );\r\n end.add(6 - rowCnt, 'weeks');\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return MonthViewDateProfileGenerator;\r\n}(BasicViewDateProfileGenerator_1.default));\r\nexports.default = MonthViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 254 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nvar ListEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventRenderer, _super);\r\n function ListEventRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ListEventRenderer.prototype.renderFgSegs = function (segs) {\r\n if (!segs.length) {\r\n this.component.renderEmptyMessage();\r\n }\r\n else {\r\n this.component.renderSegList(segs);\r\n }\r\n };\r\n // generates the HTML for a single event row\r\n ListEventRenderer.prototype.fgSegHtml = function (seg) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var eventFootprint = seg.footprint;\r\n var eventDef = eventFootprint.eventDef;\r\n var componentFootprint = eventFootprint.componentFootprint;\r\n var url = eventDef.url;\r\n var classes = ['fc-list-item'].concat(this.getClasses(eventDef));\r\n var bgColor = this.getBgColor(eventDef);\r\n var timeHtml;\r\n if (componentFootprint.isAllDay) {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n else if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n if (seg.isStart || seg.isEnd) {\r\n timeHtml = util_1.htmlEscape(this._getTimeText(calendar.msToMoment(seg.startMs), calendar.msToMoment(seg.endMs), componentFootprint.isAllDay));\r\n }\r\n else {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeHtml = util_1.htmlEscape(this.getTimeText(eventFootprint));\r\n }\r\n if (url) {\r\n classes.push('fc-has-url');\r\n }\r\n return '' +\r\n (this.displayEventTime ?\r\n '' +\r\n (timeHtml || '') +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(eventDef.title || '') +\r\n '' +\r\n '' +\r\n '';\r\n };\r\n // like \"4:00am\"\r\n ListEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('mediumTimeFormat');\r\n };\r\n return ListEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = ListEventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 255 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar ListEventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventPointing, _super);\r\n function ListEventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // for events with a url, the whole should be clickable,\r\n // but it's impossible to wrap with an tag. simulate this.\r\n ListEventPointing.prototype.handleClick = function (seg, ev) {\r\n var url;\r\n _super.prototype.handleClick.call(this, seg, ev); // might prevent the default action\r\n // not clicking on or within an with an href\r\n if (!$(ev.target).closest('a[href]').length) {\r\n url = seg.footprint.eventDef.url;\r\n if (url && !ev.isDefaultPrevented()) {\r\n window.location.href = url; // simulate link click\r\n }\r\n }\r\n };\r\n return ListEventPointing;\r\n}(EventPointing_1.default));\r\nexports.default = ListEventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 256 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nEventSourceParser_1.default.registerClass(ArrayEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(FuncEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(JsonFeedEventSource_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 257 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar Bootstrap3Theme_1 = __webpack_require__(258);\r\nvar Bootstrap4Theme_1 = __webpack_require__(259);\r\nThemeRegistry_1.defineThemeSystem('standard', StandardTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('jquery-ui', JqueryUiTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap3', Bootstrap3Theme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap4', Bootstrap4Theme_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 258 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap3Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap3Theme, _super);\r\n function Bootstrap3Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap3Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap3Theme;\r\nBootstrap3Theme.prototype.classes = {\r\n widget: 'fc-bootstrap3',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-default',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'panel panel-default',\r\n popoverHeader: 'panel-heading',\r\n popoverContent: 'panel-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `panel` class b/c don't want margins/radius. only border color.\r\n headerRow: 'panel-default',\r\n dayRow: 'panel-default',\r\n // list view\r\n listView: 'panel panel-default'\r\n};\r\nBootstrap3Theme.prototype.baseIconClass = 'glyphicon';\r\nBootstrap3Theme.prototype.iconClasses = {\r\n close: 'glyphicon-remove',\r\n prev: 'glyphicon-chevron-left',\r\n next: 'glyphicon-chevron-right',\r\n prevYear: 'glyphicon-backward',\r\n nextYear: 'glyphicon-forward'\r\n};\r\nBootstrap3Theme.prototype.iconOverrideOption = 'bootstrapGlyphicons';\r\nBootstrap3Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapGlyphicon';\r\nBootstrap3Theme.prototype.iconOverridePrefix = 'glyphicon-';\r\n\r\n\r\n/***/ }),\r\n/* 259 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap4Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap4Theme, _super);\r\n function Bootstrap4Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap4Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap4Theme;\r\nBootstrap4Theme.prototype.classes = {\r\n widget: 'fc-bootstrap4',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'table-active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-primary',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'card card-primary',\r\n popoverHeader: 'card-header',\r\n popoverContent: 'card-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `table` class b/c don't want margins/padding/structure. only border color.\r\n headerRow: 'table-bordered',\r\n dayRow: 'table-bordered',\r\n // list view\r\n listView: 'card card-primary'\r\n};\r\nBootstrap4Theme.prototype.baseIconClass = 'fa';\r\nBootstrap4Theme.prototype.iconClasses = {\r\n close: 'fa-times',\r\n prev: 'fa-chevron-left',\r\n next: 'fa-chevron-right',\r\n prevYear: 'fa-angle-double-left',\r\n nextYear: 'fa-angle-double-right'\r\n};\r\nBootstrap4Theme.prototype.iconOverrideOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverridePrefix = 'fa-';\r\n\r\n\r\n/***/ }),\r\n/* 260 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthView_1 = __webpack_require__(229);\r\nViewRegistry_1.defineView('basic', {\r\n 'class': BasicView_1.default\r\n});\r\nViewRegistry_1.defineView('basicDay', {\r\n type: 'basic',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('basicWeek', {\r\n type: 'basic',\r\n duration: { weeks: 1 }\r\n});\r\nViewRegistry_1.defineView('month', {\r\n 'class': MonthView_1.default,\r\n duration: { months: 1 },\r\n defaults: {\r\n fixedWeekCount: true\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 261 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar AgendaView_1 = __webpack_require__(226);\r\nViewRegistry_1.defineView('agenda', {\r\n 'class': AgendaView_1.default,\r\n defaults: {\r\n allDaySlot: true,\r\n slotDuration: '00:30:00',\r\n slotEventOverlap: true // a bad name. confused with overlap/constraint system\r\n }\r\n});\r\nViewRegistry_1.defineView('agendaDay', {\r\n type: 'agenda',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('agendaWeek', {\r\n type: 'agenda',\r\n duration: { weeks: 1 }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 262 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar ListView_1 = __webpack_require__(230);\r\nViewRegistry_1.defineView('list', {\r\n 'class': ListView_1.default,\r\n buttonTextKey: 'list',\r\n defaults: {\r\n buttonText: 'list',\r\n listDayFormat: 'LL',\r\n noEventsMessage: 'No events to display'\r\n }\r\n});\r\nViewRegistry_1.defineView('listDay', {\r\n type: 'list',\r\n duration: { days: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header\r\n }\r\n});\r\nViewRegistry_1.defineView('listWeek', {\r\n type: 'list',\r\n duration: { weeks: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd',\r\n listDayAltFormat: 'LL'\r\n }\r\n});\r\nViewRegistry_1.defineView('listMonth', {\r\n type: 'list',\r\n duration: { month: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\nViewRegistry_1.defineView('listYear', {\r\n type: 'list',\r\n duration: { year: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 263 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n\r\n\r\n/***/ })\r\n/******/ ]);\r\n});\n\n/***/ }),\n/* 300 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('full-calendar-reserve',{attrs:{\"show-modal\":_vm.showModalReserve,\"startDate\":_vm.startDate,\"endDate\":_vm.endDate,\"resources-checkboxes\":_vm.resourcesCheckboxes,\"number-of-resources\":_vm.selectedResources.length,\"add-reservation\":_vm.addReservation},on:{\"close\":function($event){_vm.showModalReserve = false}}}),_vm._v(\" \"),_c('full-calendar-info',{attrs:{\"show-modal\":_vm.showModalInfo,\"reservation\":_vm.reservation,\"cancel\":_vm.cancelReservation,\"update\":_vm.updateReservation,\"refreshTasks\":_vm.refreshTasks,\"nodes\":_vm.nodes},on:{\"close\":function($event){_vm.showModalInfo = false},\"handleError\":_vm.handleError}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 301 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_MySchedule_vue__ = __webpack_require__(195);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_73dcc08a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_MySchedule_vue__ = __webpack_require__(306);\nfunction injectStyle (ssrContext) {\n __webpack_require__(302)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-73dcc08a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_MySchedule_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_73dcc08a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_MySchedule_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 303 */,\n/* 304 */,\n/* 305 */,\n/* 306 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"range-select-container\"},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"scale-transition\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},model:{value:(_vm.menu),callback:function ($$v) {_vm.menu=$$v},expression:\"menu\"}},[_c('v-text-field',{staticClass:\"date-input\",attrs:{\"slot\":\"activator\",\"label\":\"Schedule start date\",\"prepend-icon\":\"event\",\"readonly\":\"\"},slot:\"activator\",model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}}),_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.menu = false; _vm.changeSchedule()}},model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}})],1),_vm._v(\" \"),_c('v-text-field',{staticClass:\"range-input\",attrs:{\"min\":\"1\",\"step\":\"1\",\"type\":\"number\",\"label\":\"Schedule range in days\"},on:{\"input\":function($event){return _vm.changeSchedule()}},model:{value:(_vm.range),callback:function ($$v) {_vm.range=$$v},expression:\"range\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"container-header\"},[_c('div',{staticClass:\"left-table-header\"},[_vm._m(0),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":\"Change all\"},on:{\"change\":_vm.changeAll},model:{value:(_vm.changeAllCheckbox),callback:function ($$v) {_vm.changeAllCheckbox=$$v},expression:\"changeAllCheckbox\"}})],1)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"right-table-header\",attrs:{\"id\":\"right-header\"}},[_c('table',[_c('tbody',_vm._l((_vm.tableContent.header),function(header){return _c('th',{key:header.value},[_vm._v(_vm._s(header.value))])}),0)]),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',_vm._l((_vm.tableContent.hours),function(hours){return _c('td',{key:hours.id,staticClass:\"hours\"},[_vm._v(_vm._s(hours.value))])}),0)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"container-content\"},[_c('div',{staticClass:\"left-table\",attrs:{\"id\":\"left-table\"}},[_c('div',{key:_vm.leftTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('div',{staticClass:\"node-cell\"},[_c('v-checkbox',{staticClass:\"small-checkbox-node\",attrs:{\"color\":\"success\",\"label\":(\"\" + (node.nodeName)),\"input-value\":\"\"},on:{\"change\":function($event){return _vm.changeWholeNode(node.nodeName)}},model:{value:(node.selected),callback:function ($$v) {_vm.$set(node, \"selected\", $$v)},expression:\"node.selected\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"mx-2 small-button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"info\"},on:{\"click\":function($event){return _vm.toggle(node)}}},[(node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"add\")]):_vm._e(),_vm._v(\" \"),(!node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"remove\")]):_vm._e()],1)],1)])])]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":(\"\" + (_vm.tableContent.resources[resourceUUID].name))},on:{\"change\":function($event){return _vm.changeResource(node.nodeName, resourceUUID)}},model:{value:(_vm.tableContent.resources[resourceUUID].selected),callback:function ($$v) {_vm.$set(_vm.tableContent.resources[resourceUUID], \"selected\", $$v)},expression:\"tableContent.resources[resourceUUID].selected\"}})],1)])}),0)])}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"right-table\",attrs:{\"id\":\"right-table\"}},[_c('div',{key:_vm.rightTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',_vm._l((node.slots),function(slot){return _c('td',{key:slot.id},[_vm._v(_vm._s(slot.value))])}),0)]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},_vm._l((_vm.tableContent.resources[resourceUUID].slots),function(slot){return _c('td',{key:slot.id,class:{ 'reserved': slot.reserved, 'userReservation': slot.userReservation }},[_vm._v(_vm._s(slot.value))])}),0)}),0)])}),0)])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',[_c('tbody',[_c('th',{staticClass:\"first-column\"},[_vm._v(\"Resources\")])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 307 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-snackbar',{attrs:{\"color\":\"error\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"white\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"\\n Close\\n \")])],1),_vm._v(\" \"),(!_vm.showSchedule)?_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=true;}}},[_vm._v(\"\\n Select visible GPUs\\n \")]):_vm._e(),_vm._v(\" \"),_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showSchedule),expression:\"showSchedule\"}],attrs:{\"id\":\"schedule_section\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=false}}},[_vm._v(\"\\n Hide schedule\\n \")]),_vm._v(\" \"),_c('MySchedule',{attrs:{\"parsed-nodes\":_vm.parsedNodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)},\"loadResources\":function($event){return _vm.loadResources.apply(void 0, arguments)}}})],1),_vm._v(\" \"),_c('section',{attrs:{\"id\":\"calendar_section\"}},[_c('FullCalendar',{attrs:{\"update-calendar\":_vm.updateCalendar,\"selected-resources\":_vm.selectedResources,\"nodes\":_vm.nodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 308 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_NodesOverview_vue__ = __webpack_require__(197);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_18fc6060_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_NodesOverview_vue__ = __webpack_require__(320);\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_NodesOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_18fc6060_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_NodesOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 309 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchGenerator_vue__ = __webpack_require__(198);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_14692e23_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchGenerator_vue__ = __webpack_require__(319);\nfunction injectStyle (ssrContext) {\n __webpack_require__(310)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchGenerator_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_14692e23_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchGenerator_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 311 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchBox_vue__ = __webpack_require__(199);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4fc23b68_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchBox_vue__ = __webpack_require__(318);\nfunction injectStyle (ssrContext) {\n __webpack_require__(312)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_WatchBox_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_4fc23b68_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_WatchBox_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 313 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_LineChart_vue__ = __webpack_require__(200);\n/* unused harmony namespace reexport */\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\nvar __vue_template__ = null\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_LineChart_vue__[\"a\" /* default */],\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 314 */,\n/* 315 */,\n/* 316 */,\n/* 317 */,\n/* 318 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"select_line\"},[_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.nodes},model:{value:(_vm.selectedNode),callback:function ($$v) {_vm.selectedNode=$$v},expression:\"selectedNode\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.resourceTypes},model:{value:(_vm.selectedResourceType),callback:function ($$v) {_vm.selectedResourceType=$$v},expression:\"selectedResourceType\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.metrics},model:{value:(_vm.selectedMetric),callback:function ($$v) {_vm.selectedMetric=$$v},expression:\"selectedMetric\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),(_vm.showProcesses === true)?_c('div',{staticClass:\"table_box\"},[_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.processes,\"item-key\":\"pid\",\"hide-actions\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',{on:{\"click\":function($event){props.expanded = !props.expanded}}},[_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.index))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.owner))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.command))])])]}},{key:\"expand\",fn:function(props){return [_c('v-card',{attrs:{\"flat\":\"\"}},[_c('v-card-text',[_vm._v(\"GPU UUID: \"+_vm._s(props.item.uuid))])],1)]}}],null,false,51043860)})],1):_c('div',[_c('LineChart',{staticClass:\"chart_box\",attrs:{\"chart-data\":_vm.metricData,\"options\":_vm.metricOptions,\"rerender-chart\":_vm.rerenderChart,\"update-chart\":_vm.updateChart}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 319 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"watch_table\"},[_vm._l((_vm.watches),function(watch){return _c('WatchBox',{key:watch.id,staticClass:\"watch_box\",attrs:{\"default-node\":watch.defaultNode,\"default-resource-type\":watch.defaultResourceType,\"default-metric\":watch.defaultMetric,\"resources-indexes\":_vm.resourcesIndexes,\"chart-datasets\":_vm.chartDatasets,\"update-chart\":_vm.updateChart,\"time\":_vm.time},on:{\"changeDefaultNode\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultNode.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultResourceType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultResourceType.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultMetric\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultMetric.apply(void 0, [ watch.id ].concat( argsArray ))},\"deleteWatch\":function($event){return _vm.deleteWatch(watch.id)}}})}),_vm._v(\" \"),_c('div',{staticClass:\"button_box\"},[_c('v-btn',{staticClass:\"big_button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"#b8bcc2\"},on:{\"click\":_vm.addWatch}},[_c('v-icon',{attrs:{\"size\":\"100px\",\"dark\":\"\"}},[_vm._v(\"add\")])],1)],1)],2)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 320 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('WatchGenerator')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 321 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TasksOverview_vue__ = __webpack_require__(201);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_682605b4_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TasksOverview_vue__ = __webpack_require__(356);\nfunction injectStyle (ssrContext) {\n __webpack_require__(322)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TasksOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_682605b4_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TasksOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 323 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskCreate_vue__ = __webpack_require__(202);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c5e32eee_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskCreate_vue__ = __webpack_require__(343);\nfunction injectStyle (ssrContext) {\n __webpack_require__(324)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-c5e32eee\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskCreate_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_c5e32eee_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskCreate_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 325 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLine_vue__ = __webpack_require__(203);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_68056994_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLine_vue__ = __webpack_require__(342);\nfunction injectStyle (ssrContext) {\n __webpack_require__(326)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-68056994\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLine_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_68056994_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLine_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 327 */,\n/* 328 */,\n/* 329 */,\n/* 330 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineParameter_vue__ = __webpack_require__(204);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_dcbdcc6c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineParameter_vue__ = __webpack_require__(332);\nfunction injectStyle (ssrContext) {\n __webpack_require__(331)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineParameter_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_dcbdcc6c_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineParameter_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 332 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newParameter,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 333 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineEnvVariable_vue__ = __webpack_require__(205);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_3a9cfdb2_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineEnvVariable_vue__ = __webpack_require__(335);\nfunction injectStyle (ssrContext) {\n __webpack_require__(334)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineEnvVariable_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_3a9cfdb2_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineEnvVariable_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 335 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newEnvVariable,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 336 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineTfConfig_vue__ = __webpack_require__(206);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ed523d5c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineTfConfig_vue__ = __webpack_require__(341);\nfunction injectStyle (ssrContext) {\n __webpack_require__(337)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ed523d5c\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLineTfConfig_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ed523d5c_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLineTfConfig_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 338 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TfConfigEdit_vue__ = __webpack_require__(207);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1f240f3d_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TfConfigEdit_vue__ = __webpack_require__(340);\nfunction injectStyle (ssrContext) {\n __webpack_require__(339)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1f240f3d\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TfConfigEdit_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_1f240f3d_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TfConfigEdit_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 340 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"TF_CONFIG editor\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-textarea',{attrs:{\"solo\":\"\",\"auto-grow\":\"\",\"label\":\"Enter TF_CONFIG JSON here\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-tooltip',{attrs:{\"disabled\":_vm.properJson,\"top\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('div',_vm._g({},on),[_c('v-btn',{attrs:{\"color\":\"success\",\"disabled\":!_vm.properJson},on:{\"click\":function($event){return _vm.save()}}},[_vm._v(\"\\n Save\\n \")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"TF_CONFIG needs to be proper JSON object\")])])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 341 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('TfConfigEdit',{attrs:{\"value\":_vm.newValue,\"show-modal\":_vm.showModalTfConfigEdit},on:{\"close\":function($event){_vm.showModalTfConfigEdit = false},\"updateValue\":function($event){return _vm.updateValue.apply(void 0, arguments)}}}),_vm._v(\" \"),(_vm.enableSmartTfConfig)?_c('v-layout',[_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Port\",\"small\":\"\"},model:{value:(_vm.newPort),callback:function ($$v) {_vm.newPort=$$v},expression:\"newPort\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-combobox',{staticClass:\"tf-wide\",attrs:{\"label\":\"Task type\",\"items\":_vm.taskTypeItems},model:{value:(_vm.newTaskType),callback:function ($$v) {_vm.newTaskType=$$v},expression:\"newTaskType\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),(_vm.newTaskIndex >= 0)?_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Index\",\"type\":\"number\",\"small\":\"\"},model:{value:(_vm.newTaskIndex),callback:function ($$v) {_vm.newTaskIndex=$$v},expression:\"newTaskIndex\"}}):_vm._e()],1):_c('v-btn',{staticClass:\"task-input\",attrs:{\"color\":\"info\",\"round\":\"\",\"medium\":\"\"},on:{\"click\":function($event){_vm.showModalTfConfigEdit = true}}},[_vm._v(\"\\n TF_CONFIG\\n \")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"bottom\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticClass:\"remove-button remove-button-tf\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},on),[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Delete TF_CONFIG\")])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 342 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-center\":\"\"}},[_c('div',{staticClass:\"task-preview\"},[_vm._v(\"\\n \"+_vm._s(_vm.taskPreview)+\"\\n \")])]),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostnames,\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostResources,\"label\":\"Resource\",\"small\":\"\"},model:{value:(_vm.newResource),callback:function ($$v) {_vm.newResource=$$v},expression:\"newResource\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[(_vm.newEnableTfConfig)?_c('TaskLineTfConfig',{attrs:{\"value\":_vm.tfConfig,\"port\":_vm.tfConfigPort,\"task-type\":_vm.tfConfigTaskType,\"task-index\":_vm.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeTfConfig\":function($event){return _vm.changeTfConfig.apply(void 0, arguments)},\"deleteTfConfig\":function($event){return _vm.deleteTfConfig()},\"updateTfConfigPort\":function($event){return _vm.updateTfConfigPort.apply(void 0, arguments)},\"updateTfConfigTaskType\":function($event){return _vm.updateTfConfigTaskType.apply(void 0, arguments)},\"updateTfConfigTaskIndex\":function($event){return _vm.updateTfConfigTaskIndex.apply(void 0, arguments)}}}):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.envVariables),function(envVariable){return _c('TaskLineEnvVariable',{key:envVariable.id,staticClass:\"task-input\",attrs:{\"envVariable\":envVariable.envVariable,\"value\":envVariable.value},on:{\"changeEnvVariable\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeEnvVariable.apply(void 0, [ envVariable.id ].concat( argsArray ))},\"deleteEnvVariable\":function($event){return _vm.deleteEnvVariable(envVariable.id)}}})}),1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.parameters),function(parameter){return _c('TaskLineParameter',{key:parameter.id,staticClass:\"task-input\",attrs:{\"parameter\":parameter.parameter,\"value\":parameter.value},on:{\"changeParameter\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeParameter.apply(void 0, [ parameter.id ].concat( argsArray ))},\"deleteParameter\":function($event){return _vm.deleteParameter(parameter.id)}}})}),1),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_vm._v(\"\\n Remove task\\n \")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 343 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({},on),[_vm._v(\"\\n info\\n \")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"CPU tasks can be run without making reservation.\\n \"),_c('br'),_vm._v(\"When you want to create a GPU task, you must\\n \"),_c('br'),_vm._v(\"first ensure that you are eligible to do so\\n \"),_c('br'),_vm._v(\"(having active reservation for that GPU).\\n \")])]),_vm._v(\" \"),(_vm.chosenTemplate === 'tf2')?_c('v-switch',{staticClass:\"float-right-button\",attrs:{\"label\":\"Smart TF_CONFIG\"},model:{value:(_vm.enableSmartTfConfig),callback:function ($$v) {_vm.enableSmartTfConfig=$$v},expression:\"enableSmartTfConfig\"}}):_vm._e()],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.lines),function(line){return _c('TaskLine',{key:line.id,attrs:{\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"host\":line.host,\"resource\":line.resource,\"envVariables\":line.envVariables,\"staticEnvVariables\":_vm.staticEnvVariables,\"command\":line.command,\"parameters\":line.parameters,\"staticParameters\":_vm.staticParameters,\"enable-tf-config\":line.enableTfConfig,\"tf-config\":line.tfConfig,\"tf-config-port\":line.tfConfigPort,\"tf-config-task-type\":line.tfConfigTaskType,\"tf-config-task-index\":line.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeLine\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeLine.apply(void 0, [ line.id ].concat( argsArray ))},\"deleteLine\":function($event){return _vm.deleteLine(line.id)},\"staticParameterChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"psWorkerParameterChanged\":function($event){return _vm.updatePsWorkerHosts(-1, '')},\"staticEnvVariableChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"staticParameterDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"staticEnvVariableDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigPort\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigPort.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskType.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskIndex\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskIndex.apply(void 0, [ line.id ].concat( argsArray ))}}})}),1),_vm._v(\" \"),_c('v-card-text',[_c('v-flex',{attrs:{\"xs12\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"block\":\"\",\"small\":\"\"},on:{\"click\":_vm.copyLine}},[_vm._v(\"\\n Add task\\n \")])],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"parameter-name-input\",attrs:{\"label\":\"Parameter name\",\"small\":\"\"},model:{value:(_vm.newParameter),callback:function ($$v) {_vm.newParameter=$$v},expression:\"newParameter\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addEnvVariable}},[_vm._v(\"\\n Add as ENV variable to all tasks\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addParameter}},[_vm._v(\"\\n Add as parameter to all tasks\\n \")]),_vm._v(\" \"),_c('v-checkbox',{attrs:{\"label\":\"Static\"},model:{value:(_vm.isNewFieldStatic),callback:function ($$v) {_vm.isNewFieldStatic=$$v},expression:\"isNewFieldStatic\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.addTasks}},[_vm._v(\"\\n Create all tasks\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 344 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskEdit_vue__ = __webpack_require__(208);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ab402584_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskEdit_vue__ = __webpack_require__(346);\nfunction injectStyle (ssrContext) {\n __webpack_require__(345)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ab402584\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskEdit_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ab402584_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskEdit_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 346 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Edit task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"host-input\",attrs:{\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"command-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.changeTask}},[_vm._v(\"\\n Edit task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 347 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskSchedule_vue__ = __webpack_require__(209);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_21a65550_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskSchedule_vue__ = __webpack_require__(349);\nfunction injectStyle (ssrContext) {\n __webpack_require__(348)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-21a65550\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskSchedule_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_21a65550_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskSchedule_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 349 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"40vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Schedule task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set spawn time\"},model:{value:(_vm.spawn),callback:function ($$v) {_vm.spawn=$$v},expression:\"spawn\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}},on))]}}]),model:{value:(_vm.spawnDateMenu),callback:function ($$v) {_vm.spawnDateMenu=$$v},expression:\"spawnDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.spawnDateMenu = false}},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"spawnMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newSpawnTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newSpawnTime=$event},\"update:return-value\":function($event){_vm.newSpawnTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}},on))]}}]),model:{value:(_vm.spawnTimeMenu),callback:function ($$v) {_vm.spawnTimeMenu=$$v},expression:\"spawnTimeMenu\"}},[_vm._v(\" \"),(_vm.spawnTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.spawnMenu.save(_vm.newSpawnTime)}},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set terminate time\"},model:{value:(_vm.terminate),callback:function ($$v) {_vm.terminate=$$v},expression:\"terminate\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}},on))]}}]),model:{value:(_vm.terminateDateMenu),callback:function ($$v) {_vm.terminateDateMenu=$$v},expression:\"terminateDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.terminateDateMenu = false}},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"terminateMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newTerminateTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newTerminateTime=$event},\"update:return-value\":function($event){_vm.newTerminateTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}},on))]}}]),model:{value:(_vm.terminateTimeMenu),callback:function ($$v) {_vm.terminateTimeMenu=$$v},expression:\"terminateTimeMenu\"}},[_vm._v(\" \"),(_vm.terminateTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.terminateMenu.save(_vm.newTerminateTime)}},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}}):_vm._e()],1)],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.checkActionFlag}},[_vm._v(\"\\n Schedule task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 350 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLog_vue__ = __webpack_require__(210);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_246122fb_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLog_vue__ = __webpack_require__(352);\nfunction injectStyle (ssrContext) {\n __webpack_require__(351)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-246122fb\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskLog_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_246122fb_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskLog_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 352 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Task log\")])],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n \"+_vm._s(_vm.path)+\"\\n \"),_c('div',{staticClass:\"log_box\"},_vm._l((_vm.lines),function(line,index){return _c('div',{key:index},[_vm._v(\"\\n \"+_vm._s(line)+\"\\n \")])}),0)])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 353 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskTemplateChooser_vue__ = __webpack_require__(211);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_775c6214_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskTemplateChooser_vue__ = __webpack_require__(355);\nfunction injectStyle (ssrContext) {\n __webpack_require__(354)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-775c6214\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_TaskTemplateChooser_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_775c6214_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_TaskTemplateChooser_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 355 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Choose framework template\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.possibleTemplates,\"label\":\"Choose template from list\",\"solo\":\"\"},on:{\"change\":_vm.setChosenTemplate}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":function($event){return _vm.goToCreate()}}},[_vm._v(\"\\n Go to task creator\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 356 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('TaskCreate',{attrs:{\"show-modal\":_vm.showModalCreate,\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"actionFlag\":_vm.actionFlag,\"chosen-template\":_vm.chosenTemplate},on:{\"close\":function($event){_vm.showModalCreate = false},\"getTasks\":_vm.getTasks}}),_vm._v(\" \"),_c('TaskTemplateChooser',{attrs:{\"show-modal\":_vm.showModalChooseTemplate},on:{\"close\":function($event){_vm.showModalChooseTemplate = false},\"openFromTemplate\":_vm.openFromTemplate}}),_vm._v(\" \"),_c('TaskEdit',{attrs:{\"show-modal\":_vm.showModalEdit,\"taskId\":_vm.taskId,\"hostname\":_vm.newHostname,\"command\":_vm.newCommand,\"actionFlag\":_vm.actionFlag},on:{\"close\":function($event){_vm.showModalEdit = false},\"getTask\":function($event){return _vm.getTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskSchedule',{attrs:{\"show-modal\":_vm.showModalSchedule,\"taskId\":_vm.taskId,\"spawnTime\":_vm.newSpawnTime,\"terminateTime\":_vm.newTerminateTime,\"actionFlag\":_vm.actionFlag,\"multipleFlag\":_vm.multipleFlag,\"selected\":_vm.selected},on:{\"close\":function($event){_vm.showModalSchedule = false},\"updateTask\":function($event){return _vm.updateTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)},\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskLog',{attrs:{\"show-modal\":_vm.showModalLog,\"lines\":_vm.logs,\"path\":_vm.path},on:{\"close\":function($event){_vm.showModalLog = false}}}),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"500\"},model:{value:(_vm.showModalHowItWorks),callback:function ($$v) {_vm.showModalHowItWorks=$$v},expression:\"showModalHowItWorks\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalHowItWorks = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"How it works\\n \")],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Your tasks are managed by `screen` program installed on each machine. You can attach\\n to/close them as they are running. Screen sessions created by TensorHive have custom\\n names so you won't be confused which is which.\\n \"),_c('br'),_vm._v(\" \"),_c('br'),_vm._v(\"When your task command stops executing, screen session will disappear from `screen -ls`\\n but stdout+stderr produced by your process will be redirected to a log file.\\n Logs are automatically gathered and stored on that machine under `~/TensorHiveLogs`.\\n \")])],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"Do you want to remove this task?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeTask()}}},[_vm._v(\"Yes\")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"table-container\"},[_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\",\"rows-per-page-items\":_vm.rowsPerPageItems},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}}),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){_vm.showModalHowItWorks = true}}},on),[_vm._v(\"info\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"How it works\")])])],1)],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\" \"),_c('span',{staticClass:\"dark-font\"},[_vm._v(_vm._s(header.text))])],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.hostname))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.status))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))]),_vm._v(\" \"),_c('td',[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(props.item)}}},on),[_vm._v(\"schedule\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(props.item.id)}}},on),[_vm._v(\"play_arrow\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, null)}}},on),[_vm._v(\"stop\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate task - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, false)}}},on),[_vm._v(\"💀\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill task - use when command is more stubborn\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.getLog(props.item.id)}}},on),[_vm._v(\"description\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Show log\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.editTask(props.item)}}},on),[_vm._v(\"edit\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Edit task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},on),[_vm._v(\"delete\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Remove task\")])])],1)])]}}]),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}])})],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){return _vm.openFromTemplate('')}}},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModalChooseTemplate=true}}},[_vm._v(\"Create tasks from template\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.getTasks(true)}}},on),[_vm._v(\"refresh\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Refresh\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(null)}}},on),[_vm._v(\"schedule\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(null)}}},on),[_vm._v(\"play_arrow\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(null, null)}}},on),[_vm._v(\"stop\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate selected tasks - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(null, false)}}},on),[_vm._v(\"💀\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill selected tasks - use when command is more stubborn\")])])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"amber\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_c('span',{staticStyle:{\"color\":\"black\"}},[_vm._v(\"Synchronization in progress. Actions are not allowed now.\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"Close\")])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"red\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbarError),callback:function ($$v) {_vm.snackbarError=$$v},expression:\"snackbarError\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbarError = false}}},[_vm._v(\"Close\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 357 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_UsersOverview_vue__ = __webpack_require__(212);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58aecb3a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_UsersOverview_vue__ = __webpack_require__(359);\nfunction injectStyle (ssrContext) {\n __webpack_require__(358)\n}\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-58aecb3a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_UsersOverview_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_58aecb3a_hasScoped_true_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_UsersOverview_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 359 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n User successfully created\\n \")]),_vm._v(\" \"),_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"500px\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create new user\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('v-card-text',[_vm._v(\"\\n Username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\"\\n Email\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\"\\n Password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\"\\n Repeat password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Create\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"\\n Do you want to remove this user?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeUser()}}},[_vm._v(\"\\n Yes\\n \")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',[_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModal=true}}},[_vm._v(\"Create user\")])],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"max-width\":\"500px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.dialog = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Edit user\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current username: \"+_vm._s(_vm.currentUser.username)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.username),expression:\"user.username\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"username\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current email: \"+_vm._s(_vm.currentUser.email)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New email\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.email),expression:\"user.email\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.email)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"email\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password),expression:\"user.password\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Repeat password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password2),expression:\"user.password2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password2\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Account roles:\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('v-checkbox',{attrs:{\"label\":\"admin\"},model:{value:(_vm.adminCheckbox),callback:function ($$v) {_vm.adminCheckbox=$$v},expression:\"adminCheckbox\"}})],1)],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-spacer'),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":_vm.updateUser}},[_vm._v(\"Edit\")])],1)],1)],1),_vm._v(\" \"),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.users,\"search\":_vm.search,\"pagination\":_vm.pagination,\"item-key\":\"id\",\"hide-actions\":\"\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',[_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.username))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.email))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.createdAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.role))]),_vm._v(\" \"),_c('td',[_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.editUser(props.item)}}},[_vm._v(\"\\n edit\\n \")]),_vm._v(\" \"),_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},[_vm._v(\"\\n delete\\n \")])],1)])]}}])}),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-pagination',{attrs:{\"length\":_vm.pages},model:{value:(_vm.pagination.page),callback:function ($$v) {_vm.$set(_vm.pagination, \"page\", $$v)},expression:\"pagination.page\"}})],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 360 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__(30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vuex__ = __webpack_require__(361);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__state__ = __webpack_require__(362);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__actions__ = __webpack_require__(363);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__mutations__ = __webpack_require__(364);\n\n\n\n\n\n\n__WEBPACK_IMPORTED_MODULE_0_vue__[\"default\"].use(__WEBPACK_IMPORTED_MODULE_1_vuex__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (new __WEBPACK_IMPORTED_MODULE_1_vuex__[\"a\" /* default */].Store({\n state: __WEBPACK_IMPORTED_MODULE_2__state__[\"a\" /* default */],\n actions: __WEBPACK_IMPORTED_MODULE_3__actions__[\"a\" /* default */],\n mutations: __WEBPACK_IMPORTED_MODULE_4__mutations__[\"a\" /* default */]\n}));\n\n/***/ }),\n/* 361 */,\n/* 362 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n callingAPI: false,\n searching: '',\n serverURI: 'http://10.110.1.136:8080',\n user: null,\n role: null,\n id: null,\n accessToken: null,\n refreshToken: null,\n userInfo: {\n messages: [{ 1: 'test', 2: 'test' }],\n notifications: [],\n tasks: []\n }\n});\n\n/***/ }),\n/* 363 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({});\n\n/***/ }),\n/* 364 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n TOGGLE_LOADING: function TOGGLE_LOADING(state) {\n state.callingAPI = !state.callingAPI;\n },\n TOGGLE_SEARCHING: function TOGGLE_SEARCHING(state) {\n state.searching = state.searching === '' ? 'loading' : '';\n },\n SET_USER: function SET_USER(state, user) {\n state.user = user;\n },\n SET_ROLE: function SET_ROLE(state, role) {\n state.role = role;\n },\n SET_ID: function SET_ID(state, id) {\n state.id = id;\n },\n SET_ACCESS_TOKEN: function SET_ACCESS_TOKEN(state, token) {\n state.accessToken = token;\n },\n SET_REFRESH_TOKEN: function SET_REFRESH_TOKEN(state, token) {\n state.refreshToken = token;\n }\n});\n\n/***/ }),\n/* 365 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = domain;\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = count;\n/* harmony export (immutable) */ __webpack_exports__[\"d\"] = prettyDate;\n/* harmony export (immutable) */ __webpack_exports__[\"c\"] = pluralize;\nvar urlParser = document.createElement('a');\n\nfunction domain(url) {\n urlParser.href = url;\n return urlParser.hostname;\n}\n\nfunction count(arr) {\n return arr.length;\n}\n\nfunction prettyDate(date) {\n var a = new Date(date);\n return a.toDateString();\n}\n\nfunction pluralize(time, label) {\n if (time === 1) {\n return time + label;\n }\n\n return time + label + 's';\n}\n\n/***/ }),\n/* 366 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__ = __webpack_require__(213);\n/* unused harmony namespace reexport */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_535f2ac0_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__ = __webpack_require__(367);\nvar normalizeComponent = __webpack_require__(1)\n/* script */\n\n\n/* template */\n\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_App_vue__[\"a\" /* default */],\n __WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_535f2ac0_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_App_vue__[\"a\" /* default */],\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component.exports);\n\n\n/***/ }),\n/* 367 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('v-app',[_c('router-view')],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\n/* harmony default export */ __webpack_exports__[\"a\"] = (esExports);\n\n/***/ }),\n/* 368 */,\n/* 369 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ })\n],[214]);\n\n\n// WEBPACK FOOTER //\n// static/js/app.923c89f30ff332c6de66.js","import axios from 'axios'\nimport config from '../config'\n\nexport default {\n request (method, uri, token, data = null) {\n if (!method) {\n console.error('API function call requires method argument')\n return\n }\n\n if (!uri) {\n console.error('API function call requires uri argument')\n return\n }\n\n var url = config.serverURI + uri\n if (token !== null) {\n axios.defaults.headers.common['Authorization'] = token\n }\n return axios({ method: method, url: url, data: data })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/api/index.js","export default {\n serverURI: '',\n apiVersion: '',\n version: '',\n fixedLayout: false,\n hideLogoOnMobile: false\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/config/index.js","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/TheDash.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/dash/BaseSidebar.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/dash/BaseSidebarMenu.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/TheLogin.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/404.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/ReservationsOverview.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/FullCalendar.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/FullCalendarReserve.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/FullCalendarInfo.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/reserve_resources/MySchedule.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/NodesOverview.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/nodes_overview/WatchGenerator.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/nodes_overview/WatchBox.vue","\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/nodes_overview/LineChart.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/TasksOverview.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskCreate.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLine.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLineParameter.vue","\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLineEnvVariable.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLineTfConfig.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TfConfigEdit.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskEdit.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskSchedule.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskLog.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/tasks_overview/TaskTemplateChooser.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/views/UsersOverview.vue","\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/App.vue","// Import ES6 Promise\nimport 'es6-promise/auto'\n\n// Import System requirements\nimport Vue from 'vue'\nimport VueRouter from 'vue-router'\n\nimport { sync } from 'vuex-router-sync'\nimport routes from './routes'\nimport store from './store'\nimport api from './api'\n\n// Import Helpers for filters\nimport { domain, count, prettyDate, pluralize } from './filters'\n\n// Import Views - Top level\nimport AppView from './components/App.vue'\n\nimport Vuetify from 'vuetify'\nimport 'vuetify/dist/vuetify.min.css'\nimport 'material-design-icons-iconfont/dist/material-design-icons.css'\n\nimport axios from 'axios'\nimport config from './config'\naxios.get('static/config.json').then(response => {\n config.serverURI = response.data.apiPath\n config.apiVersion = response.data.apiVersion\n config.version = response.data.version\n if (window.localStorage) {\n var apiVersion = JSON.parse(window.localStorage.getItem('apiVersion'))\n var version = JSON.parse(window.localStorage.getItem('version'))\n if (apiVersion === null) {\n if (config.apiVersion !== undefined) {\n window.localStorage.setItem('apiVersion', JSON.stringify(config.apiVersion))\n } else {\n window.localStorage.setItem('apiVersion', JSON.stringify('no data in config file'))\n }\n } else if (apiVersion !== config.apiVersion) {\n window.localStorage.clear()\n location.reload(true)\n }\n if (version === null) {\n if (config.version !== undefined) {\n window.localStorage.setItem('version', JSON.stringify(config.apiVersion))\n } else {\n window.localStorage.setItem('version', JSON.stringify('no data in config file'))\n }\n } else if (version !== config.version) {\n window.localStorage.clear()\n location.reload(true)\n }\n }\n\n Vue.use(Vuetify)\n\n // Import Install and register helper items\n Vue.filter('count', count)\n Vue.filter('domain', domain)\n Vue.filter('prettyDate', prettyDate)\n Vue.filter('pluralize', pluralize)\n\n Vue.use(VueRouter)\n\n // Routing logic\n var router = new VueRouter({\n routes: routes,\n mode: 'history',\n linkExactActiveClass: 'active',\n scrollBehavior: function (to, from, savedPosition) {\n return savedPosition || { x: 0, y: 0 }\n }\n })\n\n // Some middleware to help us ensure the user is authenticated.\n router.beforeEach((to, from, next) => {\n if (\n to.matched.some(record => record.meta.requiresAuth) &&\n (!router.app.$store.state.accessToken || router.app.$store.state.accessToken === 'null')\n ) {\n // this route requires auth, check if logged in\n // if not, redirect to login page.\n window.console.log('Not authenticated')\n next({\n path: '/login',\n query: { redirect: to.fullPath }\n })\n } else if (to.meta.role === 'admin') {\n if (router.app.$store.state.role === 'admin') {\n next()\n } else {\n next({\n path: '/',\n query: { redirect: to.fullPath }\n })\n }\n } else {\n next()\n }\n })\n\n sync(store, router)\n\n axios.interceptors.response.use(null, (error) => {\n if (error.config.url === config.serverURI + '/user/refresh') {\n if (window.localStorage) {\n window.localStorage.setItem('user', null)\n window.localStorage.setItem('role', null)\n window.localStorage.setItem('accessToken', null)\n window.localStorage.setItem('refreshToken', null)\n }\n store.commit('SET_USER', null)\n store.commit('SET_ROLE', null)\n store.commit('SET_ACCESS_TOKEN', null)\n store.commit('SET_REFRESH_TOKEN', null)\n router.push('/login')\n } else {\n if (error.config && error.response && error.response.status === 401 && error.config.url !== config.serverURI + '/user/login') {\n axios.defaults.headers.common['Authorization'] = store.state.refreshToken\n return axios({ method: 'get', url: config.serverURI + '/user/refresh', data: null })\n .then(response => {\n store.commit('SET_ACCESS_TOKEN', 'Bearer ' + response.data.access_token)\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', 'Bearer ' + response.data.access_token)\n }\n error.config.headers['Authorization'] = 'Bearer ' + response.data.access_token\n return axios.request(error.config)\n })\n .catch(error => {\n handleError(error)\n logout()\n })\n }\n }\n return Promise.reject(error)\n })\n // Check local storage to handle refreshes\n if (window.localStorage) {\n var localUserString = window.localStorage.getItem('user') || 'null'\n var localUser = JSON.parse(localUserString)\n\n if (localUser && store.state.user !== localUser) {\n store.commit('SET_USER', localUser)\n store.commit('SET_ACCESS_TOKEN', window.localStorage.getItem('accessToken'))\n store.commit('SET_REFRESH_TOKEN', window.localStorage.getItem('refreshToken'))\n store.commit('SET_ROLE', window.localStorage.getItem('role'))\n store.commit('SET_ID', parseInt(window.localStorage.getItem('userId')))\n }\n }\n function handleError (error) {\n if (!error.hasOwnProperty('response')) {\n console.log(error.message)\n } else {\n if (!error.response.data.hasOwnProperty('msg')) {\n console.log(error.response.data)\n } else {\n console.log(error.response.data.msg)\n }\n }\n }\n\n function logout () {\n if (store.state.accessToken !== null) {\n api\n .request('delete', '/user/logout', store.state.accessToken)\n .then(response => {\n store.commit('SET_ACCESS_TOKEN', null)\n if (window.localStorage) {\n window.localStorage.setItem('accessToken', null)\n }\n if (store.state.refreshToken !== null) {\n api\n .request('delete', '/user/logout/refresh_token', store.state.refreshToken)\n .then(response => {\n store.commit('SET_REFRESH_TOKEN', null)\n if (window.localStorage) {\n window.localStorage.setItem('refreshToken', null)\n }\n })\n .catch(error => {\n handleError(error)\n })\n }\n })\n .catch(error => {\n this.handleError(error)\n })\n }\n store.commit('SET_USER', null)\n store.commit('SET_ROLE', null)\n\n if (window.localStorage) {\n window.localStorage.setItem('user', null)\n window.localStorage.setItem('role', null)\n }\n router.push('/login')\n }\n // Start out app!\n // eslint-disable-next-line no-new\n new Vue({\n el: '#root',\n router: router,\n store: store,\n render: h => h(AppView)\n })\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js","import DashView from './components/TheDash.vue'\nimport LoginView from './components/TheLogin.vue'\nimport NotFoundView from './components/404.vue'\n// Import Views - Dash\nimport CalendarView from './components/views/ReservationsOverview.vue'\nimport WatchView from './components/views/NodesOverview.vue'\nimport TasksView from './components/views/TasksOverview.vue'\nimport UsersView from './components/views/UsersOverview.vue'\n// Routes\nconst routes = [\n {\n path: '/',\n component: DashView,\n children: [\n {\n path: '/reservations_overview',\n alias: '',\n component: CalendarView,\n name: 'Reservation Overview',\n meta: {\n description: 'Calendar with reservations',\n requiresAuth: true,\n role: 'user'\n }\n },\n {\n path: 'nodes_overview',\n alias: '',\n component: WatchView,\n name: 'Nodes overview',\n meta: {\n description: 'Informations about nodes',\n requiresAuth: true,\n role: 'user'\n }\n },\n {\n path: 'tasks_overview',\n alias: '',\n component: TasksView,\n name: 'Tasks overview',\n meta: {\n description: 'Tasks overview',\n requiresAuth: true,\n role: 'user'\n }\n },\n {\n path: 'users_overview',\n alias: '',\n component: UsersView,\n name: 'Users overview',\n meta: {\n description: 'Table users view for admin',\n requiresAuth: true,\n role: 'admin'\n }\n }\n ]\n },\n {\n path: '/login',\n component: LoginView,\n meta: {\n role: 'user'\n }\n },\n {\n path: '*',\n component: NotFoundView\n }\n]\n\nexport default routes\n\n\n\n// WEBPACK FOOTER //\n// ./src/routes.js","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ebd4a91c\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!sass-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TheDash.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheDash.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheDash.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ebd4a91c\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./TheDash.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/TheDash.vue\n// module id = 254\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-8c8911fe\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./BaseSidebar.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebar.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebar.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-8c8911fe\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./BaseSidebar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/dash/BaseSidebar.vue\n// module id = 257\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1ff073b3\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./BaseSidebarMenu.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebarMenu.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./BaseSidebarMenu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1ff073b3\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./BaseSidebarMenu.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/dash/BaseSidebarMenu.vue\n// module id = 259\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"sidebar-menu\"},[_c('li',{staticClass:\"header\"},[_vm._v(\"SCHEDULE\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/reservations_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-calendar-check-o\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Reservations Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"RESOURCES\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/nodes_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-bar-chart\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Nodes Overview\")])])]),_vm._v(\" \"),_c('li',{staticClass:\"header\"},[_vm._v(\"TASKS\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/tasks_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-tasks\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Tasks Overview\")])])]),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('li',{staticClass:\"header\"},[_vm._v(\"\\n ADMIN ZONE\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.$store.state.role === 'admin')?_c('router-link',{staticClass:\"pageLink\",attrs:{\"tag\":\"li\",\"to\":\"/users_overview\"}},[_c('a',[_c('i',{staticClass:\"fa fa-users\"}),_vm._v(\" \"),_c('span',{staticClass:\"page\"},[_vm._v(\"Users Overview\")])])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1ff073b3\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/dash/BaseSidebarMenu.vue\n// module id = 261\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{staticClass:\"main-sidebar\"},[_c('section',{staticClass:\"sidebar\"},[_c('BaseSidebarMenu')],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-8c8911fe\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/dash/BaseSidebar.vue\n// module id = 262\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:['wrapper', _vm.classes]},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('header',{staticClass:\"main-header\"},[_c('nav',{staticClass:\"navbar navbar-static-top\",attrs:{\"role\":\"navigation\"}},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"version_info\"},[_c('b',[_vm._v(\"TensorHive\")]),_vm._v(\" v\"+_vm._s(_vm.version)+\" \"),_c('b',[_vm._v(\"API\")]),_vm._v(\" v\"+_vm._s(_vm.apiVersion)+\"\\n \")]),_vm._v(\" \"),_c('v-menu',{staticClass:\"user_chip\",attrs:{\"close-on-content-click\":false,\"offset-y\":\"\"}},[_c('v-chip',{attrs:{\"slot\":\"activator\",\"color\":\"green\",\"text-color\":\"white\"},slot:\"activator\"},[_c('v-avatar',[_c('v-icon',[_vm._v(\"account_circle\")])],1),_vm._v(\"\\n \"+_vm._s(_vm.displayName)+\"\\n \")],1),_vm._v(\" \"),_c('v-card',[_c('v-card-actions',[_c('v-btn',{attrs:{\"flat\":\"\"},on:{\"click\":function($event){return _vm.logout()}}},[_vm._v(\"Logout\")])],1)],1)],1)],1)]),_vm._v(\" \"),_c('BaseSidebar'),_vm._v(\" \"),_c('div',{staticClass:\"content-wrapper\"},[_c('router-view')],1),_vm._v(\" \"),_c('v-footer',{attrs:{\"height\":\"auto\",\"color\":\"#222d32\"}},[_c('v-layout',{attrs:{\"justify-center\":\"\",\"row\":\"\",\"wrap\":\"\"}},[_c('v-flex',{attrs:{\"text-xs-center\":\"\",\"white--text\":\"\",\"xs12\":\"\"}},[_vm._v(\"\\n Found a bug or needs some improvements? Leave us an \"),_c('a',{attrs:{\"href\":\"https://github.com/roscisz/TensorHive/issues\"}},[_vm._v(\"issue on Github\")]),_vm._v(\")\\n \")])],1)],1)],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('a',{staticClass:\"sidebar-toggle\",attrs:{\"href\":\"javascript:;\",\"data-toggle\":\"offcanvas\",\"role\":\"button\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Toggle navigation\")])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ebd4a91c\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/TheDash.vue\n// module id = 282\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-67170a3e\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TheLogin.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheLogin.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./TheLogin.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-67170a3e\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./TheLogin.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-67170a3e\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/TheLogin.vue\n// module id = 283\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"login\"}},[_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Register new account\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"UNIX username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Repeat password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\"\\n Please copy the key below and paste it into \"),_c('b',[_vm._v(\"~/.ssh/authorized_keys\")]),_vm._v(\".\"),_c('br'),_vm._v(\"It will allow TensorHive to confirm your identity and access machines with provided UNIX username.\\n \"),_c('v-textarea',{attrs:{\"solo\":\"\",\"name\":\"entry\",\"value\":_vm.entry,\"id\":\"entry\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\"},on:{\"click\":_vm.copyEntryToClipboard}},[_vm._v(\"Copy to clipboard\")]),_vm._v(\" \"),_c('br'),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Register\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-center col-sm-12\"},[_c('form',{staticClass:\"login-form\",on:{\"submit\":function($event){$event.preventDefault();return _vm.checkCreds($event)}}},[_vm._v(\"\\n Login to your account\\n \"),_c('div',{staticClass:\"input-group\"},[_vm._m(0),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.username),expression:\"username\"}],staticClass:\"form-control\",attrs:{\"name\":\"username\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.username=$event.target.value}}})]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_vm._m(1),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],staticClass:\"form-control\",attrs:{\"name\":\"password\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.password=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n Identity verification succeeded, account has been successfully created. You can now log in.\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\"},on:{\"click\":_vm.requestEntry}},[_vm._v(\"Register\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Login\\n \")])],1)])],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-67170a3e\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/TheLogin.vue\n// module id = 285\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-209d35e8\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./404.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./404.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./404.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-209d35e8\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./404.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/404.vue\n// module id = 286\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"notFound\"}},[_c('div',{staticClass:\"text-center col-sm-12\"},[_c('h1',[_vm._v(\"You are lost.\")]),_vm._v(\" \"),_c('h4',[_vm._v(\"This page doesn't exist.\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"vertical-5p lead\",attrs:{\"to\":\"/\"}},[_vm._v(\"Take me home.\")])],1)])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-209d35e8\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/404.vue\n// module id = 288\n// module chunks = 1","var normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./ReservationsOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./ReservationsOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-a758ccee\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./ReservationsOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/ReservationsOverview.vue\n// module id = 289\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-17877d92\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./FullCalendar.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendar.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendar.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-17877d92\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./FullCalendar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/FullCalendar.vue\n// module id = 290\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1d62e0bd\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./FullCalendarReserve.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarReserve.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarReserve.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1d62e0bd\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./FullCalendarReserve.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1d62e0bd\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/FullCalendarReserve.vue\n// module id = 292\n// module chunks = 1","var map = {\n\t\"./af\": 66,\n\t\"./af.js\": 66,\n\t\"./ar\": 67,\n\t\"./ar-dz\": 68,\n\t\"./ar-dz.js\": 68,\n\t\"./ar-kw\": 69,\n\t\"./ar-kw.js\": 69,\n\t\"./ar-ly\": 70,\n\t\"./ar-ly.js\": 70,\n\t\"./ar-ma\": 71,\n\t\"./ar-ma.js\": 71,\n\t\"./ar-sa\": 72,\n\t\"./ar-sa.js\": 72,\n\t\"./ar-tn\": 73,\n\t\"./ar-tn.js\": 73,\n\t\"./ar.js\": 67,\n\t\"./az\": 74,\n\t\"./az.js\": 74,\n\t\"./be\": 75,\n\t\"./be.js\": 75,\n\t\"./bg\": 76,\n\t\"./bg.js\": 76,\n\t\"./bm\": 77,\n\t\"./bm.js\": 77,\n\t\"./bn\": 78,\n\t\"./bn.js\": 78,\n\t\"./bo\": 79,\n\t\"./bo.js\": 79,\n\t\"./br\": 80,\n\t\"./br.js\": 80,\n\t\"./bs\": 81,\n\t\"./bs.js\": 81,\n\t\"./ca\": 82,\n\t\"./ca.js\": 82,\n\t\"./cs\": 83,\n\t\"./cs.js\": 83,\n\t\"./cv\": 84,\n\t\"./cv.js\": 84,\n\t\"./cy\": 85,\n\t\"./cy.js\": 85,\n\t\"./da\": 86,\n\t\"./da.js\": 86,\n\t\"./de\": 87,\n\t\"./de-at\": 88,\n\t\"./de-at.js\": 88,\n\t\"./de-ch\": 89,\n\t\"./de-ch.js\": 89,\n\t\"./de.js\": 87,\n\t\"./dv\": 90,\n\t\"./dv.js\": 90,\n\t\"./el\": 91,\n\t\"./el.js\": 91,\n\t\"./en-SG\": 92,\n\t\"./en-SG.js\": 92,\n\t\"./en-au\": 93,\n\t\"./en-au.js\": 93,\n\t\"./en-ca\": 94,\n\t\"./en-ca.js\": 94,\n\t\"./en-gb\": 95,\n\t\"./en-gb.js\": 95,\n\t\"./en-ie\": 96,\n\t\"./en-ie.js\": 96,\n\t\"./en-il\": 97,\n\t\"./en-il.js\": 97,\n\t\"./en-nz\": 98,\n\t\"./en-nz.js\": 98,\n\t\"./eo\": 99,\n\t\"./eo.js\": 99,\n\t\"./es\": 100,\n\t\"./es-do\": 101,\n\t\"./es-do.js\": 101,\n\t\"./es-us\": 102,\n\t\"./es-us.js\": 102,\n\t\"./es.js\": 100,\n\t\"./et\": 103,\n\t\"./et.js\": 103,\n\t\"./eu\": 104,\n\t\"./eu.js\": 104,\n\t\"./fa\": 105,\n\t\"./fa.js\": 105,\n\t\"./fi\": 106,\n\t\"./fi.js\": 106,\n\t\"./fo\": 107,\n\t\"./fo.js\": 107,\n\t\"./fr\": 108,\n\t\"./fr-ca\": 109,\n\t\"./fr-ca.js\": 109,\n\t\"./fr-ch\": 110,\n\t\"./fr-ch.js\": 110,\n\t\"./fr.js\": 108,\n\t\"./fy\": 111,\n\t\"./fy.js\": 111,\n\t\"./ga\": 112,\n\t\"./ga.js\": 112,\n\t\"./gd\": 113,\n\t\"./gd.js\": 113,\n\t\"./gl\": 114,\n\t\"./gl.js\": 114,\n\t\"./gom-latn\": 115,\n\t\"./gom-latn.js\": 115,\n\t\"./gu\": 116,\n\t\"./gu.js\": 116,\n\t\"./he\": 117,\n\t\"./he.js\": 117,\n\t\"./hi\": 118,\n\t\"./hi.js\": 118,\n\t\"./hr\": 119,\n\t\"./hr.js\": 119,\n\t\"./hu\": 120,\n\t\"./hu.js\": 120,\n\t\"./hy-am\": 121,\n\t\"./hy-am.js\": 121,\n\t\"./id\": 122,\n\t\"./id.js\": 122,\n\t\"./is\": 123,\n\t\"./is.js\": 123,\n\t\"./it\": 124,\n\t\"./it-ch\": 125,\n\t\"./it-ch.js\": 125,\n\t\"./it.js\": 124,\n\t\"./ja\": 126,\n\t\"./ja.js\": 126,\n\t\"./jv\": 127,\n\t\"./jv.js\": 127,\n\t\"./ka\": 128,\n\t\"./ka.js\": 128,\n\t\"./kk\": 129,\n\t\"./kk.js\": 129,\n\t\"./km\": 130,\n\t\"./km.js\": 130,\n\t\"./kn\": 131,\n\t\"./kn.js\": 131,\n\t\"./ko\": 132,\n\t\"./ko.js\": 132,\n\t\"./ku\": 133,\n\t\"./ku.js\": 133,\n\t\"./ky\": 134,\n\t\"./ky.js\": 134,\n\t\"./lb\": 135,\n\t\"./lb.js\": 135,\n\t\"./lo\": 136,\n\t\"./lo.js\": 136,\n\t\"./lt\": 137,\n\t\"./lt.js\": 137,\n\t\"./lv\": 138,\n\t\"./lv.js\": 138,\n\t\"./me\": 139,\n\t\"./me.js\": 139,\n\t\"./mi\": 140,\n\t\"./mi.js\": 140,\n\t\"./mk\": 141,\n\t\"./mk.js\": 141,\n\t\"./ml\": 142,\n\t\"./ml.js\": 142,\n\t\"./mn\": 143,\n\t\"./mn.js\": 143,\n\t\"./mr\": 144,\n\t\"./mr.js\": 144,\n\t\"./ms\": 145,\n\t\"./ms-my\": 146,\n\t\"./ms-my.js\": 146,\n\t\"./ms.js\": 145,\n\t\"./mt\": 147,\n\t\"./mt.js\": 147,\n\t\"./my\": 148,\n\t\"./my.js\": 148,\n\t\"./nb\": 149,\n\t\"./nb.js\": 149,\n\t\"./ne\": 150,\n\t\"./ne.js\": 150,\n\t\"./nl\": 151,\n\t\"./nl-be\": 152,\n\t\"./nl-be.js\": 152,\n\t\"./nl.js\": 151,\n\t\"./nn\": 153,\n\t\"./nn.js\": 153,\n\t\"./pa-in\": 154,\n\t\"./pa-in.js\": 154,\n\t\"./pl\": 155,\n\t\"./pl.js\": 155,\n\t\"./pt\": 156,\n\t\"./pt-br\": 157,\n\t\"./pt-br.js\": 157,\n\t\"./pt.js\": 156,\n\t\"./ro\": 158,\n\t\"./ro.js\": 158,\n\t\"./ru\": 159,\n\t\"./ru.js\": 159,\n\t\"./sd\": 160,\n\t\"./sd.js\": 160,\n\t\"./se\": 161,\n\t\"./se.js\": 161,\n\t\"./si\": 162,\n\t\"./si.js\": 162,\n\t\"./sk\": 163,\n\t\"./sk.js\": 163,\n\t\"./sl\": 164,\n\t\"./sl.js\": 164,\n\t\"./sq\": 165,\n\t\"./sq.js\": 165,\n\t\"./sr\": 166,\n\t\"./sr-cyrl\": 167,\n\t\"./sr-cyrl.js\": 167,\n\t\"./sr.js\": 166,\n\t\"./ss\": 168,\n\t\"./ss.js\": 168,\n\t\"./sv\": 169,\n\t\"./sv.js\": 169,\n\t\"./sw\": 170,\n\t\"./sw.js\": 170,\n\t\"./ta\": 171,\n\t\"./ta.js\": 171,\n\t\"./te\": 172,\n\t\"./te.js\": 172,\n\t\"./tet\": 173,\n\t\"./tet.js\": 173,\n\t\"./tg\": 174,\n\t\"./tg.js\": 174,\n\t\"./th\": 175,\n\t\"./th.js\": 175,\n\t\"./tl-ph\": 176,\n\t\"./tl-ph.js\": 176,\n\t\"./tlh\": 177,\n\t\"./tlh.js\": 177,\n\t\"./tr\": 178,\n\t\"./tr.js\": 178,\n\t\"./tzl\": 179,\n\t\"./tzl.js\": 179,\n\t\"./tzm\": 180,\n\t\"./tzm-latn\": 181,\n\t\"./tzm-latn.js\": 181,\n\t\"./tzm.js\": 180,\n\t\"./ug-cn\": 182,\n\t\"./ug-cn.js\": 182,\n\t\"./uk\": 183,\n\t\"./uk.js\": 183,\n\t\"./ur\": 184,\n\t\"./ur.js\": 184,\n\t\"./uz\": 185,\n\t\"./uz-latn\": 186,\n\t\"./uz-latn.js\": 186,\n\t\"./uz.js\": 185,\n\t\"./vi\": 187,\n\t\"./vi.js\": 187,\n\t\"./x-pseudo\": 188,\n\t\"./x-pseudo.js\": 188,\n\t\"./yo\": 189,\n\t\"./yo.js\": 189,\n\t\"./zh-cn\": 190,\n\t\"./zh-cn.js\": 190,\n\t\"./zh-hk\": 191,\n\t\"./zh-hk.js\": 191,\n\t\"./zh-tw\": 192,\n\t\"./zh-tw.js\": 192\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 294;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/moment/locale ^\\.\\/.*$\n// module id = 294\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Which resources do you want to reserve?\")])],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.resourcesCheckboxes),function(checkbox){return _c('div',{key:checkbox.uuid,staticClass:\"resources_row\"},[_c('v-checkbox',{attrs:{\"label\":((checkbox.nodeName) + \" GPU\" + (checkbox.index) + \" \" + (checkbox.name)),\"disabled\":checkbox.disabled},model:{value:(checkbox.checked),callback:function ($$v) {_vm.$set(checkbox, \"checked\", $$v)},expression:\"checkbox.checked\"}})],1)}),0),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}]),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}]),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}]),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}]),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.reservationTitle),callback:function ($$v) {_vm.reservationTitle=$$v},expression:\"reservationTitle\"}}),_vm._v(\" \"),_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.reservationDescription),callback:function ($$v) {_vm.reservationDescription=$$v},expression:\"reservationDescription\"}}),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showInfo===true),expression:\"showInfo===true\"}],staticClass:\"text-red\"},[_c('p',{staticClass:\"vertical-5p lead\"},[_vm._v(\"You need to choose at least one resource to reserve\")])]),_vm._v(\" \"),_c('div',{staticClass:\"modal-footer text-right\"},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.reservation()}}},[_vm._v(\"\\n Reserve\\n \")])],1)],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1d62e0bd\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/FullCalendarReserve.vue\n// module id = 295\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-58652693\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./FullCalendarInfo.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarInfo.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./FullCalendarInfo.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-58652693\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./FullCalendarInfo.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/FullCalendarInfo.vue\n// module id = 296\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"50vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"indigo\",\"text-color\":\"white\"}},[_c('v-avatar',{attrs:{\"left\":\"\"}},[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"account_circle\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.userName))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"teal\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"dns\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(_vm._s(_vm.reservation.hostname))])],1),_vm._v(\" \"),_c('v-chip',{staticClass:\"ma-2 large-chip\",attrs:{\"color\":\"light-green\",\"text-color\":\"white\"}},[_c('v-avatar',[_c('v-icon',{staticClass:\"large-icon\",attrs:{\"large\":\"\"}},[_vm._v(\"memory\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"spaced-text\"},[_vm._v(\"GPU\"+_vm._s(_vm.reservation.resourceIndex)+\" \"+_vm._s(_vm.reservation.resourceName))])],1),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Title:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.title)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Title\"},model:{value:(_vm.newTitle),callback:function ($$v) {_vm.newTitle=$$v},expression:\"newTitle\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Description:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.description)+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-textarea',{attrs:{\"outline\":\"\",\"label\":\"Description\"},model:{value:(_vm.newDescription),callback:function ($$v) {_vm.newDescription=$$v},expression:\"newDescription\"}})],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.gpuUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Average GPU memory utilization:\")]),_vm._v(\"\\n \"+_vm._s(_vm.memUtilAvg)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"Start:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.start))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}},on))]}}],null,false,710299969),model:{value:(_vm.startDateMenu),callback:function ($$v) {_vm.startDateMenu=$$v},expression:\"startDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.startDateMenu = false}},model:{value:(_vm.newStartDate),callback:function ($$v) {_vm.newStartDate=$$v},expression:\"newStartDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"startMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newStartTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newStartTime=$event},\"update:return-value\":function($event){_vm.newStartTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Start time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}},on))]}}],null,false,4222293411),model:{value:(_vm.startTimeMenu),callback:function ($$v) {_vm.startTimeMenu=$$v},expression:\"startTimeMenu\"}},[_vm._v(\" \"),(_vm.startTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.startMenu.save(_vm.newStartTime)}},model:{value:(_vm.newStartTime),callback:function ($$v) {_vm.newStartTime=$$v},expression:\"newStartTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"End:\")]),_vm._v(\"\\n \"+_vm._s(_vm.prettyDate(_vm.reservation.end))+\"\\n \")]),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}},on))]}}],null,false,3230088161),model:{value:(_vm.endDateMenu),callback:function ($$v) {_vm.endDateMenu=$$v},expression:\"endDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.endDateMenu = false}},model:{value:(_vm.newEndDate),callback:function ($$v) {_vm.newEndDate=$$v},expression:\"newEndDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"endMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newEndTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newEndTime=$event},\"update:return-value\":function($event){_vm.newEndTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"End time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}},on))]}}],null,false,2362500227),model:{value:(_vm.endTimeMenu),callback:function ($$v) {_vm.endTimeMenu=$$v},expression:\"endTimeMenu\"}},[_vm._v(\" \"),(_vm.endTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"allowed-minutes\":function (m) { return m % 30 === 0; },\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.endMenu.save(_vm.newEndTime)}},model:{value:(_vm.newEndTime),callback:function ($$v) {_vm.newEndTime=$$v},expression:\"newEndTime\"}}):_vm._e()],1)],1)],1):_vm._e(),_vm._v(\" \"),_c('v-card-text',[_c('b',[_vm._v(\"GPU UUID:\")]),_vm._v(\"\\n \"+_vm._s(_vm.reservation.resourceId)+\"\\n \")]),_vm._v(\" \"),(_vm.tasksCard)?_c('v-card-text',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"warning\"},model:{value:(_vm.showAlert),callback:function ($$v) {_vm.showAlert=$$v},expression:\"showAlert\"}},[_vm._v(\"Synchronization in progress. Task assign is disabled now.\")])],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}})],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\"\\n \"+_vm._s(header.text)+\"\\n \")],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))])])]}}],null,false,4156683076),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}],null,false,63074868)})],1):_vm._e(),_vm._v(\" \"),(_vm.tasksCard)?_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){return _vm.checkActionFlag()}}},[_vm._v(\"Assign selected\")]):_vm._e(),_vm._v(\" \"),(_vm.actionsAbility)?_c('v-card-text',{staticClass:\"container\"},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"yellow\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.tasksCard=!_vm.tasksCard; _vm.cancelCard=false; _vm.updateCard=false}}},[_vm._v(\"Schedule task(s) for this reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"error\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=!_vm.cancelCard; _vm.tasksCard=false; _vm.updateCard=false}}},[_vm._v(\"Cancel reservation\")]),_vm._v(\" \"),_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=!_vm.updateCard; _vm.tasksCard=false, _vm.cancelCard=false}}},[_vm._v(\"Edit reservation\")])],1):_vm._e(),_vm._v(\" \"),(_vm.cancelCard)?_c('v-card-text',[_vm._v(\"\\n Do you want to cancel selected reservation?\\n \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.cancelCard=false}}},[_vm._v(\"No\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.cancelReservation()}}},[_vm._v(\"Yes\")])],1):_vm._e(),_vm._v(\" \"),(_vm.updateCard)?_c('v-card-text',[_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\",\"outline\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.updateCard=false}}},[_vm._v(\"Back\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.updateReservation()}}},[_vm._v(\"Update\")])],1):_vm._e()],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-58652693\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/FullCalendarInfo.vue\n// module id = 298\n// module chunks = 1","/*!\r\n * FullCalendar v3.9.0\r\n * Docs & License: https://fullcalendar.io/\r\n * (c) 2018 Adam Shaw\r\n */\r\n(function webpackUniversalModuleDefinition(root, factory) {\r\n\tif(typeof exports === 'object' && typeof module === 'object')\r\n\t\tmodule.exports = factory(require(\"moment\"), require(\"jquery\"));\r\n\telse if(typeof define === 'function' && define.amd)\r\n\t\tdefine([\"moment\", \"jquery\"], factory);\r\n\telse if(typeof exports === 'object')\r\n\t\texports[\"FullCalendar\"] = factory(require(\"moment\"), require(\"jquery\"));\r\n\telse\r\n\t\troot[\"FullCalendar\"] = factory(root[\"moment\"], root[\"jQuery\"]);\r\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3__) {\r\nreturn /******/ (function(modules) { // webpackBootstrap\r\n/******/ \t// The module cache\r\n/******/ \tvar installedModules = {};\r\n/******/\r\n/******/ \t// The require function\r\n/******/ \tfunction __webpack_require__(moduleId) {\r\n/******/\r\n/******/ \t\t// Check if module is in cache\r\n/******/ \t\tif(installedModules[moduleId]) {\r\n/******/ \t\t\treturn installedModules[moduleId].exports;\r\n/******/ \t\t}\r\n/******/ \t\t// Create a new module (and put it into the cache)\r\n/******/ \t\tvar module = installedModules[moduleId] = {\r\n/******/ \t\t\ti: moduleId,\r\n/******/ \t\t\tl: false,\r\n/******/ \t\t\texports: {}\r\n/******/ \t\t};\r\n/******/\r\n/******/ \t\t// Execute the module function\r\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n/******/\r\n/******/ \t\t// Flag the module as loaded\r\n/******/ \t\tmodule.l = true;\r\n/******/\r\n/******/ \t\t// Return the exports of the module\r\n/******/ \t\treturn module.exports;\r\n/******/ \t}\r\n/******/\r\n/******/\r\n/******/ \t// expose the modules object (__webpack_modules__)\r\n/******/ \t__webpack_require__.m = modules;\r\n/******/\r\n/******/ \t// expose the module cache\r\n/******/ \t__webpack_require__.c = installedModules;\r\n/******/\r\n/******/ \t// define getter function for harmony exports\r\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\r\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\r\n/******/ \t\t\tObject.defineProperty(exports, name, {\r\n/******/ \t\t\t\tconfigurable: false,\r\n/******/ \t\t\t\tenumerable: true,\r\n/******/ \t\t\t\tget: getter\r\n/******/ \t\t\t});\r\n/******/ \t\t}\r\n/******/ \t};\r\n/******/\r\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\r\n/******/ \t__webpack_require__.n = function(module) {\r\n/******/ \t\tvar getter = module && module.__esModule ?\r\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\r\n/******/ \t\t\tfunction getModuleExports() { return module; };\r\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\r\n/******/ \t\treturn getter;\r\n/******/ \t};\r\n/******/\r\n/******/ \t// Object.prototype.hasOwnProperty.call\r\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\r\n/******/\r\n/******/ \t// __webpack_public_path__\r\n/******/ \t__webpack_require__.p = \"\";\r\n/******/\r\n/******/ \t// Load entry module and return exports\r\n/******/ \treturn __webpack_require__(__webpack_require__.s = 236);\r\n/******/ })\r\n/************************************************************************/\r\n/******/ ([\r\n/* 0 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\r\n\r\n/***/ }),\r\n/* 1 */,\r\n/* 2 */\r\n/***/ (function(module, exports) {\r\n\r\n/*\r\nderived from:\r\nhttps://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js\r\n\r\nonly include the helpers we need, to keep down filesize\r\n*/\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b)\r\n if (b.hasOwnProperty(p))\r\n d[p] = b[p]; };\r\nexports.__extends = function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 3 */\r\n/***/ (function(module, exports) {\r\n\r\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\r\n\r\n/***/ }),\r\n/* 4 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\n/* FullCalendar-specific DOM Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\r\n// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\r\nfunction compensateScroll(rowEls, scrollbarWidths) {\r\n if (scrollbarWidths.left) {\r\n rowEls.css({\r\n 'border-left-width': 1,\r\n 'margin-left': scrollbarWidths.left - 1\r\n });\r\n }\r\n if (scrollbarWidths.right) {\r\n rowEls.css({\r\n 'border-right-width': 1,\r\n 'margin-right': scrollbarWidths.right - 1\r\n });\r\n }\r\n}\r\nexports.compensateScroll = compensateScroll;\r\n// Undoes compensateScroll and restores all borders/margins\r\nfunction uncompensateScroll(rowEls) {\r\n rowEls.css({\r\n 'margin-left': '',\r\n 'margin-right': '',\r\n 'border-left-width': '',\r\n 'border-right-width': ''\r\n });\r\n}\r\nexports.uncompensateScroll = uncompensateScroll;\r\n// Make the mouse cursor express that an event is not allowed in the current area\r\nfunction disableCursor() {\r\n $('body').addClass('fc-not-allowed');\r\n}\r\nexports.disableCursor = disableCursor;\r\n// Returns the mouse cursor to its original look\r\nfunction enableCursor() {\r\n $('body').removeClass('fc-not-allowed');\r\n}\r\nexports.enableCursor = enableCursor;\r\n// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\r\n// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\r\n// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and\r\n// reduces the available height.\r\nfunction distributeHeight(els, availableHeight, shouldRedistribute) {\r\n // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\r\n // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\r\n var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\r\n var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\r\n var flexEls = []; // elements that are allowed to expand. array of DOM nodes\r\n var flexOffsets = []; // amount of vertical space it takes up\r\n var flexHeights = []; // actual css height\r\n var usedHeight = 0;\r\n undistributeHeight(els); // give all elements their natural height\r\n // find elements that are below the recommended height (expandable).\r\n // important to query for heights in a single first pass (to avoid reflow oscillation).\r\n els.each(function (i, el) {\r\n var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = $(el).outerHeight(true);\r\n if (naturalOffset < minOffset) {\r\n flexEls.push(el);\r\n flexOffsets.push(naturalOffset);\r\n flexHeights.push($(el).height());\r\n }\r\n else {\r\n // this element stretches past recommended height (non-expandable). mark the space as occupied.\r\n usedHeight += naturalOffset;\r\n }\r\n });\r\n // readjust the recommended height to only consider the height available to non-maxed-out rows.\r\n if (shouldRedistribute) {\r\n availableHeight -= usedHeight;\r\n minOffset1 = Math.floor(availableHeight / flexEls.length);\r\n minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\r\n }\r\n // assign heights to all expandable elements\r\n $(flexEls).each(function (i, el) {\r\n var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\r\n var naturalOffset = flexOffsets[i];\r\n var naturalHeight = flexHeights[i];\r\n var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\r\n if (naturalOffset < minOffset) {\r\n $(el).height(newHeight);\r\n }\r\n });\r\n}\r\nexports.distributeHeight = distributeHeight;\r\n// Undoes distrubuteHeight, restoring all els to their natural height\r\nfunction undistributeHeight(els) {\r\n els.height('');\r\n}\r\nexports.undistributeHeight = undistributeHeight;\r\n// Given `els`, a jQuery set of cells, find the cell with the largest natural width and set the widths of all the\r\n// cells to be that width.\r\n// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\r\nfunction matchCellWidths(els) {\r\n var maxInnerWidth = 0;\r\n els.find('> *').each(function (i, innerEl) {\r\n var innerWidth = $(innerEl).outerWidth();\r\n if (innerWidth > maxInnerWidth) {\r\n maxInnerWidth = innerWidth;\r\n }\r\n });\r\n maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\r\n els.width(maxInnerWidth);\r\n return maxInnerWidth;\r\n}\r\nexports.matchCellWidths = matchCellWidths;\r\n// Given one element that resides inside another,\r\n// Subtracts the height of the inner element from the outer element.\r\nfunction subtractInnerElHeight(outerEl, innerEl) {\r\n var both = outerEl.add(innerEl);\r\n var diff;\r\n // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\r\n both.css({\r\n position: 'relative',\r\n left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\r\n });\r\n diff = outerEl.outerHeight() - innerEl.outerHeight(); // grab the dimensions\r\n both.css({ position: '', left: '' }); // undo hack\r\n return diff;\r\n}\r\nexports.subtractInnerElHeight = subtractInnerElHeight;\r\n/* Element Geom Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51\r\nfunction getScrollParent(el) {\r\n var position = el.css('position');\r\n var scrollParent = el.parents().filter(function () {\r\n var parent = $(this);\r\n return (/(auto|scroll)/).test(parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x'));\r\n }).eq(0);\r\n return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;\r\n}\r\nexports.getScrollParent = getScrollParent;\r\n// Queries the outer bounding area of a jQuery element.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getOuterRect(el, origin) {\r\n var offset = el.offset();\r\n var left = offset.left - (origin ? origin.left : 0);\r\n var top = offset.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.outerWidth(),\r\n top: top,\r\n bottom: top + el.outerHeight()\r\n };\r\n}\r\nexports.getOuterRect = getOuterRect;\r\n// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\n// WARNING: given element can't have borders\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getClientRect(el, origin) {\r\n var offset = el.offset();\r\n var scrollbarWidths = getScrollbarWidths(el);\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left - (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top - (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el[0].clientWidth,\r\n top: top,\r\n bottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars\r\n };\r\n}\r\nexports.getClientRect = getClientRect;\r\n// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.\r\n// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).\r\n// Origin is optional.\r\nfunction getContentRect(el, origin) {\r\n var offset = el.offset(); // just outside of border, margin not included\r\n var left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left') -\r\n (origin ? origin.left : 0);\r\n var top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top') -\r\n (origin ? origin.top : 0);\r\n return {\r\n left: left,\r\n right: left + el.width(),\r\n top: top,\r\n bottom: top + el.height()\r\n };\r\n}\r\nexports.getContentRect = getContentRect;\r\n// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.\r\n// WARNING: given element can't have borders (which will cause offsetWidth/offsetHeight to be larger).\r\n// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.\r\nfunction getScrollbarWidths(el) {\r\n var leftRightWidth = el[0].offsetWidth - el[0].clientWidth;\r\n var bottomWidth = el[0].offsetHeight - el[0].clientHeight;\r\n var widths;\r\n leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);\r\n bottomWidth = sanitizeScrollbarWidth(bottomWidth);\r\n widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };\r\n if (getIsLeftRtlScrollbars() && el.css('direction') === 'rtl') {\r\n widths.left = leftRightWidth;\r\n }\r\n else {\r\n widths.right = leftRightWidth;\r\n }\r\n return widths;\r\n}\r\nexports.getScrollbarWidths = getScrollbarWidths;\r\n// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to\r\n// retina displays, rounding, and IE11. Massage them into a usable value.\r\nfunction sanitizeScrollbarWidth(width) {\r\n width = Math.max(0, width); // no negatives\r\n width = Math.round(width);\r\n return width;\r\n}\r\n// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\r\nvar _isLeftRtlScrollbars = null;\r\nfunction getIsLeftRtlScrollbars() {\r\n if (_isLeftRtlScrollbars === null) {\r\n _isLeftRtlScrollbars = computeIsLeftRtlScrollbars();\r\n }\r\n return _isLeftRtlScrollbars;\r\n}\r\nfunction computeIsLeftRtlScrollbars() {\r\n var el = $('
')\r\n .css({\r\n position: 'absolute',\r\n top: -1000,\r\n left: 0,\r\n border: 0,\r\n padding: 0,\r\n overflow: 'scroll',\r\n direction: 'rtl'\r\n })\r\n .appendTo('body');\r\n var innerEl = el.children();\r\n var res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?\r\n el.remove();\r\n return res;\r\n}\r\n// Retrieves a jQuery element's computed CSS value as a floating-point number.\r\n// If the queried value is non-numeric (ex: IE can return \"medium\" for border width), will just return zero.\r\nfunction getCssFloat(el, prop) {\r\n return parseFloat(el.css(prop)) || 0;\r\n}\r\n/* Mouse / Touch Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\r\nfunction isPrimaryMouseButton(ev) {\r\n return ev.which === 1 && !ev.ctrlKey;\r\n}\r\nexports.isPrimaryMouseButton = isPrimaryMouseButton;\r\nfunction getEvX(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageX;\r\n }\r\n return ev.pageX;\r\n}\r\nexports.getEvX = getEvX;\r\nfunction getEvY(ev) {\r\n var touches = ev.originalEvent.touches;\r\n // on mobile FF, pageX for touch events is present, but incorrect,\r\n // so, look at touch coordinates first.\r\n if (touches && touches.length) {\r\n return touches[0].pageY;\r\n }\r\n return ev.pageY;\r\n}\r\nexports.getEvY = getEvY;\r\nfunction getEvIsTouch(ev) {\r\n return /^touch/.test(ev.type);\r\n}\r\nexports.getEvIsTouch = getEvIsTouch;\r\nfunction preventSelection(el) {\r\n el.addClass('fc-unselectable')\r\n .on('selectstart', preventDefault);\r\n}\r\nexports.preventSelection = preventSelection;\r\nfunction allowSelection(el) {\r\n el.removeClass('fc-unselectable')\r\n .off('selectstart', preventDefault);\r\n}\r\nexports.allowSelection = allowSelection;\r\n// Stops a mouse/touch event from doing it's native browser action\r\nfunction preventDefault(ev) {\r\n ev.preventDefault();\r\n}\r\nexports.preventDefault = preventDefault;\r\n/* General Geometry Utils\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\r\nfunction intersectRects(rect1, rect2) {\r\n var res = {\r\n left: Math.max(rect1.left, rect2.left),\r\n right: Math.min(rect1.right, rect2.right),\r\n top: Math.max(rect1.top, rect2.top),\r\n bottom: Math.min(rect1.bottom, rect2.bottom)\r\n };\r\n if (res.left < res.right && res.top < res.bottom) {\r\n return res;\r\n }\r\n return false;\r\n}\r\nexports.intersectRects = intersectRects;\r\n// Returns a new point that will have been moved to reside within the given rectangle\r\nfunction constrainPoint(point, rect) {\r\n return {\r\n left: Math.min(Math.max(point.left, rect.left), rect.right),\r\n top: Math.min(Math.max(point.top, rect.top), rect.bottom)\r\n };\r\n}\r\nexports.constrainPoint = constrainPoint;\r\n// Returns a point that is the center of the given rectangle\r\nfunction getRectCenter(rect) {\r\n return {\r\n left: (rect.left + rect.right) / 2,\r\n top: (rect.top + rect.bottom) / 2\r\n };\r\n}\r\nexports.getRectCenter = getRectCenter;\r\n// Subtracts point2's coordinates from point1's coordinates, returning a delta\r\nfunction diffPoints(point1, point2) {\r\n return {\r\n left: point1.left - point2.left,\r\n top: point1.top - point2.top\r\n };\r\n}\r\nexports.diffPoints = diffPoints;\r\n/* Object Ordering by Field\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction parseFieldSpecs(input) {\r\n var specs = [];\r\n var tokens = [];\r\n var i;\r\n var token;\r\n if (typeof input === 'string') {\r\n tokens = input.split(/\\s*,\\s*/);\r\n }\r\n else if (typeof input === 'function') {\r\n tokens = [input];\r\n }\r\n else if ($.isArray(input)) {\r\n tokens = input;\r\n }\r\n for (i = 0; i < tokens.length; i++) {\r\n token = tokens[i];\r\n if (typeof token === 'string') {\r\n specs.push(token.charAt(0) === '-' ?\r\n { field: token.substring(1), order: -1 } :\r\n { field: token, order: 1 });\r\n }\r\n else if (typeof token === 'function') {\r\n specs.push({ func: token });\r\n }\r\n }\r\n return specs;\r\n}\r\nexports.parseFieldSpecs = parseFieldSpecs;\r\nfunction compareByFieldSpecs(obj1, obj2, fieldSpecs, obj1fallback, obj2fallback) {\r\n var i;\r\n var cmp;\r\n for (i = 0; i < fieldSpecs.length; i++) {\r\n cmp = compareByFieldSpec(obj1, obj2, fieldSpecs[i], obj1fallback, obj2fallback);\r\n if (cmp) {\r\n return cmp;\r\n }\r\n }\r\n return 0;\r\n}\r\nexports.compareByFieldSpecs = compareByFieldSpecs;\r\nfunction compareByFieldSpec(obj1, obj2, fieldSpec, obj1fallback, obj2fallback) {\r\n if (fieldSpec.func) {\r\n return fieldSpec.func(obj1, obj2);\r\n }\r\n var val1 = obj1[fieldSpec.field];\r\n var val2 = obj2[fieldSpec.field];\r\n if (val1 == null && obj1fallback) {\r\n val1 = obj1fallback[fieldSpec.field];\r\n }\r\n if (val2 == null && obj2fallback) {\r\n val2 = obj2fallback[fieldSpec.field];\r\n }\r\n return flexibleCompare(val1, val2) * (fieldSpec.order || 1);\r\n}\r\nexports.compareByFieldSpec = compareByFieldSpec;\r\nfunction flexibleCompare(a, b) {\r\n if (!a && !b) {\r\n return 0;\r\n }\r\n if (b == null) {\r\n return -1;\r\n }\r\n if (a == null) {\r\n return 1;\r\n }\r\n if ($.type(a) === 'string' || $.type(b) === 'string') {\r\n return String(a).localeCompare(String(b));\r\n }\r\n return a - b;\r\n}\r\nexports.flexibleCompare = flexibleCompare;\r\n/* Date Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nexports.dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\r\nexports.unitsDesc = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; // descending\r\n// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.\r\n// Moments will have their timezones normalized.\r\nfunction diffDayTime(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),\r\n ms: a.time() - b.time() // time-of-day from day start. disregards timezone\r\n });\r\n}\r\nexports.diffDayTime = diffDayTime;\r\n// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.\r\nfunction diffDay(a, b) {\r\n return moment.duration({\r\n days: a.clone().stripTime().diff(b.clone().stripTime(), 'days')\r\n });\r\n}\r\nexports.diffDay = diffDay;\r\n// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.\r\nfunction diffByUnit(a, b, unit) {\r\n return moment.duration(Math.round(a.diff(b, unit, true)), // returnFloat=true\r\n unit);\r\n}\r\nexports.diffByUnit = diffByUnit;\r\n// Computes the unit name of the largest whole-unit period of time.\r\n// For example, 48 hours will be \"days\" whereas 49 hours will be \"hours\".\r\n// Accepts start/end, a range object, or an original duration object.\r\nfunction computeGreatestUnit(start, end) {\r\n var i;\r\n var unit;\r\n var val;\r\n for (i = 0; i < exports.unitsDesc.length; i++) {\r\n unit = exports.unitsDesc[i];\r\n val = computeRangeAs(unit, start, end);\r\n if (val >= 1 && isInt(val)) {\r\n break;\r\n }\r\n }\r\n return unit; // will be \"milliseconds\" if nothing else matches\r\n}\r\nexports.computeGreatestUnit = computeGreatestUnit;\r\n// like computeGreatestUnit, but has special abilities to interpret the source input for clues\r\nfunction computeDurationGreatestUnit(duration, durationInput) {\r\n var unit = computeGreatestUnit(duration);\r\n // prevent days:7 from being interpreted as a week\r\n if (unit === 'week' && typeof durationInput === 'object' && durationInput.days) {\r\n unit = 'day';\r\n }\r\n return unit;\r\n}\r\nexports.computeDurationGreatestUnit = computeDurationGreatestUnit;\r\n// Computes the number of units (like \"hours\") in the given range.\r\n// Range can be a {start,end} object, separate start/end args, or a Duration.\r\n// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling\r\n// of month-diffing logic (which tends to vary from version to version).\r\nfunction computeRangeAs(unit, start, end) {\r\n if (end != null) {\r\n return end.diff(start, unit, true);\r\n }\r\n else if (moment.isDuration(start)) {\r\n return start.as(unit);\r\n }\r\n else {\r\n return start.end.diff(start.start, unit, true);\r\n }\r\n}\r\n// Intelligently divides a range (specified by a start/end params) by a duration\r\nfunction divideRangeByDuration(start, end, dur) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return (end - start) / dur;\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return end.diff(start, 'months', true) / months;\r\n }\r\n return end.diff(start, 'days', true) / dur.asDays();\r\n}\r\nexports.divideRangeByDuration = divideRangeByDuration;\r\n// Intelligently divides one duration by another\r\nfunction divideDurationByDuration(dur1, dur2) {\r\n var months1;\r\n var months2;\r\n if (durationHasTime(dur1) || durationHasTime(dur2)) {\r\n return dur1 / dur2;\r\n }\r\n months1 = dur1.asMonths();\r\n months2 = dur2.asMonths();\r\n if (Math.abs(months1) >= 1 && isInt(months1) &&\r\n Math.abs(months2) >= 1 && isInt(months2)) {\r\n return months1 / months2;\r\n }\r\n return dur1.asDays() / dur2.asDays();\r\n}\r\nexports.divideDurationByDuration = divideDurationByDuration;\r\n// Intelligently multiplies a duration by a number\r\nfunction multiplyDuration(dur, n) {\r\n var months;\r\n if (durationHasTime(dur)) {\r\n return moment.duration(dur * n);\r\n }\r\n months = dur.asMonths();\r\n if (Math.abs(months) >= 1 && isInt(months)) {\r\n return moment.duration({ months: months * n });\r\n }\r\n return moment.duration({ days: dur.asDays() * n });\r\n}\r\nexports.multiplyDuration = multiplyDuration;\r\n// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)\r\nfunction durationHasTime(dur) {\r\n return Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());\r\n}\r\nexports.durationHasTime = durationHasTime;\r\nfunction isNativeDate(input) {\r\n return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;\r\n}\r\nexports.isNativeDate = isNativeDate;\r\n// Returns a boolean about whether the given input is a time string, like \"06:40:00\" or \"06:00\"\r\nfunction isTimeString(str) {\r\n return typeof str === 'string' &&\r\n /^\\d+\\:\\d+(?:\\:\\d+\\.?(?:\\d{3})?)?$/.test(str);\r\n}\r\nexports.isTimeString = isTimeString;\r\n/* Logging and Debug\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nfunction log() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.log) {\r\n return console.log.apply(console, args);\r\n }\r\n}\r\nexports.log = log;\r\nfunction warn() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var console = window.console;\r\n if (console && console.warn) {\r\n return console.warn.apply(console, args);\r\n }\r\n else {\r\n return log.apply(null, args);\r\n }\r\n}\r\nexports.warn = warn;\r\n/* General Utilities\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar hasOwnPropMethod = {}.hasOwnProperty;\r\n// Merges an array of objects into a single object.\r\n// The second argument allows for an array of property names who's object values will be merged together.\r\nfunction mergeProps(propObjs, complexProps) {\r\n var dest = {};\r\n var i;\r\n var name;\r\n var complexObjs;\r\n var j;\r\n var val;\r\n var props;\r\n if (complexProps) {\r\n for (i = 0; i < complexProps.length; i++) {\r\n name = complexProps[i];\r\n complexObjs = [];\r\n // collect the trailing object values, stopping when a non-object is discovered\r\n for (j = propObjs.length - 1; j >= 0; j--) {\r\n val = propObjs[j][name];\r\n if (typeof val === 'object') {\r\n complexObjs.unshift(val);\r\n }\r\n else if (val !== undefined) {\r\n dest[name] = val; // if there were no objects, this value will be used\r\n break;\r\n }\r\n }\r\n // if the trailing values were objects, use the merged value\r\n if (complexObjs.length) {\r\n dest[name] = mergeProps(complexObjs);\r\n }\r\n }\r\n }\r\n // copy values into the destination, going from last to first\r\n for (i = propObjs.length - 1; i >= 0; i--) {\r\n props = propObjs[i];\r\n for (name in props) {\r\n if (!(name in dest)) {\r\n dest[name] = props[name];\r\n }\r\n }\r\n }\r\n return dest;\r\n}\r\nexports.mergeProps = mergeProps;\r\nfunction copyOwnProps(src, dest) {\r\n for (var name_1 in src) {\r\n if (hasOwnProp(src, name_1)) {\r\n dest[name_1] = src[name_1];\r\n }\r\n }\r\n}\r\nexports.copyOwnProps = copyOwnProps;\r\nfunction hasOwnProp(obj, name) {\r\n return hasOwnPropMethod.call(obj, name);\r\n}\r\nexports.hasOwnProp = hasOwnProp;\r\nfunction applyAll(functions, thisObj, args) {\r\n if ($.isFunction(functions)) {\r\n functions = [functions];\r\n }\r\n if (functions) {\r\n var i = void 0;\r\n var ret = void 0;\r\n for (i = 0; i < functions.length; i++) {\r\n ret = functions[i].apply(thisObj, args) || ret;\r\n }\r\n return ret;\r\n }\r\n}\r\nexports.applyAll = applyAll;\r\nfunction removeMatching(array, testFunc) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (testFunc(array[i])) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeMatching = removeMatching;\r\nfunction removeExact(array, exactVal) {\r\n var removeCnt = 0;\r\n var i = 0;\r\n while (i < array.length) {\r\n if (array[i] === exactVal) {\r\n array.splice(i, 1);\r\n removeCnt++;\r\n }\r\n else {\r\n i++;\r\n }\r\n }\r\n return removeCnt;\r\n}\r\nexports.removeExact = removeExact;\r\nfunction isArraysEqual(a0, a1) {\r\n var len = a0.length;\r\n var i;\r\n if (len == null || len !== a1.length) {\r\n return false;\r\n }\r\n for (i = 0; i < len; i++) {\r\n if (a0[i] !== a1[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nexports.isArraysEqual = isArraysEqual;\r\nfunction firstDefined() {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n for (var i = 0; i < args.length; i++) {\r\n if (args[i] !== undefined) {\r\n return args[i];\r\n }\r\n }\r\n}\r\nexports.firstDefined = firstDefined;\r\nfunction htmlEscape(s) {\r\n return (s + '').replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/'/g, ''')\r\n .replace(/\"/g, '"')\r\n .replace(/\\n/g, '
');\r\n}\r\nexports.htmlEscape = htmlEscape;\r\nfunction stripHtmlEntities(text) {\r\n return text.replace(/&.*?;/g, '');\r\n}\r\nexports.stripHtmlEntities = stripHtmlEntities;\r\n// Given a hash of CSS properties, returns a string of CSS.\r\n// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\r\nfunction cssToStr(cssProps) {\r\n var statements = [];\r\n $.each(cssProps, function (name, val) {\r\n if (val != null) {\r\n statements.push(name + ':' + val);\r\n }\r\n });\r\n return statements.join(';');\r\n}\r\nexports.cssToStr = cssToStr;\r\n// Given an object hash of HTML attribute names to values,\r\n// generates a string that can be injected between < > in HTML\r\nfunction attrsToStr(attrs) {\r\n var parts = [];\r\n $.each(attrs, function (name, val) {\r\n if (val != null) {\r\n parts.push(name + '=\"' + htmlEscape(val) + '\"');\r\n }\r\n });\r\n return parts.join(' ');\r\n}\r\nexports.attrsToStr = attrsToStr;\r\nfunction capitaliseFirstLetter(str) {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\nexports.capitaliseFirstLetter = capitaliseFirstLetter;\r\nfunction compareNumbers(a, b) {\r\n return a - b;\r\n}\r\nexports.compareNumbers = compareNumbers;\r\nfunction isInt(n) {\r\n return n % 1 === 0;\r\n}\r\nexports.isInt = isInt;\r\n// Returns a method bound to the given object context.\r\n// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with\r\n// different contexts as identical when binding/unbinding events.\r\nfunction proxy(obj, methodName) {\r\n var method = obj[methodName];\r\n return function () {\r\n return method.apply(obj, arguments);\r\n };\r\n}\r\nexports.proxy = proxy;\r\n// Returns a function, that, as long as it continues to be invoked, will not\r\n// be triggered. The function will be called after it stops being called for\r\n// N milliseconds. If `immediate` is passed, trigger the function on the\r\n// leading edge, instead of the trailing.\r\n// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\r\nfunction debounce(func, wait, immediate) {\r\n if (immediate === void 0) { immediate = false; }\r\n var timeout;\r\n var args;\r\n var context;\r\n var timestamp;\r\n var result;\r\n var later = function () {\r\n var last = +new Date() - timestamp;\r\n if (last < wait) {\r\n timeout = setTimeout(later, wait - last);\r\n }\r\n else {\r\n timeout = null;\r\n if (!immediate) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n }\r\n };\r\n return function () {\r\n context = this;\r\n args = arguments;\r\n timestamp = +new Date();\r\n var callNow = immediate && !timeout;\r\n if (!timeout) {\r\n timeout = setTimeout(later, wait);\r\n }\r\n if (callNow) {\r\n result = func.apply(context, args);\r\n context = args = null;\r\n }\r\n return result;\r\n };\r\n}\r\nexports.debounce = debounce;\r\n\r\n\r\n/***/ }),\r\n/* 5 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange = /** @class */ (function () {\r\n function UnzonedRange(startInput, endInput) {\r\n // TODO: move these into footprint.\r\n // Especially, doesn't make sense for null startMs/endMs.\r\n this.isStart = true;\r\n this.isEnd = true;\r\n if (moment.isMoment(startInput)) {\r\n startInput = startInput.clone().stripZone();\r\n }\r\n if (moment.isMoment(endInput)) {\r\n endInput = endInput.clone().stripZone();\r\n }\r\n if (startInput) {\r\n this.startMs = startInput.valueOf();\r\n }\r\n if (endInput) {\r\n this.endMs = endInput.valueOf();\r\n }\r\n }\r\n /*\r\n SIDEEFFECT: will mutate eventRanges.\r\n Will return a new array result.\r\n Only works for non-open-ended ranges.\r\n */\r\n UnzonedRange.invertRanges = function (ranges, constraintRange) {\r\n var invertedRanges = [];\r\n var startMs = constraintRange.startMs; // the end of the previous range. the start of the new range\r\n var i;\r\n var dateRange;\r\n // ranges need to be in order. required for our date-walking algorithm\r\n ranges.sort(compareUnzonedRanges);\r\n for (i = 0; i < ranges.length; i++) {\r\n dateRange = ranges[i];\r\n // add the span of time before the event (if there is any)\r\n if (dateRange.startMs > startMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, dateRange.startMs));\r\n }\r\n if (dateRange.endMs > startMs) {\r\n startMs = dateRange.endMs;\r\n }\r\n }\r\n // add the span of time after the last event (if there is any)\r\n if (startMs < constraintRange.endMs) {\r\n invertedRanges.push(new UnzonedRange(startMs, constraintRange.endMs));\r\n }\r\n return invertedRanges;\r\n };\r\n UnzonedRange.prototype.intersect = function (otherRange) {\r\n var startMs = this.startMs;\r\n var endMs = this.endMs;\r\n var newRange = null;\r\n if (otherRange.startMs != null) {\r\n if (startMs == null) {\r\n startMs = otherRange.startMs;\r\n }\r\n else {\r\n startMs = Math.max(startMs, otherRange.startMs);\r\n }\r\n }\r\n if (otherRange.endMs != null) {\r\n if (endMs == null) {\r\n endMs = otherRange.endMs;\r\n }\r\n else {\r\n endMs = Math.min(endMs, otherRange.endMs);\r\n }\r\n }\r\n if (startMs == null || endMs == null || startMs < endMs) {\r\n newRange = new UnzonedRange(startMs, endMs);\r\n newRange.isStart = this.isStart && startMs === this.startMs;\r\n newRange.isEnd = this.isEnd && endMs === this.endMs;\r\n }\r\n return newRange;\r\n };\r\n UnzonedRange.prototype.intersectsWith = function (otherRange) {\r\n return (this.endMs == null || otherRange.startMs == null || this.endMs > otherRange.startMs) &&\r\n (this.startMs == null || otherRange.endMs == null || this.startMs < otherRange.endMs);\r\n };\r\n UnzonedRange.prototype.containsRange = function (innerRange) {\r\n return (this.startMs == null || (innerRange.startMs != null && innerRange.startMs >= this.startMs)) &&\r\n (this.endMs == null || (innerRange.endMs != null && innerRange.endMs <= this.endMs));\r\n };\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n UnzonedRange.prototype.containsDate = function (date) {\r\n var ms = date.valueOf();\r\n return (this.startMs == null || ms >= this.startMs) &&\r\n (this.endMs == null || ms < this.endMs);\r\n };\r\n // If the given date is not within the given range, move it inside.\r\n // (If it's past the end, make it one millisecond before the end).\r\n // `date` can be a moment, a Date, or a millisecond time.\r\n // Returns a MS-time.\r\n UnzonedRange.prototype.constrainDate = function (date) {\r\n var ms = date.valueOf();\r\n if (this.startMs != null && ms < this.startMs) {\r\n ms = this.startMs;\r\n }\r\n if (this.endMs != null && ms >= this.endMs) {\r\n ms = this.endMs - 1;\r\n }\r\n return ms;\r\n };\r\n UnzonedRange.prototype.equals = function (otherRange) {\r\n return this.startMs === otherRange.startMs && this.endMs === otherRange.endMs;\r\n };\r\n UnzonedRange.prototype.clone = function () {\r\n var range = new UnzonedRange(this.startMs, this.endMs);\r\n range.isStart = this.isStart;\r\n range.isEnd = this.isEnd;\r\n return range;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getStart = function () {\r\n if (this.startMs != null) {\r\n return moment_ext_1.default.utc(this.startMs).stripZone();\r\n }\r\n return null;\r\n };\r\n // Returns an ambig-zoned moment from startMs.\r\n // BEWARE: returned moment is not localized.\r\n // Formatting and start-of-week will be default.\r\n UnzonedRange.prototype.getEnd = function () {\r\n if (this.endMs != null) {\r\n return moment_ext_1.default.utc(this.endMs).stripZone();\r\n }\r\n return null;\r\n };\r\n UnzonedRange.prototype.as = function (unit) {\r\n return moment.utc(this.endMs).diff(moment.utc(this.startMs), unit, true);\r\n };\r\n return UnzonedRange;\r\n}());\r\nexports.default = UnzonedRange;\r\n/*\r\nOnly works for non-open-ended ranges.\r\n*/\r\nfunction compareUnzonedRanges(range1, range2) {\r\n return range1.startMs - range2.startMs; // earlier ranges go first\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 6 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventSource, _super);\r\n // can we do away with calendar? at least for the abstract?\r\n // useful for buildEventDef\r\n function EventSource(calendar) {\r\n var _this = _super.call(this) || this;\r\n _this.calendar = calendar;\r\n _this.className = [];\r\n _this.uid = String(EventSource.uuid++);\r\n return _this;\r\n }\r\n /*\r\n rawInput can be any data type!\r\n */\r\n EventSource.parse = function (rawInput, calendar) {\r\n var source = new this(calendar);\r\n if (typeof rawInput === 'object') {\r\n if (source.applyProps(rawInput)) {\r\n return source;\r\n }\r\n }\r\n return false;\r\n };\r\n EventSource.normalizeId = function (id) {\r\n if (id) {\r\n return String(id);\r\n }\r\n return null;\r\n };\r\n EventSource.prototype.fetch = function (start, end, timezone) {\r\n // subclasses must implement. must return a promise.\r\n };\r\n EventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n // optional for subclasses to implement\r\n };\r\n EventSource.prototype.removeAllEventDefs = function () {\r\n // optional for subclasses to implement\r\n };\r\n /*\r\n For compairing/matching\r\n */\r\n EventSource.prototype.getPrimitive = function (otherSource) {\r\n // subclasses must implement\r\n };\r\n EventSource.prototype.parseEventDefs = function (rawEventDefs) {\r\n var i;\r\n var eventDef;\r\n var eventDefs = [];\r\n for (i = 0; i < rawEventDefs.length; i++) {\r\n eventDef = this.parseEventDef(rawEventDefs[i]);\r\n if (eventDef) {\r\n eventDefs.push(eventDef);\r\n }\r\n }\r\n return eventDefs;\r\n };\r\n EventSource.prototype.parseEventDef = function (rawInput) {\r\n var calendarTransform = this.calendar.opt('eventDataTransform');\r\n var sourceTransform = this.eventDataTransform;\r\n if (calendarTransform) {\r\n rawInput = calendarTransform(rawInput, this.calendar);\r\n }\r\n if (sourceTransform) {\r\n rawInput = sourceTransform(rawInput, this.calendar);\r\n }\r\n return EventDefParser_1.default.parse(rawInput, this);\r\n };\r\n EventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventSource.normalizeId(rawProps.id);\r\n }\r\n // TODO: converge with EventDef\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n else if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventSource.uuid = 0;\r\n EventSource.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventSource.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventSource;\r\n}(Class_1.default));\r\nexports.default = EventSource;\r\nParsableModelMixin_1.default.mixInto(EventSource);\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nEventSource.defineStandardProps({\r\n // manually process...\r\n id: false,\r\n className: false,\r\n // automatically transfer...\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n rendering: true,\r\n overlap: true,\r\n constraint: true,\r\n allDayDefault: true,\r\n eventDataTransform: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 7 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUtility methods for easily listening to events on another object,\r\nand more importantly, easily unlistening from them.\r\n\r\nUSAGE:\r\n import { default as ListenerMixin, ListenerInterface } from './ListenerMixin'\r\nin class:\r\n listenTo: ListenerInterface['listenTo']\r\n stopListeningTo: ListenerInterface['stopListeningTo']\r\nafter class:\r\n ListenerMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar guid = 0;\r\nvar ListenerMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListenerMixin, _super);\r\n function ListenerMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Given an `other` object that has on/off methods, bind the given `callback` to an event by the given name.\r\n The `callback` will be called with the `this` context of the object that .listenTo is being called on.\r\n Can be called:\r\n .listenTo(other, eventName, callback)\r\n OR\r\n .listenTo(other, {\r\n eventName1: callback1,\r\n eventName2: callback2\r\n })\r\n */\r\n ListenerMixin.prototype.listenTo = function (other, arg, callback) {\r\n if (typeof arg === 'object') {\r\n for (var eventName in arg) {\r\n if (arg.hasOwnProperty(eventName)) {\r\n this.listenTo(other, eventName, arg[eventName]);\r\n }\r\n }\r\n }\r\n else if (typeof arg === 'string') {\r\n other.on(arg + '.' + this.getListenerNamespace(), // use event namespacing to identify this object\r\n $.proxy(callback, this) // always use `this` context\r\n // the usually-undesired jQuery guid behavior doesn't matter,\r\n // because we always unbind via namespace\r\n );\r\n }\r\n };\r\n /*\r\n Causes the current object to stop listening to events on the `other` object.\r\n `eventName` is optional. If omitted, will stop listening to ALL events on `other`.\r\n */\r\n ListenerMixin.prototype.stopListeningTo = function (other, eventName) {\r\n other.off((eventName || '') + '.' + this.getListenerNamespace());\r\n };\r\n /*\r\n Returns a string, unique to this object, to be used for event namespacing\r\n */\r\n ListenerMixin.prototype.getListenerNamespace = function () {\r\n if (this.listenerId == null) {\r\n this.listenerId = guid++;\r\n }\r\n return '_listener' + this.listenerId;\r\n };\r\n return ListenerMixin;\r\n}(Mixin_1.default));\r\nexports.default = ListenerMixin;\r\n\r\n\r\n/***/ }),\r\n/* 8 */,\r\n/* 9 */,\r\n/* 10 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ambigDateOfMonthRegex = /^\\s*\\d{4}-\\d\\d$/;\r\nvar ambigTimeOrZoneRegex = /^\\s*\\d{4}-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?)?$/;\r\nvar newMomentProto = moment.fn; // where we will attach our new methods\r\nexports.newMomentProto = newMomentProto;\r\nvar oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods\r\nexports.oldMomentProto = oldMomentProto;\r\n// tell momentjs to transfer these properties upon clone\r\nvar momentProperties = moment.momentProperties;\r\nmomentProperties.push('_fullCalendar');\r\nmomentProperties.push('_ambigTime');\r\nmomentProperties.push('_ambigZone');\r\n/*\r\nCall this if you want Moment's original format method to be used\r\n*/\r\nfunction oldMomentFormat(mom, formatStr) {\r\n return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js\r\n}\r\nexports.oldMomentFormat = oldMomentFormat;\r\n// Creating\r\n// -------------------------------------------------------------------------------------------------\r\n// Creates a new moment, similar to the vanilla moment(...) constructor, but with\r\n// extra features (ambiguous time, enhanced formatting). When given an existing moment,\r\n// it will function as a clone (and retain the zone of the moment). Anything else will\r\n// result in a moment in the local zone.\r\nvar momentExt = function () {\r\n return makeMoment(arguments);\r\n};\r\nexports.default = momentExt;\r\n// Sames as momentExt, but forces the resulting moment to be in the UTC timezone.\r\nmomentExt.utc = function () {\r\n var mom = makeMoment(arguments, true);\r\n // Force it into UTC because makeMoment doesn't guarantee it\r\n // (if given a pre-existing moment for example)\r\n if (mom.hasTime()) {\r\n mom.utc();\r\n }\r\n return mom;\r\n};\r\n// Same as momentExt, but when given an ISO8601 string, the timezone offset is preserved.\r\n// ISO8601 strings with no timezone offset will become ambiguously zoned.\r\nmomentExt.parseZone = function () {\r\n return makeMoment(arguments, true, true);\r\n};\r\n// Builds an enhanced moment from args. When given an existing moment, it clones. When given a\r\n// native Date, or called with no arguments (the current time), the resulting moment will be local.\r\n// Anything else needs to be \"parsed\" (a string or an array), and will be affected by:\r\n// parseAsUTC - if there is no zone information, should we parse the input in UTC?\r\n// parseZone - if there is zone information, should we force the zone of the moment?\r\nfunction makeMoment(args, parseAsUTC, parseZone) {\r\n if (parseAsUTC === void 0) { parseAsUTC = false; }\r\n if (parseZone === void 0) { parseZone = false; }\r\n var input = args[0];\r\n var isSingleString = args.length === 1 && typeof input === 'string';\r\n var isAmbigTime;\r\n var isAmbigZone;\r\n var ambigMatch;\r\n var mom;\r\n if (moment.isMoment(input) || util_1.isNativeDate(input) || input === undefined) {\r\n mom = moment.apply(null, args);\r\n }\r\n else {\r\n isAmbigTime = false;\r\n isAmbigZone = false;\r\n if (isSingleString) {\r\n if (ambigDateOfMonthRegex.test(input)) {\r\n // accept strings like '2014-05', but convert to the first of the month\r\n input += '-01';\r\n args = [input]; // for when we pass it on to moment's constructor\r\n isAmbigTime = true;\r\n isAmbigZone = true;\r\n }\r\n else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {\r\n isAmbigTime = !ambigMatch[5]; // no time part?\r\n isAmbigZone = true;\r\n }\r\n }\r\n else if ($.isArray(input)) {\r\n // arrays have no timezone information, so assume ambiguous zone\r\n isAmbigZone = true;\r\n }\r\n // otherwise, probably a string with a format\r\n if (parseAsUTC || isAmbigTime) {\r\n mom = moment.utc.apply(moment, args);\r\n }\r\n else {\r\n mom = moment.apply(null, args);\r\n }\r\n if (isAmbigTime) {\r\n mom._ambigTime = true;\r\n mom._ambigZone = true; // ambiguous time always means ambiguous zone\r\n }\r\n else if (parseZone) {\r\n if (isAmbigZone) {\r\n mom._ambigZone = true;\r\n }\r\n else if (isSingleString) {\r\n mom.utcOffset(input); // if not a valid zone, will assign UTC\r\n }\r\n }\r\n }\r\n mom._fullCalendar = true; // flag for extended functionality\r\n return mom;\r\n}\r\n// Week Number\r\n// -------------------------------------------------------------------------------------------------\r\n// Returns the week number, considering the locale's custom week number calcuation\r\n// `weeks` is an alias for `week`\r\nnewMomentProto.week = newMomentProto.weeks = function (input) {\r\n var weekCalc = this._locale._fullCalendar_weekCalc;\r\n if (input == null && typeof weekCalc === 'function') {\r\n return weekCalc(this);\r\n }\r\n else if (weekCalc === 'ISO') {\r\n return oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter\r\n }\r\n return oldMomentProto.week.apply(this, arguments); // local getter/setter\r\n};\r\n// Time-of-day\r\n// -------------------------------------------------------------------------------------------------\r\n// GETTER\r\n// Returns a Duration with the hours/minutes/seconds/ms values of the moment.\r\n// If the moment has an ambiguous time, a duration of 00:00 will be returned.\r\n//\r\n// SETTER\r\n// You can supply a Duration, a Moment, or a Duration-like argument.\r\n// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.\r\nnewMomentProto.time = function (time) {\r\n // Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.\r\n // `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.\r\n if (!this._fullCalendar) {\r\n return oldMomentProto.time.apply(this, arguments);\r\n }\r\n if (time == null) {\r\n return moment.duration({\r\n hours: this.hours(),\r\n minutes: this.minutes(),\r\n seconds: this.seconds(),\r\n milliseconds: this.milliseconds()\r\n });\r\n }\r\n else {\r\n this._ambigTime = false; // mark that the moment now has a time\r\n if (!moment.isDuration(time) && !moment.isMoment(time)) {\r\n time = moment.duration(time);\r\n }\r\n // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).\r\n // Only for Duration times, not Moment times.\r\n var dayHours = 0;\r\n if (moment.isDuration(time)) {\r\n dayHours = Math.floor(time.asDays()) * 24;\r\n }\r\n // We need to set the individual fields.\r\n // Can't use startOf('day') then add duration. In case of DST at start of day.\r\n return this.hours(dayHours + time.hours())\r\n .minutes(time.minutes())\r\n .seconds(time.seconds())\r\n .milliseconds(time.milliseconds());\r\n }\r\n};\r\n// Converts the moment to UTC, stripping out its time-of-day and timezone offset,\r\n// but preserving its YMD. A moment with a stripped time will display no time\r\n// nor timezone offset when .format() is called.\r\nnewMomentProto.stripTime = function () {\r\n if (!this._ambigTime) {\r\n this.utc(true); // keepLocalTime=true (for keeping *date* value)\r\n // set time to zero\r\n this.set({\r\n hours: 0,\r\n minutes: 0,\r\n seconds: 0,\r\n ms: 0\r\n });\r\n // Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears all ambig flags.\r\n this._ambigTime = true;\r\n this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns if the moment has a non-ambiguous time (boolean)\r\nnewMomentProto.hasTime = function () {\r\n return !this._ambigTime;\r\n};\r\n// Timezone\r\n// -------------------------------------------------------------------------------------------------\r\n// Converts the moment to UTC, stripping out its timezone offset, but preserving its\r\n// YMD and time-of-day. A moment with a stripped timezone offset will display no\r\n// timezone offset when .format() is called.\r\nnewMomentProto.stripZone = function () {\r\n var wasAmbigTime;\r\n if (!this._ambigZone) {\r\n wasAmbigTime = this._ambigTime;\r\n this.utc(true); // keepLocalTime=true (for keeping date and time values)\r\n // the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore\r\n this._ambigTime = wasAmbigTime || false;\r\n // Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),\r\n // which clears the ambig flags.\r\n this._ambigZone = true;\r\n }\r\n return this; // for chaining\r\n};\r\n// Returns of the moment has a non-ambiguous timezone offset (boolean)\r\nnewMomentProto.hasZone = function () {\r\n return !this._ambigZone;\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.local = function (keepLocalTime) {\r\n // for when converting from ambiguously-zoned to local,\r\n // keep the time values when converting from UTC -> local\r\n oldMomentProto.local.call(this, this._ambigZone || keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this; // for chaining\r\n};\r\n// implicitly marks a zone\r\nnewMomentProto.utc = function (keepLocalTime) {\r\n oldMomentProto.utc.call(this, keepLocalTime);\r\n // ensure non-ambiguous\r\n // this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n return this;\r\n};\r\n// implicitly marks a zone (will probably get called upon .utc() and .local())\r\nnewMomentProto.utcOffset = function (tzo) {\r\n if (tzo != null) {\r\n // these assignments needs to happen before the original zone method is called.\r\n // I forget why, something to do with a browser crash.\r\n this._ambigTime = false;\r\n this._ambigZone = false;\r\n }\r\n return oldMomentProto.utcOffset.apply(this, arguments);\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 11 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'\r\nin class:\r\n on: EmitterInterface['on']\r\n one: EmitterInterface['one']\r\n off: EmitterInterface['off']\r\n trigger: EmitterInterface['trigger']\r\n triggerWith: EmitterInterface['triggerWith']\r\n hasHandlers: EmitterInterface['hasHandlers']\r\nafter class:\r\n EmitterMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar EmitterMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(EmitterMixin, _super);\r\n function EmitterMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // jQuery-ification via $(this) allows a non-DOM object to have\r\n // the same event handling capabilities (including namespaces).\r\n EmitterMixin.prototype.on = function (types, handler) {\r\n $(this).on(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.one = function (types, handler) {\r\n $(this).one(types, this._prepareIntercept(handler));\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype._prepareIntercept = function (handler) {\r\n // handlers are always called with an \"event\" object as their first param.\r\n // sneak the `this` context and arguments into the extra parameter object\r\n // and forward them on to the original handler.\r\n var intercept = function (ev, extra) {\r\n return handler.apply(extra.context || this, extra.args || []);\r\n };\r\n // mimick jQuery's internal \"proxy\" system (risky, I know)\r\n // causing all functions with the same .guid to appear to be the same.\r\n // https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448\r\n // this is needed for calling .off with the original non-intercept handler.\r\n if (!handler.guid) {\r\n handler.guid = $.guid++;\r\n }\r\n intercept.guid = handler.guid;\r\n return intercept;\r\n };\r\n EmitterMixin.prototype.off = function (types, handler) {\r\n $(this).off(types, handler);\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.trigger = function (types) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // pass in \"extra\" info to the intercept\r\n $(this).triggerHandler(types, { args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.triggerWith = function (types, context, args) {\r\n // `triggerHandler` is less reliant on the DOM compared to `trigger`.\r\n // pass in \"extra\" info to the intercept.\r\n $(this).triggerHandler(types, { context: context, args: args });\r\n return this; // for chaining\r\n };\r\n EmitterMixin.prototype.hasHandlers = function (type) {\r\n var hash = $._data(this, 'events'); // http://blog.jquery.com/2012/08/09/jquery-1-8-released/\r\n return hash && hash[type] && hash[type].length > 0;\r\n };\r\n return EmitterMixin;\r\n}(Mixin_1.default));\r\nexports.default = EmitterMixin;\r\n\r\n\r\n/***/ }),\r\n/* 12 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar ComponentFootprint = /** @class */ (function () {\r\n function ComponentFootprint(unzonedRange, isAllDay) {\r\n this.isAllDay = false; // component can choose to ignore this\r\n this.unzonedRange = unzonedRange;\r\n this.isAllDay = isAllDay;\r\n }\r\n /*\r\n Only works for non-open-ended ranges.\r\n */\r\n ComponentFootprint.prototype.toLegacy = function (calendar) {\r\n return {\r\n start: calendar.msToMoment(this.unzonedRange.startMs, this.isAllDay),\r\n end: calendar.msToMoment(this.unzonedRange.endMs, this.isAllDay)\r\n };\r\n };\r\n return ComponentFootprint;\r\n}());\r\nexports.default = ComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 13 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar SingleEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(SingleEventDef, _super);\r\n function SingleEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n Will receive start/end params, but will be ignored.\r\n */\r\n SingleEventDef.prototype.buildInstances = function () {\r\n return [this.buildInstance()];\r\n };\r\n SingleEventDef.prototype.buildInstance = function () {\r\n return new EventInstance_1.default(this, // definition\r\n this.dateProfile);\r\n };\r\n SingleEventDef.prototype.isAllDay = function () {\r\n return this.dateProfile.isAllDay();\r\n };\r\n SingleEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n def.dateProfile = this.dateProfile;\r\n return def;\r\n };\r\n SingleEventDef.prototype.rezone = function () {\r\n var calendar = this.source.calendar;\r\n var dateProfile = this.dateProfile;\r\n this.dateProfile = new EventDateProfile_1.default(calendar.moment(dateProfile.start), dateProfile.end ? calendar.moment(dateProfile.end) : null, calendar);\r\n };\r\n /*\r\n NOTE: if super-method fails, should still attempt to apply\r\n */\r\n SingleEventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n var dateProfile = EventDateProfile_1.default.parse(rawProps, this.source); // returns null on failure\r\n if (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n // make sure `date` shows up in the legacy event objects as-is\r\n if (rawProps.date != null) {\r\n this.miscProps.date = rawProps.date;\r\n }\r\n return superSuccess;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n return SingleEventDef;\r\n}(EventDef_1.default));\r\nexports.default = SingleEventDef;\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nSingleEventDef.defineStandardProps({\r\n start: false,\r\n date: false,\r\n end: false,\r\n allDay: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 14 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Mixin = /** @class */ (function () {\r\n function Mixin() {\r\n }\r\n Mixin.mixInto = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n if (!destClass.prototype[name]) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n }\r\n });\r\n };\r\n /*\r\n will override existing methods\r\n TODO: remove! not used anymore\r\n */\r\n Mixin.mixOver = function (destClass) {\r\n var _this = this;\r\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\r\n destClass.prototype[name] = _this.prototype[name];\r\n });\r\n };\r\n return Mixin;\r\n}());\r\nexports.default = Mixin;\r\n\r\n\r\n/***/ }),\r\n/* 15 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Interaction = /** @class */ (function () {\r\n function Interaction(component) {\r\n this.view = component._getView();\r\n this.component = component;\r\n }\r\n Interaction.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n Interaction.prototype.end = function () {\r\n // subclasses can implement\r\n };\r\n return Interaction;\r\n}());\r\nexports.default = Interaction;\r\n\r\n\r\n/***/ }),\r\n/* 16 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.version = '3.9.0';\r\n// When introducing internal API incompatibilities (where fullcalendar plugins would break),\r\n// the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)\r\n// and the below integer should be incremented.\r\nexports.internalApiVersion = 12;\r\nvar util_1 = __webpack_require__(4);\r\nexports.applyAll = util_1.applyAll;\r\nexports.debounce = util_1.debounce;\r\nexports.isInt = util_1.isInt;\r\nexports.htmlEscape = util_1.htmlEscape;\r\nexports.cssToStr = util_1.cssToStr;\r\nexports.proxy = util_1.proxy;\r\nexports.capitaliseFirstLetter = util_1.capitaliseFirstLetter;\r\nexports.getOuterRect = util_1.getOuterRect;\r\nexports.getClientRect = util_1.getClientRect;\r\nexports.getContentRect = util_1.getContentRect;\r\nexports.getScrollbarWidths = util_1.getScrollbarWidths;\r\nexports.preventDefault = util_1.preventDefault;\r\nexports.parseFieldSpecs = util_1.parseFieldSpecs;\r\nexports.compareByFieldSpecs = util_1.compareByFieldSpecs;\r\nexports.compareByFieldSpec = util_1.compareByFieldSpec;\r\nexports.flexibleCompare = util_1.flexibleCompare;\r\nexports.computeGreatestUnit = util_1.computeGreatestUnit;\r\nexports.divideRangeByDuration = util_1.divideRangeByDuration;\r\nexports.divideDurationByDuration = util_1.divideDurationByDuration;\r\nexports.multiplyDuration = util_1.multiplyDuration;\r\nexports.durationHasTime = util_1.durationHasTime;\r\nexports.log = util_1.log;\r\nexports.warn = util_1.warn;\r\nexports.removeExact = util_1.removeExact;\r\nexports.intersectRects = util_1.intersectRects;\r\nvar date_formatting_1 = __webpack_require__(47);\r\nexports.formatDate = date_formatting_1.formatDate;\r\nexports.formatRange = date_formatting_1.formatRange;\r\nexports.queryMostGranularFormatUnit = date_formatting_1.queryMostGranularFormatUnit;\r\nvar locale_1 = __webpack_require__(31);\r\nexports.datepickerLocale = locale_1.datepickerLocale;\r\nexports.locale = locale_1.locale;\r\nvar moment_ext_1 = __webpack_require__(10);\r\nexports.moment = moment_ext_1.default;\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nexports.EmitterMixin = EmitterMixin_1.default;\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexports.ListenerMixin = ListenerMixin_1.default;\r\nvar Model_1 = __webpack_require__(48);\r\nexports.Model = Model_1.default;\r\nvar Constraints_1 = __webpack_require__(207);\r\nexports.Constraints = Constraints_1.default;\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nexports.UnzonedRange = UnzonedRange_1.default;\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nexports.ComponentFootprint = ComponentFootprint_1.default;\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nexports.BusinessHourGenerator = BusinessHourGenerator_1.default;\r\nvar EventDef_1 = __webpack_require__(34);\r\nexports.EventDef = EventDef_1.default;\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nexports.EventDefMutation = EventDefMutation_1.default;\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nexports.EventSourceParser = EventSourceParser_1.default;\r\nvar EventSource_1 = __webpack_require__(6);\r\nexports.EventSource = EventSource_1.default;\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nexports.defineThemeSystem = ThemeRegistry_1.defineThemeSystem;\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nexports.EventInstanceGroup = EventInstanceGroup_1.default;\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nexports.ArrayEventSource = ArrayEventSource_1.default;\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nexports.FuncEventSource = FuncEventSource_1.default;\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nexports.JsonFeedEventSource = JsonFeedEventSource_1.default;\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nexports.EventFootprint = EventFootprint_1.default;\r\nvar Class_1 = __webpack_require__(33);\r\nexports.Class = Class_1.default;\r\nvar Mixin_1 = __webpack_require__(14);\r\nexports.Mixin = Mixin_1.default;\r\nvar CoordCache_1 = __webpack_require__(53);\r\nexports.CoordCache = CoordCache_1.default;\r\nvar DragListener_1 = __webpack_require__(54);\r\nexports.DragListener = DragListener_1.default;\r\nvar Promise_1 = __webpack_require__(20);\r\nexports.Promise = Promise_1.default;\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nexports.TaskQueue = TaskQueue_1.default;\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nexports.RenderQueue = RenderQueue_1.default;\r\nvar Scroller_1 = __webpack_require__(39);\r\nexports.Scroller = Scroller_1.default;\r\nvar Theme_1 = __webpack_require__(19);\r\nexports.Theme = Theme_1.default;\r\nvar DateComponent_1 = __webpack_require__(219);\r\nexports.DateComponent = DateComponent_1.default;\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nexports.InteractiveDateComponent = InteractiveDateComponent_1.default;\r\nvar Calendar_1 = __webpack_require__(220);\r\nexports.Calendar = Calendar_1.default;\r\nvar View_1 = __webpack_require__(41);\r\nexports.View = View_1.default;\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nexports.defineView = ViewRegistry_1.defineView;\r\nexports.getViewConfig = ViewRegistry_1.getViewConfig;\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nexports.DayTableMixin = DayTableMixin_1.default;\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nexports.BusinessHourRenderer = BusinessHourRenderer_1.default;\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nexports.EventRenderer = EventRenderer_1.default;\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nexports.FillRenderer = FillRenderer_1.default;\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nexports.HelperRenderer = HelperRenderer_1.default;\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nexports.ExternalDropping = ExternalDropping_1.default;\r\nvar EventResizing_1 = __webpack_require__(223);\r\nexports.EventResizing = EventResizing_1.default;\r\nvar EventPointing_1 = __webpack_require__(59);\r\nexports.EventPointing = EventPointing_1.default;\r\nvar EventDragging_1 = __webpack_require__(224);\r\nexports.EventDragging = EventDragging_1.default;\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nexports.DateSelecting = DateSelecting_1.default;\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nexports.StandardInteractionsMixin = StandardInteractionsMixin_1.default;\r\nvar AgendaView_1 = __webpack_require__(226);\r\nexports.AgendaView = AgendaView_1.default;\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nexports.TimeGrid = TimeGrid_1.default;\r\nvar DayGrid_1 = __webpack_require__(61);\r\nexports.DayGrid = DayGrid_1.default;\r\nvar BasicView_1 = __webpack_require__(62);\r\nexports.BasicView = BasicView_1.default;\r\nvar MonthView_1 = __webpack_require__(229);\r\nexports.MonthView = MonthView_1.default;\r\nvar ListView_1 = __webpack_require__(230);\r\nexports.ListView = ListView_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 17 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/*\r\nMeant to be immutable\r\n*/\r\nvar EventDateProfile = /** @class */ (function () {\r\n function EventDateProfile(start, end, calendar) {\r\n this.start = start;\r\n this.end = end || null;\r\n this.unzonedRange = this.buildUnzonedRange(calendar);\r\n }\r\n /*\r\n Needs an EventSource object\r\n */\r\n EventDateProfile.parse = function (rawProps, source) {\r\n var startInput = rawProps.start || rawProps.date;\r\n var endInput = rawProps.end;\r\n if (!startInput) {\r\n return false;\r\n }\r\n var calendar = source.calendar;\r\n var start = calendar.moment(startInput);\r\n var end = endInput ? calendar.moment(endInput) : null;\r\n var forcedAllDay = rawProps.allDay;\r\n var forceEventDuration = calendar.opt('forceEventDuration');\r\n if (!start.isValid()) {\r\n return false;\r\n }\r\n if (end && (!end.isValid() || !end.isAfter(start))) {\r\n end = null;\r\n }\r\n if (forcedAllDay == null) {\r\n forcedAllDay = source.allDayDefault;\r\n if (forcedAllDay == null) {\r\n forcedAllDay = calendar.opt('allDayDefault');\r\n }\r\n }\r\n if (forcedAllDay === true) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else if (forcedAllDay === false) {\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n if (!end && forceEventDuration) {\r\n end = calendar.getDefaultEventEnd(!start.hasTime(), start);\r\n }\r\n return new EventDateProfile(start, end, calendar);\r\n };\r\n EventDateProfile.isStandardProp = function (propName) {\r\n return propName === 'start' || propName === 'date' || propName === 'end' || propName === 'allDay';\r\n };\r\n EventDateProfile.prototype.isAllDay = function () {\r\n return !(this.start.hasTime() || (this.end && this.end.hasTime()));\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.buildUnzonedRange = function (calendar) {\r\n var startMs = this.start.clone().stripZone().valueOf();\r\n var endMs = this.getEnd(calendar).stripZone().valueOf();\r\n return new UnzonedRange_1.default(startMs, endMs);\r\n };\r\n /*\r\n Needs a Calendar object\r\n */\r\n EventDateProfile.prototype.getEnd = function (calendar) {\r\n return this.end ?\r\n this.end.clone() :\r\n // derive the end from the start and allDay. compute allDay if necessary\r\n calendar.getDefaultEventEnd(this.isAllDay(), this.start);\r\n };\r\n return EventDateProfile;\r\n}());\r\nexports.default = EventDateProfile;\r\n\r\n\r\n/***/ }),\r\n/* 18 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventRange_1 = __webpack_require__(211);\r\n/*\r\nIt's expected that there will be at least one EventInstance,\r\nOR that an explicitEventDef is assigned.\r\n*/\r\nvar EventInstanceGroup = /** @class */ (function () {\r\n function EventInstanceGroup(eventInstances) {\r\n this.eventInstances = eventInstances || [];\r\n }\r\n EventInstanceGroup.prototype.getAllEventRanges = function (constraintRange) {\r\n if (constraintRange) {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.eventInstances.map(util_1.eventInstanceToEventRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceRenderRanges = function (constraintRange) {\r\n if (this.isInverse()) {\r\n return this.sliceInverseRenderRanges(constraintRange);\r\n }\r\n else {\r\n return this.sliceNormalRenderRanges(constraintRange);\r\n }\r\n };\r\n EventInstanceGroup.prototype.sliceNormalRenderRanges = function (constraintRange) {\r\n var eventInstances = this.eventInstances;\r\n var i;\r\n var eventInstance;\r\n var slicedRange;\r\n var slicedEventRanges = [];\r\n for (i = 0; i < eventInstances.length; i++) {\r\n eventInstance = eventInstances[i];\r\n slicedRange = eventInstance.dateProfile.unzonedRange.intersect(constraintRange);\r\n if (slicedRange) {\r\n slicedEventRanges.push(new EventRange_1.default(slicedRange, eventInstance.def, eventInstance));\r\n }\r\n }\r\n return slicedEventRanges;\r\n };\r\n EventInstanceGroup.prototype.sliceInverseRenderRanges = function (constraintRange) {\r\n var unzonedRanges = this.eventInstances.map(util_1.eventInstanceToUnzonedRange);\r\n var ownerDef = this.getEventDef();\r\n unzonedRanges = UnzonedRange_1.default.invertRanges(unzonedRanges, constraintRange);\r\n return unzonedRanges.map(function (unzonedRange) {\r\n return new EventRange_1.default(unzonedRange, ownerDef); // don't give an EventInstance\r\n });\r\n };\r\n EventInstanceGroup.prototype.isInverse = function () {\r\n return this.getEventDef().hasInverseRendering();\r\n };\r\n EventInstanceGroup.prototype.getEventDef = function () {\r\n return this.explicitEventDef || this.eventInstances[0].def;\r\n };\r\n return EventInstanceGroup;\r\n}());\r\nexports.default = EventInstanceGroup;\r\n\r\n\r\n/***/ }),\r\n/* 19 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar Theme = /** @class */ (function () {\r\n function Theme(optionsManager) {\r\n this.optionsManager = optionsManager;\r\n this.processIconOverride();\r\n }\r\n Theme.prototype.processIconOverride = function () {\r\n if (this.iconOverrideOption) {\r\n this.setIconOverride(this.optionsManager.get(this.iconOverrideOption));\r\n }\r\n };\r\n Theme.prototype.setIconOverride = function (iconOverrideHash) {\r\n var iconClassesCopy;\r\n var buttonName;\r\n if ($.isPlainObject(iconOverrideHash)) {\r\n iconClassesCopy = $.extend({}, this.iconClasses);\r\n for (buttonName in iconOverrideHash) {\r\n iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);\r\n }\r\n this.iconClasses = iconClassesCopy;\r\n }\r\n else if (iconOverrideHash === false) {\r\n this.iconClasses = {};\r\n }\r\n };\r\n Theme.prototype.applyIconOverridePrefix = function (className) {\r\n var prefix = this.iconOverridePrefix;\r\n if (prefix && className.indexOf(prefix) !== 0) {\r\n className = prefix + className;\r\n }\r\n return className;\r\n };\r\n Theme.prototype.getClass = function (key) {\r\n return this.classes[key] || '';\r\n };\r\n Theme.prototype.getIconClass = function (buttonName) {\r\n var className = this.iconClasses[buttonName];\r\n if (className) {\r\n return this.baseIconClass + ' ' + className;\r\n }\r\n return '';\r\n };\r\n Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {\r\n var className;\r\n if (this.iconOverrideCustomButtonOption) {\r\n className = customButtonProps[this.iconOverrideCustomButtonOption];\r\n if (className) {\r\n return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);\r\n }\r\n }\r\n return '';\r\n };\r\n return Theme;\r\n}());\r\nexports.default = Theme;\r\nTheme.prototype.classes = {};\r\nTheme.prototype.iconClasses = {};\r\nTheme.prototype.baseIconClass = '';\r\nTheme.prototype.iconOverridePrefix = '';\r\n\r\n\r\n/***/ }),\r\n/* 20 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar PromiseStub = {\r\n construct: function (executor) {\r\n var deferred = $.Deferred();\r\n var promise = deferred.promise();\r\n if (typeof executor === 'function') {\r\n executor(function (val) {\r\n deferred.resolve(val);\r\n attachImmediatelyResolvingThen(promise, val);\r\n }, function () {\r\n deferred.reject();\r\n attachImmediatelyRejectingThen(promise);\r\n });\r\n }\r\n return promise;\r\n },\r\n resolve: function (val) {\r\n var deferred = $.Deferred().resolve(val);\r\n var promise = deferred.promise();\r\n attachImmediatelyResolvingThen(promise, val);\r\n return promise;\r\n },\r\n reject: function () {\r\n var deferred = $.Deferred().reject();\r\n var promise = deferred.promise();\r\n attachImmediatelyRejectingThen(promise);\r\n return promise;\r\n }\r\n};\r\nexports.default = PromiseStub;\r\nfunction attachImmediatelyResolvingThen(promise, val) {\r\n promise.then = function (onResolve) {\r\n if (typeof onResolve === 'function') {\r\n return PromiseStub.resolve(onResolve(val));\r\n }\r\n return promise;\r\n };\r\n}\r\nfunction attachImmediatelyRejectingThen(promise) {\r\n promise.then = function (onResolve, onReject) {\r\n if (typeof onReject === 'function') {\r\n onReject();\r\n }\r\n return promise;\r\n };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 21 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nexportHooks.touchMouseIgnoreWait = 500;\r\nvar globalEmitter = null;\r\nvar neededCount = 0;\r\n/*\r\nListens to document and window-level user-interaction events, like touch events and mouse events,\r\nand fires these events as-is to whoever is observing a GlobalEmitter.\r\nBest when used as a singleton via GlobalEmitter.get()\r\n\r\nNormalizes mouse/touch events. For examples:\r\n- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click\r\n- compensates for various buggy scenarios where a touchend does not fire\r\n*/\r\nvar GlobalEmitter = /** @class */ (function () {\r\n function GlobalEmitter() {\r\n this.isTouching = false;\r\n this.mouseIgnoreDepth = 0;\r\n }\r\n // gets the singleton\r\n GlobalEmitter.get = function () {\r\n if (!globalEmitter) {\r\n globalEmitter = new GlobalEmitter();\r\n globalEmitter.bind();\r\n }\r\n return globalEmitter;\r\n };\r\n // called when an object knows it will need a GlobalEmitter in the near future.\r\n GlobalEmitter.needed = function () {\r\n GlobalEmitter.get(); // ensures globalEmitter\r\n neededCount++;\r\n };\r\n // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.\r\n GlobalEmitter.unneeded = function () {\r\n neededCount--;\r\n if (!neededCount) {\r\n globalEmitter.unbind();\r\n globalEmitter = null;\r\n }\r\n };\r\n GlobalEmitter.prototype.bind = function () {\r\n var _this = this;\r\n this.listenTo($(document), {\r\n touchstart: this.handleTouchStart,\r\n touchcancel: this.handleTouchCancel,\r\n touchend: this.handleTouchEnd,\r\n mousedown: this.handleMouseDown,\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.handleMouseUp,\r\n click: this.handleClick,\r\n selectstart: this.handleSelectStart,\r\n contextmenu: this.handleContextMenu\r\n });\r\n // because we need to call preventDefault\r\n // because https://www.chromestatus.com/features/5093566007214080\r\n // TODO: investigate performance because this is a global handler\r\n window.addEventListener('touchmove', this.handleTouchMoveProxy = function (ev) {\r\n _this.handleTouchMove($.Event(ev));\r\n }, { passive: false } // allows preventDefault()\r\n );\r\n // attach a handler to get called when ANY scroll action happens on the page.\r\n // this was impossible to do with normal on/off because 'scroll' doesn't bubble.\r\n // http://stackoverflow.com/a/32954565/96342\r\n window.addEventListener('scroll', this.handleScrollProxy = function (ev) {\r\n _this.handleScroll($.Event(ev));\r\n }, true // useCapture\r\n );\r\n };\r\n GlobalEmitter.prototype.unbind = function () {\r\n this.stopListeningTo($(document));\r\n window.removeEventListener('touchmove', this.handleTouchMoveProxy);\r\n window.removeEventListener('scroll', this.handleScrollProxy, true // useCapture\r\n );\r\n };\r\n // Touch Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleTouchStart = function (ev) {\r\n // if a previous touch interaction never ended with a touchend, then implicitly end it,\r\n // but since a new touch interaction is about to begin, don't start the mouse ignore period.\r\n this.stopTouch(ev, true); // skipMouseIgnore=true\r\n this.isTouching = true;\r\n this.trigger('touchstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleTouchMove = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchmove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchCancel = function (ev) {\r\n if (this.isTouching) {\r\n this.trigger('touchcancel', ev);\r\n // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.\r\n // If touchend fires later, it won't have any effect b/c isTouching will be false.\r\n this.stopTouch(ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleTouchEnd = function (ev) {\r\n this.stopTouch(ev);\r\n };\r\n // Mouse Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleMouseDown = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousedown', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseMove = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mousemove', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleMouseUp = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('mouseup', ev);\r\n }\r\n };\r\n GlobalEmitter.prototype.handleClick = function (ev) {\r\n if (!this.shouldIgnoreMouse()) {\r\n this.trigger('click', ev);\r\n }\r\n };\r\n // Misc Handlers\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.handleSelectStart = function (ev) {\r\n this.trigger('selectstart', ev);\r\n };\r\n GlobalEmitter.prototype.handleContextMenu = function (ev) {\r\n this.trigger('contextmenu', ev);\r\n };\r\n GlobalEmitter.prototype.handleScroll = function (ev) {\r\n this.trigger('scroll', ev);\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n GlobalEmitter.prototype.stopTouch = function (ev, skipMouseIgnore) {\r\n if (skipMouseIgnore === void 0) { skipMouseIgnore = false; }\r\n if (this.isTouching) {\r\n this.isTouching = false;\r\n this.trigger('touchend', ev);\r\n if (!skipMouseIgnore) {\r\n this.startTouchMouseIgnore();\r\n }\r\n }\r\n };\r\n GlobalEmitter.prototype.startTouchMouseIgnore = function () {\r\n var _this = this;\r\n var wait = exportHooks.touchMouseIgnoreWait;\r\n if (wait) {\r\n this.mouseIgnoreDepth++;\r\n setTimeout(function () {\r\n _this.mouseIgnoreDepth--;\r\n }, wait);\r\n }\r\n };\r\n GlobalEmitter.prototype.shouldIgnoreMouse = function () {\r\n return this.isTouching || Boolean(this.mouseIgnoreDepth);\r\n };\r\n return GlobalEmitter;\r\n}());\r\nexports.default = GlobalEmitter;\r\nListenerMixin_1.default.mixInto(GlobalEmitter);\r\nEmitterMixin_1.default.mixInto(GlobalEmitter);\r\n\r\n\r\n/***/ }),\r\n/* 22 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar exportHooks = __webpack_require__(16);\r\nexports.viewHash = {};\r\nexportHooks.views = exports.viewHash;\r\nfunction defineView(viewName, viewConfig) {\r\n exports.viewHash[viewName] = viewConfig;\r\n}\r\nexports.defineView = defineView;\r\nfunction getViewConfig(viewName) {\r\n return exports.viewHash[viewName];\r\n}\r\nexports.getViewConfig = getViewConfig;\r\n\r\n\r\n/***/ }),\r\n/* 23 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar DragListener_1 = __webpack_require__(54);\r\n/* Tracks mouse movements over a component and raises events about which hit the mouse is over.\r\n------------------------------------------------------------------------------------------------------------------------\r\noptions:\r\n- subjectEl\r\n- subjectCenter\r\n*/\r\nvar HitDragListener = /** @class */ (function (_super) {\r\n tslib_1.__extends(HitDragListener, _super);\r\n function HitDragListener(component, options) {\r\n var _this = _super.call(this, options) || this;\r\n _this.component = component;\r\n return _this;\r\n }\r\n // Called when drag listening starts (but a real drag has not necessarily began).\r\n // ev might be undefined if dragging was started manually.\r\n HitDragListener.prototype.handleInteractionStart = function (ev) {\r\n var subjectEl = this.subjectEl;\r\n var subjectRect;\r\n var origPoint;\r\n var point;\r\n this.component.hitsNeeded();\r\n this.computeScrollBounds(); // for autoscroll\r\n if (ev) {\r\n origPoint = { left: util_1.getEvX(ev), top: util_1.getEvY(ev) };\r\n point = origPoint;\r\n // constrain the point to bounds of the element being dragged\r\n if (subjectEl) {\r\n subjectRect = util_1.getOuterRect(subjectEl); // used for centering as well\r\n point = util_1.constrainPoint(point, subjectRect);\r\n }\r\n this.origHit = this.queryHit(point.left, point.top);\r\n // treat the center of the subject as the collision point?\r\n if (subjectEl && this.options.subjectCenter) {\r\n // only consider the area the subject overlaps the hit. best for large subjects.\r\n // TODO: skip this if hit didn't supply left/right/top/bottom\r\n if (this.origHit) {\r\n subjectRect = util_1.intersectRects(this.origHit, subjectRect) ||\r\n subjectRect; // in case there is no intersection\r\n }\r\n point = util_1.getRectCenter(subjectRect);\r\n }\r\n this.coordAdjust = util_1.diffPoints(point, origPoint); // point - origPoint\r\n }\r\n else {\r\n this.origHit = null;\r\n this.coordAdjust = null;\r\n }\r\n // call the super-method. do it after origHit has been computed\r\n _super.prototype.handleInteractionStart.call(this, ev);\r\n };\r\n // Called when the actual drag has started\r\n HitDragListener.prototype.handleDragStart = function (ev) {\r\n var hit;\r\n _super.prototype.handleDragStart.call(this, ev);\r\n // might be different from this.origHit if the min-distance is large\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n // report the initial hit the mouse is over\r\n // especially important if no min-distance and drag starts immediately\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n };\r\n // Called when the drag moves\r\n HitDragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n var hit;\r\n _super.prototype.handleDrag.call(this, dx, dy, ev);\r\n hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));\r\n if (!isHitsEqual(hit, this.hit)) {\r\n if (this.hit) {\r\n this.handleHitOut();\r\n }\r\n if (hit) {\r\n this.handleHitOver(hit);\r\n }\r\n }\r\n };\r\n // Called when dragging has been stopped\r\n HitDragListener.prototype.handleDragEnd = function (ev) {\r\n this.handleHitDone();\r\n _super.prototype.handleDragEnd.call(this, ev);\r\n };\r\n // Called when a the mouse has just moved over a new hit\r\n HitDragListener.prototype.handleHitOver = function (hit) {\r\n var isOrig = isHitsEqual(hit, this.origHit);\r\n this.hit = hit;\r\n this.trigger('hitOver', this.hit, isOrig, this.origHit);\r\n };\r\n // Called when the mouse has just moved out of a hit\r\n HitDragListener.prototype.handleHitOut = function () {\r\n if (this.hit) {\r\n this.trigger('hitOut', this.hit);\r\n this.handleHitDone();\r\n this.hit = null;\r\n }\r\n };\r\n // Called after a hitOut. Also called before a dragStop\r\n HitDragListener.prototype.handleHitDone = function () {\r\n if (this.hit) {\r\n this.trigger('hitDone', this.hit);\r\n }\r\n };\r\n // Called when the interaction ends, whether there was a real drag or not\r\n HitDragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n _super.prototype.handleInteractionEnd.call(this, ev, isCancelled);\r\n this.origHit = null;\r\n this.hit = null;\r\n this.component.hitsNotNeeded();\r\n };\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n HitDragListener.prototype.handleScrollEnd = function () {\r\n _super.prototype.handleScrollEnd.call(this);\r\n // hits' absolute positions will be in new places after a user's scroll.\r\n // HACK for recomputing.\r\n if (this.isDragging) {\r\n this.component.releaseHits();\r\n this.component.prepareHits();\r\n }\r\n };\r\n // Gets the hit underneath the coordinates for the given mouse event\r\n HitDragListener.prototype.queryHit = function (left, top) {\r\n if (this.coordAdjust) {\r\n left += this.coordAdjust.left;\r\n top += this.coordAdjust.top;\r\n }\r\n return this.component.queryHit(left, top);\r\n };\r\n return HitDragListener;\r\n}(DragListener_1.default));\r\nexports.default = HitDragListener;\r\n// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component.\r\n// Two null values will be considered equal, as two \"out of the component\" states are the same.\r\nfunction isHitsEqual(hit0, hit1) {\r\n if (!hit0 && !hit1) {\r\n return true;\r\n }\r\n if (hit0 && hit1) {\r\n return hit0.component === hit1.component &&\r\n isHitPropsWithin(hit0, hit1) &&\r\n isHitPropsWithin(hit1, hit0); // ensures all props are identical\r\n }\r\n return false;\r\n}\r\n// Returns true if all of subHit's non-standard properties are within superHit\r\nfunction isHitPropsWithin(subHit, superHit) {\r\n for (var propName in subHit) {\r\n if (!/^(component|left|right|top|bottom)$/.test(propName)) {\r\n if (subHit[propName] !== superHit[propName]) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 24 */,\r\n/* 25 */,\r\n/* 26 */,\r\n/* 27 */,\r\n/* 28 */,\r\n/* 29 */,\r\n/* 30 */,\r\n/* 31 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar options_1 = __webpack_require__(32);\r\nvar util_1 = __webpack_require__(4);\r\nexports.localeOptionHash = {};\r\nexportHooks.locales = exports.localeOptionHash;\r\n// NOTE: can't guarantee any of these computations will run because not every locale has datepicker\r\n// configs, so make sure there are English fallbacks for these in the defaults file.\r\nvar dpComputableOptions = {\r\n buttonText: function (dpOptions) {\r\n return {\r\n // the translations sometimes wrongly contain HTML entities\r\n prev: util_1.stripHtmlEntities(dpOptions.prevText),\r\n next: util_1.stripHtmlEntities(dpOptions.nextText),\r\n today: util_1.stripHtmlEntities(dpOptions.currentText)\r\n };\r\n },\r\n // Produces format strings like \"MMMM YYYY\" -> \"September 2014\"\r\n monthYearFormat: function (dpOptions) {\r\n return dpOptions.showMonthAfterYear ?\r\n 'YYYY[' + dpOptions.yearSuffix + '] MMMM' :\r\n 'MMMM YYYY[' + dpOptions.yearSuffix + ']';\r\n }\r\n};\r\nvar momComputableOptions = {\r\n // Produces format strings like \"ddd M/D\" -> \"Fri 9/15\"\r\n dayOfMonthFormat: function (momOptions, fcOptions) {\r\n var format = momOptions.longDateFormat('l'); // for the format like \"M/D/YYYY\"\r\n // strip the year off the edge, as well as other misc non-whitespace chars\r\n format = format.replace(/^Y+[^\\w\\s]*|[^\\w\\s]*Y+$/g, '');\r\n if (fcOptions.isRTL) {\r\n format += ' ddd'; // for RTL, add day-of-week to end\r\n }\r\n else {\r\n format = 'ddd ' + format; // for LTR, add day-of-week to beginning\r\n }\r\n return format;\r\n },\r\n // Produces format strings like \"h:mma\" -> \"6:00pm\"\r\n mediumTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)a\" -> \"6pm\" / \"6:30pm\"\r\n smallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h(:mm)t\" -> \"6p\" / \"6:30p\"\r\n extraSmallTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '(:mm)')\r\n .replace(/(\\Wmm)$/, '($1)') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"ha\" / \"H\" -> \"6pm\" / \"18\"\r\n hourFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(':mm', '')\r\n .replace(/(\\Wmm)$/, '') // like above, but for foreign locales\r\n .replace(/\\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand\r\n },\r\n // Produces format strings like \"h:mm\" -> \"6:30\" (with no AM/PM)\r\n noMeridiemTimeFormat: function (momOptions) {\r\n return momOptions.longDateFormat('LT')\r\n .replace(/\\s*a$/i, ''); // remove trailing AM/PM\r\n }\r\n};\r\n// options that should be computed off live calendar options (considers override options)\r\n// TODO: best place for this? related to locale?\r\n// TODO: flipping text based on isRTL is a bad idea because the CSS `direction` might want to handle it\r\nvar instanceComputableOptions = {\r\n // Produces format strings for results like \"Mo 16\"\r\n smallDayDateFormat: function (options) {\r\n return options.isRTL ?\r\n 'D dd' :\r\n 'dd D';\r\n },\r\n // Produces format strings for results like \"Wk 5\"\r\n weekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[ ' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ' ]w';\r\n },\r\n // Produces format strings for results like \"Wk5\"\r\n smallWeekFormat: function (options) {\r\n return options.isRTL ?\r\n 'w[' + options.weekNumberTitle + ']' :\r\n '[' + options.weekNumberTitle + ']w';\r\n }\r\n};\r\n// TODO: make these computable properties in optionsManager\r\nfunction populateInstanceComputableOptions(options) {\r\n $.each(instanceComputableOptions, function (name, func) {\r\n if (options[name] == null) {\r\n options[name] = func(options);\r\n }\r\n });\r\n}\r\nexports.populateInstanceComputableOptions = populateInstanceComputableOptions;\r\n// Initialize jQuery UI datepicker translations while using some of the translations\r\n// Will set this as the default locales for datepicker.\r\nfunction datepickerLocale(localeCode, dpLocaleCode, dpOptions) {\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n var fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // transfer some simple options from datepicker to fc\r\n fcOptions.isRTL = dpOptions.isRTL;\r\n fcOptions.weekNumberTitle = dpOptions.weekHeader;\r\n // compute some more complex options from datepicker\r\n $.each(dpComputableOptions, function (name, func) {\r\n fcOptions[name] = func(dpOptions);\r\n });\r\n var jqDatePicker = $.datepicker;\r\n // is jQuery UI Datepicker is on the page?\r\n if (jqDatePicker) {\r\n // Register the locale data.\r\n // FullCalendar and MomentJS use locale codes like \"pt-br\" but Datepicker\r\n // does it like \"pt-BR\" or if it doesn't have the locale, maybe just \"pt\".\r\n // Make an alias so the locale can be referenced either way.\r\n jqDatePicker.regional[dpLocaleCode] =\r\n jqDatePicker.regional[localeCode] = // alias\r\n dpOptions;\r\n // Alias 'en' to the default locale data. Do this every time.\r\n jqDatePicker.regional.en = jqDatePicker.regional[''];\r\n // Set as Datepicker's global defaults.\r\n jqDatePicker.setDefaults(dpOptions);\r\n }\r\n}\r\nexports.datepickerLocale = datepickerLocale;\r\n// Sets FullCalendar-specific translations. Will set the locales as the global default.\r\nfunction locale(localeCode, newFcOptions) {\r\n var fcOptions;\r\n var momOptions;\r\n // get the FullCalendar internal option hash for this locale. create if necessary\r\n fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});\r\n // provided new options for this locales? merge them in\r\n if (newFcOptions) {\r\n fcOptions = exports.localeOptionHash[localeCode] = options_1.mergeOptions([fcOptions, newFcOptions]);\r\n }\r\n // compute locale options that weren't defined.\r\n // always do this. newFcOptions can be undefined when initializing from i18n file,\r\n // so no way to tell if this is an initialization or a default-setting.\r\n momOptions = getMomentLocaleData(localeCode); // will fall back to en\r\n $.each(momComputableOptions, function (name, func) {\r\n if (fcOptions[name] == null) {\r\n fcOptions[name] = (func)(momOptions, fcOptions);\r\n }\r\n });\r\n // set it as the default locale for FullCalendar\r\n options_1.globalDefaults.locale = localeCode;\r\n}\r\nexports.locale = locale;\r\n// Returns moment's internal locale data. If doesn't exist, returns English.\r\nfunction getMomentLocaleData(localeCode) {\r\n return moment.localeData(localeCode) || moment.localeData('en');\r\n}\r\nexports.getMomentLocaleData = getMomentLocaleData;\r\n// Initialize English by forcing computation of moment-derived options.\r\n// Also, sets it as the default.\r\nlocale('en', options_1.englishDefaults);\r\n\r\n\r\n/***/ }),\r\n/* 32 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nexports.globalDefaults = {\r\n titleRangeSeparator: ' \\u2013 ',\r\n monthYearFormat: 'MMMM YYYY',\r\n defaultTimedEventDuration: '02:00:00',\r\n defaultAllDayEventDuration: { days: 1 },\r\n forceEventDuration: false,\r\n nextDayThreshold: '09:00:00',\r\n // display\r\n columnHeader: true,\r\n defaultView: 'month',\r\n aspectRatio: 1.35,\r\n header: {\r\n left: 'title',\r\n center: '',\r\n right: 'today prev,next'\r\n },\r\n weekends: true,\r\n weekNumbers: false,\r\n weekNumberTitle: 'W',\r\n weekNumberCalculation: 'local',\r\n // editable: false,\r\n // nowIndicator: false,\r\n scrollTime: '06:00:00',\r\n minTime: '00:00:00',\r\n maxTime: '24:00:00',\r\n showNonCurrentDates: true,\r\n // event ajax\r\n lazyFetching: true,\r\n startParam: 'start',\r\n endParam: 'end',\r\n timezoneParam: 'timezone',\r\n timezone: false,\r\n // allDayDefault: undefined,\r\n // locale\r\n locale: null,\r\n isRTL: false,\r\n buttonText: {\r\n prev: 'prev',\r\n next: 'next',\r\n prevYear: 'prev year',\r\n nextYear: 'next year',\r\n year: 'year',\r\n today: 'today',\r\n month: 'month',\r\n week: 'week',\r\n day: 'day'\r\n },\r\n // buttonIcons: null,\r\n allDayText: 'all-day',\r\n // allows setting a min-height to the event segment to prevent short events overlapping each other\r\n agendaEventMinHeight: 0,\r\n // jquery-ui theming\r\n theme: false,\r\n // themeButtonIcons: null,\r\n // eventResizableFromStart: false,\r\n dragOpacity: .75,\r\n dragRevertDuration: 500,\r\n dragScroll: true,\r\n // selectable: false,\r\n unselectAuto: true,\r\n // selectMinDistance: 0,\r\n dropAccept: '*',\r\n eventOrder: 'title',\r\n // eventRenderWait: null,\r\n eventLimit: false,\r\n eventLimitText: 'more',\r\n eventLimitClick: 'popover',\r\n dayPopoverFormat: 'LL',\r\n handleWindowResize: true,\r\n windowResizeDelay: 100,\r\n longPressDelay: 1000\r\n};\r\nexports.englishDefaults = {\r\n dayPopoverFormat: 'dddd, MMMM D'\r\n};\r\nexports.rtlDefaults = {\r\n header: {\r\n left: 'next,prev today',\r\n center: '',\r\n right: 'title'\r\n },\r\n buttonIcons: {\r\n prev: 'right-single-arrow',\r\n next: 'left-single-arrow',\r\n prevYear: 'right-double-arrow',\r\n nextYear: 'left-double-arrow'\r\n },\r\n themeButtonIcons: {\r\n prev: 'circle-triangle-e',\r\n next: 'circle-triangle-w',\r\n nextYear: 'seek-prev',\r\n prevYear: 'seek-next'\r\n }\r\n};\r\nvar complexOptions = [\r\n 'header',\r\n 'footer',\r\n 'buttonText',\r\n 'buttonIcons',\r\n 'themeButtonIcons'\r\n];\r\n// Merges an array of option objects into a single object\r\nfunction mergeOptions(optionObjs) {\r\n return util_1.mergeProps(optionObjs, complexOptions);\r\n}\r\nexports.mergeOptions = mergeOptions;\r\n\r\n\r\n/***/ }),\r\n/* 33 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\n// Class that all other classes will inherit from\r\nvar Class = /** @class */ (function () {\r\n function Class() {\r\n }\r\n // Called on a class to create a subclass.\r\n // LIMITATION: cannot provide a constructor!\r\n Class.extend = function (members) {\r\n var SubClass = /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return SubClass;\r\n }(this));\r\n util_1.copyOwnProps(members, SubClass.prototype);\r\n return SubClass;\r\n };\r\n // Adds new member variables/methods to the class's prototype.\r\n // Can be called with another class, or a plain object hash containing new members.\r\n Class.mixin = function (members) {\r\n util_1.copyOwnProps(members, this.prototype);\r\n };\r\n return Class;\r\n}());\r\nexports.default = Class;\r\n\r\n\r\n/***/ }),\r\n/* 34 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar ParsableModelMixin_1 = __webpack_require__(208);\r\nvar EventDef = /** @class */ (function () {\r\n function EventDef(source) {\r\n this.source = source;\r\n this.className = [];\r\n this.miscProps = {};\r\n }\r\n EventDef.parse = function (rawInput, source) {\r\n var def = new this(source);\r\n if (def.applyProps(rawInput)) {\r\n return def;\r\n }\r\n return false;\r\n };\r\n EventDef.normalizeId = function (id) {\r\n return String(id);\r\n };\r\n EventDef.generateId = function () {\r\n return '_fc' + (EventDef.uuid++);\r\n };\r\n EventDef.prototype.clone = function () {\r\n var copy = new this.constructor(this.source);\r\n copy.id = this.id;\r\n copy.rawId = this.rawId;\r\n copy.uid = this.uid; // not really unique anymore :(\r\n EventDef.copyVerbatimStandardProps(this, copy);\r\n copy.className = this.className.slice(); // copy\r\n copy.miscProps = $.extend({}, this.miscProps);\r\n return copy;\r\n };\r\n EventDef.prototype.hasInverseRendering = function () {\r\n return this.getRendering() === 'inverse-background';\r\n };\r\n EventDef.prototype.hasBgRendering = function () {\r\n var rendering = this.getRendering();\r\n return rendering === 'inverse-background' || rendering === 'background';\r\n };\r\n EventDef.prototype.getRendering = function () {\r\n if (this.rendering != null) {\r\n return this.rendering;\r\n }\r\n return this.source.rendering;\r\n };\r\n EventDef.prototype.getConstraint = function () {\r\n if (this.constraint != null) {\r\n return this.constraint;\r\n }\r\n if (this.source.constraint != null) {\r\n return this.source.constraint;\r\n }\r\n return this.source.calendar.opt('eventConstraint'); // what about View option?\r\n };\r\n EventDef.prototype.getOverlap = function () {\r\n if (this.overlap != null) {\r\n return this.overlap;\r\n }\r\n if (this.source.overlap != null) {\r\n return this.source.overlap;\r\n }\r\n return this.source.calendar.opt('eventOverlap'); // what about View option?\r\n };\r\n EventDef.prototype.isStartExplicitlyEditable = function () {\r\n if (this.startEditable != null) {\r\n return this.startEditable;\r\n }\r\n return this.source.startEditable;\r\n };\r\n EventDef.prototype.isDurationExplicitlyEditable = function () {\r\n if (this.durationEditable != null) {\r\n return this.durationEditable;\r\n }\r\n return this.source.durationEditable;\r\n };\r\n EventDef.prototype.isExplicitlyEditable = function () {\r\n if (this.editable != null) {\r\n return this.editable;\r\n }\r\n return this.source.editable;\r\n };\r\n EventDef.prototype.toLegacy = function () {\r\n var obj = $.extend({}, this.miscProps);\r\n obj._id = this.uid;\r\n obj.source = this.source;\r\n obj.className = this.className.slice(); // copy\r\n obj.allDay = this.isAllDay();\r\n if (this.rawId != null) {\r\n obj.id = this.rawId;\r\n }\r\n EventDef.copyVerbatimStandardProps(this, obj);\r\n return obj;\r\n };\r\n EventDef.prototype.applyManualStandardProps = function (rawProps) {\r\n if (rawProps.id != null) {\r\n this.id = EventDef.normalizeId((this.rawId = rawProps.id));\r\n }\r\n else {\r\n this.id = EventDef.generateId();\r\n }\r\n if (rawProps._id != null) {\r\n this.uid = String(rawProps._id);\r\n }\r\n else {\r\n this.uid = EventDef.generateId();\r\n }\r\n // TODO: converge with EventSource\r\n if ($.isArray(rawProps.className)) {\r\n this.className = rawProps.className;\r\n }\r\n if (typeof rawProps.className === 'string') {\r\n this.className = rawProps.className.split(/\\s+/);\r\n }\r\n return true;\r\n };\r\n EventDef.prototype.applyMiscProps = function (rawProps) {\r\n $.extend(this.miscProps, rawProps);\r\n };\r\n EventDef.uuid = 0;\r\n EventDef.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;\r\n EventDef.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;\r\n return EventDef;\r\n}());\r\nexports.default = EventDef;\r\nParsableModelMixin_1.default.mixInto(EventDef);\r\nEventDef.defineStandardProps({\r\n // not automatically assigned (`false`)\r\n _id: false,\r\n id: false,\r\n className: false,\r\n source: false,\r\n // automatically assigned (`true`)\r\n title: true,\r\n url: true,\r\n rendering: true,\r\n constraint: true,\r\n overlap: true,\r\n editable: true,\r\n startEditable: true,\r\n durationEditable: true,\r\n color: true,\r\n backgroundColor: true,\r\n borderColor: true,\r\n textColor: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 35 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange_1 = __webpack_require__(211);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nfunction eventDefsToEventInstances(eventDefs, unzonedRange) {\r\n var eventInstances = [];\r\n var i;\r\n for (i = 0; i < eventDefs.length; i++) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventDefs[i].buildInstances(unzonedRange));\r\n }\r\n return eventInstances;\r\n}\r\nexports.eventDefsToEventInstances = eventDefsToEventInstances;\r\nfunction eventInstanceToEventRange(eventInstance) {\r\n return new EventRange_1.default(eventInstance.dateProfile.unzonedRange, eventInstance.def, eventInstance);\r\n}\r\nexports.eventInstanceToEventRange = eventInstanceToEventRange;\r\nfunction eventRangeToEventFootprint(eventRange) {\r\n return new EventFootprint_1.default(new ComponentFootprint_1.default(eventRange.unzonedRange, eventRange.eventDef.isAllDay()), eventRange.eventDef, eventRange.eventInstance // might not exist\r\n );\r\n}\r\nexports.eventRangeToEventFootprint = eventRangeToEventFootprint;\r\nfunction eventInstanceToUnzonedRange(eventInstance) {\r\n return eventInstance.dateProfile.unzonedRange;\r\n}\r\nexports.eventInstanceToUnzonedRange = eventInstanceToUnzonedRange;\r\nfunction eventFootprintToComponentFootprint(eventFootprint) {\r\n return eventFootprint.componentFootprint;\r\n}\r\nexports.eventFootprintToComponentFootprint = eventFootprintToComponentFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 36 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventFootprint = /** @class */ (function () {\r\n function EventFootprint(componentFootprint, eventDef, eventInstance) {\r\n this.componentFootprint = componentFootprint;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n EventFootprint.prototype.getEventLegacy = function () {\r\n return (this.eventInstance || this.eventDef).toLegacy();\r\n };\r\n return EventFootprint;\r\n}());\r\nexports.default = EventFootprint;\r\n\r\n\r\n/***/ }),\r\n/* 37 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation = /** @class */ (function () {\r\n function EventDefMutation() {\r\n }\r\n EventDefMutation.createFromRawProps = function (eventInstance, rawProps, largeUnit) {\r\n var eventDef = eventInstance.def;\r\n var dateProps = {};\r\n var standardProps = {};\r\n var miscProps = {};\r\n var verbatimStandardProps = {};\r\n var eventDefId = null;\r\n var className = null;\r\n var propName;\r\n var dateProfile;\r\n var dateMutation;\r\n var defMutation;\r\n for (propName in rawProps) {\r\n if (EventDateProfile_1.default.isStandardProp(propName)) {\r\n dateProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.isStandardProp(propName)) {\r\n standardProps[propName] = rawProps[propName];\r\n }\r\n else if (eventDef.miscProps[propName] !== rawProps[propName]) {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n dateProfile = EventDateProfile_1.default.parse(dateProps, eventDef.source);\r\n if (dateProfile) {\r\n dateMutation = EventDefDateMutation_1.default.createFromDiff(eventInstance.dateProfile, dateProfile, largeUnit);\r\n }\r\n if (standardProps.id !== eventDef.id) {\r\n eventDefId = standardProps.id; // only apply if there's a change\r\n }\r\n if (!util_1.isArraysEqual(standardProps.className, eventDef.className)) {\r\n className = standardProps.className; // only apply if there's a change\r\n }\r\n EventDef_1.default.copyVerbatimStandardProps(standardProps, // src\r\n verbatimStandardProps // dest\r\n );\r\n defMutation = new EventDefMutation();\r\n defMutation.eventDefId = eventDefId;\r\n defMutation.className = className;\r\n defMutation.verbatimStandardProps = verbatimStandardProps;\r\n defMutation.miscProps = miscProps;\r\n if (dateMutation) {\r\n defMutation.dateMutation = dateMutation;\r\n }\r\n return defMutation;\r\n };\r\n /*\r\n eventDef assumed to be a SingleEventDef.\r\n returns an undo function.\r\n */\r\n EventDefMutation.prototype.mutateSingle = function (eventDef) {\r\n var origDateProfile;\r\n if (this.dateMutation) {\r\n origDateProfile = eventDef.dateProfile;\r\n eventDef.dateProfile = this.dateMutation.buildNewDateProfile(origDateProfile, eventDef.source.calendar);\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.eventDefId != null) {\r\n eventDef.id = EventDef_1.default.normalizeId((eventDef.rawId = this.eventDefId));\r\n }\r\n // can't undo\r\n // TODO: more DRY with EventDef::applyManualStandardProps\r\n if (this.className) {\r\n eventDef.className = this.className;\r\n }\r\n // can't undo\r\n if (this.verbatimStandardProps) {\r\n SingleEventDef_1.default.copyVerbatimStandardProps(this.verbatimStandardProps, // src\r\n eventDef // dest\r\n );\r\n }\r\n // can't undo\r\n if (this.miscProps) {\r\n eventDef.applyMiscProps(this.miscProps);\r\n }\r\n if (origDateProfile) {\r\n return function () {\r\n eventDef.dateProfile = origDateProfile;\r\n };\r\n }\r\n else {\r\n return function () { };\r\n }\r\n };\r\n EventDefMutation.prototype.setDateMutation = function (dateMutation) {\r\n if (dateMutation && !dateMutation.isEmpty()) {\r\n this.dateMutation = dateMutation;\r\n }\r\n else {\r\n this.dateMutation = null;\r\n }\r\n };\r\n EventDefMutation.prototype.isEmpty = function () {\r\n return !this.dateMutation;\r\n };\r\n return EventDefMutation;\r\n}());\r\nexports.default = EventDefMutation;\r\n\r\n\r\n/***/ }),\r\n/* 38 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.default = {\r\n sourceClasses: [],\r\n registerClass: function (EventSourceClass) {\r\n this.sourceClasses.unshift(EventSourceClass); // give highest priority\r\n },\r\n parse: function (rawInput, calendar) {\r\n var sourceClasses = this.sourceClasses;\r\n var i;\r\n var eventSource;\r\n for (i = 0; i < sourceClasses.length; i++) {\r\n eventSource = sourceClasses[i].parse(rawInput, calendar);\r\n if (eventSource) {\r\n return eventSource;\r\n }\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 39 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Class_1 = __webpack_require__(33);\r\n/*\r\nEmbodies a div that has potential scrollbars\r\n*/\r\nvar Scroller = /** @class */ (function (_super) {\r\n tslib_1.__extends(Scroller, _super);\r\n function Scroller(options) {\r\n var _this = _super.call(this) || this;\r\n options = options || {};\r\n _this.overflowX = options.overflowX || options.overflow || 'auto';\r\n _this.overflowY = options.overflowY || options.overflow || 'auto';\r\n return _this;\r\n }\r\n Scroller.prototype.render = function () {\r\n this.el = this.renderEl();\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.renderEl = function () {\r\n return (this.scrollEl = $('
'));\r\n };\r\n // sets to natural height, unlocks overflow\r\n Scroller.prototype.clear = function () {\r\n this.setHeight('auto');\r\n this.applyOverflow();\r\n };\r\n Scroller.prototype.destroy = function () {\r\n this.el.remove();\r\n };\r\n // Overflow\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.applyOverflow = function () {\r\n this.scrollEl.css({\r\n 'overflow-x': this.overflowX,\r\n 'overflow-y': this.overflowY\r\n });\r\n };\r\n // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.\r\n // Useful for preserving scrollbar widths regardless of future resizes.\r\n // Can pass in scrollbarWidths for optimization.\r\n Scroller.prototype.lockOverflow = function (scrollbarWidths) {\r\n var overflowX = this.overflowX;\r\n var overflowY = this.overflowY;\r\n scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();\r\n if (overflowX === 'auto') {\r\n overflowX = (scrollbarWidths.top || scrollbarWidths.bottom || // horizontal scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth) ? 'scroll' : 'hidden';\r\n }\r\n if (overflowY === 'auto') {\r\n overflowY = (scrollbarWidths.left || scrollbarWidths.right || // vertical scrollbars?\r\n // OR scrolling pane with massless scrollbars?\r\n this.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight) ? 'scroll' : 'hidden';\r\n }\r\n this.scrollEl.css({ 'overflow-x': overflowX, 'overflow-y': overflowY });\r\n };\r\n // Getters / Setters\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Scroller.prototype.setHeight = function (height) {\r\n this.scrollEl.height(height);\r\n };\r\n Scroller.prototype.getScrollTop = function () {\r\n return this.scrollEl.scrollTop();\r\n };\r\n Scroller.prototype.setScrollTop = function (top) {\r\n this.scrollEl.scrollTop(top);\r\n };\r\n Scroller.prototype.getClientWidth = function () {\r\n return this.scrollEl[0].clientWidth;\r\n };\r\n Scroller.prototype.getClientHeight = function () {\r\n return this.scrollEl[0].clientHeight;\r\n };\r\n Scroller.prototype.getScrollbarWidths = function () {\r\n return util_1.getScrollbarWidths(this.scrollEl);\r\n };\r\n return Scroller;\r\n}(Class_1.default));\r\nexports.default = Scroller;\r\n\r\n\r\n/***/ }),\r\n/* 40 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar DateComponent_1 = __webpack_require__(219);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar InteractiveDateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(InteractiveDateComponent, _super);\r\n function InteractiveDateComponent(_view, _options) {\r\n var _this = _super.call(this, _view, _options) || this;\r\n // self-config, overridable by subclasses\r\n _this.segSelector = '.fc-event-container > *'; // what constitutes an event element?\r\n if (_this.dateSelectingClass) {\r\n _this.dateClicking = new _this.dateClickingClass(_this);\r\n }\r\n if (_this.dateSelectingClass) {\r\n _this.dateSelecting = new _this.dateSelectingClass(_this);\r\n }\r\n if (_this.eventPointingClass) {\r\n _this.eventPointing = new _this.eventPointingClass(_this);\r\n }\r\n if (_this.eventDraggingClass && _this.eventPointing) {\r\n _this.eventDragging = new _this.eventDraggingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.eventResizingClass && _this.eventPointing) {\r\n _this.eventResizing = new _this.eventResizingClass(_this, _this.eventPointing);\r\n }\r\n if (_this.externalDroppingClass) {\r\n _this.externalDropping = new _this.externalDroppingClass(_this);\r\n }\r\n return _this;\r\n }\r\n // Sets the container element that the view should render inside of, does global DOM-related initializations,\r\n // and renders all the non-date-related content inside.\r\n InteractiveDateComponent.prototype.setElement = function (el) {\r\n _super.prototype.setElement.call(this, el);\r\n if (this.dateClicking) {\r\n this.dateClicking.bindToEl(el);\r\n }\r\n if (this.dateSelecting) {\r\n this.dateSelecting.bindToEl(el);\r\n }\r\n this.bindAllSegHandlersToEl(el);\r\n };\r\n InteractiveDateComponent.prototype.removeElement = function () {\r\n this.endInteractions();\r\n _super.prototype.removeElement.call(this);\r\n };\r\n InteractiveDateComponent.prototype.executeEventUnrender = function () {\r\n this.endInteractions();\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n InteractiveDateComponent.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.bindToDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n if (this.externalDropping) {\r\n this.externalDropping.unbindFromDocument();\r\n }\r\n };\r\n InteractiveDateComponent.prototype.bindDateHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n // attach a handler to the grid's root element.\r\n // jQuery will take care of unregistering them when removeElement gets called.\r\n this.el.on(name, function (ev) {\r\n if (!$(ev.target).is(_this.segSelector + ':not(.fc-helper),' + // directly on an event element\r\n _this.segSelector + ':not(.fc-helper) *,' + // within an event element\r\n '.fc-more,' + // a \"more..\" link\r\n 'a[data-goto]' // a clickable nav link\r\n )) {\r\n return handler.call(_this, ev);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindAllSegHandlersToEl = function (el) {\r\n [\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (eventInteraction) {\r\n if (eventInteraction) {\r\n eventInteraction.bindToEl(el);\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.bindSegHandlerToEl = function (el, name, handler) {\r\n var _this = this;\r\n el.on(name, this.segSelector, function (ev) {\r\n var segEl = $(ev.currentTarget);\r\n if (!segEl.is('.fc-helper')) {\r\n var seg = segEl.data('fc-seg'); // grab segment data. put there by View::renderEventsPayload\r\n if (seg && !_this.shouldIgnoreEventPointing()) {\r\n return handler.call(_this, seg, ev); // context will be the Grid\r\n }\r\n }\r\n });\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreMouse = function () {\r\n // HACK\r\n // This will still work even though bindDateHandlerToEl doesn't use GlobalEmitter.\r\n return GlobalEmitter_1.default.get().shouldIgnoreMouse();\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreTouch = function () {\r\n var view = this._getView();\r\n // On iOS (and Android?) when a new selection is initiated overtop another selection,\r\n // the touchend never fires because the elements gets removed mid-touch-interaction (my theory).\r\n // HACK: simply don't allow this to happen.\r\n // ALSO: prevent selection when an *event* is already raised.\r\n return view.isSelected || view.selectedEvent;\r\n };\r\n InteractiveDateComponent.prototype.shouldIgnoreEventPointing = function () {\r\n // only call the handlers if there is not a drag/resize in progress\r\n return (this.eventDragging && this.eventDragging.isDragging) ||\r\n (this.eventResizing && this.eventResizing.isResizing);\r\n };\r\n InteractiveDateComponent.prototype.canStartSelection = function (seg, ev) {\r\n return util_1.getEvIsTouch(ev) &&\r\n !this.canStartResize(seg, ev) &&\r\n (this.isEventDefDraggable(seg.footprint.eventDef) ||\r\n this.isEventDefResizable(seg.footprint.eventDef));\r\n };\r\n InteractiveDateComponent.prototype.canStartDrag = function (seg, ev) {\r\n return !this.canStartResize(seg, ev) &&\r\n this.isEventDefDraggable(seg.footprint.eventDef);\r\n };\r\n InteractiveDateComponent.prototype.canStartResize = function (seg, ev) {\r\n var view = this._getView();\r\n var eventDef = seg.footprint.eventDef;\r\n return (!util_1.getEvIsTouch(ev) || view.isEventDefSelected(eventDef)) &&\r\n this.isEventDefResizable(eventDef) &&\r\n $(ev.target).is('.fc-resizer');\r\n };\r\n // Kills all in-progress dragging.\r\n // Useful for when public API methods that result in re-rendering are invoked during a drag.\r\n // Also useful for when touch devices misbehave and don't fire their touchend.\r\n InteractiveDateComponent.prototype.endInteractions = function () {\r\n [\r\n this.dateClicking,\r\n this.dateSelecting,\r\n this.eventPointing,\r\n this.eventDragging,\r\n this.eventResizing\r\n ].forEach(function (interaction) {\r\n if (interaction) {\r\n interaction.end();\r\n }\r\n });\r\n };\r\n // Event Drag-n-Drop\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be dragged by the user\r\n InteractiveDateComponent.prototype.isEventDefDraggable = function (eventDef) {\r\n return this.isEventDefStartEditable(eventDef);\r\n };\r\n InteractiveDateComponent.prototype.isEventDefStartEditable = function (eventDef) {\r\n var isEditable = eventDef.isStartExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('eventStartEditable');\r\n if (isEditable == null) {\r\n isEditable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isEditable;\r\n };\r\n InteractiveDateComponent.prototype.isEventDefGenerallyEditable = function (eventDef) {\r\n var isEditable = eventDef.isExplicitlyEditable();\r\n if (isEditable == null) {\r\n isEditable = this.opt('editable');\r\n }\r\n return isEditable;\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Computes if the given event is allowed to be resized from its starting edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromStart = function (eventDef) {\r\n return this.opt('eventResizableFromStart') && this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized from its ending edge\r\n InteractiveDateComponent.prototype.isEventDefResizableFromEnd = function (eventDef) {\r\n return this.isEventDefResizable(eventDef);\r\n };\r\n // Computes if the given event is allowed to be resized by the user at all\r\n InteractiveDateComponent.prototype.isEventDefResizable = function (eventDef) {\r\n var isResizable = eventDef.isDurationExplicitlyEditable();\r\n if (isResizable == null) {\r\n isResizable = this.opt('eventDurationEditable');\r\n if (isResizable == null) {\r\n isResizable = this.isEventDefGenerallyEditable(eventDef);\r\n }\r\n }\r\n return isResizable;\r\n };\r\n // Event Mutation / Constraints\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Diffs the two dates, returning a duration, based on granularity of the grid\r\n // TODO: port isTimeScale into this system?\r\n InteractiveDateComponent.prototype.diffDates = function (a, b) {\r\n if (this.largeUnit) {\r\n return util_1.diffByUnit(a, b, this.largeUnit);\r\n }\r\n else {\r\n return util_1.diffDayTime(a, b);\r\n }\r\n };\r\n // is it allowed, in relation to the view's validRange?\r\n // NOTE: very similar to isExternalInstanceGroupAllowed\r\n InteractiveDateComponent.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // TODO: just use getAllEventRanges directly\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n return view.calendar.constraints.isEventInstanceGroupAllowed(eventInstanceGroup);\r\n };\r\n // NOTE: very similar to isEventInstanceGroupAllowed\r\n // when it's a completely anonymous external drag, no event.\r\n InteractiveDateComponent.prototype.isExternalInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var view = this._getView();\r\n var dateProfile = this.dateProfile;\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {\r\n return false;\r\n }\r\n }\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n // treat it as a selection\r\n // TODO: pass in eventInstanceGroup instead\r\n // because we don't want calendar's constraint system to depend on a component's\r\n // determination of footprints.\r\n if (!view.calendar.constraints.isSelectionFootprintAllowed(eventFootprints[i].componentFootprint)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n return InteractiveDateComponent;\r\n}(DateComponent_1.default));\r\nexports.default = InteractiveDateComponent;\r\n\r\n\r\n/***/ }),\r\n/* 41 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar RenderQueue_1 = __webpack_require__(218);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\n/* An abstract class from which other views inherit from\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar View = /** @class */ (function (_super) {\r\n tslib_1.__extends(View, _super);\r\n function View(calendar, viewSpec) {\r\n var _this = _super.call(this, null, viewSpec.options) || this;\r\n _this.batchRenderDepth = 0;\r\n _this.isSelected = false; // boolean whether a range of time is user-selected or not\r\n _this.calendar = calendar;\r\n _this.viewSpec = viewSpec;\r\n // shortcuts\r\n _this.type = viewSpec.type;\r\n // .name is deprecated\r\n _this.name = _this.type;\r\n _this.initRenderQueue();\r\n _this.initHiddenDays();\r\n _this.dateProfileGenerator = new _this.dateProfileGeneratorClass(_this);\r\n _this.bindBaseRenderHandlers();\r\n _this.eventOrderSpecs = util_1.parseFieldSpecs(_this.opt('eventOrder'));\r\n // legacy\r\n if (_this['initialize']) {\r\n _this['initialize']();\r\n }\r\n return _this;\r\n }\r\n View.prototype._getView = function () {\r\n return this;\r\n };\r\n // Retrieves an option with the given name\r\n View.prototype.opt = function (name) {\r\n return this.options[name];\r\n };\r\n /* Render Queue\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.initRenderQueue = function () {\r\n this.renderQueue = new RenderQueue_1.default({\r\n event: this.opt('eventRenderWait')\r\n });\r\n this.renderQueue.on('start', this.onRenderQueueStart.bind(this));\r\n this.renderQueue.on('stop', this.onRenderQueueStop.bind(this));\r\n this.on('before:change', this.startBatchRender);\r\n this.on('change', this.stopBatchRender);\r\n };\r\n View.prototype.onRenderQueueStart = function () {\r\n this.calendar.freezeContentHeight();\r\n this.addScroll(this.queryScroll());\r\n };\r\n View.prototype.onRenderQueueStop = function () {\r\n if (this.calendar.updateViewSize()) {\r\n this.popScroll();\r\n }\r\n this.calendar.thawContentHeight();\r\n };\r\n View.prototype.startBatchRender = function () {\r\n if (!(this.batchRenderDepth++)) {\r\n this.renderQueue.pause();\r\n }\r\n };\r\n View.prototype.stopBatchRender = function () {\r\n if (!(--this.batchRenderDepth)) {\r\n this.renderQueue.resume();\r\n }\r\n };\r\n View.prototype.requestRender = function (func, namespace, actionType) {\r\n this.renderQueue.queue(func, namespace, actionType);\r\n };\r\n // given func will auto-bind to `this`\r\n View.prototype.whenSizeUpdated = function (func) {\r\n if (this.renderQueue.isRunning) {\r\n this.renderQueue.one('stop', func.bind(this));\r\n }\r\n else {\r\n func.call(this);\r\n }\r\n };\r\n /* Title and Date Formatting\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes what the title at the top of the calendar should be for this view\r\n View.prototype.computeTitle = function (dateProfile) {\r\n var unzonedRange;\r\n // for views that span a large unit of time, show the proper interval, ignoring stray days before and after\r\n if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {\r\n unzonedRange = dateProfile.currentUnzonedRange;\r\n }\r\n else {\r\n unzonedRange = dateProfile.activeUnzonedRange;\r\n }\r\n return this.formatRange({\r\n start: this.calendar.msToMoment(unzonedRange.startMs, dateProfile.isRangeAllDay),\r\n end: this.calendar.msToMoment(unzonedRange.endMs, dateProfile.isRangeAllDay)\r\n }, dateProfile.isRangeAllDay, this.opt('titleFormat') || this.computeTitleFormat(dateProfile), this.opt('titleRangeSeparator'));\r\n };\r\n // Generates the format string that should be used to generate the title for the current date range.\r\n // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\r\n View.prototype.computeTitleFormat = function (dateProfile) {\r\n var currentRangeUnit = dateProfile.currentRangeUnit;\r\n if (currentRangeUnit === 'year') {\r\n return 'YYYY';\r\n }\r\n else if (currentRangeUnit === 'month') {\r\n return this.opt('monthYearFormat'); // like \"September 2014\"\r\n }\r\n else if (dateProfile.currentUnzonedRange.as('days') > 1) {\r\n return 'll'; // multi-day range. shorter, like \"Sep 9 - 10 2014\"\r\n }\r\n else {\r\n return 'LL'; // one day. longer, like \"September 9 2014\"\r\n }\r\n };\r\n // Date Setting/Unsetting\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.setDate = function (date) {\r\n var currentDateProfile = this.get('dateProfile');\r\n var newDateProfile = this.dateProfileGenerator.build(date, undefined, true); // forceToValid=true\r\n if (!currentDateProfile ||\r\n !currentDateProfile.activeUnzonedRange.equals(newDateProfile.activeUnzonedRange)) {\r\n this.set('dateProfile', newDateProfile);\r\n }\r\n };\r\n View.prototype.unsetDate = function () {\r\n this.unset('dateProfile');\r\n };\r\n // Event Data\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.fetchInitialEvents = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var forceAllDay = dateProfile.isRangeAllDay && !this.usesMinMaxTime;\r\n return calendar.requestEvents(calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, forceAllDay), calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, forceAllDay));\r\n };\r\n View.prototype.bindEventChanges = function () {\r\n this.listenTo(this.calendar, 'eventsReset', this.resetEvents); // TODO: make this a real event\r\n };\r\n View.prototype.unbindEventChanges = function () {\r\n this.stopListeningTo(this.calendar, 'eventsReset');\r\n };\r\n View.prototype.setEvents = function (eventsPayload) {\r\n this.set('currentEvents', eventsPayload);\r\n this.set('hasEvents', true);\r\n };\r\n View.prototype.unsetEvents = function () {\r\n this.unset('currentEvents');\r\n this.unset('hasEvents');\r\n };\r\n View.prototype.resetEvents = function (eventsPayload) {\r\n this.startBatchRender();\r\n this.unsetEvents();\r\n this.setEvents(eventsPayload);\r\n this.stopBatchRender();\r\n };\r\n // Date High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestDateRender = function (dateProfile) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateRender(dateProfile);\r\n }, 'date', 'init');\r\n };\r\n View.prototype.requestDateUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeDateUnrender();\r\n }, 'date', 'destroy');\r\n };\r\n // if dateProfile not specified, uses current\r\n View.prototype.executeDateRender = function (dateProfile) {\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n if (this['render']) {\r\n this['render'](); // TODO: deprecate\r\n }\r\n this.trigger('datesRendered');\r\n this.addScroll({ isDateInit: true });\r\n this.startNowIndicator(); // shouldn't render yet because updateSize will be called soon\r\n };\r\n View.prototype.executeDateUnrender = function () {\r\n this.unselect();\r\n this.stopNowIndicator();\r\n this.trigger('before:datesUnrendered');\r\n if (this['destroy']) {\r\n this['destroy'](); // TODO: deprecate\r\n }\r\n _super.prototype.executeDateUnrender.call(this);\r\n };\r\n // \"Base\" rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.bindBaseRenderHandlers = function () {\r\n var _this = this;\r\n this.on('datesRendered', function () {\r\n _this.whenSizeUpdated(_this.triggerViewRender);\r\n });\r\n this.on('before:datesUnrendered', function () {\r\n _this.triggerViewDestroy();\r\n });\r\n };\r\n View.prototype.triggerViewRender = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerViewDestroy = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Event High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestEventsRender = function (eventsPayload) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.executeEventRender(eventsPayload);\r\n _this.whenSizeUpdated(_this.triggerAfterEventsRendered);\r\n }, 'event', 'init');\r\n };\r\n View.prototype.requestEventsUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.triggerBeforeEventsDestroyed();\r\n _this.executeEventUnrender();\r\n }, 'event', 'destroy');\r\n };\r\n // Business Hour High-level Rendering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n View.prototype.requestBusinessHoursRender = function (businessHourGenerator) {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.renderBusinessHours(businessHourGenerator);\r\n }, 'businessHours', 'init');\r\n };\r\n View.prototype.requestBusinessHoursUnrender = function () {\r\n var _this = this;\r\n this.requestRender(function () {\r\n _this.unrenderBusinessHours();\r\n }, 'businessHours', 'destroy');\r\n };\r\n // Misc view rendering utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Binds DOM handlers to elements that reside outside the view container, such as the document\r\n View.prototype.bindGlobalHandlers = function () {\r\n _super.prototype.bindGlobalHandlers.call(this);\r\n this.listenTo(GlobalEmitter_1.default.get(), {\r\n touchstart: this.processUnselect,\r\n mousedown: this.handleDocumentMousedown\r\n });\r\n };\r\n // Unbinds DOM handlers from elements that reside outside the view container\r\n View.prototype.unbindGlobalHandlers = function () {\r\n _super.prototype.unbindGlobalHandlers.call(this);\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Immediately render the current time indicator and begins re-rendering it at an interval,\r\n // which is defined by this.getNowIndicatorUnit().\r\n // TODO: somehow do this for the current whole day's background too\r\n View.prototype.startNowIndicator = function () {\r\n var _this = this;\r\n var unit;\r\n var update;\r\n var delay; // ms wait value\r\n if (this.opt('nowIndicator')) {\r\n unit = this.getNowIndicatorUnit();\r\n if (unit) {\r\n update = util_1.proxy(this, 'updateNowIndicator'); // bind to `this`\r\n this.initialNowDate = this.calendar.getNow();\r\n this.initialNowQueriedMs = new Date().valueOf();\r\n // wait until the beginning of the next interval\r\n delay = this.initialNowDate.clone().startOf(unit).add(1, unit).valueOf() - this.initialNowDate.valueOf();\r\n this.nowIndicatorTimeoutID = setTimeout(function () {\r\n _this.nowIndicatorTimeoutID = null;\r\n update();\r\n delay = +moment.duration(1, unit);\r\n delay = Math.max(100, delay); // prevent too frequent\r\n _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval\r\n }, delay);\r\n }\r\n // rendering will be initiated in updateSize\r\n }\r\n };\r\n // rerenders the now indicator, computing the new current time from the amount of time that has passed\r\n // since the initial getNow call.\r\n View.prototype.updateNowIndicator = function () {\r\n if (this.isDatesRendered &&\r\n this.initialNowDate // activated before?\r\n ) {\r\n this.unrenderNowIndicator(); // won't unrender if unnecessary\r\n this.renderNowIndicator(this.initialNowDate.clone().add(new Date().valueOf() - this.initialNowQueriedMs) // add ms\r\n );\r\n this.isNowIndicatorRendered = true;\r\n }\r\n };\r\n // Immediately unrenders the view's current time indicator and stops any re-rendering timers.\r\n // Won't cause side effects if indicator isn't rendered.\r\n View.prototype.stopNowIndicator = function () {\r\n if (this.isNowIndicatorRendered) {\r\n if (this.nowIndicatorTimeoutID) {\r\n clearTimeout(this.nowIndicatorTimeoutID);\r\n this.nowIndicatorTimeoutID = null;\r\n }\r\n if (this.nowIndicatorIntervalID) {\r\n clearInterval(this.nowIndicatorIntervalID);\r\n this.nowIndicatorIntervalID = null;\r\n }\r\n this.unrenderNowIndicator();\r\n this.isNowIndicatorRendered = false;\r\n }\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n if (this['setHeight']) {\r\n this['setHeight'](totalHeight, isAuto);\r\n }\r\n else {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n }\r\n this.updateNowIndicator();\r\n };\r\n /* Scroller\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.addScroll = function (scroll) {\r\n var queuedScroll = this.queuedScroll || (this.queuedScroll = {});\r\n $.extend(queuedScroll, scroll);\r\n };\r\n View.prototype.popScroll = function () {\r\n this.applyQueuedScroll();\r\n this.queuedScroll = null;\r\n };\r\n View.prototype.applyQueuedScroll = function () {\r\n if (this.queuedScroll) {\r\n this.applyScroll(this.queuedScroll);\r\n }\r\n };\r\n View.prototype.queryScroll = function () {\r\n var scroll = {};\r\n if (this.isDatesRendered) {\r\n $.extend(scroll, this.queryDateScroll());\r\n }\r\n return scroll;\r\n };\r\n View.prototype.applyScroll = function (scroll) {\r\n if (scroll.isDateInit && this.isDatesRendered) {\r\n $.extend(scroll, this.computeInitialDateScroll());\r\n }\r\n if (this.isDatesRendered) {\r\n this.applyDateScroll(scroll);\r\n }\r\n };\r\n View.prototype.computeInitialDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.queryDateScroll = function () {\r\n return {}; // subclasses must implement\r\n };\r\n View.prototype.applyDateScroll = function (scroll) {\r\n // subclasses must implement\r\n };\r\n /* Event Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.reportEventDrop = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n var dateMutation = eventMutation.dateMutation;\r\n // update the EventInstance, for handlers\r\n if (dateMutation) {\r\n eventInstance.dateProfile = dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n }\r\n this.triggerEventDrop(eventInstance, \r\n // a drop doesn't necessarily mean a date mutation (ex: resource change)\r\n (dateMutation && dateMutation.dateDelta) || moment.duration(), undoFunc, el, ev);\r\n };\r\n // Triggers event-drop handlers that have subscribed via the API\r\n View.prototype.triggerEventDrop = function (eventInstance, dateDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventDrop', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n dateDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* External Element Drag-n-Drop\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an external element, via jQuery UI, has been dropped onto the calendar.\r\n // `meta` is the parsed data that has been embedded into the dragging event.\r\n // `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.\r\n View.prototype.reportExternalDrop = function (singleEventDef, isEvent, isSticky, el, ev, ui) {\r\n if (isEvent) {\r\n this.calendar.eventManager.addEventDef(singleEventDef, isSticky);\r\n }\r\n this.triggerExternalDrop(singleEventDef, isEvent, el, ev, ui);\r\n };\r\n // Triggers external-drop handlers that have subscribed via the API\r\n View.prototype.triggerExternalDrop = function (singleEventDef, isEvent, el, ev, ui) {\r\n // trigger 'drop' regardless of whether element represents an event\r\n this.publiclyTrigger('drop', {\r\n context: el[0],\r\n args: [\r\n singleEventDef.dateProfile.start.clone(),\r\n ev,\r\n ui,\r\n this\r\n ]\r\n });\r\n if (isEvent) {\r\n // signal an external event landed\r\n this.publiclyTrigger('eventReceive', {\r\n context: this,\r\n args: [\r\n singleEventDef.buildInstance().toLegacy(),\r\n this\r\n ]\r\n });\r\n }\r\n };\r\n /* Event Resizing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Must be called when an event in the view has been resized to a new length\r\n View.prototype.reportEventResize = function (eventInstance, eventMutation, el, ev) {\r\n var eventManager = this.calendar.eventManager;\r\n var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);\r\n // update the EventInstance, for handlers\r\n eventInstance.dateProfile = eventMutation.dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);\r\n this.triggerEventResize(eventInstance, eventMutation.dateMutation.endDelta, undoFunc, el, ev);\r\n };\r\n // Triggers event-resize handlers that have subscribed via the API\r\n View.prototype.triggerEventResize = function (eventInstance, durationDelta, undoFunc, el, ev) {\r\n this.publiclyTrigger('eventResize', {\r\n context: el[0],\r\n args: [\r\n eventInstance.toLegacy(),\r\n durationDelta,\r\n undoFunc,\r\n ev,\r\n {},\r\n this\r\n ]\r\n });\r\n };\r\n /* Selection (time range)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Selects a date span on the view. `start` and `end` are both Moments.\r\n // `ev` is the native mouse event that begin the interaction.\r\n View.prototype.select = function (footprint, ev) {\r\n this.unselect(ev);\r\n this.renderSelectionFootprint(footprint);\r\n this.reportSelection(footprint, ev);\r\n };\r\n View.prototype.renderSelectionFootprint = function (footprint) {\r\n if (this['renderSelection']) {\r\n this['renderSelection'](footprint.toLegacy(this.calendar));\r\n }\r\n else {\r\n _super.prototype.renderSelectionFootprint.call(this, footprint);\r\n }\r\n };\r\n // Called when a new selection is made. Updates internal state and triggers handlers.\r\n View.prototype.reportSelection = function (footprint, ev) {\r\n this.isSelected = true;\r\n this.triggerSelect(footprint, ev);\r\n };\r\n // Triggers handlers to 'select'\r\n View.prototype.triggerSelect = function (footprint, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('select', {\r\n context: this,\r\n args: [\r\n dateProfile.start,\r\n dateProfile.end,\r\n ev,\r\n this\r\n ]\r\n });\r\n };\r\n // Undoes a selection. updates in the internal state and triggers handlers.\r\n // `ev` is the native mouse event that began the interaction.\r\n View.prototype.unselect = function (ev) {\r\n if (this.isSelected) {\r\n this.isSelected = false;\r\n if (this['destroySelection']) {\r\n this['destroySelection'](); // TODO: deprecate\r\n }\r\n this.unrenderSelection();\r\n this.publiclyTrigger('unselect', {\r\n context: this,\r\n args: [ev, this]\r\n });\r\n }\r\n };\r\n /* Event Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.selectEventInstance = function (eventInstance) {\r\n if (!this.selectedEventInstance ||\r\n this.selectedEventInstance !== eventInstance) {\r\n this.unselectEventInstance();\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventInstance === eventInstance &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.addClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = eventInstance;\r\n }\r\n };\r\n View.prototype.unselectEventInstance = function () {\r\n if (this.selectedEventInstance) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.el) {\r\n seg.el.removeClass('fc-selected');\r\n }\r\n });\r\n this.selectedEventInstance = null;\r\n }\r\n };\r\n View.prototype.isEventDefSelected = function (eventDef) {\r\n // event references might change on refetchEvents(), while selectedEventInstance doesn't,\r\n // so compare IDs\r\n return this.selectedEventInstance && this.selectedEventInstance.def.id === eventDef.id;\r\n };\r\n /* Mouse / Touch Unselecting (time range & event unselection)\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // TODO: move consistently to down/start or up/end?\r\n // TODO: don't kill previous selection if touch scrolling\r\n View.prototype.handleDocumentMousedown = function (ev) {\r\n if (util_1.isPrimaryMouseButton(ev)) {\r\n this.processUnselect(ev);\r\n }\r\n };\r\n View.prototype.processUnselect = function (ev) {\r\n this.processRangeUnselect(ev);\r\n this.processEventUnselect(ev);\r\n };\r\n View.prototype.processRangeUnselect = function (ev) {\r\n var ignore;\r\n // is there a time-range selection?\r\n if (this.isSelected && this.opt('unselectAuto')) {\r\n // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element\r\n ignore = this.opt('unselectCancel');\r\n if (!ignore || !$(ev.target).closest(ignore).length) {\r\n this.unselect(ev);\r\n }\r\n }\r\n };\r\n View.prototype.processEventUnselect = function (ev) {\r\n if (this.selectedEventInstance) {\r\n if (!$(ev.target).closest('.fc-selected').length) {\r\n this.unselectEventInstance();\r\n }\r\n }\r\n };\r\n /* Triggers\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n View.prototype.triggerBaseRendered = function () {\r\n this.publiclyTrigger('viewRender', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n View.prototype.triggerBaseUnrendered = function () {\r\n this.publiclyTrigger('viewDestroy', {\r\n context: this,\r\n args: [this, this.el]\r\n });\r\n };\r\n // Triggers handlers to 'dayClick'\r\n // Span has start/end of the clicked area. Only the start is useful.\r\n View.prototype.triggerDayClick = function (footprint, dayEl, ev) {\r\n var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of \"Event\"DateProfile?\r\n this.publiclyTrigger('dayClick', {\r\n context: dayEl,\r\n args: [dateProfile.start, ev, this]\r\n });\r\n };\r\n /* Date Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // For DateComponent::getDayClasses\r\n View.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return false;\r\n };\r\n // Arguments after name will be forwarded to a hypothetical function value\r\n // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.\r\n // Always clone your objects if you fear mutation.\r\n View.prototype.getUnzonedRangeOption = function (name) {\r\n var val = this.opt(name);\r\n if (typeof val === 'function') {\r\n val = val.apply(null, Array.prototype.slice.call(arguments, 1));\r\n }\r\n if (val) {\r\n return this.calendar.parseUnzonedRange(val);\r\n }\r\n };\r\n /* Hidden Days\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Initializes internal variables related to calculating hidden days-of-week\r\n View.prototype.initHiddenDays = function () {\r\n var hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden\r\n var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\r\n var dayCnt = 0;\r\n var i;\r\n if (this.opt('weekends') === false) {\r\n hiddenDays.push(0, 6); // 0=sunday, 6=saturday\r\n }\r\n for (i = 0; i < 7; i++) {\r\n if (!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)) {\r\n dayCnt++;\r\n }\r\n }\r\n if (!dayCnt) {\r\n throw new Error('invalid hiddenDays'); // all days were hidden? bad.\r\n }\r\n this.isHiddenDayHash = isHiddenDayHash;\r\n };\r\n // Remove days from the beginning and end of the range that are computed as hidden.\r\n // If the whole range is trimmed off, returns null\r\n View.prototype.trimHiddenDays = function (inputUnzonedRange) {\r\n var start = inputUnzonedRange.getStart();\r\n var end = inputUnzonedRange.getEnd();\r\n if (start) {\r\n start = this.skipHiddenDays(start);\r\n }\r\n if (end) {\r\n end = this.skipHiddenDays(end, -1, true);\r\n }\r\n if (start === null || end === null || start < end) {\r\n return new UnzonedRange_1.default(start, end);\r\n }\r\n return null;\r\n };\r\n // Is the current day hidden?\r\n // `day` is a day-of-week index (0-6), or a Moment\r\n View.prototype.isHiddenDay = function (day) {\r\n if (moment.isMoment(day)) {\r\n day = day.day();\r\n }\r\n return this.isHiddenDayHash[day];\r\n };\r\n // Incrementing the current day until it is no longer a hidden day, returning a copy.\r\n // DOES NOT CONSIDER validUnzonedRange!\r\n // If the initial value of `date` is not a hidden day, don't do anything.\r\n // Pass `isExclusive` as `true` if you are dealing with an end date.\r\n // `inc` defaults to `1` (increment one day forward each time)\r\n View.prototype.skipHiddenDays = function (date, inc, isExclusive) {\r\n if (inc === void 0) { inc = 1; }\r\n if (isExclusive === void 0) { isExclusive = false; }\r\n var out = date.clone();\r\n while (this.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]) {\r\n out.add(inc, 'days');\r\n }\r\n return out;\r\n };\r\n return View;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = View;\r\nView.prototype.usesMinMaxTime = false;\r\nView.prototype.dateProfileGeneratorClass = DateProfileGenerator_1.default;\r\nView.watch('displayingDates', ['isInDom', 'dateProfile'], function (deps) {\r\n this.requestDateRender(deps.dateProfile);\r\n}, function () {\r\n this.requestDateUnrender();\r\n});\r\nView.watch('displayingBusinessHours', ['displayingDates', 'businessHourGenerator'], function (deps) {\r\n this.requestBusinessHoursRender(deps.businessHourGenerator);\r\n}, function () {\r\n this.requestBusinessHoursUnrender();\r\n});\r\nView.watch('initialEvents', ['dateProfile'], function (deps) {\r\n return this.fetchInitialEvents(deps.dateProfile);\r\n});\r\nView.watch('bindingEvents', ['initialEvents'], function (deps) {\r\n this.setEvents(deps.initialEvents);\r\n this.bindEventChanges();\r\n}, function () {\r\n this.unbindEventChanges();\r\n this.unsetEvents();\r\n});\r\nView.watch('displayingEvents', ['displayingDates', 'hasEvents'], function () {\r\n this.requestEventsRender(this.get('currentEvents'));\r\n}, function () {\r\n this.requestEventsUnrender();\r\n});\r\nView.watch('title', ['dateProfile'], function (deps) {\r\n return (this.title = this.computeTitle(deps.dateProfile)); // assign to View for legacy reasons\r\n});\r\nView.watch('legacyDateProps', ['dateProfile'], function (deps) {\r\n var calendar = this.calendar;\r\n var dateProfile = deps.dateProfile;\r\n // DEPRECATED, but we need to keep it updated...\r\n this.start = calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.end = calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n this.intervalStart = calendar.msToMoment(dateProfile.currentUnzonedRange.startMs, dateProfile.isRangeAllDay);\r\n this.intervalEnd = calendar.msToMoment(dateProfile.currentUnzonedRange.endMs, dateProfile.isRangeAllDay);\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 42 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer = /** @class */ (function () {\r\n function EventRenderer(component, fillRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n EventRenderer.prototype.opt = function (name) {\r\n return this.view.opt(name);\r\n };\r\n // Updates values that rely on options and also relate to range\r\n EventRenderer.prototype.rangeUpdated = function () {\r\n var displayEventTime;\r\n var displayEventEnd;\r\n this.eventTimeFormat =\r\n this.opt('eventTimeFormat') ||\r\n this.opt('timeFormat') || // deprecated\r\n this.computeEventTimeFormat();\r\n displayEventTime = this.opt('displayEventTime');\r\n if (displayEventTime == null) {\r\n displayEventTime = this.computeDisplayEventTime(); // might be based off of range\r\n }\r\n displayEventEnd = this.opt('displayEventEnd');\r\n if (displayEventEnd == null) {\r\n displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\r\n }\r\n this.displayEventTime = displayEventTime;\r\n this.displayEventEnd = displayEventEnd;\r\n };\r\n EventRenderer.prototype.render = function (eventsPayload) {\r\n var dateProfile = this.component._getDateProfile();\r\n var eventDefId;\r\n var instanceGroup;\r\n var eventRanges;\r\n var bgRanges = [];\r\n var fgRanges = [];\r\n for (eventDefId in eventsPayload) {\r\n instanceGroup = eventsPayload[eventDefId];\r\n eventRanges = instanceGroup.sliceRenderRanges(dateProfile.activeUnzonedRange);\r\n if (instanceGroup.getEventDef().hasBgRendering()) {\r\n bgRanges.push.apply(bgRanges, eventRanges);\r\n }\r\n else {\r\n fgRanges.push.apply(fgRanges, eventRanges);\r\n }\r\n }\r\n this.renderBgRanges(bgRanges);\r\n this.renderFgRanges(fgRanges);\r\n };\r\n EventRenderer.prototype.unrender = function () {\r\n this.unrenderBgRanges();\r\n this.unrenderFgRanges();\r\n };\r\n EventRenderer.prototype.renderFgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n // render an `.el` on each seg\r\n // returns a subset of the segs. segs that were actually rendered\r\n segs = this.renderFgSegEls(segs);\r\n if (this.renderFgSegs(segs) !== false) {\r\n this.fgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderFgRanges = function () {\r\n this.unrenderFgSegs(this.fgSegs || []);\r\n this.fgSegs = null;\r\n };\r\n EventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n if (this.renderBgSegs(segs) !== false) {\r\n this.bgSegs = segs;\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgRanges = function () {\r\n this.unrenderBgSegs();\r\n this.bgSegs = null;\r\n };\r\n EventRenderer.prototype.getSegs = function () {\r\n return (this.bgSegs || []).concat(this.fgSegs || []);\r\n };\r\n // Renders foreground event segments onto the grid\r\n EventRenderer.prototype.renderFgSegs = function (segs) {\r\n // subclasses must implement\r\n // segs already has rendered els, and has been filtered.\r\n return false; // signal failure if not implemented\r\n };\r\n // Unrenders all currently rendered foreground segments\r\n EventRenderer.prototype.unrenderFgSegs = function (segs) {\r\n // subclasses must implement\r\n };\r\n EventRenderer.prototype.renderBgSegs = function (segs) {\r\n var _this = this;\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('bgEvent', segs, {\r\n getClasses: function (seg) {\r\n return _this.getBgClasses(seg.footprint.eventDef);\r\n },\r\n getCss: function (seg) {\r\n return {\r\n 'background-color': _this.getBgColor(seg.footprint.eventDef)\r\n };\r\n },\r\n filterEl: function (seg, el) {\r\n return _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n });\r\n }\r\n else {\r\n return false; // signal failure if no fillRenderer\r\n }\r\n };\r\n EventRenderer.prototype.unrenderBgSegs = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('bgEvent');\r\n }\r\n };\r\n // Renders and assigns an `el` property for each foreground event segment.\r\n // Only returns segments that successfully rendered.\r\n EventRenderer.prototype.renderFgSegEls = function (segs, disableResizing) {\r\n var _this = this;\r\n if (disableResizing === void 0) { disableResizing = false; }\r\n var hasEventRenderHandlers = this.view.hasPublicHandlers('eventRender');\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of event segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n this.beforeFgSegHtml(segs[i]);\r\n html += this.fgSegHtml(segs[i], disableResizing);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n if (hasEventRenderHandlers) {\r\n el = _this.filterEventRenderEl(seg.footprint, el);\r\n }\r\n if (el) {\r\n el.data('fc-seg', seg); // used by handlers\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n EventRenderer.prototype.beforeFgSegHtml = function (seg) {\r\n };\r\n // Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()\r\n EventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n // subclasses should implement\r\n };\r\n // Generic utility for generating the HTML classNames for an event segment's element\r\n EventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable) {\r\n var classes = [\r\n 'fc-event',\r\n seg.isStart ? 'fc-start' : 'fc-not-start',\r\n seg.isEnd ? 'fc-end' : 'fc-not-end'\r\n ].concat(this.getClasses(seg.footprint.eventDef));\r\n if (isDraggable) {\r\n classes.push('fc-draggable');\r\n }\r\n if (isResizable) {\r\n classes.push('fc-resizable');\r\n }\r\n // event is currently selected? attach a className.\r\n if (this.view.isEventDefSelected(seg.footprint.eventDef)) {\r\n classes.push('fc-selected');\r\n }\r\n return classes;\r\n };\r\n // Given an event and the default element used for rendering, returns the element that should actually be used.\r\n // Basically runs events and elements through the eventRender hook.\r\n EventRenderer.prototype.filterEventRenderEl = function (eventFootprint, el) {\r\n var legacy = eventFootprint.getEventLegacy();\r\n var custom = this.view.publiclyTrigger('eventRender', {\r\n context: legacy,\r\n args: [legacy, el, this.view]\r\n });\r\n if (custom === false) {\r\n el = null;\r\n }\r\n else if (custom && custom !== true) {\r\n el = $(custom);\r\n }\r\n return el;\r\n };\r\n // Compute the text that should be displayed on an event's element.\r\n // `range` can be the Event object itself, or something range-like, with at least a `start`.\r\n // If event times are disabled, or the event has no time, will return a blank string.\r\n // If not specified, formatStr will default to the eventTimeFormat setting,\r\n // and displayEnd will default to the displayEventEnd setting.\r\n EventRenderer.prototype.getTimeText = function (eventFootprint, formatStr, displayEnd) {\r\n return this._getTimeText(eventFootprint.eventInstance.dateProfile.start, eventFootprint.eventInstance.dateProfile.end, eventFootprint.componentFootprint.isAllDay, formatStr, displayEnd);\r\n };\r\n EventRenderer.prototype._getTimeText = function (start, end, isAllDay, formatStr, displayEnd) {\r\n if (formatStr == null) {\r\n formatStr = this.eventTimeFormat;\r\n }\r\n if (displayEnd == null) {\r\n displayEnd = this.displayEventEnd;\r\n }\r\n if (this.displayEventTime && !isAllDay) {\r\n if (displayEnd && end) {\r\n return this.view.formatRange({ start: start, end: end }, false, // allDay\r\n formatStr);\r\n }\r\n else {\r\n return start.format(formatStr);\r\n }\r\n }\r\n return '';\r\n };\r\n EventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('smallTimeFormat');\r\n };\r\n EventRenderer.prototype.computeDisplayEventTime = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n EventRenderer.prototype.getBgClasses = function (eventDef) {\r\n var classNames = this.getClasses(eventDef);\r\n classNames.push('fc-bgevent');\r\n return classNames;\r\n };\r\n EventRenderer.prototype.getClasses = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var classNames = [];\r\n for (i = 0; i < objs.length; i++) {\r\n classNames.push.apply(// append\r\n classNames, objs[i].eventClassName || objs[i].className || []);\r\n }\r\n return classNames;\r\n };\r\n // Utility for generating event skin-related CSS properties\r\n EventRenderer.prototype.getSkinCss = function (eventDef) {\r\n return {\r\n 'background-color': this.getBgColor(eventDef),\r\n 'border-color': this.getBorderColor(eventDef),\r\n color: this.getTextColor(eventDef)\r\n };\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBgColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBackgroundColor || objs[i].eventColor ||\r\n objs[i].backgroundColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBackgroundColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getBorderColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventBorderColor || objs[i].eventColor ||\r\n objs[i].borderColor || objs[i].color;\r\n }\r\n if (!val) {\r\n val = this.opt('eventBorderColor') || this.opt('eventColor');\r\n }\r\n return val;\r\n };\r\n // Queries for caller-specified color, then falls back to default\r\n EventRenderer.prototype.getTextColor = function (eventDef) {\r\n var objs = this.getStylingObjs(eventDef);\r\n var i;\r\n var val;\r\n for (i = 0; i < objs.length && !val; i++) {\r\n val = objs[i].eventTextColor ||\r\n objs[i].textColor;\r\n }\r\n if (!val) {\r\n val = this.opt('eventTextColor');\r\n }\r\n return val;\r\n };\r\n EventRenderer.prototype.getStylingObjs = function (eventDef) {\r\n var objs = this.getFallbackStylingObjs(eventDef);\r\n objs.unshift(eventDef);\r\n return objs;\r\n };\r\n EventRenderer.prototype.getFallbackStylingObjs = function (eventDef) {\r\n return [eventDef.source];\r\n };\r\n EventRenderer.prototype.sortEventSegs = function (segs) {\r\n segs.sort(util_1.proxy(this, 'compareEventSegs'));\r\n };\r\n // A cmp function for determining which segments should take visual priority\r\n EventRenderer.prototype.compareEventSegs = function (seg1, seg2) {\r\n var f1 = seg1.footprint;\r\n var f2 = seg2.footprint;\r\n var cf1 = f1.componentFootprint;\r\n var cf2 = f2.componentFootprint;\r\n var r1 = cf1.unzonedRange;\r\n var r2 = cf2.unzonedRange;\r\n return r1.startMs - r2.startMs || // earlier events go first\r\n (r2.endMs - r2.startMs) - (r1.endMs - r1.startMs) || // tie? longer events go first\r\n cf2.isAllDay - cf1.isAllDay || // tie? put all-day events first (booleans cast to 0/1)\r\n util_1.compareByFieldSpecs(f1.eventDef, f2.eventDef, this.view.eventOrderSpecs, f1.eventDef.miscProps, f2.eventDef.miscProps);\r\n };\r\n return EventRenderer;\r\n}());\r\nexports.default = EventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 43 */,\r\n/* 44 */,\r\n/* 45 */,\r\n/* 46 */,\r\n/* 47 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment_ext_1 = __webpack_require__(10);\r\n// Plugin\r\n// -------------------------------------------------------------------------------------------------\r\nmoment_ext_1.newMomentProto.format = function () {\r\n if (this._fullCalendar && arguments[0]) {\r\n return formatDate(this, arguments[0]); // our extended formatting\r\n }\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // moment.format() doesn't ensure english, but we want to.\r\n return moment_ext_1.oldMomentFormat(englishMoment(this));\r\n }\r\n return moment_ext_1.oldMomentProto.format.apply(this, arguments);\r\n};\r\nmoment_ext_1.newMomentProto.toISOString = function () {\r\n if (this._ambigTime) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');\r\n }\r\n if (this._ambigZone) {\r\n return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');\r\n }\r\n if (this._fullCalendar) {\r\n // depending on browser, moment might not output english. ensure english.\r\n // https://github.com/moment/moment/blob/2.18.1/src/lib/moment/format.js#L22\r\n return moment_ext_1.oldMomentProto.toISOString.apply(englishMoment(this), arguments);\r\n }\r\n return moment_ext_1.oldMomentProto.toISOString.apply(this, arguments);\r\n};\r\nfunction englishMoment(mom) {\r\n if (mom.locale() !== 'en') {\r\n return mom.clone().locale('en');\r\n }\r\n return mom;\r\n}\r\n// Config\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nInserted between chunks in the fake (\"intermediate\") formatting string.\r\nImportant that it passes as whitespace (\\s) because moment often identifies non-standalone months\r\nvia a regexp with an \\s.\r\n*/\r\nvar PART_SEPARATOR = '\\u000b'; // vertical tab\r\n/*\r\nInserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,\r\nbut rather, a \"special\" token that has custom rendering (see specialTokens map).\r\n*/\r\nvar SPECIAL_TOKEN_MARKER = '\\u001f'; // information separator 1\r\n/*\r\nInserted at the beginning and end of a span of text that must have non-zero numeric characters.\r\nHandling of these markers is done in a post-processing step at the very end of text rendering.\r\n*/\r\nvar MAYBE_MARKER = '\\u001e'; // information separator 2\r\nvar MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global\r\n/*\r\nAddition formatting tokens we want recognized\r\n*/\r\nvar specialTokens = {\r\n t: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'a').charAt(0);\r\n },\r\n T: function (date) {\r\n return moment_ext_1.oldMomentFormat(date, 'A').charAt(0);\r\n }\r\n};\r\n/*\r\nThe first characters of formatting tokens for units that are 1 day or larger.\r\n`value` is for ranking relative size (lower means bigger).\r\n`unit` is a normalized unit, used for comparing moments.\r\n*/\r\nvar largeTokenMap = {\r\n Y: { value: 1, unit: 'year' },\r\n M: { value: 2, unit: 'month' },\r\n W: { value: 3, unit: 'week' },\r\n w: { value: 3, unit: 'week' },\r\n D: { value: 4, unit: 'day' },\r\n d: { value: 4, unit: 'day' } // day of week\r\n};\r\n// Single Date Formatting\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats `date` with a Moment formatting string, but allow our non-zero areas and special token\r\n*/\r\nfunction formatDate(date, formatStr) {\r\n return renderFakeFormatString(getParsedFormatString(formatStr).fakeFormatString, date);\r\n}\r\nexports.formatDate = formatDate;\r\n// Date Range Formatting\r\n// -------------------------------------------------------------------------------------------------\r\n// TODO: make it work with timezone offset\r\n/*\r\nUsing a formatting string meant for a single date, generate a range string, like\r\n\"Sep 2 - 9 2013\", that intelligently inserts a separator where the dates differ.\r\nIf the dates are the same as far as the format string is concerned, just return a single\r\nrendering of one date, without any separator.\r\n*/\r\nfunction formatRange(date1, date2, formatStr, separator, isRTL) {\r\n var localeData;\r\n date1 = moment_ext_1.default.parseZone(date1);\r\n date2 = moment_ext_1.default.parseZone(date2);\r\n localeData = date1.localeData();\r\n // Expand localized format strings, like \"LL\" -> \"MMMM D YYYY\".\r\n // BTW, this is not important for `formatDate` because it is impossible to put custom tokens\r\n // or non-zero areas in Moment's localized format strings.\r\n formatStr = localeData.longDateFormat(formatStr) || formatStr;\r\n return renderParsedFormat(getParsedFormatString(formatStr), date1, date2, separator || ' - ', isRTL);\r\n}\r\nexports.formatRange = formatRange;\r\n/*\r\nRenders a range with an already-parsed format string.\r\n*/\r\nfunction renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {\r\n var sameUnits = parsedFormat.sameUnits;\r\n var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons\r\n var unzonedDate2 = date2.clone().stripZone(); // \"\r\n var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);\r\n var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);\r\n var leftI;\r\n var leftStr = '';\r\n var rightI;\r\n var rightStr = '';\r\n var middleI;\r\n var middleStr1 = '';\r\n var middleStr2 = '';\r\n var middleStr = '';\r\n // Start at the leftmost side of the formatting string and continue until you hit a token\r\n // that is not the same between dates.\r\n for (leftI = 0; leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI])); leftI++) {\r\n leftStr += renderedParts1[leftI];\r\n }\r\n // Similarly, start at the rightmost side of the formatting string and move left\r\n for (rightI = sameUnits.length - 1; rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI])); rightI--) {\r\n // If current chunk is on the boundary of unique date-content, and is a special-case\r\n // date-formatting postfix character, then don't consume it. Consider it unique date-content.\r\n // TODO: make configurable\r\n if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {\r\n break;\r\n }\r\n rightStr = renderedParts1[rightI] + rightStr;\r\n }\r\n // The area in the middle is different for both of the dates.\r\n // Collect them distinctly so we can jam them together later.\r\n for (middleI = leftI; middleI <= rightI; middleI++) {\r\n middleStr1 += renderedParts1[middleI];\r\n middleStr2 += renderedParts2[middleI];\r\n }\r\n if (middleStr1 || middleStr2) {\r\n if (isRTL) {\r\n middleStr = middleStr2 + separator + middleStr1;\r\n }\r\n else {\r\n middleStr = middleStr1 + separator + middleStr2;\r\n }\r\n }\r\n return processMaybeMarkers(leftStr + middleStr + rightStr);\r\n}\r\n// Format String Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nvar parsedFormatStrCache = {};\r\n/*\r\nReturns a parsed format string, leveraging a cache.\r\n*/\r\nfunction getParsedFormatString(formatStr) {\r\n return parsedFormatStrCache[formatStr] ||\r\n (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));\r\n}\r\n/*\r\nParses a format string into the following:\r\n- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.\r\n- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like \"day\"),\r\n that indicates how similar a range's start & end must be in order to share the same formatted text.\r\n If not a token, then the value is null.\r\n Always a flat array (not nested liked \"chunks\").\r\n*/\r\nfunction parseFormatString(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n return {\r\n fakeFormatString: buildFakeFormatString(chunks),\r\n sameUnits: buildSameUnits(chunks)\r\n };\r\n}\r\n/*\r\nBreak the formatting string into an array of chunks.\r\nA 'maybe' chunk will have nested chunks.\r\n*/\r\nfunction chunkFormatString(formatStr) {\r\n var chunks = [];\r\n var match;\r\n // TODO: more descrimination\r\n // \\4 is a backreference to the first character of a multi-character set.\r\n var chunker = /\\[([^\\]]*)\\]|\\(([^\\)]*)\\)|(LTS|LT|(\\w)\\4*o?)|([^\\w\\[\\(]+)/g;\r\n while ((match = chunker.exec(formatStr))) {\r\n if (match[1]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[1]));\r\n }\r\n else if (match[2]) {\r\n chunks.push({ maybe: chunkFormatString(match[2]) });\r\n }\r\n else if (match[3]) {\r\n chunks.push({ token: match[3] });\r\n }\r\n else if (match[5]) {\r\n chunks.push.apply(chunks, // append\r\n splitStringLiteral(match[5]));\r\n }\r\n }\r\n return chunks;\r\n}\r\n/*\r\nPotentially splits a literal-text string into multiple parts. For special cases.\r\n*/\r\nfunction splitStringLiteral(s) {\r\n if (s === '. ') {\r\n return ['.', ' ']; // for locales with periods bound to the end of each year/month/date\r\n }\r\n else {\r\n return [s];\r\n }\r\n}\r\n/*\r\nGiven chunks parsed from a real format string, generate a fake (aka \"intermediate\") format string with special control\r\ncharacters that will eventually be given to moment for formatting, and then post-processed.\r\n*/\r\nfunction buildFakeFormatString(chunks) {\r\n var parts = [];\r\n var i;\r\n var chunk;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (typeof chunk === 'string') {\r\n parts.push('[' + chunk + ']');\r\n }\r\n else if (chunk.token) {\r\n if (chunk.token in specialTokens) {\r\n parts.push(SPECIAL_TOKEN_MARKER + // useful during post-processing\r\n '[' + chunk.token + ']' // preserve as literal text\r\n );\r\n }\r\n else {\r\n parts.push(chunk.token); // unprotected text implies a format string\r\n }\r\n }\r\n else if (chunk.maybe) {\r\n parts.push(MAYBE_MARKER + // useful during post-processing\r\n buildFakeFormatString(chunk.maybe) +\r\n MAYBE_MARKER);\r\n }\r\n }\r\n return parts.join(PART_SEPARATOR);\r\n}\r\n/*\r\nGiven parsed chunks from a real formatting string, generates an array of unit strings (like \"day\") that indicate\r\nin which regard two dates must be similar in order to share range formatting text.\r\nThe `chunks` can be nested (because of \"maybe\" chunks), however, the returned array will be flat.\r\n*/\r\nfunction buildSameUnits(chunks) {\r\n var units = [];\r\n var i;\r\n var chunk;\r\n var tokenInfo;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n tokenInfo = largeTokenMap[chunk.token.charAt(0)];\r\n units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second\r\n }\r\n else if (chunk.maybe) {\r\n units.push.apply(units, // append\r\n buildSameUnits(chunk.maybe));\r\n }\r\n else {\r\n units.push(null);\r\n }\r\n }\r\n return units;\r\n}\r\n// Rendering to text\r\n// ---------------------------------------------------------------------------------------------------------------------\r\n/*\r\nFormats a date with a fake format string, post-processes the control characters, then returns.\r\n*/\r\nfunction renderFakeFormatString(fakeFormatString, date) {\r\n return processMaybeMarkers(renderFakeFormatStringParts(fakeFormatString, date).join(''));\r\n}\r\n/*\r\nFormats a date into parts that will have been post-processed, EXCEPT for the \"maybe\" markers.\r\n*/\r\nfunction renderFakeFormatStringParts(fakeFormatString, date) {\r\n var parts = [];\r\n var fakeRender = moment_ext_1.oldMomentFormat(date, fakeFormatString);\r\n var fakeParts = fakeRender.split(PART_SEPARATOR);\r\n var i;\r\n var fakePart;\r\n for (i = 0; i < fakeParts.length; i++) {\r\n fakePart = fakeParts[i];\r\n if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {\r\n parts.push(\r\n // the literal string IS the token's name.\r\n // call special token's registered function.\r\n specialTokens[fakePart.substring(1)](date));\r\n }\r\n else {\r\n parts.push(fakePart);\r\n }\r\n }\r\n return parts;\r\n}\r\n/*\r\nAccepts an almost-finally-formatted string and processes the \"maybe\" control characters, returning a new string.\r\n*/\r\nfunction processMaybeMarkers(s) {\r\n return s.replace(MAYBE_REGEXP, function (m0, m1) {\r\n if (m1.match(/[1-9]/)) {\r\n return m1;\r\n }\r\n else {\r\n return '';\r\n }\r\n });\r\n}\r\n// Misc Utils\r\n// -------------------------------------------------------------------------------------------------\r\n/*\r\nReturns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.\r\n*/\r\nfunction queryMostGranularFormatUnit(formatStr) {\r\n var chunks = chunkFormatString(formatStr);\r\n var i;\r\n var chunk;\r\n var candidate;\r\n var best;\r\n for (i = 0; i < chunks.length; i++) {\r\n chunk = chunks[i];\r\n if (chunk.token) {\r\n candidate = largeTokenMap[chunk.token.charAt(0)];\r\n if (candidate) {\r\n if (!best || candidate.value > best.value) {\r\n best = candidate;\r\n }\r\n }\r\n }\r\n }\r\n if (best) {\r\n return best.unit;\r\n }\r\n return null;\r\n}\r\nexports.queryMostGranularFormatUnit = queryMostGranularFormatUnit;\r\n\r\n\r\n/***/ }),\r\n/* 48 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Class_1 = __webpack_require__(33);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Model = /** @class */ (function (_super) {\r\n tslib_1.__extends(Model, _super);\r\n function Model() {\r\n var _this = _super.call(this) || this;\r\n _this._watchers = {};\r\n _this._props = {};\r\n _this.applyGlobalWatchers();\r\n _this.constructed();\r\n return _this;\r\n }\r\n Model.watch = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n // subclasses should make a masked-copy of the superclass's map\r\n // TODO: write test\r\n if (!this.prototype.hasOwnProperty('_globalWatchArgs')) {\r\n this.prototype._globalWatchArgs = Object.create(this.prototype._globalWatchArgs);\r\n }\r\n this.prototype._globalWatchArgs[name] = args;\r\n };\r\n Model.prototype.constructed = function () {\r\n // useful for monkeypatching. TODO: BaseClass?\r\n };\r\n Model.prototype.applyGlobalWatchers = function () {\r\n var map = this._globalWatchArgs;\r\n var name;\r\n for (name in map) {\r\n this.watch.apply(this, [name].concat(map[name]));\r\n }\r\n };\r\n Model.prototype.has = function (name) {\r\n return name in this._props;\r\n };\r\n Model.prototype.get = function (name) {\r\n if (name === undefined) {\r\n return this._props;\r\n }\r\n return this._props[name];\r\n };\r\n Model.prototype.set = function (name, val) {\r\n var newProps;\r\n if (typeof name === 'string') {\r\n newProps = {};\r\n newProps[name] = val === undefined ? null : val;\r\n }\r\n else {\r\n newProps = name;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.reset = function (newProps) {\r\n var oldProps = this._props;\r\n var changeset = {}; // will have undefined's to signal unsets\r\n var name;\r\n for (name in oldProps) {\r\n changeset[name] = undefined;\r\n }\r\n for (name in newProps) {\r\n changeset[name] = newProps[name];\r\n }\r\n this.setProps(changeset);\r\n };\r\n Model.prototype.unset = function (name) {\r\n var newProps = {};\r\n var names;\r\n var i;\r\n if (typeof name === 'string') {\r\n names = [name];\r\n }\r\n else {\r\n names = name;\r\n }\r\n for (i = 0; i < names.length; i++) {\r\n newProps[names[i]] = undefined;\r\n }\r\n this.setProps(newProps);\r\n };\r\n Model.prototype.setProps = function (newProps) {\r\n var changedProps = {};\r\n var changedCnt = 0;\r\n var name;\r\n var val;\r\n for (name in newProps) {\r\n val = newProps[name];\r\n // a change in value?\r\n // if an object, don't check equality, because might have been mutated internally.\r\n // TODO: eventually enforce immutability.\r\n if (typeof val === 'object' ||\r\n val !== this._props[name]) {\r\n changedProps[name] = val;\r\n changedCnt++;\r\n }\r\n }\r\n if (changedCnt) {\r\n this.trigger('before:batchChange', changedProps);\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n this.trigger('before:change', name, val);\r\n this.trigger('before:change:' + name, val);\r\n }\r\n for (name in changedProps) {\r\n val = changedProps[name];\r\n if (val === undefined) {\r\n delete this._props[name];\r\n }\r\n else {\r\n this._props[name] = val;\r\n }\r\n this.trigger('change:' + name, val);\r\n this.trigger('change', name, val);\r\n }\r\n this.trigger('batchChange', changedProps);\r\n }\r\n };\r\n Model.prototype.watch = function (name, depList, startFunc, stopFunc) {\r\n var _this = this;\r\n this.unwatch(name);\r\n this._watchers[name] = this._watchDeps(depList, function (deps) {\r\n var res = startFunc.call(_this, deps);\r\n if (res && res.then) {\r\n _this.unset(name); // put in an unset state while resolving\r\n res.then(function (val) {\r\n _this.set(name, val);\r\n });\r\n }\r\n else {\r\n _this.set(name, res);\r\n }\r\n }, function (deps) {\r\n _this.unset(name);\r\n if (stopFunc) {\r\n stopFunc.call(_this, deps);\r\n }\r\n });\r\n };\r\n Model.prototype.unwatch = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n delete this._watchers[name];\r\n watcher.teardown();\r\n }\r\n };\r\n Model.prototype._watchDeps = function (depList, startFunc, stopFunc) {\r\n var _this = this;\r\n var queuedChangeCnt = 0;\r\n var depCnt = depList.length;\r\n var satisfyCnt = 0;\r\n var values = {}; // what's passed as the `deps` arguments\r\n var bindTuples = []; // array of [ eventName, handlerFunc ] arrays\r\n var isCallingStop = false;\r\n var onBeforeDepChange = function (depName, val, isOptional) {\r\n queuedChangeCnt++;\r\n if (queuedChangeCnt === 1) {\r\n if (satisfyCnt === depCnt) {\r\n isCallingStop = true;\r\n stopFunc(values);\r\n isCallingStop = false;\r\n }\r\n }\r\n };\r\n var onDepChange = function (depName, val, isOptional) {\r\n if (val === undefined) {\r\n // required dependency that was previously set?\r\n if (!isOptional && values[depName] !== undefined) {\r\n satisfyCnt--;\r\n }\r\n delete values[depName];\r\n }\r\n else {\r\n // required dependency that was previously unset?\r\n if (!isOptional && values[depName] === undefined) {\r\n satisfyCnt++;\r\n }\r\n values[depName] = val;\r\n }\r\n queuedChangeCnt--;\r\n if (!queuedChangeCnt) {\r\n // now finally satisfied or satisfied all along?\r\n if (satisfyCnt === depCnt) {\r\n // if the stopFunc initiated another value change, ignore it.\r\n // it will be processed by another change event anyway.\r\n if (!isCallingStop) {\r\n startFunc(values);\r\n }\r\n }\r\n }\r\n };\r\n // intercept for .on() that remembers handlers\r\n var bind = function (eventName, handler) {\r\n _this.on(eventName, handler);\r\n bindTuples.push([eventName, handler]);\r\n };\r\n // listen to dependency changes\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n bind('before:change:' + depName, function (val) {\r\n onBeforeDepChange(depName, val, isOptional);\r\n });\r\n bind('change:' + depName, function (val) {\r\n onDepChange(depName, val, isOptional);\r\n });\r\n });\r\n // process current dependency values\r\n depList.forEach(function (depName) {\r\n var isOptional = false;\r\n if (depName.charAt(0) === '?') {\r\n depName = depName.substring(1);\r\n isOptional = true;\r\n }\r\n if (_this.has(depName)) {\r\n values[depName] = _this.get(depName);\r\n satisfyCnt++;\r\n }\r\n else if (isOptional) {\r\n satisfyCnt++;\r\n }\r\n });\r\n // initially satisfied\r\n if (satisfyCnt === depCnt) {\r\n startFunc(values);\r\n }\r\n return {\r\n teardown: function () {\r\n // remove all handlers\r\n for (var i = 0; i < bindTuples.length; i++) {\r\n _this.off(bindTuples[i][0], bindTuples[i][1]);\r\n }\r\n bindTuples = null;\r\n // was satisfied, so call stopFunc\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n }\r\n },\r\n flash: function () {\r\n if (satisfyCnt === depCnt) {\r\n stopFunc();\r\n startFunc(values);\r\n }\r\n }\r\n };\r\n };\r\n Model.prototype.flash = function (name) {\r\n var watcher = this._watchers[name];\r\n if (watcher) {\r\n watcher.flash();\r\n }\r\n };\r\n return Model;\r\n}(Class_1.default));\r\nexports.default = Model;\r\nModel.prototype._globalWatchArgs = {}; // mutation protection in Model.watch\r\nEmitterMixin_1.default.mixInto(Model);\r\nListenerMixin_1.default.mixInto(Model);\r\n\r\n\r\n/***/ }),\r\n/* 49 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nexports.default = {\r\n parse: function (eventInput, source) {\r\n if (util_1.isTimeString(eventInput.start) || moment.isDuration(eventInput.start) ||\r\n util_1.isTimeString(eventInput.end) || moment.isDuration(eventInput.end)) {\r\n return RecurringEventDef_1.default.parse(eventInput, source);\r\n }\r\n else {\r\n return SingleEventDef_1.default.parse(eventInput, source);\r\n }\r\n }\r\n};\r\n\r\n\r\n/***/ }),\r\n/* 50 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventDefDateMutation = /** @class */ (function () {\r\n function EventDefDateMutation() {\r\n this.clearEnd = false;\r\n this.forceTimed = false;\r\n this.forceAllDay = false;\r\n }\r\n EventDefDateMutation.createFromDiff = function (dateProfile0, dateProfile1, largeUnit) {\r\n var clearEnd = dateProfile0.end && !dateProfile1.end;\r\n var forceTimed = dateProfile0.isAllDay() && !dateProfile1.isAllDay();\r\n var forceAllDay = !dateProfile0.isAllDay() && dateProfile1.isAllDay();\r\n var dateDelta;\r\n var endDiff;\r\n var endDelta;\r\n var mutation;\r\n // subtracts the dates in the appropriate way, returning a duration\r\n function subtractDates(date1, date0) {\r\n if (largeUnit) {\r\n return util_1.diffByUnit(date1, date0, largeUnit); // poorly named\r\n }\r\n else if (dateProfile1.isAllDay()) {\r\n return util_1.diffDay(date1, date0); // poorly named\r\n }\r\n else {\r\n return util_1.diffDayTime(date1, date0); // poorly named\r\n }\r\n }\r\n dateDelta = subtractDates(dateProfile1.start, dateProfile0.start);\r\n if (dateProfile1.end) {\r\n // use unzonedRanges because dateProfile0.end might be null\r\n endDiff = subtractDates(dateProfile1.unzonedRange.getEnd(), dateProfile0.unzonedRange.getEnd());\r\n endDelta = endDiff.subtract(dateDelta);\r\n }\r\n mutation = new EventDefDateMutation();\r\n mutation.clearEnd = clearEnd;\r\n mutation.forceTimed = forceTimed;\r\n mutation.forceAllDay = forceAllDay;\r\n mutation.setDateDelta(dateDelta);\r\n mutation.setEndDelta(endDelta);\r\n return mutation;\r\n };\r\n /*\r\n returns an undo function.\r\n */\r\n EventDefDateMutation.prototype.buildNewDateProfile = function (eventDateProfile, calendar) {\r\n var start = eventDateProfile.start.clone();\r\n var end = null;\r\n var shouldRezone = false;\r\n if (eventDateProfile.end && !this.clearEnd) {\r\n end = eventDateProfile.end.clone();\r\n }\r\n else if (this.endDelta && !end) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n if (this.forceTimed) {\r\n shouldRezone = true;\r\n if (!start.hasTime()) {\r\n start.time(0);\r\n }\r\n if (end && !end.hasTime()) {\r\n end.time(0);\r\n }\r\n }\r\n else if (this.forceAllDay) {\r\n if (start.hasTime()) {\r\n start.stripTime();\r\n }\r\n if (end && end.hasTime()) {\r\n end.stripTime();\r\n }\r\n }\r\n if (this.dateDelta) {\r\n shouldRezone = true;\r\n start.add(this.dateDelta);\r\n if (end) {\r\n end.add(this.dateDelta);\r\n }\r\n }\r\n // do this before adding startDelta to start, so we can work off of start\r\n if (this.endDelta) {\r\n shouldRezone = true;\r\n end.add(this.endDelta);\r\n }\r\n if (this.startDelta) {\r\n shouldRezone = true;\r\n start.add(this.startDelta);\r\n }\r\n if (shouldRezone) {\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n }\r\n // TODO: okay to access calendar option?\r\n if (!end && calendar.opt('forceEventDuration')) {\r\n end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);\r\n }\r\n return new EventDateProfile_1.default(start, end, calendar);\r\n };\r\n EventDefDateMutation.prototype.setDateDelta = function (dateDelta) {\r\n if (dateDelta && dateDelta.valueOf()) {\r\n this.dateDelta = dateDelta;\r\n }\r\n else {\r\n this.dateDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setStartDelta = function (startDelta) {\r\n if (startDelta && startDelta.valueOf()) {\r\n this.startDelta = startDelta;\r\n }\r\n else {\r\n this.startDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.setEndDelta = function (endDelta) {\r\n if (endDelta && endDelta.valueOf()) {\r\n this.endDelta = endDelta;\r\n }\r\n else {\r\n this.endDelta = null;\r\n }\r\n };\r\n EventDefDateMutation.prototype.isEmpty = function () {\r\n return !this.clearEnd && !this.forceTimed && !this.forceAllDay &&\r\n !this.dateDelta && !this.startDelta && !this.endDelta;\r\n };\r\n return EventDefDateMutation;\r\n}());\r\nexports.default = EventDefDateMutation;\r\n\r\n\r\n/***/ }),\r\n/* 51 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar themeClassHash = {};\r\nfunction defineThemeSystem(themeName, themeClass) {\r\n themeClassHash[themeName] = themeClass;\r\n}\r\nexports.defineThemeSystem = defineThemeSystem;\r\nfunction getThemeSystemClass(themeSetting) {\r\n if (!themeSetting) {\r\n return StandardTheme_1.default;\r\n }\r\n else if (themeSetting === true) {\r\n return JqueryUiTheme_1.default;\r\n }\r\n else {\r\n return themeClassHash[themeSetting];\r\n }\r\n}\r\nexports.getThemeSystemClass = getThemeSystemClass;\r\n\r\n\r\n/***/ }),\r\n/* 52 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar ArrayEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(ArrayEventSource, _super);\r\n function ArrayEventSource(calendar) {\r\n var _this = _super.call(this, calendar) || this;\r\n _this.eventDefs = []; // for if setRawEventDefs is never called\r\n return _this;\r\n }\r\n ArrayEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isArray(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isArray(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n ArrayEventSource.prototype.setRawEventDefs = function (rawEventDefs) {\r\n this.rawEventDefs = rawEventDefs;\r\n this.eventDefs = this.parseEventDefs(rawEventDefs);\r\n };\r\n ArrayEventSource.prototype.fetch = function (start, end, timezone) {\r\n var eventDefs = this.eventDefs;\r\n var i;\r\n if (this.currentTimezone != null &&\r\n this.currentTimezone !== timezone) {\r\n for (i = 0; i < eventDefs.length; i++) {\r\n if (eventDefs[i] instanceof SingleEventDef_1.default) {\r\n eventDefs[i].rezone();\r\n }\r\n }\r\n }\r\n this.currentTimezone = timezone;\r\n return Promise_1.default.resolve(eventDefs);\r\n };\r\n ArrayEventSource.prototype.addEventDef = function (eventDef) {\r\n this.eventDefs.push(eventDef);\r\n };\r\n /*\r\n eventDefId already normalized to a string\r\n */\r\n ArrayEventSource.prototype.removeEventDefsById = function (eventDefId) {\r\n return util_1.removeMatching(this.eventDefs, function (eventDef) {\r\n return eventDef.id === eventDefId;\r\n });\r\n };\r\n ArrayEventSource.prototype.removeAllEventDefs = function () {\r\n this.eventDefs = [];\r\n };\r\n ArrayEventSource.prototype.getPrimitive = function () {\r\n return this.rawEventDefs;\r\n };\r\n ArrayEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.setRawEventDefs(rawProps.events);\r\n return superSuccess;\r\n };\r\n return ArrayEventSource;\r\n}(EventSource_1.default));\r\nexports.default = ArrayEventSource;\r\nArrayEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 53 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/*\r\nA cache for the left/right/top/bottom/width/height values for one or more elements.\r\nWorks with both offset (from topleft document) and position (from offsetParent).\r\n\r\noptions:\r\n- els\r\n- isHorizontal\r\n- isVertical\r\n*/\r\nvar CoordCache = /** @class */ (function () {\r\n function CoordCache(options) {\r\n this.isHorizontal = false; // whether to query for left/right/width\r\n this.isVertical = false; // whether to query for top/bottom/height\r\n this.els = $(options.els);\r\n this.isHorizontal = options.isHorizontal;\r\n this.isVertical = options.isVertical;\r\n this.forcedOffsetParentEl = options.offsetParent ? $(options.offsetParent) : null;\r\n }\r\n // Queries the els for coordinates and stores them.\r\n // Call this method before using and of the get* methods below.\r\n CoordCache.prototype.build = function () {\r\n var offsetParentEl = this.forcedOffsetParentEl;\r\n if (!offsetParentEl && this.els.length > 0) {\r\n offsetParentEl = this.els.eq(0).offsetParent();\r\n }\r\n this.origin = offsetParentEl ?\r\n offsetParentEl.offset() :\r\n null;\r\n this.boundingRect = this.queryBoundingRect();\r\n if (this.isHorizontal) {\r\n this.buildElHorizontals();\r\n }\r\n if (this.isVertical) {\r\n this.buildElVerticals();\r\n }\r\n };\r\n // Destroys all internal data about coordinates, freeing memory\r\n CoordCache.prototype.clear = function () {\r\n this.origin = null;\r\n this.boundingRect = null;\r\n this.lefts = null;\r\n this.rights = null;\r\n this.tops = null;\r\n this.bottoms = null;\r\n };\r\n // When called, if coord caches aren't built, builds them\r\n CoordCache.prototype.ensureBuilt = function () {\r\n if (!this.origin) {\r\n this.build();\r\n }\r\n };\r\n // Populates the left/right internal coordinate arrays\r\n CoordCache.prototype.buildElHorizontals = function () {\r\n var lefts = [];\r\n var rights = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var left = el.offset().left;\r\n var width = el.outerWidth();\r\n lefts.push(left);\r\n rights.push(left + width);\r\n });\r\n this.lefts = lefts;\r\n this.rights = rights;\r\n };\r\n // Populates the top/bottom internal coordinate arrays\r\n CoordCache.prototype.buildElVerticals = function () {\r\n var tops = [];\r\n var bottoms = [];\r\n this.els.each(function (i, node) {\r\n var el = $(node);\r\n var top = el.offset().top;\r\n var height = el.outerHeight();\r\n tops.push(top);\r\n bottoms.push(top + height);\r\n });\r\n this.tops = tops;\r\n this.bottoms = bottoms;\r\n };\r\n // Given a left offset (from document left), returns the index of the el that it horizontally intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getHorizontalIndex = function (leftOffset) {\r\n this.ensureBuilt();\r\n var lefts = this.lefts;\r\n var rights = this.rights;\r\n var len = lefts.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (leftOffset >= lefts[i] && leftOffset < rights[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Given a top offset (from document top), returns the index of the el that it vertically intersects.\r\n // If no intersection is made, returns undefined.\r\n CoordCache.prototype.getVerticalIndex = function (topOffset) {\r\n this.ensureBuilt();\r\n var tops = this.tops;\r\n var bottoms = this.bottoms;\r\n var len = tops.length;\r\n var i;\r\n for (i = 0; i < len; i++) {\r\n if (topOffset >= tops[i] && topOffset < bottoms[i]) {\r\n return i;\r\n }\r\n }\r\n };\r\n // Gets the left offset (from document left) of the element at the given index\r\n CoordCache.prototype.getLeftOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex];\r\n };\r\n // Gets the left position (from offsetParent left) of the element at the given index\r\n CoordCache.prototype.getLeftPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.lefts[leftIndex] - this.origin.left;\r\n };\r\n // Gets the right offset (from document left) of the element at the given index.\r\n // This value is NOT relative to the document's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightOffset = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex];\r\n };\r\n // Gets the right position (from offsetParent left) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's right edge, like the CSS concept of \"right\" would be.\r\n CoordCache.prototype.getRightPosition = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.origin.left;\r\n };\r\n // Gets the width of the element at the given index\r\n CoordCache.prototype.getWidth = function (leftIndex) {\r\n this.ensureBuilt();\r\n return this.rights[leftIndex] - this.lefts[leftIndex];\r\n };\r\n // Gets the top offset (from document top) of the element at the given index\r\n CoordCache.prototype.getTopOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex];\r\n };\r\n // Gets the top position (from offsetParent top) of the element at the given position\r\n CoordCache.prototype.getTopPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.tops[topIndex] - this.origin.top;\r\n };\r\n // Gets the bottom offset (from the document top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomOffset = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex];\r\n };\r\n // Gets the bottom position (from the offsetParent top) of the element at the given index.\r\n // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of \"bottom\" would be.\r\n CoordCache.prototype.getBottomPosition = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.origin.top;\r\n };\r\n // Gets the height of the element at the given index\r\n CoordCache.prototype.getHeight = function (topIndex) {\r\n this.ensureBuilt();\r\n return this.bottoms[topIndex] - this.tops[topIndex];\r\n };\r\n // Bounding Rect\r\n // TODO: decouple this from CoordCache\r\n // Compute and return what the elements' bounding rectangle is, from the user's perspective.\r\n // Right now, only returns a rectangle if constrained by an overflow:scroll element.\r\n // Returns null if there are no elements\r\n CoordCache.prototype.queryBoundingRect = function () {\r\n var scrollParentEl;\r\n if (this.els.length > 0) {\r\n scrollParentEl = util_1.getScrollParent(this.els.eq(0));\r\n if (!scrollParentEl.is(document)) {\r\n return util_1.getClientRect(scrollParentEl);\r\n }\r\n }\r\n return null;\r\n };\r\n CoordCache.prototype.isPointInBounds = function (leftOffset, topOffset) {\r\n return this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);\r\n };\r\n CoordCache.prototype.isLeftInBounds = function (leftOffset) {\r\n return !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);\r\n };\r\n CoordCache.prototype.isTopInBounds = function (topOffset) {\r\n return !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);\r\n };\r\n return CoordCache;\r\n}());\r\nexports.default = CoordCache;\r\n\r\n\r\n/***/ }),\r\n/* 54 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\n/* Tracks a drag's mouse movement, firing various handlers\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// TODO: use Emitter\r\nvar DragListener = /** @class */ (function () {\r\n function DragListener(options) {\r\n this.isInteracting = false;\r\n this.isDistanceSurpassed = false;\r\n this.isDelayEnded = false;\r\n this.isDragging = false;\r\n this.isTouch = false;\r\n this.isGeneric = false; // initiated by 'dragstart' (jqui)\r\n this.shouldCancelTouchScroll = true;\r\n this.scrollAlwaysKills = false;\r\n this.isAutoScroll = false;\r\n // defaults\r\n this.scrollSensitivity = 30; // pixels from edge for scrolling to start\r\n this.scrollSpeed = 200; // pixels per second, at maximum speed\r\n this.scrollIntervalMs = 50; // millisecond wait between scroll increment\r\n this.options = options || {};\r\n }\r\n // Interaction (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startInteraction = function (ev, extraOptions) {\r\n if (extraOptions === void 0) { extraOptions = {}; }\r\n if (ev.type === 'mousedown') {\r\n if (GlobalEmitter_1.default.get().shouldIgnoreMouse()) {\r\n return;\r\n }\r\n else if (!util_1.isPrimaryMouseButton(ev)) {\r\n return;\r\n }\r\n else {\r\n ev.preventDefault(); // prevents native selection in most browsers\r\n }\r\n }\r\n if (!this.isInteracting) {\r\n // process options\r\n this.delay = util_1.firstDefined(extraOptions.delay, this.options.delay, 0);\r\n this.minDistance = util_1.firstDefined(extraOptions.distance, this.options.distance, 0);\r\n this.subjectEl = this.options.subjectEl;\r\n util_1.preventSelection($('body'));\r\n this.isInteracting = true;\r\n this.isTouch = util_1.getEvIsTouch(ev);\r\n this.isGeneric = ev.type === 'dragstart';\r\n this.isDelayEnded = false;\r\n this.isDistanceSurpassed = false;\r\n this.originX = util_1.getEvX(ev);\r\n this.originY = util_1.getEvY(ev);\r\n this.scrollEl = util_1.getScrollParent($(ev.target));\r\n this.bindHandlers();\r\n this.initAutoScroll();\r\n this.handleInteractionStart(ev);\r\n this.startDelay(ev);\r\n if (!this.minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n };\r\n DragListener.prototype.handleInteractionStart = function (ev) {\r\n this.trigger('interactionStart', ev);\r\n };\r\n DragListener.prototype.endInteraction = function (ev, isCancelled) {\r\n if (this.isInteracting) {\r\n this.endDrag(ev);\r\n if (this.delayTimeoutId) {\r\n clearTimeout(this.delayTimeoutId);\r\n this.delayTimeoutId = null;\r\n }\r\n this.destroyAutoScroll();\r\n this.unbindHandlers();\r\n this.isInteracting = false;\r\n this.handleInteractionEnd(ev, isCancelled);\r\n util_1.allowSelection($('body'));\r\n }\r\n };\r\n DragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {\r\n this.trigger('interactionEnd', ev, isCancelled || false);\r\n };\r\n // Binding To DOM\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.bindHandlers = function () {\r\n // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,\r\n // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.\r\n var globalEmitter = GlobalEmitter_1.default.get();\r\n if (this.isGeneric) {\r\n this.listenTo($(document), {\r\n drag: this.handleMove,\r\n dragstop: this.endInteraction\r\n });\r\n }\r\n else if (this.isTouch) {\r\n this.listenTo(globalEmitter, {\r\n touchmove: this.handleTouchMove,\r\n touchend: this.endInteraction,\r\n scroll: this.handleTouchScroll\r\n });\r\n }\r\n else {\r\n this.listenTo(globalEmitter, {\r\n mousemove: this.handleMouseMove,\r\n mouseup: this.endInteraction\r\n });\r\n }\r\n this.listenTo(globalEmitter, {\r\n selectstart: util_1.preventDefault,\r\n contextmenu: util_1.preventDefault // long taps would open menu on Chrome dev tools\r\n });\r\n };\r\n DragListener.prototype.unbindHandlers = function () {\r\n this.stopListeningTo(GlobalEmitter_1.default.get());\r\n this.stopListeningTo($(document)); // for isGeneric\r\n };\r\n // Drag (high-level)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // extraOptions ignored if drag already started\r\n DragListener.prototype.startDrag = function (ev, extraOptions) {\r\n this.startInteraction(ev, extraOptions); // ensure interaction began\r\n if (!this.isDragging) {\r\n this.isDragging = true;\r\n this.handleDragStart(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragStart = function (ev) {\r\n this.trigger('dragStart', ev);\r\n };\r\n DragListener.prototype.handleMove = function (ev) {\r\n var dx = util_1.getEvX(ev) - this.originX;\r\n var dy = util_1.getEvY(ev) - this.originY;\r\n var minDistance = this.minDistance;\r\n var distanceSq; // current distance from the origin, squared\r\n if (!this.isDistanceSurpassed) {\r\n distanceSq = dx * dx + dy * dy;\r\n if (distanceSq >= minDistance * minDistance) {\r\n this.handleDistanceSurpassed(ev);\r\n }\r\n }\r\n if (this.isDragging) {\r\n this.handleDrag(dx, dy, ev);\r\n }\r\n };\r\n // Called while the mouse is being moved and when we know a legitimate drag is taking place\r\n DragListener.prototype.handleDrag = function (dx, dy, ev) {\r\n this.trigger('drag', dx, dy, ev);\r\n this.updateAutoScroll(ev); // will possibly cause scrolling\r\n };\r\n DragListener.prototype.endDrag = function (ev) {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n this.handleDragEnd(ev);\r\n }\r\n };\r\n DragListener.prototype.handleDragEnd = function (ev) {\r\n this.trigger('dragEnd', ev);\r\n };\r\n // Delay\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.startDelay = function (initialEv) {\r\n var _this = this;\r\n if (this.delay) {\r\n this.delayTimeoutId = setTimeout(function () {\r\n _this.handleDelayEnd(initialEv);\r\n }, this.delay);\r\n }\r\n else {\r\n this.handleDelayEnd(initialEv);\r\n }\r\n };\r\n DragListener.prototype.handleDelayEnd = function (initialEv) {\r\n this.isDelayEnded = true;\r\n if (this.isDistanceSurpassed) {\r\n this.startDrag(initialEv);\r\n }\r\n };\r\n // Distance\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleDistanceSurpassed = function (ev) {\r\n this.isDistanceSurpassed = true;\r\n if (this.isDelayEnded) {\r\n this.startDrag(ev);\r\n }\r\n };\r\n // Mouse / Touch\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchMove = function (ev) {\r\n // prevent inertia and touchmove-scrolling while dragging\r\n if (this.isDragging && this.shouldCancelTouchScroll) {\r\n ev.preventDefault();\r\n }\r\n this.handleMove(ev);\r\n };\r\n DragListener.prototype.handleMouseMove = function (ev) {\r\n this.handleMove(ev);\r\n };\r\n // Scrolling (unrelated to auto-scroll)\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.handleTouchScroll = function (ev) {\r\n // if the drag is being initiated by touch, but a scroll happens before\r\n // the drag-initiating delay is over, cancel the drag\r\n if (!this.isDragging || this.scrollAlwaysKills) {\r\n this.endInteraction(ev, true); // isCancelled=true\r\n }\r\n };\r\n // Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n DragListener.prototype.trigger = function (name) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n if (this.options[name]) {\r\n this.options[name].apply(this, args);\r\n }\r\n // makes _methods callable by event name. TODO: kill this\r\n if (this['_' + name]) {\r\n this['_' + name].apply(this, args);\r\n }\r\n };\r\n // Auto-scroll\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DragListener.prototype.initAutoScroll = function () {\r\n var scrollEl = this.scrollEl;\r\n this.isAutoScroll =\r\n this.options.scroll &&\r\n scrollEl &&\r\n !scrollEl.is(window) &&\r\n !scrollEl.is(document);\r\n if (this.isAutoScroll) {\r\n // debounce makes sure rapid calls don't happen\r\n this.listenTo(scrollEl, 'scroll', util_1.debounce(this.handleDebouncedScroll, 100));\r\n }\r\n };\r\n DragListener.prototype.destroyAutoScroll = function () {\r\n this.endAutoScroll(); // kill any animation loop\r\n // remove the scroll handler if there is a scrollEl\r\n if (this.isAutoScroll) {\r\n this.stopListeningTo(this.scrollEl, 'scroll'); // will probably get removed by unbindHandlers too :(\r\n }\r\n };\r\n // Computes and stores the bounding rectangle of scrollEl\r\n DragListener.prototype.computeScrollBounds = function () {\r\n if (this.isAutoScroll) {\r\n this.scrollBounds = util_1.getOuterRect(this.scrollEl);\r\n // TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars\r\n }\r\n };\r\n // Called when the dragging is in progress and scrolling should be updated\r\n DragListener.prototype.updateAutoScroll = function (ev) {\r\n var sensitivity = this.scrollSensitivity;\r\n var bounds = this.scrollBounds;\r\n var topCloseness;\r\n var bottomCloseness;\r\n var leftCloseness;\r\n var rightCloseness;\r\n var topVel = 0;\r\n var leftVel = 0;\r\n if (bounds) {\r\n // compute closeness to edges. valid range is from 0.0 - 1.0\r\n topCloseness = (sensitivity - (util_1.getEvY(ev) - bounds.top)) / sensitivity;\r\n bottomCloseness = (sensitivity - (bounds.bottom - util_1.getEvY(ev))) / sensitivity;\r\n leftCloseness = (sensitivity - (util_1.getEvX(ev) - bounds.left)) / sensitivity;\r\n rightCloseness = (sensitivity - (bounds.right - util_1.getEvX(ev))) / sensitivity;\r\n // translate vertical closeness into velocity.\r\n // mouse must be completely in bounds for velocity to happen.\r\n if (topCloseness >= 0 && topCloseness <= 1) {\r\n topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up\r\n }\r\n else if (bottomCloseness >= 0 && bottomCloseness <= 1) {\r\n topVel = bottomCloseness * this.scrollSpeed;\r\n }\r\n // translate horizontal closeness into velocity\r\n if (leftCloseness >= 0 && leftCloseness <= 1) {\r\n leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left\r\n }\r\n else if (rightCloseness >= 0 && rightCloseness <= 1) {\r\n leftVel = rightCloseness * this.scrollSpeed;\r\n }\r\n }\r\n this.setScrollVel(topVel, leftVel);\r\n };\r\n // Sets the speed-of-scrolling for the scrollEl\r\n DragListener.prototype.setScrollVel = function (topVel, leftVel) {\r\n this.scrollTopVel = topVel;\r\n this.scrollLeftVel = leftVel;\r\n this.constrainScrollVel(); // massages into realistic values\r\n // if there is non-zero velocity, and an animation loop hasn't already started, then START\r\n if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {\r\n this.scrollIntervalId = setInterval(util_1.proxy(this, 'scrollIntervalFunc'), // scope to `this`\r\n this.scrollIntervalMs);\r\n }\r\n };\r\n // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way\r\n DragListener.prototype.constrainScrollVel = function () {\r\n var el = this.scrollEl;\r\n if (this.scrollTopVel < 0) {\r\n if (el.scrollTop() <= 0) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n else if (this.scrollTopVel > 0) {\r\n if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) {\r\n this.scrollTopVel = 0;\r\n }\r\n }\r\n if (this.scrollLeftVel < 0) {\r\n if (el.scrollLeft() <= 0) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n else if (this.scrollLeftVel > 0) {\r\n if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) {\r\n this.scrollLeftVel = 0;\r\n }\r\n }\r\n };\r\n // This function gets called during every iteration of the scrolling animation loop\r\n DragListener.prototype.scrollIntervalFunc = function () {\r\n var el = this.scrollEl;\r\n var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by\r\n // change the value of scrollEl's scroll\r\n if (this.scrollTopVel) {\r\n el.scrollTop(el.scrollTop() + this.scrollTopVel * frac);\r\n }\r\n if (this.scrollLeftVel) {\r\n el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);\r\n }\r\n this.constrainScrollVel(); // since the scroll values changed, recompute the velocities\r\n // if scrolled all the way, which causes the vels to be zero, stop the animation loop\r\n if (!this.scrollTopVel && !this.scrollLeftVel) {\r\n this.endAutoScroll();\r\n }\r\n };\r\n // Kills any existing scrolling animation loop\r\n DragListener.prototype.endAutoScroll = function () {\r\n if (this.scrollIntervalId) {\r\n clearInterval(this.scrollIntervalId);\r\n this.scrollIntervalId = null;\r\n this.handleScrollEnd();\r\n }\r\n };\r\n // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)\r\n DragListener.prototype.handleDebouncedScroll = function () {\r\n // recompute all coordinates, but *only* if this is *not* part of our scrolling animation\r\n if (!this.scrollIntervalId) {\r\n this.handleScrollEnd();\r\n }\r\n };\r\n DragListener.prototype.handleScrollEnd = function () {\r\n // Called when scrolling has stopped, whether through auto scroll, or the user scrolling\r\n };\r\n return DragListener;\r\n}());\r\nexports.default = DragListener;\r\nListenerMixin_1.default.mixInto(DragListener);\r\n\r\n\r\n/***/ }),\r\n/* 55 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\n/*\r\nA set of rendering and date-related methods for a visual component comprised of one or more rows of day columns.\r\nPrerequisite: the object being mixed into needs to be a *Grid*\r\n*/\r\nvar DayTableMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayTableMixin, _super);\r\n function DayTableMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Populates internal variables used for date calculation and rendering\r\n DayTableMixin.prototype.updateDayTable = function () {\r\n var t = this;\r\n var view = t.view;\r\n var calendar = view.calendar;\r\n var date = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.startMs, true);\r\n var end = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.endMs, true);\r\n var dayIndex = -1;\r\n var dayIndices = [];\r\n var dayDates = [];\r\n var daysPerRow;\r\n var firstDay;\r\n var rowCnt;\r\n while (date.isBefore(end)) {\r\n if (view.isHiddenDay(date)) {\r\n dayIndices.push(dayIndex + 0.5); // mark that it's between indices\r\n }\r\n else {\r\n dayIndex++;\r\n dayIndices.push(dayIndex);\r\n dayDates.push(date.clone());\r\n }\r\n date.add(1, 'days');\r\n }\r\n if (this.breakOnWeeks) {\r\n // count columns until the day-of-week repeats\r\n firstDay = dayDates[0].day();\r\n for (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {\r\n if (dayDates[daysPerRow].day() === firstDay) {\r\n break;\r\n }\r\n }\r\n rowCnt = Math.ceil(dayDates.length / daysPerRow);\r\n }\r\n else {\r\n rowCnt = 1;\r\n daysPerRow = dayDates.length;\r\n }\r\n this.dayDates = dayDates;\r\n this.dayIndices = dayIndices;\r\n this.daysPerRow = daysPerRow;\r\n this.rowCnt = rowCnt;\r\n this.updateDayTableCols();\r\n };\r\n // Computes and assigned the colCnt property and updates any options that may be computed from it\r\n DayTableMixin.prototype.updateDayTableCols = function () {\r\n this.colCnt = this.computeColCnt();\r\n this.colHeadFormat =\r\n this.opt('columnHeaderFormat') ||\r\n this.opt('columnFormat') || // deprecated\r\n this.computeColHeadFormat();\r\n };\r\n // Determines how many columns there should be in the table\r\n DayTableMixin.prototype.computeColCnt = function () {\r\n return this.daysPerRow;\r\n };\r\n // Computes the ambiguously-timed moment for the given cell\r\n DayTableMixin.prototype.getCellDate = function (row, col) {\r\n return this.dayDates[this.getCellDayIndex(row, col)].clone();\r\n };\r\n // Computes the ambiguously-timed date range for the given cell\r\n DayTableMixin.prototype.getCellRange = function (row, col) {\r\n var start = this.getCellDate(row, col);\r\n var end = start.clone().add(1, 'days');\r\n return { start: start, end: end };\r\n };\r\n // Returns the number of day cells, chronologically, from the first of the grid (0-based)\r\n DayTableMixin.prototype.getCellDayIndex = function (row, col) {\r\n return row * this.daysPerRow + this.getColDayIndex(col);\r\n };\r\n // Returns the numner of day cells, chronologically, from the first cell in *any given row*\r\n DayTableMixin.prototype.getColDayIndex = function (col) {\r\n if (this.isRTL) {\r\n return this.colCnt - 1 - col;\r\n }\r\n else {\r\n return col;\r\n }\r\n };\r\n // Given a date, returns its chronolocial cell-index from the first cell of the grid.\r\n // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\r\n // If before the first offset, returns a negative number.\r\n // If after the last offset, returns an offset past the last cell offset.\r\n // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\r\n DayTableMixin.prototype.getDateDayIndex = function (date) {\r\n var dayIndices = this.dayIndices;\r\n var dayOffset = date.diff(this.dayDates[0], 'days');\r\n if (dayOffset < 0) {\r\n return dayIndices[0] - 1;\r\n }\r\n else if (dayOffset >= dayIndices.length) {\r\n return dayIndices[dayIndices.length - 1] + 1;\r\n }\r\n else {\r\n return dayIndices[dayOffset];\r\n }\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes a default column header formatting string if `colFormat` is not explicitly defined\r\n DayTableMixin.prototype.computeColHeadFormat = function () {\r\n // if more than one week row, or if there are a lot of columns with not much space,\r\n // put just the day numbers will be in each cell\r\n if (this.rowCnt > 1 || this.colCnt > 10) {\r\n return 'ddd'; // \"Sat\"\r\n }\r\n else if (this.colCnt > 1) {\r\n return this.opt('dayOfMonthFormat'); // \"Sat 12/10\"\r\n }\r\n else {\r\n return 'dddd'; // \"Saturday\"\r\n }\r\n };\r\n /* Slicing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Slices up a date range into a segment for every week-row it intersects with\r\n DayTableMixin.prototype.sliceRangeByRow = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, rowFirst);\r\n segLast = Math.min(rangeLast, rowLast);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n // Slices up a date range into a segment for every day-cell it intersects with.\r\n // TODO: make more DRY with sliceRangeByRow somehow.\r\n DayTableMixin.prototype.sliceRangeByDay = function (unzonedRange) {\r\n var daysPerRow = this.daysPerRow;\r\n var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold\r\n var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index\r\n var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index\r\n var segs = [];\r\n var row;\r\n var rowFirst;\r\n var rowLast; // inclusive day-index range for current row\r\n var i;\r\n var segFirst;\r\n var segLast; // inclusive day-index range for segment\r\n for (row = 0; row < this.rowCnt; row++) {\r\n rowFirst = row * daysPerRow;\r\n rowLast = rowFirst + daysPerRow - 1;\r\n for (i = rowFirst; i <= rowLast; i++) {\r\n // intersect segment's offset range with the row's\r\n segFirst = Math.max(rangeFirst, i);\r\n segLast = Math.min(rangeLast, i);\r\n // deal with in-between indices\r\n segFirst = Math.ceil(segFirst); // in-between starts round to next cell\r\n segLast = Math.floor(segLast); // in-between ends round to prev cell\r\n if (segFirst <= segLast) {\r\n segs.push({\r\n row: row,\r\n // normalize to start of row\r\n firstRowDayIndex: segFirst - rowFirst,\r\n lastRowDayIndex: segLast - rowFirst,\r\n // must be matching integers to be the segment's start/end\r\n isStart: segFirst === rangeFirst,\r\n isEnd: segLast === rangeLast\r\n });\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Header Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderHeadHtml = function () {\r\n var theme = this.view.calendar.theme;\r\n return '' +\r\n '
' +\r\n '' +\r\n '' +\r\n this.renderHeadTrHtml() +\r\n '' +\r\n '
' +\r\n '
';\r\n };\r\n DayTableMixin.prototype.renderHeadIntroHtml = function () {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderHeadTrHtml = function () {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderHeadIntroHtml()) +\r\n this.renderHeadDateCellsHtml() +\r\n (this.isRTL ? this.renderHeadIntroHtml() : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderHeadDateCellsHtml = function () {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(0, col);\r\n htmls.push(this.renderHeadDateCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // TODO: when internalApiVersion, accept an object for HTML attributes\r\n // (colspan should be no different)\r\n DayTableMixin.prototype.renderHeadDateCellHtml = function (date, colspan, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classNames = [\r\n 'fc-day-header',\r\n view.calendar.theme.getClass('widgetHeader')\r\n ];\r\n var innerHtml;\r\n if (typeof t.opt('columnHeaderHtml') === 'function') {\r\n innerHtml = t.opt('columnHeaderHtml')(date);\r\n }\r\n else if (typeof t.opt('columnHeaderText') === 'function') {\r\n innerHtml = util_1.htmlEscape(t.opt('columnHeaderText')(date));\r\n }\r\n else {\r\n innerHtml = util_1.htmlEscape(date.format(t.colHeadFormat));\r\n }\r\n // if only one row of days, the classNames on the header can represent the specific days beneath\r\n if (t.rowCnt === 1) {\r\n classNames = classNames.concat(\r\n // includes the day-of-week class\r\n // noThemeHighlight=true (don't highlight the header)\r\n t.getDayClasses(date, true));\r\n }\r\n else {\r\n classNames.push('fc-' + util_1.dayIDs[date.day()]); // only add the day-of-week class\r\n }\r\n return '' +\r\n ' 1 ?\r\n ' colspan=\"' + colspan + '\"' :\r\n '') +\r\n (otherAttrs ?\r\n ' ' + otherAttrs :\r\n '') +\r\n '>' +\r\n (isDateValid ?\r\n // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)\r\n view.buildGotoAnchorHtml({ date: date, forceOff: t.rowCnt > 1 || t.colCnt === 1 }, innerHtml) :\r\n // if not valid, display text, but no link\r\n innerHtml) +\r\n '';\r\n };\r\n /* Background Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderBgTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderBgIntroHtml(row)) +\r\n this.renderBgCellsHtml(row) +\r\n (this.isRTL ? this.renderBgIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayTableMixin.prototype.renderBgIntroHtml = function (row) {\r\n return this.renderIntroHtml(); // fall back to generic\r\n };\r\n DayTableMixin.prototype.renderBgCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderBgCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n DayTableMixin.prototype.renderBgCellHtml = function (date, otherAttrs) {\r\n var t = this;\r\n var view = t.view;\r\n var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var classes = t.getDayClasses(date);\r\n classes.unshift('fc-day', view.calendar.theme.getClass('widgetContent'));\r\n return '';\r\n };\r\n /* Generic\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayTableMixin.prototype.renderIntroHtml = function () {\r\n // Generates the default HTML intro for any row. User classes should override\r\n };\r\n // TODO: a generic method for dealing with , RTL, intro\r\n // when increment internalApiVersion\r\n // wrapTr (scheduler)\r\n /* Utils\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Applies the generic \"intro\" and \"outro\" HTML to the given cells.\r\n // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.\r\n DayTableMixin.prototype.bookendCells = function (trEl) {\r\n var introHtml = this.renderIntroHtml();\r\n if (introHtml) {\r\n if (this.isRTL) {\r\n trEl.append(introHtml);\r\n }\r\n else {\r\n trEl.prepend(introHtml);\r\n }\r\n }\r\n };\r\n return DayTableMixin;\r\n}(Mixin_1.default));\r\nexports.default = DayTableMixin;\r\n\r\n\r\n/***/ }),\r\n/* 56 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar BusinessHourRenderer = /** @class */ (function () {\r\n /*\r\n component implements:\r\n - eventRangesToEventFootprints\r\n - eventFootprintsToSegs\r\n */\r\n function BusinessHourRenderer(component, fillRenderer) {\r\n this.component = component;\r\n this.fillRenderer = fillRenderer;\r\n }\r\n BusinessHourRenderer.prototype.render = function (businessHourGenerator) {\r\n var component = this.component;\r\n var unzonedRange = component._getDateProfile().activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(component.hasAllDayBusinessHours, unzonedRange);\r\n var eventFootprints = eventInstanceGroup ?\r\n component.eventRangesToEventFootprints(eventInstanceGroup.sliceRenderRanges(unzonedRange)) :\r\n [];\r\n this.renderEventFootprints(eventFootprints);\r\n };\r\n BusinessHourRenderer.prototype.renderEventFootprints = function (eventFootprints) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n this.renderSegs(segs);\r\n this.segs = segs;\r\n };\r\n BusinessHourRenderer.prototype.renderSegs = function (segs) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderSegs('businessHours', segs, {\r\n getClasses: function (seg) {\r\n return ['fc-nonbusiness', 'fc-bgevent'];\r\n }\r\n });\r\n }\r\n };\r\n BusinessHourRenderer.prototype.unrender = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('businessHours');\r\n }\r\n this.segs = null;\r\n };\r\n BusinessHourRenderer.prototype.getSegs = function () {\r\n return this.segs || [];\r\n };\r\n return BusinessHourRenderer;\r\n}());\r\nexports.default = BusinessHourRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 57 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar FillRenderer = /** @class */ (function () {\r\n function FillRenderer(component) {\r\n this.fillSegTag = 'div';\r\n this.component = component;\r\n this.elsByFill = {};\r\n }\r\n FillRenderer.prototype.renderFootprint = function (type, componentFootprint, props) {\r\n this.renderSegs(type, this.component.componentFootprintToSegs(componentFootprint), props);\r\n };\r\n FillRenderer.prototype.renderSegs = function (type, segs, props) {\r\n var els;\r\n segs = this.buildSegEls(type, segs, props); // assignes `.el` to each seg. returns successfully rendered segs\r\n els = this.attachSegEls(type, segs);\r\n if (els) {\r\n this.reportEls(type, els);\r\n }\r\n return segs;\r\n };\r\n // Unrenders a specific type of fill that is currently rendered on the grid\r\n FillRenderer.prototype.unrender = function (type) {\r\n var el = this.elsByFill[type];\r\n if (el) {\r\n el.remove();\r\n delete this.elsByFill[type];\r\n }\r\n };\r\n // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\r\n // Only returns segments that successfully rendered.\r\n FillRenderer.prototype.buildSegEls = function (type, segs, props) {\r\n var _this = this;\r\n var html = '';\r\n var renderedSegs = [];\r\n var i;\r\n if (segs.length) {\r\n // build a large concatenation of segment HTML\r\n for (i = 0; i < segs.length; i++) {\r\n html += this.buildSegHtml(type, segs[i], props);\r\n }\r\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\r\n // Then, compute the 'el' for each segment.\r\n $(html).each(function (i, node) {\r\n var seg = segs[i];\r\n var el = $(node);\r\n // allow custom filter methods per-type\r\n if (props.filterEl) {\r\n el = props.filterEl(seg, el);\r\n }\r\n if (el) {\r\n el = $(el); // allow custom filter to return raw DOM node\r\n // correct element type? (would be bad if a non-TD were inserted into a table for example)\r\n if (el.is(_this.fillSegTag)) {\r\n seg.el = el;\r\n renderedSegs.push(seg);\r\n }\r\n }\r\n });\r\n }\r\n return renderedSegs;\r\n };\r\n // Builds the HTML needed for one fill segment. Generic enough to work with different types.\r\n FillRenderer.prototype.buildSegHtml = function (type, seg, props) {\r\n // custom hooks per-type\r\n var classes = props.getClasses ? props.getClasses(seg) : [];\r\n var css = util_1.cssToStr(props.getCss ? props.getCss(seg) : {});\r\n return '<' + this.fillSegTag +\r\n (classes.length ? ' class=\"' + classes.join(' ') + '\"' : '') +\r\n (css ? ' style=\"' + css + '\"' : '') +\r\n ' />';\r\n };\r\n // Should return wrapping DOM structure\r\n FillRenderer.prototype.attachSegEls = function (type, segs) {\r\n // subclasses must implement\r\n };\r\n FillRenderer.prototype.reportEls = function (type, nodes) {\r\n if (this.elsByFill[type]) {\r\n this.elsByFill[type] = this.elsByFill[type].add(nodes);\r\n }\r\n else {\r\n this.elsByFill[type] = $(nodes);\r\n }\r\n };\r\n return FillRenderer;\r\n}());\r\nexports.default = FillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 58 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar HelperRenderer = /** @class */ (function () {\r\n function HelperRenderer(component, eventRenderer) {\r\n this.view = component._getView();\r\n this.component = component;\r\n this.eventRenderer = eventRenderer;\r\n }\r\n HelperRenderer.prototype.renderComponentFootprint = function (componentFootprint) {\r\n this.renderEventFootprints([\r\n this.fabricateEventFootprint(componentFootprint)\r\n ]);\r\n };\r\n HelperRenderer.prototype.renderEventDraggingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-dragging', isTouch ? null : this.view.opt('dragOpacity'));\r\n };\r\n HelperRenderer.prototype.renderEventResizingFootprints = function (eventFootprints, sourceSeg, isTouch) {\r\n this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-resizing');\r\n };\r\n HelperRenderer.prototype.renderEventFootprints = function (eventFootprints, sourceSeg, extraClassNames, opacity) {\r\n var segs = this.component.eventFootprintsToSegs(eventFootprints);\r\n var classNames = 'fc-helper ' + (extraClassNames || '');\r\n var i;\r\n // assigns each seg's el and returns a subset of segs that were rendered\r\n segs = this.eventRenderer.renderFgSegEls(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.addClass(classNames);\r\n }\r\n if (opacity != null) {\r\n for (i = 0; i < segs.length; i++) {\r\n segs[i].el.css('opacity', opacity);\r\n }\r\n }\r\n this.helperEls = this.renderSegs(segs, sourceSeg);\r\n };\r\n /*\r\n Must return all mock event elements\r\n */\r\n HelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n // Subclasses must implement\r\n };\r\n HelperRenderer.prototype.unrender = function () {\r\n if (this.helperEls) {\r\n this.helperEls.remove();\r\n this.helperEls = null;\r\n }\r\n };\r\n HelperRenderer.prototype.fabricateEventFootprint = function (componentFootprint) {\r\n var calendar = this.view.calendar;\r\n var eventDateProfile = calendar.footprintToDateProfile(componentFootprint);\r\n var dummyEvent = new SingleEventDef_1.default(new EventSource_1.default(calendar));\r\n var dummyInstance;\r\n dummyEvent.dateProfile = eventDateProfile;\r\n dummyInstance = dummyEvent.buildInstance();\r\n return new EventFootprint_1.default(componentFootprint, dummyEvent, dummyInstance);\r\n };\r\n return HelperRenderer;\r\n}());\r\nexports.default = HelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 59 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventPointing, _super);\r\n function EventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /*\r\n component must implement:\r\n - publiclyTrigger\r\n */\r\n EventPointing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'click', this.handleClick.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseenter', this.handleMouseover.bind(this));\r\n component.bindSegHandlerToEl(el, 'mouseleave', this.handleMouseout.bind(this));\r\n };\r\n EventPointing.prototype.handleClick = function (seg, ev) {\r\n var res = this.component.publiclyTrigger('eventClick', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n if (res === false) {\r\n ev.preventDefault();\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused over\r\n EventPointing.prototype.handleMouseover = function (seg, ev) {\r\n if (!GlobalEmitter_1.default.get().shouldIgnoreMouse() &&\r\n !this.mousedOverSeg) {\r\n this.mousedOverSeg = seg;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.addClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseover', {\r\n context: seg.el[0],\r\n args: [seg.footprint.getEventLegacy(), ev, this.view]\r\n });\r\n }\r\n };\r\n // Updates internal state and triggers handlers for when an event element is moused out.\r\n // Can be given no arguments, in which case it will mouseout the segment that was previously moused over.\r\n EventPointing.prototype.handleMouseout = function (seg, ev) {\r\n if (this.mousedOverSeg) {\r\n this.mousedOverSeg = null;\r\n // TODO: move to EventSelecting's responsibility\r\n if (this.view.isEventDefResizable(seg.footprint.eventDef)) {\r\n seg.el.removeClass('fc-allow-mouse-resize');\r\n }\r\n this.component.publiclyTrigger('eventMouseout', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev || {},\r\n this.view\r\n ]\r\n });\r\n }\r\n };\r\n EventPointing.prototype.end = function () {\r\n if (this.mousedOverSeg) {\r\n this.handleMouseout(this.mousedOverSeg);\r\n }\r\n };\r\n return EventPointing;\r\n}(Interaction_1.default));\r\nexports.default = EventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 60 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar DateClicking_1 = __webpack_require__(245);\r\nvar DateSelecting_1 = __webpack_require__(225);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar EventDragging_1 = __webpack_require__(224);\r\nvar EventResizing_1 = __webpack_require__(223);\r\nvar ExternalDropping_1 = __webpack_require__(222);\r\nvar StandardInteractionsMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardInteractionsMixin, _super);\r\n function StandardInteractionsMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardInteractionsMixin;\r\n}(Mixin_1.default));\r\nexports.default = StandardInteractionsMixin;\r\nStandardInteractionsMixin.prototype.dateClickingClass = DateClicking_1.default;\r\nStandardInteractionsMixin.prototype.dateSelectingClass = DateSelecting_1.default;\r\nStandardInteractionsMixin.prototype.eventPointingClass = EventPointing_1.default;\r\nStandardInteractionsMixin.prototype.eventDraggingClass = EventDragging_1.default;\r\nStandardInteractionsMixin.prototype.eventResizingClass = EventResizing_1.default;\r\nStandardInteractionsMixin.prototype.externalDroppingClass = ExternalDropping_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 61 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar Popover_1 = __webpack_require__(249);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventFootprint_1 = __webpack_require__(36);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar DayGridEventRenderer_1 = __webpack_require__(250);\r\nvar DayGridHelperRenderer_1 = __webpack_require__(251);\r\nvar DayGridFillRenderer_1 = __webpack_require__(252);\r\n/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGrid, _super);\r\n function DayGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.cellWeekNumbersVisible = false; // display week numbers in day cell?\r\n _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid\r\n // isRigid determines whether the individual rows should ignore the contents and be a constant height.\r\n // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.\r\n _this.isRigid = false;\r\n _this.hasAllDayBusinessHours = true;\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n DayGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByRow(componentFootprint.unzonedRange);\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (this.isRTL) {\r\n seg.leftCol = this.daysPerRow - 1 - seg.lastRowDayIndex;\r\n seg.rightCol = this.daysPerRow - 1 - seg.firstRowDayIndex;\r\n }\r\n else {\r\n seg.leftCol = seg.firstRowDayIndex;\r\n seg.rightCol = seg.lastRowDayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderGrid();\r\n };\r\n DayGrid.prototype.unrenderDates = function () {\r\n this.removeSegPopover();\r\n };\r\n // Renders the rows and columns into the component's `this.el`, which should already be assigned.\r\n DayGrid.prototype.renderGrid = function () {\r\n var view = this.view;\r\n var rowCnt = this.rowCnt;\r\n var colCnt = this.colCnt;\r\n var html = '';\r\n var row;\r\n var col;\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n for (row = 0; row < rowCnt; row++) {\r\n html += this.renderDayRowHtml(row, this.isRigid);\r\n }\r\n this.el.html(html);\r\n this.rowEls = this.el.find('.fc-row');\r\n this.cellEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.rowCoordCache = new CoordCache_1.default({\r\n els: this.rowEls,\r\n isVertical: true\r\n });\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.cellEls.slice(0, this.colCnt),\r\n isHorizontal: true\r\n });\r\n // trigger dayRender with each cell's element\r\n for (row = 0; row < rowCnt; row++) {\r\n for (col = 0; col < colCnt; col++) {\r\n this.publiclyTrigger('dayRender', {\r\n context: view,\r\n args: [\r\n this.getCellDate(row, col),\r\n this.getCellEl(row, col),\r\n view\r\n ]\r\n });\r\n }\r\n }\r\n };\r\n // Generates the HTML for a single row, which is a div that wraps a table.\r\n // `row` is the row number.\r\n DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {\r\n var theme = this.view.calendar.theme;\r\n var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];\r\n if (isRigid) {\r\n classes.push('fc-rigid');\r\n }\r\n return '' +\r\n '
' +\r\n '
' +\r\n '' +\r\n this.renderBgTrHtml(row) +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '' +\r\n (this.getIsNumbersVisible() ?\r\n '' +\r\n this.renderNumberTrHtml(row) +\r\n '' :\r\n '') +\r\n '
' +\r\n '
' +\r\n '
';\r\n };\r\n DayGrid.prototype.getIsNumbersVisible = function () {\r\n return this.getIsDayNumbersVisible() || this.cellWeekNumbersVisible;\r\n };\r\n DayGrid.prototype.getIsDayNumbersVisible = function () {\r\n return this.rowCnt > 1;\r\n };\r\n /* Grid Number Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.renderNumberTrHtml = function (row) {\r\n return '' +\r\n '' +\r\n (this.isRTL ? '' : this.renderNumberIntroHtml(row)) +\r\n this.renderNumberCellsHtml(row) +\r\n (this.isRTL ? this.renderNumberIntroHtml(row) : '') +\r\n '';\r\n };\r\n DayGrid.prototype.renderNumberIntroHtml = function (row) {\r\n return this.renderIntroHtml();\r\n };\r\n DayGrid.prototype.renderNumberCellsHtml = function (row) {\r\n var htmls = [];\r\n var col;\r\n var date;\r\n for (col = 0; col < this.colCnt; col++) {\r\n date = this.getCellDate(row, col);\r\n htmls.push(this.renderNumberCellHtml(date));\r\n }\r\n return htmls.join('');\r\n };\r\n // Generates the HTML for the s of the \"number\" row in the DayGrid's content skeleton.\r\n // The number row will only exist if either day numbers or week numbers are turned on.\r\n DayGrid.prototype.renderNumberCellHtml = function (date) {\r\n var view = this.view;\r\n var html = '';\r\n var isDateValid = this.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.\r\n var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;\r\n var classes;\r\n var weekCalcFirstDoW;\r\n if (!isDayNumberVisible && !this.cellWeekNumbersVisible) {\r\n // no numbers in day cell (week number must be along the side)\r\n return ''; // will create an empty space above events :(\r\n }\r\n classes = this.getDayClasses(date);\r\n classes.unshift('fc-day-top');\r\n if (this.cellWeekNumbersVisible) {\r\n // To determine the day of week number change under ISO, we cannot\r\n // rely on moment.js methods such as firstDayOfWeek() or weekday(),\r\n // because they rely on the locale's dow (possibly overridden by\r\n // our firstDay option), which may not be Monday. We cannot change\r\n // dow, because that would affect the calendar start day as well.\r\n if (date._locale._fullCalendar_weekCalc === 'ISO') {\r\n weekCalcFirstDoW = 1; // Monday by ISO 8601 definition\r\n }\r\n else {\r\n weekCalcFirstDoW = date._locale.firstDayOfWeek();\r\n }\r\n }\r\n html += '';\r\n if (this.cellWeekNumbersVisible && (date.day() === weekCalcFirstDoW)) {\r\n html += view.buildGotoAnchorHtml({ date: date, type: 'week' }, { 'class': 'fc-week-number' }, date.format('w') // inner HTML\r\n );\r\n }\r\n if (isDayNumberVisible) {\r\n html += view.buildGotoAnchorHtml(date, { 'class': 'fc-day-number' }, date.format('D') // inner HTML\r\n );\r\n }\r\n html += '';\r\n return html;\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.rowCoordCache.build();\r\n this.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack\r\n };\r\n DayGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n this.rowCoordCache.clear();\r\n };\r\n DayGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n if (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {\r\n var col = this.colCoordCache.getHorizontalIndex(leftOffset);\r\n var row = this.rowCoordCache.getVerticalIndex(topOffset);\r\n if (row != null && col != null) {\r\n return this.getCellHit(row, col);\r\n }\r\n }\r\n };\r\n DayGrid.prototype.getHitFootprint = function (hit) {\r\n var range = this.getCellRange(hit.row, hit.col);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(range.start, range.end), true // all-day?\r\n );\r\n };\r\n DayGrid.prototype.getHitEl = function (hit) {\r\n return this.getCellEl(hit.row, hit.col);\r\n };\r\n /* Cell System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // FYI: the first column is the leftmost column, regardless of date\r\n DayGrid.prototype.getCellHit = function (row, col) {\r\n return {\r\n row: row,\r\n col: col,\r\n component: this,\r\n left: this.colCoordCache.getLeftOffset(col),\r\n right: this.colCoordCache.getRightOffset(col),\r\n top: this.rowCoordCache.getTopOffset(row),\r\n bottom: this.rowCoordCache.getBottomOffset(row)\r\n };\r\n };\r\n DayGrid.prototype.getCellEl = function (row, col) {\r\n return this.cellEls.eq(row * this.colCnt + col);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Unrenders all events currently rendered on the grid\r\n DayGrid.prototype.executeEventUnrender = function () {\r\n this.removeSegPopover(); // removes the \"more..\" events popover\r\n _super.prototype.executeEventUnrender.call(this);\r\n };\r\n // Retrieves all rendered segment objects currently rendered on the grid\r\n DayGrid.prototype.getOwnEventSegs = function () {\r\n // append the segments from the \"more...\" popover\r\n return _super.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs || []);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event or external element being dragged.\r\n // `eventLocation` has zoned start and end (optional)\r\n DayGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n // render drags from OTHER components as helpers\r\n if (eventFootprints.length && seg && seg.component !== this) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n return true; // signal helpers rendered\r\n }\r\n };\r\n // Unrenders any visual indication of a hovering event\r\n DayGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n DayGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders a visual indication of an event being resized\r\n DayGrid.prototype.unrenderEventResize = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* More+ Link Popover\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DayGrid.prototype.removeSegPopover = function () {\r\n if (this.segPopover) {\r\n this.segPopover.hide(); // in handler, will call segPopover's removeElement\r\n }\r\n };\r\n // Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\r\n // `levelLimit` can be false (don't limit), a number, or true (should be computed).\r\n DayGrid.prototype.limitRows = function (levelLimit) {\r\n var rowStructs = this.eventRenderer.rowStructs || [];\r\n var row; // row #\r\n var rowLevelLimit;\r\n for (row = 0; row < rowStructs.length; row++) {\r\n this.unlimitRow(row);\r\n if (!levelLimit) {\r\n rowLevelLimit = false;\r\n }\r\n else if (typeof levelLimit === 'number') {\r\n rowLevelLimit = levelLimit;\r\n }\r\n else {\r\n rowLevelLimit = this.computeRowLevelLimit(row);\r\n }\r\n if (rowLevelLimit !== false) {\r\n this.limitRow(row, rowLevelLimit);\r\n }\r\n }\r\n };\r\n // Computes the number of levels a row will accomodate without going outside its bounds.\r\n // Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\r\n // `row` is the row number.\r\n DayGrid.prototype.computeRowLevelLimit = function (row) {\r\n var rowEl = this.rowEls.eq(row); // the containing \"fake\" row div\r\n var rowHeight = rowEl.height(); // TODO: cache somehow?\r\n var trEls = this.eventRenderer.rowStructs[row].tbodyEl.children();\r\n var i;\r\n var trEl;\r\n var trHeight;\r\n function iterInnerHeights(i, childNode) {\r\n trHeight = Math.max(trHeight, $(childNode).outerHeight());\r\n }\r\n // Reveal one level at a time and stop when we find one out of bounds\r\n for (i = 0; i < trEls.length; i++) {\r\n trEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)\r\n // with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,\r\n // so instead, find the tallest inner content element.\r\n trHeight = 0;\r\n trEl.find('> td > :first-child').each(iterInnerHeights);\r\n if (trEl.position().top + trHeight > rowHeight) {\r\n return i;\r\n }\r\n }\r\n return false; // should not limit at all\r\n };\r\n // Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\r\n // `row` is the row number.\r\n // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\r\n DayGrid.prototype.limitRow = function (row, levelLimit) {\r\n var _this = this;\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n var moreNodes = []; // array of \"more\"
links and DOM nodes\r\n var col = 0; // col #, left-to-right (not chronologically)\r\n var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\r\n var cellMatrix; // a matrix (by level, then column) of all jQuery elements in the row\r\n var limitedNodes; // array of temporarily hidden level and segment DOM nodes\r\n var i;\r\n var seg;\r\n var segsBelow; // array of segment objects below `seg` in the current `col`\r\n var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\r\n var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\r\n var td;\r\n var rowspan;\r\n var segMoreNodes; // array of \"more\" cells that will stand-in for the current seg's cell\r\n var j;\r\n var moreTd;\r\n var moreWrap;\r\n var moreLink;\r\n // Iterates through empty level cells and places \"more\" links inside if need be\r\n var emptyCellsUntil = function (endCol) {\r\n while (col < endCol) {\r\n segsBelow = _this.getCellSegs(row, col, levelLimit);\r\n if (segsBelow.length) {\r\n td = cellMatrix[levelLimit - 1][col];\r\n moreLink = _this.renderMoreLink(row, col, segsBelow);\r\n moreWrap = $('
').append(moreLink);\r\n td.append(moreWrap);\r\n moreNodes.push(moreWrap[0]);\r\n }\r\n col++;\r\n }\r\n };\r\n if (levelLimit && levelLimit < rowStruct.segLevels.length) {\r\n levelSegs = rowStruct.segLevels[levelLimit - 1];\r\n cellMatrix = rowStruct.cellMatrix;\r\n limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level elements past the limit\r\n .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array\r\n // iterate though segments in the last allowable level\r\n for (i = 0; i < levelSegs.length; i++) {\r\n seg = levelSegs[i];\r\n emptyCellsUntil(seg.leftCol); // process empty cells before the segment\r\n // determine *all* segments below `seg` that occupy the same columns\r\n colSegsBelow = [];\r\n totalSegsBelow = 0;\r\n while (col <= seg.rightCol) {\r\n segsBelow = this.getCellSegs(row, col, levelLimit);\r\n colSegsBelow.push(segsBelow);\r\n totalSegsBelow += segsBelow.length;\r\n col++;\r\n }\r\n if (totalSegsBelow) {\r\n td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell\r\n rowspan = td.attr('rowspan') || 1;\r\n segMoreNodes = [];\r\n // make a replacement for each column the segment occupies. will be one for each colspan\r\n for (j = 0; j < colSegsBelow.length; j++) {\r\n moreTd = $('').attr('rowspan', rowspan);\r\n segsBelow = colSegsBelow[j];\r\n moreLink = this.renderMoreLink(row, seg.leftCol + j, [seg].concat(segsBelow) // count seg as hidden too\r\n );\r\n moreWrap = $('
').append(moreLink);\r\n moreTd.append(moreWrap);\r\n segMoreNodes.push(moreTd[0]);\r\n moreNodes.push(moreTd[0]);\r\n }\r\n td.addClass('fc-limited').after($(segMoreNodes)); // hide original and inject replacements\r\n limitedNodes.push(td[0]);\r\n }\r\n }\r\n emptyCellsUntil(this.colCnt); // finish off the level\r\n rowStruct.moreEls = $(moreNodes); // for easy undoing later\r\n rowStruct.limitedEls = $(limitedNodes); // for easy undoing later\r\n }\r\n };\r\n // Reveals all levels and removes all \"more\"-related elements for a grid's row.\r\n // `row` is a row number.\r\n DayGrid.prototype.unlimitRow = function (row) {\r\n var rowStruct = this.eventRenderer.rowStructs[row];\r\n if (rowStruct.moreEls) {\r\n rowStruct.moreEls.remove();\r\n rowStruct.moreEls = null;\r\n }\r\n if (rowStruct.limitedEls) {\r\n rowStruct.limitedEls.removeClass('fc-limited');\r\n rowStruct.limitedEls = null;\r\n }\r\n };\r\n // Renders an element that represents hidden event element for a cell.\r\n // Responsible for attaching click handler as well.\r\n DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {\r\n var _this = this;\r\n var view = this.view;\r\n return $('')\r\n .text(this.getMoreLinkText(hiddenSegs.length))\r\n .on('click', function (ev) {\r\n var clickOption = _this.opt('eventLimitClick');\r\n var date = _this.getCellDate(row, col);\r\n var moreEl = $(ev.currentTarget);\r\n var dayEl = _this.getCellEl(row, col);\r\n var allSegs = _this.getCellSegs(row, col);\r\n // rescope the segments to be within the cell's date\r\n var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\r\n var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\r\n if (typeof clickOption === 'function') {\r\n // the returned value can be an atomic option\r\n clickOption = _this.publiclyTrigger('eventLimitClick', {\r\n context: view,\r\n args: [\r\n {\r\n date: date.clone(),\r\n dayEl: dayEl,\r\n moreEl: moreEl,\r\n segs: reslicedAllSegs,\r\n hiddenSegs: reslicedHiddenSegs\r\n },\r\n ev,\r\n view\r\n ]\r\n });\r\n }\r\n if (clickOption === 'popover') {\r\n _this.showSegPopover(row, col, moreEl, reslicedAllSegs);\r\n }\r\n else if (typeof clickOption === 'string') {\r\n view.calendar.zoomTo(date, clickOption);\r\n }\r\n });\r\n };\r\n // Reveals the popover that displays all events within a cell\r\n DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {\r\n var _this = this;\r\n var view = this.view;\r\n var moreWrap = moreLink.parent(); // the
wrapper around the \r\n var topEl; // the element we want to match the top coordinate of\r\n var options;\r\n if (this.rowCnt === 1) {\r\n topEl = view.el; // will cause the popover to cover any sort of header\r\n }\r\n else {\r\n topEl = this.rowEls.eq(row); // will align with top of row\r\n }\r\n options = {\r\n className: 'fc-more-popover ' + view.calendar.theme.getClass('popover'),\r\n content: this.renderSegPopoverContent(row, col, segs),\r\n parentEl: view.el,\r\n top: topEl.offset().top,\r\n autoHide: true,\r\n viewportConstrain: this.opt('popoverViewportConstrain'),\r\n hide: function () {\r\n // kill everything when the popover is hidden\r\n // notify events to be removed\r\n if (_this.popoverSegs) {\r\n _this.triggerBeforeEventSegsDestroyed(_this.popoverSegs);\r\n }\r\n _this.segPopover.removeElement();\r\n _this.segPopover = null;\r\n _this.popoverSegs = null;\r\n }\r\n };\r\n // Determine horizontal coordinate.\r\n // We use the moreWrap instead of the to avoid border confusion.\r\n if (this.isRTL) {\r\n options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border\r\n }\r\n else {\r\n options.left = moreWrap.offset().left - 1; // -1 to be over cell border\r\n }\r\n this.segPopover = new Popover_1.default(options);\r\n this.segPopover.show();\r\n // the popover doesn't live within the grid's container element, and thus won't get the event\r\n // delegated-handlers for free. attach event-related handlers to the popover.\r\n this.bindAllSegHandlersToEl(this.segPopover.el);\r\n this.triggerAfterEventSegsRendered(segs);\r\n };\r\n // Builds the inner DOM contents of the segment popover\r\n DayGrid.prototype.renderSegPopoverContent = function (row, col, segs) {\r\n var view = this.view;\r\n var theme = view.calendar.theme;\r\n var title = this.getCellDate(row, col).format(this.opt('dayPopoverFormat'));\r\n var content = $('
' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(title) +\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
');\r\n var segContainer = content.find('.fc-event-container');\r\n var i;\r\n // render each seg's `el` and only return the visible segs\r\n segs = this.eventRenderer.renderFgSegEls(segs, true); // disableResizing=true\r\n this.popoverSegs = segs;\r\n for (i = 0; i < segs.length; i++) {\r\n // because segments in the popover are not part of a grid coordinate system, provide a hint to any\r\n // grids that want to do drag-n-drop about which cell it came from\r\n this.hitsNeeded();\r\n segs[i].hit = this.getCellHit(row, col);\r\n this.hitsNotNeeded();\r\n segContainer.append(segs[i].el);\r\n }\r\n return content;\r\n };\r\n // Given the events within an array of segment objects, reslice them to be in a single day\r\n DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {\r\n var dayStart = dayDate.clone();\r\n var dayEnd = dayStart.clone().add(1, 'days');\r\n var dayRange = new UnzonedRange_1.default(dayStart, dayEnd);\r\n var newSegs = [];\r\n var i;\r\n var seg;\r\n var slicedRange;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n slicedRange = seg.footprint.componentFootprint.unzonedRange.intersect(dayRange);\r\n if (slicedRange) {\r\n newSegs.push($.extend({}, seg, {\r\n footprint: new EventFootprint_1.default(new ComponentFootprint_1.default(slicedRange, seg.footprint.componentFootprint.isAllDay), seg.footprint.eventDef, seg.footprint.eventInstance),\r\n isStart: seg.isStart && slicedRange.isStart,\r\n isEnd: seg.isEnd && slicedRange.isEnd\r\n }));\r\n }\r\n }\r\n // force an order because eventsToSegs doesn't guarantee one\r\n // TODO: research if still needed\r\n this.eventRenderer.sortEventSegs(newSegs);\r\n return newSegs;\r\n };\r\n // Generates the text that should be inside a \"more\" link, given the number of events it represents\r\n DayGrid.prototype.getMoreLinkText = function (num) {\r\n var opt = this.opt('eventLimitText');\r\n if (typeof opt === 'function') {\r\n return opt(num);\r\n }\r\n else {\r\n return '+' + num + ' ' + opt;\r\n }\r\n };\r\n // Returns segments within a given cell.\r\n // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\r\n DayGrid.prototype.getCellSegs = function (row, col, startLevel) {\r\n var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;\r\n var level = startLevel || 0;\r\n var segs = [];\r\n var seg;\r\n while (level < segMatrix.length) {\r\n seg = segMatrix[level][col];\r\n if (seg) {\r\n segs.push(seg);\r\n }\r\n level++;\r\n }\r\n return segs;\r\n };\r\n return DayGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = DayGrid;\r\nDayGrid.prototype.eventRendererClass = DayGridEventRenderer_1.default;\r\nDayGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nDayGrid.prototype.helperRendererClass = DayGridHelperRenderer_1.default;\r\nDayGrid.prototype.fillRendererClass = DayGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(DayGrid);\r\nDayTableMixin_1.default.mixInto(DayGrid);\r\n\r\n\r\n/***/ }),\r\n/* 62 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar DayGrid_1 = __webpack_require__(61);\r\n/* An abstract class for the \"basic\" views, as well as month view. Renders one or more rows of day cells.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\r\n// It is responsible for managing width/height.\r\nvar BasicView = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicView, _super);\r\n function BasicView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.dayGrid = _this.instantiateDayGrid();\r\n _this.dayGrid.isRigid = _this.hasRigidRows();\r\n if (_this.opt('weekNumbers')) {\r\n if (_this.opt('weekNumbersWithinDays')) {\r\n _this.dayGrid.cellWeekNumbersVisible = true;\r\n _this.dayGrid.colWeekNumbersVisible = false;\r\n }\r\n else {\r\n _this.dayGrid.cellWeekNumbersVisible = false;\r\n _this.dayGrid.colWeekNumbersVisible = true;\r\n }\r\n }\r\n _this.addChild(_this.dayGrid);\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Generates the DayGrid object this view needs. Draws from this.dayGridClass\r\n BasicView.prototype.instantiateDayGrid = function () {\r\n // generate a subclass on the fly with BasicView-specific behavior\r\n // TODO: cache this subclass\r\n var subclass = makeDayGridSubclass(this.dayGridClass);\r\n return new subclass(this);\r\n };\r\n BasicView.prototype.executeDateRender = function (dateProfile) {\r\n this.dayGrid.breakOnWeeks = /year|month|week/.test(dateProfile.currentRangeUnit);\r\n _super.prototype.executeDateRender.call(this, dateProfile);\r\n };\r\n BasicView.prototype.renderSkeleton = function () {\r\n var dayGridContainerEl;\r\n var dayGridEl;\r\n this.el.addClass('fc-basic-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container');\r\n dayGridEl = $('
').appendTo(dayGridContainerEl);\r\n this.el.find('.fc-body > tr > td').append(dayGridContainerEl);\r\n this.dayGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.dayGrid.setElement(dayGridEl);\r\n };\r\n BasicView.prototype.unrenderSkeleton = function () {\r\n this.dayGrid.removeElement();\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid component will render inside of a container defined by this HTML.\r\n BasicView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the week number column, if it is known\r\n BasicView.prototype.weekNumberStyleAttr = function () {\r\n if (this.weekNumberWidth != null) {\r\n return 'style=\"width:' + this.weekNumberWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n // Determines whether each row should have a constant height\r\n BasicView.prototype.hasRigidRows = function () {\r\n var eventLimit = this.opt('eventLimit');\r\n return eventLimit && typeof eventLimit !== 'number';\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Refreshes the horizontal dimensions of the view\r\n BasicView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit = this.opt('eventLimit');\r\n var headRowEl = this.dayGrid.headContainerEl.find('.fc-row');\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n // hack to give the view some height prior to dayGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS dayGrid.\r\n if (!this.dayGrid.rowEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n if (this.dayGrid.colWeekNumbersVisible) {\r\n // Make sure all week number cells running down the side have the same width.\r\n // Record the width for cells created later.\r\n this.weekNumberWidth = util_1.matchCellWidths(this.el.find('.fc-week-number'));\r\n }\r\n // reset all heights to be natural\r\n this.scroller.clear();\r\n util_1.uncompensateScroll(headRowEl);\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n // is the event limit a constant level number?\r\n if (eventLimit && typeof eventLimit === 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\r\n }\r\n // distribute the height to the rows\r\n // (totalHeight is a \"recommended\" value if isAuto)\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.setGridHeight(scrollerHeight, isAuto);\r\n // is the event limit dynamically calculated?\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\r\n }\r\n if (!isAuto) {\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n util_1.compensateScroll(headRowEl, scrollbarWidths);\r\n // doing the scrollbar compensation might have created text overflow which created more height. redo\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n BasicView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n // Sets the height of just the DayGrid component in this view\r\n BasicView.prototype.setGridHeight = function (height, isAuto) {\r\n if (isAuto) {\r\n util_1.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\r\n }\r\n else {\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\r\n }\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n BasicView.prototype.computeInitialDateScroll = function () {\r\n return { top: 0 };\r\n };\r\n BasicView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n BasicView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n return BasicView;\r\n}(View_1.default));\r\nexports.default = BasicView;\r\nBasicView.prototype.dateProfileGeneratorClass = BasicViewDateProfileGenerator_1.default;\r\nBasicView.prototype.dayGridClass = DayGrid_1.default;\r\n// customize the rendering behavior of BasicView's dayGrid\r\nfunction makeDayGridSubclass(SuperClass) {\r\n return /** @class */ (function (_super) {\r\n tslib_1.__extends(SubClass, _super);\r\n function SubClass() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.colWeekNumbersVisible = false; // display week numbers along the side?\r\n return _this;\r\n }\r\n // Generates the HTML that will go before the day-of week header cells\r\n SubClass.prototype.renderHeadIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n util_1.htmlEscape(this.opt('weekNumberTitle')) +\r\n '' +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that will go before content-skeleton cells that display the day/week numbers\r\n SubClass.prototype.renderNumberIntroHtml = function (row) {\r\n var view = this.view;\r\n var weekStart = this.getCellDate(row, 0);\r\n if (this.colWeekNumbersVisible) {\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt === 1 }, weekStart.format('w') // inner HTML\r\n ) +\r\n '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before the day bg cells for each day-row\r\n SubClass.prototype.renderBgIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n // Generates the HTML that goes before every other type of row generated by DayGrid.\r\n // Affects helper-skeleton and highlight-skeleton rows.\r\n SubClass.prototype.renderIntroHtml = function () {\r\n var view = this.view;\r\n if (this.colWeekNumbersVisible) {\r\n return '';\r\n }\r\n return '';\r\n };\r\n SubClass.prototype.getIsNumbersVisible = function () {\r\n return DayGrid_1.default.prototype.getIsNumbersVisible.apply(this, arguments) || this.colWeekNumbersVisible;\r\n };\r\n return SubClass;\r\n }(SuperClass));\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 63 */,\r\n/* 64 */,\r\n/* 65 */,\r\n/* 66 */,\r\n/* 67 */,\r\n/* 68 */,\r\n/* 69 */,\r\n/* 70 */,\r\n/* 71 */,\r\n/* 72 */,\r\n/* 73 */,\r\n/* 74 */,\r\n/* 75 */,\r\n/* 76 */,\r\n/* 77 */,\r\n/* 78 */,\r\n/* 79 */,\r\n/* 80 */,\r\n/* 81 */,\r\n/* 82 */,\r\n/* 83 */,\r\n/* 84 */,\r\n/* 85 */,\r\n/* 86 */,\r\n/* 87 */,\r\n/* 88 */,\r\n/* 89 */,\r\n/* 90 */,\r\n/* 91 */,\r\n/* 92 */,\r\n/* 93 */,\r\n/* 94 */,\r\n/* 95 */,\r\n/* 96 */,\r\n/* 97 */,\r\n/* 98 */,\r\n/* 99 */,\r\n/* 100 */,\r\n/* 101 */,\r\n/* 102 */,\r\n/* 103 */,\r\n/* 104 */,\r\n/* 105 */,\r\n/* 106 */,\r\n/* 107 */,\r\n/* 108 */,\r\n/* 109 */,\r\n/* 110 */,\r\n/* 111 */,\r\n/* 112 */,\r\n/* 113 */,\r\n/* 114 */,\r\n/* 115 */,\r\n/* 116 */,\r\n/* 117 */,\r\n/* 118 */,\r\n/* 119 */,\r\n/* 120 */,\r\n/* 121 */,\r\n/* 122 */,\r\n/* 123 */,\r\n/* 124 */,\r\n/* 125 */,\r\n/* 126 */,\r\n/* 127 */,\r\n/* 128 */,\r\n/* 129 */,\r\n/* 130 */,\r\n/* 131 */,\r\n/* 132 */,\r\n/* 133 */,\r\n/* 134 */,\r\n/* 135 */,\r\n/* 136 */,\r\n/* 137 */,\r\n/* 138 */,\r\n/* 139 */,\r\n/* 140 */,\r\n/* 141 */,\r\n/* 142 */,\r\n/* 143 */,\r\n/* 144 */,\r\n/* 145 */,\r\n/* 146 */,\r\n/* 147 */,\r\n/* 148 */,\r\n/* 149 */,\r\n/* 150 */,\r\n/* 151 */,\r\n/* 152 */,\r\n/* 153 */,\r\n/* 154 */,\r\n/* 155 */,\r\n/* 156 */,\r\n/* 157 */,\r\n/* 158 */,\r\n/* 159 */,\r\n/* 160 */,\r\n/* 161 */,\r\n/* 162 */,\r\n/* 163 */,\r\n/* 164 */,\r\n/* 165 */,\r\n/* 166 */,\r\n/* 167 */,\r\n/* 168 */,\r\n/* 169 */,\r\n/* 170 */,\r\n/* 171 */,\r\n/* 172 */,\r\n/* 173 */,\r\n/* 174 */,\r\n/* 175 */,\r\n/* 176 */,\r\n/* 177 */,\r\n/* 178 */,\r\n/* 179 */,\r\n/* 180 */,\r\n/* 181 */,\r\n/* 182 */,\r\n/* 183 */,\r\n/* 184 */,\r\n/* 185 */,\r\n/* 186 */,\r\n/* 187 */,\r\n/* 188 */,\r\n/* 189 */,\r\n/* 190 */,\r\n/* 191 */,\r\n/* 192 */,\r\n/* 193 */,\r\n/* 194 */,\r\n/* 195 */,\r\n/* 196 */,\r\n/* 197 */,\r\n/* 198 */,\r\n/* 199 */,\r\n/* 200 */,\r\n/* 201 */,\r\n/* 202 */,\r\n/* 203 */,\r\n/* 204 */,\r\n/* 205 */,\r\n/* 206 */,\r\n/* 207 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar util_1 = __webpack_require__(35);\r\nvar Constraints = /** @class */ (function () {\r\n function Constraints(eventManager, _calendar) {\r\n this.eventManager = eventManager;\r\n this._calendar = _calendar;\r\n }\r\n Constraints.prototype.opt = function (name) {\r\n return this._calendar.opt(name);\r\n };\r\n /*\r\n determines if eventInstanceGroup is allowed,\r\n in relation to other EVENTS and business hours.\r\n */\r\n Constraints.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {\r\n var eventDef = eventInstanceGroup.getEventDef();\r\n var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());\r\n var i;\r\n var peerEventInstances = this.getPeerEventInstances(eventDef);\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var constraintVal = eventDef.getConstraint();\r\n var overlapVal = eventDef.getOverlap();\r\n var eventAllowFunc = this.opt('eventAllow');\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (!this.isFootprintAllowed(eventFootprints[i].componentFootprint, peerEventFootprints, constraintVal, overlapVal, eventFootprints[i].eventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (eventAllowFunc) {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventAllowFunc(eventFootprints[i].componentFootprint.toLegacy(this._calendar), eventFootprints[i].getEventLegacy()) === false) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n Constraints.prototype.getPeerEventInstances = function (eventDef) {\r\n return this.eventManager.getEventInstancesWithoutId(eventDef.id);\r\n };\r\n Constraints.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n var peerEventInstances = this.eventManager.getEventInstances();\r\n var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);\r\n var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);\r\n var selectAllowFunc;\r\n if (this.isFootprintAllowed(componentFootprint, peerEventFootprints, this.opt('selectConstraint'), this.opt('selectOverlap'))) {\r\n selectAllowFunc = this.opt('selectAllow');\r\n if (selectAllowFunc) {\r\n return selectAllowFunc(componentFootprint.toLegacy(this._calendar)) !== false;\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.isFootprintAllowed = function (componentFootprint, peerEventFootprints, constraintVal, overlapVal, subjectEventInstance // optional\r\n ) {\r\n var constraintFootprints; // ComponentFootprint[]\r\n var overlapEventFootprints; // EventFootprint[]\r\n if (constraintVal != null) {\r\n constraintFootprints = this.constraintValToFootprints(constraintVal, componentFootprint.isAllDay);\r\n if (!this.isFootprintWithinConstraints(componentFootprint, constraintFootprints)) {\r\n return false;\r\n }\r\n }\r\n overlapEventFootprints = this.collectOverlapEventFootprints(peerEventFootprints, componentFootprint);\r\n if (overlapVal === false) {\r\n if (overlapEventFootprints.length) {\r\n return false;\r\n }\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!isOverlapsAllowedByFunc(overlapEventFootprints, overlapVal, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n if (subjectEventInstance) {\r\n if (!isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n // Constraint\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.isFootprintWithinConstraints = function (componentFootprint, constraintFootprints) {\r\n var i;\r\n for (i = 0; i < constraintFootprints.length; i++) {\r\n if (this.footprintContainsFootprint(constraintFootprints[i], componentFootprint)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n Constraints.prototype.constraintValToFootprints = function (constraintVal, isAllDay) {\r\n var eventInstances;\r\n if (constraintVal === 'businessHours') {\r\n return this.buildCurrentBusinessFootprints(isAllDay);\r\n }\r\n else if (typeof constraintVal === 'object') {\r\n eventInstances = this.parseEventDefToInstances(constraintVal); // handles recurring events\r\n if (!eventInstances) {\r\n return this.parseFootprints(constraintVal);\r\n }\r\n else {\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n }\r\n else if (constraintVal != null) {\r\n eventInstances = this.eventManager.getEventInstancesWithId(constraintVal);\r\n return this.eventInstancesToFootprints(eventInstances);\r\n }\r\n };\r\n // returns ComponentFootprint[]\r\n // uses current view's range\r\n Constraints.prototype.buildCurrentBusinessFootprints = function (isAllDay) {\r\n var view = this._calendar.view;\r\n var businessHourGenerator = view.get('businessHourGenerator');\r\n var unzonedRange = view.dateProfile.activeUnzonedRange;\r\n var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(isAllDay, unzonedRange);\r\n if (eventInstanceGroup) {\r\n return this.eventInstancesToFootprints(eventInstanceGroup.eventInstances);\r\n }\r\n else {\r\n return [];\r\n }\r\n };\r\n // conversion util\r\n Constraints.prototype.eventInstancesToFootprints = function (eventInstances) {\r\n var eventRanges = eventInstances.map(util_1.eventInstanceToEventRange);\r\n var eventFootprints = this.eventRangesToEventFootprints(eventRanges);\r\n return eventFootprints.map(util_1.eventFootprintToComponentFootprint);\r\n };\r\n // Overlap\r\n // ------------------------------------------------------------------------------------------------\r\n Constraints.prototype.collectOverlapEventFootprints = function (peerEventFootprints, targetFootprint) {\r\n var overlapEventFootprints = [];\r\n var i;\r\n for (i = 0; i < peerEventFootprints.length; i++) {\r\n if (this.footprintsIntersect(targetFootprint, peerEventFootprints[i].componentFootprint)) {\r\n overlapEventFootprints.push(peerEventFootprints[i]);\r\n }\r\n }\r\n return overlapEventFootprints;\r\n };\r\n // Conversion: eventDefs -> eventInstances -> eventRanges -> eventFootprints -> componentFootprints\r\n // ------------------------------------------------------------------------------------------------\r\n // NOTE: this might seem like repetitive code with the Grid class, however, this code is related to\r\n // constraints whereas the Grid code is related to rendering. Each approach might want to convert\r\n // eventRanges -> eventFootprints in a different way. Regardless, there are opportunities to make\r\n // this more DRY.\r\n /*\r\n Returns false on invalid input.\r\n */\r\n Constraints.prototype.parseEventDefToInstances = function (eventInput) {\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, new EventSource_1.default(this._calendar));\r\n if (!eventDef) {\r\n return false;\r\n }\r\n return eventDef.buildInstances(eventManager.currentPeriod.unzonedRange);\r\n };\r\n Constraints.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var i;\r\n var eventFootprints = [];\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// footprints\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n Constraints.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_1.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /*\r\n Parses footprints directly.\r\n Very similar to EventDateProfile::parse :(\r\n */\r\n Constraints.prototype.parseFootprints = function (rawInput) {\r\n var start;\r\n var end;\r\n if (rawInput.start) {\r\n start = this._calendar.moment(rawInput.start);\r\n if (!start.isValid()) {\r\n start = null;\r\n }\r\n }\r\n if (rawInput.end) {\r\n end = this._calendar.moment(rawInput.end);\r\n if (!end.isValid()) {\r\n end = null;\r\n }\r\n }\r\n return [\r\n new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), (start && !start.hasTime()) || (end && !end.hasTime()) // isAllDay\r\n )\r\n ];\r\n };\r\n // Footprint Utils\r\n // ----------------------------------------------------------------------------------------\r\n Constraints.prototype.footprintContainsFootprint = function (outerFootprint, innerFootprint) {\r\n return outerFootprint.unzonedRange.containsRange(innerFootprint.unzonedRange);\r\n };\r\n Constraints.prototype.footprintsIntersect = function (footprint0, footprint1) {\r\n return footprint0.unzonedRange.intersectsWith(footprint1.unzonedRange);\r\n };\r\n return Constraints;\r\n}());\r\nexports.default = Constraints;\r\n// optional subjectEventInstance\r\nfunction isOverlapsAllowedByFunc(overlapEventFootprints, overlapFunc, subjectEventInstance) {\r\n var i;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n if (!overlapFunc(overlapEventFootprints[i].eventInstance.toLegacy(), subjectEventInstance ? subjectEventInstance.toLegacy() : null)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance) {\r\n var subjectLegacyInstance = subjectEventInstance.toLegacy();\r\n var i;\r\n var overlapEventInstance;\r\n var overlapEventDef;\r\n var overlapVal;\r\n for (i = 0; i < overlapEventFootprints.length; i++) {\r\n overlapEventInstance = overlapEventFootprints[i].eventInstance;\r\n overlapEventDef = overlapEventInstance.def;\r\n // don't need to pass in calendar, because don't want to consider global eventOverlap property,\r\n // because we already considered that earlier in the process.\r\n overlapVal = overlapEventDef.getOverlap();\r\n if (overlapVal === false) {\r\n return false;\r\n }\r\n else if (typeof overlapVal === 'function') {\r\n if (!overlapVal(overlapEventInstance.toLegacy(), subjectLegacyInstance)) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 208 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/*\r\nUSAGE:\r\n import { default as ParsableModelMixin, ParsableModelInterface } from './ParsableModelMixin'\r\nin class:\r\n applyProps: ParsableModelInterface['applyProps']\r\n applyManualStandardProps: ParsableModelInterface['applyManualStandardProps']\r\n applyMiscProps: ParsableModelInterface['applyMiscProps']\r\n isStandardProp: ParsableModelInterface['isStandardProp']\r\n static defineStandardProps = ParsableModelMixin.defineStandardProps\r\n static copyVerbatimStandardProps = ParsableModelMixin.copyVerbatimStandardProps\r\nafter class:\r\n ParsableModelMixin.mixInto(TheClass)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar Mixin_1 = __webpack_require__(14);\r\nvar ParsableModelMixin = /** @class */ (function (_super) {\r\n tslib_1.__extends(ParsableModelMixin, _super);\r\n function ParsableModelMixin() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ParsableModelMixin.defineStandardProps = function (propDefs) {\r\n var proto = this.prototype;\r\n if (!proto.hasOwnProperty('standardPropMap')) {\r\n proto.standardPropMap = Object.create(proto.standardPropMap);\r\n }\r\n util_1.copyOwnProps(propDefs, proto.standardPropMap);\r\n };\r\n ParsableModelMixin.copyVerbatimStandardProps = function (src, dest) {\r\n var map = this.prototype.standardPropMap;\r\n var propName;\r\n for (propName in map) {\r\n if (src[propName] != null && // in the src object?\r\n map[propName] === true // false means \"copy verbatim\"\r\n ) {\r\n dest[propName] = src[propName];\r\n }\r\n }\r\n };\r\n /*\r\n Returns true/false for success.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyProps = function (rawProps) {\r\n var standardPropMap = this.standardPropMap;\r\n var manualProps = {};\r\n var miscProps = {};\r\n var propName;\r\n for (propName in rawProps) {\r\n if (standardPropMap[propName] === true) {\r\n this[propName] = rawProps[propName];\r\n }\r\n else if (standardPropMap[propName] === false) {\r\n manualProps[propName] = rawProps[propName];\r\n }\r\n else {\r\n miscProps[propName] = rawProps[propName];\r\n }\r\n }\r\n this.applyMiscProps(miscProps);\r\n return this.applyManualStandardProps(manualProps);\r\n };\r\n /*\r\n If subclasses override, they must call this supermethod and return the boolean response.\r\n Meant to be only called ONCE, at object creation.\r\n */\r\n ParsableModelMixin.prototype.applyManualStandardProps = function (rawProps) {\r\n return true;\r\n };\r\n /*\r\n Can be called even after initial object creation.\r\n */\r\n ParsableModelMixin.prototype.applyMiscProps = function (rawProps) {\r\n // subclasses can implement\r\n };\r\n /*\r\n TODO: why is this a method when defineStandardProps is static\r\n */\r\n ParsableModelMixin.prototype.isStandardProp = function (propName) {\r\n return propName in this.standardPropMap;\r\n };\r\n return ParsableModelMixin;\r\n}(Mixin_1.default));\r\nexports.default = ParsableModelMixin;\r\nParsableModelMixin.prototype.standardPropMap = {}; // will be cloned by defineStandardProps\r\n\r\n\r\n/***/ }),\r\n/* 209 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventInstance = /** @class */ (function () {\r\n function EventInstance(def, dateProfile) {\r\n this.def = def;\r\n this.dateProfile = dateProfile;\r\n }\r\n EventInstance.prototype.toLegacy = function () {\r\n var dateProfile = this.dateProfile;\r\n var obj = this.def.toLegacy();\r\n obj.start = dateProfile.start.clone();\r\n obj.end = dateProfile.end ? dateProfile.end.clone() : null;\r\n return obj;\r\n };\r\n return EventInstance;\r\n}());\r\nexports.default = EventInstance;\r\n\r\n\r\n/***/ }),\r\n/* 210 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar EventDef_1 = __webpack_require__(34);\r\nvar EventInstance_1 = __webpack_require__(209);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar RecurringEventDef = /** @class */ (function (_super) {\r\n tslib_1.__extends(RecurringEventDef, _super);\r\n function RecurringEventDef() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n RecurringEventDef.prototype.isAllDay = function () {\r\n return !this.startTime && !this.endTime;\r\n };\r\n RecurringEventDef.prototype.buildInstances = function (unzonedRange) {\r\n var calendar = this.source.calendar;\r\n var unzonedDate = unzonedRange.getStart();\r\n var unzonedEnd = unzonedRange.getEnd();\r\n var zonedDayStart;\r\n var instanceStart;\r\n var instanceEnd;\r\n var instances = [];\r\n while (unzonedDate.isBefore(unzonedEnd)) {\r\n // if everyday, or this particular day-of-week\r\n if (!this.dowHash || this.dowHash[unzonedDate.day()]) {\r\n zonedDayStart = calendar.applyTimezone(unzonedDate);\r\n instanceStart = zonedDayStart.clone();\r\n instanceEnd = null;\r\n if (this.startTime) {\r\n instanceStart.time(this.startTime);\r\n }\r\n else {\r\n instanceStart.stripTime();\r\n }\r\n if (this.endTime) {\r\n instanceEnd = zonedDayStart.clone().time(this.endTime);\r\n }\r\n instances.push(new EventInstance_1.default(this, // definition\r\n new EventDateProfile_1.default(instanceStart, instanceEnd, calendar)));\r\n }\r\n unzonedDate.add(1, 'days');\r\n }\r\n return instances;\r\n };\r\n RecurringEventDef.prototype.setDow = function (dowNumbers) {\r\n if (!this.dowHash) {\r\n this.dowHash = {};\r\n }\r\n for (var i = 0; i < dowNumbers.length; i++) {\r\n this.dowHash[dowNumbers[i]] = true;\r\n }\r\n };\r\n RecurringEventDef.prototype.clone = function () {\r\n var def = _super.prototype.clone.call(this);\r\n if (def.startTime) {\r\n def.startTime = moment.duration(this.startTime);\r\n }\r\n if (def.endTime) {\r\n def.endTime = moment.duration(this.endTime);\r\n }\r\n if (this.dowHash) {\r\n def.dowHash = $.extend({}, this.dowHash);\r\n }\r\n return def;\r\n };\r\n return RecurringEventDef;\r\n}(EventDef_1.default));\r\nexports.default = RecurringEventDef;\r\n/*\r\nHACK to work with TypeScript mixins\r\nNOTE: if super-method fails, should still attempt to apply\r\n*/\r\nRecurringEventDef.prototype.applyProps = function (rawProps) {\r\n var superSuccess = EventDef_1.default.prototype.applyProps.call(this, rawProps);\r\n if (rawProps.start) {\r\n this.startTime = moment.duration(rawProps.start);\r\n }\r\n if (rawProps.end) {\r\n this.endTime = moment.duration(rawProps.end);\r\n }\r\n if (rawProps.dow) {\r\n this.setDow(rawProps.dow);\r\n }\r\n return superSuccess;\r\n};\r\n// Parsing\r\n// ---------------------------------------------------------------------------------------------------------------------\r\nRecurringEventDef.defineStandardProps({\r\n start: false,\r\n end: false,\r\n dow: false\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 211 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventRange = /** @class */ (function () {\r\n function EventRange(unzonedRange, eventDef, eventInstance) {\r\n this.unzonedRange = unzonedRange;\r\n this.eventDef = eventDef;\r\n if (eventInstance) {\r\n this.eventInstance = eventInstance;\r\n }\r\n }\r\n return EventRange;\r\n}());\r\nexports.default = EventRange;\r\n\r\n\r\n/***/ }),\r\n/* 212 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(35);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar RecurringEventDef_1 = __webpack_require__(210);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar BUSINESS_HOUR_EVENT_DEFAULTS = {\r\n start: '09:00',\r\n end: '17:00',\r\n dow: [1, 2, 3, 4, 5],\r\n rendering: 'inverse-background'\r\n // classNames are defined in businessHoursSegClasses\r\n};\r\nvar BusinessHourGenerator = /** @class */ (function () {\r\n function BusinessHourGenerator(rawComplexDef, calendar) {\r\n this.rawComplexDef = rawComplexDef;\r\n this.calendar = calendar;\r\n }\r\n BusinessHourGenerator.prototype.buildEventInstanceGroup = function (isAllDay, unzonedRange) {\r\n var eventDefs = this.buildEventDefs(isAllDay);\r\n var eventInstanceGroup;\r\n if (eventDefs.length) {\r\n eventInstanceGroup = new EventInstanceGroup_1.default(util_1.eventDefsToEventInstances(eventDefs, unzonedRange));\r\n // so that inverse-background rendering can happen even when no eventRanges in view\r\n eventInstanceGroup.explicitEventDef = eventDefs[0];\r\n return eventInstanceGroup;\r\n }\r\n };\r\n BusinessHourGenerator.prototype.buildEventDefs = function (isAllDay) {\r\n var rawComplexDef = this.rawComplexDef;\r\n var rawDefs = [];\r\n var requireDow = false;\r\n var i;\r\n var defs = [];\r\n if (rawComplexDef === true) {\r\n rawDefs = [{}]; // will get BUSINESS_HOUR_EVENT_DEFAULTS verbatim\r\n }\r\n else if ($.isPlainObject(rawComplexDef)) {\r\n rawDefs = [rawComplexDef];\r\n }\r\n else if ($.isArray(rawComplexDef)) {\r\n rawDefs = rawComplexDef;\r\n requireDow = true; // every sub-definition NEEDS a day-of-week\r\n }\r\n for (i = 0; i < rawDefs.length; i++) {\r\n if (!requireDow || rawDefs[i].dow) {\r\n defs.push(this.buildEventDef(isAllDay, rawDefs[i]));\r\n }\r\n }\r\n return defs;\r\n };\r\n BusinessHourGenerator.prototype.buildEventDef = function (isAllDay, rawDef) {\r\n var fullRawDef = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, rawDef);\r\n if (isAllDay) {\r\n fullRawDef.start = null;\r\n fullRawDef.end = null;\r\n }\r\n return RecurringEventDef_1.default.parse(fullRawDef, new EventSource_1.default(this.calendar) // dummy source\r\n );\r\n };\r\n return BusinessHourGenerator;\r\n}());\r\nexports.default = BusinessHourGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 213 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar StandardTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(StandardTheme, _super);\r\n function StandardTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return StandardTheme;\r\n}(Theme_1.default));\r\nexports.default = StandardTheme;\r\nStandardTheme.prototype.classes = {\r\n widget: 'fc-unthemed',\r\n widgetHeader: 'fc-widget-header',\r\n widgetContent: 'fc-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'fc-button',\r\n cornerLeft: 'fc-corner-left',\r\n cornerRight: 'fc-corner-right',\r\n stateDefault: 'fc-state-default',\r\n stateActive: 'fc-state-active',\r\n stateDisabled: 'fc-state-disabled',\r\n stateHover: 'fc-state-hover',\r\n stateDown: 'fc-state-down',\r\n popoverHeader: 'fc-widget-header',\r\n popoverContent: 'fc-widget-content',\r\n // day grid\r\n headerRow: 'fc-widget-header',\r\n dayRow: 'fc-widget-content',\r\n // list view\r\n listView: 'fc-widget-content'\r\n};\r\nStandardTheme.prototype.baseIconClass = 'fc-icon';\r\nStandardTheme.prototype.iconClasses = {\r\n close: 'fc-icon-x',\r\n prev: 'fc-icon-left-single-arrow',\r\n next: 'fc-icon-right-single-arrow',\r\n prevYear: 'fc-icon-left-double-arrow',\r\n nextYear: 'fc-icon-right-double-arrow'\r\n};\r\nStandardTheme.prototype.iconOverrideOption = 'buttonIcons';\r\nStandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';\r\nStandardTheme.prototype.iconOverridePrefix = 'fc-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 214 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar JqueryUiTheme = /** @class */ (function (_super) {\r\n tslib_1.__extends(JqueryUiTheme, _super);\r\n function JqueryUiTheme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return JqueryUiTheme;\r\n}(Theme_1.default));\r\nexports.default = JqueryUiTheme;\r\nJqueryUiTheme.prototype.classes = {\r\n widget: 'ui-widget',\r\n widgetHeader: 'ui-widget-header',\r\n widgetContent: 'ui-widget-content',\r\n buttonGroup: 'fc-button-group',\r\n button: 'ui-button',\r\n cornerLeft: 'ui-corner-left',\r\n cornerRight: 'ui-corner-right',\r\n stateDefault: 'ui-state-default',\r\n stateActive: 'ui-state-active',\r\n stateDisabled: 'ui-state-disabled',\r\n stateHover: 'ui-state-hover',\r\n stateDown: 'ui-state-down',\r\n today: 'ui-state-highlight',\r\n popoverHeader: 'ui-widget-header',\r\n popoverContent: 'ui-widget-content',\r\n // day grid\r\n headerRow: 'ui-widget-header',\r\n dayRow: 'ui-widget-content',\r\n // list view\r\n listView: 'ui-widget-content'\r\n};\r\nJqueryUiTheme.prototype.baseIconClass = 'ui-icon';\r\nJqueryUiTheme.prototype.iconClasses = {\r\n close: 'ui-icon-closethick',\r\n prev: 'ui-icon-circle-triangle-w',\r\n next: 'ui-icon-circle-triangle-e',\r\n prevYear: 'ui-icon-seek-prev',\r\n nextYear: 'ui-icon-seek-next'\r\n};\r\nJqueryUiTheme.prototype.iconOverrideOption = 'themeButtonIcons';\r\nJqueryUiTheme.prototype.iconOverrideCustomButtonOption = 'themeIcon';\r\nJqueryUiTheme.prototype.iconOverridePrefix = 'ui-icon-';\r\n\r\n\r\n/***/ }),\r\n/* 215 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar FuncEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(FuncEventSource, _super);\r\n function FuncEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n FuncEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if ($.isFunction(rawInput.events)) {\r\n rawProps = rawInput;\r\n }\r\n else if ($.isFunction(rawInput)) {\r\n rawProps = { events: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n FuncEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.func.call(_this.calendar, start.clone(), end.clone(), timezone, function (rawEventDefs) {\r\n _this.calendar.popLoading();\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n });\r\n });\r\n };\r\n FuncEventSource.prototype.getPrimitive = function () {\r\n return this.func;\r\n };\r\n FuncEventSource.prototype.applyManualStandardProps = function (rawProps) {\r\n var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);\r\n this.func = rawProps.events;\r\n return superSuccess;\r\n };\r\n return FuncEventSource;\r\n}(EventSource_1.default));\r\nexports.default = FuncEventSource;\r\nFuncEventSource.defineStandardProps({\r\n events: false // don't automatically transfer\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 216 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar JsonFeedEventSource = /** @class */ (function (_super) {\r\n tslib_1.__extends(JsonFeedEventSource, _super);\r\n function JsonFeedEventSource() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n JsonFeedEventSource.parse = function (rawInput, calendar) {\r\n var rawProps;\r\n // normalize raw input\r\n if (typeof rawInput.url === 'string') {\r\n rawProps = rawInput;\r\n }\r\n else if (typeof rawInput === 'string') {\r\n rawProps = { url: rawInput };\r\n }\r\n if (rawProps) {\r\n return EventSource_1.default.parse.call(this, rawProps, calendar);\r\n }\r\n return false;\r\n };\r\n JsonFeedEventSource.prototype.fetch = function (start, end, timezone) {\r\n var _this = this;\r\n var ajaxSettings = this.ajaxSettings;\r\n var onSuccess = ajaxSettings.success;\r\n var onError = ajaxSettings.error;\r\n var requestParams = this.buildRequestParams(start, end, timezone);\r\n // todo: eventually handle the promise's then,\r\n // don't intercept success/error\r\n // tho will be a breaking API change\r\n this.calendar.pushLoading();\r\n return Promise_1.default.construct(function (onResolve, onReject) {\r\n $.ajax($.extend({}, // destination\r\n JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {\r\n url: _this.url,\r\n data: requestParams,\r\n success: function (rawEventDefs, status, xhr) {\r\n var callbackRes;\r\n _this.calendar.popLoading();\r\n if (rawEventDefs) {\r\n callbackRes = util_1.applyAll(onSuccess, _this, [rawEventDefs, status, xhr]); // redirect `this`\r\n if ($.isArray(callbackRes)) {\r\n rawEventDefs = callbackRes;\r\n }\r\n onResolve(_this.parseEventDefs(rawEventDefs));\r\n }\r\n else {\r\n onReject();\r\n }\r\n },\r\n error: function (xhr, statusText, errorThrown) {\r\n _this.calendar.popLoading();\r\n util_1.applyAll(onError, _this, [xhr, statusText, errorThrown]); // redirect `this`\r\n onReject();\r\n }\r\n }));\r\n });\r\n };\r\n JsonFeedEventSource.prototype.buildRequestParams = function (start, end, timezone) {\r\n var calendar = this.calendar;\r\n var ajaxSettings = this.ajaxSettings;\r\n var startParam;\r\n var endParam;\r\n var timezoneParam;\r\n var customRequestParams;\r\n var params = {};\r\n startParam = this.startParam;\r\n if (startParam == null) {\r\n startParam = calendar.opt('startParam');\r\n }\r\n endParam = this.endParam;\r\n if (endParam == null) {\r\n endParam = calendar.opt('endParam');\r\n }\r\n timezoneParam = this.timezoneParam;\r\n if (timezoneParam == null) {\r\n timezoneParam = calendar.opt('timezoneParam');\r\n }\r\n // retrieve any outbound GET/POST $.ajax data from the options\r\n if ($.isFunction(ajaxSettings.data)) {\r\n // supplied as a function that returns a key/value object\r\n customRequestParams = ajaxSettings.data();\r\n }\r\n else {\r\n // probably supplied as a straight key/value object\r\n customRequestParams = ajaxSettings.data || {};\r\n }\r\n $.extend(params, customRequestParams);\r\n/////////////// convert to UTC\r\n// params[startParam] = start.format();\r\n// params[endParam] = end.format();\r\n params[startParam] = start.toISOString();\r\n params[endParam] = end.toISOString();\r\n if (timezone && timezone !== 'local') {\r\n params[timezoneParam] = timezone;\r\n }\r\n return params;\r\n };\r\n JsonFeedEventSource.prototype.getPrimitive = function () {\r\n return this.url;\r\n };\r\n JsonFeedEventSource.prototype.applyMiscProps = function (rawProps) {\r\n this.ajaxSettings = rawProps;\r\n };\r\n JsonFeedEventSource.AJAX_DEFAULTS = {\r\n dataType: 'json',\r\n cache: false\r\n };\r\n return JsonFeedEventSource;\r\n}(EventSource_1.default));\r\nexports.default = JsonFeedEventSource;\r\nJsonFeedEventSource.defineStandardProps({\r\n // automatically transfer (true)...\r\n url: true,\r\n startParam: true,\r\n endParam: true,\r\n timezoneParam: true\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 217 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar TaskQueue = /** @class */ (function () {\r\n function TaskQueue() {\r\n this.q = [];\r\n this.isPaused = false;\r\n this.isRunning = false;\r\n }\r\n TaskQueue.prototype.queue = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n this.q.push.apply(this.q, args); // append\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.pause = function () {\r\n this.isPaused = true;\r\n };\r\n TaskQueue.prototype.resume = function () {\r\n this.isPaused = false;\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.getIsIdle = function () {\r\n return !this.isRunning && !this.isPaused;\r\n };\r\n TaskQueue.prototype.tryStart = function () {\r\n if (!this.isRunning && this.canRunNext()) {\r\n this.isRunning = true;\r\n this.trigger('start');\r\n this.runRemaining();\r\n }\r\n };\r\n TaskQueue.prototype.canRunNext = function () {\r\n return !this.isPaused && this.q.length;\r\n };\r\n TaskQueue.prototype.runRemaining = function () {\r\n var _this = this;\r\n var task;\r\n var res;\r\n do {\r\n task = this.q.shift(); // always freshly reference q. might have been reassigned.\r\n res = this.runTask(task);\r\n if (res && res.then) {\r\n res.then(function () {\r\n if (_this.canRunNext()) {\r\n _this.runRemaining();\r\n }\r\n });\r\n return; // prevent marking as stopped\r\n }\r\n } while (this.canRunNext());\r\n this.trigger('stop'); // not really a 'stop' ... more of a 'drained'\r\n this.isRunning = false;\r\n // if 'stop' handler added more tasks.... TODO: write test for this\r\n this.tryStart();\r\n };\r\n TaskQueue.prototype.runTask = function (task) {\r\n return task(); // task *is* the function, but subclasses can change the format of a task\r\n };\r\n return TaskQueue;\r\n}());\r\nexports.default = TaskQueue;\r\nEmitterMixin_1.default.mixInto(TaskQueue);\r\n\r\n\r\n/***/ }),\r\n/* 218 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar TaskQueue_1 = __webpack_require__(217);\r\nvar RenderQueue = /** @class */ (function (_super) {\r\n tslib_1.__extends(RenderQueue, _super);\r\n function RenderQueue(waitsByNamespace) {\r\n var _this = _super.call(this) || this;\r\n _this.waitsByNamespace = waitsByNamespace || {};\r\n return _this;\r\n }\r\n RenderQueue.prototype.queue = function (taskFunc, namespace, type) {\r\n var task = {\r\n func: taskFunc,\r\n namespace: namespace,\r\n type: type\r\n };\r\n var waitMs;\r\n if (namespace) {\r\n waitMs = this.waitsByNamespace[namespace];\r\n }\r\n if (this.waitNamespace) {\r\n if (namespace === this.waitNamespace && waitMs != null) {\r\n this.delayWait(waitMs);\r\n }\r\n else {\r\n this.clearWait();\r\n this.tryStart();\r\n }\r\n }\r\n if (this.compoundTask(task)) {\r\n if (!this.waitNamespace && waitMs != null) {\r\n this.startWait(namespace, waitMs);\r\n }\r\n else {\r\n this.tryStart();\r\n }\r\n }\r\n };\r\n RenderQueue.prototype.startWait = function (namespace, waitMs) {\r\n this.waitNamespace = namespace;\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.delayWait = function (waitMs) {\r\n clearTimeout(this.waitId);\r\n this.spawnWait(waitMs);\r\n };\r\n RenderQueue.prototype.spawnWait = function (waitMs) {\r\n var _this = this;\r\n this.waitId = setTimeout(function () {\r\n _this.waitNamespace = null;\r\n _this.tryStart();\r\n }, waitMs);\r\n };\r\n RenderQueue.prototype.clearWait = function () {\r\n if (this.waitNamespace) {\r\n clearTimeout(this.waitId);\r\n this.waitId = null;\r\n this.waitNamespace = null;\r\n }\r\n };\r\n RenderQueue.prototype.canRunNext = function () {\r\n if (!_super.prototype.canRunNext.call(this)) {\r\n return false;\r\n }\r\n // waiting for a certain namespace to stop receiving tasks?\r\n if (this.waitNamespace) {\r\n var q = this.q;\r\n // if there was a different namespace task in the meantime,\r\n // that forces all previously-waiting tasks to suddenly execute.\r\n // TODO: find a way to do this in constant time.\r\n for (var i = 0; i < q.length; i++) {\r\n if (q[i].namespace !== this.waitNamespace) {\r\n return true; // allow execution\r\n }\r\n }\r\n return false;\r\n }\r\n return true;\r\n };\r\n RenderQueue.prototype.runTask = function (task) {\r\n task.func();\r\n };\r\n RenderQueue.prototype.compoundTask = function (newTask) {\r\n var q = this.q;\r\n var shouldAppend = true;\r\n var i;\r\n var task;\r\n if (newTask.namespace && newTask.type === 'destroy') {\r\n // remove all init/add/remove ops with same namespace, regardless of order\r\n for (i = q.length - 1; i >= 0; i--) {\r\n task = q[i];\r\n switch (task.type) {\r\n case 'init':\r\n shouldAppend = false;\r\n // the latest destroy is cancelled out by not doing the init\r\n /* falls through */\r\n case 'add':\r\n /* falls through */\r\n case 'remove':\r\n q.splice(i, 1); // remove task\r\n }\r\n }\r\n }\r\n if (shouldAppend) {\r\n q.push(newTask);\r\n }\r\n return shouldAppend;\r\n };\r\n return RenderQueue;\r\n}(TaskQueue_1.default));\r\nexports.default = RenderQueue;\r\n\r\n\r\n/***/ }),\r\n/* 219 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar date_formatting_1 = __webpack_require__(47);\r\nvar Component_1 = __webpack_require__(237);\r\nvar util_2 = __webpack_require__(35);\r\nvar DateComponent = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateComponent, _super);\r\n function DateComponent(_view, _options) {\r\n var _this = _super.call(this) || this;\r\n _this.isRTL = false; // frequently accessed options\r\n _this.hitsNeededDepth = 0; // necessary because multiple callers might need the same hits\r\n _this.hasAllDayBusinessHours = false; // TODO: unify with largeUnit and isTimeScale?\r\n _this.isDatesRendered = false;\r\n // hack to set options prior to the this.opt calls\r\n if (_view) {\r\n _this['view'] = _view;\r\n }\r\n if (_options) {\r\n _this['options'] = _options;\r\n }\r\n _this.uid = String(DateComponent.guid++);\r\n _this.childrenByUid = {};\r\n _this.nextDayThreshold = moment.duration(_this.opt('nextDayThreshold'));\r\n _this.isRTL = _this.opt('isRTL');\r\n if (_this.fillRendererClass) {\r\n _this.fillRenderer = new _this.fillRendererClass(_this);\r\n }\r\n if (_this.eventRendererClass) {\r\n _this.eventRenderer = new _this.eventRendererClass(_this, _this.fillRenderer);\r\n }\r\n if (_this.helperRendererClass && _this.eventRenderer) {\r\n _this.helperRenderer = new _this.helperRendererClass(_this, _this.eventRenderer);\r\n }\r\n if (_this.businessHourRendererClass && _this.fillRenderer) {\r\n _this.businessHourRenderer = new _this.businessHourRendererClass(_this, _this.fillRenderer);\r\n }\r\n return _this;\r\n }\r\n DateComponent.prototype.addChild = function (child) {\r\n if (!this.childrenByUid[child.uid]) {\r\n this.childrenByUid[child.uid] = child;\r\n return true;\r\n }\r\n return false;\r\n };\r\n DateComponent.prototype.removeChild = function (child) {\r\n if (this.childrenByUid[child.uid]) {\r\n delete this.childrenByUid[child.uid];\r\n return true;\r\n }\r\n return false;\r\n };\r\n // TODO: only do if isInDom?\r\n // TODO: make part of Component, along with children/batch-render system?\r\n DateComponent.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n this.callChildren('updateSize', arguments);\r\n };\r\n // Options\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.opt = function (name) {\r\n return this._getView().opt(name); // default implementation\r\n };\r\n DateComponent.prototype.publiclyTrigger = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.publiclyTrigger.apply(calendar, args);\r\n };\r\n DateComponent.prototype.hasPublicHandlers = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var calendar = this._getCalendar();\r\n return calendar.hasPublicHandlers.apply(calendar, args);\r\n };\r\n // Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeDateRender = function (dateProfile) {\r\n this.dateProfile = dateProfile; // for rendering\r\n this.renderDates(dateProfile);\r\n this.isDatesRendered = true;\r\n this.callChildren('executeDateRender', arguments);\r\n };\r\n DateComponent.prototype.executeDateUnrender = function () {\r\n this.callChildren('executeDateUnrender', arguments);\r\n this.dateProfile = null;\r\n this.unrenderDates();\r\n this.isDatesRendered = false;\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.renderDates = function (dateProfile) {\r\n // subclasses should implement\r\n };\r\n // date-cell content only\r\n DateComponent.prototype.unrenderDates = function () {\r\n // subclasses should override\r\n };\r\n // Now-Indicator\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator\r\n // should be refreshed. If something falsy is returned, no time indicator is rendered at all.\r\n DateComponent.prototype.getNowIndicatorUnit = function () {\r\n // subclasses should implement\r\n };\r\n // Renders a current time indicator at the given datetime\r\n DateComponent.prototype.renderNowIndicator = function (date) {\r\n this.callChildren('renderNowIndicator', arguments);\r\n };\r\n // Undoes the rendering actions from renderNowIndicator\r\n DateComponent.prototype.unrenderNowIndicator = function () {\r\n this.callChildren('unrenderNowIndicator', arguments);\r\n };\r\n // Business Hours\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.renderBusinessHours = function (businessHourGenerator) {\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.render(businessHourGenerator);\r\n }\r\n this.callChildren('renderBusinessHours', arguments);\r\n };\r\n // Unrenders previously-rendered business-hours\r\n DateComponent.prototype.unrenderBusinessHours = function () {\r\n this.callChildren('unrenderBusinessHours', arguments);\r\n if (this.businessHourRenderer) {\r\n this.businessHourRenderer.unrender();\r\n }\r\n };\r\n // Event Displaying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.executeEventRender = function (eventsPayload) {\r\n if (this.eventRenderer) {\r\n this.eventRenderer.rangeUpdated(); // poorly named now\r\n this.eventRenderer.render(eventsPayload);\r\n }\r\n else if (this['renderEvents']) {\r\n this['renderEvents'](convertEventsPayloadToLegacyArray(eventsPayload));\r\n }\r\n this.callChildren('executeEventRender', arguments);\r\n };\r\n DateComponent.prototype.executeEventUnrender = function () {\r\n this.callChildren('executeEventUnrender', arguments);\r\n if (this.eventRenderer) {\r\n this.eventRenderer.unrender();\r\n }\r\n else if (this['destroyEvents']) {\r\n this['destroyEvents']();\r\n }\r\n };\r\n DateComponent.prototype.getBusinessHourSegs = function () {\r\n var segs = this.getOwnBusinessHourSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getBusinessHourSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnBusinessHourSegs = function () {\r\n if (this.businessHourRenderer) {\r\n return this.businessHourRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n DateComponent.prototype.getEventSegs = function () {\r\n var segs = this.getOwnEventSegs();\r\n this.iterChildren(function (child) {\r\n segs.push.apply(segs, child.getEventSegs());\r\n });\r\n return segs;\r\n };\r\n DateComponent.prototype.getOwnEventSegs = function () {\r\n if (this.eventRenderer) {\r\n return this.eventRenderer.getSegs();\r\n }\r\n return [];\r\n };\r\n // Event Rendering Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.triggerAfterEventsRendered = function () {\r\n this.triggerAfterEventSegsRendered(this.getEventSegs());\r\n this.publiclyTrigger('eventAfterAllRender', {\r\n context: this,\r\n args: [this]\r\n });\r\n };\r\n DateComponent.prototype.triggerAfterEventSegsRendered = function (segs) {\r\n var _this = this;\r\n // an optimization, because getEventLegacy is expensive\r\n if (this.hasPublicHandlers('eventAfterRender')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventAfterRender', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n DateComponent.prototype.triggerBeforeEventsDestroyed = function () {\r\n this.triggerBeforeEventSegsDestroyed(this.getEventSegs());\r\n };\r\n DateComponent.prototype.triggerBeforeEventSegsDestroyed = function (segs) {\r\n var _this = this;\r\n if (this.hasPublicHandlers('eventDestroy')) {\r\n segs.forEach(function (seg) {\r\n var legacy;\r\n if (seg.el) {\r\n legacy = seg.footprint.getEventLegacy();\r\n _this.publiclyTrigger('eventDestroy', {\r\n context: legacy,\r\n args: [legacy, seg.el, _this]\r\n });\r\n }\r\n });\r\n }\r\n };\r\n // Event Rendering Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Hides all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.showEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', '');\r\n }\r\n });\r\n this.callChildren('showEventsWithId', arguments);\r\n };\r\n // Shows all rendered event segments linked to the given event\r\n // RECURSIVE with subcomponents\r\n DateComponent.prototype.hideEventsWithId = function (eventDefId) {\r\n this.getEventSegs().forEach(function (seg) {\r\n if (seg.footprint.eventDef.id === eventDefId &&\r\n seg.el // necessary?\r\n ) {\r\n seg.el.css('visibility', 'hidden');\r\n }\r\n });\r\n this.callChildren('hideEventsWithId', arguments);\r\n };\r\n // Drag-n-Drop Rendering (for both events and external elements)\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of a event or external-element drag over the given drop zone.\r\n // If an external-element, seg will be `null`.\r\n // Must return elements used for any mock events.\r\n DateComponent.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var renderedHelper = false;\r\n this.iterChildren(function (child) {\r\n if (child.renderDrag(eventFootprints, seg, isTouch)) {\r\n renderedHelper = true;\r\n }\r\n });\r\n return renderedHelper;\r\n };\r\n // Unrenders a visual indication of an event or external-element being dragged.\r\n DateComponent.prototype.unrenderDrag = function () {\r\n this.callChildren('unrenderDrag', arguments);\r\n };\r\n // Event Resizing\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of an event being resized.\r\n DateComponent.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.callChildren('renderEventResize', arguments);\r\n };\r\n // Unrenders a visual indication of an event being resized.\r\n DateComponent.prototype.unrenderEventResize = function () {\r\n this.callChildren('unrenderEventResize', arguments);\r\n };\r\n // Selection\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders a visual indication of the selection\r\n // TODO: rename to `renderSelection` after legacy is gone\r\n DateComponent.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n this.renderHighlight(componentFootprint);\r\n this.callChildren('renderSelectionFootprint', arguments);\r\n };\r\n // Unrenders a visual indication of selection\r\n DateComponent.prototype.unrenderSelection = function () {\r\n this.unrenderHighlight();\r\n this.callChildren('unrenderSelection', arguments);\r\n };\r\n // Highlight\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data)\r\n DateComponent.prototype.renderHighlight = function (componentFootprint) {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.renderFootprint('highlight', componentFootprint, {\r\n getClasses: function () {\r\n return ['fc-highlight'];\r\n }\r\n });\r\n }\r\n this.callChildren('renderHighlight', arguments);\r\n };\r\n // Unrenders the emphasis on a date range\r\n DateComponent.prototype.unrenderHighlight = function () {\r\n if (this.fillRenderer) {\r\n this.fillRenderer.unrender('highlight');\r\n }\r\n this.callChildren('unrenderHighlight', arguments);\r\n };\r\n // Hit Areas\r\n // ---------------------------------------------------------------------------------------------------------------\r\n // just because all DateComponents support this interface\r\n // doesn't mean they need to have their own internal coord system. they can defer to sub-components.\r\n DateComponent.prototype.hitsNeeded = function () {\r\n if (!(this.hitsNeededDepth++)) {\r\n this.prepareHits();\r\n }\r\n this.callChildren('hitsNeeded', arguments);\r\n };\r\n DateComponent.prototype.hitsNotNeeded = function () {\r\n if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {\r\n this.releaseHits();\r\n }\r\n this.callChildren('hitsNotNeeded', arguments);\r\n };\r\n DateComponent.prototype.prepareHits = function () {\r\n // subclasses can implement\r\n };\r\n DateComponent.prototype.releaseHits = function () {\r\n // subclasses can implement\r\n };\r\n // Given coordinates from the topleft of the document, return data about the date-related area underneath.\r\n // Can return an object with arbitrary properties (although top/right/left/bottom are encouraged).\r\n // Must have a `grid` property, a reference to this current grid. TODO: avoid this\r\n // The returned object will be processed by getHitFootprint and getHitEl.\r\n DateComponent.prototype.queryHit = function (leftOffset, topOffset) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n var hit;\r\n for (uid in childrenByUid) {\r\n hit = childrenByUid[uid].queryHit(leftOffset, topOffset);\r\n if (hit) {\r\n break;\r\n }\r\n }\r\n return hit;\r\n };\r\n DateComponent.prototype.getSafeHitFootprint = function (hit) {\r\n var footprint = this.getHitFootprint(hit);\r\n if (!this.dateProfile.activeUnzonedRange.containsRange(footprint.unzonedRange)) {\r\n return null;\r\n }\r\n return footprint;\r\n };\r\n DateComponent.prototype.getHitFootprint = function (hit) {\r\n // what about being abstract!?\r\n };\r\n // Given position-level information about a date-related area within the grid,\r\n // should return a jQuery element that best represents it. passed to dayClick callback.\r\n DateComponent.prototype.getHitEl = function (hit) {\r\n // what about being abstract!?\r\n };\r\n /* Converting eventRange -> eventFootprint\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventRangesToEventFootprints = function (eventRanges) {\r\n var eventFootprints = [];\r\n var i;\r\n for (i = 0; i < eventRanges.length; i++) {\r\n eventFootprints.push.apply(// append\r\n eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));\r\n }\r\n return eventFootprints;\r\n };\r\n DateComponent.prototype.eventRangeToEventFootprints = function (eventRange) {\r\n return [util_2.eventRangeToEventFootprint(eventRange)];\r\n };\r\n /* Converting componentFootprint/eventFootprint -> segs\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n DateComponent.prototype.eventFootprintsToSegs = function (eventFootprints) {\r\n var segs = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n segs.push.apply(segs, this.eventFootprintToSegs(eventFootprints[i]));\r\n }\r\n return segs;\r\n };\r\n // Given an event's span (unzoned start/end and other misc data), and the event itself,\r\n // slices into segments and attaches event-derived properties to them.\r\n // eventSpan - { start, end, isStart, isEnd, otherthings... }\r\n DateComponent.prototype.eventFootprintToSegs = function (eventFootprint) {\r\n var unzonedRange = eventFootprint.componentFootprint.unzonedRange;\r\n var segs;\r\n var i;\r\n var seg;\r\n segs = this.componentFootprintToSegs(eventFootprint.componentFootprint);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (!unzonedRange.isStart) {\r\n seg.isStart = false;\r\n }\r\n if (!unzonedRange.isEnd) {\r\n seg.isEnd = false;\r\n }\r\n seg.footprint = eventFootprint;\r\n // TODO: rename to seg.eventFootprint\r\n }\r\n return segs;\r\n };\r\n DateComponent.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n return [];\r\n };\r\n // Utils\r\n // ---------------------------------------------------------------------------------------------------------------\r\n DateComponent.prototype.callChildren = function (methodName, args) {\r\n this.iterChildren(function (child) {\r\n child[methodName].apply(child, args);\r\n });\r\n };\r\n DateComponent.prototype.iterChildren = function (func) {\r\n var childrenByUid = this.childrenByUid;\r\n var uid;\r\n for (uid in childrenByUid) {\r\n func(childrenByUid[uid]);\r\n }\r\n };\r\n DateComponent.prototype._getCalendar = function () {\r\n var t = this;\r\n return t.calendar || t.view.calendar;\r\n };\r\n DateComponent.prototype._getView = function () {\r\n return this.view;\r\n };\r\n DateComponent.prototype._getDateProfile = function () {\r\n return this._getView().get('dateProfile');\r\n };\r\n // Generates HTML for an anchor to another view into the calendar.\r\n // Will either generate an
tag or a non-clickable tag, depending on enabled settings.\r\n // `gotoOptions` can either be a moment input, or an object with the form:\r\n // { date, type, forceOff }\r\n // `type` is a view-type like \"day\" or \"week\". default value is \"day\".\r\n // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.\r\n DateComponent.prototype.buildGotoAnchorHtml = function (gotoOptions, attrs, innerHtml) {\r\n var date;\r\n var type;\r\n var forceOff;\r\n var finalOptions;\r\n if ($.isPlainObject(gotoOptions)) {\r\n date = gotoOptions.date;\r\n type = gotoOptions.type;\r\n forceOff = gotoOptions.forceOff;\r\n }\r\n else {\r\n date = gotoOptions; // a single moment input\r\n }\r\n date = moment_ext_1.default(date); // if a string, parse it\r\n finalOptions = {\r\n date: date.format('YYYY-MM-DD'),\r\n type: type || 'day'\r\n };\r\n if (typeof attrs === 'string') {\r\n innerHtml = attrs;\r\n attrs = null;\r\n }\r\n attrs = attrs ? ' ' + util_1.attrsToStr(attrs) : ''; // will have a leading space\r\n innerHtml = innerHtml || '';\r\n if (!forceOff && this.opt('navLinks')) {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n else {\r\n return '' +\r\n innerHtml +\r\n '';\r\n }\r\n };\r\n DateComponent.prototype.getAllDayHtml = function () {\r\n return this.opt('allDayHtml') || util_1.htmlEscape(this.opt('allDayText'));\r\n };\r\n // Computes HTML classNames for a single-day element\r\n DateComponent.prototype.getDayClasses = function (date, noThemeHighlight) {\r\n var view = this._getView();\r\n var classes = [];\r\n var today;\r\n if (!this.dateProfile.activeUnzonedRange.containsDate(date)) {\r\n classes.push('fc-disabled-day'); // TODO: jQuery UI theme?\r\n }\r\n else {\r\n classes.push('fc-' + util_1.dayIDs[date.day()]);\r\n if (view.isDateInOtherMonth(date, this.dateProfile)) {\r\n classes.push('fc-other-month');\r\n }\r\n today = view.calendar.getNow();\r\n if (date.isSame(today, 'day')) {\r\n classes.push('fc-today');\r\n if (noThemeHighlight !== true) {\r\n classes.push(view.calendar.theme.getClass('today'));\r\n }\r\n }\r\n else if (date < today) {\r\n classes.push('fc-past');\r\n }\r\n else {\r\n classes.push('fc-future');\r\n }\r\n }\r\n return classes;\r\n };\r\n // Utility for formatting a range. Accepts a range object, formatting string, and optional separator.\r\n // Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.\r\n // The timezones of the dates within `range` will be respected.\r\n DateComponent.prototype.formatRange = function (range, isAllDay, formatStr, separator) {\r\n var end = range.end;\r\n if (isAllDay) {\r\n end = end.clone().subtract(1); // convert to inclusive. last ms of previous day\r\n }\r\n return date_formatting_1.formatRange(range.start, end, formatStr, separator, this.isRTL);\r\n };\r\n // Compute the number of the give units in the \"current\" range.\r\n // Will return a floating-point number. Won't round.\r\n DateComponent.prototype.currentRangeAs = function (unit) {\r\n return this._getDateProfile().currentUnzonedRange.as(unit);\r\n };\r\n // Returns the date range of the full days the given range visually appears to occupy.\r\n // Returns a plain object with start/end, NOT an UnzonedRange!\r\n DateComponent.prototype.computeDayRange = function (unzonedRange) {\r\n var calendar = this._getCalendar();\r\n var startDay = calendar.msToUtcMoment(unzonedRange.startMs, true); // the beginning of the day the range starts\r\n var end = calendar.msToUtcMoment(unzonedRange.endMs);\r\n var endTimeMS = +end.time(); // # of milliseconds into `endDay`\r\n var endDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends\r\n // If the end time is actually inclusively part of the next day and is equal to or\r\n // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\r\n // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\r\n if (endTimeMS && endTimeMS >= this.nextDayThreshold) {\r\n endDay.add(1, 'days');\r\n }\r\n // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.\r\n if (endDay <= startDay) {\r\n endDay = startDay.clone().add(1, 'days');\r\n }\r\n return { start: startDay, end: endDay };\r\n };\r\n // Does the given range visually appear to occupy more than one day?\r\n DateComponent.prototype.isMultiDayRange = function (unzonedRange) {\r\n var dayRange = this.computeDayRange(unzonedRange);\r\n return dayRange.end.diff(dayRange.start, 'days') > 1;\r\n };\r\n DateComponent.guid = 0; // TODO: better system for this?\r\n return DateComponent;\r\n}(Component_1.default));\r\nexports.default = DateComponent;\r\n// legacy\r\nfunction convertEventsPayloadToLegacyArray(eventsPayload) {\r\n var eventDefId;\r\n var eventInstances;\r\n var legacyEvents = [];\r\n var i;\r\n for (eventDefId in eventsPayload) {\r\n eventInstances = eventsPayload[eventDefId].eventInstances;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n legacyEvents.push(eventInstances[i].toLegacy());\r\n }\r\n }\r\n return legacyEvents;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 220 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar Iterator_1 = __webpack_require__(238);\r\nvar GlobalEmitter_1 = __webpack_require__(21);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Toolbar_1 = __webpack_require__(239);\r\nvar OptionsManager_1 = __webpack_require__(240);\r\nvar ViewSpecManager_1 = __webpack_require__(241);\r\nvar Constraints_1 = __webpack_require__(207);\r\nvar locale_1 = __webpack_require__(31);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar EventDateProfile_1 = __webpack_require__(17);\r\nvar EventManager_1 = __webpack_require__(242);\r\nvar BusinessHourGenerator_1 = __webpack_require__(212);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar EventDefParser_1 = __webpack_require__(49);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar Calendar = /** @class */ (function () {\r\n function Calendar(el, overrides) {\r\n this.loadingLevel = 0; // number of simultaneous loading tasks\r\n this.ignoreUpdateViewSize = 0;\r\n this.freezeContentHeightDepth = 0;\r\n // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.\r\n // unneeded() is called in destroy.\r\n GlobalEmitter_1.default.needed();\r\n this.el = el;\r\n this.viewsByType = {};\r\n this.optionsManager = new OptionsManager_1.default(this, overrides);\r\n this.viewSpecManager = new ViewSpecManager_1.default(this.optionsManager, this);\r\n this.initMomentInternals(); // needs to happen after options hash initialized\r\n this.initCurrentDate();\r\n this.initEventManager();\r\n this.constraints = new Constraints_1.default(this.eventManager, this);\r\n this.constructed();\r\n }\r\n Calendar.prototype.constructed = function () {\r\n // useful for monkeypatching. used?\r\n };\r\n Calendar.prototype.getView = function () {\r\n return this.view;\r\n };\r\n Calendar.prototype.publiclyTrigger = function (name, triggerInfo) {\r\n var optHandler = this.opt(name);\r\n var context;\r\n var args;\r\n if ($.isPlainObject(triggerInfo)) {\r\n context = triggerInfo.context;\r\n args = triggerInfo.args;\r\n }\r\n else if ($.isArray(triggerInfo)) {\r\n args = triggerInfo;\r\n }\r\n if (context == null) {\r\n context = this.el[0]; // fallback context\r\n }\r\n if (!args) {\r\n args = [];\r\n }\r\n this.triggerWith(name, context, args); // Emitter's method\r\n if (optHandler) {\r\n return optHandler.apply(context, args);\r\n }\r\n };\r\n Calendar.prototype.hasPublicHandlers = function (name) {\r\n return this.hasHandlers(name) ||\r\n this.opt(name); // handler specified in options\r\n };\r\n // Options Public API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // public getter/setter\r\n Calendar.prototype.option = function (name, value) {\r\n var newOptionHash;\r\n if (typeof name === 'string') {\r\n if (value === undefined) {\r\n return this.optionsManager.get(name);\r\n }\r\n else {\r\n newOptionHash = {};\r\n newOptionHash[name] = value;\r\n this.optionsManager.add(newOptionHash);\r\n }\r\n }\r\n else if (typeof name === 'object') {\r\n this.optionsManager.add(name);\r\n }\r\n };\r\n // private getter\r\n Calendar.prototype.opt = function (name) {\r\n return this.optionsManager.get(name);\r\n };\r\n // View\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Given a view name for a custom view or a standard view, creates a ready-to-go View object\r\n Calendar.prototype.instantiateView = function (viewType) {\r\n var spec = this.viewSpecManager.getViewSpec(viewType);\r\n if (!spec) {\r\n throw new Error(\"View type \\\"\" + viewType + \"\\\" is not valid\");\r\n }\r\n return new spec['class'](this, spec);\r\n };\r\n // Returns a boolean about whether the view is okay to instantiate at some point\r\n Calendar.prototype.isValidViewType = function (viewType) {\r\n return Boolean(this.viewSpecManager.getViewSpec(viewType));\r\n };\r\n Calendar.prototype.changeView = function (viewName, dateOrRange) {\r\n if (dateOrRange) {\r\n if (dateOrRange.start && dateOrRange.end) {\r\n this.optionsManager.recordOverrides({\r\n visibleRange: dateOrRange\r\n });\r\n }\r\n else {\r\n this.currentDate = this.moment(dateOrRange).stripZone(); // just like gotoDate\r\n }\r\n }\r\n this.renderView(viewName);\r\n };\r\n // Forces navigation to a view for the given date.\r\n // `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\r\n Calendar.prototype.zoomTo = function (newDate, viewType) {\r\n var spec;\r\n viewType = viewType || 'day'; // day is default zoom\r\n spec = this.viewSpecManager.getViewSpec(viewType) ||\r\n this.viewSpecManager.getUnitViewSpec(viewType);\r\n this.currentDate = newDate.clone();\r\n this.renderView(spec ? spec.type : null);\r\n };\r\n // Current Date\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initCurrentDate = function () {\r\n var defaultDateInput = this.opt('defaultDate');\r\n // compute the initial ambig-timezone date\r\n if (defaultDateInput != null) {\r\n this.currentDate = this.moment(defaultDateInput).stripZone();\r\n }\r\n else {\r\n this.currentDate = this.getNow(); // getNow already returns unzoned\r\n }\r\n };\r\n Calendar.prototype.prev = function () {\r\n var view = this.view;\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n if (prevInfo.isValid) {\r\n this.currentDate = prevInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.next = function () {\r\n var view = this.view;\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n if (nextInfo.isValid) {\r\n this.currentDate = nextInfo.date;\r\n this.renderView();\r\n }\r\n };\r\n Calendar.prototype.prevYear = function () {\r\n this.currentDate.add(-1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.nextYear = function () {\r\n this.currentDate.add(1, 'years');\r\n this.renderView();\r\n };\r\n Calendar.prototype.today = function () {\r\n this.currentDate = this.getNow(); // should deny like prev/next?\r\n this.renderView();\r\n };\r\n Calendar.prototype.gotoDate = function (zonedDateInput) {\r\n this.currentDate = this.moment(zonedDateInput).stripZone();\r\n this.renderView();\r\n };\r\n Calendar.prototype.incrementDate = function (delta) {\r\n this.currentDate.add(moment.duration(delta));\r\n this.renderView();\r\n };\r\n // for external API\r\n Calendar.prototype.getDate = function () {\r\n return this.applyTimezone(this.currentDate); // infuse the calendar's timezone\r\n };\r\n // Loading Triggering\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // Should be called when any type of async data fetching begins\r\n Calendar.prototype.pushLoading = function () {\r\n if (!(this.loadingLevel++)) {\r\n this.publiclyTrigger('loading', [true, this.view]);\r\n }\r\n };\r\n // Should be called when any type of async data fetching completes\r\n Calendar.prototype.popLoading = function () {\r\n if (!(--this.loadingLevel)) {\r\n this.publiclyTrigger('loading', [false, this.view]);\r\n }\r\n };\r\n // High-level Rendering\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.render = function () {\r\n if (!this.contentEl) {\r\n this.initialRender();\r\n }\r\n else if (this.elementVisible()) {\r\n // mainly for the public API\r\n this.calcSize();\r\n this.updateViewSize();\r\n }\r\n };\r\n Calendar.prototype.initialRender = function () {\r\n var _this = this;\r\n var el = this.el;\r\n el.addClass('fc');\r\n // event delegation for nav links\r\n el.on('click.fc', 'a[data-goto]', function (ev) {\r\n var anchorEl = $(ev.currentTarget);\r\n var gotoOptions = anchorEl.data('goto'); // will automatically parse JSON\r\n var date = _this.moment(gotoOptions.date);\r\n var viewType = gotoOptions.type;\r\n // property like \"navLinkDayClick\". might be a string or a function\r\n var customAction = _this.view.opt('navLink' + util_1.capitaliseFirstLetter(viewType) + 'Click');\r\n if (typeof customAction === 'function') {\r\n customAction(date, ev);\r\n }\r\n else {\r\n if (typeof customAction === 'string') {\r\n viewType = customAction;\r\n }\r\n _this.zoomTo(date, viewType);\r\n }\r\n });\r\n // called immediately, and upon option change\r\n this.optionsManager.watch('settingTheme', ['?theme', '?themeSystem'], function (opts) {\r\n var themeClass = ThemeRegistry_1.getThemeSystemClass(opts.themeSystem || opts.theme);\r\n var theme = new themeClass(_this.optionsManager);\r\n var widgetClass = theme.getClass('widget');\r\n _this.theme = theme;\r\n if (widgetClass) {\r\n el.addClass(widgetClass);\r\n }\r\n }, function () {\r\n var widgetClass = _this.theme.getClass('widget');\r\n _this.theme = null;\r\n if (widgetClass) {\r\n el.removeClass(widgetClass);\r\n }\r\n });\r\n this.optionsManager.watch('settingBusinessHourGenerator', ['?businessHours'], function (deps) {\r\n _this.businessHourGenerator = new BusinessHourGenerator_1.default(deps.businessHours, _this);\r\n if (_this.view) {\r\n _this.view.set('businessHourGenerator', _this.businessHourGenerator);\r\n }\r\n }, function () {\r\n _this.businessHourGenerator = null;\r\n });\r\n // called immediately, and upon option change.\r\n // HACK: locale often affects isRTL, so we explicitly listen to that too.\r\n this.optionsManager.watch('applyingDirClasses', ['?isRTL', '?locale'], function (opts) {\r\n el.toggleClass('fc-ltr', !opts.isRTL);\r\n el.toggleClass('fc-rtl', opts.isRTL);\r\n });\r\n this.contentEl = $(\"
\").prependTo(el);\r\n this.initToolbars();\r\n this.renderHeader();\r\n this.renderFooter();\r\n this.renderView(this.opt('defaultView'));\r\n if (this.opt('handleWindowResize')) {\r\n $(window).resize(this.windowResizeProxy = util_1.debounce(// prevents rapid calls\r\n this.windowResize.bind(this), this.opt('windowResizeDelay')));\r\n }\r\n };\r\n Calendar.prototype.destroy = function () {\r\n if (this.view) {\r\n this.clearView();\r\n }\r\n this.toolbarsManager.proxyCall('removeElement');\r\n this.contentEl.remove();\r\n this.el.removeClass('fc fc-ltr fc-rtl');\r\n // removes theme-related root className\r\n this.optionsManager.unwatch('settingTheme');\r\n this.optionsManager.unwatch('settingBusinessHourGenerator');\r\n this.el.off('.fc'); // unbind nav link handlers\r\n if (this.windowResizeProxy) {\r\n $(window).unbind('resize', this.windowResizeProxy);\r\n this.windowResizeProxy = null;\r\n }\r\n GlobalEmitter_1.default.unneeded();\r\n };\r\n Calendar.prototype.elementVisible = function () {\r\n return this.el.is(':visible');\r\n };\r\n // Render Queue\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.bindViewHandlers = function (view) {\r\n var _this = this;\r\n view.watch('titleForCalendar', ['title'], function (deps) {\r\n if (view === _this.view) {\r\n _this.setToolbarsTitle(deps.title);\r\n }\r\n });\r\n view.watch('dateProfileForCalendar', ['dateProfile'], function (deps) {\r\n if (view === _this.view) {\r\n _this.currentDate = deps.dateProfile.date; // might have been constrained by view dates\r\n _this.updateToolbarButtons(deps.dateProfile);\r\n }\r\n });\r\n };\r\n Calendar.prototype.unbindViewHandlers = function (view) {\r\n view.unwatch('titleForCalendar');\r\n view.unwatch('dateProfileForCalendar');\r\n };\r\n // View Rendering\r\n // -----------------------------------------------------------------------------------\r\n // Renders a view because of a date change, view-type change, or for the first time.\r\n // If not given a viewType, keep the current view but render different dates.\r\n // Accepts an optional scroll state to restore to.\r\n Calendar.prototype.renderView = function (viewType) {\r\n var oldView = this.view;\r\n var newView;\r\n this.freezeContentHeight();\r\n if (oldView && viewType && oldView.type !== viewType) {\r\n this.clearView();\r\n }\r\n // if viewType changed, or the view was never created, create a fresh view\r\n if (!this.view && viewType) {\r\n newView = this.view =\r\n this.viewsByType[viewType] ||\r\n (this.viewsByType[viewType] = this.instantiateView(viewType));\r\n this.bindViewHandlers(newView);\r\n newView.startBatchRender(); // so that setElement+setDate rendering are joined\r\n newView.setElement($(\"
\").appendTo(this.contentEl));\r\n this.toolbarsManager.proxyCall('activateButton', viewType);\r\n }\r\n if (this.view) {\r\n // prevent unnecessary change firing\r\n if (this.view.get('businessHourGenerator') !== this.businessHourGenerator) {\r\n this.view.set('businessHourGenerator', this.businessHourGenerator);\r\n }\r\n this.view.setDate(this.currentDate);\r\n if (newView) {\r\n newView.stopBatchRender();\r\n }\r\n }\r\n this.thawContentHeight();\r\n };\r\n // Unrenders the current view and reflects this change in the Header.\r\n // Unregsiters the `view`, but does not remove from viewByType hash.\r\n Calendar.prototype.clearView = function () {\r\n var currentView = this.view;\r\n this.toolbarsManager.proxyCall('deactivateButton', currentView.type);\r\n this.unbindViewHandlers(currentView);\r\n currentView.removeElement();\r\n currentView.unsetDate(); // so bindViewHandlers doesn't fire with old values next time\r\n this.view = null;\r\n };\r\n // Destroys the view, including the view object. Then, re-instantiates it and renders it.\r\n // Maintains the same scroll state.\r\n // TODO: maintain any other user-manipulated state.\r\n Calendar.prototype.reinitView = function () {\r\n var oldView = this.view;\r\n var scroll = oldView.queryScroll(); // wouldn't be so complicated if Calendar owned the scroll\r\n this.freezeContentHeight();\r\n this.clearView();\r\n this.calcSize();\r\n this.renderView(oldView.type); // needs the type to freshly render\r\n this.view.applyScroll(scroll);\r\n this.thawContentHeight();\r\n };\r\n // Resizing\r\n // -----------------------------------------------------------------------------------\r\n Calendar.prototype.getSuggestedViewHeight = function () {\r\n if (this.suggestedViewHeight == null) {\r\n this.calcSize();\r\n }\r\n return this.suggestedViewHeight;\r\n };\r\n Calendar.prototype.isHeightAuto = function () {\r\n return this.opt('contentHeight') === 'auto' || this.opt('height') === 'auto';\r\n };\r\n Calendar.prototype.updateViewSize = function (isResize) {\r\n if (isResize === void 0) { isResize = false; }\r\n var view = this.view;\r\n var scroll;\r\n if (!this.ignoreUpdateViewSize && view) {\r\n if (isResize) {\r\n this.calcSize();\r\n scroll = view.queryScroll();\r\n }\r\n this.ignoreUpdateViewSize++;\r\n view.updateSize(this.getSuggestedViewHeight(), this.isHeightAuto(), isResize);\r\n this.ignoreUpdateViewSize--;\r\n if (isResize) {\r\n view.applyScroll(scroll);\r\n }\r\n return true; // signal success\r\n }\r\n };\r\n Calendar.prototype.calcSize = function () {\r\n if (this.elementVisible()) {\r\n this._calcSize();\r\n }\r\n };\r\n Calendar.prototype._calcSize = function () {\r\n var contentHeightInput = this.opt('contentHeight');\r\n var heightInput = this.opt('height');\r\n if (typeof contentHeightInput === 'number') {\r\n this.suggestedViewHeight = contentHeightInput;\r\n }\r\n else if (typeof contentHeightInput === 'function') {\r\n this.suggestedViewHeight = contentHeightInput();\r\n }\r\n else if (typeof heightInput === 'number') {\r\n this.suggestedViewHeight = heightInput - this.queryToolbarsHeight();\r\n }\r\n else if (typeof heightInput === 'function') {\r\n this.suggestedViewHeight = heightInput() - this.queryToolbarsHeight();\r\n }\r\n else if (heightInput === 'parent') {\r\n this.suggestedViewHeight = this.el.parent().height() - this.queryToolbarsHeight();\r\n }\r\n else {\r\n this.suggestedViewHeight = Math.round(this.contentEl.width() /\r\n Math.max(this.opt('aspectRatio'), .5));\r\n }\r\n };\r\n Calendar.prototype.windowResize = function (ev) {\r\n if (\r\n // the purpose: so we don't process jqui \"resize\" events that have bubbled up\r\n // cast to any because .target, which is Element, can't be compared to window for some reason.\r\n ev.target === window &&\r\n this.view &&\r\n this.view.isDatesRendered) {\r\n if (this.updateViewSize(true)) {\r\n this.publiclyTrigger('windowResize', [this.view]);\r\n }\r\n }\r\n };\r\n /* Height \"Freezing\"\r\n -----------------------------------------------------------------------------*/\r\n Calendar.prototype.freezeContentHeight = function () {\r\n if (!(this.freezeContentHeightDepth++)) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n Calendar.prototype.forceFreezeContentHeight = function () {\r\n this.contentEl.css({\r\n width: '100%',\r\n height: this.contentEl.height(),\r\n overflow: 'hidden'\r\n });\r\n };\r\n Calendar.prototype.thawContentHeight = function () {\r\n this.freezeContentHeightDepth--;\r\n // always bring back to natural height\r\n this.contentEl.css({\r\n width: '',\r\n height: '',\r\n overflow: ''\r\n });\r\n // but if there are future thaws, re-freeze\r\n if (this.freezeContentHeightDepth) {\r\n this.forceFreezeContentHeight();\r\n }\r\n };\r\n // Toolbar\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initToolbars = function () {\r\n this.header = new Toolbar_1.default(this, this.computeHeaderOptions());\r\n this.footer = new Toolbar_1.default(this, this.computeFooterOptions());\r\n this.toolbarsManager = new Iterator_1.default([this.header, this.footer]);\r\n };\r\n Calendar.prototype.computeHeaderOptions = function () {\r\n return {\r\n extraClasses: 'fc-header-toolbar',\r\n layout: this.opt('header')\r\n };\r\n };\r\n Calendar.prototype.computeFooterOptions = function () {\r\n return {\r\n extraClasses: 'fc-footer-toolbar',\r\n layout: this.opt('footer')\r\n };\r\n };\r\n // can be called repeatedly and Header will rerender\r\n Calendar.prototype.renderHeader = function () {\r\n var header = this.header;\r\n header.setToolbarOptions(this.computeHeaderOptions());\r\n header.render();\r\n if (header.el) {\r\n this.el.prepend(header.el);\r\n }\r\n };\r\n // can be called repeatedly and Footer will rerender\r\n Calendar.prototype.renderFooter = function () {\r\n var footer = this.footer;\r\n footer.setToolbarOptions(this.computeFooterOptions());\r\n footer.render();\r\n if (footer.el) {\r\n this.el.append(footer.el);\r\n }\r\n };\r\n Calendar.prototype.setToolbarsTitle = function (title) {\r\n this.toolbarsManager.proxyCall('updateTitle', title);\r\n };\r\n Calendar.prototype.updateToolbarButtons = function (dateProfile) {\r\n var now = this.getNow();\r\n var view = this.view;\r\n var todayInfo = view.dateProfileGenerator.build(now);\r\n var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));\r\n var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));\r\n this.toolbarsManager.proxyCall((todayInfo.isValid && !dateProfile.currentUnzonedRange.containsDate(now)) ?\r\n 'enableButton' :\r\n 'disableButton', 'today');\r\n this.toolbarsManager.proxyCall(prevInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'prev');\r\n this.toolbarsManager.proxyCall(nextInfo.isValid ?\r\n 'enableButton' :\r\n 'disableButton', 'next');\r\n };\r\n Calendar.prototype.queryToolbarsHeight = function () {\r\n return this.toolbarsManager.items.reduce(function (accumulator, toolbar) {\r\n var toolbarHeight = toolbar.el ? toolbar.el.outerHeight(true) : 0; // includes margin\r\n return accumulator + toolbarHeight;\r\n }, 0);\r\n };\r\n // Selection\r\n // -----------------------------------------------------------------------------------------------------------------\r\n // this public method receives start/end dates in any format, with any timezone\r\n Calendar.prototype.select = function (zonedStartInput, zonedEndInput) {\r\n this.view.select(this.buildSelectFootprint.apply(this, arguments));\r\n };\r\n Calendar.prototype.unselect = function () {\r\n if (this.view) {\r\n this.view.unselect();\r\n }\r\n };\r\n // Given arguments to the select method in the API, returns a span (unzoned start/end and other info)\r\n Calendar.prototype.buildSelectFootprint = function (zonedStartInput, zonedEndInput) {\r\n var start = this.moment(zonedStartInput).stripZone();\r\n var end;\r\n if (zonedEndInput) {\r\n end = this.moment(zonedEndInput).stripZone();\r\n }\r\n else if (start.hasTime()) {\r\n end = start.clone().add(this.defaultTimedEventDuration);\r\n }\r\n else {\r\n end = start.clone().add(this.defaultAllDayEventDuration);\r\n }\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), !start.hasTime());\r\n };\r\n // Date Utils\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initMomentInternals = function () {\r\n var _this = this;\r\n this.defaultAllDayEventDuration = moment.duration(this.opt('defaultAllDayEventDuration'));\r\n this.defaultTimedEventDuration = moment.duration(this.opt('defaultTimedEventDuration'));\r\n // Called immediately, and when any of the options change.\r\n // Happens before any internal objects rebuild or rerender, because this is very core.\r\n this.optionsManager.watch('buildingMomentLocale', [\r\n '?locale', '?monthNames', '?monthNamesShort', '?dayNames', '?dayNamesShort',\r\n '?firstDay', '?weekNumberCalculation'\r\n ], function (opts) {\r\n var weekNumberCalculation = opts.weekNumberCalculation;\r\n var firstDay = opts.firstDay;\r\n var _week;\r\n // normalize\r\n if (weekNumberCalculation === 'iso') {\r\n weekNumberCalculation = 'ISO'; // normalize\r\n }\r\n var localeData = Object.create(// make a cheap copy\r\n locale_1.getMomentLocaleData(opts.locale) // will fall back to en\r\n );\r\n if (opts.monthNames) {\r\n localeData._months = opts.monthNames;\r\n }\r\n if (opts.monthNamesShort) {\r\n localeData._monthsShort = opts.monthNamesShort;\r\n }\r\n if (opts.dayNames) {\r\n localeData._weekdays = opts.dayNames;\r\n }\r\n if (opts.dayNamesShort) {\r\n localeData._weekdaysShort = opts.dayNamesShort;\r\n }\r\n if (firstDay == null && weekNumberCalculation === 'ISO') {\r\n firstDay = 1;\r\n }\r\n if (firstDay != null) {\r\n _week = Object.create(localeData._week); // _week: { dow: # }\r\n _week.dow = firstDay;\r\n localeData._week = _week;\r\n }\r\n if (weekNumberCalculation === 'ISO' ||\r\n weekNumberCalculation === 'local' ||\r\n typeof weekNumberCalculation === 'function') {\r\n localeData._fullCalendar_weekCalc = weekNumberCalculation; // moment-ext will know what to do with it\r\n }\r\n _this.localeData = localeData;\r\n // If the internal current date object already exists, move to new locale.\r\n // We do NOT need to do this technique for event dates, because this happens when converting to \"segments\".\r\n if (_this.currentDate) {\r\n _this.localizeMoment(_this.currentDate); // sets to localeData\r\n }\r\n });\r\n };\r\n // Builds a moment using the settings of the current calendar: timezone and locale.\r\n // Accepts anything the vanilla moment() constructor accepts.\r\n Calendar.prototype.moment = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var mom;\r\n if (this.opt('timezone') === 'local') {\r\n mom = moment_ext_1.default.apply(null, args);\r\n // Force the moment to be local, because momentExt doesn't guarantee it.\r\n if (mom.hasTime()) {\r\n mom.local();\r\n }\r\n }\r\n else if (this.opt('timezone') === 'UTC') {\r\n mom = moment_ext_1.default.utc.apply(null, args); // process as UTC\r\n }\r\n else {\r\n mom = moment_ext_1.default.parseZone.apply(null, args); // let the input decide the zone\r\n }\r\n this.localizeMoment(mom); // TODO\r\n return mom;\r\n };\r\n Calendar.prototype.msToMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n else {\r\n mom = this.applyTimezone(mom); // may or may not apply locale\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n Calendar.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC\r\n if (forceAllDay) {\r\n mom.stripTime();\r\n }\r\n this.localizeMoment(mom);\r\n return mom;\r\n };\r\n // Updates the given moment's locale settings to the current calendar locale settings.\r\n Calendar.prototype.localizeMoment = function (mom) {\r\n mom._locale = this.localeData;\r\n };\r\n // Returns a boolean about whether or not the calendar knows how to calculate\r\n // the timezone offset of arbitrary dates in the current timezone.\r\n Calendar.prototype.getIsAmbigTimezone = function () {\r\n return this.opt('timezone') !== 'local' && this.opt('timezone') !== 'UTC';\r\n };\r\n // Returns a copy of the given date in the current timezone. Has no effect on dates without times.\r\n Calendar.prototype.applyTimezone = function (date) {\r\n if (!date.hasTime()) {\r\n return date.clone();\r\n }\r\n var zonedDate = this.moment(date.toArray());\r\n var timeAdjust = date.time().asMilliseconds() - zonedDate.time().asMilliseconds();\r\n var adjustedZonedDate;\r\n // Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396)\r\n if (timeAdjust) {\r\n adjustedZonedDate = zonedDate.clone().add(timeAdjust); // add milliseconds\r\n if (date.time().asMilliseconds() - adjustedZonedDate.time().asMilliseconds() === 0) {\r\n zonedDate = adjustedZonedDate;\r\n }\r\n }\r\n return zonedDate;\r\n };\r\n /*\r\n Assumes the footprint is non-open-ended.\r\n */\r\n Calendar.prototype.footprintToDateProfile = function (componentFootprint, ignoreEnd) {\r\n if (ignoreEnd === void 0) { ignoreEnd = false; }\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs);\r\n var end;\r\n if (!ignoreEnd) {\r\n end = moment_ext_1.default.utc(componentFootprint.unzonedRange.endMs);\r\n }\r\n if (componentFootprint.isAllDay) {\r\n start.stripTime();\r\n if (end) {\r\n end.stripTime();\r\n }\r\n }\r\n else {\r\n start = this.applyTimezone(start);\r\n if (end) {\r\n end = this.applyTimezone(end);\r\n }\r\n }\r\n return new EventDateProfile_1.default(start, end, this);\r\n };\r\n // Returns a moment for the current date, as defined by the client's computer or from the `now` option.\r\n // Will return an moment with an ambiguous timezone.\r\n Calendar.prototype.getNow = function () {\r\n var now = this.opt('now');\r\n if (typeof now === 'function') {\r\n now = now();\r\n }\r\n return this.moment(now).stripZone();\r\n };\r\n // Produces a human-readable string for the given duration.\r\n // Side-effect: changes the locale of the given duration.\r\n Calendar.prototype.humanizeDuration = function (duration) {\r\n return duration.locale(this.opt('locale')).humanize();\r\n };\r\n // will return `null` if invalid range\r\n Calendar.prototype.parseUnzonedRange = function (rangeInput) {\r\n var start = null;\r\n var end = null;\r\n if (rangeInput.start) {\r\n start = this.moment(rangeInput.start).stripZone();\r\n }\r\n if (rangeInput.end) {\r\n end = this.moment(rangeInput.end).stripZone();\r\n }\r\n if (!start && !end) {\r\n return null;\r\n }\r\n if (start && end && end.isBefore(start)) {\r\n return null;\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Event-Date Utilities\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.initEventManager = function () {\r\n var _this = this;\r\n var eventManager = new EventManager_1.default(this);\r\n var rawSources = this.opt('eventSources') || [];\r\n var singleRawSource = this.opt('events');\r\n this.eventManager = eventManager;\r\n if (singleRawSource) {\r\n rawSources.unshift(singleRawSource);\r\n }\r\n eventManager.on('release', function (eventsPayload) {\r\n _this.trigger('eventsReset', eventsPayload);\r\n });\r\n eventManager.freeze();\r\n rawSources.forEach(function (rawSource) {\r\n var source = EventSourceParser_1.default.parse(rawSource, _this);\r\n if (source) {\r\n eventManager.addSource(source);\r\n }\r\n });\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.requestEvents = function (start, end) {\r\n return this.eventManager.requestEvents(start, end, this.opt('timezone'), !this.opt('lazyFetching'));\r\n };\r\n // Get an event's normalized end date. If not present, calculate it from the defaults.\r\n Calendar.prototype.getEventEnd = function (event) {\r\n if (event.end) {\r\n return event.end.clone();\r\n }\r\n else {\r\n return this.getDefaultEventEnd(event.allDay, event.start);\r\n }\r\n };\r\n // Given an event's allDay status and start date, return what its fallback end date should be.\r\n // TODO: rename to computeDefaultEventEnd\r\n Calendar.prototype.getDefaultEventEnd = function (allDay, zonedStart) {\r\n var end = zonedStart.clone();\r\n if (allDay) {\r\n end.stripTime().add(this.defaultAllDayEventDuration);\r\n }\r\n else {\r\n end.add(this.defaultTimedEventDuration);\r\n }\r\n if (this.getIsAmbigTimezone()) {\r\n end.stripZone(); // we don't know what the tzo should be\r\n }\r\n return end;\r\n };\r\n // Public Events API\r\n // -----------------------------------------------------------------------------------------------------------------\r\n Calendar.prototype.rerenderEvents = function () {\r\n this.view.flash('displayingEvents');\r\n };\r\n Calendar.prototype.refetchEvents = function () {\r\n this.eventManager.refetchAllSources();\r\n };\r\n Calendar.prototype.renderEvents = function (eventInputs, isSticky) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventInputs.length; i++) {\r\n this.renderEvent(eventInputs[i], isSticky);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.renderEvent = function (eventInput, isSticky) {\r\n if (isSticky === void 0) { isSticky = false; }\r\n var eventManager = this.eventManager;\r\n var eventDef = EventDefParser_1.default.parse(eventInput, eventInput.source || eventManager.stickySource);\r\n if (eventDef) {\r\n eventManager.addEventDef(eventDef, isSticky);\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.removeEvents = function (legacyQuery) {\r\n var eventManager = this.eventManager;\r\n var legacyInstances = [];\r\n var idMap = {};\r\n var eventDef;\r\n var i;\r\n if (legacyQuery == null) {\r\n eventManager.removeAllEventDefs(); // persist=true\r\n }\r\n else {\r\n eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyInstances.push(eventInstance.toLegacy());\r\n });\r\n legacyInstances = filterLegacyEventInstances(legacyInstances, legacyQuery);\r\n // compute unique IDs\r\n for (i = 0; i < legacyInstances.length; i++) {\r\n eventDef = this.eventManager.getEventDefByUid(legacyInstances[i]._id);\r\n idMap[eventDef.id] = true;\r\n }\r\n eventManager.freeze();\r\n for (i in idMap) {\r\n eventManager.removeEventDefsById(i); // persist=true\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n // legacyQuery operates on legacy event instance objects\r\n Calendar.prototype.clientEvents = function (legacyQuery) {\r\n var legacyEventInstances = [];\r\n this.eventManager.getEventInstances().forEach(function (eventInstance) {\r\n legacyEventInstances.push(eventInstance.toLegacy());\r\n });\r\n return filterLegacyEventInstances(legacyEventInstances, legacyQuery);\r\n };\r\n Calendar.prototype.updateEvents = function (eventPropsArray) {\r\n this.eventManager.freeze();\r\n for (var i = 0; i < eventPropsArray.length; i++) {\r\n this.updateEvent(eventPropsArray[i]);\r\n }\r\n this.eventManager.thaw();\r\n };\r\n Calendar.prototype.updateEvent = function (eventProps) {\r\n var eventDef = this.eventManager.getEventDefByUid(eventProps._id);\r\n var eventInstance;\r\n var eventDefMutation;\r\n if (eventDef instanceof SingleEventDef_1.default) {\r\n eventInstance = eventDef.buildInstance();\r\n eventDefMutation = EventDefMutation_1.default.createFromRawProps(eventInstance, eventProps, // raw props\r\n null // largeUnit -- who uses it?\r\n );\r\n this.eventManager.mutateEventsWithId(eventDef.id, eventDefMutation); // will release\r\n }\r\n };\r\n // Public Event Sources API\r\n // ------------------------------------------------------------------------------------\r\n Calendar.prototype.getEventSources = function () {\r\n return this.eventManager.otherSources.slice(); // clone\r\n };\r\n Calendar.prototype.getEventSourceById = function (id) {\r\n return this.eventManager.getSourceById(EventSource_1.default.normalizeId(id));\r\n };\r\n Calendar.prototype.addEventSource = function (sourceInput) {\r\n var source = EventSourceParser_1.default.parse(sourceInput, this);\r\n if (source) {\r\n this.eventManager.addSource(source);\r\n }\r\n };\r\n Calendar.prototype.removeEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources;\r\n var i;\r\n if (sourceMultiQuery == null) {\r\n this.eventManager.removeAllSources();\r\n }\r\n else {\r\n sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n }\r\n };\r\n Calendar.prototype.removeEventSource = function (sourceQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.querySources(sourceQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.removeSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n Calendar.prototype.refetchEventSources = function (sourceMultiQuery) {\r\n var eventManager = this.eventManager;\r\n var sources = eventManager.multiQuerySources(sourceMultiQuery);\r\n var i;\r\n eventManager.freeze();\r\n for (i = 0; i < sources.length; i++) {\r\n eventManager.refetchSource(sources[i]);\r\n }\r\n eventManager.thaw();\r\n };\r\n // not for internal use. use options module directly instead.\r\n Calendar.defaults = options_1.globalDefaults;\r\n Calendar.englishDefaults = options_1.englishDefaults;\r\n Calendar.rtlDefaults = options_1.rtlDefaults;\r\n return Calendar;\r\n}());\r\nexports.default = Calendar;\r\nEmitterMixin_1.default.mixInto(Calendar);\r\nListenerMixin_1.default.mixInto(Calendar);\r\nfunction filterLegacyEventInstances(legacyEventInstances, legacyQuery) {\r\n if (legacyQuery == null) {\r\n return legacyEventInstances;\r\n }\r\n else if ($.isFunction(legacyQuery)) {\r\n return legacyEventInstances.filter(legacyQuery);\r\n }\r\n else {\r\n legacyQuery += ''; // normalize to string\r\n return legacyEventInstances.filter(function (legacyEventInstance) {\r\n // soft comparison because id not be normalized to string\r\n // tslint:disable-next-line\r\n return legacyEventInstance.id == legacyQuery ||\r\n legacyEventInstance._id === legacyQuery; // can specify internal id, but must exactly match\r\n });\r\n }\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 221 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator = /** @class */ (function () {\r\n function DateProfileGenerator(_view) {\r\n this._view = _view;\r\n }\r\n DateProfileGenerator.prototype.opt = function (name) {\r\n return this._view.opt(name);\r\n };\r\n DateProfileGenerator.prototype.trimHiddenDays = function (unzonedRange) {\r\n return this._view.trimHiddenDays(unzonedRange);\r\n };\r\n DateProfileGenerator.prototype.msToUtcMoment = function (ms, forceAllDay) {\r\n return this._view.calendar.msToUtcMoment(ms, forceAllDay);\r\n };\r\n /* Date Range Computation\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Builds a structure with info about what the dates/ranges will be for the \"prev\" view.\r\n DateProfileGenerator.prototype.buildPrev = function (currentDateProfile) {\r\n var prevDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .subtract(currentDateProfile.dateIncrement);\r\n return this.build(prevDate, -1);\r\n };\r\n // Builds a structure with info about what the dates/ranges will be for the \"next\" view.\r\n DateProfileGenerator.prototype.buildNext = function (currentDateProfile) {\r\n var nextDate = currentDateProfile.date.clone()\r\n .startOf(currentDateProfile.currentRangeUnit)\r\n .add(currentDateProfile.dateIncrement);\r\n return this.build(nextDate, 1);\r\n };\r\n // Builds a structure holding dates/ranges for rendering around the given date.\r\n // Optional direction param indicates whether the date is being incremented/decremented\r\n // from its previous value. decremented = -1, incremented = 1 (default).\r\n DateProfileGenerator.prototype.build = function (date, direction, forceToValid) {\r\n if (forceToValid === void 0) { forceToValid = false; }\r\n var isDateAllDay = !date.hasTime();\r\n var validUnzonedRange;\r\n var minTime = null;\r\n var maxTime = null;\r\n var currentInfo;\r\n var isRangeAllDay;\r\n var renderUnzonedRange;\r\n var activeUnzonedRange;\r\n var isValid;\r\n validUnzonedRange = this.buildValidRange();\r\n validUnzonedRange = this.trimHiddenDays(validUnzonedRange);\r\n if (forceToValid) {\r\n date = this.msToUtcMoment(validUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n currentInfo = this.buildCurrentRangeInfo(date, direction);\r\n isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);\r\n renderUnzonedRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.unzonedRange), currentInfo.unit, isRangeAllDay);\r\n renderUnzonedRange = this.trimHiddenDays(renderUnzonedRange);\r\n activeUnzonedRange = renderUnzonedRange.clone();\r\n if (!this.opt('showNonCurrentDates')) {\r\n activeUnzonedRange = activeUnzonedRange.intersect(currentInfo.unzonedRange);\r\n }\r\n minTime = moment.duration(this.opt('minTime'));\r\n maxTime = moment.duration(this.opt('maxTime'));\r\n activeUnzonedRange = this.adjustActiveRange(activeUnzonedRange, minTime, maxTime);\r\n activeUnzonedRange = activeUnzonedRange.intersect(validUnzonedRange); // might return null\r\n if (activeUnzonedRange) {\r\n date = this.msToUtcMoment(activeUnzonedRange.constrainDate(date), // returns MS\r\n isDateAllDay);\r\n }\r\n // it's invalid if the originally requested date is not contained,\r\n // or if the range is completely outside of the valid range.\r\n isValid = currentInfo.unzonedRange.intersectsWith(validUnzonedRange);\r\n return {\r\n // constraint for where prev/next operations can go and where events can be dragged/resized to.\r\n // an object with optional start and end properties.\r\n validUnzonedRange: validUnzonedRange,\r\n // range the view is formally responsible for.\r\n // for example, a month view might have 1st-31st, excluding padded dates\r\n currentUnzonedRange: currentInfo.unzonedRange,\r\n // name of largest unit being displayed, like \"month\" or \"week\"\r\n currentRangeUnit: currentInfo.unit,\r\n isRangeAllDay: isRangeAllDay,\r\n // dates that display events and accept drag-n-drop\r\n // will be `null` if no dates accept events\r\n activeUnzonedRange: activeUnzonedRange,\r\n // date range with a rendered skeleton\r\n // includes not-active days that need some sort of DOM\r\n renderUnzonedRange: renderUnzonedRange,\r\n // Duration object that denotes the first visible time of any given day\r\n minTime: minTime,\r\n // Duration object that denotes the exclusive visible end time of any given day\r\n maxTime: maxTime,\r\n isValid: isValid,\r\n date: date,\r\n // how far the current date will move for a prev/next operation\r\n dateIncrement: this.buildDateIncrement(currentInfo.duration)\r\n // pass a fallback (might be null) ^\r\n };\r\n };\r\n // Builds an object with optional start/end properties.\r\n // Indicates the minimum/maximum dates to display.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildValidRange = function () {\r\n return this._view.getUnzonedRangeOption('validRange', this._view.calendar.getNow()) ||\r\n new UnzonedRange_1.default(); // completely open-ended\r\n };\r\n // Builds a structure with info about the \"current\" range, the range that is\r\n // highlighted as being the current month for example.\r\n // See build() for a description of `direction`.\r\n // Guaranteed to have `range` and `unit` properties. `duration` is optional.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {\r\n var viewSpec = this._view.viewSpec;\r\n var duration = null;\r\n var unit = null;\r\n var unzonedRange = null;\r\n var dayCount;\r\n if (viewSpec.duration) {\r\n duration = viewSpec.duration;\r\n unit = viewSpec.durationUnit;\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n else if ((dayCount = this.opt('dayCount'))) {\r\n unit = 'day';\r\n unzonedRange = this.buildRangeFromDayCount(date, direction, dayCount);\r\n }\r\n else if ((unzonedRange = this.buildCustomVisibleRange(date))) {\r\n unit = util_1.computeGreatestUnit(unzonedRange.getStart(), unzonedRange.getEnd());\r\n }\r\n else {\r\n duration = this.getFallbackDuration();\r\n unit = util_1.computeGreatestUnit(duration);\r\n unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);\r\n }\r\n return { duration: duration, unit: unit, unzonedRange: unzonedRange };\r\n };\r\n DateProfileGenerator.prototype.getFallbackDuration = function () {\r\n return moment.duration({ days: 1 });\r\n };\r\n // Returns a new activeUnzonedRange to have time values (un-ambiguate)\r\n // minTime or maxTime causes the range to expand.\r\n DateProfileGenerator.prototype.adjustActiveRange = function (unzonedRange, minTime, maxTime) {\r\n var start = unzonedRange.getStart();\r\n var end = unzonedRange.getEnd();\r\n if (this._view.usesMinMaxTime) {\r\n if (minTime < 0) {\r\n start.time(0).add(minTime);\r\n }\r\n if (maxTime > 24 * 60 * 60 * 1000) {\r\n end.time(maxTime - (24 * 60 * 60 * 1000));\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds the \"current\" range when it is specified as an explicit duration.\r\n // `unit` is the already-computed computeGreatestUnit value of duration.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {\r\n var alignment = this.opt('dateAlignment');\r\n var dateIncrementInput;\r\n var dateIncrementDuration;\r\n var start;\r\n var end;\r\n var res;\r\n // compute what the alignment should be\r\n if (!alignment) {\r\n dateIncrementInput = this.opt('dateIncrement');\r\n if (dateIncrementInput) {\r\n dateIncrementDuration = moment.duration(dateIncrementInput);\r\n // use the smaller of the two units\r\n if (dateIncrementDuration < duration) {\r\n alignment = util_1.computeDurationGreatestUnit(dateIncrementDuration, dateIncrementInput);\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n else {\r\n alignment = unit;\r\n }\r\n }\r\n // if the view displays a single day or smaller\r\n if (duration.as('days') <= 1) {\r\n if (this._view.isHiddenDay(start)) {\r\n start = this._view.skipHiddenDays(start, direction);\r\n start.startOf('day');\r\n }\r\n }\r\n function computeRes() {\r\n start = date.clone().startOf(alignment);\r\n end = start.clone().add(duration);\r\n res = new UnzonedRange_1.default(start, end);\r\n }\r\n computeRes();\r\n // if range is completely enveloped by hidden days, go past the hidden days\r\n if (!this.trimHiddenDays(res)) {\r\n date = this._view.skipHiddenDays(date, direction);\r\n computeRes();\r\n }\r\n return res;\r\n };\r\n // Builds the \"current\" range when a dayCount is specified.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {\r\n var customAlignment = this.opt('dateAlignment');\r\n var runningCount = 0;\r\n var start = date.clone();\r\n var end;\r\n if (customAlignment) {\r\n start.startOf(customAlignment);\r\n }\r\n start.startOf('day');\r\n start = this._view.skipHiddenDays(start, direction);\r\n end = start.clone();\r\n do {\r\n end.add(1, 'day');\r\n if (!this._view.isHiddenDay(end)) {\r\n runningCount++;\r\n }\r\n } while (runningCount < dayCount);\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n // Builds a normalized range object for the \"visible\" range,\r\n // which is a way to define the currentUnzonedRange and activeUnzonedRange at the same time.\r\n // TODO: accept a MS-time instead of a moment `date`?\r\n DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {\r\n var visibleUnzonedRange = this._view.getUnzonedRangeOption('visibleRange', this._view.calendar.applyTimezone(date) // correct zone. also generates new obj that avoids mutations\r\n );\r\n if (visibleUnzonedRange && (visibleUnzonedRange.startMs == null || visibleUnzonedRange.endMs == null)) {\r\n return null;\r\n }\r\n return visibleUnzonedRange;\r\n };\r\n // Computes the range that will represent the element/cells for *rendering*,\r\n // but which may have voided days/times.\r\n // not responsible for trimming hidden days.\r\n DateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n return currentUnzonedRange.clone();\r\n };\r\n // Compute the duration value that should be added/substracted to the current date\r\n // when a prev/next operation happens.\r\n DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {\r\n var dateIncrementInput = this.opt('dateIncrement');\r\n var customAlignment;\r\n if (dateIncrementInput) {\r\n return moment.duration(dateIncrementInput);\r\n }\r\n else if ((customAlignment = this.opt('dateAlignment'))) {\r\n return moment.duration(1, customAlignment);\r\n }\r\n else if (fallback) {\r\n return fallback;\r\n }\r\n else {\r\n return moment.duration({ days: 1 });\r\n }\r\n };\r\n return DateProfileGenerator;\r\n}());\r\nexports.default = DateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 222 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar moment_ext_1 = __webpack_require__(10);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar ExternalDropping = /** @class */ (function (_super) {\r\n tslib_1.__extends(ExternalDropping, _super);\r\n function ExternalDropping() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.isDragging = false; // jqui-dragging an external element? boolean\r\n return _this;\r\n }\r\n /*\r\n component impements:\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - isExternalInstanceGroupAllowed\r\n - renderDrag\r\n - unrenderDrag\r\n */\r\n ExternalDropping.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n ExternalDropping.prototype.bindToDocument = function () {\r\n this.listenTo($(document), {\r\n dragstart: this.handleDragStart,\r\n sortstart: this.handleDragStart // jqui\r\n });\r\n };\r\n ExternalDropping.prototype.unbindFromDocument = function () {\r\n this.stopListeningTo($(document));\r\n };\r\n // Called when a jQuery UI drag is initiated anywhere in the DOM\r\n ExternalDropping.prototype.handleDragStart = function (ev, ui) {\r\n var el;\r\n var accept;\r\n if (this.opt('droppable')) {\r\n el = $((ui ? ui.item : null) || ev.target);\r\n // Test that the dragged element passes the dropAccept selector or filter function.\r\n // FYI, the default is \"*\" (matches all)\r\n accept = this.opt('dropAccept');\r\n if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {\r\n if (!this.isDragging) {\r\n this.listenToExternalDrag(el, ev, ui);\r\n }\r\n }\r\n }\r\n };\r\n // Called when a jQuery UI drag starts and it needs to be monitored for dropping\r\n ExternalDropping.prototype.listenToExternalDrag = function (el, ev, ui) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create\r\n var singleEventDef; // a null value signals an unsuccessful drag\r\n // listener that tracks mouse movement over date-associated pixel regions\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n interactionStart: function () {\r\n _this.isDragging = true;\r\n },\r\n hitOver: function (hit) {\r\n var isAllowed = true;\r\n var hitFootprint = hit.component.getSafeHitFootprint(hit); // hit might not belong to this grid\r\n var mutatedEventInstanceGroup;\r\n if (hitFootprint) {\r\n singleEventDef = _this.computeExternalDrop(hitFootprint, meta);\r\n if (singleEventDef) {\r\n mutatedEventInstanceGroup = new EventInstanceGroup_1.default(singleEventDef.buildInstances());\r\n isAllowed = meta.eventProps ? // isEvent?\r\n component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup) :\r\n component.isExternalInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n singleEventDef = null;\r\n util_1.disableCursor();\r\n }\r\n if (singleEventDef) {\r\n component.renderDrag(// called without a seg parameter\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, view.calendar)));\r\n }\r\n },\r\n hitOut: function () {\r\n singleEventDef = null; // signal unsuccessful\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n component.unrenderDrag();\r\n },\r\n interactionEnd: function (ev) {\r\n if (singleEventDef) {\r\n view.reportExternalDrop(singleEventDef, Boolean(meta.eventProps), // isEvent\r\n Boolean(meta.stick), // isSticky\r\n el, ev, ui);\r\n }\r\n _this.isDragging = false;\r\n _this.dragListener = null;\r\n }\r\n });\r\n dragListener.startDrag(ev); // start listening immediately\r\n };\r\n // Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),\r\n // returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null.\r\n // Returning a null value signals an invalid drop hit.\r\n // DOES NOT consider overlap/constraint.\r\n // Assumes both footprints are non-open-ended.\r\n ExternalDropping.prototype.computeExternalDrop = function (componentFootprint, meta) {\r\n var calendar = this.view.calendar;\r\n var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs).stripZone();\r\n var end;\r\n var eventDef;\r\n if (componentFootprint.isAllDay) {\r\n // if dropped on an all-day span, and element's metadata specified a time, set it\r\n if (meta.startTime) {\r\n start.time(meta.startTime);\r\n }\r\n else {\r\n start.stripTime();\r\n }\r\n }\r\n if (meta.duration) {\r\n end = start.clone().add(meta.duration);\r\n }\r\n start = calendar.applyTimezone(start);\r\n if (end) {\r\n end = calendar.applyTimezone(end);\r\n }\r\n eventDef = SingleEventDef_1.default.parse($.extend({}, meta.eventProps, {\r\n start: start,\r\n end: end\r\n }), new EventSource_1.default(calendar));\r\n return eventDef;\r\n };\r\n return ExternalDropping;\r\n}(Interaction_1.default));\r\nexports.default = ExternalDropping;\r\nListenerMixin_1.default.mixInto(ExternalDropping);\r\n/* External-Dragging-Element Data\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.\r\n// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.\r\nexportHooks.dataAttrPrefix = '';\r\n// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure\r\n// to be used for Event Object creation.\r\n// A defined `.eventProps`, even when empty, indicates that an event should be created.\r\nfunction getDraggedElMeta(el) {\r\n var prefix = exportHooks.dataAttrPrefix;\r\n var eventProps; // properties for creating the event, not related to date/time\r\n var startTime; // a Duration\r\n var duration;\r\n var stick;\r\n if (prefix) {\r\n prefix += '-';\r\n }\r\n eventProps = el.data(prefix + 'event') || null;\r\n if (eventProps) {\r\n if (typeof eventProps === 'object') {\r\n eventProps = $.extend({}, eventProps); // make a copy\r\n }\r\n else {\r\n eventProps = {};\r\n }\r\n // pluck special-cased date/time properties\r\n startTime = eventProps.start;\r\n if (startTime == null) {\r\n startTime = eventProps.time;\r\n } // accept 'time' as well\r\n duration = eventProps.duration;\r\n stick = eventProps.stick;\r\n delete eventProps.start;\r\n delete eventProps.time;\r\n delete eventProps.duration;\r\n delete eventProps.stick;\r\n }\r\n // fallback to standalone attribute values for each of the date/time properties\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'start');\r\n }\r\n if (startTime == null) {\r\n startTime = el.data(prefix + 'time');\r\n } // accept 'time' as well\r\n if (duration == null) {\r\n duration = el.data(prefix + 'duration');\r\n }\r\n if (stick == null) {\r\n stick = el.data(prefix + 'stick');\r\n }\r\n // massage into correct data types\r\n startTime = startTime != null ? moment.duration(startTime) : null;\r\n duration = duration != null ? moment.duration(duration) : null;\r\n stick = Boolean(stick);\r\n return { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 223 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventResizing = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventResizing, _super);\r\n /*\r\n component impements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n - getSafeHitFootprint\r\n */\r\n function EventResizing(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isResizing = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventResizing.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventResizing.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMouseDown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventResizing.prototype.handleMouseDown = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventResizing.prototype.handleTouchStart = function (seg, ev) {\r\n if (this.component.canStartResize(seg, ev)) {\r\n this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))\r\n .startInteraction(ev);\r\n }\r\n };\r\n // Creates a listener that tracks the user as they resize an event segment.\r\n // Generic enough to work with any type of Grid.\r\n EventResizing.prototype.buildDragListener = function (seg, isStart) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance;\r\n var isDragging;\r\n var resizeMutation; // zoned event date properties. falsy if invalid resize\r\n // Tracks mouse movement over the *grid's* coordinate map\r\n var dragListener = this.dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n interactionStart: function () {\r\n isDragging = false;\r\n },\r\n dragStart: function (ev) {\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segResizeStart(seg, ev);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origHitFootprint = component.getSafeHitFootprint(origHit);\r\n var hitFootprint = component.getSafeHitFootprint(hit);\r\n var mutatedEventInstanceGroup;\r\n if (origHitFootprint && hitFootprint) {\r\n resizeMutation = isStart ?\r\n _this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, seg.footprint) :\r\n _this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, seg.footprint);\r\n if (resizeMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, resizeMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n resizeMutation = null;\r\n util_1.disableCursor();\r\n }\r\n else if (resizeMutation.isEmpty()) {\r\n // no change. (FYI, event dates might have zones)\r\n resizeMutation = null;\r\n }\r\n if (resizeMutation) {\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n view.renderEventResize(component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg);\r\n }\r\n },\r\n hitOut: function () {\r\n resizeMutation = null;\r\n },\r\n hitDone: function () {\r\n view.unrenderEventResize(seg);\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n if (isDragging) {\r\n _this.segResizeStop(seg, ev);\r\n }\r\n if (resizeMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventResize(eventInstance, resizeMutation, el, ev);\r\n }\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment resizing starts\r\n EventResizing.prototype.segResizeStart = function (seg, ev) {\r\n this.isResizing = true;\r\n this.component.publiclyTrigger('eventResizeStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment resizing stops\r\n EventResizing.prototype.segResizeStop = function (seg, ev) {\r\n this.isResizing = false;\r\n this.component.publiclyTrigger('eventResizeStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Returns new date-information for an event segment being resized from its start\r\n EventResizing.prototype.computeEventStartResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var startDelta = this.component.diffDates(endFootprint.unzonedRange.getStart(), startFootprint.unzonedRange.getStart());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getStart().add(startDelta) < origRange.getEnd()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setStartDelta(startDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n // Returns new date-information for an event segment being resized from its end\r\n EventResizing.prototype.computeEventEndResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {\r\n var origRange = origEventFootprint.componentFootprint.unzonedRange;\r\n var endDelta = this.component.diffDates(endFootprint.unzonedRange.getEnd(), startFootprint.unzonedRange.getEnd());\r\n var dateMutation;\r\n var eventDefMutation;\r\n if (origRange.getEnd().add(endDelta) > origRange.getStart()) {\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.setEndDelta(endDelta);\r\n eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(dateMutation);\r\n return eventDefMutation;\r\n }\r\n return false;\r\n };\r\n return EventResizing;\r\n}(Interaction_1.default));\r\nexports.default = EventResizing;\r\n\r\n\r\n/***/ }),\r\n/* 224 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventDefMutation_1 = __webpack_require__(37);\r\nvar EventDefDateMutation_1 = __webpack_require__(50);\r\nvar DragListener_1 = __webpack_require__(54);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar MouseFollower_1 = __webpack_require__(244);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar EventDragging = /** @class */ (function (_super) {\r\n tslib_1.__extends(EventDragging, _super);\r\n /*\r\n component implements:\r\n - bindSegHandlerToEl\r\n - publiclyTrigger\r\n - diffDates\r\n - eventRangesToEventFootprints\r\n - isEventInstanceGroupAllowed\r\n */\r\n function EventDragging(component, eventPointing) {\r\n var _this = _super.call(this, component) || this;\r\n _this.isDragging = false;\r\n _this.eventPointing = eventPointing;\r\n return _this;\r\n }\r\n EventDragging.prototype.end = function () {\r\n if (this.dragListener) {\r\n this.dragListener.endInteraction();\r\n }\r\n };\r\n EventDragging.prototype.getSelectionDelay = function () {\r\n var delay = this.opt('eventLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n EventDragging.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n component.bindSegHandlerToEl(el, 'mousedown', this.handleMousedown.bind(this));\r\n component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));\r\n };\r\n EventDragging.prototype.handleMousedown = function (seg, ev) {\r\n if (!this.component.shouldIgnoreMouse() &&\r\n this.component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, { distance: 5 });\r\n }\r\n };\r\n EventDragging.prototype.handleTouchStart = function (seg, ev) {\r\n var component = this.component;\r\n var settings = {\r\n delay: this.view.isEventDefSelected(seg.footprint.eventDef) ? // already selected?\r\n 0 : this.getSelectionDelay()\r\n };\r\n if (component.canStartDrag(seg, ev)) {\r\n this.buildDragListener(seg).startInteraction(ev, settings);\r\n }\r\n else if (component.canStartSelection(seg, ev)) {\r\n this.buildSelectListener(seg).startInteraction(ev, settings);\r\n }\r\n };\r\n // seg isn't draggable, but let's use a generic DragListener\r\n // simply for the delay, so it can be selected.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildSelectListener = function (seg) {\r\n var _this = this;\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n var dragListener = this.dragListener = new DragListener_1.default({\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n },\r\n interactionEnd: function (ev) {\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Builds a listener that will track user-dragging on an event segment.\r\n // Generic enough to work with any type of Grid.\r\n // Has side effect of setting/unsetting `dragListener`\r\n EventDragging.prototype.buildDragListener = function (seg) {\r\n var _this = this;\r\n var component = this.component;\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var eventManager = calendar.eventManager;\r\n var el = seg.el;\r\n var eventDef = seg.footprint.eventDef;\r\n var eventInstance = seg.footprint.eventInstance; // null for inverse-background events\r\n var isDragging;\r\n var mouseFollower; // A clone of the original element that will move with the mouse\r\n var eventDefMutation;\r\n if (this.dragListener) {\r\n return this.dragListener;\r\n }\r\n // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents\r\n // of the view.\r\n var dragListener = this.dragListener = new HitDragListener_1.default(view, {\r\n scroll: this.opt('dragScroll'),\r\n subjectEl: el,\r\n subjectCenter: true,\r\n interactionStart: function (ev) {\r\n seg.component = component; // for renderDrag\r\n isDragging = false;\r\n mouseFollower = new MouseFollower_1.default(seg.el, {\r\n additionalClass: 'fc-dragging',\r\n parentEl: view.el,\r\n opacity: dragListener.isTouch ? null : _this.opt('dragOpacity'),\r\n revertDuration: _this.opt('dragRevertDuration'),\r\n zIndex: 2 // one above the .fc-view\r\n });\r\n mouseFollower.hide(); // don't show until we know this is a real drag\r\n mouseFollower.start(ev);\r\n },\r\n dragStart: function (ev) {\r\n if (dragListener.isTouch &&\r\n !view.isEventDefSelected(eventDef) &&\r\n eventInstance) {\r\n // if not previously selected, will fire after a delay. then, select the event\r\n view.selectEventInstance(eventInstance);\r\n }\r\n isDragging = true;\r\n // ensure a mouseout on the manipulated event has been reported\r\n _this.eventPointing.handleMouseout(seg, ev);\r\n _this.segDragStart(seg, ev);\r\n view.hideEventsWithId(seg.footprint.eventDef.id);\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var isAllowed = true;\r\n var origFootprint;\r\n var footprint;\r\n var mutatedEventInstanceGroup;\r\n // starting hit could be forced (DayGrid.limit)\r\n if (seg.hit) {\r\n origHit = seg.hit;\r\n }\r\n // hit might not belong to this grid, so query origin grid\r\n origFootprint = origHit.component.getSafeHitFootprint(origHit);\r\n footprint = hit.component.getSafeHitFootprint(hit);\r\n if (origFootprint && footprint) {\r\n eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, eventDef);\r\n if (eventDefMutation) {\r\n mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, eventDefMutation);\r\n isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n }\r\n else {\r\n isAllowed = false;\r\n }\r\n if (!isAllowed) {\r\n eventDefMutation = null;\r\n util_1.disableCursor();\r\n }\r\n // if a valid drop location, have the subclass render a visual indication\r\n if (eventDefMutation &&\r\n view.renderDrag(// truthy if rendered something\r\n component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg, dragListener.isTouch)) {\r\n mouseFollower.hide(); // if the subclass is already using a mock event \"helper\", hide our own\r\n }\r\n else {\r\n mouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)\r\n }\r\n if (isOrig) {\r\n // needs to have moved hits to be a valid drop\r\n eventDefMutation = null;\r\n }\r\n },\r\n hitOut: function () {\r\n view.unrenderDrag(seg); // unrender whatever was done in renderDrag\r\n mouseFollower.show(); // show in case we are moving out of all hits\r\n eventDefMutation = null;\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev) {\r\n delete seg.component; // prevent side effects\r\n // do revert animation if hasn't changed. calls a callback when finished (whether animation or not)\r\n mouseFollower.stop(!eventDefMutation, function () {\r\n if (isDragging) {\r\n view.unrenderDrag(seg);\r\n _this.segDragStop(seg, ev);\r\n }\r\n view.showEventsWithId(seg.footprint.eventDef.id);\r\n if (eventDefMutation) {\r\n // no need to re-show original, will rerender all anyways. esp important if eventRenderWait\r\n view.reportEventDrop(eventInstance, eventDefMutation, el, ev);\r\n }\r\n });\r\n _this.dragListener = null;\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Called before event segment dragging starts\r\n EventDragging.prototype.segDragStart = function (seg, ev) {\r\n this.isDragging = true;\r\n this.component.publiclyTrigger('eventDragStart', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // Called after event segment dragging stops\r\n EventDragging.prototype.segDragStop = function (seg, ev) {\r\n this.isDragging = false;\r\n this.component.publiclyTrigger('eventDragStop', {\r\n context: seg.el[0],\r\n args: [\r\n seg.footprint.getEventLegacy(),\r\n ev,\r\n {},\r\n this.view\r\n ]\r\n });\r\n };\r\n // DOES NOT consider overlap/constraint\r\n EventDragging.prototype.computeEventDropMutation = function (startFootprint, endFootprint, eventDef) {\r\n var eventDefMutation = new EventDefMutation_1.default();\r\n eventDefMutation.setDateMutation(this.computeEventDateMutation(startFootprint, endFootprint));\r\n return eventDefMutation;\r\n };\r\n EventDragging.prototype.computeEventDateMutation = function (startFootprint, endFootprint) {\r\n var date0 = startFootprint.unzonedRange.getStart();\r\n var date1 = endFootprint.unzonedRange.getStart();\r\n var clearEnd = false;\r\n var forceTimed = false;\r\n var forceAllDay = false;\r\n var dateDelta;\r\n var dateMutation;\r\n if (startFootprint.isAllDay !== endFootprint.isAllDay) {\r\n clearEnd = true;\r\n if (endFootprint.isAllDay) {\r\n forceAllDay = true;\r\n date0.stripTime();\r\n }\r\n else {\r\n forceTimed = true;\r\n }\r\n }\r\n dateDelta = this.component.diffDates(date1, date0);\r\n dateMutation = new EventDefDateMutation_1.default();\r\n dateMutation.clearEnd = clearEnd;\r\n dateMutation.forceTimed = forceTimed;\r\n dateMutation.forceAllDay = forceAllDay;\r\n dateMutation.setDateDelta(dateDelta);\r\n return dateMutation;\r\n };\r\n return EventDragging;\r\n}(Interaction_1.default));\r\nexports.default = EventDragging;\r\n\r\n\r\n/***/ }),\r\n/* 225 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateSelecting = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateSelecting, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - renderHighlight\r\n - unrenderHighlight\r\n */\r\n function DateSelecting(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateSelecting.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateSelecting.prototype.getDelay = function () {\r\n var delay = this.opt('selectLongPressDelay');\r\n if (delay == null) {\r\n delay = this.opt('longPressDelay'); // fallback\r\n }\r\n return delay;\r\n };\r\n DateSelecting.prototype.bindToEl = function (el) {\r\n var _this = this;\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev, {\r\n distance: _this.opt('selectMinDistance')\r\n });\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (_this.opt('selectable') && !component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev, {\r\n delay: _this.getDelay()\r\n });\r\n }\r\n });\r\n util_1.preventSelection(el);\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day selecting.\r\n DateSelecting.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var selectionFootprint; // null if invalid selection\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n selectionFootprint = null;\r\n },\r\n dragStart: function (ev) {\r\n _this.view.unselect(ev); // since we could be rendering a new selection, we want to clear any old one\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n var origHitFootprint;\r\n var hitFootprint;\r\n if (origHit) {\r\n origHitFootprint = component.getSafeHitFootprint(origHit);\r\n hitFootprint = component.getSafeHitFootprint(hit);\r\n if (origHitFootprint && hitFootprint) {\r\n selectionFootprint = _this.computeSelection(origHitFootprint, hitFootprint);\r\n }\r\n else {\r\n selectionFootprint = null;\r\n }\r\n if (selectionFootprint) {\r\n component.renderSelectionFootprint(selectionFootprint);\r\n }\r\n else if (selectionFootprint === false) {\r\n util_1.disableCursor();\r\n }\r\n }\r\n },\r\n hitOut: function () {\r\n selectionFootprint = null;\r\n component.unrenderSelection();\r\n },\r\n hitDone: function () {\r\n util_1.enableCursor();\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n if (!isCancelled && selectionFootprint) {\r\n // the selection will already have been rendered. just report it\r\n _this.view.reportSelection(selectionFootprint, ev);\r\n }\r\n }\r\n });\r\n return dragListener;\r\n };\r\n // Given the first and last date-spans of a selection, returns another date-span object.\r\n // Subclasses can override and provide additional data in the span object. Will be passed to renderSelectionFootprint().\r\n // Will return false if the selection is invalid and this should be indicated to the user.\r\n // Will return null/undefined if a selection invalid but no error should be reported.\r\n DateSelecting.prototype.computeSelection = function (footprint0, footprint1) {\r\n var wholeFootprint = this.computeSelectionFootprint(footprint0, footprint1);\r\n if (wholeFootprint && !this.isSelectionFootprintAllowed(wholeFootprint)) {\r\n return false;\r\n }\r\n return wholeFootprint;\r\n };\r\n // Given two spans, must return the combination of the two.\r\n // TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.\r\n // Assumes both footprints are non-open-ended.\r\n DateSelecting.prototype.computeSelectionFootprint = function (footprint0, footprint1) {\r\n var ms = [\r\n footprint0.unzonedRange.startMs,\r\n footprint0.unzonedRange.endMs,\r\n footprint1.unzonedRange.startMs,\r\n footprint1.unzonedRange.endMs\r\n ];\r\n ms.sort(util_1.compareNumbers);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(ms[0], ms[3]), footprint0.isAllDay);\r\n };\r\n DateSelecting.prototype.isSelectionFootprintAllowed = function (componentFootprint) {\r\n return this.component.dateProfile.validUnzonedRange.containsRange(componentFootprint.unzonedRange) &&\r\n this.view.calendar.constraints.isSelectionFootprintAllowed(componentFootprint);\r\n };\r\n return DateSelecting;\r\n}(Interaction_1.default));\r\nexports.default = DateSelecting;\r\n\r\n\r\n/***/ }),\r\n/* 226 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar View_1 = __webpack_require__(41);\r\nvar TimeGrid_1 = __webpack_require__(227);\r\nvar DayGrid_1 = __webpack_require__(61);\r\nvar AGENDA_ALL_DAY_EVENT_LIMIT = 5;\r\nvar agendaTimeGridMethods;\r\nvar agendaDayGridMethods;\r\n/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\r\n// Responsible for managing width/height.\r\nvar AgendaView = /** @class */ (function (_super) {\r\n tslib_1.__extends(AgendaView, _super);\r\n function AgendaView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering\r\n _this.timeGrid = _this.instantiateTimeGrid();\r\n _this.addChild(_this.timeGrid);\r\n if (_this.opt('allDaySlot')) {\r\n _this.dayGrid = _this.instantiateDayGrid(); // the all-day subcomponent of this view\r\n _this.addChild(_this.dayGrid);\r\n }\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n // Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass\r\n AgendaView.prototype.instantiateTimeGrid = function () {\r\n var timeGrid = new this.timeGridClass(this);\r\n util_1.copyOwnProps(agendaTimeGridMethods, timeGrid);\r\n return timeGrid;\r\n };\r\n // Instantiates the DayGrid object this view might need. Draws from this.dayGridClass\r\n AgendaView.prototype.instantiateDayGrid = function () {\r\n var dayGrid = new this.dayGridClass(this);\r\n util_1.copyOwnProps(agendaDayGridMethods, dayGrid);\r\n return dayGrid;\r\n };\r\n /* Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.renderSkeleton = function () {\r\n var timeGridWrapEl;\r\n var timeGridEl;\r\n this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());\r\n this.scroller.render();\r\n timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container');\r\n timeGridEl = $('
').appendTo(timeGridWrapEl);\r\n this.el.find('.fc-body > tr > td').append(timeGridWrapEl);\r\n this.timeGrid.headContainerEl = this.el.find('.fc-head-container');\r\n this.timeGrid.setElement(timeGridEl);\r\n if (this.dayGrid) {\r\n this.dayGrid.setElement(this.el.find('.fc-day-grid'));\r\n // have the day-grid extend it's coordinate area over the
dividing the two grids\r\n this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();\r\n }\r\n };\r\n AgendaView.prototype.unrenderSkeleton = function () {\r\n this.timeGrid.removeElement();\r\n if (this.dayGrid) {\r\n this.dayGrid.removeElement();\r\n }\r\n this.scroller.destroy();\r\n };\r\n // Builds the HTML skeleton for the view.\r\n // The day-grid and time-grid components will render inside containers defined by this HTML.\r\n AgendaView.prototype.renderSkeletonHtml = function () {\r\n var theme = this.calendar.theme;\r\n return '' +\r\n '' +\r\n (this.opt('columnHeader') ?\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
 
' +\r\n (this.dayGrid ?\r\n '
' +\r\n '
' :\r\n '') +\r\n '
';\r\n };\r\n // Generates an HTML attribute string for setting the width of the axis, if it is known\r\n AgendaView.prototype.axisStyleAttr = function () {\r\n if (this.axisWidth != null) {\r\n return 'style=\"width:' + this.axisWidth + 'px\"';\r\n }\r\n return '';\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.getNowIndicatorUnit = function () {\r\n return this.timeGrid.getNowIndicatorUnit();\r\n };\r\n /* Dimensions\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Adjusts the vertical dimensions of the view to the specified values\r\n AgendaView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n var eventLimit;\r\n var scrollerHeight;\r\n var scrollbarWidths;\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n // make all axis cells line up, and record the width so newly created axis cells will have it\r\n this.axisWidth = util_1.matchCellWidths(this.el.find('.fc-axis'));\r\n // hack to give the view some height prior to timeGrid's columns being rendered\r\n // TODO: separate setting height from scroller VS timeGrid.\r\n if (!this.timeGrid.colEls) {\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n return;\r\n }\r\n // set of fake row elements that must compensate when scroller has scrollbars\r\n var noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)');\r\n // reset all dimensions back to the original state\r\n this.timeGrid.bottomRuleEl.hide(); // .show() will be called later if this
is necessary\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n util_1.uncompensateScroll(noScrollRowEls);\r\n // limit number of events in the all-day area\r\n if (this.dayGrid) {\r\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\r\n eventLimit = this.opt('eventLimit');\r\n if (eventLimit && typeof eventLimit !== 'number') {\r\n eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\r\n }\r\n if (eventLimit) {\r\n this.dayGrid.limitRows(eventLimit);\r\n }\r\n }\r\n if (!isAuto) {\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n scrollbarWidths = this.scroller.getScrollbarWidths();\r\n if (scrollbarWidths.left || scrollbarWidths.right) {\r\n // make the all-day and header rows lines up\r\n util_1.compensateScroll(noScrollRowEls, scrollbarWidths);\r\n // the scrollbar compensation might have changed text flow, which might affect height, so recalculate\r\n // and reapply the desired height to the scroller.\r\n scrollerHeight = this.computeScrollerHeight(totalHeight);\r\n this.scroller.setHeight(scrollerHeight);\r\n }\r\n // guarantees the same scrollbar widths\r\n this.scroller.lockOverflow(scrollbarWidths);\r\n // if there's any space below the slats, show the horizontal rule.\r\n // this won't cause any new overflow, because lockOverflow already called.\r\n if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {\r\n this.timeGrid.bottomRuleEl.show();\r\n }\r\n }\r\n };\r\n // given a desired total height of the view, returns what the height of the scroller should be\r\n AgendaView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n /* Scroll\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Computes the initial pre-configured scroll state prior to allowing the user to change it\r\n AgendaView.prototype.computeInitialDateScroll = function () {\r\n var scrollTime = moment.duration(this.opt('scrollTime'));\r\n var top = this.timeGrid.computeTimeTop(scrollTime);\r\n // zoom can give weird floating-point values. rather scroll a little bit further\r\n top = Math.ceil(top);\r\n if (top) {\r\n top++; // to overcome top border that slots beyond the first have. looks better\r\n }\r\n return { top: top };\r\n };\r\n AgendaView.prototype.queryDateScroll = function () {\r\n return { top: this.scroller.getScrollTop() };\r\n };\r\n AgendaView.prototype.applyDateScroll = function (scroll) {\r\n if (scroll.top !== undefined) {\r\n this.scroller.setScrollTop(scroll.top);\r\n }\r\n };\r\n /* Hit Areas\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // forward all hit-related method calls to the grids (dayGrid might not be defined)\r\n AgendaView.prototype.getHitFootprint = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitFootprint(hit);\r\n };\r\n AgendaView.prototype.getHitEl = function (hit) {\r\n // TODO: hit.component is set as a hack to identify where the hit came from\r\n return hit.component.getHitEl(hit);\r\n };\r\n /* Event Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n AgendaView.prototype.executeEventRender = function (eventsPayload) {\r\n var dayEventsPayload = {};\r\n var timedEventsPayload = {};\r\n var id;\r\n var eventInstanceGroup;\r\n // separate the events into all-day and timed\r\n for (id in eventsPayload) {\r\n eventInstanceGroup = eventsPayload[id];\r\n if (eventInstanceGroup.getEventDef().isAllDay()) {\r\n dayEventsPayload[id] = eventInstanceGroup;\r\n }\r\n else {\r\n timedEventsPayload[id] = eventInstanceGroup;\r\n }\r\n }\r\n this.timeGrid.executeEventRender(timedEventsPayload);\r\n if (this.dayGrid) {\r\n this.dayGrid.executeEventRender(dayEventsPayload);\r\n }\r\n };\r\n /* Dragging/Resizing Routing\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n AgendaView.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n var renderedHelper = false;\r\n renderedHelper = this.timeGrid.renderDrag(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n renderedHelper = this.dayGrid.renderDrag(groups.allDay, seg, isTouch) || renderedHelper;\r\n }\r\n return renderedHelper;\r\n };\r\n AgendaView.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n var groups = groupEventFootprintsByAllDay(eventFootprints);\r\n this.timeGrid.renderEventResize(groups.timed, seg, isTouch);\r\n if (this.dayGrid) {\r\n this.dayGrid.renderEventResize(groups.allDay, seg, isTouch);\r\n }\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection\r\n AgendaView.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (!componentFootprint.isAllDay) {\r\n this.timeGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n else if (this.dayGrid) {\r\n this.dayGrid.renderSelectionFootprint(componentFootprint);\r\n }\r\n };\r\n return AgendaView;\r\n}(View_1.default));\r\nexports.default = AgendaView;\r\nAgendaView.prototype.timeGridClass = TimeGrid_1.default;\r\nAgendaView.prototype.dayGridClass = DayGrid_1.default;\r\n// Will customize the rendering behavior of the AgendaView's timeGrid\r\nagendaTimeGridMethods = {\r\n // Generates the HTML that will go before the day-of week header cells\r\n renderHeadIntroHtml: function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var weekStart = calendar.msToUtcMoment(this.dateProfile.renderUnzonedRange.startMs, true);\r\n var weekText;\r\n if (this.opt('weekNumbers')) {\r\n weekText = weekStart.format(this.opt('smallWeekFormat'));\r\n return '' +\r\n '' +\r\n view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\r\n { date: weekStart, type: 'week', forceOff: this.colCnt > 1 }, util_1.htmlEscape(weekText) // inner HTML\r\n ) +\r\n '';\r\n }\r\n else {\r\n return '';\r\n }\r\n },\r\n // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\n// Will customize the rendering behavior of the AgendaView's dayGrid\r\nagendaDayGridMethods = {\r\n // Generates the HTML that goes before the all-day cells\r\n renderBgIntroHtml: function () {\r\n var view = this.view;\r\n return '' +\r\n '' +\r\n '' + // needed for matchCellWidths\r\n view.getAllDayHtml() +\r\n '' +\r\n '';\r\n },\r\n // Generates the HTML that goes before all other types of cells.\r\n // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.\r\n renderIntroHtml: function () {\r\n var view = this.view;\r\n return '';\r\n }\r\n};\r\nfunction groupEventFootprintsByAllDay(eventFootprints) {\r\n var allDay = [];\r\n var timed = [];\r\n var i;\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n if (eventFootprints[i].componentFootprint.isAllDay) {\r\n allDay.push(eventFootprints[i]);\r\n }\r\n else {\r\n timed.push(eventFootprints[i]);\r\n }\r\n }\r\n return { allDay: allDay, timed: timed };\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 227 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar InteractiveDateComponent_1 = __webpack_require__(40);\r\nvar BusinessHourRenderer_1 = __webpack_require__(56);\r\nvar StandardInteractionsMixin_1 = __webpack_require__(60);\r\nvar DayTableMixin_1 = __webpack_require__(55);\r\nvar CoordCache_1 = __webpack_require__(53);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar ComponentFootprint_1 = __webpack_require__(12);\r\nvar TimeGridEventRenderer_1 = __webpack_require__(246);\r\nvar TimeGridHelperRenderer_1 = __webpack_require__(247);\r\nvar TimeGridFillRenderer_1 = __webpack_require__(248);\r\n/* A component that renders one or more columns of vertical time slots\r\n----------------------------------------------------------------------------------------------------------------------*/\r\n// We mixin DayTable, even though there is only a single row of days\r\n// potential nice values for the slot-duration and interval-duration\r\n// from largest to smallest\r\nvar AGENDA_STOCK_SUB_DURATIONS = [\r\n { hours: 1 },\r\n { minutes: 30 },\r\n { minutes: 15 },\r\n { seconds: 30 },\r\n { seconds: 15 }\r\n];\r\nvar TimeGrid = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGrid, _super);\r\n function TimeGrid(view) {\r\n var _this = _super.call(this, view) || this;\r\n _this.processOptions();\r\n return _this;\r\n }\r\n // Slices up the given span (unzoned start/end with other misc data) into an array of segments\r\n TimeGrid.prototype.componentFootprintToSegs = function (componentFootprint) {\r\n var segs = this.sliceRangeByTimes(componentFootprint.unzonedRange);\r\n var i;\r\n for (i = 0; i < segs.length; i++) {\r\n if (this.isRTL) {\r\n segs[i].col = this.daysPerRow - 1 - segs[i].dayIndex;\r\n }\r\n else {\r\n segs[i].col = segs[i].dayIndex;\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Date Handling\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.sliceRangeByTimes = function (unzonedRange) {\r\n var segs = [];\r\n var segRange;\r\n var dayIndex;\r\n for (dayIndex = 0; dayIndex < this.daysPerRow; dayIndex++) {\r\n segRange = unzonedRange.intersect(this.dayRanges[dayIndex]);\r\n if (segRange) {\r\n segs.push({\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n });\r\n }\r\n }\r\n return segs;\r\n };\r\n /* Options\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Parses various options into properties of this object\r\n TimeGrid.prototype.processOptions = function () {\r\n var slotDuration = this.opt('slotDuration');\r\n var snapDuration = this.opt('snapDuration');\r\n var input;\r\n slotDuration = moment.duration(slotDuration);\r\n snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;\r\n this.slotDuration = slotDuration;\r\n this.snapDuration = snapDuration;\r\n this.snapsPerSlot = slotDuration / snapDuration; // TODO: ensure an integer multiple?\r\n // might be an array value (for TimelineView).\r\n // if so, getting the most granular entry (the last one probably).\r\n input = this.opt('slotLabelFormat');\r\n if ($.isArray(input)) {\r\n input = input[input.length - 1];\r\n }\r\n this.labelFormat = input ||\r\n this.opt('smallTimeFormat'); // the computed default\r\n input = this.opt('slotLabelInterval');\r\n this.labelInterval = input ?\r\n moment.duration(input) :\r\n this.computeLabelInterval(slotDuration);\r\n };\r\n // Computes an automatic value for slotLabelInterval\r\n TimeGrid.prototype.computeLabelInterval = function (slotDuration) {\r\n var i;\r\n var labelInterval;\r\n var slotsPerLabel;\r\n // find the smallest stock label interval that results in more than one slots-per-label\r\n for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {\r\n labelInterval = moment.duration(AGENDA_STOCK_SUB_DURATIONS[i]);\r\n slotsPerLabel = util_1.divideDurationByDuration(labelInterval, slotDuration);\r\n if (util_1.isInt(slotsPerLabel) && slotsPerLabel > 1) {\r\n return labelInterval;\r\n }\r\n }\r\n return moment.duration(slotDuration); // fall back. clone\r\n };\r\n /* Date Rendering\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.renderDates = function (dateProfile) {\r\n this.dateProfile = dateProfile;\r\n this.updateDayTable();\r\n this.renderSlats();\r\n this.renderColumns();\r\n };\r\n TimeGrid.prototype.unrenderDates = function () {\r\n // this.unrenderSlats(); // don't need this because repeated .html() calls clear\r\n this.unrenderColumns();\r\n };\r\n TimeGrid.prototype.renderSkeleton = function () {\r\n var theme = this.view.calendar.theme;\r\n this.el.html('
' +\r\n '
' +\r\n '
');\r\n this.bottomRuleEl = this.el.find('hr');\r\n };\r\n TimeGrid.prototype.renderSlats = function () {\r\n var theme = this.view.calendar.theme;\r\n this.slatContainerEl = this.el.find('> .fc-slats')\r\n .html(// avoids needing ::unrenderSlats()\r\n '' +\r\n this.renderSlatRowHtml() +\r\n '
');\r\n this.slatEls = this.slatContainerEl.find('tr');\r\n this.slatCoordCache = new CoordCache_1.default({\r\n els: this.slatEls,\r\n isVertical: true\r\n });\r\n };\r\n // Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\r\n TimeGrid.prototype.renderSlatRowHtml = function () {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var isRTL = this.isRTL;\r\n var dateProfile = this.dateProfile;\r\n var html = '';\r\n var slotTime = moment.duration(+dateProfile.minTime); // wish there was .clone() for durations\r\n var slotIterator = moment.duration(0);\r\n var slotDate; // will be on the view's first day, but we only care about its time\r\n var isLabeled;\r\n var axisHtml;\r\n // Calculate the time for each slot\r\n while (slotTime < dateProfile.maxTime) {\r\n slotDate = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs).time(slotTime);\r\n isLabeled = util_1.isInt(util_1.divideDurationByDuration(slotIterator, this.labelInterval));\r\n axisHtml =\r\n '' +\r\n (isLabeled ?\r\n '' + // for matchCellWidths\r\n util_1.htmlEscape(slotDate.format(this.labelFormat)) +\r\n '' :\r\n '') +\r\n '';\r\n html +=\r\n '' +\r\n (!isRTL ? axisHtml : '') +\r\n '' +\r\n (isRTL ? axisHtml : '') +\r\n '';\r\n slotTime.add(this.slotDuration);\r\n slotIterator.add(this.slotDuration);\r\n }\r\n return html;\r\n };\r\n TimeGrid.prototype.renderColumns = function () {\r\n var dateProfile = this.dateProfile;\r\n var theme = this.view.calendar.theme;\r\n this.dayRanges = this.dayDates.map(function (dayDate) {\r\n return new UnzonedRange_1.default(dayDate.clone().add(dateProfile.minTime), dayDate.clone().add(dateProfile.maxTime));\r\n });\r\n if (this.headContainerEl) {\r\n this.headContainerEl.html(this.renderHeadHtml());\r\n }\r\n this.el.find('> .fc-bg').html('' +\r\n this.renderBgTrHtml(0) + // row=0\r\n '
');\r\n this.colEls = this.el.find('.fc-day, .fc-disabled-day');\r\n this.colCoordCache = new CoordCache_1.default({\r\n els: this.colEls,\r\n isHorizontal: true\r\n });\r\n this.renderContentSkeleton();\r\n };\r\n TimeGrid.prototype.unrenderColumns = function () {\r\n this.unrenderContentSkeleton();\r\n };\r\n /* Content Skeleton\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders the DOM that the view's content will live in\r\n TimeGrid.prototype.renderContentSkeleton = function () {\r\n var cellHtml = '';\r\n var i;\r\n var skeletonEl;\r\n for (i = 0; i < this.colCnt; i++) {\r\n cellHtml +=\r\n '' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '
' +\r\n '';\r\n }\r\n skeletonEl = this.contentSkeletonEl = $('
' +\r\n '' +\r\n '' + cellHtml + '' +\r\n '
' +\r\n '
');\r\n this.colContainerEls = skeletonEl.find('.fc-content-col');\r\n this.helperContainerEls = skeletonEl.find('.fc-helper-container');\r\n this.fgContainerEls = skeletonEl.find('.fc-event-container:not(.fc-helper-container)');\r\n this.bgContainerEls = skeletonEl.find('.fc-bgevent-container');\r\n this.highlightContainerEls = skeletonEl.find('.fc-highlight-container');\r\n this.businessContainerEls = skeletonEl.find('.fc-business-container');\r\n this.bookendCells(skeletonEl.find('tr')); // TODO: do this on string level\r\n this.el.append(skeletonEl);\r\n };\r\n TimeGrid.prototype.unrenderContentSkeleton = function () {\r\n if (this.contentSkeletonEl) {\r\n this.contentSkeletonEl.remove();\r\n this.contentSkeletonEl = null;\r\n this.colContainerEls = null;\r\n this.helperContainerEls = null;\r\n this.fgContainerEls = null;\r\n this.bgContainerEls = null;\r\n this.highlightContainerEls = null;\r\n this.businessContainerEls = null;\r\n }\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\r\n TimeGrid.prototype.groupSegsByCol = function (segs) {\r\n var segsByCol = [];\r\n var i;\r\n for (i = 0; i < this.colCnt; i++) {\r\n segsByCol.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segsByCol[segs[i].col].push(segs[i]);\r\n }\r\n return segsByCol;\r\n };\r\n // Given segments grouped by column, insert the segments' elements into a parallel array of container\r\n // elements, each living within a column.\r\n TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {\r\n var col;\r\n var segs;\r\n var i;\r\n for (col = 0; col < this.colCnt; col++) {\r\n segs = segsByCol[col];\r\n for (i = 0; i < segs.length; i++) {\r\n containerEls.eq(col).append(segs[i].el);\r\n }\r\n }\r\n };\r\n /* Now Indicator\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.getNowIndicatorUnit = function () {\r\n return 'minute'; // will refresh on the minute\r\n };\r\n TimeGrid.prototype.renderNowIndicator = function (date) {\r\n // HACK: if date columns not ready for some reason (scheduler)\r\n if (!this.colContainerEls) {\r\n return;\r\n }\r\n // seg system might be overkill, but it handles scenario where line needs to be rendered\r\n // more than once because of columns with the same date (resources columns for example)\r\n var segs = this.componentFootprintToSegs(new ComponentFootprint_1.default(new UnzonedRange_1.default(date, date.valueOf() + 1), // protect against null range\r\n false // all-day\r\n ));\r\n var top = this.computeDateTop(date, date);\r\n var nodes = [];\r\n var i;\r\n // render lines within the columns\r\n for (i = 0; i < segs.length; i++) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.colContainerEls.eq(segs[i].col))[0]);\r\n }\r\n // render an arrow over the axis\r\n if (segs.length > 0) {\r\n nodes.push($('
')\r\n .css('top', top)\r\n .appendTo(this.el.find('.fc-content-skeleton'))[0]);\r\n }\r\n this.nowIndicatorEls = $(nodes);\r\n };\r\n TimeGrid.prototype.unrenderNowIndicator = function () {\r\n if (this.nowIndicatorEls) {\r\n this.nowIndicatorEls.remove();\r\n this.nowIndicatorEls = null;\r\n }\r\n };\r\n /* Coordinates\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.slatCoordCache.build();\r\n if (isResize) {\r\n this.updateSegVerticals([].concat(this.eventRenderer.getSegs(), this.businessSegs || []));\r\n }\r\n };\r\n TimeGrid.prototype.getTotalSlatHeight = function () {\r\n return this.slatContainerEl.outerHeight();\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given date.\r\n // `ms` can be a millisecond UTC time OR a UTC moment.\r\n // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\r\n TimeGrid.prototype.computeDateTop = function (ms, startOfDayDate) {\r\n return this.computeTimeTop(moment.duration(ms - startOfDayDate.clone().stripTime()));\r\n };\r\n // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\r\n TimeGrid.prototype.computeTimeTop = function (time) {\r\n var len = this.slatEls.length;\r\n var dateProfile = this.dateProfile;\r\n var slatCoverage = (time - dateProfile.minTime) / this.slotDuration; // floating-point value of # of slots covered\r\n var slatIndex;\r\n var slatRemainder;\r\n // compute a floating-point number for how many slats should be progressed through.\r\n // from 0 to number of slats (inclusive)\r\n // constrained because minTime/maxTime might be customized.\r\n slatCoverage = Math.max(0, slatCoverage);\r\n slatCoverage = Math.min(len, slatCoverage);\r\n // an integer index of the furthest whole slat\r\n // from 0 to number slats (*exclusive*, so len-1)\r\n slatIndex = Math.floor(slatCoverage);\r\n slatIndex = Math.min(slatIndex, len - 1);\r\n // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.\r\n // could be 1.0 if slatCoverage is covering *all* the slots\r\n slatRemainder = slatCoverage - slatIndex;\r\n return this.slatCoordCache.getTopPosition(slatIndex) +\r\n this.slatCoordCache.getHeight(slatIndex) * slatRemainder;\r\n };\r\n // Refreshes the CSS top/bottom coordinates for each segment element.\r\n // Works when called after initial render, after a window resize/zoom for example.\r\n TimeGrid.prototype.updateSegVerticals = function (segs) {\r\n this.computeSegVerticals(segs);\r\n this.assignSegVerticals(segs);\r\n };\r\n // For each segment in an array, computes and assigns its top and bottom properties\r\n TimeGrid.prototype.computeSegVerticals = function (segs) {\r\n var eventMinHeight = this.opt('agendaEventMinHeight');\r\n var i;\r\n var seg;\r\n var dayDate;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n dayDate = this.dayDates[seg.dayIndex];\r\n seg.top = this.computeDateTop(seg.startMs, dayDate);\r\n seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.endMs, dayDate));\r\n }\r\n };\r\n // Given segments that already have their top/bottom properties computed, applies those values to\r\n // the segments' elements.\r\n TimeGrid.prototype.assignSegVerticals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateSegVerticalCss(seg));\r\n }\r\n };\r\n // Generates an object with CSS properties for the top/bottom coordinates of a segment element\r\n TimeGrid.prototype.generateSegVerticalCss = function (seg) {\r\n return {\r\n top: seg.top,\r\n bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\r\n };\r\n };\r\n /* Hit System\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n TimeGrid.prototype.prepareHits = function () {\r\n this.colCoordCache.build();\r\n this.slatCoordCache.build();\r\n };\r\n TimeGrid.prototype.releaseHits = function () {\r\n this.colCoordCache.clear();\r\n // NOTE: don't clear slatCoordCache because we rely on it for computeTimeTop\r\n };\r\n TimeGrid.prototype.queryHit = function (leftOffset, topOffset) {\r\n var snapsPerSlot = this.snapsPerSlot;\r\n var colCoordCache = this.colCoordCache;\r\n var slatCoordCache = this.slatCoordCache;\r\n if (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {\r\n var colIndex = colCoordCache.getHorizontalIndex(leftOffset);\r\n var slatIndex = slatCoordCache.getVerticalIndex(topOffset);\r\n if (colIndex != null && slatIndex != null) {\r\n var slatTop = slatCoordCache.getTopOffset(slatIndex);\r\n var slatHeight = slatCoordCache.getHeight(slatIndex);\r\n var partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1\r\n var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat\r\n var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;\r\n var snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;\r\n var snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;\r\n return {\r\n col: colIndex,\r\n snap: snapIndex,\r\n component: this,\r\n left: colCoordCache.getLeftOffset(colIndex),\r\n right: colCoordCache.getRightOffset(colIndex),\r\n top: snapTop,\r\n bottom: snapBottom\r\n };\r\n }\r\n }\r\n };\r\n TimeGrid.prototype.getHitFootprint = function (hit) {\r\n var start = this.getCellDate(0, hit.col); // row=0\r\n var time = this.computeSnapTime(hit.snap); // pass in the snap-index\r\n var end;\r\n start.time(time);\r\n end = start.clone().add(this.snapDuration);\r\n return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), false // all-day?\r\n );\r\n };\r\n // Given a row number of the grid, representing a \"snap\", returns a time (Duration) from its start-of-day\r\n TimeGrid.prototype.computeSnapTime = function (snapIndex) {\r\n return moment.duration(this.dateProfile.minTime + this.snapDuration * snapIndex);\r\n };\r\n TimeGrid.prototype.getHitEl = function (hit) {\r\n return this.colEls.eq(hit.col);\r\n };\r\n /* Event Drag Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being dragged over the specified date(s).\r\n // A returned value of `true` signals that a mock \"helper\" event has been rendered.\r\n TimeGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {\r\n var i;\r\n if (seg) {\r\n if (eventFootprints.length) {\r\n this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);\r\n // signal that a helper has been rendered\r\n return true;\r\n }\r\n }\r\n else {\r\n for (i = 0; i < eventFootprints.length; i++) {\r\n this.renderHighlight(eventFootprints[i].componentFootprint);\r\n }\r\n }\r\n };\r\n // Unrenders any visual indication of an event being dragged\r\n TimeGrid.prototype.unrenderDrag = function () {\r\n this.unrenderHighlight();\r\n this.helperRenderer.unrender();\r\n };\r\n /* Event Resize Visualization\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of an event being resized\r\n TimeGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {\r\n this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);\r\n };\r\n // Unrenders any visual indication of an event being resized\r\n TimeGrid.prototype.unrenderEventResize = function () {\r\n this.helperRenderer.unrender();\r\n };\r\n /* Selection\r\n ------------------------------------------------------------------------------------------------------------------*/\r\n // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\r\n TimeGrid.prototype.renderSelectionFootprint = function (componentFootprint) {\r\n if (this.opt('selectHelper')) {\r\n this.helperRenderer.renderComponentFootprint(componentFootprint);\r\n }\r\n else {\r\n this.renderHighlight(componentFootprint);\r\n }\r\n };\r\n // Unrenders any visual indication of a selection\r\n TimeGrid.prototype.unrenderSelection = function () {\r\n this.helperRenderer.unrender();\r\n this.unrenderHighlight();\r\n };\r\n return TimeGrid;\r\n}(InteractiveDateComponent_1.default));\r\nexports.default = TimeGrid;\r\nTimeGrid.prototype.eventRendererClass = TimeGridEventRenderer_1.default;\r\nTimeGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;\r\nTimeGrid.prototype.helperRendererClass = TimeGridHelperRenderer_1.default;\r\nTimeGrid.prototype.fillRendererClass = TimeGridFillRenderer_1.default;\r\nStandardInteractionsMixin_1.default.mixInto(TimeGrid);\r\nDayTableMixin_1.default.mixInto(TimeGrid);\r\n\r\n\r\n/***/ }),\r\n/* 228 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar DateProfileGenerator_1 = __webpack_require__(221);\r\nvar BasicViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(BasicViewDateProfileGenerator, _super);\r\n function BasicViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n BasicViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay); // an UnzonedRange\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n // year and month views should be aligned with weeks. this is already done for week\r\n if (/^(year|month)$/.test(currentRangeUnit)) {\r\n start.startOf('week');\r\n // make end-of-week if not already\r\n if (end.weekday()) {\r\n end.add(1, 'week').startOf('week'); // exclusively move backwards\r\n }\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return BasicViewDateProfileGenerator;\r\n}(DateProfileGenerator_1.default));\r\nexports.default = BasicViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 229 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar moment = __webpack_require__(0);\r\nvar util_1 = __webpack_require__(4);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthViewDateProfileGenerator_1 = __webpack_require__(253);\r\n/* A month view with day cells running in rows (one-per-week) and columns\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MonthView = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthView, _super);\r\n function MonthView() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Overrides the default BasicView behavior to have special multi-week auto-height logic\r\n MonthView.prototype.setGridHeight = function (height, isAuto) {\r\n // if auto, make the height of each row the height that it would be if there were 6 weeks\r\n if (isAuto) {\r\n height *= this.dayGrid.rowCnt / 6;\r\n }\r\n util_1.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\r\n };\r\n MonthView.prototype.isDateInOtherMonth = function (date, dateProfile) {\r\n return date.month() !== moment.utc(dateProfile.currentUnzonedRange.startMs).month(); // TODO: optimize\r\n };\r\n return MonthView;\r\n}(BasicView_1.default));\r\nexports.default = MonthView;\r\nMonthView.prototype.dateProfileGeneratorClass = MonthViewDateProfileGenerator_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 230 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar View_1 = __webpack_require__(41);\r\nvar Scroller_1 = __webpack_require__(39);\r\nvar ListEventRenderer_1 = __webpack_require__(254);\r\nvar ListEventPointing_1 = __webpack_require__(255);\r\n/*\r\nResponsible for the scroller, and forwarding event-related actions into the \"grid\".\r\n*/\r\nvar ListView = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListView, _super);\r\n function ListView(calendar, viewSpec) {\r\n var _this = _super.call(this, calendar, viewSpec) || this;\r\n _this.segSelector = '.fc-list-item'; // which elements accept event actions\r\n _this.scroller = new Scroller_1.default({\r\n overflowX: 'hidden',\r\n overflowY: 'auto'\r\n });\r\n return _this;\r\n }\r\n ListView.prototype.renderSkeleton = function () {\r\n this.el.addClass('fc-list-view ' +\r\n this.calendar.theme.getClass('listView'));\r\n this.scroller.render();\r\n this.scroller.el.appendTo(this.el);\r\n this.contentEl = this.scroller.scrollEl; // shortcut\r\n };\r\n ListView.prototype.unrenderSkeleton = function () {\r\n this.scroller.destroy(); // will remove the Grid too\r\n };\r\n ListView.prototype.updateSize = function (totalHeight, isAuto, isResize) {\r\n _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);\r\n this.scroller.clear(); // sets height to 'auto' and clears overflow\r\n if (!isAuto) {\r\n this.scroller.setHeight(this.computeScrollerHeight(totalHeight));\r\n }\r\n };\r\n ListView.prototype.computeScrollerHeight = function (totalHeight) {\r\n return totalHeight -\r\n util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\r\n };\r\n ListView.prototype.renderDates = function (dateProfile) {\r\n var calendar = this.calendar;\r\n var dayStart = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs, true);\r\n var viewEnd = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.endMs, true);\r\n var dayDates = [];\r\n var dayRanges = [];\r\n while (dayStart < viewEnd) {\r\n dayDates.push(dayStart.clone());\r\n dayRanges.push(new UnzonedRange_1.default(dayStart, dayStart.clone().add(1, 'day')));\r\n dayStart.add(1, 'day');\r\n }\r\n this.dayDates = dayDates;\r\n this.dayRanges = dayRanges;\r\n // all real rendering happens in EventRenderer\r\n };\r\n // slices by day\r\n ListView.prototype.componentFootprintToSegs = function (footprint) {\r\n var dayRanges = this.dayRanges;\r\n var dayIndex;\r\n var segRange;\r\n var seg;\r\n var segs = [];\r\n for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {\r\n segRange = footprint.unzonedRange.intersect(dayRanges[dayIndex]);\r\n if (segRange) {\r\n seg = {\r\n startMs: segRange.startMs,\r\n endMs: segRange.endMs,\r\n isStart: segRange.isStart,\r\n isEnd: segRange.isEnd,\r\n dayIndex: dayIndex\r\n };\r\n segs.push(seg);\r\n // detect when footprint won't go fully into the next day,\r\n // and mutate the latest seg to the be the end.\r\n if (!seg.isEnd && !footprint.isAllDay &&\r\n dayIndex + 1 < dayRanges.length &&\r\n footprint.unzonedRange.endMs < dayRanges[dayIndex + 1].startMs + this.nextDayThreshold) {\r\n seg.endMs = footprint.unzonedRange.endMs;\r\n seg.isEnd = true;\r\n break;\r\n }\r\n }\r\n }\r\n return segs;\r\n };\r\n ListView.prototype.renderEmptyMessage = function () {\r\n this.contentEl.html('
' + // TODO: try less wraps\r\n '
' +\r\n '
' +\r\n util_1.htmlEscape(this.opt('noEventsMessage')) +\r\n '
' +\r\n '
' +\r\n '
');\r\n };\r\n // render the event segments in the view\r\n ListView.prototype.renderSegList = function (allSegs) {\r\n var segsByDay = this.groupSegsByDay(allSegs); // sparse array\r\n var dayIndex;\r\n var daySegs;\r\n var i;\r\n var tableEl = $('
');\r\n var tbodyEl = tableEl.find('tbody');\r\n for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {\r\n daySegs = segsByDay[dayIndex];\r\n if (daySegs) {\r\n // append a day header\r\n tbodyEl.append(this.dayHeaderHtml(this.dayDates[dayIndex]));\r\n this.eventRenderer.sortEventSegs(daySegs);\r\n for (i = 0; i < daySegs.length; i++) {\r\n tbodyEl.append(daySegs[i].el); // append event row\r\n }\r\n }\r\n }\r\n this.contentEl.empty().append(tableEl);\r\n };\r\n // Returns a sparse array of arrays, segs grouped by their dayIndex\r\n ListView.prototype.groupSegsByDay = function (segs) {\r\n var segsByDay = []; // sparse array\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))\r\n .push(seg);\r\n }\r\n return segsByDay;\r\n };\r\n // generates the HTML for the day headers that live amongst the event rows\r\n ListView.prototype.dayHeaderHtml = function (dayDate) {\r\n var mainFormat = this.opt('listDayFormat');\r\n var altFormat = this.opt('listDayAltFormat');\r\n return '' +\r\n '' +\r\n (mainFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-main' }, util_1.htmlEscape(dayDate.format(mainFormat)) // inner HTML\r\n ) :\r\n '') +\r\n (altFormat ?\r\n this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-alt' }, util_1.htmlEscape(dayDate.format(altFormat)) // inner HTML\r\n ) :\r\n '') +\r\n '' +\r\n '';\r\n };\r\n return ListView;\r\n}(View_1.default));\r\nexports.default = ListView;\r\nListView.prototype.eventRendererClass = ListEventRenderer_1.default;\r\nListView.prototype.eventPointingClass = ListEventPointing_1.default;\r\n\r\n\r\n/***/ }),\r\n/* 231 */,\r\n/* 232 */,\r\n/* 233 */,\r\n/* 234 */,\r\n/* 235 */,\r\n/* 236 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nvar $ = __webpack_require__(3);\r\nvar exportHooks = __webpack_require__(16);\r\nvar util_1 = __webpack_require__(4);\r\nvar Calendar_1 = __webpack_require__(220);\r\n// for intentional side-effects\r\n__webpack_require__(10);\r\n__webpack_require__(47);\r\n__webpack_require__(256);\r\n__webpack_require__(257);\r\n__webpack_require__(260);\r\n__webpack_require__(261);\r\n__webpack_require__(262);\r\n__webpack_require__(263);\r\n$.fullCalendar = exportHooks;\r\n$.fn.fullCalendar = function (options) {\r\n var args = Array.prototype.slice.call(arguments, 1); // for a possible method call\r\n var res = this; // what this function will return (this jQuery object by default)\r\n this.each(function (i, _element) {\r\n var element = $(_element);\r\n var calendar = element.data('fullCalendar'); // get the existing calendar object (if any)\r\n var singleRes; // the returned value of this single method call\r\n // a method call\r\n if (typeof options === 'string') {\r\n if (options === 'getCalendar') {\r\n if (!i) {\r\n res = calendar;\r\n }\r\n }\r\n else if (options === 'destroy') {\r\n if (calendar) {\r\n calendar.destroy();\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else if (!calendar) {\r\n util_1.warn('Attempting to call a FullCalendar method on an element with no calendar.');\r\n }\r\n else if ($.isFunction(calendar[options])) {\r\n singleRes = calendar[options].apply(calendar, args);\r\n if (!i) {\r\n res = singleRes; // record the first method call result\r\n }\r\n if (options === 'destroy') {\r\n element.removeData('fullCalendar');\r\n }\r\n }\r\n else {\r\n util_1.warn(\"'\" + options + \"' is an unknown FullCalendar method.\");\r\n }\r\n }\r\n else if (!calendar) {\r\n calendar = new Calendar_1.default(element, options);\r\n element.data('fullCalendar', calendar);\r\n calendar.render();\r\n }\r\n });\r\n return res;\r\n};\r\nmodule.exports = exportHooks;\r\n\r\n\r\n/***/ }),\r\n/* 237 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Model_1 = __webpack_require__(48);\r\nvar Component = /** @class */ (function (_super) {\r\n tslib_1.__extends(Component, _super);\r\n function Component() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Component.prototype.setElement = function (el) {\r\n this.el = el;\r\n this.bindGlobalHandlers();\r\n this.renderSkeleton();\r\n this.set('isInDom', true);\r\n };\r\n Component.prototype.removeElement = function () {\r\n this.unset('isInDom');\r\n this.unrenderSkeleton();\r\n this.unbindGlobalHandlers();\r\n this.el.remove();\r\n // NOTE: don't null-out this.el in case the View was destroyed within an API callback.\r\n // We don't null-out the View's other jQuery element references upon destroy,\r\n // so we shouldn't kill this.el either.\r\n };\r\n Component.prototype.bindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n Component.prototype.unbindGlobalHandlers = function () {\r\n // subclasses can override\r\n };\r\n /*\r\n NOTE: Can't have a `render` method. Read the deprecation notice in View::executeDateRender\r\n */\r\n // Renders the basic structure of the view before any content is rendered\r\n Component.prototype.renderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n // Unrenders the basic structure of the view\r\n Component.prototype.unrenderSkeleton = function () {\r\n // subclasses should implement\r\n };\r\n return Component;\r\n}(Model_1.default));\r\nexports.default = Component;\r\n\r\n\r\n/***/ }),\r\n/* 238 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Iterator = /** @class */ (function () {\r\n function Iterator(items) {\r\n this.items = items || [];\r\n }\r\n /* Calls a method on every item passing the arguments through */\r\n Iterator.prototype.proxyCall = function (methodName) {\r\n var args = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n args[_i - 1] = arguments[_i];\r\n }\r\n var results = [];\r\n this.items.forEach(function (item) {\r\n results.push(item[methodName].apply(item, args));\r\n });\r\n return results;\r\n };\r\n return Iterator;\r\n}());\r\nexports.default = Iterator;\r\n\r\n\r\n/***/ }),\r\n/* 239 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\n/* Toolbar with buttons and title\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar Toolbar = /** @class */ (function () {\r\n function Toolbar(calendar, toolbarOptions) {\r\n this.el = null; // mirrors local `el`\r\n this.viewsWithButtons = [];\r\n this.calendar = calendar;\r\n this.toolbarOptions = toolbarOptions;\r\n }\r\n // method to update toolbar-specific options, not calendar-wide options\r\n Toolbar.prototype.setToolbarOptions = function (newToolbarOptions) {\r\n this.toolbarOptions = newToolbarOptions;\r\n };\r\n // can be called repeatedly and will rerender\r\n Toolbar.prototype.render = function () {\r\n var sections = this.toolbarOptions.layout;\r\n var el = this.el;\r\n if (sections) {\r\n if (!el) {\r\n el = this.el = $(\"
\");\r\n }\r\n else {\r\n el.empty();\r\n }\r\n el.append(this.renderSection('left'))\r\n .append(this.renderSection('right'))\r\n .append(this.renderSection('center'))\r\n .append('
');\r\n }\r\n else {\r\n this.removeElement();\r\n }\r\n };\r\n Toolbar.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n Toolbar.prototype.renderSection = function (position) {\r\n var _this = this;\r\n var calendar = this.calendar;\r\n var theme = calendar.theme;\r\n var optionsManager = calendar.optionsManager;\r\n var viewSpecManager = calendar.viewSpecManager;\r\n var sectionEl = $('
');\r\n var buttonStr = this.toolbarOptions.layout[position];\r\n var calendarCustomButtons = optionsManager.get('customButtons') || {};\r\n var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};\r\n var calendarButtonText = optionsManager.get('buttonText') || {};\r\n if (buttonStr) {\r\n $.each(buttonStr.split(' '), function (i, buttonGroupStr) {\r\n var groupChildren = $();\r\n var isOnlyButtons = true;\r\n var groupEl;\r\n $.each(buttonGroupStr.split(','), function (j, buttonName) {\r\n var customButtonProps;\r\n var viewSpec;\r\n var buttonClick;\r\n var buttonIcon; // only one of these will be set\r\n var buttonText; // \"\r\n var buttonInnerHtml;\r\n var buttonClasses;\r\n var buttonEl;\r\n var buttonAriaAttr;\r\n if (buttonName === 'title') {\r\n groupChildren = groupChildren.add($('

 

')); // we always want it to take up height\r\n isOnlyButtons = false;\r\n }\r\n else {\r\n if ((customButtonProps = calendarCustomButtons[buttonName])) {\r\n buttonClick = function (ev) {\r\n if (customButtonProps.click) {\r\n customButtonProps.click.call(buttonEl[0], ev);\r\n }\r\n };\r\n (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = customButtonProps.text);\r\n }\r\n else if ((viewSpec = viewSpecManager.getViewSpec(buttonName))) {\r\n _this.viewsWithButtons.push(buttonName);\r\n buttonClick = function () {\r\n calendar.changeView(buttonName);\r\n };\r\n (buttonText = viewSpec.buttonTextOverride) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = viewSpec.buttonTextDefault);\r\n }\r\n else if (calendar[buttonName]) {\r\n buttonClick = function () {\r\n calendar[buttonName]();\r\n };\r\n (buttonText = calendarButtonTextOverrides[buttonName]) ||\r\n (buttonIcon = theme.getIconClass(buttonName)) ||\r\n (buttonText = calendarButtonText[buttonName]);\r\n // ^ everything else is considered default\r\n }\r\n if (buttonClick) {\r\n buttonClasses = [\r\n 'fc-' + buttonName + '-button',\r\n theme.getClass('button'),\r\n theme.getClass('stateDefault')\r\n ];\r\n if (buttonText) {\r\n buttonInnerHtml = util_1.htmlEscape(buttonText);\r\n buttonAriaAttr = '';\r\n }\r\n else if (buttonIcon) {\r\n buttonInnerHtml = \"\";\r\n buttonAriaAttr = ' aria-label=\"' + buttonName + '\"';\r\n }\r\n buttonEl = $(// type=\"button\" so that it doesn't submit a form\r\n '')\r\n .click(function (ev) {\r\n // don't process clicks for disabled buttons\r\n if (!buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonClick(ev);\r\n // after the click action, if the button becomes the \"active\" tab, or disabled,\r\n // it should never have a hover class, so remove it now.\r\n if (buttonEl.hasClass(theme.getClass('stateActive')) ||\r\n buttonEl.hasClass(theme.getClass('stateDisabled'))) {\r\n buttonEl.removeClass(theme.getClass('stateHover'));\r\n }\r\n }\r\n })\r\n .mousedown(function () {\r\n // the *down* effect (mouse pressed in).\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateDown'));\r\n })\r\n .mouseup(function () {\r\n // undo the *down* effect\r\n buttonEl.removeClass(theme.getClass('stateDown'));\r\n })\r\n .hover(function () {\r\n // the *hover* effect.\r\n // only on buttons that are not the \"active\" tab, or disabled\r\n buttonEl\r\n .not('.' + theme.getClass('stateActive'))\r\n .not('.' + theme.getClass('stateDisabled'))\r\n .addClass(theme.getClass('stateHover'));\r\n }, function () {\r\n // undo the *hover* effect\r\n buttonEl\r\n .removeClass(theme.getClass('stateHover'))\r\n .removeClass(theme.getClass('stateDown')); // if mouseleave happens before mouseup\r\n });\r\n groupChildren = groupChildren.add(buttonEl);\r\n }\r\n }\r\n });\r\n if (isOnlyButtons) {\r\n groupChildren\r\n .first().addClass(theme.getClass('cornerLeft')).end()\r\n .last().addClass(theme.getClass('cornerRight')).end();\r\n }\r\n if (groupChildren.length > 1) {\r\n groupEl = $('
');\r\n if (isOnlyButtons) {\r\n groupEl.addClass(theme.getClass('buttonGroup'));\r\n }\r\n groupEl.append(groupChildren);\r\n sectionEl.append(groupEl);\r\n }\r\n else {\r\n sectionEl.append(groupChildren); // 1 or 0 children\r\n }\r\n });\r\n }\r\n return sectionEl;\r\n };\r\n Toolbar.prototype.updateTitle = function (text) {\r\n if (this.el) {\r\n this.el.find('h2').text(text);\r\n }\r\n };\r\n Toolbar.prototype.activateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .addClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.deactivateButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .removeClass(this.calendar.theme.getClass('stateActive'));\r\n }\r\n };\r\n Toolbar.prototype.disableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', true)\r\n .addClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.enableButton = function (buttonName) {\r\n if (this.el) {\r\n this.el.find('.fc-' + buttonName + '-button')\r\n .prop('disabled', false)\r\n .removeClass(this.calendar.theme.getClass('stateDisabled'));\r\n }\r\n };\r\n Toolbar.prototype.getViewsWithButtons = function () {\r\n return this.viewsWithButtons;\r\n };\r\n return Toolbar;\r\n}());\r\nexports.default = Toolbar;\r\n\r\n\r\n/***/ }),\r\n/* 240 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar Model_1 = __webpack_require__(48);\r\nvar OptionsManager = /** @class */ (function (_super) {\r\n tslib_1.__extends(OptionsManager, _super);\r\n function OptionsManager(_calendar, overrides) {\r\n var _this = _super.call(this) || this;\r\n _this._calendar = _calendar;\r\n _this.overrides = $.extend({}, overrides); // make a copy\r\n _this.dynamicOverrides = {};\r\n _this.compute();\r\n return _this;\r\n }\r\n OptionsManager.prototype.add = function (newOptionHash) {\r\n var optionCnt = 0;\r\n var optionName;\r\n this.recordOverrides(newOptionHash); // will trigger this model's watchers\r\n for (optionName in newOptionHash) {\r\n optionCnt++;\r\n }\r\n // special-case handling of single option change.\r\n // if only one option change, `optionName` will be its name.\r\n if (optionCnt === 1) {\r\n if (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') {\r\n this._calendar.updateViewSize(true); // isResize=true\r\n return;\r\n }\r\n else if (optionName === 'defaultDate') {\r\n return; // can't change date this way. use gotoDate instead\r\n }\r\n else if (optionName === 'businessHours') {\r\n return; // this model already reacts to this\r\n }\r\n else if (/^(event|select)(Overlap|Constraint|Allow)$/.test(optionName)) {\r\n return; // doesn't affect rendering. only interactions.\r\n }\r\n else if (optionName === 'timezone') {\r\n this._calendar.view.flash('initialEvents');\r\n return;\r\n }\r\n }\r\n // catch-all. rerender the header and footer and rebuild/rerender the current view\r\n this._calendar.renderHeader();\r\n this._calendar.renderFooter();\r\n // even non-current views will be affected by this option change. do before rerender\r\n // TODO: detangle\r\n this._calendar.viewsByType = {};\r\n this._calendar.reinitView();\r\n };\r\n // Computes the flattened options hash for the calendar and assigns to `this.options`.\r\n // Assumes this.overrides and this.dynamicOverrides have already been initialized.\r\n OptionsManager.prototype.compute = function () {\r\n var locale;\r\n var localeDefaults;\r\n var isRTL;\r\n var dirDefaults;\r\n var rawOptions;\r\n locale = util_1.firstDefined(// explicit locale option given?\r\n this.dynamicOverrides.locale, this.overrides.locale);\r\n localeDefaults = locale_1.localeOptionHash[locale];\r\n if (!localeDefaults) {\r\n locale = options_1.globalDefaults.locale;\r\n localeDefaults = locale_1.localeOptionHash[locale] || {};\r\n }\r\n isRTL = util_1.firstDefined(// based on options computed so far, is direction RTL?\r\n this.dynamicOverrides.isRTL, this.overrides.isRTL, localeDefaults.isRTL, options_1.globalDefaults.isRTL);\r\n dirDefaults = isRTL ? options_1.rtlDefaults : {};\r\n this.dirDefaults = dirDefaults;\r\n this.localeDefaults = localeDefaults;\r\n rawOptions = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n dirDefaults,\r\n localeDefaults,\r\n this.overrides,\r\n this.dynamicOverrides\r\n ]);\r\n locale_1.populateInstanceComputableOptions(rawOptions); // fill in gaps with computed options\r\n this.reset(rawOptions);\r\n };\r\n // stores the new options internally, but does not rerender anything.\r\n OptionsManager.prototype.recordOverrides = function (newOptionHash) {\r\n var optionName;\r\n for (optionName in newOptionHash) {\r\n this.dynamicOverrides[optionName] = newOptionHash[optionName];\r\n }\r\n this._calendar.viewSpecManager.clearCache(); // the dynamic override invalidates the options in this cache, so just clear it\r\n this.compute(); // this.options needs to be recomputed after the dynamic override\r\n };\r\n return OptionsManager;\r\n}(Model_1.default));\r\nexports.default = OptionsManager;\r\n\r\n\r\n/***/ }),\r\n/* 241 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar moment = __webpack_require__(0);\r\nvar $ = __webpack_require__(3);\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar util_1 = __webpack_require__(4);\r\nvar options_1 = __webpack_require__(32);\r\nvar locale_1 = __webpack_require__(31);\r\nvar ViewSpecManager = /** @class */ (function () {\r\n function ViewSpecManager(optionsManager, _calendar) {\r\n this.optionsManager = optionsManager;\r\n this._calendar = _calendar;\r\n this.clearCache();\r\n }\r\n ViewSpecManager.prototype.clearCache = function () {\r\n this.viewSpecCache = {};\r\n };\r\n // Gets information about how to create a view. Will use a cache.\r\n ViewSpecManager.prototype.getViewSpec = function (viewType) {\r\n var cache = this.viewSpecCache;\r\n return cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));\r\n };\r\n // Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\r\n // Preference is given to views that have corresponding buttons.\r\n ViewSpecManager.prototype.getUnitViewSpec = function (unit) {\r\n var viewTypes;\r\n var i;\r\n var spec;\r\n if ($.inArray(unit, util_1.unitsDesc) !== -1) {\r\n // put views that have buttons first. there will be duplicates, but oh well\r\n viewTypes = this._calendar.header.getViewsWithButtons(); // TODO: include footer as well?\r\n $.each(ViewRegistry_1.viewHash, function (viewType) {\r\n viewTypes.push(viewType);\r\n });\r\n for (i = 0; i < viewTypes.length; i++) {\r\n spec = this.getViewSpec(viewTypes[i]);\r\n if (spec) {\r\n if (spec.singleUnit === unit) {\r\n return spec;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n // Builds an object with information on how to create a given view\r\n ViewSpecManager.prototype.buildViewSpec = function (requestedViewType) {\r\n var viewOverrides = this.optionsManager.overrides.views || {};\r\n var specChain = []; // for the view. lowest to highest priority\r\n var defaultsChain = []; // for the view. lowest to highest priority\r\n var overridesChain = []; // for the view. lowest to highest priority\r\n var viewType = requestedViewType;\r\n var spec; // for the view\r\n var overrides; // for the view\r\n var durationInput;\r\n var duration;\r\n var unit;\r\n // iterate from the specific view definition to a more general one until we hit an actual View class\r\n while (viewType) {\r\n spec = ViewRegistry_1.viewHash[viewType];\r\n overrides = viewOverrides[viewType];\r\n viewType = null; // clear. might repopulate for another iteration\r\n if (typeof spec === 'function') {\r\n spec = { 'class': spec };\r\n }\r\n if (spec) {\r\n specChain.unshift(spec);\r\n defaultsChain.unshift(spec.defaults || {});\r\n durationInput = durationInput || spec.duration;\r\n viewType = viewType || spec.type;\r\n }\r\n if (overrides) {\r\n overridesChain.unshift(overrides); // view-specific option hashes have options at zero-level\r\n durationInput = durationInput || overrides.duration;\r\n viewType = viewType || overrides.type;\r\n }\r\n }\r\n spec = util_1.mergeProps(specChain);\r\n spec.type = requestedViewType;\r\n if (!spec['class']) {\r\n return false;\r\n }\r\n // fall back to top-level `duration` option\r\n durationInput = durationInput ||\r\n this.optionsManager.dynamicOverrides.duration ||\r\n this.optionsManager.overrides.duration;\r\n if (durationInput) {\r\n duration = moment.duration(durationInput);\r\n if (duration.valueOf()) {\r\n unit = util_1.computeDurationGreatestUnit(duration, durationInput);\r\n spec.duration = duration;\r\n spec.durationUnit = unit;\r\n // view is a single-unit duration, like \"week\" or \"day\"\r\n // incorporate options for this. lowest priority\r\n if (duration.as(unit) === 1) {\r\n spec.singleUnit = unit;\r\n overridesChain.unshift(viewOverrides[unit] || {});\r\n }\r\n }\r\n }\r\n spec.defaults = options_1.mergeOptions(defaultsChain);\r\n spec.overrides = options_1.mergeOptions(overridesChain);\r\n this.buildViewSpecOptions(spec);\r\n this.buildViewSpecButtonText(spec, requestedViewType);\r\n return spec;\r\n };\r\n // Builds and assigns a view spec's options object from its already-assigned defaults and overrides\r\n ViewSpecManager.prototype.buildViewSpecOptions = function (spec) {\r\n var optionsManager = this.optionsManager;\r\n spec.options = options_1.mergeOptions([\r\n options_1.globalDefaults,\r\n spec.defaults,\r\n optionsManager.dirDefaults,\r\n optionsManager.localeDefaults,\r\n optionsManager.overrides,\r\n spec.overrides,\r\n optionsManager.dynamicOverrides // dynamically set via setter. highest precedence\r\n ]);\r\n locale_1.populateInstanceComputableOptions(spec.options);\r\n };\r\n // Computes and assigns a view spec's buttonText-related options\r\n ViewSpecManager.prototype.buildViewSpecButtonText = function (spec, requestedViewType) {\r\n var optionsManager = this.optionsManager;\r\n // given an options object with a possible `buttonText` hash, lookup the buttonText for the\r\n // requested view, falling back to a generic unit entry like \"week\" or \"day\"\r\n function queryButtonText(options) {\r\n var buttonText = options.buttonText || {};\r\n return buttonText[requestedViewType] ||\r\n // view can decide to look up a certain key\r\n (spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) ||\r\n // a key like \"month\"\r\n (spec.singleUnit ? buttonText[spec.singleUnit] : null);\r\n }\r\n // highest to lowest priority\r\n spec.buttonTextOverride =\r\n queryButtonText(optionsManager.dynamicOverrides) ||\r\n queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence\r\n spec.overrides.buttonText; // `buttonText` for view-specific options is a string\r\n // highest to lowest priority. mirrors buildViewSpecOptions\r\n spec.buttonTextDefault =\r\n queryButtonText(optionsManager.localeDefaults) ||\r\n queryButtonText(optionsManager.dirDefaults) ||\r\n spec.defaults.buttonText || // a single string. from ViewSubclass.defaults\r\n queryButtonText(options_1.globalDefaults) ||\r\n (spec.duration ? this._calendar.humanizeDuration(spec.duration) : null) || // like \"3 days\"\r\n requestedViewType; // fall back to given view name\r\n };\r\n return ViewSpecManager;\r\n}());\r\nexports.default = ViewSpecManager;\r\n\r\n\r\n/***/ }),\r\n/* 242 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventPeriod_1 = __webpack_require__(243);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar EventSource_1 = __webpack_require__(6);\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar SingleEventDef_1 = __webpack_require__(13);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar EventManager = /** @class */ (function () {\r\n function EventManager(calendar) {\r\n this.calendar = calendar;\r\n this.stickySource = new ArrayEventSource_1.default(calendar);\r\n this.otherSources = [];\r\n }\r\n EventManager.prototype.requestEvents = function (start, end, timezone, force) {\r\n if (force ||\r\n !this.currentPeriod ||\r\n !this.currentPeriod.isWithinRange(start, end) ||\r\n timezone !== this.currentPeriod.timezone) {\r\n this.setPeriod(// will change this.currentPeriod\r\n new EventPeriod_1.default(start, end, timezone));\r\n }\r\n return this.currentPeriod.whenReleased();\r\n };\r\n // Source Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.addSource = function (eventSource) {\r\n this.otherSources.push(eventSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.requestSource(eventSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeSource = function (doomedSource) {\r\n util_1.removeExact(this.otherSources, doomedSource);\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeSource(doomedSource); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllSources = function () {\r\n this.otherSources = [];\r\n if (this.currentPeriod) {\r\n this.currentPeriod.purgeAllSources(); // might release\r\n }\r\n };\r\n // Source Refetching\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.refetchSource = function (eventSource) {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeSource(eventSource);\r\n currentPeriod.requestSource(eventSource);\r\n currentPeriod.thaw();\r\n }\r\n };\r\n EventManager.prototype.refetchAllSources = function () {\r\n var currentPeriod = this.currentPeriod;\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n currentPeriod.purgeAllSources();\r\n currentPeriod.requestSources(this.getSources());\r\n currentPeriod.thaw();\r\n }\r\n };\r\n // Source Querying\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getSources = function () {\r\n return [this.stickySource].concat(this.otherSources);\r\n };\r\n // like querySources, but accepts multple match criteria (like multiple IDs)\r\n EventManager.prototype.multiQuerySources = function (matchInputs) {\r\n // coerce into an array\r\n if (!matchInputs) {\r\n matchInputs = [];\r\n }\r\n else if (!$.isArray(matchInputs)) {\r\n matchInputs = [matchInputs];\r\n }\r\n var matchingSources = [];\r\n var i;\r\n // resolve raw inputs to real event source objects\r\n for (i = 0; i < matchInputs.length; i++) {\r\n matchingSources.push.apply(// append\r\n matchingSources, this.querySources(matchInputs[i]));\r\n }\r\n return matchingSources;\r\n };\r\n // matchInput can either by a real event source object, an ID, or the function/URL for the source.\r\n // returns an array of matching source objects.\r\n EventManager.prototype.querySources = function (matchInput) {\r\n var sources = this.otherSources;\r\n var i;\r\n var source;\r\n // given a proper event source object\r\n for (i = 0; i < sources.length; i++) {\r\n source = sources[i];\r\n if (source === matchInput) {\r\n return [source];\r\n }\r\n }\r\n // an ID match\r\n source = this.getSourceById(EventSource_1.default.normalizeId(matchInput));\r\n if (source) {\r\n return [source];\r\n }\r\n // parse as an event source\r\n matchInput = EventSourceParser_1.default.parse(matchInput, this.calendar);\r\n if (matchInput) {\r\n return $.grep(sources, function (source) {\r\n return isSourcesEquivalent(matchInput, source);\r\n });\r\n }\r\n };\r\n /*\r\n ID assumed to already be normalized\r\n */\r\n EventManager.prototype.getSourceById = function (id) {\r\n return $.grep(this.otherSources, function (source) {\r\n return source.id && source.id === id;\r\n })[0];\r\n };\r\n // Event-Period\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.setPeriod = function (eventPeriod) {\r\n if (this.currentPeriod) {\r\n this.unbindPeriod(this.currentPeriod);\r\n this.currentPeriod = null;\r\n }\r\n this.currentPeriod = eventPeriod;\r\n this.bindPeriod(eventPeriod);\r\n eventPeriod.requestSources(this.getSources());\r\n };\r\n EventManager.prototype.bindPeriod = function (eventPeriod) {\r\n this.listenTo(eventPeriod, 'release', function (eventsPayload) {\r\n this.trigger('release', eventsPayload);\r\n });\r\n };\r\n EventManager.prototype.unbindPeriod = function (eventPeriod) {\r\n this.stopListeningTo(eventPeriod);\r\n };\r\n // Event Getting/Adding/Removing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.getEventDefByUid = function (uid) {\r\n if (this.currentPeriod) {\r\n return this.currentPeriod.getEventDefByUid(uid);\r\n }\r\n };\r\n EventManager.prototype.addEventDef = function (eventDef, isSticky) {\r\n if (isSticky) {\r\n this.stickySource.addEventDef(eventDef);\r\n }\r\n if (this.currentPeriod) {\r\n this.currentPeriod.addEventDef(eventDef); // might release\r\n }\r\n };\r\n EventManager.prototype.removeEventDefsById = function (eventId) {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeEventDefsById(eventId);\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeEventDefsById(eventId); // might release\r\n }\r\n };\r\n EventManager.prototype.removeAllEventDefs = function () {\r\n this.getSources().forEach(function (eventSource) {\r\n eventSource.removeAllEventDefs();\r\n });\r\n if (this.currentPeriod) {\r\n this.currentPeriod.removeAllEventDefs();\r\n }\r\n };\r\n // Event Mutating\r\n // -----------------------------------------------------------------------------------------------------------------\r\n /*\r\n Returns an undo function.\r\n */\r\n EventManager.prototype.mutateEventsWithId = function (eventDefId, eventDefMutation) {\r\n var currentPeriod = this.currentPeriod;\r\n var eventDefs;\r\n var undoFuncs = [];\r\n if (currentPeriod) {\r\n currentPeriod.freeze();\r\n eventDefs = currentPeriod.getEventDefsById(eventDefId);\r\n eventDefs.forEach(function (eventDef) {\r\n // add/remove esp because id might change\r\n currentPeriod.removeEventDef(eventDef);\r\n undoFuncs.push(eventDefMutation.mutateSingle(eventDef));\r\n currentPeriod.addEventDef(eventDef);\r\n });\r\n currentPeriod.thaw();\r\n return function () {\r\n currentPeriod.freeze();\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n currentPeriod.removeEventDef(eventDefs[i]);\r\n undoFuncs[i]();\r\n currentPeriod.addEventDef(eventDefs[i]);\r\n }\r\n currentPeriod.thaw();\r\n };\r\n }\r\n return function () { };\r\n };\r\n /*\r\n copies and then mutates\r\n */\r\n EventManager.prototype.buildMutatedEventInstanceGroup = function (eventDefId, eventDefMutation) {\r\n var eventDefs = this.getEventDefsById(eventDefId);\r\n var i;\r\n var defCopy;\r\n var allInstances = [];\r\n for (i = 0; i < eventDefs.length; i++) {\r\n defCopy = eventDefs[i].clone();\r\n if (defCopy instanceof SingleEventDef_1.default) {\r\n eventDefMutation.mutateSingle(defCopy);\r\n allInstances.push.apply(allInstances, // append\r\n defCopy.buildInstances());\r\n }\r\n }\r\n return new EventInstanceGroup_1.default(allInstances);\r\n };\r\n // Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventManager.prototype.freeze = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.freeze();\r\n }\r\n };\r\n EventManager.prototype.thaw = function () {\r\n if (this.currentPeriod) {\r\n this.currentPeriod.thaw();\r\n }\r\n };\r\n // methods that simply forward to EventPeriod\r\n EventManager.prototype.getEventDefsById = function (eventDefId) {\r\n return this.currentPeriod.getEventDefsById(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstances = function () {\r\n return this.currentPeriod.getEventInstances();\r\n };\r\n EventManager.prototype.getEventInstancesWithId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithId(eventDefId);\r\n };\r\n EventManager.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n return this.currentPeriod.getEventInstancesWithoutId(eventDefId);\r\n };\r\n return EventManager;\r\n}());\r\nexports.default = EventManager;\r\nEmitterMixin_1.default.mixInto(EventManager);\r\nListenerMixin_1.default.mixInto(EventManager);\r\nfunction isSourcesEquivalent(source0, source1) {\r\n return source0.getPrimitive() === source1.getPrimitive();\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 243 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar Promise_1 = __webpack_require__(20);\r\nvar EmitterMixin_1 = __webpack_require__(11);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar EventInstanceGroup_1 = __webpack_require__(18);\r\nvar EventPeriod = /** @class */ (function () {\r\n function EventPeriod(start, end, timezone) {\r\n this.pendingCnt = 0;\r\n this.freezeDepth = 0;\r\n this.stuntedReleaseCnt = 0;\r\n this.releaseCnt = 0;\r\n this.start = start;\r\n this.end = end;\r\n this.timezone = timezone;\r\n this.unzonedRange = new UnzonedRange_1.default(start.clone().stripZone(), end.clone().stripZone());\r\n this.requestsByUid = {};\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n }\r\n EventPeriod.prototype.isWithinRange = function (start, end) {\r\n // TODO: use a range util function?\r\n return !start.isBefore(this.start) && !end.isAfter(this.end);\r\n };\r\n // Requesting and Purging\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.requestSources = function (sources) {\r\n this.freeze();\r\n for (var i = 0; i < sources.length; i++) {\r\n this.requestSource(sources[i]);\r\n }\r\n this.thaw();\r\n };\r\n EventPeriod.prototype.requestSource = function (source) {\r\n var _this = this;\r\n var request = { source: source, status: 'pending', eventDefs: null };\r\n this.requestsByUid[source.uid] = request;\r\n this.pendingCnt += 1;\r\n source.fetch(this.start, this.end, this.timezone).then(function (eventDefs) {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'completed';\r\n request.eventDefs = eventDefs;\r\n _this.addEventDefs(eventDefs);\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n }, function () {\r\n if (request.status !== 'cancelled') {\r\n request.status = 'failed';\r\n _this.pendingCnt--;\r\n _this.tryRelease();\r\n }\r\n });\r\n };\r\n EventPeriod.prototype.purgeSource = function (source) {\r\n var request = this.requestsByUid[source.uid];\r\n if (request) {\r\n delete this.requestsByUid[source.uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n this.pendingCnt--;\r\n this.tryRelease();\r\n }\r\n else if (request.status === 'completed') {\r\n request.eventDefs.forEach(this.removeEventDef.bind(this));\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.purgeAllSources = function () {\r\n var requestsByUid = this.requestsByUid;\r\n var uid;\r\n var request;\r\n var completedCnt = 0;\r\n for (uid in requestsByUid) {\r\n request = requestsByUid[uid];\r\n if (request.status === 'pending') {\r\n request.status = 'cancelled';\r\n }\r\n else if (request.status === 'completed') {\r\n completedCnt++;\r\n }\r\n }\r\n this.requestsByUid = {};\r\n this.pendingCnt = 0;\r\n if (completedCnt) {\r\n this.removeAllEventDefs(); // might release\r\n }\r\n };\r\n // Event Definitions\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventDefByUid = function (eventDefUid) {\r\n return this.eventDefsByUid[eventDefUid];\r\n };\r\n EventPeriod.prototype.getEventDefsById = function (eventDefId) {\r\n var a = this.eventDefsById[eventDefId];\r\n if (a) {\r\n return a.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.addEventDefs = function (eventDefs) {\r\n for (var i = 0; i < eventDefs.length; i++) {\r\n this.addEventDef(eventDefs[i]);\r\n }\r\n };\r\n EventPeriod.prototype.addEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefId = eventDef.id;\r\n var eventDefs = eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []);\r\n var eventInstances = eventDef.buildInstances(this.unzonedRange);\r\n var i;\r\n eventDefs.push(eventDef);\r\n this.eventDefsByUid[eventDef.uid] = eventDef;\r\n for (i = 0; i < eventInstances.length; i++) {\r\n this.addEventInstance(eventInstances[i], eventDefId);\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDefsById = function (eventDefId) {\r\n var _this = this;\r\n this.getEventDefsById(eventDefId).forEach(function (eventDef) {\r\n _this.removeEventDef(eventDef);\r\n });\r\n };\r\n EventPeriod.prototype.removeAllEventDefs = function () {\r\n var isEmpty = $.isEmptyObject(this.eventDefsByUid);\r\n this.eventDefsByUid = {};\r\n this.eventDefsById = {};\r\n this.eventInstanceGroupsById = {};\r\n if (!isEmpty) {\r\n this.tryRelease();\r\n }\r\n };\r\n EventPeriod.prototype.removeEventDef = function (eventDef) {\r\n var eventDefsById = this.eventDefsById;\r\n var eventDefs = eventDefsById[eventDef.id];\r\n delete this.eventDefsByUid[eventDef.uid];\r\n if (eventDefs) {\r\n util_1.removeExact(eventDefs, eventDef);\r\n if (!eventDefs.length) {\r\n delete eventDefsById[eventDef.id];\r\n }\r\n this.removeEventInstancesForDef(eventDef);\r\n }\r\n };\r\n // Event Instances\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.getEventInstances = function () {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n eventInstances.push.apply(eventInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n return eventInstances;\r\n };\r\n EventPeriod.prototype.getEventInstancesWithId = function (eventDefId) {\r\n var eventInstanceGroup = this.eventInstanceGroupsById[eventDefId];\r\n if (eventInstanceGroup) {\r\n return eventInstanceGroup.eventInstances.slice(); // clone\r\n }\r\n return [];\r\n };\r\n EventPeriod.prototype.getEventInstancesWithoutId = function (eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var matchingInstances = [];\r\n var id;\r\n for (id in eventInstanceGroupsById) {\r\n if (id !== eventDefId) {\r\n matchingInstances.push.apply(matchingInstances, // append\r\n eventInstanceGroupsById[id].eventInstances);\r\n }\r\n }\r\n return matchingInstances;\r\n };\r\n EventPeriod.prototype.addEventInstance = function (eventInstance, eventDefId) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDefId] ||\r\n (eventInstanceGroupsById[eventDefId] = new EventInstanceGroup_1.default());\r\n eventInstanceGroup.eventInstances.push(eventInstance);\r\n this.tryRelease();\r\n };\r\n EventPeriod.prototype.removeEventInstancesForDef = function (eventDef) {\r\n var eventInstanceGroupsById = this.eventInstanceGroupsById;\r\n var eventInstanceGroup = eventInstanceGroupsById[eventDef.id];\r\n var removeCnt;\r\n if (eventInstanceGroup) {\r\n removeCnt = util_1.removeMatching(eventInstanceGroup.eventInstances, function (currentEventInstance) {\r\n return currentEventInstance.def === eventDef;\r\n });\r\n if (!eventInstanceGroup.eventInstances.length) {\r\n delete eventInstanceGroupsById[eventDef.id];\r\n }\r\n if (removeCnt) {\r\n this.tryRelease();\r\n }\r\n }\r\n };\r\n // Releasing and Freezing\r\n // -----------------------------------------------------------------------------------------------------------------\r\n EventPeriod.prototype.tryRelease = function () {\r\n if (!this.pendingCnt) {\r\n if (!this.freezeDepth) {\r\n this.release();\r\n }\r\n else {\r\n this.stuntedReleaseCnt++;\r\n }\r\n }\r\n };\r\n EventPeriod.prototype.release = function () {\r\n this.releaseCnt++;\r\n this.trigger('release', this.eventInstanceGroupsById);\r\n };\r\n EventPeriod.prototype.whenReleased = function () {\r\n var _this = this;\r\n if (this.releaseCnt) {\r\n return Promise_1.default.resolve(this.eventInstanceGroupsById);\r\n }\r\n else {\r\n return Promise_1.default.construct(function (onResolve) {\r\n _this.one('release', onResolve);\r\n });\r\n }\r\n };\r\n EventPeriod.prototype.freeze = function () {\r\n if (!(this.freezeDepth++)) {\r\n this.stuntedReleaseCnt = 0;\r\n }\r\n };\r\n EventPeriod.prototype.thaw = function () {\r\n if (!(--this.freezeDepth) && this.stuntedReleaseCnt && !this.pendingCnt) {\r\n this.release();\r\n }\r\n };\r\n return EventPeriod;\r\n}());\r\nexports.default = EventPeriod;\r\nEmitterMixin_1.default.mixInto(EventPeriod);\r\n\r\n\r\n/***/ }),\r\n/* 244 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\n/* Creates a clone of an element and lets it track the mouse as it moves\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar MouseFollower = /** @class */ (function () {\r\n function MouseFollower(sourceEl, options) {\r\n this.isFollowing = false;\r\n this.isHidden = false;\r\n this.isAnimating = false; // doing the revert animation?\r\n this.options = options = options || {};\r\n this.sourceEl = sourceEl;\r\n this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent\r\n }\r\n // Causes the element to start following the mouse\r\n MouseFollower.prototype.start = function (ev) {\r\n if (!this.isFollowing) {\r\n this.isFollowing = true;\r\n this.y0 = util_1.getEvY(ev);\r\n this.x0 = util_1.getEvX(ev);\r\n this.topDelta = 0;\r\n this.leftDelta = 0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n if (util_1.getEvIsTouch(ev)) {\r\n this.listenTo($(document), 'touchmove', this.handleMove);\r\n }\r\n else {\r\n this.listenTo($(document), 'mousemove', this.handleMove);\r\n }\r\n }\r\n };\r\n // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.\r\n // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.\r\n MouseFollower.prototype.stop = function (shouldRevert, callback) {\r\n var _this = this;\r\n var revertDuration = this.options.revertDuration;\r\n var complete = function () {\r\n _this.isAnimating = false;\r\n _this.removeElement();\r\n _this.top0 = _this.left0 = null; // reset state for future updatePosition calls\r\n if (callback) {\r\n callback();\r\n }\r\n };\r\n if (this.isFollowing && !this.isAnimating) {\r\n this.isFollowing = false;\r\n this.stopListeningTo($(document));\r\n if (shouldRevert && revertDuration && !this.isHidden) {\r\n this.isAnimating = true;\r\n this.el.animate({\r\n top: this.top0,\r\n left: this.left0\r\n }, {\r\n duration: revertDuration,\r\n complete: complete\r\n });\r\n }\r\n else {\r\n complete();\r\n }\r\n }\r\n };\r\n // Gets the tracking element. Create it if necessary\r\n MouseFollower.prototype.getEl = function () {\r\n var el = this.el;\r\n if (!el) {\r\n el = this.el = this.sourceEl.clone()\r\n .addClass(this.options.additionalClass || '')\r\n .css({\r\n position: 'absolute',\r\n visibility: '',\r\n display: this.isHidden ? 'none' : '',\r\n margin: 0,\r\n right: 'auto',\r\n bottom: 'auto',\r\n width: this.sourceEl.width(),\r\n height: this.sourceEl.height(),\r\n opacity: this.options.opacity || '',\r\n zIndex: this.options.zIndex\r\n });\r\n // we don't want long taps or any mouse interaction causing selection/menus.\r\n // would use preventSelection(), but that prevents selectstart, causing problems.\r\n el.addClass('fc-unselectable');\r\n el.appendTo(this.parentEl);\r\n }\r\n return el;\r\n };\r\n // Removes the tracking element if it has already been created\r\n MouseFollower.prototype.removeElement = function () {\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n };\r\n // Update the CSS position of the tracking element\r\n MouseFollower.prototype.updatePosition = function () {\r\n var sourceOffset;\r\n var origin;\r\n this.getEl(); // ensure this.el\r\n // make sure origin info was computed\r\n if (this.top0 == null) {\r\n sourceOffset = this.sourceEl.offset();\r\n origin = this.el.offsetParent().offset();\r\n this.top0 = sourceOffset.top - origin.top;\r\n this.left0 = sourceOffset.left - origin.left;\r\n }\r\n this.el.css({\r\n top: this.top0 + this.topDelta,\r\n left: this.left0 + this.leftDelta\r\n });\r\n };\r\n // Gets called when the user moves the mouse\r\n MouseFollower.prototype.handleMove = function (ev) {\r\n this.topDelta = util_1.getEvY(ev) - this.y0;\r\n this.leftDelta = util_1.getEvX(ev) - this.x0;\r\n if (!this.isHidden) {\r\n this.updatePosition();\r\n }\r\n };\r\n // Temporarily makes the tracking element invisible. Can be called before following starts\r\n MouseFollower.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.isHidden = true;\r\n if (this.el) {\r\n this.el.hide();\r\n }\r\n }\r\n };\r\n // Show the tracking element after it has been temporarily hidden\r\n MouseFollower.prototype.show = function () {\r\n if (this.isHidden) {\r\n this.isHidden = false;\r\n this.updatePosition();\r\n this.getEl().show();\r\n }\r\n };\r\n return MouseFollower;\r\n}());\r\nexports.default = MouseFollower;\r\nListenerMixin_1.default.mixInto(MouseFollower);\r\n\r\n\r\n/***/ }),\r\n/* 245 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar HitDragListener_1 = __webpack_require__(23);\r\nvar Interaction_1 = __webpack_require__(15);\r\nvar DateClicking = /** @class */ (function (_super) {\r\n tslib_1.__extends(DateClicking, _super);\r\n /*\r\n component must implement:\r\n - bindDateHandlerToEl\r\n - getSafeHitFootprint\r\n - getHitEl\r\n */\r\n function DateClicking(component) {\r\n var _this = _super.call(this, component) || this;\r\n _this.dragListener = _this.buildDragListener();\r\n return _this;\r\n }\r\n DateClicking.prototype.end = function () {\r\n this.dragListener.endInteraction();\r\n };\r\n DateClicking.prototype.bindToEl = function (el) {\r\n var component = this.component;\r\n var dragListener = this.dragListener;\r\n component.bindDateHandlerToEl(el, 'mousedown', function (ev) {\r\n if (!component.shouldIgnoreMouse()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n component.bindDateHandlerToEl(el, 'touchstart', function (ev) {\r\n if (!component.shouldIgnoreTouch()) {\r\n dragListener.startInteraction(ev);\r\n }\r\n });\r\n };\r\n // Creates a listener that tracks the user's drag across day elements, for day clicking.\r\n DateClicking.prototype.buildDragListener = function () {\r\n var _this = this;\r\n var component = this.component;\r\n var dayClickHit; // null if invalid dayClick\r\n var dragListener = new HitDragListener_1.default(component, {\r\n scroll: this.opt('dragScroll'),\r\n interactionStart: function () {\r\n dayClickHit = dragListener.origHit;\r\n },\r\n hitOver: function (hit, isOrig, origHit) {\r\n // if user dragged to another cell at any point, it can no longer be a dayClick\r\n if (!isOrig) {\r\n dayClickHit = null;\r\n }\r\n },\r\n hitOut: function () {\r\n dayClickHit = null;\r\n },\r\n interactionEnd: function (ev, isCancelled) {\r\n var componentFootprint;\r\n if (!isCancelled && dayClickHit) {\r\n componentFootprint = component.getSafeHitFootprint(dayClickHit);\r\n if (componentFootprint) {\r\n _this.view.triggerDayClick(componentFootprint, component.getHitEl(dayClickHit), ev);\r\n }\r\n }\r\n }\r\n });\r\n // because dragListener won't be called with any time delay, \"dragging\" will begin immediately,\r\n // which will kill any touchmoving/scrolling. Prevent this.\r\n dragListener.shouldCancelTouchScroll = false;\r\n dragListener.scrollAlwaysKills = true;\r\n return dragListener;\r\n };\r\n return DateClicking;\r\n}(Interaction_1.default));\r\nexports.default = DateClicking;\r\n\r\n\r\n/***/ }),\r\n/* 246 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/*\r\nOnly handles foreground segs.\r\nDoes not own rendering. Use for low-level util methods by TimeGrid.\r\n*/\r\nvar TimeGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridEventRenderer, _super);\r\n function TimeGridEventRenderer(timeGrid, fillRenderer) {\r\n var _this = _super.call(this, timeGrid, fillRenderer) || this;\r\n _this.timeGrid = timeGrid;\r\n return _this;\r\n }\r\n TimeGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);\r\n };\r\n // Given an array of foreground segments, render a DOM element for each, computes position,\r\n // and attaches to the column inner-container elements.\r\n TimeGridEventRenderer.prototype.renderFgSegsIntoContainers = function (segs, containerEls) {\r\n var segsByCol;\r\n var col;\r\n segsByCol = this.timeGrid.groupSegsByCol(segs);\r\n for (col = 0; col < this.timeGrid.colCnt; col++) {\r\n this.updateFgSegCoords(segsByCol[col]);\r\n }\r\n this.timeGrid.attachSegsByCol(segsByCol, containerEls);\r\n };\r\n TimeGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n if (this.fgSegs) {\r\n this.fgSegs.forEach(function (seg) {\r\n seg.el.remove();\r\n });\r\n }\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('noMeridiemTimeFormat'); // like \"6:30\" (no AM/PM)\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return true;\r\n };\r\n // Renders the HTML for a single event segment's default rendering\r\n TimeGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var componentFootprint = seg.footprint.componentFootprint;\r\n var isAllDay = componentFootprint.isAllDay;\r\n var eventDef = seg.footprint.eventDef;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeText;\r\n var fullTimeText; // more verbose time text. for the print stylesheet\r\n var startTimeText; // just the start time text\r\n classes.unshift('fc-time-grid-event', 'fc-v-event');\r\n // if the event appears to span more than one day...\r\n if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n // Don't display time text on segments that run entirely through a day.\r\n // That would appear as midnight-midnight and would look dumb.\r\n // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\r\n if (seg.isStart || seg.isEnd) {\r\n var zonedStart = calendar.msToMoment(seg.startMs);\r\n var zonedEnd = calendar.msToMoment(seg.endMs);\r\n timeText = this._getTimeText(zonedStart, zonedEnd, isAllDay);\r\n fullTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, 'LT');\r\n startTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, null, false); // displayEnd=false\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeText = this.getTimeText(seg.footprint);\r\n fullTimeText = this.getTimeText(seg.footprint, 'LT');\r\n startTimeText = this.getTimeText(seg.footprint, null, false); // displayEnd=false\r\n }\r\n return '' +\r\n '
' +\r\n (timeText ?\r\n '
' +\r\n '' + util_1.htmlEscape(timeText) + '' +\r\n '
' :\r\n '') +\r\n (eventDef.title ?\r\n '
' +\r\n util_1.htmlEscape(eventDef.title) +\r\n '
' :\r\n '') +\r\n '
' +\r\n '
' +\r\n /* TODO: write CSS for this\r\n (isResizableFromStart ?\r\n '
' :\r\n ''\r\n ) +\r\n */\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n // Given segments that are assumed to all live in the *same column*,\r\n // compute their verical/horizontal coordinates and assign to their elements.\r\n TimeGridEventRenderer.prototype.updateFgSegCoords = function (segs) {\r\n this.timeGrid.computeSegVerticals(segs); // horizontals relies on this\r\n this.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array\r\n this.timeGrid.assignSegVerticals(segs);\r\n this.assignFgSegHorizontals(segs);\r\n };\r\n // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\r\n // NOTE: Also reorders the given array by date!\r\n TimeGridEventRenderer.prototype.computeFgSegHorizontals = function (segs) {\r\n var levels;\r\n var level0;\r\n var i;\r\n this.sortEventSegs(segs); // order by certain criteria\r\n levels = buildSlotSegLevels(segs);\r\n computeForwardSlotSegs(levels);\r\n if ((level0 = levels[0])) {\r\n for (i = 0; i < level0.length; i++) {\r\n computeSlotSegPressures(level0[i]);\r\n }\r\n for (i = 0; i < level0.length; i++) {\r\n this.computeFgSegForwardBack(level0[i], 0, 0);\r\n }\r\n }\r\n };\r\n // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\r\n // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\r\n // seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\r\n //\r\n // The segment might be part of a \"series\", which means consecutive segments with the same pressure\r\n // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\r\n // segments behind this one in the current series, and `seriesBackwardCoord` is the starting\r\n // coordinate of the first segment in the series.\r\n TimeGridEventRenderer.prototype.computeFgSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {\r\n var forwardSegs = seg.forwardSegs;\r\n var i;\r\n if (seg.forwardCoord === undefined) {\r\n if (!forwardSegs.length) {\r\n // if there are no forward segments, this segment should butt up against the edge\r\n seg.forwardCoord = 1;\r\n }\r\n else {\r\n // sort highest pressure first\r\n this.sortForwardSegs(forwardSegs);\r\n // this segment's forwardCoord will be calculated from the backwardCoord of the\r\n // highest-pressure forward segment.\r\n this.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\r\n seg.forwardCoord = forwardSegs[0].backwardCoord;\r\n }\r\n // calculate the backwardCoord from the forwardCoord. consider the series\r\n seg.backwardCoord = seg.forwardCoord -\r\n (seg.forwardCoord - seriesBackwardCoord) / // available width for series\r\n (seriesBackwardPressure + 1); // # of segments in the series\r\n // use this segment's coordinates to computed the coordinates of the less-pressurized\r\n // forward segments\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n this.computeFgSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);\r\n }\r\n }\r\n };\r\n TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {\r\n forwardSegs.sort(util_1.proxy(this, 'compareForwardSegs'));\r\n };\r\n // A cmp function for determining which forward segment to rely on more when computing coordinates.\r\n TimeGridEventRenderer.prototype.compareForwardSegs = function (seg1, seg2) {\r\n // put higher-pressure first\r\n return seg2.forwardPressure - seg1.forwardPressure ||\r\n // put segments that are closer to initial edge first (and favor ones with no coords yet)\r\n (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) ||\r\n // do normal sorting...\r\n this.compareEventSegs(seg1, seg2);\r\n };\r\n // Given foreground event segments that have already had their position coordinates computed,\r\n // assigns position-related CSS values to their elements.\r\n TimeGridEventRenderer.prototype.assignFgSegHorizontals = function (segs) {\r\n var i;\r\n var seg;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n seg.el.css(this.generateFgSegHorizontalCss(seg));\r\n // if the height is short, add a className for alternate styling\r\n if (seg.bottom - seg.top < 30) {\r\n seg.el.addClass('fc-short');\r\n }\r\n }\r\n };\r\n // Generates an object with CSS properties/values that should be applied to an event segment element.\r\n // Contains important positioning-related properties that should be applied to any event element, customized or not.\r\n TimeGridEventRenderer.prototype.generateFgSegHorizontalCss = function (seg) {\r\n var shouldOverlap = this.opt('slotEventOverlap');\r\n var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point\r\n var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point\r\n var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first\r\n var isRTL = this.timeGrid.isRTL;\r\n var left; // amount of space from left edge, a fraction of the total width\r\n var right; // amount of space from right edge, a fraction of the total width\r\n if (shouldOverlap) {\r\n // double the width, but don't go beyond the maximum forward coordinate (1.0)\r\n forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);\r\n }\r\n if (isRTL) {\r\n left = 1 - forwardCoord;\r\n right = backwardCoord;\r\n }\r\n else {\r\n left = backwardCoord;\r\n right = 1 - forwardCoord;\r\n }\r\n props.zIndex = seg.level + 1; // convert from 0-base to 1-based\r\n props.left = left * 100 + '%';\r\n props.right = right * 100 + '%';\r\n if (shouldOverlap && seg.forwardPressure) {\r\n // add padding to the edge so that forward stacked events don't cover the resizer's icon\r\n props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width\r\n }\r\n return props;\r\n };\r\n return TimeGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = TimeGridEventRenderer;\r\n// Builds an array of segments \"levels\". The first level will be the leftmost tier of segments if the calendar is\r\n// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.\r\nfunction buildSlotSegLevels(segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // go through all the levels and stop on the first level where there are no collisions\r\n for (j = 0; j < levels.length; j++) {\r\n if (!computeSlotSegCollisions(seg, levels[j]).length) {\r\n break;\r\n }\r\n }\r\n seg.level = j;\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n return levels;\r\n}\r\n// For every segment, figure out the other segments that are in subsequent\r\n// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs\r\nfunction computeForwardSlotSegs(levels) {\r\n var i;\r\n var level;\r\n var j;\r\n var seg;\r\n var k;\r\n for (i = 0; i < levels.length; i++) {\r\n level = levels[i];\r\n for (j = 0; j < level.length; j++) {\r\n seg = level[j];\r\n seg.forwardSegs = [];\r\n for (k = i + 1; k < levels.length; k++) {\r\n computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);\r\n }\r\n }\r\n }\r\n}\r\n// Figure out which path forward (via seg.forwardSegs) results in the longest path until\r\n// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure\r\nfunction computeSlotSegPressures(seg) {\r\n var forwardSegs = seg.forwardSegs;\r\n var forwardPressure = 0;\r\n var i;\r\n var forwardSeg;\r\n if (seg.forwardPressure === undefined) {\r\n for (i = 0; i < forwardSegs.length; i++) {\r\n forwardSeg = forwardSegs[i];\r\n // figure out the child's maximum forward path\r\n computeSlotSegPressures(forwardSeg);\r\n // either use the existing maximum, or use the child's forward pressure\r\n // plus one (for the forwardSeg itself)\r\n forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);\r\n }\r\n seg.forwardPressure = forwardPressure;\r\n }\r\n}\r\n// Find all the segments in `otherSegs` that vertically collide with `seg`.\r\n// Append into an optionally-supplied `results` array and return.\r\nfunction computeSlotSegCollisions(seg, otherSegs, results) {\r\n if (results === void 0) { results = []; }\r\n for (var i = 0; i < otherSegs.length; i++) {\r\n if (isSlotSegCollision(seg, otherSegs[i])) {\r\n results.push(otherSegs[i]);\r\n }\r\n }\r\n return results;\r\n} \t\r\n// Do these segments occupy the same vertical space?\r\nfunction isSlotSegCollision(seg1, seg2) {\r\n/////////////// stop physics of segments\r\n// return seg1.bottom > seg2.top && seg1.top < seg2.bottom;\r\n return 0;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 247 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar TimeGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridHelperRenderer, _super);\r\n function TimeGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var i;\r\n var seg;\r\n var sourceEl;\r\n // TODO: not good to call eventRenderer this way\r\n this.eventRenderer.renderFgSegsIntoContainers(segs, this.component.helperContainerEls);\r\n // Try to make the segment that is in the same row as sourceSeg look the same\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n if (sourceSeg && sourceSeg.col === seg.col) {\r\n sourceEl = sourceSeg.el;\r\n seg.el.css({\r\n left: sourceEl.css('left'),\r\n right: sourceEl.css('right'),\r\n 'margin-left': sourceEl.css('margin-left'),\r\n 'margin-right': sourceEl.css('margin-right')\r\n });\r\n }\r\n helperNodes.push(seg.el[0]);\r\n }\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return TimeGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = TimeGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 248 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar TimeGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(TimeGridFillRenderer, _super);\r\n function TimeGridFillRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n TimeGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var timeGrid = this.component;\r\n var containerEls;\r\n // TODO: more efficient lookup\r\n if (type === 'bgEvent') {\r\n containerEls = timeGrid.bgContainerEls;\r\n }\r\n else if (type === 'businessHours') {\r\n containerEls = timeGrid.businessContainerEls;\r\n }\r\n else if (type === 'highlight') {\r\n containerEls = timeGrid.highlightContainerEls;\r\n }\r\n timeGrid.updateSegVerticals(segs);\r\n timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);\r\n return segs.map(function (seg) {\r\n return seg.el[0];\r\n });\r\n };\r\n return TimeGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = TimeGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 249 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n/* A rectangular panel that is absolutely positioned over other content\r\n------------------------------------------------------------------------------------------------------------------------\r\nOptions:\r\n - className (string)\r\n - content (HTML string or jQuery element set)\r\n - parentEl\r\n - top\r\n - left\r\n - right (the x coord of where the right edge should be. not a \"CSS\" right)\r\n - autoHide (boolean)\r\n - show (callback)\r\n - hide (callback)\r\n*/\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar ListenerMixin_1 = __webpack_require__(7);\r\nvar Popover = /** @class */ (function () {\r\n function Popover(options) {\r\n this.isHidden = true;\r\n this.margin = 10; // the space required between the popover and the edges of the scroll container\r\n this.options = options || {};\r\n }\r\n // Shows the popover on the specified position. Renders it if not already\r\n Popover.prototype.show = function () {\r\n if (this.isHidden) {\r\n if (!this.el) {\r\n this.render();\r\n }\r\n this.el.show();\r\n this.position();\r\n this.isHidden = false;\r\n this.trigger('show');\r\n }\r\n };\r\n // Hides the popover, through CSS, but does not remove it from the DOM\r\n Popover.prototype.hide = function () {\r\n if (!this.isHidden) {\r\n this.el.hide();\r\n this.isHidden = true;\r\n this.trigger('hide');\r\n }\r\n };\r\n // Creates `this.el` and renders content inside of it\r\n Popover.prototype.render = function () {\r\n var _this = this;\r\n var options = this.options;\r\n this.el = $('
')\r\n .addClass(options.className || '')\r\n .css({\r\n // position initially to the top left to avoid creating scrollbars\r\n top: 0,\r\n left: 0\r\n })\r\n .append(options.content)\r\n .appendTo(options.parentEl);\r\n // when a click happens on anything inside with a 'fc-close' className, hide the popover\r\n this.el.on('click', '.fc-close', function () {\r\n _this.hide();\r\n });\r\n if (options.autoHide) {\r\n this.listenTo($(document), 'mousedown', this.documentMousedown);\r\n }\r\n };\r\n // Triggered when the user clicks *anywhere* in the document, for the autoHide feature\r\n Popover.prototype.documentMousedown = function (ev) {\r\n // only hide the popover if the click happened outside the popover\r\n if (this.el && !$(ev.target).closest(this.el).length) {\r\n this.hide();\r\n }\r\n };\r\n // Hides and unregisters any handlers\r\n Popover.prototype.removeElement = function () {\r\n this.hide();\r\n if (this.el) {\r\n this.el.remove();\r\n this.el = null;\r\n }\r\n this.stopListeningTo($(document), 'mousedown');\r\n };\r\n // Positions the popover optimally, using the top/left/right options\r\n Popover.prototype.position = function () {\r\n var options = this.options;\r\n var origin = this.el.offsetParent().offset();\r\n var width = this.el.outerWidth();\r\n var height = this.el.outerHeight();\r\n var windowEl = $(window);\r\n var viewportEl = util_1.getScrollParent(this.el);\r\n var viewportTop;\r\n var viewportLeft;\r\n var viewportOffset;\r\n var top; // the \"position\" (not \"offset\") values for the popover\r\n var left; //\r\n // compute top and left\r\n top = options.top || 0;\r\n if (options.left !== undefined) {\r\n left = options.left;\r\n }\r\n else if (options.right !== undefined) {\r\n left = options.right - width; // derive the left value from the right value\r\n }\r\n else {\r\n left = 0;\r\n }\r\n if (viewportEl.is(window) || viewportEl.is(document)) {\r\n viewportEl = windowEl;\r\n viewportTop = 0; // the window is always at the top left\r\n viewportLeft = 0; // (and .offset() won't work if called here)\r\n }\r\n else {\r\n viewportOffset = viewportEl.offset();\r\n viewportTop = viewportOffset.top;\r\n viewportLeft = viewportOffset.left;\r\n }\r\n // if the window is scrolled, it causes the visible area to be further down\r\n viewportTop += windowEl.scrollTop();\r\n viewportLeft += windowEl.scrollLeft();\r\n // constrain to the view port. if constrained by two edges, give precedence to top/left\r\n if (options.viewportConstrain !== false) {\r\n top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);\r\n top = Math.max(top, viewportTop + this.margin);\r\n left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);\r\n left = Math.max(left, viewportLeft + this.margin);\r\n }\r\n this.el.css({\r\n top: top - origin.top,\r\n left: left - origin.left\r\n });\r\n };\r\n // Triggers a callback. Calls a function in the option hash of the same name.\r\n // Arguments beyond the first `name` are forwarded on.\r\n // TODO: better code reuse for this. Repeat code\r\n Popover.prototype.trigger = function (name) {\r\n if (this.options[name]) {\r\n this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\r\n }\r\n };\r\n return Popover;\r\n}());\r\nexports.default = Popover;\r\nListenerMixin_1.default.mixInto(Popover);\r\n\r\n\r\n/***/ }),\r\n/* 250 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\n/* Event-rendering methods for the DayGrid class\r\n----------------------------------------------------------------------------------------------------------------------*/\r\nvar DayGridEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridEventRenderer, _super);\r\n function DayGridEventRenderer(dayGrid, fillRenderer) {\r\n var _this = _super.call(this, dayGrid, fillRenderer) || this;\r\n _this.dayGrid = dayGrid;\r\n return _this;\r\n }\r\n DayGridEventRenderer.prototype.renderBgRanges = function (eventRanges) {\r\n // don't render timed background events\r\n eventRanges = $.grep(eventRanges, function (eventRange) {\r\n return eventRange.eventDef.isAllDay();\r\n });\r\n _super.prototype.renderBgRanges.call(this, eventRanges);\r\n };\r\n // Renders the given foreground event segments onto the grid\r\n DayGridEventRenderer.prototype.renderFgSegs = function (segs) {\r\n var rowStructs = this.rowStructs = this.renderSegRows(segs);\r\n // append to each row's content skeleton\r\n this.dayGrid.rowEls.each(function (i, rowNode) {\r\n $(rowNode).find('.fc-content-skeleton > table').append(rowStructs[i].tbodyEl);\r\n });\r\n };\r\n // Unrenders all currently rendered foreground event segments\r\n DayGridEventRenderer.prototype.unrenderFgSegs = function () {\r\n var rowStructs = this.rowStructs || [];\r\n var rowStruct;\r\n while ((rowStruct = rowStructs.pop())) {\r\n rowStruct.tbodyEl.remove();\r\n }\r\n this.rowStructs = null;\r\n };\r\n // Uses the given events array to generate elements that should be appended to each row's content skeleton.\r\n // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\r\n // PRECONDITION: each segment shoud already have a rendered and assigned `.el`\r\n DayGridEventRenderer.prototype.renderSegRows = function (segs) {\r\n var rowStructs = [];\r\n var segRows;\r\n var row;\r\n segRows = this.groupSegRows(segs); // group into nested arrays\r\n // iterate each row of segment groupings\r\n for (row = 0; row < segRows.length; row++) {\r\n rowStructs.push(this.renderSegRow(row, segRows[row]));\r\n }\r\n return rowStructs;\r\n };\r\n // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains\r\n // the segments. Returns object with a bunch of internal data about how the render was calculated.\r\n // NOTE: modifies rowSegs\r\n DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {\r\n var colCnt = this.dayGrid.colCnt;\r\n var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\r\n var levelCnt = Math.max(1, segLevels.length); // ensure at least one level\r\n var tbody = $('');\r\n var segMatrix = []; // lookup for which segments are rendered into which level+col cells\r\n var cellMatrix = []; // lookup for all elements of the level+col matrix\r\n var loneCellMatrix = []; // lookup for elements that only take up a single column\r\n var i;\r\n var levelSegs;\r\n var col;\r\n var tr;\r\n var j;\r\n var seg;\r\n var td;\r\n // populates empty cells from the current column (`col`) to `endCol`\r\n function emptyCellsUntil(endCol) {\r\n while (col < endCol) {\r\n // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\r\n td = (loneCellMatrix[i - 1] || [])[col];\r\n if (td) {\r\n td.attr('rowspan', parseInt(td.attr('rowspan') || 1, 10) + 1);\r\n }\r\n else {\r\n td = $('');\r\n tr.append(td);\r\n }\r\n cellMatrix[i][col] = td;\r\n loneCellMatrix[i][col] = td;\r\n col++;\r\n }\r\n }\r\n for (i = 0; i < levelCnt; i++) {\r\n levelSegs = segLevels[i];\r\n col = 0;\r\n tr = $('');\r\n segMatrix.push([]);\r\n cellMatrix.push([]);\r\n loneCellMatrix.push([]);\r\n // levelCnt might be 1 even though there are no actual levels. protect against this.\r\n // this single empty row is useful for styling.\r\n if (levelSegs) {\r\n for (j = 0; j < levelSegs.length; j++) {\r\n seg = levelSegs[j];\r\n emptyCellsUntil(seg.leftCol);\r\n // create a container that occupies or more columns. append the event element.\r\n td = $('').append(seg.el);\r\n if (seg.leftCol !== seg.rightCol) {\r\n td.attr('colspan', seg.rightCol - seg.leftCol + 1);\r\n }\r\n else {\r\n loneCellMatrix[i][col] = td;\r\n }\r\n while (col <= seg.rightCol) {\r\n cellMatrix[i][col] = td;\r\n segMatrix[i][col] = seg;\r\n col++;\r\n }\r\n tr.append(td);\r\n }\r\n }\r\n emptyCellsUntil(colCnt); // finish off the row\r\n this.dayGrid.bookendCells(tr);\r\n tbody.append(tr);\r\n }\r\n return {\r\n row: row,\r\n tbodyEl: tbody,\r\n cellMatrix: cellMatrix,\r\n segMatrix: segMatrix,\r\n segLevels: segLevels,\r\n segs: rowSegs\r\n };\r\n };\r\n // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\r\n // NOTE: modifies segs\r\n DayGridEventRenderer.prototype.buildSegLevels = function (segs) {\r\n var levels = [];\r\n var i;\r\n var seg;\r\n var j;\r\n // Give preference to elements with certain criteria, so they have\r\n // a chance to be closer to the top.\r\n this.sortEventSegs(segs);\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n // loop through levels, starting with the topmost, until the segment doesn't collide with other segments\r\n for (j = 0; j < levels.length; j++) {\r\n if (!isDaySegCollision(seg, levels[j])) {\r\n break;\r\n }\r\n }\r\n // `j` now holds the desired subrow index\r\n seg.level = j;\r\n // create new level array if needed and append segment\r\n (levels[j] || (levels[j] = [])).push(seg);\r\n }\r\n // order segments left-to-right. very important if calendar is RTL\r\n for (j = 0; j < levels.length; j++) {\r\n levels[j].sort(compareDaySegCols);\r\n }\r\n return levels;\r\n };\r\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\r\n DayGridEventRenderer.prototype.groupSegRows = function (segs) {\r\n var segRows = [];\r\n var i;\r\n for (i = 0; i < this.dayGrid.rowCnt; i++) {\r\n segRows.push([]);\r\n }\r\n for (i = 0; i < segs.length; i++) {\r\n segRows[segs[i].row].push(segs[i]);\r\n }\r\n return segRows;\r\n };\r\n // Computes a default event time formatting string if `timeFormat` is not explicitly defined\r\n DayGridEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('extraSmallTimeFormat'); // like \"6p\" or \"6:30p\"\r\n };\r\n // Computes a default `displayEventEnd` value if one is not expliclty defined\r\n DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {\r\n return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day\r\n };\r\n // Builds the HTML to be used for the default element for an individual segment\r\n DayGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {\r\n var view = this.view;\r\n var eventDef = seg.footprint.eventDef;\r\n var isAllDay = seg.footprint.componentFootprint.isAllDay;\r\n var isDraggable = view.isEventDefDraggable(eventDef);\r\n var isResizableFromStart = !disableResizing && isAllDay &&\r\n seg.isStart && view.isEventDefResizableFromStart(eventDef);\r\n var isResizableFromEnd = !disableResizing && isAllDay &&\r\n seg.isEnd && view.isEventDefResizableFromEnd(eventDef);\r\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);\r\n var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));\r\n var timeHtml = '';\r\n var timeText;\r\n var titleHtml;\r\n classes.unshift('fc-day-grid-event', 'fc-h-event');\r\n // Only display a timed events time if it is the starting segment\r\n if (seg.isStart) {\r\n timeText = this.getTimeText(seg.footprint);\r\n if (timeText) {\r\n timeHtml = '' + util_1.htmlEscape(timeText) + '';\r\n }\r\n }\r\n titleHtml =\r\n '' +\r\n (util_1.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height\r\n '';\r\n return '' +\r\n '
' +\r\n (this.dayGrid.isRTL ?\r\n titleHtml + ' ' + timeHtml : // put a natural space in between\r\n timeHtml + ' ' + titleHtml //\r\n ) +\r\n '
' +\r\n (isResizableFromStart ?\r\n '
' :\r\n '') +\r\n (isResizableFromEnd ?\r\n '
' :\r\n '') +\r\n '';\r\n };\r\n return DayGridEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = DayGridEventRenderer;\r\n// Computes whether two segments' columns collide. They are assumed to be in the same row.\r\nfunction isDaySegCollision(seg, otherSegs) {\r\n var i;\r\n var otherSeg;\r\n for (i = 0; i < otherSegs.length; i++) {\r\n otherSeg = otherSegs[i];\r\n if (otherSeg.leftCol <= seg.rightCol &&\r\n otherSeg.rightCol >= seg.leftCol) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n// A cmp function for determining the leftmost event\r\nfunction compareDaySegCols(a, b) {\r\n return a.leftCol - b.leftCol;\r\n}\r\n\r\n\r\n/***/ }),\r\n/* 251 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar HelperRenderer_1 = __webpack_require__(58);\r\nvar DayGridHelperRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridHelperRenderer, _super);\r\n function DayGridHelperRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Renders a mock \"helper\" event. `sourceSeg` is the associated internal segment object. It can be null.\r\n DayGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {\r\n var helperNodes = [];\r\n var rowStructs;\r\n // TODO: not good to call eventRenderer this way\r\n rowStructs = this.eventRenderer.renderSegRows(segs);\r\n // inject each new event skeleton into each associated row\r\n this.component.rowEls.each(function (row, rowNode) {\r\n var rowEl = $(rowNode); // the .fc-row\r\n var skeletonEl = $('
'); // will be absolutely positioned\r\n var skeletonTopEl;\r\n var skeletonTop;\r\n // If there is an original segment, match the top position. Otherwise, put it at the row's top level\r\n if (sourceSeg && sourceSeg.row === row) {\r\n skeletonTop = sourceSeg.el.position().top;\r\n }\r\n else {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton tbody');\r\n if (!skeletonTopEl.length) {\r\n skeletonTopEl = rowEl.find('.fc-content-skeleton table');\r\n }\r\n skeletonTop = skeletonTopEl.position().top;\r\n }\r\n skeletonEl.css('top', skeletonTop)\r\n .find('table')\r\n .append(rowStructs[row].tbodyEl);\r\n rowEl.append(skeletonEl);\r\n helperNodes.push(skeletonEl[0]);\r\n });\r\n return $(helperNodes); // must return the elements rendered\r\n };\r\n return DayGridHelperRenderer;\r\n}(HelperRenderer_1.default));\r\nexports.default = DayGridHelperRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 252 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar FillRenderer_1 = __webpack_require__(57);\r\nvar DayGridFillRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(DayGridFillRenderer, _super);\r\n function DayGridFillRenderer() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.fillSegTag = 'td'; // override the default tag name\r\n return _this;\r\n }\r\n DayGridFillRenderer.prototype.attachSegEls = function (type, segs) {\r\n var nodes = [];\r\n var i;\r\n var seg;\r\n var skeletonEl;\r\n for (i = 0; i < segs.length; i++) {\r\n seg = segs[i];\r\n skeletonEl = this.renderFillRow(type, seg);\r\n this.component.rowEls.eq(seg.row).append(skeletonEl);\r\n nodes.push(skeletonEl[0]);\r\n }\r\n return nodes;\r\n };\r\n // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\r\n DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {\r\n var colCnt = this.component.colCnt;\r\n var startCol = seg.leftCol;\r\n var endCol = seg.rightCol + 1;\r\n var className;\r\n var skeletonEl;\r\n var trEl;\r\n if (type === 'businessHours') {\r\n className = 'bgevent';\r\n }\r\n else {\r\n className = type.toLowerCase();\r\n }\r\n skeletonEl = $('
' +\r\n '
' +\r\n '
');\r\n trEl = skeletonEl.find('tr');\r\n if (startCol > 0) {\r\n trEl.append('');\r\n }\r\n trEl.append(seg.el.attr('colspan', endCol - startCol));\r\n if (endCol < colCnt) {\r\n trEl.append('');\r\n }\r\n this.component.bookendCells(trEl);\r\n return skeletonEl;\r\n };\r\n return DayGridFillRenderer;\r\n}(FillRenderer_1.default));\r\nexports.default = DayGridFillRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 253 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar BasicViewDateProfileGenerator_1 = __webpack_require__(228);\r\nvar UnzonedRange_1 = __webpack_require__(5);\r\nvar MonthViewDateProfileGenerator = /** @class */ (function (_super) {\r\n tslib_1.__extends(MonthViewDateProfileGenerator, _super);\r\n function MonthViewDateProfileGenerator() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // Computes the date range that will be rendered.\r\n MonthViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {\r\n var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay);\r\n var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);\r\n var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);\r\n var rowCnt;\r\n // ensure 6 weeks\r\n if (this.opt('fixedWeekCount')) {\r\n rowCnt = Math.ceil(// could be partial weeks due to hiddenDays\r\n end.diff(start, 'weeks', true) // dontRound=true\r\n );\r\n end.add(6 - rowCnt, 'weeks');\r\n }\r\n return new UnzonedRange_1.default(start, end);\r\n };\r\n return MonthViewDateProfileGenerator;\r\n}(BasicViewDateProfileGenerator_1.default));\r\nexports.default = MonthViewDateProfileGenerator;\r\n\r\n\r\n/***/ }),\r\n/* 254 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar util_1 = __webpack_require__(4);\r\nvar EventRenderer_1 = __webpack_require__(42);\r\nvar ListEventRenderer = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventRenderer, _super);\r\n function ListEventRenderer() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n ListEventRenderer.prototype.renderFgSegs = function (segs) {\r\n if (!segs.length) {\r\n this.component.renderEmptyMessage();\r\n }\r\n else {\r\n this.component.renderSegList(segs);\r\n }\r\n };\r\n // generates the HTML for a single event row\r\n ListEventRenderer.prototype.fgSegHtml = function (seg) {\r\n var view = this.view;\r\n var calendar = view.calendar;\r\n var theme = calendar.theme;\r\n var eventFootprint = seg.footprint;\r\n var eventDef = eventFootprint.eventDef;\r\n var componentFootprint = eventFootprint.componentFootprint;\r\n var url = eventDef.url;\r\n var classes = ['fc-list-item'].concat(this.getClasses(eventDef));\r\n var bgColor = this.getBgColor(eventDef);\r\n var timeHtml;\r\n if (componentFootprint.isAllDay) {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n else if (view.isMultiDayRange(componentFootprint.unzonedRange)) {\r\n if (seg.isStart || seg.isEnd) {\r\n timeHtml = util_1.htmlEscape(this._getTimeText(calendar.msToMoment(seg.startMs), calendar.msToMoment(seg.endMs), componentFootprint.isAllDay));\r\n }\r\n else {\r\n timeHtml = view.getAllDayHtml();\r\n }\r\n }\r\n else {\r\n // Display the normal time text for the *event's* times\r\n timeHtml = util_1.htmlEscape(this.getTimeText(eventFootprint));\r\n }\r\n if (url) {\r\n classes.push('fc-has-url');\r\n }\r\n return '' +\r\n (this.displayEventTime ?\r\n '' +\r\n (timeHtml || '') +\r\n '' :\r\n '') +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n util_1.htmlEscape(eventDef.title || '') +\r\n '' +\r\n '' +\r\n '';\r\n };\r\n // like \"4:00am\"\r\n ListEventRenderer.prototype.computeEventTimeFormat = function () {\r\n return this.opt('mediumTimeFormat');\r\n };\r\n return ListEventRenderer;\r\n}(EventRenderer_1.default));\r\nexports.default = ListEventRenderer;\r\n\r\n\r\n/***/ }),\r\n/* 255 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar $ = __webpack_require__(3);\r\nvar EventPointing_1 = __webpack_require__(59);\r\nvar ListEventPointing = /** @class */ (function (_super) {\r\n tslib_1.__extends(ListEventPointing, _super);\r\n function ListEventPointing() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n // for events with a url, the whole should be clickable,\r\n // but it's impossible to wrap with an tag. simulate this.\r\n ListEventPointing.prototype.handleClick = function (seg, ev) {\r\n var url;\r\n _super.prototype.handleClick.call(this, seg, ev); // might prevent the default action\r\n // not clicking on or within an with an href\r\n if (!$(ev.target).closest('a[href]').length) {\r\n url = seg.footprint.eventDef.url;\r\n if (url && !ev.isDefaultPrevented()) {\r\n window.location.href = url; // simulate link click\r\n }\r\n }\r\n };\r\n return ListEventPointing;\r\n}(EventPointing_1.default));\r\nexports.default = ListEventPointing;\r\n\r\n\r\n/***/ }),\r\n/* 256 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar EventSourceParser_1 = __webpack_require__(38);\r\nvar ArrayEventSource_1 = __webpack_require__(52);\r\nvar FuncEventSource_1 = __webpack_require__(215);\r\nvar JsonFeedEventSource_1 = __webpack_require__(216);\r\nEventSourceParser_1.default.registerClass(ArrayEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(FuncEventSource_1.default);\r\nEventSourceParser_1.default.registerClass(JsonFeedEventSource_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 257 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ThemeRegistry_1 = __webpack_require__(51);\r\nvar StandardTheme_1 = __webpack_require__(213);\r\nvar JqueryUiTheme_1 = __webpack_require__(214);\r\nvar Bootstrap3Theme_1 = __webpack_require__(258);\r\nvar Bootstrap4Theme_1 = __webpack_require__(259);\r\nThemeRegistry_1.defineThemeSystem('standard', StandardTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('jquery-ui', JqueryUiTheme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap3', Bootstrap3Theme_1.default);\r\nThemeRegistry_1.defineThemeSystem('bootstrap4', Bootstrap4Theme_1.default);\r\n\r\n\r\n/***/ }),\r\n/* 258 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap3Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap3Theme, _super);\r\n function Bootstrap3Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap3Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap3Theme;\r\nBootstrap3Theme.prototype.classes = {\r\n widget: 'fc-bootstrap3',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-default',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'panel panel-default',\r\n popoverHeader: 'panel-heading',\r\n popoverContent: 'panel-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `panel` class b/c don't want margins/radius. only border color.\r\n headerRow: 'panel-default',\r\n dayRow: 'panel-default',\r\n // list view\r\n listView: 'panel panel-default'\r\n};\r\nBootstrap3Theme.prototype.baseIconClass = 'glyphicon';\r\nBootstrap3Theme.prototype.iconClasses = {\r\n close: 'glyphicon-remove',\r\n prev: 'glyphicon-chevron-left',\r\n next: 'glyphicon-chevron-right',\r\n prevYear: 'glyphicon-backward',\r\n nextYear: 'glyphicon-forward'\r\n};\r\nBootstrap3Theme.prototype.iconOverrideOption = 'bootstrapGlyphicons';\r\nBootstrap3Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapGlyphicon';\r\nBootstrap3Theme.prototype.iconOverridePrefix = 'glyphicon-';\r\n\r\n\r\n/***/ }),\r\n/* 259 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(2);\r\nvar Theme_1 = __webpack_require__(19);\r\nvar Bootstrap4Theme = /** @class */ (function (_super) {\r\n tslib_1.__extends(Bootstrap4Theme, _super);\r\n function Bootstrap4Theme() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Bootstrap4Theme;\r\n}(Theme_1.default));\r\nexports.default = Bootstrap4Theme;\r\nBootstrap4Theme.prototype.classes = {\r\n widget: 'fc-bootstrap4',\r\n tableGrid: 'table-bordered',\r\n tableList: 'table',\r\n tableListHeading: 'table-active',\r\n buttonGroup: 'btn-group',\r\n button: 'btn btn-primary',\r\n stateActive: 'active',\r\n stateDisabled: 'disabled',\r\n today: 'alert alert-info',\r\n popover: 'card card-primary',\r\n popoverHeader: 'card-header',\r\n popoverContent: 'card-body',\r\n // day grid\r\n // for left/right border color when border is inset from edges (all-day in agenda view)\r\n // avoid `table` class b/c don't want margins/padding/structure. only border color.\r\n headerRow: 'table-bordered',\r\n dayRow: 'table-bordered',\r\n // list view\r\n listView: 'card card-primary'\r\n};\r\nBootstrap4Theme.prototype.baseIconClass = 'fa';\r\nBootstrap4Theme.prototype.iconClasses = {\r\n close: 'fa-times',\r\n prev: 'fa-chevron-left',\r\n next: 'fa-chevron-right',\r\n prevYear: 'fa-angle-double-left',\r\n nextYear: 'fa-angle-double-right'\r\n};\r\nBootstrap4Theme.prototype.iconOverrideOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';\r\nBootstrap4Theme.prototype.iconOverridePrefix = 'fa-';\r\n\r\n\r\n/***/ }),\r\n/* 260 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar BasicView_1 = __webpack_require__(62);\r\nvar MonthView_1 = __webpack_require__(229);\r\nViewRegistry_1.defineView('basic', {\r\n 'class': BasicView_1.default\r\n});\r\nViewRegistry_1.defineView('basicDay', {\r\n type: 'basic',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('basicWeek', {\r\n type: 'basic',\r\n duration: { weeks: 1 }\r\n});\r\nViewRegistry_1.defineView('month', {\r\n 'class': MonthView_1.default,\r\n duration: { months: 1 },\r\n defaults: {\r\n fixedWeekCount: true\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 261 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar AgendaView_1 = __webpack_require__(226);\r\nViewRegistry_1.defineView('agenda', {\r\n 'class': AgendaView_1.default,\r\n defaults: {\r\n allDaySlot: true,\r\n slotDuration: '00:30:00',\r\n slotEventOverlap: true // a bad name. confused with overlap/constraint system\r\n }\r\n});\r\nViewRegistry_1.defineView('agendaDay', {\r\n type: 'agenda',\r\n duration: { days: 1 }\r\n});\r\nViewRegistry_1.defineView('agendaWeek', {\r\n type: 'agenda',\r\n duration: { weeks: 1 }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 262 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar ViewRegistry_1 = __webpack_require__(22);\r\nvar ListView_1 = __webpack_require__(230);\r\nViewRegistry_1.defineView('list', {\r\n 'class': ListView_1.default,\r\n buttonTextKey: 'list',\r\n defaults: {\r\n buttonText: 'list',\r\n listDayFormat: 'LL',\r\n noEventsMessage: 'No events to display'\r\n }\r\n});\r\nViewRegistry_1.defineView('listDay', {\r\n type: 'list',\r\n duration: { days: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header\r\n }\r\n});\r\nViewRegistry_1.defineView('listWeek', {\r\n type: 'list',\r\n duration: { weeks: 1 },\r\n defaults: {\r\n listDayFormat: 'dddd',\r\n listDayAltFormat: 'LL'\r\n }\r\n});\r\nViewRegistry_1.defineView('listMonth', {\r\n type: 'list',\r\n duration: { month: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\nViewRegistry_1.defineView('listYear', {\r\n type: 'list',\r\n duration: { year: 1 },\r\n defaults: {\r\n listDayAltFormat: 'dddd' // day-of-week is nice-to-have\r\n }\r\n});\r\n\r\n\r\n/***/ }),\r\n/* 263 */\r\n/***/ (function(module, exports) {\r\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n\r\n\r\n/***/ })\r\n/******/ ]);\r\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./static/fullcalendar/fullcalendar.js\n// module id = 299\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('full-calendar-reserve',{attrs:{\"show-modal\":_vm.showModalReserve,\"startDate\":_vm.startDate,\"endDate\":_vm.endDate,\"resources-checkboxes\":_vm.resourcesCheckboxes,\"number-of-resources\":_vm.selectedResources.length,\"add-reservation\":_vm.addReservation},on:{\"close\":function($event){_vm.showModalReserve = false}}}),_vm._v(\" \"),_c('full-calendar-info',{attrs:{\"show-modal\":_vm.showModalInfo,\"reservation\":_vm.reservation,\"cancel\":_vm.cancelReservation,\"update\":_vm.updateReservation,\"refreshTasks\":_vm.refreshTasks,\"nodes\":_vm.nodes},on:{\"close\":function($event){_vm.showModalInfo = false},\"handleError\":_vm.handleError}})],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-17877d92\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/FullCalendar.vue\n// module id = 300\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-73dcc08a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./MySchedule.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./MySchedule.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./MySchedule.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-73dcc08a\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./MySchedule.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-73dcc08a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/reserve_resources/MySchedule.vue\n// module id = 301\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"range-select-container\"},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"scale-transition\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},model:{value:(_vm.menu),callback:function ($$v) {_vm.menu=$$v},expression:\"menu\"}},[_c('v-text-field',{staticClass:\"date-input\",attrs:{\"slot\":\"activator\",\"label\":\"Schedule start date\",\"prepend-icon\":\"event\",\"readonly\":\"\"},slot:\"activator\",model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}}),_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.menu = false; _vm.changeSchedule()}},model:{value:(_vm.picker),callback:function ($$v) {_vm.picker=$$v},expression:\"picker\"}})],1),_vm._v(\" \"),_c('v-text-field',{staticClass:\"range-input\",attrs:{\"min\":\"1\",\"step\":\"1\",\"type\":\"number\",\"label\":\"Schedule range in days\"},on:{\"input\":function($event){return _vm.changeSchedule()}},model:{value:(_vm.range),callback:function ($$v) {_vm.range=$$v},expression:\"range\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"container-header\"},[_c('div',{staticClass:\"left-table-header\"},[_vm._m(0),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":\"Change all\"},on:{\"change\":_vm.changeAll},model:{value:(_vm.changeAllCheckbox),callback:function ($$v) {_vm.changeAllCheckbox=$$v},expression:\"changeAllCheckbox\"}})],1)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"right-table-header\",attrs:{\"id\":\"right-header\"}},[_c('table',[_c('tbody',_vm._l((_vm.tableContent.header),function(header){return _c('th',{key:header.value},[_vm._v(_vm._s(header.value))])}),0)]),_vm._v(\" \"),_c('table',[_c('tbody',[_c('tr',_vm._l((_vm.tableContent.hours),function(hours){return _c('td',{key:hours.id,staticClass:\"hours\"},[_vm._v(_vm._s(hours.value))])}),0)])])])]),_vm._v(\" \"),_c('div',{staticClass:\"container-content\"},[_c('div',{staticClass:\"left-table\",attrs:{\"id\":\"left-table\"}},[_c('div',{key:_vm.leftTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',[_c('td',{staticClass:\"first-column\"},[_c('div',{staticClass:\"node-cell\"},[_c('v-checkbox',{staticClass:\"small-checkbox-node\",attrs:{\"color\":\"success\",\"label\":(\"\" + (node.nodeName)),\"input-value\":\"\"},on:{\"change\":function($event){return _vm.changeWholeNode(node.nodeName)}},model:{value:(node.selected),callback:function ($$v) {_vm.$set(node, \"selected\", $$v)},expression:\"node.selected\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"mx-2 small-button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"info\"},on:{\"click\":function($event){return _vm.toggle(node)}}},[(node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"add\")]):_vm._e(),_vm._v(\" \"),(!node.hidden)?_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"remove\")]):_vm._e()],1)],1)])])]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},[_c('td',{staticClass:\"first-column\"},[_c('v-checkbox',{staticClass:\"small-checkbox\",attrs:{\"color\":\"success\",\"label\":(\"\" + (_vm.tableContent.resources[resourceUUID].name))},on:{\"change\":function($event){return _vm.changeResource(node.nodeName, resourceUUID)}},model:{value:(_vm.tableContent.resources[resourceUUID].selected),callback:function ($$v) {_vm.$set(_vm.tableContent.resources[resourceUUID], \"selected\", $$v)},expression:\"tableContent.resources[resourceUUID].selected\"}})],1)])}),0)])}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"right-table\",attrs:{\"id\":\"right-table\"}},[_c('div',{key:_vm.rightTableKey},_vm._l((_vm.tableContent.nodes),function(node){return _c('table',{key:node.nodeName},[_c('tbody',[_c('tr',_vm._l((node.slots),function(slot){return _c('td',{key:slot.id},[_vm._v(_vm._s(slot.value))])}),0)]),_vm._v(\" \"),_c('tbody',{directives:[{name:\"show\",rawName:\"v-show\",value:(!node.hidden),expression:\"!node.hidden\"}]},_vm._l((node.resources),function(resourceUUID){return _c('tr',{key:resourceUUID},_vm._l((_vm.tableContent.resources[resourceUUID].slots),function(slot){return _c('td',{key:slot.id,class:{ 'reserved': slot.reserved, 'userReservation': slot.userReservation }},[_vm._v(_vm._s(slot.value))])}),0)}),0)])}),0)])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',[_c('tbody',[_c('th',{staticClass:\"first-column\"},[_vm._v(\"Resources\")])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-73dcc08a\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/reserve_resources/MySchedule.vue\n// module id = 306\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-snackbar',{attrs:{\"color\":\"error\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"white\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"\\n Close\\n \")])],1),_vm._v(\" \"),(!_vm.showSchedule)?_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=true;}}},[_vm._v(\"\\n Select visible GPUs\\n \")]):_vm._e(),_vm._v(\" \"),_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showSchedule),expression:\"showSchedule\"}],attrs:{\"id\":\"schedule_section\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"small\":\"\",\"round\":\"\"},on:{\"click\":function($event){_vm.showSchedule=false}}},[_vm._v(\"\\n Hide schedule\\n \")]),_vm._v(\" \"),_c('MySchedule',{attrs:{\"parsed-nodes\":_vm.parsedNodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)},\"loadResources\":function($event){return _vm.loadResources.apply(void 0, arguments)}}})],1),_vm._v(\" \"),_c('section',{attrs:{\"id\":\"calendar_section\"}},[_c('FullCalendar',{attrs:{\"update-calendar\":_vm.updateCalendar,\"selected-resources\":_vm.selectedResources,\"nodes\":_vm.nodes},on:{\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-a758ccee\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/ReservationsOverview.vue\n// module id = 307\n// module chunks = 1","var normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./NodesOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./NodesOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-18fc6060\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./NodesOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/NodesOverview.vue\n// module id = 308\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-14692e23\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WatchGenerator.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchGenerator.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchGenerator.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-14692e23\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./WatchGenerator.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/nodes_overview/WatchGenerator.vue\n// module id = 309\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-4fc23b68\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./WatchBox.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchBox.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./WatchBox.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4fc23b68\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./WatchBox.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/nodes_overview/WatchBox.vue\n// module id = 311\n// module chunks = 1","var normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./LineChart.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./LineChart.vue\"\n/* template */\nvar __vue_template__ = null\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/nodes_overview/LineChart.vue\n// module id = 313\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"select_line\"},[_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.nodes},model:{value:(_vm.selectedNode),callback:function ($$v) {_vm.selectedNode=$$v},expression:\"selectedNode\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.resourceTypes},model:{value:(_vm.selectedResourceType),callback:function ($$v) {_vm.selectedResourceType=$$v},expression:\"selectedResourceType\"}}),_vm._v(\" \"),_c('div',{staticClass:\"select_space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"select_item\",attrs:{\"items\":_vm.metrics},model:{value:(_vm.selectedMetric),callback:function ($$v) {_vm.selectedMetric=$$v},expression:\"selectedMetric\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),(_vm.showProcesses === true)?_c('div',{staticClass:\"table_box\"},[_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.processes,\"item-key\":\"pid\",\"hide-actions\":\"\"},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',{on:{\"click\":function($event){props.expanded = !props.expanded}}},[_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.index))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.owner))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',{staticClass:\"text-xs-right\"},[_vm._v(_vm._s(props.item.command))])])]}},{key:\"expand\",fn:function(props){return [_c('v-card',{attrs:{\"flat\":\"\"}},[_c('v-card-text',[_vm._v(\"GPU UUID: \"+_vm._s(props.item.uuid))])],1)]}}],null,false,51043860)})],1):_c('div',[_c('LineChart',{staticClass:\"chart_box\",attrs:{\"chart-data\":_vm.metricData,\"options\":_vm.metricOptions,\"rerender-chart\":_vm.rerenderChart,\"update-chart\":_vm.updateChart}})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-4fc23b68\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/nodes_overview/WatchBox.vue\n// module id = 318\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"watch_table\"},[_vm._l((_vm.watches),function(watch){return _c('WatchBox',{key:watch.id,staticClass:\"watch_box\",attrs:{\"default-node\":watch.defaultNode,\"default-resource-type\":watch.defaultResourceType,\"default-metric\":watch.defaultMetric,\"resources-indexes\":_vm.resourcesIndexes,\"chart-datasets\":_vm.chartDatasets,\"update-chart\":_vm.updateChart,\"time\":_vm.time},on:{\"changeDefaultNode\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultNode.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultResourceType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultResourceType.apply(void 0, [ watch.id ].concat( argsArray ))},\"changeDefaultMetric\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeDefaultMetric.apply(void 0, [ watch.id ].concat( argsArray ))},\"deleteWatch\":function($event){return _vm.deleteWatch(watch.id)}}})}),_vm._v(\" \"),_c('div',{staticClass:\"button_box\"},[_c('v-btn',{staticClass:\"big_button\",attrs:{\"fab\":\"\",\"dark\":\"\",\"color\":\"#b8bcc2\"},on:{\"click\":_vm.addWatch}},[_c('v-icon',{attrs:{\"size\":\"100px\",\"dark\":\"\"}},[_vm._v(\"add\")])],1)],1)],2)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-14692e23\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/nodes_overview/WatchGenerator.vue\n// module id = 319\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('WatchGenerator')],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-18fc6060\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/NodesOverview.vue\n// module id = 320\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-682605b4\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TasksOverview.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TasksOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TasksOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-682605b4\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TasksOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/TasksOverview.vue\n// module id = 321\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-c5e32eee\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskCreate.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskCreate.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskCreate.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c5e32eee\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskCreate.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-c5e32eee\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskCreate.vue\n// module id = 323\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-68056994\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLine.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLine.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLine.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-68056994\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLine.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-68056994\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLine.vue\n// module id = 325\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-dcbdcc6c\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLineParameter.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineParameter.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineParameter.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-dcbdcc6c\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLineParameter.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLineParameter.vue\n// module id = 330\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newParameter,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-dcbdcc6c\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLineParameter.vue\n// module id = 332\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-3a9cfdb2\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLineEnvVariable.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineEnvVariable.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineEnvVariable.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3a9cfdb2\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLineEnvVariable.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLineEnvVariable.vue\n// module id = 333\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":_vm.newEnvVariable,\"small\":\"\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}}),_vm._v(\" \"),_c('v-btn',{staticClass:\"remove-button\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-3a9cfdb2\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLineEnvVariable.vue\n// module id = 335\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ed523d5c\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLineTfConfig.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineTfConfig.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLineTfConfig.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ed523d5c\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLineTfConfig.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ed523d5c\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLineTfConfig.vue\n// module id = 336\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1f240f3d\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TfConfigEdit.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TfConfigEdit.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TfConfigEdit.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1f240f3d\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TfConfigEdit.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1f240f3d\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TfConfigEdit.vue\n// module id = 338\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"TF_CONFIG editor\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-textarea',{attrs:{\"solo\":\"\",\"auto-grow\":\"\",\"label\":\"Enter TF_CONFIG JSON here\"},model:{value:(_vm.newValue),callback:function ($$v) {_vm.newValue=$$v},expression:\"newValue\"}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-tooltip',{attrs:{\"disabled\":_vm.properJson,\"top\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('div',_vm._g({},on),[_c('v-btn',{attrs:{\"color\":\"success\",\"disabled\":!_vm.properJson},on:{\"click\":function($event){return _vm.save()}}},[_vm._v(\"\\n Save\\n \")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"TF_CONFIG needs to be proper JSON object\")])])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1f240f3d\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TfConfigEdit.vue\n// module id = 340\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('TfConfigEdit',{attrs:{\"value\":_vm.newValue,\"show-modal\":_vm.showModalTfConfigEdit},on:{\"close\":function($event){_vm.showModalTfConfigEdit = false},\"updateValue\":function($event){return _vm.updateValue.apply(void 0, arguments)}}}),_vm._v(\" \"),(_vm.enableSmartTfConfig)?_c('v-layout',[_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Port\",\"small\":\"\"},model:{value:(_vm.newPort),callback:function ($$v) {_vm.newPort=$$v},expression:\"newPort\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-combobox',{staticClass:\"tf-wide\",attrs:{\"label\":\"Task type\",\"items\":_vm.taskTypeItems},model:{value:(_vm.newTaskType),callback:function ($$v) {_vm.newTaskType=$$v},expression:\"newTaskType\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),(_vm.newTaskIndex >= 0)?_c('v-text-field',{staticClass:\"tf-short\",attrs:{\"label\":\"Index\",\"type\":\"number\",\"small\":\"\"},model:{value:(_vm.newTaskIndex),callback:function ($$v) {_vm.newTaskIndex=$$v},expression:\"newTaskIndex\"}}):_vm._e()],1):_c('v-btn',{staticClass:\"task-input\",attrs:{\"color\":\"info\",\"round\":\"\",\"medium\":\"\"},on:{\"click\":function($event){_vm.showModalTfConfigEdit = true}}},[_vm._v(\"\\n TF_CONFIG\\n \")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"bottom\":\"\",\"color\":\"red\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticClass:\"remove-button remove-button-tf\",attrs:{\"color\":\"indigo\",\"fab\":\"\",\"dark\":\"\",\"small\":\"\",\"outline\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},on),[_c('v-icon',{attrs:{\"dark\":\"\"}},[_vm._v(\"delete\")])],1)]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Delete TF_CONFIG\")])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ed523d5c\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLineTfConfig.vue\n// module id = 341\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-center\":\"\"}},[_c('div',{staticClass:\"task-preview\"},[_vm._v(\"\\n \"+_vm._s(_vm.taskPreview)+\"\\n \")])]),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostnames,\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-select',{staticClass:\"task-select\",attrs:{\"items\":_vm.hostResources,\"label\":\"Resource\",\"small\":\"\"},model:{value:(_vm.newResource),callback:function ($$v) {_vm.newResource=$$v},expression:\"newResource\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[(_vm.newEnableTfConfig)?_c('TaskLineTfConfig',{attrs:{\"value\":_vm.tfConfig,\"port\":_vm.tfConfigPort,\"task-type\":_vm.tfConfigTaskType,\"task-index\":_vm.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeTfConfig\":function($event){return _vm.changeTfConfig.apply(void 0, arguments)},\"deleteTfConfig\":function($event){return _vm.deleteTfConfig()},\"updateTfConfigPort\":function($event){return _vm.updateTfConfigPort.apply(void 0, arguments)},\"updateTfConfigTaskType\":function($event){return _vm.updateTfConfigTaskType.apply(void 0, arguments)},\"updateTfConfigTaskIndex\":function($event){return _vm.updateTfConfigTaskIndex.apply(void 0, arguments)}}}):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.envVariables),function(envVariable){return _c('TaskLineEnvVariable',{key:envVariable.id,staticClass:\"task-input\",attrs:{\"envVariable\":envVariable.envVariable,\"value\":envVariable.value},on:{\"changeEnvVariable\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeEnvVariable.apply(void 0, [ envVariable.id ].concat( argsArray ))},\"deleteEnvVariable\":function($event){return _vm.deleteEnvVariable(envVariable.id)}}})}),1),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"task-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},_vm._l((_vm.parameters),function(parameter){return _c('TaskLineParameter',{key:parameter.id,staticClass:\"task-input\",attrs:{\"parameter\":parameter.parameter,\"value\":parameter.value},on:{\"changeParameter\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeParameter.apply(void 0, [ parameter.id ].concat( argsArray ))},\"deleteParameter\":function($event){return _vm.deleteParameter(parameter.id)}}})}),1),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"error\",\"small\":\"\"},on:{\"click\":function($event){return _vm.removeMe()}}},[_vm._v(\"\\n Remove task\\n \")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-68056994\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLine.vue\n// module id = 342\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({},on),[_vm._v(\"\\n info\\n \")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"CPU tasks can be run without making reservation.\\n \"),_c('br'),_vm._v(\"When you want to create a GPU task, you must\\n \"),_c('br'),_vm._v(\"first ensure that you are eligible to do so\\n \"),_c('br'),_vm._v(\"(having active reservation for that GPU).\\n \")])]),_vm._v(\" \"),(_vm.chosenTemplate === 'tf2')?_c('v-switch',{staticClass:\"float-right-button\",attrs:{\"label\":\"Smart TF_CONFIG\"},model:{value:(_vm.enableSmartTfConfig),callback:function ($$v) {_vm.enableSmartTfConfig=$$v},expression:\"enableSmartTfConfig\"}}):_vm._e()],1),_vm._v(\" \"),_c('v-card-text',_vm._l((_vm.lines),function(line){return _c('TaskLine',{key:line.id,attrs:{\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"host\":line.host,\"resource\":line.resource,\"envVariables\":line.envVariables,\"staticEnvVariables\":_vm.staticEnvVariables,\"command\":line.command,\"parameters\":line.parameters,\"staticParameters\":_vm.staticParameters,\"enable-tf-config\":line.enableTfConfig,\"tf-config\":line.tfConfig,\"tf-config-port\":line.tfConfigPort,\"tf-config-task-type\":line.tfConfigTaskType,\"tf-config-task-index\":line.tfConfigTaskIndex,\"tf-cluster\":_vm.tfCluster,\"enable-smart-tf-config\":_vm.enableSmartTfConfig},on:{\"changeLine\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.changeLine.apply(void 0, [ line.id ].concat( argsArray ))},\"deleteLine\":function($event){return _vm.deleteLine(line.id)},\"staticParameterChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"psWorkerParameterChanged\":function($event){return _vm.updatePsWorkerHosts(-1, '')},\"staticEnvVariableChanged\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableChanged.apply(void 0, [ line.id ].concat( argsArray ))},\"staticParameterDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticParameterDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"staticEnvVariableDeleted\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.staticEnvVariableDeleted.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigPort\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigPort.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskType\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskType.apply(void 0, [ line.id ].concat( argsArray ))},\"updateTfConfigTaskIndex\":function($event){\nvar i = arguments.length, argsArray = Array(i);\nwhile ( i-- ) argsArray[i] = arguments[i];\nreturn _vm.updateTfConfigTaskIndex.apply(void 0, [ line.id ].concat( argsArray ))}}})}),1),_vm._v(\" \"),_c('v-card-text',[_c('v-flex',{attrs:{\"xs12\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"info\",\"block\":\"\",\"small\":\"\"},on:{\"click\":_vm.copyLine}},[_vm._v(\"\\n Add task\\n \")])],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"parameter-name-input\",attrs:{\"label\":\"Parameter name\",\"small\":\"\"},model:{value:(_vm.newParameter),callback:function ($$v) {_vm.newParameter=$$v},expression:\"newParameter\"}}),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addEnvVariable}},[_vm._v(\"\\n Add as ENV variable to all tasks\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"info\",\"round\":\"\"},on:{\"click\":_vm.addParameter}},[_vm._v(\"\\n Add as parameter to all tasks\\n \")]),_vm._v(\" \"),_c('v-checkbox',{attrs:{\"label\":\"Static\"},model:{value:(_vm.isNewFieldStatic),callback:function ($$v) {_vm.isNewFieldStatic=$$v},expression:\"isNewFieldStatic\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.addTasks}},[_vm._v(\"\\n Create all tasks\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-c5e32eee\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskCreate.vue\n// module id = 343\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-ab402584\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskEdit.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskEdit.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskEdit.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ab402584\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskEdit.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ab402584\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskEdit.vue\n// module id = 344\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Edit task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-text-field',{staticClass:\"host-input\",attrs:{\"label\":\"Hostname\",\"small\":\"\"},model:{value:(_vm.newHost),callback:function ($$v) {_vm.newHost=$$v},expression:\"newHost\"}}),_vm._v(\" \"),_c('span',{staticClass:\"space\"}),_vm._v(\" \"),_c('v-text-field',{staticClass:\"command-input\",attrs:{\"label\":\"Command\",\"small\":\"\"},model:{value:(_vm.newCommand),callback:function ($$v) {_vm.newCommand=$$v},expression:\"newCommand\"}})],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.changeTask}},[_vm._v(\"\\n Edit task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-ab402584\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskEdit.vue\n// module id = 346\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-21a65550\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskSchedule.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskSchedule.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskSchedule.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-21a65550\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskSchedule.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-21a65550\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskSchedule.vue\n// module id = 347\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"40vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Schedule task\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set spawn time\"},model:{value:(_vm.spawn),callback:function ($$v) {_vm.spawn=$$v},expression:\"spawn\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}},on))]}}]),model:{value:(_vm.spawnDateMenu),callback:function ($$v) {_vm.spawnDateMenu=$$v},expression:\"spawnDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.spawnDateMenu = false}},model:{value:(_vm.newSpawnDate),callback:function ($$v) {_vm.newSpawnDate=$$v},expression:\"newSpawnDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"spawnMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newSpawnTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newSpawnTime=$event},\"update:return-value\":function($event){_vm.newSpawnTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Spawn time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}},on))]}}]),model:{value:(_vm.spawnTimeMenu),callback:function ($$v) {_vm.spawnTimeMenu=$$v},expression:\"spawnTimeMenu\"}},[_vm._v(\" \"),(_vm.spawnTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.spawnMenu.save(_vm.newSpawnTime)}},model:{value:(_vm.newSpawnTime),callback:function ($$v) {_vm.newSpawnTime=$$v},expression:\"newSpawnTime\"}}):_vm._e()],1)],1),_vm._v(\" \"),_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"label\":\"Set terminate time\"},model:{value:(_vm.terminate),callback:function ($$v) {_vm.terminate=$$v},expression:\"terminate\"}}),_vm._v(\" \"),_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"min-width\":\"290px\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate date\",\"prepend-icon\":\"event\"},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}},on))]}}]),model:{value:(_vm.terminateDateMenu),callback:function ($$v) {_vm.terminateDateMenu=$$v},expression:\"terminateDateMenu\"}},[_vm._v(\" \"),_c('v-date-picker',{on:{\"input\":function($event){_vm.terminateDateMenu = false}},model:{value:(_vm.newTerminateDate),callback:function ($$v) {_vm.newTerminateDate=$$v},expression:\"newTerminateDate\"}})],1),_vm._v(\" \"),_c('v-menu',{ref:\"terminateMenu\",attrs:{\"close-on-content-click\":false,\"nudge-right\":40,\"return-value\":_vm.newTerminateTime,\"lazy\":\"\",\"transition\":\"none\",\"offset-y\":\"\",\"full-width\":\"\",\"max-width\":\"290px\",\"min-width\":\"290px\"},on:{\"update:returnValue\":function($event){_vm.newTerminateTime=$event},\"update:return-value\":function($event){_vm.newTerminateTime=$event}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-text-field',_vm._g({attrs:{\"label\":\"Terminate time\",\"prepend-icon\":\"access_time\"},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}},on))]}}]),model:{value:(_vm.terminateTimeMenu),callback:function ($$v) {_vm.terminateTimeMenu=$$v},expression:\"terminateTimeMenu\"}},[_vm._v(\" \"),(_vm.terminateTimeMenu)?_c('v-time-picker',{attrs:{\"full-width\":\"\",\"format\":\"24hr\"},on:{\"click:minute\":function($event){return _vm.$refs.terminateMenu.save(_vm.newTerminateTime)}},model:{value:(_vm.newTerminateTime),callback:function ($$v) {_vm.newTerminateTime=$$v},expression:\"newTerminateTime\"}}):_vm._e()],1)],1)],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":_vm.checkActionFlag}},[_vm._v(\"\\n Schedule task\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-21a65550\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskSchedule.vue\n// module id = 349\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-246122fb\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskLog.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLog.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskLog.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-246122fb\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskLog.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-246122fb\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskLog.vue\n// module id = 350\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Task log\")])],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n \"+_vm._s(_vm.path)+\"\\n \"),_c('div',{staticClass:\"log_box\"},_vm._l((_vm.lines),function(line,index){return _c('div',{key:index},[_vm._v(\"\\n \"+_vm._s(line)+\"\\n \")])}),0)])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-246122fb\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskLog.vue\n// module id = 352\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-775c6214\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./TaskTemplateChooser.vue\")\n}\nvar normalizeComponent = require(\"!../../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskTemplateChooser.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../../node_modules/vue-loader/lib/selector?type=script&index=0!./TaskTemplateChooser.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-775c6214\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./TaskTemplateChooser.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-775c6214\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/tasks_overview/TaskTemplateChooser.vue\n// module id = 353\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"width\":\"80vw\"},model:{value:(_vm.show),callback:function ($$v) {_vm.show=$$v},expression:\"show\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){return _vm.close()}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Choose framework template\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('v-select',{attrs:{\"items\":_vm.possibleTemplates,\"label\":\"Choose template from list\",\"solo\":\"\"},on:{\"change\":_vm.setChosenTemplate}})],1),_vm._v(\" \"),_c('v-card-text',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\"},on:{\"click\":function($event){return _vm.goToCreate()}}},[_vm._v(\"\\n Go to task creator\\n \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-775c6214\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/tasks_overview/TaskTemplateChooser.vue\n// module id = 355\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('TaskCreate',{attrs:{\"show-modal\":_vm.showModalCreate,\"hostnames\":_vm.hostnames,\"hosts\":_vm.hosts,\"actionFlag\":_vm.actionFlag,\"chosen-template\":_vm.chosenTemplate},on:{\"close\":function($event){_vm.showModalCreate = false},\"getTasks\":_vm.getTasks}}),_vm._v(\" \"),_c('TaskTemplateChooser',{attrs:{\"show-modal\":_vm.showModalChooseTemplate},on:{\"close\":function($event){_vm.showModalChooseTemplate = false},\"openFromTemplate\":_vm.openFromTemplate}}),_vm._v(\" \"),_c('TaskEdit',{attrs:{\"show-modal\":_vm.showModalEdit,\"taskId\":_vm.taskId,\"hostname\":_vm.newHostname,\"command\":_vm.newCommand,\"actionFlag\":_vm.actionFlag},on:{\"close\":function($event){_vm.showModalEdit = false},\"getTask\":function($event){return _vm.getTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskSchedule',{attrs:{\"show-modal\":_vm.showModalSchedule,\"taskId\":_vm.taskId,\"spawnTime\":_vm.newSpawnTime,\"terminateTime\":_vm.newTerminateTime,\"actionFlag\":_vm.actionFlag,\"multipleFlag\":_vm.multipleFlag,\"selected\":_vm.selected},on:{\"close\":function($event){_vm.showModalSchedule = false},\"updateTask\":function($event){return _vm.updateTask.apply(void 0, arguments)},\"changeActionFlag\":function($event){return _vm.changeActionFlag.apply(void 0, arguments)},\"changeSnackbar\":function($event){return _vm.changeSnackbar.apply(void 0, arguments)},\"handleError\":function($event){return _vm.handleError.apply(void 0, arguments)}}}),_vm._v(\" \"),_c('TaskLog',{attrs:{\"show-modal\":_vm.showModalLog,\"lines\":_vm.logs,\"path\":_vm.path},on:{\"close\":function($event){_vm.showModalLog = false}}}),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"500\"},model:{value:(_vm.showModalHowItWorks),callback:function ($$v) {_vm.showModalHowItWorks=$$v},expression:\"showModalHowItWorks\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalHowItWorks = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"How it works\\n \")],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Your tasks are managed by `screen` program installed on each machine. You can attach\\n to/close them as they are running. Screen sessions created by TensorHive have custom\\n names so you won't be confused which is which.\\n \"),_c('br'),_vm._v(\" \"),_c('br'),_vm._v(\"When your task command stops executing, screen session will disappear from `screen -ls`\\n but stdout+stderr produced by your process will be redirected to a log file.\\n Logs are automatically gathered and stored on that machine under `~/TensorHiveLogs`.\\n \")])],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"Do you want to remove this task?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeTask()}}},[_vm._v(\"Yes\")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"table-container\"},[_c('v-data-table',{key:_vm.tableKey,staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.tasks,\"pagination\":_vm.pagination,\"loading\":_vm.actionFlag,\"select-all\":\"\",\"item-key\":\"id\",\"rows-per-page-items\":_vm.rowsPerPageItems},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"headers\",fn:function(props){return [_c('tr',[_c('th',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-start\":\"\"}},[_c('v-checkbox',{attrs:{\"input-value\":props.all,\"indeterminate\":props.indeterminate,\"primary\":\"\",\"hide-details\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.toggleAll($event)}}}),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){_vm.showModalHowItWorks = true}}},on),[_vm._v(\"info\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"How it works\")])])],1)],1),_vm._v(\" \"),_vm._l((props.headers),function(header){return _c('th',{key:header.text,class:['column sortable', _vm.pagination.descending ? 'desc' : 'asc', header.value === _vm.pagination.sortBy ? 'active' : ''],on:{\"click\":function($event){return _vm.changeSort(header.value)}}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"arrow_upward\")]),_vm._v(\" \"),_c('span',{staticClass:\"dark-font\"},[_vm._v(_vm._s(header.text))])],1)})],2)]}},{key:\"items\",fn:function(props){return [_c('tr',{attrs:{\"active\":props.selected},on:{\"click\":function($event){props.selected = !props.selected}}},[_c('td',[_c('v-checkbox',{attrs:{\"input-value\":props.selected,\"primary\":\"\",\"hide-details\":\"\"}})],1),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.hostname))]),_vm._v(\" \"),_c('td',{staticClass:\"task-command\"},[_vm._v(_vm._s(props.item.command))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.pid))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.status))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.spawnAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.terminateAt)))]),_vm._v(\" \"),_c('td',[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(props.item)}}},on),[_vm._v(\"schedule\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(props.item.id)}}},on),[_vm._v(\"play_arrow\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, null)}}},on),[_vm._v(\"stop\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate task - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(props.item.id, false)}}},on),[_vm._v(\"💀\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill task - use when command is more stubborn\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.getLog(props.item.id)}}},on),[_vm._v(\"description\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Show log\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.editTask(props.item)}}},on),[_vm._v(\"edit\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Edit task\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},on),[_vm._v(\"delete\")])]}}],null,true)},[_vm._v(\" \"),_c('span',[_vm._v(\"Remove task\")])])],1)])]}}]),model:{value:(_vm.selected),callback:function ($$v) {_vm.selected=$$v},expression:\"selected\"}},[_vm._v(\" \"),_c('v-progress-linear',{attrs:{\"indeterminate\":true},scopedSlots:_vm._u([{key:\"progress\",fn:function(){return undefined},proxy:true}])})],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){return _vm.openFromTemplate('')}}},[_vm._v(\"Create tasks\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModalChooseTemplate=true}}},[_vm._v(\"Create tasks from template\")]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.getTasks(true)}}},on),[_vm._v(\"refresh\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Refresh\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.scheduleTasks(null)}}},on),[_vm._v(\"schedule\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Schedule selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.spawnTasks(null)}}},on),[_vm._v(\"play_arrow\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Spawn selected tasks\")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({on:{\"click\":function($event){return _vm.terminateTasks(null, null)}}},on),[_vm._v(\"stop\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"\\n Terminate selected tasks - does not guarantee that\\n \"),_c('br'),_vm._v(\"task will stop (depends on command)\\n \")])]),_vm._v(\" \"),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({staticStyle:{\"font-size\":\"20px\"},on:{\"click\":function($event){return _vm.terminateTasks(null, false)}}},on),[_vm._v(\"💀\")])]}}])},[_vm._v(\" \"),_c('span',[_vm._v(\"Kill selected tasks - use when command is more stubborn\")])])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"amber\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbar),callback:function ($$v) {_vm.snackbar=$$v},expression:\"snackbar\"}},[_c('span',{staticStyle:{\"color\":\"black\"}},[_vm._v(\"Synchronization in progress. Actions are not allowed now.\")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbar = false}}},[_vm._v(\"Close\")])],1),_vm._v(\" \"),_c('v-snackbar',{attrs:{\"color\":\"red\",\"bottom\":\"\",\"multi-line\":\"\"},model:{value:(_vm.snackbarError),callback:function ($$v) {_vm.snackbarError=$$v},expression:\"snackbarError\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \"),_c('v-btn',{attrs:{\"color\":\"black\",\"flat\":\"\"},on:{\"click\":function($event){_vm.snackbarError = false}}},[_vm._v(\"Close\")])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-682605b4\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/TasksOverview.vue\n// module id = 356\n// module chunks = 1","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"minimize\\\":true,\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-58aecb3a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./UsersOverview.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./UsersOverview.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./UsersOverview.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-58aecb3a\\\",\\\"hasScoped\\\":true,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./UsersOverview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-58aecb3a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/views/UsersOverview.vue\n// module id = 357\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"content\"},[_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.alert),callback:function ($$v) {_vm.alert=$$v},expression:\"alert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"info\"},model:{value:(_vm.created),callback:function ($$v) {_vm.created=$$v},expression:\"created\"}},[_vm._v(\"\\n User successfully created\\n \")]),_vm._v(\" \"),_c('v-layout',{attrs:{\"row\":\"\",\"justify-center\":\"\"}},[_c('v-dialog',{attrs:{\"width\":\"500px\"},model:{value:(_vm.showModal),callback:function ($$v) {_vm.showModal=$$v},expression:\"showModal\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModal=false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('span',{staticClass:\"headline\"},[_vm._v(\"Create new user\")])],1),_vm._v(\" \"),_c('v-card-text',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.createUser($event)}}},[_c('v-card-text',[_vm._v(\"\\n Username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-user\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalUsername),expression:\"modalUsername\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalUsername)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalUsername=$event.target.value}}})]),_vm._v(\"\\n Email\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalEmail),expression:\"modalEmail\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.modalEmail)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalEmail=$event.target.value}}})]),_vm._v(\"\\n Password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword),expression:\"modalPassword\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword=$event.target.value}}})]),_vm._v(\"\\n Repeat password\\n \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.modalPassword2),expression:\"modalPassword2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.modalPassword2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.modalPassword2=$event.target.value}}})]),_vm._v(\" \"),_c('v-alert',{attrs:{\"dismissible\":\"\",\"type\":\"error\"},model:{value:(_vm.modalAlert),callback:function ($$v) {_vm.modalAlert=$$v},expression:\"modalAlert\"}},[_vm._v(\"\\n \"+_vm._s(_vm.errorMessage)+\"\\n \")]),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"success\",\"type\":\"submit\"}},[_vm._v(\"\\n Create\\n \")])],1)])],1)],1)],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"width\":\"400\"},model:{value:(_vm.showModalRemove),callback:function ($$v) {_vm.showModalRemove=$$v},expression:\"showModalRemove\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"headline grey lighten-2\",attrs:{\"primary-title\":\"\"}},[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.showModalRemove= false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\"\\n Do you want to remove this user?\\n \")],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-layout',{attrs:{\"align-center\":\"\",\"justify-end\":\"\"}},[_c('v-btn',{attrs:{\"color\":\"success\",\"round\":\"\"},on:{\"click\":function($event){return _vm.removeUser()}}},[_vm._v(\"\\n Yes\\n \")])],1)],1)],1)],1),_vm._v(\" \"),_c('div',[_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-btn',{attrs:{\"color\":\"primary\"},on:{\"click\":function($event){_vm.showModal=true}}},[_vm._v(\"Create user\")])],1),_vm._v(\" \"),_c('v-dialog',{attrs:{\"max-width\":\"500px\"},model:{value:(_vm.dialog),callback:function ($$v) {_vm.dialog=$$v},expression:\"dialog\"}},[_c('v-card',[_c('v-card-text',[_c('v-btn',{staticClass:\"float-right-button\",attrs:{\"flat\":\"\",\"icon\":\"\",\"color\":\"black\"},on:{\"click\":function($event){_vm.dialog = false}}},[_c('v-icon',[_vm._v(\"close\")])],1),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Edit user\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current username: \"+_vm._s(_vm.currentUser.username)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New username\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.username),expression:\"user.username\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalUsername\",\"placeholder\":\"Username\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"username\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Current email: \"+_vm._s(_vm.currentUser.email)+\"\\n \")]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New email\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-envelope\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.email),expression:\"user.email\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalEmail\",\"placeholder\":\"Email\",\"type\":\"text\"},domProps:{\"value\":(_vm.user.email)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"email\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n New password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password),expression:\"user.password\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword\",\"placeholder\":\"Password\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Repeat password\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"fa fa-lock\"})]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user.password2),expression:\"user.password2\"}],staticClass:\"form-control\",attrs:{\"name\":\"modalPassword2\",\"placeholder\":\"Password2\",\"type\":\"password\"},domProps:{\"value\":(_vm.user.password2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.user, \"password2\", $event.target.value)}}})]),_vm._v(\" \"),_c('v-card-text',[_vm._v(\"\\n Account roles:\\n \")]),_vm._v(\" \"),_c('v-card-text',[_c('v-checkbox',{attrs:{\"label\":\"admin\"},model:{value:(_vm.adminCheckbox),callback:function ($$v) {_vm.adminCheckbox=$$v},expression:\"adminCheckbox\"}})],1)],1),_vm._v(\" \"),_c('v-card-actions',[_c('v-spacer'),_vm._v(\" \"),_c('v-btn',{attrs:{\"color\":\"blue darken-1\",\"flat\":\"\"},on:{\"click\":_vm.updateUser}},[_vm._v(\"Edit\")])],1)],1)],1),_vm._v(\" \"),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.headers,\"items\":_vm.users,\"search\":_vm.search,\"pagination\":_vm.pagination,\"item-key\":\"id\",\"hide-actions\":\"\"},on:{\"update:pagination\":function($event){_vm.pagination=$event}},scopedSlots:_vm._u([{key:\"items\",fn:function(props){return [_c('tr',[_c('td',[_vm._v(_vm._s(props.item.id))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.username))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.email))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(_vm.prettyDate(props.item.createdAt)))]),_vm._v(\" \"),_c('td',[_vm._v(_vm._s(props.item.role))]),_vm._v(\" \"),_c('td',[_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.editUser(props.item)}}},[_vm._v(\"\\n edit\\n \")]),_vm._v(\" \"),_c('v-icon',{attrs:{\"small\":\"\"},on:{\"click\":function($event){return _vm.showConfirmationDialog(props.item.id)}}},[_vm._v(\"\\n delete\\n \")])],1)])]}}])}),_vm._v(\" \"),_c('div',{staticClass:\"text-xs-center pt-2\"},[_c('v-pagination',{attrs:{\"length\":_vm.pages},model:{value:(_vm.pagination.page),callback:function ($$v) {_vm.$set(_vm.pagination, \"page\", $$v)},expression:\"pagination.page\"}})],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-58aecb3a\",\"hasScoped\":true,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/views/UsersOverview.vue\n// module id = 359\n// module chunks = 1","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport state from './state'\nimport actions from './actions'\nimport mutations from './mutations'\n\nVue.use(Vuex)\n\nexport default new Vuex.Store({\n state,\n actions,\n mutations\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/index.js","export default {\n callingAPI: false,\n searching: '',\n serverURI: 'http://10.110.1.136:8080',\n user: null,\n role: null,\n id: null,\n accessToken: null,\n refreshToken: null,\n userInfo: {\n messages: [{1: 'test', 2: 'test'}],\n notifications: [],\n tasks: []\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/state.js","export default {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/actions.js","export default {\n TOGGLE_LOADING (state) {\n state.callingAPI = !state.callingAPI\n },\n TOGGLE_SEARCHING (state) {\n state.searching = (state.searching === '') ? 'loading' : ''\n },\n SET_USER (state, user) {\n state.user = user\n },\n SET_ROLE (state, role) {\n state.role = role\n },\n SET_ID (state, id) {\n state.id = id\n },\n SET_ACCESS_TOKEN (state, token) {\n state.accessToken = token\n },\n SET_REFRESH_TOKEN (state, token) {\n state.refreshToken = token\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/mutations.js","const urlParser = document.createElement('a')\n\nexport function domain (url) {\n urlParser.href = url\n return urlParser.hostname\n}\n\nexport function count (arr) {\n return arr.length\n}\n\nexport function prettyDate (date) {\n var a = new Date(date)\n return a.toDateString()\n}\n\nexport function pluralize (time, label) {\n if (time === 1) {\n return time + label\n }\n\n return time + label + 's'\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/filters/index.js","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-535f2ac0\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/App.vue\n// module id = 366\n// module chunks = 1","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('v-app',[_c('router-view')],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-535f2ac0\",\"hasScoped\":false,\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/App.vue\n// module id = 367\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file diff --git a/tensorhive/app/web/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map b/tensorhive/app/web/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map index e9362e19..28061ee9 100644 --- a/tensorhive/app/web/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map +++ b/tensorhive/app/web/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///static/js/manifest.2ae2e69a05c33dfc65f8.js","webpack:///webpack/bootstrap 6be752ff9db3d9f465b6"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","parentJsonpFunction","window","chunkIds","moreModules","executeModules","chunkId","result","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","shift","s","2","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"CAAS,SAAUA,GCuCnB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QA1DA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,GAAAX,GAAAY,EAAAC,EAAAT,EAAA,EAAAU,KACQV,EAAAK,EAAAM,OAAoBX,IAC5BQ,EAAAH,EAAAL,GACAY,EAAAJ,IACAE,EAAAG,KAAAD,EAAAJ,GAAA,IAEAI,EAAAJ,GAAA,CAEA,KAAAZ,IAAAU,GACAQ,OAAAC,UAAAC,eAAAd,KAAAI,EAAAV,KACAF,EAAAE,GAAAU,EAAAV,GAIA,KADAO,KAAAE,EAAAC,EAAAC,GACAG,EAAAC,QACAD,EAAAO,SAEA,IAAAV,EACA,IAAAP,EAAA,EAAYA,EAAAO,EAAAI,OAA2BX,IACvCS,EAAAd,IAAAuB,EAAAX,EAAAP,GAGA,OAAAS,GAIA,IAAAZ,MAGAe,GACAO,EAAA,EA6BAxB,GAAAyB,EAAA1B,EAGAC,EAAA0B,EAAAxB,EAGAF,EAAA2B,EAAA,SAAAxB,EAAAyB,EAAAC,GACA7B,EAAA8B,EAAA3B,EAAAyB,IACAT,OAAAY,eAAA5B,EAAAyB,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMA7B,EAAAmC,EAAA,SAAA/B,GACA,GAAAyB,GAAAzB,KAAAgC,WACA,WAA2B,MAAAhC,GAAA,SAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAA2B,EAAAE,EAAA,IAAAA,GACAA,GAIA7B,EAAA8B,EAAA,SAAAO,EAAAC,GAAsD,MAAAnB,QAAAC,UAAAC,eAAAd,KAAA8B,EAAAC,IAGtDtC,EAAAuC,EAAA,IAGAvC,EAAAwC,GAAA,SAAAC,GAA8D,KAApBC,SAAAC,MAAAF,GAAoBA","file":"static/js/manifest.2ae2e69a05c33dfc65f8.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId]) {\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\t}\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n/******/ \t\twhile(resolves.length) {\n/******/ \t\t\tresolves.shift()();\n/******/ \t\t}\n/******/ \t\tif(executeModules) {\n/******/ \t\t\tfor(i=0; i < executeModules.length; i++) {\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// objects to store loaded and loading chunks\n/******/ \tvar installedChunks = {\n/******/ \t\t2: 0\n/******/ \t};\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, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\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 = \"/\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/ })\n/************************************************************************/\n/******/ ([]);\n\n\n// WEBPACK FOOTER //\n// static/js/manifest.2ae2e69a05c33dfc65f8.js"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\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, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\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 = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6be752ff9db3d9f465b6"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///static/js/manifest.2ae2e69a05c33dfc65f8.js","webpack:///webpack/bootstrap 1f0e40c2bc534f62b55c"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","parentJsonpFunction","window","chunkIds","moreModules","executeModules","chunkId","result","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","shift","s","2","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"CAAS,SAAUA,GCuCnB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QA1DA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,GAAAX,GAAAY,EAAAC,EAAAT,EAAA,EAAAU,KACQV,EAAAK,EAAAM,OAAoBX,IAC5BQ,EAAAH,EAAAL,GACAY,EAAAJ,IACAE,EAAAG,KAAAD,EAAAJ,GAAA,IAEAI,EAAAJ,GAAA,CAEA,KAAAZ,IAAAU,GACAQ,OAAAC,UAAAC,eAAAd,KAAAI,EAAAV,KACAF,EAAAE,GAAAU,EAAAV,GAIA,KADAO,KAAAE,EAAAC,EAAAC,GACAG,EAAAC,QACAD,EAAAO,SAEA,IAAAV,EACA,IAAAP,EAAA,EAAYA,EAAAO,EAAAI,OAA2BX,IACvCS,EAAAd,IAAAuB,EAAAX,EAAAP,GAGA,OAAAS,GAIA,IAAAZ,MAGAe,GACAO,EAAA,EA6BAxB,GAAAyB,EAAA1B,EAGAC,EAAA0B,EAAAxB,EAGAF,EAAA2B,EAAA,SAAAxB,EAAAyB,EAAAC,GACA7B,EAAA8B,EAAA3B,EAAAyB,IACAT,OAAAY,eAAA5B,EAAAyB,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMA7B,EAAAmC,EAAA,SAAA/B,GACA,GAAAyB,GAAAzB,KAAAgC,WACA,WAA2B,MAAAhC,GAAA,SAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAA2B,EAAAE,EAAA,IAAAA,GACAA,GAIA7B,EAAA8B,EAAA,SAAAO,EAAAC,GAAsD,MAAAnB,QAAAC,UAAAC,eAAAd,KAAA8B,EAAAC,IAGtDtC,EAAAuC,EAAA,IAGAvC,EAAAwC,GAAA,SAAAC,GAA8D,KAApBC,SAAAC,MAAAF,GAAoBA","file":"static/js/manifest.2ae2e69a05c33dfc65f8.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId]) {\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\t}\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n/******/ \t\twhile(resolves.length) {\n/******/ \t\t\tresolves.shift()();\n/******/ \t\t}\n/******/ \t\tif(executeModules) {\n/******/ \t\t\tfor(i=0; i < executeModules.length; i++) {\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// objects to store loaded and loading chunks\n/******/ \tvar installedChunks = {\n/******/ \t\t2: 0\n/******/ \t};\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, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\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 = \"/\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/ })\n/************************************************************************/\n/******/ ([]);\n\n\n// WEBPACK FOOTER //\n// static/js/manifest.2ae2e69a05c33dfc65f8.js"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\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, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\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 = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1f0e40c2bc534f62b55c"],"sourceRoot":""} \ No newline at end of file From 303352b93bd0561680d7e4e3e8438bc6e4dc975b Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 17 Jul 2020 08:24:12 +0200 Subject: [PATCH 008/175] Enable foreign key constraints validation --- tensorhive/database.py | 9 ++++++++- tests/fixtures/models.py | 9 ++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tensorhive/database.py b/tensorhive/database.py index fd9ccff9..db4ceafe 100644 --- a/tensorhive/database.py +++ b/tensorhive/database.py @@ -1,4 +1,4 @@ -from sqlalchemy import create_engine +from sqlalchemy import create_engine, event from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy_utils import database_exists @@ -34,3 +34,10 @@ def init_db() -> None: log.info('[✔] Database created ({path})'.format(path=DB.SQLALCHEMY_DATABASE_URI)) else: log.info('[•] Database found ({path})'.format(path=DB.SQLALCHEMY_DATABASE_URI)) + + +def _fk_pragma_on_connect(dbapi_con, con_record): + dbapi_con.execute('pragma foreign_keys=ON') + + +event.listen(engine, 'connect', _fk_pragma_on_connect) diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index 4c23c55c..a1ed3bac 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -21,11 +21,12 @@ def new_admin(): @pytest.fixture(scope='function') def new_reservation(new_user): + new_user.save() now = datetime.utcnow() duration = timedelta(minutes=60) return Reservation( - user_id=1, + user_id=new_user.id, title='TEST TITLE', description='TEST_DESCRIPTION', protected_resource_id='0123456789012345678901234567890123456789', @@ -35,12 +36,14 @@ def new_reservation(new_user): @pytest.fixture(scope='function') -def new_reservation_2(new_user): +def new_reservation_2(new_user, new_admin): + new_user.save() + new_admin.save() now = datetime.utcnow() duration = timedelta(minutes=60) return Reservation( - user_id=2, + user_id=new_admin.id, title='TEST TITLE', description='TEST_DESCRIPTION', protected_resource_id='0123456789012345678901234567890123456789', From 72f3e09d215080870e99db92ffa0b19174a82920 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 17 Jul 2020 08:33:39 +0200 Subject: [PATCH 009/175] Add user groups - db side --- migrations/env.py | 1 + ...7b5_create_groups_and_user2group_tables.py | 39 ++++++++++++ tensorhive/database.py | 1 + tensorhive/models/Group.py | 59 +++++++++++++++++++ tensorhive/models/User.py | 6 ++ tests/conftest.py | 2 +- tests/fixtures/database.py | 1 + tests/fixtures/models.py | 14 +++++ tests/unit/models/test_group_model.py | 22 +++++++ 9 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 migrations/versions/ecd059f567b5_create_groups_and_user2group_tables.py create mode 100644 tensorhive/models/Group.py create mode 100644 tests/unit/models/test_group_model.py diff --git a/migrations/env.py b/migrations/env.py index fcb58254..5197023d 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -14,6 +14,7 @@ # Schema metadata from tensorhive.database import Base from tensorhive.models.User import User +from tensorhive.models.Group import Group, User2Group from tensorhive.models.Reservation import Reservation from tensorhive.models.RevokedToken import RevokedToken from tensorhive.models.Role import Role diff --git a/migrations/versions/ecd059f567b5_create_groups_and_user2group_tables.py b/migrations/versions/ecd059f567b5_create_groups_and_user2group_tables.py new file mode 100644 index 00000000..12963ea4 --- /dev/null +++ b/migrations/versions/ecd059f567b5_create_groups_and_user2group_tables.py @@ -0,0 +1,39 @@ +"""create groups and user2group tables + +Revision ID: ecd059f567b5 +Revises: 131eb148fd57 +Create Date: 2020-07-17 08:18:58.457152 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ecd059f567b5' +down_revision = '131eb148fd57' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table('groups', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('name', sa.String(length=40), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sqlite_autoincrement=True + ) + op.create_table('user2group', + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('group_id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['group_id'], ['groups.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('user_id', 'group_id') + ) + + +def downgrade(): + op.drop_table('user2group') + op.drop_table('groups') diff --git a/tensorhive/database.py b/tensorhive/database.py index db4ceafe..20b5c475 100644 --- a/tensorhive/database.py +++ b/tensorhive/database.py @@ -24,6 +24,7 @@ def init_db() -> None: # Import all modules that define models so that # they could be registered properly on the metadata. from tensorhive.models.User import User + from tensorhive.models.Group import Group, User2Group from tensorhive.models.Reservation import Reservation from tensorhive.models.RevokedToken import RevokedToken from tensorhive.models.Role import Role diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py new file mode 100644 index 00000000..3050b467 --- /dev/null +++ b/tensorhive/models/Group.py @@ -0,0 +1,59 @@ +import datetime +import logging + +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey +from sqlalchemy.orm import relationship, backref +from sqlalchemy.ext.hybrid import hybrid_property +from tensorhive.database import Base +from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.models.User import User + +log = logging.getLogger(__name__) + + +class Group(CRUDModel, Base): # type: ignore + __tablename__ = 'groups' + __table_args__ = {'sqlite_autoincrement': True} + + id = Column(Integer, primary_key=True, autoincrement=True) + name = Column(String(40), unique=False, nullable=True) + created_at = Column(DateTime, default=datetime.datetime.utcnow) + + _users = relationship('User', secondary='user2group') + + def __repr__(self): + return ''.format(id=self.id, name=self.name) + + def check_assertions(self): + pass + + @hybrid_property + def users(self): + return self._users + + def add_user(self, user: User): + self.users.append(user) + self.save() + + def remove_user(self, user: User): + self.users.remove(user) + self.save() + + @property + def as_dict(self): + return { + 'id': self.id, + 'name': self.name, + 'createdAt': self.created_at.isoformat(), + 'users': self.users + } + + +class User2Group(Base): # type: ignore + __tablename__ = 'user2group' + user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True) + group_id = Column(Integer, ForeignKey('groups.id', ondelete='CASCADE'), primary_key=True) + created_at = Column(DateTime, default=datetime.datetime.utcnow()) + + user = relationship('User', backref=backref('user2group', cascade='all,delete-orphan')) + group = relationship('Group', backref=backref('user2group', cascade='all,delete-orphan')) diff --git a/tensorhive/models/User.py b/tensorhive/models/User.py index f23f7740..3cfac48d 100644 --- a/tensorhive/models/User.py +++ b/tensorhive/models/User.py @@ -37,6 +37,7 @@ class User(CRUDModel, Base): # type: ignore # Managed via property getters and setters _hashed_password = Column(String(120), nullable=False) _roles = relationship('Role', cascade='all,delete', backref=backref('user')) + _groups = relationship('Group', secondary='user2group') min_password_length = 8 @@ -63,6 +64,10 @@ def role_names(self): def has_role(self, role_name): return bool(role_name in self.role_names) + @hybrid_property + def groups(self): + return self._groups + @hybrid_property def password(self): return self._hashed_password @@ -114,6 +119,7 @@ def as_dict(self): 'username': self.username, 'createdAt': self.created_at.isoformat(), 'roles': roles, + 'groups': self.groups, 'email': self.email } diff --git a/tests/conftest.py b/tests/conftest.py index 6d155ef2..7173923c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,3 @@ import pytest -from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin +from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, new_group_with_member from fixtures.database import tables diff --git a/tests/fixtures/database.py b/tests/fixtures/database.py index bf7c85f2..dce951b3 100644 --- a/tests/fixtures/database.py +++ b/tests/fixtures/database.py @@ -5,6 +5,7 @@ def tables(): from tensorhive.database import Base, engine from tensorhive.models.User import User + from tensorhive.models.Group import Group, User2Group from tensorhive.models.Reservation import Reservation from tensorhive.models.Role import Role from tensorhive.models.RevokedToken import RevokedToken diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index a1ed3bac..b8734dea 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -1,6 +1,7 @@ import pytest from tensorhive.models.Reservation import Reservation from tensorhive.models.User import User +from tensorhive.models.Group import Group from tensorhive.models.Role import Role from datetime import datetime, timedelta @@ -50,3 +51,16 @@ def new_reservation_2(new_user, new_admin): starts_at=now, ends_at=now + duration, ) + + +@pytest.fixture(scope='function') +def new_group(): + return Group(name='TestGroup1') + + +@pytest.fixture(scope='function') +def new_group_with_member(new_user): + group = Group(name='TestGroup1') + group.save() + group.add_user(new_user) + return group diff --git a/tests/unit/models/test_group_model.py b/tests/unit/models/test_group_model.py new file mode 100644 index 00000000..c5731e15 --- /dev/null +++ b/tests/unit/models/test_group_model.py @@ -0,0 +1,22 @@ +from tensorhive.models.Group import Group + + +def test_group_creation(tables): + new_group = Group(name='test').save() + assert new_group.id is not None + + +def test_adding_user_to_a_group(tables, new_user, new_group): + new_user.save() + new_group.add_user(new_user) + + assert new_user in new_group.users + assert new_group in new_user.groups + + +def test_removing_user_from_a_group(tables, new_group_with_member): + user = new_group_with_member.users[0] + new_group_with_member.remove_user(user) + + assert user not in new_group_with_member.users + assert new_group_with_member not in user.groups From 69ff8a679cd35a66fef3ace1a8dfb078a245e530 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 18 Jul 2020 12:32:21 +0200 Subject: [PATCH 010/175] Add resources, restrictions, schedules and secondary tables - db side --- migrations/env.py | 3 + .../81c2455baab1_create_resources_table.py | 28 +++ ...fe87b_create_restriction_schedules_and_.py | 39 +++++ ...reate_restrictions_and_secondary_tables.py | 53 ++++++ tensorhive/database.py | 3 + tensorhive/models/Group.py | 4 +- tensorhive/models/Resource.py | 34 ++++ tensorhive/models/Restriction.py | 159 ++++++++++++++++++ tensorhive/models/RestrictionAssignee.py | 43 +++++ tensorhive/models/RestrictionSchedule.py | 82 +++++++++ tensorhive/models/User.py | 22 ++- tests/conftest.py | 3 +- tests/fixtures/database.py | 3 + tests/fixtures/models.py | 43 ++++- tests/unit/models/test_resource_model.py | 8 + tests/unit/models/test_restriction_model.py | 81 +++++++++ .../models/test_restrictionschedule_model.py | 32 ++++ tests/unit/models/test_user_model.py | 2 +- 18 files changed, 634 insertions(+), 8 deletions(-) create mode 100644 migrations/versions/81c2455baab1_create_resources_table.py create mode 100644 migrations/versions/9d12594fe87b_create_restriction_schedules_and_.py create mode 100644 migrations/versions/e935d47c4cde_create_restrictions_and_secondary_tables.py create mode 100644 tensorhive/models/Resource.py create mode 100644 tensorhive/models/Restriction.py create mode 100644 tensorhive/models/RestrictionAssignee.py create mode 100644 tensorhive/models/RestrictionSchedule.py create mode 100644 tests/unit/models/test_resource_model.py create mode 100644 tests/unit/models/test_restriction_model.py create mode 100644 tests/unit/models/test_restrictionschedule_model.py diff --git a/migrations/env.py b/migrations/env.py index 5197023d..e24b1017 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -15,6 +15,9 @@ from tensorhive.database import Base from tensorhive.models.User import User from tensorhive.models.Group import Group, User2Group +from tensorhive.models.Resource import Resource +from tensorhive.models.Restriction import Restriction, Restriction2Assignee, Restriction2Resource +from tensorhive.models.RestrictionSchedule import RestrictionSchedule, Restriction2Schedule from tensorhive.models.Reservation import Reservation from tensorhive.models.RevokedToken import RevokedToken from tensorhive.models.Role import Role diff --git a/migrations/versions/81c2455baab1_create_resources_table.py b/migrations/versions/81c2455baab1_create_resources_table.py new file mode 100644 index 00000000..e2f8379e --- /dev/null +++ b/migrations/versions/81c2455baab1_create_resources_table.py @@ -0,0 +1,28 @@ +"""create resources table + +Revision ID: 81c2455baab1 +Revises: ecd059f567b5 +Create Date: 2020-07-17 10:50:16.607131 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '81c2455baab1' +down_revision = 'ecd059f567b5' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table('resources', + sa.Column('id', sa.String(length=64), nullable=False), + sa.Column('name', sa.String(length=40), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + + +def downgrade(): + op.drop_table('resources') diff --git a/migrations/versions/9d12594fe87b_create_restriction_schedules_and_.py b/migrations/versions/9d12594fe87b_create_restriction_schedules_and_.py new file mode 100644 index 00000000..6d6a9b84 --- /dev/null +++ b/migrations/versions/9d12594fe87b_create_restriction_schedules_and_.py @@ -0,0 +1,39 @@ +"""create restriction_schedules and restriction2schedule tables + +Revision ID: 9d12594fe87b +Revises: e935d47c4cde +Create Date: 2020-07-18 12:09:43.342617 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9d12594fe87b' +down_revision = 'e935d47c4cde' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table('restriction_schedules', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('schedule_days', sa.String(length=7), nullable=False), + sa.Column('hour_start', sa.Time(), nullable=False), + sa.Column('hour_end', sa.Time(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sqlite_autoincrement=True + ) + op.create_table('restriction2schedule', + sa.Column('restriction_id', sa.Integer(), nullable=False), + sa.Column('schedule_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['restriction_id'], ['restrictions.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['schedule_id'], ['restriction_schedules.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('restriction_id', 'schedule_id') + ) + + +def downgrade(): + op.drop_table('restriction2schedule') + op.drop_table('restriction_schedules') diff --git a/migrations/versions/e935d47c4cde_create_restrictions_and_secondary_tables.py b/migrations/versions/e935d47c4cde_create_restrictions_and_secondary_tables.py new file mode 100644 index 00000000..99b7fe21 --- /dev/null +++ b/migrations/versions/e935d47c4cde_create_restrictions_and_secondary_tables.py @@ -0,0 +1,53 @@ +"""create restrictions and secondary tables + +Revision ID: e935d47c4cde +Revises: 81c2455baab1 +Create Date: 2020-07-18 09:42:52.140402 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e935d47c4cde' +down_revision = '81c2455baab1' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table('restrictions', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('name', sa.String(length=50), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('starts_at', sa.DateTime(), nullable=False), + sa.Column('ends_at', sa.DateTime(), nullable=True), + sa.Column('is_global', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sqlite_autoincrement=True + ) + op.create_table('restriction2assignee', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('restriction_id', sa.Integer(), nullable=False), + sa.Column('group_id', sa.Integer(), nullable=True), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['group_id'], ['groups.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['restriction_id'], ['restrictions.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sqlite_autoincrement=True + ) + op.create_table('restriction2resource', + sa.Column('restriction_id', sa.Integer(), nullable=False), + sa.Column('resource_id', sa.String(length=64), nullable=False), + sa.ForeignKeyConstraint(['resource_id'], ['resources.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['restriction_id'], ['restrictions.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('restriction_id', 'resource_id') + ) + + +def downgrade(): + op.drop_table('restriction2resource') + op.drop_table('restriction2assignee') + op.drop_table('restrictions') diff --git a/tensorhive/database.py b/tensorhive/database.py index 20b5c475..7310a4c0 100644 --- a/tensorhive/database.py +++ b/tensorhive/database.py @@ -26,6 +26,9 @@ def init_db() -> None: from tensorhive.models.User import User from tensorhive.models.Group import Group, User2Group from tensorhive.models.Reservation import Reservation + from tensorhive.models.Resource import Resource + from tensorhive.models.Restriction import Restriction, Restriction2Assignee, Restriction2Resource + from tensorhive.models.RestrictionSchedule import RestrictionSchedule, Restriction2Schedule from tensorhive.models.RevokedToken import RevokedToken from tensorhive.models.Role import Role from tensorhive.models.Task import Task diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index 3050b467..15a34986 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -7,11 +7,12 @@ from tensorhive.database import Base from tensorhive.models.CRUDModel import CRUDModel from tensorhive.models.User import User +from tensorhive.models.RestrictionAssignee import RestrictionAssignee log = logging.getLogger(__name__) -class Group(CRUDModel, Base): # type: ignore +class Group(CRUDModel, RestrictionAssignee): # type: ignore __tablename__ = 'groups' __table_args__ = {'sqlite_autoincrement': True} @@ -20,6 +21,7 @@ class Group(CRUDModel, Base): # type: ignore created_at = Column(DateTime, default=datetime.datetime.utcnow) _users = relationship('User', secondary='user2group') + _restrictions = relationship('Restriction', secondary='restriction2assignee') def __repr__(self): return ''.format(id=self.id, name=self.name) diff --git a/tensorhive/models/Resource.py b/tensorhive/models/Resource.py new file mode 100644 index 00000000..0ecd1210 --- /dev/null +++ b/tensorhive/models/Resource.py @@ -0,0 +1,34 @@ +from sqlalchemy import Column, String +from sqlalchemy.orm import relationship +from tensorhive.database import db_session +from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.models.RestrictionAssignee import RestrictionAssignee + + +class Resource(CRUDModel, RestrictionAssignee): # type: ignore + """ + Class representing physical resources (GPUs). id is unique among all resources - GPU's GUID is used. name is + a custom user-friendly name that may be specified to improve legibility. + """ + __tablename__ = 'resources' + id = Column(String(64), primary_key=True) + name = Column(String(40), nullable=True) + + _restrictions = relationship('Restriction', secondary='restriction2resource') + + def __repr__(self): + return ''.format(id=self.id, name=self.name) + + def check_assertions(self): + pass + + @classmethod + def get_by_name(cls, resource_name): + return db_session.query(Resource).filter(Resource.name == resource_name).all() + + @property + def as_dict(self): + return { + 'id': self.id, + 'name': self.name + } diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py new file mode 100644 index 00000000..12a95be3 --- /dev/null +++ b/tensorhive/models/Restriction.py @@ -0,0 +1,159 @@ +import datetime + +from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey +from sqlalchemy.orm import relationship, backref +from sqlalchemy.ext.hybrid import hybrid_property +from tensorhive.database import db_session, Base +from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.models.User import User +from tensorhive.models.Group import Group +from tensorhive.models.Resource import Resource +from tensorhive.models.RestrictionSchedule import RestrictionSchedule + + +class Restriction(CRUDModel, Base): # type: ignore + """ + Class representing restrictions that permit access to resources only in time specified. + Restriction is in effect between starts_at and ends_at times. If ends_at is set to NULL, restriction lasts + indefinitely. If there are schedules assigned to restriction, restriction will be active only in hours specified + in this schedule (see RestrictionSchedule class for more details). If there are no schedules assigned, restriction + will be active continuously between starts_at and ends_at dates. + Restriction should be assigned to certain users or groups to affect them. + Furthermore, it should be assigned to resources that should be under that restriction. If restriction should apply + to all resources available, is_global property should be set to true. + + Note: All times and dates are UTC. + """ + __tablename__ = 'restrictions' + __table_args__ = {'sqlite_autoincrement': True} + + id = Column(Integer, primary_key=True, autoincrement=True) + name = Column(String(50)) + created_at = Column(DateTime, default=datetime.datetime.utcnow) + starts_at = Column(DateTime, nullable=False) + ends_at = Column(DateTime) + is_global = Column(Boolean, nullable=False) + + _users = relationship('User', secondary='restriction2assignee') + _groups = relationship('Group', secondary='restriction2assignee') + _resources = relationship('Resource', secondary='restriction2resource') + _schedules = relationship('RestrictionSchedule', secondary='restriction2schedule') + + def __repr__(self): + return '''= self.starts_at, 'End date must happen after the start date!' + assert self.ends_at > datetime.datetime.utcnow(), 'You are trying to edit restriction that has already' \ + ' expired - please do not do that!' + + @hybrid_property + def users(self): + return self._users + + @hybrid_property + def groups(self): + return self._groups + + @hybrid_property + def resources(self): + return self._resources + + @hybrid_property + def schedules(self): + return self._schedules + + def apply_to_user(self, user: User): + self.users.append(user) + self.save() + + def remove_from_user(self, user: User): + self.users.remove(user) + self.save() + + def apply_to_group(self, group: Group): + self.groups.append(group) + self.save() + + def remove_from_group(self, group: Group): + self.groups.remove(group) + self.save() + + def apply_to_resource(self, resource: Resource): + self.resources.append(resource) + self.save() + + def remove_from_resource(self, resource: Resource): + self.resources.remove(resource) + self.save() + + def add_schedule(self, schedule: RestrictionSchedule): + self.schedules.append(schedule) + self.save() + + def remove_schedule(self, schedule: RestrictionSchedule): + self.schedules.remove(schedule) + self.save() + + @classmethod + def get_global_restrictions(cls, include_expired=False): + query = db_session.query(Restriction).filter(Restriction.is_global.is_(True)) + if not include_expired: + query.filter(Restriction.is_expired is False) + return query.all() + + @property + def is_active(self): + now = datetime.datetime.utcnow() + active = self.starts_at <= now and not self.is_expired + if not self.schedules: # no custom schedules + return active + + active_schedules = [schedule for schedule in self.schedules if schedule.is_active] + return active and len(active_schedules) > 0 + + @property + def is_expired(self): + now = datetime.datetime.utcnow() + return self.ends_at is not None and self.ends_at <= now + + @property + def as_dict(self): + return { + 'id': self.id, + 'name': self.name, + 'created_at': self.created_at, + 'starts_at': self.starts_at, + 'ends_at': self.ends_at, + 'is_global': self.is_global + } + + +class Restriction2Assignee(Base): # type: ignore + __tablename__ = 'restriction2assignee' + __table_args__ = {'sqlite_autoincrement': True} + + id = Column(Integer, primary_key=True, autoincrement=True) + restriction_id = Column(Integer, ForeignKey('restrictions.id', ondelete='CASCADE'), nullable=False) + group_id = Column(Integer, ForeignKey('groups.id', ondelete='CASCADE')) + user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE')) + + restriction = relationship('Restriction', backref=backref('restriction2assignee', cascade='all,delete-orphan')) + group = relationship('Group', backref=backref('restriction2assignee', cascade='all,delete-orphan')) + user = relationship('User', backref=backref('restriction2assignee', cascade='all,delete-orphan')) + + +class Restriction2Resource(Base): # type: ignore + __tablename__ = 'restriction2resource' + + restriction_id = Column(Integer, ForeignKey('restrictions.id', ondelete='CASCADE'), primary_key=True) + resource_id = Column(String(64), ForeignKey('resources.id', ondelete='CASCADE'), primary_key=True) + + restriction = relationship('Restriction', backref=backref('restriction2resource', cascade='all,delete-orphan')) + resource = relationship('Resource', backref=backref('restriction2resource', cascade='all,delete-orphan')) diff --git a/tensorhive/models/RestrictionAssignee.py b/tensorhive/models/RestrictionAssignee.py new file mode 100644 index 00000000..40da865f --- /dev/null +++ b/tensorhive/models/RestrictionAssignee.py @@ -0,0 +1,43 @@ +from tensorhive.database import Base + + +class RestrictionAssignee(Base): # type: ignore + """ + Helper base class that should be extended by all entities that are able to be assigned restriction to. + Currently, such entities are: User, Group and Resource. + """ + __abstract__ = True + + @property + def _restrictions(self): + raise NotImplementedError + + def get_restrictions(self, include_expired=False, include_global=False): + """ + :param include_expired: If set to true will also return restrictions that have already expired. + :param include_global: If set to true will also include global restrictions (which apply to all resources) + :return: Restrictions assigned to given entity. + """ + from tensorhive.models.Restriction import Restriction + + if include_expired: + restrictions = self._restrictions + else: + restrictions = [r for r in self._restrictions if not r.is_expired] + + if include_global: + restrictions = list(set(restrictions + + Restriction.get_global_restrictions(include_expired=include_expired))) + return restrictions + + def get_active_restrictions(self, include_global=False): + """ + :param include_global: If set to true will also include global restrictions (which apply to all resources) + :return: Active restrictions (according to start/end times and schedules) assigned to given entity. + """ + from tensorhive.models.Restriction import Restriction + + restrictions = [r for r in self._restrictions if r.is_active] + if include_global: + restrictions = list(set(restrictions + Restriction.get_global_restrictions(include_expired=False))) + return restrictions diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py new file mode 100644 index 00000000..053b3eb1 --- /dev/null +++ b/tensorhive/models/RestrictionSchedule.py @@ -0,0 +1,82 @@ +import re +import datetime + +from sqlalchemy import Column, Integer, String, Time, ForeignKey +from sqlalchemy.orm import relationship, backref +from sqlalchemy.ext.hybrid import hybrid_property +from tensorhive.database import Base +from tensorhive.models.CRUDModel import CRUDModel + + +class RestrictionSchedule(CRUDModel, Base): # type: ignore + """ + Class representing restriction schedules. + One schedule is able to specify same start and end hours for specified days of the week. + If one would want to use different hours for different days, he would need to create separate schedules for these + hours. + For example, if one wants to create schedule active on Mondays and Wednesdays between 8 and 11 am and on Tuesdays + between 2 and 4 am, he would need to create two schedules: + - Schedule A - schedule_days=13, hour_start=datetime.time(8, 0, 0), datetime.time=Time(11, 0, 0) + - Schedule B = schedule_days=2, hour_start=datetime.time(2, 0, 0), datetime.time=Time(4, 0, 0) + + Note: All times and dates used are UTC. + """ + __tablename__ = 'restriction_schedules' + __table_args__ = {'sqlite_autoincrement': True} + + id = Column(Integer, primary_key=True, autoincrement=True) + schedule_days = Column(String(7), nullable=False) + hour_start = Column(Time(), nullable=False) + hour_end = Column(Time(), nullable=False) + + _restrictions = relationship('Restriction', secondary='restriction2schedule') + + def __repr__(self): + return ''' self.hour_start, 'End hour cannot happen before start hour!' + + @hybrid_property + def restrictions(self): + return self._restrictions + + @property + def is_active(self): + today = str(datetime.datetime.utcnow().date().weekday() + 1) # weekday uses 0-6 for day numbering, we use 1-7 + now = datetime.datetime.utcnow().time() + return today in self.schedule_days and self.hour_start <= now < self.hour_end + + @staticmethod + def is_valid_schedule_expression(schedule_expression): + has_repeating_characters = len(set(i for i in schedule_expression if schedule_expression.count(i) > 1)) > 0 + regex_match = re.fullmatch('[1-7]{1,7}', schedule_expression) is not None + return regex_match and not has_repeating_characters + + @property + def as_dict(self): + return { + 'id': self.id, + 'schedule_days': self.schedule_days, + 'hour_start': self.hour_start, + 'hour_end': self.hour_end + } + + +class Restriction2Schedule(Base): # type: ignore + __tablename__ = 'restriction2schedule' + __tableargs__ = {'sqlite_autoincrement': True} + + restriction_id = Column(Integer, ForeignKey('restrictions.id', ondelete='CASCADE'), primary_key=True) + schedule_id = Column(Integer, ForeignKey('restriction_schedules.id', ondelete='CASCADE'), primary_key=True) + + restriction = relationship('Restriction', backref=backref('restriction2schedule', cascade='all,delete-orphan')) + schedule = relationship('RestrictionSchedule', backref=backref('restriction2schedule', cascade='all,delete-orphan')) diff --git a/tensorhive/models/User.py b/tensorhive/models/User.py index 3cfac48d..35eb8e62 100644 --- a/tensorhive/models/User.py +++ b/tensorhive/models/User.py @@ -3,8 +3,9 @@ from sqlalchemy import Column, Integer, String, DateTime from sqlalchemy.orm import relationship, backref -from tensorhive.database import db_session, Base +from tensorhive.database import db_session from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.models.RestrictionAssignee import RestrictionAssignee from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound from sqlalchemy.orm import validates from usernames import is_safe_username @@ -27,7 +28,7 @@ class PASS_COMPLEXITY: ] -class User(CRUDModel, Base): # type: ignore +class User(CRUDModel, RestrictionAssignee): # type: ignore __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(40), unique=True, nullable=False) @@ -38,6 +39,7 @@ class User(CRUDModel, Base): # type: ignore _hashed_password = Column(String(120), nullable=False) _roles = relationship('Role', cascade='all,delete', backref=backref('user')) _groups = relationship('Group', secondary='user2group') + _restrictions = relationship('Restriction', secondary='restriction2assignee') min_password_length = 8 @@ -126,3 +128,19 @@ def as_dict(self): @staticmethod def verify_hash(password, hash): return sha256.verify(password, hash) + + def get_restrictions(self, include_expired=False, include_global=False, include_group=False): + restrictions = super(User, self).get_restrictions(include_expired=include_expired, + include_global=include_global) + if include_group: + for group in self.groups: + restrictions = restrictions + group.get_restrictions(include_expired=include_expired, + include_global=include_global) + return list(set(restrictions)) + + def get_active_restrictions(self, include_global=False, include_group=False): + restrictions = super(User, self).get_active_restrictions(include_global=include_global) + if include_group: + for group in self.groups: + restrictions = restrictions + group.get_active_restrictions(include_global=include_global) + return list(set(restrictions)) diff --git a/tests/conftest.py b/tests/conftest.py index 7173923c..3ff76c41 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,4 @@ import pytest -from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, new_group_with_member +from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, new_group_with_member, \ +resource1, resource2, restriction, schedule from fixtures.database import tables diff --git a/tests/fixtures/database.py b/tests/fixtures/database.py index dce951b3..1d11001e 100644 --- a/tests/fixtures/database.py +++ b/tests/fixtures/database.py @@ -7,6 +7,9 @@ def tables(): from tensorhive.models.User import User from tensorhive.models.Group import Group, User2Group from tensorhive.models.Reservation import Reservation + from tensorhive.models.Resource import Resource + from tensorhive.models.Restriction import Restriction, Restriction2Assignee, Restriction2Resource + from tensorhive.models.RestrictionSchedule import RestrictionSchedule from tensorhive.models.Role import Role from tensorhive.models.RevokedToken import RevokedToken Base.metadata.create_all(engine) diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index b8734dea..98f27607 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -1,9 +1,13 @@ import pytest +import datetime from tensorhive.models.Reservation import Reservation +from tensorhive.models.Restriction import Restriction +from tensorhive.models.RestrictionSchedule import RestrictionSchedule from tensorhive.models.User import User from tensorhive.models.Group import Group +from tensorhive.models.Resource import Resource from tensorhive.models.Role import Role -from datetime import datetime, timedelta +from datetime import timedelta @pytest.fixture(scope='function') @@ -23,7 +27,7 @@ def new_admin(): @pytest.fixture(scope='function') def new_reservation(new_user): new_user.save() - now = datetime.utcnow() + now = datetime.datetime.utcnow() duration = timedelta(minutes=60) return Reservation( @@ -40,7 +44,7 @@ def new_reservation(new_user): def new_reservation_2(new_user, new_admin): new_user.save() new_admin.save() - now = datetime.utcnow() + now = datetime.datetime.utcnow() duration = timedelta(minutes=60) return Reservation( @@ -64,3 +68,36 @@ def new_group_with_member(new_user): group.save() group.add_user(new_user) return group + + +@pytest.fixture(scope='function') +def resource1(): + resource = Resource(id='34943e60-0acd-4c31-b96e-02f88cc156f3') + resource.save() + return resource + + +@pytest.fixture(scope='function') +def resource2(): + resource = Resource(id='d5c501b1-8fbc-4dc2-9153-5f06af785336', name='Custom name') + resource.save() + return resource + + +@pytest.fixture(scope='function') +def restriction(): + start_time = datetime.datetime.utcnow() + timedelta(minutes=5) + end_time = start_time + timedelta(hours=8) + restriction = Restriction(name='TestRestriction', starts_at=start_time, ends_at=end_time, is_global=False) + restriction.save() + return restriction + + +@pytest.fixture(scope='function') +def schedule(): + schedule_expression = '12345' + start_time = datetime.time(8, 0, 0) + end_time = datetime.time(10, 0, 0) + schedule = RestrictionSchedule(schedule_days=schedule_expression, hour_start=start_time, hour_end=end_time) + schedule.save() + return schedule diff --git a/tests/unit/models/test_resource_model.py b/tests/unit/models/test_resource_model.py new file mode 100644 index 00000000..0b7ed9a6 --- /dev/null +++ b/tests/unit/models/test_resource_model.py @@ -0,0 +1,8 @@ +from tensorhive.models.Resource import Resource + + +def test_resource_creation(tables): + new_resource = Resource(id="34943e60-0acd-4c31-b96e-02f88cc156f3") + new_resource.save() + + assert Resource.get(new_resource.id) is not None diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py new file mode 100644 index 00000000..90f6c198 --- /dev/null +++ b/tests/unit/models/test_restriction_model.py @@ -0,0 +1,81 @@ +import pytest + +from datetime import datetime, timedelta +from tensorhive.models.Restriction import Restriction + + +def test_restriction_creation(tables): + starts_at = datetime.utcnow() + timedelta(minutes=5) + duration = timedelta(hours=12) + new_restriction = Restriction(name='TestRestriction', starts_at=starts_at, + ends_at=starts_at+duration, is_global=False) + new_restriction.save() + + assert new_restriction.id is not None + + +def test_get_global_restrictions_returns_them(tables): + starts_at = datetime.utcnow() + timedelta(minutes=5) + duration = timedelta(hours=12) + new_restriction = Restriction(name='TestRestriction', starts_at=starts_at, + ends_at=starts_at+duration, is_global=True) + new_restriction.save() + + assert new_restriction in Restriction.get_global_restrictions() + + +def test_apply_restriction_to_user(tables, restriction, new_user): + new_user.save() + restriction.apply_to_user(new_user) + + assert restriction in new_user.get_restrictions() + assert new_user in restriction.users + + +def test_apply_restriction_to_group(tables, restriction, new_group): + restriction.apply_to_group(new_group) + + assert restriction in new_group.get_restrictions() + assert new_group in restriction.groups + + +def test_group_restrictions_apply_to_its_members(tables, restriction, new_group_with_member): + restriction.apply_to_group(new_group_with_member) + + assert restriction in new_group_with_member.get_restrictions() + assert restriction in new_group_with_member.users[0].get_restrictions(include_group=True) + assert new_group_with_member in restriction.groups + + +def test_it_should_be_impossible_to_create_restriction_with_end_time_happening_before_start_time(tables): + start_time = datetime.utcnow() + timedelta(hours=5) + end_time = datetime.utcnow() + timedelta(minutes=1) + restriction = Restriction(name='Test', starts_at=start_time, ends_at=end_time, is_global=False) + + with pytest.raises(AssertionError): + restriction.save() + + +def test_it_should_be_impossible_to_create_or_edit_restriction_that_already_expired(tables): + start_time = datetime.utcnow() - timedelta(hours=5) + end_time = start_time + timedelta(hours=1) + restriction = Restriction(name='Test', starts_at=start_time, ends_at=end_time, is_global=False) + + with pytest.raises(AssertionError): + restriction.save() + + +def test_apply_restriction_to_resource(tables, restriction, resource1): + restriction.apply_to_resource(resource1) + + assert restriction in resource1.get_restrictions() + assert resource1 in restriction.resources + + +def test_global_restriction_applies_to_all_resources(tables, restriction, resource1, resource2): + restriction.is_global = True + restriction.save() + + assert len(restriction.resources) == 0 + assert restriction in resource1.get_restrictions(include_global=True) + assert restriction in resource2.get_restrictions(include_global=True) diff --git a/tests/unit/models/test_restrictionschedule_model.py b/tests/unit/models/test_restrictionschedule_model.py new file mode 100644 index 00000000..b05eabb6 --- /dev/null +++ b/tests/unit/models/test_restrictionschedule_model.py @@ -0,0 +1,32 @@ +import pytest +import datetime + +from tensorhive.models.RestrictionSchedule import RestrictionSchedule + + +def test_schedule_creation(tables): + schedule_expression = '12345' + starts_at = datetime.time(8, 0, 0) + ends_at = datetime.time(15, 0, 0) + schedule = RestrictionSchedule(schedule_days=schedule_expression, hour_start=starts_at, hour_end=ends_at) + schedule.save() + + +def test_cannot_create_schedule_with_wrong_schedule_expression(tables): + starts_at = datetime.time(8, 0, 0) + ends_at = datetime.time(15, 0, 0) + wrong_schedule_expression = '1458' + schedule = RestrictionSchedule(schedule_days=wrong_schedule_expression, hour_start=starts_at, hour_end=ends_at) + with pytest.raises(AssertionError): + schedule.save() + + schedule.schedule_days = '1123' + with pytest.raises(AssertionError): + schedule.save() + + +def test_add_schedule_to_restriction(tables, restriction, schedule): + restriction.add_schedule(schedule) + + assert schedule in restriction.schedules + assert restriction in schedule.restrictions diff --git a/tests/unit/models/test_user_model.py b/tests/unit/models/test_user_model.py index 1769cfda..0b25d6b0 100644 --- a/tests/unit/models/test_user_model.py +++ b/tests/unit/models/test_user_model.py @@ -1,5 +1,5 @@ import pytest -from sqlalchemy.exc import OperationalError, IntegrityError +from sqlalchemy.exc import IntegrityError from tensorhive.models.User import User From 33cc04f3d829fec8fcb2bc97d261c4d573275fb8 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 18 Jul 2020 12:44:51 +0200 Subject: [PATCH 011/175] Fix whitespace issues --- tensorhive/models/Restriction.py | 3 ++- tensorhive/models/RestrictionAssignee.py | 4 ++-- tensorhive/models/RestrictionSchedule.py | 6 ++++-- tests/conftest.py | 4 ++-- tests/unit/models/test_restriction_model.py | 4 ++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 12a95be3..acaaaa42 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -45,7 +45,8 @@ def __repr__(self): starts_at={starts_at} ends_at={ends_at} is_global={is_global} - '''.format(id=self.id, name=self.name, starts_at=self.starts_at, ends_at=self.ends_at, is_global=self.is_global) + '''.format(id=self.id, name=self.name, starts_at=self.starts_at, + ends_at=self.ends_at, is_global=self.is_global) def check_assertions(self): if self.ends_at is not None: diff --git a/tensorhive/models/RestrictionAssignee.py b/tensorhive/models/RestrictionAssignee.py index 40da865f..1ce2c47f 100644 --- a/tensorhive/models/RestrictionAssignee.py +++ b/tensorhive/models/RestrictionAssignee.py @@ -26,8 +26,8 @@ def get_restrictions(self, include_expired=False, include_global=False): restrictions = [r for r in self._restrictions if not r.is_expired] if include_global: - restrictions = list(set(restrictions + - Restriction.get_global_restrictions(include_expired=include_expired))) + restrictions = list(set(restrictions + Restriction + .get_global_restrictions(include_expired=include_expired))) return restrictions def get_active_restrictions(self, include_global=False): diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index 053b3eb1..97d38f7c 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -78,5 +78,7 @@ class Restriction2Schedule(Base): # type: ignore restriction_id = Column(Integer, ForeignKey('restrictions.id', ondelete='CASCADE'), primary_key=True) schedule_id = Column(Integer, ForeignKey('restriction_schedules.id', ondelete='CASCADE'), primary_key=True) - restriction = relationship('Restriction', backref=backref('restriction2schedule', cascade='all,delete-orphan')) - schedule = relationship('RestrictionSchedule', backref=backref('restriction2schedule', cascade='all,delete-orphan')) + restriction = relationship('Restriction', + backref=backref('restriction2schedule', cascade='all,delete-orphan')) + schedule = relationship('RestrictionSchedule', + backref=backref('restriction2schedule', cascade='all,delete-orphan')) diff --git a/tests/conftest.py b/tests/conftest.py index 3ff76c41..5ca4e97f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ import pytest -from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, new_group_with_member, \ -resource1, resource2, restriction, schedule +from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, \ + new_group_with_member, resource1, resource2, restriction, schedule from fixtures.database import tables diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 90f6c198..922dedc0 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -8,7 +8,7 @@ def test_restriction_creation(tables): starts_at = datetime.utcnow() + timedelta(minutes=5) duration = timedelta(hours=12) new_restriction = Restriction(name='TestRestriction', starts_at=starts_at, - ends_at=starts_at+duration, is_global=False) + ends_at=starts_at + duration, is_global=False) new_restriction.save() assert new_restriction.id is not None @@ -18,7 +18,7 @@ def test_get_global_restrictions_returns_them(tables): starts_at = datetime.utcnow() + timedelta(minutes=5) duration = timedelta(hours=12) new_restriction = Restriction(name='TestRestriction', starts_at=starts_at, - ends_at=starts_at+duration, is_global=True) + ends_at=starts_at + duration, is_global=True) new_restriction.save() assert new_restriction in Restriction.get_global_restrictions() From b28ae7ffcebf5ee429d3f58e11e024abdc200f53 Mon Sep 17 00:00:00 2001 From: mateusz Date: Wed, 22 Jul 2020 15:02:36 +0200 Subject: [PATCH 012/175] Upgrade API to OpenAPI 3.0.3 --- setup.py | 3 +- tensorhive/api/api_specification.yml | 1826 +++++++++-------- tensorhive/authorization.py | 4 + .../user/create_user_controller.py | 4 +- .../controllers/user/get_users_controller.py | 1 - .../user/update_user_controller.py | 3 +- 6 files changed, 997 insertions(+), 844 deletions(-) diff --git a/setup.py b/setup.py index c621a2b0..fb3008d5 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,8 @@ 'sqlalchemy-utils==0.33.8', 'click==7.0', 'werkzeug==0.16.1', - 'connexion==1.5.3', + 'connexion==2.7.0', + 'swagger_ui_bundle==0.0.8', 'flask_cors==3.0.7', 'flask_jwt_extended==3.13.1', 'gunicorn==19.9.0', diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 9b16d734..85e929c7 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -1,35 +1,40 @@ -swagger: "2.0" +openapi: "3.0.3" info: title: "{{title}} {{version}}" version: "{{version}}" -basePath: "/{{url_prefix}}" +servers: + - url: "/{{url_prefix}}" paths: /users: get: - tags: + tags: - users summary: Get all users operationId: tensorhive.controllers.user.get_users_controller.get responses: 200: description: {{RESPONSES['users']['get']['success']}} - schema: - type: array - items: - $ref: '#/definitions/UserToDisplay' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UserToDisplay' 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: @@ -45,36 +50,43 @@ paths: in: path name: id required: true - type: integer + schema: + type: integer responses: 200: description: {{RESPONSES['users']['get']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['user']['get']['success']}} - user: - $ref: '#/definitions/UserToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['user']['get']['success']}} + user: + $ref: '#/components/schemas/UserToDisplay' 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['user']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['user']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['user']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: @@ -83,40 +95,45 @@ paths: - Bearer: [] /user/create: post: - tags: + tags: - users summary: Create new user operationId: tensorhive.controllers.user.create_user_controller.create - parameters: - - description: User object - in: body - name: user - required: true - schema: - $ref: '#/definitions/UserForm' + requestBody: + description: User object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserForm' + x-body-name: newUser responses: 201: description: {{RESPONSES['user']['create']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['user']['create']['success']}} - user: - $ref: '#/definitions/UserToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['user']['create']['success']}} + user: + $ref: '#/components/schemas/UserToDisplay' 400: description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 409: description: {{RESPONSES['user']['create']['failure']['duplicate']}} 422: @@ -128,39 +145,44 @@ paths: /user: put: tags: - - users - summary: Create new user + - users + summary: Update existing user operationId: tensorhive.controllers.user.update_user_controller.update - parameters: - - description: User object - in: body - name: user + requestBody: + description: User object required: true - schema: - $ref: '#/definitions/UserUpdateForm' + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdateForm' + x-body-name: newValues responses: 201: description: {{RESPONSES['user']['update']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['user']['update']['success']}} - user: - $ref: '#/definitions/UserToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['user']['update']['success']}} + user: + $ref: '#/components/schemas/UserToDisplay' 400: description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 409: description: {{RESPONSES['user']['create']['failure']['duplicate']}} 422: @@ -168,33 +190,36 @@ paths: 500: description: {{RESPONSES['general']['internal_error']}} security: - - Bearer: [] + - Bearer: [] /user/ssh_signup: post: tags: - users summary: Create new user account based on SSH authentication operationId: tensorhive.controllers.user.create_user_controller.ssh_signup - parameters: - - description: User object - in: body - name: user - required: true - schema: - $ref: '#/definitions/UserForm' + requestBody: + description: User object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserForm' + x-body-name: user responses: 201: description: {{RESPONSES['user']['create']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['user']['create']['success']}} - user: - type: array - items: - $ref: '#/definitions/UserToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['user']['create']['success']}} + user: + type: array + items: + $ref: '#/components/schemas/UserToDisplay' 400: description: {{RESPONSES['general']['bad_request']}} 403: @@ -205,8 +230,6 @@ paths: description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['user']['create']['failure']['invalid']}} 500: description: {{RESPONSES['general']['internal_error']}} - security: - - Bearer: [] /user/delete/{id}: delete: tags: @@ -218,23 +241,28 @@ paths: in: path name: id required: true - type: integer + schema: + type: integer responses: 200: description: {{RESPONSES['user']['delete']['success']}} - schema: - example: - msg: {{RESPONSES['user']['delete']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['user']['delete']['success']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['user']['not_found']}} 422: @@ -252,15 +280,17 @@ paths: responses: 200: description: {{RESPONSES['user']['logout']['success']}} - schema: - example: - msg: {{RESPONSES['user']['logout']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['user']['logout']['success']}} 401: description: {{RESPONSES['general']['unauthorized']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: - description: {{RESPONSES['general']['internal_error']}} + description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] /user/logout/refresh_token: @@ -272,9 +302,11 @@ paths: responses: 200: description: {{RESPONSES['user']['logout']['success']}} - schema: - example: - msg: {{RESPONSES['user']['logout']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['user']['logout']['success']}} 401: description: {{RESPONSES['general']['unauthorized']}} 422: @@ -292,10 +324,12 @@ paths: responses: 200: description: {{RESPONSES['token']['refresh']['success']}} - schema: - example: - msg: {{RESPONSES['token']['refresh']['success']}} - access_token: + content: + application/json: + schema: + example: + msg: {{RESPONSES['token']['refresh']['success']}} + access_token: 401: description: {{RESPONSES['general']['unauthorized']}} 422: @@ -308,21 +342,24 @@ paths: - authentication summary: Login user operationId: 'tensorhive.controllers.user.login_user_controller.login' - parameters: - - description: User object - in: body - name: user - required: true - schema: - $ref: '#/definitions/UserLoginForm' + requestBody: + description: User object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserLoginForm' + x-body-name: user responses: 200: description: {{RESPONSES['user']['login']['success']}} - schema: - example: - msg: {{RESPONSES['user']['login']['success']}} - access_token: - refresh_token: + content: + application/json: + schema: + example: + msg: {{RESPONSES['user']['login']['success']}} + access_token: + refresh_token: 400: description: {{RESPONSES['general']['bad_request']}} 401: @@ -342,13 +379,15 @@ paths: responses: 200: description: {{RESPONSES['user']['authorized_keys_entry']['success']}} - schema: - example: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWuvmEw9RWI0WMv9aseFadgDXZbHW7KjQt6H7keoQ13y/XQX0+vosmEq70DQ9HCxmwvrSruR63DLe8eW5k80OBeAcHZ+e6f6g/017tCKfYTibCEboB7v7TgGO74kWcihZK5jPHg/jxwKktxDdbCfqvl6hrR5hwE2sJ5gVAx6UPJNVoZYRD2rAPhjKJ1NlENhCWrxrt72c/a6Qe9aRSvJ/Yxn+PWr5BbxyFFKEcmos9bUwh7NgdmsZphVrKeGnx9Nl1q46/PLBW2V4FbBpsv6OD6FksIdZF0irFNmfq1LGHDLlRwVrEXrTdQST2FqyNZJSXRxblEchzYijLA1J03xir tensorhive@ai' + content: + application/json: + schema: + example: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWuvmEw9RWI0WMv9aseFadgDXZbHW7KjQt6H7keoQ13y/XQX0+vosmEq70DQ9HCxmwvrSruR63DLe8eW5k80OBeAcHZ+e6f6g/017tCKfYTibCEboB7v7TgGO74kWcihZK5jPHg/jxwKktxDdbCfqvl6hrR5hwE2sJ5gVAx6UPJNVoZYRD2rAPhjKJ1NlENhCWrxrt72c/a6Qe9aRSvJ/Yxn+PWr5BbxyFFKEcmos9bUwh7NgdmsZphVrKeGnx9Nl1q46/PLBW2V4FbBpsv6OD6FksIdZF0irFNmfq1LGHDLlRwVrEXrTdQST2FqyNZJSXRxblEchzYijLA1J03xir tensorhive@ai' 500: description: {{RESPONSES['general']['internal_error']}} /reservations: get: - tags: + tags: - reservations summary: Get all or specific reservation events operationId: tensorhive.controllers.reservation.get_reservation_controller.get @@ -357,29 +396,33 @@ paths: in: query name: resources_ids required: false - type: array - items: { + schema: + type: array + items: type: string - } - description: UTC ISO (e.g. 2018-10-22T10:00:00.0Z) in: query name: start required: false - type: string - format: date-time + schema: + type: string + format: date-time - description: UTC ISO (e.g. 2018-10-22T19:00:00.0Z) in: query name: end required: false - type: string - format: date-time + schema: + type: string + format: date-time responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - type: array - items: - $ref: '#/definitions/Reservation' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Reservation' 400: description: {{RESPONSES['general']['bad_request']}}. Specify all parameters or none. 422: @@ -389,28 +432,31 @@ paths: security: - Bearer: [] post: - tags: + tags: - reservations summary: Make new reservation operationId: tensorhive.controllers.reservation.create_reservation_controller.create - parameters: - - description: Reservation object - in: body - name: reservation - required: true - schema: - $ref: '#/definitions/ReservationForm' + requestBody: + description: Reservation object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ReservationForm' + x-body-name: reservation responses: 201: description: {{RESPONSES['reservation']['create']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['reservation']['create']['success']}} - reservation: - $ref: '#/definitions/Reservation' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['reservation']['create']['success']}} + reservation: + $ref: '#/components/schemas/Reservation' 400: description: {{RESPONSES['general']['bad_request']}} 401: @@ -424,37 +470,42 @@ paths: /reservations/{id}: put: tags: - - reservations + - reservations summary: Update existing reservation operationId: tensorhive.controllers.reservation.update_reservation_controller.update + requestBody: + description: Reservation object with fields to overwrite. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ReservationUpdateForm' + x-body-name: newValues parameters: - description: Reservation ID in: path name: id required: true - type: integer - - description: Reservation object with fields to overwrite. - in: body - name: newValues - required: true schema: - $ref: '#/definitions/ReservationUpdateForm' + type: integer responses: 201: description: {{RESPONSES['reservation']['update']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['reservation']['update']['success']}} - reservation: - $ref: '#/definitions/Reservation' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['reservation']['update']['success']}} + reservation: + $ref: '#/components/schemas/Reservation' 400: description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} - 401: + 404: description: {{RESPONSES['reservation']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['reservation']['update']['failure']['assertions']}} @@ -463,8 +514,8 @@ paths: security: - Bearer: [] delete: - tags: - - reservations + tags: + - reservations summary: Delete reservation operationId: tensorhive.controllers.reservation.delete_reservation_controller.delete parameters: @@ -472,13 +523,16 @@ paths: in: path name: id required: true - type: integer + schema: + type: integer responses: 200: description: {{RESPONSES['reservation']['delete']['success']}} - schema: - example: - msg: {{RESPONSES['reservation']['delete']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['reservation']['delete']['success']}} 401: description: {{RESPONSES['general']['unauthorized']}} 404: @@ -491,17 +545,19 @@ paths: - Bearer: [] /nodes/hostnames: get: - tags: + tags: - nodes summary: Get all hostnames operationId: tensorhive.controllers.nodes.infrastructure_controller.get_hostnames responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - example: - - hostname1 - - hostname2 + content: + application/json: + schema: + example: + - hostname1 + - hostname2 401: description: {{RESPONSES['general']['unauthorized']}} 422: @@ -510,16 +566,18 @@ paths: - Bearer: [] /nodes/metrics: get: - tags: + tags: - nodes summary: Get each node's all metric data description: Puts null if some data is unavailable operationId: tensorhive.controllers.nodes.infrastructure_controller.get_all_data responses: 200: - description: {{RESPONSES['general']['ok']}} - schema: - $ref: '#/definitions/GPUAllData' + description: {{RESPONSES['general']['ok']}} + content: + application/json: + schema: + $ref: '#/components/schemas/GPUAllData' 401: description: {{RESPONSES['general']['unauthorized']}} 422: @@ -528,41 +586,44 @@ paths: - Bearer: [] /nodes/{hostname}/gpu/info: get: - tags: + tags: - nodes summary: Get node's basic GPU information operationId: tensorhive.controllers.nodes.gpu_controller.get_info parameters: - - $ref: '#/parameters/hostnameParam' + - $ref: '#/components/parameters/hostnameParam' responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - $ref: '#/definitions/GPUInfo' + content: + application/json: + schema: + $ref: '#/components/schemas/GPUInfo' 401: description: {{RESPONSES['general']['unauthorized']}} 404: description: {{RESPONSES['nodes']['hostname']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} - security: - Bearer: [] /nodes/{hostname}/gpu/metrics: get: - tags: + tags: - nodes summary: Get node's GPU metric data description: Puts null if some data is unavailable operationId: tensorhive.controllers.nodes.gpu_controller.get_metrics parameters: - - $ref: '#/parameters/hostnameParam' - - $ref: '#/parameters/gpuMetricTypeQuery' + - $ref: '#/components/parameters/hostnameParam' + - $ref: '#/components/parameters/gpuMetricTypeQuery' responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - $ref: '#/definitions/GPUMetricsInTwoCases' + content: + application/json: + schema: + $ref: '#/components/schemas/GPUMetricsInTwoCases' 401: description: {{RESPONSES['general']['unauthorized']}} 404: @@ -579,13 +640,15 @@ paths: description: Puts null if some data is unavailable operationId: tensorhive.controllers.nodes.cpu_controller.get_metrics parameters: - - $ref: '#/parameters/hostnameParam' - - $ref: '#/parameters/cpuMetricTypeQuery' + - $ref: '#/components/parameters/hostnameParam' + - $ref: '#/components/parameters/cpuMetricTypeQuery' responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - $ref: '#/definitions/CPUMetrics' + content: + application/json: + schema: + $ref: '#/components/schemas/CPUMetrics' 401: description: {{RESPONSES['general']['unauthorized']}} 404: @@ -596,29 +659,31 @@ paths: - Bearer: [] /nodes/{hostname}/gpu/processes: get: - tags: + tags: - nodes summary: Get node's GPU processes data description: Puts null if some data is unavailable operationId: tensorhive.controllers.nodes.gpu_controller.get_processes parameters: - - $ref: '#/parameters/hostnameParam' + - $ref: '#/components/parameters/hostnameParam' responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - $ref: '#/definitions/GPUProcesses' + content: + application/json: + schema: + $ref: '#/components/schemas/GPUProcesses' 401: description: {{RESPONSES['general']['unauthorized']}} 404: description: {{RESPONSES['nodes']['hostname']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} - security: - - Bearer: [] + # security: + # - Bearer: [] /tasks: get: - tags: + tags: - tasks operationId: tensorhive.controllers.task.get_all summary: Query tasks @@ -627,81 +692,92 @@ paths: - description: User ID (optional) in: query name: userId - type: integer required: false - default: null - x-nullable: true + schema: + type: integer + default: null + nullable: true - description: Synchronize all tasks (optional) in: query name: syncAll - type: boolean required: false - default: false + schema: + type: boolean + default: false responses: 200: description: {{RESPONSES['task']['all']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['all']['success']}} - tasks: - type: array - items: - $ref: '#/definitions/TaskToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['all']['success']}} + tasks: + type: array + items: + $ref: '#/components/schemas/TaskToDisplay' 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: - Bearer: [] post: - tags: + tags: - tasks summary: Create new task operationId: tensorhive.controllers.task.create - parameters: - - description: | - Task object - * spawn field is nullable string - * terminate field is nullable string - in: body - name: task - required: true - schema: - $ref: '#/definitions/TaskForm' + requestBody: + description: | + Task object + * spawn field is nullable string + * terminate field is nullable string + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TaskForm' + x-body-name: task responses: 201: description: {{RESPONSES['task']['create']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['create']['success']}} - task: - $ref: '#/definitions/TaskToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['create']['success']}} + task: + $ref: '#/components/schemas/TaskToDisplay' 400: description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} # 409: # description: {{RESPONSES['task']['create']['failure']['duplicate']}} 422: @@ -712,7 +788,7 @@ paths: - Bearer: [] /tasks/{id}: get: - tags: + tags: - tasks operationId: tensorhive.controllers.task.get summary: Get task by ID @@ -721,47 +797,56 @@ paths: - description: Task ID in: path name: id - type: integer required: true + schema: + type: integer responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['get']['success']}} - task: - $ref: '#/definitions/TaskToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['get']['success']}} + task: + $ref: '#/components/schemas/TaskToDisplay' 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['task']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: description: {{RESPONSES['general']['internal_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['internal_error']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] put: @@ -769,60 +854,71 @@ paths: - tasks summary: Update task operationId: tensorhive.controllers.task.update + requestBody: + description: | + Task object with fields to overwrite. + * spawn field is nullable string + * terminate field is nullable string + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TaskUpdateForm' + x-body-name: newValues parameters: - description: Task ID in: path name: id required: true - type: integer - - description: | - Task object with fields to overwrite. - * spawn field is nullable string - * terminate field is nullable string - in: body - name: newValues - required: true schema: - $ref: '#/definitions/TaskUpdateForm' + type: integer responses: 201: description: {{RESPONSES['general']['ok']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['update']['success']}} - task: - $ref: '#/definitions/TaskToDisplay' + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['update']['success']}} + task: + $ref: '#/components/schemas/TaskToDisplay' 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['task']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: description: {{RESPONSES['general']['internal_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['internal_error']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] delete: @@ -835,44 +931,53 @@ paths: in: path name: id required: true - type: integer + schema: + type: integer responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['delete']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['delete']['success']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['task']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['not_found']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: description: {{RESPONSES['general']['internal_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['internal_error']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] /tasks/{id}/log: @@ -886,74 +991,87 @@ paths: - description: Task ID in: path name: id - type: integer required: true + schema: + type: integer - description: Only tail (10 lines) in: query name: tail - type: boolean required: false - default: false + schema: + type: boolean + default: false responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['get']['success']}} - path: - type: string - example: ~/TensorHiveLogs/task_99.log - output_lines: - type: array - items: - type: string - example: - - first line - - second line - - etc. + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['get']['success']}} + path: + type: string + example: ~/TensorHiveLogs/task_99.log + output_lines: + type: array + items: + type: string + example: + - first line + - second line + - etc. 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['task']['get_log']['failure']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['get_log']['failure']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['get_log']['failure']['not_found']}} 422: description: {{RESPONSES['task']['get_log']['failure']['assertions']}} or {{RESPONSES['general']['auth_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['get_log']['failure']['assertions']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['get_log']['failure']['assertions']}} 500: description: {{RESPONSES['ssh']['failure']['connection']}} or {{RESPONSES['general']['internal_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['ssh']['failure']['connection']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['ssh']['failure']['connection']}} security: - Bearer: [] /screen-sessions: get: tags: - - tasks + - tasks + operationId: tensorhive.controllers.task.screen_sessions summary: Returns PIDs of active screen sessions running on username@hostname description: | It shows only sessions labeled by TensorHive and ignores anything else. @@ -963,522 +1081,552 @@ paths: in: query name: username required: true - type: string + schema: + type: string - description: Hostname in: query name: hostname required: true - type: string - summary: Returns pids of running screen sessions on username@hostname - operationId: tensorhive.controllers.task.screen_sessions + schema: + type: string responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['screen-sessions']['success']}} - pids: - type: array - example: - - 1234 - - 2345 - - 3456 - items: - type: integer + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['screen-sessions']['success']}} + pids: + type: array + example: + - 1234 + - 2345 + - 3456 + items: + type: integer 401: description: {{RESPONSES['general']['unauthorized']}} 422: description: {{RESPONSES['screen-sessions']['failure']['assertions']}} or {{RESPONSES['general']['auth_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['screen-sessions']['failure']['assertions']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['screen-sessions']['failure']['assertions']}} 500: description: {{RESPONSES['ssh']['failure']['connection']}} or {{RESPONSES['general']['internal_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['ssh']['failure']['connection']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['ssh']['failure']['connection']}} # security: # - Bearer: [] /tasks/{id}/spawn: get: - tags: + tags: - tasks + operationId: tensorhive.controllers.task.spawn + summary: Spawns a task by id + description: | + Task which is already running will not be spawned. + Task's state will be synced automatically. parameters: - description: Task ID in: path name: id required: true - type: integer - summary: Spawns a task by id - description: | - Task which is already running will not be spawned. - Task's state will be synced automatically. - operationId: tensorhive.controllers.task.spawn + schema: + type: integer responses: 200: description: {{RESPONSES['general']['ok']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['spawn']['success']}} - pid: - type: integer - example: 4321 + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['spawn']['success']}} + pid: + type: integer + example: 4321 + 401: + description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['task']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['not_found']}} - 401: - description: {{RESPONSES['general']['unauthorized']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['not_found']}} 422: description: {{RESPONSES['task']['spawn']['failure']['assertions']}} or {{RESPONSES['general']['auth_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['spawn']['failure']['assertions']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['spawn']['failure']['assertions']}} 500: description: {{RESPONSES['task']['spawn']['failure']['backend']}} or {{RESPONSES['general']['internal_error']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['not_found']}} security: - Bearer: [] /tasks/{id}/terminate: get: - tags: + tags: - tasks - parameters: - - description: Task ID - in: path - name: id - required: true - type: integer - - description: false to kill, null to terminate, true to interrupt - in: query - name: gracefully - type: boolean - required: false - x-nullable: true - default: null + operationId: tensorhive.controllers.task.terminate summary: Interrupts/terminates/kills task by id description: | Kill - almost guaranteed termination Terminate - sends SIGTERM, works in most cases - + Interrupt - sends SIGINT. Only this method allows for capturing logs when program is closing Returns exit code of the operation, not task's command! Task state will be synced automatically. - operationId: tensorhive.controllers.task.terminate + parameters: + - description: Task ID + in: path + name: id + required: true + schema: + type: integer + - description: false to kill, null to terminate, true to interrupt + in: query + name: gracefully + required: false + schema: + type: boolean + nullable: true + default: null responses: 200: description: {{RESPONSES['task']['terminate']['success']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['terminate']['success']}} - exit_code: - type: integer - example: 0 + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['terminate']['success']}} + exit_code: + type: integer + example: 0 202: description: {{RESPONSES['task']['terminate']['failure']['exit_code']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['terminate']['failure']['exit_code']}} - exit_code: - type: integer - example: 1 + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['terminate']['failure']['exit_code']}} + exit_code: + type: integer + example: 1 401: description: {{RESPONSES['general']['unauthorized']}} 403: description: {{RESPONSES['general']['unpriviliged']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} 404: description: {{RESPONSES['task']['not_found']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['not_found']}} 409: description: {{RESPONSES['task']['terminate']['failure']['state']}} - schema: - type: object - properties: - msg: - type: string - example: {{RESPONSES['task']['terminate']['failure']['state']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['task']['terminate']['failure']['state']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] -definitions: - UserToDisplay: - type: object - properties: - id: - type: integer - format: int64 - example: 1 - username: - type: string - example: foobar - email: - type: string - example: foo@bar.com - createdAt: - type: string - format: date-time - TaskForm: - type: object - required: - - command - - hostname - - userId - properties: - command: - type: string - example: CUDA_VISIBLE_DEVICES=0 train.py - hostname: - type: string - example: localhost - userId: - type: integer - example: 1 - spawnAt: - type: string - format: date-time - x-nullable: true - terminateAt: - type: string - format: date-time - x-nullable: true - TaskToDisplay: - type: object - properties: - id: - type: integer - format: int64 - example: 1 - userId: - type: integer - example: 1 - command: - type: string - example: CUDA_VISIBLE_DEVICES=0 train.py - pid: - type: integer - format: int64 - example: 4321 - hostname: - type: string - format: 'localhost' - spawnAt: - type: string - format: date-time - x-nullable: true - example: 2019-05-08T12:00:00.066Z (or null!) - terminateAt: - type: string - format: date-time - x-nullable: true - example: 2019-05-08T13:00:00.066Z (or null!) - UserUpdateForm: - type: object - required: - - id - properties: - roles: - type: array - items: { +components: + schemas: + UserToDisplay: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + username: type: string - } - username: - type: string - example: foobar - password: - type: string - example: difficult_password - id: - type: integer - format: int64 - example: 1 - readOnly: true - TaskUpdateForm: - type: object - properties: - command: - type: string - example: CUDA_VISIBLE_DEVICES=0 train.py --worker-id=2 - hostname: - type: string - example: localhost - spawnAt: - type: string - format: date-time - x-nullable: true - example: 2019-05-08T12:00:00.066Z (or null!) - terminateAt: - type: string - format: date-time - x-nullable: true - example: 2019-05-08T13:00:00.066Z (or null!) - UserForm: - type: object - required: - - username - - email - - password - properties: - username: - type: string - example: foobar - email: - type: string - example: foo@bar.com - password: - type: string - example: difficult_password - UserLoginForm: - type: object - required: - - username - - password - properties: - username: - type: string - example: foobar - password: - type: string - example: difficult_password - Reservation: - type: object - required: - - title - - description - - resourceId - - userId - - userName - - gpuUtilAvg - - memUtilAvg - - start - - end - properties: - id: - type: integer - format: int64 - example: 1 - readOnly: true - createdAt: - type: string - format: date-time - readOnly: true - title: - type: string - example: Example title - description: - type: string - example: Example description - resourceId: - type: string - example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 - userId: - type: integer - example: 1 - userName: - type: string - example: Example owner's username - gpuUtilAvg: - type: integer - example: 99 - memUtilAvg: - example: 67 - start: - type: string - format: date-time - end: - type: string - format: date-time - ReservationForm: - type: object - required: - - title - - description - - resourceId - - userId - - start - - end - properties: - title: - type: string - example: Example title - description: - type: string - example: Example description - resourceId: - type: string - example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 - userId: - type: integer - example: 1 - start: - type: string - format: date-time - end: - type: string - format: date-time - ReservationUpdateForm: - type: object - #required: - # - start - # - end - properties: - title: - type: string - example: Example title - description: - type: string - example: Example description - resourceId: - type: string - example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 - userId: - type: integer - example: 1 - start: - type: string - format: date-time - end: - type: string - format: date-time - GPUAllData: - type: object - example: - : - GPU: - : - index: 0 - name: GeForce GTX 1060 - metrics: - fan_speed: - unit: '%' - value: 30 - power: - unit: W - value: 90 - processes: 'null' - GPUInfo: - type: object - example: - : - index: + example: foobar + email: + type: string + example: foo@bar.com + createdAt: + type: string + format: date-time + TaskForm: + type: object + required: + - command + - hostname + - userId + properties: + command: + type: string + example: CUDA_VISIBLE_DEVICES=0 train.py + hostname: + type: string + example: localhost + userId: + type: integer + example: 1 + spawnAt: + type: string + format: date-time + nullable: true + terminateAt: + type: string + format: date-time + nullable: true + TaskToDisplay: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + userId: + type: integer + example: 1 + command: + type: string + example: CUDA_VISIBLE_DEVICES=0 train.py + pid: + type: integer + format: int64 + example: 4321 + hostname: + type: string + format: localhost + spawnAt: + type: string + format: date-time + nullable: true + example: 2019-05-08T12:00:00.066Z (or null!) + terminateAt: + type: string + format: date-time + nullable: true + example: 2019-05-08T13:00:00.066Z (or null!) + UserUpdateForm: + type: object + required: + - id + properties: + roles: + type: array + items: + type: string + username: + type: string + example: foobar + password: + type: string + example: difficult_password + id: + type: integer + format: int64 + example: 1 + TaskUpdateForm: + type: object + properties: + command: + type: string + example: CUDA_VISIBLE_DEVICES=0 train.py --worker-id=2 + hostname: + type: string + example: localhost + spawnAt: + type: string + format: date-time + nullable: true + example: 2019-05-08T12:00:00.066Z (or null!) + terminateAt: + type: string + format: date-time + nullable: true + example: 2019-05-08T13:00:00.066Z (or null!) + UserForm: + type: object + required: + - username + - email + - password + properties: + username: + type: string + example: foobar + email: + type: string + example: foo@bar.com + password: + type: string + example: difficult_password + UserLoginForm: + type: object + required: + - username + - password + properties: + username: + type: string + example: foobar + password: + type: string + example: difficult_password + Reservation: + type: object + required: + - title + - description + - resourceId + - userId + - userName + - gpuUtilAvg + - memUtilAvg + - start + - end + properties: + id: + type: integer + format: int64 + example: 1 + readOnly: true + createdAt: + type: string + format: date-time + readOnly: true + title: + type: string + example: Example title + description: + type: string + example: Example description + resourceId: + type: string + example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 + userId: + type: integer + example: 1 + userName: + type: string + example: Example owner's username + gpuUtilAvg: + type: integer + example: 99 + memUtilAvg: + type: integer + example: 67 + start: + type: string + format: date-time + end: + type: string + format: date-time + ReservationForm: + type: object + required: + - title + - description + - resourceId + - userId + - start + - end + properties: + title: + type: string + example: Example title + description: + type: string + example: Example description + resourceId: + type: string + example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 + userId: type: integer - example: 0 - name: + example: 1 + start: + type: string + format: date-time + end: + type: string + format: date-time + ReservationUpdateForm: + type: object + #required: + # - start + # - end + properties: + title: + type: string + example: Example title + description: + type: string + example: Example description + resourceId: + type: string + example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 + start: + type: string + format: date-time + end: type: string - example: GeForce GTX 1060 - GPUMetricsInTwoCases: - type: object - example: - : - utilization: + format: date-time + GPUAllData: + type: object + example: + : + GPU: + : + index: 0 + name: GeForce GTX 1060 + metrics: + fan_speed: + unit: '%' + value: 30 + power: + unit: W + value: 90 + processes: 'null' + GPUInfo: + type: object + example: + : + index: + type: integer + example: 0 + name: + type: string + example: GeForce GTX 1060 + GPUMetricsInTwoCases: + type: object + example: + : + utilization: + unit: '%' + value: 95 + power: + unit: W + value: 90 + : unit: '%' value: 95 - power: - unit: W - value: 90 - : - unit: '%' - value: 95 - CPUMetrics: - type: object - GPUProcesses: - type: object - example: - : - - command: python - owner: foo - pid: 1111 - - command: java - owner: bar - pid: 2222 -parameters: - hostnameParam: - description: Node's hostname in the network - in: path - name: hostname - required: true - type: string - gpuMetricTypeQuery: - description: Metric type. If not present, queries for all metrics - in: query - name: metric_type - required: false - type: string - enum: - - fan_speed - - mem_free - - mem_used - - mem_total - - utilization - - mem_util - - temp - - power - cpuMetricTypeQuery: - description: Metric type. If not present, queries for all metrics - in: query - name: metric_type - required: false - type: string - enum: - - mem_free - - mem_used - - mem_total - - utilization -securityDefinitions: - Bearer: - type: apiKey - name: Authorization - in: header + CPUMetrics: + type: object + GPUProcesses: + type: object + example: + : + - command: python + owner: foo + pid: 1111 + - command: java + owner: bar + pid: 2222 + parameters: + hostnameParam: + description: Node's hostname in the network + in: path + name: hostname + required: true + schema: + type: string + gpuMetricTypeQuery: + description: Metric type. If not present, queries for all metrics + in: query + name: metric_type + required: false + schema: + type: string + enum: + - fan_speed + - mem_free + - mem_used + - mem_total + - utilization + - mem_util + - temp + - power + cpuMetricTypeQuery: + description: Metric type. If not present, queries for all metrics + in: query + name: metric_type + required: false + schema: + type: string + enum: + - mem_free + - mem_used + - mem_total + - utilization + securitySchemes: + Bearer: + type: http + scheme: bearer + bearerFormat: JWT + x-bearerInfoFunc: tensorhive.authorization.decode_token \ No newline at end of file diff --git a/tensorhive/authorization.py b/tensorhive/authorization.py index 4154cab1..13b95ab0 100644 --- a/tensorhive/authorization.py +++ b/tensorhive/authorization.py @@ -8,6 +8,10 @@ G = API.RESPONSES['general'] +def decode_token(token): + return {} + + def init_jwt(app): for key, value in AUTH.FLASK_JWT.items(): app.config[key] = value diff --git a/tensorhive/controllers/user/create_user_controller.py b/tensorhive/controllers/user/create_user_controller.py index f1c7875c..facd4f57 100644 --- a/tensorhive/controllers/user/create_user_controller.py +++ b/tensorhive/controllers/user/create_user_controller.py @@ -44,8 +44,8 @@ def do_create(user): @admin_required -def create(user): - return do_create(user) +def create(newUser): + return do_create(newUser) def ssh_signup(user): diff --git a/tensorhive/controllers/user/get_users_controller.py b/tensorhive/controllers/user/get_users_controller.py index 930609b4..8b4ea007 100644 --- a/tensorhive/controllers/user/get_users_controller.py +++ b/tensorhive/controllers/user/get_users_controller.py @@ -18,7 +18,6 @@ def get(): @jwt_required def get_by_id(id): - # Dead code, web app is currently not using it try: user = User.get(id) except NoResultFound as e: diff --git a/tensorhive/controllers/user/update_user_controller.py b/tensorhive/controllers/user/update_user_controller.py index faeaf80e..6503b282 100644 --- a/tensorhive/controllers/user/update_user_controller.py +++ b/tensorhive/controllers/user/update_user_controller.py @@ -10,7 +10,8 @@ @admin_required @jwt_required -def update(user): +def update(newValues): + user = newValues print('REQ', user) if user.get('id') is not None: try: From 831dd3250cb53977f0b0576647fe9600b185ea7e Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 24 Jul 2020 22:33:03 +0200 Subject: [PATCH 013/175] Add unit tests for Restriction and RestrictionSchedule is_active methods --- tests/conftest.py | 2 +- tests/fixtures/models.py | 15 +++++++-- tests/unit/models/test_restriction_model.py | 31 +++++++++++++++++++ .../models/test_restrictionschedule_model.py | 29 ++++++++++++++--- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 5ca4e97f..bc6fa217 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ import pytest from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, \ - new_group_with_member, resource1, resource2, restriction, schedule + new_group_with_member, resource1, resource2, restriction, active_schedule, inactive_schedule from fixtures.database import tables diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index 98f27607..1cc91b1d 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -94,8 +94,19 @@ def restriction(): @pytest.fixture(scope='function') -def schedule(): - schedule_expression = '12345' +def active_schedule(): + schedule_expression = '1234567' + start_time = datetime.time(0, 0, 0) + end_time = datetime.time(23, 59, 59) + schedule = RestrictionSchedule(schedule_days=schedule_expression, hour_start=start_time, hour_end=end_time) + schedule.save() + return schedule + + +@pytest.fixture(scope='function') +def inactive_schedule(): + today = str(datetime.datetime.utcnow().weekday() + 1) + schedule_expression = '1234567'.replace(today, '') start_time = datetime.time(8, 0, 0) end_time = datetime.time(10, 0, 0) schedule = RestrictionSchedule(schedule_days=schedule_expression, hour_start=start_time, hour_end=end_time) diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 922dedc0..d26ae3ae 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -79,3 +79,34 @@ def test_global_restriction_applies_to_all_resources(tables, restriction, resour assert len(restriction.resources) == 0 assert restriction in resource1.get_restrictions(include_global=True) assert restriction in resource2.get_restrictions(include_global=True) + + +def test_restriction_without_schedules_is_active_only_when_between_start_and_end_dates(tables): + start_time = datetime.utcnow() - timedelta(hours=5) + end_time = datetime.utcnow() + timedelta(hours=5) + active_restriction = Restriction(name='ActiveRestriction', starts_at=start_time, ends_at=end_time, is_global=False) + active_restriction.save() + + start_time = datetime.utcnow() + timedelta(hours=1) + inactive_restriction = Restriction(name='InactiveRestriction', starts_at=start_time, ends_at=end_time, + is_global=False) + inactive_restriction.save() + + assert active_restriction.is_active is True + assert inactive_restriction.is_active is False + + +def test_restriction_with_schedules_is_active_only_when_at_least_one_of_its_schedules_is_active(tables, + active_schedule, + inactive_schedule): + start_time = datetime.utcnow() - timedelta(hours=5) + end_time = datetime.utcnow() + timedelta(hours=5) + restriction = Restriction(name='ActiveRestriction', starts_at=start_time, ends_at=end_time, is_global=False) + restriction.save() + + restriction.add_schedule(inactive_schedule) + assert restriction.is_active is False + + print(active_schedule.is_active) + restriction.add_schedule(active_schedule) + assert restriction.is_active is True diff --git a/tests/unit/models/test_restrictionschedule_model.py b/tests/unit/models/test_restrictionschedule_model.py index b05eabb6..856de833 100644 --- a/tests/unit/models/test_restrictionschedule_model.py +++ b/tests/unit/models/test_restrictionschedule_model.py @@ -25,8 +25,27 @@ def test_cannot_create_schedule_with_wrong_schedule_expression(tables): schedule.save() -def test_add_schedule_to_restriction(tables, restriction, schedule): - restriction.add_schedule(schedule) - - assert schedule in restriction.schedules - assert restriction in schedule.restrictions +def test_add_schedule_to_restriction(tables, restriction, active_schedule): + restriction.add_schedule(active_schedule) + + assert active_schedule in restriction.schedules + assert restriction in active_schedule.restrictions + + +def test_schedule_is_active_method_returns_valid_status(tables, restriction): + # schedule that runs only on current day of the week + today_schedule_expression = str(datetime.datetime.utcnow().weekday() + 1) + hour_start = datetime.time(0, 0, 0) + hour_end = datetime.time(23, 59, 59) + active_schedule = RestrictionSchedule(schedule_days=today_schedule_expression, hour_start=hour_start, + hour_end=hour_end) + active_schedule.save() + + # schedule that runs on every day of the week except for today + not_today_schedule_expression = '1234567'.replace(today_schedule_expression, '') + inactive_schedule = RestrictionSchedule(schedule_days=not_today_schedule_expression, hour_start=hour_start, + hour_end=hour_end) + inactive_schedule.save() + + assert active_schedule.is_active is True + assert inactive_schedule.is_active is False From 94e0671f7dbe094a019947e469ace3982ef88818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Ro=C5=9Bciszewski?= Date: Sat, 8 Aug 2020 13:20:25 +0200 Subject: [PATCH 014/175] use connexion 2.3.0 in order to support python 3.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index fb3008d5..fcb8b7e3 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ 'sqlalchemy-utils==0.33.8', 'click==7.0', 'werkzeug==0.16.1', - 'connexion==2.7.0', + 'connexion==2.3.0', 'swagger_ui_bundle==0.0.8', 'flask_cors==3.0.7', 'flask_jwt_extended==3.13.1', From 3eb1ff46d1f0444a8f19f03375b0305eb5b54ec4 Mon Sep 17 00:00:00 2001 From: mateusz Date: Sat, 8 Aug 2020 15:54:59 +0200 Subject: [PATCH 015/175] Bump API version to 0.4 and fix app version --- tensorhive/app/web/dev/static/config.json | 2 +- tensorhive/app/web/dist/static/config.json | 2 +- tensorhive/main_config.ini | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorhive/app/web/dev/static/config.json b/tensorhive/app/web/dev/static/config.json index efe11793..1e372df0 100644 --- a/tensorhive/app/web/dev/static/config.json +++ b/tensorhive/app/web/dev/static/config.json @@ -1 +1 @@ -{"apiPath": "http://localhost:1111/api/0.3.1", "version": "0.3", "apiVersion": "0.3.1"} +{"apiPath": "http://localhost:1111/api/0.4", "version": "0.3.3", "apiVersion": "0.4"} diff --git a/tensorhive/app/web/dist/static/config.json b/tensorhive/app/web/dist/static/config.json index efe11793..e2fff3fd 100644 --- a/tensorhive/app/web/dist/static/config.json +++ b/tensorhive/app/web/dist/static/config.json @@ -1 +1 @@ -{"apiPath": "http://localhost:1111/api/0.3.1", "version": "0.3", "apiVersion": "0.3.1"} +{"apiPath": "http://localhost:1111/api/0.4", "version": "0.3.3", "apiVersion": "0.4"} \ No newline at end of file diff --git a/tensorhive/main_config.ini b/tensorhive/main_config.ini index 7f1a23ef..013ca622 100644 --- a/tensorhive/main_config.ini +++ b/tensorhive/main_config.ini @@ -10,7 +10,7 @@ path = ~/.config/TensorHive/database.sqlite [api] title = TensorHive API -version = 0.3.1 +version = 0.4 url_hostname = 0.0.0.0 url_prefix = api/%(version)s spec_file = api_specification.yml From 417efeb8c19ada764a84319f4c03855ad24c200d Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Mon, 24 Aug 2020 16:37:55 +0200 Subject: [PATCH 016/175] Fix group/user serialization --- tensorhive/models/Group.py | 25 +++++++++++++++++++++---- tensorhive/models/User.py | 24 ++++++++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index 15a34986..424a2308 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -41,14 +41,31 @@ def remove_user(self, user: User): self.users.remove(user) self.save() - @property + @hybrid_property def as_dict(self): - return { + """ + Serializes current instance into dict. + :return: Dictionary representing current instance. + """ + return self._as_dict(True) + + @hybrid_property + def as_dict_shallow(self): + """ + Serializes current instance into dict. Will not include group's users (to prevent recurrence). + :return: Dictionary representing current instance (without users). + """ + return self._as_dict(False) + + def _as_dict(self, include_users): + group = { 'id': self.id, 'name': self.name, - 'createdAt': self.created_at.isoformat(), - 'users': self.users + 'createdAt': self.created_at.isoformat() } + if include_users: + group['users'] = [user.as_dict_shallow for user in self.users] + return group class User2Group(Base): # type: ignore diff --git a/tensorhive/models/User.py b/tensorhive/models/User.py index 35eb8e62..03a1d1bc 100644 --- a/tensorhive/models/User.py +++ b/tensorhive/models/User.py @@ -108,22 +108,38 @@ def find_by_username(cls, username): else: return result - @property + @hybrid_property def as_dict(self): - '''Serializes model instance into dict (which is interpreted as json automatically)''' + """ + Serializes current instance into dict. + :return: Dictionary representing current instance. + """ + return self._as_dict(True) + + @hybrid_property + def as_dict_shallow(self): + """ + Serializes current instance into dict. Will not include user's groups (to prevent recurrence). + :return: Dictionary representing current instance (without groups). + """ + return self._as_dict(False) + + def _as_dict(self, include_groups): try: roles = self.role_names except Exception: roles = [] finally: - return { + user = { 'id': self.id, 'username': self.username, 'createdAt': self.created_at.isoformat(), 'roles': roles, - 'groups': self.groups, 'email': self.email } + if include_groups: + user['groups'] = [group.as_dict_shallow for group in self.groups] + return user @staticmethod def verify_hash(password, hash): From 1731540e8b08f46f2310ee98b75f3414417fbc3e Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Mon, 24 Aug 2020 22:13:50 +0200 Subject: [PATCH 017/175] Add DateUtils, add date string parsing to the Restriction model --- tensorhive/controllers/task.py | 9 ++-- tensorhive/models/Reservation.py | 49 ++++------------- tensorhive/models/Restriction.py | 46 +++++++++++++--- tensorhive/models/Task.py | 51 ++---------------- tensorhive/utils/DateUtils.py | 60 +++++++++++++++++++++ tensorhive/utils/__init__.py | 0 tests/unit/models/test_restriction_model.py | 10 ++++ 7 files changed, 128 insertions(+), 97 deletions(-) create mode 100644 tensorhive/utils/DateUtils.py create mode 100644 tensorhive/utils/__init__.py diff --git a/tensorhive/controllers/task.py b/tensorhive/controllers/task.py index a3c5f4a9..a085d440 100644 --- a/tensorhive/controllers/task.py +++ b/tensorhive/controllers/task.py @@ -1,6 +1,7 @@ -from tensorhive.models.Task import Task, TaskStatus, try_parse_input_datetime +from tensorhive.models.Task import Task, TaskStatus from tensorhive.models.User import User from tensorhive.core import task_nursery, ssh +from tensorhive.utils.DateUtils import DateUtils from tensorhive.core.task_nursery import SpawnError, ExitCodeError from pssh.exceptions import ConnectionErrorException, AuthenticationException, UnknownHostException from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt_claims @@ -287,8 +288,8 @@ def business_create(task: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: host=task['hostname'], command=task['command'], # TODO Adjust API spec, optional fields - spawn_at=try_parse_input_datetime(task.get('spawnAt')), - terminate_at=try_parse_input_datetime(task.get('terminateAt'))) + spawn_at=DateUtils.try_parse_string(task.get('spawnAt')), + terminate_at=DateUtils.try_parse_string(task.get('terminateAt'))) # assert all(task.values()), 'fields cannot be blank or null' new_task.save() except ValueError: @@ -337,7 +338,7 @@ def business_update(id: TaskId, new_values: Dict[str, Any]) -> Tuple[Content, Ht field_name = 'host' if field_name in {'spawnAt', 'terminateAt'}: field_name = field_name.replace('At', '_at') - new_value = try_parse_input_datetime(new_value) + new_value = DateUtils.try_parse_string(new_value) else: # Check that every other field matches assert hasattr(task, field_name), 'task has no {} column'.format(field_name) diff --git a/tensorhive/models/Reservation.py b/tensorhive/models/Reservation.py index 71fc01c1..12b31d16 100644 --- a/tensorhive/models/Reservation.py +++ b/tensorhive/models/Reservation.py @@ -1,9 +1,10 @@ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, and_, not_, or_, event from tensorhive.database import db_session, Base from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.utils.DateUtils import DateUtils from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import relationship, backref -from typing import Optional, List +from typing import List import datetime import logging log = logging.getLogger(__name__) @@ -54,35 +55,14 @@ def check_assertions(self): def duration(self): return self.ends_at - self.starts_at - @classmethod - def parsed_input_datetime(cls, value: str) -> Optional[datetime.datetime]: - client_datetime_format = '%Y-%m-%dT%H:%M:%S.%fZ' - try: - result = datetime.datetime.strptime(value, client_datetime_format) - except ValueError as e: - log.error(e) - raise - else: - return result - - @classmethod - def parsed_output_datetime(cls, value: datetime.datetime) -> str: - display_datetime_format = '%Y-%m-%dT%H:%M:%S' - server_timezone = '+00:00' - return value.strftime(display_datetime_format) + server_timezone - @hybrid_property def starts_at(self): return self._starts_at @starts_at.setter # type: ignore def starts_at(self, value): - if isinstance(value, str): - self._starts_at = self.parsed_input_datetime(value) - elif isinstance(value, datetime.datetime): - self._starts_at = value - else: - self._starts_at = None + self._starts_at = DateUtils.try_parse_string(value) + if not self._starts_at: log.error('Unsupported type (starts_at={})'.format(value)) @hybrid_property @@ -91,17 +71,8 @@ def ends_at(self): @ends_at.setter # type: ignore def ends_at(self, value): - if isinstance(value, str): - try: - self._ends_at = Reservation.parsed_input_datetime(value) - except ValueError: - # Catch, but don't propagate at this moment, - # let the dev to change it to correct value later - self._ends_at = None - elif isinstance(value, datetime.datetime): - self._ends_at = value - else: - self._ends_at = None + self._ends_at = DateUtils.try_parse_string(value) + if not self._ends_at: log.error('Unsupported type (ends_at={})'.format(value)) @classmethod @@ -161,7 +132,7 @@ def __repr__(self): @property def as_dict(self): - '''Serializes model instance into dict (which is interpreted as json automatically)''' + """Serializes model instance into dict (which is interpreted as json automatically)""" return { 'id': self.id, 'title': self.title, @@ -171,7 +142,7 @@ def as_dict(self): 'userName': self.user.username, 'gpuUtilAvg': self.gpu_util_avg, 'memUtilAvg': self.mem_util_avg, - 'start': self.parsed_output_datetime(self.starts_at), - 'end': self.parsed_output_datetime(self.ends_at), - 'createdAt': self.parsed_output_datetime(self.created_at) + 'start': DateUtils.parse_datetime(self.starts_at), + 'end': DateUtils.parse_datetime(self.ends_at), + 'createdAt': DateUtils.parse_datetime(self.created_at) } diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index acaaaa42..4dd99b15 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -1,15 +1,19 @@ import datetime +import logging from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.hybrid import hybrid_property from tensorhive.database import db_session, Base +from tensorhive.utils.DateUtils import DateUtils from tensorhive.models.CRUDModel import CRUDModel from tensorhive.models.User import User from tensorhive.models.Group import Group from tensorhive.models.Resource import Resource from tensorhive.models.RestrictionSchedule import RestrictionSchedule +log = logging.getLogger(__name__) + class Restriction(CRUDModel, Base): # type: ignore """ @@ -29,9 +33,9 @@ class Restriction(CRUDModel, Base): # type: ignore id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50)) - created_at = Column(DateTime, default=datetime.datetime.utcnow) - starts_at = Column(DateTime, nullable=False) - ends_at = Column(DateTime) + _created_at = Column(DateTime, default=datetime.datetime.utcnow) + _starts_at = Column(DateTime, nullable=False) + _ends_at = Column(DateTime) is_global = Column(Boolean, nullable=False) _users = relationship('User', secondary='restriction2assignee') @@ -54,6 +58,36 @@ def check_assertions(self): assert self.ends_at > datetime.datetime.utcnow(), 'You are trying to edit restriction that has already' \ ' expired - please do not do that!' + @hybrid_property + def starts_at(self): + return self._starts_at + + @hybrid_property + def ends_at(self): + return self._ends_at + + @hybrid_property + def created_at(self): + return self._created_at + + @starts_at.setter + def starts_at(self, value: str): + self._starts_at = DateUtils.try_parse_string(value) + if not self._starts_at: + log.error('Unsupported type (starts_at={})'.format(value)) + + @ends_at.setter + def ends_at(self, value: str): + self._ends_at = DateUtils.try_parse_string(value) + if not self._ends_at: + log.error('Unsupported type (ends_at={})'.format(value)) + + @created_at.setter + def created_at(self, value: str): + self._created_at = DateUtils.try_parse_string(value) + if not self._created_at: + log.error('Unsupported type (created_at={})'.format(value)) + @hybrid_property def users(self): return self._users @@ -129,9 +163,9 @@ def as_dict(self): return { 'id': self.id, 'name': self.name, - 'created_at': self.created_at, - 'starts_at': self.starts_at, - 'ends_at': self.ends_at, + 'created_at': DateUtils.parse_datetime(self.created_at), + 'starts_at': DateUtils.parse_datetime(self.starts_at), + 'ends_at': DateUtils.parse_datetime(self.ends_at), 'is_global': self.is_global } diff --git a/tensorhive/models/Task.py b/tensorhive/models/Task.py index b6b6b7fb..98f19c98 100644 --- a/tensorhive/models/Task.py +++ b/tensorhive/models/Task.py @@ -1,46 +1,13 @@ from sqlalchemy import Column, Integer, String, ForeignKey, Enum, DateTime -from datetime import datetime from tensorhive.database import Base from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.hybrid import hybrid_property from tensorhive.models.CRUDModel import CRUDModel -from typing import Optional, Union +from tensorhive.utils.DateUtils import DateUtils import enum import logging log = logging.getLogger(__name__) -# FIXME Move to utils -def parsed_input_datetime(value: str) -> datetime: - """Tries to parse string into datetime. - - Re-raises ValueError on failure - """ - client_datetime_format = '%Y-%m-%dT%H:%M:%S.%fZ' - try: - result = datetime.strptime(value, client_datetime_format) - except ValueError: - log.warning('Could not parse input into datetime') - raise - else: - return result - - -# FIXME Move to utils -def try_parse_input_datetime(value: Union[str, datetime, None]) -> Optional[datetime]: - """Allows for string to datetime conversion given in API request. - If new value is of `datetime` type then it just returns original value as it is. - - Re-rasies ValueError - """ - if isinstance(value, str): - return parsed_input_datetime(value) - elif isinstance(value, datetime): - return value - else: - return None - - class TaskStatus(enum.Enum): not_running = 1 running = 2 @@ -76,18 +43,6 @@ def __repr__(self): def check_assertions(self): pass - # FIXME Code copied from `Reservation.py` and adapted to Optional[datetime] use case (refactor in both places) - @classmethod - def try_parse_output_datetime(cls, value: Optional[datetime]) -> Optional[str]: - """Parses datetime object taking timezone postfix into consideration. - Note that `spawn_at`, `terminate_at` are nullable fields, hence None can be returned. - """ - if not value: - return None - display_datetime_format = '%Y-%m-%dT%H:%M:%S' - server_timezone = '+00:00' - return value.strftime(display_datetime_format) + server_timezone - @property def as_dict(self): return { @@ -97,6 +52,6 @@ def as_dict(self): 'pid': self.pid, 'status': self.status.name, 'command': self.command, - 'spawnAt': self.try_parse_output_datetime(self.spawn_at), - 'terminateAt': self.try_parse_output_datetime(self.terminate_at) + 'spawnAt': DateUtils.parse_datetime(self.spawn_at), + 'terminateAt': DateUtils.parse_datetime(self.terminate_at) } diff --git a/tensorhive/utils/DateUtils.py b/tensorhive/utils/DateUtils.py new file mode 100644 index 00000000..08f04607 --- /dev/null +++ b/tensorhive/utils/DateUtils.py @@ -0,0 +1,60 @@ +from datetime import datetime +from typing import Optional, Union +import logging + +log = logging.getLogger(__name__) + + +class DateUtils: + input_date_format = '%Y-%m-%dT%H:%M:%S.%fZ' + output_date_format = '%Y-%m-%dT%H:%M:%S' + server_timezone = '+00:00' + + @classmethod + def parse_string(cls, value: str) -> datetime: + """ + Parses string representing datetime into datetime. On failure throws ValueError. + :param value: string representing date + :return: datetime instance + """ + try: + result = datetime.strptime(value, cls.input_date_format) + except ValueError: + log.warning('Could not parse string into datetime') + raise + else: + return result + + @classmethod + def parse_datetime(cls, value: datetime) -> str: + """ + Parses datetime object into string. + :param value: datetime object representing certain date + :return: string with date that was represented by the datetime object + """ + return value.strftime(cls.output_date_format) + cls.server_timezone + + @classmethod + def try_parse_string(cls, value: Union[str, datetime, None]) -> Optional[datetime]: + """ + Parses string representing datetime into datetime gracefully. + :param value: Either str, datetime or None. Parsing will only happen if given str. Otherwise, the original + value is returned. + :return: datetime instance or None, if invalid input value was given. + """ + if isinstance(value, str): + return cls.parse_string(value) + if isinstance(value, datetime): + return value + return None + + @classmethod + def try_parse_datetime(cls, value: Optional[datetime]) -> Optional[str]: + """ + Parses datetime object into string gracefully. + :param value: datetime object representing certain date or None. + :return: string with date that was represented by the datetime object or None if input value was None. + """ + if not value: + return None + return cls.parse_datetime(value) diff --git a/tensorhive/utils/__init__.py b/tensorhive/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index d26ae3ae..21039267 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -110,3 +110,13 @@ def test_restriction_with_schedules_is_active_only_when_at_least_one_of_its_sche print(active_schedule.is_active) restriction.add_schedule(active_schedule) assert restriction.is_active is True + + +def test_restriction_with_dates_passed_as_string_gets_added_successfully(tables): + new_restriction = Restriction( + name='TestRestriction', + is_global=False + ) + new_restriction.starts_at = '2020-09-29T18:07:44.191Z' + new_restriction.ends_at = '2020-09-30T18:07:44.191Z' + new_restriction.save() From ee481f52722e854046df754cee05576eaef92847 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Tue, 25 Aug 2020 06:56:26 +0200 Subject: [PATCH 018/175] Change parse_datetime to try_parse_datetime --- tensorhive/models/Task.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorhive/models/Task.py b/tensorhive/models/Task.py index 98f19c98..34e4810e 100644 --- a/tensorhive/models/Task.py +++ b/tensorhive/models/Task.py @@ -52,6 +52,6 @@ def as_dict(self): 'pid': self.pid, 'status': self.status.name, 'command': self.command, - 'spawnAt': DateUtils.parse_datetime(self.spawn_at), - 'terminateAt': DateUtils.parse_datetime(self.terminate_at) + 'spawnAt': DateUtils.try_parse_datetime(self.spawn_at), + 'terminateAt': DateUtils.try_parse_datetime(self.terminate_at) } From 6d335ef6b1ade66d09e01d04b38c9be7bf24e5a6 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Tue, 25 Aug 2020 16:16:13 +0200 Subject: [PATCH 019/175] Add graceful handling of incorrect operations in Group and Restriction models --- .../exceptions/InvalidRequestException.py | 6 ++ tensorhive/exceptions/__init__.py | 0 tensorhive/models/Group.py | 8 ++ tensorhive/models/Restriction.py | 29 +++++++- tests/unit/models/test_group_model.py | 17 +++++ tests/unit/models/test_restriction_model.py | 73 +++++++++++++++++++ 6 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 tensorhive/exceptions/InvalidRequestException.py create mode 100644 tensorhive/exceptions/__init__.py diff --git a/tensorhive/exceptions/InvalidRequestException.py b/tensorhive/exceptions/InvalidRequestException.py new file mode 100644 index 00000000..e121da93 --- /dev/null +++ b/tensorhive/exceptions/InvalidRequestException.py @@ -0,0 +1,6 @@ +class InvalidRequestException(Exception): + """Exception thrown by DB models when requested operation would be impossible/incorrect""" + + def __init__(self, message='The request was invalid'): + super().__init__(message) + self.message = message diff --git a/tensorhive/exceptions/__init__.py b/tensorhive/exceptions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index 424a2308..a4f409d7 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.hybrid import hybrid_property from tensorhive.database import Base +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.models.CRUDModel import CRUDModel from tensorhive.models.User import User from tensorhive.models.RestrictionAssignee import RestrictionAssignee @@ -34,10 +35,17 @@ def users(self): return self._users def add_user(self, user: User): + if user in self.users: + raise InvalidRequestException('User {user} is already a member of group {group}!' + .format(user=user, group=self)) self.users.append(user) self.save() def remove_user(self, user: User): + if user not in self.users: + raise InvalidRequestException('User {user} is not a member of group {group}!' + .format(user=user, group=self)) + self.users.remove(user) self.save() diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 4dd99b15..29b7b1d7 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.hybrid import hybrid_property from tensorhive.database import db_session, Base +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.utils.DateUtils import DateUtils from tensorhive.models.CRUDModel import CRUDModel from tensorhive.models.User import User @@ -79,8 +80,6 @@ def starts_at(self, value: str): @ends_at.setter def ends_at(self, value: str): self._ends_at = DateUtils.try_parse_string(value) - if not self._ends_at: - log.error('Unsupported type (ends_at={})'.format(value)) @created_at.setter def created_at(self, value: str): @@ -105,34 +104,58 @@ def schedules(self): return self._schedules def apply_to_user(self, user: User): + if user in self.users: + raise InvalidRequestException('Restriction {restriction} is already being applied to user {user}' + .format(restriction=self, user=user)) self.users.append(user) self.save() def remove_from_user(self, user: User): + if user not in self.users: + raise InvalidRequestException('User {user} is not affected by restriction {restriction}' + .format(user=user, restriction=self)) self.users.remove(user) self.save() def apply_to_group(self, group: Group): + if group in self.groups: + raise InvalidRequestException('Restriction {restriction} is already being applied to group {group}' + .format(restriction=self, group=group)) self.groups.append(group) self.save() def remove_from_group(self, group: Group): + if group not in self.groups: + raise InvalidRequestException('Group {group} is not affected by restriction {restriction}' + .format(group=group, restriction=self)) self.groups.remove(group) self.save() def apply_to_resource(self, resource: Resource): + if resource in self.resources: + raise InvalidRequestException('Restriction {restriction} is already being applied to resource {resource}' + .format(restriction=self, resource=resource)) self.resources.append(resource) self.save() def remove_from_resource(self, resource: Resource): + if resource not in self.resources: + raise InvalidRequestException('Resource {resource} is not affected by restriction {restriction}' + .format(resource=resource, restriction=self)) self.resources.remove(resource) self.save() def add_schedule(self, schedule: RestrictionSchedule): + if schedule in self.schedules: + raise InvalidRequestException('Schedule {schedule} is already being applied to restriction {restriction}' + .format(schedule=schedule, restriction=self)) self.schedules.append(schedule) self.save() def remove_schedule(self, schedule: RestrictionSchedule): + if schedule not in self.schedules: + raise InvalidRequestException('Schedule {schedule} is not assigned to restriction {restriction}' + .format(schedule=schedule, restriction=self)) self.schedules.remove(schedule) self.save() @@ -165,7 +188,7 @@ def as_dict(self): 'name': self.name, 'created_at': DateUtils.parse_datetime(self.created_at), 'starts_at': DateUtils.parse_datetime(self.starts_at), - 'ends_at': DateUtils.parse_datetime(self.ends_at), + 'ends_at': DateUtils.try_parse_datetime(self.ends_at), 'is_global': self.is_global } diff --git a/tests/unit/models/test_group_model.py b/tests/unit/models/test_group_model.py index c5731e15..1c1dd3ac 100644 --- a/tests/unit/models/test_group_model.py +++ b/tests/unit/models/test_group_model.py @@ -1,4 +1,6 @@ +import pytest from tensorhive.models.Group import Group +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException def test_group_creation(tables): @@ -20,3 +22,18 @@ def test_removing_user_from_a_group(tables, new_group_with_member): assert user not in new_group_with_member.users assert new_group_with_member not in user.groups + + +def test_removing_user_from_a_group_that_he_doesnt_belong_to_fails(tables, new_user, new_group): + new_group.save() + new_user.save() + + with pytest.raises(InvalidRequestException): + new_group.remove_user(new_user) + + +def test_adding_user_to_a_group_that_he_is_already_in_fails(tables, new_group_with_member): + user = new_group_with_member.users[0] + + with pytest.raises(InvalidRequestException): + new_group_with_member.add_user(user) diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 21039267..3cfa66b9 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta from tensorhive.models.Restriction import Restriction +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException def test_restriction_creation(tables): @@ -120,3 +121,75 @@ def test_restriction_with_dates_passed_as_string_gets_added_successfully(tables) new_restriction.starts_at = '2020-09-29T18:07:44.191Z' new_restriction.ends_at = '2020-09-30T18:07:44.191Z' new_restriction.save() + + +def test_when_trying_to_apply_restriction_to_the_same_group_twice_an_exception_is_thrown(tables, restriction, + new_group): + new_group.save() + restriction.apply_to_group(new_group) + + with pytest.raises(InvalidRequestException): + restriction.apply_to_group(new_group) + + +def test_when_trying_to_apply_restriction_to_the_same_user_twice_an_exception_is_thrown(tables, restriction, + new_user): + new_user.save() + restriction.apply_to_user(new_user) + + with pytest.raises(InvalidRequestException): + restriction.apply_to_user(new_user) + + +def test_when_trying_to_add_an_already_assigned_schedule_to_restriction_an_exception_is_thrown(tables, restriction, + inactive_schedule): + inactive_schedule.save() + restriction.add_schedule(inactive_schedule) + + with pytest.raises(InvalidRequestException): + restriction.add_schedule(inactive_schedule) + + +def test_when_trying_to_add_an_already_assigned_resource_to_restriction_an_exception_is_thrown(tables, restriction, + resource1): + resource1.save() + restriction.apply_to_resource(resource1) + + with pytest.raises(InvalidRequestException): + restriction.apply_to_resource(resource1) + + +def test_when_trying_to_remove_restriction_from_group_that_wasnt_assigned_to_it_an_exception_is_thrown(tables, + restriction, + new_group): + new_group.save() + + with pytest.raises(InvalidRequestException): + restriction.remove_from_group(new_group) + + +def test_when_trying_to_remove_restriction_from_user_that_wasnt_assigned_to_it_an_exception_is_thrown(tables, + restriction, + new_user): + new_user.save() + + with pytest.raises(InvalidRequestException): + restriction.remove_from_user(new_user) + + +def test_when_trying_to_remove_schedule_that_wasnt_assigned_to_restriction_an_exception_is_thrown(tables, + restriction, + inactive_schedule): + inactive_schedule.save() + + with pytest.raises(InvalidRequestException): + restriction.remove_schedule(inactive_schedule) + + +def test_when_trying_to_remove_restriction_from_resource_that_wasnt_assigned_to_it_an_exception_is_thrown(tables, + restriction, + resource1): + resource1.save() + + with pytest.raises(InvalidRequestException): + restriction.remove_from_resource(resource1) \ No newline at end of file From 8ef0ec776c0f81d25a14e1ba33cd7a3223be9db0 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Tue, 25 Aug 2020 16:20:07 +0200 Subject: [PATCH 020/175] Add missing newline --- tests/unit/models/test_restriction_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 3cfa66b9..1ebaf33f 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -192,4 +192,4 @@ def test_when_trying_to_remove_restriction_from_resource_that_wasnt_assigned_to_ resource1.save() with pytest.raises(InvalidRequestException): - restriction.remove_from_resource(resource1) \ No newline at end of file + restriction.remove_from_resource(resource1) From 68dc3d1d4b46f685abd9b6ecef11415050cfc233 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Wed, 26 Aug 2020 12:30:27 +0200 Subject: [PATCH 021/175] Fox RestrictionSchedule as_dict method --- tensorhive/models/RestrictionSchedule.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index 97d38f7c..eebdb247 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -65,9 +65,9 @@ def is_valid_schedule_expression(schedule_expression): def as_dict(self): return { 'id': self.id, - 'schedule_days': self.schedule_days, - 'hour_start': self.hour_start, - 'hour_end': self.hour_end + 'scheduleDays': self.schedule_days, + 'hourStart': self.hour_start.strftime('%H:%M'), + 'hourEnd': self.hour_end.strftime('%H:%M') } From 09b592bafa2dfd3963b2a08d8244ed12efaf629f Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Wed, 26 Aug 2020 13:28:14 +0200 Subject: [PATCH 022/175] Add Weekday enum for possibility of specyfing restriction schedules more intuitively --- tensorhive/models/Restriction.py | 21 ++++++++---- tensorhive/models/RestrictionSchedule.py | 33 +++++++++++++++++-- tensorhive/utils/Weekday.py | 12 +++++++ .../models/test_restrictionschedule_model.py | 9 +++++ 4 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 tensorhive/utils/Weekday.py diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 29b7b1d7..13478724 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -181,16 +181,23 @@ def is_expired(self): now = datetime.datetime.utcnow() return self.ends_at is not None and self.ends_at <= now - @property - def as_dict(self): - return { + def as_dict(self, include_groups=False, include_users=False, include_resources=False): + restriction = { 'id': self.id, 'name': self.name, - 'created_at': DateUtils.parse_datetime(self.created_at), - 'starts_at': DateUtils.parse_datetime(self.starts_at), - 'ends_at': DateUtils.try_parse_datetime(self.ends_at), - 'is_global': self.is_global + 'createdAt': DateUtils.parse_datetime(self.created_at), + 'startsAt': DateUtils.parse_datetime(self.starts_at), + 'endsAt': DateUtils.try_parse_datetime(self.ends_at), + 'isGlobal': self.is_global, + 'schedules': self.schedules } + if include_groups: + restriction['groups'] = self.groups + if include_users: + restriction['users'] = self.users + if include_resources: + restriction['resources'] = self.resources + return restriction class Restriction2Assignee(Base): # type: ignore diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index eebdb247..66e21d0e 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -1,11 +1,16 @@ import re import datetime +import logging from sqlalchemy import Column, Integer, String, Time, ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.hybrid import hybrid_property from tensorhive.database import Base from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.utils.Weekday import Weekday +from typing import List, Union + +log = logging.getLogger(__name__) class RestrictionSchedule(CRUDModel, Base): # type: ignore @@ -25,12 +30,17 @@ class RestrictionSchedule(CRUDModel, Base): # type: ignore __table_args__ = {'sqlite_autoincrement': True} id = Column(Integer, primary_key=True, autoincrement=True) - schedule_days = Column(String(7), nullable=False) + _schedule_days = Column(String(7), nullable=False) hour_start = Column(Time(), nullable=False) hour_end = Column(Time(), nullable=False) _restrictions = relationship('Restriction', secondary='restriction2schedule') + def __init__(self, schedule_days: Union[List[Weekday], str], hour_start: datetime.time, hour_end: datetime.time): + self.schedule_days = schedule_days + self.hour_start = hour_start + self.hour_end = hour_end + def __repr__(self): return ''' self.hour_start, 'End hour cannot happen before start hour!' + @hybrid_property + def schedule_days(self): + return self._schedule_days + @hybrid_property def restrictions(self): return self._restrictions + @schedule_days.setter + def schedule_days(self, days: Union[List[Weekday], str]): + if isinstance(days, str): + self._schedule_days = (''.join(sorted(days))) + else: + self._schedule_days = self.parse_schedule_list(days) + @property def is_active(self): today = str(datetime.datetime.utcnow().date().weekday() + 1) # weekday uses 0-6 for day numbering, we use 1-7 @@ -65,11 +86,19 @@ def is_valid_schedule_expression(schedule_expression): def as_dict(self): return { 'id': self.id, - 'scheduleDays': self.schedule_days, + 'scheduleDays': self.parse_schedule_string(self.schedule_days), 'hourStart': self.hour_start.strftime('%H:%M'), 'hourEnd': self.hour_end.strftime('%H:%M') } + @staticmethod + def parse_schedule_string(schedule: str) -> List[Weekday]: + return [Weekday(int(day)) for day in sorted(schedule)] + + @staticmethod + def parse_schedule_list(schedule: List[Weekday]) -> str: + return ''.join((sorted(''.join([str(day.value) for day in schedule])))) + class Restriction2Schedule(Base): # type: ignore __tablename__ = 'restriction2schedule' diff --git a/tensorhive/utils/Weekday.py b/tensorhive/utils/Weekday.py new file mode 100644 index 00000000..7ab7177d --- /dev/null +++ b/tensorhive/utils/Weekday.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class Weekday(Enum): + """Helper enum used mainly in RestrictionSchedule class to provide more legible way of specifying schedules""" + Monday = 1 + Tuesday = 2 + Wednesday = 3 + Thursday = 4 + Friday = 5 + Saturday = 6 + Sunday = 7 diff --git a/tests/unit/models/test_restrictionschedule_model.py b/tests/unit/models/test_restrictionschedule_model.py index 856de833..c44bf604 100644 --- a/tests/unit/models/test_restrictionschedule_model.py +++ b/tests/unit/models/test_restrictionschedule_model.py @@ -2,6 +2,7 @@ import datetime from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.utils.Weekday import Weekday def test_schedule_creation(tables): @@ -49,3 +50,11 @@ def test_schedule_is_active_method_returns_valid_status(tables, restriction): assert active_schedule.is_active is True assert inactive_schedule.is_active is False + + +def test_schedule_with_schedule_days_as_list_of_enums_gets_saved_successfully(tables): + schedule_expression = [Weekday.Monday, Weekday.Tuesday] + starts_at = datetime.time(8, 0, 0) + ends_at = datetime.time(15, 0, 0) + schedule = RestrictionSchedule(schedule_days=schedule_expression, hour_start=starts_at, hour_end=ends_at) + schedule.save() From f1ed3a2c3b81eed5fa87ff0e94feafcf55e9ae20 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Wed, 26 Aug 2020 22:08:04 +0200 Subject: [PATCH 023/175] Return scheduleDays in as_dict as a list of strings rather than enums --- tensorhive/models/RestrictionSchedule.py | 2 +- tensorhive/utils/Weekday.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index 66e21d0e..bd9d6386 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -86,7 +86,7 @@ def is_valid_schedule_expression(schedule_expression): def as_dict(self): return { 'id': self.id, - 'scheduleDays': self.parse_schedule_string(self.schedule_days), + 'scheduleDays': [day.to_str() for day in self.parse_schedule_string(self.schedule_days)], 'hourStart': self.hour_start.strftime('%H:%M'), 'hourEnd': self.hour_end.strftime('%H:%M') } diff --git a/tensorhive/utils/Weekday.py b/tensorhive/utils/Weekday.py index 7ab7177d..17eb7580 100644 --- a/tensorhive/utils/Weekday.py +++ b/tensorhive/utils/Weekday.py @@ -10,3 +10,6 @@ class Weekday(Enum): Friday = 5 Saturday = 6 Sunday = 7 + + def to_str(self): + return ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'][self.value - 1] From 2e6a33e790b5e18a732e30a545116601e4033107 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Thu, 27 Aug 2020 18:51:35 +0200 Subject: [PATCH 024/175] Fix Restriction as_dict method --- tensorhive/models/Restriction.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 13478724..06dc7aa5 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -189,14 +189,16 @@ def as_dict(self, include_groups=False, include_users=False, include_resources=F 'startsAt': DateUtils.parse_datetime(self.starts_at), 'endsAt': DateUtils.try_parse_datetime(self.ends_at), 'isGlobal': self.is_global, - 'schedules': self.schedules + 'schedules': [schedule.as_dict for schedule in self.schedules] } if include_groups: - restriction['groups'] = self.groups + restriction['groups'] = [group.as_dict for group in self.groups] if include_users: - restriction['users'] = self.users + # using as_dict_shallow as we do not want to include user's groups here, as they are insignificant + # considering the scope of the restriction + restriction['users'] = [user.as_dict_shallow for user in self.users] if include_resources: - restriction['resources'] = self.resources + restriction['resources'] = [resource.as_dict for resource in self.resources] return restriction From 881dc5e59e598852f37976ac6573d3119bbb2e08 Mon Sep 17 00:00:00 2001 From: mateusz Date: Fri, 28 Aug 2020 00:36:03 +0200 Subject: [PATCH 025/175] Add controllers to manage new classes created for access control + API specification --- tensorhive/api/api_specification.yml | 1611 ++++++++++++++++- tensorhive/controllers/group/__init__.py | 0 .../group/add_to_group_controller.py | 37 + .../group/create_group_controller.py | 28 + .../group/delete_group_controller.py | 23 + .../controllers/group/get_group_controller.py | 31 + .../group/remove_from_group_controller.py | 37 + .../group/update_group_controller.py | 33 + .../controllers/nodes/cpu_controller.py | 4 +- .../controllers/nodes/gpu_controller.py | 8 +- .../nodes/infrastructure_controller.py | 29 +- .../reservation/get_reservation_controller.py | 6 +- .../update_reservation_controller.py | 8 +- .../resource/get_resource_controller.py | 34 + tensorhive/controllers/responses.yml | 132 +- .../controllers/restriction/__init__.py | 0 .../add_to_restriction_controller.py | 129 ++ .../create_restriction_controller.py | 32 + .../delete_restriction_controller.py | 23 + .../restriction/get_restriction_controller.py | 72 + .../restriction/remove_from_restriction.py | 129 ++ .../update_restriction_controller.py | 41 + tensorhive/controllers/schedule/__init__.py | 0 .../schedule/create_schedule_controller.py | 40 + .../schedule/delete_schedule_controller.py | 23 + .../schedule/get_schedule_controller.py | 31 + .../schedule/update_schedule_controller.py | 49 + .../user/update_user_controller.py | 1 - 28 files changed, 2493 insertions(+), 98 deletions(-) create mode 100644 tensorhive/controllers/group/__init__.py create mode 100644 tensorhive/controllers/group/add_to_group_controller.py create mode 100644 tensorhive/controllers/group/create_group_controller.py create mode 100644 tensorhive/controllers/group/delete_group_controller.py create mode 100644 tensorhive/controllers/group/get_group_controller.py create mode 100644 tensorhive/controllers/group/remove_from_group_controller.py create mode 100644 tensorhive/controllers/group/update_group_controller.py create mode 100644 tensorhive/controllers/resource/get_resource_controller.py create mode 100644 tensorhive/controllers/restriction/__init__.py create mode 100644 tensorhive/controllers/restriction/add_to_restriction_controller.py create mode 100644 tensorhive/controllers/restriction/create_restriction_controller.py create mode 100644 tensorhive/controllers/restriction/delete_restriction_controller.py create mode 100644 tensorhive/controllers/restriction/get_restriction_controller.py create mode 100644 tensorhive/controllers/restriction/remove_from_restriction.py create mode 100644 tensorhive/controllers/restriction/update_restriction_controller.py create mode 100644 tensorhive/controllers/schedule/__init__.py create mode 100644 tensorhive/controllers/schedule/create_schedule_controller.py create mode 100644 tensorhive/controllers/schedule/delete_schedule_controller.py create mode 100644 tensorhive/controllers/schedule/get_schedule_controller.py create mode 100644 tensorhive/controllers/schedule/update_schedule_controller.py diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 85e929c7..b695a1e8 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -16,7 +16,7 @@ paths: operationId: tensorhive.controllers.user.get_users_controller.get responses: 200: - description: {{RESPONSES['users']['get']['success']}} + description: {{RESPONSES['general']['success']}} content: application/json: schema: @@ -43,7 +43,7 @@ paths: get: tags: - users - summary: Get users with given ID + summary: Get user with given ID operationId: tensorhive.controllers.user.get_users_controller.get_by_id parameters: - description: User ID @@ -54,7 +54,7 @@ paths: type: integer responses: 200: - description: {{RESPONSES['users']['get']['success']}} + description: {{RESPONSES['general']['success']}} content: application/json: schema: @@ -341,7 +341,7 @@ paths: tags: - authentication summary: Login user - operationId: 'tensorhive.controllers.user.login_user_controller.login' + operationId: tensorhive.controllers.user.login_user_controller.login requestBody: description: User object required: true @@ -375,7 +375,7 @@ paths: tags: - authentication summary: Get TensorHive public SSH key record for authorized_keys - operationId: 'tensorhive.controllers.user.create_user_controller.authorized_keys_entry' + operationId: tensorhive.controllers.user.create_user_controller.authorized_keys_entry responses: 200: description: {{RESPONSES['user']['authorized_keys_entry']['success']}} @@ -385,6 +385,1191 @@ paths: example: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWuvmEw9RWI0WMv9aseFadgDXZbHW7KjQt6H7keoQ13y/XQX0+vosmEq70DQ9HCxmwvrSruR63DLe8eW5k80OBeAcHZ+e6f6g/017tCKfYTibCEboB7v7TgGO74kWcihZK5jPHg/jxwKktxDdbCfqvl6hrR5hwE2sJ5gVAx6UPJNVoZYRD2rAPhjKJ1NlENhCWrxrt72c/a6Qe9aRSvJ/Yxn+PWr5BbxyFFKEcmos9bUwh7NgdmsZphVrKeGnx9Nl1q46/PLBW2V4FbBpsv6OD6FksIdZF0irFNmfq1LGHDLlRwVrEXrTdQST2FqyNZJSXRxblEchzYijLA1J03xir tensorhive@ai' 500: description: {{RESPONSES['general']['internal_error']}} + /groups: + get: + tags: + - groups + summary: Get all groups + operationId: tensorhive.controllers.group.get_group_controller.get + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Group' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + security: + - Bearer: [] + post: + tags: + - groups + summary: Create new group + operationId: tensorhive.controllers.group.create_group_controller.create + requestBody: + description: Group object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupForm' + x-body-name: group + responses: + 201: + description: {{RESPONSES['group']['create']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['create']['success']}} + group: + $ref: '#/components/schemas/Group' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['create']['failure']['invalid']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /groups/{id}: + get: + tags: + - groups + summary: Get group with given ID + operationId: tensorhive.controllers.group.get_group_controller.get_by_id + parameters: + - description: Group ID + in: path + name: id + required: true + schema: + type: integer + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['get']['success']}} + group: + $ref: '#/components/schemas/Group' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 404: + description: {{RESPONSES['group']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + put: + tags: + - groups + summary: Update existing group + operationId: tensorhive.controllers.group.update_group_controller.update + requestBody: + description: Group object with fields to overwrite. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupUpdateForm' + x-body-name: newValues + parameters: + - description: Group ID + in: path + name: id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['group']['update']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['update']['success']}} + group: + $ref: '#/components/schemas/Group' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['group']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['update']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - groups + summary: Delete group + operationId: tensorhive.controllers.group.delete_group_controller.delete + parameters: + - description: Group ID + in: path + name: id + required: true + schema: + type: integer + responses: + 200: + description: {{RESPONSES['group']['delete']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['group']['delete']['success']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['group']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /groups/{group_id}/users/{user_id}: + put: + tags: + - groups + summary: Add user to group + operationId: tensorhive.controllers.group.add_to_group_controller.add_user + parameters: + - description: Group ID + in: path + name: group_id + required: true + schema: + type: integer + - description: User ID + in: path + name: user_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['group']['users']['add']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['users']['add']['success']}} + group: + $ref: '#/components/schemas/Group' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['group']['not_found']}} or {{RESPONSES['user']['not_found']}} + 409: + description: {{RESPONSES['group']['users']['add']['failure']['duplicate']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['users']['add']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - groups + summary: Remove user from group + operationId: tensorhive.controllers.group.remove_from_group_controller.remove_user + parameters: + - description: Group ID + in: path + name: group_id + required: true + schema: + type: integer + - description: User ID + in: path + name: user_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['group']['users']['remove']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['users']['remove']['success']}} + group: + $ref: '#/components/schemas/Group' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['group']['not_found']}} or {{RESPONSES['user']['not_found']}} or {{RESPONSES['group']['users']['remove']['failure']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['users']['remove']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions: + get: + tags: + - restrictions + summary: Get all or specific restrictions + operationId: tensorhive.controllers.restriction.get_restriction_controller.get + parameters: + - description: User id + in: query + name: user_id + required: false + schema: + type: integer + nullable: true + default: null + - description: If user id is given include restrictions applied to groups of which user is member + in: query + name: include_user_groups + required: false + schema: + type: boolean + nullable: true + default: null + - description: Group id + in: query + name: group_id + required: false + schema: + type: integer + nullable: true + default: null + - description: Resource id + in: query + name: resource_id + required: false + schema: + type: string + nullable: true + default: null + - description: Schedule id + in: query + name: schedule_id + required: false + schema: + type: integer + nullable: true + default: null + responses: + 200: + description: {{RESPONSES['general']['ok']}} + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}}. + 401: + description: {{RESPONSES['general']['unauthorized']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + post: + tags: + - restrictions + summary: Create new restriction + operationId: tensorhive.controllers.restriction.create_restriction_controller.create + requestBody: + description: Restriction object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RestrictionForm' + x-body-name: restriction + responses: + 201: + description: {{RESPONSES['restriction']['create']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['create']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['create']['failure']['invalid']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions/{id}: + put: + tags: + - restrictions + summary: Update existing restriction + operationId: tensorhive.controllers.restriction.update_restriction_controller.update + requestBody: + description: Restriction object with fields to overwrite. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RestrictionUpdateForm' + x-body-name: newValues + parameters: + - description: Restriction ID + in: path + name: id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['update']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['update']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['update']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - restrictions + summary: Delete restriction + operationId: tensorhive.controllers.restriction.delete_restriction_controller.delete + parameters: + - description: Restriction ID + in: path + name: id + required: true + schema: + type: integer + responses: + 200: + description: {{RESPONSES['restriction']['delete']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['restriction']['delete']['success']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions/{restriction_id}/users/{user_id}: + put: + tags: + - restrictions + summary: Apply restriction to user + operationId: tensorhive.controllers.restriction.add_to_restriction_controller.apply_to_user + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: User ID + in: path + name: user_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['users']['apply']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['users']['apply']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['user']['not_found']}} + 409: + description: {{RESPONSES['restriction']['users']['apply']['failure']['duplicate']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['users']['apply']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - restrictions + summary: Remove restriction from user + operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_from_user + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: User ID + in: path + name: user_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['users']['remove']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['users']['remove']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['user']['not_found']}} or {{RESPONSES['restriction']['users']['remove']['failure']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['users']['remove']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions/{restriction_id}/groups/{group_id}: + put: + tags: + - restrictions + summary: Apply restriction to group + operationId: tensorhive.controllers.restriction.add_to_restriction_controller.apply_to_group + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Group ID + in: path + name: group_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['groups']['apply']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['groups']['apply']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['group']['not_found']}} + 409: + description: {{RESPONSES['restriction']['groups']['apply']['failure']['duplicate']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['groups']['apply']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - restrictions + summary: Remove restriction from group + operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_from_group + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Group ID + in: path + name: group_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['groups']['remove']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['groups']['remove']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['group']['not_found']}} or {{RESPONSES['restriction']['groups']['remove']['failure']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['groups']['remove']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions/{restriction_id}/resources/{resource_uuid}: + put: + tags: + - restrictions + summary: Apply restriction to resource + operationId: tensorhive.controllers.restriction.add_to_restriction_controller.apply_to_resource + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Resource UUID + in: path + name: resource_uuid + required: true + schema: + type: string + responses: + 201: + description: {{RESPONSES['restriction']['resources']['apply']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['resources']['apply']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} + 409: + description: {{RESPONSES['restriction']['resources']['apply']['failure']['duplicate']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['resources']['apply']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - restrictions + summary: Remove restriction from resource + operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_from_resource + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Resource UUID + in: path + name: resource_uuid + required: true + schema: + type: string + responses: + 201: + description: {{RESPONSES['restriction']['resources']['remove']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['resources']['remove']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions/{restriction_id}/schedules/{schedule_id}: + put: + tags: + - restrictions + summary: Add schedule to restriction + operationId: tensorhive.controllers.restriction.add_to_restriction_controller.add_schedule + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Schedule ID + in: path + name: schedule_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['schedules']['add']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['schedules']['add']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['schedule']['not_found']}} + 409: + description: {{RESPONSES['restriction']['schedules']['add']['failure']['duplicate']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['schedules']['add']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - restrictions + summary: Remove schedule from restriction + operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_schedule + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Schedule ID + in: path + name: schedule_id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['restriction']['schedules']['remove']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['schedules']['remove']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['schedule']['not_found']}} or {{RESPONSES['restriction']['schedules']['remove']['failure']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['schedules']['remove']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /schedules: + get: + tags: + - schedules + summary: Get all schedules + operationId: tensorhive.controllers.schedule.get_schedule_controller.get + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Schedule' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + security: + - Bearer: [] + post: + tags: + - schedules + summary: Create new restriction schedule + operationId: tensorhive.controllers.schedule.create_schedule_controller.create + requestBody: + description: Schedule object + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ScheduleForm' + x-body-name: schedule + responses: + 201: + description: {{RESPONSES['schedule']['create']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['schedule']['create']['success']}} + schedule: + $ref: '#/components/schemas/Schedule' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['schedule']['create']['failure']['invalid']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /schedules/{id}: + get: + tags: + - schedules + summary: Get schedule with given ID + operationId: tensorhive.controllers.schedule.get_schedule_controller.get_by_id + parameters: + - description: Schedule ID + in: path + name: id + required: true + schema: + type: integer + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['schedule']['get']['success']}} + schedule: + $ref: '#/components/schemas/Schedule' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 404: + description: {{RESPONSES['schedule']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['schedule']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + put: + tags: + - schedules + summary: Update existing schedule + operationId: tensorhive.controllers.schedule.update_schedule_controller.update + requestBody: + description: Schedule object with fields to overwrite. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ScheduleUpdateForm' + x-body-name: newValues + parameters: + - description: Schedule ID + in: path + name: id + required: true + schema: + type: integer + responses: + 201: + description: {{RESPONSES['schedule']['update']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['schedule']['update']['success']}} + schedule: + $ref: '#/components/schemas/Schedule' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['schedule']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['schedule']['update']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + delete: + tags: + - schedules + summary: Delete schedule + operationId: tensorhive.controllers.schedule.delete_schedule_controller.delete + parameters: + - description: Schedule ID + in: path + name: id + required: true + schema: + type: integer + responses: + 200: + description: {{RESPONSES['schedule']['delete']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['schedule']['delete']['success']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 404: + description: {{RESPONSES['schedule']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] /reservations: get: tags: @@ -425,6 +1610,8 @@ paths: $ref: '#/components/schemas/Reservation' 400: description: {{RESPONSES['general']['bad_request']}}. Specify all parameters or none. + 401: + description: {{RESPONSES['general']['unauthorized']}} 422: description: {{RESPONSES['general']['auth_error']}} 500: @@ -543,6 +1730,81 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] + /resources: + get: + tags: + - resources + summary: Get all resources + operationId: tensorhive.controllers.resource.get_resource_controller.get + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Resource' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unpriviliged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unpriviliged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + security: + - Bearer: [] + /resource/{uuid}: + get: + tags: + - resources + summary: Get resource with given UUID + operationId: tensorhive.controllers.resource.get_resource_controller.get_by_id + parameters: + - description: Resource UUID + in: path + name: uuid + required: true + schema: + type: string + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['resource']['get']['success']}} + resource: + $ref: '#/components/schemas/Resource' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 404: + description: {{RESPONSES['resource']['not_found']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['resource']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] /nodes/hostnames: get: tags: @@ -685,9 +1947,9 @@ paths: get: tags: - tasks - operationId: tensorhive.controllers.task.get_all summary: Query tasks description: Fetches either all or only those owned by the user. + operationId: tensorhive.controllers.task.get_all parameters: - description: User ID (optional) in: query @@ -790,9 +2052,9 @@ paths: get: tags: - tasks - operationId: tensorhive.controllers.task.get summary: Get task by ID description: Fetches specific task by ID + operationId: tensorhive.controllers.task.get parameters: - description: Task ID in: path @@ -984,9 +2246,9 @@ paths: get: tags: - tasks - operationId: tensorhive.controllers.task.get_log summary: Fetch log file content produced by task description: Return lines of log file located on machine where task was running + operationId: tensorhive.controllers.task.get_log parameters: - description: Task ID in: path @@ -1071,11 +2333,11 @@ paths: get: tags: - tasks - operationId: tensorhive.controllers.task.screen_sessions summary: Returns PIDs of active screen sessions running on username@hostname description: | It shows only sessions labeled by TensorHive and ignores anything else. This endpoint is purely informational and does not rely on usage of any Task object. + operationId: tensorhive.controllers.task.screen_sessions parameters: - description: Username in: query @@ -1102,12 +2364,12 @@ paths: example: {{RESPONSES['screen-sessions']['success']}} pids: type: array + items: + type: integer example: - 1234 - 2345 - 3456 - items: - type: integer 401: description: {{RESPONSES['general']['unauthorized']}} 422: @@ -1136,11 +2398,11 @@ paths: get: tags: - tasks - operationId: tensorhive.controllers.task.spawn summary: Spawns a task by id description: | Task which is already running will not be spawned. Task's state will be synced automatically. + operationId: tensorhive.controllers.task.spawn parameters: - description: Task ID in: path @@ -1210,7 +2472,6 @@ paths: get: tags: - tasks - operationId: tensorhive.controllers.task.terminate summary: Interrupts/terminates/kills task by id description: | Kill - almost guaranteed termination @@ -1221,6 +2482,7 @@ paths: Returns exit code of the operation, not task's command! Task state will be synced automatically. + operationId: tensorhive.controllers.task.terminate parameters: - description: Task ID in: path @@ -1234,8 +2496,8 @@ paths: required: false schema: type: boolean - nullable: true default: null + nullable: true responses: 200: description: {{RESPONSES['task']['terminate']['success']}} @@ -1310,6 +2572,10 @@ components: type: integer format: int64 example: 1 + roles: + type: array + items: + type: string username: type: string example: foobar @@ -1319,30 +2585,77 @@ components: createdAt: type: string format: date-time - TaskForm: + groups: + type: array + items: + $ref: '#/components/schemas/GroupWithoutUsers' + UserWithoutGroup: + type: object + properties: + id: + type: integer + format: int64 + example: 1 + roles: + type: array + items: + type: string + username: + type: string + example: foobar + email: + type: string + example: foo@bar.com + createdAt: + type: string + format: date-time + UserForm: type: object required: - - command - - hostname - - userId + - username + - email + - password properties: - command: + username: type: string - example: CUDA_VISIBLE_DEVICES=0 train.py - hostname: + example: foobar + email: type: string - example: localhost - userId: + example: foo@bar.com + password: + type: string + example: difficult_password + UserUpdateForm: + type: object + required: + - id + properties: + id: type: integer + format: int64 example: 1 - spawnAt: + roles: + type: array + items: + type: string + username: type: string - format: date-time - nullable: true - terminateAt: + example: foobar + password: type: string - format: date-time - nullable: true + example: difficult_password + UserLoginForm: + type: object + required: + - username + - password + properties: + username: + type: string + example: foobar + password: + type: string + example: difficult_password TaskToDisplay: type: object properties: @@ -1373,25 +2686,30 @@ components: format: date-time nullable: true example: 2019-05-08T13:00:00.066Z (or null!) - UserUpdateForm: + TaskForm: type: object required: - - id + - userId + - command + - hostname properties: - roles: - type: array - items: - type: string - username: - type: string - example: foobar - password: - type: string - example: difficult_password - id: + userId: type: integer - format: int64 example: 1 + command: + type: string + example: CUDA_VISIBLE_DEVICES=0 train.py + hostname: + type: string + example: localhost + spawnAt: + type: string + format: date-time + nullable: true + terminateAt: + type: string + format: date-time + nullable: true TaskUpdateForm: type: object properties: @@ -1411,34 +2729,194 @@ components: format: date-time nullable: true example: 2019-05-08T13:00:00.066Z (or null!) - UserForm: + Group: type: object required: - - username - - email - - password + - name + - users properties: - username: + id: + type: integer + format: int64 + example: 1 + readOnly: true + name: type: string - example: foobar - email: + example: Example group + createdAt: type: string - example: foo@bar.com - password: + format: date-time + readOnly: true + users: + type: array + items: + $ref: '#/components/schemas/UserWithoutGroup' + GroupWithoutUsers: + type: object + required: + - name + properties: + id: + type: integer + format: int64 + example: 1 + readOnly: true + name: type: string - example: difficult_password - UserLoginForm: + example: Example group + createdAt: + type: string + format: date-time + readOnly: true + GroupForm: type: object required: - - username - - password + - name properties: - username: + name: type: string - example: foobar - password: + example: Example group + GroupUpdateForm: + type: object + properties: + name: type: string - example: difficult_password + example: Example group + Restriction: + type: object + required: + - name + - createdAt + - start + - end + - isGlobal + - schedules + properties: + id: + type: integer + format: int64 + example: 1 + readOnly: true + name: + type: string + example: Example restriction + createdAt: + type: string + format: date-time + readOnly: true + start: + type: string + format: date-time + end: + type: string + format: date-time + isGlobal: + type: boolean + example: false + users: + type: array + items: + $ref: '#/components/schemas/UserWithoutGroup' + groups: + type: array + items: + $ref: '#/components/schemas/GroupWithoutUsers' + resources: + type: array + items: + $ref: '#/components/schemas/Resource' + schedules: + type: array + items: + $ref: '#/components/schemas/Schedule' + RestrictionForm: + type: object + required: + - start + - isGlobal + properties: + name: + type: string + example: Example restriction + start: + type: string + format: date-time + end: + type: string + format: date-time + isGlobal: + type: boolean + example: false + RestrictionUpdateForm: + type: object + properties: + name: + type: string + example: Example restriction + start: + type: string + format: date-time + end: + type: string + format: date-time + isGlobal: + type: boolean + example: false + Schedule: + type: object + required: + - scheduleDays + - hourStart + - hourEnd + properties: + id: + type: integer + format: int64 + example: 1 + readOnly: true + scheduleDays: + type: array + items: + type: string + example: Monday + hourStart: + type: string + example: '8:00' + hourEnd: + type: string + example: '16:00' + ScheduleForm: + type: object + required: + - scheduleDays + - hourStart + - hourEnd + properties: + scheduleDays: + type: array + items: + type: string + example: Monday + hourStart: + type: string + example: '8:00' + hourEnd: + type: string + example: '16:00' + ScheduleUpdateForm: + type: object + properties: + scheduleDays: + type: array + items: + type: string + example: Monday + hourStart: + type: string + example: '8:00' + hourEnd: + type: string + example: '16:00' Reservation: type: object required: @@ -1537,6 +3015,15 @@ components: end: type: string format: date-time + Resource: + type: object + properties: + id: + type: string + example: GPU-d38d4de3-85ee-e837-3d87-e8e2faeb6a63 + name: + type: string + example: GeForce GTX 1060 GPUAllData: type: object example: @@ -1576,8 +3063,6 @@ components: : unit: '%' value: 95 - CPUMetrics: - type: object GPUProcesses: type: object example: @@ -1588,6 +3073,8 @@ components: - command: java owner: bar pid: 2222 + CPUMetrics: + type: object parameters: hostnameParam: description: Node's hostname in the network diff --git a/tensorhive/controllers/group/__init__.py b/tensorhive/controllers/group/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tensorhive/controllers/group/add_to_group_controller.py b/tensorhive/controllers/group/add_to_group_controller.py new file mode 100644 index 00000000..1be06177 --- /dev/null +++ b/tensorhive/controllers/group/add_to_group_controller.py @@ -0,0 +1,37 @@ +from tensorhive.authorization import admin_required +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.models.Group import Group +from tensorhive.models.User import User +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +GROUP = API.RESPONSES['group'] +U = API.RESPONSES['user'] +G = API.RESPONSES['general'] + + +@admin_required +def add_user(group_id, user_id): + try: + group_not_found = True + group = Group.get(group_id) + group_not_found = False + user = User.get(user_id) + group.add_user(user) + except NoResultFound: + if group_not_found: + content, status = {'msg': GROUP['not_found']}, 404 + else: + content, status = {'msg': U['not_found']}, 404 + except InvalidRequestException as e: + content, status = {'msg': GROUP['users']['add']['failure']['duplicate']}, 409 + except AssertionError as e: + content, status = {'msg': GROUP['users']['add']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': GROUP['users']['add']['success'], 'group': group.as_dict}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/group/create_group_controller.py b/tensorhive/controllers/group/create_group_controller.py new file mode 100644 index 00000000..97ebb071 --- /dev/null +++ b/tensorhive/controllers/group/create_group_controller.py @@ -0,0 +1,28 @@ +from tensorhive.models.Group import Group +from tensorhive.authorization import admin_required +from tensorhive.config import API +GROUP = API.RESPONSES['group'] +G = API.RESPONSES['general'] + + +@admin_required +def create(group): + try: + new_group = Group( + name=group['name'] + ) + new_group.save() + except AssertionError as e: + content = {'msg': GROUP['create']['failure']['invalid'].format(reason=e)} + status = 422 + except Exception as e: + content = {'msg': G['internal_error'] + str(e)} + status = 500 + else: + content = { + 'msg': GROUP['create']['success'], + 'group': new_group.as_dict + } + status = 201 + finally: + return content, status diff --git a/tensorhive/controllers/group/delete_group_controller.py b/tensorhive/controllers/group/delete_group_controller.py new file mode 100644 index 00000000..b6170edb --- /dev/null +++ b/tensorhive/controllers/group/delete_group_controller.py @@ -0,0 +1,23 @@ +from tensorhive.authorization import admin_required +from tensorhive.models.Group import Group +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +GROUP = API.RESPONSES['group'] +G = API.RESPONSES['general'] + + +@admin_required +def delete(id): + try: + group_to_destroy = Group.get(id) + group_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, 403 + except NoResultFound: + content, status = {'msg': GROUP['not_found']}, 404 + except Exception as e: + content, status = {'msg': G['internal_error'] + str(e)}, 500 + else: + content, status = {'msg': GROUP['delete']['success']}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/group/get_group_controller.py b/tensorhive/controllers/group/get_group_controller.py new file mode 100644 index 00000000..c5081d64 --- /dev/null +++ b/tensorhive/controllers/group/get_group_controller.py @@ -0,0 +1,31 @@ +from flask_jwt_extended import jwt_required +from tensorhive.models.Group import Group +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +GROUP = API.RESPONSES['group'] +G = API.RESPONSES['general'] + + +@jwt_required +def get(): + return [ + group.as_dict for group in Group.all() + ], 200 + + +@jwt_required +def get_by_id(id): + try: + group = Group.get(id) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': GROUP['not_found']}, 404 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': GROUP['get']['success'], 'group': group.as_dict}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/group/remove_from_group_controller.py b/tensorhive/controllers/group/remove_from_group_controller.py new file mode 100644 index 00000000..d787957c --- /dev/null +++ b/tensorhive/controllers/group/remove_from_group_controller.py @@ -0,0 +1,37 @@ +from tensorhive.authorization import admin_required +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.models.Group import Group +from tensorhive.models.User import User +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +GROUP = API.RESPONSES['group'] +U = API.RESPONSES['user'] +G = API.RESPONSES['general'] + + +@admin_required +def remove_user(group_id, user_id): + try: + group_not_found = True + group = Group.get(group_id) + group_not_found = False + user = User.get(user_id) + group.remove_user(user) + except NoResultFound: + if group_not_found: + content, status = {'msg': GROUP['not_found']}, 404 + else: + content, status = {'msg': U['not_found']}, 404 + except InvalidRequestException: + content, status = {'msg': GROUP['users']['remove']['failure']['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': GROUP['users']['remove']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': GROUP['users']['remove']['success'], 'group': group.as_dict}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/group/update_group_controller.py b/tensorhive/controllers/group/update_group_controller.py new file mode 100644 index 00000000..3d239cf4 --- /dev/null +++ b/tensorhive/controllers/group/update_group_controller.py @@ -0,0 +1,33 @@ +from tensorhive.authorization import admin_required +from tensorhive.models.Group import Group +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +GROUP = API.RESPONSES['group'] +G = API.RESPONSES['general'] + + +@admin_required +def update(id, newValues): + new_values = newValues + allowed_fields = {'name'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + group = Group.get(id) + + for field_name, new_value in new_values.items(): + assert hasattr(group, field_name), 'group has no {} column'.format(field_name) + setattr(group, field_name, new_value) + group.save() + except NoResultFound: + content, status = {'msg': GROUP['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': GROUP['update']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': GROUP['update']['success'], 'group': group.as_dict}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/nodes/cpu_controller.py b/tensorhive/controllers/nodes/cpu_controller.py index 49c2966e..39dcda09 100644 --- a/tensorhive/controllers/nodes/cpu_controller.py +++ b/tensorhive/controllers/nodes/cpu_controller.py @@ -1,4 +1,4 @@ -from tensorhive.core.managers.TensorHiveManager import TensorHiveManager +from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure from connexion import NoContent from flask_jwt_extended import jwt_required @@ -6,7 +6,7 @@ @jwt_required def get_metrics(hostname: str, metric_type: str = None): try: - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['CPU'] # No data about GPU diff --git a/tensorhive/controllers/nodes/gpu_controller.py b/tensorhive/controllers/nodes/gpu_controller.py index c83cdf56..ef868add 100644 --- a/tensorhive/controllers/nodes/gpu_controller.py +++ b/tensorhive/controllers/nodes/gpu_controller.py @@ -1,4 +1,4 @@ -from tensorhive.core.managers.TensorHiveManager import TensorHiveManager +from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure from connexion import NoContent from flask_jwt_extended import jwt_required from tensorhive.config import API @@ -8,7 +8,7 @@ @jwt_required def get_metrics(hostname: str, metric_type: str = None): try: - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['GPU'] ''' @@ -47,7 +47,7 @@ def get_metrics(hostname: str, metric_type: str = None): # @jwt_required def get_processes(hostname: str): try: - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['GPU'] result = {uuid: gpu_data['processes'] for uuid, gpu_data in resource_data.items()} response = result, 200 @@ -60,7 +60,7 @@ def get_processes(hostname: str): @jwt_required def get_info(hostname: str): try: - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['GPU'] def basic_info(full_dict): diff --git a/tensorhive/controllers/nodes/infrastructure_controller.py b/tensorhive/controllers/nodes/infrastructure_controller.py index 49e2937b..2f875aec 100644 --- a/tensorhive/controllers/nodes/infrastructure_controller.py +++ b/tensorhive/controllers/nodes/infrastructure_controller.py @@ -1,15 +1,40 @@ from tensorhive.core.managers.TensorHiveManager import TensorHiveManager from flask_jwt_extended import jwt_required +from tensorhive.models.Resource import Resource + + +def get_infrastructure(): + infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + + # Try to save gpu resource to database + try: + resources = Resource.all() + id_list = [resource.id for resource in resources] + for hostname, value in infrastructure.items(): + gpu_list = value.get('GPU') + if gpu_list is not None: + for gpu_uuid, gpu_metrics in gpu_list.items(): + if gpu_uuid not in id_list: + new_resource = Resource( + id=gpu_uuid, + name=gpu_metrics.get('name') + ) + new_resource.save() + except Exception: + # In case of failure just return infrastructure + pass + + return infrastructure @jwt_required def get_all_data(): - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + infrastructure = get_infrastructure() return infrastructure, 200 @jwt_required def get_hostnames(): - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + infrastructure = get_infrastructure() hostnames = infrastructure.keys() return list(hostnames), 200 diff --git a/tensorhive/controllers/reservation/get_reservation_controller.py b/tensorhive/controllers/reservation/get_reservation_controller.py index 1c5a5a7c..e49f395a 100644 --- a/tensorhive/controllers/reservation/get_reservation_controller.py +++ b/tensorhive/controllers/reservation/get_reservation_controller.py @@ -2,6 +2,8 @@ from tensorhive.models.Reservation import Reservation from typing import List from tensorhive.config import API +from tensorhive.utils.DateUtils import DateUtils + G = API.RESPONSES['general'] @@ -19,8 +21,8 @@ def get_selected(resources_ids: List, start: str, end: str): all_not_none = resources_ids and start and end if all_not_none: try: - start_as_datetime = Reservation.parsed_input_datetime(start) - ends_as_datetime = Reservation.parsed_input_datetime(end) + start_as_datetime = DateUtils.parse_string(start) + ends_as_datetime = DateUtils.parse_string(end) matches = list(Reservation.filter_by_uuids_and_time_range( resources_ids, start_as_datetime, ends_as_datetime)) matches = [match.as_dict for match in matches] diff --git a/tensorhive/controllers/reservation/update_reservation_controller.py b/tensorhive/controllers/reservation/update_reservation_controller.py index f6f40d55..8053861d 100644 --- a/tensorhive/controllers/reservation/update_reservation_controller.py +++ b/tensorhive/controllers/reservation/update_reservation_controller.py @@ -1,21 +1,15 @@ from flask_jwt_extended import jwt_required from tensorhive.models.Reservation import Reservation from sqlalchemy.orm.exc import NoResultFound -from typing import List, Optional, Any, Dict, Tuple from tensorhive.config import API import logging log = logging.getLogger(__name__) R = API.RESPONSES['reservation'] G = API.RESPONSES['general'] -# FIXME This will make sense when all controllers are in one file (like task.py) -Content = Dict[str, Any] -HttpStatusCode = int -ReservationId = int - @jwt_required -def update(id: ReservationId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: +def update(id, newValues): new_values = newValues allowed_fields = {'title', 'description', 'resourceId', 'start', 'end'} try: diff --git a/tensorhive/controllers/resource/get_resource_controller.py b/tensorhive/controllers/resource/get_resource_controller.py new file mode 100644 index 00000000..06ad7d39 --- /dev/null +++ b/tensorhive/controllers/resource/get_resource_controller.py @@ -0,0 +1,34 @@ +from flask_jwt_extended import jwt_required +from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure +from tensorhive.models.Resource import Resource +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +R = API.RESPONSES['resource'] +G = API.RESPONSES['general'] + + +@jwt_required +def get(): + get_infrastructure() # Save new GPUs in database + return [ + resource.as_dict for resource in Resource.all() + ], 200 + + +@jwt_required +def get_by_id(uuid): + get_infrastructure() # Save new GPUs in database + try: + resource = Resource.get(uuid) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': R['not_found']}, 404 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['get']['success'], 'resource': resource.as_dict}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index aa106fca..82bdc0a0 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -9,28 +9,123 @@ general: ok: OK user: not_found: User has not been found + get: + success: User has been successfully fetched + create: + success: User created successfully + failure: + duplicate: Such user exists + invalid: Requirements not met - {reason} + update: + success: User has been successfully updated + failure: + invalid: Requirements not met - {reason} + delete: + self: Cannot delete own account + success: User deleted successfully login: success: Logged in as {username} failure: credentials: Incorrect credentials logout: success: Logged out successfully + authorized_keys_entry: + success: Fetched successfully +group: + users: + add: + success: User has been added to group + failure: + duplicate: User is already member of group + assertion: Unable to add user to group - {reason} + remove: + success: User has been removed from group + failure: + assertion: Unable to remove user from group - {reason} + not_found: User is not a member of group + not_found: Group has not been found + get: + success: Group has been successfuly fetched + create: + success: Group has been successfully created + failure: + invalid: Requirements not met - {reason} + update: + success: Group has been successfully updated + failure: + assertions: Unnable to update group - {reason} delete: - self: Cannot delete own account - success: User deleted successfully + success: Group deleted successfully +restriction: + users: + apply: + success: Restriction has been applied to user + failure: + duplicate: Restriction is already being applied to user + assertion: Unnable to apply restriction to user - {reason} + remove: + success: Restriction has been removed from user + failure: + assertion: Unnable to remove restriction from user - {reason} + not_found: User is not affected by restriction + groups: + apply: + success: Restriction has been applied to group + failure: + duplicate: Restriction is already being applied to group + assertion: Unnable to apply restriction to group - {reason} + remove: + success: Restriction has been removed from group + failure: + assertion: Unnable to remove restriction from group - {reason} + not_found: Group is not affected by restriction + resources: + apply: + success: Restriction has been applied to resource + failure: + duplicate: Restriction is already being applied to resource + assertion: Unnable to apply restriction to resource - {reason} + remove: + success: Restriction has been removed from resourcce + failure: + assertion: Unnable to remove restriction from resourcce - {reason} + not_found: Resourcce is not affected by restriction + schedules: + add: + success: Schedule has been added to restriction + failure: + duplicate: Schedule is already added to restriction + assertion: Unable to add schedule to restriction - {reason} + remove: + success: Schedule has been removed from restriction + failure: + assertion: Unnable to remove schedule from restriction - {reason} + not_found: Schedule is not applied to restriction + not_found: Restriction has not been found create: - success: User created successfully + success: Restriction has been successfully created failure: - duplicate: Such user exists invalid: Requirements not met - {reason} - get: - success: User has been successfully fetched update: - success: User has been successfully updated + success: Restriction has been successfully updated + failure: + assertions: Unnable to update restriction - {reason} + delete: + success: Restriction has been successfully deleted +schedule: + not_found: Schedule has not been found + get: + success: Schedule has been successfully fetched + create: + success: Schedule has been successfully created failure: invalid: Requirements not met - {reason} - authorized_keys_entry: - success: Fetched successfully + update: + success: Schedule has been successfully updated + failure: + assertions: Unnable to update schedule - {reason} + delete: + success: Schedule has been successfully deleted reservation: not_found: Reservation has not been found create: @@ -44,9 +139,6 @@ reservation: assertions: Unable to update reservation - {reason} delete: success: Reservation has been successfully deleted -users: - get: - success: Fetched successfully screen-sessions: success: PIDs of active screen sessions acquired successfully failure: @@ -55,7 +147,7 @@ task: all: success: Tasks has been successfully fetched get: - success: Task has been successfully fetched + success: Task has been successfully fetched get_log: success: Log file has been found failure: @@ -66,14 +158,14 @@ task: success: Task has been successfully created failure: invalid: Requirements not met - {reason} - delete: - success: Task has been successfully deleted - failure: - assertions: Unable to delete task, {reason} update: success: Task has been successfully updated failure: assertions: Unable to update task, {reason} + delete: + success: Task has been successfully deleted + failure: + assertions: Unable to delete task, {reason} spawn: success: Task has been successfully spawned failure: @@ -90,14 +182,18 @@ token: success: '{token_type} has been revoked' failure: '{token_type} has not been revoked' refresh: - failure: Unable to refresh - unauthorized user success: Token has been refreshed successfully + failure: Unable to refresh - unauthorized user required: Only refresh tokens are allowed access: required: Only access tokens are allowed revoked: Token has been revoked expired: Token has expired missing_auth_header: Missing Authorization Header +resource: + not_found: Resource has not been found + get: + success: Resource has been successfully fetched nodes: hostname: not_found: Hostname has not been found diff --git a/tensorhive/controllers/restriction/__init__.py b/tensorhive/controllers/restriction/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tensorhive/controllers/restriction/add_to_restriction_controller.py b/tensorhive/controllers/restriction/add_to_restriction_controller.py new file mode 100644 index 00000000..96dc456a --- /dev/null +++ b/tensorhive/controllers/restriction/add_to_restriction_controller.py @@ -0,0 +1,129 @@ +from tensorhive.authorization import admin_required +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.models.Restriction import Restriction +from tensorhive.models.User import User +from tensorhive.models.Group import Group +from tensorhive.models.Resource import Resource +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +R = API.RESPONSES['restriction'] +U = API.RESPONSES['user'] +GROUP = API.RESPONSES['group'] +RESOURCE = API.RESPONSES['resource'] +S = API.RESPONSES['schedule'] +G = API.RESPONSES['general'] + + +@admin_required +def apply_to_user(restriction_id, user_id): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + user = User.get(user_id) + restriction.apply_to_user(user) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': U['not_found']}, 404 + except InvalidRequestException as e: + content, status = {'msg': R['users']['apply']['failure']['duplicate']}, 409 + except AssertionError as e: + content, status = {'msg': R['users']['apply']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['users']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status + + +@admin_required +def apply_to_group(restriction_id, group_id): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + group = Group.get(group_id) + restriction.apply_to_group(group) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': GROUP['not_found']}, 404 + except InvalidRequestException as e: + content, status = {'msg': R['groups']['apply']['failure']['duplicate']}, 409 + except AssertionError as e: + content, status = {'msg': R['groups']['apply']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['groups']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status + + +@admin_required +def apply_to_resource(restriction_id, resource_uuid): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + resource = Resource.get(resource_uuid) + restriction.apply_to_resource(resource) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': RESOURCE['not_found']}, 404 + except InvalidRequestException as e: + content, status = {'msg': R['resources']['apply']['failure']['duplicate']}, 409 + except AssertionError as e: + content, status = {'msg': R['resources']['apply']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['resources']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status + + +@admin_required +def add_schedule(restriction_id, schedule_id): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + schedule = RestrictionSchedule.get(schedule_id) + restriction.add_schedule(schedule) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': S['not_found']}, 404 + except InvalidRequestException as e: + content, status = {'msg': R['schedules']['add']['failure']['duplicate']}, 409 + except AssertionError as e: + content, status = {'msg': R['schedules']['add']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['schedules']['add']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/restriction/create_restriction_controller.py b/tensorhive/controllers/restriction/create_restriction_controller.py new file mode 100644 index 00000000..232ae13a --- /dev/null +++ b/tensorhive/controllers/restriction/create_restriction_controller.py @@ -0,0 +1,32 @@ +from tensorhive.models.Restriction import Restriction +from tensorhive.utils.DateUtils import DateUtils +from tensorhive.authorization import admin_required +from tensorhive.config import API +R = API.RESPONSES['restriction'] +G = API.RESPONSES['general'] + + +@admin_required +def create(restriction): + try: + new_restriction = Restriction( + name=restriction.get('name'), + starts_at=restriction['start'], + is_global=restriction['isGlobal'], + ends_at=DateUtils.try_parse_string(restriction.get('end')) + ) + new_restriction.save() + except AssertionError as e: + content = {'msg': R['create']['failure']['invalid'].format(reason=e)} + status = 422 + except Exception as e: + content = {'msg': G['internal_error'] + str(e)} + status = 500 + else: + content = { + 'msg': R['create']['success'], + 'restriction': new_restriction.as_dict(include_groups=True, include_users=True, include_resources=True) + } + status = 201 + finally: + return content, status diff --git a/tensorhive/controllers/restriction/delete_restriction_controller.py b/tensorhive/controllers/restriction/delete_restriction_controller.py new file mode 100644 index 00000000..4b24c872 --- /dev/null +++ b/tensorhive/controllers/restriction/delete_restriction_controller.py @@ -0,0 +1,23 @@ +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.authorization import admin_required +from tensorhive.models.Restriction import Restriction +from tensorhive.config import API +R = API.RESPONSES['restriction'] +G = API.RESPONSES['general'] + + +@admin_required +def delete(id): + try: + restriction_to_destroy = Restriction.get(id) + restriction_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, 403 + except NoResultFound: + content, status = {'msg': R['not_found']}, 404 + except Exception as e: + content, status = {'msg': G['internal_error'] + str(e)}, 500 + else: + content, status = {'msg': R['delete']['success']}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/restriction/get_restriction_controller.py b/tensorhive/controllers/restriction/get_restriction_controller.py new file mode 100644 index 00000000..b0c44ab2 --- /dev/null +++ b/tensorhive/controllers/restriction/get_restriction_controller.py @@ -0,0 +1,72 @@ +from flask_jwt_extended import jwt_required +from tensorhive.models.Restriction import Restriction +from tensorhive.models.User import User +from tensorhive.models.Group import Group +from tensorhive.models.Resource import Resource +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging + +log = logging.getLogger(__name__) +R = API.RESPONSES['restriction'] +G = API.RESPONSES['general'] + + +@jwt_required +def get_all(): + return [ + restriction.as_dict(include_groups=True, include_users=True, + include_resources=True) for restriction in Restriction.all() + ], 200 + + +@jwt_required +def get_selected(user_id, include_user_groups, group_id, resource_id, schedule_id): + try: + include_groups = True + include_users = True + include_resources = True + restrictions = [] + if user_id is not None: + user = User.get(user_id) + restrictions.append(set(user.get_restrictions(include_global=True, include_group=include_user_groups))) + include_users = False + if group_id is not None: + group = Group.get(group_id) + restrictions.append(set(group.get_restrictions(include_global=True))) + include_groups = False + if resource_id is not None: + resource = Resource.get(resource_id) + restrictions.append(set(resource.get_restrictions(include_global=True))) + include_resources = False + if schedule_id is not None: + schedule = RestrictionSchedule.get(schedule_id) + restrictions.append(set(schedule.restrictions)) + + result = restrictions[0] + for restriction in restrictions: + result = result & restriction + except NoResultFound as e: + log.warning(e) + content, status = {'msg': G['bad_request']}, 400 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = [restriction.as_dict(include_groups=include_groups, include_users=include_users, + include_resources=include_resources) for restriction in result], 200 + finally: + return content, status + + +@jwt_required +def get(user_id=None, include_user_groups=None, group_id=None, resource_id=None, schedule_id=None): + args = [user_id, include_user_groups, group_id, resource_id, schedule_id] + all_args_none = all(a is None for a in args) + + if all_args_none: + return get_all() + else: + # Filter restrictions + return get_selected(user_id, include_user_groups, group_id, resource_id, schedule_id) diff --git a/tensorhive/controllers/restriction/remove_from_restriction.py b/tensorhive/controllers/restriction/remove_from_restriction.py new file mode 100644 index 00000000..1ba0f18b --- /dev/null +++ b/tensorhive/controllers/restriction/remove_from_restriction.py @@ -0,0 +1,129 @@ +from tensorhive.authorization import admin_required +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.models.Restriction import Restriction +from tensorhive.models.User import User +from tensorhive.models.Group import Group +from tensorhive.models.Resource import Resource +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +R = API.RESPONSES['restriction'] +U = API.RESPONSES['user'] +GROUP = API.RESPONSES['group'] +RESOURCE = API.RESPONSES['resource'] +S = API.RESPONSES['schedule'] +G = API.RESPONSES['general'] + + +@admin_required +def remove_from_user(restriction_id, user_id): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + user = User.get(user_id) + restriction.remove_from_user(user) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': U['not_found']}, 404 + except InvalidRequestException: + content, status = {'msg': R['users']['remove']['failure']['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': R['users']['remove']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['users']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status + + +@admin_required +def remove_from_group(restriction_id, group_id): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + group = Group.get(group_id) + restriction.remove_from_group(group) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': G['not_found']}, 404 + except InvalidRequestException: + content, status = {'msg': R['groups']['remove']['failure']['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': R['groups']['remove']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['groups']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status + + +@admin_required +def remove_from_resource(restriction_id, resource_uuid): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + resource = Resource.get(resource_uuid) + restriction.remove_from_resource(resource) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': RESOURCE['not_found']}, 404 + except InvalidRequestException: + content, status = {'msg': R['resources']['remove']['failure']['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': R['resources']['remove']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['resources']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status + + +@admin_required +def remove_schedule(restriction_id, schedule_id): + try: + restriction_not_found = True + restriction = Restriction.get(restriction_id) + restriction_not_found = False + schedule = RestrictionSchedule.get(schedule_id) + restriction.remove_schedule(schedule) + except NoResultFound: + if restriction_not_found: + content, status = {'msg': R['not_found']}, 404 + else: + content, status = {'msg': S['not_found']}, 404 + except InvalidRequestException : + content, status = {'msg': R['schedules']['remove']['failure']['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': R['schedules']['remove']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['schedules']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/restriction/update_restriction_controller.py b/tensorhive/controllers/restriction/update_restriction_controller.py new file mode 100644 index 00000000..372ea2f8 --- /dev/null +++ b/tensorhive/controllers/restriction/update_restriction_controller.py @@ -0,0 +1,41 @@ +from tensorhive.authorization import admin_required +from tensorhive.models.Restriction import Restriction +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +R = API.RESPONSES['restriction'] +G = API.RESPONSES['general'] + + +@admin_required +def update(id, newValues): + new_values = newValues + allowed_fields = {'name', 'start', 'end', 'isGlobal'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + restriction = Restriction.get(id) + + for field_name, new_value in new_values.items(): + # Mapping API field name to column used by Restriction model + if field_name in ['start', 'end']: + # start -> starts_at, end -> ends_at + field_name += 's_at' + if field_name == 'isGlobal': + field_name = 'is_global' + assert hasattr(restriction, field_name), 'restriction has no {} column'.format(field_name) + setattr(restriction, field_name, new_value) + restriction.save() + except NoResultFound: + content, status = {'msg': R['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': R['update']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': R['update']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/schedule/__init__.py b/tensorhive/controllers/schedule/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tensorhive/controllers/schedule/create_schedule_controller.py b/tensorhive/controllers/schedule/create_schedule_controller.py new file mode 100644 index 00000000..6777ed4a --- /dev/null +++ b/tensorhive/controllers/schedule/create_schedule_controller.py @@ -0,0 +1,40 @@ +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from datetime import datetime +from tensorhive.utils.Weekday import Weekday +from tensorhive.authorization import admin_required +from tensorhive.config import API +S = API.RESPONSES['schedule'] +G = API.RESPONSES['general'] + + +@admin_required +def create(schedule): + try: + days = [] + for day in schedule['scheduleDays']: + days.append(Weekday[day]) + + new_schedule = RestrictionSchedule( + schedule_days=days, + hour_start=datetime.strptime(schedule['hourStart'], "%H:%M").time(), + hour_end=datetime.strptime(schedule['hourEnd'], "%H:%M").time() + ) + new_schedule.save() + except KeyError: + # Invalid day + content = {'msg': G['bad_request']} + status = 422 + except AssertionError as e: + content = {'msg': S['create']['failure']['invalid'].format(reason=e)} + status = 422 + except Exception as e: + content = {'msg': G['internal_error'] + str(e)} + status = 500 + else: + content = { + 'msg': S['create']['success'], + 'schedule': new_schedule.as_dict + } + status = 201 + finally: + return content, status diff --git a/tensorhive/controllers/schedule/delete_schedule_controller.py b/tensorhive/controllers/schedule/delete_schedule_controller.py new file mode 100644 index 00000000..e8b31c53 --- /dev/null +++ b/tensorhive/controllers/schedule/delete_schedule_controller.py @@ -0,0 +1,23 @@ +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.authorization import admin_required +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.config import API +S = API.RESPONSES['schedule'] +G = API.RESPONSES['general'] + + +@admin_required +def delete(id): + try: + schedule_to_destroy = RestrictionSchedule.get(id) + schedule_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, 403 + except NoResultFound: + content, status = {'msg': S['not_found']}, 404 + except Exception as e: + content, status = {'msg': G['internal_error'] + str(e)}, 500 + else: + content, status = {'msg': S['delete']['success']}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/schedule/get_schedule_controller.py b/tensorhive/controllers/schedule/get_schedule_controller.py new file mode 100644 index 00000000..6e8b25a7 --- /dev/null +++ b/tensorhive/controllers/schedule/get_schedule_controller.py @@ -0,0 +1,31 @@ +from flask_jwt_extended import jwt_required +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +S = API.RESPONSES['schedule'] +G = API.RESPONSES['general'] + + +@jwt_required +def get(): + return [ + schedule.as_dict for schedule in RestrictionSchedule.all() + ], 200 + + +@jwt_required +def get_by_id(id): + try: + schedule = RestrictionSchedule.get(id) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': S['not_found']}, 404 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': S['get']['success'], 'schedule': schedule.as_dict}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/schedule/update_schedule_controller.py b/tensorhive/controllers/schedule/update_schedule_controller.py new file mode 100644 index 00000000..b4c13f11 --- /dev/null +++ b/tensorhive/controllers/schedule/update_schedule_controller.py @@ -0,0 +1,49 @@ +from datetime import datetime +from tensorhive.utils.Weekday import Weekday +from tensorhive.authorization import admin_required +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +import logging +log = logging.getLogger(__name__) +S = API.RESPONSES['schedule'] +G = API.RESPONSES['general'] + + +@admin_required +def update(id, newValues): + new_values = newValues + allowed_fields = {'scheduleDays', 'hourStart', 'hourEnd'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + schedule = RestrictionSchedule.get(id) + + for field_name, new_value in new_values.items(): + # Mapping API field name to column used by Schedule model + if field_name == 'scheduleDays': + field_name = 'schedule_days' + days = [] + for day in new_value: + days.append(Weekday[day]) + new_value = days + if field_name in ['hourStart', 'hourEnd']: + # hourStart -> hour_start, hourEnd -> hour_end + field_name = 'hour_' + (field_name[4:]).lower() + new_value = datetime.strptime(new_value, "%H:%M").time() + assert hasattr(schedule, field_name), 'schedule has no {} column'.format(field_name) + setattr(schedule, field_name, new_value) + schedule.save() + except NoResultFound: + content, status = {'msg': S['not_found']}, 404 + except KeyError: + # Invalid day + content, status = {'msg': G['bad_request']}, 422 + except AssertionError as e: + content, status = {'msg': S['update']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': G['internal_error']}, 500 + else: + content, status = {'msg': S['update']['success'], 'schedule': schedule.as_dict}, 201 + finally: + return content, status diff --git a/tensorhive/controllers/user/update_user_controller.py b/tensorhive/controllers/user/update_user_controller.py index 6503b282..7f85fbd6 100644 --- a/tensorhive/controllers/user/update_user_controller.py +++ b/tensorhive/controllers/user/update_user_controller.py @@ -3,7 +3,6 @@ from tensorhive.authorization import admin_required from tensorhive.models.Role import Role from flask_jwt_extended import jwt_required - R = API.RESPONSES['user'] G = API.RESPONSES['general'] From feae8ca928800af2d685243a3025ad87562dbdbd Mon Sep 17 00:00:00 2001 From: mateusz Date: Fri, 28 Aug 2020 00:59:23 +0200 Subject: [PATCH 026/175] Remove unused variables, fix indents and whitespace --- tensorhive/controllers/group/add_to_group_controller.py | 2 +- .../restriction/add_to_restriction_controller.py | 8 ++++---- .../controllers/restriction/get_restriction_controller.py | 6 +++--- .../controllers/restriction/remove_from_restriction.py | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tensorhive/controllers/group/add_to_group_controller.py b/tensorhive/controllers/group/add_to_group_controller.py index 1be06177..e9808dc2 100644 --- a/tensorhive/controllers/group/add_to_group_controller.py +++ b/tensorhive/controllers/group/add_to_group_controller.py @@ -24,7 +24,7 @@ def add_user(group_id, user_id): content, status = {'msg': GROUP['not_found']}, 404 else: content, status = {'msg': U['not_found']}, 404 - except InvalidRequestException as e: + except InvalidRequestException: content, status = {'msg': GROUP['users']['add']['failure']['duplicate']}, 409 except AssertionError as e: content, status = {'msg': GROUP['users']['add']['failure']['assertions'].format(reason=e)}, 422 diff --git a/tensorhive/controllers/restriction/add_to_restriction_controller.py b/tensorhive/controllers/restriction/add_to_restriction_controller.py index 96dc456a..0a819d2b 100644 --- a/tensorhive/controllers/restriction/add_to_restriction_controller.py +++ b/tensorhive/controllers/restriction/add_to_restriction_controller.py @@ -30,7 +30,7 @@ def apply_to_user(restriction_id, user_id): content, status = {'msg': R['not_found']}, 404 else: content, status = {'msg': U['not_found']}, 404 - except InvalidRequestException as e: + except InvalidRequestException: content, status = {'msg': R['users']['apply']['failure']['duplicate']}, 409 except AssertionError as e: content, status = {'msg': R['users']['apply']['failure']['assertions'].format(reason=e)}, 422 @@ -58,7 +58,7 @@ def apply_to_group(restriction_id, group_id): content, status = {'msg': R['not_found']}, 404 else: content, status = {'msg': GROUP['not_found']}, 404 - except InvalidRequestException as e: + except InvalidRequestException: content, status = {'msg': R['groups']['apply']['failure']['duplicate']}, 409 except AssertionError as e: content, status = {'msg': R['groups']['apply']['failure']['assertions'].format(reason=e)}, 422 @@ -86,7 +86,7 @@ def apply_to_resource(restriction_id, resource_uuid): content, status = {'msg': R['not_found']}, 404 else: content, status = {'msg': RESOURCE['not_found']}, 404 - except InvalidRequestException as e: + except InvalidRequestException: content, status = {'msg': R['resources']['apply']['failure']['duplicate']}, 409 except AssertionError as e: content, status = {'msg': R['resources']['apply']['failure']['assertions'].format(reason=e)}, 422 @@ -114,7 +114,7 @@ def add_schedule(restriction_id, schedule_id): content, status = {'msg': R['not_found']}, 404 else: content, status = {'msg': S['not_found']}, 404 - except InvalidRequestException as e: + except InvalidRequestException: content, status = {'msg': R['schedules']['add']['failure']['duplicate']}, 409 except AssertionError as e: content, status = {'msg': R['schedules']['add']['failure']['assertions'].format(reason=e)}, 422 diff --git a/tensorhive/controllers/restriction/get_restriction_controller.py b/tensorhive/controllers/restriction/get_restriction_controller.py index b0c44ab2..2124fb9e 100644 --- a/tensorhive/controllers/restriction/get_restriction_controller.py +++ b/tensorhive/controllers/restriction/get_restriction_controller.py @@ -16,9 +16,9 @@ @jwt_required def get_all(): return [ - restriction.as_dict(include_groups=True, include_users=True, - include_resources=True) for restriction in Restriction.all() - ], 200 + restriction.as_dict(include_groups=True, include_users=True, + include_resources=True) for restriction in Restriction.all() + ], 200 @jwt_required diff --git a/tensorhive/controllers/restriction/remove_from_restriction.py b/tensorhive/controllers/restriction/remove_from_restriction.py index 1ba0f18b..23647105 100644 --- a/tensorhive/controllers/restriction/remove_from_restriction.py +++ b/tensorhive/controllers/restriction/remove_from_restriction.py @@ -114,7 +114,7 @@ def remove_schedule(restriction_id, schedule_id): content, status = {'msg': R['not_found']}, 404 else: content, status = {'msg': S['not_found']}, 404 - except InvalidRequestException : + except InvalidRequestException: content, status = {'msg': R['schedules']['remove']['failure']['not_found']}, 404 except AssertionError as e: content, status = {'msg': R['schedules']['remove']['failure']['assertions'].format(reason=e)}, 422 From b3e4fdba48dfaeca5a3a65642ede606ab13585fd Mon Sep 17 00:00:00 2001 From: mateusz Date: Wed, 16 Sep 2020 01:54:33 +0200 Subject: [PATCH 027/175] Code refactoring, fix typos --- tensorhive/api/api_specification.yml | 160 +++++++++--------- .../group/add_to_group_controller.py | 19 ++- .../group/create_group_controller.py | 7 +- .../group/delete_group_controller.py | 9 +- .../controllers/group/get_group_controller.py | 9 +- .../group/remove_from_group_controller.py | 19 ++- .../group/update_group_controller.py | 12 +- .../delete_reservation_controller.py | 6 +- .../update_reservation_controller.py | 20 ++- .../resource/get_resource_controller.py | 9 +- tensorhive/controllers/responses.yml | 30 ++-- .../add_to_restriction_controller.py | 73 ++++---- .../create_restriction_controller.py | 7 +- .../delete_restriction_controller.py | 9 +- .../restriction/get_restriction_controller.py | 35 ++-- .../restriction/remove_from_restriction.py | 73 ++++---- .../update_restriction_controller.py | 29 ++-- .../schedule/create_schedule_controller.py | 14 +- .../schedule/delete_schedule_controller.py | 9 +- .../schedule/get_schedule_controller.py | 9 +- .../schedule/update_schedule_controller.py | 33 ++-- tensorhive/controllers/task.py | 37 ++-- .../user/create_user_controller.py | 4 +- .../user/update_user_controller.py | 4 +- 24 files changed, 336 insertions(+), 300 deletions(-) diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index b695a1e8..34ad4c49 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -26,7 +26,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -34,7 +34,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: @@ -68,7 +68,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -76,7 +76,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['user']['not_found']}} content: @@ -125,7 +125,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -133,7 +133,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 409: description: {{RESPONSES['user']['create']['failure']['duplicate']}} 422: @@ -174,7 +174,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -182,7 +182,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 409: description: {{RESPONSES['user']['create']['failure']['duplicate']}} 422: @@ -223,7 +223,7 @@ paths: 400: description: {{RESPONSES['general']['bad_request']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} 409: description: {{RESPONSES['user']['create']['failure']['duplicate']}} 422: @@ -254,7 +254,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -262,7 +262,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['user']['not_found']}} 422: @@ -403,7 +403,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -411,7 +411,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: @@ -447,7 +447,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -455,7 +455,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['create']['failure']['invalid']}} 500: @@ -527,7 +527,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['group']['update']['success']}} content: application/json: @@ -544,7 +544,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -552,7 +552,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['group']['not_found']}} 422: @@ -584,7 +584,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -592,7 +592,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['group']['not_found']}} 422: @@ -621,7 +621,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['group']['users']['add']['success']}} content: application/json: @@ -638,7 +638,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -646,7 +646,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['group']['not_found']}} or {{RESPONSES['user']['not_found']}} 409: @@ -676,7 +676,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['group']['users']['remove']['success']}} content: application/json: @@ -693,7 +693,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -701,7 +701,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['group']['not_found']}} or {{RESPONSES['user']['not_found']}} or {{RESPONSES['group']['users']['remove']['failure']['not_found']}} 422: @@ -807,7 +807,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -815,7 +815,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['create']['failure']['invalid']}} 500: @@ -844,7 +844,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['update']['success']}} content: application/json: @@ -861,7 +861,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -869,7 +869,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} 422: @@ -901,7 +901,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -909,7 +909,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} 422: @@ -938,7 +938,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['users']['apply']['success']}} content: application/json: @@ -955,7 +955,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -963,7 +963,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['user']['not_found']}} 409: @@ -1010,7 +1010,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1018,7 +1018,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['user']['not_found']}} or {{RESPONSES['restriction']['users']['remove']['failure']['not_found']}} 422: @@ -1047,7 +1047,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['groups']['apply']['success']}} content: application/json: @@ -1064,7 +1064,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1072,7 +1072,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['group']['not_found']}} 409: @@ -1119,7 +1119,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1127,7 +1127,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['group']['not_found']}} or {{RESPONSES['restriction']['groups']['remove']['failure']['not_found']}} 422: @@ -1156,7 +1156,7 @@ paths: schema: type: string responses: - 201: + 200: description: {{RESPONSES['restriction']['resources']['apply']['success']}} content: application/json: @@ -1173,7 +1173,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1181,7 +1181,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} 409: @@ -1228,7 +1228,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1236,7 +1236,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['not_found']}} 422: @@ -1265,7 +1265,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['schedules']['add']['success']}} content: application/json: @@ -1282,7 +1282,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1290,7 +1290,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['schedule']['not_found']}} 409: @@ -1337,7 +1337,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1345,7 +1345,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['schedule']['not_found']}} or {{RESPONSES['restriction']['schedules']['remove']['failure']['not_found']}} 422: @@ -1372,7 +1372,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1380,7 +1380,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: @@ -1416,7 +1416,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1424,7 +1424,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['schedule']['create']['failure']['invalid']}} 500: @@ -1496,7 +1496,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['schedule']['update']['success']}} content: application/json: @@ -1513,7 +1513,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1521,7 +1521,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['schedule']['not_found']}} 422: @@ -1553,7 +1553,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1561,7 +1561,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['schedule']['not_found']}} 422: @@ -1748,7 +1748,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1756,7 +1756,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: @@ -1984,7 +1984,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -1992,7 +1992,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 422: description: {{RESPONSES['general']['auth_error']}} security: @@ -2031,7 +2031,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2039,7 +2039,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} # 409: # description: {{RESPONSES['task']['create']['failure']['duplicate']}} 422: @@ -2078,7 +2078,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2086,7 +2086,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['task']['not_found']}} content: @@ -2150,7 +2150,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2158,7 +2158,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['task']['not_found']}} content: @@ -2209,7 +2209,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2217,7 +2217,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['task']['not_found']}} content: @@ -2288,7 +2288,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2296,7 +2296,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['task']['get_log']['failure']['not_found']}} content: @@ -2427,7 +2427,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2435,7 +2435,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['task']['not_found']}} content: @@ -2528,7 +2528,7 @@ paths: 401: description: {{RESPONSES['general']['unauthorized']}} 403: - description: {{RESPONSES['general']['unpriviliged']}} + description: {{RESPONSES['general']['unprivileged']}} content: application/json: schema: @@ -2536,7 +2536,7 @@ paths: properties: msg: type: string - example: {{RESPONSES['general']['unpriviliged']}} + example: {{RESPONSES['general']['unprivileged']}} 404: description: {{RESPONSES['task']['not_found']}} content: diff --git a/tensorhive/controllers/group/add_to_group_controller.py b/tensorhive/controllers/group/add_to_group_controller.py index e9808dc2..b34619f3 100644 --- a/tensorhive/controllers/group/add_to_group_controller.py +++ b/tensorhive/controllers/group/add_to_group_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from sqlalchemy.orm.exc import NoResultFound @@ -13,25 +14,25 @@ @admin_required def add_user(group_id, user_id): + group = None try: - group_not_found = True group = Group.get(group_id) - group_not_found = False user = User.get(user_id) group.add_user(user) except NoResultFound: - if group_not_found: - content, status = {'msg': GROUP['not_found']}, 404 + if group is None: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': U['not_found']}, 404 + content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': GROUP['users']['add']['failure']['duplicate']}, 409 + content, status = {'msg': GROUP['users']['add']['failure']['duplicate']}, HTTPStatus.CONFLICT.value except AssertionError as e: - content, status = {'msg': GROUP['users']['add']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': GROUP['users']['add']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': GROUP['users']['add']['success'], 'group': group.as_dict}, 201 + content, status = {'msg': GROUP['users']['add']['success'], 'group': group.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/group/create_group_controller.py b/tensorhive/controllers/group/create_group_controller.py index 97ebb071..02e97905 100644 --- a/tensorhive/controllers/group/create_group_controller.py +++ b/tensorhive/controllers/group/create_group_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.models.Group import Group from tensorhive.authorization import admin_required from tensorhive.config import API @@ -14,15 +15,15 @@ def create(group): new_group.save() except AssertionError as e: content = {'msg': GROUP['create']['failure']['invalid'].format(reason=e)} - status = 422 + status = HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: content = {'msg': G['internal_error'] + str(e)} - status = 500 + status = HTTPStatus.INTERNAL_SERVER_ERROR.value else: content = { 'msg': GROUP['create']['success'], 'group': new_group.as_dict } - status = 201 + status = HTTPStatus.CREATED.value finally: return content, status diff --git a/tensorhive/controllers/group/delete_group_controller.py b/tensorhive/controllers/group/delete_group_controller.py index b6170edb..bd22a412 100644 --- a/tensorhive/controllers/group/delete_group_controller.py +++ b/tensorhive/controllers/group/delete_group_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.models.Group import Group from sqlalchemy.orm.exc import NoResultFound @@ -12,12 +13,12 @@ def delete(id): group_to_destroy = Group.get(id) group_to_destroy.destroy() except AssertionError as error_message: - content, status = {'msg': str(error_message)}, 403 + content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: - content, status = {'msg': GROUP['not_found']}, 404 + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, 500 + content, status = {'msg': G['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': GROUP['delete']['success']}, 200 + content, status = {'msg': GROUP['delete']['success']}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/group/get_group_controller.py b/tensorhive/controllers/group/get_group_controller.py index c5081d64..280cb0fe 100644 --- a/tensorhive/controllers/group/get_group_controller.py +++ b/tensorhive/controllers/group/get_group_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from flask_jwt_extended import jwt_required from tensorhive.models.Group import Group from sqlalchemy.orm.exc import NoResultFound @@ -12,7 +13,7 @@ def get(): return [ group.as_dict for group in Group.all() - ], 200 + ], HTTPStatus.OK.value @jwt_required @@ -21,11 +22,11 @@ def get_by_id(id): group = Group.get(id) except NoResultFound as e: log.warning(e) - content, status = {'msg': GROUP['not_found']}, 404 + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': GROUP['get']['success'], 'group': group.as_dict}, 200 + content, status = {'msg': GROUP['get']['success'], 'group': group.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/group/remove_from_group_controller.py b/tensorhive/controllers/group/remove_from_group_controller.py index d787957c..c6ca62dc 100644 --- a/tensorhive/controllers/group/remove_from_group_controller.py +++ b/tensorhive/controllers/group/remove_from_group_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from sqlalchemy.orm.exc import NoResultFound @@ -13,25 +14,25 @@ @admin_required def remove_user(group_id, user_id): + group = None try: - group_not_found = True group = Group.get(group_id) - group_not_found = False user = User.get(user_id) group.remove_user(user) except NoResultFound: - if group_not_found: - content, status = {'msg': GROUP['not_found']}, 404 + if group is None: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': U['not_found']}, 404 + content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': GROUP['users']['remove']['failure']['not_found']}, 404 + content, status = {'msg': GROUP['users']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': GROUP['users']['remove']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': GROUP['users']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': GROUP['users']['remove']['success'], 'group': group.as_dict}, 201 + content, status = {'msg': GROUP['users']['remove']['success'], 'group': group.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/group/update_group_controller.py b/tensorhive/controllers/group/update_group_controller.py index 3d239cf4..c178331b 100644 --- a/tensorhive/controllers/group/update_group_controller.py +++ b/tensorhive/controllers/group/update_group_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.models.Group import Group from sqlalchemy.orm.exc import NoResultFound @@ -17,17 +18,18 @@ def update(id, newValues): group = Group.get(id) for field_name, new_value in new_values.items(): - assert hasattr(group, field_name), 'group has no {} column'.format(field_name) + assert hasattr(group, field_name), 'group has no {} field'.format(field_name) setattr(group, field_name, new_value) group.save() except NoResultFound: - content, status = {'msg': GROUP['not_found']}, 404 + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': GROUP['update']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': GROUP['update']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': GROUP['update']['success'], 'group': group.as_dict}, 201 + content, status = {'msg': GROUP['update']['success'], 'group': group.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/reservation/delete_reservation_controller.py b/tensorhive/controllers/reservation/delete_reservation_controller.py index 408a083f..e4919f31 100644 --- a/tensorhive/controllers/reservation/delete_reservation_controller.py +++ b/tensorhive/controllers/reservation/delete_reservation_controller.py @@ -19,17 +19,17 @@ def delete(id): # Fetch the reservation reservation_to_destroy = Reservation.get(id) - # Must be priviliged + # Must be privileged is_admin = 'admin' in claims['roles'] is_owner = reservation_to_destroy.user_id == current_user_id - assert is_owner or is_admin, G['unpriviliged'] + assert is_owner or is_admin, G['unprivileged'] # Destroy reservation_to_destroy.destroy() except AssertionError as error_message: content, status = {'msg': str(error_message)}, 403 except NoResultFound: - # FIXME It is theoretically posibble that User.get() could also raise this exception + # FIXME It is theoretically possible that User.get() could also raise this exception content, status = {'msg': R['not_found']}, 404 except Exception as e: content, status = {'msg': G['internal_error'] + str(e)}, 500 diff --git a/tensorhive/controllers/reservation/update_reservation_controller.py b/tensorhive/controllers/reservation/update_reservation_controller.py index 8053861d..5a728f99 100644 --- a/tensorhive/controllers/reservation/update_reservation_controller.py +++ b/tensorhive/controllers/reservation/update_reservation_controller.py @@ -8,6 +8,16 @@ G = API.RESPONSES['general'] +def to_db_column(): + return { + 'title': 'title', + 'description': 'description', + 'resourceId': 'protected_resource_id', + 'start': 'starts_at', + 'end': 'ends_at', + } + + @jwt_required def update(id, newValues): new_values = newValues @@ -17,13 +27,9 @@ def update(id, newValues): reservation = Reservation.get(id) for field_name, new_value in new_values.items(): - # Mapping API field name to column used by Reservation model - if field_name in ['start', 'end']: - # start -> starts_at, end -> ends_at - field_name += 's_at' - if field_name == 'resourceId': - field_name = 'protected_resource_id' - assert hasattr(reservation, field_name), 'reservation has no {} column'.format(field_name) + field_name = to_db_column().get(field_name) + assert (field_name is not None) and hasattr(reservation, field_name), \ + 'reservation has no {} field'.format(field_name) setattr(reservation, field_name, new_value) reservation.save() except NoResultFound: diff --git a/tensorhive/controllers/resource/get_resource_controller.py b/tensorhive/controllers/resource/get_resource_controller.py index 06ad7d39..c26dfdc2 100644 --- a/tensorhive/controllers/resource/get_resource_controller.py +++ b/tensorhive/controllers/resource/get_resource_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from flask_jwt_extended import jwt_required from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure from tensorhive.models.Resource import Resource @@ -14,7 +15,7 @@ def get(): get_infrastructure() # Save new GPUs in database return [ resource.as_dict for resource in Resource.all() - ], 200 + ], HTTPStatus.OK.value @jwt_required @@ -24,11 +25,11 @@ def get_by_id(uuid): resource = Resource.get(uuid) except NoResultFound as e: log.warning(e) - content, status = {'msg': R['not_found']}, 404 + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': R['get']['success'], 'resource': resource.as_dict}, 200 + content, status = {'msg': R['get']['success'], 'resource': resource.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index 82bdc0a0..3d41d1c8 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -3,7 +3,7 @@ general: success: Fetched successfully unauthorized: Unauthorized bad_request: Bad Request - unpriviliged: Unpriviliged + unprivileged: Unprivileged no_identity: Could not resolve identity auth_error: Authorization error ok: OK @@ -53,7 +53,7 @@ group: update: success: Group has been successfully updated failure: - assertions: Unnable to update group - {reason} + assertions: Unable to update group - {reason} delete: success: Group deleted successfully restriction: @@ -61,45 +61,45 @@ restriction: apply: success: Restriction has been applied to user failure: - duplicate: Restriction is already being applied to user - assertion: Unnable to apply restriction to user - {reason} + duplicate: Restriction is already being applied to user + assertion: Unable to apply restriction to user - {reason} remove: success: Restriction has been removed from user failure: - assertion: Unnable to remove restriction from user - {reason} + assertion: Unable to remove restriction from user - {reason} not_found: User is not affected by restriction groups: apply: success: Restriction has been applied to group failure: - duplicate: Restriction is already being applied to group - assertion: Unnable to apply restriction to group - {reason} + duplicate: Restriction is already being applied to group + assertion: Unable to apply restriction to group - {reason} remove: success: Restriction has been removed from group failure: - assertion: Unnable to remove restriction from group - {reason} + assertion: Unable to remove restriction from group - {reason} not_found: Group is not affected by restriction resources: apply: success: Restriction has been applied to resource failure: - duplicate: Restriction is already being applied to resource - assertion: Unnable to apply restriction to resource - {reason} + duplicate: Restriction is already being applied to resource + assertion: Unable to apply restriction to resource - {reason} remove: success: Restriction has been removed from resourcce failure: - assertion: Unnable to remove restriction from resourcce - {reason} + assertion: Unable to remove restriction from resourcce - {reason} not_found: Resourcce is not affected by restriction schedules: add: success: Schedule has been added to restriction failure: - duplicate: Schedule is already added to restriction + duplicate: Schedule has already been added to restriction assertion: Unable to add schedule to restriction - {reason} remove: success: Schedule has been removed from restriction failure: - assertion: Unnable to remove schedule from restriction - {reason} + assertion: Unable to remove schedule from restriction - {reason} not_found: Schedule is not applied to restriction not_found: Restriction has not been found create: @@ -109,7 +109,7 @@ restriction: update: success: Restriction has been successfully updated failure: - assertions: Unnable to update restriction - {reason} + assertions: Unable to update restriction - {reason} delete: success: Restriction has been successfully deleted schedule: @@ -123,7 +123,7 @@ schedule: update: success: Schedule has been successfully updated failure: - assertions: Unnable to update schedule - {reason} + assertions: Unable to update schedule - {reason} delete: success: Schedule has been successfully deleted reservation: diff --git a/tensorhive/controllers/restriction/add_to_restriction_controller.py b/tensorhive/controllers/restriction/add_to_restriction_controller.py index 0a819d2b..b800a69a 100644 --- a/tensorhive/controllers/restriction/add_to_restriction_controller.py +++ b/tensorhive/controllers/restriction/add_to_restriction_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from sqlalchemy.orm.exc import NoResultFound @@ -19,111 +20,111 @@ @admin_required def apply_to_user(restriction_id, user_id): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False user = User.get(user_id) restriction.apply_to_user(user) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': U['not_found']}, 404 + content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['users']['apply']['failure']['duplicate']}, 409 + content, status = {'msg': R['users']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value except AssertionError as e: - content, status = {'msg': R['users']['apply']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['users']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['users']['apply']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status @admin_required def apply_to_group(restriction_id, group_id): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False group = Group.get(group_id) restriction.apply_to_group(group) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': GROUP['not_found']}, 404 + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['groups']['apply']['failure']['duplicate']}, 409 + content, status = {'msg': R['groups']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value except AssertionError as e: - content, status = {'msg': R['groups']['apply']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['groups']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['groups']['apply']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status @admin_required def apply_to_resource(restriction_id, resource_uuid): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False resource = Resource.get(resource_uuid) restriction.apply_to_resource(resource) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': RESOURCE['not_found']}, 404 + content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['resources']['apply']['failure']['duplicate']}, 409 + content, status = {'msg': R['resources']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value except AssertionError as e: - content, status = {'msg': R['resources']['apply']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['resources']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['resources']['apply']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status @admin_required def add_schedule(restriction_id, schedule_id): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False schedule = RestrictionSchedule.get(schedule_id) restriction.add_schedule(schedule) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': S['not_found']}, 404 + content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['schedules']['add']['failure']['duplicate']}, 409 + content, status = {'msg': R['schedules']['add']['failure']['duplicate']}, HTTPStatus.CONFLICT.value except AssertionError as e: - content, status = {'msg': R['schedules']['add']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['schedules']['add']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['schedules']['add']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/restriction/create_restriction_controller.py b/tensorhive/controllers/restriction/create_restriction_controller.py index 232ae13a..974e8f78 100644 --- a/tensorhive/controllers/restriction/create_restriction_controller.py +++ b/tensorhive/controllers/restriction/create_restriction_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.models.Restriction import Restriction from tensorhive.utils.DateUtils import DateUtils from tensorhive.authorization import admin_required @@ -18,15 +19,15 @@ def create(restriction): new_restriction.save() except AssertionError as e: content = {'msg': R['create']['failure']['invalid'].format(reason=e)} - status = 422 + status = HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: content = {'msg': G['internal_error'] + str(e)} - status = 500 + status = HTTPStatus.INTERNAL_SERVER_ERROR.value else: content = { 'msg': R['create']['success'], 'restriction': new_restriction.as_dict(include_groups=True, include_users=True, include_resources=True) } - status = 201 + status = HTTPStatus.CREATED.value finally: return content, status diff --git a/tensorhive/controllers/restriction/delete_restriction_controller.py b/tensorhive/controllers/restriction/delete_restriction_controller.py index 4b24c872..e77a2d2d 100644 --- a/tensorhive/controllers/restriction/delete_restriction_controller.py +++ b/tensorhive/controllers/restriction/delete_restriction_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.models.Restriction import Restriction @@ -12,12 +13,12 @@ def delete(id): restriction_to_destroy = Restriction.get(id) restriction_to_destroy.destroy() except AssertionError as error_message: - content, status = {'msg': str(error_message)}, 403 + content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: - content, status = {'msg': R['not_found']}, 404 + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, 500 + content, status = {'msg': G['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': R['delete']['success']}, 200 + content, status = {'msg': R['delete']['success']}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/restriction/get_restriction_controller.py b/tensorhive/controllers/restriction/get_restriction_controller.py index 2124fb9e..003e686e 100644 --- a/tensorhive/controllers/restriction/get_restriction_controller.py +++ b/tensorhive/controllers/restriction/get_restriction_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from flask_jwt_extended import jwt_required from tensorhive.models.Restriction import Restriction from tensorhive.models.User import User @@ -18,44 +19,44 @@ def get_all(): return [ restriction.as_dict(include_groups=True, include_users=True, include_resources=True) for restriction in Restriction.all() - ], 200 + ], HTTPStatus.OK.value @jwt_required def get_selected(user_id, include_user_groups, group_id, resource_id, schedule_id): try: - include_groups = True - include_users = True - include_resources = True + # If a specific group is selected then groups are not included in the restriction information in response + # The same applies to users and resources + include_groups = group_id is None + include_users = user_id is None + include_resources = schedule_id is None + restrictions = [] if user_id is not None: user = User.get(user_id) - restrictions.append(set(user.get_restrictions(include_global=True, include_group=include_user_groups))) - include_users = False + restrictions.extend(user.get_restrictions(include_global=True, include_group=include_user_groups)) if group_id is not None: group = Group.get(group_id) - restrictions.append(set(group.get_restrictions(include_global=True))) - include_groups = False + restrictions.extend(group.get_restrictions(include_global=True)) if resource_id is not None: resource = Resource.get(resource_id) - restrictions.append(set(resource.get_restrictions(include_global=True))) - include_resources = False + restrictions.extend(resource.get_restrictions(include_global=True)) if schedule_id is not None: schedule = RestrictionSchedule.get(schedule_id) - restrictions.append(set(schedule.restrictions)) + restrictions.extend(schedule.restrictions) - result = restrictions[0] - for restriction in restrictions: - result = result & restriction + # Take unique restrictions + result = set(restrictions) except NoResultFound as e: log.warning(e) - content, status = {'msg': G['bad_request']}, 400 + content, status = {'msg': G['bad_request']}, HTTPStatus.BAD_REQUEST.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = [restriction.as_dict(include_groups=include_groups, include_users=include_users, - include_resources=include_resources) for restriction in result], 200 + include_resources=include_resources) for restriction in result],\ + HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/restriction/remove_from_restriction.py b/tensorhive/controllers/restriction/remove_from_restriction.py index 23647105..8a21fb55 100644 --- a/tensorhive/controllers/restriction/remove_from_restriction.py +++ b/tensorhive/controllers/restriction/remove_from_restriction.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from sqlalchemy.orm.exc import NoResultFound @@ -19,111 +20,111 @@ @admin_required def remove_from_user(restriction_id, user_id): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False user = User.get(user_id) restriction.remove_from_user(user) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': U['not_found']}, 404 + content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['users']['remove']['failure']['not_found']}, 404 + content, status = {'msg': R['users']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': R['users']['remove']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['users']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['users']['remove']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status @admin_required def remove_from_group(restriction_id, group_id): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False group = Group.get(group_id) restriction.remove_from_group(group) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': G['not_found']}, 404 + content, status = {'msg': G['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['groups']['remove']['failure']['not_found']}, 404 + content, status = {'msg': R['groups']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': R['groups']['remove']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['groups']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['groups']['remove']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status @admin_required def remove_from_resource(restriction_id, resource_uuid): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False resource = Resource.get(resource_uuid) restriction.remove_from_resource(resource) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': RESOURCE['not_found']}, 404 + content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['resources']['remove']['failure']['not_found']}, 404 + content, status = {'msg': R['resources']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': R['resources']['remove']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['resources']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['resources']['remove']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status @admin_required def remove_schedule(restriction_id, schedule_id): + restriction = None try: - restriction_not_found = True restriction = Restriction.get(restriction_id) - restriction_not_found = False schedule = RestrictionSchedule.get(schedule_id) restriction.remove_schedule(schedule) except NoResultFound: - if restriction_not_found: - content, status = {'msg': R['not_found']}, 404 + if restriction is None: + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': S['not_found']}, 404 + content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value except InvalidRequestException: - content, status = {'msg': R['schedules']['remove']['failure']['not_found']}, 404 + content, status = {'msg': R['schedules']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': R['schedules']['remove']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['schedules']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['schedules']['remove']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/restriction/update_restriction_controller.py b/tensorhive/controllers/restriction/update_restriction_controller.py index 372ea2f8..dfe1a1e3 100644 --- a/tensorhive/controllers/restriction/update_restriction_controller.py +++ b/tensorhive/controllers/restriction/update_restriction_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.authorization import admin_required from tensorhive.models.Restriction import Restriction from sqlalchemy.orm.exc import NoResultFound @@ -8,6 +9,15 @@ G = API.RESPONSES['general'] +def to_db_column(): + return { + 'name': 'name', + 'start': 'starts_at', + 'end': 'ends_at', + 'isGlobal': 'is_global' + } + + @admin_required def update(id, newValues): new_values = newValues @@ -17,25 +27,22 @@ def update(id, newValues): restriction = Restriction.get(id) for field_name, new_value in new_values.items(): - # Mapping API field name to column used by Restriction model - if field_name in ['start', 'end']: - # start -> starts_at, end -> ends_at - field_name += 's_at' - if field_name == 'isGlobal': - field_name = 'is_global' - assert hasattr(restriction, field_name), 'restriction has no {} column'.format(field_name) + field_name = to_db_column().get(field_name) + assert (field_name is not None) and hasattr(restriction, field_name), \ + 'restriction has no {} field'.format(field_name) setattr(restriction, field_name, new_value) restriction.save() except NoResultFound: - content, status = {'msg': R['not_found']}, 404 + content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': R['update']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': R['update']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: content, status = {'msg': R['update']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, 201 + include_resources=True)}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/schedule/create_schedule_controller.py b/tensorhive/controllers/schedule/create_schedule_controller.py index 6777ed4a..2a19ed7c 100644 --- a/tensorhive/controllers/schedule/create_schedule_controller.py +++ b/tensorhive/controllers/schedule/create_schedule_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from tensorhive.models.RestrictionSchedule import RestrictionSchedule from datetime import datetime from tensorhive.utils.Weekday import Weekday @@ -10,10 +11,7 @@ @admin_required def create(schedule): try: - days = [] - for day in schedule['scheduleDays']: - days.append(Weekday[day]) - + days = [Weekday[day] for day in schedule['scheduleDays']] new_schedule = RestrictionSchedule( schedule_days=days, hour_start=datetime.strptime(schedule['hourStart'], "%H:%M").time(), @@ -23,18 +21,18 @@ def create(schedule): except KeyError: # Invalid day content = {'msg': G['bad_request']} - status = 422 + status = HTTPStatus.UNPROCESSABLE_ENTITY.value except AssertionError as e: content = {'msg': S['create']['failure']['invalid'].format(reason=e)} - status = 422 + status = HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: content = {'msg': G['internal_error'] + str(e)} - status = 500 + status = HTTPStatus.INTERNAL_SERVER_ERROR.value else: content = { 'msg': S['create']['success'], 'schedule': new_schedule.as_dict } - status = 201 + status = HTTPStatus.CREATED.value finally: return content, status diff --git a/tensorhive/controllers/schedule/delete_schedule_controller.py b/tensorhive/controllers/schedule/delete_schedule_controller.py index e8b31c53..e009b8d6 100644 --- a/tensorhive/controllers/schedule/delete_schedule_controller.py +++ b/tensorhive/controllers/schedule/delete_schedule_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.models.RestrictionSchedule import RestrictionSchedule @@ -12,12 +13,12 @@ def delete(id): schedule_to_destroy = RestrictionSchedule.get(id) schedule_to_destroy.destroy() except AssertionError as error_message: - content, status = {'msg': str(error_message)}, 403 + content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: - content, status = {'msg': S['not_found']}, 404 + content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, 500 + content, status = {'msg': G['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': S['delete']['success']}, 200 + content, status = {'msg': S['delete']['success']}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/schedule/get_schedule_controller.py b/tensorhive/controllers/schedule/get_schedule_controller.py index 6e8b25a7..7d4973db 100644 --- a/tensorhive/controllers/schedule/get_schedule_controller.py +++ b/tensorhive/controllers/schedule/get_schedule_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from flask_jwt_extended import jwt_required from tensorhive.models.RestrictionSchedule import RestrictionSchedule from sqlalchemy.orm.exc import NoResultFound @@ -12,7 +13,7 @@ def get(): return [ schedule.as_dict for schedule in RestrictionSchedule.all() - ], 200 + ], HTTPStatus.OK.value @jwt_required @@ -21,11 +22,11 @@ def get_by_id(id): schedule = RestrictionSchedule.get(id) except NoResultFound as e: log.warning(e) - content, status = {'msg': S['not_found']}, 404 + content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': S['get']['success'], 'schedule': schedule.as_dict}, 200 + content, status = {'msg': S['get']['success'], 'schedule': schedule.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/schedule/update_schedule_controller.py b/tensorhive/controllers/schedule/update_schedule_controller.py index b4c13f11..5df186d4 100644 --- a/tensorhive/controllers/schedule/update_schedule_controller.py +++ b/tensorhive/controllers/schedule/update_schedule_controller.py @@ -1,3 +1,4 @@ +from http import HTTPStatus from datetime import datetime from tensorhive.utils.Weekday import Weekday from tensorhive.authorization import admin_required @@ -10,6 +11,14 @@ G = API.RESPONSES['general'] +def to_db_column(): + return { + 'scheduleDays': 'schedule_days', + 'hourStart': 'hour_start', + 'hourEnd': 'hour_end' + } + + @admin_required def update(id, newValues): new_values = newValues @@ -19,31 +28,27 @@ def update(id, newValues): schedule = RestrictionSchedule.get(id) for field_name, new_value in new_values.items(): - # Mapping API field name to column used by Schedule model if field_name == 'scheduleDays': - field_name = 'schedule_days' - days = [] - for day in new_value: - days.append(Weekday[day]) - new_value = days + new_value = [Weekday[day] for day in new_value] if field_name in ['hourStart', 'hourEnd']: - # hourStart -> hour_start, hourEnd -> hour_end - field_name = 'hour_' + (field_name[4:]).lower() new_value = datetime.strptime(new_value, "%H:%M").time() - assert hasattr(schedule, field_name), 'schedule has no {} column'.format(field_name) + field_name = to_db_column().get(field_name) + assert (field_name is not None) and hasattr(schedule, field_name), \ + 'schedule has no {} field'.format(field_name) setattr(schedule, field_name, new_value) schedule.save() except NoResultFound: - content, status = {'msg': S['not_found']}, 404 + content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value except KeyError: # Invalid day - content, status = {'msg': G['bad_request']}, 422 + content, status = {'msg': G['bad_request']}, HTTPStatus.UNPROCESSABLE_ENTITY.value except AssertionError as e: - content, status = {'msg': S['update']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': S['update']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': S['update']['success'], 'schedule': schedule.as_dict}, 201 + content, status = {'msg': S['update']['success'], 'schedule': schedule.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/task.py b/tensorhive/controllers/task.py index a085d440..c6775c05 100644 --- a/tensorhive/controllers/task.py +++ b/tensorhive/controllers/task.py @@ -26,7 +26,7 @@ In before: some controller MUST have camelCased arguments in order to keep up with API. They are aliased to snake_case immediately inside controller body. -Connexion has this feature under the hood but it does not alsways work as it should (only in simple cases) +Connexion has this feature under the hood but it does not always work as it should (only in simple cases) """ # Typing aliases @@ -125,7 +125,7 @@ def create(task: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_create(task) finally: @@ -141,7 +141,7 @@ def get(id: TaskId) -> Tuple[Content, HttpStatusCode]: except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_get(id) finally: @@ -163,7 +163,7 @@ def get_all(userId: Optional[int], syncAll: Optional[bool]) -> Tuple[Content, Ht except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_get_all(user_id, sync_all) finally: @@ -179,7 +179,7 @@ def update(id: TaskId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCo except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_update(id, newValues) finally: @@ -195,7 +195,7 @@ def destroy(id: TaskId) -> Tuple[Content, HttpStatusCode]: except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_destroy(id) finally: @@ -212,7 +212,7 @@ def spawn(id: TaskId) -> Tuple[Content, HttpStatusCode]: log.error(e) content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_spawn(id) finally: @@ -228,7 +228,7 @@ def terminate(id: TaskId, gracefully: Optional[bool] = True) -> Tuple[Content, H except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_terminate(id, gracefully) finally: @@ -244,7 +244,7 @@ def get_log(id: TaskId, tail: bool) -> Tuple[Content, HttpStatusCode]: except NoResultFound: content, status = {'msg': T['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unpriviliged']}, 403 + content, status = {'msg': G['unprivileged']}, 403 else: content, status = business_get_log(id, tail) finally: @@ -325,6 +325,15 @@ def business_get(id: TaskId) -> Tuple[Content, HttpStatusCode]: return content, status +def to_db_column(): + return { + 'command': 'command', + 'hostname': 'host', + 'spawnAt': 'spawn_at', + 'terminateAt': 'terminate_at' + } + + # TODO What if task is already running: allow for updating command, hostname, etc.? def business_update(id: TaskId, new_values: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: """Updates certain fields of a Task db record, see `allowed_fields`.""" @@ -333,15 +342,11 @@ def business_update(id: TaskId, new_values: Dict[str, Any]) -> Tuple[Content, Ht assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' task = Task.get(id) for field_name, new_value in new_values.items(): - if field_name == 'hostname': - # API client is allowed to use more verbose name here (hostname <=> host) - field_name = 'host' if field_name in {'spawnAt', 'terminateAt'}: - field_name = field_name.replace('At', '_at') new_value = DateUtils.try_parse_string(new_value) - else: - # Check that every other field matches - assert hasattr(task, field_name), 'task has no {} column'.format(field_name) + field_name = to_db_column().get(field_name) + # Check that every field matches + assert (field_name is not None) and hasattr(task, field_name), 'task has no {} field'.format(field_name) setattr(task, field_name, new_value) task.save() except NoResultFound: diff --git a/tensorhive/controllers/user/create_user_controller.py b/tensorhive/controllers/user/create_user_controller.py index facd4f57..722b7f86 100644 --- a/tensorhive/controllers/user/create_user_controller.py +++ b/tensorhive/controllers/user/create_user_controller.py @@ -60,9 +60,9 @@ def ssh_signup(user): try: test_client.connect(auth_node, username=user['username'], pkey=ssh_key) except AuthenticationException: - return {'msg': G['unpriviliged']}, 403 + return {'msg': G['unprivileged']}, 403 except (BadHostKeyException, SSHException, socket.error) as e: - return 'An error ocurred while authenticating: {}'.format(e), 500 + return 'An error occurred while authenticating: {}'.format(e), 500 finally: test_client.close() diff --git a/tensorhive/controllers/user/update_user_controller.py b/tensorhive/controllers/user/update_user_controller.py index 7f85fbd6..fbd6f86e 100644 --- a/tensorhive/controllers/user/update_user_controller.py +++ b/tensorhive/controllers/user/update_user_controller.py @@ -15,9 +15,9 @@ def update(newValues): if user.get('id') is not None: try: found_user = User.get(user['id']) - updateable_field_names = ['username', 'password', 'email'] + updatable_field_names = ['username', 'password', 'email'] - for field_name in updateable_field_names: + for field_name in updatable_field_names: if user.get(field_name) is not None: if field_name == 'roles': new_value = [Role(name=role_name) for role_name in user['roles']] From 18591728d6c8febc96eaa922c37aa219106d7da9 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Wed, 16 Sep 2020 19:29:23 +0200 Subject: [PATCH 028/175] Add isCancelled column to the Reservation model --- ...6e9bb85_add_is_cancelled_column_to_the_.py | 24 +++++++++++++++++++ tensorhive/models/Reservation.py | 14 +++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py diff --git a/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py b/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py new file mode 100644 index 00000000..6df74968 --- /dev/null +++ b/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py @@ -0,0 +1,24 @@ +"""add is_cancelled column to the reservation table + +Revision ID: 06ce06e9bb85 +Revises: 9d12594fe87b +Create Date: 2020-09-16 19:08:28.365494 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '06ce06e9bb85' +down_revision = '9d12594fe87b' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('reservations', sa.Column('is_cancelled', sa.Boolean(), nullable=True)) + + +def downgrade(): + op.drop_column('reservations', 'is_cancelled') diff --git a/tensorhive/models/Reservation.py b/tensorhive/models/Reservation.py index 12b31d16..e8461e2f 100644 --- a/tensorhive/models/Reservation.py +++ b/tensorhive/models/Reservation.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, and_, not_, or_, event +from sqlalchemy import Column, Boolean, Integer, String, DateTime, ForeignKey, and_, not_, or_, event from tensorhive.database import db_session, Base from tensorhive.models.CRUDModel import CRUDModel from tensorhive.utils.DateUtils import DateUtils @@ -24,6 +24,7 @@ class Reservation(CRUDModel, Base): # type: ignore title = Column(String(60), unique=False, nullable=False) description = Column(String(200), nullable=True) protected_resource_id = Column(String(60), nullable=False) + _is_cancelled = Column(Boolean, nullable=True) gpu_util_avg = Column(Integer, nullable=True) mem_util_avg = Column(Integer, nullable=True) @@ -75,6 +76,14 @@ def ends_at(self, value): if not self._ends_at: log.error('Unsupported type (ends_at={})'.format(value)) + @hybrid_property + def is_cancelled(self): + return self._is_cancelled is not None and self._is_cancelled + + @is_cancelled.setter # type: ignore + def is_cancelled(self, value): + self._is_cancelled = value + @classmethod def current_events(cls): '''Returns only those events that should be currently respected by users''' @@ -144,5 +153,6 @@ def as_dict(self): 'memUtilAvg': self.mem_util_avg, 'start': DateUtils.parse_datetime(self.starts_at), 'end': DateUtils.parse_datetime(self.ends_at), - 'createdAt': DateUtils.parse_datetime(self.created_at) + 'createdAt': DateUtils.parse_datetime(self.created_at), + 'isCancelled': str(self.is_cancelled) } From 17ae1865d5b155f34e297943cba62c65cd38be89 Mon Sep 17 00:00:00 2001 From: mateusz Date: Wed, 16 Sep 2020 19:17:21 +0200 Subject: [PATCH 029/175] Marge into one file all controllers related to one entity (e.g. Group), remove unused get_summary_controller.py, add annotations to controllers --- tensorhive/api/api_specification.yml | 94 ++-- tensorhive/controllers/group.py | 162 +++++++ tensorhive/controllers/group/__init__.py | 0 .../group/add_to_group_controller.py | 38 -- .../group/create_group_controller.py | 29 -- .../group/delete_group_controller.py | 24 -- .../controllers/group/get_group_controller.py | 32 -- .../group/remove_from_group_controller.py | 38 -- .../group/update_group_controller.py | 35 -- .../{nodes/gpu_controller.py => nodes.py} | 74 +++- tensorhive/controllers/nodes/__init__.py | 0 .../controllers/nodes/cpu_controller.py | 26 -- .../nodes/infrastructure_controller.py | 40 -- tensorhive/controllers/reservation.py | 157 +++++++ .../controllers/reservation/__init__.py | 0 .../create_reservation_controller.py | 34 -- .../delete_reservation_controller.py | 39 -- .../reservation/get_reservation_controller.py | 53 --- .../reservation/get_summary_controller.py | 13 - .../update_reservation_controller.py | 45 -- ...get_resource_controller.py => resource.py} | 27 +- tensorhive/controllers/restriction.py | 400 ++++++++++++++++++ .../controllers/restriction/__init__.py | 0 .../add_to_restriction_controller.py | 130 ------ .../create_restriction_controller.py | 33 -- .../delete_restriction_controller.py | 24 -- .../restriction/get_restriction_controller.py | 73 ---- .../restriction/remove_from_restriction.py | 130 ------ .../update_restriction_controller.py | 48 --- tensorhive/controllers/schedule.py | 132 ++++++ tensorhive/controllers/schedule/__init__.py | 0 .../schedule/create_schedule_controller.py | 38 -- .../schedule/delete_schedule_controller.py | 24 -- .../schedule/get_schedule_controller.py | 32 -- .../schedule/update_schedule_controller.py | 54 --- tensorhive/controllers/task.py | 122 +++--- tensorhive/controllers/user.py | 226 ++++++++++ tensorhive/controllers/user/__init__.py | 0 .../user/create_user_controller.py | 74 ---- .../user/delete_user_controller.py | 33 -- .../controllers/user/get_users_controller.py | 32 -- .../controllers/user/login_user_controller.py | 31 -- .../user/logout_user_controller.py | 35 -- .../user/refresh_access_token_controller.py | 18 - .../user/update_user_controller.py | 42 -- 45 files changed, 1271 insertions(+), 1420 deletions(-) create mode 100644 tensorhive/controllers/group.py delete mode 100644 tensorhive/controllers/group/__init__.py delete mode 100644 tensorhive/controllers/group/add_to_group_controller.py delete mode 100644 tensorhive/controllers/group/create_group_controller.py delete mode 100644 tensorhive/controllers/group/delete_group_controller.py delete mode 100644 tensorhive/controllers/group/get_group_controller.py delete mode 100644 tensorhive/controllers/group/remove_from_group_controller.py delete mode 100644 tensorhive/controllers/group/update_group_controller.py rename tensorhive/controllers/{nodes/gpu_controller.py => nodes.py} (51%) delete mode 100644 tensorhive/controllers/nodes/__init__.py delete mode 100644 tensorhive/controllers/nodes/cpu_controller.py delete mode 100644 tensorhive/controllers/nodes/infrastructure_controller.py create mode 100644 tensorhive/controllers/reservation.py delete mode 100644 tensorhive/controllers/reservation/__init__.py delete mode 100644 tensorhive/controllers/reservation/create_reservation_controller.py delete mode 100644 tensorhive/controllers/reservation/delete_reservation_controller.py delete mode 100644 tensorhive/controllers/reservation/get_reservation_controller.py delete mode 100644 tensorhive/controllers/reservation/get_summary_controller.py delete mode 100644 tensorhive/controllers/reservation/update_reservation_controller.py rename tensorhive/controllers/{resource/get_resource_controller.py => resource.py} (50%) create mode 100644 tensorhive/controllers/restriction.py delete mode 100644 tensorhive/controllers/restriction/__init__.py delete mode 100644 tensorhive/controllers/restriction/add_to_restriction_controller.py delete mode 100644 tensorhive/controllers/restriction/create_restriction_controller.py delete mode 100644 tensorhive/controllers/restriction/delete_restriction_controller.py delete mode 100644 tensorhive/controllers/restriction/get_restriction_controller.py delete mode 100644 tensorhive/controllers/restriction/remove_from_restriction.py delete mode 100644 tensorhive/controllers/restriction/update_restriction_controller.py create mode 100644 tensorhive/controllers/schedule.py delete mode 100644 tensorhive/controllers/schedule/__init__.py delete mode 100644 tensorhive/controllers/schedule/create_schedule_controller.py delete mode 100644 tensorhive/controllers/schedule/delete_schedule_controller.py delete mode 100644 tensorhive/controllers/schedule/get_schedule_controller.py delete mode 100644 tensorhive/controllers/schedule/update_schedule_controller.py create mode 100644 tensorhive/controllers/user.py delete mode 100644 tensorhive/controllers/user/__init__.py delete mode 100644 tensorhive/controllers/user/create_user_controller.py delete mode 100644 tensorhive/controllers/user/delete_user_controller.py delete mode 100644 tensorhive/controllers/user/get_users_controller.py delete mode 100644 tensorhive/controllers/user/login_user_controller.py delete mode 100644 tensorhive/controllers/user/logout_user_controller.py delete mode 100644 tensorhive/controllers/user/refresh_access_token_controller.py delete mode 100644 tensorhive/controllers/user/update_user_controller.py diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 34ad4c49..c4eb1d63 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -13,7 +13,7 @@ paths: tags: - users summary: Get all users - operationId: tensorhive.controllers.user.get_users_controller.get + operationId: tensorhive.controllers.user.get responses: 200: description: {{RESPONSES['general']['success']}} @@ -44,7 +44,7 @@ paths: tags: - users summary: Get user with given ID - operationId: tensorhive.controllers.user.get_users_controller.get_by_id + operationId: tensorhive.controllers.user.get_by_id parameters: - description: User ID in: path @@ -98,7 +98,7 @@ paths: tags: - users summary: Create new user - operationId: tensorhive.controllers.user.create_user_controller.create + operationId: tensorhive.controllers.user.create requestBody: description: User object required: true @@ -147,7 +147,7 @@ paths: tags: - users summary: Update existing user - operationId: tensorhive.controllers.user.update_user_controller.update + operationId: tensorhive.controllers.user.update requestBody: description: User object required: true @@ -196,7 +196,7 @@ paths: tags: - users summary: Create new user account based on SSH authentication - operationId: tensorhive.controllers.user.create_user_controller.ssh_signup + operationId: tensorhive.controllers.user.ssh_signup requestBody: description: User object required: true @@ -235,7 +235,7 @@ paths: tags: - users summary: Delete user - operationId: tensorhive.controllers.user.delete_user_controller.delete + operationId: tensorhive.controllers.user.delete parameters: - description: User ID in: path @@ -276,7 +276,7 @@ paths: tags: - authentication summary: Logout user using access token - operationId: tensorhive.controllers.user.logout_user_controller.logout_with_access_token + operationId: tensorhive.controllers.user.logout_with_access_token responses: 200: description: {{RESPONSES['user']['logout']['success']}} @@ -298,7 +298,7 @@ paths: tags: - authentication summary: Logout user using refresh token - operationId: tensorhive.controllers.user.logout_user_controller.logout_with_refresh_token + operationId: tensorhive.controllers.user.logout_with_refresh_token responses: 200: description: {{RESPONSES['user']['logout']['success']}} @@ -320,7 +320,7 @@ paths: tags: - authentication summary: Generate new access token using refresh token - operationId: tensorhive.controllers.user.refresh_access_token_controller.generate + operationId: tensorhive.controllers.user.generate responses: 200: description: {{RESPONSES['token']['refresh']['success']}} @@ -341,7 +341,7 @@ paths: tags: - authentication summary: Login user - operationId: tensorhive.controllers.user.login_user_controller.login + operationId: tensorhive.controllers.user.login requestBody: description: User object required: true @@ -375,7 +375,7 @@ paths: tags: - authentication summary: Get TensorHive public SSH key record for authorized_keys - operationId: tensorhive.controllers.user.create_user_controller.authorized_keys_entry + operationId: tensorhive.controllers.user.authorized_keys_entry responses: 200: description: {{RESPONSES['user']['authorized_keys_entry']['success']}} @@ -390,7 +390,7 @@ paths: tags: - groups summary: Get all groups - operationId: tensorhive.controllers.group.get_group_controller.get + operationId: tensorhive.controllers.group.get responses: 200: description: {{RESPONSES['general']['success']}} @@ -420,7 +420,7 @@ paths: tags: - groups summary: Create new group - operationId: tensorhive.controllers.group.create_group_controller.create + operationId: tensorhive.controllers.group.create requestBody: description: Group object required: true @@ -467,7 +467,7 @@ paths: tags: - groups summary: Get group with given ID - operationId: tensorhive.controllers.group.get_group_controller.get_by_id + operationId: tensorhive.controllers.group.get_by_id parameters: - description: Group ID in: path @@ -510,7 +510,7 @@ paths: tags: - groups summary: Update existing group - operationId: tensorhive.controllers.group.update_group_controller.update + operationId: tensorhive.controllers.group.update requestBody: description: Group object with fields to overwrite. required: true @@ -565,7 +565,7 @@ paths: tags: - groups summary: Delete group - operationId: tensorhive.controllers.group.delete_group_controller.delete + operationId: tensorhive.controllers.group.delete parameters: - description: Group ID in: path @@ -606,7 +606,7 @@ paths: tags: - groups summary: Add user to group - operationId: tensorhive.controllers.group.add_to_group_controller.add_user + operationId: tensorhive.controllers.group.add_user parameters: - description: Group ID in: path @@ -661,7 +661,7 @@ paths: tags: - groups summary: Remove user from group - operationId: tensorhive.controllers.group.remove_from_group_controller.remove_user + operationId: tensorhive.controllers.group.remove_user parameters: - description: Group ID in: path @@ -715,7 +715,7 @@ paths: tags: - restrictions summary: Get all or specific restrictions - operationId: tensorhive.controllers.restriction.get_restriction_controller.get + operationId: tensorhive.controllers.restriction.get parameters: - description: User id in: query @@ -780,7 +780,7 @@ paths: tags: - restrictions summary: Create new restriction - operationId: tensorhive.controllers.restriction.create_restriction_controller.create + operationId: tensorhive.controllers.restriction.create requestBody: description: Restriction object required: true @@ -827,7 +827,7 @@ paths: tags: - restrictions summary: Update existing restriction - operationId: tensorhive.controllers.restriction.update_restriction_controller.update + operationId: tensorhive.controllers.restriction.update requestBody: description: Restriction object with fields to overwrite. required: true @@ -882,7 +882,7 @@ paths: tags: - restrictions summary: Delete restriction - operationId: tensorhive.controllers.restriction.delete_restriction_controller.delete + operationId: tensorhive.controllers.restriction.delete parameters: - description: Restriction ID in: path @@ -923,7 +923,7 @@ paths: tags: - restrictions summary: Apply restriction to user - operationId: tensorhive.controllers.restriction.add_to_restriction_controller.apply_to_user + operationId: tensorhive.controllers.restriction.apply_to_user parameters: - description: Restriction ID in: path @@ -978,7 +978,7 @@ paths: tags: - restrictions summary: Remove restriction from user - operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_from_user + operationId: tensorhive.controllers.restriction.remove_from_user parameters: - description: Restriction ID in: path @@ -1032,7 +1032,7 @@ paths: tags: - restrictions summary: Apply restriction to group - operationId: tensorhive.controllers.restriction.add_to_restriction_controller.apply_to_group + operationId: tensorhive.controllers.restriction.apply_to_group parameters: - description: Restriction ID in: path @@ -1087,7 +1087,7 @@ paths: tags: - restrictions summary: Remove restriction from group - operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_from_group + operationId: tensorhive.controllers.restriction.remove_from_group parameters: - description: Restriction ID in: path @@ -1141,7 +1141,7 @@ paths: tags: - restrictions summary: Apply restriction to resource - operationId: tensorhive.controllers.restriction.add_to_restriction_controller.apply_to_resource + operationId: tensorhive.controllers.restriction.apply_to_resource parameters: - description: Restriction ID in: path @@ -1196,7 +1196,7 @@ paths: tags: - restrictions summary: Remove restriction from resource - operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_from_resource + operationId: tensorhive.controllers.restriction.remove_from_resource parameters: - description: Restriction ID in: path @@ -1250,7 +1250,7 @@ paths: tags: - restrictions summary: Add schedule to restriction - operationId: tensorhive.controllers.restriction.add_to_restriction_controller.add_schedule + operationId: tensorhive.controllers.restriction.add_schedule parameters: - description: Restriction ID in: path @@ -1305,7 +1305,7 @@ paths: tags: - restrictions summary: Remove schedule from restriction - operationId: tensorhive.controllers.restriction.remove_from_restriction.remove_schedule + operationId: tensorhive.controllers.restriction.remove_schedule parameters: - description: Restriction ID in: path @@ -1359,7 +1359,7 @@ paths: tags: - schedules summary: Get all schedules - operationId: tensorhive.controllers.schedule.get_schedule_controller.get + operationId: tensorhive.controllers.schedule.get responses: 200: description: {{RESPONSES['general']['success']}} @@ -1389,7 +1389,7 @@ paths: tags: - schedules summary: Create new restriction schedule - operationId: tensorhive.controllers.schedule.create_schedule_controller.create + operationId: tensorhive.controllers.schedule.create requestBody: description: Schedule object required: true @@ -1436,7 +1436,7 @@ paths: tags: - schedules summary: Get schedule with given ID - operationId: tensorhive.controllers.schedule.get_schedule_controller.get_by_id + operationId: tensorhive.controllers.schedule.get_by_id parameters: - description: Schedule ID in: path @@ -1479,7 +1479,7 @@ paths: tags: - schedules summary: Update existing schedule - operationId: tensorhive.controllers.schedule.update_schedule_controller.update + operationId: tensorhive.controllers.schedule.update requestBody: description: Schedule object with fields to overwrite. required: true @@ -1534,7 +1534,7 @@ paths: tags: - schedules summary: Delete schedule - operationId: tensorhive.controllers.schedule.delete_schedule_controller.delete + operationId: tensorhive.controllers.schedule.delete parameters: - description: Schedule ID in: path @@ -1575,7 +1575,7 @@ paths: tags: - reservations summary: Get all or specific reservation events - operationId: tensorhive.controllers.reservation.get_reservation_controller.get + operationId: tensorhive.controllers.reservation.get parameters: - description: Array of uuids in: query @@ -1622,7 +1622,7 @@ paths: tags: - reservations summary: Make new reservation - operationId: tensorhive.controllers.reservation.create_reservation_controller.create + operationId: tensorhive.controllers.reservation.create requestBody: description: Reservation object required: true @@ -1659,7 +1659,7 @@ paths: tags: - reservations summary: Update existing reservation - operationId: tensorhive.controllers.reservation.update_reservation_controller.update + operationId: tensorhive.controllers.reservation.update requestBody: description: Reservation object with fields to overwrite. required: true @@ -1704,7 +1704,7 @@ paths: tags: - reservations summary: Delete reservation - operationId: tensorhive.controllers.reservation.delete_reservation_controller.delete + operationId: tensorhive.controllers.reservation.delete parameters: - description: Reservation ID in: path @@ -1735,7 +1735,7 @@ paths: tags: - resources summary: Get all resources - operationId: tensorhive.controllers.resource.get_resource_controller.get + operationId: tensorhive.controllers.resource.get responses: 200: description: {{RESPONSES['general']['success']}} @@ -1766,7 +1766,7 @@ paths: tags: - resources summary: Get resource with given UUID - operationId: tensorhive.controllers.resource.get_resource_controller.get_by_id + operationId: tensorhive.controllers.resource.get_by_id parameters: - description: Resource UUID in: path @@ -1810,7 +1810,7 @@ paths: tags: - nodes summary: Get all hostnames - operationId: tensorhive.controllers.nodes.infrastructure_controller.get_hostnames + operationId: tensorhive.controllers.nodes.get_hostnames responses: 200: description: {{RESPONSES['general']['ok']}} @@ -1832,7 +1832,7 @@ paths: - nodes summary: Get each node's all metric data description: Puts null if some data is unavailable - operationId: tensorhive.controllers.nodes.infrastructure_controller.get_all_data + operationId: tensorhive.controllers.nodes.get_all_data responses: 200: description: {{RESPONSES['general']['ok']}} @@ -1851,7 +1851,7 @@ paths: tags: - nodes summary: Get node's basic GPU information - operationId: tensorhive.controllers.nodes.gpu_controller.get_info + operationId: tensorhive.controllers.nodes.get_gpu_info parameters: - $ref: '#/components/parameters/hostnameParam' responses: @@ -1875,7 +1875,7 @@ paths: - nodes summary: Get node's GPU metric data description: Puts null if some data is unavailable - operationId: tensorhive.controllers.nodes.gpu_controller.get_metrics + operationId: tensorhive.controllers.nodes.get_gpu_metrics parameters: - $ref: '#/components/parameters/hostnameParam' - $ref: '#/components/parameters/gpuMetricTypeQuery' @@ -1900,7 +1900,7 @@ paths: - nodes summary: Get node's CPU metric data description: Puts null if some data is unavailable - operationId: tensorhive.controllers.nodes.cpu_controller.get_metrics + operationId: tensorhive.controllers.nodes.get_cpu_metrics parameters: - $ref: '#/components/parameters/hostnameParam' - $ref: '#/components/parameters/cpuMetricTypeQuery' @@ -1925,7 +1925,7 @@ paths: - nodes summary: Get node's GPU processes data description: Puts null if some data is unavailable - operationId: tensorhive.controllers.nodes.gpu_controller.get_processes + operationId: tensorhive.controllers.nodes.get_gpu_processes parameters: - $ref: '#/components/parameters/hostnameParam' responses: diff --git a/tensorhive/controllers/group.py b/tensorhive/controllers/group.py new file mode 100644 index 00000000..d6057545 --- /dev/null +++ b/tensorhive/controllers/group.py @@ -0,0 +1,162 @@ +import logging +from http import HTTPStatus +from typing import Any, Dict, List, Tuple +from flask_jwt_extended import jwt_required +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.authorization import admin_required +from tensorhive.config import API +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException +from tensorhive.models.Group import Group +from tensorhive.models.User import User + +log = logging.getLogger(__name__) +GROUP = API.RESPONSES['group'] +USER = API.RESPONSES['user'] +GENERAL = API.RESPONSES['general'] + +# Typing aliases +Content = Dict[str, Any] +HttpStatusCode = int +GroupId = int +UserId = int + + +@jwt_required +def get() -> Tuple[List[Any], HttpStatusCode]: + return [ + group.as_dict for group in Group.all() + ], HTTPStatus.OK.value + + +@jwt_required +def get_by_id(id: GroupId) -> Tuple[Content, HttpStatusCode]: + try: + group = Group.get(id) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': GROUP['get']['success'], 'group': group.as_dict}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def create(group: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + try: + new_group = Group( + name=group['name'] + ) + new_group.save() + except AssertionError as e: + content = {'msg': GROUP['create']['failure']['invalid'].format(reason=e)} + status = HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + content = {'msg': GENERAL['internal_error'] + str(e)} + status = HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content = { + 'msg': GROUP['create']['success'], + 'group': new_group.as_dict + } + status = HTTPStatus.CREATED.value + finally: + return content, status + + +@admin_required +def update(id: GroupId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + new_values = newValues + allowed_fields = {'name'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + group = Group.get(id) + + for field_name, new_value in new_values.items(): + assert hasattr(group, field_name), 'group has no {} field'.format(field_name) + setattr(group, field_name, new_value) + group.save() + except NoResultFound: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': GROUP['update']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': GROUP['update']['success'], 'group': group.as_dict}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def delete(id: GroupId) -> Tuple[Content, HttpStatusCode]: + try: + group_to_destroy = Group.get(id) + group_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value + except NoResultFound: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + except Exception as e: + content, status = {'msg': GENERAL['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': GROUP['delete']['success']}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def add_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatusCode]: + group = None + try: + group = Group.get(group_id) + user = User.get(user_id) + group.add_user(user) + except NoResultFound: + if group is None: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': USER['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': GROUP['users']['add']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + except AssertionError as e: + content, status = {'msg': GROUP['users']['add']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': GROUP['users']['add']['success'], 'group': group.as_dict}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def remove_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatusCode]: + group = None + try: + group = Group.get(group_id) + user = User.get(user_id) + group.remove_user(user) + except NoResultFound: + if group is None: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': USER['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': GROUP['users']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': GROUP['users']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': GROUP['users']['remove']['success'], 'group': group.as_dict}, HTTPStatus.OK.value + finally: + return content, status diff --git a/tensorhive/controllers/group/__init__.py b/tensorhive/controllers/group/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tensorhive/controllers/group/add_to_group_controller.py b/tensorhive/controllers/group/add_to_group_controller.py deleted file mode 100644 index b34619f3..00000000 --- a/tensorhive/controllers/group/add_to_group_controller.py +++ /dev/null @@ -1,38 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.exceptions.InvalidRequestException import InvalidRequestException -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.models.Group import Group -from tensorhive.models.User import User -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -GROUP = API.RESPONSES['group'] -U = API.RESPONSES['user'] -G = API.RESPONSES['general'] - - -@admin_required -def add_user(group_id, user_id): - group = None - try: - group = Group.get(group_id) - user = User.get(user_id) - group.add_user(user) - except NoResultFound: - if group is None: - content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': GROUP['users']['add']['failure']['duplicate']}, HTTPStatus.CONFLICT.value - except AssertionError as e: - content, status = {'msg': GROUP['users']['add']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': GROUP['users']['add']['success'], 'group': group.as_dict}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/group/create_group_controller.py b/tensorhive/controllers/group/create_group_controller.py deleted file mode 100644 index 02e97905..00000000 --- a/tensorhive/controllers/group/create_group_controller.py +++ /dev/null @@ -1,29 +0,0 @@ -from http import HTTPStatus -from tensorhive.models.Group import Group -from tensorhive.authorization import admin_required -from tensorhive.config import API -GROUP = API.RESPONSES['group'] -G = API.RESPONSES['general'] - - -@admin_required -def create(group): - try: - new_group = Group( - name=group['name'] - ) - new_group.save() - except AssertionError as e: - content = {'msg': GROUP['create']['failure']['invalid'].format(reason=e)} - status = HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - content = {'msg': G['internal_error'] + str(e)} - status = HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content = { - 'msg': GROUP['create']['success'], - 'group': new_group.as_dict - } - status = HTTPStatus.CREATED.value - finally: - return content, status diff --git a/tensorhive/controllers/group/delete_group_controller.py b/tensorhive/controllers/group/delete_group_controller.py deleted file mode 100644 index bd22a412..00000000 --- a/tensorhive/controllers/group/delete_group_controller.py +++ /dev/null @@ -1,24 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.models.Group import Group -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -GROUP = API.RESPONSES['group'] -G = API.RESPONSES['general'] - - -@admin_required -def delete(id): - try: - group_to_destroy = Group.get(id) - group_to_destroy.destroy() - except AssertionError as error_message: - content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value - except NoResultFound: - content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value - except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': GROUP['delete']['success']}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/group/get_group_controller.py b/tensorhive/controllers/group/get_group_controller.py deleted file mode 100644 index 280cb0fe..00000000 --- a/tensorhive/controllers/group/get_group_controller.py +++ /dev/null @@ -1,32 +0,0 @@ -from http import HTTPStatus -from flask_jwt_extended import jwt_required -from tensorhive.models.Group import Group -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -GROUP = API.RESPONSES['group'] -G = API.RESPONSES['general'] - - -@jwt_required -def get(): - return [ - group.as_dict for group in Group.all() - ], HTTPStatus.OK.value - - -@jwt_required -def get_by_id(id): - try: - group = Group.get(id) - except NoResultFound as e: - log.warning(e) - content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': GROUP['get']['success'], 'group': group.as_dict}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/group/remove_from_group_controller.py b/tensorhive/controllers/group/remove_from_group_controller.py deleted file mode 100644 index c6ca62dc..00000000 --- a/tensorhive/controllers/group/remove_from_group_controller.py +++ /dev/null @@ -1,38 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.exceptions.InvalidRequestException import InvalidRequestException -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.models.Group import Group -from tensorhive.models.User import User -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -GROUP = API.RESPONSES['group'] -U = API.RESPONSES['user'] -G = API.RESPONSES['general'] - - -@admin_required -def remove_user(group_id, user_id): - group = None - try: - group = Group.get(group_id) - user = User.get(user_id) - group.remove_user(user) - except NoResultFound: - if group is None: - content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': GROUP['users']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': GROUP['users']['remove']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': GROUP['users']['remove']['success'], 'group': group.as_dict}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/group/update_group_controller.py b/tensorhive/controllers/group/update_group_controller.py deleted file mode 100644 index c178331b..00000000 --- a/tensorhive/controllers/group/update_group_controller.py +++ /dev/null @@ -1,35 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.models.Group import Group -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -GROUP = API.RESPONSES['group'] -G = API.RESPONSES['general'] - - -@admin_required -def update(id, newValues): - new_values = newValues - allowed_fields = {'name'} - try: - assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' - group = Group.get(id) - - for field_name, new_value in new_values.items(): - assert hasattr(group, field_name), 'group has no {} field'.format(field_name) - setattr(group, field_name, new_value) - group.save() - except NoResultFound: - content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': GROUP['update']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': GROUP['update']['success'], 'group': group.as_dict}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/nodes/gpu_controller.py b/tensorhive/controllers/nodes.py similarity index 51% rename from tensorhive/controllers/nodes/gpu_controller.py rename to tensorhive/controllers/nodes.py index ef868add..c4c7a8c1 100644 --- a/tensorhive/controllers/nodes/gpu_controller.py +++ b/tensorhive/controllers/nodes.py @@ -1,12 +1,74 @@ -from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure from connexion import NoContent from flask_jwt_extended import jwt_required from tensorhive.config import API -R = API.RESPONSES['nodes'] +from tensorhive.core.managers.TensorHiveManager import TensorHiveManager +from tensorhive.models.Resource import Resource + +NODES = API.RESPONSES['nodes'] + + +def get_infrastructure(): + infrastructure = TensorHiveManager().infrastructure_manager.infrastructure + + # Try to save gpu resource to database + try: + resources = Resource.all() + id_list = [resource.id for resource in resources] + for hostname, value in infrastructure.items(): + gpu_list = value.get('GPU') + if gpu_list is not None: + for gpu_uuid, gpu_metrics in gpu_list.items(): + if gpu_uuid not in id_list: + new_resource = Resource( + id=gpu_uuid, + name=gpu_metrics.get('name') + ) + new_resource.save() + except Exception: + # In case of failure just return infrastructure + pass + + return infrastructure + + +@jwt_required +def get_all_data(): + infrastructure = get_infrastructure() + return infrastructure, 200 + + +@jwt_required +def get_hostnames(): + infrastructure = get_infrastructure() + hostnames = infrastructure.keys() + return list(hostnames), 200 + + +@jwt_required +def get_cpu_metrics(hostname: str, metric_type: str = None): + try: + infrastructure = get_infrastructure() + resource_data = infrastructure[hostname]['CPU'] + + # No data about GPU + assert resource_data + + if metric_type is None: + # Put all gathered metric data for each GPU + result = {uuid: cpu_data['metrics'] for uuid, cpu_data in resource_data.items()} + else: + # Put only requested metric data for each GPU + result = {uuid: gpu_data['metrics'][metric_type] for uuid, gpu_data in resource_data.items()} + except (KeyError, AssertionError): + content, status = NoContent, 404 + else: + content, status = result, 200 + finally: + return content, status @jwt_required -def get_metrics(hostname: str, metric_type: str = None): +def get_gpu_metrics(hostname: str, metric_type: str = None): try: infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['GPU'] @@ -45,7 +107,7 @@ def get_metrics(hostname: str, metric_type: str = None): # @jwt_required -def get_processes(hostname: str): +def get_gpu_processes(hostname: str): try: infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['GPU'] @@ -58,7 +120,7 @@ def get_processes(hostname: str): @jwt_required -def get_info(hostname: str): +def get_gpu_info(hostname: str): try: infrastructure = get_infrastructure() resource_data = infrastructure[hostname]['GPU'] @@ -73,7 +135,7 @@ def basic_info(full_dict): status = 200 except KeyError: # TODO Theoretically possible that ['GPU'] can trigger this exception - content = {'msg': R['hostname']['not_found']} + content = {'msg': NODES['hostname']['not_found']} status = 404 finally: return content, status diff --git a/tensorhive/controllers/nodes/__init__.py b/tensorhive/controllers/nodes/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tensorhive/controllers/nodes/cpu_controller.py b/tensorhive/controllers/nodes/cpu_controller.py deleted file mode 100644 index 39dcda09..00000000 --- a/tensorhive/controllers/nodes/cpu_controller.py +++ /dev/null @@ -1,26 +0,0 @@ -from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure -from connexion import NoContent -from flask_jwt_extended import jwt_required - - -@jwt_required -def get_metrics(hostname: str, metric_type: str = None): - try: - infrastructure = get_infrastructure() - resource_data = infrastructure[hostname]['CPU'] - - # No data about GPU - assert resource_data - - if metric_type is None: - # Put all gathered metric data for each GPU - result = {uuid: cpu_data['metrics'] for uuid, cpu_data in resource_data.items()} - else: - # Put only requested metric data for each GPU - result = {uuid: gpu_data['metrics'][metric_type] for uuid, gpu_data in resource_data.items()} - except (KeyError, AssertionError): - content, status = NoContent, 404 - else: - content, status = result, 200 - finally: - return content, status diff --git a/tensorhive/controllers/nodes/infrastructure_controller.py b/tensorhive/controllers/nodes/infrastructure_controller.py deleted file mode 100644 index 2f875aec..00000000 --- a/tensorhive/controllers/nodes/infrastructure_controller.py +++ /dev/null @@ -1,40 +0,0 @@ -from tensorhive.core.managers.TensorHiveManager import TensorHiveManager -from flask_jwt_extended import jwt_required -from tensorhive.models.Resource import Resource - - -def get_infrastructure(): - infrastructure = TensorHiveManager().infrastructure_manager.infrastructure - - # Try to save gpu resource to database - try: - resources = Resource.all() - id_list = [resource.id for resource in resources] - for hostname, value in infrastructure.items(): - gpu_list = value.get('GPU') - if gpu_list is not None: - for gpu_uuid, gpu_metrics in gpu_list.items(): - if gpu_uuid not in id_list: - new_resource = Resource( - id=gpu_uuid, - name=gpu_metrics.get('name') - ) - new_resource.save() - except Exception: - # In case of failure just return infrastructure - pass - - return infrastructure - - -@jwt_required -def get_all_data(): - infrastructure = get_infrastructure() - return infrastructure, 200 - - -@jwt_required -def get_hostnames(): - infrastructure = get_infrastructure() - hostnames = infrastructure.keys() - return list(hostnames), 200 diff --git a/tensorhive/controllers/reservation.py b/tensorhive/controllers/reservation.py new file mode 100644 index 00000000..3399ebe4 --- /dev/null +++ b/tensorhive/controllers/reservation.py @@ -0,0 +1,157 @@ +import logging +from typing import Any, Dict, List, Optional, Tuple, Union +from flask_jwt_extended import get_jwt_claims, get_jwt_identity, jwt_required +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.config import API +from tensorhive.models.Reservation import Reservation +from tensorhive.utils.DateUtils import DateUtils + +log = logging.getLogger(__name__) +RESERVATION = API.RESPONSES['reservation'] +GENERAL = API.RESPONSES['general'] + +# Typing aliases +Content = Dict[str, Any] +HttpStatusCode = int +ReservationId = int +ResourceId = str + + +def get_all() -> Tuple[List[Any], HttpStatusCode]: + return [ + reservation.as_dict for reservation in Reservation.all() + ], 200 + + +def get_selected(resources_ids: Optional[List[ResourceId]] = None, start: Optional[str] = None, + end: Optional[str] = None) -> Tuple[Union[List[Any], Content], HttpStatusCode]: + # TODO This may need a decent refactor - give more freedom + # All args are required at once, otherwise return 400 + all_not_none = resources_ids and start and end + if all_not_none: + try: + start_as_datetime = DateUtils.parse_string(start) + ends_as_datetime = DateUtils.parse_string(end) + matches = list(Reservation.filter_by_uuids_and_time_range( + resources_ids, start_as_datetime, ends_as_datetime)) + matches = [match.as_dict for match in matches] + except (ValueError, AssertionError) as reason: + content = {'msg': '{}. {}'.format(GENERAL['bad_request'], reason)} + status = 400 + except Exception: + content = {'msg': GENERAL['internal_error']} + status = 500 + else: + content = matches # type: ignore + status = 200 + else: + content = {'msg': GENERAL['bad_request']} + status = 400 + return content, status + + +@jwt_required +def get(resources_ids: Optional[List[ResourceId]] = None, start: Optional[str] = None, end: Optional[str] = None) \ + -> Tuple[Union[List[Any], Content], HttpStatusCode]: + args = [resources_ids, start, end] + all_args_none = all(a is None for a in args) + + if all_args_none: + return get_all() + else: + # Filter reservations + return get_selected(resources_ids, start, end) + + +@jwt_required +def create(reservation: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + try: + new_reservation = Reservation( + title=reservation['title'], + description=reservation['description'], + protected_resource_id=reservation['resourceId'], + user_id=reservation['userId'], + starts_at=reservation['start'], + ends_at=reservation['end'] + ) + new_reservation.save() + except AssertionError as e: + content = {'msg': RESERVATION['create']['failure']['invalid'].format(reason=e)} + status = 422 + except Exception: + content = {'msg': GENERAL['internal_error']} + status = 500 + else: + content = { + 'msg': RESERVATION['create']['success'], + 'reservation': new_reservation.as_dict + } + status = 201 + finally: + return content, status + + +def to_db_column() -> Dict[str, str]: + return { + 'title': 'title', + 'description': 'description', + 'resourceId': 'protected_resource_id', + 'start': 'starts_at', + 'end': 'ends_at', + } + + +@jwt_required +def update(id: ReservationId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + new_values = newValues + allowed_fields = {'title', 'description', 'resourceId', 'start', 'end'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + reservation = Reservation.get(id) + + for field_name, new_value in new_values.items(): + field_name = to_db_column().get(field_name) + assert (field_name is not None) and hasattr(reservation, field_name), \ + 'reservation has no {} field'.format(field_name) + setattr(reservation, field_name, new_value) + reservation.save() + except NoResultFound: + content, status = {'msg': RESERVATION['not_found']}, 404 + except AssertionError as e: + content, status = {'msg': RESERVATION['update']['failure']['assertions'].format(reason=e)}, 422 + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, 500 + else: + content, status = {'msg': RESERVATION['update']['success'], 'reservation': reservation.as_dict}, 201 + finally: + return content, status + + +@jwt_required +def delete(id: ReservationId) -> Tuple[Content, HttpStatusCode]: + try: + current_user_id = get_jwt_identity() + claims = get_jwt_claims() + + # Fetch the reservation + reservation_to_destroy = Reservation.get(id) + + # Must be privileged + is_admin = 'admin' in claims['roles'] + is_owner = reservation_to_destroy.user_id == current_user_id + assert is_owner or is_admin, GENERAL['unprivileged'] + + # Destroy + reservation_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, 403 + except NoResultFound: + # FIXME It is theoretically possible that User.get() could also raise this exception + content, status = {'msg': RESERVATION['not_found']}, 404 + except Exception as e: + content, status = {'msg': GENERAL['internal_error'] + str(e)}, 500 + else: + content, status = {'msg': RESERVATION['delete']['success']}, 200 + finally: + return content, status diff --git a/tensorhive/controllers/reservation/__init__.py b/tensorhive/controllers/reservation/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tensorhive/controllers/reservation/create_reservation_controller.py b/tensorhive/controllers/reservation/create_reservation_controller.py deleted file mode 100644 index dfd4483d..00000000 --- a/tensorhive/controllers/reservation/create_reservation_controller.py +++ /dev/null @@ -1,34 +0,0 @@ -from tensorhive.models.Reservation import Reservation -from flask_jwt_extended import jwt_required -# from tensorhive.database import flask_app -from tensorhive.config import API -R = API.RESPONSES['reservation'] -G = API.RESPONSES['general'] - - -@jwt_required -def create(reservation): - try: - new_reservation = Reservation( - title=reservation['title'], - description=reservation['description'], - protected_resource_id=reservation['resourceId'], - user_id=reservation['userId'], - starts_at=reservation['start'], - ends_at=reservation['end'] - ) - new_reservation.save() - except AssertionError as e: - content = {'msg': R['create']['failure']['invalid'].format(reason=e)} - status = 422 - except Exception: - content = {'msg': G['internal_error']} - status = 500 - else: - content = { - 'msg': R['create']['success'], - 'reservation': new_reservation.as_dict - } - status = 201 - finally: - return content, status diff --git a/tensorhive/controllers/reservation/delete_reservation_controller.py b/tensorhive/controllers/reservation/delete_reservation_controller.py deleted file mode 100644 index e4919f31..00000000 --- a/tensorhive/controllers/reservation/delete_reservation_controller.py +++ /dev/null @@ -1,39 +0,0 @@ -from sqlalchemy.orm.exc import NoResultFound -from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt_claims -from tensorhive.models.Reservation import Reservation -from tensorhive.models.User import User -from tensorhive.config import API -from tensorhive.database import db_session -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['reservation'] -G = API.RESPONSES['general'] - - -@jwt_required -def delete(id): - try: - current_user_id = get_jwt_identity() - claims = get_jwt_claims() - - # Fetch the reservation - reservation_to_destroy = Reservation.get(id) - - # Must be privileged - is_admin = 'admin' in claims['roles'] - is_owner = reservation_to_destroy.user_id == current_user_id - assert is_owner or is_admin, G['unprivileged'] - - # Destroy - reservation_to_destroy.destroy() - except AssertionError as error_message: - content, status = {'msg': str(error_message)}, 403 - except NoResultFound: - # FIXME It is theoretically possible that User.get() could also raise this exception - content, status = {'msg': R['not_found']}, 404 - except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, 500 - else: - content, status = {'msg': R['delete']['success']}, 200 - finally: - return content, status diff --git a/tensorhive/controllers/reservation/get_reservation_controller.py b/tensorhive/controllers/reservation/get_reservation_controller.py deleted file mode 100644 index e49f395a..00000000 --- a/tensorhive/controllers/reservation/get_reservation_controller.py +++ /dev/null @@ -1,53 +0,0 @@ -from flask_jwt_extended import jwt_required -from tensorhive.models.Reservation import Reservation -from typing import List -from tensorhive.config import API -from tensorhive.utils.DateUtils import DateUtils - -G = API.RESPONSES['general'] - - -@jwt_required -def get_all(): - return [ - reservation.as_dict for reservation in Reservation.all() - ], 200 - - -@jwt_required -def get_selected(resources_ids: List, start: str, end: str): - # TODO This may need a decent refactor - give more freedom - # All args are required at once, otherwise return 400 - all_not_none = resources_ids and start and end - if all_not_none: - try: - start_as_datetime = DateUtils.parse_string(start) - ends_as_datetime = DateUtils.parse_string(end) - matches = list(Reservation.filter_by_uuids_and_time_range( - resources_ids, start_as_datetime, ends_as_datetime)) - matches = [match.as_dict for match in matches] - except (ValueError, AssertionError) as reason: - content = {'msg': '{}. {}'.format(G['bad_request'], reason)} - status = 400 - except Exception: - content = {'msg': G['internal_error']} - status = 500 - else: - content = matches # type: ignore - status = 200 - else: - content = {'msg': G['bad_request']} - status = 400 - return content, status - - -@jwt_required -def get(resources_ids=None, start=None, end=None): - args = [resources_ids, start, end] - all_args_none = all(a is None for a in args) - - if all_args_none: - return get_all() - else: - # Filter reservations - return get_selected(resources_ids, start, end) diff --git a/tensorhive/controllers/reservation/get_summary_controller.py b/tensorhive/controllers/reservation/get_summary_controller.py deleted file mode 100644 index 44067ac4..00000000 --- a/tensorhive/controllers/reservation/get_summary_controller.py +++ /dev/null @@ -1,13 +0,0 @@ -# from flask_jwt_extended import jwt_required -# from tensorhive.core.services.UsageLoggingService import Summary -# from typing import Dict -# from tensorhive.config import API -# G = API.RESPONSES['general'] - - -# @jwt_required -# def get(id) -> Dict: -# summary = Summary.find(id) -# if not summary: -# return summary, 404 -# return summary, 200 diff --git a/tensorhive/controllers/reservation/update_reservation_controller.py b/tensorhive/controllers/reservation/update_reservation_controller.py deleted file mode 100644 index 5a728f99..00000000 --- a/tensorhive/controllers/reservation/update_reservation_controller.py +++ /dev/null @@ -1,45 +0,0 @@ -from flask_jwt_extended import jwt_required -from tensorhive.models.Reservation import Reservation -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['reservation'] -G = API.RESPONSES['general'] - - -def to_db_column(): - return { - 'title': 'title', - 'description': 'description', - 'resourceId': 'protected_resource_id', - 'start': 'starts_at', - 'end': 'ends_at', - } - - -@jwt_required -def update(id, newValues): - new_values = newValues - allowed_fields = {'title', 'description', 'resourceId', 'start', 'end'} - try: - assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' - reservation = Reservation.get(id) - - for field_name, new_value in new_values.items(): - field_name = to_db_column().get(field_name) - assert (field_name is not None) and hasattr(reservation, field_name), \ - 'reservation has no {} field'.format(field_name) - setattr(reservation, field_name, new_value) - reservation.save() - except NoResultFound: - content, status = {'msg': R['not_found']}, 404 - except AssertionError as e: - content, status = {'msg': R['update']['failure']['assertions'].format(reason=e)}, 422 - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, 500 - else: - content, status = {'msg': R['update']['success'], 'reservation': reservation.as_dict}, 201 - finally: - return content, status diff --git a/tensorhive/controllers/resource/get_resource_controller.py b/tensorhive/controllers/resource.py similarity index 50% rename from tensorhive/controllers/resource/get_resource_controller.py rename to tensorhive/controllers/resource.py index c26dfdc2..ba9f961d 100644 --- a/tensorhive/controllers/resource/get_resource_controller.py +++ b/tensorhive/controllers/resource.py @@ -1,17 +1,24 @@ +import logging from http import HTTPStatus +from typing import Any, Dict, List, Tuple from flask_jwt_extended import jwt_required -from tensorhive.controllers.nodes.infrastructure_controller import get_infrastructure -from tensorhive.models.Resource import Resource from sqlalchemy.orm.exc import NoResultFound from tensorhive.config import API -import logging +from tensorhive.controllers.nodes import get_infrastructure +from tensorhive.models.Resource import Resource + log = logging.getLogger(__name__) -R = API.RESPONSES['resource'] -G = API.RESPONSES['general'] +RESOURCE = API.RESPONSES['resource'] +GENERAL = API.RESPONSES['general'] + +# Typing aliases +Content = Dict[str, Any] +HttpStatusCode = int +ResourceUUID = int @jwt_required -def get(): +def get() -> Tuple[List[Any], HttpStatusCode]: get_infrastructure() # Save new GPUs in database return [ resource.as_dict for resource in Resource.all() @@ -19,17 +26,17 @@ def get(): @jwt_required -def get_by_id(uuid): +def get_by_id(uuid: ResourceUUID) -> Tuple[Content, HttpStatusCode]: get_infrastructure() # Save new GPUs in database try: resource = Resource.get(uuid) except NoResultFound as e: log.warning(e) - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value + content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': R['get']['success'], 'resource': resource.as_dict}, HTTPStatus.OK.value + content, status = {'msg': RESOURCE['get']['success'], 'resource': resource.as_dict}, HTTPStatus.OK.value finally: return content, status diff --git a/tensorhive/controllers/restriction.py b/tensorhive/controllers/restriction.py new file mode 100644 index 00000000..62c6b8ef --- /dev/null +++ b/tensorhive/controllers/restriction.py @@ -0,0 +1,400 @@ +import logging +from http import HTTPStatus +from typing import Any, Dict, List, Optional, Tuple, Union +from flask_jwt_extended import jwt_required +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.authorization import admin_required +from tensorhive.config import API +from tensorhive.exceptions.InvalidRequestException import InvalidRequestException +from tensorhive.models.Group import Group +from tensorhive.models.Resource import Resource +from tensorhive.models.Restriction import Restriction +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.models.User import User +from tensorhive.utils.DateUtils import DateUtils + +log = logging.getLogger(__name__) +RESTRICTION = API.RESPONSES['restriction'] +USER = API.RESPONSES['user'] +GROUP = API.RESPONSES['group'] +RESOURCE = API.RESPONSES['resource'] +SCHEDULE = API.RESPONSES['schedule'] +GENERAL = API.RESPONSES['general'] + +# Typing aliases +Content = Dict[str, Any] +HttpStatusCode = int +RestrictionId = int +UserId = int +GroupId = int +ResourceId = str +ScheduleId = int + + +def get_all() -> Tuple[List[Any], HttpStatusCode]: + return [ + restriction.as_dict(include_groups=True, include_users=True, + include_resources=True) for restriction in Restriction.all() + ], HTTPStatus.OK.value + + +def get_selected(user_id: Optional[UserId], group_id: Optional[GroupId], resource_id: Optional[ResourceId], + schedule_id: Optional[ScheduleId], include_user_groups: Optional[bool] = False) \ + -> Tuple[Union[List[Any], Content], HttpStatusCode]: + try: + # If a specific group is selected then groups are not included in the restriction information in response + # The same applies to users and resources + include_groups = group_id is None + include_users = user_id is None + include_resources = schedule_id is None + + restrictions = [] # type: List[Restriction] + if user_id is not None: + user = User.get(user_id) + restrictions.extend(user.get_restrictions(include_global=True, include_group=include_user_groups)) + if group_id is not None: + group = Group.get(group_id) + restrictions.extend(group.get_restrictions(include_global=True)) + if resource_id is not None: + resource = Resource.get(resource_id) + restrictions.extend(resource.get_restrictions(include_global=True)) + if schedule_id is not None: + schedule = RestrictionSchedule.get(schedule_id) + restrictions.extend(schedule.restrictions) + + # Take unique restrictions + result = set(restrictions) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': GENERAL['bad_request']}, HTTPStatus.BAD_REQUEST.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content = [restriction.as_dict(include_groups=include_groups, include_users=include_users, # type: ignore + include_resources=include_resources) for restriction in result] + status = HTTPStatus.OK.value + finally: + return content, status + + +@jwt_required +def get(user_id: Optional[UserId] = None, group_id: Optional[GroupId] = None, resource_id: Optional[ResourceId] = None, + schedule_id: Optional[ScheduleId] = None, include_user_groups: Optional[bool] = False) \ + -> Tuple[Union[List[Any], Content], HttpStatusCode]: + args = [user_id, include_user_groups, group_id, resource_id, schedule_id] + all_args_none = all(a is None for a in args) + + if all_args_none: + return get_all() + else: + # Filter restrictions + return get_selected(user_id, group_id, resource_id, schedule_id, include_user_groups) + + +@admin_required +def create(restriction: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + try: + new_restriction = Restriction( + name=restriction.get('name'), + starts_at=restriction['start'], + is_global=restriction['isGlobal'], + ends_at=DateUtils.try_parse_string(restriction.get('end')) + ) + new_restriction.save() + except AssertionError as e: + content = {'msg': RESTRICTION['create']['failure']['invalid'].format(reason=e)} + status = HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + content = {'msg': GENERAL['internal_error'] + str(e)} + status = HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content = { + 'msg': RESTRICTION['create']['success'], + 'restriction': new_restriction.as_dict(include_groups=True, include_users=True, include_resources=True) + } + status = HTTPStatus.CREATED.value + finally: + return content, status + + +def to_db_column() -> Dict[str, str]: + return { + 'name': 'name', + 'start': 'starts_at', + 'end': 'ends_at', + 'isGlobal': 'is_global' + } + + +@admin_required +def update(id: RestrictionId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + new_values = newValues + allowed_fields = {'name', 'start', 'end', 'isGlobal'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + restriction = Restriction.get(id) + + for field_name, new_value in new_values.items(): + field_name = to_db_column().get(field_name) + assert (field_name is not None) and hasattr(restriction, field_name), \ + 'restriction has no {} field'.format(field_name) + setattr(restriction, field_name, new_value) + restriction.save() + except NoResultFound: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['update']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['update']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def delete(id: RestrictionId) -> Tuple[Content, HttpStatusCode]: + try: + restriction_to_destroy = Restriction.get(id) + restriction_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value + except NoResultFound: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + except Exception as e: + content, status = {'msg': GENERAL['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['delete']['success']}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def apply_to_user(restriction_id: RestrictionId, user_id: UserId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + user = User.get(user_id) + restriction.apply_to_user(user) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': USER['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['users']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['users']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['users']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def apply_to_group(restriction_id: RestrictionId, group_id: GroupId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + group = Group.get(group_id) + restriction.apply_to_group(group) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['groups']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['groups']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['groups']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def apply_to_resource(restriction_id: RestrictionId, resource_uuid: ResourceId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + resource = Resource.get(resource_uuid) + restriction.apply_to_resource(resource) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['resources']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['resources']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['resources']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def add_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + schedule = RestrictionSchedule.get(schedule_id) + restriction.add_schedule(schedule) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['schedules']['add']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['schedules']['add']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['schedules']['add']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def remove_from_user(restriction_id: RestrictionId, user_id: UserId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + user = User.get(user_id) + restriction.remove_from_user(user) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': USER['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['users']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['users']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['users']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def remove_from_group(restriction_id: RestrictionId, group_id: GroupId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + group = Group.get(group_id) + restriction.remove_from_group(group) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': GENERAL['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['groups']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['groups']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['groups']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def remove_from_resource(restriction_id: RestrictionId, resource_uuid: ResourceId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + resource = Resource.get(resource_uuid) + restriction.remove_from_resource(resource) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['resources']['remove']['failure']['not_found']}, \ + HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['resources']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['resources']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def remove_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + schedule = RestrictionSchedule.get(schedule_id) + restriction.remove_schedule(schedule) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['schedules']['remove']['failure']['not_found']}, \ + HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['schedules']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['schedules']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status diff --git a/tensorhive/controllers/restriction/__init__.py b/tensorhive/controllers/restriction/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tensorhive/controllers/restriction/add_to_restriction_controller.py b/tensorhive/controllers/restriction/add_to_restriction_controller.py deleted file mode 100644 index b800a69a..00000000 --- a/tensorhive/controllers/restriction/add_to_restriction_controller.py +++ /dev/null @@ -1,130 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.exceptions.InvalidRequestException import InvalidRequestException -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.models.Restriction import Restriction -from tensorhive.models.User import User -from tensorhive.models.Group import Group -from tensorhive.models.Resource import Resource -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['restriction'] -U = API.RESPONSES['user'] -GROUP = API.RESPONSES['group'] -RESOURCE = API.RESPONSES['resource'] -S = API.RESPONSES['schedule'] -G = API.RESPONSES['general'] - - -@admin_required -def apply_to_user(restriction_id, user_id): - restriction = None - try: - restriction = Restriction.get(restriction_id) - user = User.get(user_id) - restriction.apply_to_user(user) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['users']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value - except AssertionError as e: - content, status = {'msg': R['users']['apply']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['users']['apply']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status - - -@admin_required -def apply_to_group(restriction_id, group_id): - restriction = None - try: - restriction = Restriction.get(restriction_id) - group = Group.get(group_id) - restriction.apply_to_group(group) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['groups']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value - except AssertionError as e: - content, status = {'msg': R['groups']['apply']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['groups']['apply']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status - - -@admin_required -def apply_to_resource(restriction_id, resource_uuid): - restriction = None - try: - restriction = Restriction.get(restriction_id) - resource = Resource.get(resource_uuid) - restriction.apply_to_resource(resource) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['resources']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value - except AssertionError as e: - content, status = {'msg': R['resources']['apply']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['resources']['apply']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status - - -@admin_required -def add_schedule(restriction_id, schedule_id): - restriction = None - try: - restriction = Restriction.get(restriction_id) - schedule = RestrictionSchedule.get(schedule_id) - restriction.add_schedule(schedule) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['schedules']['add']['failure']['duplicate']}, HTTPStatus.CONFLICT.value - except AssertionError as e: - content, status = {'msg': R['schedules']['add']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['schedules']['add']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/restriction/create_restriction_controller.py b/tensorhive/controllers/restriction/create_restriction_controller.py deleted file mode 100644 index 974e8f78..00000000 --- a/tensorhive/controllers/restriction/create_restriction_controller.py +++ /dev/null @@ -1,33 +0,0 @@ -from http import HTTPStatus -from tensorhive.models.Restriction import Restriction -from tensorhive.utils.DateUtils import DateUtils -from tensorhive.authorization import admin_required -from tensorhive.config import API -R = API.RESPONSES['restriction'] -G = API.RESPONSES['general'] - - -@admin_required -def create(restriction): - try: - new_restriction = Restriction( - name=restriction.get('name'), - starts_at=restriction['start'], - is_global=restriction['isGlobal'], - ends_at=DateUtils.try_parse_string(restriction.get('end')) - ) - new_restriction.save() - except AssertionError as e: - content = {'msg': R['create']['failure']['invalid'].format(reason=e)} - status = HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - content = {'msg': G['internal_error'] + str(e)} - status = HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content = { - 'msg': R['create']['success'], - 'restriction': new_restriction.as_dict(include_groups=True, include_users=True, include_resources=True) - } - status = HTTPStatus.CREATED.value - finally: - return content, status diff --git a/tensorhive/controllers/restriction/delete_restriction_controller.py b/tensorhive/controllers/restriction/delete_restriction_controller.py deleted file mode 100644 index e77a2d2d..00000000 --- a/tensorhive/controllers/restriction/delete_restriction_controller.py +++ /dev/null @@ -1,24 +0,0 @@ -from http import HTTPStatus -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.authorization import admin_required -from tensorhive.models.Restriction import Restriction -from tensorhive.config import API -R = API.RESPONSES['restriction'] -G = API.RESPONSES['general'] - - -@admin_required -def delete(id): - try: - restriction_to_destroy = Restriction.get(id) - restriction_to_destroy.destroy() - except AssertionError as error_message: - content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value - except NoResultFound: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['delete']['success']}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/restriction/get_restriction_controller.py b/tensorhive/controllers/restriction/get_restriction_controller.py deleted file mode 100644 index 003e686e..00000000 --- a/tensorhive/controllers/restriction/get_restriction_controller.py +++ /dev/null @@ -1,73 +0,0 @@ -from http import HTTPStatus -from flask_jwt_extended import jwt_required -from tensorhive.models.Restriction import Restriction -from tensorhive.models.User import User -from tensorhive.models.Group import Group -from tensorhive.models.Resource import Resource -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging - -log = logging.getLogger(__name__) -R = API.RESPONSES['restriction'] -G = API.RESPONSES['general'] - - -@jwt_required -def get_all(): - return [ - restriction.as_dict(include_groups=True, include_users=True, - include_resources=True) for restriction in Restriction.all() - ], HTTPStatus.OK.value - - -@jwt_required -def get_selected(user_id, include_user_groups, group_id, resource_id, schedule_id): - try: - # If a specific group is selected then groups are not included in the restriction information in response - # The same applies to users and resources - include_groups = group_id is None - include_users = user_id is None - include_resources = schedule_id is None - - restrictions = [] - if user_id is not None: - user = User.get(user_id) - restrictions.extend(user.get_restrictions(include_global=True, include_group=include_user_groups)) - if group_id is not None: - group = Group.get(group_id) - restrictions.extend(group.get_restrictions(include_global=True)) - if resource_id is not None: - resource = Resource.get(resource_id) - restrictions.extend(resource.get_restrictions(include_global=True)) - if schedule_id is not None: - schedule = RestrictionSchedule.get(schedule_id) - restrictions.extend(schedule.restrictions) - - # Take unique restrictions - result = set(restrictions) - except NoResultFound as e: - log.warning(e) - content, status = {'msg': G['bad_request']}, HTTPStatus.BAD_REQUEST.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = [restriction.as_dict(include_groups=include_groups, include_users=include_users, - include_resources=include_resources) for restriction in result],\ - HTTPStatus.OK.value - finally: - return content, status - - -@jwt_required -def get(user_id=None, include_user_groups=None, group_id=None, resource_id=None, schedule_id=None): - args = [user_id, include_user_groups, group_id, resource_id, schedule_id] - all_args_none = all(a is None for a in args) - - if all_args_none: - return get_all() - else: - # Filter restrictions - return get_selected(user_id, include_user_groups, group_id, resource_id, schedule_id) diff --git a/tensorhive/controllers/restriction/remove_from_restriction.py b/tensorhive/controllers/restriction/remove_from_restriction.py deleted file mode 100644 index 8a21fb55..00000000 --- a/tensorhive/controllers/restriction/remove_from_restriction.py +++ /dev/null @@ -1,130 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.exceptions.InvalidRequestException import InvalidRequestException -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.models.Restriction import Restriction -from tensorhive.models.User import User -from tensorhive.models.Group import Group -from tensorhive.models.Resource import Resource -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['restriction'] -U = API.RESPONSES['user'] -GROUP = API.RESPONSES['group'] -RESOURCE = API.RESPONSES['resource'] -S = API.RESPONSES['schedule'] -G = API.RESPONSES['general'] - - -@admin_required -def remove_from_user(restriction_id, user_id): - restriction = None - try: - restriction = Restriction.get(restriction_id) - user = User.get(user_id) - restriction.remove_from_user(user) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': U['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['users']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': R['users']['remove']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['users']['remove']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status - - -@admin_required -def remove_from_group(restriction_id, group_id): - restriction = None - try: - restriction = Restriction.get(restriction_id) - group = Group.get(group_id) - restriction.remove_from_group(group) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': G['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['groups']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': R['groups']['remove']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['groups']['remove']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status - - -@admin_required -def remove_from_resource(restriction_id, resource_uuid): - restriction = None - try: - restriction = Restriction.get(restriction_id) - resource = Resource.get(resource_uuid) - restriction.remove_from_resource(resource) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['resources']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': R['resources']['remove']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['resources']['remove']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status - - -@admin_required -def remove_schedule(restriction_id, schedule_id): - restriction = None - try: - restriction = Restriction.get(restriction_id) - schedule = RestrictionSchedule.get(schedule_id) - restriction.remove_schedule(schedule) - except NoResultFound: - if restriction is None: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - else: - content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': R['schedules']['remove']['failure']['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': R['schedules']['remove']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['schedules']['remove']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/restriction/update_restriction_controller.py b/tensorhive/controllers/restriction/update_restriction_controller.py deleted file mode 100644 index dfe1a1e3..00000000 --- a/tensorhive/controllers/restriction/update_restriction_controller.py +++ /dev/null @@ -1,48 +0,0 @@ -from http import HTTPStatus -from tensorhive.authorization import admin_required -from tensorhive.models.Restriction import Restriction -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['restriction'] -G = API.RESPONSES['general'] - - -def to_db_column(): - return { - 'name': 'name', - 'start': 'starts_at', - 'end': 'ends_at', - 'isGlobal': 'is_global' - } - - -@admin_required -def update(id, newValues): - new_values = newValues - allowed_fields = {'name', 'start', 'end', 'isGlobal'} - try: - assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' - restriction = Restriction.get(id) - - for field_name, new_value in new_values.items(): - field_name = to_db_column().get(field_name) - assert (field_name is not None) and hasattr(restriction, field_name), \ - 'restriction has no {} field'.format(field_name) - setattr(restriction, field_name, new_value) - restriction.save() - except NoResultFound: - content, status = {'msg': R['not_found']}, HTTPStatus.NOT_FOUND.value - except AssertionError as e: - content, status = {'msg': R['update']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': R['update']['success'], - 'restriction': restriction.as_dict(include_groups=True, include_users=True, - include_resources=True)}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/schedule.py b/tensorhive/controllers/schedule.py new file mode 100644 index 00000000..a6ab0793 --- /dev/null +++ b/tensorhive/controllers/schedule.py @@ -0,0 +1,132 @@ +import logging +from datetime import datetime +from http import HTTPStatus +from typing import Any, Dict, List, Tuple +from flask_jwt_extended import jwt_required +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.authorization import admin_required +from tensorhive.config import API +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.utils.Weekday import Weekday + +log = logging.getLogger(__name__) +SCHEDULE = API.RESPONSES['schedule'] +GENERAL = API.RESPONSES['general'] + +# Typing aliases +Content = Dict[str, Any] +HttpStatusCode = int +ScheduleId = int + + +@jwt_required +def get() -> Tuple[List[Any], HttpStatusCode]: + return [ + schedule.as_dict for schedule in RestrictionSchedule.all() + ], HTTPStatus.OK.value + + +@jwt_required +def get_by_id(id: ScheduleId) -> Tuple[Content, HttpStatusCode]: + try: + schedule = RestrictionSchedule.get(id) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': SCHEDULE['get']['success'], 'schedule': schedule.as_dict}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def create(schedule: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + try: + days = [Weekday[day] for day in schedule['scheduleDays']] + new_schedule = RestrictionSchedule( + schedule_days=days, + hour_start=datetime.strptime(schedule['hourStart'], "%H:%M").time(), + hour_end=datetime.strptime(schedule['hourEnd'], "%H:%M").time() + ) + new_schedule.save() + except KeyError: + # Invalid day + content = {'msg': GENERAL['bad_request']} + status = HTTPStatus.UNPROCESSABLE_ENTITY.value + except AssertionError as e: + content = {'msg': SCHEDULE['create']['failure']['invalid'].format(reason=e)} + status = HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + content = {'msg': GENERAL['internal_error'] + str(e)} + status = HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content = { + 'msg': SCHEDULE['create']['success'], + 'schedule': new_schedule.as_dict + } + status = HTTPStatus.CREATED.value + finally: + return content, status + + +def to_db_column() -> Dict[str, str]: + return { + 'scheduleDays': 'schedule_days', + 'hourStart': 'hour_start', + 'hourEnd': 'hour_end' + } + + +@admin_required +def update(id, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + new_values = newValues + allowed_fields = {'scheduleDays', 'hourStart', 'hourEnd'} + try: + assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' + schedule = RestrictionSchedule.get(id) + + for field_name, new_value in new_values.items(): + if field_name == 'scheduleDays': + new_value = [Weekday[day] for day in new_value] + if field_name in ['hourStart', 'hourEnd']: + new_value = datetime.strptime(new_value, "%H:%M").time() + field_name = to_db_column().get(field_name) + assert (field_name is not None) and hasattr(schedule, field_name), \ + 'schedule has no {} field'.format(field_name) + setattr(schedule, field_name, new_value) + schedule.save() + except NoResultFound: + content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value + except KeyError: + # Invalid day + content, status = {'msg': GENERAL['bad_request']}, HTTPStatus.UNPROCESSABLE_ENTITY.value + except AssertionError as e: + content, status = {'msg': SCHEDULE['update']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': SCHEDULE['update']['success'], 'schedule': schedule.as_dict}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def delete(id: ScheduleId) -> Tuple[Content, HttpStatusCode]: + try: + schedule_to_destroy = RestrictionSchedule.get(id) + schedule_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value + except NoResultFound: + content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value + except Exception as e: + content, status = {'msg': GENERAL['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': SCHEDULE['delete']['success']}, HTTPStatus.OK.value + finally: + return content, status diff --git a/tensorhive/controllers/schedule/__init__.py b/tensorhive/controllers/schedule/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tensorhive/controllers/schedule/create_schedule_controller.py b/tensorhive/controllers/schedule/create_schedule_controller.py deleted file mode 100644 index 2a19ed7c..00000000 --- a/tensorhive/controllers/schedule/create_schedule_controller.py +++ /dev/null @@ -1,38 +0,0 @@ -from http import HTTPStatus -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from datetime import datetime -from tensorhive.utils.Weekday import Weekday -from tensorhive.authorization import admin_required -from tensorhive.config import API -S = API.RESPONSES['schedule'] -G = API.RESPONSES['general'] - - -@admin_required -def create(schedule): - try: - days = [Weekday[day] for day in schedule['scheduleDays']] - new_schedule = RestrictionSchedule( - schedule_days=days, - hour_start=datetime.strptime(schedule['hourStart'], "%H:%M").time(), - hour_end=datetime.strptime(schedule['hourEnd'], "%H:%M").time() - ) - new_schedule.save() - except KeyError: - # Invalid day - content = {'msg': G['bad_request']} - status = HTTPStatus.UNPROCESSABLE_ENTITY.value - except AssertionError as e: - content = {'msg': S['create']['failure']['invalid'].format(reason=e)} - status = HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - content = {'msg': G['internal_error'] + str(e)} - status = HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content = { - 'msg': S['create']['success'], - 'schedule': new_schedule.as_dict - } - status = HTTPStatus.CREATED.value - finally: - return content, status diff --git a/tensorhive/controllers/schedule/delete_schedule_controller.py b/tensorhive/controllers/schedule/delete_schedule_controller.py deleted file mode 100644 index e009b8d6..00000000 --- a/tensorhive/controllers/schedule/delete_schedule_controller.py +++ /dev/null @@ -1,24 +0,0 @@ -from http import HTTPStatus -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.authorization import admin_required -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from tensorhive.config import API -S = API.RESPONSES['schedule'] -G = API.RESPONSES['general'] - - -@admin_required -def delete(id): - try: - schedule_to_destroy = RestrictionSchedule.get(id) - schedule_to_destroy.destroy() - except AssertionError as error_message: - content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value - except NoResultFound: - content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value - except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': S['delete']['success']}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/schedule/get_schedule_controller.py b/tensorhive/controllers/schedule/get_schedule_controller.py deleted file mode 100644 index 7d4973db..00000000 --- a/tensorhive/controllers/schedule/get_schedule_controller.py +++ /dev/null @@ -1,32 +0,0 @@ -from http import HTTPStatus -from flask_jwt_extended import jwt_required -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -S = API.RESPONSES['schedule'] -G = API.RESPONSES['general'] - - -@jwt_required -def get(): - return [ - schedule.as_dict for schedule in RestrictionSchedule.all() - ], HTTPStatus.OK.value - - -@jwt_required -def get_by_id(id): - try: - schedule = RestrictionSchedule.get(id) - except NoResultFound as e: - log.warning(e) - content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': S['get']['success'], 'schedule': schedule.as_dict}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/schedule/update_schedule_controller.py b/tensorhive/controllers/schedule/update_schedule_controller.py deleted file mode 100644 index 5df186d4..00000000 --- a/tensorhive/controllers/schedule/update_schedule_controller.py +++ /dev/null @@ -1,54 +0,0 @@ -from http import HTTPStatus -from datetime import datetime -from tensorhive.utils.Weekday import Weekday -from tensorhive.authorization import admin_required -from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -S = API.RESPONSES['schedule'] -G = API.RESPONSES['general'] - - -def to_db_column(): - return { - 'scheduleDays': 'schedule_days', - 'hourStart': 'hour_start', - 'hourEnd': 'hour_end' - } - - -@admin_required -def update(id, newValues): - new_values = newValues - allowed_fields = {'scheduleDays', 'hourStart', 'hourEnd'} - try: - assert set(new_values.keys()).issubset(allowed_fields), 'invalid field is present' - schedule = RestrictionSchedule.get(id) - - for field_name, new_value in new_values.items(): - if field_name == 'scheduleDays': - new_value = [Weekday[day] for day in new_value] - if field_name in ['hourStart', 'hourEnd']: - new_value = datetime.strptime(new_value, "%H:%M").time() - field_name = to_db_column().get(field_name) - assert (field_name is not None) and hasattr(schedule, field_name), \ - 'schedule has no {} field'.format(field_name) - setattr(schedule, field_name, new_value) - schedule.save() - except NoResultFound: - content, status = {'msg': S['not_found']}, HTTPStatus.NOT_FOUND.value - except KeyError: - # Invalid day - content, status = {'msg': G['bad_request']}, HTTPStatus.UNPROCESSABLE_ENTITY.value - except AssertionError as e: - content, status = {'msg': S['update']['failure']['assertions'].format(reason=e)}, \ - HTTPStatus.UNPROCESSABLE_ENTITY.value - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value - else: - content, status = {'msg': S['update']['success'], 'schedule': schedule.as_dict}, HTTPStatus.OK.value - finally: - return content, status diff --git a/tensorhive/controllers/task.py b/tensorhive/controllers/task.py index c6775c05..7941cc8c 100644 --- a/tensorhive/controllers/task.py +++ b/tensorhive/controllers/task.py @@ -1,6 +1,6 @@ from tensorhive.models.Task import Task, TaskStatus from tensorhive.models.User import User -from tensorhive.core import task_nursery, ssh +from tensorhive.core import task_nursery from tensorhive.utils.DateUtils import DateUtils from tensorhive.core.task_nursery import SpawnError, ExitCodeError from pssh.exceptions import ConnectionErrorException, AuthenticationException, UnknownHostException @@ -8,13 +8,15 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.config import API from functools import wraps -from typing import List, Optional, Callable, Any, Dict, Tuple, Iterator +from typing import Optional, Callable, Any, Dict, Tuple from datetime import datetime, timedelta import logging + log = logging.getLogger(__name__) -T = API.RESPONSES['task'] -S = API.RESPONSES['screen-sessions'] -G = API.RESPONSES['general'] +TASK = API.RESPONSES['task'] +SSH = API.RESPONSES['ssh'] +SCREEN_SESSIONS = API.RESPONSES['screen-sessions'] +GENERAL = API.RESPONSES['general'] """ This module contains two kinds of controllers: - production-ready with authorization and authentication @@ -123,9 +125,9 @@ def create(task: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: # User is not allowed to create task for someone else assert task.get('userId') == get_jwt_identity() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_create(task) finally: @@ -139,9 +141,9 @@ def get(id: TaskId) -> Tuple[Content, HttpStatusCode]: task = Task.get(id) assert get_jwt_identity() == task.user_id or is_admin() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_get(id) finally: @@ -161,9 +163,9 @@ def get_all(userId: Optional[int], syncAll: Optional[bool]) -> Tuple[Content, Ht assert is_admin() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_get_all(user_id, sync_all) finally: @@ -177,9 +179,9 @@ def update(id: TaskId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCo task = Task.get(id) assert task.user_id == get_jwt_identity(), 'Not an owner' except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_update(id, newValues) finally: @@ -193,9 +195,9 @@ def destroy(id: TaskId) -> Tuple[Content, HttpStatusCode]: task = Task.get(id) assert task.user_id == get_jwt_identity(), 'Not an owner' except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_destroy(id) finally: @@ -210,9 +212,9 @@ def spawn(id: TaskId) -> Tuple[Content, HttpStatusCode]: assert task.user_id == get_jwt_identity(), 'Not an owner' except NoResultFound as e: log.error(e) - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_spawn(id) finally: @@ -226,9 +228,9 @@ def terminate(id: TaskId, gracefully: Optional[bool] = True) -> Tuple[Content, H task = Task.get(id) assert get_jwt_identity() == task.user_id or is_admin() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_terminate(id, gracefully) finally: @@ -242,9 +244,9 @@ def get_log(id: TaskId, tail: bool) -> Tuple[Content, HttpStatusCode]: task = Task.get(id) assert get_jwt_identity() == task.user_id or is_admin() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError: - content, status = {'msg': G['unprivileged']}, 403 + content, status = {'msg': GENERAL['unprivileged']}, 403 else: content, status = business_get_log(id, tail) finally: @@ -275,7 +277,7 @@ def business_get_all(user_id: Optional[int], sync_all: Optional[bool]) -> Tuple[ if sync_all: synchronize(task.id) results.append(task.as_dict) - return {'msg': T['all']['success'], 'tasks': results}, 200 + return {'msg': TASK['all']['success'], 'tasks': results}, 200 def business_create(task: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: @@ -294,17 +296,17 @@ def business_create(task: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: new_task.save() except ValueError: # Invalid string format for datetime - content, status = {'msg': G['bad_request']}, 422 + content, status = {'msg': GENERAL['bad_request']}, 422 except KeyError: # At least one of required fields was not present - content, status = {'msg': G['bad_request']}, 422 + content, status = {'msg': GENERAL['bad_request']}, 422 except AssertionError as e: - content, status = {'msg': T['create']['failure']['invalid'].format(reason=e)}, 422 + content, status = {'msg': TASK['create']['failure']['invalid'].format(reason=e)}, 422 except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: - content, status = {'msg': T['create']['success'], 'task': new_task.as_dict}, 201 + content, status = {'msg': TASK['create']['success'], 'task': new_task.as_dict}, 201 finally: return content, status @@ -315,17 +317,17 @@ def business_get(id: TaskId) -> Tuple[Content, HttpStatusCode]: try: task = Task.get(id) except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: - content, status = {'msg': T['get']['success'], 'task': task.as_dict}, 200 + content, status = {'msg': TASK['get']['success'], 'task': task.as_dict}, 200 finally: return content, status -def to_db_column(): +def to_db_column() -> Dict[str, str]: return { 'command': 'command', 'hostname': 'host', @@ -350,17 +352,17 @@ def business_update(id: TaskId, new_values: Dict[str, Any]) -> Tuple[Content, Ht setattr(task, field_name, new_value) task.save() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except ValueError: # Invalid string format for datetime - content, status = {'msg': G['bad_request']}, 422 + content, status = {'msg': GENERAL['bad_request']}, 422 except AssertionError as e: - content, status = {'msg': T['update']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': TASK['update']['failure']['assertions'].format(reason=e)}, 422 except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: - content, status = {'msg': T['update']['success'], 'task': task.as_dict}, 201 + content, status = {'msg': TASK['update']['success'], 'task': task.as_dict}, 201 finally: return content, status @@ -373,13 +375,13 @@ def business_destroy(id: TaskId) -> Tuple[Content, HttpStatusCode]: assert task.status is not TaskStatus.running, 'must be terminated first' task.destroy() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError as e: - content, status = {'msg': T['delete']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': TASK['delete']['failure']['assertions'].format(reason=e)}, 422 except Exception: - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: - content, status = {'msg': T['delete']['success']}, 200 + content, status = {'msg': TASK['delete']['success']}, 200 finally: return content, status @@ -396,15 +398,15 @@ def screen_sessions(username: str, hostname: str) -> Tuple[Content, HttpStatusCo assert username and hostname, 'parameters must not be empty' pids = task_nursery.running(host=hostname, user=username) except AssertionError as e: - content, status = {'msg': S['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': SCREEN_SESSIONS['failure']['assertions'].format(reason=e)}, 422 except (ConnectionErrorException, AuthenticationException, UnknownHostException) as e: - content, status = {'msg': API.RESPONSES['ssh']['failure']['connection'].format(reason=e)}, 500 + content, status = {'msg': SSH['failure']['connection'].format(reason=e)}, 500 except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: # FIXME - content, status = {'msg': S['success'], 'pids': pids}, 200 + content, status = {'msg': SCREEN_SESSIONS['success'], 'pids': pids}, 200 finally: return content, status @@ -433,18 +435,18 @@ def business_spawn(id: TaskId) -> Tuple[Content, HttpStatusCode]: # continue to watch and terminate the task automatically. task.save() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError as e: - content, status = {'msg': T['spawn']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': TASK['spawn']['failure']['assertions'].format(reason=e)}, 422 except SpawnError as e: log.warning(e) - content, status = {'msg': T['spawn']['failure']['backend'].format(reason=e)}, 500 + content, status = {'msg': TASK['spawn']['failure']['backend'].format(reason=e)}, 500 except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: log.info('Task {} is now: {}'.format(task.id, task.status.name)) - content, status = {'msg': T['spawn']['success'], 'pid': pid}, 200 + content, status = {'msg': TASK['spawn']['success'], 'pid': pid}, 200 finally: return content, status @@ -487,17 +489,17 @@ def business_terminate(id: TaskId, gracefully: Optional[bool] = True) -> Tuple[C task.spawn_at = None task.save() except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except AssertionError as e: - content, status = {'msg': T['terminate']['failure']['state'].format(reason=e)}, 409 + content, status = {'msg': TASK['terminate']['failure']['state'].format(reason=e)}, 409 except ExitCodeError: - content, status = {'msg': T['terminate']['failure']['exit_code'], 'exit_code': exit_code}, 202 + content, status = {'msg': TASK['terminate']['failure']['exit_code'], 'exit_code': exit_code}, 202 # TODO What if terminate could not connect, ConnectionErrorException? except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: - content, status = {'msg': T['terminate']['success'], 'exit_code': exit_code}, 200 + content, status = {'msg': TASK['terminate']['success'], 'exit_code': exit_code}, 200 finally: return content, status @@ -519,18 +521,18 @@ def business_get_log(id: TaskId, tail: bool) -> Tuple[Content, HttpStatusCode]: assert task.user, 'user does not exist' output_gen, log_path = task_nursery.fetch_log(task.host, task.user.username, task.id, tail) except NoResultFound: - content, status = {'msg': T['not_found']}, 404 + content, status = {'msg': TASK['not_found']}, 404 except ExitCodeError as e: - content, status = {'msg': T['get_log']['failure']['not_found'].format(location=e)}, 404 + content, status = {'msg': TASK['get_log']['failure']['not_found'].format(location=e)}, 404 except AssertionError as e: - content, status = {'msg': T['get_log']['failure']['assertions'].format(reason=e)}, 422 + content, status = {'msg': TASK['get_log']['failure']['assertions'].format(reason=e)}, 422 except (ConnectionErrorException, AuthenticationException, UnknownHostException) as e: - content, status = {'msg': API.RESPONSES['ssh']['failure']['connection'].format(reason=e)}, 500 + content, status = {'msg': SSH['failure']['connection'].format(reason=e)}, 500 except Exception as e: log.critical(e) - content, status = {'msg': G['internal_error']}, 500 + content, status = {'msg': GENERAL['internal_error']}, 500 else: - content, status = {'msg': T['get_log']['success'], 'path': log_path, 'output_lines': list(output_gen)}, 200 + content, status = {'msg': TASK['get_log']['success'], 'path': log_path, 'output_lines': list(output_gen)}, 200 finally: return content, status diff --git a/tensorhive/controllers/user.py b/tensorhive/controllers/user.py new file mode 100644 index 00000000..246dbb5d --- /dev/null +++ b/tensorhive/controllers/user.py @@ -0,0 +1,226 @@ +import logging +import socket +from typing import Any, Dict, List, Tuple, Union +from flask_jwt_extended import create_access_token, create_refresh_token, get_jwt_identity, get_raw_jwt +from flask_jwt_extended import jwt_refresh_token_required, jwt_required +from paramiko.client import SSHClient, WarningPolicy +from paramiko.ssh_exception import AuthenticationException, BadHostKeyException, SSHException +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.authorization import admin_required +from tensorhive.config import API, APP_SERVER, SSH +from tensorhive.core.managers.TensorHiveManager import TensorHiveManager +from tensorhive.models.RevokedToken import RevokedToken +from tensorhive.models.Role import Role +from tensorhive.models.User import User + +log = logging.getLogger(__name__) +GENERAL = API.RESPONSES['general'] +USER = API.RESPONSES['user'] +TOKEN = API.RESPONSES['token'] + +# Typing aliases +Content = Dict[str, Any] +HttpStatusCode = int +UserId = int + + +@jwt_required +def get() -> Tuple[List[Any], HttpStatusCode]: + return [ + user.as_dict for user in User.all() + ], 200 + + +@jwt_required +def get_by_id(id: UserId) -> Tuple[Content, HttpStatusCode]: + try: + user = User.get(id) + except NoResultFound as e: + log.warning(e) + content, status = {'msg': USER['not_found']}, 404 + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, 500 + else: + content, status = {'msg': USER['get']['success'], 'user': user.as_dict}, 200 + finally: + return content, status + + +def do_create(user: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + try: + new_user = User( + username=user['username'], + email=user['email'], + password=user['password'], + roles=[Role(name='user')] + ) + new_user.save() + except AssertionError as e: + content = {'msg': USER['create']['failure']['invalid'].format(reason=e)} + status = 422 + except IntegrityError: + content = {'msg': USER['create']['failure']['duplicate']} + status = 409 + except Exception as e: + content = {'msg': GENERAL['internal_error'] + str(e)} + status = 500 + else: + content = { + 'msg': USER['create']['success'], + 'user': new_user.as_dict + } + status = 201 + finally: + return content, status + + +@admin_required +def create(newUser: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + return do_create(newUser) + + +def ssh_signup(user: Dict[str, Any]) -> Tuple[Union[str, List[Any], Content], HttpStatusCode]: + # TODO: configure nodes used for authentication + auth_node = next(iter(SSH.AVAILABLE_NODES)) + + ssh_key = TensorHiveManager().dedicated_ssh_key + test_client = SSHClient() + test_client.load_system_host_keys() + test_client.set_missing_host_key_policy(WarningPolicy()) + + try: + test_client.connect(auth_node, username=user['username'], pkey=ssh_key) + except AuthenticationException: + return {'msg': GENERAL['unprivileged']}, 403 + except (BadHostKeyException, SSHException, socket.error) as e: + return 'An error occurred while authenticating: {}'.format(e), 500 + finally: + test_client.close() + + return do_create(user) + + +def authorized_keys_entry() -> str: + key = TensorHiveManager().dedicated_ssh_key.get_base64() + return 'ssh-rsa {} tensorhive@{}'.format(key, APP_SERVER.HOST) + + +@admin_required +@jwt_required +def update(newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + user = newValues + print('REQ', user) + if user.get('id') is not None: + try: + found_user = User.get(user['id']) + updatable_field_names = ['username', 'password', 'email'] + + for field_name in updatable_field_names: + if user.get(field_name) is not None: + if field_name == 'roles': + new_value = [Role(name=role_name) for role_name in user['roles']] + else: + new_value = user[field_name] + setattr(found_user, field_name, new_value) + + found_user.save() + except AssertionError as e: + content = {'msg': USER['update']['failure']['invalid'].format(reason=e)} + status = 422 + except Exception: + content = {'msg': GENERAL['internal_error']} + status = 500 + else: + content = {'msg': USER['update']['success'], 'reservation': found_user.as_dict} + status = 201 + else: + content = {'msg': GENERAL['bad_request']} + status = 400 + + return content, status + + +@admin_required +def delete(id: UserId) -> Tuple[Content, HttpStatusCode]: + try: + current_user_id = get_jwt_identity() + + # User is not allowed to delete his own account + assert id != current_user_id, USER['delete']['self'] + + # Fetch the user and destroy + user_to_destroy = User.get(id) + user_to_destroy.destroy() + except AssertionError as error_message: + content, status = {'msg': str(error_message)}, 403 + except NoResultFound: + content, status = {'msg': USER['not_found']}, 404 + except Exception as e: + content, status = {'msg': GENERAL['internal_error'] + str(e)}, 500 + else: + content, status = {'msg': USER['delete']['success']}, 200 + finally: + return content, status + + +def login(user: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: + try: + current_user = User.find_by_username(user['username']) + assert User.verify_hash(user['password'], current_user.password), \ + USER['login']['failure']['credentials'] + except NoResultFound: + content = {'msg': USER['not_found']} + status = 404 + except AssertionError as error_message: + content = {'msg': str(error_message)} + status = 401 + except Exception: + content = {'msg': GENERAL['internal_error']} + status = 500 + else: + content = { + 'msg': USER['login']['success'].format(username=current_user.username), + 'access_token': create_access_token(identity=current_user.id, fresh=True), + 'refresh_token': create_refresh_token(identity=current_user.id) + } + status = 200 + finally: + return content, status + + +def logout(token_type: str) -> Tuple[Content, HttpStatusCode]: + jti = get_raw_jwt()['jti'] + try: + RevokedToken(jti=jti).save() + except Exception: + log.critical(GENERAL['internal_error']) + log.critical(TOKEN['revoke']['failure'].format(token_type=token_type)) + content = {'msg': GENERAL['internal_error']} + status = 500 + else: + content = {'msg': USER['logout']['success']} + status = 200 + finally: + return content, status + + +@jwt_required +def logout_with_access_token() -> Tuple[Content, HttpStatusCode]: + return logout('Access') + + +@jwt_refresh_token_required +def logout_with_refresh_token() -> Tuple[Content, HttpStatusCode]: + return logout('Refresh') + + +@jwt_refresh_token_required +def generate() -> Tuple[Content, HttpStatusCode]: + new_access_token = create_access_token(identity=get_jwt_identity(), fresh=False) + content = { + 'msg': TOKEN['refresh']['success'], + 'access_token': new_access_token + } + return content, 200 diff --git a/tensorhive/controllers/user/__init__.py b/tensorhive/controllers/user/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tensorhive/controllers/user/create_user_controller.py b/tensorhive/controllers/user/create_user_controller.py deleted file mode 100644 index 722b7f86..00000000 --- a/tensorhive/controllers/user/create_user_controller.py +++ /dev/null @@ -1,74 +0,0 @@ -from sqlalchemy.exc import IntegrityError -from tensorhive.models.User import User -from tensorhive.models.Role import Role -from paramiko.client import SSHClient, WarningPolicy -from paramiko.ssh_exception import AuthenticationException, BadHostKeyException, SSHException -import socket -from tensorhive.database import db_session -from flask_jwt_extended import get_jwt_identity -from tensorhive.config import API -from tensorhive.config import APP_SERVER -from tensorhive.authorization import admin_required -from tensorhive.core.managers.TensorHiveManager import TensorHiveManager -from tensorhive.config import SSH -R = API.RESPONSES['user'] -G = API.RESPONSES['general'] - - -def do_create(user): - try: - new_user = User( - username=user['username'], - email=user['email'], - password=user['password'], - roles=[Role(name='user')] - ) - new_user.save() - except AssertionError as e: - content = {'msg': R['create']['failure']['invalid'].format(reason=e)} - status = 422 - except IntegrityError: - content = {'msg': R['create']['failure']['duplicate']} - status = 409 - except Exception as e: - content = {'msg': G['internal_error'] + str(e)} - status = 500 - else: - content = { - 'msg': R['create']['success'], - 'user': new_user.as_dict - } - status = 201 - finally: - return content, status - - -@admin_required -def create(newUser): - return do_create(newUser) - - -def ssh_signup(user): - # TODO: configure nodes used for authentication - auth_node = next(iter(SSH.AVAILABLE_NODES)) - - ssh_key = TensorHiveManager().dedicated_ssh_key - test_client = SSHClient() - test_client.load_system_host_keys() - test_client.set_missing_host_key_policy(WarningPolicy()) - - try: - test_client.connect(auth_node, username=user['username'], pkey=ssh_key) - except AuthenticationException: - return {'msg': G['unprivileged']}, 403 - except (BadHostKeyException, SSHException, socket.error) as e: - return 'An error occurred while authenticating: {}'.format(e), 500 - finally: - test_client.close() - - return do_create(user) - - -def authorized_keys_entry(): - key = TensorHiveManager().dedicated_ssh_key.get_base64() - return 'ssh-rsa {} tensorhive@{}'.format(key, APP_SERVER.HOST) diff --git a/tensorhive/controllers/user/delete_user_controller.py b/tensorhive/controllers/user/delete_user_controller.py deleted file mode 100644 index 613c7eb0..00000000 --- a/tensorhive/controllers/user/delete_user_controller.py +++ /dev/null @@ -1,33 +0,0 @@ -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.models.User import User -from tensorhive.database import db_session -from flask_jwt_extended import get_jwt_identity -from tensorhive.authorization import admin_required -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['user'] -G = API.RESPONSES['general'] - - -@admin_required -def delete(id): - try: - current_user_id = get_jwt_identity() - - # User is not allowed to delete his own account - assert id != current_user_id, R['delete']['self'] - - # Fetch the user and destroy - user_to_destroy = User.get(id) - user_to_destroy.destroy() - except AssertionError as error_message: - content, status = {'msg': str(error_message)}, 403 - except NoResultFound: - content, status = {'msg': R['not_found']}, 404 - except Exception as e: - content, status = {'msg': G['internal_error'] + str(e)}, 500 - else: - content, status = {'msg': R['delete']['success']}, 200 - finally: - return content, status diff --git a/tensorhive/controllers/user/get_users_controller.py b/tensorhive/controllers/user/get_users_controller.py deleted file mode 100644 index 8b4ea007..00000000 --- a/tensorhive/controllers/user/get_users_controller.py +++ /dev/null @@ -1,32 +0,0 @@ -from flask_jwt_extended import jwt_required -from tensorhive.models.User import User -from sqlalchemy.orm.exc import NoResultFound -from connexion import NoContent -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -G = API.RESPONSES['general'] -U = API.RESPONSES['user'] - - -@jwt_required -def get(): - return [ - user.as_dict for user in User.all() - ], 200 - - -@jwt_required -def get_by_id(id): - try: - user = User.get(id) - except NoResultFound as e: - log.warning(e) - content, status = {'msg': U['not_found']}, 404 - except Exception as e: - log.critical(e) - content, status = {'msg': G['internal_error']}, 500 - else: - content, status = {'msg': U['get']['success'], 'user': user.as_dict}, 200 - finally: - return content, status diff --git a/tensorhive/controllers/user/login_user_controller.py b/tensorhive/controllers/user/login_user_controller.py deleted file mode 100644 index d810be0b..00000000 --- a/tensorhive/controllers/user/login_user_controller.py +++ /dev/null @@ -1,31 +0,0 @@ -from tensorhive.models.User import User -from flask_jwt_extended import create_access_token, create_refresh_token -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -R = API.RESPONSES['user'] -G = API.RESPONSES['general'] - - -def login(user): - try: - current_user = User.find_by_username(user['username']) - assert User.verify_hash(user['password'], current_user.password), \ - R['login']['failure']['credentials'] - except NoResultFound: - content = {'msg': R['not_found']} - status = 404 - except AssertionError as error_message: - content = {'msg': str(error_message)} - status = 401 - except Exception: - content = {'msg': G['internal_error']} - status = 500 - else: - content = { - 'msg': R['login']['success'].format(username=current_user.username), - 'access_token': create_access_token(identity=current_user.id, fresh=True), - 'refresh_token': create_refresh_token(identity=current_user.id) - } - status = 200 - finally: - return content, status diff --git a/tensorhive/controllers/user/logout_user_controller.py b/tensorhive/controllers/user/logout_user_controller.py deleted file mode 100644 index 6dd22bfc..00000000 --- a/tensorhive/controllers/user/logout_user_controller.py +++ /dev/null @@ -1,35 +0,0 @@ -from flask_jwt_extended import get_raw_jwt -from tensorhive.models.RevokedToken import RevokedToken -from flask_jwt_extended import jwt_required, jwt_refresh_token_required -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['user'] -G = API.RESPONSES['general'] -T = API.RESPONSES['token']['revoke'] - - -def logout(token_type): - jti = get_raw_jwt()['jti'] - try: - RevokedToken(jti=jti).save() - except Exception: - log.critical(G['internal_error']) - log.critical(T['failure'].format(token_type=token_type)) - content = {'msg': G['internal_error']} - status = 500 - else: - content = {'msg': R['logout']['success']} - status = 200 - finally: - return content, status - - -@jwt_required -def logout_with_access_token(): - return logout('Access') - - -@jwt_refresh_token_required -def logout_with_refresh_token(): - return logout('Refresh') diff --git a/tensorhive/controllers/user/refresh_access_token_controller.py b/tensorhive/controllers/user/refresh_access_token_controller.py deleted file mode 100644 index 4bf74396..00000000 --- a/tensorhive/controllers/user/refresh_access_token_controller.py +++ /dev/null @@ -1,18 +0,0 @@ -from flask_jwt_extended import create_access_token, get_jwt_identity, jwt_refresh_token_required -from tensorhive.models.User import User -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.config import API -import logging -log = logging.getLogger(__name__) -R = API.RESPONSES['token'] -G = API.RESPONSES['general'] - - -@jwt_refresh_token_required -def generate(): - new_access_token = create_access_token(identity=get_jwt_identity(), fresh=False) - content = { - 'msg': R['refresh']['success'], - 'access_token': new_access_token - } - return content, 200 diff --git a/tensorhive/controllers/user/update_user_controller.py b/tensorhive/controllers/user/update_user_controller.py deleted file mode 100644 index fbd6f86e..00000000 --- a/tensorhive/controllers/user/update_user_controller.py +++ /dev/null @@ -1,42 +0,0 @@ -from tensorhive.models.User import User -from tensorhive.config import API -from tensorhive.authorization import admin_required -from tensorhive.models.Role import Role -from flask_jwt_extended import jwt_required -R = API.RESPONSES['user'] -G = API.RESPONSES['general'] - - -@admin_required -@jwt_required -def update(newValues): - user = newValues - print('REQ', user) - if user.get('id') is not None: - try: - found_user = User.get(user['id']) - updatable_field_names = ['username', 'password', 'email'] - - for field_name in updatable_field_names: - if user.get(field_name) is not None: - if field_name == 'roles': - new_value = [Role(name=role_name) for role_name in user['roles']] - else: - new_value = user[field_name] - setattr(found_user, field_name, new_value) - - found_user.save() - except AssertionError as e: - content = {'msg': R['update']['failure']['invalid'].format(reason=e)} - status = 422 - except Exception: - content = {'msg': G['internal_error']} - status = 500 - else: - content = {'msg': R['update']['success'], 'reservation': found_user.as_dict} - status = 201 - else: - content = {'msg': G['bad_request']} - status = 400 - - return content, status From f53365cf3d97029c03cc95e80635b58a0bf25fba Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 19 Sep 2020 15:23:32 +0200 Subject: [PATCH 030/175] Add functional tests for Group, Restriction and Schedule controllers --- tests/conftest.py | 1 + tests/fixtures/controllers.py | 38 +++ tests/functional/controllers/__init__.py | 8 + .../controllers/test_group_controller.py | 148 +++++++++ .../test_restriction_controller.py | 307 ++++++++++++++++++ .../controllers/test_schedule_controller.py | 156 +++++++++ 6 files changed, 658 insertions(+) create mode 100644 tests/fixtures/controllers.py create mode 100644 tests/functional/controllers/__init__.py create mode 100644 tests/functional/controllers/test_group_controller.py create mode 100644 tests/functional/controllers/test_restriction_controller.py create mode 100644 tests/functional/controllers/test_schedule_controller.py diff --git a/tests/conftest.py b/tests/conftest.py index bc6fa217..ac9037ac 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,3 +2,4 @@ from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, \ new_group_with_member, resource1, resource2, restriction, active_schedule, inactive_schedule from fixtures.database import tables +from fixtures.controllers import client \ No newline at end of file diff --git a/tests/fixtures/controllers.py b/tests/fixtures/controllers.py new file mode 100644 index 00000000..b1352d62 --- /dev/null +++ b/tests/fixtures/controllers.py @@ -0,0 +1,38 @@ +import pytest +import connexion +from flask_cors import CORS +from tensorhive.app.web.AppServer import API_SERVER, API + + +API_URI = 'http://' + API_SERVER.HOST + ':' + str(API_SERVER.PORT) + '/' + API.URL_PREFIX + + +@pytest.fixture +def client(): + app = connexion.FlaskApp(__name__) + app.add_api('../../tensorhive/api/' + API.SPEC_FILE, + arguments={ + 'title': API.TITLE, + 'version': API.VERSION, + 'url_prefix': API.URL_PREFIX, + 'RESPONSES': API.RESPONSES + }, + resolver=connexion.RestyResolver(API.IMPL_LOCATION), + strict_validation=True) + CORS(app.app) + return app.app.test_client() + + +# @pytest.fixture(scope='function') +# def skip_jwt(monkeypatch): +# monkeypatch.setattr('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None) +# +# +# @pytest.fixture(scope='function') +# def skip_admin(monkeypatch): +# def no_verify(): +# pass +# +# # monkeypatch.setattr('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None) +# monkeypatch.setattr('tensorhive.authorization.admin_required', no_verify) +# diff --git a/tests/functional/controllers/__init__.py b/tests/functional/controllers/__init__.py new file mode 100644 index 00000000..b273c9f3 --- /dev/null +++ b/tests/functional/controllers/__init__.py @@ -0,0 +1,8 @@ +from unittest.mock import patch +from tensorhive.app.web.AppServer import API_SERVER, API + +API_URI = 'http://' + API_SERVER.HOST + ':' + str(API_SERVER.PORT) + '/' + API.URL_PREFIX +HEADERS = {'Authorization': 'Bearer XXX', 'Content-Type': 'application/json'} + +patch('tensorhive.authorization.admin_required', lambda x: x).start() +patch('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None).start() diff --git a/tests/functional/controllers/test_group_controller.py b/tests/functional/controllers/test_group_controller.py new file mode 100644 index 00000000..160d0c4d --- /dev/null +++ b/tests/functional/controllers/test_group_controller.py @@ -0,0 +1,148 @@ +from tensorhive.models.Group import Group +from tests.functional.controllers import API_URI as BASE_URI, HEADERS +from http import HTTPStatus + +import json + +ENDPOINT = BASE_URI + '/groups' + + +# POST /groups +def test_create(tables, client): + group_name = 'TestGroup' + data = {'name': group_name} + + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.CREATED + assert resp_json['group']['id'] is not None + assert resp_json['group']['name'] == group_name + assert Group.get(int(resp_json['group']['id'])) is not None + + +# GET /groups +def test_get_list_of_groups(tables, client): + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert len(resp_json) == 0 # no groups added yet + + # Now let's add one group + client.post(ENDPOINT, headers=HEADERS, data=json.dumps({'name': 'Test'})) + + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert len(resp_json) == 1 # one group added already + + +# GET /groups/{id} +def test_get_group_by_id(tables, client, new_group): + new_group.save() + + # Now try getting it + resp = client.get(ENDPOINT + '/' + str(new_group.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json['group']['id'] == new_group.id + assert resp_json['group']['name'] == new_group.name + + +# GET /groups/{id} - nonexistent id +def test_get_group_by_id_that_doesnt_exist(tables, client): + non_existent_id = '777' + resp = client.get(ENDPOINT + '/' + non_existent_id, headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /groups/{id} +def test_update_group(tables, client, new_group): + new_group.save() + + new_group_name = new_group.name + '111' + resp = client.put(ENDPOINT + '/' + str(new_group.id), headers=HEADERS, data=json.dumps({'name': new_group_name})) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json['group']['name'] == new_group_name + assert Group.get(new_group.id).name == new_group_name + + +# PUT /groups/{id} - nonexistent id +def test_update_group_that_doesnt_exist(tables, client): + non_existent_id = '777' + resp = client.put(ENDPOINT + '/' + non_existent_id, headers=HEADERS, data=json.dumps({'name': 'test'})) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# DELETE /groups/{id} +def test_delete_group(tables, client, new_group): + new_group.save() + + resp = client.delete(ENDPOINT + '/' + str(new_group.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + + # Let's get all groups to verify + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert len(resp_json) == 0 + + +# DELETE /groups/{id} - nonexistent id +def test_delete_group_that_doesnt_exist(tables, client): + non_existent_id = '777' + resp = client.delete(ENDPOINT + '/' + non_existent_id, headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /groups/{id}/users/{id} +def test_add_user_to_a_group(tables, client, new_group, new_user): + new_group.save() + new_user.save() + + resp = client.put(ENDPOINT + '/{}/users/{}'.format(new_group.id, new_user.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert new_group in new_user.groups + assert new_user in new_group.users + + +# DELETE /groups/{id}/users/{id} +def test_remove_user_from_a_group(tables, client, new_group_with_member): + new_group_with_member.save() + user = new_group_with_member.users[0] + + resp = client.delete(ENDPOINT + '/{}/users/{}'.format(new_group_with_member.id, user.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert new_group_with_member not in user.groups + assert user not in new_group_with_member.users + + +# PUT /groups/{id}/users/{id} - nonexistent user id +def test_add_nonexistent_user_to_a_group(tables, client, new_group): + new_group.save() + nonexistent_user_id = '777' + + resp = client.put(ENDPOINT + '/{}/users/{}'.format(new_group.id, nonexistent_user_id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /groups/{id}/users/{id} - nonexistent group id +def test_add_user_to_nonexistent_group(tables, client, new_user): + new_user.save() + nonexistent_group_id = '777' + + resp = client.put(ENDPOINT + '/{}/users/{}'.format(nonexistent_group_id, new_user.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py new file mode 100644 index 00000000..a43ad7a4 --- /dev/null +++ b/tests/functional/controllers/test_restriction_controller.py @@ -0,0 +1,307 @@ +from tensorhive.models.Restriction import Restriction +from tests.functional.controllers import API_URI as BASE_URI, HEADERS +from http import HTTPStatus +from sqlalchemy.orm.exc import NoResultFound + +import datetime +import json +import pytest + +ENDPOINT = BASE_URI + '/restrictions' + + +# GET /restrictions +def test_get_all_restrictions(tables, client): + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert len(resp_json) == 0 + + # Create new restriction and save it to the DB + start_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=5) + end_time = start_time + datetime.timedelta(hours=8) + restriction = Restriction(name='TestRestriction', starts_at=start_time, ends_at=end_time, is_global=False) + restriction.save() + + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert len(resp_json) == 1 + + +# GET /restrictions?user_id={id} +def test_get_user_restrictions(tables, client, new_user, restriction): + new_user.save() + restriction.apply_to_user(new_user) + + resp = client.get(ENDPOINT + '?user_id={}'.format(new_user.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json[0]['id'] == restriction.id + + +# GET /restrictions?user_id={id}&include_user_groups=True +def test_get_users_group_restrictions(tables, client, new_group_with_member, restriction): + new_group_with_member.save() + restriction.apply_to_group(new_group_with_member) + + user = new_group_with_member.users[0] + resp = client.get(ENDPOINT + '?user_id={}&include_user_groups=True'.format(user.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json[0]['id'] == restriction.id + + +# GET /restrictions?group_id={id} +def test_get_group_restrictions(tables, client, new_group, restriction): + new_group.save() + restriction.apply_to_group(new_group) + + resp = client.get(ENDPOINT + '?group_id={}'.format(new_group.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json[0]['id'] == restriction.id + + +# GET /restrictions?resource_id={id} +def test_get_resource_restrictions(tables, client, resource1, restriction): + resource1.save() + restriction.apply_to_resource(resource1) + + resp = client.get(ENDPOINT + '?resource_id={}'.format(resource1.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json[0]['id'] == restriction.id + + +# GET /restrictions?schedule_id={id} +def test_get_schedule_restrictions(tables, client, active_schedule, restriction): + active_schedule.save() + restriction.add_schedule(active_schedule) + + resp = client.get(ENDPOINT + '?schedule_id={}'.format(active_schedule.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json[0]['id'] == restriction.id + + +# POST /restrictions - correct way +def test_create_restriction(tables, client): + data = { + 'name': 'Test restriction', + 'start': '2100-01-01T10:00:00.000Z', + 'end': '2101-02-01T10:00:00.000Z', + 'isGlobal': False + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.CREATED + assert Restriction.get(resp_json['restriction']['id']) is not None + + +# POST /restrictions - missing data +def test_create_restriction_missing_data(tables, client): + data = { + 'name': 'Test restriction', + 'end': '2101-02-01T10:00:00.000Z', + 'isGlobal': False + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.BAD_REQUEST + + +# PUT /restrictions/{id} - update existing restriction - correct +def test_update_restriction(tables, client, restriction): + restriction.save() + new_name = 'Modified name' + data = { + 'name': new_name + } + resp = client.put(ENDPOINT + '/' + str(restriction.id), headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.OK + assert restriction.name == new_name + + +# PUT /restrictions/{id} - update existing restriction - incorrect, verify that parameters did not get updated +def test_update_restriction_incorrect_data(tables, client, restriction): + restriction.save() + old_start_date = restriction.starts_at + old_end_date = restriction.ends_at + data = { + 'start': '2200-01-01T10:00:00.000Z', # start date is after the end date, this request shouldn't be accepted + 'end': '2199-02-01T10:00:00.000Z', + } + resp = client.put(ENDPOINT + '/' + str(restriction.id), headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.UNPROCESSABLE_ENTITY + assert restriction.starts_at == old_start_date + assert restriction.ends_at == old_end_date + + +# PUT /restrictions/{id} - nonexistent restriction +def test_update_nonexistent_restriction(tables, client): + nonexistent_id = '777' + data = { + 'name': 'Something' + } + resp = client.put(ENDPOINT + '/' + nonexistent_id, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/groups/{group_id} - apply restriction to group - correct +def test_apply_restriction_to_group(tables, client, restriction, new_group): + new_group.save() + + resp = client.put(ENDPOINT + '/{}/groups/{}'.format(restriction.id, new_group.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction in new_group.get_restrictions() + assert new_group in restriction.groups + + +# PUT /restrictions/{id}/groups/{group_id} - nonexistent group +def test_apply_restriction_to_nonexistent_group(tables, client, restriction): + restriction.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/groups/{}'.format(restriction.id, nonexistent_id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/groups/{group_id} - nonexistent restriction +def test_apply_nonexistent_restriction_to_group(tables, client, new_group): + new_group.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/groups/{}'.format(nonexistent_id, new_group.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/resources/{group_id} - apply restriction to resource - correct +def test_apply_restriction_to_resource(tables, client, restriction, resource1): + restriction.save() + resource1.save() + + resp = client.put(ENDPOINT + '/{}/resources/{}'.format(restriction.id, resource1.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction in resource1.get_restrictions() + assert resource1 in restriction.resources + + +# PUT /restrictions/{id}/resources/{group_id} - nonexistent resource +def test_apply_restriction_to_nonexistent_resource(tables, client, restriction): + restriction.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/resources/{}'.format(restriction.id, nonexistent_id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/resources/{group_id} - nonexistent restriction +def test_apply_nonexistent_restriction_to_resource(tables, client, resource1): + resource1.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/resources/{}'.format(nonexistent_id, resource1.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/schedules/{group_id} - apply restriction to schedule - correct +def test_apply_restriction_to_schedule(tables, client, restriction, active_schedule): + restriction.save() + active_schedule.save() + + resp = client.put(ENDPOINT + '/{}/schedules/{}'.format(restriction.id, active_schedule.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction in active_schedule.restrictions + assert active_schedule in restriction.schedules + + +# PUT /restrictions/{id}/schedules/{group_id} - nonexistent schedule +def test_apply_restriction_to_nonexistent_schedule(tables, client, restriction): + restriction.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/schedules/{}'.format(restriction.id, nonexistent_id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/schedules/{group_id} - nonexistent restriction +def test_apply_nonexistent_restriction_to_schedule(tables, client, active_schedule): + active_schedule.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/schedules/{}'.format(nonexistent_id, active_schedule.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/users/{group_id} - apply restriction to group - correct +def test_apply_restriction_to_user(tables, client, restriction, new_user): + restriction.save() + new_user.save() + + resp = client.put(ENDPOINT + '/{}/users/{}'.format(restriction.id, new_user.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction in new_user.get_restrictions() + assert new_user in restriction.users + + +# PUT /restrictions/{id}/users/{group_id} - nonexistent user +def test_apply_restriction_to_nonexistent_user(tables, client, restriction): + restriction.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/users/{}'.format(restriction.id, nonexistent_id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /restrictions/{id}/users/{group_id} - nonexistent restriction +def test_apply_nonexistent_restriction_to_user(tables, client, new_user): + new_user.save() + nonexistent_id = '777' + + resp = client.put(ENDPOINT + '/{}/users/{}'.format(nonexistent_id, new_user.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# DELETE /restriction/{id} - delete restriction - correct +def test_delete_restriction(tables, client, restriction, new_user): + new_user.save() + restriction.apply_to_user(new_user) + + resp = client.delete(ENDPOINT + '/' + str(restriction.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction not in new_user.get_restrictions() + with pytest.raises(NoResultFound): + Restriction.get(restriction.id) + + +# DELETE /restriction/{id} - delete nonexistent restriction +def test_delete_nonexistent_restriction(tables, client): + nonexistent_id = '777' + resp = client.delete(ENDPOINT + '/' + nonexistent_id, headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND diff --git a/tests/functional/controllers/test_schedule_controller.py b/tests/functional/controllers/test_schedule_controller.py new file mode 100644 index 00000000..87c3d225 --- /dev/null +++ b/tests/functional/controllers/test_schedule_controller.py @@ -0,0 +1,156 @@ +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tests.functional.controllers import API_URI as BASE_URI, HEADERS +from http import HTTPStatus +from sqlalchemy.orm.exc import NoResultFound + +import datetime +import json +import pytest + +ENDPOINT = BASE_URI + '/schedules' + + +# POST /schedules +def test_create_schedule(tables, client): + data = { + 'hourStart': '8:00', + 'hourEnd': '16:00', + 'scheduleDays': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.CREATED + assert RestrictionSchedule.get(resp_json['schedule']['id']) is not None + + +# POST /schedules - missing data +def test_create_schedule_with_missing_start_hour(tables, client): + data = { + 'hourEnd': '16:00', + 'scheduleDays': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.BAD_REQUEST + + +# POST /schedules - incorrect data +def test_create_schedule_with_nonexistent_schedule_days(tables, client): + data = { + 'hourStart': '8:00', + 'hourEnd': '16:00', + 'scheduleDays': ['Monday', 'Tuesday', 'SpecialDay'] + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.UNPROCESSABLE_ENTITY + + +# POST /schedules - missing data +def test_create_schedule_with_no_schedule_days(tables, client): + data = { + 'hourStart': '8:00', + 'hourEnd': '16:00' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.BAD_REQUEST + + +# GET /schedules +def test_get_list_of_schedules(tables, client): + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert len(resp_json) == 0 + + client.post(ENDPOINT, headers=HEADERS, data=json.dumps({'hourStart': '8:00', 'hourEnd': '16:00', + 'scheduleDays': ['Monday']})) + resp = client.get(ENDPOINT, headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert len(resp_json) == 1 + + +# GET /schedules/{id} +def test_get_schedule_by_id(tables, client, active_schedule): + resp = client.get(ENDPOINT + '/' + str(active_schedule.id), headers=HEADERS) + resp_json = json.loads(resp.data) + + assert resp.status_code == HTTPStatus.OK + assert resp_json['schedule']['id'] == active_schedule.id + + +# GET /schedules/{id} - nonexistent id +def test_get_nonexistent_schedule_by_id(tables, client): + nonexistent_id = '777' + resp = client.get(ENDPOINT + '/' + nonexistent_id, headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# DELETE /schedules/{id} +def test_delete_schedule(tables, client, active_schedule): + id = active_schedule.id + resp = client.delete(ENDPOINT + '/' + str(id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + with pytest.raises(NoResultFound): + RestrictionSchedule.get(id) + + +# DELETE /schedules/{id} - nonexistent id +def test_delete_nonexistent_schedule(tables, client): + nonexistent_id = '777' + resp = client.delete(ENDPOINT + '/' + nonexistent_id, headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /schedules/{id} +def test_update_schedule(tables, client, active_schedule): + active_schedule.hour_start = datetime.time(8, 0, 0) + active_schedule.hour_end = datetime.time(10, 0, 0) + active_schedule.save() + + data = { + 'hourStart': '8:30', + 'hourEnd': '9:30' + } + resp = client.put(ENDPOINT + '/' + str(active_schedule.id), headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.OK + assert active_schedule.hour_start == datetime.time(8, 30, 0) + assert active_schedule.hour_end == datetime.time(9, 30, 0) + + +# PUT /schedules/{id} - nonexistent id +def test_update_nonexistent_schedule(tables, client): + nonexistent_id = '777' + data = { + 'hourStart': '8:30', + 'hourEnd': '9:30' + } + resp = client.put(ENDPOINT + '/' + nonexistent_id, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /schedules/{id} - incorrect data +def test_update_schedule_with_invalid_start_and_end_hours(tables, client, active_schedule): + active_schedule.hour_start = datetime.time(8, 0, 0) + active_schedule.hour_end = datetime.time(10, 0, 0) + active_schedule.save() + + data = { + 'hourStart': '15:30', + 'hourEnd': '9:30' + } + resp = client.put(ENDPOINT + '/' + str(active_schedule.id), headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.UNPROCESSABLE_ENTITY + assert active_schedule.hour_start == datetime.time(8, 0, 0) + assert active_schedule.hour_end == datetime.time(10, 0, 0) From d3b9bec62cb13393846747baa1fc90b17c22ed2c Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 19 Sep 2020 15:31:03 +0200 Subject: [PATCH 031/175] Remove redundant comments, fix whitespaces --- tests/conftest.py | 2 +- tests/fixtures/controllers.py | 15 --------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index ac9037ac..54ddab8c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,4 +2,4 @@ from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, \ new_group_with_member, resource1, resource2, restriction, active_schedule, inactive_schedule from fixtures.database import tables -from fixtures.controllers import client \ No newline at end of file +from fixtures.controllers import client diff --git a/tests/fixtures/controllers.py b/tests/fixtures/controllers.py index b1352d62..c0a96037 100644 --- a/tests/fixtures/controllers.py +++ b/tests/fixtures/controllers.py @@ -21,18 +21,3 @@ def client(): strict_validation=True) CORS(app.app) return app.app.test_client() - - -# @pytest.fixture(scope='function') -# def skip_jwt(monkeypatch): -# monkeypatch.setattr('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None) -# -# -# @pytest.fixture(scope='function') -# def skip_admin(monkeypatch): -# def no_verify(): -# pass -# -# # monkeypatch.setattr('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None) -# monkeypatch.setattr('tensorhive.authorization.admin_required', no_verify) -# From 02535d999320e552ffb5aed3701c692a55cd7121 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 19 Sep 2020 18:30:51 +0200 Subject: [PATCH 032/175] Fix mismatch between column names in ORM and in the DB --- tensorhive/models/Restriction.py | 6 +++--- tensorhive/models/RestrictionSchedule.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 06dc7aa5..50860fbe 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -34,9 +34,9 @@ class Restriction(CRUDModel, Base): # type: ignore id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50)) - _created_at = Column(DateTime, default=datetime.datetime.utcnow) - _starts_at = Column(DateTime, nullable=False) - _ends_at = Column(DateTime) + _created_at = Column('created_at', DateTime, default=datetime.datetime.utcnow) + _starts_at = Column('starts_at', DateTime, nullable=False) + _ends_at = Column('ends_at', DateTime) is_global = Column(Boolean, nullable=False) _users = relationship('User', secondary='restriction2assignee') diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index bd9d6386..1b2f9efe 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -30,7 +30,7 @@ class RestrictionSchedule(CRUDModel, Base): # type: ignore __table_args__ = {'sqlite_autoincrement': True} id = Column(Integer, primary_key=True, autoincrement=True) - _schedule_days = Column(String(7), nullable=False) + _schedule_days = Column('schedule_days', String(7), nullable=False) hour_start = Column(Time(), nullable=False) hour_end = Column(Time(), nullable=False) From edd294bff8c9d9824e72222c2d73d9ded429f691 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 19 Sep 2020 20:13:28 +0200 Subject: [PATCH 033/175] Fix failing functional tests --- tests/fixtures/controllers.py | 6 ++++- tests/functional/controllers/__init__.py | 8 ------- .../controllers/test_group_controller.py | 14 ++++++------ .../test_restriction_controller.py | 22 ++++++++++--------- .../controllers/test_schedule_controller.py | 13 ++++++----- 5 files changed, 32 insertions(+), 31 deletions(-) delete mode 100644 tests/functional/controllers/__init__.py diff --git a/tests/fixtures/controllers.py b/tests/fixtures/controllers.py index c0a96037..35a9beca 100644 --- a/tests/fixtures/controllers.py +++ b/tests/fixtures/controllers.py @@ -1,10 +1,14 @@ import pytest import connexion from flask_cors import CORS +from unittest.mock import patch from tensorhive.app.web.AppServer import API_SERVER, API - API_URI = 'http://' + API_SERVER.HOST + ':' + str(API_SERVER.PORT) + '/' + API.URL_PREFIX +HEADERS = {'Authorization': 'Bearer XXX', 'Content-Type': 'application/json'} + +patch('tensorhive.authorization.admin_required', lambda x: x).start() +patch('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None).start() @pytest.fixture diff --git a/tests/functional/controllers/__init__.py b/tests/functional/controllers/__init__.py deleted file mode 100644 index b273c9f3..00000000 --- a/tests/functional/controllers/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from unittest.mock import patch -from tensorhive.app.web.AppServer import API_SERVER, API - -API_URI = 'http://' + API_SERVER.HOST + ':' + str(API_SERVER.PORT) + '/' + API.URL_PREFIX -HEADERS = {'Authorization': 'Bearer XXX', 'Content-Type': 'application/json'} - -patch('tensorhive.authorization.admin_required', lambda x: x).start() -patch('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None).start() diff --git a/tests/functional/controllers/test_group_controller.py b/tests/functional/controllers/test_group_controller.py index 160d0c4d..f68cc9dd 100644 --- a/tests/functional/controllers/test_group_controller.py +++ b/tests/functional/controllers/test_group_controller.py @@ -1,5 +1,5 @@ from tensorhive.models.Group import Group -from tests.functional.controllers import API_URI as BASE_URI, HEADERS +from fixtures.controllers import API_URI as BASE_URI, HEADERS from http import HTTPStatus import json @@ -13,7 +13,7 @@ def test_create(tables, client): data = {'name': group_name} resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.CREATED assert resp_json['group']['id'] is not None @@ -24,7 +24,7 @@ def test_create(tables, client): # GET /groups def test_get_list_of_groups(tables, client): resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 0 # no groups added yet @@ -33,7 +33,7 @@ def test_get_list_of_groups(tables, client): client.post(ENDPOINT, headers=HEADERS, data=json.dumps({'name': 'Test'})) resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 1 # one group added already @@ -45,7 +45,7 @@ def test_get_group_by_id(tables, client, new_group): # Now try getting it resp = client.get(ENDPOINT + '/' + str(new_group.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json['group']['id'] == new_group.id @@ -66,7 +66,7 @@ def test_update_group(tables, client, new_group): new_group_name = new_group.name + '111' resp = client.put(ENDPOINT + '/' + str(new_group.id), headers=HEADERS, data=json.dumps({'name': new_group_name})) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json['group']['name'] == new_group_name @@ -91,7 +91,7 @@ def test_delete_group(tables, client, new_group): # Let's get all groups to verify resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert len(resp_json) == 0 diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py index a43ad7a4..8557cf5d 100644 --- a/tests/functional/controllers/test_restriction_controller.py +++ b/tests/functional/controllers/test_restriction_controller.py @@ -1,5 +1,6 @@ +from tensorhive.database import db_session from tensorhive.models.Restriction import Restriction -from tests.functional.controllers import API_URI as BASE_URI, HEADERS +from fixtures.controllers import API_URI as BASE_URI, HEADERS from http import HTTPStatus from sqlalchemy.orm.exc import NoResultFound @@ -13,7 +14,7 @@ # GET /restrictions def test_get_all_restrictions(tables, client): resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 0 @@ -25,7 +26,7 @@ def test_get_all_restrictions(tables, client): restriction.save() resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 1 @@ -37,7 +38,7 @@ def test_get_user_restrictions(tables, client, new_user, restriction): restriction.apply_to_user(new_user) resp = client.get(ENDPOINT + '?user_id={}'.format(new_user.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json[0]['id'] == restriction.id @@ -50,7 +51,7 @@ def test_get_users_group_restrictions(tables, client, new_group_with_member, res user = new_group_with_member.users[0] resp = client.get(ENDPOINT + '?user_id={}&include_user_groups=True'.format(user.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json[0]['id'] == restriction.id @@ -62,7 +63,7 @@ def test_get_group_restrictions(tables, client, new_group, restriction): restriction.apply_to_group(new_group) resp = client.get(ENDPOINT + '?group_id={}'.format(new_group.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json[0]['id'] == restriction.id @@ -74,7 +75,7 @@ def test_get_resource_restrictions(tables, client, resource1, restriction): restriction.apply_to_resource(resource1) resp = client.get(ENDPOINT + '?resource_id={}'.format(resource1.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json[0]['id'] == restriction.id @@ -86,7 +87,7 @@ def test_get_schedule_restrictions(tables, client, active_schedule, restriction) restriction.add_schedule(active_schedule) resp = client.get(ENDPOINT + '?schedule_id={}'.format(active_schedule.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json[0]['id'] == restriction.id @@ -101,7 +102,7 @@ def test_create_restriction(tables, client): 'isGlobal': False } resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.CREATED assert Restriction.get(resp_json['restriction']['id']) is not None @@ -134,7 +135,6 @@ def test_update_restriction(tables, client, restriction): # PUT /restrictions/{id} - update existing restriction - incorrect, verify that parameters did not get updated def test_update_restriction_incorrect_data(tables, client, restriction): - restriction.save() old_start_date = restriction.starts_at old_end_date = restriction.ends_at data = { @@ -143,6 +143,8 @@ def test_update_restriction_incorrect_data(tables, client, restriction): } resp = client.put(ENDPOINT + '/' + str(restriction.id), headers=HEADERS, data=json.dumps(data)) + db_session.remove() # make sure we'll get the restriction from the DB, and not from memory + restriction = Restriction.get(restriction.id) assert resp.status_code == HTTPStatus.UNPROCESSABLE_ENTITY assert restriction.starts_at == old_start_date assert restriction.ends_at == old_end_date diff --git a/tests/functional/controllers/test_schedule_controller.py b/tests/functional/controllers/test_schedule_controller.py index 87c3d225..179b3f17 100644 --- a/tests/functional/controllers/test_schedule_controller.py +++ b/tests/functional/controllers/test_schedule_controller.py @@ -1,5 +1,6 @@ +from tensorhive.database import db_session from tensorhive.models.RestrictionSchedule import RestrictionSchedule -from tests.functional.controllers import API_URI as BASE_URI, HEADERS +from fixtures.controllers import API_URI as BASE_URI, HEADERS from http import HTTPStatus from sqlalchemy.orm.exc import NoResultFound @@ -18,7 +19,7 @@ def test_create_schedule(tables, client): 'scheduleDays': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] } resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.CREATED assert RestrictionSchedule.get(resp_json['schedule']['id']) is not None @@ -61,7 +62,7 @@ def test_create_schedule_with_no_schedule_days(tables, client): # GET /schedules def test_get_list_of_schedules(tables, client): resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 0 @@ -69,7 +70,7 @@ def test_get_list_of_schedules(tables, client): client.post(ENDPOINT, headers=HEADERS, data=json.dumps({'hourStart': '8:00', 'hourEnd': '16:00', 'scheduleDays': ['Monday']})) resp = client.get(ENDPOINT, headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 1 @@ -78,7 +79,7 @@ def test_get_list_of_schedules(tables, client): # GET /schedules/{id} def test_get_schedule_by_id(tables, client, active_schedule): resp = client.get(ENDPOINT + '/' + str(active_schedule.id), headers=HEADERS) - resp_json = json.loads(resp.data) + resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert resp_json['schedule']['id'] == active_schedule.id @@ -151,6 +152,8 @@ def test_update_schedule_with_invalid_start_and_end_hours(tables, client, active } resp = client.put(ENDPOINT + '/' + str(active_schedule.id), headers=HEADERS, data=json.dumps(data)) + db_session.remove() # make sure we'll get the restriction from the DB, and not from memory + active_schedule = RestrictionSchedule.get(active_schedule.id) assert resp.status_code == HTTPStatus.UNPROCESSABLE_ENTITY assert active_schedule.hour_start == datetime.time(8, 0, 0) assert active_schedule.hour_end == datetime.time(10, 0, 0) From 5f7474fe7d28651700a2ae3004f83e238b7c96ca Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sun, 20 Sep 2020 14:45:40 +0200 Subject: [PATCH 034/175] Minor refactoring changes --- tensorhive/models/Reservation.py | 10 +++++----- tensorhive/models/Restriction.py | 10 +++++----- tensorhive/models/RestrictionSchedule.py | 2 +- tensorhive/models/Task.py | 4 ++-- tensorhive/utils/DateUtils.py | 8 ++++---- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tensorhive/models/Reservation.py b/tensorhive/models/Reservation.py index e8461e2f..fbf535b4 100644 --- a/tensorhive/models/Reservation.py +++ b/tensorhive/models/Reservation.py @@ -63,7 +63,7 @@ def starts_at(self): @starts_at.setter # type: ignore def starts_at(self, value): self._starts_at = DateUtils.try_parse_string(value) - if not self._starts_at: + if self._starts_at is None: log.error('Unsupported type (starts_at={})'.format(value)) @hybrid_property @@ -73,7 +73,7 @@ def ends_at(self): @ends_at.setter # type: ignore def ends_at(self, value): self._ends_at = DateUtils.try_parse_string(value) - if not self._ends_at: + if self._ends_at is None: log.error('Unsupported type (ends_at={})'.format(value)) @hybrid_property @@ -151,8 +151,8 @@ def as_dict(self): 'userName': self.user.username, 'gpuUtilAvg': self.gpu_util_avg, 'memUtilAvg': self.mem_util_avg, - 'start': DateUtils.parse_datetime(self.starts_at), - 'end': DateUtils.parse_datetime(self.ends_at), - 'createdAt': DateUtils.parse_datetime(self.created_at), + 'start': DateUtils.stringify_datetime(self.starts_at), + 'end': DateUtils.stringify_datetime(self.ends_at), + 'createdAt': DateUtils.stringify_datetime(self.created_at), 'isCancelled': str(self.is_cancelled) } diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 50860fbe..ddb53f2d 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -74,7 +74,7 @@ def created_at(self): @starts_at.setter def starts_at(self, value: str): self._starts_at = DateUtils.try_parse_string(value) - if not self._starts_at: + if self._starts_at is None: log.error('Unsupported type (starts_at={})'.format(value)) @ends_at.setter @@ -84,7 +84,7 @@ def ends_at(self, value: str): @created_at.setter def created_at(self, value: str): self._created_at = DateUtils.try_parse_string(value) - if not self._created_at: + if self._created_at is None: log.error('Unsupported type (created_at={})'.format(value)) @hybrid_property @@ -185,9 +185,9 @@ def as_dict(self, include_groups=False, include_users=False, include_resources=F restriction = { 'id': self.id, 'name': self.name, - 'createdAt': DateUtils.parse_datetime(self.created_at), - 'startsAt': DateUtils.parse_datetime(self.starts_at), - 'endsAt': DateUtils.try_parse_datetime(self.ends_at), + 'createdAt': DateUtils.stringify_datetime(self.created_at), + 'startsAt': DateUtils.stringify_datetime(self.starts_at), + 'endsAt': DateUtils.try_stringify_datetime(self.ends_at), 'isGlobal': self.is_global, 'schedules': [schedule.as_dict for schedule in self.schedules] } diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index 1b2f9efe..e141e120 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -97,7 +97,7 @@ def parse_schedule_string(schedule: str) -> List[Weekday]: @staticmethod def parse_schedule_list(schedule: List[Weekday]) -> str: - return ''.join((sorted(''.join([str(day.value) for day in schedule])))) + return ''.join((sorted([str(day.value) for day in schedule]))) class Restriction2Schedule(Base): # type: ignore diff --git a/tensorhive/models/Task.py b/tensorhive/models/Task.py index 34e4810e..9b656253 100644 --- a/tensorhive/models/Task.py +++ b/tensorhive/models/Task.py @@ -52,6 +52,6 @@ def as_dict(self): 'pid': self.pid, 'status': self.status.name, 'command': self.command, - 'spawnAt': DateUtils.try_parse_datetime(self.spawn_at), - 'terminateAt': DateUtils.try_parse_datetime(self.terminate_at) + 'spawnAt': DateUtils.try_stringify_datetime(self.spawn_at), + 'terminateAt': DateUtils.try_stringify_datetime(self.terminate_at) } diff --git a/tensorhive/utils/DateUtils.py b/tensorhive/utils/DateUtils.py index 08f04607..11ecc88f 100644 --- a/tensorhive/utils/DateUtils.py +++ b/tensorhive/utils/DateUtils.py @@ -26,7 +26,7 @@ def parse_string(cls, value: str) -> datetime: return result @classmethod - def parse_datetime(cls, value: datetime) -> str: + def stringify_datetime(cls, value: datetime) -> str: """ Parses datetime object into string. :param value: datetime object representing certain date @@ -49,12 +49,12 @@ def try_parse_string(cls, value: Union[str, datetime, None]) -> Optional[datetim return None @classmethod - def try_parse_datetime(cls, value: Optional[datetime]) -> Optional[str]: + def try_stringify_datetime(cls, value: Optional[datetime]) -> Optional[str]: """ Parses datetime object into string gracefully. :param value: datetime object representing certain date or None. :return: string with date that was represented by the datetime object or None if input value was None. """ - if not value: + if value is None: return None - return cls.parse_datetime(value) + return cls.stringify_datetime(value) From b34669ae3ab3ba57207a4316b6d3347e11a33aca Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 3 Oct 2020 18:22:14 +0200 Subject: [PATCH 035/175] Allow include_global option in get_restrictions only for Resource model --- tensorhive/models/Resource.py | 26 +++++++++++++++++++++ tensorhive/models/RestrictionAssignee.py | 19 +++------------ tensorhive/models/User.py | 14 +++++------ tests/unit/models/test_restriction_model.py | 2 +- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/tensorhive/models/Resource.py b/tensorhive/models/Resource.py index 0ecd1210..4876dbef 100644 --- a/tensorhive/models/Resource.py +++ b/tensorhive/models/Resource.py @@ -22,6 +22,32 @@ def __repr__(self): def check_assertions(self): pass + def get_restrictions(self, include_expired=False, include_global=True): + """ + :param include_expired: If set to true will also return restrictions that have already expired. + :param include_global: If set to true will also include global restrictions (which apply to all resources) + :return: Restrictions assigned to given resource. + """ + from tensorhive.models.Restriction import Restriction + + restrictions = super(Resource, self).get_restrictions(include_expired) + if include_global: + restrictions = list(set(restrictions + Restriction + .get_global_restrictions(include_expired=include_expired))) + return restrictions + + def get_active_restrictions(self, include_global=True): + """ + :param include_global: If set to true will also include global restrictions (which apply to all resources) + :return: Active restrictions (according to start/end times and schedules) assigned to given entity. + """ + from tensorhive.models.Restriction import Restriction + + restrictions = super(Resource, self).get_active_restrictions() + if include_global: + restrictions = list(set(restrictions + Restriction.get_global_restrictions(include_expired=False))) + return restrictions + @classmethod def get_by_name(cls, resource_name): return db_session.query(Resource).filter(Resource.name == resource_name).all() diff --git a/tensorhive/models/RestrictionAssignee.py b/tensorhive/models/RestrictionAssignee.py index 1ce2c47f..1bf8cafb 100644 --- a/tensorhive/models/RestrictionAssignee.py +++ b/tensorhive/models/RestrictionAssignee.py @@ -12,32 +12,19 @@ class RestrictionAssignee(Base): # type: ignore def _restrictions(self): raise NotImplementedError - def get_restrictions(self, include_expired=False, include_global=False): + def get_restrictions(self, include_expired=False): """ :param include_expired: If set to true will also return restrictions that have already expired. - :param include_global: If set to true will also include global restrictions (which apply to all resources) :return: Restrictions assigned to given entity. """ - from tensorhive.models.Restriction import Restriction - if include_expired: restrictions = self._restrictions else: restrictions = [r for r in self._restrictions if not r.is_expired] - - if include_global: - restrictions = list(set(restrictions + Restriction - .get_global_restrictions(include_expired=include_expired))) return restrictions - def get_active_restrictions(self, include_global=False): + def get_active_restrictions(self): """ - :param include_global: If set to true will also include global restrictions (which apply to all resources) :return: Active restrictions (according to start/end times and schedules) assigned to given entity. """ - from tensorhive.models.Restriction import Restriction - - restrictions = [r for r in self._restrictions if r.is_active] - if include_global: - restrictions = list(set(restrictions + Restriction.get_global_restrictions(include_expired=False))) - return restrictions + return [r for r in self._restrictions if r.is_active] diff --git a/tensorhive/models/User.py b/tensorhive/models/User.py index 03a1d1bc..6c4dad8c 100644 --- a/tensorhive/models/User.py +++ b/tensorhive/models/User.py @@ -145,18 +145,16 @@ def _as_dict(self, include_groups): def verify_hash(password, hash): return sha256.verify(password, hash) - def get_restrictions(self, include_expired=False, include_global=False, include_group=False): - restrictions = super(User, self).get_restrictions(include_expired=include_expired, - include_global=include_global) + def get_restrictions(self, include_expired=False, include_group=False): + restrictions = super(User, self).get_restrictions(include_expired=include_expired) if include_group: for group in self.groups: - restrictions = restrictions + group.get_restrictions(include_expired=include_expired, - include_global=include_global) + restrictions = restrictions + group.get_restrictions(include_expired=include_expired) return list(set(restrictions)) - def get_active_restrictions(self, include_global=False, include_group=False): - restrictions = super(User, self).get_active_restrictions(include_global=include_global) + def get_active_restrictions(self, include_group=False): + restrictions = super(User, self).get_active_restrictions() if include_group: for group in self.groups: - restrictions = restrictions + group.get_active_restrictions(include_global=include_global) + restrictions = restrictions + group.get_active_restrictions() return list(set(restrictions)) diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 1ebaf33f..5df64278 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -119,7 +119,7 @@ def test_restriction_with_dates_passed_as_string_gets_added_successfully(tables) is_global=False ) new_restriction.starts_at = '2020-09-29T18:07:44.191Z' - new_restriction.ends_at = '2020-09-30T18:07:44.191Z' + new_restriction.ends_at = '2120-09-30T18:07:44.191Z' new_restriction.save() From 09eab17e5e33fa7f2111b817e55f618a81abb685 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 3 Oct 2020 18:23:20 +0200 Subject: [PATCH 036/175] Rename parse_schedule_list method --- tensorhive/models/RestrictionSchedule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tensorhive/models/RestrictionSchedule.py b/tensorhive/models/RestrictionSchedule.py index e141e120..6c992834 100644 --- a/tensorhive/models/RestrictionSchedule.py +++ b/tensorhive/models/RestrictionSchedule.py @@ -68,7 +68,7 @@ def schedule_days(self, days: Union[List[Weekday], str]): if isinstance(days, str): self._schedule_days = (''.join(sorted(days))) else: - self._schedule_days = self.parse_schedule_list(days) + self._schedule_days = self.stringify_schedule_list(days) @property def is_active(self): @@ -96,7 +96,7 @@ def parse_schedule_string(schedule: str) -> List[Weekday]: return [Weekday(int(day)) for day in sorted(schedule)] @staticmethod - def parse_schedule_list(schedule: List[Weekday]) -> str: + def stringify_schedule_list(schedule: List[Weekday]) -> str: return ''.join((sorted([str(day.value) for day in schedule]))) From 3005ffa81fdf28d666d467545d59ed66f91979d7 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 3 Oct 2020 19:37:30 +0200 Subject: [PATCH 037/175] Update restriction model tests to reflect recent changes --- tests/unit/models/test_restriction_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 5df64278..853a8f0a 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -69,7 +69,7 @@ def test_it_should_be_impossible_to_create_or_edit_restriction_that_already_expi def test_apply_restriction_to_resource(tables, restriction, resource1): restriction.apply_to_resource(resource1) - assert restriction in resource1.get_restrictions() + assert restriction in resource1.get_restrictions(include_global=False) assert resource1 in restriction.resources @@ -78,8 +78,8 @@ def test_global_restriction_applies_to_all_resources(tables, restriction, resour restriction.save() assert len(restriction.resources) == 0 - assert restriction in resource1.get_restrictions(include_global=True) - assert restriction in resource2.get_restrictions(include_global=True) + assert restriction in resource1.get_restrictions() + assert restriction in resource2.get_restrictions() def test_restriction_without_schedules_is_active_only_when_between_start_and_end_dates(tables): From d76d8bea294a6d859eaea67eb1d63e782d517abb Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 3 Oct 2020 21:23:00 +0200 Subject: [PATCH 038/175] Fix is_cancelled column name --- tensorhive/models/Reservation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorhive/models/Reservation.py b/tensorhive/models/Reservation.py index fbf535b4..2f54c8ac 100644 --- a/tensorhive/models/Reservation.py +++ b/tensorhive/models/Reservation.py @@ -24,7 +24,7 @@ class Reservation(CRUDModel, Base): # type: ignore title = Column(String(60), unique=False, nullable=False) description = Column(String(200), nullable=True) protected_resource_id = Column(String(60), nullable=False) - _is_cancelled = Column(Boolean, nullable=True) + _is_cancelled = Column('is_cancelled', Boolean, nullable=True) gpu_util_avg = Column(Integer, nullable=True) mem_util_avg = Column(Integer, nullable=True) From d77c3653526470f5601c10408a5e305ed70de93e Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 3 Oct 2020 21:45:08 +0200 Subject: [PATCH 039/175] Add ability to easily retrieve all reservations of a given user --- tensorhive/models/User.py | 4 ++++ tests/unit/models/test_user_model.py | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/tensorhive/models/User.py b/tensorhive/models/User.py index 6c4dad8c..841d53a7 100644 --- a/tensorhive/models/User.py +++ b/tensorhive/models/User.py @@ -40,6 +40,7 @@ class User(CRUDModel, RestrictionAssignee): # type: ignore _roles = relationship('Role', cascade='all,delete', backref=backref('user')) _groups = relationship('Group', secondary='user2group') _restrictions = relationship('Restriction', secondary='restriction2assignee') + _reservations = relationship('Reservation', cascade='all,delete') min_password_length = 8 @@ -158,3 +159,6 @@ def get_active_restrictions(self, include_group=False): for group in self.groups: restrictions = restrictions + group.get_active_restrictions() return list(set(restrictions)) + + def get_reservations(self, include_cancelled=False): + return self._reservations if include_cancelled else [r for r in self._reservations if not r.is_cancelled] diff --git a/tests/unit/models/test_user_model.py b/tests/unit/models/test_user_model.py index 0b25d6b0..e5e87f34 100644 --- a/tests/unit/models/test_user_model.py +++ b/tests/unit/models/test_user_model.py @@ -43,3 +43,15 @@ def test_exception_on_creating_user_with_not_unique_username(tables): existing_user.save() duplicated_user.save() + + +def test_get_users_reservations(tables, new_user, new_reservation): + new_reservation.save() + assert new_reservation in new_user.get_reservations() + + +def test_get_users_reservations_does_not_include_cancelled_reservations_by_default(tables, new_user, new_reservation): + new_reservation.is_cancelled = True + new_reservation.save() + assert new_reservation not in new_user.get_reservations() + assert new_reservation in new_user.get_reservations(include_cancelled=True) From 997af44927b8cedc7c63c59316e3f8ebba7c48e2 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sun, 4 Oct 2020 07:12:00 +0200 Subject: [PATCH 040/175] Add ability to get all users affected by given restriction --- tensorhive/models/Restriction.py | 8 ++++++++ tests/conftest.py | 2 +- tests/fixtures/models.py | 6 ++++++ tests/unit/models/test_restriction_model.py | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index ddb53f2d..98d4c4b0 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -159,6 +159,14 @@ def remove_schedule(self, schedule: RestrictionSchedule): self.schedules.remove(schedule) self.save() + def get_all_affected_users(self): + """Will return all users affected by this restriction, i.e. users directly assigned to this restriction + and members of all groups assigned to this restriction.""" + affected_users = self.users + for group in self.groups: + affected_users.extend(group.users) + return list(set(affected_users)) + @classmethod def get_global_restrictions(cls, include_expired=False): query = db_session.query(Restriction).filter(Restriction.is_global.is_(True)) diff --git a/tests/conftest.py b/tests/conftest.py index bc6fa217..775fe8ba 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ import pytest -from fixtures.models import new_reservation, new_reservation_2, new_user, new_admin, new_group, \ +from fixtures.models import new_reservation, new_reservation_2, new_user, new_user_2, new_admin, new_group, \ new_group_with_member, resource1, resource2, restriction, active_schedule, inactive_schedule from fixtures.database import tables diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index 1cc91b1d..2c388f3a 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -17,6 +17,12 @@ def new_user(): roles=[Role(name='user')]) +@pytest.fixture(scope='function') +def new_user_2(): + return User(username='AnotherUser', + password='TEST PASSWORD', + roles=[Role(name='user')]) + @pytest.fixture(scope='function') def new_admin(): return User(username='justuser', diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 853a8f0a..975fdc6b 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -193,3 +193,19 @@ def test_when_trying_to_remove_restriction_from_resource_that_wasnt_assigned_to_ with pytest.raises(InvalidRequestException): restriction.remove_from_resource(resource1) + + +def test_get_all_affected_users_will_return_all_users_affected_by_given_restriction(tables, restriction, new_user_2, + new_group_with_member): + new_group_with_member.save() + restriction.apply_to_group(new_group_with_member) + + new_user_2.save() + restriction.apply_to_user(new_user_2) + + assert new_user_2 in restriction.users + assert new_group_with_member.users[0] not in restriction.users + + all_affected_users = restriction.get_all_affected_users() + assert new_user_2 in all_affected_users + assert new_group_with_member.users[0] in all_affected_users From e38ce2cc0cae16442c97d934c8d6d93b5cbc6dc1 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sun, 4 Oct 2020 08:26:46 +0200 Subject: [PATCH 041/175] Make sure to not carry on state between test cases --- tests/fixtures/database.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fixtures/database.py b/tests/fixtures/database.py index 1d11001e..a4182d41 100644 --- a/tests/fixtures/database.py +++ b/tests/fixtures/database.py @@ -3,7 +3,7 @@ @pytest.yield_fixture(scope='function') def tables(): - from tensorhive.database import Base, engine + from tensorhive.database import Base, engine, db_session from tensorhive.models.User import User from tensorhive.models.Group import Group, User2Group from tensorhive.models.Reservation import Reservation @@ -13,5 +13,6 @@ def tables(): from tensorhive.models.Role import Role from tensorhive.models.RevokedToken import RevokedToken Base.metadata.create_all(engine) + db_session.remove() # that makes sure we won't be holding on to any cached entities between test cases yield Base.metadata.drop_all(engine) From 22650f2cb7b31f25306874543ce8722d8193f7b8 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sun, 4 Oct 2020 08:29:58 +0200 Subject: [PATCH 042/175] Do not include cancelled reservations in current_events and would_interfere methods --- tensorhive/models/Reservation.py | 8 ++-- tests/fixtures/models.py | 1 + tests/unit/models/test_reservation_model.py | 45 ++++++++++++++++++++- tests/unit/models/test_restriction_model.py | 1 - 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/tensorhive/models/Reservation.py b/tensorhive/models/Reservation.py index 2f54c8ac..0b84ba00 100644 --- a/tensorhive/models/Reservation.py +++ b/tensorhive/models/Reservation.py @@ -88,15 +88,16 @@ def is_cancelled(self, value): def current_events(cls): '''Returns only those events that should be currently respected by users''' current_time = datetime.datetime.utcnow() - return cls.query.filter( + current_events = cls.query.filter( and_( # Events that has already started cls.starts_at <= current_time, # Events before their end current_time <= cls.ends_at)).all() + return [c for c in current_events if not c.is_cancelled] def would_interfere(self): - return Reservation.query.filter( + conflicting_reservations = Reservation.query.filter( # Two events overlap in time domain and_( self.starts_at < Reservation.ends_at, @@ -104,7 +105,8 @@ def would_interfere(self): ), # Case concerns the same resource ).filter(Reservation.id != self.id)\ - .filter(Reservation.protected_resource_id == self.protected_resource_id).first() + .filter(Reservation.protected_resource_id == self.protected_resource_id).all() + return any(not r.is_cancelled for r in conflicting_reservations) @classmethod def filter_by_uuids_and_time_range(cls, uuids: List[str], start: datetime.datetime, end: datetime.datetime): diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index 2c388f3a..c4468a1d 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -23,6 +23,7 @@ def new_user_2(): password='TEST PASSWORD', roles=[Role(name='user')]) + @pytest.fixture(scope='function') def new_admin(): return User(username='justuser', diff --git a/tests/unit/models/test_reservation_model.py b/tests/unit/models/test_reservation_model.py index 52c442db..0d79aad7 100644 --- a/tests/unit/models/test_reservation_model.py +++ b/tests/unit/models/test_reservation_model.py @@ -1,5 +1,6 @@ import pytest from datetime import timedelta, datetime +from tensorhive.models.Reservation import Reservation def test_reservation_creation(tables, new_reservation): @@ -26,7 +27,7 @@ def test_interfering_reservation_cannot_be_saved(tables, new_reservation, new_re with pytest.raises(AssertionError): # | A | A new_reservation_2.starts_at = new_reservation.starts_at + offset - new_reservation_2.ends_at = new_reservation.starts_at + offset + new_reservation_2.ends_at = new_reservation.ends_at + offset new_reservation_2.save() with pytest.raises(AssertionError): @@ -36,6 +37,33 @@ def test_interfering_reservation_cannot_be_saved(tables, new_reservation, new_re new_reservation_2.save() +def test_cancelled_reservation_does_not_cause_interference_with_others(tables, new_reservation, new_reservation_2): + # Create initial record + new_reservation.is_cancelled = True + new_reservation.save() + offset = timedelta(minutes=5) + + # | A A | + new_reservation_2.starts_at = new_reservation.starts_at + offset + new_reservation_2.ends_at = new_reservation.ends_at - offset + new_reservation_2.save() + + # A | A | + new_reservation_2.starts_at = new_reservation.starts_at - offset + new_reservation_2.ends_at = new_reservation.ends_at - offset + new_reservation_2.save() + + # | A | A + new_reservation_2.starts_at = new_reservation.starts_at + offset + new_reservation_2.ends_at = new_reservation.ends_at + offset + new_reservation_2.save() + + # A | | A + new_reservation_2.starts_at = new_reservation.starts_at - offset + new_reservation_2.ends_at = new_reservation.ends_at + offset + new_reservation_2.save() + + @pytest.mark.usefixtures('faker') def test_string_time_format_conversion(tables, new_reservation, faker): # Prepare test data @@ -80,3 +108,18 @@ def test_invalid_reservation_time_range(tables, new_reservation, faker): new_reservation.starts_at = faker.future_datetime() new_reservation.ends_at = new_reservation.starts_at + timedelta(days=8, seconds=1) new_reservation.save() + + +def test_current_events_will_only_return_non_cancelled_reservations(tables, new_reservation, new_reservation_2): + new_reservation.starts_at = datetime.utcnow() - timedelta(minutes=10) + new_reservation.ends_at = datetime.utcnow() + timedelta(minutes=60) + new_reservation.save() + assert new_reservation in Reservation.current_events() + + new_reservation.is_cancelled = True + new_reservation.save() + new_reservation_2.save() + + current_events = Reservation.current_events() + assert new_reservation not in current_events + assert new_reservation_2 in current_events diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 975fdc6b..871bd0ab 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -108,7 +108,6 @@ def test_restriction_with_schedules_is_active_only_when_at_least_one_of_its_sche restriction.add_schedule(inactive_schedule) assert restriction.is_active is False - print(active_schedule.is_active) restriction.add_schedule(active_schedule) assert restriction.is_active is True From acec2e4bea0c2cb764e713f6edbba49543eb2683 Mon Sep 17 00:00:00 2001 From: mateusz Date: Sun, 4 Oct 2020 13:41:59 +0200 Subject: [PATCH 043/175] Checking restrictions when creating and updating reservation, change reservation status when restrictions have changed --- tensorhive/api/api_specification.yml | 12 ++- tensorhive/controllers/group.py | 6 ++ tensorhive/controllers/reservation.py | 34 ++++++--- tensorhive/controllers/responses.yml | 4 +- tensorhive/controllers/restriction.py | 29 +++++++- tensorhive/controllers/schedule.py | 10 +++ tensorhive/core/utils/reservation_allowed.py | 78 ++++++++++++++++++++ 7 files changed, 155 insertions(+), 18 deletions(-) create mode 100644 tensorhive/core/utils/reservation_allowed.py diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index c4eb1d63..aa29136f 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -993,7 +993,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['users']['remove']['success']}} content: application/json: @@ -1102,7 +1102,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['groups']['remove']['success']}} content: application/json: @@ -1211,7 +1211,7 @@ paths: schema: type: string responses: - 201: + 200: description: {{RESPONSES['restriction']['resources']['remove']['success']}} content: application/json: @@ -1320,7 +1320,7 @@ paths: schema: type: integer responses: - 201: + 200: description: {{RESPONSES['restriction']['schedules']['remove']['success']}} content: application/json: @@ -1648,6 +1648,8 @@ paths: description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['reservation']['create']['failure']['forbidden']}} 422: description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['reservation']['create']['failure']['invalid']}} 500: @@ -1692,6 +1694,8 @@ paths: description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['reservation']['update']['failure']['forbidden']}} 404: description: {{RESPONSES['reservation']['not_found']}} 422: diff --git a/tensorhive/controllers/group.py b/tensorhive/controllers/group.py index d6057545..cb123079 100644 --- a/tensorhive/controllers/group.py +++ b/tensorhive/controllers/group.py @@ -5,6 +5,7 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.config import API +from tensorhive.core.utils.reservation_allowed import check_user_reservations from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.models.Group import Group from tensorhive.models.User import User @@ -97,7 +98,10 @@ def update(id: GroupId, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusC def delete(id: GroupId) -> Tuple[Content, HttpStatusCode]: try: group_to_destroy = Group.get(id) + users = group_to_destroy.users group_to_destroy.destroy() + for user in users: + check_user_reservations(user, increase_permissions=False) except AssertionError as error_message: content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: @@ -117,6 +121,7 @@ def add_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatusCod group = Group.get(group_id) user = User.get(user_id) group.add_user(user) + check_user_reservations(user, increase_permissions=True) except NoResultFound: if group is None: content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value @@ -143,6 +148,7 @@ def remove_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatus group = Group.get(group_id) user = User.get(user_id) group.remove_user(user) + check_user_reservations(user, increase_permissions=False) except NoResultFound: if group is None: content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value diff --git a/tensorhive/controllers/reservation.py b/tensorhive/controllers/reservation.py index 3399ebe4..878dfe8c 100644 --- a/tensorhive/controllers/reservation.py +++ b/tensorhive/controllers/reservation.py @@ -3,7 +3,9 @@ from flask_jwt_extended import get_jwt_claims, get_jwt_identity, jwt_required from sqlalchemy.orm.exc import NoResultFound from tensorhive.config import API +from tensorhive.core.utils.reservation_allowed import is_reservation_allowed from tensorhive.models.Reservation import Reservation +from tensorhive.models.User import User from tensorhive.utils.DateUtils import DateUtils log = logging.getLogger(__name__) @@ -74,19 +76,27 @@ def create(reservation: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: starts_at=reservation['start'], ends_at=reservation['end'] ) - new_reservation.save() + + user = User.get(get_jwt_identity()) + if is_reservation_allowed(user, new_reservation): + new_reservation.save() + content = { + 'msg': RESERVATION['create']['success'], + 'reservation': new_reservation.as_dict + } + status = 201 + else: + content = { + 'msg': RESERVATION['create']['failure']['forbidden'] + } + status = 403 + except AssertionError as e: content = {'msg': RESERVATION['create']['failure']['invalid'].format(reason=e)} status = 422 except Exception: content = {'msg': GENERAL['internal_error']} status = 500 - else: - content = { - 'msg': RESERVATION['create']['success'], - 'reservation': new_reservation.as_dict - } - status = 201 finally: return content, status @@ -114,7 +124,13 @@ def update(id: ReservationId, newValues: Dict[str, Any]) -> Tuple[Content, HttpS assert (field_name is not None) and hasattr(reservation, field_name), \ 'reservation has no {} field'.format(field_name) setattr(reservation, field_name, new_value) - reservation.save() + + user = User.get(get_jwt_identity()) + if is_reservation_allowed(user, reservation): + reservation.save() + content, status = {'msg': RESERVATION['update']['success'], 'reservation': reservation.as_dict}, 201 + else: + content, status = {'msg': RESERVATION['update']['failure']['forbidden']}, 403 except NoResultFound: content, status = {'msg': RESERVATION['not_found']}, 404 except AssertionError as e: @@ -122,8 +138,6 @@ def update(id: ReservationId, newValues: Dict[str, Any]) -> Tuple[Content, HttpS except Exception as e: log.critical(e) content, status = {'msg': GENERAL['internal_error']}, 500 - else: - content, status = {'msg': RESERVATION['update']['success'], 'reservation': reservation.as_dict}, 201 finally: return content, status diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index 3d41d1c8..ab99d38f 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -89,7 +89,7 @@ restriction: success: Restriction has been removed from resourcce failure: assertion: Unable to remove restriction from resourcce - {reason} - not_found: Resourcce is not affected by restriction + not_found: Resource is not affected by restriction schedules: add: success: Schedule has been added to restriction @@ -131,10 +131,12 @@ reservation: create: success: Reservation has been successfully created failure: + forbidden: Cannot create reservation due to lack of permissions invalid: Requirements not met - {reason} update: success: Reservation has been successfully updated failure: + forbidden: Cannot update reservation due to lack of permissions invalid: Requirements not met - {reason} assertions: Unable to update reservation - {reason} delete: diff --git a/tensorhive/controllers/restriction.py b/tensorhive/controllers/restriction.py index 62c6b8ef..e48b8aec 100644 --- a/tensorhive/controllers/restriction.py +++ b/tensorhive/controllers/restriction.py @@ -5,6 +5,7 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.config import API +from tensorhive.core.utils.reservation_allowed import check_user_reservations from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.models.Group import Group from tensorhive.models.Resource import Resource @@ -51,13 +52,13 @@ def get_selected(user_id: Optional[UserId], group_id: Optional[GroupId], resourc restrictions = [] # type: List[Restriction] if user_id is not None: user = User.get(user_id) - restrictions.extend(user.get_restrictions(include_global=True, include_group=include_user_groups)) + restrictions.extend(user.get_restrictions(include_group=include_user_groups)) if group_id is not None: group = Group.get(group_id) - restrictions.extend(group.get_restrictions(include_global=True)) + restrictions.extend(group.get_restrictions()) if resource_id is not None: resource = Resource.get(resource_id) - restrictions.extend(resource.get_restrictions(include_global=True)) + restrictions.extend(resource.get_restrictions()) if schedule_id is not None: schedule = RestrictionSchedule.get(schedule_id) restrictions.extend(schedule.restrictions) @@ -141,6 +142,9 @@ def update(id: RestrictionId, newValues: Dict[str, Any]) -> Tuple[Content, HttpS 'restriction has no {} field'.format(field_name) setattr(restriction, field_name, new_value) restriction.save() + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=True) + check_user_reservations(user, increase_permissions=False) except NoResultFound: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: @@ -161,7 +165,10 @@ def update(id: RestrictionId, newValues: Dict[str, Any]) -> Tuple[Content, HttpS def delete(id: RestrictionId) -> Tuple[Content, HttpStatusCode]: try: restriction_to_destroy = Restriction.get(id) + users = restriction_to_destroy.get_all_affected_users() restriction_to_destroy.destroy() + for user in users: + check_user_reservations(user, increase_permissions=False) except AssertionError as error_message: content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: @@ -181,6 +188,7 @@ def apply_to_user(restriction_id: RestrictionId, user_id: UserId) -> Tuple[Conte restriction = Restriction.get(restriction_id) user = User.get(user_id) restriction.apply_to_user(user) + check_user_reservations(user, increase_permissions=True) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -209,6 +217,8 @@ def apply_to_group(restriction_id: RestrictionId, group_id: GroupId) -> Tuple[Co restriction = Restriction.get(restriction_id) group = Group.get(group_id) restriction.apply_to_group(group) + for user in group.users: + check_user_reservations(user, increase_permissions=True) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -237,6 +247,8 @@ def apply_to_resource(restriction_id: RestrictionId, resource_uuid: ResourceId) restriction = Restriction.get(restriction_id) resource = Resource.get(resource_uuid) restriction.apply_to_resource(resource) + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=True) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -265,6 +277,9 @@ def add_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> Tupl restriction = Restriction.get(restriction_id) schedule = RestrictionSchedule.get(schedule_id) restriction.add_schedule(schedule) + increase_permissions = len(restriction.schedules) > 1 # if added another schedule + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=increase_permissions) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -293,6 +308,7 @@ def remove_from_user(restriction_id: RestrictionId, user_id: UserId) -> Tuple[Co restriction = Restriction.get(restriction_id) user = User.get(user_id) restriction.remove_from_user(user) + check_user_reservations(user, increase_permissions=False) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -321,6 +337,8 @@ def remove_from_group(restriction_id: RestrictionId, group_id: GroupId) -> Tuple restriction = Restriction.get(restriction_id) group = Group.get(group_id) restriction.remove_from_group(group) + for user in group.users: + check_user_reservations(user, increase_permissions=False) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -349,6 +367,8 @@ def remove_from_resource(restriction_id: RestrictionId, resource_uuid: ResourceI restriction = Restriction.get(restriction_id) resource = Resource.get(resource_uuid) restriction.remove_from_resource(resource) + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=False) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -378,6 +398,9 @@ def remove_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> T restriction = Restriction.get(restriction_id) schedule = RestrictionSchedule.get(schedule_id) restriction.remove_schedule(schedule) + increase_permissions = len(restriction.schedules) == 0 # if removed last schedule + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=increase_permissions) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value diff --git a/tensorhive/controllers/schedule.py b/tensorhive/controllers/schedule.py index a6ab0793..937e15a7 100644 --- a/tensorhive/controllers/schedule.py +++ b/tensorhive/controllers/schedule.py @@ -6,6 +6,7 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.config import API +from tensorhive.core.utils.reservation_allowed import check_user_reservations from tensorhive.models.RestrictionSchedule import RestrictionSchedule from tensorhive.utils.Weekday import Weekday @@ -98,6 +99,10 @@ def update(id, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: 'schedule has no {} field'.format(field_name) setattr(schedule, field_name, new_value) schedule.save() + for restriction in schedule.restrictions: + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=True) + check_user_reservations(user, increase_permissions=False) except NoResultFound: content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value except KeyError: @@ -119,7 +124,12 @@ def update(id, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: def delete(id: ScheduleId) -> Tuple[Content, HttpStatusCode]: try: schedule_to_destroy = RestrictionSchedule.get(id) + restrictions = schedule_to_destroy.restrictions schedule_to_destroy.destroy() + for restriction in restrictions: + increase_permissions = len(restriction.schedules) == 0 # if deleted last schedule + for user in restriction.get_all_affected_users(): + check_user_reservations(user, increase_permissions=increase_permissions) except AssertionError as error_message: content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: diff --git a/tensorhive/core/utils/reservation_allowed.py b/tensorhive/core/utils/reservation_allowed.py new file mode 100644 index 00000000..0058e5cb --- /dev/null +++ b/tensorhive/core/utils/reservation_allowed.py @@ -0,0 +1,78 @@ +from datetime import time, timedelta +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.models.Resource import Resource + + +def check_schedules(start_date, end_date, schedules): + reservation_allowed = False + while True: + start_date_changed = False + for schedule in schedules: + day = start_date.weekday() + 1 + if str(day) in schedule.schedule_days and schedule.hour_start <= start_date.time(): + if schedule.hour_end == time(hour=23, minute=59): + start_date = start_date.replace(hour=0, minute=0) + timedelta(days=1) + elif start_date.time() < schedule.hour_end: + start_date = start_date.replace(hour=schedule.hour_end.hour, minute=schedule.hour_end.minute) + else: + continue + start_date_changed = True + if start_date >= end_date: + reservation_allowed = True + break + if reservation_allowed or not start_date_changed: + break + return start_date + + +def is_reservation_allowed(user, reservation): + try: + resource = Resource.get(reservation.protected_resource_id) + except NoResultFound: + return False + + user_restrictions = user.get_restrictions(include_group=True) + # get global restrictions or applied to selected resource + restrictions = [] + for restriction in user_restrictions: + if restriction.is_global or resource in restriction.resources: + restrictions.append(restriction) + + # time interval required to create restriction + start_date = reservation.starts_at + end_date = reservation.ends_at + + reservation_allowed = False + while True: + start_date_changed = False + for restriction in restrictions: + if restriction.starts_at <= start_date < restriction.ends_at: + schedules = restriction.schedules + if not schedules: + start_date = restriction.ends_at + start_date_changed = True + else: + date = check_schedules(start_date, end_date, schedules) + if date > start_date: + start_date_changed = True + start_date = date + if start_date >= end_date: + reservation_allowed = True + break + if reservation_allowed or not start_date_changed: + break + return reservation_allowed + + +def check_user_reservations(user, increase_permissions): + reservations = user.get_reservations(include_cancelled=True) + for reservation in reservations: + if increase_permissions: + if reservation.is_cancelled and is_reservation_allowed(user, reservation) \ + and not reservation.would_interfere(): + reservation.is_cancelled = False + reservation.save() + else: + if not reservation.is_cancelled and not is_reservation_allowed(user, reservation): + reservation.is_cancelled = True + reservation.save() From a19548d5b9a69e08912a6228ced3962bb10e7911 Mon Sep 17 00:00:00 2001 From: mateusz Date: Sun, 4 Oct 2020 16:44:08 +0200 Subject: [PATCH 044/175] Code refactoring --- tensorhive/controllers/group.py | 8 +- tensorhive/controllers/reservation.py | 6 +- tensorhive/controllers/restriction.py | 28 +++--- tensorhive/controllers/schedule.py | 10 +- tensorhive/core/utils/ReservationVerifier.py | 98 ++++++++++++++++++++ tensorhive/core/utils/reservation_allowed.py | 78 ---------------- 6 files changed, 124 insertions(+), 104 deletions(-) create mode 100644 tensorhive/core/utils/ReservationVerifier.py delete mode 100644 tensorhive/core/utils/reservation_allowed.py diff --git a/tensorhive/controllers/group.py b/tensorhive/controllers/group.py index cb123079..4526ee32 100644 --- a/tensorhive/controllers/group.py +++ b/tensorhive/controllers/group.py @@ -5,7 +5,7 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.config import API -from tensorhive.core.utils.reservation_allowed import check_user_reservations +from tensorhive.core.utils.ReservationVerifier import ReservationVerifier from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.models.Group import Group from tensorhive.models.User import User @@ -101,7 +101,7 @@ def delete(id: GroupId) -> Tuple[Content, HttpStatusCode]: users = group_to_destroy.users group_to_destroy.destroy() for user in users: - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except AssertionError as error_message: content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: @@ -121,7 +121,7 @@ def add_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatusCod group = Group.get(group_id) user = User.get(user_id) group.add_user(user) - check_user_reservations(user, increase_permissions=True) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) except NoResultFound: if group is None: content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value @@ -148,7 +148,7 @@ def remove_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatus group = Group.get(group_id) user = User.get(user_id) group.remove_user(user) - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except NoResultFound: if group is None: content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value diff --git a/tensorhive/controllers/reservation.py b/tensorhive/controllers/reservation.py index 878dfe8c..1d2c7a0f 100644 --- a/tensorhive/controllers/reservation.py +++ b/tensorhive/controllers/reservation.py @@ -3,7 +3,7 @@ from flask_jwt_extended import get_jwt_claims, get_jwt_identity, jwt_required from sqlalchemy.orm.exc import NoResultFound from tensorhive.config import API -from tensorhive.core.utils.reservation_allowed import is_reservation_allowed +from tensorhive.core.utils.ReservationVerifier import ReservationVerifier from tensorhive.models.Reservation import Reservation from tensorhive.models.User import User from tensorhive.utils.DateUtils import DateUtils @@ -78,7 +78,7 @@ def create(reservation: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: ) user = User.get(get_jwt_identity()) - if is_reservation_allowed(user, new_reservation): + if ReservationVerifier.is_reservation_allowed(user, new_reservation): new_reservation.save() content = { 'msg': RESERVATION['create']['success'], @@ -126,7 +126,7 @@ def update(id: ReservationId, newValues: Dict[str, Any]) -> Tuple[Content, HttpS setattr(reservation, field_name, new_value) user = User.get(get_jwt_identity()) - if is_reservation_allowed(user, reservation): + if ReservationVerifier.is_reservation_allowed(user, reservation): reservation.save() content, status = {'msg': RESERVATION['update']['success'], 'reservation': reservation.as_dict}, 201 else: diff --git a/tensorhive/controllers/restriction.py b/tensorhive/controllers/restriction.py index e48b8aec..e6415b53 100644 --- a/tensorhive/controllers/restriction.py +++ b/tensorhive/controllers/restriction.py @@ -5,7 +5,7 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.config import API -from tensorhive.core.utils.reservation_allowed import check_user_reservations +from tensorhive.core.utils.ReservationVerifier import ReservationVerifier from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.models.Group import Group from tensorhive.models.Resource import Resource @@ -143,8 +143,8 @@ def update(id: RestrictionId, newValues: Dict[str, Any]) -> Tuple[Content, HttpS setattr(restriction, field_name, new_value) restriction.save() for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=True) - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except NoResultFound: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: @@ -168,7 +168,7 @@ def delete(id: RestrictionId) -> Tuple[Content, HttpStatusCode]: users = restriction_to_destroy.get_all_affected_users() restriction_to_destroy.destroy() for user in users: - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except AssertionError as error_message: content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: @@ -188,7 +188,7 @@ def apply_to_user(restriction_id: RestrictionId, user_id: UserId) -> Tuple[Conte restriction = Restriction.get(restriction_id) user = User.get(user_id) restriction.apply_to_user(user) - check_user_reservations(user, increase_permissions=True) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -218,7 +218,7 @@ def apply_to_group(restriction_id: RestrictionId, group_id: GroupId) -> Tuple[Co group = Group.get(group_id) restriction.apply_to_group(group) for user in group.users: - check_user_reservations(user, increase_permissions=True) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -248,7 +248,7 @@ def apply_to_resource(restriction_id: RestrictionId, resource_uuid: ResourceId) resource = Resource.get(resource_uuid) restriction.apply_to_resource(resource) for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=True) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -277,9 +277,9 @@ def add_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> Tupl restriction = Restriction.get(restriction_id) schedule = RestrictionSchedule.get(schedule_id) restriction.add_schedule(schedule) - increase_permissions = len(restriction.schedules) > 1 # if added another schedule + have_users_permissions_increased = len(restriction.schedules) > 1 # if added another schedule for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=increase_permissions) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -308,7 +308,7 @@ def remove_from_user(restriction_id: RestrictionId, user_id: UserId) -> Tuple[Co restriction = Restriction.get(restriction_id) user = User.get(user_id) restriction.remove_from_user(user) - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -338,7 +338,7 @@ def remove_from_group(restriction_id: RestrictionId, group_id: GroupId) -> Tuple group = Group.get(group_id) restriction.remove_from_group(group) for user in group.users: - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -368,7 +368,7 @@ def remove_from_resource(restriction_id: RestrictionId, resource_uuid: ResourceI resource = Resource.get(resource_uuid) restriction.remove_from_resource(resource) for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value @@ -398,9 +398,9 @@ def remove_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> T restriction = Restriction.get(restriction_id) schedule = RestrictionSchedule.get(schedule_id) restriction.remove_schedule(schedule) - increase_permissions = len(restriction.schedules) == 0 # if removed last schedule + have_users_permissions_increased = len(restriction.schedules) == 0 # if removed last schedule for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=increase_permissions) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased) except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value diff --git a/tensorhive/controllers/schedule.py b/tensorhive/controllers/schedule.py index 937e15a7..65213067 100644 --- a/tensorhive/controllers/schedule.py +++ b/tensorhive/controllers/schedule.py @@ -6,7 +6,7 @@ from sqlalchemy.orm.exc import NoResultFound from tensorhive.authorization import admin_required from tensorhive.config import API -from tensorhive.core.utils.reservation_allowed import check_user_reservations +from tensorhive.core.utils.ReservationVerifier import ReservationVerifier from tensorhive.models.RestrictionSchedule import RestrictionSchedule from tensorhive.utils.Weekday import Weekday @@ -101,8 +101,8 @@ def update(id, newValues: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: schedule.save() for restriction in schedule.restrictions: for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=True) - check_user_reservations(user, increase_permissions=False) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) except NoResultFound: content, status = {'msg': SCHEDULE['not_found']}, HTTPStatus.NOT_FOUND.value except KeyError: @@ -127,9 +127,9 @@ def delete(id: ScheduleId) -> Tuple[Content, HttpStatusCode]: restrictions = schedule_to_destroy.restrictions schedule_to_destroy.destroy() for restriction in restrictions: - increase_permissions = len(restriction.schedules) == 0 # if deleted last schedule + have_users_permissions_increased = len(restriction.schedules) == 0 # if deleted last schedule for user in restriction.get_all_affected_users(): - check_user_reservations(user, increase_permissions=increase_permissions) + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased) except AssertionError as error_message: content, status = {'msg': str(error_message)}, HTTPStatus.FORBIDDEN.value except NoResultFound: diff --git a/tensorhive/core/utils/ReservationVerifier.py b/tensorhive/core/utils/ReservationVerifier.py new file mode 100644 index 00000000..89ec4c85 --- /dev/null +++ b/tensorhive/core/utils/ReservationVerifier.py @@ -0,0 +1,98 @@ +from datetime import time, timedelta +from sqlalchemy.orm.exc import NoResultFound +from tensorhive.models.Resource import Resource + + +class ReservationVerifier: + @classmethod + def __get_latest_date_allowed_by_schedules(cls, start_date, end_date, schedules): + """ + Check if schedules allow for reservation between start_date and end_date and returns the latest date + (starting from start_date) that schedules allow + :param start_date: Reservation start date + :param end_date: Reservation end date + :param schedules: Schedule list that is checked to determine if reservation is allowed + :return: latest date starting from start_date allowed by given schedules + """ + reservation_allowed = False + while True: + start_date_changed = False + for schedule in schedules: + day = start_date.weekday() + 1 + if str(day) in schedule.schedule_days and schedule.hour_start <= start_date.time(): + if schedule.hour_end == time(hour=23, minute=59): + start_date = start_date.replace(hour=0, minute=0) + timedelta(days=1) + elif start_date.time() < schedule.hour_end: + start_date = start_date.replace(hour=schedule.hour_end.hour, minute=schedule.hour_end.minute) + else: + continue + start_date_changed = True + if start_date >= end_date: + reservation_allowed = True + break + if reservation_allowed or not start_date_changed: + break + return start_date + + @classmethod + def is_reservation_allowed(cls, user, reservation): + """ + Check if reservation is allowed with restrictions of given user + :param user: user to whom reservation belongs + :param reservation: reservation to be checked + :return: True if reservation is allowed, False otherwise + """ + try: + resource = Resource.get(reservation.protected_resource_id) + except NoResultFound: + return False + + user_restrictions = user.get_restrictions(include_group=True) + # get global restrictions or applied to selected resource + restrictions = [r for r in user_restrictions if r.is_global or resource in r.resources] + + # time interval required to create restriction + start_date = reservation.starts_at + end_date = reservation.ends_at + + reservation_allowed = False + while True: + start_date_changed = False + for restriction in restrictions: + if restriction.starts_at <= start_date and \ + (restriction.ends_at is None or start_date < restriction.ends_at): + schedules = restriction.schedules + if not schedules: + start_date = restriction.ends_at + start_date_changed = True + else: + date = cls.__get_latest_date_allowed_by_schedules(start_date, end_date, schedules) + if date > start_date: + start_date_changed = True + start_date = date + if start_date >= end_date: + reservation_allowed = True + break + if reservation_allowed or not start_date_changed: + break + return reservation_allowed + + @classmethod + def update_user_reservations_statuses(cls, user, have_users_permissions_increased): + """ + Updates reservations statuses (is_cancelled) affected by change in user permissions + :param user: user whose permissions have changed + :param have_users_permissions_increased: if set to True, signifies that user's permissions + have recently widened, otherwise signifies that user's permissions have recently shrunk + """ + reservations = user.get_reservations(include_cancelled=True) + for reservation in reservations: + if have_users_permissions_increased: + if reservation.is_cancelled and cls.is_reservation_allowed(user, reservation) \ + and not reservation.would_interfere(): + reservation.is_cancelled = False + reservation.save() + else: + if not reservation.is_cancelled and not cls.is_reservation_allowed(user, reservation): + reservation.is_cancelled = True + reservation.save() diff --git a/tensorhive/core/utils/reservation_allowed.py b/tensorhive/core/utils/reservation_allowed.py deleted file mode 100644 index 0058e5cb..00000000 --- a/tensorhive/core/utils/reservation_allowed.py +++ /dev/null @@ -1,78 +0,0 @@ -from datetime import time, timedelta -from sqlalchemy.orm.exc import NoResultFound -from tensorhive.models.Resource import Resource - - -def check_schedules(start_date, end_date, schedules): - reservation_allowed = False - while True: - start_date_changed = False - for schedule in schedules: - day = start_date.weekday() + 1 - if str(day) in schedule.schedule_days and schedule.hour_start <= start_date.time(): - if schedule.hour_end == time(hour=23, minute=59): - start_date = start_date.replace(hour=0, minute=0) + timedelta(days=1) - elif start_date.time() < schedule.hour_end: - start_date = start_date.replace(hour=schedule.hour_end.hour, minute=schedule.hour_end.minute) - else: - continue - start_date_changed = True - if start_date >= end_date: - reservation_allowed = True - break - if reservation_allowed or not start_date_changed: - break - return start_date - - -def is_reservation_allowed(user, reservation): - try: - resource = Resource.get(reservation.protected_resource_id) - except NoResultFound: - return False - - user_restrictions = user.get_restrictions(include_group=True) - # get global restrictions or applied to selected resource - restrictions = [] - for restriction in user_restrictions: - if restriction.is_global or resource in restriction.resources: - restrictions.append(restriction) - - # time interval required to create restriction - start_date = reservation.starts_at - end_date = reservation.ends_at - - reservation_allowed = False - while True: - start_date_changed = False - for restriction in restrictions: - if restriction.starts_at <= start_date < restriction.ends_at: - schedules = restriction.schedules - if not schedules: - start_date = restriction.ends_at - start_date_changed = True - else: - date = check_schedules(start_date, end_date, schedules) - if date > start_date: - start_date_changed = True - start_date = date - if start_date >= end_date: - reservation_allowed = True - break - if reservation_allowed or not start_date_changed: - break - return reservation_allowed - - -def check_user_reservations(user, increase_permissions): - reservations = user.get_reservations(include_cancelled=True) - for reservation in reservations: - if increase_permissions: - if reservation.is_cancelled and is_reservation_allowed(user, reservation) \ - and not reservation.would_interfere(): - reservation.is_cancelled = False - reservation.save() - else: - if not reservation.is_cancelled and not is_reservation_allowed(user, reservation): - reservation.is_cancelled = True - reservation.save() From d73321a7280bb9e4207b14089367e8ede5879338 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sun, 4 Oct 2020 16:54:37 +0200 Subject: [PATCH 045/175] Add functional tests for the Reservation controller --- tests/fixtures/controllers.py | 1 + .../test_reservation_controller.py | 163 ++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 tests/functional/controllers/test_reservation_controller.py diff --git a/tests/fixtures/controllers.py b/tests/fixtures/controllers.py index 35a9beca..5b40b931 100644 --- a/tests/fixtures/controllers.py +++ b/tests/fixtures/controllers.py @@ -8,6 +8,7 @@ HEADERS = {'Authorization': 'Bearer XXX', 'Content-Type': 'application/json'} patch('tensorhive.authorization.admin_required', lambda x: x).start() +patch('flask_jwt_extended.get_jwt_identity', lambda: '1').start() patch('flask_jwt_extended.view_decorators.verify_jwt_in_request', lambda: None).start() diff --git a/tests/functional/controllers/test_reservation_controller.py b/tests/functional/controllers/test_reservation_controller.py new file mode 100644 index 00000000..c5f9de1d --- /dev/null +++ b/tests/functional/controllers/test_reservation_controller.py @@ -0,0 +1,163 @@ +from tensorhive.models.Reservation import Reservation +from tensorhive.models.Resource import Resource +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from fixtures.controllers import API_URI as BASE_URI, HEADERS +from http import HTTPStatus + +import datetime +import json + +ENDPOINT = BASE_URI + '/reservations' + + +def test_create_reservation_without_permissions(tables, client, new_user): + new_user.save() + + # A user by default does not have any access policies assigned to him, so he shouldn't + # be able to create a reservation + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2021-01-01T10:00:00.000Z', + 'end': '2021-01-01T12:00:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.FORBIDDEN + + +def test_create_reservation_with_proper_permissions(tables, client, new_user, restriction): + new_user.save() + + # Create a restriction and assign it to the user + restriction.starts_at = '2101-01-01T10:00:00.000Z' + restriction.ends_at = '2101-01-05T10:00:00.000Z' + restriction.apply_to_user(new_user) + + # Create a resource and assign it to the restriction + resource = Resource(id='0123456789012345678901234567890123456789') + resource.save() + restriction.apply_to_resource(resource) + + # Try to create reservation for a period that the user has access to, as specified by the restriction. + # Should succeed. + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2101-01-02T10:00:00.000Z', + 'end': '2101-01-03T12:00:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.CREATED + assert Reservation.get(resp_json['reservation']['id']) is not None + + +def test_create_reservation_with_permissions_just_for_a_part_of_it(tables, client, new_user, restriction): + new_user.save() + + # Create a restriction and assign it to the user + restriction.starts_at = '2101-01-01T10:00:00.000Z' + restriction.ends_at = '2101-01-05T10:00:00.000Z' + restriction.apply_to_user(new_user) + + # Create a resource and assign it to the restriction + resource = Resource(id='0123456789012345678901234567890123456789') + resource.save() + restriction.apply_to_resource(resource) + + # Try to create reservation for a period just partly covered by the restriction. + # Should fail. + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2101-01-04T10:00:00.000Z', + 'end': '2101-01-06T12:00:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.FORBIDDEN + + +def test_create_reservation_outside_of_schedule(tables, client, new_user, restriction): + new_user.save() + + # Create a restriction and assign it to the user + restriction.starts_at = '2101-01-01T10:00:00.000Z' + restriction.ends_at = '2101-01-05T10:00:00.000Z' + restriction.apply_to_user(new_user) + + # Create a schedule and assign it to the restriction + schedule = RestrictionSchedule( + schedule_days='1234567', + hour_start=datetime.time(8, 0, 0), + hour_end=datetime.time(10, 0, 0) + ) + schedule.save() + restriction.add_schedule(schedule) + + # Create a resource and assign it to the restriction + resource = Resource(id='0123456789012345678901234567890123456789') + resource.save() + restriction.apply_to_resource(resource) + + # Try to create reservation for a period just partly covered by the restriction. + # Should fail. + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2101-01-02T09:00:00.000Z', + 'end': '2101-01-02T10:30:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.FORBIDDEN + + +def test_after_updating_restriction_reservations_that_are_no_longer_valid_should_get_cancelled(tables, client, + new_user, + restriction): + new_user.save() + + # Create a restriction, assign user and resource to it + restriction.starts_at = '2101-01-01T10:00:00.000Z' + restriction.ends_at = '2101-01-05T10:00:00.000Z' + restriction.apply_to_user(new_user) + + resource = Resource(id='0123456789012345678901234567890123456789') + resource.save() + restriction.apply_to_resource(resource) + + # Create a reservation in allowed timeframe (should succeed) + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2101-01-02T10:00:00.000Z', + 'end': '2101-01-03T12:00:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data.decode('utf-8')) + + reservation = Reservation.get(resp_json['reservation']['id']) + + assert reservation.is_cancelled is False + + # Update the restriction to make the reservation invalid + data = { + 'start': '2101-01-04T09:00:00.000Z' + } + resp = client.put(BASE_URI + '/restrictions/' + str(reservation.id), headers=HEADERS, data=json.dumps(data)) + + assert resp.status_code == HTTPStatus.OK + assert reservation.is_cancelled is True From ed654849da1ce5d69ec14db4f9f4ad6cb3c3ff8e Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Mon, 12 Oct 2020 17:14:01 +0200 Subject: [PATCH 046/175] Unify date format across all models --- .../reservation/get_reservation_controller.py | 5 +++-- tensorhive/models/Group.py | 5 +++-- tensorhive/models/User.py | 3 ++- tensorhive/models/__init__.py | 11 +++++++++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/tensorhive/controllers/reservation/get_reservation_controller.py b/tensorhive/controllers/reservation/get_reservation_controller.py index 1c5a5a7c..2b08b24e 100644 --- a/tensorhive/controllers/reservation/get_reservation_controller.py +++ b/tensorhive/controllers/reservation/get_reservation_controller.py @@ -1,5 +1,6 @@ from flask_jwt_extended import jwt_required from tensorhive.models.Reservation import Reservation +from tensorhive.utils.DateUtils import DateUtils from typing import List from tensorhive.config import API G = API.RESPONSES['general'] @@ -19,8 +20,8 @@ def get_selected(resources_ids: List, start: str, end: str): all_not_none = resources_ids and start and end if all_not_none: try: - start_as_datetime = Reservation.parsed_input_datetime(start) - ends_as_datetime = Reservation.parsed_input_datetime(end) + start_as_datetime = DateUtils.parse_string(start) + ends_as_datetime = DateUtils.parse_string(end) matches = list(Reservation.filter_by_uuids_and_time_range( resources_ids, start_as_datetime, ends_as_datetime)) matches = [match.as_dict for match in matches] diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index a4f409d7..7c4bba8e 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -7,8 +7,9 @@ from tensorhive.database import Base from tensorhive.exceptions.InvalidRequestException import InvalidRequestException from tensorhive.models.CRUDModel import CRUDModel -from tensorhive.models.User import User from tensorhive.models.RestrictionAssignee import RestrictionAssignee +from tensorhive.models.User import User +from tensorhive.utils.DateUtils import DateUtils log = logging.getLogger(__name__) @@ -69,7 +70,7 @@ def _as_dict(self, include_users): group = { 'id': self.id, 'name': self.name, - 'createdAt': self.created_at.isoformat() + 'createdAt': DateUtils.stringify_datetime(self.created_at) } if include_users: group['users'] = [user.as_dict_shallow for user in self.users] diff --git a/tensorhive/models/User.py b/tensorhive/models/User.py index 841d53a7..50801c0a 100644 --- a/tensorhive/models/User.py +++ b/tensorhive/models/User.py @@ -6,6 +6,7 @@ from tensorhive.database import db_session from tensorhive.models.CRUDModel import CRUDModel from tensorhive.models.RestrictionAssignee import RestrictionAssignee +from tensorhive.utils.DateUtils import DateUtils from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound from sqlalchemy.orm import validates from usernames import is_safe_username @@ -134,7 +135,7 @@ def _as_dict(self, include_groups): user = { 'id': self.id, 'username': self.username, - 'createdAt': self.created_at.isoformat(), + 'createdAt': DateUtils.stringify_datetime(self.created_at), 'roles': roles, 'email': self.email } diff --git a/tensorhive/models/__init__.py b/tensorhive/models/__init__.py index e69de29b..630ef405 100644 --- a/tensorhive/models/__init__.py +++ b/tensorhive/models/__init__.py @@ -0,0 +1,11 @@ +from tensorhive.models.CRUDModel import CRUDModel +from tensorhive.models.Group import Group, User2Group +from tensorhive.models.Reservation import Reservation +from tensorhive.models.Resource import Resource +from tensorhive.models.Restriction import Restriction, Restriction2Assignee, Restriction2Resource +from tensorhive.models.RestrictionAssignee import RestrictionAssignee +from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from tensorhive.models.RevokedToken import RevokedToken +from tensorhive.models.Role import Role +from tensorhive.models.Task import Task +from tensorhive.models.User import User From 4eee61265dd14e3df072697169ee8629bc977a52 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Thu, 15 Oct 2020 12:23:40 +0200 Subject: [PATCH 047/175] Fix add is_cancelled column migration --- .../06ce06e9bb85_add_is_cancelled_column_to_the_.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py b/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py index 6df74968..ecedc40e 100644 --- a/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py +++ b/migrations/versions/06ce06e9bb85_add_is_cancelled_column_to_the_.py @@ -17,8 +17,10 @@ def upgrade(): - op.add_column('reservations', sa.Column('is_cancelled', sa.Boolean(), nullable=True)) + with op.batch_alter_table('reservations') as batch_op: + batch_op.add_column(sa.Column('is_cancelled', sa.Boolean(), nullable=True)) def downgrade(): - op.drop_column('reservations', 'is_cancelled') + with op.batch_alter_table('reservations') as batch_op: + batch_op.drop_column('is_cancelled') From d82dbfedbefe22ca0131f4713d2aa0fe7e07cda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Ro=C5=9Bciszewski?= Date: Fri, 16 Oct 2020 16:28:19 +0200 Subject: [PATCH 048/175] remove API versioning from controller version of API specification will be specified, but only for developers, not accessible by logic; API version still has to be deleted from webapp --- tensorhive/api/APIServer.py | 1 - tensorhive/api/api_specification.yml | 4 ++-- tensorhive/app/web/AppServer.py | 3 +-- tensorhive/app/web/dist/static/config.json | 1 - tensorhive/config.py | 3 +-- tensorhive/main_config.ini | 3 +-- 6 files changed, 5 insertions(+), 10 deletions(-) delete mode 100644 tensorhive/app/web/dist/static/config.json diff --git a/tensorhive/api/APIServer.py b/tensorhive/api/APIServer.py index 821f53b9..1aa39d3c 100644 --- a/tensorhive/api/APIServer.py +++ b/tensorhive/api/APIServer.py @@ -25,7 +25,6 @@ def shutdown_session(exception=None): app.add_api(API.SPEC_FILE, arguments={ 'title': API.TITLE, - 'version': API.VERSION, 'url_prefix': API.URL_PREFIX, 'RESPONSES': API.RESPONSES }, diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index aa29136f..69ba14d5 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -1,8 +1,8 @@ openapi: "3.0.3" info: - title: "{{title}} {{version}}" - version: "{{version}}" + title: "{{title}}" + version: "0.5" servers: - url: "/{{url_prefix}}" diff --git a/tensorhive/app/web/AppServer.py b/tensorhive/app/web/AppServer.py index 2a3fb547..8ca5cd94 100644 --- a/tensorhive/app/web/AppServer.py +++ b/tensorhive/app/web/AppServer.py @@ -54,8 +54,7 @@ def _inject_api_endpoint_to_app(): API.URL_HOSTNAME, API_SERVER.PORT, API.URL_PREFIX), - 'version': tensorhive.__version__, - 'apiVersion': API.VERSION + 'version': tensorhive.__version__ } # Overwrite current file content/create file if it does not exist with open(str(web_app_json_config_path), 'w') as json_file: diff --git a/tensorhive/app/web/dist/static/config.json b/tensorhive/app/web/dist/static/config.json deleted file mode 100644 index e2fff3fd..00000000 --- a/tensorhive/app/web/dist/static/config.json +++ /dev/null @@ -1 +0,0 @@ -{"apiPath": "http://localhost:1111/api/0.4", "version": "0.3.3", "apiVersion": "0.4"} \ No newline at end of file diff --git a/tensorhive/config.py b/tensorhive/config.py index 8201c591..8b49331f 100644 --- a/tensorhive/config.py +++ b/tensorhive/config.py @@ -164,9 +164,8 @@ def uri_for_path(path: str) -> str: # type: ignore class API: section = 'api' TITLE = config.get(section, 'title', fallback='TensorHive API') - VERSION = config.get(section, 'version', fallback='{}'.format(tensorhive.__version__)) URL_HOSTNAME = config.get(section, 'url_hostname', fallback='0.0.0.0') - URL_PREFIX = config.get(section, 'url_prefix', fallback='api/{}'.format(VERSION)) + URL_PREFIX = config.get(section, 'url_prefix', fallback='api') SPEC_FILE = config.get(section, 'spec_file', fallback='api_specification.yml') IMPL_LOCATION = config.get(section, 'impl_location', fallback='tensorhive.api.controllers') diff --git a/tensorhive/main_config.ini b/tensorhive/main_config.ini index 013ca622..cf79b202 100644 --- a/tensorhive/main_config.ini +++ b/tensorhive/main_config.ini @@ -10,9 +10,8 @@ path = ~/.config/TensorHive/database.sqlite [api] title = TensorHive API -version = 0.4 url_hostname = 0.0.0.0 -url_prefix = api/%(version)s +url_prefix = api spec_file = api_specification.yml impl_location = tensorhive.api.controllers From 95f8f5b5d3e884e50aede12e51e0dfbe804ef5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20Szempli=C5=84ski?= Date: Fri, 16 Oct 2020 17:06:03 +0200 Subject: [PATCH 049/175] Fix functional tests - remove API version --- tests/fixtures/controllers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fixtures/controllers.py b/tests/fixtures/controllers.py index 5b40b931..fbff76c5 100644 --- a/tests/fixtures/controllers.py +++ b/tests/fixtures/controllers.py @@ -18,7 +18,6 @@ def client(): app.add_api('../../tensorhive/api/' + API.SPEC_FILE, arguments={ 'title': API.TITLE, - 'version': API.VERSION, 'url_prefix': API.URL_PREFIX, 'RESPONSES': API.RESPONSES }, From be1de0c795e64277327251931e2c038222f9cbef Mon Sep 17 00:00:00 2001 From: Martyna Oleszkiewicz Date: Sun, 18 Oct 2020 19:52:07 +0200 Subject: [PATCH 050/175] Add groups and restrictions to UsersOverview --- .../src/components/views/UsersOverview.vue | 901 +++++++++++------- .../views/users_overview/GroupsInfo.vue | 410 ++++++++ .../views/users_overview/UsersInfo.vue | 465 +++++++++ 3 files changed, 1415 insertions(+), 361 deletions(-) create mode 100644 tensorhive/app/web/dev/src/components/views/users_overview/GroupsInfo.vue create mode 100644 tensorhive/app/web/dev/src/components/views/users_overview/UsersInfo.vue diff --git a/tensorhive/app/web/dev/src/components/views/UsersOverview.vue b/tensorhive/app/web/dev/src/components/views/UsersOverview.vue index 044945bb..8125b995 100644 --- a/tensorhive/app/web/dev/src/components/views/UsersOverview.vue +++ b/tensorhive/app/web/dev/src/components/views/UsersOverview.vue @@ -12,94 +12,285 @@ dismissible type="info" > - User successfully created + {{ infoMessage }} - - + + + + close + + Manage restrictions + + - - - - close - - Create new user - - -
- - Username - -
- - -
- Email -
- - -
- Password -
- - -
- Repeat password -
- - -
- + + {{ props.item.id }} + {{ props.item.name }} + {{ printTimespan(props.item.startsAt, props.item.endsAt) }} + {{ printSchedule(props.item.schedules) }} + + + + {{ printUsernames(props.item.users) }} + + + + + + {{ printNames(props.item.groups) }} + + + All + + + + {{ printNames(props.item.resources) }} + + + + - {{ errorMessage }} - - + + + + + + {{ errorMessage }} + + + Add restriction + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - Create -
-
-
-
-
-
+ + + + + Add + + + + + @@ -112,18 +303,18 @@ flat icon color="black" - @click="showModalRemove= false" + @click="showRemoveRestriction=false" > close - Do you want to remove this user? + Do you want to remove this restriction? Yes @@ -131,136 +322,13 @@ -
-
- Create user -
- - - - - close - - - Edit user - - - Current username: {{currentUser.username}} - - - New username - -
- - -
- - Current email: {{currentUser.email}} - - - New email - -
- - -
- - New password - -
- - -
- - Repeat password - -
- - -
- - Account roles: - - - - - -
- - - Edit - -
-
- - - -
- -
+
+ Manage restrictions + +
+
+ +
@@ -268,62 +336,61 @@ - diff --git a/tensorhive/app/web/dev/src/components/views/users_overview/GroupsInfo.vue b/tensorhive/app/web/dev/src/components/views/users_overview/GroupsInfo.vue new file mode 100644 index 00000000..cfa10f0d --- /dev/null +++ b/tensorhive/app/web/dev/src/components/views/users_overview/GroupsInfo.vue @@ -0,0 +1,410 @@ + + + diff --git a/tensorhive/app/web/dev/src/components/views/users_overview/UsersInfo.vue b/tensorhive/app/web/dev/src/components/views/users_overview/UsersInfo.vue new file mode 100644 index 00000000..70531bee --- /dev/null +++ b/tensorhive/app/web/dev/src/components/views/users_overview/UsersInfo.vue @@ -0,0 +1,465 @@ + + + From b6c3eb6962221f903dd6e150ca2a66050250bd49 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Tue, 20 Oct 2020 18:50:40 +0200 Subject: [PATCH 051/175] Add ability to apply restriction to resources by hostname --- ...e_add_hostname_column_to_the_resources_.py | 26 ++++++++ tensorhive/api/api_specification.yml | 56 +++++++++++++++++ tensorhive/controllers/nodes.py | 3 +- tensorhive/controllers/restriction.py | 30 +++++++++ tensorhive/models/Resource.py | 8 ++- tensorhive/models/Restriction.py | 9 +++ .../test_restriction_controller.py | 63 ++++++++++++++++--- 7 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 migrations/versions/58a12e45663e_add_hostname_column_to_the_resources_.py diff --git a/migrations/versions/58a12e45663e_add_hostname_column_to_the_resources_.py b/migrations/versions/58a12e45663e_add_hostname_column_to_the_resources_.py new file mode 100644 index 00000000..3e1b52c4 --- /dev/null +++ b/migrations/versions/58a12e45663e_add_hostname_column_to_the_resources_.py @@ -0,0 +1,26 @@ +"""Add hostname column to the resources table + +Revision ID: 58a12e45663e +Revises: 06ce06e9bb85 +Create Date: 2020-10-20 18:24:40.267394 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '58a12e45663e' +down_revision = '06ce06e9bb85' +branch_labels = None +depends_on = None + + +def upgrade(): + with op.batch_alter_table('resources') as batch_op: + batch_op.add_column(sa.Column('hostname', sa.String(length=64), nullable=True)) + + +def downgrade(): + with op.batch_alter_table('resources') as batch_op: + batch_op.drop_column('hostname') diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 69ba14d5..7b1c1da9 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -1136,6 +1136,62 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] + /restrictions/{restriction_id}/resources/hostname/{hostname}: + put: + tags: + - restrictions + summary: Apply restriction to all resources with given hostname + operationId: tensorhive.controllers.restriction.apply_to_resources_by_hostname + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Resources hostname + in: path + name: hostname + required: true + schema: + type: string + responses: + 200: + description: {{RESPONSES['restriction']['resources']['apply']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['resources']['apply']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 400: + description: {{RESPONSES['general']['bad_request']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unprivileged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unprivileged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} + 409: + description: {{RESPONSES['restriction']['resources']['apply']['failure']['duplicate']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['resources']['apply']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] /restrictions/{restriction_id}/resources/{resource_uuid}: put: tags: diff --git a/tensorhive/controllers/nodes.py b/tensorhive/controllers/nodes.py index c4c7a8c1..b7db0771 100644 --- a/tensorhive/controllers/nodes.py +++ b/tensorhive/controllers/nodes.py @@ -21,7 +21,8 @@ def get_infrastructure(): if gpu_uuid not in id_list: new_resource = Resource( id=gpu_uuid, - name=gpu_metrics.get('name') + name=gpu_metrics.get('name'), + hostname=hostname ) new_resource.save() except Exception: diff --git a/tensorhive/controllers/restriction.py b/tensorhive/controllers/restriction.py index e6415b53..7abd2079 100644 --- a/tensorhive/controllers/restriction.py +++ b/tensorhive/controllers/restriction.py @@ -270,6 +270,36 @@ def apply_to_resource(restriction_id: RestrictionId, resource_uuid: ResourceId) return content, status +@admin_required +def apply_to_resources_by_hostname(restriction_id: RestrictionId, hostname: str) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + resources = Resource.get_by_hostname(hostname) + restriction.apply_to_resources(resources) + for user in restriction.get_all_affected_users(): + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value + except InvalidRequestException: + content, status = {'msg': RESTRICTION['resources']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['resources']['apply']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['resources']['apply']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + @admin_required def add_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> Tuple[Content, HttpStatusCode]: restriction = None diff --git a/tensorhive/models/Resource.py b/tensorhive/models/Resource.py index 4876dbef..f8406c39 100644 --- a/tensorhive/models/Resource.py +++ b/tensorhive/models/Resource.py @@ -13,6 +13,7 @@ class Resource(CRUDModel, RestrictionAssignee): # type: ignore __tablename__ = 'resources' id = Column(String(64), primary_key=True) name = Column(String(40), nullable=True) + hostname = Column(String(64), nullable=True) _restrictions = relationship('Restriction', secondary='restriction2resource') @@ -52,9 +53,14 @@ def get_active_restrictions(self, include_global=True): def get_by_name(cls, resource_name): return db_session.query(Resource).filter(Resource.name == resource_name).all() + @classmethod + def get_by_hostname(cls, hostname): + return db_session.query(Resource).filter(Resource.hostname == hostname).all() + @property def as_dict(self): return { 'id': self.id, - 'name': self.name + 'name': self.name, + 'hostname': self.hostname } diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 98d4c4b0..2ffe44b9 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -12,6 +12,7 @@ from tensorhive.models.Group import Group from tensorhive.models.Resource import Resource from tensorhive.models.RestrictionSchedule import RestrictionSchedule +from typing import List log = logging.getLogger(__name__) @@ -138,6 +139,14 @@ def apply_to_resource(self, resource: Resource): self.resources.append(resource) self.save() + def apply_to_resources(self, resources: List[Resource]): + for resource in resources: + if resource in self.resources: + # Skip adding resource that was already there + continue + self.resources.append(resource) + self.save() + def remove_from_resource(self, resource: Resource): if resource not in self.resources: raise InvalidRequestException('Resource {resource} is not affected by restriction {restriction}' diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py index 8557cf5d..69593d36 100644 --- a/tests/functional/controllers/test_restriction_controller.py +++ b/tests/functional/controllers/test_restriction_controller.py @@ -192,7 +192,7 @@ def test_apply_nonexistent_restriction_to_group(tables, client, new_group): assert resp.status_code == HTTPStatus.NOT_FOUND -# PUT /restrictions/{id}/resources/{group_id} - apply restriction to resource - correct +# PUT /restrictions/{id}/resources/{resource_id} - apply restriction to resource - correct def test_apply_restriction_to_resource(tables, client, restriction, resource1): restriction.save() resource1.save() @@ -204,7 +204,54 @@ def test_apply_restriction_to_resource(tables, client, restriction, resource1): assert resource1 in restriction.resources -# PUT /restrictions/{id}/resources/{group_id} - nonexistent resource +# PUT /restrictions/{id}/resources/hostname/{hostname} +def test_apply_restriction_to_resources_by_hostname(tables, client, restriction, resource1, resource2): + restriction.save() + resource1.hostname = 'nasa.gov' + resource2.hostname = 'nasa.gov' + resource1.save() + resource2.save() + + resp = client.put(ENDPOINT + '/{}/resources/hostname/nasa.gov'.format(restriction.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction in resource1.get_restrictions() + assert restriction in resource2.get_restrictions() + assert resource1 in restriction.resources + assert resource2 in restriction.resources + + +# PUT /restrictions/{id}/resources/hostname/{hostname} - no resources with given hostname +def test_apply_restriction_to_nonexistent_resources_by_hostname(tables, client, restriction, resource1, resource2): + restriction.save() + resource1.hostname = 'spacex.com' + resource2.hostname = 'spacex.com' + resource1.save() + resource2.save() + + resp = client.put(ENDPOINT + '/{}/resources/hostname/nasa.gov'.format(restriction.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert restriction not in resource1.get_restrictions() + assert restriction not in resource2.get_restrictions() + assert len(restriction.resources) == 0 + + +# PUT /restrictions/{id}/resources/hostname/{hostname} +def test_apply_nonexistent_restriction_to_resources_by_hostname(tables, client, resource1, resource2): + resource1.hostname = 'nasa.gov' + resource2.hostname = 'nasa.gov' + resource1.save() + resource2.save() + + resp = client.put(ENDPOINT + '/777/resources/hostname/nasa.gov', headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + assert len(resource1.get_restrictions()) == 0 + assert len(resource2.get_restrictions()) == 0 + + +# PUT /restrictions/{id}/resources/{resource_id} - nonexistent resource def test_apply_restriction_to_nonexistent_resource(tables, client, restriction): restriction.save() nonexistent_id = '777' @@ -214,7 +261,7 @@ def test_apply_restriction_to_nonexistent_resource(tables, client, restriction): assert resp.status_code == HTTPStatus.NOT_FOUND -# PUT /restrictions/{id}/resources/{group_id} - nonexistent restriction +# PUT /restrictions/{id}/resources/{resource_id} - nonexistent restriction def test_apply_nonexistent_restriction_to_resource(tables, client, resource1): resource1.save() nonexistent_id = '777' @@ -224,7 +271,7 @@ def test_apply_nonexistent_restriction_to_resource(tables, client, resource1): assert resp.status_code == HTTPStatus.NOT_FOUND -# PUT /restrictions/{id}/schedules/{group_id} - apply restriction to schedule - correct +# PUT /restrictions/{id}/schedules/{schedule_id} - apply restriction to schedule - correct def test_apply_restriction_to_schedule(tables, client, restriction, active_schedule): restriction.save() active_schedule.save() @@ -236,7 +283,7 @@ def test_apply_restriction_to_schedule(tables, client, restriction, active_sched assert active_schedule in restriction.schedules -# PUT /restrictions/{id}/schedules/{group_id} - nonexistent schedule +# PUT /restrictions/{id}/schedules/{schedule_id} - nonexistent schedule def test_apply_restriction_to_nonexistent_schedule(tables, client, restriction): restriction.save() nonexistent_id = '777' @@ -246,7 +293,7 @@ def test_apply_restriction_to_nonexistent_schedule(tables, client, restriction): assert resp.status_code == HTTPStatus.NOT_FOUND -# PUT /restrictions/{id}/schedules/{group_id} - nonexistent restriction +# PUT /restrictions/{id}/schedules/{schedule_id} - nonexistent restriction def test_apply_nonexistent_restriction_to_schedule(tables, client, active_schedule): active_schedule.save() nonexistent_id = '777' @@ -268,7 +315,7 @@ def test_apply_restriction_to_user(tables, client, restriction, new_user): assert new_user in restriction.users -# PUT /restrictions/{id}/users/{group_id} - nonexistent user +# PUT /restrictions/{id}/users/{user_id} - nonexistent user def test_apply_restriction_to_nonexistent_user(tables, client, restriction): restriction.save() nonexistent_id = '777' @@ -278,7 +325,7 @@ def test_apply_restriction_to_nonexistent_user(tables, client, restriction): assert resp.status_code == HTTPStatus.NOT_FOUND -# PUT /restrictions/{id}/users/{group_id} - nonexistent restriction +# PUT /restrictions/{id}/users/{user_id} - nonexistent restriction def test_apply_nonexistent_restriction_to_user(tables, client, new_user): new_user.save() nonexistent_id = '777' From 77d80b6b50ef5f3ed84dab40e17587197add31b1 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Tue, 20 Oct 2020 21:02:22 +0200 Subject: [PATCH 052/175] Functional tests refactoring --- .../controllers/test_group_controller.py | 28 ++++++++++++++++--- .../test_reservation_controller.py | 2 -- .../test_restriction_controller.py | 5 +++- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/tests/functional/controllers/test_group_controller.py b/tests/functional/controllers/test_group_controller.py index f68cc9dd..1c09365a 100644 --- a/tests/functional/controllers/test_group_controller.py +++ b/tests/functional/controllers/test_group_controller.py @@ -22,20 +22,20 @@ def test_create(tables, client): # GET /groups -def test_get_list_of_groups(tables, client): +def test_get_list_of_groups(tables, client, new_group): resp = client.get(ENDPOINT, headers=HEADERS) resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 0 # no groups added yet - # Now let's add one group - client.post(ENDPOINT, headers=HEADERS, data=json.dumps({'name': 'Test'})) + +def test_get_list_of_groups_one_group_returned(tables, client, new_group): + new_group.save() resp = client.get(ENDPOINT, headers=HEADERS) resp_json = json.loads(resp.data.decode('utf-8')) - assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 1 # one group added already @@ -146,3 +146,23 @@ def test_add_user_to_nonexistent_group(tables, client, new_user): resp = client.put(ENDPOINT + '/{}/users/{}'.format(nonexistent_group_id, new_user.id), headers=HEADERS) assert resp.status_code == HTTPStatus.NOT_FOUND + + +# DELETE /groups/{id}/users/{id} - nonexistent user id +def test_remove_nonexistent_user_from_a_group(tables, client, new_group): + new_group.save() + nonexistent_user_id = '777' + + resp = client.delete(ENDPOINT + '/{}/users/{}'.format(new_group.id, nonexistent_user_id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# DELETE /groups/{id}/users/{id} - nonexistent group id +def test_remove_user_from_a_nonexistent_group(tables, client, new_user): + new_user.save() + nonexistent_group_id = '777' + + resp = client.delete(ENDPOINT + '/{}/users/{}'.format(nonexistent_group_id, new_user.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND diff --git a/tests/functional/controllers/test_reservation_controller.py b/tests/functional/controllers/test_reservation_controller.py index c5f9de1d..04fa4714 100644 --- a/tests/functional/controllers/test_reservation_controller.py +++ b/tests/functional/controllers/test_reservation_controller.py @@ -72,7 +72,6 @@ def test_create_reservation_with_permissions_just_for_a_part_of_it(tables, clien restriction.apply_to_resource(resource) # Try to create reservation for a period just partly covered by the restriction. - # Should fail. data = { 'title': 'Test reservation', 'description': 'Test reservation', @@ -109,7 +108,6 @@ def test_create_reservation_outside_of_schedule(tables, client, new_user, restri restriction.apply_to_resource(resource) # Try to create reservation for a period just partly covered by the restriction. - # Should fail. data = { 'title': 'Test reservation', 'description': 'Test reservation', diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py index 69593d36..ce067622 100644 --- a/tests/functional/controllers/test_restriction_controller.py +++ b/tests/functional/controllers/test_restriction_controller.py @@ -12,13 +12,16 @@ # GET /restrictions -def test_get_all_restrictions(tables, client): +def test_get_all_restrictions_empty_response(tables, client): resp = client.get(ENDPOINT, headers=HEADERS) resp_json = json.loads(resp.data.decode('utf-8')) assert resp.status_code == HTTPStatus.OK assert len(resp_json) == 0 + +# GET /restrictions +def test_get_all_restrictions_with_data(tables, client): # Create new restriction and save it to the DB start_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=5) end_time = start_time + datetime.timedelta(hours=8) From 461953303bc595fd5426ee81970493fb54793a18 Mon Sep 17 00:00:00 2001 From: mateusz Date: Tue, 20 Oct 2020 23:07:41 +0200 Subject: [PATCH 053/175] Fixed applying restriction to resources by hostname, add ability to remove restriction from resources by hostname --- tensorhive/api/api_specification.yml | 117 +++++++++++------- tensorhive/controllers/responses.yml | 13 +- tensorhive/controllers/restriction.py | 49 ++++++-- tensorhive/models/Restriction.py | 8 ++ .../controllers/test_group_controller.py | 2 +- .../test_restriction_controller.py | 6 +- 6 files changed, 136 insertions(+), 59 deletions(-) diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 7b1c1da9..8b5faaf3 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -633,8 +633,6 @@ paths: example: {{RESPONSES['group']['users']['add']['success']}} group: $ref: '#/components/schemas/Group' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -688,8 +686,6 @@ paths: example: {{RESPONSES['group']['users']['remove']['success']}} group: $ref: '#/components/schemas/Group' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -950,8 +946,6 @@ paths: example: {{RESPONSES['restriction']['users']['apply']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1005,8 +999,6 @@ paths: example: {{RESPONSES['restriction']['users']['remove']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1059,8 +1051,6 @@ paths: example: {{RESPONSES['restriction']['groups']['apply']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1114,8 +1104,6 @@ paths: example: {{RESPONSES['restriction']['groups']['remove']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1136,12 +1124,12 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] - /restrictions/{restriction_id}/resources/hostname/{hostname}: + /restrictions/{restriction_id}/resources/{resource_uuid}: put: tags: - restrictions - summary: Apply restriction to all resources with given hostname - operationId: tensorhive.controllers.restriction.apply_to_resources_by_hostname + summary: Apply restriction to resource + operationId: tensorhive.controllers.restriction.apply_to_resource parameters: - description: Restriction ID in: path @@ -1149,9 +1137,9 @@ paths: required: true schema: type: integer - - description: Resources hostname + - description: Resource UUID in: path - name: hostname + name: resource_uuid required: true schema: type: string @@ -1168,8 +1156,6 @@ paths: example: {{RESPONSES['restriction']['resources']['apply']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1192,12 +1178,11 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] - /restrictions/{restriction_id}/resources/{resource_uuid}: - put: + delete: tags: - restrictions - summary: Apply restriction to resource - operationId: tensorhive.controllers.restriction.apply_to_resource + summary: Remove restriction from resource + operationId: tensorhive.controllers.restriction.remove_from_resource parameters: - description: Restriction ID in: path @@ -1213,7 +1198,7 @@ paths: type: string responses: 200: - description: {{RESPONSES['restriction']['resources']['apply']['success']}} + description: {{RESPONSES['restriction']['resources']['remove']['success']}} content: application/json: schema: @@ -1221,11 +1206,9 @@ paths: properties: msg: type: string - example: {{RESPONSES['restriction']['resources']['apply']['success']}} + example: {{RESPONSES['restriction']['resources']['remove']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1239,11 +1222,61 @@ paths: type: string example: {{RESPONSES['general']['unprivileged']}} 404: - description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} - 409: - description: {{RESPONSES['restriction']['resources']['apply']['failure']['duplicate']}} + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['not_found']}} 422: - description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['resources']['apply']['failure']['assertions']}} + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /restrictions/{restriction_id}/hosts/{hostname}: + put: + tags: + - restrictions + summary: Apply restriction to all resources with given hostname + operationId: tensorhive.controllers.restriction.apply_to_resources_by_hostname + parameters: + - description: Restriction ID + in: path + name: restriction_id + required: true + schema: + type: integer + - description: Resources hostname + in: path + name: hostname + required: true + schema: + type: string + responses: + 200: + description: {{RESPONSES['restriction']['hosts']['apply']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['restriction']['hosts']['apply']['success']}} + restriction: + $ref: '#/components/schemas/Restriction' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unprivileged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unprivileged']}} + 404: + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['nodes']['hostname']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['hosts']['apply']['failure']['assertions']}} 500: description: {{RESPONSES['general']['internal_error']}} security: @@ -1251,8 +1284,8 @@ paths: delete: tags: - restrictions - summary: Remove restriction from resource - operationId: tensorhive.controllers.restriction.remove_from_resource + summary: Remove restriction from all resources with given hostname + operationId: tensorhive.controllers.restriction.remove_from_resources_by_hostname parameters: - description: Restriction ID in: path @@ -1260,15 +1293,15 @@ paths: required: true schema: type: integer - - description: Resource UUID + - description: Resources hostname in: path - name: resource_uuid + name: hostname required: true schema: type: string responses: 200: - description: {{RESPONSES['restriction']['resources']['remove']['success']}} + description: {{RESPONSES['restriction']['hosts']['remove']['success']}} content: application/json: schema: @@ -1276,11 +1309,9 @@ paths: properties: msg: type: string - example: {{RESPONSES['restriction']['resources']['remove']['success']}} + example: {{RESPONSES['restriction']['hosts']['remove']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1294,9 +1325,9 @@ paths: type: string example: {{RESPONSES['general']['unprivileged']}} 404: - description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['resource']['not_found']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['not_found']}} + description: {{RESPONSES['restriction']['not_found']}} or {{RESPONSES['nodes']['hostname']['not_found']}} 422: - description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['resources']['remove']['failure']['assertions']}} + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['restriction']['hosts']['apply']['failure']['assertions']}} 500: description: {{RESPONSES['general']['internal_error']}} security: @@ -1333,8 +1364,6 @@ paths: example: {{RESPONSES['restriction']['schedules']['add']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: @@ -1388,8 +1417,6 @@ paths: example: {{RESPONSES['restriction']['schedules']['remove']['success']}} restriction: $ref: '#/components/schemas/Restriction' - 400: - description: {{RESPONSES['general']['bad_request']}} 401: description: {{RESPONSES['general']['unauthorized']}} 403: diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index ab99d38f..aab05917 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -86,10 +86,19 @@ restriction: duplicate: Restriction is already being applied to resource assertion: Unable to apply restriction to resource - {reason} remove: - success: Restriction has been removed from resourcce + success: Restriction has been removed from resource failure: - assertion: Unable to remove restriction from resourcce - {reason} + assertion: Unable to remove restriction from resource - {reason} not_found: Resource is not affected by restriction + hosts: + apply: + success: Restriction has been applied to all resources with given hostname + failure: + assertion: Unable to apply restriction to resources with given hostname - {reason} + remove: + success: Restriction has been removed from all resources with given hostname + failure: + assertion: Unable to remove restriction from resources with given hostname - {reason} schedules: add: success: Schedule has been added to restriction diff --git a/tensorhive/controllers/restriction.py b/tensorhive/controllers/restriction.py index 7abd2079..74b67626 100644 --- a/tensorhive/controllers/restriction.py +++ b/tensorhive/controllers/restriction.py @@ -19,6 +19,7 @@ USER = API.RESPONSES['user'] GROUP = API.RESPONSES['group'] RESOURCE = API.RESPONSES['resource'] +NODES = API.RESPONSES['nodes'] SCHEDULE = API.RESPONSES['schedule'] GENERAL = API.RESPONSES['general'] @@ -276,24 +277,25 @@ def apply_to_resources_by_hostname(restriction_id: RestrictionId, hostname: str) try: restriction = Restriction.get(restriction_id) resources = Resource.get_by_hostname(hostname) - restriction.apply_to_resources(resources) - for user in restriction.get_all_affected_users(): - ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) + if resources: + restriction.apply_to_resources(resources) + for user in restriction.get_all_affected_users(): + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=True) + else: + raise NoResultFound except NoResultFound: if restriction is None: content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value else: - content, status = {'msg': RESOURCE['not_found']}, HTTPStatus.NOT_FOUND.value - except InvalidRequestException: - content, status = {'msg': RESTRICTION['resources']['apply']['failure']['duplicate']}, HTTPStatus.CONFLICT.value + content, status = {'msg': NODES['hostname']['not_found']}, HTTPStatus.NOT_FOUND.value except AssertionError as e: - content, status = {'msg': RESTRICTION['resources']['apply']['failure']['assertions'].format(reason=e)}, \ + content, status = {'msg': RESTRICTION['hosts']['apply']['failure']['assertions'].format(reason=e)}, \ HTTPStatus.UNPROCESSABLE_ENTITY.value except Exception as e: log.critical(e) content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value else: - content, status = {'msg': RESTRICTION['resources']['apply']['success'], + content, status = {'msg': RESTRICTION['hosts']['apply']['success'], 'restriction': restriction.as_dict(include_groups=True, include_users=True, include_resources=True)}, HTTPStatus.OK.value finally: @@ -421,6 +423,37 @@ def remove_from_resource(restriction_id: RestrictionId, resource_uuid: ResourceI return content, status +@admin_required +def remove_from_resources_by_hostname(restriction_id: RestrictionId, hostname: str) -> Tuple[Content, HttpStatusCode]: + restriction = None + try: + restriction = Restriction.get(restriction_id) + resources = Resource.get_by_hostname(hostname) + if resources: + restriction.remove_from_resources(resources) + for user in restriction.get_all_affected_users(): + ReservationVerifier.update_user_reservations_statuses(user, have_users_permissions_increased=False) + else: + raise NoResultFound + except NoResultFound: + if restriction is None: + content, status = {'msg': RESTRICTION['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': NODES['hostname']['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': RESTRICTION['hosts']['remove']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': RESTRICTION['hosts']['remove']['success'], + 'restriction': restriction.as_dict(include_groups=True, include_users=True, + include_resources=True)}, HTTPStatus.OK.value + finally: + return content, status + + @admin_required def remove_schedule(restriction_id: RestrictionId, schedule_id: ScheduleId) -> Tuple[Content, HttpStatusCode]: restriction = None diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 2ffe44b9..f02c3259 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -154,6 +154,14 @@ def remove_from_resource(self, resource: Resource): self.resources.remove(resource) self.save() + def remove_from_resources(self, resources: List[Resource]): + for resource in resources: + if resource not in self.resources: + # Skip removing resource that wasn't there + continue + self.resources.remove(resource) + self.save() + def add_schedule(self, schedule: RestrictionSchedule): if schedule in self.schedules: raise InvalidRequestException('Schedule {schedule} is already being applied to restriction {restriction}' diff --git a/tests/functional/controllers/test_group_controller.py b/tests/functional/controllers/test_group_controller.py index 1c09365a..b6ac7b2b 100644 --- a/tests/functional/controllers/test_group_controller.py +++ b/tests/functional/controllers/test_group_controller.py @@ -22,7 +22,7 @@ def test_create(tables, client): # GET /groups -def test_get_list_of_groups(tables, client, new_group): +def test_get_list_of_groups(tables, client): resp = client.get(ENDPOINT, headers=HEADERS) resp_json = json.loads(resp.data.decode('utf-8')) diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py index ce067622..6a2946c0 100644 --- a/tests/functional/controllers/test_restriction_controller.py +++ b/tests/functional/controllers/test_restriction_controller.py @@ -207,7 +207,7 @@ def test_apply_restriction_to_resource(tables, client, restriction, resource1): assert resource1 in restriction.resources -# PUT /restrictions/{id}/resources/hostname/{hostname} +# PUT /restrictions/{id}/hosts/{hostname} def test_apply_restriction_to_resources_by_hostname(tables, client, restriction, resource1, resource2): restriction.save() resource1.hostname = 'nasa.gov' @@ -224,7 +224,7 @@ def test_apply_restriction_to_resources_by_hostname(tables, client, restriction, assert resource2 in restriction.resources -# PUT /restrictions/{id}/resources/hostname/{hostname} - no resources with given hostname +# PUT /restrictions/{id}/hosts/{hostname} - no resources with given hostname def test_apply_restriction_to_nonexistent_resources_by_hostname(tables, client, restriction, resource1, resource2): restriction.save() resource1.hostname = 'spacex.com' @@ -240,7 +240,7 @@ def test_apply_restriction_to_nonexistent_resources_by_hostname(tables, client, assert len(restriction.resources) == 0 -# PUT /restrictions/{id}/resources/hostname/{hostname} +# PUT /restrictions/{id}/hosts/{hostname} def test_apply_nonexistent_restriction_to_resources_by_hostname(tables, client, resource1, resource2): resource1.hostname = 'nasa.gov' resource2.hostname = 'nasa.gov' From e8d1e3c3a029be33d691f61a04432dcbd4238434 Mon Sep 17 00:00:00 2001 From: mateusz Date: Tue, 20 Oct 2020 23:29:58 +0200 Subject: [PATCH 054/175] Fix tests --- tensorhive/api/api_specification.yml | 3 +++ .../controllers/test_restriction_controller.py | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 8b5faaf3..8639ff01 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -3111,6 +3111,9 @@ components: name: type: string example: GeForce GTX 1060 + hostname: + type: string + example: localhost GPUAllData: type: object example: diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py index 6a2946c0..8dc475a8 100644 --- a/tests/functional/controllers/test_restriction_controller.py +++ b/tests/functional/controllers/test_restriction_controller.py @@ -215,7 +215,7 @@ def test_apply_restriction_to_resources_by_hostname(tables, client, restriction, resource1.save() resource2.save() - resp = client.put(ENDPOINT + '/{}/resources/hostname/nasa.gov'.format(restriction.id), headers=HEADERS) + resp = client.put(ENDPOINT + '/{}/hosts/nasa.gov'.format(restriction.id), headers=HEADERS) assert resp.status_code == HTTPStatus.OK assert restriction in resource1.get_restrictions() @@ -225,16 +225,16 @@ def test_apply_restriction_to_resources_by_hostname(tables, client, restriction, # PUT /restrictions/{id}/hosts/{hostname} - no resources with given hostname -def test_apply_restriction_to_nonexistent_resources_by_hostname(tables, client, restriction, resource1, resource2): +def test_apply_restriction_to_resources_by_nonexistent_hostname(tables, client, restriction, resource1, resource2): restriction.save() resource1.hostname = 'spacex.com' resource2.hostname = 'spacex.com' resource1.save() resource2.save() - resp = client.put(ENDPOINT + '/{}/resources/hostname/nasa.gov'.format(restriction.id), headers=HEADERS) + resp = client.put(ENDPOINT + '/{}/hosts/nasa.gov'.format(restriction.id), headers=HEADERS) - assert resp.status_code == HTTPStatus.OK + assert resp.status_code == HTTPStatus.NOT_FOUND assert restriction not in resource1.get_restrictions() assert restriction not in resource2.get_restrictions() assert len(restriction.resources) == 0 @@ -247,7 +247,7 @@ def test_apply_nonexistent_restriction_to_resources_by_hostname(tables, client, resource1.save() resource2.save() - resp = client.put(ENDPOINT + '/777/resources/hostname/nasa.gov', headers=HEADERS) + resp = client.put(ENDPOINT + '/777/hosts/nasa.gov', headers=HEADERS) assert resp.status_code == HTTPStatus.NOT_FOUND assert len(resource1.get_restrictions()) == 0 From 9421c844b4fd73893edc98703d9ea3290f0a239c Mon Sep 17 00:00:00 2001 From: mateusz Date: Thu, 22 Oct 2020 16:42:37 +0200 Subject: [PATCH 055/175] Fix is_reservation_allowed when restriction last indefinitely --- tensorhive/core/utils/ReservationVerifier.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tensorhive/core/utils/ReservationVerifier.py b/tensorhive/core/utils/ReservationVerifier.py index 89ec4c85..b2a87edb 100644 --- a/tensorhive/core/utils/ReservationVerifier.py +++ b/tensorhive/core/utils/ReservationVerifier.py @@ -55,7 +55,6 @@ def is_reservation_allowed(cls, user, reservation): start_date = reservation.starts_at end_date = reservation.ends_at - reservation_allowed = False while True: start_date_changed = False for restriction in restrictions: @@ -63,19 +62,22 @@ def is_reservation_allowed(cls, user, reservation): (restriction.ends_at is None or start_date < restriction.ends_at): schedules = restriction.schedules if not schedules: - start_date = restriction.ends_at - start_date_changed = True + if restriction.ends_at is None: + # If restriction lasts indefinitely, reservation is allowed + return True + else: + start_date = restriction.ends_at + start_date_changed = True else: date = cls.__get_latest_date_allowed_by_schedules(start_date, end_date, schedules) if date > start_date: start_date_changed = True start_date = date if start_date >= end_date: - reservation_allowed = True - break - if reservation_allowed or not start_date_changed: + return True + if not start_date_changed: break - return reservation_allowed + return False @classmethod def update_user_reservations_statuses(cls, user, have_users_permissions_increased): From 04e1626c5204c2a7b288f007bf4247826a20cfe7 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Thu, 22 Oct 2020 18:43:18 +0200 Subject: [PATCH 056/175] Add more test coverage, including creating reservations with indefinite restrictions --- .../test_reservation_controller.py | 68 ++++++++++++++++++- .../test_restriction_controller.py | 67 +++++++++++++++++- tests/unit/models/test_restriction_model.py | 8 +++ 3 files changed, 139 insertions(+), 4 deletions(-) diff --git a/tests/functional/controllers/test_reservation_controller.py b/tests/functional/controllers/test_reservation_controller.py index 04fa4714..32807a9c 100644 --- a/tests/functional/controllers/test_reservation_controller.py +++ b/tests/functional/controllers/test_reservation_controller.py @@ -1,5 +1,6 @@ from tensorhive.models.Reservation import Reservation from tensorhive.models.Resource import Resource +from tensorhive.models.Restriction import Restriction from tensorhive.models.RestrictionSchedule import RestrictionSchedule from fixtures.controllers import API_URI as BASE_URI, HEADERS from http import HTTPStatus @@ -58,6 +59,34 @@ def test_create_reservation_with_proper_permissions(tables, client, new_user, re assert Reservation.get(resp_json['reservation']['id']) is not None +def test_create_reservation_with_an_indefinite_restriction(tables, client, new_user, restriction): + new_user.save() + + # Create an indefinite restriction and assign it to the user + restriction.starts_at = '2101-01-01T10:00:00.000Z' + restriction.ends_at = None + restriction.apply_to_user(new_user) + + # Create a resource and assign it to the restriction + resource = Resource(id='0123456789012345678901234567890123456789') + resource.save() + restriction.apply_to_resource(resource) + + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2101-01-02T10:00:00.000Z', + 'end': '2101-01-03T12:00:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.CREATED + assert Reservation.get(resp_json['reservation']['id']) is not None + + def test_create_reservation_with_permissions_just_for_a_part_of_it(tables, client, new_user, restriction): new_user.save() @@ -107,14 +136,14 @@ def test_create_reservation_outside_of_schedule(tables, client, new_user, restri resource.save() restriction.apply_to_resource(resource) - # Try to create reservation for a period just partly covered by the restriction. + # Try to create reservation for a period not covered by the restriction. data = { 'title': 'Test reservation', 'description': 'Test reservation', 'resourceId': '0123456789012345678901234567890123456789', 'userId': new_user.id, - 'start': '2101-01-02T09:00:00.000Z', - 'end': '2101-01-02T10:30:00.000Z' + 'start': '2101-01-07T09:00:00.000Z', + 'end': '2101-01-07T10:30:00.000Z' } resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) @@ -159,3 +188,36 @@ def test_after_updating_restriction_reservations_that_are_no_longer_valid_should assert resp.status_code == HTTPStatus.OK assert reservation.is_cancelled is True + + +def test_create_reservation_that_is_covered_by_two_separate_restrictions(tables, client, new_user): + r1_start = '2101-01-01T00:00:00.000Z' + r1_end = '2101-01-02T00:00:00.000Z' + r2_start = '2101-01-02T00:00:00.000Z' + r2_end = '2101-01-02T23:59:00.000Z' + + r1 = Restriction(name='FirstRestriction', starts_at=r1_start, ends_at=r1_end, is_global=False) + r2 = Restriction(name='SecondRestriction', starts_at=r2_start, ends_at=r2_end, is_global=False) + + new_user.save() + r1.apply_to_user(new_user) + r2.apply_to_user(new_user) + + resource = Resource(id='0123456789012345678901234567890123456789') + resource.save() + r1.apply_to_resource(resource) + r2.apply_to_resource(resource) + + data = { + 'title': 'Test reservation', + 'description': 'Test reservation', + 'resourceId': '0123456789012345678901234567890123456789', + 'userId': new_user.id, + 'start': '2101-01-01T10:00:00.000Z', + 'end': '2101-01-02T12:00:00.000Z' + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.CREATED + assert Reservation.get(resp_json['reservation']['id']) is not None diff --git a/tests/functional/controllers/test_restriction_controller.py b/tests/functional/controllers/test_restriction_controller.py index 8dc475a8..2d0b98d5 100644 --- a/tests/functional/controllers/test_restriction_controller.py +++ b/tests/functional/controllers/test_restriction_controller.py @@ -111,6 +111,20 @@ def test_create_restriction(tables, client): assert Restriction.get(resp_json['restriction']['id']) is not None +# POST /restrictions - another correct way (no end date) +def test_create_indefinte_retriction(tables, client): + data = { + 'name': 'Test restriction', + 'start': '2100-01-01T10:00:00.000Z', + 'isGlobal': False + } + resp = client.post(ENDPOINT, headers=HEADERS, data=json.dumps(data)) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.CREATED + assert Restriction.get(resp_json['restriction']['id']) is not None + + # POST /restrictions - missing data def test_create_restriction_missing_data(tables, client): data = { @@ -240,7 +254,7 @@ def test_apply_restriction_to_resources_by_nonexistent_hostname(tables, client, assert len(restriction.resources) == 0 -# PUT /restrictions/{id}/hosts/{hostname} +# PUT /restrictions/{id}/hosts/{hostname} - no restriction with given id def test_apply_nonexistent_restriction_to_resources_by_hostname(tables, client, resource1, resource2): resource1.hostname = 'nasa.gov' resource2.hostname = 'nasa.gov' @@ -254,6 +268,57 @@ def test_apply_nonexistent_restriction_to_resources_by_hostname(tables, client, assert len(resource2.get_restrictions()) == 0 +# DELETE /restrictions/{id}/hosts/{hostname} +def test_remove_resources_with_given_hostname_from_restriction(tables, client, restriction, resource1, resource2): + resource1.hostname = 'nasa.gov' + resource2.hostname = 'spacex.com' + resource1.save() + resource2.save() + + restriction.apply_to_resource(resource1) + restriction.apply_to_resource(resource2) + + resp = client.delete(ENDPOINT + '/{}/hosts/{}'.format(restriction.id, resource1.hostname), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert resource1 not in restriction.resources + assert restriction not in resource1.get_restrictions() + assert resource2 in restriction.resources + assert restriction in resource2.get_restrictions() + + +# DELETE /restrictions/{id}/hosts/{hostname} - no resources with given hostname +def test_remove_resources_with_nonexistent_hostname_from_restriction(tables, client, restriction, + resource1, resource2): + resource1.hostname = 'nasa.gov' + resource2.hostname = 'spacex.com' + resource1.save() + resource2.save() + + restriction.apply_to_resource(resource1) + restriction.apply_to_resource(resource2) + + resp = client.delete(ENDPOINT + '/{}/hosts/jacek.com'.format(restriction.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + assert resource1 in restriction.resources + assert restriction in resource1.get_restrictions() + assert resource2 in restriction.resources + assert restriction in resource2.get_restrictions() + + +# DELETE /restrictions/{id}/hosts/{hostname} - no restriction with given id +def test_remove_resources_with_given_hostname_from_nonexistent_restriction(tables, client, resource1, resource2): + resource1.hostname = 'nasa.gov' + resource2.hostname = 'spacex.com' + resource1.save() + resource2.save() + + resp = client.delete(ENDPOINT + '/777/hosts/{}'.format(resource1.hostname), headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + # PUT /restrictions/{id}/resources/{resource_id} - nonexistent resource def test_apply_restriction_to_nonexistent_resource(tables, client, restriction): restriction.save() diff --git a/tests/unit/models/test_restriction_model.py b/tests/unit/models/test_restriction_model.py index 871bd0ab..83fdcb02 100644 --- a/tests/unit/models/test_restriction_model.py +++ b/tests/unit/models/test_restriction_model.py @@ -15,6 +15,14 @@ def test_restriction_creation(tables): assert new_restriction.id is not None +def test_indefinite_restriction_creation(tables): + starts_at = datetime.utcnow() + timedelta(minutes=5) + new_restriction = Restriction(name='TestRestriction', starts_at=starts_at, is_global=False) + new_restriction.save() + + assert new_restriction.id is not None + + def test_get_global_restrictions_returns_them(tables): starts_at = datetime.utcnow() + timedelta(minutes=5) duration = timedelta(hours=12) From 910eb6ab4145293f393465307294e758d76e0b2b Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 23 Oct 2020 13:44:01 +0200 Subject: [PATCH 057/175] Fix a bug in get_all_affected_users method --- tensorhive/models/Restriction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index f02c3259..5eafa119 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -179,7 +179,7 @@ def remove_schedule(self, schedule: RestrictionSchedule): def get_all_affected_users(self): """Will return all users affected by this restriction, i.e. users directly assigned to this restriction and members of all groups assigned to this restriction.""" - affected_users = self.users + affected_users = self.users[:] for group in self.groups: affected_users.extend(group.users) return list(set(affected_users)) From 358f3ac92d681257a6b7c0c71bf3c65d56c70a59 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 23 Oct 2020 14:31:07 +0200 Subject: [PATCH 058/175] Add ability to mark groups as default - DB part --- ...5f_add_is_default_column_to_the_groups_.py | 28 ++++++++++++ tensorhive/controllers/user.py | 5 +++ tensorhive/models/Group.py | 45 ++++++++++++++++++- 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/72fb5b78625f_add_is_default_column_to_the_groups_.py diff --git a/migrations/versions/72fb5b78625f_add_is_default_column_to_the_groups_.py b/migrations/versions/72fb5b78625f_add_is_default_column_to_the_groups_.py new file mode 100644 index 00000000..12d50daa --- /dev/null +++ b/migrations/versions/72fb5b78625f_add_is_default_column_to_the_groups_.py @@ -0,0 +1,28 @@ +"""add is_default column to the groups table + +Revision ID: 72fb5b78625f +Revises: 58a12e45663e +Create Date: 2020-10-23 14:54:03.758690 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '72fb5b78625f' +down_revision = '58a12e45663e' +branch_labels = None +depends_on = None + + +def upgrade(): + with op.batch_alter_table('groups') as batch_op: + batch_op.add_column(sa.Column('is_default', sa.Boolean(), nullable=True)) + batch_op.create_unique_constraint('one_default_group_only', ['is_default']) + + +def downgrade(): + with op.batch_alter_table('groups') as batch_op: + batch_op.drop_constraint('one_default_group_only', type_='unique') + batch_op.drop_column('is_default') diff --git a/tensorhive/controllers/user.py b/tensorhive/controllers/user.py index 246dbb5d..a1b8b12b 100644 --- a/tensorhive/controllers/user.py +++ b/tensorhive/controllers/user.py @@ -13,6 +13,7 @@ from tensorhive.models.RevokedToken import RevokedToken from tensorhive.models.Role import Role from tensorhive.models.User import User +from tensorhive.models.Group import Group log = logging.getLogger(__name__) GENERAL = API.RESPONSES['general'] @@ -57,6 +58,10 @@ def do_create(user: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: roles=[Role(name='user')] ) new_user.save() + + default_group = Group.get_default_group() + if default_group is not None: + default_group.add_user(new_user) except AssertionError as e: content = {'msg': USER['create']['failure']['invalid'].format(reason=e)} status = 422 diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index 7c4bba8e..7a833ae3 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -1,8 +1,9 @@ import datetime import logging -from sqlalchemy import Column, Integer, String, DateTime, ForeignKey +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.ext.hybrid import hybrid_property from tensorhive.database import Base from tensorhive.exceptions.InvalidRequestException import InvalidRequestException @@ -21,6 +22,7 @@ class Group(CRUDModel, RestrictionAssignee): # type: ignore id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(40), unique=False, nullable=True) created_at = Column(DateTime, default=datetime.datetime.utcnow) + _is_default = Column('is_default', Boolean, nullable=True, unique=True) # Should be True or None, never False _users = relationship('User', secondary='user2group') _restrictions = relationship('Restriction', secondary='restriction2assignee') @@ -29,7 +31,8 @@ def __repr__(self): return ''.format(id=self.id, name=self.name) def check_assertions(self): - pass + assert self._is_default is None or self._is_default is True, 'is_default should be either set to True for' \ + 'the default group or None for the rest' @hybrid_property def users(self): @@ -76,6 +79,44 @@ def _as_dict(self, include_users): group['users'] = [user.as_dict_shallow for user in self.users] return group + @classmethod + def get_default_group(cls): + """ + :raises: MultipleResultsFound if more than one default group is found + :return: A group that is marked as default or None if no such group exists + """ + return Group.query.filter(Group.is_default.is_(True)).one_or_none() + + @classmethod + def set_default_group(cls, group_id): + """ + Sets the group with id = group_id as a default group. + Will also unmark the existing default group as the default. + :raises: NoResultFound if group with given id doesn't exist. + :return: The default group. + """ + try: + group = Group.get(group_id) + except NoResultFound as e: + raise e + + cls.delete_default_group_if_exists() + group.is_default = True + return group.save() + + @classmethod + def delete_default_group_if_exists(cls): + """ + Will mark the default group as non-default. If no such group exists, no action will be taken. + :return: True if group was marked as non-default, False if no default group was found. + """ + group = cls.get_default_group() + if group is None: + return False + group.is_default = None + group.save() + return True + class User2Group(Base): # type: ignore __tablename__ = 'user2group' From 953b76b8631c13f376e50bc2d8ef9c68fe8b78df Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 23 Oct 2020 15:53:42 +0200 Subject: [PATCH 059/175] Add updating resources hostnames --- tensorhive/controllers/nodes.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tensorhive/controllers/nodes.py b/tensorhive/controllers/nodes.py index b7db0771..ddb3c931 100644 --- a/tensorhive/controllers/nodes.py +++ b/tensorhive/controllers/nodes.py @@ -25,6 +25,12 @@ def get_infrastructure(): hostname=hostname ) new_resource.save() + else: + for resource in resources: + if resource.id == gpu_uuid and resource.hostname != hostname: + resource.hostname = hostname + resource.save() + break except Exception: # In case of failure just return infrastructure pass From 9594cb6fa304b6025f54209b6cdc8e446195bebe Mon Sep 17 00:00:00 2001 From: mateusz Date: Fri, 23 Oct 2020 16:59:32 +0200 Subject: [PATCH 060/175] Add ability to mark groups as default - business logic --- tensorhive/api/api_specification.yml | 88 +++++++++++++++++++++++++--- tensorhive/controllers/group.py | 31 ++++++++++ tensorhive/controllers/responses.yml | 9 +++ tensorhive/controllers/user.py | 9 ++- 4 files changed, 127 insertions(+), 10 deletions(-) diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 8639ff01..c453c673 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -520,12 +520,12 @@ paths: $ref: '#/components/schemas/GroupUpdateForm' x-body-name: newValues parameters: - - description: Group ID - in: path - name: id - required: true - schema: - type: integer + - description: Group ID + in: path + name: id + required: true + schema: + type: integer responses: 200: description: {{RESPONSES['group']['update']['success']}} @@ -601,6 +601,79 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] + /set_default_group/{group_id}: + put: + tags: + - groups + summary: Set selected group as default. The default group is the group to which all new users will be added. + operationId: tensorhive.controllers.group.set_default_group + parameters: + - description: Group ID + in: path + name: group_id + required: true + schema: + type: integer + responses: + 200: + description: {{RESPONSES['group']['default']['set']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['group']['default']['set']['success']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unprivileged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unprivileged']}} + 404: + description: {{RESPONSES['group']['not_found']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['default']['set']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] + /delete_default_group: + delete: + tags: + - groups + summary: Delete default group. Existing users will be not affected. + operationId: tensorhive.controllers.group.delete_default_group + responses: + 200: + description: {{RESPONSES['group']['default']['delete']['success']}} + content: + application/json: + schema: + example: + msg: {{RESPONSES['group']['default']['delete']['success']}} + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unprivileged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unprivileged']}} + 422: + description: {{RESPONSES['general']['auth_error']}} or {{RESPONSES['group']['default']['delete']['failure']['assertions']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] /groups/{group_id}/users/{user_id}: put: tags: @@ -825,7 +898,7 @@ paths: summary: Update existing restriction operationId: tensorhive.controllers.restriction.update requestBody: - description: Restriction object with fields to overwrite. + description: Restriction object with fields to overwrite (end field is nullable string). required: true content: application/json: @@ -2946,6 +3019,7 @@ components: end: type: string format: date-time + nullable: true isGlobal: type: boolean example: false diff --git a/tensorhive/controllers/group.py b/tensorhive/controllers/group.py index 4526ee32..15a107c4 100644 --- a/tensorhive/controllers/group.py +++ b/tensorhive/controllers/group.py @@ -114,6 +114,37 @@ def delete(id: GroupId) -> Tuple[Content, HttpStatusCode]: return content, status +@admin_required +def set_default_group(group_id: GroupId) -> Tuple[Content, HttpStatusCode]: + try: + Group.set_default_group(group_id) + except NoResultFound: + content, status = {'msg': GROUP['not_found']}, HTTPStatus.NOT_FOUND.value + except AssertionError as e: + content, status = {'msg': GROUP['default']['set']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + else: + content, status = {'msg': GROUP['default']['set']['success']}, HTTPStatus.OK.value + finally: + return content, status + + +@admin_required +def delete_default_group() -> Tuple[Content, HttpStatusCode]: + try: + Group.delete_default_group_if_exists() + except AssertionError as e: + content, status = {'msg': GROUP['default']['delete']['failure']['assertions'].format(reason=e)}, \ + HTTPStatus.UNPROCESSABLE_ENTITY.value + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + content, status = {'msg': GROUP['default']['delete']['success']}, HTTPStatus.OK.value + finally: + return content, status + + @admin_required def add_user(group_id: GroupId, user_id: UserId) -> Tuple[Content, HttpStatusCode]: group = None diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index aab05917..13f5fb9a 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -56,6 +56,15 @@ group: assertions: Unable to update group - {reason} delete: success: Group deleted successfully + default: + set: + success: Group set as default + failure: + assertion: Unable to set group as default - {reason} + delete: + success: Default group has been deleted + failure: + assertion: Unable to delete default group - {reason} restriction: users: apply: diff --git a/tensorhive/controllers/user.py b/tensorhive/controllers/user.py index a1b8b12b..524e4b7d 100644 --- a/tensorhive/controllers/user.py +++ b/tensorhive/controllers/user.py @@ -59,9 +59,12 @@ def do_create(user: Dict[str, Any]) -> Tuple[Content, HttpStatusCode]: ) new_user.save() - default_group = Group.get_default_group() - if default_group is not None: - default_group.add_user(new_user) + try: + default_group = Group.get_default_group() + if default_group is not None: + default_group.add_user(new_user) + except Exception: + log.warning("User has been created, but not added to default group.") except AssertionError as e: content = {'msg': USER['create']['failure']['invalid'].format(reason=e)} status = 422 From 4a181da5bbc80cedca6b69969d2be321cabb4abb Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Fri, 23 Oct 2020 17:32:23 +0200 Subject: [PATCH 061/175] Improve DB code, remove unnecessary relations from association tables --- tensorhive/models/Group.py | 8 +++----- tensorhive/models/Resource.py | 3 ++- tensorhive/models/Restriction.py | 15 ++++----------- tensorhive/models/RestrictionSchedule.py | 8 ++------ tensorhive/models/User.py | 5 +++-- 5 files changed, 14 insertions(+), 25 deletions(-) diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index 7c4bba8e..46067383 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -22,8 +22,9 @@ class Group(CRUDModel, RestrictionAssignee): # type: ignore name = Column(String(40), unique=False, nullable=True) created_at = Column(DateTime, default=datetime.datetime.utcnow) - _users = relationship('User', secondary='user2group') - _restrictions = relationship('Restriction', secondary='restriction2assignee') + _users = relationship('User', secondary='user2group', back_populates='_groups') + _restrictions = relationship('Restriction', secondary='restriction2assignee', back_populates='_groups', + viewonly=True) def __repr__(self): return ''.format(id=self.id, name=self.name) @@ -82,6 +83,3 @@ class User2Group(Base): # type: ignore user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True) group_id = Column(Integer, ForeignKey('groups.id', ondelete='CASCADE'), primary_key=True) created_at = Column(DateTime, default=datetime.datetime.utcnow()) - - user = relationship('User', backref=backref('user2group', cascade='all,delete-orphan')) - group = relationship('Group', backref=backref('user2group', cascade='all,delete-orphan')) diff --git a/tensorhive/models/Resource.py b/tensorhive/models/Resource.py index f8406c39..98c72abb 100644 --- a/tensorhive/models/Resource.py +++ b/tensorhive/models/Resource.py @@ -15,7 +15,8 @@ class Resource(CRUDModel, RestrictionAssignee): # type: ignore name = Column(String(40), nullable=True) hostname = Column(String(64), nullable=True) - _restrictions = relationship('Restriction', secondary='restriction2resource') + _restrictions = relationship('Restriction', secondary='restriction2resource', back_populates='_resources', + viewonly=True) def __repr__(self): return ''.format(id=self.id, name=self.name) diff --git a/tensorhive/models/Restriction.py b/tensorhive/models/Restriction.py index 5eafa119..6a94055d 100644 --- a/tensorhive/models/Restriction.py +++ b/tensorhive/models/Restriction.py @@ -40,10 +40,10 @@ class Restriction(CRUDModel, Base): # type: ignore _ends_at = Column('ends_at', DateTime) is_global = Column(Boolean, nullable=False) - _users = relationship('User', secondary='restriction2assignee') - _groups = relationship('Group', secondary='restriction2assignee') - _resources = relationship('Resource', secondary='restriction2resource') - _schedules = relationship('RestrictionSchedule', secondary='restriction2schedule') + _users = relationship('User', secondary='restriction2assignee', back_populates='_restrictions') + _groups = relationship('Group', secondary='restriction2assignee', back_populates='_restrictions') + _resources = relationship('Resource', secondary='restriction2resource', back_populates='_restrictions') + _schedules = relationship('RestrictionSchedule', secondary='restriction2schedule', back_populates='_restrictions') def __repr__(self): return ''' Date: Fri, 23 Oct 2020 18:09:51 +0200 Subject: [PATCH 062/175] Add GET default group, update default group API --- tensorhive/api/api_specification.yml | 45 +++++++++++++++++++++++++--- tensorhive/controllers/group.py | 15 ++++++++++ tensorhive/controllers/responses.yml | 33 ++++++++++---------- 3 files changed, 74 insertions(+), 19 deletions(-) diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index c453c673..9f10b35a 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -601,15 +601,53 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] - /set_default_group/{group_id}: + /default_group: + get: + tags: + - groups + summary: Get default group. + operationId: tensorhive.controllers.group.get_default_group + responses: + 200: + description: {{RESPONSES['general']['success']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['group']['default']['get']['success']}} + group: + $ref: '#/components/schemas/Group' + 401: + description: {{RESPONSES['general']['unauthorized']}} + 403: + description: {{RESPONSES['general']['unprivileged']}} + content: + application/json: + schema: + type: object + properties: + msg: + type: string + example: {{RESPONSES['general']['unprivileged']}} + 404: + description: {{RESPONSES['group']['default']['not_found']}} + 500: + description: {{RESPONSES['general']['internal_error']}} + security: + - Bearer: [] put: tags: - groups - summary: Set selected group as default. The default group is the group to which all new users will be added. + summary: | + Set group with given ID as default (default group is the group to which all new users will be added). + It will only affect new users. operationId: tensorhive.controllers.group.set_default_group parameters: - description: Group ID - in: path + in: query name: group_id required: true schema: @@ -642,7 +680,6 @@ paths: description: {{RESPONSES['general']['internal_error']}} security: - Bearer: [] - /delete_default_group: delete: tags: - groups diff --git a/tensorhive/controllers/group.py b/tensorhive/controllers/group.py index 15a107c4..a5c819ae 100644 --- a/tensorhive/controllers/group.py +++ b/tensorhive/controllers/group.py @@ -114,6 +114,21 @@ def delete(id: GroupId) -> Tuple[Content, HttpStatusCode]: return content, status +def get_default_group() -> Tuple[Content, HttpStatusCode]: + try: + group = Group.get_default_group() + except Exception as e: + log.critical(e) + content, status = {'msg': GENERAL['internal_error']}, HTTPStatus.INTERNAL_SERVER_ERROR.value + else: + if group is None: + content, status = {'msg': GROUP['default']['not_found']}, HTTPStatus.NOT_FOUND.value + else: + content, status = {'msg': GROUP['default']['get']['success'], 'group': group.as_dict}, HTTPStatus.OK.value + finally: + return content, status + + @admin_required def set_default_group(group_id: GroupId) -> Tuple[Content, HttpStatusCode]: try: diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index 13f5fb9a..2614d9b8 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -37,11 +37,11 @@ group: success: User has been added to group failure: duplicate: User is already member of group - assertion: Unable to add user to group - {reason} + assertions: Unable to add user to group - {reason} remove: success: User has been removed from group failure: - assertion: Unable to remove user from group - {reason} + assertions: Unable to remove user from group - {reason} not_found: User is not a member of group not_found: Group has not been found get: @@ -57,67 +57,70 @@ group: delete: success: Group deleted successfully default: + not_found: Default group has not been set + get: + success: Default group has been successfuly fetched set: - success: Group set as default + success: Group has been set as default failure: - assertion: Unable to set group as default - {reason} + assertions: Unable to set group as default - {reason} delete: success: Default group has been deleted failure: - assertion: Unable to delete default group - {reason} + assertions: Unable to delete default group - {reason} restriction: users: apply: success: Restriction has been applied to user failure: duplicate: Restriction is already being applied to user - assertion: Unable to apply restriction to user - {reason} + assertions: Unable to apply restriction to user - {reason} remove: success: Restriction has been removed from user failure: - assertion: Unable to remove restriction from user - {reason} + assertions: Unable to remove restriction from user - {reason} not_found: User is not affected by restriction groups: apply: success: Restriction has been applied to group failure: duplicate: Restriction is already being applied to group - assertion: Unable to apply restriction to group - {reason} + assertions: Unable to apply restriction to group - {reason} remove: success: Restriction has been removed from group failure: - assertion: Unable to remove restriction from group - {reason} + assertions: Unable to remove restriction from group - {reason} not_found: Group is not affected by restriction resources: apply: success: Restriction has been applied to resource failure: duplicate: Restriction is already being applied to resource - assertion: Unable to apply restriction to resource - {reason} + assertions: Unable to apply restriction to resource - {reason} remove: success: Restriction has been removed from resource failure: - assertion: Unable to remove restriction from resource - {reason} + assertions: Unable to remove restriction from resource - {reason} not_found: Resource is not affected by restriction hosts: apply: success: Restriction has been applied to all resources with given hostname failure: - assertion: Unable to apply restriction to resources with given hostname - {reason} + assertions: Unable to apply restriction to resources with given hostname - {reason} remove: success: Restriction has been removed from all resources with given hostname failure: - assertion: Unable to remove restriction from resources with given hostname - {reason} + assertions: Unable to remove restriction from resources with given hostname - {reason} schedules: add: success: Schedule has been added to restriction failure: duplicate: Schedule has already been added to restriction - assertion: Unable to add schedule to restriction - {reason} + assertions: Unable to add schedule to restriction - {reason} remove: success: Schedule has been removed from restriction failure: - assertion: Unable to remove schedule from restriction - {reason} + assertions: Unable to remove schedule from restriction - {reason} not_found: Schedule is not applied to restriction not_found: Restriction has not been found create: From c88eb9d51d459f0cfc0d715ca7e10546552f2f60 Mon Sep 17 00:00:00 2001 From: Jacek Szemplinski Date: Sat, 24 Oct 2020 20:03:01 +0200 Subject: [PATCH 063/175] Add tests for default groups, minor fixes --- tensorhive/api/api_specification.yml | 6 +- tensorhive/controllers/responses.yml | 6 +- tensorhive/models/Group.py | 6 +- .../controllers/test_group_controller.py | 81 +++++++++++++++++++ .../controllers/test_user_controller.py | 44 ++++++++++ tests/unit/models/test_group_model.py | 58 +++++++++++++ 6 files changed, 192 insertions(+), 9 deletions(-) create mode 100644 tests/functional/controllers/test_user_controller.py diff --git a/tensorhive/api/api_specification.yml b/tensorhive/api/api_specification.yml index 9f10b35a..95fed51e 100644 --- a/tensorhive/api/api_specification.yml +++ b/tensorhive/api/api_specification.yml @@ -642,8 +642,8 @@ paths: tags: - groups summary: | - Set group with given ID as default (default group is the group to which all new users will be added). - It will only affect new users. + Set group with given ID as default (default group is the group to which all new users will be added + on registration). It will only affect new users. operationId: tensorhive.controllers.group.set_default_group parameters: - description: Group ID @@ -683,7 +683,7 @@ paths: delete: tags: - groups - summary: Delete default group. Existing users will be not affected. + summary: Mark current default group as non-default. Existing users will be not affected. operationId: tensorhive.controllers.group.delete_default_group responses: 200: diff --git a/tensorhive/controllers/responses.yml b/tensorhive/controllers/responses.yml index 2614d9b8..6ec08f96 100644 --- a/tensorhive/controllers/responses.yml +++ b/tensorhive/controllers/responses.yml @@ -57,7 +57,7 @@ group: delete: success: Group deleted successfully default: - not_found: Default group has not been set + not_found: Default group has not been found get: success: Default group has been successfuly fetched set: @@ -65,9 +65,9 @@ group: failure: assertions: Unable to set group as default - {reason} delete: - success: Default group has been deleted + success: From now on no group is marked as default. failure: - assertions: Unable to delete default group - {reason} + assertions: Unable to set default group as non-default - {reason} restriction: users: apply: diff --git a/tensorhive/models/Group.py b/tensorhive/models/Group.py index 7a833ae3..c83ac146 100644 --- a/tensorhive/models/Group.py +++ b/tensorhive/models/Group.py @@ -85,7 +85,7 @@ def get_default_group(cls): :raises: MultipleResultsFound if more than one default group is found :return: A group that is marked as default or None if no such group exists """ - return Group.query.filter(Group.is_default.is_(True)).one_or_none() + return Group.query.filter(Group._is_default.is_(True)).one_or_none() @classmethod def set_default_group(cls, group_id): @@ -101,7 +101,7 @@ def set_default_group(cls, group_id): raise e cls.delete_default_group_if_exists() - group.is_default = True + group._is_default = True return group.save() @classmethod @@ -113,7 +113,7 @@ def delete_default_group_if_exists(cls): group = cls.get_default_group() if group is None: return False - group.is_default = None + group._is_default = None group.save() return True diff --git a/tests/functional/controllers/test_group_controller.py b/tests/functional/controllers/test_group_controller.py index b6ac7b2b..80dcfcfe 100644 --- a/tests/functional/controllers/test_group_controller.py +++ b/tests/functional/controllers/test_group_controller.py @@ -5,6 +5,7 @@ import json ENDPOINT = BASE_URI + '/groups' +ENDPOINT_DEFAULT_GROUP = BASE_URI + '/default_group' # POST /groups @@ -166,3 +167,83 @@ def test_remove_user_from_a_nonexistent_group(tables, client, new_user): resp = client.delete(ENDPOINT + '/{}/users/{}'.format(nonexistent_group_id, new_user.id), headers=HEADERS) assert resp.status_code == HTTPStatus.NOT_FOUND + + +# GET /default_group +def test_get_default_group(tables, client, new_group): + new_group.save() + Group.set_default_group(new_group.id) + + resp = client.get(ENDPOINT_DEFAULT_GROUP, headers=HEADERS) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.OK + assert resp_json['group']['id'] == new_group.id + + +# GET /default_group - when default group doesn't exist +def test_get_default_group_when_no_default_group_exists(tables, client, new_group): + new_group.save() + + resp = client.get(ENDPOINT_DEFAULT_GROUP, headers=HEADERS) + + assert resp.status_code == HTTPStatus.NOT_FOUND + + +# PUT /default_group?group_id={ID} - no default group currently existing +def test_set_default_group_when_no_preexisting_default_group_exists(tables, client, new_group): + new_group.save() + + resp = client.put(ENDPOINT_DEFAULT_GROUP + '?group_id={}'.format(new_group.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert new_group._is_default + assert Group.get_default_group() == new_group + + +# PUT /default_group - default group currently existing +def test_set_default_group_when_there_is_a_preexisting_default_group(tables, client, new_group): + new_group.save() + Group.set_default_group(new_group.id) + + another_group = Group(name='AnotherGroup') + another_group.save() + resp = client.put(ENDPOINT_DEFAULT_GROUP + '?group_id={}'.format(another_group.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert another_group._is_default + assert new_group._is_default is None + assert Group.get_default_group() == another_group + + +# PUT /default_group - group with specified id doesn't exist +def test_set_default_group_when_there_is_no_preexisting_default_group(tables, client, new_group): + new_group.save() + + resp = client.put(ENDPOINT_DEFAULT_GROUP + '?group_id={}'.format(new_group.id), headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert new_group._is_default + assert Group.get_default_group() == new_group + + +# DELETE /default_group +def test_mark_default_group_as_non_default(tables, client, new_group): + new_group.save() + Group.set_default_group(new_group.id) + + resp = client.delete(ENDPOINT_DEFAULT_GROUP, headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert new_group._is_default is None + assert Group.get_default_group() is None + + +# DELETE /default_group - when default group doesn't exist +def test_mark_default_group_as_non_default_when_it_doesnt_exist(tables, client, new_group): + new_group.save() + + resp = client.delete(ENDPOINT_DEFAULT_GROUP, headers=HEADERS) + + assert resp.status_code == HTTPStatus.OK + assert Group.get_default_group() is None diff --git a/tests/functional/controllers/test_user_controller.py b/tests/functional/controllers/test_user_controller.py new file mode 100644 index 00000000..b6565511 --- /dev/null +++ b/tests/functional/controllers/test_user_controller.py @@ -0,0 +1,44 @@ +from tensorhive.models.Group import Group +from tensorhive.models.User import User +from fixtures.controllers import API_URI as BASE_URI, HEADERS +from http import HTTPStatus + +import json + +ENDPOINT = BASE_URI + '/user' + + +# POST /user/create - user gets added to a default group if it exists +def test_on_signup_user_gets_added_to_a_default_group(tables, client, new_group): + new_group.save() + Group.set_default_group(new_group.id) + + data = { + 'email': 'dummy@email.com', + 'username': 'Jacek', + 'password': 'notreallysafe' + } + resp = client.post(ENDPOINT + '/create', data=json.dumps(data), headers=HEADERS) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.CREATED + assert len(resp_json['user']['groups']) == 1 + assert resp_json['user']['groups'][0]['id'] == new_group.id + assert new_group in User.get(resp_json['user']['id']).groups + + +# POST /user/create - user doesn't belong to any groups if no default group exists +def test_on_signup_user_does_not_belong_to_any_group_if_no_default_group_exists(tables, client, new_group): + new_group.save() + + data = { + 'email': 'dummy@email.com', + 'username': 'Jacek', + 'password': 'notreallysafe' + } + resp = client.post(ENDPOINT + '/create', data=json.dumps(data), headers=HEADERS) + resp_json = json.loads(resp.data.decode('utf-8')) + + assert resp.status_code == HTTPStatus.CREATED + assert len(resp_json['user']['groups']) == 0 + assert len(User.get(resp_json['user']['id']).groups) == 0 diff --git a/tests/unit/models/test_group_model.py b/tests/unit/models/test_group_model.py index 1c1dd3ac..3ab23e82 100644 --- a/tests/unit/models/test_group_model.py +++ b/tests/unit/models/test_group_model.py @@ -1,4 +1,5 @@ import pytest +from sqlalchemy.orm.exc import NoResultFound from tensorhive.models.Group import Group from tensorhive.exceptions.InvalidRequestException import InvalidRequestException @@ -37,3 +38,60 @@ def test_adding_user_to_a_group_that_he_is_already_in_fails(tables, new_group_wi with pytest.raises(InvalidRequestException): new_group_with_member.add_user(user) + + +def test_marking_group_as_a_default(tables, new_group): + new_group.save() + Group.set_default_group(new_group.id) + + assert Group.get(new_group.id)._is_default + assert new_group == Group.get_default_group() + + +def test_marking_nonexistent_group_as_a_default(tables): + with pytest.raises(NoResultFound): + Group.set_default_group(777) + + +def test_marking_group_as_a_default_removes_default_status_from_the_old_default_group(tables, new_group): + new_group._is_default = True + new_group.save() + + new_default_group = Group(name='NewDefaultGroup') + new_default_group.save() + + Group.set_default_group(new_default_group.id) + + assert Group.get_default_group() == new_default_group + assert new_group._is_default is None + + +def test_get_default_group(tables, new_group): + new_group._is_default = True + new_group.save() + + assert new_group == Group.get_default_group() + + +def test_get_default_without_default_group(tables, new_group): + new_group.save() + + assert Group.get_default_group() is None + + +def test_delete_default_group(tables, new_group): + new_group._is_default = True + new_group.save() + + result = Group.delete_default_group_if_exists() + + assert result is True + assert new_group._is_default is None + + +def test_delete_default_group_without_default_group(tables, new_group): + new_group.save() + + result = Group.delete_default_group_if_exists() + + assert result is False From 41eeded437f6952f8cfa414ecfed4f639331852b Mon Sep 17 00:00:00 2001 From: Martyna Oleszkiewicz Date: Sat, 24 Oct 2020 22:13:07 +0200 Subject: [PATCH 064/175] Remove API version from WebApp --- tensorhive/app/web/dev/src/components/TheDash.vue | 5 +---- tensorhive/app/web/dev/src/config/index.js | 1 - tensorhive/app/web/dev/src/main.js | 12 ------------ 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/tensorhive/app/web/dev/src/components/TheDash.vue b/tensorhive/app/web/dev/src/components/TheDash.vue index c62a6e74..c81e7668 100644 --- a/tensorhive/app/web/dev/src/components/TheDash.vue +++ b/tensorhive/app/web/dev/src/components/TheDash.vue @@ -21,7 +21,7 @@ Toggle navigation
- TensorHive v{{version}} API v{{apiVersion}} + TensorHive v{{version}}
{ config.serverURI = response.data.apiPath - config.apiVersion = response.data.apiVersion config.version = response.data.version if (window.localStorage) { - var apiVersion = JSON.parse(window.localStorage.getItem('apiVersion')) var version = JSON.parse(window.localStorage.getItem('version')) - if (apiVersion === null) { - if (config.apiVersion !== undefined) { - window.localStorage.setItem('apiVersion', JSON.stringify(config.apiVersion)) - } else { - window.localStorage.setItem('apiVersion', JSON.stringify('no data in config file')) - } - } else if (apiVersion !== config.apiVersion) { - window.localStorage.clear() - location.reload(true) - } if (version === null) { if (config.version !== undefined) { window.localStorage.setItem('version', JSON.stringify(config.version)) From a61fe73ebb27b5c765b355beb5dc9629f82da651 Mon Sep 17 00:00:00 2001 From: Martyna Oleszkiewicz Date: Sun, 25 Oct 2020 14:23:54 +0100 Subject: [PATCH 065/175] Allow adding multiple schedules to a restriction --- .../src/components/views/UsersOverview.vue | 169 +++++++++++------- .../views/users_overview/GroupsInfo.vue | 2 +- 2 files changed, 106 insertions(+), 65 deletions(-) diff --git a/tensorhive/app/web/dev/src/components/views/UsersOverview.vue b/tensorhive/app/web/dev/src/components/views/UsersOverview.vue index 8125b995..ca91bf31 100644 --- a/tensorhive/app/web/dev/src/components/views/UsersOverview.vue +++ b/tensorhive/app/web/dev/src/components/views/UsersOverview.vue @@ -44,9 +44,16 @@ {{ props.item.id }} {{ props.item.name }} {{ printTimespan(props.item.startsAt, props.item.endsAt) }} - {{ printSchedule(props.item.schedules) }} - + + + {{ printSchedules(props.item.schedules, all = true) }} + + + + @@ -54,7 +61,7 @@ - + @@ -63,7 +70,7 @@ All - + @@ -199,19 +206,35 @@ > - - - - +

+ Restriction schedules + + add + + + remove + +

+ +