-
Notifications
You must be signed in to change notification settings - Fork 400
/
Copy pathCalendar.vue
120 lines (115 loc) · 3.2 KB
/
Calendar.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<template>
<LayoutHeader>
<template #left-header>
<ViewBreadcrumbs routeName="Calendar" />
</template>
<template #right-header>
<Button variant="solid" :label="__('Create')" @click="createEvent">
<template #prefix><FeatherIcon name="plus" class="h-4" /></template>
</Button>
</template>
</LayoutHeader>
<div class="flex h-screen flex-col overflow-hidden">
<Calendar
v-if="events.data?.length"
:config="{
defaultMode: 'Week',
isEditMode: true,
eventIcons: {},
allowCustomClickEvents: true,
redundantCellHeight: 100,
enableShortcuts: false,
noBorder: true,
}"
:events="events.data"
@create="(event) => createEvent(event)"
@update="(event) => updateEvent(event)"
@delete="(eventID) => deleteEvent(eventID)"
>
<template
#header="{
currentMonthYear,
enabledModes,
activeView,
decrement,
increment,
updateActiveView,
}"
>
<div class="my-4 mx-5 flex justify-between">
<!-- left side -->
<!-- Year, Month -->
<span class="text-lg font-medium text-ink-gray-8">
{{ currentMonthYear }}
</span>
<!-- right side -->
<!-- actions buttons for calendar -->
<div class="flex gap-x-1">
<!-- Increment and Decrement Button-->
<Button
@click="decrement()"
variant="ghost"
class="h-4 w-4"
icon="chevron-left"
/>
<Button
@click="increment()"
variant="ghost"
class="h-4 w-4"
icon="chevron-right"
/>
<!-- View change button, default is months or can be set via props! -->
<TabButtons
:buttons="enabledModes"
class="ml-2"
:modelValue="activeView"
@update:modelValue="updateActiveView($event)"
/>
</div>
</div>
</template>
</Calendar>
</div>
</template>
<script setup>
import ViewBreadcrumbs from '@/components/ViewBreadcrumbs.vue'
import LayoutHeader from '@/components/LayoutHeader.vue'
import { sessionStore } from '@/stores/session'
import { Calendar, createListResource, TabButtons } from 'frappe-ui'
const { user } = sessionStore()
const events = createListResource({
doctype: 'Event',
fields: ['name', 'status', 'subject', 'starts_on', 'ends_on'],
filters: { status: 'Open', owner: user },
auto: true,
transform: (data) => {
return data.map((event) => ({
id: event.name,
title: event.subject,
fromDate: event.starts_on,
toDate: event.ends_on,
color: event.color,
}))
},
})
function createEvent(event) {
events.insert.submit({
subject: event.title,
starts_on: event.fromDate,
ends_on: event.toDate,
color: event.color,
})
}
function updateEvent(event) {
events.setValue.submit({
name: event.id,
subject: event.title,
starts_on: event.fromDate,
ends_on: event.toDate,
color: event.color,
})
}
function deleteEvent(eventID) {
events.delete.submit(eventID)
}
</script>