Compare commits

..

No commits in common. "ec1d3001887aee85ef3ccc4356d03c6731c7223a" and "c50e0242bf675a08b21b79edb3432f5508965e77" have entirely different histories.

View File

@ -1,171 +1,119 @@
<template> <template>
<Towser <Towser :show="show" :title="towser.title" :actions="towser.action" @onClose="onClose" @onSave="onSave">
:show="dartaTowserStore.show" <div class="p-4">
:title="towser.title" <div>
:actions="towser.action" <div class="mb-5">
@onClose="onClose" <h2 class="text-base font-semibold mb-3">Document Details</h2>
@onSave="onSave" <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
> <div class="">
<div class="flex flex-col gap-[5px]"> <label class="block text-sm font-medium mb-2">
<!-- Document Details Section --> Department
<div class="mb-[10px]"> <span class="text-red-500">*</span>
<!-- <h3 class="text-lg font-semibold">Document Details</h3> --> </label>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-[5px]"> <Multiselect
<div class="flex flex-col"> v-model="formData.department"
<label for="document_number"> :options="departments"
Document Number :multiple="false"
<span class="text-red-500">*</span> :searchable="true"
</label> :allow-empty="false"
<input label="name"
id="document_number" track-by="id"
v-model="payload.document_number" placeholder="Select Department"
type="text" />
placeholder="Enter Document Number" </div>
@input="errors && errors.document_number && delete errors.document_number" <div class="flex flex-col">
required <label class="block text-sm font-medium mb-2">
/> Category
</div> <span class="text-red-500">*</span>
<div class="flex flex-col"> </label>
<label for="document_type"> <Multiselect
Document Type v-model="formData.documentCategory"
<span class="text-red-500">*</span> :options="documentCategories"
</label> :multiple="false"
<Multiselect :searchable="true"
ref="document_type" :allow-empty="false"
v-model="selectedItems.document_type" label="name"
:options="documentTypeStore.itemList" track-by="id"
track-by="id" placeholder="Select Category"
placeholder="Select Document Type" />
label="title" </div>
:show-labels="false"
@select="errors && errors.document_type && delete errors.document_type"
class="bg-gray-800"
required
/>
</div>
<div class="flex flex-col">
<label for="document_category">
Document Category
<span class="text-red-500">*</span>
</label>
<Multiselect
ref="document_category"
v-model="selectedItems.document_category"
:options="documentCategoryStore.itemList"
track-by="id"
placeholder="Select Document Category"
label="title"
:show-labels="false"
@select="errors && errors.document_category && delete errors.document_category"
class="bg-gray-800"
required
/>
</div>
<div class="flex flex-col">
<label for="department">
Department
<span class="text-red-500">*</span>
</label>
<Multiselect
ref="department"
v-model="selectedItems.department"
:options="departmentStore.itemList"
track-by="id"
placeholder="Select Department"
label="name"
:show-labels="false"
@select="errors && errors.department && delete errors.department"
/>
</div>
<div class="flex flex-col">
<label for="date">Received Date</label>
<DateSelector id="date" v-model="payload.date" :classValue="`w-full`" />
</div>
</div>
</div>
<!-- Document Information Section -->
<div class="mb-[10px]">
<!-- <h3 class="text-lg font-semibold">Document Information</h3> -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-[5px]">
<div class="flex flex-col">
<label for="issued_date">Issued Date</label>
<DateSelector id="issued_date" v-model="payload.issued_date" :classValue="`w-full`" />
</div> </div>
<div class="flex flex-col"> <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mt-6">
<label for="sender_name"> <div class="flex flex-col">
Sender Name <label class="block text-sm font-medium mb-2">
<span class="text-red-500">*</span> Document Number
</label> <span class="text-red-500">*</span>
<input </label>
id="sender_name" <input
v-model="payload.sender_name" v-model="formData.documentNumber"
type="text" type="text"
placeholder="Enter Sender Name" placeholder="Enter document number"
@input="errors && errors.sender_name && delete errors.sender_name" class="form-input"
required />
/> </div>
<div class="flex flex-col">
<label class="block text-sm font-medium mb-2">
Subject
<span class="text-red-500">*</span>
</label>
<input
v-model="formData.subject"
type="text"
placeholder="Enter document subject"
class="form-input"
/>
</div>
</div> </div>
<div class="flex flex-col">
<label for="sender_address">
Sender Address
<span class="text-red-500">*</span>
</label>
<input
id="sender_address"
v-model="payload.sender_address"
type="text"
placeholder="Enter Sender Address"
@input="errors && errors.sender_address && delete errors.sender_address"
required
/>
</div>
<div class="flex flex-col">
<label for="sender_contact">
Sender Contact
<span class="text-red-500">*</span>
</label>
<input
id="sender_contact"
v-model="payload.sender_contact"
type="text"
placeholder="Enter Sender Contact"
@input="errors && errors.sender_contact && delete errors.sender_contact"
required
/>
</div>
</div>
</div>
<!-- Subject Section --> <div class="mt-6">
<div class="mb-[10px]"> <label class="block text-sm font-medium mb-2">
<!-- <h3 class="text-lg font-semibold">Subject</h3> --> Document Body
<div class="grid grid-cols-3 gap-[5px]">
<div class="flex flex-col">
<label for="subject">
Subject
<span class="text-red-500">*</span> <span class="text-red-500">*</span>
</label> </label>
<input <textarea
id="subject" v-model="formData.body"
v-model="payload.subject" placeholder="Enter document body"
type="text" class="w-full border p-2"
placeholder="Enter subject of the letter" rows="5"
@input="errors && errors.subject && delete errors.subject" ></textarea>
required
/>
</div> </div>
</div> </div>
</div>
<!--Attachment Section--> <div class="mb-8">
<div class="grid grid-cols-3"> <h2 class="text-base font-semibold mb-3">Recipient Information</h2>
<div> <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>Attachments</div> <div class="flex flex-col">
<div <label class="block text-sm font-medium mb-2">Recipient Name</label>
class="border-2 border-dashed p-6 text-center cursor-pointer hover:bg-gray-50" <input v-model="formData.recipientName" type="text" class="form-input" />
@click="triggerFileInput" </div>
> <div class="flex flex-col">
<label class="block text-sm font-medium mb-2">Recipient Contact</label>
<input v-model="formData.recipientContact" type="tel" class="form-input" />
</div>
<div class="flex flex-col md:col-span-2">
<label class="block text-sm font-medium mb-2">Recipient Address</label>
<input v-model="formData.recipientAddress" type="text" class="form-input" />
</div>
</div>
</div>
<div class="mb-8">
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="flex flex-col">
<label class="block text-sm font-medium mb-2">Issued Date</label>
<input v-model="formData.issuedDate" type="date" class="form-input" />
</div>
<div class="flex flex-col">
<label class="block text-sm font-medium mb-2">Dispatch Date</label>
<input v-model="formData.dispatchDate" type="date" class="form-input" />
</div>
</div>
</div>
<div class="mb-8">
<h2 class="text-base font-semibold mb-3">Attachments</h2>
<div class="border-2 border-dashed p-6 text-center cursor-pointer" @click="triggerFileInput">
<input <input
type="file" type="file"
multiple multiple
@ -174,16 +122,16 @@
ref="fileInputRef" ref="fileInputRef"
accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.png" accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.png"
/> />
<p class="text-gray-600 text-sm mb-2">Click to upload</p> <p class="text-sm mb-2">Click to upload or drag and drop</p>
<div v-if="formData.attachments.length > 0" class="mt-4 text-left"> <div v-if="formData.attachments.length > 0" class="mt-4 text-left">
<ul class="space-y-2"> <ul class="space-y-2">
<li <li
v-for="(file, index) in formData.attachments" v-for="(file, index) in formData.attachments"
:key="index" :key="index"
class="flex justify-between items-center bg-gray-100 p-2 rounded" class="flex justify-between items-center border p-2"
> >
<span class="text-sm truncate">{{ file.name }}</span> <span class="text-sm truncate">{{ file.name }}</span>
<button type="button" @click.stop="removeFile(index)" class="text-red-500 text-xs"> <button type="button" @click.stop="removeFile(index)" class="text-sm">
Remove Remove
</button> </button>
</li> </li>
@ -192,7 +140,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
</Towser> </Towser>
</template> </template>
@ -200,19 +147,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from "vue"; import { ref, reactive } from "vue";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { createGenericStore } from "@/stores/GenericStore";
import { createOverlayStore } from "@/stores/OverlayStore"; import { createOverlayStore } from "@/stores/OverlayStore";
import Multiselect from "vue-multiselect";
const dartaStore = createGenericStore("darta")(); const DartaTowserStore = createOverlayStore("darta-towser")();
const dartaTowserStore = createOverlayStore("darta-towser")(); const { show } = storeToRefs(DartaTowserStore);
const { payload, selectedItems, errors } = storeToRefs(dartaStore);
const documentCategoryStore = createGenericStore("document-category")();
const documentTypeStore = createGenericStore("document-type")();
const departmentStore = createGenericStore("department")();
const emit = defineEmits(["onSave"]);
const towser = ref({ const towser = ref({
title: [{ name: "Darta", link: "#" }, { name: "Create" }],
title: [{ name: "Darta", link: "#" }, { name: "Create" }], title: [{ name: "Darta", link: "#" }, { name: "Create" }],
action: [ action: [
{ {
@ -225,16 +166,7 @@ const towser = ref({
}, },
], ],
}); });
});
const departments = ref([
{ id: 1, name: "Administration" },
{ id: 2, name: "HR" },
]);
const documentCategories = ref([
{ id: 1, name: "Confidential" },
{ id: 2, name: "Public" },
]);
const departments = ref([ const departments = ref([
{ id: 1, name: "Administration" }, { id: 1, name: "Administration" },
{ id: 2, name: "HR" }, { id: 2, name: "HR" },
@ -256,24 +188,18 @@ const formData = reactive({
issuedDate: "", issuedDate: "",
dispatchDate: "", dispatchDate: "",
attachments: [] as File[], attachments: [] as File[],
documentNumber: "",
subject: "",
body: "",
recipientName: "",
recipientContact: "",
recipientAddress: "",
issuedDate: "",
dispatchDate: "",
attachments: [] as File[],
}); });
const fileInputRef = ref<HTMLInputElement | null>(null); const fileInputRef = ref<HTMLInputElement | null>(null);
const onClose = () => { const onClose = () => {
dartaTowserStore.close(); DartaTowserStore.close();
resetForm();
}; };
const onSave = async () => {}; const onSave = () => {
handleSave();
};
const triggerFileInput = () => { const triggerFileInput = () => {
fileInputRef.value?.click(); fileInputRef.value?.click();
@ -290,5 +216,33 @@ const removeFile = (index: number) => {
formData.attachments.splice(index, 1); formData.attachments.splice(index, 1);
}; };
</script> const resetForm = () => {
formData.department = null;
formData.documentCategory = null;
formData.documentNumber = "";
formData.subject = "";
formData.body = "";
formData.recipientName = "";
formData.recipientContact = "";
formData.recipientAddress = "";
formData.issuedDate = "";
formData.dispatchDate = "";
formData.attachments = [];
};
const handleSave = async () => {
if (
!formData.department ||
!formData.documentCategory ||
!formData.documentNumber ||
!formData.subject ||
!formData.body
) {
console.error("Please fill in all required fields");
return;
}
console.log("Saving:", formData);
onClose();
};
</script>