@bagelink/vue 0.0.1218 → 0.0.1220

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.
Files changed (138) hide show
  1. package/dist/components/Calendar/Index.vue.d.ts +510 -0
  2. package/dist/components/Calendar/Index.vue.d.ts.map +1 -0
  3. package/dist/components/Calendar/components/header/Header.vue.d.ts +117 -0
  4. package/dist/components/Calendar/components/header/Header.vue.d.ts.map +1 -0
  5. package/dist/components/Calendar/components/month/AgendaEventTile.vue.d.ts +37 -0
  6. package/dist/components/Calendar/components/month/AgendaEventTile.vue.d.ts.map +1 -0
  7. package/dist/components/Calendar/components/month/AgendaEvents.vue.d.ts +37 -0
  8. package/dist/components/Calendar/components/month/AgendaEvents.vue.d.ts.map +1 -0
  9. package/dist/components/Calendar/components/month/Day.vue.d.ts +84 -0
  10. package/dist/components/Calendar/components/month/Day.vue.d.ts.map +1 -0
  11. package/dist/components/Calendar/components/month/Event.vue.d.ts +69 -0
  12. package/dist/components/Calendar/components/month/Event.vue.d.ts.map +1 -0
  13. package/dist/components/Calendar/components/month/Month.vue.d.ts +134 -0
  14. package/dist/components/Calendar/components/month/Month.vue.d.ts.map +1 -0
  15. package/dist/components/Calendar/components/month/WeekDay.vue.d.ts +7 -0
  16. package/dist/components/Calendar/components/month/WeekDay.vue.d.ts.map +1 -0
  17. package/dist/components/Calendar/components/partials/EventFlyout.vue.d.ts +122 -0
  18. package/dist/components/Calendar/components/partials/EventFlyout.vue.d.ts.map +1 -0
  19. package/dist/components/Calendar/components/week/Day.vue.d.ts +152 -0
  20. package/dist/components/Calendar/components/week/Day.vue.d.ts.map +1 -0
  21. package/dist/components/Calendar/components/week/DayEvent.vue.d.ts +136 -0
  22. package/dist/components/Calendar/components/week/DayEvent.vue.d.ts.map +1 -0
  23. package/dist/components/Calendar/components/week/DayTimeline.vue.d.ts +23 -0
  24. package/dist/components/Calendar/components/week/DayTimeline.vue.d.ts.map +1 -0
  25. package/dist/components/Calendar/components/week/FullDayEvent.vue.d.ts +42 -0
  26. package/dist/components/Calendar/components/week/FullDayEvent.vue.d.ts.map +1 -0
  27. package/dist/components/Calendar/components/week/Week.vue.d.ts +196 -0
  28. package/dist/components/Calendar/components/week/Week.vue.d.ts.map +1 -0
  29. package/dist/components/Calendar/components/week/WeekTimeline.vue.d.ts +21 -0
  30. package/dist/components/Calendar/components/week/WeekTimeline.vue.d.ts.map +1 -0
  31. package/dist/components/Calendar/constants.d.ts +13 -0
  32. package/dist/components/Calendar/constants.d.ts.map +1 -0
  33. package/dist/components/Calendar/helpers/DayIntervals.d.ts +17 -0
  34. package/dist/components/Calendar/helpers/DayIntervals.d.ts.map +1 -0
  35. package/dist/components/Calendar/helpers/EDate.d.ts +10 -0
  36. package/dist/components/Calendar/helpers/EDate.d.ts.map +1 -0
  37. package/dist/components/Calendar/helpers/Errors.d.ts +18 -0
  38. package/dist/components/Calendar/helpers/Errors.d.ts.map +1 -0
  39. package/dist/components/Calendar/helpers/EventChange.d.ts +19 -0
  40. package/dist/components/Calendar/helpers/EventChange.d.ts.map +1 -0
  41. package/dist/components/Calendar/helpers/EventConcurrency.d.ts +12 -0
  42. package/dist/components/Calendar/helpers/EventConcurrency.d.ts.map +1 -0
  43. package/dist/components/Calendar/helpers/EventFlyoutPosition.d.ts +14 -0
  44. package/dist/components/Calendar/helpers/EventFlyoutPosition.d.ts.map +1 -0
  45. package/dist/components/Calendar/helpers/EventPosition.d.ts +11 -0
  46. package/dist/components/Calendar/helpers/EventPosition.d.ts.map +1 -0
  47. package/dist/components/Calendar/helpers/EventsFilter.d.ts +11 -0
  48. package/dist/components/Calendar/helpers/EventsFilter.d.ts.map +1 -0
  49. package/dist/components/Calendar/helpers/Helpers.d.ts +19 -0
  50. package/dist/components/Calendar/helpers/Helpers.d.ts.map +1 -0
  51. package/dist/components/Calendar/helpers/Time.d.ts +118 -0
  52. package/dist/components/Calendar/helpers/Time.d.ts.map +1 -0
  53. package/dist/components/Calendar/helpers/Week.d.ts +10 -0
  54. package/dist/components/Calendar/helpers/Week.d.ts.map +1 -0
  55. package/dist/components/Calendar/index.d.ts +4 -0
  56. package/dist/components/Calendar/index.d.ts.map +1 -0
  57. package/dist/components/Calendar/language/index.d.ts +6 -0
  58. package/dist/components/Calendar/language/index.d.ts.map +1 -0
  59. package/dist/components/Calendar/language/keys.d.ts +90 -0
  60. package/dist/components/Calendar/language/keys.d.ts.map +1 -0
  61. package/dist/components/Calendar/models/Event.d.ts +50 -0
  62. package/dist/components/Calendar/models/Event.d.ts.map +1 -0
  63. package/dist/components/Calendar/typings/config.interface.d.ts +77 -0
  64. package/dist/components/Calendar/typings/config.interface.d.ts.map +1 -0
  65. package/dist/components/Calendar/typings/interfaces/day.interface.d.ts +10 -0
  66. package/dist/components/Calendar/typings/interfaces/day.interface.d.ts.map +1 -0
  67. package/dist/components/Calendar/typings/interfaces/event.interface.d.ts +32 -0
  68. package/dist/components/Calendar/typings/interfaces/event.interface.d.ts.map +1 -0
  69. package/dist/components/Calendar/typings/interfaces/full-day-events-week.type.d.ts +7 -0
  70. package/dist/components/Calendar/typings/interfaces/full-day-events-week.type.d.ts.map +1 -0
  71. package/dist/components/Calendar/typings/interfaces/period.interface.d.ts +6 -0
  72. package/dist/components/Calendar/typings/interfaces/period.interface.d.ts.map +1 -0
  73. package/dist/components/Calendar/typings/interfaces/time-modes.d.ts +6 -0
  74. package/dist/components/Calendar/typings/interfaces/time-modes.d.ts.map +1 -0
  75. package/dist/components/Calendar/typings/types.d.ts +21 -0
  76. package/dist/components/Calendar/typings/types.d.ts.map +1 -0
  77. package/dist/components/DataTable/DataTable.vue.d.ts.map +1 -1
  78. package/dist/components/form/inputs/DatePick.vue.d.ts +8 -0
  79. package/dist/components/form/inputs/DatePick.vue.d.ts.map +1 -1
  80. package/dist/components/form/inputs/NumberInput.vue.d.ts.map +1 -1
  81. package/dist/components/index.d.ts +2 -1
  82. package/dist/components/index.d.ts.map +1 -1
  83. package/dist/directives/index.d.ts +2 -0
  84. package/dist/directives/index.d.ts.map +1 -1
  85. package/dist/directives/vResize.d.ts +18 -0
  86. package/dist/directives/vResize.d.ts.map +1 -0
  87. package/dist/index.cjs +3583 -111
  88. package/dist/index.mjs +3584 -112
  89. package/dist/style.css +843 -77
  90. package/package.json +2 -1
  91. package/src/components/Calendar/Index.vue +420 -0
  92. package/src/components/Calendar/assets/base.css +60 -0
  93. package/src/components/Calendar/components/header/Header.vue +274 -0
  94. package/src/components/Calendar/components/month/AgendaEventTile.vue +137 -0
  95. package/src/components/Calendar/components/month/AgendaEvents.vue +107 -0
  96. package/src/components/Calendar/components/month/Day.vue +271 -0
  97. package/src/components/Calendar/components/month/Event.vue +221 -0
  98. package/src/components/Calendar/components/month/Month.vue +278 -0
  99. package/src/components/Calendar/components/month/WeekDay.vue +25 -0
  100. package/src/components/Calendar/components/partials/EventFlyout.vue +429 -0
  101. package/src/components/Calendar/components/week/Day.vue +212 -0
  102. package/src/components/Calendar/components/week/DayEvent.vue +585 -0
  103. package/src/components/Calendar/components/week/DayTimeline.vue +86 -0
  104. package/src/components/Calendar/components/week/FullDayEvent.vue +121 -0
  105. package/src/components/Calendar/components/week/Week.vue +414 -0
  106. package/src/components/Calendar/components/week/WeekTimeline.vue +126 -0
  107. package/src/components/Calendar/constants.ts +13 -0
  108. package/src/components/Calendar/env.d.ts +8 -0
  109. package/src/components/Calendar/helpers/DayIntervals.ts +48 -0
  110. package/src/components/Calendar/helpers/EDate.ts +18 -0
  111. package/src/components/Calendar/helpers/Errors.ts +69 -0
  112. package/src/components/Calendar/helpers/EventChange.ts +88 -0
  113. package/src/components/Calendar/helpers/EventConcurrency.ts +69 -0
  114. package/src/components/Calendar/helpers/EventFlyoutPosition.ts +96 -0
  115. package/src/components/Calendar/helpers/EventPosition.ts +154 -0
  116. package/src/components/Calendar/helpers/EventsFilter.ts +50 -0
  117. package/src/components/Calendar/helpers/Helpers.ts +86 -0
  118. package/src/components/Calendar/helpers/Time.ts +588 -0
  119. package/src/components/Calendar/helpers/Week.ts +37 -0
  120. package/src/components/Calendar/index.ts +4 -0
  121. package/src/components/Calendar/language/index.ts +37 -0
  122. package/src/components/Calendar/language/keys.ts +90 -0
  123. package/src/components/Calendar/models/Event.ts +112 -0
  124. package/src/components/Calendar/styles/_mixins.css +21 -0
  125. package/src/components/Calendar/styles/_variables.css +51 -0
  126. package/src/components/Calendar/typings/config.interface.ts +87 -0
  127. package/src/components/Calendar/typings/interfaces/day.interface.ts +10 -0
  128. package/src/components/Calendar/typings/interfaces/event.interface.ts +32 -0
  129. package/src/components/Calendar/typings/interfaces/full-day-events-week.type.ts +8 -0
  130. package/src/components/Calendar/typings/interfaces/period.interface.ts +5 -0
  131. package/src/components/Calendar/typings/interfaces/time-modes.ts +9 -0
  132. package/src/components/Calendar/typings/types.ts +23 -0
  133. package/src/components/DataTable/DataTable.vue +4 -0
  134. package/src/components/form/inputs/DatePick.vue +189 -152
  135. package/src/components/form/inputs/NumberInput.vue +1 -3
  136. package/src/components/index.ts +3 -6
  137. package/src/directives/index.ts +2 -0
  138. package/src/directives/vResize.ts +205 -0
@@ -0,0 +1,121 @@
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}% - 6px)`
38
+
39
+ return 'calc(100% - 6px)'
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: left;
113
+ cursor: pointer;
114
+ user-select: none;
115
+ overflow: hidden;
116
+ }
117
+
118
+ .week-timeline__event:active {
119
+ cursor: not-allowed;
120
+ }
121
+ </style>
@@ -0,0 +1,414 @@
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">
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-left: 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
+ left: 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
+ left: 0;
411
+ width: 100%;
412
+ z-index: 1;
413
+ }
414
+ </style>
@@ -0,0 +1,126 @@
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">
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="week-timeline__day-name">
46
+ {{ day.dayName.substring(0, 2).toUpperCase() }}
47
+ </div>
48
+
49
+ <div class="week-timeline__date">
50
+ {{ getDaysDate(day) }}
51
+ </div>
52
+
53
+ <div class="week-timeline__events">
54
+ <template
55
+ v-for="(event, key) in day.fullDayEvents"
56
+ :key="key"
57
+ >
58
+ <FullDayEvent
59
+ v-if="key !== 'date'"
60
+ :schedule-event="typeof event === 'object' ? event : null"
61
+ :config="config"
62
+ :mode="mode"
63
+ @event-was-clicked="emit('eventWasClicked', $event)"
64
+ />
65
+ </template>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </template>
70
+
71
+ <style scoped>
72
+ .week-timeline {
73
+ height: fit-content;
74
+ display: flex;
75
+ justify-content: space-evenly;
76
+ padding-bottom: var(--qalendar-spacing-half);
77
+ padding-left: var(--qalendar-week-padding-left);
78
+ border-bottom: var(--qalendar-border-gray-thin);
79
+ }
80
+
81
+ .mode-is-day .week-timeline {
82
+ width: 100%;
83
+ padding-left: 0;
84
+ }
85
+
86
+ .week-timeline__day {
87
+ width: 100%;
88
+ display: flex;
89
+ flex-flow: column;
90
+ align-items: center;
91
+ justify-content: flex-start;
92
+ }
93
+
94
+ .week-timeline__day-name {
95
+ font-size: var(--qalendar-font-3xs);
96
+ font-weight: 400;
97
+ margin-bottom: 4px;
98
+ color: var(--qalendar-gray-quite-dark);
99
+ }
100
+
101
+ .week-timeline__date {
102
+ font-size: 1.2rem;
103
+ margin-bottom: 4px;
104
+ height: 2rem;
105
+ width: 2rem;
106
+ border-radius: 50%;
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ }
111
+
112
+ .is-today .week-timeline__date {
113
+ background-color: var(--qalendar-blue);
114
+ color: #fff;
115
+ }
116
+
117
+ .week-timeline__events {
118
+ width: 100%;
119
+ flex: 1;
120
+ border-right: 1px dashed rgb(224 224 224);
121
+ }
122
+
123
+ .week-timeline__day:first-child .week-timeline__events {
124
+ border-left: 1px dashed rgb(224 224 224);
125
+ }
126
+ </style>
@@ -0,0 +1,13 @@
1
+ export const EVENT_COLORS = {
2
+ yellow: "rgb(244, 180, 0)",
3
+ blue: "rgb(38, 132, 255)",
4
+ green: "rgb(51, 182, 121)",
5
+ red: "rgb(255, 84, 86)",
6
+ pink: "rgb(239, 139, 239)",
7
+ purple: "rgb(157, 114, 245)",
8
+ turquoise: "rgb(64, 190, 190)",
9
+ brown: "rgb(169, 99, 30)",
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}$/;
@@ -0,0 +1,8 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module "*.vue" {
4
+ import type { DefineComponent } from "vue";
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
6
+ const component: DefineComponent<{}, {}, any>;
7
+ export default component;
8
+ }