jichoi / calendar star
최정임 최정임 01-31
250131 최정임
@36d12b34b0b6bb543d76d5fedcb844392c102072
client/resources/css/style.css
--- client/resources/css/style.css
+++ client/resources/css/style.css
@@ -427,7 +427,7 @@
   width: 100%;
 }
 
-.header .search-form input {
+ .search-form input {
   border: 0;
   font-size: 14px;
   color: #012970;
@@ -438,21 +438,21 @@
   width: 100%;
 }
 
-.header .search-form input:focus,
-.header .search-form input:hover {
+ .search-form input:focus,
+ .search-form input:hover {
   outline: none;
   box-shadow: 0 0 10px 0 rgba(1, 41, 112, 0.15);
   border: 1px solid rgba(1, 41, 112, 0.3);
 }
 
-.header .search-form button {
+ .search-form button {
   border: 0;
   padding: 0;
   margin-left: -30px;
   background: none;
 }
 
-.header .search-form button i {
+ .search-form button i {
   color: #012970;
 }
 
@@ -1223,4 +1223,6 @@
   text-align: center;
   font-size: 13px;
   color: #012970;
-}
(파일 끝에 줄바꿈 문자 없음)
+}
+
+.select-member{color: #6980aa;}
(파일 끝에 줄바꿈 문자 없음)
client/views/layout/SideBar.vue
--- client/views/layout/SideBar.vue
+++ client/views/layout/SideBar.vue
@@ -1,84 +1,97 @@
 <template>
-     <!-- ======= Sidebar ======= -->
+  <!-- ======= Sidebar ======= -->
   <aside id="sidebar" class="sidebar">
 
-<ul class="sidebar-nav" id="sidebar-nav">
+    <ul class="sidebar-nav" id="sidebar-nav">
 
-  <li class="nav-item">
-    <router-link to="/" class="nav-link " active-class="active"><i class="bi bi-grid"></i>
-        <span>Home</span></router-link>
-  </li><!-- End Dashboard Nav -->
+      <li class="nav-item">
+        <router-link to="/" class="nav-link " active-class="active"><i class="bi bi-grid"></i>
+          <span>Home</span></router-link>
+      </li><!-- End Dashboard Nav -->
 
 
 
-  <li class="nav-heading">Pages</li>
-
-  <li class="nav-item">
-    <router-link to="/ChuljangList" class="nav-link " active-class="active"><i class="bi bi-journal-text"></i>
-        <span>출장관리</span></router-link>
-  </li><!-- End Profile Page Nav -->
-  <li class="nav-item">
-        <a class="nav-link collapsed" data-bs-target="#components-nav" data-bs-toggle="collapse" href="#">
+      <li class="nav-heading">Pages</li>
+      <li class="nav-item">
+        <a class="nav-link collapsed" data-bs-target="#Chuljang-nav" data-bs-toggle="collapse" href="#">
           <i class="bi bi-journal-text"></i>
-        <span>휴가관리</span><i class="bi bi-chevron-down ms-auto"></i>
+          <span>출장관리</span><i class="bi bi-chevron-down ms-auto"></i>
         </a>
-        <ul id="components-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
+        <ul id="Chuljang-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
           <li>
-            <router-link to="/HyugaInsert" class="nav-link " active-class="active"><i class="bi bi-circle"></i><span>휴가신청</span></router-link>
+            <router-link to="/ChuljangInsert" class="nav-link " active-class="active"><i
+                class="bi bi-circle"></i><span>출장신청</span></router-link>
           </li>
           <li>
-            <router-link to="/HyugaList" class="nav-link " active-class="active"><i class="bi bi-circle"></i><span>휴가내역</span></router-link>
+            <router-link to="/ChuljangList" class="nav-link " active-class="active"><i
+                class="bi bi-circle"></i><span>출장내역</span></router-link>
           </li>
-          
+
         </ul>
       </li>
       <li class="nav-item">
-        <a class="nav-link collapsed" data-bs-target="#components-nav" data-bs-toggle="collapse" href="#">
+        <a class="nav-link collapsed" data-bs-target="#hyuga-nav" data-bs-toggle="collapse" href="#">
           <i class="bi bi-journal-text"></i>
-        <span>프로젝트관리</span><i class="bi bi-chevron-down ms-auto"></i>
+          <span>휴가관리</span><i class="bi bi-chevron-down ms-auto"></i>
         </a>
-        <ul id="components-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
+        <ul id="hyuga-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
           <li>
-            <router-link to="/ProjectInsert" class="nav-link " active-class="active"><i class="bi bi-circle"></i><span>프로젝트 등록</span></router-link>
+            <router-link to="/HyugaInsert" class="nav-link " active-class="active"><i
+                class="bi bi-circle"></i><span>휴가신청</span></router-link>
           </li>
-          
+          <li>
+            <router-link to="/HyugaList" class="nav-link " active-class="active"><i
+                class="bi bi-circle"></i><span>휴가내역</span></router-link>
+          </li>
+
+        </ul>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link collapsed" data-bs-target="#project-nav" data-bs-toggle="collapse" href="#">
+          <i class="bi bi-journal-text"></i>
+          <span>프로젝트관리</span><i class="bi bi-chevron-down ms-auto"></i>
+        </a>
+        <ul id="project-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
+          <li>
+            <router-link to="/ProjectInsert" class="nav-link " active-class="active"><i
+                class="bi bi-circle"></i><span>프로젝트 등록</span></router-link>
+          </li>
+
           <li>
             <router-link to="/ProjectList" class="nav-link " active-class="active"><i class="bi bi-journal-text"></i>
               <span>프로젝트 내역</span></router-link>
           </li>
-         
+
         </ul>
       </li>
 
-  <li class="nav-item">
-    <router-link to="/NoticeList" class="nav-link " active-class="active"><i class="bi bi-journal-text"></i>
-        <span>공지사항</span></router-link>
-  </li><!-- End Register Page Nav -->
+      <li class="nav-item">
+        <router-link to="/NoticeList" class="nav-link " active-class="active"><i class="bi bi-journal-text"></i>
+          <span>공지사항</span></router-link>
+      </li><!-- End Register Page Nav -->
 
-  <li class="nav-item">
-    <router-link to="/EmployeeList" class="nav-link " active-class="active"><i class="bi bi-person"></i>
-        <span>직원관리</span></router-link>
-  </li><!-- End Login Page Nav -->
+      <li class="nav-item">
+        <router-link to="/EmployeeList" class="nav-link " active-class="active"><i class="bi bi-person"></i>
+          <span>직원관리</span></router-link>
+      </li><!-- End Login Page Nav -->
 
-  <li class="nav-item">
-    <router-link to="/DeptList" class="nav-link " active-class="active"><i class="bi bi-person"></i>
-        <span>부서관리</span></router-link>
-  </li><!-- End Error 404 Page Nav -->
+      <li class="nav-item">
+        <router-link to="/DeptList" class="nav-link " active-class="active"><i class="bi bi-person"></i>
+          <span>부서관리</span></router-link>
+      </li><!-- End Error 404 Page Nav -->
 
-  <li class="nav-item">
-    <router-link to="/PubHoliyday" class="nav-link " active-class="active"><i class="bi bi-gem"></i>
-        <span>공휴일관리</span></router-link>
-  </li><!-- End Blank Page Nav -->
+      <li class="nav-item">
+        <router-link to="/PubHoliyday" class="nav-link " active-class="active"><i class="bi bi-gem"></i>
+          <span>공휴일관리</span></router-link>
+      </li><!-- End Blank Page Nav -->
 
-</ul>
+    </ul>
 
-</aside><!-- End Sidebar-->
-  </template>
-  
-  <script >
-  
-  </script>
-  
-  <style>
-  
-  </style>
(파일 끝에 줄바꿈 문자 없음)
+  </aside><!-- End Sidebar-->
+</template>
+
+<script>
+
+</script>
+
+<style></style>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -11,6 +11,7 @@
 
 // 직원
 import ChuljangList from '../pages/Employee/ChuljangList.vue';
+import ChuljangInsert from '../pages/Employee/ChuljangInsert.vue';
 import HyugaList from '../pages/Employee/HyugaList.vue';
 import HyugaInsert from '../pages/Employee/HyugaInsert.vue';
 import ProjectList from '../pages/Employee/ProjectList.vue';
@@ -28,6 +29,7 @@
     { path: '/Join', name: 'Join', component: Join},
     
     { path: '/ChuljangList', name: 'ChuljangList', component: ChuljangList },
+    { path: '/ChuljangInsert', name: 'ChuljangInsert', component: ChuljangInsert },
     { path: '/HyugaList', name: 'HyugaList', component: HyugaList },
     { path: '/HyugaInsert', name: 'HyugaInsert', component: HyugaInsert },
     { path: '/ProjectInsert', name: 'ProjectInsert', component: ProjectInsert },
 
client/views/pages/Employee/ChuljangInsert.vue (added)
+++ client/views/pages/Employee/ChuljangInsert.vue
@@ -0,0 +1,178 @@
+<template>
+  <div class="pagetitle">
+    <h1>출장신청</h1>
+  </div><!-- End Page Title -->
+
+  <section class="section">
+    <div class="card">
+      <div class="card-body">
+
+        <!-- Multi Columns Form -->
+        <form class="row g-3  pt-3" @submit.prevent="handleSubmit">
+
+
+          <div class="col-md-5">
+            <label for="startDate" class="form-label">시작일</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-md-5">
+            <label for="endDate" class="form-label">종료일</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="prvonsh" class="form-label">출장지</label>
+            <input type="text" class="form-control" id="prvonsh" v-model="reason" />
+          </div>
+          <div class="col-12">
+            <label for="prvonsh" class="form-label">출장목적</label>
+            <input type="text" class="form-control" id="prvonsh" v-model="reason" />
+          </div>
+          <div class="col-6">
+            <label for="prvonsh" class="form-label">동행자</label>
+            <div class="search-bar d-flex gap-2">
+              <form class="search-form d-flex  align-items-center" method="POST" action="#"
+                @submit.prevent="updateMember">
+                <input type="text" v-model="searchQuery" name="query" placeholder="Search" title="Enter search keyword">
+                <button type="submit" title="Search"><i class="bi bi-search"></i></button>
+              </form>
+              <input type="text" class="select-member" :value="selectedMember.join(' ')" readonly>
+            </div>
+          </div>
+
+          <div class="text-end">
+            <button type="submit" class="btn btn-primary">승인요청</button>
+            <button type="reset" class="btn btn-secondary">취소</button>
+          </div>
+        </form><!-- End Multi Columns Form -->
+
+      </div>
+    </div>
+  </section>
+</template>
+
+<script>
+import { useAuthStore } from '../../stores/authStore';
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      searchQuery: '',
+      selectedMember: [],
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      allDay: false, // 종일 여부
+      dayCount: 1, // 사용 휴가일 계산
+      reason: "", // 사유
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    updateMember() {
+        // Add the search query to the selectedMembers array if it's not empty
+        if (this.searchQuery.trim()) {
+          this.selectedMember.push(this.searchQuery.trim());
+        }
+        // Clear the search query after adding it to selectedMembers
+        this.searchQuery = '';
+      },
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        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) {
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+  },
+  watch: {
+    startDate: 'calculateDayCount',
+    startTime: 'calculateDayCount',
+    endDate: 'calculateDayCount',
+    endTime: 'calculateDayCount',
+    reason: "validateForm",
+  },
+};
+</script>
client/views/pages/Employee/ChuljangList.vue
--- client/views/pages/Employee/ChuljangList.vue
+++ client/views/pages/Employee/ChuljangList.vue
@@ -52,6 +52,8 @@
                   <th data-type="date" data-format="YYYY/DD/MM">시작일자</th>
                   <th data-type="date" data-format="YYYY/DD/MM">종료일자</th>
                   <th>출장지</th>
+                  <th>출장목적</th>
+                  <th>동행자</th>
                 </tr>
               </thead>
               <!-- 동적으로 <td> 생성 -->
@@ -66,6 +68,10 @@
   <td><input type="date" v-model="item.startDate" /></td>
   <td><input type="date" v-model="item.endDate" /></td>
   <td><input type="text" v-model="item.where" /></td>
+  <td><input type="text" v-model="item.purpose" /></td>
+  <td ><input type="text" v-model="item.member" />
+    
+  </td>
 </tr>
               </tbody>
             </table>
@@ -89,7 +95,7 @@
       selectedYear: '',
       selectedMonth: '',
       ChuljangData: [
-      { startDate: '', endDate: '', where: '대구', acceptTerms: false },
+      { startDate: '', endDate: '', where: '대구', purpose: '',  acceptTerms: false },
       { startDate: '', endDate: '', where: '경산', acceptTerms: false },
         // 더 많은 데이터 추가...
       ],
client/views/pages/Employee/HyugaInsert.vue
--- client/views/pages/Employee/HyugaInsert.vue
+++ client/views/pages/Employee/HyugaInsert.vue
@@ -6,10 +6,9 @@
   <section class="section">
     <div class="card">
       <div class="card-body">
-        <h5 class="card-title"></h5>
 
         <!-- Multi Columns Form -->
-        <form class="row g-3" @submit.prevent="handleSubmit">
+        <form class="row g-3  pt-3" @submit.prevent="handleSubmit">
           <div class="col-md-9">
             <label for="inputName5" class="form-label">구분</label>
             <select id="inputState" class="form-select">
@@ -72,7 +71,7 @@
             <input type="text" class="form-control" id="prvonsh" v-model="reason" />
           </div>
 
-          <div class="text-center">
+          <div class="text-end">
             <button type="submit" class="btn btn-primary">승인요청</button>
             <button type="reset" class="btn btn-secondary">취소</button>
           </div>
client/views/pages/Employee/HyugaList.vue
--- client/views/pages/Employee/HyugaList.vue
+++ client/views/pages/Employee/HyugaList.vue
@@ -8,25 +8,26 @@
       <!-- 해당년도 연차 수 -->
       <!-- 전체 -->
       <div class="col-xxl-2 col-md-3">
-        <button type="button" class="btn btn-light mb-2">
-          전체 <span class="badge bg-secondary text-light">12개</span>
-        </button>
+        <button type="button" class="btn btn-secondary mb-2">
+          전체 <span class="badge bg-white text-secondary">12개</span>
+              </button>
+        
       </div>
       <!-- End 전체 -->
 
       <!-- 사용 -->
       <div class="col-xxl-2 col-md-3">
-        <button type="button" class="btn btn-light mb-2">
-          사용 <span class="badge bg-secondary text-light">1개</span>
-        </button>
+        <button type="button" class="btn btn-success mb-2">
+          사용 <span class="badge bg-white text-success">1개</span>
+              </button>
       </div>
       <!-- End 사용 -->
 
       <!-- 미사용 -->
       <div class="col-xxl-2 col-xl-3">
-        <button type="button" class="btn btn-light mb-2">
-          미사용 <span class="badge bg-secondary text-light">1개</span>
-        </button>
+        <button type="button" class="btn btn-warning mb-2">
+          미사용 <span class="badge bg-white text-warning">1개</span>
+              </button>
       </div>
       <!-- End 미사용 -->
 
 
client/views/pages/Employee/ProjectInsert.vue (added)
+++ client/views/pages/Employee/ProjectInsert.vue
@@ -0,0 +1,158 @@
+<template>
+  <div class="pagetitle">
+    <h1>프로젝트 등록</h1>
+  </div><!-- End Page Title -->
+
+  <section class="section">
+    <div class="card">
+      <div class="card-body">
+
+        <!-- Multi Columns Form -->
+        <form class="row g-3 pt-3" @submit.prevent="handleSubmit">
+          <div class="col-md-9">
+            <label for="projectNm" class="form-label">프로젝트명</label>
+            <input type="text" class="form-control" id="projectNm" v-model="projectNm" />
+          </div>
+          <div class="col-md-5">
+            <label for="orgNm" class="form-label">주관사</label>
+            <input type="text" class="form-control" id="orgNm" v-model="orgNm" />
+          </div>
+          <div class="col-md-5">
+            <label for="inputName5" class="form-label">부서</label>
+            <select id="inputState" class="form-select">
+              <option selected></option>
+              <option></option>
+              <option></option>
+              <option></option>
+              <option></option>
+              <option></option>
+            </select>
+          </div>
+          <div class="col-md-9">
+            <label for="rm" class="form-label">사업금액</label>
+            <input type="text" class="form-control" id="rm" v-model="rm" />
+          </div>
+          <div class="col-md-5">
+            <label for="startDate" class="form-label">사업기간</label>
+            <div class="d-flex gap-1">
+              <input type="date" class="form-control" id="BstartDate" v-model="BstartDate" />~
+              <input type="date" class="form-control" id="BendDate" v-model="BendDate" />
+            </div>
+          </div>
+          <div class="col-6">
+            <label for="prvonsh" class="form-label">사업 투입인력</label>
+            <div class="search-bar d-flex gap-2">
+              <form class="search-form d-flex  align-items-center" method="POST" action="#"
+                @submit.prevent="updateMember">
+                <input type="text" v-model="searchQuery" name="query" placeholder="Search" title="Enter search keyword">
+                <button type="submit" title="Search"><i class="bi bi-search"></i></button>
+              </form>
+              <input type="text" class="select-member" :value="selectedMember.join(' ')" readonly>
+            </div>
+          </div>
+          <div class="col-md-5">
+            <label for="endDate" class="form-label">실제 투입기간</label>
+            <div class="d-flex gap-1">
+              <input type="date" class="form-control" id="MystartDate" v-model="MystartDate" />~
+              <input type="date" class="form-control" id="MyendDate" v-model="MyendDate" />
+              
+            </div>
+          </div>
+          <div class="col-6">
+            <label for="prvonsh" class="form-label">실제 투입인력</label>
+            <div class="search-bar d-flex gap-2">
+              <form class="search-form d-flex  align-items-center" method="POST" action="#"
+                @submit.prevent="updateMember">
+                <input type="text" v-model="searchQuery" name="query" placeholder="Search" title="Enter search keyword">
+                <button type="submit" title="Search"><i class="bi bi-search"></i></button>
+              </form>
+              <input type="text" class="select-member" :value="selectedMember.join(' ')" readonly>
+            </div>
+          </div>
+          <div class="col-md-4">
+            <label for="totalDays" class="form-label">총 투입일<span class="small"></span></label>
+            <input type="text" class="form-control" id="totalDays" v-model="totalDays" readonly />
+          </div>
+          
+          <div class="col-12">
+            <label for="rm" class="form-label">비고</label>
+            <input type="text" class="form-control" id="rm" v-model="rm" />
+          </div>
+
+          <div class="text-end">
+            <button type="submit" class="btn btn-primary">등록</button>
+            <button type="reset" class="btn btn-secondary">취소</button>
+          </div>
+        </form><!-- End Multi Columns Form -->
+
+      </div>
+    </div>
+  </section>
+</template>
+
+<script>
+import { useAuthStore } from '../../stores/authStore';
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      searchQuery: '',
+      selectedMember: [],
+      BstartDate: today,
+      MystartDate: today,
+      totalDays: 0, // 사용 휴가일 계산
+      reason: "", // 사유
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    updateMember() {
+        // Add the search query to the selectedMembers array if it's not empty
+        if (this.searchQuery.trim()) {
+          this.selectedMember.push(this.searchQuery.trim());
+        }
+        // Clear the search query after adding it to selectedMembers
+        this.searchQuery = '';
+      },
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.BstartDate &&
+        this.BendDate &&
+        this.MystartDate &&
+        this.MyendDate &&
+        this.totalDays > 0 
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+  },
+  watch: {
+    BstartDate: 'calculateDayCount',
+    BendDate: 'calculateDayCount',
+    MystartDate: 'calculateDayCount',
+    MyendDate: 'calculateDayCount',
+    rm: "validateForm",
+  },
+  
+};
+</script>
client/views/pages/Employee/ProjectList.vue
--- client/views/pages/Employee/ProjectList.vue
+++ client/views/pages/Employee/ProjectList.vue
@@ -1,14 +1,182 @@
 <template>
-    <div class="services">
-      <h1>Our Services</h1>
-      <p>We provide web development and design services.</p>
-    </div>
-  </template>
-  
-  <script>
-  </script>
-  
-  <style scoped>
+  <div class="pagetitle">
+    <h1>프로젝트 내역</h1>
+  </div>
+  <!-- End Page Title -->
+  <section class="section">
+    <div class="row">
+      <!-- 해당년도 연차 수 -->
+      <!-- 전체 -->
+      <div class="col-xxl-2 col-md-3">
+        <button type="button" class="btn btn-light mb-2">
+          전체 <span class="badge bg-secondary text-light">{{ filteredData.length }}개</span>
+        </button>
+      </div>
+      <!-- End 전체 -->
 
-  </style>
-  
(파일 끝에 줄바꿈 문자 없음)
+      <!-- 사용 -->
+      <div class="col-xxl-2 col-md-3">
+        <button type="button" class="btn btn-light mb-2">
+          사용 <span class="badge bg-secondary text-light">{{ filteredData.filter(item => item.acceptTerms).length }}개</span>
+        </button>
+      </div>
+      <!-- End 사용 -->
+
+      <!-- 미사용 -->
+      <div class="col-xxl-2 col-xl-3">
+        <button type="button" class="btn btn-light mb-2">
+          미사용 <span class="badge bg-secondary text-light">{{ filteredData.filter(item => !item.acceptTerms).length }}개</span>
+        </button>
+      </div>
+      <!-- End 미사용 -->
+
+      <div class="col-lg-12">
+        <div class="card">
+          <div class="card-body">
+            <h5 class="card-title">프로젝트 내역</h5>
+            <div class="d-flex pb-3 justify-content-between">
+
+              <div class="datatable-search d-flex gap-1 ">
+                <div class="col-xxl-5 col-md-4">
+                  <select class="form-select" v-model="selectedYear">
+                    <option value="">전체</option>
+                    <option v-for="year in years" :key="year" :value="year">{{ year }}</option>
+                  </select>
+                </div>
+                <div class="col-xxl-5 col-md-4">
+                  <select class="form-select" v-model="selectedMonth">
+                    <option value="">월</option>
+                    <option v-for="month in months" :key="month" :value="month">{{ month }}</option>
+                  </select>
+                </div>
+                <button type="button" class="btn btn-outline-secondary col-xxl-5 col-xl-4"
+                  @click="filterData">조회</button>
+
+              </div>
+              <div class="d-flex justify-content-end ">
+                <button type="button" class="btn btn-outline-success">
+                  수정
+                </button>
+                <button type="button" class="btn btn-outline-danger" @click="deletePending">
+                  삭제
+                </button>
+              </div>
+
+            </div>
+            <!-- Table  -->
+            <table id="myTable" class="table datatable table-hover table-bordered">
+              <!-- 동적으로 <th> 생성 -->
+              <thead>
+                <tr>
+                  <th rowspan="2">No</th>
+                  <th rowspan="2">프로젝트명</th>
+                  <th rowspan="2">주관</th>
+                  <th colspan="4" class="text-center">기간</th>
+                  <th rowspan="2">총 투입일</th>
+                  <th rowspan="2">비고</th>
+                </tr>
+                <tr>
+                  <th data-type="date" data-format="YYYY/DD/MM">사업시작</th>
+                  <th data-type="date" data-format="YYYY/DD/MM">사업종료</th>
+                  <th data-type="date" data-format="YYYY/DD/MM">투입시작</th>
+                  <th data-type="date" data-format="YYYY/DD/MM">투입종료</th>
+                </tr>
+              </thead>
+              <!-- 동적으로 <td> 생성 -->
+              <tbody>
+                <tr v-for="(item, index) in filteredData" :key="index">
+                  <td>
+                    <div class="form-check">
+                      <label class="form-check-label" for="acceptTerms">{{ index + 1 }}</label>
+                      <input v-model="item.acceptTerms" class="form-check-input" type="checkbox" />
+                    </div>
+                  </td>
+                  <td>{{ item.projectNm }}</td>
+                  <td>{{ item.orgNm }}</td>
+                  <td>{{ item.BstartDate }}</td>
+                  <td>{{ item.BendDate }}</td>
+                  <td>{{ item.MystartDate }}</td>
+                  <td>{{ item.MyendDate }}</td>
+                  <td>{{ item.totalDays }}</td>
+                  <td>{{ item.rm }}</td>
+                </tr>
+              </tbody>
+            </table>
+            <!-- End Table -->
+          </div>
+        </div>
+      </div>
+    </div>
+  </section>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      years: [2023, 2024, 2025],
+      months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
+      selectedYear: '',
+      selectedMonth: '',
+      ProjectData: [
+        { projectNm: '프로젝트명', orgNm: '기관명', BstartDate: '2025-01-03', BendDate: '2025-01-01', MystartDate: '2025-01-03', MyendDate: '2025-01-05', totalDays: 0, rm: '비고', acceptTerms: false },
+        { projectNm: '프로젝트명', orgNm: '기관명', BstartDate: '2024-01-03', BendDate: '2024-01-01', MystartDate: '2024-01-03', MyendDate: '2024-01-07', totalDays: 0, rm: '비고', acceptTerms: false },
+        // 다른 항목들 추가
+      ],
+      filteredData: [],
+    };
+  },
+  methods: {
+    deletePending() {
+      const selectedItems = this.ProjectData.filter(item => item.acceptTerms);
+      const nonDeletableItems = selectedItems.filter(item => item.approvalStatus === true);
+      if (nonDeletableItems.length > 0) {
+        alert("승인된 건은 삭제할 수 없습니다.");
+        return;
+      }
+      if (selectedItems.length > 0) {
+        this.ProjectData = this.ProjectData.filter(item => !item.acceptTerms);
+        alert(`${selectedItems.length}개의 항목이 삭제되었습니다.`);
+      } else {
+        alert("선택된 항목이 없습니다.");
+      }
+    },
+    filterData() {
+      if (!this.selectedYear && !this.selectedMonth) {
+        this.filteredData = this.ProjectData;
+      } else {
+        this.filteredData = this.ProjectData.filter(item => {
+          const itemYear = new Date(item.BstartDate).getFullYear();
+          const itemMonth = new Date(item.BstartDate).getMonth() + 1;
+
+          return (
+            (!this.selectedYear || itemYear === parseInt(this.selectedYear)) &&
+            (!this.selectedMonth || itemMonth === parseInt(this.selectedMonth))
+          );
+        });
+      }
+      this.updateTotalDays();
+    },
+    updateTotalDays() {
+      // filteredData에서 각 항목의 totalDays 계산
+      this.filteredData.forEach(item => {
+        const mystartDate = new Date(item.MystartDate);
+        const myendDate = new Date(item.MyendDate);
+        
+        // 날짜 차이 계산 (밀리초 단위로 계산 후, 일수로 변환)
+        const timeDiff = myendDate - mystartDate;
+        const daysDiff = timeDiff / (1000 * 60 * 60 * 24);
+        item.totalDays = daysDiff >= 0 ? daysDiff : 0;
+      });
+    },
+  },
+  mounted() {
+    const currentYear = new Date().getFullYear();
+    this.selectedYear = currentYear;
+    this.filteredData = this.ProjectData.filter(item => new Date(item.BstartDate).getFullYear() === currentYear);
+    this.updateTotalDays();
+  },
+};
+</script>
+
+<style scoped></style>
client/views/pages/Manager/NoticeList.vue
--- client/views/pages/Manager/NoticeList.vue
+++ client/views/pages/Manager/NoticeList.vue
@@ -1,20 +1,20 @@
 <template>
-    <div class="about">
-      <h1>About Us</h1>
-      <p>Learn more about our company and mission.</p>
-    </div>
+    <div class="pagetitle">
+    <h1>공지사항 등록</h1>
+  </div>
+  <section class="section">
+    <div class="row">ㅇㅇ</div>
+    </section>
+   
   </template>
   
   <script>
   export default {
-    name: 'AboutPage',
+    components: {
+  },
   }
   </script>
   
   <style scoped>
-  .about {
-    text-align: center;
-    margin-top: 50px;
-  }
   </style>
   
(파일 끝에 줄바꿈 문자 없음)
webpack.config.js
--- webpack.config.js
+++ webpack.config.js
@@ -1,3 +1,4 @@
+const path = require('path');
 const { VueLoaderPlugin } = require("vue-loader");
 
 const {PROJECT_NAME, BASE_DIR, SERVICE_STATUS} = require('./Global');
@@ -39,4 +40,9 @@
     path: `${BASE_DIR}/client/build`,	// __dirname: webpack.config.js 파일이 위치한 경로
     filename: 'bundle.js'
   },
+  resolve: {
+    alias: {
+      'realgrid': path.resolve(__dirname, 'node_modules/realgrid/dist/realgrid.js'),
+    },
+  },
 }
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List