# 萬年曆 Calendar Part4
使用的架構為 Vue + Vuetify + Firebase storage
版本別如下:
名稱 | 版本 |
---|---|
Vue | 2.6.11 |
Vuetify | 2.6.0 |
Firebase | 9.6.10 |
firestore | 1.1.6 |
source code (opens new window) 因為接下來都是片段整理,如果有不清楚的地方可以找到 source code 來看一下
建立刪除、修改功能,以下截取部分程式碼,擷取 v-calendar 下面的 v-menu
<template>
...
<v-menu
v-model="selectedOpen"
:close-on-content-click="false"
:activator="selectedElement"
offset-x
>
<v-card color="grey lighten-4" min-width="350px" flat>
<v-toolbar :color="selectedEvent.color">
<!-- 把其他的 icon 刪除,只留下 delete icon 再加入 deleteEvent -->
<v-btn @click="deleteEvent(selectedEvent.id)" icon>
<v-icon>mdi-delete</v-icon>
</v-btn>
<v-toolbar-title v-html="selectedEvent.name"></v-toolbar-title>
<v-spacer></v-spacer>
</v-toolbar>
<v-card-text>
<!-- v-card-text 原本的內容刪掉,加入 form 進去 -->
<form v-if="currentlyEditing !== selectedEvent.id">
{{ selectedEvent.details }}
</form>
<form v-else>
<!-- 剛剛安裝的套件 -->
<textarea-autosize
v-model="selectedEvent.details"
type="text"
style="width: 100%"
:min-height="100"
placeholder="add note"
>
</textarea-autosize>
</form>
</v-card-text>
<v-card-actions>
<v-btn text color="secondary" @click="selectedOpen = false">
<!-- 原本為 Cancel 改成 Close -->
Close
</v-btn>
<!-- 新增儲存與更新的按鈕 -->
<!-- 編輯 -->
<v-btn
text
v-if="currentlyEditing !== selectedEvent.id"
@click.prevent="editEvent(selectedEvent)"
>
Edit
</v-btn>
<!-- 儲存 -->
<v-btn text v-else @click.prevent="updateEvent(selectedEvent)">
Save
</v-btn>
</v-card-actions>
</v-card>
</v-menu>
...
</template>
<script>
// 上面新增了刪除、編輯、修改的方法,在下面新增吧
export default {
methods: {
editEvent(event) {
// click 把事件 id 塞入 currentlyEditing,上面字串就變成 textarea
this.currentlyEditing = event.id;
},
async updateEvent(event) {
// firebase 更新資料
// 使用 id 去更新 firebase 資料
await db.collection("calendar").doc(this.currentlyEditing).update({
// 更改 details
details: event.details,
});
// 關掉 selectedOpen 視窗
this.selectedOpen = false;
// 把值改成 null 以免重複按到
this.currentlyEditing = null;
},
async deleteEvent(event) {
// firebase 刪除資料
await db.collection("calendar").doc(event).delete();
// 關掉 selectedOpen 視窗
this.selectedOpen = false;
// 刪除後重新獲得資料
this.getEvents();
},
},
};
</script>
是不是烙烙長(沒事習慣就好)
因為裡面加了滿多的功能,所以全都寫在一起
終於剩下最後一個功能了!!!!新增功能!!!!就完成這個萬年曆的範例了
在 v-toolbar 後 Today btn 前面再塞一個 btn 取名叫做 New Event,點擊之後打開 dialog 視窗
vuetify-dialog (opens new window)
dialog 放在兩個 sheet 之間,真的看不懂 source code (opens new window) 傳送連結 XD
<template>
...
<v-btn class="mr-4" color="primary" @click="dialog = true"> New Event </v-btn>
<v-btn outlined class="mr-4" color="grey darken-2" @click="setToday">
Today
</v-btn>
...
<!-- 在兩個 sheet 之間新增 v-dialog -->
<v-dialog v-model="dialog" max-width="500">
<v-card>
<v-container>
<!-- 新增 addEvent -->
<v-form @submit.prevent="addEvent">
<!-- 新增四個 input-field -->
<v-text-field
v-model="name"
type="text"
label="event name (required)"
></v-text-field>
<v-text-field
v-model="details"
type="text"
label="detail"
></v-text-field>
<v-text-field
v-model="start"
type="date"
label="start (required)"
></v-text-field>
<v-text-field
v-model="end"
type="date"
label="end (required)"
></v-text-field>
<v-text-field
v-model="color"
type="color"
label="color (click to open color menu)"
></v-text-field>
<!-- 建立之後關掉 dialog -->
<v-btn
type="submit"
color="primary"
class="mr-4"
@click.stop="dialog = false"
>
Create Event
</v-btn>
</v-form>
</v-container>
</v-card>
</v-dialog>
</template>
<script>
export default {
methods: {
// 新增資料到 firebase
async addEvent() {
if (this.name && this.start && this.end) {
await db.collection("calendar").add({
name: this.name,
details: this.details,
start: this.start,
end: this.end,
color: this.color,
});
// 新增後重新獲取資料
this.getEvents();
// 把資料清空
this.name = "";
this.details = "";
this.start = "";
this.end = "";
this.color = "#1976D2";
} else {
// 如果 name, start, end 有尚未輸入則跑出 alert
alert("Name, start, end date are required.");
}
},
},
};
</script>
end !!! finally !!!