update with main

This commit is contained in:
Casey 2026-01-24 07:25:21 -06:00
parent 5e192a61e1
commit ba3e2a4d8e
29 changed files with 51749 additions and 139 deletions

View file

@ -206,6 +206,7 @@
:meeting="selectedMeeting"
@close="closeMeetingModal"
@meeting-updated="handleMeetingUpdated"
@complete-meeting="openNoteForm"
/>
<!-- New Meeting Modal -->
@ -216,6 +217,17 @@
@confirm="handleNewMeetingConfirm"
@cancel="handleNewMeetingCancel"
/>
<!-- Bid Meeting Note Form Modal -->
<BidMeetingNoteForm
v-if="selectedMeetingForNotes"
:visible="showNoteFormModal"
@update:visible="showNoteFormModal = $event"
:bid-meeting-name="selectedMeetingForNotes.name"
:project-template="selectedMeetingForNotes.projectTemplate"
@submit="handleNoteFormSubmit"
@cancel="handleNoteFormCancel"
/>
</div>
</template>
@ -224,6 +236,7 @@ import { ref, computed, onMounted, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import BidMeetingModal from "../../modals/BidMeetingModal.vue";
import MeetingDetailsModal from "../../modals/MeetingDetailsModal.vue";
import BidMeetingNoteForm from "../../modals/BidMeetingNoteForm.vue";
import { useLoadingStore } from "../../../stores/loading";
import { useNotificationStore } from "../../../stores/notifications-primevue";
import { useCompanyStore } from "../../../stores/company";
@ -251,6 +264,8 @@ const unscheduledMeetings = ref([]);
const selectedMeeting = ref(null);
const showMeetingModal = ref(false);
const showNewMeetingModal = ref(false);
const showNoteFormModal = ref(false);
const selectedMeetingForNotes = ref(null);
// Drag and drop state
const isDragOver = ref(false);
@ -476,6 +491,63 @@ const handleMeetingUpdated = async () => {
await loadUnscheduledMeetings();
};
const openNoteForm = (meeting) => {
// Verify meeting has required data
if (!meeting || !meeting.name) {
notificationStore.addNotification({
type: "error",
title: "Error",
message: "Meeting information is incomplete",
duration: 5000,
});
return;
}
if (!meeting.projectTemplate) {
notificationStore.addNotification({
type: "error",
title: "Missing Project Template",
message: "This meeting does not have a project template assigned. Cannot open note form.",
duration: 5000,
});
return;
}
selectedMeetingForNotes.value = meeting;
showNoteFormModal.value = true;
};
const handleNoteFormSubmit = async () => {
// After successful submission, mark the meeting as completed
try {
loadingStore.setLoading(true);
await Api.updateBidMeeting(selectedMeetingForNotes.value.name, {
status: "Completed",
});
notificationStore.addNotification({
type: "success",
title: "Success",
message: "Meeting marked as completed",
duration: 5000,
});
// Reload meetings
await handleMeetingUpdated();
} catch (error) {
console.error("Error updating meeting status:", error);
} finally {
loadingStore.setLoading(false);
showNoteFormModal.value = false;
selectedMeetingForNotes.value = null;
}
};
const handleNoteFormCancel = () => {
showNoteFormModal.value = false;
selectedMeetingForNotes.value = null;
};
const openNewMeetingModal = () => {
showNewMeetingModal.value = true;
};
@ -491,7 +563,16 @@ const handleNewMeetingConfirm = async (meetingData) => {
showNewMeetingModal.value = false;
// Reload unscheduled meetings to show the new one
// Optimistically add the new meeting to the unscheduled list
unscheduledMeetings.value.unshift({
name: result.name,
address: meetingData.address,
projectTemplate: meetingData.projectTemplate,
contact: meetingData.contact,
status: "Unscheduled",
});
// Reload unscheduled meetings to ensure consistency
await loadUnscheduledMeetings();
notificationStore.addNotification({
@ -536,6 +617,7 @@ const handleDragStart = (event, meeting = null) => {
notes: meeting.notes || "",
assigned_employee: meeting.assigned_employee || "",
status: meeting.status,
projectTemplate: meeting.projectTemplate,
};
} else if (!draggedMeeting.value) {
// If no meeting data is set, use query address
@ -559,6 +641,7 @@ const handleMeetingDragStart = (event, meeting) => {
assigned_employee: meeting.assigned_employee || "",
status: meeting.status,
isRescheduling: true, // Flag to indicate this is a reschedule
projectTemplate: meeting.projectTemplate,
};
// Store the original meeting data in case drag is cancelled
@ -669,6 +752,7 @@ const handleDrop = async (event, date, time) => {
notes: droppedMeeting.notes || "",
assigned_employee: droppedMeeting.assigned_employee || "",
status: "Scheduled",
projectTemplate: droppedMeeting.projectTemplate,
};
// If this is an existing meeting, update it in the backend
@ -792,6 +876,7 @@ const handleDropToUnscheduled = async (event) => {
notes: droppedMeeting.notes || "",
status: "Unscheduled",
assigned_employee: droppedMeeting.assigned_employee || "",
projectTemplate: droppedMeeting.projectTemplate,
});
}