@bagelink/vue 1.2.15 → 1.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/calendar/CalendarTypes.d.ts +13 -0
- package/dist/components/calendar/CalendarTypes.d.ts.map +1 -0
- package/dist/components/calendar/Index.vue.d.ts +39 -507
- package/dist/components/calendar/Index.vue.d.ts.map +1 -1
- package/dist/components/calendar/utils.d.ts +31 -0
- package/dist/components/calendar/utils.d.ts.map +1 -0
- package/dist/components/calendar/views/AgendaView.vue.d.ts +16 -0
- package/dist/components/calendar/views/AgendaView.vue.d.ts.map +1 -0
- package/dist/components/calendar/views/DayView.vue.d.ts +50 -0
- package/dist/components/calendar/views/DayView.vue.d.ts.map +1 -0
- package/dist/components/calendar/views/MonthView.vue.d.ts +20 -0
- package/dist/components/calendar/views/MonthView.vue.d.ts.map +1 -0
- package/dist/components/calendar/views/WeekView.vue.d.ts +33 -0
- package/dist/components/calendar/views/WeekView.vue.d.ts.map +1 -0
- package/dist/components/form/BglMultiStepForm.vue.d.ts +63 -0
- package/dist/components/form/BglMultiStepForm.vue.d.ts.map +1 -0
- package/dist/components/form/index.d.ts +1 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/DateInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/DateInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/DatePicker.vue.d.ts +3 -3
- package/dist/components/form/inputs/DatePicker.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
- package/dist/index.cjs +2166 -3870
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +2167 -3871
- package/dist/style.css +604 -628
- package/dist/utils/BagelFormUtils.d.ts +4 -2
- package/dist/utils/BagelFormUtils.d.ts.map +1 -1
- package/dist/utils/calendar/EDate.d.ts +2 -0
- package/dist/utils/calendar/EDate.d.ts.map +1 -0
- package/dist/utils/calendar/Helpers.d.ts +19 -0
- package/dist/utils/calendar/Helpers.d.ts.map +1 -0
- package/dist/utils/calendar/constants.d.ts +3 -0
- package/dist/utils/calendar/constants.d.ts.map +1 -0
- package/dist/utils/calendar/dateUtils.d.ts +30 -0
- package/dist/utils/calendar/dateUtils.d.ts.map +1 -0
- package/dist/utils/calendar/event.interface.d.ts +32 -0
- package/dist/utils/calendar/event.interface.d.ts.map +1 -0
- package/dist/utils/calendar/time.d.ts +117 -0
- package/dist/utils/calendar/time.d.ts.map +1 -0
- package/dist/utils/calendar/types.d.ts +27 -0
- package/dist/utils/calendar/types.d.ts.map +1 -0
- package/dist/utils/calendar/typings.d.ts +87 -0
- package/dist/utils/calendar/typings.d.ts.map +1 -0
- package/dist/utils/calendar/week.d.ts +117 -0
- package/dist/utils/calendar/week.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/calendar/CalendarTypes.ts +13 -0
- package/src/components/calendar/Index.vue +124 -389
- package/src/components/calendar/utils.ts +70 -0
- package/src/components/calendar/views/AgendaView.vue +263 -0
- package/src/components/calendar/views/DayView.vue +417 -0
- package/src/components/calendar/views/MonthView.vue +313 -0
- package/src/components/calendar/views/WeekView.vue +432 -0
- package/src/components/form/BglMultiStepForm.vue +323 -70
- package/src/components/form/index.ts +1 -0
- package/src/components/form/inputs/CodeEditor/Index.vue +11 -0
- package/src/components/form/inputs/DateInput.vue +3 -3
- package/src/components/form/inputs/DatePicker.vue +3 -3
- package/src/components/form/inputs/SelectInput.vue +2 -0
- package/src/components/form/inputs/Upload/upload.types.d.ts +0 -1
- package/src/index.ts +2 -2
- package/src/styles/inputs.css +138 -137
- package/src/styles/layout.css +3 -2
- package/src/styles/mobilLayout.css +4 -2
- package/src/utils/BagelFormUtils.ts +6 -2
- package/src/utils/calendar/EDate.ts +0 -0
- package/src/{components/calendar/helpers → utils/calendar}/Helpers.ts +6 -6
- package/src/utils/calendar/constants.ts +2 -0
- package/src/utils/{timeAgo.ts → calendar/dateUtils.ts} +38 -1
- package/src/utils/calendar/event.interface.ts +33 -0
- package/src/{components/calendar/helpers/Time.ts → utils/calendar/time.ts} +15 -15
- package/src/utils/calendar/types.ts +27 -0
- package/src/{components/calendar/typings/config.interface.ts → utils/calendar/typings.ts} +13 -6
- package/src/utils/calendar/week.ts +588 -0
- package/src/components/calendar/assets/base.css +0 -60
- package/src/components/calendar/components/header/Header.vue +0 -153
- package/src/components/calendar/components/month/AgendaEventTile.vue +0 -135
- package/src/components/calendar/components/month/AgendaEvents.vue +0 -72
- package/src/components/calendar/components/month/Day.vue +0 -256
- package/src/components/calendar/components/month/Event.vue +0 -164
- package/src/components/calendar/components/month/Month.vue +0 -241
- package/src/components/calendar/components/month/WeekDay.vue +0 -15
- package/src/components/calendar/components/partials/EventFlyout.vue +0 -430
- package/src/components/calendar/components/week/Day.vue +0 -198
- package/src/components/calendar/components/week/DayEvent.vue +0 -584
- package/src/components/calendar/components/week/DayTimeline.vue +0 -80
- package/src/components/calendar/components/week/FullDayEvent.vue +0 -121
- package/src/components/calendar/components/week/Week.vue +0 -414
- package/src/components/calendar/components/week/WeekTimeline.vue +0 -101
- package/src/components/calendar/constants.ts +0 -13
- package/src/components/calendar/helpers/DayIntervals.ts +0 -48
- package/src/components/calendar/helpers/EDate.ts +0 -18
- package/src/components/calendar/helpers/Errors.ts +0 -69
- package/src/components/calendar/helpers/EventChange.ts +0 -88
- package/src/components/calendar/helpers/EventConcurrency.ts +0 -69
- package/src/components/calendar/helpers/EventFlyoutPosition.ts +0 -96
- package/src/components/calendar/helpers/EventPosition.ts +0 -154
- package/src/components/calendar/helpers/EventsFilter.ts +0 -50
- package/src/components/calendar/helpers/Week.ts +0 -37
- package/src/components/calendar/language/index.ts +0 -41
- package/src/components/calendar/language/keys.ts +0 -99
- package/src/components/calendar/models/Event.ts +0 -112
- package/src/components/calendar/styles/_mixins.css +0 -21
- package/src/components/calendar/styles/_variables.css +0 -47
- package/src/components/calendar/typings/interfaces/day.interface.ts +0 -10
- package/src/components/calendar/typings/interfaces/event.interface.ts +0 -32
- package/src/components/calendar/typings/interfaces/full-day-events-week.type.ts +0 -8
- package/src/components/calendar/typings/interfaces/period.interface.ts +0 -5
- package/src/components/calendar/typings/interfaces/time-modes.ts +0 -11
- package/src/components/calendar/typings/types.ts +0 -27
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type { PropType } from 'vue'
|
|
3
|
-
import type { ConfigInterface } from '../../typings/config.interface'
|
|
4
|
-
import type { EventInterface } from '../../typings/interfaces/event.interface'
|
|
5
|
-
import type { ModeType } from '../../typings/types'
|
|
6
|
-
import { computed, onMounted, ref } from 'vue'
|
|
7
|
-
import { EVENT_COLORS } from '../../constants'
|
|
8
|
-
|
|
9
|
-
interface extendedEventInterface extends EventInterface {
|
|
10
|
-
nDays: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const props = defineProps({
|
|
14
|
-
scheduleEvent: {
|
|
15
|
-
type: Object as PropType<extendedEventInterface>,
|
|
16
|
-
default: null,
|
|
17
|
-
},
|
|
18
|
-
config: {
|
|
19
|
-
type: Object as PropType<ConfigInterface>,
|
|
20
|
-
required: true,
|
|
21
|
-
},
|
|
22
|
-
mode: {
|
|
23
|
-
type: String as PropType<ModeType>,
|
|
24
|
-
required: true,
|
|
25
|
-
},
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const emit = defineEmits(['eventWasClicked'])
|
|
29
|
-
|
|
30
|
-
const colors = EVENT_COLORS as { [key: string]: string }
|
|
31
|
-
const eventColor = ref('#fff')
|
|
32
|
-
const eventBackgroundColor = ref('')
|
|
33
|
-
const eventElementIdPrefix = 'week-timeline__event-id-'
|
|
34
|
-
|
|
35
|
-
const eventWidth = computed(() => {
|
|
36
|
-
if (props.mode !== 'day')
|
|
37
|
-
return `calc(${props.scheduleEvent.nDays * 100}%)`
|
|
38
|
-
|
|
39
|
-
return 'calc(100%)'
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
function setColors() {
|
|
43
|
-
if (
|
|
44
|
-
props.scheduleEvent.colorScheme
|
|
45
|
-
&& props.config.style?.colorSchemes
|
|
46
|
-
&& props.config.style.colorSchemes[props.scheduleEvent.colorScheme]
|
|
47
|
-
) {
|
|
48
|
-
eventColor.value = props.config.style.colorSchemes[props.scheduleEvent.colorScheme].color
|
|
49
|
-
eventBackgroundColor.value = props.config.style.colorSchemes[props.scheduleEvent.colorScheme].backgroundColor
|
|
50
|
-
return
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (props.scheduleEvent.color) {
|
|
54
|
-
eventColor.value = '#fff'
|
|
55
|
-
eventBackgroundColor.value = colors[props.scheduleEvent.color]
|
|
56
|
-
return
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
eventBackgroundColor.value = colors.blue
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function handleClickOnEvent() {
|
|
63
|
-
const eventElement = document.getElementById(
|
|
64
|
-
eventElementIdPrefix + props.scheduleEvent.id
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
emit('eventWasClicked', {
|
|
68
|
-
clickedEvent: props.scheduleEvent,
|
|
69
|
-
eventElement,
|
|
70
|
-
})
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
onMounted(() => {
|
|
74
|
-
setColors()
|
|
75
|
-
})
|
|
76
|
-
</script>
|
|
77
|
-
|
|
78
|
-
<template>
|
|
79
|
-
<div
|
|
80
|
-
v-if="scheduleEvent"
|
|
81
|
-
:id="`${eventElementIdPrefix}${scheduleEvent.id}`"
|
|
82
|
-
class="week-timeline__event is-event"
|
|
83
|
-
:style="{
|
|
84
|
-
width: eventWidth,
|
|
85
|
-
color: eventColor,
|
|
86
|
-
backgroundColor: eventBackgroundColor,
|
|
87
|
-
zIndex: 1,
|
|
88
|
-
}"
|
|
89
|
-
@click="handleClickOnEvent"
|
|
90
|
-
>
|
|
91
|
-
{{ scheduleEvent.title }}
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
<div
|
|
95
|
-
v-else
|
|
96
|
-
class="week-timeline__event"
|
|
97
|
-
/>
|
|
98
|
-
</template>
|
|
99
|
-
|
|
100
|
-
<style scoped>
|
|
101
|
-
.week-timeline__event {
|
|
102
|
-
position: relative;
|
|
103
|
-
--event-padding: 3px;
|
|
104
|
-
display: flex;
|
|
105
|
-
align-items: center;
|
|
106
|
-
height: 0.9rem;
|
|
107
|
-
width: calc(100% - var(--event-padding));
|
|
108
|
-
font-size: var(--qalendar-font-2xs);
|
|
109
|
-
border-radius: 4px;
|
|
110
|
-
padding: var(--event-padding);
|
|
111
|
-
margin-bottom: 0.25em;
|
|
112
|
-
text-align: start;
|
|
113
|
-
cursor: pointer;
|
|
114
|
-
user-select: none;
|
|
115
|
-
overflow: hidden;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.week-timeline__event:active {
|
|
119
|
-
cursor: not-allowed;
|
|
120
|
-
}
|
|
121
|
-
</style>
|
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type { PropType } from 'vue'
|
|
3
|
-
import type Time from '../../helpers/Time'
|
|
4
|
-
import type { ConfigInterface, DayIntervalsType } from '../../typings/config.interface'
|
|
5
|
-
import type { DayInterface } from '../../typings/interfaces/day.interface'
|
|
6
|
-
import type { EventInterface } from '../../typings/interfaces/event.interface'
|
|
7
|
-
import type { FullDayEventsWeek } from '../../typings/interfaces/full-day-events-week.type'
|
|
8
|
-
import type { PeriodInterface } from '../../typings/interfaces/period.interface'
|
|
9
|
-
import type { ModeType } from '../../typings/types'
|
|
10
|
-
import { ref, computed, onMounted, watch, useSlots } from 'vue'
|
|
11
|
-
import EventPosition from '../../helpers/EventPosition'
|
|
12
|
-
import { EventsFilter } from '../../helpers/EventsFilter'
|
|
13
|
-
import Helpers from '../../helpers/Helpers'
|
|
14
|
-
import { WEEK_START_DAY } from '../../helpers/Time'
|
|
15
|
-
import { WeekHelper } from '../../helpers/Week'
|
|
16
|
-
import EventFlyout from '../partials/EventFlyout.vue'
|
|
17
|
-
import Day from './Day.vue'
|
|
18
|
-
import DayTimeline from './DayTimeline.vue'
|
|
19
|
-
import WeekTimeline from './WeekTimeline.vue'
|
|
20
|
-
|
|
21
|
-
const props = defineProps({
|
|
22
|
-
config: {
|
|
23
|
-
type: Object as PropType<ConfigInterface>,
|
|
24
|
-
required: true,
|
|
25
|
-
},
|
|
26
|
-
eventsProp: {
|
|
27
|
-
type: Array as PropType<EventInterface[]>,
|
|
28
|
-
default: () => [],
|
|
29
|
-
},
|
|
30
|
-
period: {
|
|
31
|
-
type: Object as PropType<PeriodInterface>,
|
|
32
|
-
required: true,
|
|
33
|
-
},
|
|
34
|
-
modeProp: {
|
|
35
|
-
type: String as PropType<ModeType>,
|
|
36
|
-
default: 'week',
|
|
37
|
-
},
|
|
38
|
-
time: {
|
|
39
|
-
type: Object as PropType<Time | any>,
|
|
40
|
-
required: true,
|
|
41
|
-
},
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
const emit = defineEmits([
|
|
45
|
-
'eventWasClicked',
|
|
46
|
-
'eventWasResized',
|
|
47
|
-
'eventWasDragged',
|
|
48
|
-
'editEvent',
|
|
49
|
-
'deleteEvent',
|
|
50
|
-
'intervalWasClicked',
|
|
51
|
-
'dayWasClicked',
|
|
52
|
-
'datetimeWasClicked',
|
|
53
|
-
])
|
|
54
|
-
|
|
55
|
-
const eventPosition = new EventPosition()
|
|
56
|
-
|
|
57
|
-
const days = ref<DayInterface[]>([])
|
|
58
|
-
const mode = ref<ModeType>(props.modeProp)
|
|
59
|
-
const selectedEvent = ref<EventInterface | null>(null)
|
|
60
|
-
const selectedEventElement = ref<any | null>(null)
|
|
61
|
-
const events = ref<EventInterface[]>(props.eventsProp)
|
|
62
|
-
const fullDayEvents = ref<FullDayEventsWeek>([])
|
|
63
|
-
const weekVersion = ref(0)
|
|
64
|
-
const dayIntervals = ref<DayIntervalsType | any>({
|
|
65
|
-
length: 60,
|
|
66
|
-
height: 66,
|
|
67
|
-
})
|
|
68
|
-
const weekHeight = ref('1584px')
|
|
69
|
-
const currentTimePercentage = ref(0)
|
|
70
|
-
const showCurrentTime = ref(!!props.config.showCurrentTime)
|
|
71
|
-
|
|
72
|
-
const hasCustomCurrentTimeSlot = computed(() => {
|
|
73
|
-
return Helpers.hasSlotContent(useSlots().customCurrentTime)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
const nDays = computed(() => {
|
|
77
|
-
return props.config.week?.nDays || 7
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
watch(() => props.period, () => {
|
|
81
|
-
setInitialEvents(mode.value)
|
|
82
|
-
}, { deep: true })
|
|
83
|
-
|
|
84
|
-
watch(() => props.modeProp, (value) => {
|
|
85
|
-
mode.value = value
|
|
86
|
-
setInitialEvents(value)
|
|
87
|
-
}, { deep: true })
|
|
88
|
-
|
|
89
|
-
onMounted(() => {
|
|
90
|
-
setDayIntervals()
|
|
91
|
-
separateFullDayEventsFromOtherEvents()
|
|
92
|
-
setInitialEvents(props.modeProp)
|
|
93
|
-
if (props.config.showCurrentTime || hasCustomCurrentTimeSlot.value) setCurrentTime()
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
function separateFullDayEventsFromOtherEvents() {
|
|
97
|
-
const {
|
|
98
|
-
singleDayTimedEvents,
|
|
99
|
-
fullDayAndMultipleDayEvents,
|
|
100
|
-
} = WeekHelper.eventSeparator(events.value, props.time)
|
|
101
|
-
|
|
102
|
-
events.value = singleDayTimedEvents
|
|
103
|
-
positionFullDayEvents(fullDayAndMultipleDayEvents)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function positionFullDayEvents(fullDayAndMultipleDayEvents: EventInterface[]) {
|
|
107
|
-
const weekEndDate = nDays.value === 5
|
|
108
|
-
? new Date(
|
|
109
|
-
props.period.end.getFullYear(),
|
|
110
|
-
props.period.end.getMonth(),
|
|
111
|
-
props.period.end.getDate() - 2
|
|
112
|
-
)
|
|
113
|
-
: props.period.end
|
|
114
|
-
|
|
115
|
-
fullDayEvents.value = fullDayAndMultipleDayEvents.length
|
|
116
|
-
? eventPosition.positionFullDayEventsInWeek(
|
|
117
|
-
props.period.start,
|
|
118
|
-
weekEndDate,
|
|
119
|
-
fullDayAndMultipleDayEvents
|
|
120
|
-
)
|
|
121
|
-
: []
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function setDays() {
|
|
125
|
-
const daysArray = props.time
|
|
126
|
-
.getCalendarWeekDateObjects(props.period.start)
|
|
127
|
-
.map((day: Date) => {
|
|
128
|
-
const dayName = props.time.getLocalizedNameOfWeekday(day, 'long')
|
|
129
|
-
const dateTimeString = props.time.getDateTimeStringFromDate(
|
|
130
|
-
day,
|
|
131
|
-
'start'
|
|
132
|
-
)
|
|
133
|
-
const dayEvents = new EventsFilter(events.value).getEventsForDay(props.time, dateTimeString)
|
|
134
|
-
|
|
135
|
-
return { dayName, dateTimeString, events: dayEvents }
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
if (nDays.value === 5 && props.time.FIRST_DAY_OF_WEEK === WEEK_START_DAY.MONDAY) {
|
|
139
|
-
// Delete Saturday & Sunday
|
|
140
|
-
daysArray.splice(5, 2)
|
|
141
|
-
fullDayEvents.value.splice(5, 2)
|
|
142
|
-
} else if (nDays.value === 5 && props.time.FIRST_DAY_OF_WEEK === WEEK_START_DAY.SUNDAY) {
|
|
143
|
-
// First delete Saturday, then Sunday
|
|
144
|
-
daysArray.splice(6, 1)
|
|
145
|
-
fullDayEvents.value.splice(6, 1)
|
|
146
|
-
daysArray.splice(0, 1)
|
|
147
|
-
fullDayEvents.value.splice(0, 1)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
days.value = daysArray
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function mergeFullDayEventsIntoDays() {
|
|
154
|
-
for (const [dayIndex] of days.value.entries()) {
|
|
155
|
-
days.value[dayIndex].fullDayEvents = fullDayEvents.value[dayIndex]
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function setDay() {
|
|
160
|
-
const dayDateTimeString = props.time.getDateTimeStringFromDate(
|
|
161
|
-
props.period.selectedDate
|
|
162
|
-
)
|
|
163
|
-
// 1. Set the timed events
|
|
164
|
-
days.value = [
|
|
165
|
-
{
|
|
166
|
-
dayName: new Date(props.period.selectedDate).toLocaleDateString(
|
|
167
|
-
props.time.CALENDAR_LOCALE,
|
|
168
|
-
{ weekday: 'long' }
|
|
169
|
-
),
|
|
170
|
-
dateTimeString: props.time.getDateTimeStringFromDate(
|
|
171
|
-
props.period.selectedDate,
|
|
172
|
-
'start'
|
|
173
|
-
),
|
|
174
|
-
events: new EventsFilter(events.value).getEventsForDay(props.time, dayDateTimeString),
|
|
175
|
-
},
|
|
176
|
-
]
|
|
177
|
-
|
|
178
|
-
if (!fullDayEvents.value.length) return
|
|
179
|
-
|
|
180
|
-
// 2. Set full day events
|
|
181
|
-
for (const day of fullDayEvents.value) {
|
|
182
|
-
const dayDateString = props.time.getDateTimeStringFromDate(day.date)
|
|
183
|
-
if (dayDateString.substring(0, 11) === dayDateTimeString.substring(0, 11)) {
|
|
184
|
-
fullDayEvents.value = [day]
|
|
185
|
-
return
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
function setInitialEvents(currentMode: ModeType) {
|
|
191
|
-
if (currentMode === 'day') setDay()
|
|
192
|
-
if (currentMode === 'week') setDays()
|
|
193
|
-
|
|
194
|
-
mergeFullDayEventsIntoDays()
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function handleClickOnEvent(event: {
|
|
198
|
-
eventElement: HTMLDivElement
|
|
199
|
-
clickedEvent: EventInterface
|
|
200
|
-
}) {
|
|
201
|
-
emit('eventWasClicked', event)
|
|
202
|
-
|
|
203
|
-
selectedEventElement.value = event.eventElement
|
|
204
|
-
selectedEvent.value = event.clickedEvent
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
function handleEventWasDragged(event: EventInterface) {
|
|
208
|
-
const cleanedUpEvent = event
|
|
209
|
-
// Reset all properties of the event, that need be calculated anew
|
|
210
|
-
delete cleanedUpEvent.totalConcurrentEvents
|
|
211
|
-
delete cleanedUpEvent.nOfPreviousConcurrentEvents
|
|
212
|
-
|
|
213
|
-
const filteredEvents = events.value.filter(e => e.id !== event.id)
|
|
214
|
-
events.value = [
|
|
215
|
-
cleanedUpEvent,
|
|
216
|
-
...filteredEvents.map((e) => {
|
|
217
|
-
// Reset all properties of each event, that need be calculated anew
|
|
218
|
-
delete e.nOfPreviousConcurrentEvents
|
|
219
|
-
delete e.totalConcurrentEvents
|
|
220
|
-
|
|
221
|
-
return e
|
|
222
|
-
}),
|
|
223
|
-
]
|
|
224
|
-
setInitialEvents(mode.value)
|
|
225
|
-
weekVersion.value = weekVersion.value + 1
|
|
226
|
-
emit('eventWasDragged', event)
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
function setDayIntervals() {
|
|
230
|
-
if (props.config.dayIntervals) {
|
|
231
|
-
for (const [key, value] of Object.entries(props.config.dayIntervals)) {
|
|
232
|
-
dayIntervals.value[key] = value
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
setWeekHeightBasedOnIntervals()
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
function setWeekHeightBasedOnIntervals() {
|
|
240
|
-
// 1. Catch faulty configurations
|
|
241
|
-
if (![15, 30, 60].includes(dayIntervals.value.length)) {
|
|
242
|
-
dayIntervals.value.length = 60
|
|
243
|
-
dayIntervals.value.height = 66
|
|
244
|
-
console.warn(
|
|
245
|
-
'The dayIntervals configuration is faulty. It has been reset to default values.'
|
|
246
|
-
)
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// 2. Set a multiplier, for getting length of an hour based on the interval length
|
|
250
|
-
let intervalMultiplier = 1
|
|
251
|
-
if (dayIntervals.value.length === 15) intervalMultiplier = 4
|
|
252
|
-
if (dayIntervals.value.length === 30) intervalMultiplier = 2
|
|
253
|
-
|
|
254
|
-
// 3. Set height of the week based on the number and length of intervals
|
|
255
|
-
weekHeight.value = `${dayIntervals.value.height * intervalMultiplier * props.time.HOURS_PER_DAY}px`
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function setCurrentTime() {
|
|
259
|
-
const setTime = () => {
|
|
260
|
-
const nowString = props.time.getDateTimeStringFromDate(new Date())
|
|
261
|
-
const currentTimePercentage = props.time.getPercentageOfDayFromDateTimeString(
|
|
262
|
-
nowString,
|
|
263
|
-
props.time.DAY_START,
|
|
264
|
-
props.time.DAY_END
|
|
265
|
-
)
|
|
266
|
-
|
|
267
|
-
if (currentTimePercentage < 0 || currentTimePercentage > 100) {
|
|
268
|
-
showCurrentTime.value = false
|
|
269
|
-
return
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
showCurrentTime.value = true
|
|
273
|
-
currentTimePercentage.value = currentTimePercentage
|
|
274
|
-
}
|
|
275
|
-
setTime()
|
|
276
|
-
setInterval(() => { setTime() }, 60000)
|
|
277
|
-
}
|
|
278
|
-
</script>
|
|
279
|
-
|
|
280
|
-
<template>
|
|
281
|
-
<WeekTimeline
|
|
282
|
-
:days="days"
|
|
283
|
-
:time="time"
|
|
284
|
-
:full-day-events="fullDayEvents"
|
|
285
|
-
:config="config"
|
|
286
|
-
:mode="mode"
|
|
287
|
-
@event-was-clicked="handleClickOnEvent"
|
|
288
|
-
@day-was-clicked="$emit('dayWasClicked', $event)"
|
|
289
|
-
/>
|
|
290
|
-
|
|
291
|
-
<div class="calendar-week__wrapper relative ps-3-5">
|
|
292
|
-
<EventFlyout
|
|
293
|
-
v-if="!config.eventDialog || !config.eventDialog.isDisabled"
|
|
294
|
-
:calendar-event-prop="selectedEvent"
|
|
295
|
-
:event-element="selectedEventElement"
|
|
296
|
-
:time="time"
|
|
297
|
-
:config="config"
|
|
298
|
-
@hide="selectedEvent = null"
|
|
299
|
-
@edit-event="$emit('editEvent', $event)"
|
|
300
|
-
@delete-event="$emit('deleteEvent', $event)"
|
|
301
|
-
>
|
|
302
|
-
<template #default="p">
|
|
303
|
-
<slot
|
|
304
|
-
name="eventDialog"
|
|
305
|
-
:event-dialog-data="p.eventDialogData"
|
|
306
|
-
:close-event-dialog="p.closeEventDialog"
|
|
307
|
-
/>
|
|
308
|
-
</template>
|
|
309
|
-
</EventFlyout>
|
|
310
|
-
|
|
311
|
-
<section class="calendar-week">
|
|
312
|
-
<div
|
|
313
|
-
v-if="hasCustomCurrentTimeSlot && showCurrentTime"
|
|
314
|
-
class="custom-current-time"
|
|
315
|
-
:style="{ top: `${currentTimePercentage}%` }"
|
|
316
|
-
>
|
|
317
|
-
<slot name="customCurrentTime" />
|
|
318
|
-
</div>
|
|
319
|
-
|
|
320
|
-
<div
|
|
321
|
-
v-else-if="config && config.showCurrentTime && showCurrentTime"
|
|
322
|
-
class="current-time-line"
|
|
323
|
-
:style="{ top: `${currentTimePercentage}%` }"
|
|
324
|
-
>
|
|
325
|
-
<div class="current-time-line__circle" />
|
|
326
|
-
</div>
|
|
327
|
-
|
|
328
|
-
<DayTimeline
|
|
329
|
-
:key="period.start.getTime() + period.end.getTime() + mode"
|
|
330
|
-
:time="time"
|
|
331
|
-
:day-intervals="dayIntervals"
|
|
332
|
-
:week-height="weekHeight"
|
|
333
|
-
/>
|
|
334
|
-
|
|
335
|
-
<div class="calendar-week__events">
|
|
336
|
-
<Day
|
|
337
|
-
v-for="(day, dayIndex) in days"
|
|
338
|
-
:key="day.dateTimeString + mode + weekVersion"
|
|
339
|
-
:day="day"
|
|
340
|
-
:time="time"
|
|
341
|
-
:config="config"
|
|
342
|
-
:day-info="{ daysTotalN: days.length, thisDayIndex: dayIndex, dateTimeString: day.dateTimeString }"
|
|
343
|
-
:mode="mode"
|
|
344
|
-
:day-intervals="dayIntervals"
|
|
345
|
-
:week-height="+weekHeight.replace('px', '')"
|
|
346
|
-
@event-was-clicked="handleClickOnEvent"
|
|
347
|
-
@event-was-resized="$emit('eventWasResized', $event)"
|
|
348
|
-
@event-was-dragged="handleEventWasDragged"
|
|
349
|
-
@interval-was-clicked="$emit('intervalWasClicked', $event)"
|
|
350
|
-
@day-was-clicked="$emit('dayWasClicked', $event)"
|
|
351
|
-
@datetime-was-clicked="$emit('datetimeWasClicked', $event)"
|
|
352
|
-
>
|
|
353
|
-
<template #weekDayEvent="p">
|
|
354
|
-
<slot
|
|
355
|
-
:event-data="p.eventData"
|
|
356
|
-
name="weekDayEvent"
|
|
357
|
-
/>
|
|
358
|
-
</template>
|
|
359
|
-
</Day>
|
|
360
|
-
</div>
|
|
361
|
-
</section>
|
|
362
|
-
</div>
|
|
363
|
-
</template>
|
|
364
|
-
|
|
365
|
-
<style scoped>
|
|
366
|
-
.calendar-week__wrapper {
|
|
367
|
-
position: relative;
|
|
368
|
-
padding-inline-start: var(--qalendar-week-padding-left);
|
|
369
|
-
overflow-y: auto;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
.calendar-week {
|
|
373
|
-
position: relative;
|
|
374
|
-
width: 100%;
|
|
375
|
-
flex: 1 1 auto;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
.calendar-week__events {
|
|
379
|
-
display: flex;
|
|
380
|
-
width: 100%;
|
|
381
|
-
height: v-bind(weekHeight);
|
|
382
|
-
overflow: hidden;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
.calendar-week .current-time-line {
|
|
386
|
-
position: absolute;
|
|
387
|
-
inset-inline-start: 0;
|
|
388
|
-
width: 100%;
|
|
389
|
-
height: 2px;
|
|
390
|
-
z-index: 1;
|
|
391
|
-
background-color: red;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
.calendar-week .current-time-line__circle {
|
|
395
|
-
position: relative;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
.calendar-week .current-time-line__circle::before {
|
|
399
|
-
content: '';
|
|
400
|
-
position: absolute;
|
|
401
|
-
transform: translate(-45%, -45%);
|
|
402
|
-
width: 10px;
|
|
403
|
-
height: 10px;
|
|
404
|
-
border-radius: 50%;
|
|
405
|
-
background-color: red;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
.calendar-week .custom-current-time {
|
|
409
|
-
position: absolute;
|
|
410
|
-
inset-inline-start: 0;
|
|
411
|
-
width: 100%;
|
|
412
|
-
z-index: 1;
|
|
413
|
-
}
|
|
414
|
-
</style>
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import type Time from '../../helpers/Time'
|
|
3
|
-
import type { ConfigInterface } from '../../typings/config.interface'
|
|
4
|
-
import type { DayInterface } from '../../typings/interfaces/day.interface'
|
|
5
|
-
import type { DayWithFullDayEvents } from '../../typings/interfaces/full-day-events-week.type'
|
|
6
|
-
import type { ModeType } from '../../typings/types'
|
|
7
|
-
import { ref, defineEmits } from 'vue'
|
|
8
|
-
import FullDayEvent from './FullDayEvent.vue'
|
|
9
|
-
|
|
10
|
-
const props = defineProps<{
|
|
11
|
-
days: DayInterface[]
|
|
12
|
-
time: Time
|
|
13
|
-
fullDayEvents: DayWithFullDayEvents[]
|
|
14
|
-
config: ConfigInterface
|
|
15
|
-
mode: ModeType
|
|
16
|
-
}>()
|
|
17
|
-
|
|
18
|
-
const emit = defineEmits<{
|
|
19
|
-
(e: 'eventWasClicked', event: any): void
|
|
20
|
-
(e: 'dayWasClicked', date: string): void
|
|
21
|
-
}>()
|
|
22
|
-
|
|
23
|
-
const now = ref(new Date())
|
|
24
|
-
|
|
25
|
-
function getDaysDate(day: DayInterface) {
|
|
26
|
-
const { date } = props.time.getAllVariablesFromDateTimeString(
|
|
27
|
-
day.dateTimeString
|
|
28
|
-
)
|
|
29
|
-
return date
|
|
30
|
-
}
|
|
31
|
-
</script>
|
|
32
|
-
|
|
33
|
-
<template>
|
|
34
|
-
<div class="week-timeline flex space-between border-bottom ms-3-5" style="margin-inline-end: 0.5em;">
|
|
35
|
-
<div
|
|
36
|
-
v-for="(day, dayIndex) in days"
|
|
37
|
-
:key="dayIndex"
|
|
38
|
-
class="week-timeline__day"
|
|
39
|
-
:class="{
|
|
40
|
-
'is-today':
|
|
41
|
-
time.getDateTimeStringFromDate(now, 'start') === day.dateTimeString,
|
|
42
|
-
}"
|
|
43
|
-
@click="emit('dayWasClicked', time.dateStringFrom(day.dateTimeString))"
|
|
44
|
-
>
|
|
45
|
-
<div class="flex justify-content-center gap-025 txt12 pb-025">
|
|
46
|
-
<div class="">
|
|
47
|
-
{{ day.dayName.charAt(0).toUpperCase() + day.dayName.slice(1, 3).toLowerCase() }}
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
<div class="week-timeline__date txt14 round inline-flex justify-content-center">
|
|
51
|
-
{{ getDaysDate(day) }}
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
<div class="week-timeline__events">
|
|
56
|
-
<template
|
|
57
|
-
v-for="(event, key) in day.fullDayEvents"
|
|
58
|
-
:key="key"
|
|
59
|
-
>
|
|
60
|
-
<FullDayEvent
|
|
61
|
-
v-if="key !== 'date'"
|
|
62
|
-
:schedule-event="typeof event === 'object' ? event : null"
|
|
63
|
-
:config="config"
|
|
64
|
-
:mode="mode"
|
|
65
|
-
@event-was-clicked="emit('eventWasClicked', $event)"
|
|
66
|
-
/>
|
|
67
|
-
</template>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
</div>
|
|
71
|
-
</template>
|
|
72
|
-
|
|
73
|
-
<style scoped>
|
|
74
|
-
.week-timeline {
|
|
75
|
-
height: fit-content;
|
|
76
|
-
display: flex;
|
|
77
|
-
justify-content: space-evenly;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.mode-is-day .week-timeline {
|
|
81
|
-
/* width: calc(100% - 3.5em); */
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.week-timeline__day {
|
|
85
|
-
width: 100%;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.week-timeline__date {
|
|
89
|
-
height: 1.5rem;
|
|
90
|
-
width: 1.5rem;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.is-today .week-timeline__date {
|
|
94
|
-
background: var(--bgl-primary);
|
|
95
|
-
color: var(--bgl-white);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
.week-timeline__events {
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
</style>
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export const EVENT_COLORS = {
|
|
2
|
-
yellow: 'var(--bgl-yellow)',
|
|
3
|
-
blue: 'var(--bgl-blue)',
|
|
4
|
-
green: 'var(--bgl-green)',
|
|
5
|
-
red: 'var(--bgl-red)',
|
|
6
|
-
pink: 'var(--bgl-pink)',
|
|
7
|
-
purple: 'var(--bgl-purple)',
|
|
8
|
-
turquoise: 'var(--bgl-turquoise)',
|
|
9
|
-
brown: 'var(--bgl-brown)',
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const DATE_TIME_STRING_PATTERN = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/
|
|
13
|
-
export const DATE_TIME_STRING_FULL_DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import Time from './Time'
|
|
2
|
-
|
|
3
|
-
export interface Interval {
|
|
4
|
-
intervalStart: string
|
|
5
|
-
intervalEnd: string
|
|
6
|
-
hasBorder?: boolean
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Define the data for the clickable intervals to be viewed in a calendar day.
|
|
10
|
-
*/
|
|
11
|
-
export default class DayIntervals extends Time {
|
|
12
|
-
private readonly INTERVAL_MINUTES: 15 | 30 | 60
|
|
13
|
-
private readonly DAY_START_DATE_TIME_STRING: string
|
|
14
|
-
HOURS_PER_DAY = 24
|
|
15
|
-
|
|
16
|
-
constructor(
|
|
17
|
-
intervalMinutes: 15 | 30 | 60,
|
|
18
|
-
dayStartDateTimeString: string,
|
|
19
|
-
hoursPerDay = 24,
|
|
20
|
-
) {
|
|
21
|
-
super()
|
|
22
|
-
this.INTERVAL_MINUTES = intervalMinutes
|
|
23
|
-
this.DAY_START_DATE_TIME_STRING = dayStartDateTimeString
|
|
24
|
-
this.HOURS_PER_DAY = hoursPerDay
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
getIntervals(): Interval[] {
|
|
28
|
-
const intervals = []
|
|
29
|
-
const numberOfIntervalsInDay = this.HOURS_PER_DAY * (60 / this.INTERVAL_MINUTES)
|
|
30
|
-
let iteratorDateTimeString = this.DAY_START_DATE_TIME_STRING
|
|
31
|
-
|
|
32
|
-
while (intervals.length < numberOfIntervalsInDay) {
|
|
33
|
-
const intervalEnd = this.addMinutesToDateTimeString(this.INTERVAL_MINUTES, iteratorDateTimeString)
|
|
34
|
-
|
|
35
|
-
intervals.push({
|
|
36
|
-
intervalStart: iteratorDateTimeString,
|
|
37
|
-
intervalEnd,
|
|
38
|
-
// Only show a border at the bottom of an interval, when the upcoming interval is not the start of a new hour.
|
|
39
|
-
// This prevents double borders
|
|
40
|
-
hasBorder: intervalEnd.substring(14, 16) !== '00'
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
iteratorDateTimeString = intervalEnd
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return intervals
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A little helper class (Extended-Date), for allowing destructuring of a date
|
|
3
|
-
*/
|
|
4
|
-
class EDate extends Date {
|
|
5
|
-
get fullYear() {
|
|
6
|
-
return this.getFullYear()
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
get month() {
|
|
10
|
-
return this.getMonth()
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
get date() {
|
|
14
|
-
return this.getDate()
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default EDate
|