하관우 하관우 02-10
2025-02-10 하관우 데이터셋 분리
@26c605bb8876ccc2af44c0d8b95e8adf9772a72e
client/views/component/connection/jobContainer.vue
--- client/views/component/connection/jobContainer.vue
+++ client/views/component/connection/jobContainer.vue
@@ -24,7 +24,7 @@
                       <p>{{ indx + 1 + ". " + itm.type }}</p>
                       <div>
                         <button class="blue-border-btn set-btn" @click="showPopup(indx)">설정</button>
-                        <button class="red-border-btn set-btn" @click="deleteConnect(indx)">삭제</button>
+                        <button v-if="!dataEdit" class="red-border-btn set-btn" @click="deleteConnect(indx)">삭제</button>
                       </div>
                       <FileSelect :openPopup="popupToggls[indx]" :jobItem="itm" :mode="itm.type" @closePopup="closePopup(indx)" v-if="itm.type == 'fileRead' || itm.type == 'fileWrite'" />
                       <DatabaseConnection :openPopup="popupToggls[indx]" :jobItem="itm" @closePopup="closePopup(indx)" v-if="itm.type == 'dbConnection'" />
@@ -229,6 +229,8 @@
     },
 
     execModel: function () {
+      console.log("보내는 데이터 ", this.crrentJobGroup);
+      
       let vm = this;
       axios({
         url: "/job/executeJob.json",
client/views/pages/data/DataPostManagement.vue
--- client/views/pages/data/DataPostManagement.vue
+++ client/views/pages/data/DataPostManagement.vue
@@ -5,215 +5,24 @@
       <PageNavigation />
     </div>
     <div class="content-wrap">
-      <div class="content-box flex justify-between">
-        <div class="flex20 content-box">
-          <div class="left-content flex100 content-box">
-            <div class="content-box">
-              <div class="content-titleZone">
-                <p class="box-title">카테고리 리스트</p>
-              </div>
-              <div class="content-zone">
-                <CodeList :groupCode="'DATA_CTGRY'" @selectCode="selectCode" />
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="flex80 content-box">
-          <div class="right-content flex100">
-            <div class="flex-column justify-between">
-              <div class="flex justify-end">
-                <div class="search-bar">
-                  <div class="flex justify-end align-center" style="gap: 5px">
-                    <input type="date" name="start-date" id="start-date" class="square-date" :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value" />
-                    <span>~</span>
-                    <input type="date" name="end-date" id="end-date" class="square-date" :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value2" />
-                    <select class="square-select" v-model="search_data1.value">
-                      <option :value="null">공개여부</option>
-                      <option :value="true">공개</option>
-                      <option :value="false">비공개</option>
-                    </select>
-                    <select class="square-select" v-model="search_data2.value">
-                      <option :value="null">카테고리</option>
-                      <option v-for="(item, indx) in categoryList" :key="indx" :value="item.cmmnCode">{{ item.codeNm }}</option>
-                    </select>
-                    <select name="" id="searchItm1" class="square-select" v-model="search_data3.key">
-                      <option :value="null">검색조건</option>
-                      <option value="post_sj">제목</option>
-                      <option value="post_dc">내용</option>
-                    </select>
-                    <div class="flex justify-end align-center no-gutter">
-                      <input type="text" class="square-input flex90" placeholder="Search" v-model="search_data3.value" v-on:keyup.enter="searchData()" />
-                      <button class="square-button blue-btn flex10" @click="searchData()">
-                        <svg-icon type="mdi" :path="this.$getIconPath()" class="square-icon"></svg-icon>
-                      </button>
-                    </div>
-                  </div>
-                </div>
-              </div>
-              <div class="content-zone" style="overflow: auto;">
-                <div class="table-zone">
-                  <div class="list-info flex justify-between align-center">
-                    <div class="count-zone">
-                      <p>총<span>{{ search.totalRows }}</span>건</p>
-                    </div>
-                    <div class="cunt-selectZone">
-                      <select name="" id="">
-                        <option value="">10개 보기</option>
-                        <option value="">20개 보기</option>
-                      </select>
-                    </div>
-                  </div>
-                  <table class="list-table">
-                    <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
-                    <colgroup>
-                      <col style="width: 10%" />
-                      <col style="width: 40%" />
-                      <col style="width: 10%" />
-                      <col style="width: 10%" />
-                      <col style="width: 10%" />
-                      <col style="width: 30%" />
-                    </colgroup>
-                    <thead>
-                      <tr>
-                        <th>No</th>
-                        <th>제목</th>
-                        <th>생성자</th>
-                        <th>부서</th>
-                        <th>카테고리</th>
-                        <th>등록일시</th>
-                      </tr>
-                    </thead>
-                    <tbody>
-                      <template v-if="dataPostList.length > 0">
-                        <tr v-for="(item, indx) in dataPostList" :key="indx" @click="selectPost(item)">
-                          <td>{{ search.totalRows - indx - (search.currentPage - 1) * search.perPage }}</td>
-                          <td>{{ item.post_sj }}</td>
-                          <td>{{ item.user_nm }}</td>
-                          <td>{{ item.dept_nm }}</td>
-                          <td>{{ item.ctgry_id }}</td>
-                          <td>{{ $getFullTime(item.creat_dt) }}</td>
-                        </tr>
-                      </template>
-                      <tr v-else>
-                        <td colspan="6">등록된 데이터가 없습니다.</td>
-                      </tr>
-                    </tbody>
-                  </table>
-                  <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows" :maxRange="5" :click="searchData" />
-                </div>
-              </div>
-              <div class="flex justify-end">
-                <button class="blue-btn small-btn" @click="createDataPost">데이터 등록</button>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
+      <DataPostManagerMain/>
     </div>
   </div>
 </template>
 <script>
-import CodeList from "../../component/common/Component_CodeList.vue";
-import axios from "axios";
 import PageNavigation from "../../component/PageNavigation.vue";
-import SvgIcon from "@jamescoyle/vue-icon";
-import PaginationButton from "../../component/PaginationButton.vue";
+import DataPostManagerMain from "./datapost/DataPostManagerMain.vue";
 
 export default {
   data() {
     return {
-      dataPostList: [],
-      search: this.$getDefaultSerchVO(),
-      // 공개여부
-      search_data1: this.$getDefaultSerchItem("public_at", "bool"),
-      // 카테고리
-      search_data2: this.$getDefaultSerchItem("ctgry_id", "string"),
-      // 선택
-      search_data3: this.$getDefaultSerchItem("post_sj", "string"),
-      // 날짜
-      search_date: this.$getDefaultSerchItem("creat_dt", "dates"),
-      categoryList: [],
     };
   },
   methods: {
-    createDataPost: function () {
-      this.$router.push("/insertDataPost.page");
-    },
-
-    selectCode: function (code) {
-      this.search_data2.value = code;
-      this.searchData();
-    },
-
-    selectPost: function (item) {
-      this.$router.push({
-        name: "DataPostDetail",
-        query: { datapost: item.dataset_post_id },
-      });
-    },
-    searchData: function () {
-      const vm = this;
-
-      let check = false;
-      let authList = vm.$store.state.loginUser.user_auth;
-      for (let auth of authList) {
-        if (auth == 'ROLE_ADMIN') {
-          check = true
-          break;
-        }
-      }
-      if (!check) {
-        vm.search.searchObjectList.push({
-          key: "id",
-          key2: "dept_code",
-          type: "string",
-          value: check + "/" + vm.$store.state.loginUser.user_id,
-          value2: vm.$store.state.loginUser.dept_code,
-        })
-      }
-
-      axios({
-        url: "/dataset/selectDataPostList.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
-        },
-        data: JSON.stringify(vm.search),
-      })
-        .then(function (response) {
-          if (response.data.checkMessage.success) {
-            vm.dataPostList = response.data.resultData.dataPostList;
-            vm.search.totalRows = response.data.resultData.totalRow;
-          }
-        })
-        .catch(function (error) {
-          this.$showAlert(
-            "에러 발생",
-            "에러가 발생했습니다. 관리자에게 문의해 주세요."
-          );
-        });
-    },
-    // 초기화
-    init: async function () {
-      this.search.searchObjectList.push(this.search_date);
-      this.search.searchObjectList.push(this.search_data1);
-      this.search.searchObjectList.push(this.search_data2);
-      this.search.searchObjectList.push(this.search_data3);
-      this.categoryList = await this.$getCommonCode("DATA_CTGRY");
-    },
-  },
-  computed: {
-    CodeList,
   },
   components: {
-    CodeList: CodeList,
     PageNavigation: PageNavigation,
-    PaginationButton: PaginationButton,
-    SvgIcon: SvgIcon,
-  },
-  mounted() {
-    this.init();
-    this.searchData();
+    DataPostManagerMain: DataPostManagerMain
   },
 };
 </script>
(파일 끝에 줄바꿈 문자 없음)
 
client/views/pages/data/datapost/DataPostManagerMain.vue (added)
+++ client/views/pages/data/datapost/DataPostManagerMain.vue
@@ -0,0 +1,220 @@
+<template>
+    <div class="content-box flex justify-between">
+        <div class="flex20 content-box">
+            <div class="left-content flex100 content-box">
+                <div class="content-box">
+                    <div class="content-titleZone">
+                        <p class="box-title">카테고리 리스트</p>
+                    </div>
+                    <div class="content-zone">
+                        <CodeList :groupCode="'DATA_CTGRY'" @selectCode="selectCode" />
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="flex80 content-box">
+            <div class="right-content flex100">
+                <div class="flex-column justify-between">
+                    <div class="flex justify-end">
+                        <div class="search-bar">
+                            <div class="flex justify-end align-center" style="gap: 5px">
+                                <input type="date" name="start-date" id="start-date" class="square-date"
+                                    :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택"
+                                    v-model="search_date.value" />
+                                <span>~</span>
+                                <input type="date" name="end-date" id="end-date" class="square-date"
+                                    :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택"
+                                    v-model="search_date.value2" />
+                                <select class="square-select" v-model="search_data1.value">
+                                    <option :value="null">공개여부</option>
+                                    <option :value="true">공개</option>
+                                    <option :value="false">비공개</option>
+                                </select>
+                                <select class="square-select" v-model="search_data2.value">
+                                    <option :value="null">카테고리</option>
+                                    <option v-for="(item, indx) in categoryList" :key="indx" :value="item.cmmnCode">{{
+                                        item.codeNm }}</option>
+                                </select>
+                                <select name="" id="searchItm1" class="square-select" v-model="search_data3.key">
+                                    <option :value="null">검색조건</option>
+                                    <option value="post_sj">제목</option>
+                                    <option value="post_dc">내용</option>
+                                </select>
+                                <div class="flex justify-end align-center no-gutter">
+                                    <input type="text" class="square-input flex90" placeholder="Search"
+                                        v-model="search_data3.value" v-on:keyup.enter="searchData()" />
+                                    <button class="square-button blue-btn flex10" @click="searchData()">
+                                        <svg-icon type="mdi" :path="this.$getIconPath()" class="square-icon"></svg-icon>
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="content-zone" style="overflow: auto;">
+                        <div class="table-zone">
+                            <div class="list-info flex justify-between align-center">
+                                <div class="count-zone">
+                                    <p>총<span>{{ search.totalRows }}</span>건</p>
+                                </div>
+                                <div class="cunt-selectZone">
+                                    <select name="" id="">
+                                        <option value="">10개 보기</option>
+                                        <option value="">20개 보기</option>
+                                    </select>
+                                </div>
+                            </div>
+                            <table class="list-table">
+                                <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 -->
+                                <colgroup>
+                                    <col style="width: 10%" />
+                                    <col style="width: 40%" />
+                                    <col style="width: 10%" />
+                                    <col style="width: 10%" />
+                                    <col style="width: 10%" />
+                                    <col style="width: 30%" />
+                                </colgroup>
+                                <thead>
+                                    <tr>
+                                        <th>No</th>
+                                        <th>제목</th>
+                                        <th>생성자</th>
+                                        <th>부서</th>
+                                        <th>카테고리</th>
+                                        <th>등록일시</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <template v-if="dataPostList.length > 0">
+                                        <tr v-for="(item, indx) in dataPostList" :key="indx" @click="selectPost(item)">
+                                            <td>{{ search.totalRows - indx - (search.currentPage - 1) * search.perPage
+                                                }}</td>
+                                            <td>{{ item.post_sj }}</td>
+                                            <td>{{ item.user_nm }}</td>
+                                            <td>{{ item.dept_nm }}</td>
+                                            <td>{{ item.ctgry_id }}</td>
+                                            <td>{{ $getFullTime(item.creat_dt) }}</td>
+                                        </tr>
+                                    </template>
+                                    <tr v-else>
+                                        <td colspan="6">등록된 데이터가 없습니다.</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                            <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage"
+                                :totalCount="search.totalRows" :maxRange="5" :click="searchData" />
+                        </div>
+                    </div>
+                    <div class="flex justify-end">
+                        <button class="blue-btn small-btn" @click="createDataPost">데이터 등록</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import CodeList from "../../../component/common/Component_CodeList.vue";
+import axios from "axios";
+import PageNavigation from "../../../component/PageNavigation.vue";
+import SvgIcon from "@jamescoyle/vue-icon";
+import PaginationButton from "../../../component/PaginationButton.vue";
+
+export default {
+  data() {
+    return {
+      dataPostList: [],
+      search: this.$getDefaultSerchVO(),
+      // 공개여부
+      search_data1: this.$getDefaultSerchItem("public_at", "bool"),
+      // 카테고리
+      search_data2: this.$getDefaultSerchItem("ctgry_id", "string"),
+      // 선택
+      search_data3: this.$getDefaultSerchItem("post_sj", "string"),
+      // 날짜
+      search_date: this.$getDefaultSerchItem("creat_dt", "dates"),
+      categoryList: [],
+    };
+  },
+  methods: {
+    createDataPost: function () {
+      this.$router.push("/insertDataPost.page");
+    },
+
+    selectCode: function (code) {
+      this.search_data2.value = code;
+      this.searchData();
+    },
+
+    selectPost: function (item) {
+      this.$router.push({
+        name: "DataPostDetail",
+        query: { datapost: item.dataset_post_id },
+      });
+    },
+    searchData: function () {
+      console.log("@@검색값",this.search);
+      const vm = this;
+
+      let check = false;
+      let authList = vm.$store.state.loginUser.user_auth;
+      for (let auth of authList) {
+        if (auth == 'ROLE_ADMIN') {
+          check = true
+          break;
+        }
+      }
+      if (!check) {
+        vm.search.searchObjectList.push({
+          key: "id",
+          key2: "dept_code",
+          type: "string",
+          value: check + "/" + vm.$store.state.loginUser.user_id,
+          value2: vm.$store.state.loginUser.dept_code,
+        })
+      }
+
+      axios({
+        url: "/dataset/selectDataPostList.json",
+        method: "post",
+        headers: {
+          "Content-Type": "application/json; charset=UTF-8",
+        },
+        data: JSON.stringify(vm.search),
+      })
+        .then(function (response) {
+          if (response.data.checkMessage.success) {
+            vm.dataPostList = response.data.resultData.dataPostList;
+            vm.search.totalRows = response.data.resultData.totalRow;
+          }
+        })
+        .catch(function (error) {
+          this.$showAlert(
+            "에러 발생",
+            "에러가 발생했습니다. 관리자에게 문의해 주세요."
+          );
+        });
+    },
+    // 초기화
+    init: async function () {
+      this.search.searchObjectList.push(this.search_date);
+      this.search.searchObjectList.push(this.search_data1);
+      this.search.searchObjectList.push(this.search_data2);
+      this.search.searchObjectList.push(this.search_data3);
+      this.categoryList = await this.$getCommonCode("DATA_CTGRY");
+    },
+  },
+  computed: {
+    CodeList,
+  },
+  components: {
+    CodeList: CodeList,
+    PageNavigation: PageNavigation,
+    PaginationButton: PaginationButton,
+    SvgIcon: SvgIcon,
+  },
+  mounted() {
+    this.init();
+    this.searchData();
+  },
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/integrated/DepartmentManagement.vue
--- client/views/pages/integrated/DepartmentManagement.vue
+++ client/views/pages/integrated/DepartmentManagement.vue
@@ -14,7 +14,8 @@
               </div>
               <div class="content-zone overflow-y">
                 <ul class="tree-wrap" v-if="deptTreeList.length > 0">
-                  <TreeMenu v-for="(item, idx) in deptTreeList" :key="idx" :node="item" :currentDeptCode="selectedDept" @changeCurrent="fnSelectDept" />
+                  <TreeMenu v-for="(item, idx) in deptTreeList" :key="idx" :node="item" :currentDeptCode="selectedDept"
+                    @changeCurrent="fnSelectDept" />
                 </ul>
               </div>
             </div>
@@ -38,8 +39,10 @@
                   <tr>
                     <th>부서코드</th>
                     <td style="display: flex">
-                      <input type="text" class="full-input" v-model="currentDept.dept_code" :disabled="editMode == 'update'" />
-                      <button style="flex-grow: 1" class="small-btn blue-border-btn" v-if="editMode == 'create'" @click="fnDeptCodeDupChk">중복확인</button>
+                      <input type="text" class="full-input" v-model="currentDept.dept_code"
+                        :disabled="editMode == 'update'" />
+                      <button style="flex-grow: 1" class="small-btn blue-border-btn" v-if="editMode == 'create'"
+                        @click="fnDeptCodeDupChk">중복확인</button>
                     </td>
                     <th>부서명</th>
                     <td>
@@ -54,7 +57,8 @@
                     <th>상위부서</th>
                     <td style="display: flex">
                       <input type="text" class="full-input" v-model="currentDept.upper_dept_nm" readonly />
-                      <button style="flex-grow: 1" class="small-btn blue-border-btn" @click="fnOpenModalByDeptList">부서찾기</button>
+                      <button style="flex-grow: 1" class="small-btn blue-border-btn"
+                        @click="fnOpenModalByDeptList">부서찾기</button>
                     </td>
                   </tr>
                 </tbody>
@@ -65,7 +69,8 @@
             <button class="blue-btn small-btn" v-if="editMode == 'create'" @click="fnInsertDept">등록</button>
             <button class="blue-btn small-btn" v-else @click="fnUpdateDept">수정</button>
             <button class="red-border-btn small-btn" v-if="editMode == 'update'" @click="fnDeleteDept">삭제</button>
-            <button class="blue-border-btn small-btn" @click="fnCancelDept"><span v-if="editMode == 'create'">초기화</span><span v-else>취소</span></button>
+            <button class="blue-border-btn small-btn" @click="fnCancelDept"><span
+                v-if="editMode == 'create'">초기화</span><span v-else>취소</span></button>
           </div>
           <!-- 부서 내 사용자 목록 -->
           <DeptUserList :deptCode="selectedDept.id" />
@@ -96,7 +101,8 @@
                 </select>
               </div>
               <div class="flex75 flex align-center no-gutter pr0">
-                <input type="text" class="square-input flex90" placeholder="부서를 검색해주세요" v-model="searchDataByDept.value" @keyup.enter="fnSelectUpperDeptList" />
+                <input type="text" class="square-input flex90" placeholder="부서를 검색해주세요" v-model="searchDataByDept.value"
+                  @keyup.enter="fnSelectUpperDeptList" />
                 <button class="square-button blue-btn flex10" @click="fnSelectUpperDeptList">
                   <svg-icon type="mdi" :path="searchPath" class="square-icon"></svg-icon>
                 </button>
@@ -123,7 +129,8 @@
                 <tr v-for="(item, idx) in selectDeptList" :key="idx" :class="{ red: item.isUsed == false }">
                   <td>{{ item.dept_code }}</td>
                   <td>{{ item.dept_nm }}</td>
-                  <td><button type="button" class="small-btn blue-border-btn" @click="fnSelectedUpperDept(item)">선택</button></td>
+                  <td><button type="button" class="small-btn blue-border-btn"
+                      @click="fnSelectedUpperDept(item)">선택</button></td>
                 </tr>
               </template>
               <tr v-else>
@@ -385,16 +392,23 @@
 
     // 부서 취소
     fnCancelDept() {
-      this.editMode = 'create';
-      this.currentDept = this.deptVO;
-      this.selectedDept = {};
-      this.isDeptCodeDupChk = false; // 부서코드 중복확인 여부
+      if (this.$isEmpty(this.currentDept.dept_code)
+        && this.$isEmpty(this.currentDept.dept_nm)
+        && this.$isEmpty(this.currentDept.dept_dc)
+        && this.$isEmpty(this.currentDept.upper_dept_nm)) {
+          this.$showAlert("부서 정보", "입력한 정보가 없습니다.");
+      } else{
+        this.editMode = 'create';
+        this.currentDept = this.deptVO;
+        this.selectedDept = {};
+        this.isDeptCodeDupChk = false; // 부서코드 중복확인 여부
 
-      // 사용자 목록
-      this.userList = [];
-      this.userSelectList = [];
-      this.searchByUser = Object.assign({}, this.$getDefaultSerchVO());
-      this.searchDataByUser = this.$getDefaultSerchItem(null, "string");
+        // 사용자 목록
+        this.userList = [];
+        this.userSelectList = [];
+        this.searchByUser = Object.assign({}, this.$getDefaultSerchVO());
+        this.searchDataByUser = this.$getDefaultSerchItem(null, "string");
+      };
     },
 
     // 부서 상세 조회
client/views/pages/integrated/department/DeptHostList.vue
--- client/views/pages/integrated/department/DeptHostList.vue
+++ client/views/pages/integrated/department/DeptHostList.vue
@@ -37,12 +37,13 @@
         <template v-if="list.length > 0">
           <tr v-for="(item, idx) of list" :key="idx">
             <td>
-              <input type="checkbox" :value="item" v-model="selectList" @click.stop="" @change="fnChangeChk" />
+              <input type="checkbox" :value="item" v-model="selectList" @change="fnChangeChk" />
             </td>
             <td>{{ search.totalRows - idx - (search.currentPage - 1) * search.perPage }}</td>
             <td>{{ item.hostNm }}</td>
             <td>{{ item.hostIp }}</td>
-            <td><button type="button" class="blue-border-btn small-btn" @click="fnOpenModal('addDrctry', item)">디렉토리관리</button></td>
+            <td><button type="button" class="blue-border-btn small-btn"
+                @click="fnOpenModal('addDrctry', item)">디렉토리관리</button></td>
           </tr>
         </template>
         <tr v-else>
@@ -50,7 +51,8 @@
         </tr>
       </tbody>
     </table>
-    <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows" :maxRange="5" :click="selectDeptHost" />
+    <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows"
+      :maxRange="5" :click="selectDeptHost" />
   </div>
   <div class="flex justify-end">
     <button class="blue-btn small-btn" @click="fnOpenModal('addHost')">호스트추가</button>
@@ -78,7 +80,8 @@
             </select>
           </div>
           <div class="flex75 flex align-center no-gutter pr0">
-            <input type="text" class="square-input flex90" placeholder="검색어를 입력해주세요." v-model="modalSearchData.value" @keyup.enter="fnSelectHostList" />
+            <input type="text" class="square-input flex90" placeholder="검색어를 입력해주세요." v-model="modalSearchData.value"
+              @keyup.enter="fnSelectHostList" />
             <button class="square-button blue-btn flex10" @click="fnSelectHostList">
               <svg-icon type="mdi" :path="searchPath" class="square-icon"></svg-icon>
             </button>
@@ -112,7 +115,8 @@
                   <td>{{ item.host_ip }}</td>
                   <td>{{ item.host_id }}</td>
                   <td>{{ item.host_port }}</td>
-                  <td><button type="button" class="blue-border-btn set-btn" @click="fnAddHost(item.host_code)">선택</button></td>
+                  <td><button type="button" class="blue-border-btn set-btn"
+                      @click="fnAddHost(item.host_code)">선택</button></td>
                 </tr>
               </template>
               <tr v-else>
@@ -120,7 +124,8 @@
               </tr>
             </tbody>
           </table>
-          <PaginationButton v-model:currentPage="modalSearch.currentPage" :perPage="modalSearch.perPage" :totalCount="modalSearch.totalRows" :click="fnSelectHostList" />
+          <PaginationButton v-model:currentPage="modalSearch.currentPage" :perPage="modalSearch.perPage"
+            :totalCount="modalSearch.totalRows" :click="fnSelectHostList" />
         </div>
       </div>
     </div>
@@ -222,43 +227,51 @@
 
     // 호스트 삭제
     async fnDelete() {
-      const vm = this;
-      // 삭제 확인
-      let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?");
-      if (!isConfirmChk) {
-        return;
-      }
-      // 실행
-      axios({
-        url: "/deptHost",
-        method: "delete",
-        headers: { "Content-Type": "application/json; charset=UTF-8" },
-        data: vm.selectList,
-      })
-        .then(response => {
-          vm.$showAlert("작업 성공", "삭제에 성공했습니다.");
-          vm.fnSelectList(); // 목록 조회
+      if (this.deptCode !== null) {
+        const vm = this;
+        // 삭제 확인
+        let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?");
+        if (!isConfirmChk) {
+          return;
+        }
+        // 실행
+        axios({
+          url: "/deptHost",
+          method: "delete",
+          headers: { "Content-Type": "application/json; charset=UTF-8" },
+          data: vm.selectList,
         })
-        .catch(error => {
-          vm.$showAlert("작업 실패", "삭제에 실패했습니다.\n관리자에게 문의바랍니다.");
-        });
+          .then(response => {
+            vm.$showAlert("작업 성공", "삭제에 성공했습니다.");
+            vm.fnSelectList(); // 목록 조회
+          })
+          .catch(error => {
+            vm.$showAlert("작업 실패", "삭제에 실패했습니다.\n관리자에게 문의바랍니다.");
+          });
+      }else{
+        this.$showAlert("부서 선택", "부서를 선택해 주세요.");
+      }
     },
 
     /* 모달 */
     // 모달 열기
     fnOpenModal(type, data) {
-      switch (type) {
-        case "addHost":
-          // 목록 조회
-          this.fnSelectHostList();
-          // 모달 열기
-          this.isModalOpen = true;
-          break;
-        case "addDrctry":
-          this.currentHost = data;
-          // 모달 열기
-          this.isModalOpenForDrctry = true;
-          break;
+      if (this.deptCode !== null) {
+        switch (type) {
+          case "addHost":
+            // 목록 조회
+            this.fnSelectHostList();
+            // 모달 열기
+            this.isModalOpen = true;
+            break;
+          case "addDrctry":
+            this.currentHost = data;
+            // 모달 열기
+            this.isModalOpenForDrctry = true;
+            break;
+        }
+      } else {
+        this.$showAlert("부서 선택", "부서를 선택해 주세요.");
       }
     },
 
client/views/pages/integrated/department/DeptUserList.vue
--- client/views/pages/integrated/department/DeptUserList.vue
+++ client/views/pages/integrated/department/DeptUserList.vue
@@ -225,9 +225,9 @@
         data: requestData,
       })
         .then(response => {
-          if(response.data.resultData.moveCnt >= 1){
+          if (response.data.resultData.moveCnt >= 1) {
             vm.fnCloseModal();
-            vm.$showAlert("부서 이동", "선택하신 사용자의 부서가 이동되었습니다.");  
+            vm.$showAlert("부서 이동", "선택하신 사용자의 부서가 이동되었습니다.");
           }
         })
         .catch(error => {
@@ -315,38 +315,50 @@
 
     // 사용자 삭제
     async fnDelete() {
-      const vm = this;
-      // 삭제 확인
-      let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?");
-      if (!isConfirmChk) {
-        return;
-      }
-      // 실행
-      axios({
-        url: "/orgnztMember",
-        method: "delete",
-        headers: { "Content-Type": "application/json; charset=UTF-8" },
-        data: vm.selectList,
-      })
-        .then(function (response) {
-          vm.$showAlert("작업 성공", "사용자 삭제에 성공했습니다.");
-          vm.fnSelectList(); // 목록 조회
+      if (this.deptCode !== null) {
+        const vm = this;
+        // 삭제 확인
+        let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?");
+        if (!isConfirmChk) {
+          return;
+        }
+        // 실행
+        axios({
+          url: "/orgnztMember",
+          method: "delete",
+          headers: { "Content-Type": "application/json; charset=UTF-8" },
+          data: vm.selectList,
         })
-        .catch(function (error) {
-          vm.$showAlert("작업 실패", "사용자 삭제에 실패했습니다.\n관리자에게 문의바랍니다.");
-        });
+          .then(function (response) {
+            vm.$showAlert("작업 성공", "사용자 삭제에 성공했습니다.");
+            vm.fnSelectList(); // 목록 조회
+          })
+          .catch(function (error) {
+            vm.$showAlert("작업 실패", "사용자 삭제에 실패했습니다.\n관리자에게 문의바랍니다.");
+          });
+      }else{
+        this.$showAlert("부서 선택", "부서를 선택해 주세요.");
+      }
     },
 
     /* 모달 */
     // 사용자 모달 열기
     fnOpenModal() {
-      this.fnSelectModalList(); // 목록 조회
-      this.isModalOpen = "user";
+      if (this.deptCode !== null) {
+        this.fnSelectModalList(); // 목록 조회
+        this.isModalOpen = "user";
+      }else{
+        this.$showAlert("부서 선택", "부서를 선택해 주세요.");
+      }
     },
     // 부서 모달 열기
     fnOpenModalDept() {
-      this.fnSelectDeptListForTree(); // 목록 조회
-      this.isModalOpen = "dept";
+      if (this.deptCode !== null) {
+        this.fnSelectDeptListForTree(); // 목록 조회
+        this.isModalOpen = "dept";
+      }else{
+        this.$showAlert("부서 선택", "부서를 선택해 주세요.");
+      }
     },
 
     // 모달 닫기
Add a comment
List