將全年報名移至獨立頁籤,並新增未報名品項名單列印功能

This commit is contained in:
2026-05-11 09:11:22 +08:00
parent 9a7c30bd21
commit 46494547db
12 changed files with 1508 additions and 646 deletions
+540 -155
View File
@@ -116,14 +116,6 @@
vuetify: new Vuetify(vuetify_options),
data() {
return {
init_is_auto_enroll: false,
is_auto_enroll: false,
auto_enroll_date: '',
auto_enroll_config: {
is_receipt: true, // 是否寄送收據
receipt_title: '', // 收據抬頭
receipt_address: '', // 收據地址
},
last_confirmed_date: '',
tabArray: tabtmp,
tabArray2: "",
@@ -142,6 +134,8 @@
title: '',
desc: '',
orders: [],
pendingData: null,
pendingDeleteItem: null,
btn_cancel_text: '', // 「取消報名」按鈕文字
btn_keep_text: '' // 「保留活動」按鈕文字
},
@@ -475,6 +469,56 @@
{ text: '', value: 'actions', sortable: false, width: "100px" },
],
},
// 全年報名表格
auto_enroll: {
headers: [
{ text: '開始日期(西元)', value: 'auto_enroll_start_date', sortable: false },
{ text: '結束日期(西元)', value: 'auto_enroll_end_date', sortable: false },
{ text: '收據抬頭', value: 'auto_enroll_receipt_title', sortable: false },
{ text: '收據地址', value: 'auto_enroll_receipt_address', sortable: false },
{ text: '狀態', value: 'auto_enroll_status', sortable: false },
{ text: '', value: 'actions', sortable: false, width: "150px" },
],
items: [],
editedIndex: -1,
editedItem: {
num: 0,
auto_enroll_start_date: '',
auto_enroll_end_date: '',
auto_enroll_receipt_title: '',
auto_enroll_receipt_address: '',
},
defaultItem: {
num: 0,
auto_enroll_start_date: '',
auto_enroll_end_date: '',
auto_enroll_receipt_title: '',
auto_enroll_receipt_address: '',
},
search:""
},
unfilled_dialog: {
show: false,
headers: [
{ text: '報名單號', value: 'order_no', sortable: false },
{ text: '活動分類', value: 'category', sortable: false },
{ text: '活動名稱', value: 'activityname', sortable: false },
{ text: '開始日期', value: 'startdate', sortable: false },
{ text: '結束日期', value: 'enddate', sortable: false },
],
items: [],
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText: '',
current_item: null,
},
count: 0,
page: 1,
pageSize: 10,
loading: false,
},
cityOptions: [], // 城市選項
areaOptions: {}, // 區域選項
//天干地支:甲子, 乙丑...
@@ -507,15 +551,6 @@
}
},
mounted() {
//一開始就載入
this.$nextTick(() => {
this.auto_enroll_date = document.getElementById('<%= hid_auto_enroll_start_date.ClientID %>').value;
this.is_auto_enroll = (document.getElementById('<%= hid_is_auto_enroll.ClientID %>').value.toLowerCase() === "true");
this.init_is_auto_enroll = this.is_auto_enroll;
this.auto_enroll_config.is_receipt = (document.getElementById('<%= hid_auto_enroll_is_receipt.ClientID %>').value.toLowerCase() === "true");
this.auto_enroll_config.receipt_title = document.getElementById('<%= hid_auto_enroll_receipt_title.ClientID %>').value;
this.auto_enroll_config.receipt_address = document.getElementById('<%= hid_auto_enroll_receipt_address.ClientID %>').value;
})
this.search_dialog.current = this.search_dialog.controls.search1 ///default
//console.log("mounted");
//this.initialize();
@@ -524,32 +559,9 @@
this.getFamilyMembers();
this.getCityOptions();
this.onCityChange();
this.initAutoEnroll();
},
watch: {
auto_enroll_config: {
handler(newVal) {
document.getElementById('<%= hid_auto_enroll_is_receipt.ClientID %>').value = newVal.is_receipt;
document.getElementById('<%= hid_auto_enroll_receipt_title.ClientID %>').value = newVal.receipt_title;
document.getElementById('<%= hid_auto_enroll_receipt_address.ClientID %>').value = newVal.receipt_address;
},
deep: true,
},
is_auto_enroll(newVal, oldVal) {
if (newVal === true) {
if (!this.auto_enroll_date) {
this.auto_enroll_date = new Date().toISOString().substr(0, 10);
this.last_confirmed_date = this.auto_enroll_date;
}
} else {
if (this.init_is_auto_enroll === true) {
this.open_confirm_dialog('CANCEL_AUTO_ENROLL');
}
}
document.getElementById('<%=hid_is_auto_enroll.ClientID%>').value = newVal;
},
auto_enroll_date(newVal) {
document.getElementById('<%=hid_auto_enroll_start_date.ClientID%>').value = newVal;
},
options: {
handler() {
//console.log("watch1", this.search_dialog, this.search_dialog.page);
@@ -591,57 +603,322 @@
}
},
methods: {
initAutoEnroll() {
if (this.follower_id != '') {
axios.get(HTTP_HOST + `api/follower/GetAutoEnrollList/${this.follower_id}`)
.then(response => {
this.auto_enroll.items = response.data.list.map(item => ({
...item,
id: item.num
}));
})
}
},
// 取得報名狀態
getEnrollStatus(item) {
const today = new Date();
today.setHours(0, 0, 0, 0);
const start = new Date(item.auto_enroll_start_date);
const end = new Date(item.auto_enroll_end_date);
if (today < start) return { label: '未開始', color: 'blue lighten-4', textColor: 'blue darken-3' };
if (today > end) return { label: '已結束', color: 'grey lighten-2', textColor: 'grey darken-2' };
return { label: '報名中', color: 'green lighten-4', textColor: 'green darken-3' };
},
// 新增
auto_enroll_add() {
if (this.auto_enroll.editedIndex !== -1) return;
const newItem = {
...this.auto_enroll.defaultItem,
id: -Date.now()
};
this.auto_enroll.items.unshift(newItem);
this.auto_enroll.editedItem = { ...newItem };
this.auto_enroll.editedIndex = 0;
},
// 編輯
auto_enroll_edit(item) {
this.auto_enroll.editedIndex = this.auto_enroll.items.indexOf(item);
this.auto_enroll.editedItem = { ...item };
},
// 取消
auto_enroll_cancel() {
// 若是新增的空白列,取消時移除
const item = this.auto_enroll.items[this.auto_enroll.editedIndex];
if (item && !item.auto_enroll_start_date && !item.auto_enroll_end_date) {
this.auto_enroll.items.splice(this.auto_enroll.editedIndex, 1);
}
this.auto_enroll.editedItem = { ...this.auto_enroll.defaultItem };
this.auto_enroll.editedIndex = -1;
},
// 儲存
auto_enroll_save() {
const { id, num, auto_enroll_start_date, auto_enroll_end_date, auto_enroll_receipt_title, auto_enroll_receipt_address } = this.auto_enroll.editedItem;
if (!auto_enroll_start_date || !auto_enroll_end_date) {
alert('請填寫開始與結束日期');
return;
}
if (auto_enroll_start_date > auto_enroll_end_date) {
alert('開始日期不可晚於結束日期');
return;
}
// 檢查是否與其他列日期重疊
const isOverlap = this.auto_enroll.items.some(item => {
if (item.id === id) return false; // 跳過自己
const existStart = item.auto_enroll_start_date;
const existEnd = item.auto_enroll_end_date;
return auto_enroll_start_date <= existEnd && auto_enroll_end_date >= existStart;
});
if (isOverlap) {
alert('此報名期間與現有資料重疊,請重新確認日期');
return;
}
var auto_enroll =
{
num: num,
f_num: Number('<%= Request["num"] %>'),
start_date: auto_enroll_start_date,
end_date: auto_enroll_end_date,
receipt_title: auto_enroll_receipt_title,
receipt_address: auto_enroll_receipt_address,
}
this.open_confirm_dialog(auto_enroll);
//axios.post(HTTP_HOST + 'api/follower/SaveAutoEnrollList', auto_enroll)
// .then(response => {
// const savedData = response.data;
// const updatedItem = {
// ...this.auto_enroll.editedItem,
// num: Number(savedData.num),
// id: Number(savedData.num),
// auto_enroll_start_date: savedData.start_date,
// auto_enroll_end_date: savedData.end_date,
// auto_enroll_receipt_title: savedData.receipt_title,
// auto_enroll_receipt_address: savedData.receipt_address,
// };
// this.$set(this.auto_enroll.items, this.auto_enroll.editedIndex, updatedItem);
// this.auto_enroll.editedItem = { ...this.auto_enroll.defaultItem };
// this.auto_enroll.editedIndex = -1;
// })
},
// 刪除
auto_enroll_delete(item) {
// 先查受影響訂單
axios.post(HTTP_HOST + 'api/follower/GetAffectedOrders', {
num: item.num,
f_num: Number('<%= Request["num"] %>'),
start_date: item.auto_enroll_start_date,
end_date: item.auto_enroll_end_date,
}, {
params: { is_delete: true }
})
.then(response => {
this.confirm_dialog.pendingData = null;
this.confirm_dialog.pendingDeleteItem = item;
if (response.data.list.length > 0) {
this.confirm_dialog.orders = response.data.list;
this.confirm_dialog.title = "刪除全年報名";
this.confirm_dialog.desc = "刪除後,以下已報名的活動是否一併取消?";
this.confirm_dialog.btn_keep_text = "保留現有活動";
this.confirm_dialog.btn_cancel_text = "取消全部活動";
this.confirm_dialog.show = true;
} else {
this.doDelete(item);
}
})
},
doDelete(item) {
axios.delete(HTTP_HOST + `api/follower/DeleteAutoEnroll/${item.num}`)
.then(() => {
const index = this.auto_enroll.items.indexOf(item);
this.auto_enroll.items.splice(index, 1);
this.confirm_dialog.pendingDeleteItem = null; // 清空暫存
})
.catch(error => {
console.log("刪除失敗", error);
this.snackbar.text = "刪除失敗:" + error;
this.snackbar.show = true;
})
},
// 顯示尚未填寫項目的活動
unfilled_dialog_show(item) {
this.unfilled_dialog.current_item = item;
this.unfilled_dialog.page = 1;
this.unfilled_dialog.show = true;
this.unfilled_dialog_load();
},
unfilled_dialog_load() {
const item = this.unfilled_dialog.current_item;
const { page, pageSize, sortBy, sortDesc } = this.unfilled_dialog;
this.unfilled_dialog.loading = true;
axios
.get(HTTP_HOST + `api/follower/GetUnfilledActivityOrders/${item.num}`, {
params: {
page,
pageSize,
sortBy: Array.isArray(sortBy) ? sortBy[0] : sortBy,
sortDesc: Array.isArray(sortDesc) ? sortDesc[0] : sortDesc
}
})
.then(response => {
this.unfilled_dialog.items = response.data.list;
this.unfilled_dialog.count = response.data.count;
})
.finally(() => {
this.unfilled_dialog.loading = false;
});
},
// 列印
async exportUnfilledOrders() {
const item = this.unfilled_dialog.current_item;
// 取得全部資料
const response = await axios.get(
HTTP_HOST + `api/follower/GetUnfilledActivityOrders/${item.num}`,
{ params: { page: 1, pageSize: 99999 } }
);
const allItems = response.data.list;
const fullTitle = this.titleword();
const infoParts = fullTitle.split(' ');
const followerNum = infoParts[0] || "未知編號";
const followerName = infoParts[1] ? infoParts[1].split('')[0] : "未知姓名";
const rows = allItems.map(item => `
<tr>
<td>${item.order_no}</td>
<td>${item.category}</td>
<td>${item.activityname}</td>
<td>${item.startdate?.substring(0, 10)}</td>
<td>${item.enddate?.substring(0, 10)}</td>
</tr>
`).join('');
const win = window.open('', '_blank');
win.document.write(`
<html>
<head>
<title>未填寫品項活動 - ${followerName}</title>
<style>
body { font-family: "Microsoft JhengHei", Arial, sans-serif; padding: 20px; }
h2 { text-align: center; margin-bottom: 10px; }
.info-header { text-align: center; margin-bottom: 20px; font-size: 16px; border-bottom: 1px solid #eee; padding-bottom: 10px; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #666; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h2>未填寫品項之活動清單</h2>
<div class="info-header">
信眾編號:<strong>${followerNum}</strong> &nbsp;&nbsp;
信眾姓名:<strong>${followerName}</strong>
</div>
<table>
<thead>
<tr>
<th>報名單號</th>
<th>活動分類</th>
<th>活動名稱</th>
<th>開始日期</th>
<th>結束日期</th>
</tr>
</thead>
<tbody>${rows}</tbody>
</table>
</body>
</html>
`);
win.document.close();
win.print();
win.close();
},
syncAddress() {
const sourceAddr = document.getElementById('<%=address.ClientID%>').value;
this.auto_enroll_config.receipt_address = sourceAddr;
},
open_confirm_dialog(type) {
const targetDate = (type === 'CANCEL_AUTO_ENROLL') ? '2099-12-31' : this.auto_enroll_date;
api_url = 'api/follower/pending_orders?id=' + '<%= Request["num"] %>' + '&targetDate=' + targetDate;
if (type === "CANCEL_AUTO_ENROLL") {
axios
.post(HTTP_HOST + api_url)
.then(response => {
open_confirm_dialog(auto_enroll) {
if (auto_enroll.num == 0) {
this.doSave(auto_enroll);
return;
}
// 受影響訂單
axios.post(HTTP_HOST + 'api/follower/GetAffectedOrders', auto_enroll)
.then(response => {
this.confirm_dialog.pendingData = auto_enroll;
if (response.data.list.length > 0) {
this.confirm_dialog.orders = response.data.list;
this.confirm_dialog.title = "取消自動報名";
this.confirm_dialog.desc = "以下活動已報名,是否一併取消?";
this.confirm_dialog.title = "受影響的已報名活動";
this.confirm_dialog.desc = "修改報名期間後,以下活動將不在新範圍內,是否一併取消?";
this.confirm_dialog.btn_keep_text = "保留現有活動";
this.confirm_dialog.btn_cancel_text = "取消全部活動";
this.confirm_dialog.btn_keep_text = "保留現有活動";
const orderNos = this.confirm_dialog.orders.map(o => o.orderno).join(',');
document.getElementById('<%= hid_delete_order_list.ClientID %>').value = orderNos;
if (this.confirm_dialog.orders.length > 0) this.confirm_dialog.show = true;
})
}
else if (type === "UPDATE_START_DATE") {
axios
.post(HTTP_HOST + api_url)
.then(response => {
this.confirm_dialog.orders = response.data.list;
this.confirm_dialog.title = "生效日期延後確認";
this.confirm_dialog.desc = "以下活動已報名,是否一併取消?";
this.confirm_dialog.btn_cancel_text = "取消活動";
this.confirm_dialog.btn_keep_text = "保留現有活動";
const orderNos = this.confirm_dialog.orders.map(o => o.orderno).join(',');
document.getElementById('<%= hid_delete_order_list.ClientID %>').value = orderNos;
if (this.confirm_dialog.orders.length > 0) this.confirm_dialog.show = true;
})
}
this.confirm_dialog.show = true;
} else {
this.doSave(auto_enroll);
}
})
},
doSave(auto_enroll) {
axios.post(HTTP_HOST + 'api/follower/SaveAutoEnrollList', auto_enroll)
.then(response => {
const savedData = response.data;
const updatedItem = {
...this.auto_enroll.editedItem,
num: Number(savedData.num),
id: Number(savedData.num),
auto_enroll_start_date: savedData.start_date,
auto_enroll_end_date: savedData.end_date,
auto_enroll_receipt_title: savedData.receipt_title,
auto_enroll_receipt_address: savedData.receipt_address,
};
this.$set(this.auto_enroll.items, this.auto_enroll.editedIndex, updatedItem);
this.auto_enroll.editedItem = { ...this.auto_enroll.defaultItem };
this.auto_enroll.editedIndex = -1;
this.confirm_dialog.pendingData = null;
})
},
close_confirm_dialog() {
this.auto_enroll_date = this.last_confirmed_date;
if (!this.is_auto_enroll)this.is_auto_enroll = true;
this.confirm_dialog.show = false;
},
keep_auto_enroll_order() {
document.getElementById('<%= hid_is_delete_all_order.ClientID %>').value = "false";
this.last_confirmed_date = this.auto_enroll_date;
this.confirm_dialog.show = false;
if (this.confirm_dialog.pendingData) {
this.doSave(this.confirm_dialog.pendingData);
} else if (this.confirm_dialog.pendingDeleteItem) {
this.doDelete(this.confirm_dialog.pendingDeleteItem);
}
},
delete_auto_enroll_order() {
document.getElementById('<%= hid_is_delete_all_order.ClientID %>').value = "true";
console.log("TRUE");
this.last_confirmed_date = this.auto_enroll_date;
this.confirm_dialog.show = false;
const orderNos = this.confirm_dialog.orders.map(o => o.order_no);
if (orderNos.length === 0) return;
const numsString = orderNos.join(',')
axios.delete(HTTP_HOST + `api/order/DeleteAll/${numsString}`)
.then(() => {
if (this.confirm_dialog.pendingData) {
this.doSave(this.confirm_dialog.pendingData);
} else if (this.confirm_dialog.pendingDeleteItem) {
this.doDelete(this.confirm_dialog.pendingDeleteItem);
}
})
.catch(error => {
console.log("刪除訂單失敗", error);
this.snackbar.text = "刪除訂單失敗:" + error;
this.snackbar.show = true;
})
},
search_show(curr) {
console.log("btn_click:", curr, curr.api_url);
@@ -1446,7 +1723,6 @@
</script>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
<asp:HiddenField ID="hid_delete_order_list" runat="server" />
<div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex">
<template v-if="follower_id !='' "> {{titleword()}} </template>
</div>
@@ -1487,6 +1763,9 @@
<button class="nav-link" id="sec2-tab4" data-bs-toggle="tab" data-bs-target="#sec2-page4"
type="button" role="tab" aria-controls="profile" aria-selected="false">
牌位標題 </button>
<button class="nav-link" id="sec2-tab5" data-bs-toggle="tab" data-bs-target="#sec2-page5"
type="button" role="tab" aria-controls="profile" aria-selected="false">
全年報名 </button>
</div>
</nav>
</div>
@@ -1671,93 +1950,32 @@
<asp:RegularExpressionValidator ControlToValidate="contactor_phone" ErrorMessage="格式有誤" ID="RegularExpressionValidator3" runat="server" ValidationExpression="^[+-]?\d+([+-]?\d*)*$" Display="Dynamic" SetFocusOnError="true" />
</div>
</div>
<div class="row mb-1 label-sm-right">
<div class="col-sm-2 col-lg-1 d-flex align-center justify-content-end pr-2">
<input type="checkbox"
v-model="is_auto_enroll"
style="width: 18px; height: 18px; cursor: pointer;"
class="mr-2">
<label class="col-form-label">全年報名</label>
<asp:HiddenField ID="hid_is_auto_enroll" runat="server" Value="false" />
<asp:HiddenField ID="hid_is_delete_all_order" runat="server" Value="false" />
</div>
<label class="col-sm-2 col-lg-1 col-form-label">自訂標籤</label>
<div class="col-sm-10 col-lg-3">
<input ID="auto_enroll_start_date" type="date"
class="form-control"
v-model="auto_enroll_date"
:disabled="!is_auto_enroll"
@change="open_confirm_dialog('UPDATE_START_DATE')">
<asp:HiddenField ID="hid_auto_enroll_start_date" runat="server" Value="" />
<small class="text-muted" v-if="is_auto_enroll">請設定生效日期</small>
</div>
<label class="col-sm-2 col-lg-1 col-form-label text-right">自訂標籤</label>
<div class="col-sm-4 col-lg-3">
<div class="input-group">
<div class="input-group">
<input type="text" class="form-control" v-model="tabArray2" v-on:keyup.enter="addTab" title="可自由輸入標籤名稱,輸入完成請按「+」,或「Enter」" placeholder="自訂標籤名稱">
<asp:HiddenField ID="tab" runat="server" />
<div class="input-group-append">
<button type="button" class="btn btn-default" @click="addTab"><i class="mdi mdi-plus"></i></button>
</div>
</div>
</div>
<div class="col-sm-12 col-lg-4">
<template>
<div class="">
<asp:HiddenField ID="tab" runat="server" />
<a class="btn btn-default" @click="addTab" ><i class="mdi mdi-plus"></i></a>
</div>
</div>
<div class="col-sm-12 col-lg-7">
<template>
<div class="">
<v-chip v-for="item,index in tabArray"
v-if="item != ''"
class="ma-2"
close
@click:close="tabArray.splice(index, 1);remove(item)"
class="ma-2"
close
@click:close="tabArray.splice(index, 1);remove(item)"
>
{{item}}
{{item}}
</v-chip>
</div>
</template>
</div>
</template>
</div>
</div>
<v-expand-transition>
<div v-show="is_auto_enroll" class="row rounded grey lighten-4 border py-4">
<div class="row mb-1 label-sm-right">
<div class="col-sm-2 col-lg-1 d-flex align-center justify-content-end pr-2">
<input type="checkbox" v-model="auto_enroll_config.is_receipt" style="width:18px; height:18px; cursor: pointer;" class="mr-2">
<label class="col-form-label">寄送收據</label>
<asp:HiddenField ID="hid_auto_enroll_is_receipt" runat="server" />
</div>
<div class="col-sm-12 col-lg-3">
<input type="text" class="form-control"
placeholder="收據抬頭" v-model="auto_enroll_config.receipt_title" :disabled="!auto_enroll_config.is_receipt">
<asp:HiddenField ID="hid_auto_enroll_receipt_title" runat="server" />
</div>
<div class="col-sm-12 col-lg-6">
<div class="input-group mb-3">
<input type="text" class="form-control"
placeholder="收據地址" v-model="auto_enroll_config.receipt_address" :disabled="!auto_enroll_config.is_receipt">
<asp:HiddenField ID="hid_auto_enroll_receipt_address" runat="server" />
<button class="btn btn-outline-secondary" type="button" @click="syncAddress" :disabled="!auto_enroll_config.is_receipt">同收件地址</button>
</div>
</div>
</div>
<div class="py-1 px-8 mb-2 text-muted" style="font-size: 0.85rem; line-height: 1.5;">
<div class="font-weight-bold mb-1">
<v-icon small color="info" class="mr-1">mdi-information</v-icon> 自動報名須知:
</div>
<ul class="pl-4 mb-0">
<li><strong>生效範疇:</strong>此處修改僅影響<strong>往後</strong>產生的訂單;既有訂單請至「報名管理」手動調整。</li>
<li><strong>品項帶入:</strong>系統將自動沿用該信眾<strong>距今最近一次</strong>的報名品項(若無歷史紀錄則不自動帶入)。</li>
</ul>
</div>
</div>
</v-expand-transition>
<div class="row mb-1">
<label class="col-form-label">備註</label>
<div class="">
@@ -2145,9 +2363,176 @@
</v-data-table>
</v-card>
</div>
<div class="tab-pane fade" id="sec2-page5" role="tabpanel" aria-labelledby="sec2-tab5" >
<v-card class="mx-auto" outlined v-if="follower_id!=''">
<v-data-table class="elevation-1" fixed-header
:headers="auto_enroll.headers"
:items="auto_enroll.items"
:search="auto_enroll.search">
<v-divider inset></v-divider>
<template v-slot:top>
<v-toolbar flat color="transparent" class="row ms-0">
<div class="col-12 col-md-10 d-flex">
<v-text-field
v-model="auto_enroll.search"
append-icon="mdi-magnify"
label="查詢"
dense
outlined
single-line
hide-details>
</v-text-field>
<v-btn
color="primary"
class="ml-2 white--text "
title="新增全年報名"
@click="auto_enroll_add">
<v-icon dark>mdi-plus</v-icon>新增
</v-btn>
</div>
</v-toolbar>
</template>
<!-- 編輯中 -->
<template v-slot:item.auto_enroll_start_date="{ item }">
<template v-if="item.id === auto_enroll.editedItem.id">
<v-text-field
v-model="auto_enroll.editedItem.auto_enroll_start_date"
type="date"
dense
hide-details
outlined>
</v-text-field>
</template>
<template v-else>
{{ item.auto_enroll_start_date }}
</template>
</template>
<template v-slot:item.auto_enroll_end_date="{ item }">
<template v-if="item.id === auto_enroll.editedItem.id">
<v-text-field
v-model="auto_enroll.editedItem.auto_enroll_end_date"
type="date"
dense
hide-details
outlined>
</v-text-field>
</template>
<template v-else>
{{ item.auto_enroll_end_date }}
</template>
</template>
<template v-slot:item.auto_enroll_receipt_title="{ item }">
<template v-if="item.id === auto_enroll.editedItem.id">
<v-text-field
v-model="auto_enroll.editedItem.auto_enroll_receipt_title"
dense
hide-details
outlined
placeholder="請輸入收據抬頭">
</v-text-field>
</template>
<template v-else>
{{ item.auto_enroll_receipt_title }}
</template>
</template>
<template v-slot:item.auto_enroll_receipt_address="{ item }">
<template v-if="item.id === auto_enroll.editedItem.id">
<v-text-field
v-model="auto_enroll.editedItem.auto_enroll_receipt_address"
dense
hide-details
outlined
placeholder="請輸入收據地址">
</v-text-field>
</template>
<template v-else>
{{ item.auto_enroll_receipt_address }}
</template>
</template>
<!-- 狀態欄位 -->
<template v-slot:item.auto_enroll_status="{ item }">
<v-chip
small
:color="getEnrollStatus(item).color"
:text-color="getEnrollStatus(item).textColor"
class="font-weight-medium">
{{ getEnrollStatus(item).label }}
</v-chip>
</template>
<!-- 操作欄位 -->
<template v-slot:item.actions="{ item }">
<template v-if="item.id === auto_enroll.editedItem.id">
<v-icon color="red" class="mr-2" @click="auto_enroll_cancel">
mdi-window-close
</v-icon>
<v-icon color="green" class="mr-2" @click="auto_enroll_save">
mdi-content-save
</v-icon>
</template>
<template v-else>
<v-icon color="green" class="mr-2" @click="auto_enroll_edit(item)">
mdi-pencil
</v-icon>
<v-icon color="red" class="mr-2" @click="auto_enroll_delete(item)">
mdi-delete
</v-icon>
<v-icon color="blue" class="mr-2" @click="unfilled_dialog_show(item)" title="查看未填寫品項活動">
mdi-file-find
</v-icon>
</template>
</template>
</v-data-table>
</v-card>
</div>
</div>
</asp:Panel>
</div>
<!-- 顯示沒有品項的活動 -->
<v-dialog v-model="unfilled_dialog.show" max-width="900px">
<v-card>
<v-card-title class="headline grey lighten-2">
未填寫品項的活動
<v-spacer></v-spacer>
<v-btn icon @click="unfilled_dialog.show = false"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text>
<v-data-table
:headers="unfilled_dialog.headers"
:items="unfilled_dialog.items"
:footer-props="unfilled_dialog.footer"
:items-per-page="unfilled_dialog.pageSize"
:server-items-length="unfilled_dialog.count"
:page.sync="unfilled_dialog.page"
:loading="unfilled_dialog.loading"
@update:page="unfilled_dialog_load"
>
</v-data-table>
</v-card-text>
<v-card-actions class="justify-center pb-6">
<v-btn
color="primary"
:disabled="unfilled_dialog.items.length == 0"
class="px-4"
@click="exportUnfilledOrders">
<v-icon left>mdi-printer</v-icon>
列印
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<!-- Family Member Dialog -->
<v-dialog v-model="family.dialog" max-width="600px">
<v-card>
@@ -2354,7 +2739,7 @@
<v-data-table
:headers="confirm_dialog.headers"
:items="confirm_dialog.orders"
:items-per-page="5"
:items-per-page="10"
class="elevation-1 grey lighten-5"
:footer-props="{
'items-per-page-text': '每頁顯示',