{"version":3,"sources":["webpack:///../../../src/components/VToolbar/index.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/util/parser.ts","webpack:///../../../src/components/VCalendar/VCalendarCategory.ts","webpack:///../../../src/components/VCalendar/VCalendar.ts"],"names":["VToolbarTitle","createSimpleFunctional","VToolbarItems","VToolbar","Vue","extend","name","props","now","type","String","validator","validateTimestamp","data","times","parseTimestamp","today","computed","parsedNow","this","watch","created","updateTimes","setPresent","methods","present","past","future","getNow","updateDay","updateTime","parseDate","Date","target","date","year","month","day","weekday","time","hour","minute","MILLIS_IN_DAY","getVisuals","events","minStart","visuals","map","event","columnCount","column","left","width","sort","a","b","Math","max","startTimestampIdentifier","endTimestampIdentifier","hasOverlap","s0","e0","s1","e1","exclude","setColumnCount","groups","forEach","group","groupVisual","length","getRange","getDayRange","startIdentifier","endIdentifier","getNormalizedRange","dayStart","min","getOpenGroup","start","end","timed","i","intersected","k","groupStart","groupEnd","getOverlapGroupHandler","firstWeekday","handler","reset","dayEvents","getTimestampIdentifier","visual","targetGroup","push","FULL_WIDTH","DEFAULT_OFFSET","WIDTH_MULTIPLIER","stack","overlapThreshold","getGroups","nodes","child","getNode","index","getNextIndex","parent","getParent","sibling","addTime","children","getOverlappingRange","grand","grandNext","calculateBounds","node","columns","getMaxChildIndex","spaceLeft","spaceWidth","offset","columnWidthMultiplier","getColumnWidthMultiplier","columnOffset","columnWidth","hasFullWidth","maxColumn","minColumn","reduce","c","getOverlappingIndices","indices","other","indexMin","indexMax","returnFirstColumn","overlapping","first","n","filter","added","childMax","identifier","minutes","removeMinutes","totalMinutes","addHours","floor","addMinutes","CalendarEventOverlapModes","base","Number","validate","default","weekdays","Array","validateWeekdays","hideHeader","Boolean","shortWeekdays","weekdayFormat","Function","dayFormat","intervals","maxDays","shortIntervals","intervalHeight","validateNumber","intervalWidth","intervalMinutes","firstInterval","firstTime","Object","validateTime","intervalCount","intervalFormat","intervalStyle","showIntervalLabel","weeks","localeFirstDayOfYear","minWeeks","shortMonths","showMonthOnFirst","showWeek","monthFormat","calendar","value","category","categories","categoryText","categoryHideDynamic","categoryShowAll","categoryForInvalid","categoryDays","x","isFinite","parseInt","eventStart","eventEnd","eventTimed","eventCategory","eventHeight","eventColor","eventTextColor","eventName","eventOverlapThreshold","eventOverlapMode","mode","eventMore","eventMoreText","eventRipple","eventMarginBottom","input","split","isArray","ints","DAYS_IN_WEEK","visited","wrapped","d","mixins","Colorable","Localable","Mouse","Themeable","Times","directives","Resize","parsedWeekdays","weekdaySkips","getWeekdaySkips","weekdaySkipsReverse","reversed","slice","reverse","parsedStart","parsedEnd","days","createDayList","dayFormatter","options","timeZone","createNativeLocaleFormatter","currentLocale","_tms","_short","weekdayFormatter","longOptions","shortOptions","short","getRelativeClasses","timestamp","outside","getStartOfWeek","getEndOfWeek","getFormatter","locale","parseEvent","startProperty","endProperty","startInput","endInput","startParsed","endParsed","isTimedless","updateHasTime","getDayIdentifier","endOffset","hasTime","allDay","isEventOn","dayIdentifier","isEventHiddenOn","isEventStart","isEventOverlapping","WIDTH_FULL","WIDTH_START","MINUTES_IN_DAY","CalendarBase","ripple","noEvents","parsedEvents","parsedEventOverlapThreshold","eventTimedFunction","eventCategoryFunction","eventTextColorFunction","eventNameFunction","timedEvent","eventModeFunction","eventWeekdays","categoryMode","eventColorFunction","e","color","formatTime","withTime","ampm","formatter","undefined","updateEventVisibility","eventsMap","getEventsMap","more","parentBounds","getBoundingClientRect","last","eventsSorted","bottom","hidden","hide","style","display","innerHTML","$vuetify","lang","t","elements","$refs","el","getAttribute","parentElement","genDayEvent","week","weekdayIdentifier","scope","eventParsed","genEvent","staticClass","class","height","attrs","key","ref","refInFor","genTimedEvent","timeDelta","top","timeToY","scopeInput","slot","$scopedSlots","text","background","overlapsNoon","singline","diffMinutes","timeSummary","eventSummary","delimiter","$createElement","setTextColor","setBackgroundColor","on","getDefaultMouseEventHandlers","nativeEvent","_a","genName","genPlaceholder","genMore","getVisibleEvents","isEventForCategory","categoryName","getEventsForDay","getEventsForDayAll","getEventsForDayTimed","getScopedSlots","isNode","getSlotChildren","getter","mapper","mapped","slots","slotDay","slotDayHeader","slotDayBody","concat","classes","themeClasses","parsedMinWeeks","minDays","MAX_SAFE_INTEGER","todayWeek","monthFormatter","isOutside","genHead","role","genHeadDays","header","genHeadDay","unshift","genWeeks","weekDays","genWeek","getWeekNumber","weekNumber","weekNodes","genDay","genWeekNumber","determineDay","genDayLabel","getSlot","genDayLabelButton","hasMonth","VBtn","fab","depressed","small","getMouseEventHandlers","stop","prevent","result","genDayMonth","render","h","dragstart","preventDefault","VCalendarWeekly","getStartOfMonth","getEndOfMonth","parsedFirstInterval","parsedIntervalMinutes","parsedIntervalCount","parsedIntervalHeight","parseFloat","parsedFirstTime","parseTime","firstMinute","bodyHeight","count","createIntervalList","intervalFormatter","shortHourOptions","tms","showIntervalLabelDefault","interval","isFirst","intervalStyleDefault","_interval","getTimestampAtEvent","copyTimestamp","bounds","currentTarget","baseMinutes","touchEvent","mouseEvent","touches","changedTouches","clientY","addIntervals","updateMinutes","getSlotScope","minutesToPixels","scrollToTime","y","pane","scrollArea","scrollTop","clamp","gap","CalendarWithIntervals","scrollPush","mounted","init","$nextTick","onResize","getScrollPush","area","offsetWidth","marginRight","genHeadIntervals","convertToUnit","genHeadWeekday","genHeadDayLabel","genDayHeader","genHeadDayButton","genBody","genScrollArea","genPane","genDayContainer","genBodyIntervals","genDays","genDayIntervals","genDayBody","genDayInterval","styler","genIntervalLabels","genIntervalLabel","shower","show","label","modifiers","quiet","parsedCategoryText","getParsedCategories","VCalendarDaily","parsedCategories","genDayHeaderCategory","getCategoryScope","cat","headerTitle","genDayHeaderCategoryTitle","j","fill","v","categoryIndex","genDayBodyCategory","CalendarWithEvents","lastStart","lastEnd","parsedValue","parsedCategoryDays","renderProps","around","component","VCalendarMonthly","relativeDays","nextDay","updateFormatted","VCalendarCategory","getCategoryList","Error","title","spanYears","spanMonths","monthShortFormatter","monthLongFormatter","checkChange","updated","window","requestAnimationFrame","$emit","move","amount","moved","forward","mover","prevDay","limit","DAYS_IN_MONTH_MAX","DAY_MIN","updateWeekday","updateRelative","timestampToDate","getTime","next","prev","$children","required","categoryMap","categoryLength","ev","hasOwnProperty","$props","$listeners","click:date","scopedSlots"],"mappings":"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","file":"js/TestDrive~activities.fe6ccb16.js","sourcesContent":["// Components\nimport VToolbar from './VToolbar'\n\n// Utilities\nimport { createSimpleFunctional } from '../../util/helpers'\n\nconst VToolbarTitle = createSimpleFunctional('v-toolbar__title')\nconst VToolbarItems = createSimpleFunctional('v-toolbar__items')\n\nexport {\n VToolbar,\n VToolbarItems,\n VToolbarTitle,\n}\n\nexport default {\n $_vuetify_subcomponents: {\n VToolbar,\n VToolbarItems,\n VToolbarTitle,\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, CalendarCategoryTextFunction, CalendarCategory } 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] as PropType,\n default: '',\n },\n categoryText: {\n type: [String, Function] as PropType,\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 '../../../mixins/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 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 && dayIdentifier <= event.endIdentifier\n}\n\nexport function isEventHiddenOn (event: CalendarEventParsed, day: CalendarTimestamp): boolean {\n return event.end.time === '00:00' && event.end.date === day.date && event.start.date !== day.date\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// 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 isEventHiddenOn,\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 CalendarCategory,\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: {\n ...props.events,\n ...props.calendar,\n ...props.category,\n },\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 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) => 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 this.type === 'category'\n },\n },\n\n methods: {\n eventColorFunction (e: CalendarEvent): string {\n return typeof this.eventColor === 'function'\n ? this.eventColor(e)\n : e.color || this.eventColor\n },\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 const eventsSorted = events.map(event => ({\n event,\n bottom: event.getBoundingClientRect().bottom,\n })).sort((a, b) => a.bottom - b.bottom)\n let hidden = 0\n\n for (let i = 0; i <= last; i++) {\n const bottom = eventsSorted[i].bottom\n const hide = i === last\n ? (bottom > parentBounds.bottom)\n : (bottom + eventHeight > parentBounds.bottom)\n\n if (hide) {\n eventsSorted[i].event.style.display = 'none'\n hidden++\n }\n }\n\n if (hidden) {\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 || isEventHiddenOn(event, day)) {\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 if (event.start.hasTime) {\n if (timedEvent) {\n const time = timeSummary()\n const delimiter = singline ? ', ' : this.$createElement('br')\n\n return this.$createElement('span', { staticClass: 'v-event-summary' }, [\n this.$createElement('strong', [name]),\n delimiter,\n time,\n ])\n } else {\n const time = formatTime(event.start, true)\n\n return this.$createElement('span', { staticClass: 'v-event-summary' }, [\n this.$createElement('strong', [time]),\n ' ',\n name,\n ])\n }\n }\n\n return this.$createElement('span', { staticClass: 'v-event-summary' }, [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): VNode {\n return this.$createElement('div', {\n staticClass: 'pl-1',\n }, [eventSummary()])\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: this.getDefaultMouseEventHandlers(':more', nativeEvent => {\n return { nativeEvent, ...day }\n }),\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: CalendarCategory): boolean {\n return !this.categoryMode ||\n (typeof category === 'object' && category.categoryName &&\n category.categoryName === event.category) ||\n (typeof event.category === 'string' && 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 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 attrs: {\n role: 'row',\n },\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 attrs: {\n role: 'columnheader',\n },\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 attrs: {\n role: 'row',\n },\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 attrs: {\n role: 'cell',\n },\n on: this.getDefaultMouseEventHandlers(':day', nativeEvent => {\n return { nativeEvent, ...day }\n }),\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 }, nativeEvent => ({ nativeEvent, ...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', nativeEvent => {\n return { nativeEvent, ...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 }, nativeEvent => {\n return { nativeEvent, ...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', nativeEvent => {\n return { nativeEvent, ...this.getSlotScope(this.getTimestampAtEvent(nativeEvent, 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\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', nativeEvent => {\n return { nativeEvent, ...this.getTimestampAtEvent(nativeEvent, 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","import { CalendarCategory, CalendarCategoryTextFunction } from 'types'\n\nexport function parsedCategoryText (\n category: CalendarCategory,\n categoryText: string | CalendarCategoryTextFunction\n): string {\n return typeof categoryText === 'string' && typeof category === 'object' && category\n ? category[categoryText]\n : typeof categoryText === 'function'\n ? categoryText(category)\n : category\n}\n\nexport function getParsedCategories (\n categories: CalendarCategory | CalendarCategory[],\n categoryText: string | CalendarCategoryTextFunction\n): CalendarCategory[] {\n if (typeof categories === 'string') return categories.split(/\\s*,\\s/)\n if (Array.isArray(categories)) {\n return categories.map((category: CalendarCategory) => {\n if (typeof category === 'string') return category\n\n const categoryName = typeof category.categoryName === 'string'\n ? category.categoryName\n : parsedCategoryText(category, categoryText)\n return { ...category, categoryName }\n })\n }\n return []\n}\n","// Styles\nimport './VCalendarCategory.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Mixins\nimport VCalendarDaily from './VCalendarDaily'\n\n// Util\nimport { convertToUnit, getSlot } from '../../util/helpers'\nimport { CalendarCategory, CalendarTimestamp } from 'types'\nimport props from './util/props'\nimport { getParsedCategories } from './util/parser'\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 (): CalendarCategory[] {\n return getParsedCategories(this.categories, this.categoryText)\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 => {\n return this.genDayHeaderCategory(day, this.getCategoryScope(scope, category))\n })\n\n return [this.$createElement('div', data, children)]\n },\n getCategoryScope (scope: any, category: CalendarCategory) {\n const cat = typeof category === 'object' && category &&\n category.categoryName === this.categoryForInvalid ? null : category\n return {\n ...scope,\n category: cat,\n }\n },\n genDayHeaderCategory (day: CalendarTimestamp, scope: any): VNode {\n const headerTitle = typeof scope.category === 'object' ? scope.category.categoryName : scope.category\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(headerTitle),\n getSlot(this, 'day-header', scope),\n ])\n },\n genDayHeaderCategoryTitle (categoryName: string | null) {\n return this.$createElement('div', {\n staticClass: 'v-calendar-category__category',\n }, categoryName === null ? this.categoryForInvalid : categoryName)\n },\n genDays (): VNode[] {\n const days: VNode[] = []\n this.days.forEach((d, j) => {\n const day = new Array(this.parsedCategories.length || 1)\n day.fill(d)\n days.push(...day.map((v, i) => this.genDay(v, j, i)))\n })\n return days\n },\n genDay (day: CalendarTimestamp, index: number, categoryIndex: number): VNode {\n const category = this.parsedCategories[categoryIndex]\n return this.$createElement('div', {\n key: day.date + '-' + categoryIndex,\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, category),\n ...this.genDayBody(day, category),\n ])\n },\n genDayIntervals (index: number, category: CalendarCategory): VNode[] {\n return this.intervals[index].map(v => this.genDayInterval(v, category))\n },\n genDayInterval (interval: CalendarTimestamp, category: CalendarCategory): 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, category }),\n },\n }\n\n const children = getSlot(this, 'interval', () =>\n this.getCategoryScope(this.getSlotScope(interval), category)\n )\n\n return this.$createElement('div', data, children)\n },\n genDayBody (day: CalendarTimestamp, category: CalendarCategory): VNode[] {\n const data = {\n staticClass: 'v-calendar-category__columns',\n }\n\n const children = [this.genDayBodyCategory(day, category)]\n\n return [this.$createElement('div', data, children)]\n },\n genDayBodyCategory (day: CalendarTimestamp, category: CalendarCategory): 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, CalendarCategory } from 'vuetify/types'\nimport { getParsedCategories } from './util/parser'\n\n// Types\ninterface VCalendarRenderProps {\n start: CalendarTimestamp\n end: CalendarTimestamp\n component: string | Component\n maxDays: number\n weekdays: number[]\n categories: CalendarCategory[]\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, 3)\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 (): CalendarCategory[] {\n return getParsedCategories(this.categories, this.categoryText)\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: CalendarCategory[]): CalendarCategory[] {\n if (!this.noEvents) {\n const categoryMap: any = categories.reduce((map: any, category, index) => {\n if (typeof category === 'object' && category.categoryName) map[category.categoryName] = { index, count: 0 }\n else if (typeof category === 'string') map[category] = { index, count: 0 }\n return map\n }, {})\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 = categories.filter((category: CalendarCategory) => {\n if (typeof category === 'object' && category.categoryName) {\n return categoryMap.hasOwnProperty(category.categoryName)\n } else if (typeof category === 'string') {\n return categoryMap.hasOwnProperty(category)\n }\n return false\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 attrs: {\n role: 'grid',\n },\n directives: [{\n modifiers: { quiet: true },\n name: 'resize',\n value: this.updateEventVisibility,\n }],\n on: {\n ...this.$listeners,\n\n 'click:date': (day: CalendarTimestamp, e?: MouseEvent) => {\n if (this.$listeners.input) {\n this.$emit('input', day.date)\n }\n if (this.$listeners['click:date']) {\n this.$emit('click:date', day, e)\n }\n },\n },\n scopedSlots: this.getScopedSlots(),\n })\n },\n})\n"],"sourceRoot":""}