classcard-ui 0.2.705 → 0.2.708
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/README.md +24 -24
- package/dist/classcard-ui.common.js +68 -75
- package/dist/classcard-ui.common.js.map +1 -1
- package/dist/classcard-ui.umd.js +68 -75
- package/dist/classcard-ui.umd.js.map +1 -1
- package/dist/classcard-ui.umd.min.js +1 -1
- package/dist/classcard-ui.umd.min.js.map +1 -1
- package/package.json +81 -81
- package/src/App.vue +16 -16
- package/src/components/CAlerts/CAlerts.vue +70 -70
- package/src/components/CAlerts/index.js +2 -2
- package/src/components/CAnchorTabs/CAnchorTabs.vue +96 -96
- package/src/components/CAnchorTabs/index.js +2 -2
- package/src/components/CAnchorTag/CAnchorTag.vue +62 -62
- package/src/components/CAnchorTag/index.js +2 -2
- package/src/components/CAvatar/CAvatar.vue +112 -112
- package/src/components/CAvatar/index.js +2 -2
- package/src/components/CAvatarGroup/CAvatarGroup.vue +145 -145
- package/src/components/CAvatarGroup/index.js +2 -2
- package/src/components/CBasicTable/CBasicTable.vue +184 -184
- package/src/components/CBasicTable/index.js +2 -2
- package/src/components/CBreadcrumbs/CBreadcrumbs.vue +38 -38
- package/src/components/CBreadcrumbs/index.js +2 -2
- package/src/components/CButton/CButton.vue +147 -147
- package/src/components/CButton/index.js +2 -2
- package/src/components/CButtonGroup/CButtonGroup.vue +116 -116
- package/src/components/CButtonGroup/index.js +2 -2
- package/src/components/CButtonIcon/CButtonIcon.vue +91 -91
- package/src/components/CButtonIcon/index.js +2 -2
- package/src/components/CButtonLink/CButtonLink.vue +39 -39
- package/src/components/CButtonLink/index.js +2 -2
- package/src/components/CButtonSelect/CButtonSelect.vue +103 -103
- package/src/components/CButtonSelect/index.js +2 -2
- package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +168 -168
- package/src/components/CButtonWithDropdown/index.js +2 -2
- package/src/components/CCalendar/CCalendar.vue +401 -401
- package/src/components/CCalendar/index.js +3 -3
- package/src/components/CCard/CCard.vue +49 -49
- package/src/components/CCard/index.js +2 -2
- package/src/components/CCheckbox/CCheckbox.vue +70 -70
- package/src/components/CCheckbox/index.js +2 -2
- package/src/components/CCollapsibleSection/CCollapsibleSection.vue +99 -99
- package/src/components/CCollapsibleSection/index.js +2 -2
- package/src/components/CColorDots/CColorDots.vue +35 -35
- package/src/components/CColorDots/index.js +3 -3
- package/src/components/CConfirmActionModal/CConfirmActionModal.vue +120 -120
- package/src/components/CConfirmActionModal/index.js +3 -3
- package/src/components/CDatepicker/CDatepicker.vue +139 -139
- package/src/components/CDatepicker/index.js +2 -2
- package/src/components/CDualSelect/CDualSelect.vue +193 -193
- package/src/components/CDualSelect/index.js +2 -2
- package/src/components/CEditor/CEditor.vue +96 -96
- package/src/components/CEditor/index.js +2 -2
- package/src/components/CFormSectionHeading/CFormSectionHeading.vue +53 -53
- package/src/components/CFormSectionHeading/index.js +2 -2
- package/src/components/CGroupedSelect/CGroupedSelect.vue +217 -217
- package/src/components/CGroupedSelect/index.js +3 -3
- package/src/components/CIcon/CIcon.vue +77 -77
- package/src/components/CIcon/index.js +2 -2
- package/src/components/CIconDropdown/CIconDropdown.vue +111 -111
- package/src/components/CIconDropdown/index.js +2 -2
- package/src/components/CInput/CInput.vue +120 -120
- package/src/components/CInput/index.js +2 -2
- package/src/components/CInputAddon/CInputAddon.vue +202 -202
- package/src/components/CInputAddon/index.js +2 -2
- package/src/components/CInputEmail/CInputEmail.vue +93 -93
- package/src/components/CInputEmail/index.js +2 -2
- package/src/components/CModalHeading/CModalHeading.vue +22 -22
- package/src/components/CModalHeading/index.js +2 -2
- package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +39 -39
- package/src/components/CModuleHelpLinks/index.js +3 -3
- package/src/components/CMultiselect/CMultiselect.vue +339 -339
- package/src/components/CMultiselect/index.js +2 -2
- package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
- package/src/components/CMultiselectr/index.js +2 -2
- package/src/components/CPageHeading/CPageHeading.vue +56 -56
- package/src/components/CPageHeading/index.js +2 -2
- package/src/components/CPagination/CPagination.vue +202 -202
- package/src/components/CPagination/index.js +2 -2
- package/src/components/CPhoneNumber/CPhoneNumber.vue +81 -81
- package/src/components/CPhoneNumber/index.js +2 -2
- package/src/components/CRadio/CRadio.vue +106 -106
- package/src/components/CRadio/index.js +2 -2
- package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
- package/src/components/CRangeSlider/index.js +2 -2
- package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
- package/src/components/CReorderableStackedList/index.js +2 -2
- package/src/components/CSelect/CSelect.vue +348 -343
- package/src/components/CSelect/index.js +2 -2
- package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
- package/src/components/CSmallTimeline/index.js +2 -2
- package/src/components/CStackedList/CStackedList.vue +132 -132
- package/src/components/CStackedList/index.js +2 -2
- package/src/components/CStats/CStats.vue +111 -111
- package/src/components/CStats/index.js +2 -2
- package/src/components/CSwitch/CSwitch.vue +140 -140
- package/src/components/CSwitch/index.js +2 -2
- package/src/components/CTable/CTable.vue +536 -536
- package/src/components/CTable/index.js +2 -2
- package/src/components/CTabs/CTabs.vue +111 -111
- package/src/components/CTabs/index.js +2 -2
- package/src/components/CTag/CTag.vue +36 -36
- package/src/components/CTag/index.js +2 -2
- package/src/components/CTextarea/CTextarea.vue +95 -95
- package/src/components/CTextarea/index.js +2 -2
- package/src/components/CTimeline/CTimeline.vue +237 -237
- package/src/components/CTimeline/index.js +2 -2
- package/src/components/CUpload/CUpload.vue +231 -231
- package/src/components/CUpload/index.js +2 -2
- package/src/components/index.js +48 -48
- package/src/icons.js +285 -285
- package/src/main.js +22 -22
- package/src/stories/CAlerts.stories.js +37 -37
- package/src/stories/CAnchorTabs.stories.js +29 -29
- package/src/stories/CAnchorTag.stories.js +36 -36
- package/src/stories/CAvatar.stories.js +38 -38
- package/src/stories/CAvatarGroup.stories.js +100 -100
- package/src/stories/CBasicTable.stories.js +316 -316
- package/src/stories/CBreadcrumbs.stories.js +24 -24
- package/src/stories/CButton.stories.js +46 -46
- package/src/stories/CButtonGroup.stories.js +33 -33
- package/src/stories/CButtonIcon.stories.js +27 -27
- package/src/stories/CButtonLink.stories.js +24 -24
- package/src/stories/CButtonSelect.stories.js +32 -32
- package/src/stories/CButtonWithDropdown.stories.js +41 -41
- package/src/stories/CCalendar.stories.js +16 -16
- package/src/stories/CCard.stories.js +30 -30
- package/src/stories/CCheckbox.stories.js +29 -29
- package/src/stories/CCollapsibleSection.stories.js +28 -28
- package/src/stories/CColorDots.stories.js +28 -28
- package/src/stories/CConfirmActionModal.stories.js +59 -59
- package/src/stories/CDatepicker.stories.js +30 -30
- package/src/stories/CDualSelect.stories.js +29 -29
- package/src/stories/CEditor.stories.js +30 -30
- package/src/stories/CFormSectionHeading.stories.js +34 -34
- package/src/stories/CGroupedSelect.stories.js +69 -69
- package/src/stories/CIcon.stories.js +26 -26
- package/src/stories/CIconDropdown.stories.js +39 -39
- package/src/stories/CInput.stories.js +36 -36
- package/src/stories/CInputAddon.stories.js +37 -37
- package/src/stories/CInputEmail.stories.js +27 -27
- package/src/stories/CModalHeading.stories.js +25 -25
- package/src/stories/CModuleHelpLinks.stories.js +25 -25
- package/src/stories/CMultiselect.stories.js +97 -97
- package/src/stories/CMultiselectr.stories.js +23 -23
- package/src/stories/CPageHeading.stories.js +32 -32
- package/src/stories/CPagination.stories.js +30 -30
- package/src/stories/CPhoneNumber.stories.js +29 -29
- package/src/stories/CRadio.stories.js +36 -36
- package/src/stories/CRangeSlider.stories.js +23 -23
- package/src/stories/CReorderableStackedList.stories.js +23 -23
- package/src/stories/CSelect.stories.js +50 -50
- package/src/stories/CSmallTimeline.stories.js +26 -26
- package/src/stories/CStackedList.stories.js +37 -37
- package/src/stories/CStats.stories.js +33 -33
- package/src/stories/CSwitch.stories.js +28 -28
- package/src/stories/CTable.stories.js +77 -77
- package/src/stories/CTabs.stories.js +33 -33
- package/src/stories/CTag.stories.js +23 -23
- package/src/stories/CTextarea.stories.js +32 -32
- package/src/stories/CTimeline.stories.js +26 -26
- package/src/stories/CUpload.stories.js +36 -36
- package/src/stories/Introduction.stories.mdx +207 -207
- package/src/stories/Page.vue +88 -88
- package/src/stories/assets/code-brackets.svg +0 -0
- package/src/stories/assets/colors.svg +0 -0
- package/src/stories/assets/comments.svg +0 -0
- package/src/stories/assets/direction.svg +0 -0
- package/src/stories/assets/flow.svg +0 -0
- package/src/stories/assets/plugin.svg +0 -0
- package/src/stories/assets/repo.svg +0 -0
- package/src/stories/assets/stackalt.svg +0 -0
- package/src/stories/header.css +26 -26
- package/src/stories/page.css +69 -69
- package/src/stories/utils.css +17 -17
|
@@ -1,401 +1,401 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
3
|
-
<div>
|
|
4
|
-
<div class="grid grid-cols-1 md:grid-cols-2 md:gap-8">
|
|
5
|
-
<div :class="`sticky top-0 md:block ${calendarClasses}`">
|
|
6
|
-
<div
|
|
7
|
-
class="relative z-20 flex items-center justify-between border-b border-gray-200 py-4 px-4 sm:px-0"
|
|
8
|
-
>
|
|
9
|
-
<h2 class="flex-auto font-semibold text-gray-900">
|
|
10
|
-
{{ currentMonthAndYear }}
|
|
11
|
-
</h2>
|
|
12
|
-
<div class="flex items-center">
|
|
13
|
-
<div class="flex items-center rounded-md shadow-sm">
|
|
14
|
-
<button
|
|
15
|
-
@click="handlePreviousMonthClick"
|
|
16
|
-
type="button"
|
|
17
|
-
class="flex items-center justify-center rounded-l-md border border-r-0 border-gray-300 bg-white py-2 pl-3 pr-4 text-gray-400 hover:text-gray-500 focus:relative"
|
|
18
|
-
>
|
|
19
|
-
<span class="sr-only">Previous month</span>
|
|
20
|
-
<!-- Heroicon name: solid/chevron-left -->
|
|
21
|
-
<svg
|
|
22
|
-
class="h-5 w-5"
|
|
23
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
-
viewBox="0 0 20 20"
|
|
25
|
-
fill="currentColor"
|
|
26
|
-
aria-hidden="true"
|
|
27
|
-
>
|
|
28
|
-
<path
|
|
29
|
-
fill-rule="evenodd"
|
|
30
|
-
d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
|
|
31
|
-
clip-rule="evenodd"
|
|
32
|
-
/>
|
|
33
|
-
</svg>
|
|
34
|
-
</button>
|
|
35
|
-
<span class="relative -mx-px h-5 w-px bg-gray-300"></span>
|
|
36
|
-
<button
|
|
37
|
-
@click="handleNextMonthClick"
|
|
38
|
-
type="button"
|
|
39
|
-
class="flex items-center justify-center rounded-r-md border border-l-0 border-gray-300 bg-white py-2 pl-4 pr-3 text-gray-400 hover:text-gray-500 focus:relative"
|
|
40
|
-
>
|
|
41
|
-
<span class="sr-only">Next month</span>
|
|
42
|
-
<!-- Heroicon name: solid/chevron-right -->
|
|
43
|
-
<svg
|
|
44
|
-
class="h-5 w-5"
|
|
45
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
46
|
-
viewBox="0 0 20 20"
|
|
47
|
-
fill="currentColor"
|
|
48
|
-
aria-hidden="true"
|
|
49
|
-
>
|
|
50
|
-
<path
|
|
51
|
-
fill-rule="evenodd"
|
|
52
|
-
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
|
|
53
|
-
clip-rule="evenodd"
|
|
54
|
-
/>
|
|
55
|
-
</svg>
|
|
56
|
-
</button>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
|
|
61
|
-
<div
|
|
62
|
-
class="col-span-1 overflow-hidden rounded shadow ring-1 ring-gray-200"
|
|
63
|
-
>
|
|
64
|
-
<div
|
|
65
|
-
class="grid grid-cols-7 gap-px border-b border-gray-300 bg-gray-200 text-center text-xs font-semibold leading-6 text-gray-700"
|
|
66
|
-
>
|
|
67
|
-
<div class="bg-white py-2">Mo<span class="sr-only">on</span></div>
|
|
68
|
-
<div class="bg-white py-2">Tu<span class="sr-only">ue</span></div>
|
|
69
|
-
<div class="bg-white py-2">We<span class="sr-only">ed</span></div>
|
|
70
|
-
<div class="bg-white py-2">Th<span class="sr-only">hu</span></div>
|
|
71
|
-
<div class="bg-white py-2">Fr<span class="sr-only">ri</span></div>
|
|
72
|
-
<div class="bg-white py-2">Sa<span class="sr-only">at</span></div>
|
|
73
|
-
<div class="bg-white py-2">Su<span class="sr-only">un</span></div>
|
|
74
|
-
</div>
|
|
75
|
-
<div class="flex bg-gray-200 text-xs leading-6 text-gray-700">
|
|
76
|
-
<div class="isolate grid w-full grid-cols-7 grid-rows-6 gap-px">
|
|
77
|
-
<button
|
|
78
|
-
v-for="date in daysArray"
|
|
79
|
-
:key="getDateKey(date)"
|
|
80
|
-
type="button"
|
|
81
|
-
:class="{
|
|
82
|
-
'flex h-14 flex-col py-2 px-3 hover:bg-gray-100 focus:z-10': true,
|
|
83
|
-
'bg-white': isCurrentMonth(date),
|
|
84
|
-
'bg-gray-50': !isCurrentMonth(date),
|
|
85
|
-
'font-semibold': isSelected(date) || isToday(date),
|
|
86
|
-
'text-white': isSelected(date),
|
|
87
|
-
'text-indigo-600': !isSelected(date) && isToday(date),
|
|
88
|
-
'text-gray-900':
|
|
89
|
-
!isSelected(date) && isCurrentMonth(date) && !isToday(date),
|
|
90
|
-
'text-gray-500':
|
|
91
|
-
!isSelected(date) &&
|
|
92
|
-
!isCurrentMonth(date) &&
|
|
93
|
-
!isToday(date),
|
|
94
|
-
}"
|
|
95
|
-
@click="handleDateClick(date)"
|
|
96
|
-
>
|
|
97
|
-
<time
|
|
98
|
-
:datetime="formatForDateTime(date)"
|
|
99
|
-
:class="{
|
|
100
|
-
'ml-auto': true,
|
|
101
|
-
'flex h-6 w-6 items-center justify-center rounded-full':
|
|
102
|
-
isSelected(date),
|
|
103
|
-
'bg-indigo-600': isSelected(date) && isToday(date),
|
|
104
|
-
'bg-gray-900': isSelected(date) && !isToday(date),
|
|
105
|
-
}"
|
|
106
|
-
>{{ getDayFromDate(date) }}</time
|
|
107
|
-
>
|
|
108
|
-
<span v-if="eventsCount" class="sr-only"
|
|
109
|
-
>{{ getEventsCountForDate(date) }} events</span
|
|
110
|
-
>
|
|
111
|
-
<span
|
|
112
|
-
v-if="eventsCount && getEventsCountForDate(date) > 0"
|
|
113
|
-
class="-mx-0.5 mt-auto flex flex-wrap-reverse"
|
|
114
|
-
>
|
|
115
|
-
<span
|
|
116
|
-
class="mx-0.5 mb-1 h-1.5 w-1.5 rounded-full bg-gray-400"
|
|
117
|
-
></span>
|
|
118
|
-
</span>
|
|
119
|
-
</button>
|
|
120
|
-
</div>
|
|
121
|
-
</div>
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
<section
|
|
125
|
-
v-if="eventsData && validSelectedDate"
|
|
126
|
-
class="col-span-1 my-10 mx-4 md:mx-0 md:my-0"
|
|
127
|
-
>
|
|
128
|
-
<h2
|
|
129
|
-
v-if="showSelectedDate"
|
|
130
|
-
class="hidden py-4 font-semibold text-gray-900 md:block"
|
|
131
|
-
>
|
|
132
|
-
Schedule for
|
|
133
|
-
<time :datetime="selectedDateForDateTime">{{
|
|
134
|
-
formattedSelectedDate
|
|
135
|
-
}}</time>
|
|
136
|
-
</h2>
|
|
137
|
-
<p
|
|
138
|
-
v-if="getEventsForDate(value).length === 0"
|
|
139
|
-
class="mt-3 text-center text-sm text-gray-400"
|
|
140
|
-
>
|
|
141
|
-
Sorry, no events found for this date.
|
|
142
|
-
</p>
|
|
143
|
-
<ol
|
|
144
|
-
v-if="getEventsForDate(value).length !== 0"
|
|
145
|
-
class="mt-3 divide-y divide-gray-100 overflow-hidden rounded-lg bg-white text-sm shadow ring-1 ring-indigo-700 ring-opacity-5"
|
|
146
|
-
>
|
|
147
|
-
<li
|
|
148
|
-
class="cursor-pointer p-4 focus-within:bg-gray-50 hover:bg-gray-50"
|
|
149
|
-
v-for="event in getEventsForDate(value)"
|
|
150
|
-
:key="event.id"
|
|
151
|
-
@click="handleEventClick(event)"
|
|
152
|
-
>
|
|
153
|
-
<div class="text-sm text-gray-900">
|
|
154
|
-
{{ formatTimeFromDate(event.start) }} -
|
|
155
|
-
{{ formatTimeFromDate(event.end) }}
|
|
156
|
-
</div>
|
|
157
|
-
<div
|
|
158
|
-
class="mt-1 text-sm font-semibold"
|
|
159
|
-
:style="{ color: event.color }"
|
|
160
|
-
:class="event.status === 7 ? 'line-through' : ''"
|
|
161
|
-
>
|
|
162
|
-
{{ event.title }} ({{ event.booked }}/{{ event.seats }})
|
|
163
|
-
</div>
|
|
164
|
-
<div class="-mx-1 -my-0.5 flex flex-wrap items-center">
|
|
165
|
-
<div class="mx-1 my-0.5 flex items-center space-x-0.5">
|
|
166
|
-
<svg
|
|
167
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
168
|
-
class="h-4 w-4 flex-none text-gray-400"
|
|
169
|
-
fill="none"
|
|
170
|
-
viewBox="0 0 24 24"
|
|
171
|
-
stroke="currentColor"
|
|
172
|
-
stroke-width="2"
|
|
173
|
-
>
|
|
174
|
-
<path
|
|
175
|
-
stroke-linecap="round"
|
|
176
|
-
stroke-linejoin="round"
|
|
177
|
-
d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
|
|
178
|
-
/>
|
|
179
|
-
</svg>
|
|
180
|
-
<span class="min-w-0 flex-1 text-sm text-gray-500"
|
|
181
|
-
>{{ event.duration }} mins</span
|
|
182
|
-
>
|
|
183
|
-
</div>
|
|
184
|
-
<div
|
|
185
|
-
v-if="event.subject && event.subject.length"
|
|
186
|
-
class="mx-1 my-0.5 flex items-center space-x-0.5"
|
|
187
|
-
>
|
|
188
|
-
<svg
|
|
189
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
190
|
-
class="h-4 w-4 flex-none text-gray-400"
|
|
191
|
-
fill="none"
|
|
192
|
-
viewBox="0 0 24 24"
|
|
193
|
-
stroke="currentColor"
|
|
194
|
-
stroke-width="2"
|
|
195
|
-
>
|
|
196
|
-
<path
|
|
197
|
-
stroke-linecap="round"
|
|
198
|
-
stroke-linejoin="round"
|
|
199
|
-
d="M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z"
|
|
200
|
-
/>
|
|
201
|
-
</svg>
|
|
202
|
-
<span class="min-w-0 flex-1 text-sm text-gray-500">{{
|
|
203
|
-
event.subject
|
|
204
|
-
}}</span>
|
|
205
|
-
</div>
|
|
206
|
-
<div
|
|
207
|
-
v-if="event.location && event.location.length"
|
|
208
|
-
class="mx-1 my-0.5 flex items-center space-x-0.5"
|
|
209
|
-
>
|
|
210
|
-
<svg
|
|
211
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
212
|
-
class="h-4 w-4 flex-none text-gray-400"
|
|
213
|
-
fill="none"
|
|
214
|
-
viewBox="0 0 24 24"
|
|
215
|
-
stroke="currentColor"
|
|
216
|
-
stroke-width="2"
|
|
217
|
-
>
|
|
218
|
-
<path
|
|
219
|
-
stroke-linecap="round"
|
|
220
|
-
stroke-linejoin="round"
|
|
221
|
-
d="M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"
|
|
222
|
-
/>
|
|
223
|
-
</svg>
|
|
224
|
-
<span class="min-w-0 flex-1 text-sm text-gray-500">{{
|
|
225
|
-
event.location
|
|
226
|
-
}}</span>
|
|
227
|
-
</div>
|
|
228
|
-
<div
|
|
229
|
-
v-if="event.staff && event.staff.length"
|
|
230
|
-
class="mx-1 my-0.5 flex items-center space-x-0.5"
|
|
231
|
-
>
|
|
232
|
-
<svg
|
|
233
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
234
|
-
class="h-4 w-4 flex-none text-gray-400"
|
|
235
|
-
fill="none"
|
|
236
|
-
viewBox="0 0 24 24"
|
|
237
|
-
stroke="currentColor"
|
|
238
|
-
stroke-width="2"
|
|
239
|
-
>
|
|
240
|
-
<path
|
|
241
|
-
stroke-linecap="round"
|
|
242
|
-
stroke-linejoin="round"
|
|
243
|
-
d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
|
|
244
|
-
/>
|
|
245
|
-
</svg>
|
|
246
|
-
<span class="min-w-0 flex-1 text-sm text-gray-500">{{
|
|
247
|
-
event.staff
|
|
248
|
-
}}</span>
|
|
249
|
-
</div>
|
|
250
|
-
</div>
|
|
251
|
-
</li>
|
|
252
|
-
</ol>
|
|
253
|
-
</section>
|
|
254
|
-
</div>
|
|
255
|
-
</div>
|
|
256
|
-
</template>
|
|
257
|
-
|
|
258
|
-
<script>
|
|
259
|
-
import * as dayjs from "dayjs";
|
|
260
|
-
|
|
261
|
-
export default {
|
|
262
|
-
name: "CCalendar",
|
|
263
|
-
props: {
|
|
264
|
-
value: {
|
|
265
|
-
type: [String, Date, Object],
|
|
266
|
-
default: () => dayjs(),
|
|
267
|
-
},
|
|
268
|
-
eventsCount: {
|
|
269
|
-
type: Array,
|
|
270
|
-
default: () => null,
|
|
271
|
-
},
|
|
272
|
-
eventsData: {
|
|
273
|
-
type: Array,
|
|
274
|
-
default: () => null,
|
|
275
|
-
},
|
|
276
|
-
calendarClasses: {
|
|
277
|
-
type: String,
|
|
278
|
-
default: "",
|
|
279
|
-
},
|
|
280
|
-
showSelectedDate: {
|
|
281
|
-
type: Boolean,
|
|
282
|
-
default: true,
|
|
283
|
-
},
|
|
284
|
-
},
|
|
285
|
-
data() {
|
|
286
|
-
return {
|
|
287
|
-
activeDate: dayjs(),
|
|
288
|
-
};
|
|
289
|
-
},
|
|
290
|
-
methods: {
|
|
291
|
-
handlePreviousMonthClick() {
|
|
292
|
-
this.activeDate = this.activeDate.subtract(1, "month");
|
|
293
|
-
this.$emit("prev-month", this.getActiveStartAndEndDates());
|
|
294
|
-
},
|
|
295
|
-
handleNextMonthClick() {
|
|
296
|
-
this.activeDate = this.activeDate.add(1, "month");
|
|
297
|
-
this.$emit("next-month", this.getActiveStartAndEndDates());
|
|
298
|
-
},
|
|
299
|
-
handleDateClick(date) {
|
|
300
|
-
this.$emit("input", date);
|
|
301
|
-
},
|
|
302
|
-
getDayFromDate(date) {
|
|
303
|
-
return dayjs(date).format("D");
|
|
304
|
-
},
|
|
305
|
-
isSelected(date) {
|
|
306
|
-
return dayjs(date).isSame(this.value, "day");
|
|
307
|
-
},
|
|
308
|
-
isToday(date) {
|
|
309
|
-
return dayjs(date).isSame(dayjs(), "day");
|
|
310
|
-
},
|
|
311
|
-
isCurrentMonth(date) {
|
|
312
|
-
return dayjs(date).isSame(this.activeDate, "month");
|
|
313
|
-
},
|
|
314
|
-
getDateKey(date) {
|
|
315
|
-
return dayjs(date).format();
|
|
316
|
-
},
|
|
317
|
-
formatForDateTime(date) {
|
|
318
|
-
return dayjs(date).format("YYYY-MM-DD");
|
|
319
|
-
},
|
|
320
|
-
formatTimeFromDate(date) {
|
|
321
|
-
return dayjs(date).format("hh:mma");
|
|
322
|
-
},
|
|
323
|
-
getEventsCountForDate(date) {
|
|
324
|
-
let eventsCountObj = this.eventsCount.find((event) =>
|
|
325
|
-
dayjs(date).isSame(dayjs(event.date), "day")
|
|
326
|
-
);
|
|
327
|
-
if (eventsCountObj) {
|
|
328
|
-
return eventsCountObj.eventsCount;
|
|
329
|
-
} else {
|
|
330
|
-
return 0;
|
|
331
|
-
}
|
|
332
|
-
},
|
|
333
|
-
getActiveStartAndEndDates() {
|
|
334
|
-
return {
|
|
335
|
-
startDate: this.daysArray[0],
|
|
336
|
-
endDate: this.daysArray[this.daysArray.length - 1],
|
|
337
|
-
};
|
|
338
|
-
},
|
|
339
|
-
getEventsForDate(date) {
|
|
340
|
-
return this.eventsData.filter((event) =>
|
|
341
|
-
dayjs(date).isSame(dayjs(event.start), "day")
|
|
342
|
-
);
|
|
343
|
-
},
|
|
344
|
-
handleEventClick(event) {
|
|
345
|
-
this.$emit("event-click", event);
|
|
346
|
-
},
|
|
347
|
-
},
|
|
348
|
-
computed: {
|
|
349
|
-
currentMonthAndYear() {
|
|
350
|
-
return dayjs(this.activeDate).format("MMMM YYYY");
|
|
351
|
-
},
|
|
352
|
-
daysArray() {
|
|
353
|
-
let dates = [];
|
|
354
|
-
let firstDayOfmonth = dayjs(this.activeDate).startOf("month");
|
|
355
|
-
let lastDayOfmonth = dayjs(this.activeDate).endOf("month");
|
|
356
|
-
let firstDayOfMonthInWeek = firstDayOfmonth.day();
|
|
357
|
-
let lastDayOfMonthInWeek = lastDayOfmonth.day();
|
|
358
|
-
if (firstDayOfMonthInWeek === 0) {
|
|
359
|
-
firstDayOfMonthInWeek = 7;
|
|
360
|
-
}
|
|
361
|
-
if (lastDayOfMonthInWeek === 0) {
|
|
362
|
-
lastDayOfMonthInWeek = 7;
|
|
363
|
-
}
|
|
364
|
-
for (let i = 0; i < firstDayOfMonthInWeek - 1; i++) {
|
|
365
|
-
dates.unshift(firstDayOfmonth.subtract(i + 1, "day"));
|
|
366
|
-
}
|
|
367
|
-
for (let i = 0; i < dayjs(this.activeDate).daysInMonth(); i++) {
|
|
368
|
-
dates.push(firstDayOfmonth.add(i, "day"));
|
|
369
|
-
}
|
|
370
|
-
let cursor = 1;
|
|
371
|
-
for (let i = lastDayOfMonthInWeek; i < 7; i++) {
|
|
372
|
-
dates.push(lastDayOfmonth.add(cursor, "day"));
|
|
373
|
-
cursor++;
|
|
374
|
-
}
|
|
375
|
-
if (dates.length !== 42) {
|
|
376
|
-
let lastDayOfDates = dates[dates.length - 1];
|
|
377
|
-
for (let i = 1; i <= 7; i++) {
|
|
378
|
-
dates.push(lastDayOfDates.add(i, "day"));
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
return dates;
|
|
382
|
-
},
|
|
383
|
-
formattedSelectedDate() {
|
|
384
|
-
return dayjs(this.value ?? dayjs()).format("MMMM D, YYYY");
|
|
385
|
-
},
|
|
386
|
-
selectedDateForDateTime() {
|
|
387
|
-
return dayjs(this.value ?? dayjs()).format("YYYY-MM-DD");
|
|
388
|
-
},
|
|
389
|
-
validSelectedDate() {
|
|
390
|
-
return this.value && dayjs(this.value).isValid();
|
|
391
|
-
},
|
|
392
|
-
},
|
|
393
|
-
mounted() {
|
|
394
|
-
if (this.value) {
|
|
395
|
-
this.activeDate = dayjs(this.value);
|
|
396
|
-
}
|
|
397
|
-
},
|
|
398
|
-
};
|
|
399
|
-
</script>
|
|
400
|
-
|
|
401
|
-
<style></style>
|
|
1
|
+
<template>
|
|
2
|
+
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
3
|
+
<div>
|
|
4
|
+
<div class="grid grid-cols-1 md:grid-cols-2 md:gap-8">
|
|
5
|
+
<div :class="`sticky top-0 md:block ${calendarClasses}`">
|
|
6
|
+
<div
|
|
7
|
+
class="relative z-20 flex items-center justify-between border-b border-gray-200 py-4 px-4 sm:px-0"
|
|
8
|
+
>
|
|
9
|
+
<h2 class="flex-auto font-semibold text-gray-900">
|
|
10
|
+
{{ currentMonthAndYear }}
|
|
11
|
+
</h2>
|
|
12
|
+
<div class="flex items-center">
|
|
13
|
+
<div class="flex items-center rounded-md shadow-sm">
|
|
14
|
+
<button
|
|
15
|
+
@click="handlePreviousMonthClick"
|
|
16
|
+
type="button"
|
|
17
|
+
class="flex items-center justify-center rounded-l-md border border-r-0 border-gray-300 bg-white py-2 pl-3 pr-4 text-gray-400 hover:text-gray-500 focus:relative"
|
|
18
|
+
>
|
|
19
|
+
<span class="sr-only">Previous month</span>
|
|
20
|
+
<!-- Heroicon name: solid/chevron-left -->
|
|
21
|
+
<svg
|
|
22
|
+
class="h-5 w-5"
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
viewBox="0 0 20 20"
|
|
25
|
+
fill="currentColor"
|
|
26
|
+
aria-hidden="true"
|
|
27
|
+
>
|
|
28
|
+
<path
|
|
29
|
+
fill-rule="evenodd"
|
|
30
|
+
d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z"
|
|
31
|
+
clip-rule="evenodd"
|
|
32
|
+
/>
|
|
33
|
+
</svg>
|
|
34
|
+
</button>
|
|
35
|
+
<span class="relative -mx-px h-5 w-px bg-gray-300"></span>
|
|
36
|
+
<button
|
|
37
|
+
@click="handleNextMonthClick"
|
|
38
|
+
type="button"
|
|
39
|
+
class="flex items-center justify-center rounded-r-md border border-l-0 border-gray-300 bg-white py-2 pl-4 pr-3 text-gray-400 hover:text-gray-500 focus:relative"
|
|
40
|
+
>
|
|
41
|
+
<span class="sr-only">Next month</span>
|
|
42
|
+
<!-- Heroicon name: solid/chevron-right -->
|
|
43
|
+
<svg
|
|
44
|
+
class="h-5 w-5"
|
|
45
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
46
|
+
viewBox="0 0 20 20"
|
|
47
|
+
fill="currentColor"
|
|
48
|
+
aria-hidden="true"
|
|
49
|
+
>
|
|
50
|
+
<path
|
|
51
|
+
fill-rule="evenodd"
|
|
52
|
+
d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
|
|
53
|
+
clip-rule="evenodd"
|
|
54
|
+
/>
|
|
55
|
+
</svg>
|
|
56
|
+
</button>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div
|
|
62
|
+
class="col-span-1 overflow-hidden rounded shadow ring-1 ring-gray-200"
|
|
63
|
+
>
|
|
64
|
+
<div
|
|
65
|
+
class="grid grid-cols-7 gap-px border-b border-gray-300 bg-gray-200 text-center text-xs font-semibold leading-6 text-gray-700"
|
|
66
|
+
>
|
|
67
|
+
<div class="bg-white py-2">Mo<span class="sr-only">on</span></div>
|
|
68
|
+
<div class="bg-white py-2">Tu<span class="sr-only">ue</span></div>
|
|
69
|
+
<div class="bg-white py-2">We<span class="sr-only">ed</span></div>
|
|
70
|
+
<div class="bg-white py-2">Th<span class="sr-only">hu</span></div>
|
|
71
|
+
<div class="bg-white py-2">Fr<span class="sr-only">ri</span></div>
|
|
72
|
+
<div class="bg-white py-2">Sa<span class="sr-only">at</span></div>
|
|
73
|
+
<div class="bg-white py-2">Su<span class="sr-only">un</span></div>
|
|
74
|
+
</div>
|
|
75
|
+
<div class="flex bg-gray-200 text-xs leading-6 text-gray-700">
|
|
76
|
+
<div class="isolate grid w-full grid-cols-7 grid-rows-6 gap-px">
|
|
77
|
+
<button
|
|
78
|
+
v-for="date in daysArray"
|
|
79
|
+
:key="getDateKey(date)"
|
|
80
|
+
type="button"
|
|
81
|
+
:class="{
|
|
82
|
+
'flex h-14 flex-col py-2 px-3 hover:bg-gray-100 focus:z-10': true,
|
|
83
|
+
'bg-white': isCurrentMonth(date),
|
|
84
|
+
'bg-gray-50': !isCurrentMonth(date),
|
|
85
|
+
'font-semibold': isSelected(date) || isToday(date),
|
|
86
|
+
'text-white': isSelected(date),
|
|
87
|
+
'text-indigo-600': !isSelected(date) && isToday(date),
|
|
88
|
+
'text-gray-900':
|
|
89
|
+
!isSelected(date) && isCurrentMonth(date) && !isToday(date),
|
|
90
|
+
'text-gray-500':
|
|
91
|
+
!isSelected(date) &&
|
|
92
|
+
!isCurrentMonth(date) &&
|
|
93
|
+
!isToday(date),
|
|
94
|
+
}"
|
|
95
|
+
@click="handleDateClick(date)"
|
|
96
|
+
>
|
|
97
|
+
<time
|
|
98
|
+
:datetime="formatForDateTime(date)"
|
|
99
|
+
:class="{
|
|
100
|
+
'ml-auto': true,
|
|
101
|
+
'flex h-6 w-6 items-center justify-center rounded-full':
|
|
102
|
+
isSelected(date),
|
|
103
|
+
'bg-indigo-600': isSelected(date) && isToday(date),
|
|
104
|
+
'bg-gray-900': isSelected(date) && !isToday(date),
|
|
105
|
+
}"
|
|
106
|
+
>{{ getDayFromDate(date) }}</time
|
|
107
|
+
>
|
|
108
|
+
<span v-if="eventsCount" class="sr-only"
|
|
109
|
+
>{{ getEventsCountForDate(date) }} events</span
|
|
110
|
+
>
|
|
111
|
+
<span
|
|
112
|
+
v-if="eventsCount && getEventsCountForDate(date) > 0"
|
|
113
|
+
class="-mx-0.5 mt-auto flex flex-wrap-reverse"
|
|
114
|
+
>
|
|
115
|
+
<span
|
|
116
|
+
class="mx-0.5 mb-1 h-1.5 w-1.5 rounded-full bg-gray-400"
|
|
117
|
+
></span>
|
|
118
|
+
</span>
|
|
119
|
+
</button>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
<section
|
|
125
|
+
v-if="eventsData && validSelectedDate"
|
|
126
|
+
class="col-span-1 my-10 mx-4 md:mx-0 md:my-0"
|
|
127
|
+
>
|
|
128
|
+
<h2
|
|
129
|
+
v-if="showSelectedDate"
|
|
130
|
+
class="hidden py-4 font-semibold text-gray-900 md:block"
|
|
131
|
+
>
|
|
132
|
+
Schedule for
|
|
133
|
+
<time :datetime="selectedDateForDateTime">{{
|
|
134
|
+
formattedSelectedDate
|
|
135
|
+
}}</time>
|
|
136
|
+
</h2>
|
|
137
|
+
<p
|
|
138
|
+
v-if="getEventsForDate(value).length === 0"
|
|
139
|
+
class="mt-3 text-center text-sm text-gray-400"
|
|
140
|
+
>
|
|
141
|
+
Sorry, no events found for this date.
|
|
142
|
+
</p>
|
|
143
|
+
<ol
|
|
144
|
+
v-if="getEventsForDate(value).length !== 0"
|
|
145
|
+
class="mt-3 divide-y divide-gray-100 overflow-hidden rounded-lg bg-white text-sm shadow ring-1 ring-indigo-700 ring-opacity-5"
|
|
146
|
+
>
|
|
147
|
+
<li
|
|
148
|
+
class="cursor-pointer p-4 focus-within:bg-gray-50 hover:bg-gray-50"
|
|
149
|
+
v-for="event in getEventsForDate(value)"
|
|
150
|
+
:key="event.id"
|
|
151
|
+
@click="handleEventClick(event)"
|
|
152
|
+
>
|
|
153
|
+
<div class="text-sm text-gray-900">
|
|
154
|
+
{{ formatTimeFromDate(event.start) }} -
|
|
155
|
+
{{ formatTimeFromDate(event.end) }}
|
|
156
|
+
</div>
|
|
157
|
+
<div
|
|
158
|
+
class="mt-1 text-sm font-semibold"
|
|
159
|
+
:style="{ color: event.color }"
|
|
160
|
+
:class="event.status === 7 ? 'line-through' : ''"
|
|
161
|
+
>
|
|
162
|
+
{{ event.title }} ({{ event.booked }}/{{ event.seats }})
|
|
163
|
+
</div>
|
|
164
|
+
<div class="-mx-1 -my-0.5 flex flex-wrap items-center">
|
|
165
|
+
<div class="mx-1 my-0.5 flex items-center space-x-0.5">
|
|
166
|
+
<svg
|
|
167
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
168
|
+
class="h-4 w-4 flex-none text-gray-400"
|
|
169
|
+
fill="none"
|
|
170
|
+
viewBox="0 0 24 24"
|
|
171
|
+
stroke="currentColor"
|
|
172
|
+
stroke-width="2"
|
|
173
|
+
>
|
|
174
|
+
<path
|
|
175
|
+
stroke-linecap="round"
|
|
176
|
+
stroke-linejoin="round"
|
|
177
|
+
d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
|
|
178
|
+
/>
|
|
179
|
+
</svg>
|
|
180
|
+
<span class="min-w-0 flex-1 text-sm text-gray-500"
|
|
181
|
+
>{{ event.duration }} mins</span
|
|
182
|
+
>
|
|
183
|
+
</div>
|
|
184
|
+
<div
|
|
185
|
+
v-if="event.subject && event.subject.length"
|
|
186
|
+
class="mx-1 my-0.5 flex items-center space-x-0.5"
|
|
187
|
+
>
|
|
188
|
+
<svg
|
|
189
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
190
|
+
class="h-4 w-4 flex-none text-gray-400"
|
|
191
|
+
fill="none"
|
|
192
|
+
viewBox="0 0 24 24"
|
|
193
|
+
stroke="currentColor"
|
|
194
|
+
stroke-width="2"
|
|
195
|
+
>
|
|
196
|
+
<path
|
|
197
|
+
stroke-linecap="round"
|
|
198
|
+
stroke-linejoin="round"
|
|
199
|
+
d="M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z"
|
|
200
|
+
/>
|
|
201
|
+
</svg>
|
|
202
|
+
<span class="min-w-0 flex-1 text-sm text-gray-500">{{
|
|
203
|
+
event.subject
|
|
204
|
+
}}</span>
|
|
205
|
+
</div>
|
|
206
|
+
<div
|
|
207
|
+
v-if="event.location && event.location.length"
|
|
208
|
+
class="mx-1 my-0.5 flex items-center space-x-0.5"
|
|
209
|
+
>
|
|
210
|
+
<svg
|
|
211
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
212
|
+
class="h-4 w-4 flex-none text-gray-400"
|
|
213
|
+
fill="none"
|
|
214
|
+
viewBox="0 0 24 24"
|
|
215
|
+
stroke="currentColor"
|
|
216
|
+
stroke-width="2"
|
|
217
|
+
>
|
|
218
|
+
<path
|
|
219
|
+
stroke-linecap="round"
|
|
220
|
+
stroke-linejoin="round"
|
|
221
|
+
d="M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"
|
|
222
|
+
/>
|
|
223
|
+
</svg>
|
|
224
|
+
<span class="min-w-0 flex-1 text-sm text-gray-500">{{
|
|
225
|
+
event.location
|
|
226
|
+
}}</span>
|
|
227
|
+
</div>
|
|
228
|
+
<div
|
|
229
|
+
v-if="event.staff && event.staff.length"
|
|
230
|
+
class="mx-1 my-0.5 flex items-center space-x-0.5"
|
|
231
|
+
>
|
|
232
|
+
<svg
|
|
233
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
234
|
+
class="h-4 w-4 flex-none text-gray-400"
|
|
235
|
+
fill="none"
|
|
236
|
+
viewBox="0 0 24 24"
|
|
237
|
+
stroke="currentColor"
|
|
238
|
+
stroke-width="2"
|
|
239
|
+
>
|
|
240
|
+
<path
|
|
241
|
+
stroke-linecap="round"
|
|
242
|
+
stroke-linejoin="round"
|
|
243
|
+
d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
|
|
244
|
+
/>
|
|
245
|
+
</svg>
|
|
246
|
+
<span class="min-w-0 flex-1 text-sm text-gray-500">{{
|
|
247
|
+
event.staff
|
|
248
|
+
}}</span>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
</li>
|
|
252
|
+
</ol>
|
|
253
|
+
</section>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
</template>
|
|
257
|
+
|
|
258
|
+
<script>
|
|
259
|
+
import * as dayjs from "dayjs";
|
|
260
|
+
|
|
261
|
+
export default {
|
|
262
|
+
name: "CCalendar",
|
|
263
|
+
props: {
|
|
264
|
+
value: {
|
|
265
|
+
type: [String, Date, Object],
|
|
266
|
+
default: () => dayjs(),
|
|
267
|
+
},
|
|
268
|
+
eventsCount: {
|
|
269
|
+
type: Array,
|
|
270
|
+
default: () => null,
|
|
271
|
+
},
|
|
272
|
+
eventsData: {
|
|
273
|
+
type: Array,
|
|
274
|
+
default: () => null,
|
|
275
|
+
},
|
|
276
|
+
calendarClasses: {
|
|
277
|
+
type: String,
|
|
278
|
+
default: "",
|
|
279
|
+
},
|
|
280
|
+
showSelectedDate: {
|
|
281
|
+
type: Boolean,
|
|
282
|
+
default: true,
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
data() {
|
|
286
|
+
return {
|
|
287
|
+
activeDate: dayjs(),
|
|
288
|
+
};
|
|
289
|
+
},
|
|
290
|
+
methods: {
|
|
291
|
+
handlePreviousMonthClick() {
|
|
292
|
+
this.activeDate = this.activeDate.subtract(1, "month");
|
|
293
|
+
this.$emit("prev-month", this.getActiveStartAndEndDates());
|
|
294
|
+
},
|
|
295
|
+
handleNextMonthClick() {
|
|
296
|
+
this.activeDate = this.activeDate.add(1, "month");
|
|
297
|
+
this.$emit("next-month", this.getActiveStartAndEndDates());
|
|
298
|
+
},
|
|
299
|
+
handleDateClick(date) {
|
|
300
|
+
this.$emit("input", date);
|
|
301
|
+
},
|
|
302
|
+
getDayFromDate(date) {
|
|
303
|
+
return dayjs(date).format("D");
|
|
304
|
+
},
|
|
305
|
+
isSelected(date) {
|
|
306
|
+
return dayjs(date).isSame(this.value, "day");
|
|
307
|
+
},
|
|
308
|
+
isToday(date) {
|
|
309
|
+
return dayjs(date).isSame(dayjs(), "day");
|
|
310
|
+
},
|
|
311
|
+
isCurrentMonth(date) {
|
|
312
|
+
return dayjs(date).isSame(this.activeDate, "month");
|
|
313
|
+
},
|
|
314
|
+
getDateKey(date) {
|
|
315
|
+
return dayjs(date).format();
|
|
316
|
+
},
|
|
317
|
+
formatForDateTime(date) {
|
|
318
|
+
return dayjs(date).format("YYYY-MM-DD");
|
|
319
|
+
},
|
|
320
|
+
formatTimeFromDate(date) {
|
|
321
|
+
return dayjs(date).format("hh:mma");
|
|
322
|
+
},
|
|
323
|
+
getEventsCountForDate(date) {
|
|
324
|
+
let eventsCountObj = this.eventsCount.find((event) =>
|
|
325
|
+
dayjs(date).isSame(dayjs(event.date), "day")
|
|
326
|
+
);
|
|
327
|
+
if (eventsCountObj) {
|
|
328
|
+
return eventsCountObj.eventsCount;
|
|
329
|
+
} else {
|
|
330
|
+
return 0;
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
getActiveStartAndEndDates() {
|
|
334
|
+
return {
|
|
335
|
+
startDate: this.daysArray[0],
|
|
336
|
+
endDate: this.daysArray[this.daysArray.length - 1],
|
|
337
|
+
};
|
|
338
|
+
},
|
|
339
|
+
getEventsForDate(date) {
|
|
340
|
+
return this.eventsData.filter((event) =>
|
|
341
|
+
dayjs(date).isSame(dayjs(event.start), "day")
|
|
342
|
+
);
|
|
343
|
+
},
|
|
344
|
+
handleEventClick(event) {
|
|
345
|
+
this.$emit("event-click", event);
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
computed: {
|
|
349
|
+
currentMonthAndYear() {
|
|
350
|
+
return dayjs(this.activeDate).format("MMMM YYYY");
|
|
351
|
+
},
|
|
352
|
+
daysArray() {
|
|
353
|
+
let dates = [];
|
|
354
|
+
let firstDayOfmonth = dayjs(this.activeDate).startOf("month");
|
|
355
|
+
let lastDayOfmonth = dayjs(this.activeDate).endOf("month");
|
|
356
|
+
let firstDayOfMonthInWeek = firstDayOfmonth.day();
|
|
357
|
+
let lastDayOfMonthInWeek = lastDayOfmonth.day();
|
|
358
|
+
if (firstDayOfMonthInWeek === 0) {
|
|
359
|
+
firstDayOfMonthInWeek = 7;
|
|
360
|
+
}
|
|
361
|
+
if (lastDayOfMonthInWeek === 0) {
|
|
362
|
+
lastDayOfMonthInWeek = 7;
|
|
363
|
+
}
|
|
364
|
+
for (let i = 0; i < firstDayOfMonthInWeek - 1; i++) {
|
|
365
|
+
dates.unshift(firstDayOfmonth.subtract(i + 1, "day"));
|
|
366
|
+
}
|
|
367
|
+
for (let i = 0; i < dayjs(this.activeDate).daysInMonth(); i++) {
|
|
368
|
+
dates.push(firstDayOfmonth.add(i, "day"));
|
|
369
|
+
}
|
|
370
|
+
let cursor = 1;
|
|
371
|
+
for (let i = lastDayOfMonthInWeek; i < 7; i++) {
|
|
372
|
+
dates.push(lastDayOfmonth.add(cursor, "day"));
|
|
373
|
+
cursor++;
|
|
374
|
+
}
|
|
375
|
+
if (dates.length !== 42) {
|
|
376
|
+
let lastDayOfDates = dates[dates.length - 1];
|
|
377
|
+
for (let i = 1; i <= 7; i++) {
|
|
378
|
+
dates.push(lastDayOfDates.add(i, "day"));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return dates;
|
|
382
|
+
},
|
|
383
|
+
formattedSelectedDate() {
|
|
384
|
+
return dayjs(this.value ?? dayjs()).format("MMMM D, YYYY");
|
|
385
|
+
},
|
|
386
|
+
selectedDateForDateTime() {
|
|
387
|
+
return dayjs(this.value ?? dayjs()).format("YYYY-MM-DD");
|
|
388
|
+
},
|
|
389
|
+
validSelectedDate() {
|
|
390
|
+
return this.value && dayjs(this.value).isValid();
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
mounted() {
|
|
394
|
+
if (this.value) {
|
|
395
|
+
this.activeDate = dayjs(this.value);
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
</script>
|
|
400
|
+
|
|
401
|
+
<style></style>
|