ported to luxon library
This commit is contained in:
@@ -3,9 +3,10 @@ import type { Moment } from 'moment';
|
||||
import Calendar from './calendar/Calendar.vue'
|
||||
import { Event } from '~/utils/event';
|
||||
import { UCard } from '#components';
|
||||
import type { DateTime } from 'luxon';
|
||||
|
||||
const events = defineModel<Event[]>('events', { required: true })
|
||||
const date = defineModel<Moment>('date', { required: true })
|
||||
const date = defineModel<DateTime>('date', { required: true })
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@ import { CalendarDate } from '@internationalized/date';
|
||||
import ListItem from './ListItem.vue';
|
||||
import Title1 from './Title1.vue';
|
||||
import type { DropdownMenuItem } from '@nuxt/ui';
|
||||
import type { Moment } from 'moment';
|
||||
import moment from 'moment';
|
||||
import { DateTime } from 'luxon';
|
||||
|
||||
const colorMode = useColorMode();
|
||||
const currentTheme = ref<'dark' | 'system' | 'light'>(colorMode.preference as 'dark' | 'system' | 'light');
|
||||
@@ -56,17 +55,17 @@ const dropDownItems = computed<DropdownMenuItem[][]>(() => [
|
||||
]
|
||||
])
|
||||
|
||||
const date = defineModel<Moment>('date', { required: true })
|
||||
const date = defineModel<DateTime>('date', { required: true })
|
||||
|
||||
const selectedDate = computed({
|
||||
get() {
|
||||
return new CalendarDate(date.value.year(), date.value.month() + 1, date.value.date())
|
||||
return new CalendarDate(date.value.year, date.value.month, date.value.day)
|
||||
},
|
||||
set(value) {
|
||||
if (value === undefined) {
|
||||
return
|
||||
}
|
||||
date.value = moment(value.toString());
|
||||
date.value = DateTime.fromISO(value.toString());
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -2,20 +2,20 @@
|
||||
import { computed, ref } from 'vue';
|
||||
import CalendarHeader from './CalendarHeader.vue';
|
||||
import CalendarCollumn from './CalendarCollumn.vue';
|
||||
import moment, { type Moment } from 'moment';
|
||||
import { Event } from '~/utils/event';
|
||||
import { DateTime } from 'luxon';
|
||||
|
||||
const events = defineModel<Event[]>('events', { required: true })
|
||||
const date = defineModel<Moment>('date', { required: true })
|
||||
const date = defineModel<DateTime>('date', { required: true })
|
||||
const draggedEvent = ref<DraggedEvent | undefined>()
|
||||
|
||||
type Day = {
|
||||
date: Moment
|
||||
date: DateTime
|
||||
events: CollissionWrapper[][]
|
||||
}
|
||||
|
||||
const week = computed(() => {
|
||||
return moment(date.value).startOf('isoWeek')
|
||||
return date.value.startOf('week')
|
||||
})
|
||||
|
||||
function pushEventWithCollisionUpdate(array: CollissionWrapper[], event: Event, collisions: CollissionWrapper[], collisionCount: number) {
|
||||
@@ -28,8 +28,9 @@ function pushEventWithCollisionUpdate(array: CollissionWrapper[], event: Event,
|
||||
|
||||
const days = computed<Day[]>(() => {
|
||||
return [1, 2, 3, 4, 5, 6, 7].map((i) => {
|
||||
const currentDate = date.value.startOf('week').plus({ day: i - 1 })
|
||||
const filteredEvents = events.value.filter(
|
||||
(event) => event.from >= moment(week.value).weekday(i).startOf('day') && event.to <= moment(week.value).weekday(i).endOf('day')
|
||||
(event) => event.from >= currentDate.startOf('day') && event.to <= currentDate.endOf('day')
|
||||
)
|
||||
|
||||
const sortedEvents = filteredEvents.sort((a, b) => a.from.valueOf() - b.from.valueOf())
|
||||
@@ -62,7 +63,7 @@ const days = computed<Day[]>(() => {
|
||||
}
|
||||
|
||||
return {
|
||||
date: moment(week.value).weekday(i),
|
||||
date: currentDate,
|
||||
events: columns
|
||||
}
|
||||
})
|
||||
@@ -72,17 +73,22 @@ const emits = defineEmits<{
|
||||
(e: 'create', timespan: Event): void
|
||||
}>()
|
||||
|
||||
const hour = (num: number) => {
|
||||
return DateTime.now().startOf('day').plus({ hours: num })
|
||||
}
|
||||
|
||||
const seperators = ref<Seperator[]>([
|
||||
{ text: '3 AM', time: moment().hour(3) },
|
||||
{ text: '6 AM', time: moment().hour(6) },
|
||||
{ text: '9 AM', time: moment().hour(9) },
|
||||
{ text: '12 PM', time: moment().hour(12) },
|
||||
{ text: '3 PM', time: moment().hour(15) },
|
||||
{ text: '6 PM', time: moment().hour(18) },
|
||||
{ text: '9 PM', time: moment().hour(21) },
|
||||
{ text: '3 AM', time: hour(3) },
|
||||
{ text: '6 AM', time: hour(6) },
|
||||
{ text: '9 AM', time: hour(9) },
|
||||
{ text: '12 PM', time: hour(12) },
|
||||
{ text: '3 PM', time: hour(15) },
|
||||
{ text: '6 PM', time: hour(18) },
|
||||
{ text: '9 PM', time: hour(21) },
|
||||
])
|
||||
|
||||
function quickCreate(date: Moment, timespan: Timespan) {
|
||||
|
||||
function quickCreate(date: DateTime, timespan: Timespan) {
|
||||
const eventTitle = prompt("Event title")
|
||||
|
||||
if (eventTitle === null) {
|
||||
@@ -91,8 +97,8 @@ function quickCreate(date: Moment, timespan: Timespan) {
|
||||
|
||||
const newEvent: Event = new Event(
|
||||
eventTitle,
|
||||
moment(date).startOf('day').minutes(timespan.from * 24 * 60),
|
||||
moment(date).startOf('day').minutes(timespan.to * 24 * 60)
|
||||
date.startOf('day').plus({ minutes: timespan.from * 24 * 60 }),
|
||||
date.startOf('day').plus({ minutes: timespan.to * 24 * 60 })
|
||||
)
|
||||
|
||||
emits('create', newEvent)
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, ref, useTemplateRef } from 'vue';
|
||||
import CalendarSeperator from './CalendarSeperator.vue';
|
||||
import type { Moment } from 'moment';
|
||||
import CalendarEvent from './CalendarEvent.vue';
|
||||
import { Event } from '~/utils/event';
|
||||
import moment from 'moment';
|
||||
import type { DateTime } from 'luxon';
|
||||
|
||||
const props = defineProps<{
|
||||
seperators: Seperator[],
|
||||
day: Moment
|
||||
day: DateTime
|
||||
events: CollissionWrapper[][]
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'quick-create', day: Moment, event: EventDimensions): void,
|
||||
(e: 'quick-create', day: DateTime, event: EventDimensions): void,
|
||||
}>()
|
||||
|
||||
const isDragging = ref(false)
|
||||
@@ -58,7 +57,7 @@ function mouseup(_: MouseEvent) {
|
||||
|
||||
const timeFrom = Math.min(endY.value, startY.value) / column.value.offsetHeight
|
||||
const timeTo = Math.max(endY.value, startY.value) / column.value.offsetHeight
|
||||
emit('quick-create', moment(props.day), {
|
||||
emit('quick-create', props.day, {
|
||||
from: timeFrom,
|
||||
to: timeTo
|
||||
})
|
||||
@@ -76,7 +75,7 @@ function dragover(e: DragEvent) {
|
||||
return
|
||||
}
|
||||
|
||||
if (!draggedEvent.value.date.isSame(props.day)) {
|
||||
if (!draggedEvent.value.date.equals(props.day)) {
|
||||
draggedEvent.value.date = props.day
|
||||
}
|
||||
|
||||
@@ -94,12 +93,12 @@ function dragDrop(_: DragEvent) {
|
||||
<template>
|
||||
<div class="flex flex-col h-full grow">
|
||||
<div class="flex justify-center items-center flex-col h-18 border-b-1 border-muted">
|
||||
<div>{{ props.day.format('dd').toUpperCase() }}</div>
|
||||
<div>{{ props.day.date() }}</div>
|
||||
<div>{{ props.day.toFormat('ccc').toUpperCase() }}</div>
|
||||
<div>{{ props.day.day }}</div>
|
||||
</div>
|
||||
|
||||
<div id="col" ref="column" @mousedown="mousedown" @mouseup="mouseup" @mousemove="mouseover" @dragover="dragover"
|
||||
@dragend="dragDrop" class="relative flex flex-col grow items-center">
|
||||
@dragend="dragDrop" class="relative flex flex-col grow items-center select-none">
|
||||
<CalendarSeperator v-for="sep in seperators" :seperator="sep">
|
||||
<hr class="w-full border-muted">
|
||||
</CalendarSeperator>
|
||||
@@ -110,7 +109,7 @@ function dragDrop(_: DragEvent) {
|
||||
<CalendarEvent v-for="event in column" :event="event" :columnIndex="index" @move="eventMove" />
|
||||
</div>
|
||||
|
||||
<div v-if="draggedEvent !== undefined && draggedEvent.date.isSame(props.day)"
|
||||
<div v-if="draggedEvent !== undefined && draggedEvent.date.equals(props.day)"
|
||||
class="absolute w-11/12 top-20 bg-black opacity-45 rounded-lg"
|
||||
:style="{ height: `${draggedEvent.height}px`, top: `${draggedEvent.top}px` }"></div>
|
||||
</div>
|
||||
|
||||
@@ -45,7 +45,7 @@ function dragStart(e: DragEvent) {
|
||||
<div class="absolute rounded-lg h-0 top-20 bg-black opacity-45 p-2 flex flex-col z-10" @mousedown.stop
|
||||
@mouseover.stop @mouseup.stop draggable="true" @dragstart="dragStart"
|
||||
:style="{ top: `${top}%`, height: `${height}%`, left: `${left}%`, width: `${widht}%` }">
|
||||
<div>{{ event.event.from.format('HH:mm') }} - {{ event.event.to.format('HH:mm') }}</div>
|
||||
<div>{{ event.event.from.toFormat('HH:mm') }} - {{ event.event.to.toFormat('HH:mm') }}</div>
|
||||
<div>{{ event.event.title }}</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import type { Moment } from 'moment';
|
||||
import type { DateTime } from 'luxon';
|
||||
|
||||
defineProps<{
|
||||
seperator: Seperator
|
||||
}>();
|
||||
|
||||
const relativePositionOf = function (time: Moment) {
|
||||
return `${(time.hours() / 24) * 100}%`
|
||||
const relativePositionOf = function (time: DateTime) {
|
||||
return `${((time.hour) / 24) * 100}%`
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user