Files
web/app/components/modal/Reservation.vue
2026-05-25 15:23:12 +07:00

246 lines
6.0 KiB
Vue

<template>
<div class="columns is-multiline is-mobile mx-0">
<div class="column is-3">
<div class="field">
<label class="label has-text-left">ID<span class="has-text-danger ml-1">*</span></label>
<div class="control">
<input
class="input"
type="text"
v-model="record.id"
disabled
/>
</div>
</div>
</div>
<div class="column is-3">
<div class="field">
<label class="label has-text-left"> giữ chỗ<span class="has-text-danger ml-1">*</span></label>
<div class="control">
<input
class="input"
type="text"
v-model="record.code"
/>
</div>
</div>
</div>
<div class="column is-3">
<div class="field">
<label class="label has-text-left"> giao dịch<span class="has-text-danger ml-1">*</span></label>
<div class="control">
<input
class="input"
type="text"
v-model="record.transaction__code"
/>
</div>
</div>
</div>
<div class="column is-3">
<div class="field">
<label class="label has-text-left">Người tạo<span class="has-text-danger ml-1">*</span></label>
<div class="control">
<input
class="input"
type="text"
v-model="record.creator__fullname"
disabled
/>
</div>
</div>
</div>
<div class="column is-6">
<div class="field">
<label class="label has-text-left">Ngày bắt đầu</label>
<div class="control">
<input
class="input"
type="date"
v-model="record.date"
/>
</div>
</div>
</div>
<div class="column is-6">
<div class="field">
<label class="label has-text-left">Hạn thanh toán</label>
<div class="control">
<input
class="input"
type="date"
v-model="record.due_date"
/>
</div>
</div>
</div>
<div class="column is-6">
<div class="field">
<label class="label has-text-left"> tiền đặt cọc</label>
<div class="control">
<input
class="input"
type="number"
v-model="record.amount"
/>
</div>
</div>
</div>
<div class="column is-6">
<div class="field">
<label class="label has-text-left">Trạng thái</label>
<div class="control">
<SearchBox
v-bind="{
api: 'status',
field: 'name',
column: ['name'],
optionid: record.approve_status,
first: true,
}"
@option="selectedStatus"
/>
</div>
</div>
</div>
<div class="column is-12 pt-5">
<a
class="button is-primary has-text-white"
@click="updateData()"
>Lưu lại</a
>
<a
class="button is-dark has-text-white ml-5"
@click="updateData(true)"
v-if="record.id"
>Tạo mới</a
>
<a
v-if="contractData"
class="button is-info has-text-white ml-5"
@click="openContractModal"
>
<span class="icon">
<SvgIcon v-bind="{ name: 'contract.svg', type: 'primary', size: 18 }" />
</span>
<span>Xem hợp đồng</span>
</a>
</div>
</div>
<Modal
@close="showmodal = undefined"
v-bind="showmodal"
@texteditor="updateText"
@update="updateAttr"
@dataevent="handleModalEvent"
v-if="showmodal"
/>
</template>
<script setup>
const emit = defineEmits([]);
var props = defineProps({
pagename: String,
row: Object,
api: String,
});
const { $copy, $resetNull, $insertrow, $updaterow, $getdata } = useNuxtApp();
var record = ref(props.row ? $copy(props.row) : {});
var showmodal = ref();
var vapi = props.api || "reservation";
var contractData = ref(null);
const loadContract = async () => {
if (record.value.transaction__code) {
try {
contractData.value = await $getdata("contract", {
first: true,
filter: { transaction__code: record.value.transaction__code },
});
} catch (error) {
console.error("Error loading contract:", error);
contractData.value = null;
}
}
};
const contractModalConfig = computed(() => ({
component: "application/Contract",
title: "Hợp đồng",
width: "90%",
height: "90vh",
vbind: {
row: contractData.value,
api: "transaction",
},
}));
const openContractModal = () => {
showmodal.value = contractModalConfig.value;
};
const handleModalEvent = (eventData) => {
if (eventData?.data?.transaction) {
contractData.value = { ...contractData.value, ...eventData.data };
}
};
var selectedStatus = function (option) {
record.value.approve_status = option.id;
};
var updateText = function (content) {
record.value.vi = content;
};
var openEditor = function () {
showmodal.value = {
component: "common/TextEditor",
vbind: { content: record.value.vi },
title: "Text editor",
width: "40%",
height: "150px",
};
};
var editDetail = function () {
let detail = record.value.detail ? record.value.detail : {};
showmodal.value = {
component: "datatable/FieldAttribute",
vbind: { field: detail, close: true },
title: "Sửa thuộc tính",
width: "40%",
height: "150px",
};
};
var updateAttr = function (detail) {
record.value.detail = detail;
};
var updateData = async function (isNew) {
let ele = record.value;
if (ele.create_time === null) ele.create_time = new Date();
ele = $resetNull(ele);
if (isNew) delete ele.id;
let result = ele.id
? await $updaterow(vapi, ele, undefined, props.pagename)
: await $insertrow(vapi, ele, undefined, props.pagename);
if (isNew) emit("close");
await loadContract();
};
onMounted(() => {
loadContract();
});
watch(
() => record.value.transaction,
() => {
loadContract();
},
);
</script>