{"version":3,"sources":["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"],"names":["name","methods","getDefaultMouseEventHandlers","this","getMouseEventHandlers","event","prevent","result","on","eventOptions","events","prefix","key","handler","e","mouseEvent","getEvent","Array","props","now","type","validator","data","times","today","computed","parsedNow","watch","created","setPresent","present","past","future","updateTimes","getNow","updateDay","target","updateTime","MILLIS_IN_DAY","minStart","visuals","columnCount","column","left","width","Math","a","b","exclude","s0","e0","groups","group","groupVisual","dayStart","i","intersected","hasOverlap","start","end","k","timed","getRange","getDayRange","groupStart","groupEnd","min","max","reset","getVisuals","day","dayEvents","visual","setColumnCount","targetGroup","getOpenGroup","FULL_WIDTH","DEFAULT_OFFSET","WIDTH_MULTIPLIER","firstWeekday","overlapThreshold","getOverlapGroupHandler","getGroups","nodes","child","getNode","index","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","Number","validate","default","date","weekdays","validateWeekdays","hideHeader","Boolean","shortWeekdays","weekdayFormat","dayFormat","intervals","maxDays","shortIntervals","intervalHeight","validateNumber","intervalWidth","intervalMinutes","firstInterval","firstTime","intervalCount","intervalFormat","intervalStyle","showIntervalLabel","weeks","localeFirstDayOfYear","minWeeks","shortMonths","showMonthOnFirst","showWeek","monthFormat","calendar","value","category","categories","categoryHideDynamic","categoryShowAll","categoryForInvalid","categoryDays","x","isFinite","parseInt","eventStart","eventEnd","eventTimed","eventCategory","eventHeight","eventColor","eventTextColor","eventName","eventOverlapThreshold","eventOverlapMode","mode","eventMore","eventMoreText","eventRipple","eventMarginBottom","input","ints","visited","wrapped","d","mixins","directives","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","allDay","dayIdentifier","isEventOn","WIDTH_FULL","WIDTH_START","MINUTES_IN_DAY","ripple","noEvents","length","parsedEvents","map","parsedEventOverlapThreshold","eventColorFunction","eventTimedFunction","eventCategoryFunction","eventTextColorFunction","eventNameFunction","eventModeFunction","eventWeekdays","categoryMode","parseEvent","formatTime","formatter","hour","minute","withTime","undefined","updateEventVisibility","eventsMap","more","parentBounds","last","hide","hidden","eventBounds","$vuetify","lang","t","getEventsMap","elements","$refs","el","genDayEvent","week","weekdayIdentifier","scope","eventParsed","genEvent","staticClass","class","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","filter","isEventOverlapping","isEventForCategory","getEventsForDay","isEventStart","getEventsForDayAll","getEventsForDayTimed","getScopedSlots","isNode","getSlotChildren","getter","mapper","mapped","slots","slotDay","slotDayHeader","slotDayBody","classes","parsedMinWeeks","minDays","todayWeek","monthFormatter","month","isOutside","genHead","genHeadDays","header","genHeadDay","color","genWeeks","weekDays","genWeek","getWeekNumber","weekNodes","genWeekNumber","determineDay","genDay","_e","genDayLabel","genDayLabelButton","hasMonth","VBtn","fab","depressed","small","stop","genDayMonth","render","h","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","themeClasses","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"],"mappings":"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","file":"js/chunk-3fd170c1.ea960bc4.js","sourcesContent":["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 = !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 ?? 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 ?? 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"],"sourceRoot":""}