|
1 | 1 | <template> |
2 | 2 | <v-row justify="center" align="center"> |
3 | 3 | <v-col cols="12" sm="12" md="12" lg="8"> |
4 | | - <v-calendar |
5 | | - ref="calendar" |
6 | | - :now="today" |
7 | | - :value="today" |
8 | | - first-interval="7" |
9 | | - :interval-count="intervalCount" |
10 | | - type="week" |
11 | | - :events="events" |
12 | | - ></v-calendar> |
| 4 | + <v-sheet> |
| 5 | + <v-calendar |
| 6 | + ref="calendar" |
| 7 | + :now="today" |
| 8 | + :value="today" |
| 9 | + first-interval="7" |
| 10 | + :interval-count="intervalCount" |
| 11 | + type="week" |
| 12 | + :events="events" |
| 13 | + :event-color="getEventColor" |
| 14 | + @click:event="showEvent" |
| 15 | + > |
| 16 | + <template v-slot:event="{ event, eventParsed }"> |
| 17 | + <v-card |
| 18 | + :key="event.crn" |
| 19 | + :title="event.name" |
| 20 | + :color="getEventColor(event)" |
| 21 | + height="100%" |
| 22 | + class="text-center" |
| 23 | + tile |
| 24 | + > |
| 25 | + {{ event.name }} |
| 26 | + <!-- <v-chip> {{ event.start)}} </v-chip> --> |
| 27 | + <!-- <v-chip> {{ event.end)}} </v-chip> --> |
| 28 | + </v-card> |
| 29 | + </template> |
| 30 | + </v-calendar> |
| 31 | + <v-menu |
| 32 | + v-model="selectedOpen" |
| 33 | + :close-on-content-click="false" |
| 34 | + :activator="selectedElement" |
| 35 | + offset-x |
| 36 | + > |
| 37 | + <v-card min-width="350px" flat> |
| 38 | + <v-toolbar :color="getEventColor(selectedEvent)"> |
| 39 | + <v-btn |
| 40 | + @click=" |
| 41 | + $emit('class:delete', selectedEvent) |
| 42 | + selectedOpen = false |
| 43 | + " |
| 44 | + icon |
| 45 | + > |
| 46 | + <v-icon>mdi-delete</v-icon> |
| 47 | + </v-btn> |
| 48 | + <v-toolbar-title v-html="selectedEvent.name"></v-toolbar-title> |
| 49 | + <v-spacer></v-spacer> |
| 50 | + <!-- <v-btn icon> <v-icon>mdi-heart</v-icon> </v-btn> --> |
| 51 | + <!-- <v-btn icon> <v-icon>mdi-dots-vertical</v-icon> </v-btn> --> |
| 52 | + </v-toolbar> |
| 53 | + <v-card-text> |
| 54 | + <v-simple-table> |
| 55 | + <template v-slot:default> |
| 56 | + <tbody> |
| 57 | + <tr> |
| 58 | + <td>Name:</td> |
| 59 | + <td>{{ selectedEvent.name }}</td> |
| 60 | + </tr> |
| 61 | + |
| 62 | + <tr> |
| 63 | + <td>Code:</td> |
| 64 | + <td>{{ selectedEvent.code }}</td> |
| 65 | + </tr> |
| 66 | + |
| 67 | + <tr> |
| 68 | + <td>CRN:</td> |
| 69 | + <td>{{ selectedEvent.crn }}</td> |
| 70 | + </tr> |
| 71 | + |
| 72 | + <tr> |
| 73 | + <td>Start:</td> |
| 74 | + <td>{{ selectedEvent.start }}</td> |
| 75 | + </tr> |
| 76 | + |
| 77 | + <tr> |
| 78 | + <td>End:</td> |
| 79 | + <td>{{ selectedEvent.end }}</td> |
| 80 | + </tr> |
| 81 | + |
| 82 | + <tr> |
| 83 | + <td>Section:</td> |
| 84 | + <td>{{ selectedEvent.section }}</td> |
| 85 | + </tr> |
| 86 | + |
| 87 | + <tr> |
| 88 | + <td>Instructor:</td> |
| 89 | + <td>{{ selectedEvent.instructor }}</td> |
| 90 | + </tr> |
| 91 | + </tbody> |
| 92 | + </template> |
| 93 | + </v-simple-table> |
| 94 | + </v-card-text> |
| 95 | + <v-card-actions> |
| 96 | + <v-btn text color="secondary" @click="selectedOpen = false"> |
| 97 | + Close |
| 98 | + </v-btn> |
| 99 | + </v-card-actions> |
| 100 | + </v-card> |
| 101 | + </v-menu> |
| 102 | + </v-sheet> |
13 | 103 | </v-col> |
14 | 104 | </v-row> |
15 | 105 | </template> |
|
18 | 108 | export default { |
19 | 109 | props: { classes: { type: Array, default: () => [] } }, |
20 | 110 | data() { |
21 | | - return { today: '2022-05-0' } |
| 111 | + return { |
| 112 | + colors: ['blue', 'indigo', 'deep-purple', 'cyan', 'green', 'orange'], |
| 113 | +
|
| 114 | + today: '2022-05-0', |
| 115 | + selectedEvent: {}, |
| 116 | + selectedElement: null, |
| 117 | + selectedOpen: false, |
| 118 | + } |
| 119 | + }, |
| 120 | + methods: { |
| 121 | + getEventColor(e) { |
| 122 | + // in case nothing is selected yet |
| 123 | + if (!e.name) { |
| 124 | + return null |
| 125 | + } |
| 126 | + //generate 'random' color based on name of the course |
| 127 | + let rand_number = e.name |
| 128 | + .split('') |
| 129 | + .map((c) => c.codePointAt(0)) |
| 130 | + .reduce((a, b) => a + b) |
| 131 | + let l = this.colors.length |
| 132 | + return this.colors[rand_number % l] |
| 133 | + }, |
| 134 | + showEvent({ nativeEvent, event }) { |
| 135 | + const open = () => { |
| 136 | + this.selectedEvent = event |
| 137 | + let other_data = this.classes.find((c) => c.name == event.name) |
| 138 | + this.selectedEvent = { ...event, ...other_data } |
| 139 | +
|
| 140 | + this.selectedElement = nativeEvent.target |
| 141 | + requestAnimationFrame(() => |
| 142 | + requestAnimationFrame(() => (this.selectedOpen = true)) |
| 143 | + ) |
| 144 | + } |
| 145 | +
|
| 146 | + if (this.selectedOpen) { |
| 147 | + this.selectedOpen = false |
| 148 | + requestAnimationFrame(() => requestAnimationFrame(() => open())) |
| 149 | + } else { |
| 150 | + open() |
| 151 | + } |
| 152 | +
|
| 153 | + nativeEvent.stopPropagation() |
| 154 | + }, |
22 | 155 | }, |
23 | 156 | computed: { |
24 | 157 | intervalCount() { |
25 | 158 | let intervals = this.events.map((e) => e.end.slice(11, 13)) |
26 | | - console.log(intervals) |
27 | 159 | intervals = intervals.map(Number) |
28 | | - console.log(intervals) |
29 | 160 |
|
30 | 161 | if (intervals.length == 0) { |
31 | 162 | return 5 |
|
0 commit comments