jichoi / calendar star
박정하 박정하 6 days ago
250805 박정하 사용자 목록 선택 모달 수정
@70e4e28e323645e5c942715b1aa3405a180b80c7
client/views/component/Popup/HrPopup.vue
--- client/views/component/Popup/HrPopup.vue
+++ client/views/component/Popup/HrPopup.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="popup-overlay" @click.self="$emit('close')">
+  <div class="popup-overlay" @click.self="handleClose">
     <div class="popup-content">
       <div class="card">
         <div class="card-body">
@@ -7,9 +7,8 @@
           <div class="sch-form-wrap">
             <div class="input-group">
               <div class="sch-input">
-                <input type="text" class="form-control" placeholder="직원명" v-model="request.searchText"
-                  @keyup.enter="findDatas">
-                <button type="button" class="ico-sch" @click="findDatas">
+                <input type="text" class="form-control" placeholder="직원명" v-model="searchParams.searchText" @keyup.enter="handleSearch">
+                <button type="button" class="ico-sch" @click="handleSearch">
                   <SearchOutlined />
                 </button>
               </div>
@@ -27,23 +26,22 @@
                 </tr>
               </thead>
               <tbody>
-                <tr v-for="(item, idx) in users" :key="idx">
-                  <td>{{ item.clsfNm }}</td>
-                  <td>{{ item.rspofcNm }}</td>
-                  <td>{{ item.deptNm }}</td>
-                  <td>{{ item.userNm }}</td>
+                <tr v-for="(employee, index) in employeeList" :key="index">
+                  <td>{{ employee.clsfNm }}</td>
+                  <td>{{ employee.rspofcNm }}</td>
+                  <td>{{ employee.deptNm }}</td>
+                  <td>{{ employee.userNm }}</td>
                   <td>
-                    <button type="button" class="btn sm sm secondary" @click="selectPerson(item)"
-                      :disabled="isUserSelected(item.userId)">선택</button>
+                    <button type="button" class="btn sm secondary" @click="handleSelectEmployee(employee)" :disabled="isEmployeeDisabled(employee.userId)"> 선택 </button>
                   </td>
                 </tr>
               </tbody>
             </table>
           </div>
-          <Pagination :search="request" @onChange="fnChangeCurrentPage" />
+          <Pagination :search="searchParams" @onChange="handlePageChange" />
         </div>
       </div>
-      <button @click="$emit('close')" class="close-btn">
+      <button @click="handleClose" class="close-btn">
         <CloseCircleFilled />
       </button>
     </div>
@@ -56,81 +54,95 @@
 import { findUsersProc } from '../../../resources/api/user';
 
 export default {
+  name: 'EmployeeSelectionModal',
+
   components: {
-    SearchOutlined, CloseCircleFilled,
+    SearchOutlined,
+    CloseCircleFilled,
     Pagination
   },
 
   props: {
-    lists: {
+    // 이미 선택된 사용자 목록
+    selectedEmployees: {
       type: Array,
       default: () => [],
+    },
+
+    // 사용자 목록 내 유저아이디 key(혹은 column) 값
+    idField: {
+      type: String,
+      default: 'userId'
     }
   },
 
+  emits: ['close', 'select'],
+
   data() {
     return {
-      users: [],
+      employeeList: [],
 
-      request: {
-        searchType: 'nm', // 검색조건 사용자 이름 고정
+      searchParams: {
+        searchType: 'nm', // 검색조건 (사용자 이름으로 고정)
         searchText: null, // 검색어
-        searchSttus: 1, // 회원상태 승인 고정
-        searchUseAt: 'Y', // 사용여부 사용 고정
+        searchSttus: 1,   // 회원상태 (승인 고정)
+        searchUseAt: 'Y', // 사용여부 (사용으로 고정)
       },
     }
   },
 
   computed: {
-    selectedUserIds() {
-      return new Set(this.lists.map(member => member.userId)); // userId로 변경
+    selectedEmployeeIds() {
+      return new Set(this.selectedEmployees.map(member => member[this.idField]));
     }
   },
 
-  watch: {},
-
-  created() { },
-
   mounted() {
-    this.findDatas(); // 목록 조회
-
+    this.fetchEmployeeList();
   },
 
   methods: {
-    // 목록 조회
-    async findDatas() {
+    // 직원 목록 조회
+    async fetchEmployeeList() {
       try {
-        const response = await findUsersProc(this.request);
+        const response = await findUsersProc(this.searchParams);
         const result = response.data.data;
 
-        this.users = result.users;
-        this.request = result.search;
+        this.employeeList = result.users;
+        this.searchParams = result.search;
       } catch (error) {
-        if (error.response) {
-          alert(error.response.data.message);
-        } else {
-          alert("에러가 발생했습니다.");
-        }
-        console.error(error.message);
+        const message = error.response.data.message;
+        alert(message);
+        console.error(error);
       }
     },
 
-    // 사용자 검증
-    isUserSelected(userId) {
-      return this.selectedUserIds.has(userId);
+    // 검색 처리
+    async handleSearch() {
+      await this.fetchEmployeeList();
     },
 
-    // 승인자 선택
-    selectPerson(item) {
-      this.$emit('onSelected', item);
+    // 직원 선택 불가 여부 확인
+    isEmployeeDisabled(userId) {
+      return this.selectedEmployeeIds.has(userId) || this.$store.state.userInfo.userId === userId;
+    },
+
+    // 직원 선택
+    handleSelectEmployee(employee) {
+      this.$emit('select', employee);
+      this.handleClose();
+    },
+
+    // 모달 닫기
+    handleClose() {
       this.$emit('close');
     },
 
-    // 페이지 이동
-    fnChangeCurrentPage(currentPage) {
-      this.request.currentPage = Number(currentPage);
+    // 페이지 변경
+    handlePageChange(currentPage) {
+      this.searchParams.currentPage = Number(currentPage);
       this.$nextTick(() => {
-        this.findDatas();
+        this.fetchEmployeeList();
       });
     },
   }
Add a comment
List