diff --git a/src/components/commuters/CommuterBtn.vue b/src/components/commuters/CommuterBtn.vue index 96d08e9..b41bb6c 100644 --- a/src/components/commuters/CommuterBtn.vue +++ b/src/components/commuters/CommuterBtn.vue @@ -45,7 +45,7 @@ const props = defineProps({ } }); -const emit = defineEmits(['workTimeUpdated', 'leaveTimeUpdated', 'projectChangeComplete']); +const emit = defineEmits(['workTimeUpdated', 'leaveTimeUpdated', 'projectChangeComplete', 'update:pendingProjectChange']); const workTime = ref(null); const leaveTime = ref(null) @@ -171,7 +171,6 @@ const setWorkTime = async () => { }).then(res => { if (res.status === 200) { todayCommuterInfo(); - emit('workTimeUpdated', true); } }); @@ -182,7 +181,8 @@ const setLeaveTime = async () => { // 현재 위치 주소 가져오기 const address = await getLocation(); - if (!address) { + + if (!address && !leaveTime.value) { // 주소를 가져오지 못했을 때도 계속 진행할지 사용자에게 확인 if (!confirm('위치 정보를 가져오지 못했습니다. 위치 없이 퇴근 처리하시겠습니까?')) { return; @@ -198,6 +198,7 @@ const setLeaveTime = async () => { if (res.status === 200) { todayCommuterInfo(); emit('leaveTimeUpdated'); + emit('update:pendingProjectChange', null); } }); }; @@ -209,10 +210,6 @@ watch(() => props.userId, async () => { } }); -watch(() => props.checkedInProject, () => { - // 프로젝트가 변경되면 필요한 처리 수행 -}, { deep: true }); - onMounted(async () => { await todayCommuterInfo(); }); diff --git a/src/components/commuters/CommuterCalendar.vue b/src/components/commuters/CommuterCalendar.vue index f384d64..a696a36 100644 --- a/src/components/commuters/CommuterCalendar.vue +++ b/src/components/commuters/CommuterCalendar.vue @@ -13,6 +13,7 @@ :userId="user.id" :checkedInProject="checkedInProject || {}" :pendingProjectChange="pendingProjectChange" + @update:pendingProjectChange="pendingProjectChange = $event" @workTimeUpdated="handleWorkTimeUpdate" @leaveTimeUpdated="handleLeaveTimeUpdate" ref="workTimeComponentRef" @@ -178,8 +179,34 @@ const handleWorkTimeUpdate = () => { loadCommuters(); }; -const handleLeaveTimeUpdate = () => { - todaysCommuter(); +const handleLeaveTimeUpdate = async () => { + await todaysCommuter(); // 최신 출근자 목록 다시 로드 + + // 현재 사용자의 퇴근 기록이 null인지 확인 + const currentUserCommuter = commuters.value.find(c => c.MEMBERSEQ === user.value.id); + if (currentUserCommuter && !currentUserCommuter.COMMUTLVE) { + await projectStore.getMemberProjects(); + + if (projectStore.activeMemberProjectList.length > 0) { + const previousProject = projectStore.activeMemberProjectList.find( + p => commuters.value.some(c => c.MEMBERSEQ === user.value.id && c.PROJCTLVE === p.PROJCTSEQ) + ) || projectStore.activeMemberProjectList[0]; // 이전 출근 프로젝트가 없으면 첫 번째 프로젝트 + + if (previousProject) { + selectedProject.value = previousProject.PROJCTSEQ; + projectStore.setSelectedProject(previousProject); + } else if (projectStore.activeProjectList.length > 0) { + selectedProject.value = projectStore.activeProjectList[0].PROJCTSEQ; + projectStore.setSelectedProject(projectStore.activeProjectList[0]); + } else { + selectedProject.value = null; + projectStore.setSelectedProject(null); + } + } else { + selectedProject.value = null; + projectStore.setSelectedProject(null); + } + } }; // 프로젝트 드롭 이벤트 핸들러 (ProjectList 컴포넌트에서 전달받음) @@ -206,6 +233,11 @@ const handleProjectDrop = ({ event, targetProject }) => { ? { ...commuter, PROJCTNAM: targetProject.PROJCTNAM, PROJCTLVE: targetProject.PROJCTSEQ } : commuter ); + + // 드롭 후 CommuterBtn 컴포넌트의 상태를 업데이트 (출근/퇴근 버튼 상태 변경) + if (workTimeComponentRef.value && workTimeComponentRef.value.fetchWorkTime) { + workTimeComponentRef.value.fetchWorkTime(); + } }; // 오늘 출근 모든 사용자 조회 @@ -431,6 +463,9 @@ watch(() => projectStore.selectedProject, (newProject) => { if (newProject) { selectedProject.value = newProject.PROJCTSEQ; checkedInProject.value = newProject; + } else { + selectedProject.value = null; + checkedInProject.value = null; } }); @@ -467,10 +502,11 @@ onMounted(async () => { await todaysCommuter(); // 저장된 선택 프로젝트 가져오기 - const storedProject = projectStore.getSelectedProject(); - if (storedProject) { - selectedProject.value = storedProject.PROJCTSEQ; - checkedInProject.value = storedProject; + if (projectStore.activeMemberProjectList.length > 0) { + const initialProject = projectStore.getSelectedProject() || projectStore.activeMemberProjectList[0]; + selectedProject.value = initialProject?.PROJCTSEQ || null; + projectStore.setSelectedProject(initialProject); + checkedInProject.value = initialProject; } datePickerStore.initDatePicker(