{"version":3,"sources":["webpack:///../../../src/components/VGrid/VRow.ts","webpack:///../../../src/components/VSkeletonLoader/VSkeletonLoader.ts","webpack:///../../src/util/dateTimeUtils.ts","webpack:///../../../src/components/VGrid/VCol.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","webpack:///./src/views/kalendar.vue","webpack:///src/views/kalendar.vue","webpack:///./src/views/kalendar.vue?182a","webpack:///./src/views/kalendar.vue?3883","webpack:///../../../src/components/VBtn/index.ts","webpack:///../../../src/mixins/localable/index.ts","webpack:///./src/views/kalendar.vue?d45a","webpack:///../../../../src/components/VCalendar/util/timestamp.ts","webpack:///../../../src/mixins/mouse/index.ts"],"names":["breakpoints","ALIGNMENT","makeProps","prefix","def","reduce","props","val","alignValidator","str","includes","alignProps","type","String","default","validator","justifyValidator","justifyProps","alignContentValidator","alignContentProps","propMap","align","Object","keys","justify","alignContent","classMap","breakpointClass","prop","className","breakpoint","replace","toLowerCase","cache","Map","extend","name","functional","tag","dense","Boolean","noGutters","h","data","children","cacheKey","classList","get","forEach","value","push","set","staticClass","class","boilerplate","loading","loadingText","tile","transition","types","computed","this","isLoading","undefined","$vuetify","lang","t","role","$attrs","themeClasses","elevationClasses","$scopedSlots","actions","article","avatar","button","card","chip","heading","image","paragraph","sentences","table","text","methods","$createElement","bone","length","split","generator","genStructure","Array","from","map","rootTypes","indexOf","mapBones","genBones","genBone","on","afterEnter","resetStyles","beforeEnter","onBeforeEnter","beforeLeave","onBeforeLeave","leaveCancelled","bones","el","_initialStyle","display","style","setProperty","attrs","$listeners","classes","measurableStyles","genSkeleton","createUTCDate","year","month","day","date","Date","UTC","isFinite","getUTCFullYear","setUTCFullYear","firstWeekOffset","firstDayOfWeek","firstDayOfYear","firstWeekDayInFirstWeek","firstWeekDayOfYear","getUTCDay","dayOfYear","isLeapYear","weeksInYear","weekOffset","weekOffsetNext","daysInYear","weekNumber","localeFirstDayOfYear","week","Math","ceil","breakpointProps","Number","offsetProps","orderProps","col","offset","order","cols","alignSelf","parent","hasColClasses","some","startsWith","now","times","today","watch","parsedNow","updateTimes","setPresent","present","past","future","getNow","updateDay","updateTime","target","weekday","time","hour","minute","MILLIS_IN_DAY","getVisuals","events","minStart","visuals","event","columnCount","column","left","width","sort","a","b","max","startTimestampIdentifier","endTimestampIdentifier","hasOverlap","s0","e0","s1","e1","exclude","setColumnCount","groups","group","groupVisual","getRange","getDayRange","startIdentifier","endIdentifier","getNormalizedRange","dayStart","min","getOpenGroup","start","end","timed","i","intersected","k","groupStart","groupEnd","getOverlapGroupHandler","firstWeekday","handler","reset","dayEvents","visual","targetGroup","FULL_WIDTH","DEFAULT_OFFSET","WIDTH_MULTIPLIER","stack","overlapThreshold","getGroups","nodes","child","getNode","index","getNextIndex","getParent","sibling","addTime","getOverlappingRange","grand","grandNext","calculateBounds","node","columns","getMaxChildIndex","spaceLeft","spaceWidth","columnWidthMultiplier","getColumnWidthMultiplier","columnOffset","columnWidth","hasFullWidth","maxColumn","minColumn","c","getOverlappingIndices","indices","other","indexMin","indexMax","returnFirstColumn","overlapping","first","n","filter","added","childMax","identifier","minutes","removeMinutes","totalMinutes","addHours","floor","addMinutes","CalendarEventOverlapModes","base","validate","weekdays","validateWeekdays","hideHeader","shortWeekdays","weekdayFormat","Function","dayFormat","intervals","maxDays","shortIntervals","intervalHeight","validateNumber","intervalWidth","intervalMinutes","firstInterval","firstTime","intervalCount","intervalFormat","intervalStyle","showIntervalLabel","weeks","minWeeks","shortMonths","showMonthOnFirst","showWeek","monthFormat","calendar","category","categories","categoryText","categoryHideDynamic","categoryShowAll","categoryForInvalid","categoryDays","x","parseInt","eventStart","eventEnd","eventTimed","eventCategory","eventHeight","eventColor","eventTextColor","eventName","eventOverlapThreshold","eventOverlapMode","mode","eventMore","eventMoreText","eventRipple","eventMarginBottom","input","isArray","ints","visited","wrapped","d","mixins","directives","Resize","parsedWeekdays","reversed","weekdaySkips","slice","reverse","parsedStart","parsedEnd","options","timeZone","currentLocale","_tms","_short","longOptions","shortOptions","short","timestamp","outside","locale","parseEvent","startProperty","endProperty","startInput","endInput","startParsed","endParsed","endOffset","hasTime","allDay","isEventOn","dayIdentifier","isEventHiddenOn","isEventStart","isEventOverlapping","WIDTH_FULL","WIDTH_START","MINUTES_IN_DAY","ripple","timedEvent","e","color","eventTimedFunction","categoryMode","eventCategoryFunction","withTime","ampm","formatter","getFormatter","noEvents","eventsMap","getEventsMap","more","parentBounds","getBoundingClientRect","last","eventsSorted","bottom","hidden","hide","innerHTML","elements","$refs","getAttribute","parentElement","weekdayIdentifier","scope","eventParsed","genEvent","height","key","ref","refInFor","timeDelta","top","timeToY","scopeInput","slot","eventTextColorFunction","background","eventColorFunction","overlapsNoon","singline","parsedEventOverlapThreshold","formatTime","timeSummary","eventSummary","eventNameFunction","delimiter","setTextColor","setBackgroundColor","getDefaultMouseEventHandlers","nativeEvent","genName","days","parsedEvents","categoryName","eventWeekdays","isEventForCategory","eventModeFunction","isNode","getSlotChildren","getter","mapper","genPlaceholder","mapped","slots","slotDay","slotDayHeader","slotDayBody","getEventsForDay","genDayEvent","genMore","concat","getEventsForDayAll","getEventsForDayTimed","genTimedEvent","minDays","parsedMinWeeks","getStartOfWeek","getEndOfWeek","MAX_SAFE_INTEGER","genHeadDays","header","todayWeek","genHeadDay","unshift","isOutside","getRelativeClasses","weekdayFormatter","weekDays","genWeek","getWeekNumber","weekNodes","genDay","genWeekNumber","determineDay","genDayLabel","genDayLabelButton","hasMonth","fab","depressed","small","getMouseEventHandlers","stop","prevent","result","monthFormatter","dayFormatter","dragstart","preventDefault","genHead","genWeeks","parseFloat","parsedFirstTime","parsedFirstInterval","parsedIntervalMinutes","parsedIntervalCount","parsedIntervalHeight","firstMinute","count","shortHourOptions","tms","interval","isFirst","_interval","bounds","currentTarget","baseMinutes","touchEvent","mouseEvent","touches","changedTouches","clientY","addIntervals","minutesToPixels","y","pane","scrollArea","scrollTop","clamp","bodyHeight","gap","scrollPush","init","$nextTick","onResize","getScrollPush","area","offsetWidth","marginRight","genHeadIntervals","getSlotScope","genHeadWeekday","genHeadDayLabel","genDayHeader","genHeadDayButton","genScrollArea","genPane","genDayContainer","genBodyIntervals","genDays","getTimestampAtEvent","genDayIntervals","genDayBody","genDayInterval","styler","intervalStyleDefault","genIntervalLabels","genIntervalLabel","shower","showIntervalLabelDefault","show","label","intervalFormatter","modifiers","quiet","genBody","parsedCategoryText","getParsedCategories","parsedCategories","genDayHeaderCategory","getCategoryScope","cat","headerTitle","genDayHeaderCategoryTitle","j","fill","v","categoryIndex","genDayBodyCategory","lastStart","lastEnd","around","parsedValue","component","VCalendarMonthly","parsedCategoryDays","getCategoryList","Error","renderProps","spanYears","spanMonths","monthShortFormatter","monthLongFormatter","updateEventVisibility","checkChange","window","requestAnimationFrame","$emit","amount","moved","forward","mover","limit","getTime","move","$children","scrollToTime","required","categoryMap","categoryLength","ev","hasOwnProperty","$props","scopedSlots","getScopedSlots","staticStyle","_c","_v","_vm","fn","$event","viewDay","model","callback","expression","staticRenderFns","current","PARSE_REGEX","PARSE_TIME","DAYS_IN_MONTH","DAYS_IN_MONTH_LEAP","DAYS_IN_MONTH_MIN","DAYS_IN_MONTH_MAX","MONTH_MAX","MONTH_MIN","DAY_MIN","DAYS_IN_WEEK","MINUTES_IN_HOUR","MINUTE_MAX","HOUR_MAX","OFFSET_YEAR","OFFSET_MONTH","OFFSET_HOUR","OFFSET_TIME","copyTimestamp","findWeekday","prevDay","updateFormatted","updateRelative","getStartOfMonth","updateWeekday","getEndOfMonth","daysInMonth","validateTime","exec","parseTime","parts","validateTimestamp","parseTimestamp","parseDate","hasDay","getFullYear","getMonth","getDate","getDay","getHours","getMinutes","getDayIdentifier","getTimeIdentifier","getTimestampIdentifier","isTimedless","updateHasTime","updateMinutes","getWeekday","_","m","C","Y","padNumber","padded","nextDay","relativeDays","diffMinutes","M","D","getWeekdaySkips","skips","filled","skip","next","timestampToDate","createDayList","currentIdentifier","stopped","createIntervalList","mins","int","createNativeLocaleFormatter","getOptions","emptyFormatter","_t","_s","Intl","DateTimeFormat","intlFormatter","format","suffix","getData","eventFirst","listeners","endsWith","acc","eventOptions","passive","once","capture","buttons","stopPropagation","classSeparator","eventTargetClasses","currentTargets","document","elementsFromPoint","clientX","find","isSameNode","dispatchEvent","TouchEvent","targetTouches"],"mappings":"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","file":"js/chunk-9f48cb3c.c2b39a51.js","sourcesContent":["import './VGrid.sass'\n\nimport Vue, { PropOptions } from 'vue'\nimport mergeData from '../../util/mergeData'\nimport { upperFirst } from '../../util/helpers'\n\n// no xs\nconst breakpoints = ['sm', 'md', 'lg', 'xl']\n\nconst ALIGNMENT = ['start', 'end', 'center']\n\nfunction makeProps (prefix: string, def: () => PropOptions) {\n return breakpoints.reduce((props, val) => {\n props[prefix + upperFirst(val)] = def()\n return props\n }, {} as Dictionary)\n}\n\nconst alignValidator = (str: any) => [...ALIGNMENT, 'baseline', 'stretch'].includes(str)\nconst alignProps = makeProps('align', () => ({\n type: String,\n default: null,\n validator: alignValidator,\n}))\n\nconst justifyValidator = (str: any) => [...ALIGNMENT, 'space-between', 'space-around'].includes(str)\nconst justifyProps = makeProps('justify', () => ({\n type: String,\n default: null,\n validator: justifyValidator,\n}))\n\nconst alignContentValidator = (str: any) => [...ALIGNMENT, 'space-between', 'space-around', 'stretch'].includes(str)\nconst alignContentProps = makeProps('alignContent', () => ({\n type: String,\n default: null,\n validator: alignContentValidator,\n}))\n\nconst propMap = {\n align: Object.keys(alignProps),\n justify: Object.keys(justifyProps),\n alignContent: Object.keys(alignContentProps),\n}\n\nconst classMap = {\n align: 'align',\n justify: 'justify',\n alignContent: 'align-content',\n}\n\nfunction breakpointClass (type: keyof typeof propMap, prop: string, val: string) {\n let className = classMap[type]\n if (val == null) {\n return undefined\n }\n if (prop) {\n // alignSm -> Sm\n const breakpoint = prop.replace(type, '')\n className += `-${breakpoint}`\n }\n // .align-items-sm-center\n className += `-${val}`\n return className.toLowerCase()\n}\n\nconst cache = new Map()\n\nexport default Vue.extend({\n name: 'v-row',\n functional: true,\n props: {\n tag: {\n type: String,\n default: 'div',\n },\n dense: Boolean,\n noGutters: Boolean,\n align: {\n type: String,\n default: null,\n validator: alignValidator,\n },\n ...alignProps,\n justify: {\n type: String,\n default: null,\n validator: justifyValidator,\n },\n ...justifyProps,\n alignContent: {\n type: String,\n default: null,\n validator: alignContentValidator,\n },\n ...alignContentProps,\n },\n render (h, { props, data, children }) {\n // Super-fast memoization based on props, 5x faster than JSON.stringify\n let cacheKey = ''\n for (const prop in props) {\n cacheKey += String((props as any)[prop])\n }\n let classList = cache.get(cacheKey)\n\n if (!classList) {\n classList = []\n // Loop through `align`, `justify`, `alignContent` breakpoint props\n let type: keyof typeof propMap\n for (type in propMap) {\n propMap[type].forEach(prop => {\n const value: string = (props as any)[prop]\n const className = breakpointClass(type, prop, value)\n if (className) classList!.push(className)\n })\n }\n\n classList.push({\n 'no-gutters': props.noGutters,\n 'row--dense': props.dense,\n [`align-${props.align}`]: props.align,\n [`justify-${props.justify}`]: props.justify,\n [`align-content-${props.alignContent}`]: props.alignContent,\n })\n\n cache.set(cacheKey, classList)\n }\n\n return h(\n props.tag,\n mergeData(data, {\n staticClass: 'row',\n class: classList,\n }),\n children\n )\n },\n})\n","// Styles\nimport './VSkeletonLoader.sass'\n\n// Mixins\nimport Elevatable from '../../mixins/elevatable'\nimport Measurable from '../../mixins/measurable'\nimport Themeable from '../../mixins/themeable'\n\n// Utilities\nimport mixins from '../../util/mixins'\n\n// Types\nimport { VNode } from 'vue'\nimport { getSlot } from '../../util/helpers'\nimport { PropValidator } from 'vue/types/options'\n\nexport interface HTMLSkeletonLoaderElement extends HTMLElement {\n _initialStyle?: {\n display: string | null\n transition: string\n }\n}\n\n/* @vue/component */\nexport default mixins(\n Elevatable,\n Measurable,\n Themeable,\n).extend({\n name: 'VSkeletonLoader',\n\n props: {\n boilerplate: Boolean,\n loading: Boolean,\n loadingText: {\n type: String,\n default: '$vuetify.loading',\n },\n tile: Boolean,\n transition: String,\n type: String,\n types: {\n type: Object,\n default: () => ({}),\n } as PropValidator>,\n },\n\n computed: {\n attrs (): object {\n if (!this.isLoading) return this.$attrs\n\n return {\n 'aria-busy': !this.boilerplate ? true : undefined,\n 'aria-live': !this.boilerplate ? 'polite' : undefined,\n 'aria-label': !this.boilerplate ? this.$vuetify.lang.t(this.loadingText) : undefined,\n role: !this.boilerplate ? 'alert' : undefined,\n ...this.$attrs,\n }\n },\n classes (): object {\n return {\n 'v-skeleton-loader--boilerplate': this.boilerplate,\n 'v-skeleton-loader--is-loading': this.isLoading,\n 'v-skeleton-loader--tile': this.tile,\n ...this.themeClasses,\n ...this.elevationClasses,\n }\n },\n isLoading (): boolean {\n return !('default' in this.$scopedSlots) || this.loading\n },\n rootTypes (): Record {\n return {\n actions: 'button@2',\n article: 'heading, paragraph',\n avatar: 'avatar',\n button: 'button',\n card: 'image, card-heading',\n 'card-avatar': 'image, list-item-avatar',\n 'card-heading': 'heading',\n chip: 'chip',\n 'date-picker': 'list-item, card-heading, divider, date-picker-options, date-picker-days, actions',\n 'date-picker-options': 'text, avatar@2',\n 'date-picker-days': 'avatar@28',\n heading: 'heading',\n image: 'image',\n 'list-item': 'text',\n 'list-item-avatar': 'avatar, text',\n 'list-item-two-line': 'sentences',\n 'list-item-avatar-two-line': 'avatar, sentences',\n 'list-item-three-line': 'paragraph',\n 'list-item-avatar-three-line': 'avatar, paragraph',\n paragraph: 'text@3',\n sentences: 'text@2',\n table: 'table-heading, table-thead, table-tbody, table-tfoot',\n 'table-heading': 'heading, text',\n 'table-thead': 'heading@6',\n 'table-tbody': 'table-row-divider@6',\n 'table-row-divider': 'table-row, divider',\n 'table-row': 'table-cell@6',\n 'table-cell': 'text',\n 'table-tfoot': 'text@2, avatar@2',\n text: 'text',\n ...this.types,\n }\n },\n },\n\n methods: {\n genBone (text: string, children: VNode[]) {\n return this.$createElement('div', {\n staticClass: `v-skeleton-loader__${text} v-skeleton-loader__bone`,\n }, children)\n },\n genBones (bone: string): VNode[] {\n // e.g. 'text@3'\n const [type, length] = bone.split('@') as [string, number]\n const generator = () => this.genStructure(type)\n\n // Generate a length array based upon\n // value after @ in the bone string\n return Array.from({ length }).map(generator)\n },\n // Fix type when this is merged\n // https://github.com/microsoft/TypeScript/pull/33050\n genStructure (type?: string): any {\n let children = []\n type = type || this.type || ''\n const bone = this.rootTypes[type] || ''\n\n // End of recursion, do nothing\n /* eslint-disable-next-line no-empty, brace-style */\n if (type === bone) {}\n // Array of values - e.g. 'heading, paragraph, text@2'\n else if (type.indexOf(',') > -1) return this.mapBones(type)\n // Array of values - e.g. 'paragraph@4'\n else if (type.indexOf('@') > -1) return this.genBones(type)\n // Array of values - e.g. 'card@2'\n else if (bone.indexOf(',') > -1) children = this.mapBones(bone)\n // Array of values - e.g. 'list-item@2'\n else if (bone.indexOf('@') > -1) children = this.genBones(bone)\n // Single value - e.g. 'card-heading'\n else if (bone) children.push(this.genStructure(bone))\n\n return [this.genBone(type, children)]\n },\n genSkeleton () {\n const children = []\n\n if (!this.isLoading) children.push(getSlot(this))\n else children.push(this.genStructure())\n\n /* istanbul ignore else */\n if (!this.transition) return children\n\n /* istanbul ignore next */\n return this.$createElement('transition', {\n props: {\n name: this.transition,\n },\n // Only show transition when\n // content has been loaded\n on: {\n afterEnter: this.resetStyles,\n beforeEnter: this.onBeforeEnter,\n beforeLeave: this.onBeforeLeave,\n leaveCancelled: this.resetStyles,\n },\n }, children)\n },\n mapBones (bones: string) {\n // Remove spaces and return array of structures\n return bones.replace(/\\s/g, '').split(',').map(this.genStructure)\n },\n onBeforeEnter (el: HTMLSkeletonLoaderElement) {\n this.resetStyles(el)\n\n if (!this.isLoading) return\n\n el._initialStyle = {\n display: el.style.display,\n transition: el.style.transition,\n }\n\n el.style.setProperty('transition', 'none', 'important')\n },\n onBeforeLeave (el: HTMLSkeletonLoaderElement) {\n el.style.setProperty('display', 'none', 'important')\n },\n resetStyles (el: HTMLSkeletonLoaderElement) {\n if (!el._initialStyle) return\n\n el.style.display = el._initialStyle.display || ''\n el.style.transition = el._initialStyle.transition\n\n delete el._initialStyle\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: 'v-skeleton-loader',\n attrs: this.attrs,\n on: this.$listeners,\n class: this.classes,\n style: this.isLoading ? this.measurableStyles : undefined,\n }, [this.genSkeleton()])\n },\n})\n","function createUTCDate (year: number, month = 0, day = 1) {\n let date\n if (year < 100 && year >= 0) {\n date = new Date(Date.UTC(year, month, day))\n if (isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(year)\n }\n } else {\n date = new Date(Date.UTC(year, month, day))\n }\n\n return date\n}\n\nfunction firstWeekOffset (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const firstWeekDayInFirstWeek = 7 + firstDayOfWeek - firstDayOfYear\n const firstWeekDayOfYear = (7 + createUTCDate(year, 0, firstWeekDayInFirstWeek).getUTCDay() - firstDayOfWeek) % 7\n\n return -firstWeekDayOfYear + firstWeekDayInFirstWeek - 1\n}\n\nfunction dayOfYear (year: number, month: number, day: number, firstDayOfWeek: number) {\n let dayOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][month]\n if (month > 1 && isLeapYear(year)) {\n dayOfYear++\n }\n\n return dayOfYear + day\n}\n\nfunction weeksInYear (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, firstDayOfYear)\n const weekOffsetNext = firstWeekOffset(year + 1, firstDayOfWeek, firstDayOfYear)\n const daysInYear = isLeapYear(year) ? 366 : 365\n\n return (daysInYear - weekOffset + weekOffsetNext) / 7\n}\n\nexport function weekNumber (year: number, month: number, day: number, firstDayOfWeek: number, localeFirstDayOfYear: number): number {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, localeFirstDayOfYear)\n const week = Math.ceil((dayOfYear(year, month, day, firstDayOfWeek) - weekOffset) / 7)\n\n if (week < 1) {\n return week + weeksInYear(year - 1, firstDayOfWeek, localeFirstDayOfYear)\n } else if (week > weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)) {\n return week - weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)\n } else {\n return week\n }\n}\n\nexport function isLeapYear (year: number): boolean {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)\n}\n","import './VGrid.sass'\n\nimport Vue, { VNode, PropOptions } from 'vue'\nimport mergeData from '../../util/mergeData'\nimport { upperFirst } from '../../util/helpers'\n\n// no xs\nconst breakpoints = ['sm', 'md', 'lg', 'xl']\n\nconst breakpointProps = (() => {\n return breakpoints.reduce((props, val) => {\n props[val] = {\n type: [Boolean, String, Number],\n default: false,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst offsetProps = (() => {\n return breakpoints.reduce((props, val) => {\n props['offset' + upperFirst(val)] = {\n type: [String, Number],\n default: null,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst orderProps = (() => {\n return breakpoints.reduce((props, val) => {\n props['order' + upperFirst(val)] = {\n type: [String, Number],\n default: null,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst propMap = {\n col: Object.keys(breakpointProps),\n offset: Object.keys(offsetProps),\n order: Object.keys(orderProps),\n}\n\nfunction breakpointClass (type: keyof typeof propMap, prop: string, val: boolean | string | number) {\n let className = type\n if (val == null || val === false) {\n return undefined\n }\n if (prop) {\n const breakpoint = prop.replace(type, '')\n className += `-${breakpoint}`\n }\n // Handling the boolean style prop when accepting [Boolean, String, Number]\n // means Vue will not convert to sm: true for us.\n // Since the default is false, an empty string indicates the prop's presence.\n if (type === 'col' && (val === '' || val === true)) {\n // .col-md\n return className.toLowerCase()\n }\n // .order-md-6\n className += `-${val}`\n return className.toLowerCase()\n}\n\nconst cache = new Map()\n\nexport default Vue.extend({\n name: 'v-col',\n functional: true,\n props: {\n cols: {\n type: [Boolean, String, Number],\n default: false,\n },\n ...breakpointProps,\n offset: {\n type: [String, Number],\n default: null,\n },\n ...offsetProps,\n order: {\n type: [String, Number],\n default: null,\n },\n ...orderProps,\n alignSelf: {\n type: String,\n default: null,\n validator: (str: any) => ['auto', 'start', 'end', 'center', 'baseline', 'stretch'].includes(str),\n },\n tag: {\n type: String,\n default: 'div',\n },\n },\n render (h, { props, data, children, parent }): VNode {\n // Super-fast memoization based on props, 5x faster than JSON.stringify\n let cacheKey = ''\n for (const prop in props) {\n cacheKey += String((props as any)[prop])\n }\n let classList = cache.get(cacheKey)\n\n if (!classList) {\n classList = []\n // Loop through `col`, `offset`, `order` breakpoint props\n let type: keyof typeof propMap\n for (type in propMap) {\n propMap[type].forEach(prop => {\n const value: string | number | boolean = (props as any)[prop]\n const className = breakpointClass(type, prop, value)\n if (className) classList!.push(className)\n })\n }\n\n const hasColClasses = classList.some(className => className.startsWith('col-'))\n\n classList.push({\n // Default to .col if no other col-{bp}-* classes generated nor `cols` specified.\n col: !hasColClasses || !props.cols,\n [`col-${props.cols}`]: props.cols,\n [`offset-${props.offset}`]: props.offset,\n [`order-${props.order}`]: props.order,\n [`align-self-${props.alignSelf}`]: props.alignSelf,\n })\n\n cache.set(cacheKey, classList)\n }\n\n return h(props.tag, mergeData(data, { class: classList }), children)\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","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('v-sheet',{staticClass:\"pa-3 ma-3 mt-3 white--text gradient ml-8\",staticStyle:{\"display\":\"grid\",\"grid-template-columns\":\"1fr max-content max-content\",\"align-items\":\"center\",\"border-radius\":\"1rem\"},attrs:{\"color\":\"primary\"}},[_c('div',{staticClass:\"primary pa-2 ml-3\",staticStyle:{\"text-align\":\"center\",\"position\":\"absolute\",\"left\":\"0rem\",\"top\":\"5.5rem\",\"border-radius\":\"50%\"}},[_c('sabira_icon',{staticClass:\"pa-2\",attrs:{\"icon\":\"calendar\",\"height\":44,\"width\":44,\"fill\":\"#fff\"}})],1),_c('div',{staticClass:\"ml-10\",staticStyle:{\"display\":\"grid\"}},[_c('div',{staticStyle:{\"font-size\":\"1rem\",\"font-family\":\"'Open Sans'\",\"font-weight\":\"700\",\"color\":\"#fff\"}},[_vm._v(\"\\n KALENDAR\\n \")])]),_c('div',{staticClass:\"mr-4\"},[_vm._v(\"Zapisi: \"+_vm._s(_vm.events.length))]),_c('v-tooltip',{attrs:{\"left\":\"\",\"color\":\"#e9c46a\",\"open-on-hover\":\"\",\"open-delay\":\"150\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on, attrs }){return [_c('v-btn',_vm._g(_vm._b({attrs:{\"color\":\"transparent\",\"depressed\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.new_item()}}},'v-btn',attrs,false),on),[_c('sabira_icon',{attrs:{\"icon\":\"plus\",\"strokewidth\":3,\"width\":34,\"height\":34,\"fill\":\"white\"}})],1)]}}])},[_c('span',[_vm._v(\"Novi događaj\")])])],1),_c('v-card',{staticClass:\"ma-4\",staticStyle:{\"border-radius\":\"1rem\"},attrs:{\"flat\":\"\",\"color\":\"tertiary\"}},[_c('v-card-text',[(_vm.is_loading)?_c('v-card',{attrs:{\"flat\":\"\"}},[_c('v-skeleton-loader',{attrs:{\"type\":\"table, list-item@6\"}})],1):_vm._e(),_c('v-row',{staticClass:\"fill-height\"},[_c('v-col',[_c('v-sheet',{attrs:{\"height\":\"64\"}},[_c('v-toolbar',{attrs:{\"flat\":\"\"}},[_c('v-btn',{staticClass:\"mr-4\",attrs:{\"outlined\":\"\",\"color\":\"grey darken-2\"},on:{\"click\":_vm.setToday}},[_vm._v(\"\\n Danas\\n \")]),_c('v-btn',{attrs:{\"fab\":\"\",\"text\":\"\",\"small\":\"\",\"color\":\"grey darken-2\"},on:{\"click\":_vm.prev}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"\\n mdi-chevron-left\\n \")])],1),_c('v-btn',{attrs:{\"fab\":\"\",\"text\":\"\",\"small\":\"\",\"color\":\"grey darken-2\"},on:{\"click\":_vm.next}},[_c('v-icon',{attrs:{\"small\":\"\"}},[_vm._v(\"\\n mdi-chevron-right\\n \")])],1),(_vm.$refs.calendar)?_c('v-toolbar-title',[_vm._v(\"\\n \"+_vm._s(_vm.$refs.calendar.title)+\"\\n \")]):_vm._e(),_c('v-spacer'),_c('v-menu',{attrs:{\"bottom\":\"\",\"right\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function({ on, attrs }){return [_c('v-btn',_vm._g(_vm._b({attrs:{\"outlined\":\"\",\"color\":\"grey darken-2\"}},'v-btn',attrs,false),on),[_c('span',[_vm._v(_vm._s(_vm.typeToLabel[_vm.type]))]),_c('v-icon',{attrs:{\"right\":\"\"}},[_vm._v(\"\\n mdi-menu-down\\n \")])],1)]}}])},[_c('v-list',[_c('v-list-item',{on:{\"click\":function($event){_vm.type = 'day'}}},[_c('v-list-item-title',[_vm._v(\"Dan\")])],1),_c('v-list-item',{on:{\"click\":function($event){_vm.type = 'week'}}},[_c('v-list-item-title',[_vm._v(\"Sedmica\")])],1),_c('v-list-item',{on:{\"click\":function($event){_vm.type = 'month'}}},[_c('v-list-item-title',[_vm._v(\"Mjesec\")])],1),_c('v-list-item',{on:{\"click\":function($event){_vm.type = '4day'}}},[_c('v-list-item-title',[_vm._v(\"4 dana\")])],1)],1)],1)],1)],1),_c('v-sheet',{attrs:{\"height\":\"600\"}},[_c('v-calendar',{ref:\"calendar\",attrs:{\"interval-minutes\":60,\"weekdays\":_vm.weekday,\"events\":_vm.events,\"type\":_vm.type,\"show-week\":\"\",\"locale\":\"sr-latn\"},on:{\"click:event\":function($event){return _vm.open_item($event)},\"click:more\":_vm.viewDay,\"click:date\":_vm.viewDay,\"change\":_vm.getEvents},model:{value:(_vm.focus),callback:function ($$v) {_vm.focus=$$v},expression:\"focus\"}})],1)],1)],1)],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./kalendar.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./kalendar.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./kalendar.vue?vue&type=template&id=091d949d&scoped=true\"\nimport script from \"./kalendar.vue?vue&type=script&lang=js\"\nexport * from \"./kalendar.vue?vue&type=script&lang=js\"\nimport style0 from \"./kalendar.vue?vue&type=style&index=0&id=091d949d&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"091d949d\",\n null\n \n)\n\nexport default component.exports","import VBtn from './VBtn'\n\nexport { VBtn }\nexport default VBtn\n","import Vue from 'vue'\n\nexport default Vue.extend({\n name: 'localable',\n\n props: {\n locale: String,\n },\n\n computed: {\n currentLocale (): string {\n return this.locale || this.$vuetify.lang.current\n },\n },\n})\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./kalendar.vue?vue&type=style&index=0&id=091d949d&prod&scoped=true&lang=css\"","import { CalendarTimestamp, CalendarFormatter } from 'vuetify/types'\nimport { isLeapYear } from '../../../util/dateTimeUtils'\n\nexport const PARSE_REGEX = /^(\\d{4})-(\\d{1,2})(-(\\d{1,2}))?([^\\d]+(\\d{1,2}))?(:(\\d{1,2}))?(:(\\d{1,2}))?$/\nexport const PARSE_TIME = /(\\d\\d?)(:(\\d\\d?)|)(:(\\d\\d?)|)/\n\nexport const DAYS_IN_MONTH: number[] = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nexport const DAYS_IN_MONTH_LEAP: number[] = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\nexport const DAYS_IN_MONTH_MIN = 28\nexport const DAYS_IN_MONTH_MAX = 31\nexport const MONTH_MAX = 12\nexport const MONTH_MIN = 1\nexport const DAY_MIN = 1\nexport const DAYS_IN_WEEK = 7\nexport const MINUTES_IN_HOUR = 60\nexport const MINUTE_MAX = 59\nexport const MINUTES_IN_DAY = 24 * 60\nexport const HOURS_IN_DAY = 24\nexport const HOUR_MAX = 23\nexport const FIRST_HOUR = 0\nexport const OFFSET_YEAR = 10000\nexport const OFFSET_MONTH = 100\nexport const OFFSET_HOUR = 100\nexport const OFFSET_TIME = 10000\n\ntype CalendarTimestampFormatOptions = (timestamp: CalendarTimestamp, short: boolean) => object\ntype CalendarTimestampOperation = (timestamp: CalendarTimestamp) => CalendarTimestamp\nexport type VTime = number | string | {\n hour: number\n minute: number\n}\n\nexport type VTimestampInput = number | string | Date;\n\nexport function getStartOfWeek (timestamp: CalendarTimestamp, weekdays: number[], today?: CalendarTimestamp): CalendarTimestamp {\n const start = copyTimestamp(timestamp)\n findWeekday(start, weekdays[0], prevDay)\n updateFormatted(start)\n if (today) {\n updateRelative(start, today, start.hasTime)\n }\n\n return start\n}\n\nexport function getEndOfWeek (timestamp: CalendarTimestamp, weekdays: number[], today?: CalendarTimestamp): CalendarTimestamp {\n const end = copyTimestamp(timestamp)\n findWeekday(end, weekdays[weekdays.length - 1])\n updateFormatted(end)\n if (today) {\n updateRelative(end, today, end.hasTime)\n }\n\n return end\n}\n\nexport function getStartOfMonth (timestamp: CalendarTimestamp): CalendarTimestamp {\n const start = copyTimestamp(timestamp)\n start.day = DAY_MIN\n updateWeekday(start)\n updateFormatted(start)\n\n return start\n}\n\nexport function getEndOfMonth (timestamp: CalendarTimestamp): CalendarTimestamp {\n const end = copyTimestamp(timestamp)\n end.day = daysInMonth(end.year, end.month)\n updateWeekday(end)\n updateFormatted(end)\n\n return end\n}\n\nexport function validateTime (input: any): input is VTime {\n return (typeof input === 'number' && isFinite(input)) ||\n (!!PARSE_TIME.exec(input)) ||\n (typeof input === 'object' && isFinite(input.hour) && isFinite(input.minute))\n}\n\nexport function parseTime (input: any): number | false {\n if (typeof input === 'number') {\n // when a number is given, it's minutes since 12:00am\n return input\n } else if (typeof input === 'string') {\n // when a string is given, it's a hh:mm:ss format where seconds are optional\n const parts = PARSE_TIME.exec(input)\n if (!parts) {\n return false\n }\n\n return parseInt(parts[1]) * 60 + parseInt(parts[3] || 0)\n } else if (typeof input === 'object') {\n // when an object is given, it must have hour and minute\n if (typeof input.hour !== 'number' || typeof input.minute !== 'number') {\n return false\n }\n\n return input.hour * 60 + input.minute\n } else {\n // unsupported type\n return false\n }\n}\n\nexport function validateTimestamp (input: any): input is VTimestampInput {\n return (typeof input === 'number' && isFinite(input)) ||\n (typeof input === 'string' && !!PARSE_REGEX.exec(input)) ||\n (input instanceof Date)\n}\n\nexport function parseTimestamp (input: VTimestampInput, required?: false, now?: CalendarTimestamp): CalendarTimestamp | null\nexport function parseTimestamp (input: VTimestampInput, required: true, now?: CalendarTimestamp): CalendarTimestamp\nexport function parseTimestamp (input: VTimestampInput, required = false, now?: CalendarTimestamp): CalendarTimestamp | null {\n if (typeof input === 'number' && isFinite(input)) {\n input = new Date(input)\n }\n\n if (input instanceof Date) {\n const date: CalendarTimestamp = parseDate(input)\n\n if (now) {\n updateRelative(date, now, date.hasTime)\n }\n\n return date\n }\n\n if (typeof input !== 'string') {\n if (required) {\n throw new Error(`${input} is not a valid timestamp. It must be a Date, number of milliseconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`)\n }\n return null\n }\n\n // YYYY-MM-DD hh:mm:ss\n const parts = PARSE_REGEX.exec(input)\n\n if (!parts) {\n if (required) {\n throw new Error(`${input} is not a valid timestamp. It must be a Date, number of milliseconds since Epoch, or a string in the format of YYYY-MM-DD or YYYY-MM-DD hh:mm. Zero-padding is optional and seconds are ignored.`)\n }\n\n return null\n }\n\n const timestamp: CalendarTimestamp = {\n date: input,\n time: '',\n year: parseInt(parts[1]),\n month: parseInt(parts[2]),\n day: parseInt(parts[4]) || 1,\n hour: parseInt(parts[6]) || 0,\n minute: parseInt(parts[8]) || 0,\n weekday: 0,\n hasDay: !!parts[4],\n hasTime: !!(parts[6] && parts[8]),\n past: false,\n present: false,\n future: false,\n }\n\n updateWeekday(timestamp)\n updateFormatted(timestamp)\n\n if (now) {\n updateRelative(timestamp, now, timestamp.hasTime)\n }\n\n return timestamp\n}\n\nexport function parseDate (date: Date): CalendarTimestamp {\n return updateFormatted({\n date: '',\n time: '',\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n day: date.getDate(),\n weekday: date.getDay(),\n hour: date.getHours(),\n minute: date.getMinutes(),\n hasDay: true,\n hasTime: true,\n past: false,\n present: true,\n future: false,\n })\n}\n\nexport function getDayIdentifier (timestamp: { year: number, month: number, day: number }): number {\n return timestamp.year * OFFSET_YEAR + timestamp.month * OFFSET_MONTH + timestamp.day\n}\n\nexport function getTimeIdentifier (timestamp: { hour: number, minute: number }): number {\n return timestamp.hour * OFFSET_HOUR + timestamp.minute\n}\n\nexport function getTimestampIdentifier (timestamp: CalendarTimestamp): number {\n return getDayIdentifier(timestamp) * OFFSET_TIME + getTimeIdentifier(timestamp)\n}\n\nexport function updateRelative (timestamp: CalendarTimestamp, now: CalendarTimestamp, time = false): CalendarTimestamp {\n let a = getDayIdentifier(now)\n let b = getDayIdentifier(timestamp)\n let present = a === b\n\n if (timestamp.hasTime && time && present) {\n a = getTimeIdentifier(now)\n b = getTimeIdentifier(timestamp)\n present = a === b\n }\n\n timestamp.past = b < a\n timestamp.present = present\n timestamp.future = b > a\n\n return timestamp\n}\n\nexport function isTimedless (input: VTimestampInput): input is (Date | number) {\n return (input instanceof Date) || (typeof input === 'number' && isFinite(input))\n}\n\nexport function updateHasTime (timestamp: CalendarTimestamp, hasTime: boolean, now?: CalendarTimestamp): CalendarTimestamp {\n if (timestamp.hasTime !== hasTime) {\n timestamp.hasTime = hasTime\n if (!hasTime) {\n timestamp.hour = HOUR_MAX\n timestamp.minute = MINUTE_MAX\n timestamp.time = getTime(timestamp)\n }\n if (now) {\n updateRelative(timestamp, now, timestamp.hasTime)\n }\n }\n\n return timestamp\n}\n\nexport function updateMinutes (timestamp: CalendarTimestamp, minutes: number, now?: CalendarTimestamp): CalendarTimestamp {\n timestamp.hasTime = true\n timestamp.hour = Math.floor(minutes / MINUTES_IN_HOUR)\n timestamp.minute = minutes % MINUTES_IN_HOUR\n timestamp.time = getTime(timestamp)\n if (now) {\n updateRelative(timestamp, now, true)\n }\n\n return timestamp\n}\n\nexport function updateWeekday (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.weekday = getWeekday(timestamp)\n\n return timestamp\n}\n\nexport function updateFormatted (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.time = getTime(timestamp)\n timestamp.date = getDate(timestamp)\n\n return timestamp\n}\n\nexport function getWeekday (timestamp: CalendarTimestamp): number {\n if (timestamp.hasDay) {\n const _ = Math.floor\n const k = timestamp.day\n const m = ((timestamp.month + 9) % MONTH_MAX) + 1\n const C = _(timestamp.year / 100)\n const Y = (timestamp.year % 100) - (timestamp.month <= 2 ? 1 : 0)\n\n return (((k + _(2.6 * m - 0.2) - 2 * C + Y + _(Y / 4) + _(C / 4)) % 7) + 7) % 7\n }\n\n return timestamp.weekday\n}\n\nexport function daysInMonth (year: number, month: number) {\n return isLeapYear(year) ? DAYS_IN_MONTH_LEAP[month] : DAYS_IN_MONTH[month]\n}\n\nexport function copyTimestamp (timestamp: CalendarTimestamp): CalendarTimestamp {\n const { date, time, year, month, day, weekday, hour, minute, hasDay, hasTime, past, present, future } = timestamp\n\n return { date, time, year, month, day, weekday, hour, minute, hasDay, hasTime, past, present, future }\n}\n\nexport function padNumber (x: number, length: number): string {\n let padded = String(x)\n while (padded.length < length) {\n padded = '0' + padded\n }\n\n return padded\n}\n\nexport function getDate (timestamp: CalendarTimestamp): string {\n let str = `${padNumber(timestamp.year, 4)}-${padNumber(timestamp.month, 2)}`\n\n if (timestamp.hasDay) str += `-${padNumber(timestamp.day, 2)}`\n\n return str\n}\n\nexport function getTime (timestamp: CalendarTimestamp): string {\n if (!timestamp.hasTime) {\n return ''\n }\n\n return `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`\n}\n\nexport function nextMinutes (timestamp: CalendarTimestamp, minutes: number): CalendarTimestamp {\n timestamp.minute += minutes\n while (timestamp.minute > MINUTES_IN_HOUR) {\n timestamp.minute -= MINUTES_IN_HOUR\n timestamp.hour++\n if (timestamp.hour >= HOURS_IN_DAY) {\n nextDay(timestamp)\n timestamp.hour = FIRST_HOUR\n }\n }\n\n return timestamp\n}\n\nexport function nextDay (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.day++\n timestamp.weekday = (timestamp.weekday + 1) % DAYS_IN_WEEK\n if (timestamp.day > DAYS_IN_MONTH_MIN && timestamp.day > daysInMonth(timestamp.year, timestamp.month)) {\n timestamp.day = DAY_MIN\n timestamp.month++\n if (timestamp.month > MONTH_MAX) {\n timestamp.month = MONTH_MIN\n timestamp.year++\n }\n }\n\n return timestamp\n}\n\nexport function prevDay (timestamp: CalendarTimestamp): CalendarTimestamp {\n timestamp.day--\n timestamp.weekday = (timestamp.weekday + 6) % DAYS_IN_WEEK\n if (timestamp.day < DAY_MIN) {\n timestamp.month--\n if (timestamp.month < MONTH_MIN) {\n timestamp.year--\n timestamp.month = MONTH_MAX\n }\n timestamp.day = daysInMonth(timestamp.year, timestamp.month)\n }\n\n return timestamp\n}\n\nexport function relativeDays (\n timestamp: CalendarTimestamp,\n mover: CalendarTimestampOperation = nextDay,\n days = 1\n): CalendarTimestamp {\n while (--days >= 0) mover(timestamp)\n\n return timestamp\n}\n\nexport function diffMinutes (min: CalendarTimestamp, max: CalendarTimestamp) {\n const Y = (max.year - min.year) * 525600\n const M = (max.month - min.month) * 43800\n const D = (max.day - min.day) * 1440\n const h = (max.hour - min.hour) * 60\n const m = (max.minute - min.minute)\n\n return Y + M + D + h + m\n}\n\nexport function findWeekday (timestamp: CalendarTimestamp, weekday: number,\n mover: CalendarTimestampOperation = nextDay, maxDays = 6): CalendarTimestamp {\n while (timestamp.weekday !== weekday && --maxDays >= 0) mover(timestamp)\n\n return timestamp\n}\n\nexport function getWeekdaySkips (weekdays: number[]): number[] {\n const skips: number[] = [1, 1, 1, 1, 1, 1, 1]\n const filled: number[] = [0, 0, 0, 0, 0, 0, 0]\n for (let i = 0; i < weekdays.length; i++) {\n filled[weekdays[i]] = 1\n }\n for (let k = 0; k < DAYS_IN_WEEK; k++) {\n let skip = 1\n for (let j = 1; j < DAYS_IN_WEEK; j++) {\n const next = (k + j) % DAYS_IN_WEEK\n if (filled[next]) {\n break\n }\n skip++\n }\n skips[k] = filled[k] * skip\n }\n\n return skips\n}\n\nexport function timestampToDate (timestamp: CalendarTimestamp): Date {\n const time = `${padNumber(timestamp.hour, 2)}:${padNumber(timestamp.minute, 2)}`\n const date = timestamp.date\n\n return new Date(`${date}T${time}:00+00:00`)\n}\n\nexport function createDayList (\n start: CalendarTimestamp,\n end: CalendarTimestamp,\n now: CalendarTimestamp,\n weekdaySkips: number[],\n max = 42,\n min = 0\n): CalendarTimestamp[] {\n const stop = getDayIdentifier(end)\n const days: CalendarTimestamp[] = []\n let current = copyTimestamp(start)\n let currentIdentifier = 0\n let stopped = currentIdentifier === stop\n\n if (stop < getDayIdentifier(start)) {\n throw new Error('End date is earlier than start date.')\n }\n\n while ((!stopped || days.length < min) && days.length < max) {\n currentIdentifier = getDayIdentifier(current)\n stopped = stopped || currentIdentifier === stop\n if (weekdaySkips[current.weekday] === 0) {\n current = nextDay(current)\n continue\n }\n const day = copyTimestamp(current)\n updateFormatted(day)\n updateRelative(day, now)\n days.push(day)\n current = relativeDays(current, nextDay, weekdaySkips[current.weekday])\n }\n\n if (!days.length) throw new Error('No dates found using specified start date, end date, and weekdays.')\n\n return days\n}\n\nexport function createIntervalList (timestamp: CalendarTimestamp, first: number,\n minutes: number, count: number, now?: CalendarTimestamp): CalendarTimestamp[] {\n const intervals: CalendarTimestamp[] = []\n\n for (let i = 0; i < count; i++) {\n const mins = first + (i * minutes)\n const int = copyTimestamp(timestamp)\n intervals.push(updateMinutes(int, mins, now))\n }\n\n return intervals\n}\n\nexport function createNativeLocaleFormatter (locale: string, getOptions: CalendarTimestampFormatOptions): CalendarFormatter {\n const emptyFormatter: CalendarFormatter = (_t, _s) => ''\n\n if (typeof Intl === 'undefined' || typeof Intl.DateTimeFormat === 'undefined') {\n return emptyFormatter\n }\n\n return (timestamp, short) => {\n try {\n const intlFormatter = new Intl.DateTimeFormat(locale || undefined, getOptions(timestamp, short))\n\n return intlFormatter.format(timestampToDate(timestamp))\n } catch (e) {\n return ''\n }\n }\n}\n","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, getData: MouseHandler, eventFirst = false): MouseEventsMap {\n const listeners = Object.keys(this.$listeners)\n .filter(key => key.endsWith(suffix))\n .reduce((acc, key) => {\n acc[key] = { event: key.slice(0, -suffix.length) }\n return acc\n }, {} as MouseEvents)\n\n return this.getMouseEventHandlers({\n ...listeners,\n ['contextmenu' + suffix]: { event: 'contextmenu', prevent: true, result: false },\n }, getData, eventFirst)\n },\n getMouseEventHandlers (events: MouseEvents, getData: MouseHandler, eventFirst = false): 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\n // Due to TouchEvent target always returns the element that is first placed\n // Even if touch point has since moved outside the interactive area of that element\n // Ref: https://developer.mozilla.org/en-US/docs/Web/API/Touch/target\n // This block of code aims to make sure touchEvent is always dispatched from the element that is being pointed at\n if (e && 'touches' in e) {\n const classSeparator = ' '\n\n const eventTargetClasses = (e.currentTarget as HTMLElement)?.className.split(classSeparator)\n const currentTargets = document.elementsFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY)\n\n // Get \"the same kind\" current hovering target by checking\n // If element has the same class of initial touch start element (which has touch event listener registered)\n const currentTarget = currentTargets.find(t => t.className.split(classSeparator).some(c => eventTargetClasses.includes(c)))\n\n if (currentTarget &&\n !(e.target as HTMLElement)?.isSameNode(currentTarget)\n ) {\n currentTarget.dispatchEvent(new TouchEvent(e.type, {\n changedTouches: e.changedTouches as unknown as Touch[],\n targetTouches: e.targetTouches as unknown as Touch[],\n touches: e.touches as unknown as Touch[],\n }))\n return\n }\n }\n\n // TODO: VCalendar emits the calendar event as the first argument,\n // but it really should be the native event instead so modifiers can be used\n if (eventFirst) {\n this.$emit(event, e, getData(e))\n } else {\n this.$emit(event, getData(e), e)\n }\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"],"sourceRoot":""}