{"version":3,"sources":["webpack:///../../../src/components/VExpansionPanel/VExpansionPanels.ts","webpack:///./src/dto/calendarEvent.js","webpack:///../../../src/components/VExpansionPanel/VExpansionPanelContent.ts","webpack:///../../src/util/dateTimeUtils.ts","webpack:///../../../src/components/VItemGroup/VItemGroup.ts","webpack:///../../../../src/components/VCalendar/mixins/mouse.ts","webpack:///../../../../src/components/VCalendar/mixins/times.ts","webpack:///../../../../src/components/VCalendar/modes/common.ts","webpack:///../../../../src/components/VCalendar/modes/stack.ts","webpack:///../../../../src/components/VCalendar/modes/column.ts","webpack:///../../../../src/components/VCalendar/modes/index.ts","webpack:///../../../../src/components/VCalendar/util/props.ts","webpack:///../../../../src/components/VCalendar/mixins/calendar-base.ts","webpack:///../../../../src/components/VCalendar/util/events.ts","webpack:///../../../../src/components/VCalendar/mixins/calendar-with-events.ts","webpack:///../../../src/components/VCalendar/VCalendarWeekly.ts","webpack:///../../../src/components/VCalendar/VCalendarMonthly.ts","webpack:///../../../../src/components/VCalendar/mixins/calendar-with-intervals.ts","webpack:///../../../src/components/VCalendar/VCalendarDaily.ts","webpack:///../../../src/components/VCalendar/VCalendarCategory.ts","webpack:///../../../src/components/VCalendar/VCalendar.ts","webpack:///../../../src/components/VBtn/index.ts","webpack:///./node_modules/core-js/modules/es.number.max-safe-integer.js","webpack:///../../../src/components/VExpansionPanel/VExpansionPanelHeader.ts","webpack:///../../../src/components/VExpansionPanel/VExpansionPanel.ts","webpack:///../../../src/directives/resize/index.ts","webpack:///../../../src/mixins/localable/index.ts","webpack:///../../../../src/components/VCalendar/util/timestamp.ts"],"names":["name","provide","expansionPanels","this","props","accordion","disabled","flat","hover","focusable","inset","popout","readonly","tile","Boolean","computed","classes","created","$attrs","hasOwnProperty","Array","value","length","methods","updateItem","getValue","item","nextValue","index","toggleMethod","calendarEvent","start","allDay","timed","jobId","blockedDateId","baseMixins","isActive","expansionPanel","beforeDestroy","render","h","showLazyContent","staticClass","directives","class","createUTCDate","month","day","year","date","Date","isFinite","firstWeekOffset","firstWeekDayInFirstWeek","firstDayOfWeek","firstWeekDayOfYear","dayOfYear","isLeapYear","weeksInYear","weekOffset","weekOffsetNext","daysInYear","week","Math","BaseItemGroup","activeClass","type","default","mandatory","max","Number","multiple","data","internalLazyValue","undefined","items","themeClasses","selectedIndex","selectedItem","indexOf","selectedItems","filter","selectedValues","internalValue","v","watch","genData","i","onClick","register","push","unregister","valueIndex","updateInternalValue","updateItemsState","updateMultiple","updateSingle","updateMandatory","defaultValue","val","isSame","$slots","itemGroup","getDefaultMouseEventHandlers","getMouseEventHandlers","event","prevent","result","on","eventOptions","events","prefix","key","handler","e","mouseEvent","getEvent","now","validator","times","today","parsedNow","setPresent","present","past","future","updateTimes","getNow","updateDay","target","updateTime","MILLIS_IN_DAY","minStart","visuals","columnCount","column","left","width","a","b","exclude","s0","e0","groups","group","groupVisual","dayStart","intersected","hasOverlap","end","k","getRange","getDayRange","groupStart","groupEnd","min","reset","getVisuals","dayEvents","visual","setColumnCount","targetGroup","getOpenGroup","FULL_WIDTH","DEFAULT_OFFSET","WIDTH_MULTIPLIER","firstWeekday","overlapThreshold","getOverlapGroupHandler","getGroups","nodes","child","getNode","getNextIndex","parent","getParent","addTime","getOverlappingRange","children","grand","grandNext","calculateBounds","columns","getMaxChildIndex","spaceLeft","spaceWidth","offset","columnWidthMultiplier","getColumnWidthMultiplier","node","columnOffset","columnWidth","hasFullWidth","maxColumn","minColumn","c","getOverlappingIndices","indices","other","returnFirstColumn","overlapping","first","n","getNormalizedRange","added","sibling","childMax","removeMinutes","identifier","totalMinutes","addHours","addMinutes","CalendarEventOverlapModes","stack","base","String","validate","weekdays","validateWeekdays","hideHeader","shortWeekdays","weekdayFormat","dayFormat","intervals","maxDays","shortIntervals","intervalHeight","validateNumber","intervalWidth","intervalMinutes","firstInterval","firstTime","intervalCount","intervalFormat","intervalStyle","showIntervalLabel","weeks","localeFirstDayOfYear","minWeeks","shortMonths","showMonthOnFirst","showWeek","monthFormat","calendar","category","categories","categoryHideDynamic","categoryShowAll","categoryForInvalid","categoryDays","x","parseInt","eventStart","eventEnd","eventTimed","eventCategory","eventHeight","eventColor","eventTextColor","eventName","eventOverlapThreshold","eventOverlapMode","mode","eventMore","eventMoreText","eventRipple","eventMarginBottom","input","ints","visited","wrapped","d","mixins","Resize","parsedWeekdays","weekdaySkips","weekdaySkipsReverse","reversed","reverse","parsedStart","parsedEnd","days","dayFormatter","options","timeZone","weekdayFormatter","longOptions","weekday","shortOptions","short","getRelativeClasses","outside","timestamp","getStartOfWeek","getEndOfWeek","getFormatter","startInput","endInput","startParsed","endParsed","startIdentifier","startTimestampIdentifier","endIdentifier","endOffset","endTimestampIdentifier","dayIdentifier","isEventOn","WIDTH_FULL","WIDTH_START","MINUTES_IN_DAY","ripple","noEvents","parsedEvents","map","parsedEventOverlapThreshold","eventColorFunction","eventTimedFunction","eventCategoryFunction","eventTextColorFunction","eventNameFunction","eventModeFunction","eventWeekdays","categoryMode","parseEvent","formatTime","formatter","hour","minute","withTime","updateEventVisibility","eventsMap","more","parentBounds","last","hide","hidden","eventBounds","$vuetify","lang","t","getEventsMap","elements","$refs","el","genDayEvent","weekdayIdentifier","scope","eventParsed","genEvent","style","height","attrs","ref","refInFor","genTimedEvent","top","bottom","slot","$scopedSlots","text","background","overlapsNoon","singline","timeSummary","eventSummary","time","delimiter","scopeInput","$createElement","setTextColor","setBackgroundColor","nativeEvent","genName","domProps","innerHTML","genPlaceholder","genMore","click","display","getVisibleEvents","isEventOverlapping","isEventForCategory","getEventsForDay","isEventStart","getEventsForDayAll","getEventsForDayTimed","getScopedSlots","isNode","getSlotChildren","getter","mapper","mapped","slots","slotDay","slotDayHeader","slotDayBody","parsedMinWeeks","minDays","todayWeek","monthFormatter","isOutside","genHead","genHeadDays","header","genHeadDay","color","genWeeks","weekDays","genWeek","getWeekNumber","weekNodes","genWeekNumber","determineDay","genDay","_e","genDayLabel","genDayLabelButton","hasMonth","VBtn","fab","depressed","small","stop","genDayMonth","dragstart","parsedFirstInterval","parsedIntervalMinutes","parsedIntervalCount","parsedIntervalHeight","parseFloat","parsedFirstTime","firstMinute","bodyHeight","minutes","count","intervalFormatter","shortHourOptions","tms","showIntervalLabelDefault","isFirst","interval","intervalStyleDefault","getTimestampAtEvent","bounds","baseMinutes","touchEvent","touches","clientY","addIntervals","getSlotScope","scrollToTime","y","timeToY","pane","minutesToPixels","clamp","timeDelta","gap","scrollPush","mounted","init","onResize","getScrollPush","area","marginRight","genHeadIntervals","genHeadWeekday","genHeadDayLabel","genDayHeader","genHeadDayButton","genBody","genScrollArea","genPane","genDayContainer","genDays","genDayIntervals","genDayBody","genDayInterval","styler","genBodyIntervals","genIntervalLabels","genIntervalLabel","shower","show","label","modifiers","quiet","parsedCategories","split","getCategoryScope","genDayHeaderCategory","genDayHeaderCategoryTitle","genDayBodyCategory","lastStart","lastEnd","parsedValue","parsedCategoryDays","renderProps","around","component","getCategoryList","Error","title","spanYears","spanMonths","monthShortFormatter","monthLongFormatter","updated","window","checkChange","move","amount","moved","forward","mover","limit","next","prev","$children","parseTimestamp","required","timestampToDate","categoryMap","Object","categoryLength","ev","scopedSlots","$","stat","MAX_SAFE_INTEGER","disableIconRotate","expandIcon","hideActions","hasMousedown","isDisabled","isReadonly","genIcon","icon","tabindex","mousedown","mouseup","open","content","nextIsActive","groupClasses","registerContent","unregisterContent","registerHeader","vm","unregisterHeader","toggle","isBooted","inserted","callback","binding","passive","unbind","locale","currentLocale","PARSE_REGEX","PARSE_TIME","DAYS_IN_MONTH","DAYS_IN_MONTH_LEAP","DAYS_IN_MONTH_MIN","DAYS_IN_MONTH_MAX","MONTH_MAX","MONTH_MIN","DAY_MIN","DAYS_IN_WEEK","MINUTES_IN_HOUR","MINUTE_MAX","HOUR_MAX","OFFSET_YEAR","OFFSET_MONTH","OFFSET_HOUR","OFFSET_TIME","copyTimestamp","findWeekday","updateFormatted","updateRelative","updateWeekday","daysInMonth","parts","parseDate","hasDay","hasTime","getDayIdentifier","getTimeIdentifier","getTime","getWeekday","getDate","_","m","C","Y","padded","str","padNumber","M","D","skips","filled","skip","j","current","currentIdentifier","stopped","relativeDays","nextDay","mins","int","updateMinutes","emptyFormatter","_t","_s","Intl","intlFormatter","getOptions"],"mappings":"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","file":"js/Calendar~ContractorCalendar.f55bdedc.js","sourcesContent":["// Styles\nimport './VExpansionPanel.sass'\n\n// Components\nimport { BaseItemGroup, GroupableInstance } from '../VItemGroup/VItemGroup'\nimport VExpansionPanel from './VExpansionPanel'\n\n// Utilities\nimport { breaking } from '../../util/console'\n\n// Types\ninterface VExpansionPanelInstance extends InstanceType {}\n\n/* @vue/component */\nexport default BaseItemGroup.extend({\n name: 'v-expansion-panels',\n\n provide (): object {\n return {\n expansionPanels: this,\n }\n },\n\n props: {\n accordion: Boolean,\n disabled: Boolean,\n flat: Boolean,\n hover: Boolean,\n focusable: Boolean,\n inset: Boolean,\n popout: Boolean,\n readonly: Boolean,\n tile: Boolean,\n },\n\n computed: {\n classes (): object {\n return {\n ...BaseItemGroup.options.computed.classes.call(this),\n 'v-expansion-panels': true,\n 'v-expansion-panels--accordion': this.accordion,\n 'v-expansion-panels--flat': this.flat,\n 'v-expansion-panels--hover': this.hover,\n 'v-expansion-panels--focusable': this.focusable,\n 'v-expansion-panels--inset': this.inset,\n 'v-expansion-panels--popout': this.popout,\n 'v-expansion-panels--tile': this.tile,\n }\n },\n },\n\n created () {\n /* istanbul ignore next */\n if (this.$attrs.hasOwnProperty('expand')) {\n breaking('expand', 'multiple', this)\n }\n\n /* istanbul ignore next */\n if (\n Array.isArray(this.value) &&\n this.value.length > 0 &&\n typeof this.value[0] === 'boolean'\n ) {\n breaking(':value=\"[true, false, true]\"', ':value=\"[0, 2]\"', this)\n }\n },\n\n methods: {\n updateItem (item: GroupableInstance & VExpansionPanelInstance, index: number) {\n const value = this.getValue(item, index)\n const nextValue = this.getValue(item, index + 1)\n\n item.isActive = this.toggleMethod(value)\n item.nextIsActive = this.toggleMethod(nextValue)\n },\n },\n})\n","const calendarEvent = {\n name: '',\n start: '',\n allDay: true,\n timed: false,\n jobId: null,\n blockedDateId: null\n}\n\nexport default calendarEvent\n","// Components\nimport VExpansionPanel from './VExpansionPanel'\nimport { VExpandTransition } from '../transitions'\n\n// Mixins\nimport Bootable from '../../mixins/bootable'\nimport Colorable from '../../mixins/colorable'\nimport { inject as RegistrableInject } from '../../mixins/registrable'\n\n// Utilities\nimport { getSlot } from '../../util/helpers'\nimport mixins, { ExtractVue } from '../../util/mixins'\n\n// Types\nimport Vue, { VNode, VueConstructor } from 'vue'\n\nconst baseMixins = mixins(\n Bootable,\n Colorable,\n RegistrableInject<'expansionPanel', VueConstructor>('expansionPanel', 'v-expansion-panel-content', 'v-expansion-panel')\n)\n\ninterface options extends ExtractVue {\n expansionPanel: InstanceType\n}\n\n/* @vue/component */\nexport default baseMixins.extend().extend({\n name: 'v-expansion-panel-content',\n\n computed: {\n isActive (): boolean {\n return this.expansionPanel.isActive\n },\n },\n\n created () {\n this.expansionPanel.registerContent(this)\n },\n\n beforeDestroy () {\n this.expansionPanel.unregisterContent()\n },\n\n render (h): VNode {\n return h(VExpandTransition, this.showLazyContent(() => [\n h('div', this.setBackgroundColor(this.color, {\n staticClass: 'v-expansion-panel-content',\n directives: [{\n name: 'show',\n value: this.isActive,\n }],\n }), [\n h('div', { class: 'v-expansion-panel-content__wrap' }, getSlot(this)),\n ]),\n ]))\n },\n})\n","function createUTCDate (year: number, month = 0, day = 1) {\n let date\n if (year < 100 && year >= 0) {\n date = new Date(Date.UTC(year, month, day))\n if (isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(year)\n }\n } else {\n date = new Date(Date.UTC(year, month, day))\n }\n\n return date\n}\n\nfunction firstWeekOffset (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const firstWeekDayInFirstWeek = 7 + firstDayOfWeek - firstDayOfYear\n const firstWeekDayOfYear = (7 + createUTCDate(year, 0, firstWeekDayInFirstWeek).getUTCDay() - firstDayOfWeek) % 7\n\n return -firstWeekDayOfYear + firstWeekDayInFirstWeek - 1\n}\n\nfunction dayOfYear (year: number, month: number, day: number, firstDayOfWeek: number) {\n let dayOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][month]\n if (month > 1 && isLeapYear(year)) {\n dayOfYear++\n }\n\n return dayOfYear + day\n}\n\nfunction weeksInYear (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, firstDayOfYear)\n const weekOffsetNext = firstWeekOffset(year + 1, firstDayOfWeek, firstDayOfYear)\n const daysInYear = isLeapYear(year) ? 366 : 365\n\n return (daysInYear - weekOffset + weekOffsetNext) / 7\n}\n\nexport function weekNumber (year: number, month: number, day: number, firstDayOfWeek: number, localeFirstDayOfYear: number): number {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, localeFirstDayOfYear)\n const week = Math.ceil((dayOfYear(year, month, day, firstDayOfWeek) - weekOffset) / 7)\n\n if (week < 1) {\n return week + weeksInYear(year - 1, firstDayOfWeek, localeFirstDayOfYear)\n } else if (week > weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)) {\n return week - weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)\n } else {\n return week\n }\n}\n\nexport function isLeapYear (year: number): boolean {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)\n}\n","// Styles\nimport './VItemGroup.sass'\n\n// Mixins\nimport Groupable from '../../mixins/groupable'\nimport Proxyable from '../../mixins/proxyable'\nimport Themeable from '../../mixins/themeable'\n\n// Utilities\nimport mixins from '../../util/mixins'\nimport { consoleWarn } from '../../util/console'\n\n// Types\nimport { VNode } from 'vue/types'\n\nexport type GroupableInstance = InstanceType & {\n id?: string\n to?: any\n value?: any\n }\n\nexport const BaseItemGroup = mixins(\n Proxyable,\n Themeable\n).extend({\n name: 'base-item-group',\n\n props: {\n activeClass: {\n type: String,\n default: 'v-item--active',\n },\n mandatory: Boolean,\n max: {\n type: [Number, String],\n default: null,\n },\n multiple: Boolean,\n },\n\n data () {\n return {\n // As long as a value is defined, show it\n // Otherwise, check if multiple\n // to determine which default to provide\n internalLazyValue: this.value !== undefined\n ? this.value\n : this.multiple ? [] : undefined,\n items: [] as GroupableInstance[],\n }\n },\n\n computed: {\n classes (): Record {\n return {\n 'v-item-group': true,\n ...this.themeClasses,\n }\n },\n selectedIndex (): number {\n return (this.selectedItem && this.items.indexOf(this.selectedItem)) || -1\n },\n selectedItem (): GroupableInstance | undefined {\n if (this.multiple) return undefined\n\n return this.selectedItems[0]\n },\n selectedItems (): GroupableInstance[] {\n return this.items.filter((item, index) => {\n return this.toggleMethod(this.getValue(item, index))\n })\n },\n selectedValues (): any[] {\n if (this.internalValue == null) return []\n\n return Array.isArray(this.internalValue)\n ? this.internalValue\n : [this.internalValue]\n },\n toggleMethod (): (v: any) => boolean {\n if (!this.multiple) {\n return (v: any) => this.internalValue === v\n }\n\n const internalValue = this.internalValue\n if (Array.isArray(internalValue)) {\n return (v: any) => internalValue.includes(v)\n }\n\n return () => false\n },\n },\n\n watch: {\n internalValue: 'updateItemsState',\n items: 'updateItemsState',\n },\n\n created () {\n if (this.multiple && !Array.isArray(this.internalValue)) {\n consoleWarn('Model must be bound to an array if the multiple property is true.', this)\n }\n },\n\n methods: {\n\n genData (): object {\n return {\n class: this.classes,\n }\n },\n getValue (item: GroupableInstance, i: number): unknown {\n return item.value == null || item.value === ''\n ? i\n : item.value\n },\n onClick (item: GroupableInstance) {\n this.updateInternalValue(\n this.getValue(item, this.items.indexOf(item))\n )\n },\n register (item: GroupableInstance) {\n const index = this.items.push(item) - 1\n\n item.$on('change', () => this.onClick(item))\n\n // If no value provided and mandatory,\n // assign first registered item\n if (this.mandatory && !this.selectedValues.length) {\n this.updateMandatory()\n }\n\n this.updateItem(item, index)\n },\n unregister (item: GroupableInstance) {\n if (this._isDestroyed) return\n\n const index = this.items.indexOf(item)\n const value = this.getValue(item, index)\n\n this.items.splice(index, 1)\n\n const valueIndex = this.selectedValues.indexOf(value)\n\n // Items is not selected, do nothing\n if (valueIndex < 0) return\n\n // If not mandatory, use regular update process\n if (!this.mandatory) {\n return this.updateInternalValue(value)\n }\n\n // Remove the value\n if (this.multiple && Array.isArray(this.internalValue)) {\n this.internalValue = this.internalValue.filter(v => v !== value)\n } else {\n this.internalValue = undefined\n }\n\n // If mandatory and we have no selection\n // add the last item as value\n /* istanbul ignore else */\n if (!this.selectedItems.length) {\n this.updateMandatory(true)\n }\n },\n updateItem (item: GroupableInstance, index: number) {\n const value = this.getValue(item, index)\n\n item.isActive = this.toggleMethod(value)\n },\n // https://github.com/vuetifyjs/vuetify/issues/5352\n updateItemsState () {\n this.$nextTick(() => {\n if (this.mandatory &&\n !this.selectedItems.length\n ) {\n return this.updateMandatory()\n }\n\n // TODO: Make this smarter so it\n // doesn't have to iterate every\n // child in an update\n this.items.forEach(this.updateItem)\n })\n },\n updateInternalValue (value: any) {\n this.multiple\n ? this.updateMultiple(value)\n : this.updateSingle(value)\n },\n updateMandatory (last?: boolean) {\n if (!this.items.length) return\n\n const items = this.items.slice()\n\n if (last) items.reverse()\n\n const item = items.find(item => !item.disabled)\n\n // If no tabs are available\n // aborts mandatory value\n if (!item) return\n\n const index = this.items.indexOf(item)\n\n this.updateInternalValue(\n this.getValue(item, index)\n )\n },\n updateMultiple (value: any) {\n const defaultValue = Array.isArray(this.internalValue)\n ? this.internalValue\n : []\n const internalValue = defaultValue.slice()\n const index = internalValue.findIndex(val => val === value)\n\n if (\n this.mandatory &&\n // Item already exists\n index > -1 &&\n // value would be reduced below min\n internalValue.length - 1 < 1\n ) return\n\n if (\n // Max is set\n this.max != null &&\n // Item doesn't exist\n index < 0 &&\n // value would be increased above max\n internalValue.length + 1 > this.max\n ) return\n\n index > -1\n ? internalValue.splice(index, 1)\n : internalValue.push(value)\n\n this.internalValue = internalValue\n },\n updateSingle (value: any) {\n const isSame = value === this.internalValue\n\n if (this.mandatory && isSame) return\n\n this.internalValue = isSame ? undefined : value\n },\n },\n\n render (h): VNode {\n return h('div', this.genData(), this.$slots.default)\n },\n})\n\nexport default BaseItemGroup.extend({\n name: 'v-item-group',\n\n provide (): object {\n return {\n itemGroup: this,\n }\n },\n})\n","import Vue from 'vue'\n\nexport type MouseHandler = (e: MouseEvent | TouchEvent) => any\n\nexport type MouseEvents = {\n [event: string]: {\n event: string\n passive?: boolean\n capture?: boolean\n once?: boolean\n stop?: boolean\n prevent?: boolean\n button?: number\n result?: any\n }\n}\n\nexport type MouseEventsMap = {\n [event: string]: MouseHandler | MouseHandler[]\n}\n\nexport default Vue.extend({\n name: 'mouse',\n\n methods: {\n getDefaultMouseEventHandlers (suffix: string, getEvent: MouseHandler): MouseEventsMap {\n return this.getMouseEventHandlers({\n ['click' + suffix]: { event: 'click' },\n ['contextmenu' + suffix]: { event: 'contextmenu', prevent: true, result: false },\n ['mousedown' + suffix]: { event: 'mousedown' },\n ['mousemove' + suffix]: { event: 'mousemove' },\n ['mouseup' + suffix]: { event: 'mouseup' },\n ['mouseenter' + suffix]: { event: 'mouseenter' },\n ['mouseleave' + suffix]: { event: 'mouseleave' },\n ['touchstart' + suffix]: { event: 'touchstart' },\n ['touchmove' + suffix]: { event: 'touchmove' },\n ['touchend' + suffix]: { event: 'touchend' },\n }, getEvent)\n },\n getMouseEventHandlers (events: MouseEvents, getEvent: MouseHandler): MouseEventsMap {\n const on: MouseEventsMap = {}\n\n for (const event in events) {\n const eventOptions = events[event]\n\n if (!this.$listeners[event]) continue\n\n // TODO somehow pull in modifiers\n\n const prefix = eventOptions.passive ? '&' : ((eventOptions.once ? '~' : '') + (eventOptions.capture ? '!' : ''))\n const key = prefix + eventOptions.event\n\n const handler: MouseHandler = e => {\n const mouseEvent: MouseEvent = e as MouseEvent\n if (eventOptions.button === undefined || (mouseEvent.buttons > 0 && mouseEvent.button === eventOptions.button)) {\n if (eventOptions.prevent) {\n e.preventDefault()\n }\n if (eventOptions.stop) {\n e.stopPropagation()\n }\n this.$emit(event, getEvent(e))\n }\n\n return eventOptions.result\n }\n\n if (key in on) {\n /* istanbul ignore next */\n if (Array.isArray(on[key])) {\n (on[key] as MouseHandler[]).push(handler)\n } else {\n on[key] = [on[key], handler] as MouseHandler[]\n }\n } else {\n on[key] = handler\n }\n }\n\n return on\n },\n },\n})\n","import Vue from 'vue'\n\nimport {\n validateTimestamp,\n parseTimestamp,\n parseDate,\n} from '../util/timestamp'\nimport { CalendarTimestamp } from 'vuetify/types'\n\nexport default Vue.extend({\n name: 'times',\n\n props: {\n now: {\n type: String,\n validator: validateTimestamp,\n },\n },\n\n data: () => ({\n times: {\n now: parseTimestamp('0000-00-00 00:00', true),\n today: parseTimestamp('0000-00-00', true),\n },\n }),\n\n computed: {\n parsedNow (): CalendarTimestamp | null {\n return this.now ? parseTimestamp(this.now, true) : null\n },\n },\n\n watch: {\n parsedNow: 'updateTimes',\n },\n\n created () {\n this.updateTimes()\n this.setPresent()\n },\n\n methods: {\n setPresent (): void {\n this.times.now.present = this.times.today.present = true\n this.times.now.past = this.times.today.past = false\n this.times.now.future = this.times.today.future = false\n },\n updateTimes (): void {\n const now: CalendarTimestamp = this.parsedNow || this.getNow()\n this.updateDay(now, this.times.now)\n this.updateTime(now, this.times.now)\n this.updateDay(now, this.times.today)\n },\n getNow (): CalendarTimestamp {\n return parseDate(new Date())\n },\n updateDay (now: CalendarTimestamp, target: CalendarTimestamp): void {\n if (now.date !== target.date) {\n target.year = now.year\n target.month = now.month\n target.day = now.day\n target.weekday = now.weekday\n target.date = now.date\n }\n },\n updateTime (now: CalendarTimestamp, target: CalendarTimestamp): void {\n if (now.time !== target.time) {\n target.hour = now.hour\n target.minute = now.minute\n target.time = now.time\n }\n },\n },\n})\n","import { CalendarEventParsed, CalendarEventVisual, CalendarTimestamp } from 'vuetify/types'\nimport { getTimestampIdentifier } from '../util/timestamp'\n\nconst MILLIS_IN_DAY = 86400000\n\nexport type GetRange = (event: CalendarEventParsed) => [number, number]\n\nexport function getVisuals (events: CalendarEventParsed[], minStart = 0): CalendarEventVisual[] {\n const visuals = events.map(event => ({\n event,\n columnCount: 0,\n column: 0,\n left: 0,\n width: 100,\n }))\n\n visuals.sort((a, b) => {\n return (Math.max(minStart, a.event.startTimestampIdentifier) - Math.max(minStart, b.event.startTimestampIdentifier)) ||\n (b.event.endTimestampIdentifier - a.event.endTimestampIdentifier)\n })\n\n return visuals\n}\n\nexport interface ColumnGroup {\n start: number\n end: number\n visuals: CalendarEventVisual[]\n}\n\nexport function hasOverlap (s0: number, e0: number, s1: number, e1: number, exclude = true): boolean {\n return exclude ? !(s0 >= e1 || e0 <= s1) : !(s0 > e1 || e0 < s1)\n}\n\nexport function setColumnCount (groups: ColumnGroup[]) {\n groups.forEach(group => {\n group.visuals.forEach(groupVisual => {\n groupVisual.columnCount = groups.length\n })\n })\n}\n\nexport function getRange (event: CalendarEventParsed): [number, number] {\n return [event.startTimestampIdentifier, event.endTimestampIdentifier]\n}\n\nexport function getDayRange (event: CalendarEventParsed): [number, number] {\n return [event.startIdentifier, event.endIdentifier]\n}\n\nexport function getNormalizedRange (event: CalendarEventParsed, dayStart: number): [number, number] {\n return [Math.max(dayStart, event.startTimestampIdentifier), Math.min(dayStart + MILLIS_IN_DAY, event.endTimestampIdentifier)]\n}\n\nexport function getOpenGroup (groups: ColumnGroup[], start: number, end: number, timed: boolean) {\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i]\n let intersected = false\n\n if (hasOverlap(start, end, group.start, group.end, timed)) {\n for (let k = 0; k < group.visuals.length; k++) {\n const groupVisual = group.visuals[k]\n const [groupStart, groupEnd] = timed ? getRange(groupVisual.event) : getDayRange(groupVisual.event)\n\n if (hasOverlap(start, end, groupStart, groupEnd, timed)) {\n intersected = true\n break\n }\n }\n }\n\n if (!intersected) {\n return i\n }\n }\n\n return -1\n}\n\nexport function getOverlapGroupHandler (firstWeekday: number) {\n const handler = {\n groups: [] as ColumnGroup[],\n min: -1,\n max: -1,\n reset: () => {\n handler.groups = []\n handler.min = handler.max = -1\n },\n getVisuals: (day: CalendarTimestamp, dayEvents: CalendarEventParsed[], timed: boolean, reset = false) => {\n if (day.weekday === firstWeekday || reset) {\n handler.reset()\n }\n\n const dayStart = getTimestampIdentifier(day)\n const visuals = getVisuals(dayEvents, dayStart)\n\n visuals.forEach(visual => {\n const [start, end] = timed ? getRange(visual.event) : getDayRange(visual.event)\n\n if (handler.groups.length > 0 && !hasOverlap(start, end, handler.min, handler.max, timed)) {\n setColumnCount(handler.groups)\n handler.reset()\n }\n\n let targetGroup = getOpenGroup(handler.groups, start, end, timed)\n\n if (targetGroup === -1) {\n targetGroup = handler.groups.length\n\n handler.groups.push({ start, end, visuals: [] })\n }\n\n const target = handler.groups[targetGroup]\n target.visuals.push(visual)\n target.start = Math.min(target.start, start)\n target.end = Math.max(target.end, end)\n\n visual.column = targetGroup\n\n if (handler.min === -1) {\n handler.min = start\n handler.max = end\n } else {\n handler.min = Math.min(handler.min, start)\n handler.max = Math.max(handler.max, end)\n }\n })\n\n setColumnCount(handler.groups)\n\n if (timed) {\n handler.reset()\n }\n\n return visuals\n },\n }\n\n return handler\n}\n","import { CalendarEventOverlapMode, CalendarEventVisual } from 'vuetify/types'\nimport { getOverlapGroupHandler, getVisuals, hasOverlap, getNormalizedRange } from './common'\nimport { getTimestampIdentifier } from '../util/timestamp'\n\ninterface Group {\n start: number\n end: number\n visuals: CalendarEventVisual[]\n}\n\ninterface Node {\n parent: Node | null\n sibling: boolean\n index: number\n visual: CalendarEventVisual\n start: number\n end: number\n children: Node[]\n}\n\nconst FULL_WIDTH = 100\n\nconst DEFAULT_OFFSET = 5\n\nconst WIDTH_MULTIPLIER = 1.7\n\n/**\n * Variation of column mode where events can be stacked. The priority of this\n * mode is to stack events together taking up the least amount of space while\n * trying to ensure the content of the event is always visible as well as its\n * start and end. A sibling column has intersecting event content and must be\n * placed beside each other. Non-sibling columns are offset by 5% from the\n * previous column. The width is scaled by 1.7 so the events overlap and\n * whitespace is reduced. If there is a hole in columns the event width is\n * scaled up so it intersects with the next column. The columns have equal\n * width in the space they are given. If the event doesn't have any to the\n * right of it that intersect with it's content it's right side is extended\n * to the right side.\n */\n\nexport const stack: CalendarEventOverlapMode = (events, firstWeekday, overlapThreshold) => {\n const handler = getOverlapGroupHandler(firstWeekday)\n\n // eslint-disable-next-line max-statements\n return (day, dayEvents, timed, reset) => {\n if (!timed) {\n return handler.getVisuals(day, dayEvents, timed, reset)\n }\n\n const dayStart = getTimestampIdentifier(day)\n const visuals = getVisuals(dayEvents, dayStart)\n const groups = getGroups(visuals, dayStart)\n\n for (const group of groups) {\n const nodes: Node[] = []\n\n for (const visual of group.visuals) {\n const child = getNode(visual, dayStart)\n const index = getNextIndex(child, nodes)\n\n if (index === false) {\n const parent = getParent(child, nodes)\n if (parent) {\n child.parent = parent\n child.sibling = hasOverlap(child.start, child.end, parent.start, addTime(parent.start, overlapThreshold))\n child.index = parent.index + 1\n parent.children.push(child)\n }\n } else {\n const [parent] = getOverlappingRange(child, nodes, index - 1, index - 1)\n const children = getOverlappingRange(child, nodes, index + 1, index + nodes.length, true)\n\n child.children = children\n child.index = index\n\n if (parent) {\n child.parent = parent\n child.sibling = hasOverlap(child.start, child.end, parent.start, addTime(parent.start, overlapThreshold))\n parent.children.push(child)\n }\n\n for (const grand of children) {\n if (grand.parent === parent) {\n grand.parent = child\n }\n\n const grandNext = grand.index - child.index <= 1\n if (grandNext && child.sibling &&\n hasOverlap(child.start, addTime(child.start, overlapThreshold), grand.start, grand.end)) {\n grand.sibling = true\n }\n }\n }\n\n nodes.push(child)\n }\n\n calculateBounds(nodes, overlapThreshold)\n }\n\n visuals.sort((a, b) => (a.left - b.left) || (a.event.startTimestampIdentifier - b.event.startTimestampIdentifier))\n\n return visuals\n }\n}\n\nfunction calculateBounds (nodes: Node[], overlapThreshold: number) {\n for (const node of nodes) {\n const { visual, parent } = node\n const columns = getMaxChildIndex(node) + 1\n const spaceLeft = parent ? parent.visual.left : 0\n const spaceWidth = FULL_WIDTH - spaceLeft\n const offset = Math.min(DEFAULT_OFFSET, FULL_WIDTH / columns)\n const columnWidthMultiplier = getColumnWidthMultiplier(node, nodes)\n const columnOffset = spaceWidth / (columns - node.index + 1)\n const columnWidth = spaceWidth / (columns - node.index + (node.sibling ? 1 : 0)) * columnWidthMultiplier\n\n if (parent) {\n visual.left = node.sibling\n ? spaceLeft + columnOffset\n : spaceLeft + offset\n }\n\n visual.width = hasFullWidth(node, nodes, overlapThreshold)\n ? FULL_WIDTH - visual.left\n : Math.min(FULL_WIDTH - visual.left, columnWidth * WIDTH_MULTIPLIER)\n }\n}\n\nfunction getColumnWidthMultiplier (node: Node, nodes: Node[]): number {\n if (!node.children.length) {\n return 1\n }\n\n const maxColumn = node.index + nodes.length\n const minColumn = node.children.reduce((min, c) => Math.min(min, c.index), maxColumn)\n\n return minColumn - node.index\n}\n\nfunction getOverlappingIndices (node: Node, nodes: Node[]): number[] {\n const indices: number[] = []\n for (const other of nodes) {\n if (hasOverlap(node.start, node.end, other.start, other.end)) {\n indices.push(other.index)\n }\n }\n return indices\n}\n\nfunction getNextIndex (node: Node, nodes: Node[]): number | false {\n const indices = getOverlappingIndices(node, nodes)\n indices.sort()\n\n for (let i = 0; i < indices.length; i++) {\n if (i < indices[i]) {\n return i\n }\n }\n return false\n}\n\nfunction getOverlappingRange (node: Node, nodes: Node[], indexMin: number, indexMax: number, returnFirstColumn = false): Node[] {\n const overlapping: Node[] = []\n for (const other of nodes) {\n if (other.index >= indexMin && other.index <= indexMax && hasOverlap(node.start, node.end, other.start, other.end)) {\n overlapping.push(other)\n }\n }\n if (returnFirstColumn && overlapping.length > 0) {\n const first = overlapping.reduce((min, n) => Math.min(min, n.index), overlapping[0].index)\n return overlapping.filter(n => n.index === first)\n }\n return overlapping\n}\n\nfunction getParent (node: Node, nodes: Node[]): Node | null {\n let parent: Node | null = null\n for (const other of nodes) {\n if (hasOverlap(node.start, node.end, other.start, other.end) && (parent === null || other.index > parent.index)) {\n parent = other\n }\n }\n return parent\n}\n\nfunction hasFullWidth (node: Node, nodes: Node[], overlapThreshold: number): boolean {\n for (const other of nodes) {\n if (other !== node &&\n other.index > node.index &&\n hasOverlap(node.start, addTime(node.start, overlapThreshold), other.start, other.end)) {\n return false\n }\n }\n\n return true\n}\n\nfunction getGroups (visuals: CalendarEventVisual[], dayStart: number): Group[] {\n const groups: Group[] = []\n\n for (const visual of visuals) {\n const [start, end] = getNormalizedRange(visual.event, dayStart)\n let added = false\n\n for (const group of groups) {\n if (hasOverlap(start, end, group.start, group.end)) {\n group.visuals.push(visual)\n group.end = Math.max(group.end, end)\n added = true\n break\n }\n }\n\n if (!added) {\n groups.push({ start, end, visuals: [visual] })\n }\n }\n\n return groups\n}\n\nfunction getNode (visual: CalendarEventVisual, dayStart: number): Node {\n const [start, end] = getNormalizedRange(visual.event, dayStart)\n\n return {\n parent: null,\n sibling: true,\n index: 0,\n visual,\n start,\n end,\n children: [],\n }\n}\n\nfunction getMaxChildIndex (node: Node): number {\n let max = node.index\n for (const child of node.children) {\n const childMax = getMaxChildIndex(child)\n if (childMax > max) {\n max = childMax\n }\n }\n return max\n}\n\nfunction addTime (identifier: number, minutes: number): number {\n const removeMinutes = identifier % 100\n const totalMinutes = removeMinutes + minutes\n const addHours = Math.floor(totalMinutes / 60)\n const addMinutes = totalMinutes % 60\n\n return identifier - removeMinutes + addHours * 100 + addMinutes\n}\n","import { CalendarEventOverlapMode } from 'vuetify/types'\nimport { getOverlapGroupHandler } from './common'\n\nconst FULL_WIDTH = 100\n\nexport const column: CalendarEventOverlapMode = (events, firstWeekday, overlapThreshold) => {\n const handler = getOverlapGroupHandler(firstWeekday)\n\n return (day, dayEvents, timed, reset) => {\n const visuals = handler.getVisuals(day, dayEvents, timed, reset)\n\n if (timed) {\n visuals.forEach(visual => {\n visual.left = visual.column * FULL_WIDTH / visual.columnCount\n visual.width = FULL_WIDTH / visual.columnCount\n })\n }\n\n return visuals\n }\n}\n","import { CalendarEventOverlapMode } from 'vuetify/types'\nimport { stack } from './stack'\nimport { column } from './column'\n\nexport const CalendarEventOverlapModes: Record = {\n stack,\n column,\n}\n","\nimport { validateTimestamp, parseDate, DAYS_IN_WEEK, validateTime } from './timestamp'\nimport { PropType } from 'vue'\nimport { CalendarEvent, CalendarFormatter, CalendarTimestamp, CalendarEventOverlapMode, CalendarEventNameFunction, CalendarEventColorFunction, CalendarEventCategoryFunction, CalendarEventTimedFunction } from 'vuetify/types'\nimport { CalendarEventOverlapModes } from '../modes'\nimport { PropValidator } from 'vue/types/options'\n\nexport default {\n base: {\n start: {\n type: [String, Number, Date],\n validate: validateTimestamp,\n default: () => parseDate(new Date()).date,\n },\n end: {\n type: [String, Number, Date],\n validate: validateTimestamp,\n },\n weekdays: {\n type: [Array, String] as PropType,\n default: () => [0, 1, 2, 3, 4, 5, 6],\n validate: validateWeekdays,\n },\n hideHeader: {\n type: Boolean,\n },\n shortWeekdays: {\n type: Boolean,\n default: true,\n },\n weekdayFormat: {\n type: Function as PropType,\n default: null,\n },\n dayFormat: {\n type: Function as PropType,\n default: null,\n },\n },\n intervals: {\n maxDays: {\n type: Number,\n default: 7,\n },\n shortIntervals: {\n type: Boolean,\n default: true,\n },\n intervalHeight: {\n type: [Number, String],\n default: 48,\n validate: validateNumber,\n },\n intervalWidth: {\n type: [Number, String],\n default: 60,\n validate: validateNumber,\n },\n intervalMinutes: {\n type: [Number, String],\n default: 60,\n validate: validateNumber,\n },\n firstInterval: {\n type: [Number, String],\n default: 0,\n validate: validateNumber,\n },\n firstTime: {\n type: [Number, String, Object],\n validate: validateTime,\n },\n intervalCount: {\n type: [Number, String],\n default: 24,\n validate: validateNumber,\n },\n intervalFormat: {\n type: Function as PropType,\n default: null,\n },\n intervalStyle: {\n type: Function as PropType<(interval: CalendarTimestamp) => object>,\n default: null,\n },\n showIntervalLabel: {\n type: Function as PropType<(interval: CalendarTimestamp) => boolean>,\n default: null,\n },\n },\n weeks: {\n localeFirstDayOfYear: {\n type: [String, Number],\n default: 0,\n },\n minWeeks: {\n validate: validateNumber,\n default: 1,\n },\n shortMonths: {\n type: Boolean,\n default: true,\n },\n showMonthOnFirst: {\n type: Boolean,\n default: true,\n },\n showWeek: Boolean,\n monthFormat: {\n type: Function as PropType,\n default: null,\n },\n },\n calendar: {\n type: {\n type: String,\n default: 'month',\n },\n value: {\n type: [String, Number, Date] as PropType,\n validate: validateTimestamp,\n },\n },\n category: {\n categories: {\n type: [Array, String],\n default: '',\n },\n categoryHideDynamic: {\n type: Boolean,\n },\n categoryShowAll: {\n type: Boolean,\n },\n categoryForInvalid: {\n type: String,\n default: '',\n },\n categoryDays: {\n type: [Number, String],\n default: 1,\n validate: (x: any) => isFinite(parseInt(x)) && parseInt(x) > 0,\n },\n },\n events: {\n events: {\n type: Array,\n default: () => [],\n } as PropValidator,\n eventStart: {\n type: String,\n default: 'start',\n },\n eventEnd: {\n type: String,\n default: 'end',\n },\n eventTimed: {\n type: [String, Function] as PropType,\n default: 'timed',\n },\n eventCategory: {\n type: [String, Function] as PropType,\n default: 'category',\n },\n eventHeight: {\n type: Number,\n default: 20,\n },\n eventColor: {\n type: [String, Function] as PropType,\n default: 'primary',\n },\n eventTextColor: {\n type: [String, Function] as PropType,\n default: 'white',\n },\n eventName: {\n type: [String, Function] as PropType,\n default: 'name',\n },\n eventOverlapThreshold: {\n type: [String, Number],\n default: 60,\n },\n eventOverlapMode: {\n type: [String, Function],\n default: 'stack',\n validate: (mode: any) => mode in CalendarEventOverlapModes || typeof mode === 'function',\n } as PropValidator<'stack' | 'column' | CalendarEventOverlapMode>,\n eventMore: {\n type: Boolean,\n default: true,\n },\n eventMoreText: {\n type: String,\n default: '$vuetify.calendar.moreEvents',\n },\n eventRipple: {\n type: [Boolean, Object],\n default: null,\n },\n eventMarginBottom: {\n type: Number,\n default: 1,\n },\n },\n}\n\nexport function validateNumber (input: any): boolean {\n return isFinite(parseInt(input))\n}\n\nexport function validateWeekdays (input: string | (number | string)[]): boolean {\n if (typeof input === 'string') {\n input = input.split(',')\n }\n\n if (Array.isArray(input)) {\n const ints = input.map(x => parseInt(x))\n\n if (ints.length > DAYS_IN_WEEK || ints.length === 0) {\n return false\n }\n\n const visited: Record = {}\n let wrapped = false\n\n for (let i = 0; i < ints.length; i++) {\n const x = ints[i]\n\n if (!isFinite(x) || x < 0 || x >= DAYS_IN_WEEK) {\n return false\n }\n\n if (i > 0) {\n const d = x - ints[i - 1]\n if (d < 0) {\n if (wrapped) {\n return false\n }\n wrapped = true\n } else if (d === 0) {\n return false\n }\n }\n\n if (visited[x]) {\n return false\n }\n visited[x] = true\n }\n\n return true\n }\n\n return false\n}\n","\n// Mixins\nimport mixins from '../../../util/mixins'\nimport Colorable from '../../../mixins/colorable'\nimport Localable from '../../../mixins/localable'\nimport Mouse from './mouse'\nimport Themeable from '../../../mixins/themeable'\nimport Times from './times'\n\n// Directives\nimport Resize from '../../../directives/resize'\n\n// Util\nimport props from '../util/props'\nimport {\n parseTimestamp,\n getWeekdaySkips,\n createDayList,\n createNativeLocaleFormatter,\n getStartOfWeek,\n getEndOfWeek,\n getTimestampIdentifier,\n} from '../util/timestamp'\nimport { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\n\nexport default mixins(\n Colorable,\n Localable,\n Mouse,\n Themeable,\n Times\n/* @vue/component */\n).extend({\n name: 'calendar-base',\n\n directives: {\n Resize,\n },\n\n props: props.base,\n\n computed: {\n parsedWeekdays (): number[] {\n return Array.isArray(this.weekdays)\n ? this.weekdays\n : (this.weekdays || '').split(',').map(x => parseInt(x, 10))\n },\n weekdaySkips (): number[] {\n return getWeekdaySkips(this.parsedWeekdays)\n },\n weekdaySkipsReverse (): number [] {\n const reversed = this.weekdaySkips.slice()\n reversed.reverse()\n return reversed\n },\n parsedStart (): CalendarTimestamp {\n return parseTimestamp(this.start, true)\n },\n parsedEnd (): CalendarTimestamp {\n const start = this.parsedStart\n const end: CalendarTimestamp = this.end ? parseTimestamp(this.end) || start : start\n\n return getTimestampIdentifier(end) < getTimestampIdentifier(start) ? start : end\n },\n days (): CalendarTimestamp[] {\n return createDayList(\n this.parsedStart,\n this.parsedEnd,\n this.times.today,\n this.weekdaySkips\n )\n },\n dayFormatter (): CalendarFormatter {\n if (this.dayFormat) {\n return this.dayFormat as CalendarFormatter\n }\n\n const options = { timeZone: 'UTC', day: 'numeric' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (_tms, _short) => options\n )\n },\n weekdayFormatter (): CalendarFormatter {\n if (this.weekdayFormat) {\n return this.weekdayFormat as CalendarFormatter\n }\n\n const longOptions = { timeZone: 'UTC', weekday: 'long' }\n const shortOptions = { timeZone: 'UTC', weekday: 'short' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (_tms, short) => short ? shortOptions : longOptions\n )\n },\n },\n\n methods: {\n getRelativeClasses (timestamp: CalendarTimestamp, outside = false): object {\n return {\n 'v-present': timestamp.present,\n 'v-past': timestamp.past,\n 'v-future': timestamp.future,\n 'v-outside': outside,\n }\n },\n getStartOfWeek (timestamp: CalendarTimestamp): CalendarTimestamp {\n return getStartOfWeek(timestamp, this.parsedWeekdays, this.times.today)\n },\n getEndOfWeek (timestamp: CalendarTimestamp): CalendarTimestamp {\n return getEndOfWeek(timestamp, this.parsedWeekdays, this.times.today)\n },\n getFormatter (options: object): CalendarFormatter {\n return createNativeLocaleFormatter(\n this.locale,\n (_tms, _short) => options\n )\n },\n },\n})\n","import {\n parseTimestamp,\n getDayIdentifier,\n getTimestampIdentifier,\n OFFSET_TIME,\n isTimedless,\n updateHasTime,\n} from './timestamp'\nimport { CalendarTimestamp, CalendarEvent, CalendarEventParsed } from 'vuetify/types'\n\nexport function parseEvent (\n input: CalendarEvent,\n index: number,\n startProperty: string,\n endProperty: string,\n timed = false,\n category: string | false = false,\n): CalendarEventParsed {\n const startInput = input[startProperty]\n const endInput = input[endProperty]\n const startParsed: CalendarTimestamp = parseTimestamp(startInput, true)\n const endParsed: CalendarTimestamp = (endInput ? parseTimestamp(endInput, true) : startParsed)\n const start: CalendarTimestamp = isTimedless(startInput)\n ? updateHasTime(startParsed, timed)\n : startParsed\n const end: CalendarTimestamp = isTimedless(endInput)\n ? updateHasTime(endParsed, timed)\n : endParsed\n const startIdentifier: number = getDayIdentifier(start)\n const startTimestampIdentifier: number = getTimestampIdentifier(start)\n const endIdentifier: number = getDayIdentifier(end)\n const endOffset: number = start.hasTime ? 0 : 2359\n const endTimestampIdentifier: number = getTimestampIdentifier(end) + endOffset\n const allDay: boolean = !start.hasTime\n\n return { input, start, startIdentifier, startTimestampIdentifier, end, endIdentifier, endTimestampIdentifier, allDay, index, category }\n}\n\nexport function isEventOn (event: CalendarEventParsed, dayIdentifier: number): boolean {\n return dayIdentifier >= event.startIdentifier &&\n dayIdentifier <= event.endIdentifier &&\n dayIdentifier * OFFSET_TIME !== event.endTimestampIdentifier\n}\n\nexport function isEventStart (event: CalendarEventParsed, day: CalendarTimestamp, dayIdentifier: number, firstWeekday: number): boolean {\n return dayIdentifier === event.startIdentifier || (firstWeekday === day.weekday && isEventOn(event, dayIdentifier))\n}\n\nexport function isEventOverlapping (event: CalendarEventParsed, startIdentifier: number, endIdentifier: number): boolean {\n return startIdentifier <= event.endIdentifier && endIdentifier >= event.startIdentifier\n}\n","// Styles\nimport './calendar-with-events.sass'\n\n// Types\nimport { VNode, VNodeData } from 'vue'\n\n// Directives\nimport ripple from '../../../directives/ripple'\n\n// Mixins\nimport CalendarBase from './calendar-base'\n\n// Helpers\nimport { escapeHTML } from '../../../util/helpers'\n\n// Util\nimport props from '../util/props'\nimport {\n CalendarEventOverlapModes,\n} from '../modes'\nimport {\n getDayIdentifier, diffMinutes,\n} from '../util/timestamp'\nimport {\n parseEvent,\n isEventStart,\n isEventOn,\n isEventOverlapping,\n} from '../util/events'\nimport {\n CalendarTimestamp,\n CalendarEventParsed,\n CalendarEventVisual,\n CalendarEventColorFunction,\n CalendarEventNameFunction,\n CalendarEventTimedFunction,\n CalendarDaySlotScope,\n CalendarDayBodySlotScope,\n CalendarEventOverlapMode,\n CalendarEvent,\n CalendarEventCategoryFunction,\n} from 'vuetify/types'\n\n// Types\ntype VEventGetter = (day: D) => CalendarEventParsed[]\n\ntype VEventVisualToNode = (visual: CalendarEventVisual, day: D) => VNode | false\n\ntype VEventsToNodes = (\n day: D,\n getter: VEventGetter,\n mapper: VEventVisualToNode,\n timed: boolean) => VNode[] | undefined\n\ntype VDailyEventsMap = {\n [date: string]: {\n parent: HTMLElement\n more: HTMLElement | null\n events: HTMLElement[]\n }\n}\n\ninterface VEventScopeInput {\n eventParsed: CalendarEventParsed\n day: CalendarDaySlotScope\n start: boolean\n end: boolean\n timed: boolean\n}\n\nconst WIDTH_FULL = 100\nconst WIDTH_START = 95\nconst MINUTES_IN_DAY = 1440\n\n/* @vue/component */\nexport default CalendarBase.extend({\n name: 'calendar-with-events',\n\n directives: {\n ripple,\n },\n\n props: props.events,\n\n computed: {\n noEvents (): boolean {\n return this.events.length === 0\n },\n parsedEvents (): CalendarEventParsed[] {\n return this.events.map(this.parseEvent)\n },\n parsedEventOverlapThreshold (): number {\n return parseInt(this.eventOverlapThreshold)\n },\n eventColorFunction (): CalendarEventColorFunction {\n return typeof this.eventColor === 'function'\n ? this.eventColor\n : () => (this.eventColor as string)\n },\n eventTimedFunction (): CalendarEventTimedFunction {\n return typeof this.eventTimed === 'function'\n ? this.eventTimed\n : event => !!event[this.eventTimed as string]\n },\n eventCategoryFunction (): CalendarEventCategoryFunction {\n return typeof this.eventCategory === 'function'\n ? this.eventCategory\n : event => event[this.eventCategory as string]\n },\n eventTextColorFunction (): CalendarEventColorFunction {\n return typeof this.eventTextColor === 'function'\n ? this.eventTextColor\n : () => this.eventTextColor as string\n },\n eventNameFunction (): CalendarEventNameFunction {\n return typeof this.eventName === 'function'\n ? this.eventName\n : (event, timedEvent) => escapeHTML(event.input[this.eventName as string] as string)\n },\n eventModeFunction (): CalendarEventOverlapMode {\n return typeof this.eventOverlapMode === 'function'\n ? this.eventOverlapMode\n : CalendarEventOverlapModes[this.eventOverlapMode]\n },\n eventWeekdays (): number[] {\n return this.parsedWeekdays\n },\n categoryMode (): boolean {\n return false\n },\n },\n\n methods: {\n parseEvent (input: CalendarEvent, index = 0): CalendarEventParsed {\n return parseEvent(\n input,\n index,\n this.eventStart,\n this.eventEnd,\n this.eventTimedFunction(input),\n this.categoryMode ? this.eventCategoryFunction(input) : false,\n )\n },\n formatTime (withTime: CalendarTimestamp, ampm: boolean): string {\n const formatter = this.getFormatter({\n timeZone: 'UTC',\n hour: 'numeric',\n minute: withTime.minute > 0 ? 'numeric' : undefined,\n })\n\n return formatter(withTime, true)\n },\n updateEventVisibility () {\n if (this.noEvents || !this.eventMore) {\n return\n }\n\n const eventHeight = this.eventHeight\n const eventsMap = this.getEventsMap()\n\n for (const date in eventsMap) {\n const { parent, events, more } = eventsMap[date]\n if (!more) {\n break\n }\n\n const parentBounds = parent.getBoundingClientRect()\n const last = events.length - 1\n let hide = false\n let hidden = 0\n\n for (let i = 0; i <= last; i++) {\n if (!hide) {\n const eventBounds = events[i].getBoundingClientRect()\n hide = i === last\n ? (eventBounds.bottom > parentBounds.bottom)\n : (eventBounds.bottom + eventHeight > parentBounds.bottom)\n }\n if (hide) {\n events[i].style.display = 'none'\n hidden++\n }\n }\n\n if (hide) {\n more.style.display = ''\n more.innerHTML = this.$vuetify.lang.t(this.eventMoreText, hidden)\n } else {\n more.style.display = 'none'\n }\n }\n },\n getEventsMap (): VDailyEventsMap {\n const eventsMap: VDailyEventsMap = {}\n const elements = this.$refs.events as HTMLElement[]\n\n if (!elements || !elements.forEach) {\n return eventsMap\n }\n\n elements.forEach(el => {\n const date = el.getAttribute('data-date')\n if (el.parentElement && date) {\n if (!(date in eventsMap)) {\n eventsMap[date] = {\n parent: el.parentElement,\n more: null,\n events: [],\n }\n }\n if (el.getAttribute('data-more')) {\n eventsMap[date].more = el\n } else {\n eventsMap[date].events.push(el)\n el.style.display = ''\n }\n }\n })\n\n return eventsMap\n },\n genDayEvent ({ event }: CalendarEventVisual, day: CalendarDaySlotScope): VNode {\n const eventHeight = this.eventHeight\n const eventMarginBottom = this.eventMarginBottom\n const dayIdentifier = getDayIdentifier(day)\n const week = day.week\n const start = dayIdentifier === event.startIdentifier\n let end = dayIdentifier === event.endIdentifier\n let width = WIDTH_START\n\n if (!this.categoryMode) {\n for (let i = day.index + 1; i < week.length; i++) {\n const weekdayIdentifier = getDayIdentifier(week[i])\n if (event.endIdentifier >= weekdayIdentifier) {\n width += WIDTH_FULL\n end = end || weekdayIdentifier === event.endIdentifier\n } else {\n end = true\n break\n }\n }\n }\n const scope = { eventParsed: event, day, start, end, timed: false }\n\n return this.genEvent(event, scope, false, {\n staticClass: 'v-event',\n class: {\n 'v-event-start': start,\n 'v-event-end': end,\n },\n style: {\n height: `${eventHeight}px`,\n width: `${width}%`,\n 'margin-bottom': `${eventMarginBottom}px`,\n },\n attrs: {\n 'data-date': day.date,\n },\n key: event.index,\n ref: 'events',\n refInFor: true,\n })\n },\n genTimedEvent ({ event, left, width }: CalendarEventVisual, day: CalendarDayBodySlotScope): VNode | false {\n if (day.timeDelta(event.end) <= 0 || day.timeDelta(event.start) >= 1) {\n return false\n }\n\n const dayIdentifier = getDayIdentifier(day)\n const start = event.startIdentifier >= dayIdentifier\n const end = event.endIdentifier > dayIdentifier\n const top = start ? day.timeToY(event.start) : 0\n const bottom = end ? day.timeToY(MINUTES_IN_DAY) : day.timeToY(event.end)\n const height = Math.max(this.eventHeight, bottom - top)\n const scope = { eventParsed: event, day, start, end, timed: true }\n\n return this.genEvent(event, scope, true, {\n staticClass: 'v-event-timed',\n style: {\n top: `${top}px`,\n height: `${height}px`,\n left: `${left}%`,\n width: `${width}%`,\n },\n })\n },\n genEvent (event: CalendarEventParsed, scopeInput: VEventScopeInput, timedEvent: boolean, data: VNodeData): VNode {\n const slot = this.$scopedSlots.event\n const text = this.eventTextColorFunction(event.input)\n const background = this.eventColorFunction(event.input)\n const overlapsNoon = event.start.hour < 12 && event.end.hour >= 12\n const singline = diffMinutes(event.start, event.end) <= this.parsedEventOverlapThreshold\n const formatTime = this.formatTime\n const timeSummary = () => formatTime(event.start, overlapsNoon) + ' - ' + formatTime(event.end, true)\n const eventSummary = () => {\n const name = this.eventNameFunction(event, timedEvent)\n\n if (event.start.hasTime) {\n if (timedEvent) {\n const time = timeSummary()\n const delimiter = singline ? ', ' : '
'\n\n return `${name}${delimiter}${time}`\n } else {\n const time = formatTime(event.start, true)\n\n return `${time} ${name}`\n }\n }\n\n return name\n }\n\n const scope = {\n ...scopeInput,\n event: event.input,\n outside: scopeInput.day.outside,\n singline,\n overlapsNoon,\n formatTime,\n timeSummary,\n eventSummary,\n }\n\n return this.$createElement('div',\n this.setTextColor(text,\n this.setBackgroundColor(background, {\n on: this.getDefaultMouseEventHandlers(':event', nativeEvent => ({ ...scope, nativeEvent })),\n directives: [{\n name: 'ripple',\n value: this.eventRipple != null ? this.eventRipple : true,\n }],\n ...data,\n })\n ), slot\n ? slot(scope)\n : [this.genName(eventSummary)]\n )\n },\n genName (eventSummary: () => string): VNode {\n return this.$createElement('div', {\n staticClass: 'pl-1',\n domProps: {\n innerHTML: eventSummary(),\n },\n })\n },\n genPlaceholder (day: CalendarTimestamp): VNode {\n const height = this.eventHeight + this.eventMarginBottom\n\n return this.$createElement('div', {\n style: {\n height: `${height}px`,\n },\n attrs: {\n 'data-date': day.date,\n },\n ref: 'events',\n refInFor: true,\n })\n },\n genMore (day: CalendarDaySlotScope): VNode {\n const eventHeight = this.eventHeight\n const eventMarginBottom = this.eventMarginBottom\n\n return this.$createElement('div', {\n staticClass: 'v-event-more pl-1',\n class: {\n 'v-outside': day.outside,\n },\n attrs: {\n 'data-date': day.date,\n 'data-more': 1,\n },\n directives: [{\n name: 'ripple',\n value: this.eventRipple != null ? this.eventRipple : true,\n }],\n on: {\n click: () => this.$emit('click:more', day),\n },\n style: {\n display: 'none',\n height: `${eventHeight}px`,\n 'margin-bottom': `${eventMarginBottom}px`,\n },\n ref: 'events',\n refInFor: true,\n })\n },\n getVisibleEvents (): CalendarEventParsed[] {\n const start = getDayIdentifier(this.days[0])\n const end = getDayIdentifier(this.days[this.days.length - 1])\n\n return this.parsedEvents.filter(\n event => isEventOverlapping(event, start, end)\n )\n },\n isEventForCategory (event: CalendarEventParsed, category: string | undefined | null): boolean {\n return !this.categoryMode ||\n category === event.category ||\n (typeof event.category !== 'string' && category === null)\n },\n getEventsForDay (day: CalendarDaySlotScope): CalendarEventParsed[] {\n const identifier = getDayIdentifier(day)\n const firstWeekday = this.eventWeekdays[0]\n\n return this.parsedEvents.filter(\n event => isEventStart(event, day, identifier, firstWeekday)\n )\n },\n getEventsForDayAll (day: CalendarDaySlotScope): CalendarEventParsed[] {\n const identifier = getDayIdentifier(day)\n const firstWeekday = this.eventWeekdays[0]\n\n return this.parsedEvents.filter(\n event => event.allDay &&\n (this.categoryMode ? isEventOn(event, identifier) : isEventStart(event, day, identifier, firstWeekday)) &&\n this.isEventForCategory(event, day.category)\n )\n },\n getEventsForDayTimed (day: CalendarDaySlotScope): CalendarEventParsed[] {\n const identifier = getDayIdentifier(day)\n\n return this.parsedEvents.filter(\n event => !event.allDay &&\n isEventOn(event, identifier) &&\n this.isEventForCategory(event, day.category)\n )\n },\n getScopedSlots () {\n if (this.noEvents) {\n return { ...this.$scopedSlots }\n }\n\n const mode = this.eventModeFunction(\n this.parsedEvents,\n this.eventWeekdays[0],\n this.parsedEventOverlapThreshold\n )\n\n const isNode = (input: VNode | false): input is VNode => !!input\n const getSlotChildren: VEventsToNodes = (day, getter, mapper, timed) => {\n const events = getter(day)\n const visuals = mode(day, events, timed, this.categoryMode)\n\n if (timed) {\n return visuals.map(visual => mapper(visual, day)).filter(isNode)\n }\n\n const children: VNode[] = []\n\n visuals.forEach((visual, index) => {\n while (children.length < visual.column) {\n children.push(this.genPlaceholder(day))\n }\n\n const mapped = mapper(visual, day)\n if (mapped) {\n children.push(mapped)\n }\n })\n\n return children\n }\n\n const slots = this.$scopedSlots\n const slotDay = slots.day\n const slotDayHeader = slots['day-header']\n const slotDayBody = slots['day-body']\n\n return {\n ...slots,\n day: (day: CalendarDaySlotScope) => {\n let children = getSlotChildren(day, this.getEventsForDay, this.genDayEvent, false)\n if (children && children.length > 0 && this.eventMore) {\n children.push(this.genMore(day))\n }\n if (slotDay) {\n const slot = slotDay(day)\n if (slot) {\n children = children ? children.concat(slot) : slot\n }\n }\n return children\n },\n 'day-header': (day: CalendarDaySlotScope) => {\n let children = getSlotChildren(day, this.getEventsForDayAll, this.genDayEvent, false)\n\n if (slotDayHeader) {\n const slot = slotDayHeader(day)\n if (slot) {\n children = children ? children.concat(slot) : slot\n }\n }\n return children\n },\n 'day-body': (day: CalendarDayBodySlotScope) => {\n const events = getSlotChildren(day, this.getEventsForDayTimed, this.genTimedEvent, true)\n let children: VNode[] = [\n this.$createElement('div', {\n staticClass: 'v-event-timed-container',\n }, events),\n ]\n\n if (slotDayBody) {\n const slot = slotDayBody(day)\n if (slot) {\n children = children.concat(slot)\n }\n }\n return children\n },\n }\n },\n },\n})\n","// Styles\nimport './VCalendarWeekly.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Components\nimport VBtn from '../VBtn'\n\n// Mixins\nimport CalendarBase from './mixins/calendar-base'\n\n// Util\nimport { getSlot } from '../../util/helpers'\nimport { weekNumber } from '../../util/dateTimeUtils'\nimport props from './util/props'\nimport {\n createDayList,\n getDayIdentifier,\n createNativeLocaleFormatter,\n} from './util/timestamp'\nimport { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\n\n/* @vue/component */\nexport default CalendarBase.extend({\n name: 'v-calendar-weekly',\n\n props: props.weeks,\n\n computed: {\n staticClass (): string {\n return 'v-calendar-weekly'\n },\n classes (): object {\n return this.themeClasses\n },\n parsedMinWeeks (): number {\n return parseInt(this.minWeeks)\n },\n days (): CalendarTimestamp[] {\n const minDays = this.parsedMinWeeks * this.parsedWeekdays.length\n const start = this.getStartOfWeek(this.parsedStart)\n const end = this.getEndOfWeek(this.parsedEnd)\n\n return createDayList(\n start,\n end,\n this.times.today,\n this.weekdaySkips,\n Number.MAX_SAFE_INTEGER,\n minDays\n )\n },\n todayWeek (): CalendarTimestamp[] {\n const today = this.times.today\n const start = this.getStartOfWeek(today)\n const end = this.getEndOfWeek(today)\n\n return createDayList(\n start,\n end,\n today,\n this.weekdaySkips,\n this.parsedWeekdays.length,\n this.parsedWeekdays.length\n )\n },\n monthFormatter (): CalendarFormatter {\n if (this.monthFormat) {\n return this.monthFormat as CalendarFormatter\n }\n\n const longOptions = { timeZone: 'UTC', month: 'long' }\n const shortOptions = { timeZone: 'UTC', month: 'short' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (_tms, short) => short ? shortOptions : longOptions\n )\n },\n },\n\n methods: {\n isOutside (day: CalendarTimestamp): boolean {\n const dayIdentifier = getDayIdentifier(day)\n\n return dayIdentifier < getDayIdentifier(this.parsedStart) ||\n dayIdentifier > getDayIdentifier(this.parsedEnd)\n },\n genHead (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-weekly__head',\n }, this.genHeadDays())\n },\n genHeadDays (): VNode[] {\n const header = this.todayWeek.map(this.genHeadDay)\n\n if (this.showWeek) {\n header.unshift(this.$createElement('div', {\n staticClass: 'v-calendar-weekly__head-weeknumber',\n }))\n }\n\n return header\n },\n genHeadDay (day: CalendarTimestamp, index: number): VNode {\n const outside = this.isOutside(this.days[index])\n const color = day.present ? this.color : undefined\n\n return this.$createElement('div', this.setTextColor(color, {\n key: day.date,\n staticClass: 'v-calendar-weekly__head-weekday',\n class: this.getRelativeClasses(day, outside),\n }), this.weekdayFormatter(day, this.shortWeekdays))\n },\n genWeeks (): VNode[] {\n const days = this.days\n const weekDays = this.parsedWeekdays.length\n const weeks: VNode[] = []\n\n for (let i = 0; i < days.length; i += weekDays) {\n weeks.push(this.genWeek(days.slice(i, i + weekDays), this.getWeekNumber(days[i])))\n }\n\n return weeks\n },\n genWeek (week: CalendarTimestamp[], weekNumber: number): VNode {\n const weekNodes = week.map((day, index) => this.genDay(day, index, week))\n\n if (this.showWeek) {\n weekNodes.unshift(this.genWeekNumber(weekNumber))\n }\n\n return this.$createElement('div', {\n key: week[0].date,\n staticClass: 'v-calendar-weekly__week',\n }, weekNodes)\n },\n getWeekNumber (determineDay: CalendarTimestamp) {\n return weekNumber(\n determineDay.year,\n determineDay.month - 1,\n determineDay.day,\n this.parsedWeekdays[0],\n parseInt(this.localeFirstDayOfYear)\n )\n },\n genWeekNumber (weekNumber: number) {\n return this.$createElement('div', {\n staticClass: 'v-calendar-weekly__weeknumber',\n }, [\n this.$createElement('small', String(weekNumber)),\n ])\n },\n genDay (day: CalendarTimestamp, index: number, week: CalendarTimestamp[]): VNode {\n const outside = this.isOutside(day)\n\n return this.$createElement('div', {\n key: day.date,\n staticClass: 'v-calendar-weekly__day',\n class: this.getRelativeClasses(day, outside),\n on: this.getDefaultMouseEventHandlers(':day', _e => day),\n }, [\n this.genDayLabel(day),\n ...(getSlot(this, 'day', () => ({ outside, index, week, ...day })) || []),\n ])\n },\n genDayLabel (day: CalendarTimestamp): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-weekly__day-label',\n }, getSlot(this, 'day-label', day) || [this.genDayLabelButton(day)])\n },\n genDayLabelButton (day: CalendarTimestamp): VNode {\n const color = day.present ? this.color : 'transparent'\n const hasMonth = day.day === 1 && this.showMonthOnFirst\n\n return this.$createElement(VBtn, {\n props: {\n color,\n fab: true,\n depressed: true,\n small: true,\n },\n on: this.getMouseEventHandlers({\n 'click:date': { event: 'click', stop: true },\n 'contextmenu:date': { event: 'contextmenu', stop: true, prevent: true, result: false },\n }, _e => day),\n }, hasMonth\n ? this.monthFormatter(day, this.shortMonths) + ' ' + this.dayFormatter(day, false)\n : this.dayFormatter(day, false)\n )\n },\n genDayMonth (day: CalendarTimestamp): VNode | string {\n const color = day.present ? this.color : undefined\n\n return this.$createElement('div', this.setTextColor(color, {\n staticClass: 'v-calendar-weekly__day-month',\n }), getSlot(this, 'day-month', day) || this.monthFormatter(day, this.shortMonths))\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: this.staticClass,\n class: this.classes,\n on: {\n dragstart: (e: MouseEvent) => {\n e.preventDefault()\n },\n },\n }, [\n !this.hideHeader ? this.genHead() : '',\n ...this.genWeeks(),\n ])\n },\n})\n","// Styles\nimport './VCalendarWeekly.sass'\n\n// Mixins\nimport VCalendarWeekly from './VCalendarWeekly'\n\n// Util\nimport { parseTimestamp, getStartOfMonth, getEndOfMonth } from './util/timestamp'\nimport { CalendarTimestamp } from 'vuetify/types'\n\n/* @vue/component */\nexport default VCalendarWeekly.extend({\n name: 'v-calendar-monthly',\n\n computed: {\n staticClass (): string {\n return 'v-calendar-monthly v-calendar-weekly'\n },\n parsedStart (): CalendarTimestamp {\n return getStartOfMonth(parseTimestamp(this.start, true))\n },\n parsedEnd (): CalendarTimestamp {\n return getEndOfMonth(parseTimestamp(this.end, true))\n },\n },\n\n})\n","\n// Mixins\nimport CalendarBase from './calendar-base'\n\n// Util\nimport props from '../util/props'\nimport {\n parseTime,\n copyTimestamp,\n updateMinutes,\n createDayList,\n createIntervalList,\n createNativeLocaleFormatter,\n VTime,\n MINUTES_IN_DAY,\n} from '../util/timestamp'\nimport { CalendarTimestamp, CalendarFormatter, CalendarDayBodySlotScope } from 'vuetify/types'\n\n/* @vue/component */\nexport default CalendarBase.extend({\n name: 'calendar-with-intervals',\n\n props: props.intervals,\n\n computed: {\n parsedFirstInterval (): number {\n return parseInt(this.firstInterval)\n },\n parsedIntervalMinutes (): number {\n return parseInt(this.intervalMinutes)\n },\n parsedIntervalCount (): number {\n return parseInt(this.intervalCount)\n },\n parsedIntervalHeight (): number {\n return parseFloat(this.intervalHeight)\n },\n parsedFirstTime (): number | false {\n return parseTime(this.firstTime)\n },\n firstMinute (): number {\n const time = this.parsedFirstTime\n\n return time !== false && time >= 0 && time <= MINUTES_IN_DAY\n ? time\n : this.parsedFirstInterval * this.parsedIntervalMinutes\n },\n bodyHeight (): number {\n return this.parsedIntervalCount * this.parsedIntervalHeight\n },\n days (): CalendarTimestamp[] {\n return createDayList(\n this.parsedStart,\n this.parsedEnd,\n this.times.today,\n this.weekdaySkips,\n this.maxDays\n )\n },\n intervals (): CalendarTimestamp[][] {\n const days: CalendarTimestamp[] = this.days\n const first: number = this.firstMinute\n const minutes: number = this.parsedIntervalMinutes\n const count: number = this.parsedIntervalCount\n const now: CalendarTimestamp = this.times.now\n\n return days.map(d => createIntervalList(d, first, minutes, count, now))\n },\n intervalFormatter (): CalendarFormatter {\n if (this.intervalFormat) {\n return this.intervalFormat as CalendarFormatter\n }\n\n const longOptions = { timeZone: 'UTC', hour: '2-digit', minute: '2-digit' }\n const shortOptions = { timeZone: 'UTC', hour: 'numeric', minute: '2-digit' }\n const shortHourOptions = { timeZone: 'UTC', hour: 'numeric' }\n\n return createNativeLocaleFormatter(\n this.currentLocale,\n (tms, short) => short ? (tms.minute === 0 ? shortHourOptions : shortOptions) : longOptions\n )\n },\n },\n\n methods: {\n showIntervalLabelDefault (interval: CalendarTimestamp): boolean {\n const first: CalendarTimestamp = this.intervals[0][0]\n const isFirst: boolean = first.hour === interval.hour && first.minute === interval.minute\n return !isFirst\n },\n intervalStyleDefault (_interval: CalendarTimestamp): object | undefined {\n return undefined\n },\n getTimestampAtEvent (e: MouseEvent | TouchEvent, day: CalendarTimestamp): CalendarTimestamp {\n const timestamp: CalendarTimestamp = copyTimestamp(day)\n const bounds = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const baseMinutes: number = this.firstMinute\n const touchEvent: TouchEvent = e as TouchEvent\n const mouseEvent: MouseEvent = e as MouseEvent\n const touches: TouchList = touchEvent.changedTouches || touchEvent.touches\n const clientY: number = touches && touches[0] ? touches[0].clientY : mouseEvent.clientY\n const addIntervals: number = (clientY - bounds.top) / this.parsedIntervalHeight\n const addMinutes: number = Math.floor(addIntervals * this.parsedIntervalMinutes)\n const minutes: number = baseMinutes + addMinutes\n\n return updateMinutes(timestamp, minutes, this.times.now)\n },\n getSlotScope (timestamp: CalendarTimestamp): CalendarDayBodySlotScope {\n const scope = copyTimestamp(timestamp) as any\n scope.timeToY = this.timeToY\n scope.timeDelta = this.timeDelta\n scope.minutesToPixels = this.minutesToPixels\n scope.week = this.days\n return scope\n },\n scrollToTime (time: VTime): boolean {\n const y = this.timeToY(time)\n const pane = this.$refs.scrollArea as HTMLElement\n\n if (y === false || !pane) {\n return false\n }\n\n pane.scrollTop = y\n\n return true\n },\n minutesToPixels (minutes: number): number {\n return minutes / this.parsedIntervalMinutes * this.parsedIntervalHeight\n },\n timeToY (time: VTime, clamp = true): number | false {\n let y = this.timeDelta(time)\n\n if (y !== false) {\n y *= this.bodyHeight\n\n if (clamp) {\n if (y < 0) {\n y = 0\n }\n if (y > this.bodyHeight) {\n y = this.bodyHeight\n }\n }\n }\n\n return y\n },\n timeDelta (time: VTime): number | false {\n const minutes = parseTime(time)\n\n if (minutes === false) {\n return false\n }\n\n const min: number = this.firstMinute\n const gap: number = this.parsedIntervalCount * this.parsedIntervalMinutes\n\n return (minutes - min) / gap\n },\n },\n})\n","// Styles\nimport './VCalendarDaily.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Directives\nimport Resize from '../../directives/resize'\n\n// Components\nimport VBtn from '../VBtn'\n\n// Mixins\nimport CalendarWithIntervals from './mixins/calendar-with-intervals'\n\n// Util\nimport { convertToUnit, getSlot } from '../../util/helpers'\nimport { CalendarTimestamp } from 'vuetify/types'\n\n/* @vue/component */\nexport default CalendarWithIntervals.extend({\n name: 'v-calendar-daily',\n\n directives: { Resize },\n\n data: () => ({\n scrollPush: 0,\n }),\n\n computed: {\n classes (): object {\n return {\n 'v-calendar-daily': true,\n ...this.themeClasses,\n }\n },\n },\n\n mounted () {\n this.init()\n },\n\n methods: {\n init () {\n this.$nextTick(this.onResize)\n },\n onResize () {\n this.scrollPush = this.getScrollPush()\n },\n getScrollPush (): number {\n const area = this.$refs.scrollArea as HTMLElement\n const pane = this.$refs.pane as HTMLElement\n\n return area && pane ? (area.offsetWidth - pane.offsetWidth) : 0\n },\n genHead (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__head',\n style: {\n marginRight: this.scrollPush + 'px',\n },\n }, [\n this.genHeadIntervals(),\n ...this.genHeadDays(),\n ])\n },\n genHeadIntervals (): VNode {\n const width: string | undefined = convertToUnit(this.intervalWidth)\n\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__intervals-head',\n style: {\n width,\n },\n }, getSlot(this, 'interval-header'))\n },\n genHeadDays (): VNode[] {\n return this.days.map(this.genHeadDay)\n },\n genHeadDay (day: CalendarTimestamp, index: number): VNode {\n return this.$createElement('div', {\n key: day.date,\n staticClass: 'v-calendar-daily_head-day',\n class: this.getRelativeClasses(day),\n on: this.getDefaultMouseEventHandlers(':day', _e => {\n return this.getSlotScope(day)\n }),\n }, [\n this.genHeadWeekday(day),\n this.genHeadDayLabel(day),\n ...this.genDayHeader(day, index),\n ])\n },\n genDayHeader (day: CalendarTimestamp, index: number): VNode[] {\n return getSlot(this, 'day-header', () => ({\n week: this.days, ...day, index,\n })) || []\n },\n genHeadWeekday (day: CalendarTimestamp): VNode {\n const color = day.present ? this.color : undefined\n\n return this.$createElement('div', this.setTextColor(color, {\n staticClass: 'v-calendar-daily_head-weekday',\n }), this.weekdayFormatter(day, this.shortWeekdays))\n },\n genHeadDayLabel (day: CalendarTimestamp): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily_head-day-label',\n }, getSlot(this, 'day-label-header', day) || [this.genHeadDayButton(day)])\n },\n genHeadDayButton (day: CalendarTimestamp): VNode {\n const color = day.present ? this.color : 'transparent'\n\n return this.$createElement(VBtn, {\n props: {\n color,\n fab: true,\n depressed: true,\n },\n on: this.getMouseEventHandlers({\n 'click:date': { event: 'click', stop: true },\n 'contextmenu:date': { event: 'contextmenu', stop: true, prevent: true, result: false },\n }, _e => {\n return day\n }),\n }, this.dayFormatter(day, false))\n },\n genBody (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__body',\n }, [\n this.genScrollArea(),\n ])\n },\n genScrollArea (): VNode {\n return this.$createElement('div', {\n ref: 'scrollArea',\n staticClass: 'v-calendar-daily__scroll-area',\n }, [\n this.genPane(),\n ])\n },\n genPane (): VNode {\n return this.$createElement('div', {\n ref: 'pane',\n staticClass: 'v-calendar-daily__pane',\n style: {\n height: convertToUnit(this.bodyHeight),\n },\n }, [\n this.genDayContainer(),\n ])\n },\n genDayContainer (): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-daily__day-container',\n }, [\n this.genBodyIntervals(),\n ...this.genDays(),\n ])\n },\n genDays (): VNode[] {\n return this.days.map(this.genDay)\n },\n genDay (day: CalendarTimestamp, index: number): VNode {\n return this.$createElement('div', {\n key: day.date,\n staticClass: 'v-calendar-daily__day',\n class: this.getRelativeClasses(day),\n on: this.getDefaultMouseEventHandlers(':time', e => {\n return this.getSlotScope(this.getTimestampAtEvent(e, day))\n }),\n }, [\n ...this.genDayIntervals(index),\n ...this.genDayBody(day),\n ])\n },\n genDayBody (day: CalendarTimestamp): VNode[] {\n return getSlot(this, 'day-body', () => this.getSlotScope(day)) || []\n },\n genDayIntervals (index: number): VNode[] {\n return this.intervals[index].map(this.genDayInterval)\n },\n genDayInterval (interval: CalendarTimestamp): VNode {\n const height: string | undefined = convertToUnit(this.intervalHeight)\n const styler = this.intervalStyle || this.intervalStyleDefault\n\n const data = {\n key: interval.time,\n staticClass: 'v-calendar-daily__day-interval',\n style: {\n height,\n ...styler(interval),\n },\n }\n\n const children = getSlot(this, 'interval', () => this.getSlotScope(interval))\n\n return this.$createElement('div', data, children)\n },\n genBodyIntervals (): VNode {\n const width: string | undefined = convertToUnit(this.intervalWidth)\n const data = {\n staticClass: 'v-calendar-daily__intervals-body',\n style: {\n width,\n },\n on: this.getDefaultMouseEventHandlers(':interval', e => {\n return this.getTimestampAtEvent(e, this.parsedStart)\n }),\n }\n\n return this.$createElement('div', data, this.genIntervalLabels())\n },\n genIntervalLabels (): VNode[] | null {\n if (!this.intervals.length) return null\n\n return this.intervals[0].map(this.genIntervalLabel)\n },\n genIntervalLabel (interval: CalendarTimestamp): VNode {\n const height: string | undefined = convertToUnit(this.intervalHeight)\n const short: boolean = this.shortIntervals\n const shower = this.showIntervalLabel || this.showIntervalLabelDefault\n const show = shower(interval)\n const label = show ? this.intervalFormatter(interval, short) : undefined\n\n return this.$createElement('div', {\n key: interval.time,\n staticClass: 'v-calendar-daily__interval',\n style: {\n height,\n },\n }, [\n this.$createElement('div', {\n staticClass: 'v-calendar-daily__interval-text',\n }, label),\n ])\n },\n },\n\n render (h): VNode {\n return h('div', {\n class: this.classes,\n on: {\n dragstart: (e: MouseEvent) => {\n e.preventDefault()\n },\n },\n directives: [{\n modifiers: { quiet: true },\n name: 'resize',\n value: this.onResize,\n }],\n }, [\n !this.hideHeader ? this.genHead() : '',\n this.genBody(),\n ])\n },\n})\n","// Styles\nimport './VCalendarCategory.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Mixins\nimport VCalendarDaily from './VCalendarDaily'\n\n// Util\nimport { getSlot } from '../../util/helpers'\nimport { CalendarTimestamp } from 'types'\nimport props from './util/props'\n\n/* @vue/component */\nexport default VCalendarDaily.extend({\n name: 'v-calendar-category',\n\n props: props.category,\n\n computed: {\n classes (): object {\n return {\n 'v-calendar-daily': true,\n 'v-calendar-category': true,\n ...this.themeClasses,\n }\n },\n parsedCategories (): string[] {\n return typeof this.categories === 'string' && this.categories\n ? this.categories.split(/\\s*,\\s*/)\n : Array.isArray(this.categories)\n ? this.categories as string[]\n : []\n },\n },\n\n methods: {\n genDayHeader (day: CalendarTimestamp, index: number): VNode[] {\n const data = {\n staticClass: 'v-calendar-category__columns',\n }\n const scope = {\n week: this.days, ...day, index,\n }\n\n const children = this.parsedCategories.map(category => this.genDayHeaderCategory(day, this.getCategoryScope(scope, category)))\n\n return [this.$createElement('div', data, children)]\n },\n getCategoryScope (scope: any, category: string) {\n return {\n ...scope,\n category: category === this.categoryForInvalid ? null : category,\n }\n },\n genDayHeaderCategory (day: CalendarTimestamp, scope: any): VNode {\n return this.$createElement('div', {\n staticClass: 'v-calendar-category__column-header',\n on: this.getDefaultMouseEventHandlers(':day-category', e => {\n return this.getCategoryScope(this.getSlotScope(day), scope.category)\n }),\n }, [\n getSlot(this, 'category', scope) || this.genDayHeaderCategoryTitle(scope.category),\n getSlot(this, 'day-header', scope),\n ])\n },\n genDayHeaderCategoryTitle (category: string) {\n return this.$createElement('div', {\n staticClass: 'v-calendar-category__category',\n }, category === null ? this.categoryForInvalid : category)\n },\n genDayBody (day: CalendarTimestamp): VNode[] {\n const data = {\n staticClass: 'v-calendar-category__columns',\n }\n\n const children = this.parsedCategories.map(category => this.genDayBodyCategory(day, category))\n\n return [this.$createElement('div', data, children)]\n },\n genDayBodyCategory (day: CalendarTimestamp, category: string): VNode {\n const data = {\n staticClass: 'v-calendar-category__column',\n on: this.getDefaultMouseEventHandlers(':time-category', e => {\n return this.getCategoryScope(this.getSlotScope(this.getTimestampAtEvent(e, day)), category)\n }),\n }\n\n const children = getSlot(this, 'day-body', () => this.getCategoryScope(this.getSlotScope(day), category))\n\n return this.$createElement('div', data, children)\n },\n },\n})\n","// Styles\n// import '../../stylus/components/_calendar-daily.styl'\n\n// Types\nimport { VNode, Component } from 'vue'\n\n// Mixins\nimport CalendarWithEvents from './mixins/calendar-with-events'\n\n// Util\nimport props from './util/props'\nimport {\n DAYS_IN_MONTH_MAX,\n DAY_MIN,\n DAYS_IN_WEEK,\n parseTimestamp,\n validateTimestamp,\n relativeDays,\n nextDay,\n prevDay,\n copyTimestamp,\n updateFormatted,\n updateWeekday,\n updateRelative,\n getStartOfMonth,\n getEndOfMonth,\n VTime,\n VTimestampInput,\n timestampToDate,\n} from './util/timestamp'\n\n// Calendars\nimport VCalendarMonthly from './VCalendarMonthly'\nimport VCalendarDaily from './VCalendarDaily'\nimport VCalendarWeekly from './VCalendarWeekly'\nimport VCalendarCategory from './VCalendarCategory'\nimport { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\n\n// Types\ninterface VCalendarRenderProps {\n start: CalendarTimestamp\n end: CalendarTimestamp\n component: string | Component\n maxDays: number\n weekdays: number[]\n categories: string[]\n}\n\n/* @vue/component */\nexport default CalendarWithEvents.extend({\n name: 'v-calendar',\n\n props: {\n ...props.calendar,\n ...props.weeks,\n ...props.intervals,\n ...props.category,\n },\n\n data: () => ({\n lastStart: null as CalendarTimestamp | null,\n lastEnd: null as CalendarTimestamp | null,\n }),\n\n computed: {\n parsedValue (): CalendarTimestamp {\n return (validateTimestamp(this.value)\n ? parseTimestamp(this.value, true)\n : (this.parsedStart || this.times.today))\n },\n parsedCategoryDays (): number {\n return parseInt(this.categoryDays) || 1\n },\n renderProps (): VCalendarRenderProps {\n const around = this.parsedValue\n let component: any = null\n let maxDays = this.maxDays\n let weekdays = this.parsedWeekdays\n let categories = this.parsedCategories\n let start = around\n let end = around\n switch (this.type) {\n case 'month':\n component = VCalendarMonthly\n start = getStartOfMonth(around)\n end = getEndOfMonth(around)\n break\n case 'week':\n component = VCalendarDaily\n start = this.getStartOfWeek(around)\n end = this.getEndOfWeek(around)\n maxDays = 7\n break\n case 'day':\n component = VCalendarDaily\n maxDays = 1\n weekdays = [start.weekday]\n break\n case '4day':\n component = VCalendarDaily\n end = relativeDays(copyTimestamp(end), nextDay, 4)\n updateFormatted(end)\n maxDays = 4\n weekdays = [\n start.weekday,\n (start.weekday + 1) % 7,\n (start.weekday + 2) % 7,\n (start.weekday + 3) % 7,\n ]\n break\n case 'custom-weekly':\n component = VCalendarWeekly\n start = this.parsedStart || around\n end = this.parsedEnd\n break\n case 'custom-daily':\n component = VCalendarDaily\n start = this.parsedStart || around\n end = this.parsedEnd\n break\n case 'category':\n const days = this.parsedCategoryDays\n\n component = VCalendarCategory\n end = relativeDays(copyTimestamp(end), nextDay, days)\n updateFormatted(end)\n maxDays = days\n weekdays = []\n\n for (let i = 0; i < days; i++) {\n weekdays.push((start.weekday + i) % 7)\n }\n\n categories = this.getCategoryList(categories)\n break\n default:\n throw new Error(this.type + ' is not a valid Calendar type')\n }\n\n return { component, start, end, maxDays, weekdays, categories }\n },\n eventWeekdays (): number[] {\n return this.renderProps.weekdays\n },\n categoryMode (): boolean {\n return this.type === 'category'\n },\n title (): string {\n const { start, end } = this.renderProps\n const spanYears = start.year !== end.year\n const spanMonths = spanYears || start.month !== end.month\n\n if (spanYears) {\n return this.monthShortFormatter(start, true) + ' ' + start.year + ' - ' + this.monthShortFormatter(end, true) + ' ' + end.year\n }\n\n if (spanMonths) {\n return this.monthShortFormatter(start, true) + ' - ' + this.monthShortFormatter(end, true) + ' ' + end.year\n } else {\n return this.monthLongFormatter(start, false) + ' ' + start.year\n }\n },\n monthLongFormatter (): CalendarFormatter {\n return this.getFormatter({\n timeZone: 'UTC', month: 'long',\n })\n },\n monthShortFormatter (): CalendarFormatter {\n return this.getFormatter({\n timeZone: 'UTC', month: 'short',\n })\n },\n parsedCategories (): string[] {\n return typeof this.categories === 'string' && this.categories\n ? this.categories.split(/\\s*,\\s*/)\n : Array.isArray(this.categories)\n ? this.categories as string[]\n : []\n },\n },\n\n watch: {\n renderProps: 'checkChange',\n },\n\n mounted () {\n this.updateEventVisibility()\n this.checkChange()\n },\n\n updated () {\n window.requestAnimationFrame(this.updateEventVisibility)\n },\n\n methods: {\n checkChange (): void {\n const { lastStart, lastEnd } = this\n const { start, end } = this.renderProps\n if (!lastStart || !lastEnd ||\n start.date !== lastStart.date ||\n end.date !== lastEnd.date) {\n this.lastStart = start\n this.lastEnd = end\n this.$emit('change', { start, end })\n }\n },\n move (amount = 1): void {\n const moved = copyTimestamp(this.parsedValue)\n const forward = amount > 0\n const mover = forward ? nextDay : prevDay\n const limit = forward ? DAYS_IN_MONTH_MAX : DAY_MIN\n let times = forward ? amount : -amount\n\n while (--times >= 0) {\n switch (this.type) {\n case 'month':\n moved.day = limit\n mover(moved)\n break\n case 'week':\n relativeDays(moved, mover, DAYS_IN_WEEK)\n break\n case 'day':\n relativeDays(moved, mover, 1)\n break\n case '4day':\n relativeDays(moved, mover, 4)\n break\n case 'category':\n relativeDays(moved, mover, this.parsedCategoryDays)\n break\n }\n }\n\n updateWeekday(moved)\n updateFormatted(moved)\n updateRelative(moved, this.times.now)\n\n if (this.value instanceof Date) {\n this.$emit('input', timestampToDate(moved))\n } else if (typeof this.value === 'number') {\n this.$emit('input', timestampToDate(moved).getTime())\n } else {\n this.$emit('input', moved.date)\n }\n\n this.$emit('moved', moved)\n },\n next (amount = 1): void {\n this.move(amount)\n },\n prev (amount = 1): void {\n this.move(-amount)\n },\n timeToY (time: VTime, clamp = true): number | false {\n const c = this.$children[0] as any\n\n if (c && c.timeToY) {\n return c.timeToY(time, clamp)\n } else {\n return false\n }\n },\n timeDelta (time: VTime): number | false {\n const c = this.$children[0] as any\n\n if (c && c.timeDelta) {\n return c.timeDelta(time)\n } else {\n return false\n }\n },\n minutesToPixels (minutes: number): number {\n const c = this.$children[0] as any\n\n if (c && c.minutesToPixels) {\n return c.minutesToPixels(minutes)\n } else {\n return -1\n }\n },\n scrollToTime (time: VTime): boolean {\n const c = this.$children[0] as any\n\n if (c && c.scrollToTime) {\n return c.scrollToTime(time)\n } else {\n return false\n }\n },\n parseTimestamp (input: VTimestampInput, required?: false): CalendarTimestamp | null {\n return parseTimestamp(input, required, this.times.now)\n },\n timestampToDate (timestamp: CalendarTimestamp): Date {\n return timestampToDate(timestamp)\n },\n getCategoryList (categories: string[]): string[] {\n if (!this.noEvents) {\n const categoryMap = categories.reduce((map, category, index) => {\n map[category] = { index, count: 0 }\n\n return map\n }, Object.create(null))\n\n if (!this.categoryHideDynamic || !this.categoryShowAll) {\n let categoryLength = categories.length\n\n this.parsedEvents.forEach(ev => {\n let category = ev.category\n\n if (typeof category !== 'string') {\n category = this.categoryForInvalid\n }\n\n if (!category) {\n return\n }\n\n if (category in categoryMap) {\n categoryMap[category].count++\n } else if (!this.categoryHideDynamic) {\n categoryMap[category] = {\n index: categoryLength++,\n count: 1,\n }\n }\n })\n }\n\n if (!this.categoryShowAll) {\n for (const category in categoryMap) {\n if (categoryMap[category].count === 0) {\n delete categoryMap[category]\n }\n }\n }\n\n categories = Object.keys(categoryMap)\n }\n\n return categories\n },\n },\n\n render (h): VNode {\n const { start, end, maxDays, component, weekdays, categories } = this.renderProps\n\n return h(component, {\n staticClass: 'v-calendar',\n class: {\n 'v-calendar-events': !this.noEvents,\n },\n props: {\n ...this.$props,\n start: start.date,\n end: end.date,\n maxDays,\n weekdays,\n categories,\n },\n directives: [{\n modifiers: { quiet: true },\n name: 'resize',\n value: this.updateEventVisibility,\n }],\n on: {\n ...this.$listeners,\n 'click:date': (day: CalendarTimestamp) => {\n if (this.$listeners['input']) {\n this.$emit('input', day.date)\n }\n if (this.$listeners['click:date']) {\n this.$emit('click:date', day)\n }\n },\n },\n scopedSlots: this.getScopedSlots(),\n })\n },\n})\n","import VBtn from './VBtn'\n\nexport { VBtn }\nexport default VBtn\n","var $ = require('../internals/export');\n\n// `Number.MAX_SAFE_INTEGER` constant\n// https://tc39.github.io/ecma262/#sec-number.max_safe_integer\n$({ target: 'Number', stat: true }, {\n MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF\n});\n","// Components\nimport { VFadeTransition } from '../transitions'\nimport VExpansionPanel from './VExpansionPanel'\nimport VIcon from '../VIcon'\n\n// Mixins\nimport Colorable from '../../mixins/colorable'\nimport { inject as RegistrableInject } from '../../mixins/registrable'\n\n// Directives\nimport ripple from '../../directives/ripple'\n\n// Utilities\nimport { getSlot } from '../../util/helpers'\nimport mixins, { ExtractVue } from '../../util/mixins'\n\n// Types\nimport Vue, { VNode, VueConstructor } from 'vue'\n\nconst baseMixins = mixins(\n Colorable,\n RegistrableInject<'expansionPanel', VueConstructor>('expansionPanel', 'v-expansion-panel-header', 'v-expansion-panel')\n)\n\ninterface options extends ExtractVue {\n $el: HTMLElement\n expansionPanel: InstanceType\n}\n\nexport default baseMixins.extend().extend({\n name: 'v-expansion-panel-header',\n\n directives: { ripple },\n\n props: {\n disableIconRotate: Boolean,\n expandIcon: {\n type: String,\n default: '$expand',\n },\n hideActions: Boolean,\n ripple: {\n type: [Boolean, Object],\n default: false,\n },\n },\n\n data: () => ({\n hasMousedown: false,\n }),\n\n computed: {\n classes (): object {\n return {\n 'v-expansion-panel-header--active': this.isActive,\n 'v-expansion-panel-header--mousedown': this.hasMousedown,\n }\n },\n isActive (): boolean {\n return this.expansionPanel.isActive\n },\n isDisabled (): boolean {\n return this.expansionPanel.isDisabled\n },\n isReadonly (): boolean {\n return this.expansionPanel.isReadonly\n },\n },\n\n created () {\n this.expansionPanel.registerHeader(this)\n },\n\n beforeDestroy () {\n this.expansionPanel.unregisterHeader()\n },\n\n methods: {\n onClick (e: MouseEvent) {\n this.$emit('click', e)\n },\n genIcon () {\n const icon = getSlot(this, 'actions') ||\n [this.$createElement(VIcon, this.expandIcon)]\n\n return this.$createElement(VFadeTransition, [\n this.$createElement('div', {\n staticClass: 'v-expansion-panel-header__icon',\n class: {\n 'v-expansion-panel-header__icon--disable-rotate': this.disableIconRotate,\n },\n directives: [{\n name: 'show',\n value: !this.isDisabled,\n }],\n }, icon),\n ])\n },\n },\n\n render (h): VNode {\n return h('button', this.setBackgroundColor(this.color, {\n staticClass: 'v-expansion-panel-header',\n class: this.classes,\n attrs: {\n tabindex: this.isDisabled ? -1 : null,\n type: 'button',\n },\n directives: [{\n name: 'ripple',\n value: this.ripple,\n }],\n on: {\n ...this.$listeners,\n click: this.onClick,\n mousedown: () => (this.hasMousedown = true),\n mouseup: () => (this.hasMousedown = false),\n },\n }), [\n getSlot(this, 'default', { open: this.isActive }, true),\n this.hideActions || this.genIcon(),\n ])\n },\n})\n","// Components\nimport VExpansionPanels from './VExpansionPanels'\nimport VExpansionPanelHeader from './VExpansionPanelHeader'\nimport VExpansionPanelContent from './VExpansionPanelContent'\n\n// Mixins\nimport { factory as GroupableFactory } from '../../mixins/groupable'\nimport { provide as RegistrableProvide } from '../../mixins/registrable'\n\n// Utilities\nimport { getSlot } from '../../util/helpers'\nimport mixins from '../../util/mixins'\n\n// Types\nimport { VNode } from 'vue'\n\ntype VExpansionPanelHeaderInstance = InstanceType\ntype VExpansionPanelContentInstance = InstanceType\n\nexport default mixins(\n GroupableFactory<'expansionPanels', typeof VExpansionPanels>('expansionPanels', 'v-expansion-panel', 'v-expansion-panels'),\n RegistrableProvide('expansionPanel', true)\n /* @vue/component */\n).extend({\n name: 'v-expansion-panel',\n\n props: {\n disabled: Boolean,\n readonly: Boolean,\n },\n\n data () {\n return {\n content: null as VExpansionPanelContentInstance | null,\n header: null as VExpansionPanelHeaderInstance | null,\n nextIsActive: false,\n }\n },\n\n computed: {\n classes (): object {\n return {\n 'v-expansion-panel--active': this.isActive,\n 'v-expansion-panel--next-active': this.nextIsActive,\n 'v-expansion-panel--disabled': this.isDisabled,\n ...this.groupClasses,\n }\n },\n isDisabled (): boolean {\n return this.expansionPanels.disabled || this.disabled\n },\n isReadonly (): boolean {\n return this.expansionPanels.readonly || this.readonly\n },\n },\n\n methods: {\n registerContent (vm: VExpansionPanelContentInstance) {\n this.content = vm\n },\n unregisterContent () {\n this.content = null\n },\n registerHeader (vm: VExpansionPanelHeaderInstance) {\n this.header = vm\n vm.$on('click', this.onClick)\n },\n unregisterHeader () {\n this.header = null\n },\n onClick (e: MouseEvent) {\n if (e.detail) this.header!.$el.blur()\n\n this.$emit('click', e)\n\n this.isReadonly || this.isDisabled || this.toggle()\n },\n toggle () {\n /* istanbul ignore else */\n if (this.content) this.content.isBooted = true\n this.$nextTick(() => this.$emit('change'))\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: 'v-expansion-panel',\n class: this.classes,\n attrs: {\n 'aria-expanded': String(this.isActive),\n },\n }, getSlot(this))\n },\n})\n","import { VNodeDirective } from 'vue/types/vnode'\n\ninterface ResizeVNodeDirective extends VNodeDirective {\n value?: () => void\n options?: boolean | AddEventListenerOptions\n}\n\nfunction inserted (el: HTMLElement, binding: ResizeVNodeDirective) {\n const callback = binding.value!\n const options = binding.options || { passive: true }\n\n window.addEventListener('resize', callback, options)\n el._onResize = {\n callback,\n options,\n }\n\n if (!binding.modifiers || !binding.modifiers.quiet) {\n callback()\n }\n}\n\nfunction unbind (el: HTMLElement) {\n if (!el._onResize) return\n\n const { callback, options } = el._onResize\n window.removeEventListener('resize', callback, options)\n delete el._onResize\n}\n\nexport const Resize = {\n inserted,\n unbind,\n}\n\nexport default Resize\n","import Vue from 'vue'\n\nexport default Vue.extend({\n name: 'localable',\n\n props: {\n locale: String,\n },\n\n computed: {\n currentLocale (): string {\n return this.locale || this.$vuetify.lang.current\n },\n },\n})\n","import { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\nimport { isLeapYear } from '../../../util/dateTimeUtils'\n\nexport const PARSE_REGEX: RegExp = /^(\\d{4})-(\\d{1,2})(-(\\d{1,2}))?([^\\d]+(\\d{1,2}))?(:(\\d{1,2}))?(:(\\d{1,2}))?$/\nexport const PARSE_TIME: RegExp = /(\\d\\d?)(:(\\d\\d?)|)(:(\\d\\d?)|)/\n\nexport const DAYS_IN_MONTH: number[] = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nexport const DAYS_IN_MONTH_LEAP: number[] = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nexport const DAYS_IN_MONTH_MIN = 28\nexport const DAYS_IN_MONTH_MAX = 31\nexport const MONTH_MAX = 12\nexport const MONTH_MIN = 1\nexport const DAY_MIN = 1\nexport const DAYS_IN_WEEK = 7\nexport const MINUTES_IN_HOUR = 60\nexport const MINUTE_MAX = 59\nexport const MINUTES_IN_DAY = 24 * 60\nexport const HOURS_IN_DAY = 24\nexport const HOUR_MAX = 23\nexport const FIRST_HOUR = 0\nexport const OFFSET_YEAR = 10000\nexport const OFFSET_MONTH = 100\nexport const OFFSET_HOUR = 100\nexport const OFFSET_TIME = 10000\n\ntype CalendarTimestampFormatOptions = (timestamp: CalendarTimestamp, short: boolean) => object\ntype CalendarTimestampOperation = (timestamp: CalendarTimestamp) => CalendarTimestamp\nexport type VTime = number | string | {\n hour: number\n minute: number\n}\n\nexport type VTimestampInput = number | string | Date;\n\nexport function getStartOfWeek (timestamp: CalendarTimestamp, weekdays: number[], today?: CalendarTimestamp): CalendarTimestamp {\n const start = copyTimestamp(timestamp)\n findWeekday(start, weekdays[0], prevDay)\n updateFormatted(start)\n if (today) {\n updateRelative(start, today, start.hasTime)\n }\n\n return start\n}\n\nexport function getEndOfWeek (timestamp: CalendarTimestamp, weekdays: number[], today?: CalendarTimestamp): CalendarTimestamp {\n const end = copyTimestamp(timestamp)\n findWeekday(end, weekdays[weekdays.length - 1])\n updateFormatted(end)\n if (today) {\n updateRelative(end, today, end.hasTime)\n }\n\n return end\n}\n\nexport function getStartOfMonth (timestamp: CalendarTimestamp): CalendarTimestamp {\n const start = copyTimestamp(timestamp)\n start.day = DAY_MIN\n updateWeekday(start)\n updateFormatted(start)\n\n return start\n}\n\nexport function getEndOfMonth (timestamp: CalendarTimestamp): CalendarTimestamp {\n const end = copyTimestamp(timestamp)\n end.day = daysInMonth(end.year, end.month)\n updateWeekday(end)\n updateFormatted(end)\n\n return end\n}\n\nexport function validateTime (input: any): input is VTime {\n return (typeof input === 'number' && isFinite(input)) ||\n (!!PARSE_TIME.exec(input)) ||\n (typeof input === 'object' && isFinite(input.hour) && isFinite(input.minute))\n}\n\nexport function parseTime (input: any): number | false {\n if (typeof input === 'number') {\n // when a number is given, it's minutes since 12:00am\n return input\n } else if (typeof input === 'string') {\n // when a string is given, it's a hh:mm:ss format where seconds are optional\n const parts = PARSE_TIME.exec(input)\n if (!parts) {\n return false\n }\n\n return parseInt(parts[1]) * 60 + parseInt(parts[3] || 0)\n } else if (typeof input === 'object') {\n // when an object is given, it must have hour and minute\n if (typeof input.hour !== 'number' || typeof input.minute !== 'number') {\n return false\n }\n\n return input.hour * 60 + input.minute\n } else {\n // unsupported type\n return false\n }\n}\n\nexport function validateTimestamp (input: any): input is VTimestampInput {\n return (typeof input === 'number' && isFinite(input)) ||\n (typeof input === 'string' && !!PARSE_REGEX.exec(input)) ||\n (input instanceof Date)\n}\n\nexport function parseTimestamp (input: VTimestampInput, required?: false, now?: CalendarTimestamp): CalendarTimestamp | null\nexport function parseTimestamp (input: VTimestampInput, required: true, now?: CalendarTimestamp): CalendarTimestamp\nexport function parseTimestamp (input: VTimestampInput, required = false, now?: CalendarTimestamp): CalendarTimestamp | null {\n if (typeof input === 'number' && isFinite(input)) {\n input = new Date(input)\n }\n\n if (input instanceof Date) {\n const date: CalendarTimestamp = parseDate(input)\n\n if (now) {\n updateRelative(date, now, date.hasTime)\n }\n\n return date\n }\n\n if (typeof input !== 'string') {\n if (required) {\n throw new Error(`${input} is not a valid timestamp. It must be a Date, number of seconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`)\n }\n return null\n }\n\n // YYYY-MM-DD hh:mm:ss\n const parts = PARSE_REGEX.exec(input)\n\n if (!parts) {\n if (required) {\n throw new Error(`${input} is not a valid timestamp. It must be a Date, number of seconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`)\n }\n\n return null\n }\n\n const timestamp: CalendarTimestamp = {\n date: input,\n time: '',\n year: parseInt(parts[1]),\n month: parseInt(parts[2]),\n day: parseInt(parts[4]) || 1,\n hour: parseInt(parts[6]) || 0,\n minute: parseInt(parts[8]) || 0,\n weekday: 0,\n hasDay: !!parts[4],\n hasTime: !!(parts[6] && parts[8]),\n past: false,\n present: false,\n future: false,\n }\n\n updateWeekday(timestamp)\n updateFormatted(timestamp)\n\n if (now) {\n updateRelative(timestamp, now, timestamp.hasTime)\n }\n\n return timestamp\n}\n\nexport function parseDate (date: Date): CalendarTimestamp {\n return updateFormatted({\n date: '',\n time: '',\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n day: date.getDate(),\n weekday: date.getDay(),\n hour: date.getHours(),\n minute: date.getMinutes(),\n hasDay: true,\n hasTime: true,\n past: false,\n present: true,\n future: false,\n })\n}\n\nexport function getDayIdentifier (timestamp: { year: number, month: number, day: number }): number {\n return timestamp.year * OFFSET_YEAR + timestamp.month * OFFSET_MONTH + timestamp.day\n}\n\nexport function getTimeIdentifier (timestamp: { hour: number, minute: number }): number {\n return timestamp.hour * OFFSET_HOUR + timestamp.minute\n}\n\nexport function getTimestampIdentifier (timestamp: CalendarTimestamp): number {\n return getDayIdentifier(timestamp) * OFFSET_TIME + getTimeIdentifier(timestamp)\n}\n\nexport function updateRelative (timestamp: CalendarTimestamp, now: CalendarTimestamp, time = false): CalendarTimestamp {\n let a = getDayIdentifier(now)\n let b = getDayIdentifier(timestamp)\n let present = a === b\n\n if (timestamp.hasTime && time && present) {\n a = getTimeIdentifier(now)\n b = getTimeIdentifier(timestamp)\n present = a === b\n }\n\n timestamp.past = b < a\n timestamp.present = present\n timestamp.future = b > a\n\n return timestamp\n}\n\nexport function isTimedless (input: VTimestampInput): input is (Date | number) {\n return (input instanceof Date) || (typeof input === 'number' && isFinite(input))\n}\n\nexport function updateHasTime (timestamp: CalendarTimestamp, hasTime: boolean, now?: CalendarTimestamp): CalendarTimestamp {\n if (timestamp.hasTime !== hasTime) {\n timestamp.hasTime = hasTime\n if (!hasTime) {\n timestamp.hour = HOUR_MAX\n timestamp.minute = MINUTE_MAX\n timestamp.time = getTime(timestamp)\n }\n if (now) {\n updateRelative(timestamp, now, timestamp.hasTime)\n }\n }\n\n return timestamp\n}\n\nexport function updateMinutes (timestamp: CalendarTimestamp, minutes: number, now?: CalendarTimestamp): CalendarTimestamp {\n timestamp.hasTime = true\n timestamp.hour = Math.floor(minutes / MINUTES_IN_HOUR)\n timestamp.minute = minutes % MINUTES_IN_HOUR\n timestamp.time = getTime(timestamp)\n if (now) {\n updateRelative(timestamp, now, true)\n }\n\n return timestamp\n}\n\nexport function updateWeekday (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.weekday = getWeekday(timestamp)\n\n return timestamp\n}\n\nexport function updateFormatted (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.time = getTime(timestamp)\n timestamp.date = getDate(timestamp)\n\n return timestamp\n}\n\nexport function getWeekday (timestamp: CalendarTimestamp): number {\n if (timestamp.hasDay) {\n const _ = Math.floor\n const k = timestamp.day\n const m = ((timestamp.month + 9) % MONTH_MAX) + 1\n const C = _(timestamp.year / 100)\n const Y = (timestamp.year % 100) - (timestamp.month <= 2 ? 1 : 0)\n\n return (((k + _(2.6 * m - 0.2) - 2 * C + Y + _(Y / 4) + _(C / 4)) % 7) + 7) % 7\n }\n\n return timestamp.weekday\n}\n\nexport function daysInMonth (year: number, month: number) {\n return isLeapYear(year) ? DAYS_IN_MONTH_LEAP[month] : DAYS_IN_MONTH[month]\n}\n\nexport function copyTimestamp (timestamp: CalendarTimestamp): CalendarTimestamp {\n const { date, time, year, month, day, weekday, hour, minute, hasDay, hasTime, past, present, future } = timestamp\n\n return { date, time, year, month, day, weekday, hour, minute, hasDay, hasTime, past, present, future }\n}\n\nexport function padNumber (x: number, length: number): string {\n let padded = String(x)\n while (padded.length < length) {\n padded = '0' + padded\n }\n\n return padded\n}\n\nexport function getDate (timestamp: CalendarTimestamp): string {\n let str = `${padNumber(timestamp.year, 4)}-${padNumber(timestamp.month, 2)}`\n\n if (timestamp.hasDay) str += `-${padNumber(timestamp.day, 2)}`\n\n return str\n}\n\nexport function getTime (timestamp: CalendarTimestamp): string {\n if (!timestamp.hasTime) {\n return ''\n }\n\n return `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`\n}\n\nexport function nextMinutes (timestamp: CalendarTimestamp, minutes: number): CalendarTimestamp {\n timestamp.minute += minutes\n while (timestamp.minute > MINUTES_IN_HOUR) {\n timestamp.minute -= MINUTES_IN_HOUR\n timestamp.hour++\n if (timestamp.hour >= HOURS_IN_DAY) {\n nextDay(timestamp)\n timestamp.hour = FIRST_HOUR\n }\n }\n\n return timestamp\n}\n\nexport function nextDay (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.day++\n timestamp.weekday = (timestamp.weekday + 1) % DAYS_IN_WEEK\n if (timestamp.day > DAYS_IN_MONTH_MIN && timestamp.day > daysInMonth(timestamp.year, timestamp.month)) {\n timestamp.day = DAY_MIN\n timestamp.month++\n if (timestamp.month > MONTH_MAX) {\n timestamp.month = MONTH_MIN\n timestamp.year++\n }\n }\n\n return timestamp\n}\n\nexport function prevDay (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.day--\n timestamp.weekday = (timestamp.weekday + 6) % DAYS_IN_WEEK\n if (timestamp.day < DAY_MIN) {\n timestamp.month--\n if (timestamp.month < MONTH_MIN) {\n timestamp.year--\n timestamp.month = MONTH_MAX\n }\n timestamp.day = daysInMonth(timestamp.year, timestamp.month)\n }\n\n return timestamp\n}\n\nexport function relativeDays (\n timestamp: CalendarTimestamp,\n mover: CalendarTimestampOperation = nextDay,\n days = 1\n): CalendarTimestamp {\n while (--days >= 0) mover(timestamp)\n\n return timestamp\n}\n\nexport function diffMinutes (min: CalendarTimestamp, max: CalendarTimestamp) {\n const Y = (max.year - min.year) * 525600\n const M = (max.month - min.month) * 43800\n const D = (max.day - min.day) * 1440\n const h = (max.hour - min.hour) * 60\n const m = (max.minute - min.minute)\n\n return Y + M + D + h + m\n}\n\nexport function findWeekday (timestamp: CalendarTimestamp, weekday: number,\n mover: CalendarTimestampOperation = nextDay, maxDays = 6): CalendarTimestamp {\n while (timestamp.weekday !== weekday && --maxDays >= 0) mover(timestamp)\n\n return timestamp\n}\n\nexport function getWeekdaySkips (weekdays: number[]): number[] {\n const skips: number[] = [1, 1, 1, 1, 1, 1, 1]\n const filled: number[] = [0, 0, 0, 0, 0, 0, 0]\n for (let i = 0; i < weekdays.length; i++) {\n filled[weekdays[i]] = 1\n }\n for (let k = 0; k < DAYS_IN_WEEK; k++) {\n let skip = 1\n for (let j = 1; j < DAYS_IN_WEEK; j++) {\n const next = (k + j) % DAYS_IN_WEEK\n if (filled[next]) {\n break\n }\n skip++\n }\n skips[k] = filled[k] * skip\n }\n\n return skips\n}\n\nexport function timestampToDate (timestamp: CalendarTimestamp): Date {\n const time = `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`\n const date = timestamp.date\n\n return new Date(`${date}T${time}:00+00:00`)\n}\n\nexport function createDayList (\n start: CalendarTimestamp,\n end: CalendarTimestamp,\n now: CalendarTimestamp,\n weekdaySkips: number[],\n max = 42,\n min = 0\n): CalendarTimestamp[] {\n const stop = getDayIdentifier(end)\n const days: CalendarTimestamp[] = []\n let current = copyTimestamp(start)\n let currentIdentifier = 0\n let stopped = currentIdentifier === stop\n\n if (stop < getDayIdentifier(start)) {\n throw new Error('End date is earlier than start date.')\n }\n\n while ((!stopped || days.length < min) && days.length < max) {\n currentIdentifier = getDayIdentifier(current)\n stopped = stopped || currentIdentifier === stop\n if (weekdaySkips[current.weekday] === 0) {\n current = nextDay(current)\n continue\n }\n const day = copyTimestamp(current)\n updateFormatted(day)\n updateRelative(day, now)\n days.push(day)\n current = relativeDays(current, nextDay, weekdaySkips[current.weekday])\n }\n\n if (!days.length) throw new Error('No dates found using specified start date, end date, and weekdays.')\n\n return days\n}\n\nexport function createIntervalList (timestamp: CalendarTimestamp, first: number,\n minutes: number, count: number, now?: CalendarTimestamp): CalendarTimestamp[] {\n const intervals: CalendarTimestamp[] = []\n\n for (let i = 0; i < count; i++) {\n const mins = first + (i * minutes)\n const int = copyTimestamp(timestamp)\n intervals.push(updateMinutes(int, mins, now))\n }\n\n return intervals\n}\n\nexport function createNativeLocaleFormatter (locale: string, getOptions: CalendarTimestampFormatOptions): CalendarFormatter {\n const emptyFormatter: CalendarFormatter = (_t, _s) => ''\n\n if (typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return emptyFormatter\n }\n\n return (timestamp, short) => {\n try {\n const intlFormatter = new Intl.DateTimeFormat(locale || undefined, getOptions(timestamp, short))\n\n return intlFormatter.format(timestampToDate(timestamp))\n } catch (e) {\n return ''\n }\n }\n}\n"],"sourceRoot":""}