
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<div class="card">
<div class="card-body">
<h2 class="card-title">휴가 신청</h2>
<p class="require"><img :src="require" alt=""> 필수입력</p>
<!-- Multi Columns Form -->
<form class="row g-3 needs-validation" @submit.prevent="handleSubmit">
<div class="col-12">
<label for="inputName5" class="form-label">
<p>유형
<p class="require"><img :src="require" alt=""></p>
</p>
</label>
<select id="category" class="form-select" style="max-width: 200px;">
<option value="연차">연차</option>
<option value="반차">반차</option>
<option value="병가">병가</option>
<option value="경조">경조</option>
<option value="무급">무급</option>
<option value="공가">공가</option>
</select>
</div>
<div class="col-12">
<label for="startDate" class="form-label">
<p>시작일
<p class="require"><img :src="require" alt=""></p>
</p>
</label>
<div class="d-flex gap-1">
<input type="date" class="form-control" id="startDate" v-model="startDate" />
<!-- 시간 선택을 위한 select 사용 -->
<select class="form-control" id="startTime" v-model="startTime">
<option value="09:00">09:00</option>
<option value="10:00">10:00</option>
<option value="11:00">11:00</option>
<option value="12:00">12:00</option>
<option value="13:00">13:00</option>
<option value="14:00">14:00</option>
<option value="15:00">15:00</option>
<option value="16:00">16:00</option>
<option value="17:00">17:00</option>
<option value="18:00">18:00</option>
</select>
</div>
</div>
<div class="col-12">
<label for="endDate" class="form-label">
<p>종료일
<p class="require"><img :src="require" alt=""></p>
</p>
</label>
<div class="d-flex gap-1">
<input type="date" class="form-control" id="endDate" v-model="endDate" />
<!-- 종료 시간을 위한 select 사용 -->
<select class="form-control" id="endTime" v-model="endTime">
<option value="09:00">09:00</option>
<option value="10:00">10:00</option>
<option value="11:00">11:00</option>
<option value="12:00">12:00</option>
<option value="13:00">13:00</option>
<option value="14:00">14:00</option>
<option value="15:00">15:00</option>
<option value="16:00">16:00</option>
<option value="17:00">17:00</option>
<option value="18:00">18:00</option>
</select>
</div>
</div>
<div class="col-12">
<label for="dayCount" class="form-label">사용 휴가일</label>
<input type="text" class="form-control" id="dayCount" v-model="dayCount" readonly />
</div>
<div class="col-12">
<label for="member" class="form-label">
승인자
<button type="button" title="추가" @click="showPopup = true">
<PlusCircleFilled />
</button>
</label>
<HrPopup v-if="showPopup" @close="showPopup = false" @select="addApproval" />
<!-- 반복 렌더링되는 addapproval 항목 -->
<div class="approval-container">
<div v-for="(approval, index) in approvals" :key="index" class="d-flex gap-2 addapproval mb-2">
<select class="form-select" v-model="approval.category" style="width: 110px;">
<option value="결재">결재</option>
<option value="전결">전결</option>
<option value="대결">대결</option>
</select>
<form class="d-flex align-items-center border-x">
<input type="text" class="form-control" v-model="approval.name" style="max-width: 150px;" />
<button type="button" @click="removeApproval(index)" class="delete-button">
<CloseOutlined />
</button>
</form>
</div>
</div>
</div>
<div class="col-12 border-x hyuga">
<label for="prvonsh" class="form-label">세부사항</label>
<input type="text" class="form-control textarea" id="reason" v-model="reason" />
</div>
</form><!-- End Multi Columns Form -->
<div class="buttons">
<button type="submit" class="btn btn-red">이전 승인자 불러오기</button>
<button type="submit" class="btn primary">신청</button>
<button type="reset" class="btn tertiary">취소</button>
</div>
</div>
</div>
</template>
<script>
import { PlusCircleFilled, CloseOutlined } from '@ant-design/icons-vue';
import HrPopup from '../../../component/Popup/HrPopup.vue';
export default {
data() {
const today = new Date().toISOString().split('T')[0];
return {
showPopup: false,
approvals: [],
require: "/client/resources/img/require.png",
startDate: today,
startTime: "09:00", // 기본 시작 시간 09:00
endDate: today,
endTime: "18:00", // 기본 종료 시간 18:00
category: "",
dayCount: 1,
reason: "", // 사유
};
},
components: {
PlusCircleFilled, CloseOutlined, HrPopup
},
computed: {
// Pinia Store의 상태를 가져옵니다.
loginUser() {
const authStore = useAuthStore();
return authStore.getLoginUser;
},
},
methods: {
addApproval(selectedUser) {
this.approvals.push({
category: '결재',
name: selectedUser.name, // or other fields if needed
});
this.showPopup = false; // 팝업 닫기
},
// 승인자 삭제
removeApproval(index) {
this.approvals.splice(index, 1);
},
validateForm() {
// 필수 입력 필드 체크
if (
this.category &&
this.startDate &&
this.startTime &&
this.endDate &&
this.endTime &&
this.dayCount > 0 &&
this.reason.trim() !== ""
) {
this.isFormValid = true;
} else {
this.isFormValid = false;
}
},
calculateDayCount() {
const start = new Date(`${this.startDate}T${this.startTime}:00`);
const end = new Date(`${this.endDate}T${this.endTime}:00`);
let totalHours = (end - start) / (1000 * 60 * 60); // 밀리초를 시간 단위로 변환
if (this.startDate !== this.endDate) {
// 시작일과 종료일이 다른경우
const startDateObj = new Date(this.startDate);
const endDateObj = new Date(this.endDate);
const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
if (this.startTime !== "09:00" || this.endTime !== "18:00") {
this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
} else {
this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
}
} else {
// 시작일과 종료일이 같은 경우
if (this.startTime !== "09:00" || this.endTime !== "18:00") {
this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
} else {
this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
}
}
this.validateForm(); // dayCount 변경 후 폼 재검증
},
handleSubmit() {
this.validateForm(); // 제출 시 유효성 확인
if (this.isFormValid) {
localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
alert("승인 요청이 완료되었습니다.");
// 추가 처리 로직 (API 요청 등)
} else {
alert("모든 필드를 올바르게 작성해주세요.");
}
},
},
mounted() {
},
watch: {
startDate: 'calculateDayCount',
startTime: 'calculateDayCount',
endDate: 'calculateDayCount',
endTime: 'calculateDayCount',
reason: "validateForm",
category: 'category',
},
};
</script>