2323 :placeholderText =" '담당자를 선택해주세요'"
2424 :is-invalidate =" isInvalidate" />
2525 <div class =" flex flex-col gap-2" >
26- <div class =" flex gap-1 " >
26+ <div class =" flex gap-2 " >
2727 <p class =" text-body text-xs font-bold" >마감기한</p >
2828 <p
29- v-if =" isInvalidate === 'date'"
29+ v-if =" !isDueDateValid && approveData.dueDate && approveData.dueTime"
30+ class =" text-red-1 text-xs" >
31+ 현재 시간 이후로 설정해주세요
32+ </p >
33+ <p
34+ v-else-if =" isInvalidate === 'date'"
3035 class =" text-red-1 text-xs" >
3136 기한정보를 모두 입력하세요
3237 </p >
3338 </div >
39+
3440 <div class =" flex w-full justify-center gap-6" >
3541 <DueDateInput
3642 v-model =" approveData.dueDate"
37- :is-invalidate =" isInvalidate"
3843 inputType =" date" />
3944 <DueDateInput
4045 v-model =" approveData.dueTime"
41- :is-invalidate =" isInvalidate"
4246 inputType =" time" />
4347 </div >
4448 </div >
@@ -58,15 +62,15 @@ import { getMainCategory, getSubCategory } from '@/api/common'
5862import { getTaskDetailUser , postTaskApprove } from ' @/api/user'
5963import { INITIAL_REQUEST_APPROVE_DATA } from ' @/constants/manager'
6064import type { Category , SubCategory } from ' @/types/common'
61- import { convertToISO } from ' @/utils/date'
62- import { onMounted , ref , watch } from ' vue'
65+ import { convertToISO , isAfterNow } from ' @/utils/date'
66+ import { computed , onMounted , ref , watch } from ' vue'
6367import { onBeforeRouteLeave , useRouter } from ' vue-router'
6468import FormButtonContainer from ' ../common/FormButtonContainer.vue'
69+ import ModalView from ' ../common/ModalView.vue'
6570import CategoryDropDown from ' ../request-task/CategoryDropDown.vue'
6671import DueDateInput from ' ./DueDateInput.vue'
6772import LabelDropdown from ' ./LabelDropdown.vue'
6873import ManagerDropdown from ' ./ManagerDropdown.vue'
69- import ModalView from ' ../common/ModalView.vue'
7074
7175const isModalVisible = ref (false )
7276const category1 = ref <Category | null >(null )
@@ -75,7 +79,6 @@ const mainCategoryArr = ref<Category[]>([])
7579const subCategoryArr = ref <SubCategory []>([])
7680const afterSubCategoryArr = ref <SubCategory []>([])
7781const approveData = ref (INITIAL_REQUEST_APPROVE_DATA )
78-
7982const isInvalidate = ref (' ' )
8083const isFirst = ref (true )
8184
@@ -85,6 +88,21 @@ const requestId = Array.isArray(route.query.requestId)
8588 ? Number (route .query .requestId [0 ])
8689 : Number (route .query .requestId )
8790
91+ const isTimeFilled = computed (() => {
92+ return (
93+ (approveData .value .dueDate && ! approveData .value .dueTime ) ||
94+ (! approveData .value .dueDate && approveData .value .dueTime )
95+ )
96+ })
97+
98+ const isTimeComplete = computed (() => {
99+ return approveData .value .dueDate && approveData .value .dueTime
100+ })
101+
102+ const isDueDateValid = computed (() => {
103+ return isAfterNow (approveData .value .dueDate , approveData .value .dueTime )
104+ })
105+
88106onBeforeRouteLeave ((to , from , next ) => {
89107 approveData .value = INITIAL_REQUEST_APPROVE_DATA
90108 next ()
@@ -103,11 +121,8 @@ onMounted(async () => {
103121})
104122
105123watch (category1 , async newValue => {
106- if (isFirst .value ) {
107- isFirst .value = false
108- } else {
109- category2 .value = null
110- }
124+ if (isFirst .value ) isFirst .value = false
125+ else category2 .value = null
111126 afterSubCategoryArr .value = subCategoryArr .value .filter (
112127 subCategory => subCategory .mainCategoryId === newValue ?.id
113128 )
@@ -127,21 +142,22 @@ const handleSubmit = async () => {
127142 isInvalidate .value = ' manager'
128143 return
129144 }
130- if (
131- (approveData .value .dueDate && ! approveData .value .dueTime ) ||
132- (! approveData .value .dueDate && approveData .value .dueTime )
133- ) {
145+ if (isTimeFilled .value ) {
134146 isInvalidate .value = ' date'
135147 return
136148 }
137-
149+ if (isTimeComplete .value && ! isDueDateValid .value ) {
150+ isInvalidate .value = ' '
151+ return
152+ }
138153 const requestData = {
139154 categoryId: category2 .value .id ,
140155 processorId: approveData .value .processor .memberId ,
141- dueDate: convertToISO (approveData .value .dueDate , approveData .value .dueTime ),
156+ dueDate: isTimeFilled .value
157+ ? convertToISO (approveData .value .dueDate , approveData .value .dueTime )
158+ : null ,
142159 labelId: approveData .value .label ?.labelId || null
143160 }
144-
145161 try {
146162 await postTaskApprove (requestId , requestData )
147163 isModalVisible .value = true
0 commit comments