@bagelink/vue 0.0.1218 → 0.0.1224

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 (150) hide show
  1. package/dist/components/Calendar/Index.vue.d.ts +514 -0
  2. package/dist/components/Calendar/Index.vue.d.ts.map +1 -0
  3. package/dist/components/Calendar/components/header/Header.vue.d.ts +119 -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 +7 -0
  58. package/dist/components/Calendar/language/index.d.ts.map +1 -0
  59. package/dist/components/Calendar/language/keys.d.ts +93 -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/Spreadsheet/Index.vue.d.ts +24 -0
  79. package/dist/components/Spreadsheet/Index.vue.d.ts.map +1 -0
  80. package/dist/components/form/BagelForm.vue.d.ts +1 -1
  81. package/dist/components/form/BagelForm.vue.d.ts.map +1 -1
  82. package/dist/components/form/inputs/DatePick.vue.d.ts +9 -0
  83. package/dist/components/form/inputs/DatePick.vue.d.ts.map +1 -1
  84. package/dist/components/form/inputs/DatePicker.vue.d.ts.map +1 -1
  85. package/dist/components/form/inputs/NumberInput.vue.d.ts.map +1 -1
  86. package/dist/components/index.d.ts +3 -1
  87. package/dist/components/index.d.ts.map +1 -1
  88. package/dist/directives/index.d.ts +2 -0
  89. package/dist/directives/index.d.ts.map +1 -1
  90. package/dist/directives/vResize.d.ts +18 -0
  91. package/dist/directives/vResize.d.ts.map +1 -0
  92. package/dist/index.cjs +5081 -925
  93. package/dist/index.mjs +5082 -926
  94. package/dist/style.css +1134 -401
  95. package/package.json +2 -1
  96. package/src/components/Calendar/Index.vue +417 -0
  97. package/src/components/Calendar/assets/base.css +60 -0
  98. package/src/components/Calendar/components/header/Header.vue +152 -0
  99. package/src/components/Calendar/components/month/AgendaEventTile.vue +128 -0
  100. package/src/components/Calendar/components/month/AgendaEvents.vue +61 -0
  101. package/src/components/Calendar/components/month/Day.vue +253 -0
  102. package/src/components/Calendar/components/month/Event.vue +164 -0
  103. package/src/components/Calendar/components/month/Month.vue +232 -0
  104. package/src/components/Calendar/components/month/WeekDay.vue +15 -0
  105. package/src/components/Calendar/components/partials/EventFlyout.vue +430 -0
  106. package/src/components/Calendar/components/week/Day.vue +198 -0
  107. package/src/components/Calendar/components/week/DayEvent.vue +585 -0
  108. package/src/components/Calendar/components/week/DayTimeline.vue +86 -0
  109. package/src/components/Calendar/components/week/FullDayEvent.vue +121 -0
  110. package/src/components/Calendar/components/week/Week.vue +414 -0
  111. package/src/components/Calendar/components/week/WeekTimeline.vue +101 -0
  112. package/src/components/Calendar/constants.ts +13 -0
  113. package/src/components/Calendar/env.d.ts +8 -0
  114. package/src/components/Calendar/helpers/DayIntervals.ts +48 -0
  115. package/src/components/Calendar/helpers/EDate.ts +18 -0
  116. package/src/components/Calendar/helpers/Errors.ts +69 -0
  117. package/src/components/Calendar/helpers/EventChange.ts +88 -0
  118. package/src/components/Calendar/helpers/EventConcurrency.ts +69 -0
  119. package/src/components/Calendar/helpers/EventFlyoutPosition.ts +96 -0
  120. package/src/components/Calendar/helpers/EventPosition.ts +154 -0
  121. package/src/components/Calendar/helpers/EventsFilter.ts +50 -0
  122. package/src/components/Calendar/helpers/Helpers.ts +86 -0
  123. package/src/components/Calendar/helpers/Time.ts +588 -0
  124. package/src/components/Calendar/helpers/Week.ts +37 -0
  125. package/src/components/Calendar/language/index.ts +40 -0
  126. package/src/components/Calendar/language/keys.ts +93 -0
  127. package/src/components/Calendar/models/Event.ts +112 -0
  128. package/src/components/Calendar/styles/_mixins.css +21 -0
  129. package/src/components/Calendar/styles/_variables.css +47 -0
  130. package/src/components/Calendar/typings/config.interface.ts +87 -0
  131. package/src/components/Calendar/typings/interfaces/day.interface.ts +10 -0
  132. package/src/components/Calendar/typings/interfaces/event.interface.ts +32 -0
  133. package/src/components/Calendar/typings/interfaces/full-day-events-week.type.ts +8 -0
  134. package/src/components/Calendar/typings/interfaces/period.interface.ts +5 -0
  135. package/src/components/Calendar/typings/interfaces/time-modes.ts +9 -0
  136. package/src/components/Calendar/typings/types.ts +23 -0
  137. package/src/components/DataTable/DataTable.vue +4 -0
  138. package/src/components/Spreadsheet/Index.vue +843 -0
  139. package/src/components/form/BagelForm.vue +1 -1
  140. package/src/components/form/inputs/DatePick.vue +193 -152
  141. package/src/components/form/inputs/DatePicker.vue +2 -2
  142. package/src/components/form/inputs/NumberInput.vue +3 -5
  143. package/src/components/index.ts +4 -6
  144. package/src/directives/index.ts +2 -0
  145. package/src/directives/vResize.ts +205 -0
  146. package/src/styles/buttons.css +81 -73
  147. package/src/styles/layout.css +25 -0
  148. package/src/styles/mobilLayout.css +25 -0
  149. package/src/styles/text.css +82 -1
  150. package/src/styles/theme.css +269 -258
@@ -0,0 +1,128 @@
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+ import type Time from '../../helpers/Time'
4
+ import type { ConfigInterface } from '../../typings/config.interface'
5
+ import type { EventInterface } from '../../typings/interfaces/event.interface'
6
+ import { Icon } from '@bagelink/vue'
7
+ import { ref, computed, onMounted } from 'vue'
8
+ import { DATE_TIME_STRING_PATTERN, EVENT_COLORS } from '../../constants'
9
+
10
+ const props = defineProps({
11
+ time: {
12
+ type: Object as PropType<Time>,
13
+ required: true,
14
+ },
15
+ calendarEvent: {
16
+ type: Object as PropType<EventInterface>,
17
+ required: true,
18
+ },
19
+ config: {
20
+ type: Object as PropType<ConfigInterface>,
21
+ required: true,
22
+ },
23
+ })
24
+
25
+ const emit = defineEmits(['eventWasClicked'])
26
+
27
+ const icons = {
28
+ clock: 'clock',
29
+ user: 'user',
30
+ description: 'comment',
31
+ trash: 'delete',
32
+ edit: 'pen-to-square',
33
+ times: 'close',
34
+ topic: 'question-circle',
35
+ location: 'location_on',
36
+ }
37
+
38
+ const colors = EVENT_COLORS as { [key: string]: string }
39
+ const eventBackgroundColor = ref('')
40
+ const eventColor = ref('#fff')
41
+ const eventIdPrefix = 'agenda__event-'
42
+
43
+ const eventTime = computed(() => {
44
+ return DATE_TIME_STRING_PATTERN.test(props.calendarEvent.time.start)
45
+ ? props.time.getLocalizedTimeRange(
46
+ props.calendarEvent.time.start,
47
+ props.calendarEvent.time.end
48
+ )
49
+ : null
50
+ })
51
+
52
+ const elementId = computed(() => {
53
+ return eventIdPrefix + props.calendarEvent.id
54
+ })
55
+
56
+ function setColors() {
57
+ if (
58
+ props.calendarEvent.colorScheme
59
+ && props.config.style?.colorSchemes
60
+ && props.config.style.colorSchemes[props.calendarEvent.colorScheme]
61
+ ) {
62
+ eventColor.value = props.config.style.colorSchemes[props.calendarEvent.colorScheme].color
63
+ eventBackgroundColor.value = props.config.style.colorSchemes[props.calendarEvent.colorScheme].backgroundColor
64
+ return
65
+ }
66
+
67
+ if (props.calendarEvent.color) {
68
+ eventBackgroundColor.value = colors[props.calendarEvent.color]
69
+ return
70
+ }
71
+
72
+ eventBackgroundColor.value = colors.blue
73
+ }
74
+
75
+ function handleClickOnEvent() {
76
+ const eventElement = document.getElementById(elementId.value)
77
+ emit('eventWasClicked', {
78
+ clickedEvent: props.calendarEvent,
79
+ eventElement,
80
+ })
81
+ }
82
+
83
+ onMounted(() => {
84
+ setColors()
85
+ })
86
+ </script>
87
+
88
+ <template>
89
+ <div
90
+ :id="elementId"
91
+ class="agenda__event is-event rounded mb-05 pointer user-select-none p-1 flex column align-items-start"
92
+ @click.prevent="handleClickOnEvent"
93
+ >
94
+ <span
95
+ v-if="eventTime && !calendarEvent.originalEvent"
96
+ class="agenda__event-time"
97
+ >
98
+ <Icon :icon="icons.clock" />
99
+ {{ eventTime }}
100
+ </span>
101
+
102
+ <span class="agenda__event-title">
103
+ {{ calendarEvent.title }}
104
+ </span>
105
+ <span
106
+ v-if="calendarEvent.with"
107
+ class="agenda__event-with"
108
+ >
109
+ <Icon :icon="icons.user" />
110
+ {{ calendarEvent.with }}
111
+ </span>
112
+
113
+ <span
114
+ v-if="calendarEvent.location"
115
+ class="agenda__event-location"
116
+ >
117
+ <Icon :icon="icons.location" />
118
+ {{ calendarEvent.location }}
119
+ </span>
120
+ </div>
121
+ </template>
122
+
123
+ <style scoped>
124
+ .agenda__event {
125
+ background-color: v-bind(eventBackgroundColor);
126
+ color: v-bind(eventColor);
127
+ }
128
+ </style>
@@ -0,0 +1,61 @@
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+ import type Time from '../../helpers/Time'
4
+ import type { ConfigInterface } from '../../typings/config.interface'
5
+ import type { DayInterface } from '../../typings/interfaces/day.interface'
6
+ import { getLanguage, languageKeys } from '../../language'
7
+ import AgendaEventTile from './AgendaEventTile.vue'
8
+
9
+ const props = defineProps({
10
+ config: {
11
+ type: Object as PropType<ConfigInterface>,
12
+ required: true,
13
+ },
14
+ time: {
15
+ type: Object as PropType<Time>,
16
+ required: true,
17
+ },
18
+ day: {
19
+ type: Object as PropType<DayInterface>,
20
+ required: true,
21
+ },
22
+ })
23
+
24
+ const emit = defineEmits(['eventWasClicked'])
25
+ </script>
26
+
27
+ <template>
28
+ <div class="agenda__wrapper flex align-items-start gap-1">
29
+ <header class="">
30
+ <div class="agenda__header-day-name txt-center">
31
+ {{ day.dayName }}
32
+ </div>
33
+ <div class="agenda__header-date flex justify-content-center rounded p-025 txt24 line-height-04">
34
+ <!-- Here we want to display leading zero for days 1-9, in order to prevent layout shifts -->
35
+ {{ day.dateTimeString.substring(8, 10) }}
36
+ </div>
37
+ </header>
38
+ <div class="agenda__content flex column w-100p h-100p min-h-100px pt-05">
39
+ <div
40
+ v-if="day.events.length === 0"
41
+ class="align-items-center flex justify-content-center h-100p"
42
+ >
43
+ {{ getLanguage(languageKeys.noEvent, time.CALENDAR_LOCALE) }}
44
+ </div>
45
+ <div
46
+ v-else
47
+ class="w-100p"
48
+ >
49
+ <AgendaEventTile
50
+ v-for="dayEvent of day.events"
51
+ :key="`agenda_event_${dayEvent.id}`"
52
+ :day="day"
53
+ :config="config"
54
+ :calendar-event="dayEvent"
55
+ :time="time"
56
+ @event-was-clicked="emit('eventWasClicked', $event)"
57
+ />
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </template>
@@ -0,0 +1,253 @@
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+ import type Time from '../../helpers/Time'
4
+ import type { ConfigInterface } from '../../typings/config.interface'
5
+ import type { DayInterface } from '../../typings/interfaces/day.interface'
6
+ import type { EventInterface } from '../../typings/interfaces/event.interface'
7
+ import { ref, computed } from 'vue'
8
+ import { getLanguage } from '../../language'
9
+ import { languageKeys } from '../../language/keys'
10
+ import Event from './Event.vue'
11
+
12
+ const props = defineProps({
13
+ config: {
14
+ type: Object as PropType<ConfigInterface>,
15
+ required: true,
16
+ },
17
+ time: {
18
+ type: Object as PropType<Time>,
19
+ required: true,
20
+ },
21
+ day: {
22
+ type: Object as PropType<DayInterface>,
23
+ required: true,
24
+ },
25
+ isSelected: {
26
+ type: Boolean,
27
+ default: false,
28
+ },
29
+ })
30
+
31
+ const emit = defineEmits<{
32
+ (e: 'eventWasClicked', event: EventInterface): void
33
+ (e: 'eventWasDragged', event: EventInterface): void
34
+ (e: 'updatedPeriod', period: { start: Date, end: Date, selectedDate: Date }): void
35
+ (e: 'dateWasClicked', date: string): void
36
+ (e: 'dayWasSelected', day: DayInterface): void
37
+ }>()
38
+
39
+ const isActiveDroppable = ref(false)
40
+
41
+ const canBeDropped = computed(() => isActiveDroppable.value)
42
+
43
+ const hideLeadingAndTrailingDate = computed(() => props.day.isTrailingOrLeadingDate === true && props.config.month?.showTrailingAndLeadingDates === false
44
+ )
45
+
46
+ const isToday = computed(() => {
47
+ const { year, month, date } = props.time.getAllVariablesFromDateTimeString(props.day.dateTimeString)
48
+ return props.time.dateIsToday(new Date(year, month, date))
49
+ })
50
+
51
+ function getMoreEvents() {
52
+ const { date, month, year } = props.time.getAllVariablesFromDateTimeString(props.day.dateTimeString)
53
+ const selectedDate = new Date(year, month, date)
54
+ const week = props.time.getCalendarWeekDateObjects(selectedDate)
55
+ const start = week[0]
56
+ const end = week[6]
57
+ emit('updatedPeriod', { start, end, selectedDate })
58
+ }
59
+
60
+ function handleDragLeave() {
61
+ isActiveDroppable.value = false
62
+ }
63
+
64
+ function handleDragEnd(mouseEvent: DragEvent) {
65
+ isActiveDroppable.value = false
66
+ mouseEvent.stopPropagation()
67
+ }
68
+
69
+ function handleDrop(dropEvent: DragEvent) {
70
+ isActiveDroppable.value = false
71
+ dropEvent.stopPropagation()
72
+
73
+ if (!dropEvent || !dropEvent.dataTransfer) return
74
+
75
+ const calendarEvent: EventInterface = JSON.parse(dropEvent.dataTransfer.getData('json'))
76
+ const eventDroppedOnSameDay = props.time.dateStringsHaveEqualDates(
77
+ calendarEvent.time.start,
78
+ props.time.dateStringFrom(props.day.dateTimeString),
79
+ )
80
+ if (eventDroppedOnSameDay) return
81
+
82
+ calendarEvent.time.start = calendarEvent.time.start.replace(
83
+ /^\d{4}-\d{2}-\d{2}/,
84
+ props.time.dateStringFrom(props.day.dateTimeString)
85
+ )
86
+ calendarEvent.time.end = calendarEvent.time.end.replace(
87
+ /^\d{4}-\d{2}-\d{2}/,
88
+ props.time.dateStringFrom(props.day.dateTimeString)
89
+ )
90
+ emit('eventWasDragged', calendarEvent)
91
+ }
92
+
93
+ function handleDragOver(e: DragEvent) {
94
+ isActiveDroppable.value = true
95
+ e.preventDefault()
96
+ return false
97
+ }
98
+
99
+ function emitDayWasClicked() {
100
+ emit('dateWasClicked', props.time.dateStringFrom(props.day.dateTimeString))
101
+ if (props.config.isSmall) emit('dayWasSelected', props.day)
102
+ }
103
+ </script>
104
+
105
+ <template>
106
+ <div
107
+ v-if="!hideLeadingAndTrailingDate"
108
+ :id="`day-${time.dateStringFrom(day.dateTimeString)}`"
109
+ class="calendar-month__weekday"
110
+ :class="{
111
+ 'is-droppable': canBeDropped,
112
+ 'color-gray': day.isTrailingOrLeadingDate,
113
+ 'is-selected': isSelected,
114
+ 'is-today': isToday,
115
+ }"
116
+ @click.self="emitDayWasClicked"
117
+ @dragleave="handleDragLeave"
118
+ @dragover="handleDragOver"
119
+ @drop="handleDrop"
120
+ @dragend="handleDragEnd"
121
+ >
122
+ <slot
123
+ name="dayCell"
124
+ :day-data="day"
125
+ >
126
+ <div class="w-100p flex justify-content-end txt14 p-025 m_h-100p">
127
+ <p
128
+ class="calendar-month__day-date ms-auto flex aspect-ratio-1 w-30px h-30px justify-content-center m_mx-auto "
129
+ @click="emitDayWasClicked"
130
+ >
131
+ {{ day.dateTimeString.substring(8, 10).startsWith('0') ? day.dateTimeString.substring(9, 10) : day.dateTimeString.substring(8, 10) }}
132
+ </p>
133
+ </div>
134
+
135
+ <div class="calendar-month_events">
136
+ <template
137
+ v-for="(calendarEvent, index) in day.events"
138
+ :key="index"
139
+ >
140
+ <Event
141
+ v-if="index < 3"
142
+ :key="calendarEvent.id"
143
+ :calendar-event="calendarEvent"
144
+ :config="config"
145
+ :time="time"
146
+ :day="day"
147
+ @eventWasClicked="$event => emit('eventWasClicked', $event.clickedEvent)"
148
+ >
149
+ <template #monthEvent="p">
150
+ <slot
151
+ :event-data="p.eventData"
152
+ name="monthEvent"
153
+ />
154
+ </template>
155
+ </Event>
156
+ </template>
157
+ <div
158
+ v-if="day.events.length >= 4"
159
+ class="calendar-month__weekday-more"
160
+ @click="getMoreEvents"
161
+ >
162
+ {{ getLanguage(languageKeys.moreEvents, time.CALENDAR_LOCALE) }}
163
+ </div>
164
+ </div>
165
+ </slot>
166
+ </div>
167
+
168
+ <div
169
+ v-else
170
+ class="space-reserver"
171
+ />
172
+ </template>
173
+
174
+ <style scoped>
175
+ .calendar-month__weekday {
176
+ height: 100%;
177
+ flex: 1;
178
+ display: flex;
179
+ flex-flow: column;
180
+ align-items: center;
181
+ border-right: var(--qalendar-border-gray-thin);
182
+ border-bottom: var(--qalendar-border-gray-thin);
183
+ overflow: hidden;
184
+ transition: background-color 0.2s ease-in-out;
185
+ }
186
+
187
+ .calendar-month__weekday.is-droppable {
188
+ background-color: var(--qalendar-light-gray);
189
+ }
190
+
191
+ .calendar-month__weekday:last-child {
192
+ border-right: 0;
193
+ }
194
+
195
+ .calendar-month__weekday.is-selected {
196
+ box-shadow: inset 0 0 0 1px var(--bgl-primary);
197
+ }
198
+
199
+ .calendar-month__weekday-more {
200
+ font-size: var(--qalendar-font-2xs);
201
+ width: 100%;
202
+ padding-left: 4px;
203
+ color: var(--qalendar-gray-quite-dark);
204
+ cursor: pointer;
205
+ }
206
+
207
+ .calendar-month_events {
208
+ width: 100%;
209
+ }
210
+
211
+ .qalendar-is-small .calendar-month_events {
212
+ display: flex;
213
+ flex-flow: row;
214
+ justify-content: center;
215
+ }
216
+
217
+ .qalendar-is-small .calendar-month_events .calendar-month__weekday-more {
218
+ display: none;
219
+ }
220
+
221
+ .calendar-month__weekday.is-today .calendar-month__day-date {
222
+ background-color: var(--bgl-primary);
223
+ color: #fff;
224
+ border-radius: 50%;
225
+ padding: 4px 6px;
226
+ }
227
+
228
+ .qalendar-is-small .calendar-month__weekday.is-today .calendar-month__day-date {
229
+ padding: 2px 4px;
230
+ }
231
+
232
+ .space-reserver {
233
+ height: 100%;
234
+ flex: 1;
235
+ display: flex;
236
+ flex-flow: column;
237
+ align-items: center;
238
+ border-right: var(--qalendar-border-gray-thin);
239
+ border-bottom: var(--qalendar-border-gray-thin);
240
+ border-right-color: transparent;
241
+ }
242
+
243
+ .space-reserver + .calendar-month__weekday:not(.trailing-or-leading) {
244
+ border-left: var(--qalendar-border-gray-thin);
245
+ }
246
+
247
+ @media (prefers-color-scheme: dark) {
248
+ .calendar-month__weekday,
249
+ .space-reserver {
250
+ border-color: var(--qalendar-dark-mode-line-color);
251
+ }
252
+ }
253
+ </style>
@@ -0,0 +1,164 @@
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+ import type Time from '../../helpers/Time'
4
+ import type { ConfigInterface } from '../../typings/config.interface'
5
+ import type { DayInterface } from '../../typings/interfaces/day.interface'
6
+ import type { EventInterface } from '../../typings/interfaces/event.interface'
7
+ import { computed, ref, onMounted } from 'vue'
8
+ import { DATE_TIME_STRING_PATTERN, EVENT_COLORS } from '../../constants'
9
+
10
+ const props = defineProps({
11
+ time: {
12
+ type: Object as PropType<Time>,
13
+ required: true,
14
+ },
15
+ calendarEvent: {
16
+ type: Object as PropType<EventInterface>,
17
+ required: true,
18
+ },
19
+ config: {
20
+ type: Object as PropType<ConfigInterface>,
21
+ required: true,
22
+ },
23
+ day: {
24
+ type: Object as PropType<DayInterface>,
25
+ required: true,
26
+ },
27
+ })
28
+
29
+ const emit = defineEmits<{
30
+ (e: 'eventWasClicked', payload: { clickedEvent: EventInterface, eventElement: HTMLElement | null }): void
31
+ }>()
32
+
33
+ const colors = ref(EVENT_COLORS as { [key: string]: string })
34
+ const eventBackgroundColor = ref('')
35
+ const eventIdPrefix = 'calendar-month__event-'
36
+
37
+ const isCustomEvent = computed(() => {
38
+ if (Array.isArray(props.calendarEvent.isCustom)) {
39
+ return props.calendarEvent.isCustom.includes('month')
40
+ }
41
+ return props.calendarEvent.isCustom || false
42
+ })
43
+
44
+ const eventTimeStart = computed(() => {
45
+ return DATE_TIME_STRING_PATTERN.test(props.calendarEvent.time.start)
46
+ ? props.time.getLocalizedTime(props.calendarEvent.time.start)
47
+ : null
48
+ })
49
+
50
+ const elementId = computed(() => eventIdPrefix + props.calendarEvent.id + props.time.dateStringFrom(props.day.dateTimeString))
51
+
52
+ const elementDraggableAttribute = computed(() => {
53
+ const {
54
+ year: startYear,
55
+ month: startMonth,
56
+ date: startDate,
57
+ } = props.time.getAllVariablesFromDateTimeString(props.calendarEvent.time.start)
58
+
59
+ const {
60
+ year: endYear,
61
+ month: endMonth,
62
+ date: endDate,
63
+ } = props.time.getAllVariablesFromDateTimeString(props.calendarEvent.time.end)
64
+
65
+ const eventIsSingleDay = startYear === endYear && startMonth === endMonth && startDate === endDate
66
+ const dragAndDropIsDisabled = props.calendarEvent.disableDnD && props.calendarEvent.disableDnD.includes('month')
67
+
68
+ return props.calendarEvent.isEditable && eventIsSingleDay && !dragAndDropIsDisabled ? true : undefined
69
+ })
70
+
71
+ function setColors() {
72
+ if (
73
+ props.calendarEvent.colorScheme
74
+ && props.config.style?.colorSchemes
75
+ && props.config.style.colorSchemes[props.calendarEvent.colorScheme]
76
+ ) {
77
+ return (eventBackgroundColor.value = props.config.style.colorSchemes[props.calendarEvent.colorScheme].backgroundColor)
78
+ }
79
+
80
+ if (props.calendarEvent.color) {
81
+ return (eventBackgroundColor.value = colors.value[props.calendarEvent.color])
82
+ }
83
+
84
+ return (eventBackgroundColor.value = colors.value.blue)
85
+ }
86
+
87
+ function handleClickOnEvent() {
88
+ const eventElement = document.getElementById(elementId.value)
89
+ emit('eventWasClicked', {
90
+ clickedEvent: props.calendarEvent,
91
+ eventElement,
92
+ })
93
+ }
94
+
95
+ function handleDragStart(dragEvent: DragEvent) {
96
+ if (!dragEvent || !dragEvent.dataTransfer) return
97
+ dragEvent.dataTransfer.effectAllowed = 'move'
98
+ dragEvent.dataTransfer.setData('json', JSON.stringify(props.calendarEvent))
99
+ }
100
+
101
+ onMounted(() => {
102
+ setColors()
103
+ })
104
+ </script>
105
+
106
+ <template>
107
+ <div
108
+ v-if="config.isSmall"
109
+ class="calendar-month__event"
110
+ />
111
+
112
+ <template v-else>
113
+ <div
114
+ v-if="isCustomEvent"
115
+ :id="elementId"
116
+ class="is-event"
117
+ data-ref="custom-event"
118
+ :class="{ grab: elementDraggableAttribute }"
119
+ :draggable="elementDraggableAttribute"
120
+ @dragstart="handleDragStart"
121
+ @click="handleClickOnEvent"
122
+ >
123
+ <slot
124
+ name="monthEvent"
125
+ :event-data="calendarEvent"
126
+ />
127
+ </div>
128
+
129
+ <div
130
+ v-else
131
+ :id="elementId"
132
+ data-ref="default-event"
133
+ class="calendar-month__event hover is-event flex align-items-center overflow-hidden radius-05 txt10 px-025 pointer user-select-none gap-025 bg-white"
134
+ :class="{ 'is-draggable': elementDraggableAttribute }"
135
+ :draggable="elementDraggableAttribute"
136
+ @dragstart="handleDragStart"
137
+ @click="handleClickOnEvent"
138
+ >
139
+ <span class="calendar-month__event-color round flex-shrink-0" />
140
+
141
+ <span
142
+ v-if="eventTimeStart && !calendarEvent.originalEvent"
143
+ class="calendar-month__event-time opacity-6 flex-shrink-0"
144
+ >
145
+ {{ eventTimeStart }}
146
+ </span>
147
+ <span class="calendar-month__event-title1 white-space ellipsis ">
148
+ {{ calendarEvent.title }}
149
+ </span>
150
+ </div>
151
+ </template>
152
+ </template>
153
+
154
+ <style scoped>
155
+ .calendar-month__event:active {
156
+ z-index: 100;
157
+ }
158
+
159
+ .calendar-month__event .calendar-month__event-color {
160
+ background-color: v-bind(eventBackgroundColor);
161
+ width: 6px;
162
+ height: 6px;
163
+ }
164
+ </style>