
--- client/resources/scss/admin/content.scss
+++ client/resources/scss/admin/content.scss
... | ... | @@ -696,4 +696,19 @@ |
696 | 696 |
} |
697 | 697 |
.modal .modal-dialog.small-modal{ |
698 | 698 |
width: 300px; |
699 |
+} |
|
700 |
+ |
|
701 |
+.search-zone{ |
|
702 |
+ padding: 2rem; |
|
703 |
+ border: 1px solid #213F9A; |
|
704 |
+ border-radius: 1rem; |
|
705 |
+} |
|
706 |
+ |
|
707 |
+.left-icon{ |
|
708 |
+ height: 5rem; |
|
709 |
+ padding-left: 6rem; |
|
710 |
+ background-image: url(#{$url}/img.png); |
|
711 |
+ background-position: left center; |
|
712 |
+ background-repeat: no-repeat; |
|
713 |
+ background-size: 50px 50px; |
|
699 | 714 |
}(No newline at end of file) |
--- client/views/pages/Manager/attendance/AttendanceDetail.vue
+++ client/views/pages/Manager/attendance/AttendanceDetail.vue
... | ... | @@ -1,11 +1,11 @@ |
1 | 1 |
<template> |
2 |
- <div class="card "> |
|
2 |
+ <div class="card"> |
|
3 | 3 |
<div class="card-body"> |
4 | 4 |
<h2 class="card-title">부서별 근태현황</h2> |
5 |
- <div class="d-flex"> |
|
6 |
- <div class="img-area"> |
|
7 |
- <div class="img"><img :src="photoicon" alt=""> |
|
8 |
- </div> |
|
5 |
+ <div> |
|
6 |
+ <div class="d-flex align-stretch justify-between mb10"> |
|
7 |
+ <div class="img-area" style="width: 300px; background-color: #EFF1FA;border-radius: 1rem; padding: 3rem;"> |
|
8 |
+ <div class="img" style="width: 92px;background-color: #ffffff; padding: 1rem; margin: 0 auto;"><img :src="photoicon" ></div> |
|
9 | 9 |
</div> |
10 | 10 |
<div class="tbl-wrap" style="width: calc(100% - 310px);"> |
11 | 11 |
<table class="tbl data radius-table"> |
... | ... | @@ -41,121 +41,102 @@ |
41 | 41 |
</div> |
42 | 42 |
|
43 | 43 |
</div> |
44 |
- |
|
45 |
- <div class="sch-form-wrap"> |
|
46 |
- <div class="input-group d-flex justify-end"> |
|
47 |
- <select name="" id="" class="form-select sm"> |
|
48 |
- <option :value="currentYear">{{ currentYear }}년</option> |
|
49 |
- <option value="all">전체</option> |
|
50 |
- <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
51 |
- {{ year }}년 |
|
52 |
- </option> |
|
53 |
- </select> |
|
44 |
+ <div class="search-wrap mb10"> |
|
45 |
+ <div class="input-group d-flex justify-end"> |
|
54 | 46 |
<select name="" id="" class="form-select sm"> |
55 |
- <option :value="currentMonth">{{ currentMonth }}월</option> |
|
56 |
- <option value="all">전체</option> |
|
57 |
- <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
58 |
- {{ month }}월 |
|
59 |
- </option> |
|
47 |
+ <option :value="currentYear">{{ currentYear }}년</option> |
|
48 |
+ <option value="all">전체</option> |
|
49 |
+ <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
50 |
+ {{ year }}년 |
|
51 |
+ </option> |
|
52 |
+ </select> |
|
53 |
+ <select name="" id="" class="form-select sm"> |
|
54 |
+ <option :value="currentMonth">{{ currentMonth }}월</option> |
|
55 |
+ <option value="all">전체</option> |
|
56 |
+ <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
57 |
+ {{ month }}월 |
|
58 |
+ </option> |
|
59 |
+ </select> |
|
60 |
+ <select name="" id="" class="form-select sm"> |
|
61 |
+ <option value="">전체</option> |
|
62 |
+ <option value="">지각</option> |
|
63 |
+ <option value="">조기퇴근</option> |
|
64 |
+ <option value="">결근</option> |
|
65 |
+ <option value="">출장</option> |
|
66 |
+ <option value="">대체휴가</option> |
|
67 |
+ <option value="">휴가</option> |
|
68 |
+ <option value="">공가</option> |
|
69 |
+ <option value="">병가</option> |
|
60 | 70 |
</select> |
61 |
- <select name="" id="" class="form-select sm"> |
|
62 |
- <option value="">전체</option> |
|
63 |
- <option value="">지각</option> |
|
64 |
- <option value="">조기퇴근</option> |
|
65 |
- <option value="">결근</option> |
|
66 |
- <option value="">출장</option> |
|
67 |
- <option value="">대체휴가</option> |
|
68 |
- <option value="">휴가</option> |
|
69 |
- <option value="">공가</option> |
|
70 |
- <option value="">병가</option> |
|
71 |
- </select> |
|
71 |
+ </div> |
|
72 |
+ </div> |
|
73 |
+ <div class="tbl-wrap mb10"> |
|
74 |
+ <table class="tbl data"> |
|
75 |
+ <tbody> |
|
76 |
+ <tr> |
|
77 |
+ <th rowspan="2">근태 현황</th> |
|
78 |
+ <th>지각</th> |
|
79 |
+ <th>조기퇴근</th> |
|
80 |
+ <th>결근</th> |
|
81 |
+ <th>출장</th> |
|
82 |
+ <th>주말출근</th> |
|
83 |
+ </tr> |
|
84 |
+ <tr> |
|
85 |
+ <td>{{ late }}</td> |
|
86 |
+ <td>{{ earlyLeave }}</td> |
|
87 |
+ <td>{{ absence }}</td> |
|
88 |
+ <td>{{ businessTrip }}</td> |
|
89 |
+ <td>{{ weekendWork }}</td> |
|
90 |
+ </tr> |
|
91 |
+ </tbody> |
|
92 |
+ |
|
93 |
+ </table> |
|
94 |
+ </div> |
|
95 |
+ <div class="tbl-wrap mb10"> |
|
96 |
+ <table class="tbl data"> |
|
97 |
+ <tbody> |
|
98 |
+ <tr> |
|
99 |
+ <th rowspan="2">휴가 현황</th> |
|
100 |
+ <th>연차</th> |
|
101 |
+ <th>대체휴가</th> |
|
102 |
+ <th>공가</th> |
|
103 |
+ <th>병가</th> |
|
104 |
+ </tr> |
|
105 |
+ <tr> |
|
106 |
+ <td></td> |
|
107 |
+ <td></td> |
|
108 |
+ <td></td> |
|
109 |
+ <td></td> |
|
110 |
+ </tr> |
|
111 |
+ </tbody> |
|
112 |
+ </table> |
|
113 |
+ </div> |
|
114 |
+ <div class="tbl-wrap"> |
|
115 |
+ <table id="myTable" class="tbl data"> |
|
116 |
+ <thead> |
|
117 |
+ <tr> |
|
118 |
+ <th>연차 </th> |
|
119 |
+ <th>내용</th> |
|
120 |
+ </tr> |
|
121 |
+ </thead> |
|
122 |
+ <!-- 동적으로 <td> 생성 --> |
|
123 |
+ <tbody> |
|
124 |
+ <tr v-for="(item, index) in listData" :key="index"> |
|
125 |
+ <td>{{ item.type }}</td> |
|
126 |
+ <td>{{ item.content }}</td> |
|
127 |
+ </tr> |
|
128 |
+ </tbody> |
|
129 |
+ </table> |
|
130 |
+ |
|
72 | 131 |
</div> |
73 | 132 |
</div> |
74 |
- <div class="tbl-wrap"> |
|
75 |
- <table class="tbl data"> |
|
76 |
- <tbody> |
|
77 |
- <tr> |
|
78 |
- <th rowspan="2">근태 현황</th> |
|
79 |
- <th>지각</th> |
|
80 |
- <th>조기퇴근</th> |
|
81 |
- <th>결근</th> |
|
82 |
- <th>출장</th> |
|
83 |
- <th>주말출근</th> |
|
84 |
- </tr> |
|
85 |
- <tr> |
|
86 |
- <td>{{ late }}</td> |
|
87 |
- <td>{{ earlyLeave }}</td> |
|
88 |
- <td>{{ absence }}</td> |
|
89 |
- <td>{{ businessTrip }}</td> |
|
90 |
- <td>{{ weekendWork }}</td> |
|
91 |
- </tr> |
|
92 |
- </tbody> |
|
93 |
- |
|
94 |
- </table> |
|
95 |
- </div> |
|
96 |
- <div class="tbl-wrap"> |
|
97 |
- <table class="tbl data"> |
|
98 |
- <tbody> |
|
99 |
- <tr> |
|
100 |
- <th rowspan="2">휴가 현황</th> |
|
101 |
- <th>연차</th> |
|
102 |
- <th>대체휴가</th> |
|
103 |
- <th>공가</th> |
|
104 |
- <th>병가</th> |
|
105 |
- </tr> |
|
106 |
- <tr> |
|
107 |
- <td></td> |
|
108 |
- <td></td> |
|
109 |
- <td></td> |
|
110 |
- <td></td> |
|
111 |
- </tr> |
|
112 |
- </tbody> |
|
113 |
- </table> |
|
114 |
- </div> |
|
115 |
- <div class="tbl-wrap"> |
|
116 |
- <table id="myTable" class="tbl data"> |
|
117 |
- <thead> |
|
118 |
- <tr> |
|
119 |
- <th>연차 </th> |
|
120 |
- <th>내용</th> |
|
121 |
- </tr> |
|
122 |
- </thead> |
|
123 |
- <!-- 동적으로 <td> 생성 --> |
|
124 |
- <tbody> |
|
125 |
- <tr v-for="(item, index) in listData" :key="index"> |
|
126 |
- <td>{{ item.type }}</td> |
|
127 |
- <td>{{ item.content }}</td> |
|
128 |
- </tr> |
|
129 |
- </tbody> |
|
130 |
- </table> |
|
131 |
- |
|
132 |
- </div> |
|
133 |
- <div class="pagination"> |
|
134 |
- <ul> |
|
135 |
- <!-- 왼쪽 화살표 (이전 페이지) --> |
|
136 |
- <li class="arrow" :class="{ disabled: currentPage === 1 }" @click="changePage(currentPage - 1)"> |
|
137 |
- < |
|
138 |
- </li> |
|
139 |
- |
|
140 |
- <!-- 페이지 번호 --> |
|
141 |
- <li v-for="page in totalPages" :key="page" :class="{ active: currentPage === page }" |
|
142 |
- @click="changePage(page)"> |
|
143 |
- {{ page }} |
|
144 |
- </li> |
|
145 |
- |
|
146 |
- <!-- 오른쪽 화살표 (다음 페이지) --> |
|
147 |
- <li class="arrow" :class="{ disabled: currentPage === totalPages }" @click="changePage(currentPage + 1)"> |
|
148 |
- > |
|
149 |
- </li> |
|
150 |
- </ul> |
|
151 |
- </div> |
|
152 |
- |
|
153 | 133 |
</div> |
154 | 134 |
</div> |
135 |
+ <Pagination /> |
|
155 | 136 |
</template> |
156 | 137 |
|
157 | 138 |
<script> |
158 |
-import { SearchOutlined } from '@ant-design/icons-vue'; |
|
139 |
+import Pagination from '../../../component/Pagination.vue'; |
|
159 | 140 |
const currentYear = new Date().getFullYear(); |
160 | 141 |
const currentMonth = new Date().getMonth() + 1; |
161 | 142 |
export default { |
... | ... | @@ -200,7 +181,7 @@ |
200 | 181 |
}; |
201 | 182 |
}, |
202 | 183 |
components: { |
203 |
- SearchOutlined |
|
184 |
+ Pagination |
|
204 | 185 |
}, |
205 | 186 |
computed: { |
206 | 187 |
}, |
--- client/views/pages/Manager/attendance/BsrpInsert.vue
+++ client/views/pages/Manager/attendance/BsrpInsert.vue
... | ... | @@ -2,137 +2,139 @@ |
2 | 2 |
<div class="card"> |
3 | 3 |
<div class="card-body"> |
4 | 4 |
<h2 class="card-title">출장 신청</h2> |
5 |
- <p class="require">* 필수입력</p> |
|
6 |
- <div class="tbl-wrap"> |
|
7 |
- <table class="tbl data"> |
|
8 |
- <tbody> |
|
9 |
- <tr> |
|
10 |
- <th>출장구분 *</th> |
|
11 |
- <td> |
|
12 |
- <select class="form-select sm" style="width: 110px;" v-model="bsrpInfo.bsrpSe"> |
|
13 |
- <option v-for="(item, idx) of bsrpCodes" :key="idx" :value="item.code"> {{ item.codeNm }} </option> |
|
14 |
- </select> |
|
15 |
- </td> |
|
16 |
- <th>일수</th> |
|
17 |
- <td> |
|
18 |
- <input type="text" class="form-control sm" v-model="totalDays" readonly /> |
|
19 |
- </td> |
|
20 |
- </tr> |
|
21 |
- <tr> |
|
22 |
- <th>출장지 *</th> |
|
23 |
- <td> |
|
24 |
- <input type="text" class="form-control sm" v-model="bsrpInfo.bsrpPlace" /> |
|
25 |
- </td> |
|
26 |
- <th>출장목적 *</th> |
|
27 |
- <td> |
|
28 |
- <input type="text" class="form-control sm" v-model="bsrpInfo.bsrpPurps" /> |
|
29 |
- </td> |
|
30 |
- </tr> |
|
31 |
- <tr> |
|
32 |
- <th>출장기간 *</th> |
|
33 |
- <td colspan="3"> |
|
34 |
- <div class="d-flex"> |
|
35 |
- <div class="d-flex gap-1 mb-1"> |
|
36 |
- <input type="date" class="form-control sm" v-model="bsrpInfo.bgnde" /> |
|
37 |
- <input type="text" class="form-control sm" style="width: 100px;" placeholder="시" v-model="bsrpInfo.beginHour" maxlength="2" @input="validateHour('beginHour', $event)" /> |
|
38 |
- <input type="text" class="form-control sm" style="width: 100px;" placeholder="분" v-model="bsrpInfo.beginMnt" maxlength="2" @input="validateMinute('beginMnt', $event)" /> |
|
5 |
+ <div> |
|
6 |
+ <p class="require">* 필수입력</p> |
|
7 |
+ <div class="tbl-wrap"> |
|
8 |
+ <table class="tbl data"> |
|
9 |
+ <tbody> |
|
10 |
+ <tr> |
|
11 |
+ <th>출장구분 *</th> |
|
12 |
+ <td> |
|
13 |
+ <select class="form-select sm" style="width: 110px;" v-model="bsrpInfo.bsrpSe"> |
|
14 |
+ <option v-for="(item, idx) of bsrpCodes" :key="idx" :value="item.code"> {{ item.codeNm }} </option> |
|
15 |
+ </select> |
|
16 |
+ </td> |
|
17 |
+ <th>일수</th> |
|
18 |
+ <td> |
|
19 |
+ <input type="text" class="form-control sm" v-model="totalDays" readonly /> |
|
20 |
+ </td> |
|
21 |
+ </tr> |
|
22 |
+ <tr> |
|
23 |
+ <th>출장지 *</th> |
|
24 |
+ <td> |
|
25 |
+ <input type="text" class="form-control sm" v-model="bsrpInfo.bsrpPlace" /> |
|
26 |
+ </td> |
|
27 |
+ <th>출장목적 *</th> |
|
28 |
+ <td> |
|
29 |
+ <input type="text" class="form-control sm" v-model="bsrpInfo.bsrpPurps" /> |
|
30 |
+ </td> |
|
31 |
+ </tr> |
|
32 |
+ <tr> |
|
33 |
+ <th>출장기간 *</th> |
|
34 |
+ <td colspan="3"> |
|
35 |
+ <div class="d-flex"> |
|
36 |
+ <div class="d-flex gap-1 mb-1"> |
|
37 |
+ <input type="date" class="form-control sm" v-model="bsrpInfo.bgnde" /> |
|
38 |
+ <input type="text" class="form-control sm" style="width: 100px;" placeholder="시" v-model="bsrpInfo.beginHour" maxlength="2" @input="validateHour('beginHour', $event)" /> |
|
39 |
+ <input type="text" class="form-control sm" style="width: 100px;" placeholder="분" v-model="bsrpInfo.beginMnt" maxlength="2" @input="validateMinute('beginMnt', $event)" /> |
|
40 |
+ </div> |
|
41 |
+ <div class="d-flex gap-1"> |
|
42 |
+ <input type="date" class="form-control sm" v-model="bsrpInfo.endde" /> |
|
43 |
+ <input type="text" class="form-control sm" style="width: 100px;" placeholder="시" v-model="bsrpInfo.endHour" maxlength="2" @input="validateHour('endHour', $event)" /> |
|
44 |
+ <input type="text" class="form-control sm" style="width: 100px;" placeholder="분" v-model="bsrpInfo.endMnt" maxlength="2" @input="validateMinute('endMnt', $event)" /> |
|
45 |
+ </div> |
|
39 | 46 |
</div> |
40 |
- <div class="d-flex gap-1"> |
|
41 |
- <input type="date" class="form-control sm" v-model="bsrpInfo.endde" /> |
|
42 |
- <input type="text" class="form-control sm" style="width: 100px;" placeholder="시" v-model="bsrpInfo.endHour" maxlength="2" @input="validateHour('endHour', $event)" /> |
|
43 |
- <input type="text" class="form-control sm" style="width: 100px;" placeholder="분" v-model="bsrpInfo.endMnt" maxlength="2" @input="validateMinute('endMnt', $event)" /> |
|
47 |
+ </td> |
|
48 |
+ </tr> |
|
49 |
+ <tr> |
|
50 |
+ <th>동행자</th> |
|
51 |
+ <td> |
|
52 |
+ <button type="button" title="추가" @click="isOpenNmprModal = true"> |
|
53 |
+ <PlusCircleFilled /> |
|
54 |
+ </button> |
|
55 |
+ <HrPopup v-if="isOpenNmprModal" :selectedEmployees="bsrpInfo.bsrpNmprList" idField="triperId" :dateInfo="bsrpInfo" @select="handleCompanionAdd" @close="isOpenNmprModal = false" /> |
|
56 |
+ <div class="approval-container"> |
|
57 |
+ <div v-for="(item, idx) of bsrpInfo.bsrpNmprList" :key="idx" class="d-flex addapproval"> |
|
58 |
+ <div class="d-flex align-items-center border-x"> |
|
59 |
+ <p>{{ item.triperNm }} {{ item.clsfNm }}</p> |
|
60 |
+ <button type="button" @click="handleCompanionRemove(idx)" @mousedown.stop> |
|
61 |
+ <CloseOutlined /> |
|
62 |
+ </button> |
|
63 |
+ </div> |
|
64 |
+ </div> |
|
44 | 65 |
</div> |
45 |
- </div> |
|
46 |
- </td> |
|
47 |
- </tr> |
|
48 |
- <tr> |
|
49 |
- <th>동행자</th> |
|
50 |
- <td> |
|
51 |
- <button type="button" title="추가" @click="isOpenNmprModal = true"> |
|
52 |
- <PlusCircleFilled /> |
|
53 |
- </button> |
|
54 |
- <HrPopup v-if="isOpenNmprModal" :selectedEmployees="bsrpInfo.bsrpNmprList" idField="triperId" :dateInfo="bsrpInfo" @select="handleCompanionAdd" @close="isOpenNmprModal = false" /> |
|
55 |
- <div class="approval-container"> |
|
56 |
- <div v-for="(item, idx) of bsrpInfo.bsrpNmprList" :key="idx" class="d-flex addapproval"> |
|
57 |
- <div class="d-flex align-items-center border-x"> |
|
58 |
- <p>{{ item.triperNm }} {{ item.clsfNm }}</p> |
|
59 |
- <button type="button" @click="handleCompanionRemove(idx)" @mousedown.stop> |
|
66 |
+ </td> |
|
67 |
+ <th>승인자 *</th> |
|
68 |
+ <td> |
|
69 |
+ <button type="button" title="추가" @click="isOpenSanctnModal = true"> |
|
70 |
+ <PlusCircleFilled /> |
|
71 |
+ </button> |
|
72 |
+ <HrPopup v-if="isOpenSanctnModal" :selectedEmployees="bsrpCnsul.sanctnList" idField="confmerId" @select="handleApproverAdd" @close="isOpenSanctnModal = false" /> |
|
73 |
+ <div class="approval-container"> |
|
74 |
+ <SanctnList v-model:lists="bsrpCnsul.sanctnList" @delSanctn="handleApproverRemove" /> |
|
75 |
+ </div> |
|
76 |
+ </td> |
|
77 |
+ </tr> |
|
78 |
+ <tr> |
|
79 |
+ <th>품의내용 *</th> |
|
80 |
+ <td colspan="3" style="height: calc(100% - 550px);"> |
|
81 |
+ <EditorComponent v-model:contents="bsrpCnsul.cn" /> |
|
82 |
+ </td> |
|
83 |
+ </tr> |
|
84 |
+ <tr> |
|
85 |
+ <th>법인카드</th> |
|
86 |
+ <td> |
|
87 |
+ <button type="button" title="추가" @click="isOpenCardModal = true"> |
|
88 |
+ <PlusCircleFilled /> |
|
89 |
+ </button> |
|
90 |
+ <CorpCardPopup v-if="isOpenCardModal" :bsrpInfo="bsrpInfo" :lists="cards" @close="isOpenCardModal = false" @onSelected="handleCardAdd" /> |
|
91 |
+ <div class="approval-container"> |
|
92 |
+ <div v-for="(card, idx) in cards" :key="idx" class="d-flex gap-2 addapproval mb-2"> |
|
93 |
+ <form class="d-flex align-items-center border-x"> |
|
94 |
+ <p>{{ card.cardNm }}</p> |
|
95 |
+ <button type="button" @click="handleCardRemove(idx)" class="delete-button"> |
|
96 |
+ <CloseOutlined /> |
|
97 |
+ </button> |
|
98 |
+ </form> |
|
99 |
+ </div> |
|
100 |
+ </div> |
|
101 |
+ </td> |
|
102 |
+ <th>법인차량</th> |
|
103 |
+ <td> |
|
104 |
+ <button type="button" title="추가" @click="isOpenVhcleModal = true"> |
|
105 |
+ <PlusCircleFilled /> |
|
106 |
+ </button> |
|
107 |
+ <CorpCarPopup v-if="isOpenVhcleModal" :bsrpInfo="bsrpInfo" :lists="vhcles" @close="isOpenVhcleModal = false" @onSelected="handleVehicleAdd" /> |
|
108 |
+ <div class="approval-container"> |
|
109 |
+ <div v-for="(vhcle, idx) in vhcles" :key="idx" class="d-flex gap-2 addapproval mb-2"> |
|
110 |
+ <p>{{ vhcle.vhcleNm }}</p> |
|
111 |
+ <select class="form-select" v-model="vhcle.drverId"> |
|
112 |
+ <option value="" disabled hidden>운전자 선택</option> |
|
113 |
+ <option :value="userInfo.userId">{{ userInfo.userNm }}</option> |
|
114 |
+ <option v-for="(item, idx) of bsrpInfo.bsrpNmprList" :key="idx" :value="item.userId"> {{ item.userNm }} </option> |
|
115 |
+ </select> |
|
116 |
+ <button type="button" @click="handleVehicleRemove(idx)" class="delete-button"> |
|
60 | 117 |
<CloseOutlined /> |
61 | 118 |
</button> |
62 | 119 |
</div> |
63 | 120 |
</div> |
64 |
- </div> |
|
65 |
- </td> |
|
66 |
- <th>승인자 *</th> |
|
67 |
- <td> |
|
68 |
- <button type="button" title="추가" @click="isOpenSanctnModal = true"> |
|
69 |
- <PlusCircleFilled /> |
|
70 |
- </button> |
|
71 |
- <HrPopup v-if="isOpenSanctnModal" :selectedEmployees="bsrpCnsul.sanctnList" idField="confmerId" @select="handleApproverAdd" @close="isOpenSanctnModal = false" /> |
|
72 |
- <div class="approval-container"> |
|
73 |
- <SanctnList v-model:lists="bsrpCnsul.sanctnList" @delSanctn="handleApproverRemove" /> |
|
74 |
- </div> |
|
75 |
- </td> |
|
76 |
- </tr> |
|
77 |
- <tr> |
|
78 |
- <th>품의내용 *</th> |
|
79 |
- <td colspan="3" style="height: calc(100% - 550px);"> |
|
80 |
- <EditorComponent v-model:contents="bsrpCnsul.cn" /> |
|
81 |
- </td> |
|
82 |
- </tr> |
|
83 |
- <tr> |
|
84 |
- <th>법인카드</th> |
|
85 |
- <td> |
|
86 |
- <button type="button" title="추가" @click="isOpenCardModal = true"> |
|
87 |
- <PlusCircleFilled /> |
|
88 |
- </button> |
|
89 |
- <CorpCardPopup v-if="isOpenCardModal" :bsrpInfo="bsrpInfo" :lists="cards" @close="isOpenCardModal = false" @onSelected="handleCardAdd" /> |
|
90 |
- <div class="approval-container"> |
|
91 |
- <div v-for="(card, idx) in cards" :key="idx" class="d-flex gap-2 addapproval mb-2"> |
|
92 |
- <form class="d-flex align-items-center border-x"> |
|
93 |
- <p>{{ card.cardNm }}</p> |
|
94 |
- <button type="button" @click="handleCardRemove(idx)" class="delete-button"> |
|
95 |
- <CloseOutlined /> |
|
96 |
- </button> |
|
97 |
- </form> |
|
98 |
- </div> |
|
99 |
- </div> |
|
100 |
- </td> |
|
101 |
- <th>법인차량</th> |
|
102 |
- <td> |
|
103 |
- <button type="button" title="추가" @click="isOpenVhcleModal = true"> |
|
104 |
- <PlusCircleFilled /> |
|
105 |
- </button> |
|
106 |
- <CorpCarPopup v-if="isOpenVhcleModal" :bsrpInfo="bsrpInfo" :lists="vhcles" @close="isOpenVhcleModal = false" @onSelected="handleVehicleAdd" /> |
|
107 |
- <div class="approval-container"> |
|
108 |
- <div v-for="(vhcle, idx) in vhcles" :key="idx" class="d-flex gap-2 addapproval mb-2"> |
|
109 |
- <p>{{ vhcle.vhcleNm }}</p> |
|
110 |
- <select class="form-select" v-model="vhcle.drverId"> |
|
111 |
- <option value="" disabled hidden>운전자 선택</option> |
|
112 |
- <option :value="userInfo.userId">{{ userInfo.userNm }}</option> |
|
113 |
- <option v-for="(item, idx) of bsrpInfo.bsrpNmprList" :key="idx" :value="item.userId"> {{ item.userNm }} </option> |
|
114 |
- </select> |
|
115 |
- <button type="button" @click="handleVehicleRemove(idx)" class="delete-button"> |
|
116 |
- <CloseOutlined /> |
|
117 |
- </button> |
|
118 |
- </div> |
|
119 |
- </div> |
|
120 |
- </td> |
|
121 |
- </tr> |
|
122 |
- </tbody> |
|
123 |
- </table> |
|
124 |
- </div> |
|
125 |
- <div class="buttons"> |
|
126 |
- <button type="button" class="btn sm btn-red" @click="handleLoadLastApprovers">이전 승인자 불러오기</button> |
|
127 |
- <button type="button" class="btn sm primary" v-if="$isEmpty(pageId)" @click="handleSave">신청</button> |
|
128 |
- <template v-else> |
|
129 |
- <button type="button" class="btn sm primary" v-if="isReapplyMode" @click="handleReapply">재신청</button> |
|
130 |
- <button type="button" class="btn sm primary" v-else @click="handleUpdate">수정</button> |
|
131 |
- <button type="button" class="btn sm secondary" @click="handleCancel">취소</button> |
|
132 |
- </template> |
|
121 |
+ </td> |
|
122 |
+ </tr> |
|
123 |
+ </tbody> |
|
124 |
+ </table> |
|
125 |
+ </div> |
|
133 | 126 |
</div> |
134 | 127 |
</div> |
135 | 128 |
</div> |
129 |
+ <div class="d-flex justify-end align-center gap10"> |
|
130 |
+ <button type="button" class="btn sm btn-red" @click="handleLoadLastApprovers">이전 승인자 불러오기</button> |
|
131 |
+ <button type="button" class="btn sm primary" v-if="$isEmpty(pageId)" @click="handleSave">신청</button> |
|
132 |
+ <template v-else> |
|
133 |
+ <button type="button" class="btn sm primary" v-if="isReapplyMode" @click="handleReapply">재신청</button> |
|
134 |
+ <button type="button" class="btn sm primary" v-else @click="handleUpdate">수정</button> |
|
135 |
+ <button type="button" class="btn sm secondary" @click="handleCancel">취소</button> |
|
136 |
+ </template> |
|
137 |
+ </div> |
|
136 | 138 |
</template> |
137 | 139 |
<script> |
138 | 140 |
import { PlusCircleFilled, CloseOutlined } from '@ant-design/icons-vue'; |
--- client/views/pages/Manager/attendance/BsrpList.vue
+++ client/views/pages/Manager/attendance/BsrpList.vue
... | ... | @@ -1,55 +1,54 @@ |
1 | 1 |
<template> |
2 |
- <div class="col-lg-12"> |
|
2 |
+ |
|
3 | 3 |
<div class="card"> |
4 | 4 |
<div class="card-body"> |
5 | 5 |
<h2 class="card-title">출장 현황</h2> |
6 |
- <div class="sch-form-wrap"> |
|
7 |
- <div class="input-group"> |
|
8 |
- <select class="form-select" v-model="searchParams.year" @change="handleSearchChange"> |
|
6 |
+ <div> |
|
7 |
+ <div class="search-wrap mb30"> |
|
8 |
+ <select class="form-select sm" v-model="searchParams.year" @change="handleSearchChange"> |
|
9 | 9 |
<option value="">연도 전체</option> |
10 | 10 |
<option v-for="year in yearOptions" :key="year" :value="year">{{ year }}년</option> |
11 | 11 |
</select> |
12 |
- <select class="form-select" v-model="searchParams.month" @change="handleSearchChange"> |
|
12 |
+ <select class="form-select sm" v-model="searchParams.month" @change="handleSearchChange"> |
|
13 | 13 |
<option value="">월 전체</option> |
14 | 14 |
<option v-for="month in monthOptions" :key="month" :value="month">{{ month }}월</option> |
15 | 15 |
</select> |
16 | 16 |
</div> |
17 |
- </div> |
|
18 |
- <div class="tbl-wrap"> |
|
19 |
- <table id="myTable" class="tbl data"> |
|
20 |
- <thead> |
|
21 |
- <tr> |
|
22 |
- <th>출장구분</th> |
|
23 |
- <th>출장지</th> |
|
24 |
- <th>목적</th> |
|
25 |
- <th>출장기간</th> |
|
26 |
- <th>품의서 상태</th> |
|
27 |
- <th>복명서 등록 여부</th> |
|
28 |
- <th>복명서 상태</th> |
|
29 |
- </tr> |
|
30 |
- </thead> |
|
31 |
- <tbody> |
|
32 |
- <template v-if="hasBusinessTrips"> |
|
33 |
- <tr v-for="(item, idx) in businessTripList" :key="`${item.bsrpId}-${idx}`" @click="handleItemClick(item.bsrpId)"> |
|
34 |
- <td>{{ item.bsrpSeNm }}</td> |
|
35 |
- <td>{{ item.bsrpPlace }}</td> |
|
36 |
- <td>{{ item.bsrpPurps }}</td> |
|
37 |
- <td>{{ $formattedDates(item) }}</td> |
|
38 |
- <td>{{ item.cnsulConfmAtNm }}</td> |
|
39 |
- <td>{{ getReportRegistrationStatus(item.hasRport) }}</td> |
|
40 |
- <td>{{ getReportStatus(item) }}</td> |
|
17 |
+ <div class="tbl-wrap"> |
|
18 |
+ <table class="tbl data"> |
|
19 |
+ <thead> |
|
20 |
+ <tr> |
|
21 |
+ <th>출장구분</th> |
|
22 |
+ <th>출장지</th> |
|
23 |
+ <th>목적</th> |
|
24 |
+ <th>출장기간</th> |
|
25 |
+ <th>품의서 상태</th> |
|
26 |
+ <th>복명서 등록 여부</th> |
|
27 |
+ <th>복명서 상태</th> |
|
41 | 28 |
</tr> |
42 |
- </template> |
|
43 |
- <tr v-else> |
|
44 |
- <td colspan="7">게시물이 존재하지 않습니다.</td> |
|
45 |
- </tr> |
|
46 |
- </tbody> |
|
47 |
- </table> |
|
29 |
+ </thead> |
|
30 |
+ <tbody> |
|
31 |
+ <template v-if="hasBusinessTrips"> |
|
32 |
+ <tr v-for="(item, idx) in businessTripList" :key="`${item.bsrpId}-${idx}`" @click="handleItemClick(item.bsrpId)"> |
|
33 |
+ <td>{{ item.bsrpSeNm }}</td> |
|
34 |
+ <td>{{ item.bsrpPlace }}</td> |
|
35 |
+ <td>{{ item.bsrpPurps }}</td> |
|
36 |
+ <td>{{ $formattedDates(item) }}</td> |
|
37 |
+ <td>{{ item.cnsulConfmAtNm }}</td> |
|
38 |
+ <td>{{ getReportRegistrationStatus(item.hasRport) }}</td> |
|
39 |
+ <td>{{ getReportStatus(item) }}</td> |
|
40 |
+ </tr> |
|
41 |
+ </template> |
|
42 |
+ <tr v-else> |
|
43 |
+ <td colspan="7">게시물이 존재하지 않습니다.</td> |
|
44 |
+ </tr> |
|
45 |
+ </tbody> |
|
46 |
+ </table> |
|
47 |
+ </div> |
|
48 | 48 |
</div> |
49 |
- <Pagination :search="searchParams" @onChange="handlePageChange" /> |
|
50 | 49 |
</div> |
51 | 50 |
</div> |
52 |
- </div> |
|
51 |
+ <Pagination :search="searchParams" @onChange="handlePageChange" /> |
|
53 | 52 |
</template> |
54 | 53 |
<script> |
55 | 54 |
// API |
--- client/views/pages/Manager/attendance/VcatnInsert.vue
+++ client/views/pages/Manager/attendance/VcatnInsert.vue
... | ... | @@ -2,7 +2,8 @@ |
2 | 2 |
<div class="card"> |
3 | 3 |
<div class="card-body"> |
4 | 4 |
<h2 class="card-title">휴가 신청</h2> |
5 |
- <p class="require">* 필수입력</p> |
|
5 |
+ <div> |
|
6 |
+ <p class="require">* 필수입력</p> |
|
6 | 7 |
<div class="tbl-wrap"> |
7 | 8 |
<table class="tbl data"> |
8 | 9 |
<tbody> |
... | ... | @@ -65,7 +66,10 @@ |
65 | 66 |
</tbody> |
66 | 67 |
</table> |
67 | 68 |
</div> |
68 |
- <div class="buttons"> |
|
69 |
+ </div> |
|
70 |
+ </div> |
|
71 |
+ </div> |
|
72 |
+ <div class="d-flex justify-end align-center gap10"> |
|
69 | 73 |
<button type="button" class="btn sm btn-red" @click="handleLoadLastApprovers">이전 승인자 불러오기</button> |
70 | 74 |
<button type="button" class="btn sm primary" v-if="$isEmpty(pageId)" @click="handleSave">신청</button> |
71 | 75 |
<template v-else> |
... | ... | @@ -73,8 +77,6 @@ |
73 | 77 |
<button type="button" class="btn sm primary" v-else @click="handleUpdate">수정</button> |
74 | 78 |
<button type="button" class="btn sm secondary" @click="handleCancel">취소</button> |
75 | 79 |
</template> |
76 |
- </div> |
|
77 |
- </div> |
|
78 | 80 |
</div> |
79 | 81 |
</template> |
80 | 82 |
<script> |
--- client/views/pages/Manager/attendance/VcatnList.vue
+++ client/views/pages/Manager/attendance/VcatnList.vue
... | ... | @@ -1,77 +1,73 @@ |
1 | 1 |
<template> |
2 |
- <div class="col-lg-12"> |
|
3 | 2 |
<div class="card"> |
4 | 3 |
<div class="card-body"> |
5 | 4 |
<h2 class="card-title">휴가 현황</h2> |
6 |
- <div class="form-group"> |
|
7 |
- <div class="form-conts"> |
|
8 |
- <div class="form-conts datepicker-conts"> |
|
9 |
- <div class="datepicker-input"> |
|
10 |
- <input type="date" class="form-control datepicker cal" v-model="searchParams.bgnde" style="max-width: 200px;" @change="handleSearchChange" /> |
|
11 |
- <mark>~</mark> |
|
12 |
- <input type="date" class="form-control datepicker cal" v-model="searchParams.endde" style="max-width: 200px;" @change="handleSearchChange" /> |
|
5 |
+ <div> |
|
6 |
+ <div class="search-wrap mb30"> |
|
7 |
+ <div class="datepicker-input gap10"> |
|
8 |
+ <input type="date" class="form-control datepicker cal sm" v-model="searchParams.bgnde" style="max-width: 200px;" @change="handleSearchChange" /> |
|
9 |
+ <span>~</span> |
|
10 |
+ <input type="date" class="form-control datepicker cal sm" v-model="searchParams.endde" style="max-width: 200px;" @change="handleSearchChange" /> |
|
11 |
+ </div> |
|
12 |
+ </div> |
|
13 |
+ <div class="boxs mb20"> |
|
14 |
+ <div class="color-boxs grid-wrap" style="grid-template-columns: repeat(6,1fr);"> |
|
15 |
+ <div class="box"> |
|
16 |
+ <h3>전체</h3> |
|
17 |
+ <div> |
|
18 |
+ <span @click="handleFilterChange()">{{ totalDays }}</span> |
|
19 |
+ <small @click="handleExcessReqst(usedLeaveItem.code)">({{ carriedOverDays }})</small> |
|
20 |
+ </div> |
|
21 |
+ </div> |
|
22 |
+ <div class="box" @click="handleFilterChange(usedLeaveItem.code)"> |
|
23 |
+ <h3>사용</h3> |
|
24 |
+ <div>{{ usedLeaveItem.userSpendCnt }}</div> |
|
25 |
+ </div> |
|
26 |
+ <div class="box"> |
|
27 |
+ <h3>미사용</h3> |
|
28 |
+ <div>{{ remainingDays }}</div> |
|
29 |
+ </div> |
|
30 |
+ <div class="box" v-for="(item, idx) of otherItems" :key="idx" @click="handleFilterChange(item.code)"> |
|
31 |
+ <h3>{{ item.codeNm }}</h3> |
|
32 |
+ <div>{{ item.userSpendCnt }}</div> |
|
13 | 33 |
</div> |
14 | 34 |
</div> |
15 | 35 |
</div> |
16 |
- </div> |
|
17 |
- <div class="boxs"> |
|
18 |
- <div class="color-boxs"> |
|
19 |
- <div class="box"> |
|
20 |
- <h3>전체</h3> |
|
21 |
- <div> |
|
22 |
- <span @click="handleFilterChange()">{{ totalDays }}</span> |
|
23 |
- <small @click="handleExcessReqst(usedLeaveItem.code)">({{ carriedOverDays }})</small> |
|
24 |
- </div> |
|
25 |
- </div> |
|
26 |
- <div class="box" @click="handleFilterChange(usedLeaveItem.code)"> |
|
27 |
- <h3>사용</h3> |
|
28 |
- <div>{{ usedLeaveItem.userSpendCnt }}</div> |
|
29 |
- </div> |
|
30 |
- <div class="box"> |
|
31 |
- <h3>미사용</h3> |
|
32 |
- <div>{{ remainingDays }}</div> |
|
33 |
- </div> |
|
34 |
- <div class="box" v-for="(item, idx) of otherItems" :key="idx" @click="handleFilterChange(item.code)"> |
|
35 |
- <h3>{{ item.codeNm }}</h3> |
|
36 |
- <div>{{ item.userSpendCnt }}</div> |
|
37 |
- </div> |
|
38 |
- </div> |
|
39 |
- </div> |
|
40 |
- <div class="tbl-wrap"> |
|
41 |
- <table id="myTable" class="tbl data"> |
|
42 |
- <colgroup> |
|
43 |
- <col style="width: 15%;"> |
|
44 |
- <col style="width: 40%;"> |
|
45 |
- <col style="width: 30%;"> |
|
46 |
- <col style="width: 15%;"> |
|
47 |
- </colgroup> |
|
48 |
- <thead> |
|
49 |
- <tr> |
|
50 |
- <th>구분</th> |
|
51 |
- <th>기간</th> |
|
52 |
- <th>신청일</th> |
|
53 |
- <th>상태</th> |
|
54 |
- </tr> |
|
55 |
- </thead> |
|
56 |
- <tbody> |
|
57 |
- <template v-if="hasVacations"> |
|
58 |
- <tr v-for="(item, idx) in vacationList" :key="`${item.vcatnId}-${idx}`" @click="handleItemClick(item.vcatnId)"> |
|
59 |
- <td>{{ item.vcatnKndNm }}</td> |
|
60 |
- <td>{{ $formattedDates(item) }}</td> |
|
61 |
- <td>{{ item.rgsde }}</td> |
|
62 |
- <td>{{ item.confmAtNm }}</td> |
|
36 |
+ <div class="tbl-wrap"> |
|
37 |
+ <table id="myTable" class="tbl data"> |
|
38 |
+ <colgroup> |
|
39 |
+ <col style="width: 15%;"> |
|
40 |
+ <col style="width: 40%;"> |
|
41 |
+ <col style="width: 30%;"> |
|
42 |
+ <col style="width: 15%;"> |
|
43 |
+ </colgroup> |
|
44 |
+ <thead> |
|
45 |
+ <tr> |
|
46 |
+ <th>구분</th> |
|
47 |
+ <th>기간</th> |
|
48 |
+ <th>신청일</th> |
|
49 |
+ <th>상태</th> |
|
63 | 50 |
</tr> |
64 |
- </template> |
|
65 |
- <tr v-else> |
|
66 |
- <td colspan="4">해당 기간 내 등록된 휴가가 없습니다.</td> |
|
67 |
- </tr> |
|
68 |
- </tbody> |
|
69 |
- </table> |
|
51 |
+ </thead> |
|
52 |
+ <tbody> |
|
53 |
+ <template v-if="hasVacations"> |
|
54 |
+ <tr v-for="(item, idx) in vacationList" :key="`${item.vcatnId}-${idx}`" @click="handleItemClick(item.vcatnId)"> |
|
55 |
+ <td>{{ item.vcatnKndNm }}</td> |
|
56 |
+ <td>{{ $formattedDates(item) }}</td> |
|
57 |
+ <td>{{ item.rgsde }}</td> |
|
58 |
+ <td>{{ item.confmAtNm }}</td> |
|
59 |
+ </tr> |
|
60 |
+ </template> |
|
61 |
+ <tr v-else> |
|
62 |
+ <td colspan="4">해당 기간 내 등록된 휴가가 없습니다.</td> |
|
63 |
+ </tr> |
|
64 |
+ </tbody> |
|
65 |
+ </table> |
|
66 |
+ </div> |
|
70 | 67 |
</div> |
71 |
- <Pagination :search="searchParams" @onChange="handlePageChange" /> |
|
72 | 68 |
</div> |
73 | 69 |
</div> |
74 |
- </div> |
|
70 |
+ <Pagination :search="searchParams" @onChange="handlePageChange" /> |
|
75 | 71 |
</template> |
76 | 72 |
<script> |
77 | 73 |
// API |
--- client/views/pages/Manager/attendance/buseoAttendance.vue
+++ client/views/pages/Manager/attendance/buseoAttendance.vue
... | ... | @@ -1,114 +1,79 @@ |
1 | 1 |
<template> |
2 |
-<div class="col-lg-12"> |
|
3 | 2 |
<div class="card"> |
4 | 3 |
<div class="card-body"> |
5 | 4 |
<h2 class="card-title">부서별 근태현황</h2> |
6 |
- <div class="sch-form-wrap"> |
|
7 |
- <div class="input-group"> |
|
8 |
- <select name="" id="" class="form-select"> |
|
9 |
- <option :value="currentYear">{{ currentYear }}년</option> |
|
10 |
- <option value="all">전체</option> |
|
11 |
- <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
12 |
- {{ year }}년 |
|
13 |
- </option> |
|
5 |
+ <div> |
|
6 |
+ <div class="search-wrap mb30"> |
|
7 |
+ <select name="" id="" class="form-select sm"> |
|
8 |
+ <option :value="currentYear">{{ currentYear }}년</option> |
|
9 |
+ <option value="all">전체</option> |
|
10 |
+ <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
11 |
+ {{ year }}년 |
|
12 |
+ </option> |
|
13 |
+ </select> |
|
14 |
+ <select name="" id="" class="form-select sm"> |
|
15 |
+ <option :value="currentMonth">{{ currentMonth }}월</option> |
|
16 |
+ <option value="all">전체</option> |
|
17 |
+ <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
18 |
+ {{ month }}월 |
|
19 |
+ </option> |
|
20 |
+ </select> |
|
21 |
+ <select name="" id="" class="form-select sm"> |
|
22 |
+ <option value="">구분</option> |
|
14 | 23 |
</select> |
15 |
- <select name="" id="" class="form-select"> |
|
16 |
- <option :value="currentMonth">{{ currentMonth }}월</option> |
|
17 |
- <option value="all">전체</option> |
|
18 |
- <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
19 |
- {{ month }}월 |
|
20 |
- </option> |
|
21 |
- </select> |
|
22 |
- <select name="" id="" class="form-select"> |
|
23 |
- <option value="">구분</option> |
|
24 |
- </select> |
|
25 |
- <div class="sch-input"> |
|
26 |
- <input type="text" class="form-control" placeholder="직원명"> |
|
27 |
- <button class="ico-sch"><SearchOutlined /></button> |
|
28 |
- </div> |
|
24 |
+ <input type="text" class="form-control sm" placeholder="직원명"> |
|
25 |
+ <button class="btn-ico sm ico-sch"></button> |
|
26 |
+ </div> |
|
27 |
+ |
|
28 |
+ <!-- Table --> |
|
29 |
+ <div class="tbl-wrap"> |
|
30 |
+ <table id="myTable" class="tbl data buseo"> |
|
31 |
+ <!-- 동적으로 <th> 생성 --> |
|
32 |
+ <thead> |
|
33 |
+ <tr> |
|
34 |
+ <th>부서 </th> |
|
35 |
+ <th>직급</th> |
|
36 |
+ <th>이름</th> |
|
37 |
+ <th>지각</th> |
|
38 |
+ <th>조기퇴근</th> |
|
39 |
+ <th>결근</th> |
|
40 |
+ <th>출장</th> |
|
41 |
+ <th>주말출근</th> |
|
42 |
+ <th>대체휴가</th> |
|
43 |
+ <th>휴가</th> |
|
44 |
+ <th>공가</th> |
|
45 |
+ <th>병가</th> |
|
46 |
+ </tr> |
|
47 |
+ </thead> |
|
48 |
+ <!-- 동적으로 <td> 생성 --> |
|
49 |
+ <tbody> |
|
50 |
+ <tr v-for="(item, index) in listData" :key="index" @click="goToAttendancePage(item)"> |
|
51 |
+ <td>{{ item.department }}</td> |
|
52 |
+ <td>{{ item.position }}</td> |
|
53 |
+ <td>{{ item.name }}</td> |
|
54 |
+ <td>{{ item.late }}</td> |
|
55 |
+ <td>{{ item.earlyLeave }}</td> |
|
56 |
+ <td>{{ item.absence }}</td> |
|
57 |
+ <td>{{ item.businessTrip }}</td> |
|
58 |
+ <td>{{ item.weekendWork }}</td> |
|
59 |
+ <td>{{ item.substituteHoliday }}</td> |
|
60 |
+ <td>{{ item.vacation }}</td> |
|
61 |
+ <td>{{ item.publicHoliday }}</td> |
|
62 |
+ <td>{{ item.sickLeave }}</td> |
|
63 |
+ </tr> |
|
64 |
+ </tbody> |
|
65 |
+ </table> |
|
66 |
+ |
|
29 | 67 |
</div> |
30 | 68 |
</div> |
31 |
- |
|
32 |
- <!-- Table --> |
|
33 |
- <div class="tbl-wrap"> |
|
34 |
- <table id="myTable" class="tbl data buseo"> |
|
35 |
- <!-- 동적으로 <th> 생성 --> |
|
36 |
- <thead> |
|
37 |
- <tr> |
|
38 |
- <th>부서 </th> |
|
39 |
- <th>직급</th> |
|
40 |
- <th>이름</th> |
|
41 |
- <th>지각</th> |
|
42 |
- <th>조기퇴근</th> |
|
43 |
- <th>결근</th> |
|
44 |
- <th>출장</th> |
|
45 |
- <th>주말출근</th> |
|
46 |
- <th>대체휴가</th> |
|
47 |
- <th>휴가</th> |
|
48 |
- <th>공가</th> |
|
49 |
- <th>병가</th> |
|
50 |
- </tr> |
|
51 |
- </thead> |
|
52 |
- <!-- 동적으로 <td> 생성 --> |
|
53 |
- <tbody> |
|
54 |
- <tr v-for="(item, index) in listData" :key="index" @click="goToAttendancePage(item)"> |
|
55 |
- <td>{{ item.department }}</td> |
|
56 |
- <td>{{ item.position }}</td> |
|
57 |
- <td>{{ item.name }}</td> |
|
58 |
- <td>{{ item.late }}</td> |
|
59 |
- <td>{{ item.earlyLeave }}</td> |
|
60 |
- <td>{{ item.absence }}</td> |
|
61 |
- <td>{{ item.businessTrip }}</td> |
|
62 |
- <td>{{ item.weekendWork }}</td> |
|
63 |
- <td>{{ item.substituteHoliday }}</td> |
|
64 |
- <td>{{ item.vacation }}</td> |
|
65 |
- <td>{{ item.publicHoliday }}</td> |
|
66 |
- <td>{{ item.sickLeave }}</td> |
|
67 |
- </tr> |
|
68 |
- </tbody> |
|
69 |
- </table> |
|
70 |
- |
|
71 |
- </div> |
|
72 |
- <div class="pagination"> |
|
73 |
- <ul> |
|
74 |
- <!-- 왼쪽 화살표 (이전 페이지) --> |
|
75 |
- <li |
|
76 |
- class="arrow" |
|
77 |
- :class="{ disabled: currentPage === 1 }" |
|
78 |
- @click="changePage(currentPage - 1)" |
|
79 |
- > |
|
80 |
- < |
|
81 |
- </li> |
|
82 |
- |
|
83 |
- <!-- 페이지 번호 --> |
|
84 |
- <li |
|
85 |
- v-for="page in totalPages" |
|
86 |
- :key="page" |
|
87 |
- :class="{ active: currentPage === page }" |
|
88 |
- @click="changePage(page)" |
|
89 |
- > |
|
90 |
- {{ page }} |
|
91 |
- </li> |
|
92 |
- |
|
93 |
- <!-- 오른쪽 화살표 (다음 페이지) --> |
|
94 |
- <li |
|
95 |
- class="arrow" |
|
96 |
- :class="{ disabled: currentPage === totalPages }" |
|
97 |
- @click="changePage(currentPage + 1)" |
|
98 |
- > |
|
99 |
- > |
|
100 |
- </li> |
|
101 |
- </ul> |
|
102 |
- </div> |
|
103 |
- |
|
104 | 69 |
</div> |
105 | 70 |
</div> |
106 |
-</div> |
|
71 |
+ <Pagination /> |
|
107 | 72 |
</template> |
108 | 73 |
|
109 | 74 |
<script> |
110 |
-import { ref } from 'vue'; |
|
111 |
-import { SearchOutlined } from '@ant-design/icons-vue'; |
|
75 |
+import Pagination from '../../../component/Pagination.vue'; |
|
76 |
+ |
|
112 | 77 |
const currentYear = new Date().getFullYear(); |
113 | 78 |
const currentMonth = new Date().getMonth() + 1; |
114 | 79 |
export default { |
... | ... | @@ -164,7 +129,7 @@ |
164 | 129 |
}; |
165 | 130 |
}, |
166 | 131 |
components:{ |
167 |
- SearchOutlined |
|
132 |
+ Pagination |
|
168 | 133 |
}, |
169 | 134 |
computed: { |
170 | 135 |
}, |
--- client/views/pages/Manager/attendance/myAttendance.vue
+++ client/views/pages/Manager/attendance/myAttendance.vue
... | ... | @@ -1,133 +1,115 @@ |
1 | 1 |
<template> |
2 |
-<div class="card "> |
|
3 |
- <div class="card-body"> |
|
4 |
- <h2 class="card-title">나의 근태현황</h2> |
|
5 |
- <div class="sch-wrap"> |
|
6 |
- <div class="sch-form-wrap title-wrap"> |
|
7 |
- <div class="flex"> |
|
8 |
- <div class="sub flex"><img :src="dateicon" alt=""><p class="date">{{ today }}</p></div> |
|
9 |
- <div class="buttons"> |
|
10 |
- <button @click="handleStartClick"><img :src="startbtn" alt=""></button> |
|
11 |
- <button @click="handleEndClick"><img :src="stopbtn" alt=""></button> |
|
12 |
- </div> |
|
13 |
- </div> |
|
14 |
- <div class="input-group"> |
|
15 |
- <select name="" id="" class="form-select"> |
|
16 |
- <option :value="currentYear">{{ currentYear }}년</option> |
|
17 |
- <option value="all">전체</option> |
|
18 |
- <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
19 |
- {{ year }}년 |
|
20 |
- </option> |
|
21 |
- </select> |
|
22 |
- <select name="" id="" class="form-select"> |
|
23 |
- <option :value="currentMonth">{{ currentMonth }}월</option> |
|
24 |
- <option value="all">전체</option> |
|
25 |
- <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
26 |
- {{ month }}월 |
|
27 |
- </option> |
|
28 |
- </select> |
|
29 |
- <select name="" id="" class="form-select"> |
|
30 |
- <option value="">전체</option> |
|
31 |
- <option value="">지각</option> |
|
32 |
- <option value="">조기퇴근</option> |
|
33 |
- <option value="">결근</option> |
|
34 |
- <option value="">출장</option> |
|
35 |
- <option value="">대체휴가</option> |
|
36 |
- <option value="">휴가</option> |
|
37 |
- <option value="">공가</option> |
|
38 |
- <option value="">병가</option> |
|
39 |
- </select> |
|
40 |
- </div> |
|
41 |
- |
|
2 |
+ <div class="card "> |
|
3 |
+ <div class="card-body"> |
|
4 |
+ <h2 class="card-title">나의 근태현황</h2> |
|
5 |
+ <div> |
|
6 |
+ <div class="d-flex justify-between align-center search-zone mb30"> |
|
7 |
+ <div class="d-flex align-center gap30"> |
|
8 |
+ <div class="d-flex align-center left-icon"><span style="font-weight: 700;">{{ today }}</span></div> |
|
9 |
+ <div class="d-flex align-center gap10"> |
|
10 |
+ <button @click="handleStartClick"><img :src="startbtn" alt=""></button> |
|
11 |
+ <button @click="handleEndClick"><img :src="stopbtn" alt=""></button> |
|
12 |
+ </div> |
|
13 |
+ </div> |
|
14 |
+ <div class="d-flex align-center gap10"> |
|
15 |
+ <select name="" id="" class="form-select sm" style="width: 150px;"> |
|
16 |
+ <option :value="currentYear">{{ currentYear }}년</option> |
|
17 |
+ <option value="all">전체</option> |
|
18 |
+ <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
19 |
+ {{ year }}년 |
|
20 |
+ </option> |
|
21 |
+ </select> |
|
22 |
+ <select name="" id="" class="form-select sm" style="width: 150px;"> |
|
23 |
+ <option :value="currentMonth">{{ currentMonth }}월</option> |
|
24 |
+ <option value="all">전체</option> |
|
25 |
+ <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
26 |
+ {{ month }}월 |
|
27 |
+ </option> |
|
28 |
+ </select> |
|
29 |
+ <select name="" id="" class="form-select sm" style="width: 150px;"> |
|
30 |
+ <option value="">전체</option> |
|
31 |
+ <option value="">지각</option> |
|
32 |
+ <option value="">조기퇴근</option> |
|
33 |
+ <option value="">결근</option> |
|
34 |
+ <option value="">출장</option> |
|
35 |
+ <option value="">대체휴가</option> |
|
36 |
+ <option value="">휴가</option> |
|
37 |
+ <option value="">공가</option> |
|
38 |
+ <option value="">병가</option> |
|
39 |
+ </select> |
|
40 |
+ </div> |
|
42 | 41 |
</div> |
43 |
- </div> |
|
44 |
- <div class="tbl-wrap"> |
|
45 |
- <table class="tbl data mb30"> |
|
46 |
- <tbody> |
|
47 |
- <tr> |
|
48 |
- <th rowspan="2" style="width: 200px;">근태 현황</th> |
|
49 |
- <th>지각</th> |
|
50 |
- <th>조기퇴근</th> |
|
51 |
- <th>결근</th> |
|
52 |
- <th>출장</th> |
|
53 |
- <th>주말출근</th> |
|
54 |
- </tr> |
|
55 |
- <tr> |
|
56 |
- <td>{{ late }}</td> |
|
57 |
- <td>{{ earlyLeave }}</td> |
|
58 |
- <td>{{ absence }}</td> |
|
59 |
- <td>{{ businessTrip }}</td> |
|
60 |
- <td>{{ weekendWork }}</td> |
|
61 |
- </tr> |
|
62 |
- </tbody> |
|
63 |
- </table> |
|
64 |
- <table class="tbl data mb30"> |
|
65 |
- <tbody> |
|
66 |
- <tr> |
|
67 |
- <th rowspan="2" style="width: 200px;">휴가 현황</th> |
|
68 |
- <th>연차</th> |
|
69 |
- <th>대체휴가</th> |
|
70 |
- <th>공가</th> |
|
71 |
- <th>병가</th> |
|
72 |
- </tr> |
|
73 |
- <tr> |
|
74 |
- <td></td> |
|
75 |
- <td></td> |
|
76 |
- <td></td> |
|
77 |
- <td></td> |
|
78 |
- </tr> |
|
79 |
- </tbody> |
|
80 | 42 |
|
81 |
- </table> |
|
43 |
+ <div class="tbl-wrap mb30"> |
|
44 |
+ <table class="tbl data"> |
|
45 |
+ <tbody> |
|
46 |
+ <tr> |
|
47 |
+ <th rowspan="2" style="width: 200px; border-radius: 1rem 0 0 1rem;">근태 현황</th> |
|
48 |
+ <th>지각</th> |
|
49 |
+ <th>조기퇴근</th> |
|
50 |
+ <th>결근</th> |
|
51 |
+ <th>출장</th> |
|
52 |
+ <th style="border-radius: 0 1rem 0 0;">주말출근</th> |
|
53 |
+ </tr> |
|
54 |
+ <tr> |
|
55 |
+ <td>{{ late }}</td> |
|
56 |
+ <td>{{ earlyLeave }}</td> |
|
57 |
+ <td>{{ absence }}</td> |
|
58 |
+ <td>{{ businessTrip }}</td> |
|
59 |
+ <td style="border-radius: 0 0 1rem 0;">{{ weekendWork }}</td> |
|
60 |
+ </tr> |
|
61 |
+ </tbody> |
|
62 |
+ </table> |
|
63 |
+ </div> |
|
64 |
+ <div class="tbl-wrap mb30"> |
|
65 |
+ <table class="tbl data"> |
|
66 |
+ <tbody> |
|
67 |
+ <tr> |
|
68 |
+ <th rowspan="2" style="width: 200px; border-radius: 1rem 0 0 1rem;">휴가 현황</th> |
|
69 |
+ <th>연차</th> |
|
70 |
+ <th>대체휴가</th> |
|
71 |
+ <th>공가</th> |
|
72 |
+ <th style="border-radius: 0 1rem 0 0;">병가</th> |
|
73 |
+ </tr> |
|
74 |
+ <tr> |
|
75 |
+ <td></td> |
|
76 |
+ <td></td> |
|
77 |
+ <td></td> |
|
78 |
+ <td style="border-radius: 0 0 1rem 0;"></td> |
|
79 |
+ </tr> |
|
80 |
+ </tbody> |
|
81 |
+ </table> |
|
82 |
+ </div> |
|
83 |
+ <div class="tbl-wrap"> |
|
84 |
+ <table class="tbl data"> |
|
85 |
+ <colgroup> |
|
86 |
+ <col style="width: 200px;"> |
|
87 |
+ <col style=" width: "> |
|
88 |
+ </colgroup> |
|
89 |
+ <thead> |
|
90 |
+ <tr> |
|
91 |
+ <th>구분 </th> |
|
92 |
+ <th>내용</th> |
|
93 |
+ </tr> |
|
94 |
+ </thead> |
|
95 |
+ <!-- 동적으로 <td> 생성 --> |
|
96 |
+ <tbody> |
|
97 |
+ <tr v-for="(item, index) in listData" :key="index" > |
|
98 |
+ <td>{{ item.type }}</td> |
|
99 |
+ <td style="text-align: left !important;">{{ item.content }}</td> |
|
100 |
+ </tr> |
|
101 |
+ </tbody> |
|
102 |
+ </table> |
|
103 |
+ |
|
104 |
+ </div> |
|
82 | 105 |
</div> |
83 |
- <div class="tbl-wrap"> |
|
84 |
- <table id="myTable" class="tbl data"> |
|
85 |
- <colgroup> |
|
86 |
- <col style="width: 200px;"> |
|
87 |
- <col style=" width: "> |
|
88 |
- </colgroup> |
|
89 |
- <thead> |
|
90 |
- <tr> |
|
91 |
- <th>구분 </th> |
|
92 |
- <th>내용</th> |
|
93 |
- </tr> |
|
94 |
- </thead> |
|
95 |
- <!-- 동적으로 <td> 생성 --> |
|
96 |
- <tbody> |
|
97 |
- <tr v-for="(item, index) in listData" :key="index" > |
|
98 |
- <td>{{ item.type }}</td> |
|
99 |
- <td style="text-align: left !important;">{{ item.content }}</td> |
|
100 |
- </tr> |
|
101 |
- </tbody> |
|
102 |
- </table> |
|
103 |
- |
|
104 |
- </div> |
|
105 |
- <div class="pagination"> |
|
106 |
- <ul> |
|
107 |
- <!-- 왼쪽 화살표 (이전 페이지) --> |
|
108 |
- <li class="arrow" :class="{ disabled: currentPage === 1 }" @click="changePage(currentPage - 1)"> |
|
109 |
- < |
|
110 |
- </li> |
|
111 |
- |
|
112 |
- <!-- 페이지 번호 --> |
|
113 |
- <li v-for="page in totalPages" :key="page" :class="{ active: currentPage === page }" |
|
114 |
- @click="changePage(page)"> |
|
115 |
- {{ page }} |
|
116 |
- </li> |
|
117 |
- |
|
118 |
- <!-- 오른쪽 화살표 (다음 페이지) --> |
|
119 |
- <li class="arrow" :class="{ disabled: currentPage === totalPages }" @click="changePage(currentPage + 1)"> |
|
120 |
- > |
|
121 |
- </li> |
|
122 |
- </ul> |
|
123 |
- </div> |
|
124 |
- |
|
125 |
- </div> |
|
126 | 106 |
</div> |
107 |
+ </div> |
|
108 |
+ <Pagination /> |
|
127 | 109 |
</template> |
128 | 110 |
|
129 | 111 |
<script> |
130 |
-import { SearchOutlined } from '@ant-design/icons-vue'; |
|
112 |
+import Pagination from "../../../component/Pagination.vue"; |
|
131 | 113 |
const currentYear = new Date().getFullYear(); |
132 | 114 |
const currentMonth = new Date().getMonth() + 1; |
133 | 115 |
export default { |
... | ... | @@ -150,9 +132,8 @@ |
150 | 132 |
day: '2-digit', |
151 | 133 |
weekday: 'short', |
152 | 134 |
}), |
153 |
- dateicon: "/client/resources/img/img.png", |
|
154 |
- startbtn: "/client/resources/img/start-sm.png", |
|
155 |
- stopbtn: "/client/resources/img/stop-sm.png", |
|
135 |
+ startbtn: "/client/resources/img/start-sm.png", |
|
136 |
+ stopbtn: "/client/resources/img/stop-sm.png", |
|
156 | 137 |
startDate: today, |
157 | 138 |
startTime: "09:00", // 기본 시작 시간 09:00 |
158 | 139 |
endDate: today, |
... | ... | @@ -165,7 +146,7 @@ |
165 | 146 |
}; |
166 | 147 |
}, |
167 | 148 |
components:{ |
168 |
- SearchOutlined |
|
149 |
+ Pagination |
|
169 | 150 |
}, |
170 | 151 |
computed: { |
171 | 152 |
// Pinia Store의 상태를 가져옵니다. |
--- client/views/pages/Manager/task/projectInsert.vue
+++ client/views/pages/Manager/task/projectInsert.vue
... | ... | @@ -1,148 +1,116 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="card"> |
3 |
- |
|
4 | 3 |
<div class="card-body"> |
5 | 4 |
<h2 class="card-title">프로젝트 등록</h2> |
6 |
- <p class="require"><img :src="require" alt=""> 필수입력</p> |
|
7 |
- <form class="row g-3 needs-validation" @submit.prevent="handleSubmit"> |
|
8 |
- |
|
9 |
- <div class="col-12"> |
|
10 |
- <label for="purpose" class="form-label"> |
|
11 |
- <p>구분 |
|
12 |
- <p class="require"><img :src="require" alt=""></p> |
|
13 |
- </p> |
|
14 |
- </label> |
|
15 |
- <select class="form-select" style="width: 110px;"> |
|
16 |
- <option value=""></option> |
|
17 |
- <option value=""></option> |
|
18 |
- <option value=""></option> |
|
19 |
- </select> |
|
5 |
+ <div style="overflow: auto;"> |
|
6 |
+ <p class="require"><img :src="require" alt=""> 필수입력</p> |
|
7 |
+ <div class="tbl-wrap"> |
|
8 |
+ <table class="tbl data"> |
|
9 |
+ <tbody> |
|
10 |
+ <tr> |
|
11 |
+ <th>구분 <sup>*</sup></th> |
|
12 |
+ <td colspan="3"> |
|
13 |
+ <select class="form-select sm" style="width: 110px;"> |
|
14 |
+ <option value=""></option> |
|
15 |
+ <option value=""></option> |
|
16 |
+ <option value=""></option> |
|
17 |
+ </select> |
|
18 |
+ </td> |
|
19 |
+ </tr> |
|
20 |
+ <tr> |
|
21 |
+ <th>프로젝트명 <sup>*</sup></th> |
|
22 |
+ <td colspan="3"><input type="text" class="form-control sm" /></td> |
|
23 |
+ </tr> |
|
24 |
+ <tr> |
|
25 |
+ <th>주관기관</th> |
|
26 |
+ <td><input type="text" class="form-control sm" /></td> |
|
27 |
+ <th>담당부서 <sup>*</sup></th> |
|
28 |
+ <td class="d-flex gap-2"> |
|
29 |
+ <input type="text" class="form-control sm" v-model="selectedDepartment" readonly /> |
|
30 |
+ <input type="button" class="form-control sm" value="검색" @click="showPopup = true" /> |
|
31 |
+ <BuseoPopup v-if="showPopup" @close="showPopup = false" @select="addBuseo" /> |
|
32 |
+ </td> |
|
33 |
+ </tr> |
|
34 |
+ <tr> |
|
35 |
+ <th>프로젝트 책임자 <sup>*</sup></th> |
|
36 |
+ <td class="d-flex gap-2"> |
|
37 |
+ <input type="text" class="form-control sm" v-model="selectedname" readonly /> |
|
38 |
+ <input type="button" class="form-control sm" value="검색" @click="showPopup1 = true" /> |
|
39 |
+ <HrPopup v-if="showPopup1" @close="showPopup1 = false" @select="addApproval" /> |
|
40 |
+ </td> |
|
41 |
+ <th>사업비</th> |
|
42 |
+ <td><input type="text" class="form-control sm" v-model="where" /></td> |
|
43 |
+ </tr> |
|
44 |
+ <tr> |
|
45 |
+ <th>회의비</th> |
|
46 |
+ <td colspan="3"><input type="text" class="form-control sm" v-model="where" /></td> |
|
47 |
+ </tr> |
|
48 |
+ <tr> |
|
49 |
+ <th>사업기간 <sup>*</sup></th> |
|
50 |
+ <td colspan="3"> |
|
51 |
+ <div class="d-flex gap-1"> |
|
52 |
+ <input type="date" class="form-control sm" v-model="startDate" /> ~ |
|
53 |
+ <input type="date" class="form-control sm" v-model="endDate" /> |
|
54 |
+ </div> |
|
55 |
+ </td> |
|
56 |
+ </tr> |
|
57 |
+ <tr> |
|
58 |
+ <th>계획기간</th> |
|
59 |
+ <td colspan="3"> |
|
60 |
+ <div class="d-flex gap-1"> |
|
61 |
+ <input type="date" class="form-control sm" v-model="startDate" /> ~ |
|
62 |
+ <input type="date" class="form-control sm" v-model="endDate" /> |
|
63 |
+ </div> |
|
64 |
+ </td> |
|
65 |
+ </tr> |
|
66 |
+ <tr> |
|
67 |
+ <th>실제기간</th> |
|
68 |
+ <td colspan="3"> |
|
69 |
+ <div class="d-flex gap-1"> |
|
70 |
+ <input type="date" class="form-control sm" v-model="startDate" /> ~ |
|
71 |
+ <input type="date" class="form-control sm" v-model="endDate" /> |
|
72 |
+ </div> |
|
73 |
+ </td> |
|
74 |
+ </tr> |
|
75 |
+ <tr> |
|
76 |
+ <th> |
|
77 |
+ 투입인력 |
|
78 |
+ <button type="button" title="추가" @click="showPopup2 = true"> |
|
79 |
+ <PlusCircleFilled /> |
|
80 |
+ </button> |
|
81 |
+ <sup>*</sup> |
|
82 |
+ </th> |
|
83 |
+ <td colspan="3"> |
|
84 |
+ <HrPopup v-if="showPopup2" @close="showPopup2 = false" @select="addApproval1"/> |
|
85 |
+ <div class="approval-container"> |
|
86 |
+ <div v-for="(member, index) in approvals1" :key="index" class="d-flex gap-2 addapproval mb-2"> |
|
87 |
+ <select class="form-select sm" style="width: 110px;" v-model="member.category"> |
|
88 |
+ <option value="선택">선택</option> |
|
89 |
+ <option value=""></option> |
|
90 |
+ <option value=""></option> |
|
91 |
+ </select> |
|
92 |
+ <input type="text" class="form-control sm" v-model="member.name" style="max-width: 150px;" /> |
|
93 |
+ <button type="button" @click="removeApproval(index)" class="delete-button"> |
|
94 |
+ <CloseOutlined /> |
|
95 |
+ </button> |
|
96 |
+ </div> |
|
97 |
+ </div> |
|
98 |
+ </td> |
|
99 |
+ </tr> |
|
100 |
+ <tr> |
|
101 |
+ <th>비고</th> |
|
102 |
+ <td colspan="3" ><input type="text" class="form-control sm textarea" v-model="reason" /></td> |
|
103 |
+ </tr> |
|
104 |
+ </tbody> |
|
105 |
+ </table> |
|
20 | 106 |
</div> |
21 |
- <div class="col-12"> |
|
22 |
- <label for="inputName5" class="form-label"> |
|
23 |
- <p>프로젝트명 |
|
24 |
- <p class="require"><img :src="require" alt=""></p> |
|
25 |
- </p> |
|
26 |
- </label> |
|
27 |
- <input type="text" class="form-control" /> |
|
28 |
- </div> |
|
29 |
- <div class="col-12"> |
|
30 |
- <label for="inputName5" class="form-label">주관기관</label> |
|
31 |
- <input type="text" class="form-control" /> |
|
32 |
- </div> |
|
33 |
- <div class="col-12"> |
|
34 |
- <div class="col-12 border-x"> |
|
35 |
- <label for="where" class="form-label"> |
|
36 |
- <p>담당부서 |
|
37 |
- <p class="require"><img :src="require" alt=""></p> |
|
38 |
- </p> |
|
39 |
- </label> |
|
40 |
- <input type="text" class="form-control" id="buseo" v-model="selectedDepartment" readonly /> |
|
41 |
- <input type="button" class="form-control " value="검색" @click="showPopup = true" /> |
|
42 |
- <BuseoPopup v-if="showPopup" @close="showPopup = false" @select="addBuseo" /> |
|
43 |
- </div> |
|
44 |
- <div class="col-12 border-x"> |
|
45 |
- <label for="where" class="form-label"> |
|
46 |
- <p>프로젝트 책임자 |
|
47 |
- <p class="require"><img :src="require" alt=""></p> |
|
48 |
- </p> |
|
49 |
- </label> |
|
50 |
- <input type="text" class="form-control" id="where" v-model="selectedname" readonly /> |
|
51 |
- <input type="button" class="form-control " value="검색" @click="showPopup1 = true" /> |
|
52 |
- <HrPopup v-if="showPopup1" @close="showPopup1 = false" @select="addApproval" /> |
|
53 |
- </div> |
|
54 |
- |
|
55 |
- </div> |
|
56 |
- <div class="col-12"> |
|
57 |
- <div class="col-12 border-x"> |
|
58 |
- <label for="where" class="form-label">사업비</label> |
|
59 |
- <input type="text" class="form-control" id="where" v-model="where" /> |
|
60 |
- </div> |
|
61 |
- <div class="col-12 border-x"> |
|
62 |
- <label for="where" class="form-label">회의비</label> |
|
63 |
- <input type="text" class="form-control" id="where" v-model="where" /> |
|
64 |
- </div> |
|
65 |
- |
|
66 |
- </div> |
|
67 |
- <div class="col-12"> |
|
68 |
- <label for="startDate" class="form-label"> |
|
69 |
- <p>사업기간 |
|
70 |
- <p class="require"><img :src="require" alt=""></p> |
|
71 |
- </p> |
|
72 |
- </label> |
|
73 |
- <div class="d-flex gap-1"> |
|
74 |
- <input type="date" class="form-control" id="startDate" v-model="startDate" /> |
|
75 |
- <!-- 시간 선택을 위한 select 사용 --> |
|
76 |
- ~ |
|
77 |
- </div> |
|
78 |
- <div class="d-flex gap-1"> |
|
79 |
- <input type="date" class="form-control" id="endDate" v-model="endDate" /> |
|
80 |
- </div> |
|
81 |
- </div> |
|
82 |
- <div class="col-12"> |
|
83 |
- <label for="startDate" class="form-label">계획기간</label> |
|
84 |
- <div class="d-flex gap-1"> |
|
85 |
- <input type="date" class="form-control" id="startDate" v-model="startDate" /> |
|
86 |
- <!-- 시간 선택을 위한 select 사용 --> |
|
87 |
- ~ |
|
88 |
- </div> |
|
89 |
- <div class="d-flex gap-1"> |
|
90 |
- <input type="date" class="form-control" id="endDate" v-model="endDate" /> |
|
91 |
- </div> |
|
92 |
- </div> |
|
93 |
- <div class="col-12"> |
|
94 |
- <label for="startDate" class="form-label">실제기간</label> |
|
95 |
- <div class="d-flex gap-1"> |
|
96 |
- <input type="date" class="form-control" id="startDate" v-model="startDate" /> |
|
97 |
- <!-- 시간 선택을 위한 select 사용 --> |
|
98 |
- ~ |
|
99 |
- </div> |
|
100 |
- <div class="d-flex gap-1"> |
|
101 |
- <input type="date" class="form-control" id="endDate" v-model="endDate" /> |
|
102 |
- </div> |
|
103 |
- </div> |
|
104 |
- |
|
105 |
- |
|
106 |
- <div class="col-12 "> |
|
107 |
- <label for="member" class="form-label"> |
|
108 |
- <p>투입인력 <button type="button" title="추가" @click="showPopup2 = true"> |
|
109 |
- <PlusCircleFilled /> |
|
110 |
- </button> |
|
111 |
- <p class="require"><img :src="require" alt=""></p> |
|
112 |
- </p> |
|
113 |
- |
|
114 |
- </label> |
|
115 |
- <HrPopup v-if="showPopup2" @close="showPopup2 = false" @select="addApproval1"/> |
|
116 |
- <div class="approval-container"> |
|
117 |
- <div v-for="(member, index) in approvals1" :key="index" class="d-flex gap-2 addapproval mb-2"> |
|
118 |
- <select class="form-select" style="width: 110px;" v-model="member.category"> |
|
119 |
- <option value="선택">선택</option> |
|
120 |
- <option value=""></option> |
|
121 |
- <option value=""></option> |
|
122 |
- </select> |
|
123 |
- <input type="text" class="form-control" v-model="member.name" style="max-width: 150px;" /> |
|
124 |
- |
|
125 |
- |
|
126 |
- <button type="button" @click="removeApproval(index)" class="delete-button"> |
|
127 |
- <CloseOutlined /> |
|
128 |
- </button> |
|
129 |
- </div> |
|
130 |
- </div> |
|
131 |
- </div> |
|
132 |
- |
|
133 |
- <div class="col-12 chuljang border-x"> |
|
134 |
- <label for="prvonsh" class="form-label">비고</label> |
|
135 |
- <input type="text" class="form-control textarea" id="reason" v-model="reason" /> |
|
136 |
- </div> |
|
137 |
- |
|
138 |
- |
|
139 |
- </form> |
|
140 |
- <div class="buttons"> |
|
141 |
- <button type="submit" class="btn sm primary">등록</button> |
|
142 |
- <button type="reset" class="btn sm tertiary">취소</button> |
|
143 | 107 |
</div> |
144 | 108 |
</div> |
145 | 109 |
</div> |
110 |
+ <div class="d-flex justify-end align-center gap10"> |
|
111 |
+ <button type="submit" class="btn sm primary">등록</button> |
|
112 |
+ <button type="reset" class="btn sm tertiary">취소</button> |
|
113 |
+ </div> |
|
146 | 114 |
</template> |
147 | 115 |
|
148 | 116 |
<script> |
--- client/views/pages/Manager/task/projectStatue.vue
+++ client/views/pages/Manager/task/projectStatue.vue
... | ... | @@ -1,11 +1,12 @@ |
1 | 1 |
<template> |
2 |
-<div class="col-lg-12"> |
|
2 |
+ |
|
3 | 3 |
<div class="card"> |
4 | 4 |
<div class="card-body"> |
5 | 5 |
<h2 class="card-title">프로젝트 현황</h2> |
6 |
-<!-- //폼그룹 --> |
|
7 |
- <div class="boxs"> |
|
8 |
- <div class="color-boxs"> |
|
6 |
+ <div> |
|
7 |
+ <!-- //폼그룹 --> |
|
8 |
+ <div class="boxs mb10"> |
|
9 |
+ <div class="color-boxs grid-wrap" style="grid-template-columns: repeat(4,1fr);"> |
|
9 | 10 |
<div class="box "> |
10 | 11 |
<h3>전체</h3> |
11 | 12 |
3 |
... | ... | @@ -23,115 +24,77 @@ |
23 | 24 |
3 |
24 | 25 |
</div> |
25 | 26 |
</div> |
26 |
- </div> |
|
27 |
- <div class="sch-form-wrap title-wrap"> |
|
28 |
- <h3><img :src="h3icon" alt="">승인 대기</h3> |
|
29 |
- <div class="input-group"> |
|
30 |
- <select name="" id="" class="form-select"> |
|
31 |
- <option :value="currentYear">{{ currentYear }}년</option> |
|
32 |
- <option value="all">전체</option> |
|
33 |
- <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
34 |
- {{ year }}년 |
|
35 |
- </option> |
|
36 |
- </select> |
|
37 |
- <select name="" id="" class="form-select"> |
|
38 |
- <option :value="currentMonth">{{ currentMonth }}월</option> |
|
39 |
- <option value="all">전체</option> |
|
40 |
- <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
41 |
- {{ month }}월 |
|
42 |
- </option> |
|
43 |
- </select> |
|
44 |
- <select name="" id="" class="form-select"> |
|
45 |
- <option value="">부서</option> |
|
46 |
- </select> |
|
47 |
- <select name="" id="" class="form-select"> |
|
48 |
- <option value="">전체</option> |
|
49 |
- <option value="">프로젝트명</option> |
|
50 |
- <option value="">PM</option> |
|
51 |
- </select> |
|
52 |
- <div class="sch-input"> |
|
53 |
- <input type="text" class="form-control"> |
|
54 |
- <button class="ico-sch"><SearchOutlined /></button> |
|
55 |
- </div> |
|
56 | 27 |
</div> |
57 |
- </div> |
|
58 |
- <!-- Table --> |
|
59 |
- <div class="tbl-wrap"> |
|
60 |
- <table id="myTable" class="tbl data"> |
|
61 |
- <!-- 동적으로 <th> 생성 --> |
|
62 |
- <thead> |
|
63 |
- <tr> |
|
64 |
- <th>구분 </th> |
|
65 |
- <th>부서</th> |
|
66 |
- <th>프로젝트명</th> |
|
67 |
- <th>PM</th> |
|
68 |
- <th>사업비</th> |
|
69 |
- <th>기간</th> |
|
70 |
- <th>상태</th> |
|
71 |
- </tr> |
|
72 |
- </thead> |
|
73 |
- <!-- 동적으로 <td> 생성 --> |
|
74 |
- <tbody> |
|
75 |
- <tr |
|
76 |
- v-for="(item, index) in listData" |
|
77 |
- :key="index" |
|
78 |
- @click="goToDetailPage(item)" |
|
79 |
- :class="{ 'expired': isPastStatus(item.status) }" |
|
80 |
- > |
|
81 |
- <td>{{ item.type }}</td> |
|
82 |
- <td>{{ item.department }}</td> |
|
83 |
- <td>{{ item.projectName }}</td> |
|
84 |
- <td>{{ item.pm }}</td> |
|
85 |
- <td>{{ item.budget }}</td> |
|
86 |
- <td>{{ item.period }}</td> |
|
87 |
- <td :class="getStatusClass(item.status)"> |
|
88 |
- {{ item.status }} |
|
89 |
- </td> |
|
90 |
- </tr> |
|
91 |
- </tbody> |
|
92 |
- </table> |
|
28 |
+ <div class="search-wrap mb10"> |
|
29 |
+ <select class="form-select sm"> |
|
30 |
+ <option :value="currentYear">{{ currentYear }}년</option> |
|
31 |
+ <option value="all">전체</option> |
|
32 |
+ <option v-for="year in remainingYears" :key="year" :value="year" v-if="year !== currentYear"> |
|
33 |
+ {{ year }}년 |
|
34 |
+ </option> |
|
35 |
+ </select> |
|
36 |
+ <select class="form-select sm"> |
|
37 |
+ <option :value="currentMonth">{{ currentMonth }}월</option> |
|
38 |
+ <option value="all">전체</option> |
|
39 |
+ <option v-for="month in remainingMonths" :key="month" :value="month" v-if="month !== currentMonth"> |
|
40 |
+ {{ month }}월 |
|
41 |
+ </option> |
|
42 |
+ </select> |
|
43 |
+ <select class="form-select sm"> |
|
44 |
+ <option value="">부서</option> |
|
45 |
+ </select> |
|
46 |
+ <select class="form-select sm"> |
|
47 |
+ <option value="">전체</option> |
|
48 |
+ <option value="">프로젝트명</option> |
|
49 |
+ <option value="">PM</option> |
|
50 |
+ </select> |
|
51 |
+ <input type="text" class="form-control sm"> |
|
52 |
+ <button class="btn-ico sm ico-sch"></button> |
|
53 |
+ </div> |
|
54 |
+ <!-- Table --> |
|
55 |
+ <div class="tbl-wrap"> |
|
56 |
+ <table class="tbl data"> |
|
57 |
+ <!-- 동적으로 <th> 생성 --> |
|
58 |
+ <thead> |
|
59 |
+ <tr> |
|
60 |
+ <th>구분 </th> |
|
61 |
+ <th>부서</th> |
|
62 |
+ <th>프로젝트명</th> |
|
63 |
+ <th>PM</th> |
|
64 |
+ <th>사업비</th> |
|
65 |
+ <th>기간</th> |
|
66 |
+ <th>상태</th> |
|
67 |
+ </tr> |
|
68 |
+ </thead> |
|
69 |
+ <!-- 동적으로 <td> 생성 --> |
|
70 |
+ <tbody> |
|
71 |
+ <tr |
|
72 |
+ v-for="(item, index) in listData" |
|
73 |
+ :key="index" |
|
74 |
+ @click="goToDetailPage(item)" |
|
75 |
+ :class="{ 'expired': isPastStatus(item.status) }" |
|
76 |
+ > |
|
77 |
+ <td>{{ item.type }}</td> |
|
78 |
+ <td>{{ item.department }}</td> |
|
79 |
+ <td>{{ item.projectName }}</td> |
|
80 |
+ <td>{{ item.pm }}</td> |
|
81 |
+ <td>{{ item.budget }}</td> |
|
82 |
+ <td>{{ item.period }}</td> |
|
83 |
+ <td :class="getStatusClass(item.status)"> |
|
84 |
+ {{ item.status }} |
|
85 |
+ </td> |
|
86 |
+ </tr> |
|
87 |
+ </tbody> |
|
88 |
+ </table> |
|
93 | 89 |
|
94 | 90 |
</div> |
95 |
- <div class="pagination"> |
|
96 |
- <ul> |
|
97 |
- <!-- 왼쪽 화살표 (이전 페이지) --> |
|
98 |
- <li |
|
99 |
- class="arrow" |
|
100 |
- :class="{ disabled: currentPage === 1 }" |
|
101 |
- @click="changePage(currentPage - 1)" |
|
102 |
- > |
|
103 |
- < |
|
104 |
- </li> |
|
105 |
- |
|
106 |
- <!-- 페이지 번호 --> |
|
107 |
- <li |
|
108 |
- v-for="page in totalPages" |
|
109 |
- :key="page" |
|
110 |
- :class="{ active: currentPage === page }" |
|
111 |
- @click="changePage(page)" |
|
112 |
- > |
|
113 |
- {{ page }} |
|
114 |
- </li> |
|
115 |
- |
|
116 |
- <!-- 오른쪽 화살표 (다음 페이지) --> |
|
117 |
- <li |
|
118 |
- class="arrow" |
|
119 |
- :class="{ disabled: currentPage === totalPages }" |
|
120 |
- @click="changePage(currentPage + 1)" |
|
121 |
- > |
|
122 |
- > |
|
123 |
- </li> |
|
124 |
- </ul> |
|
125 |
- </div> |
|
126 |
- |
|
91 |
+ </div> |
|
127 | 92 |
</div> |
128 | 93 |
</div> |
129 |
-</div> |
|
94 |
+ |
|
130 | 95 |
</template> |
131 | 96 |
|
132 | 97 |
<script> |
133 |
-import { ref } from 'vue'; |
|
134 |
-import { SearchOutlined } from '@ant-design/icons-vue'; |
|
135 | 98 |
const currentYear = new Date().getFullYear(); |
136 | 99 |
const currentMonth = new Date().getMonth() + 1; |
137 | 100 |
export default { |
... | ... | @@ -184,7 +147,6 @@ |
184 | 147 |
}; |
185 | 148 |
}, |
186 | 149 |
components:{ |
187 |
- SearchOutlined |
|
188 | 150 |
}, |
189 | 151 |
computed: { |
190 | 152 |
}, |
--- client/views/pages/Manager/task/projectTuib.vue
+++ client/views/pages/Manager/task/projectTuib.vue
... | ... | @@ -1,100 +1,64 @@ |
1 | 1 |
<template> |
2 |
-<div class="col-lg-12"> |
|
2 |
+ |
|
3 | 3 |
<div class="card"> |
4 | 4 |
<div class="card-body"> |
5 | 5 |
<h2 class="card-title">투입 현황</h2> |
6 |
- <div class="sch-form-wrap"> |
|
7 |
- <div class="input-group"> |
|
8 |
- <select name="" id="" class="form-select"> |
|
9 |
- <option :value="currentYear">{{ currentYear }}년</option> |
|
10 |
- <option value="all">전체</option> |
|
11 |
- <option |
|
12 |
- v-for="year in remainingYears" |
|
13 |
- :key="year" |
|
14 |
- :value="year" |
|
15 |
- v-if="year !== currentYear" |
|
16 |
- > |
|
17 |
- {{ year }}년 |
|
18 |
- </option> |
|
6 |
+ <div> |
|
7 |
+ <div class="search-wrap mb30"> |
|
8 |
+ <select name="" id="" class="form-select sm"> |
|
9 |
+ <option :value="currentYear">{{ currentYear }}년</option> |
|
10 |
+ <option value="all">전체</option> |
|
11 |
+ <option |
|
12 |
+ v-for="year in remainingYears" |
|
13 |
+ :key="year" |
|
14 |
+ :value="year" |
|
15 |
+ v-if="year !== currentYear" |
|
16 |
+ > |
|
17 |
+ {{ year }}년 |
|
18 |
+ </option> |
|
19 | 19 |
</select> |
20 |
- <select name="" id="" class="form-select"> |
|
21 |
- <option value="">구분</option> |
|
22 |
- </select> |
|
23 |
- <div class="sch-input"> |
|
24 |
- <input type="text" class="form-control" placeholder="이름"> |
|
25 |
- <button class="ico-sch"><SearchOutlined /></button> |
|
26 |
- </div> |
|
20 |
+ <select name="" id="" class="form-select sm"> |
|
21 |
+ <option value="">구분</option> |
|
22 |
+ </select> |
|
23 |
+ <input type="text" class="form-control sm" placeholder="이름"> |
|
24 |
+ <button class="btn-ico sm ico-sch"></button> |
|
25 |
+ </div> |
|
26 |
+ <!-- Table --> |
|
27 |
+ <div class="tbl-wrap"> |
|
28 |
+ <table id="myTable" class="tbl data buseo"> |
|
29 |
+ <!-- 동적으로 <th> 생성 --> |
|
30 |
+ <thead> |
|
31 |
+ <tr> |
|
32 |
+ <th rowspan="2">No </th> |
|
33 |
+ <th rowspan="2">부서</th> |
|
34 |
+ <th rowspan="2">직급</th> |
|
35 |
+ <th rowspan="2">이름</th> |
|
36 |
+ <th colspan="3">프로젝트</th> |
|
37 |
+ </tr> |
|
38 |
+ <tr> |
|
39 |
+ <th><p >진행전</p></th> |
|
40 |
+ <th><p class="blue">진행중</p></th> |
|
41 |
+ <th><p class="green">완료</p></th> |
|
42 |
+ </tr> |
|
43 |
+ </thead> |
|
44 |
+ <!-- 동적으로 <td> 생성 --> |
|
45 |
+ <tbody> |
|
46 |
+ <tr v-for="(item, index) in listData" :key="index" @click="goToAttendancePage(item)"> |
|
47 |
+ <td>{{ index + 1 }}</td> |
|
48 |
+ <td>{{ item.department }}</td> |
|
49 |
+ <td>{{ item.position }}</td> |
|
50 |
+ <td>{{ item.name }}</td> |
|
51 |
+ <td>{{ item.projectBefore }}</td> |
|
52 |
+ <td>{{ item.projectOngoing }}</td> |
|
53 |
+ <td>{{ item.projectDone }}</td> |
|
54 |
+ </tr> |
|
55 |
+ </tbody> |
|
56 |
+ </table> |
|
57 |
+ |
|
27 | 58 |
</div> |
28 | 59 |
</div> |
29 |
- |
|
30 |
- <!-- Table --> |
|
31 |
- <div class="tbl-wrap"> |
|
32 |
- <table id="myTable" class="tbl data buseo"> |
|
33 |
- <!-- 동적으로 <th> 생성 --> |
|
34 |
- <thead> |
|
35 |
- <tr> |
|
36 |
- <th rowspan="2">No </th> |
|
37 |
- <th rowspan="2">부서</th> |
|
38 |
- <th rowspan="2">직급</th> |
|
39 |
- <th rowspan="2">이름</th> |
|
40 |
- <th colspan="3">프로젝트</th> |
|
41 |
- </tr> |
|
42 |
- <tr> |
|
43 |
- <th><p >진행전</p></th> |
|
44 |
- <th><p class="blue">진행중</p></th> |
|
45 |
- <th><p class="green">완료</p></th> |
|
46 |
- </tr> |
|
47 |
- </thead> |
|
48 |
- <!-- 동적으로 <td> 생성 --> |
|
49 |
- <tbody> |
|
50 |
- <tr v-for="(item, index) in listData" :key="index" @click="goToAttendancePage(item)"> |
|
51 |
- <td>{{ index + 1 }}</td> |
|
52 |
- <td>{{ item.department }}</td> |
|
53 |
- <td>{{ item.position }}</td> |
|
54 |
- <td>{{ item.name }}</td> |
|
55 |
- <td>{{ item.projectBefore }}</td> |
|
56 |
- <td>{{ item.projectOngoing }}</td> |
|
57 |
- <td>{{ item.projectDone }}</td> |
|
58 |
- </tr> |
|
59 |
- </tbody> |
|
60 |
- </table> |
|
61 |
- |
|
62 |
- </div> |
|
63 |
- <div class="pagination"> |
|
64 |
- <ul> |
|
65 |
- <!-- 왼쪽 화살표 (이전 페이지) --> |
|
66 |
- <li |
|
67 |
- class="arrow" |
|
68 |
- :class="{ disabled: currentPage === 1 }" |
|
69 |
- @click="changePage(currentPage - 1)" |
|
70 |
- > |
|
71 |
- < |
|
72 |
- </li> |
|
73 |
- |
|
74 |
- <!-- 페이지 번호 --> |
|
75 |
- <li |
|
76 |
- v-for="page in totalPages" |
|
77 |
- :key="page" |
|
78 |
- :class="{ active: currentPage === page }" |
|
79 |
- @click="changePage(page)" |
|
80 |
- > |
|
81 |
- {{ page }} |
|
82 |
- </li> |
|
83 |
- |
|
84 |
- <!-- 오른쪽 화살표 (다음 페이지) --> |
|
85 |
- <li |
|
86 |
- class="arrow" |
|
87 |
- :class="{ disabled: currentPage === totalPages }" |
|
88 |
- @click="changePage(currentPage + 1)" |
|
89 |
- > |
|
90 |
- > |
|
91 |
- </li> |
|
92 |
- </ul> |
|
93 |
- </div> |
|
94 |
- |
|
95 | 60 |
</div> |
96 | 61 |
</div> |
97 |
-</div> |
|
98 | 62 |
</template> |
99 | 63 |
|
100 | 64 |
<script> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?