박정하 박정하 03-07
250307 박정하 로더 추가
@b0a85f19f3b4c7e0d127433b0c0d871ca8f100bd
client/views/component/connection/modalContents/DatasetUpdate.vue
--- client/views/component/connection/modalContents/DatasetUpdate.vue
+++ client/views/component/connection/modalContents/DatasetUpdate.vue
@@ -1,4 +1,15 @@
 <template>
+  <div class="container" :style="isLoading ? { cursor: 'wait' } : {}">
+    <!-- 로딩 시 화면을 덮는 반투명 오버레이 -->
+    <div v-if="isLoading" class="loading-overlay">
+      <div class="loading-div">
+        <span>LOADING </span>
+        <span class="anima">.</span>
+        <span class="anima">.</span>
+        <span class="anima">.</span>
+      </div>
+    </div>
+  </div>
   <div class="modal-content-monthly">
     <div class="tab-contents mt10">
       <div class="content-titleZone flex justify-between align-center">
@@ -13,9 +24,7 @@
           <tr>
             <th>데이터셋 설정</th>
             <td>
-              <button class="blue-border-btn small-btn" @click="fnOpenModal">
-                타겟 데이터 조회
-              </button>
+              <button class="blue-border-btn small-btn" @click="fnOpenModal"> 타겟 데이터 조회 </button>
             </td>
           </tr>
           <tr>
@@ -23,13 +32,11 @@
             <td>
               <div class="input-container flex">
                 <label class="radio-label mr5">
-                  <input type="radio" name="radio" :value="false" class="custom-radiobox"
-                    v-model="jobItm.itm_option_bool" />
+                  <input type="radio" name="radio" :value="false" class="custom-radiobox" v-model="jobItm.itm_option_bool" />
                   <span>기존 데이터 삭제</span>
                 </label>
                 <label class="radio-label">
-                  <input type="radio" name="radio" :value="true" class="custom-radiobox"
-                    v-model="jobItm.itm_option_bool" />
+                  <input type="radio" name="radio" :value="true" class="custom-radiobox" v-model="jobItm.itm_option_bool" />
                   <span>기존 데이터 미삭제</span>
                 </label>
               </div>
@@ -41,13 +48,7 @@
       <div class="flex mt20">
         <div class="flex50 pl0">
           <div class="content-titleZone flex justify-between align-center">
-            <p class="box-title">
-              원본 데이터 컴럼
-              <small>
-                ( 매칭 : {{ matchs.matchCnt }}, 비매칭 :
-                {{ matchs.unMatchCnt }}
-                )
-              </small>
+            <p class="box-title"> 원본 데이터 컴럼 <small> ( 매칭 : {{ matchs.matchCnt }}, 비매칭 : {{ matchs.unMatchCnt }} ) </small>
             </p>
           </div>
           <div class="columncontBox" style="height: 620px; overflow-y: auto">
@@ -58,16 +59,11 @@
               <tbody>
                 <tr v-for="(column, index) of matchList" :key="index">
                   <td>
-                    <p class="col-data">
-                      {{ column.origin.displyColumnNm }}
-                    </p>
+                    <p class="col-data"> {{ column.origin.displyColumnNm }} </p>
                   </td>
-                  <td draggable="true" @dragstart="fnMoveStart(column)" @dragover="fnOnDragover"
-                    @drop="fnChangeMatch('drop', column)" @dblclick="fnChangeMatch('doubleClick', column)">
+                  <td draggable="true" @dragstart="fnMoveStart(column)" @dragover="fnOnDragover" @drop="fnChangeMatch('drop', column)" @dblclick="fnChangeMatch('doubleClick', column)">
                     <p class="col-data">
-                      <span v-if="!$isEmpty(column.target)">
-                        {{ column.target.displyColumnNm }}
-                      </span>
+                      <span v-if="!$isEmpty(column.target)"> {{ column.target.displyColumnNm }} </span>
                     </p>
                   </td>
                 </tr>
@@ -81,11 +77,7 @@
           </div>
           <div class="columncontBox" style="height: 620px; overflow-y: auto">
             <ul>
-              <li v-for="(column, index) of frontColumns" :key="index"
-                :class="{ 'col-data': true, disabled: column.isConnect }" :draggable="!column.isConnect"
-                @dragstart="fnOnDragstart(column)">
-                {{ column.displyColumnNm }}
-              </li>
+              <li v-for="(column, index) of frontColumns" :key="index" :class="{ 'col-data': true, disabled: column.isConnect }" :draggable="!column.isConnect" @dragstart="fnOnDragstart(column)"> {{ column.displyColumnNm }} </li>
             </ul>
           </div>
         </div>
@@ -124,18 +116,13 @@
           </table>
         </div>
         <div class="modal-end flex justify-end">
-          <button class="blue-btn small-btn" @click="fnSave(itmId)">
-            선택
-          </button>
-          <button class="blue-border-btn small-btn" @click="fnCloseModal">
-            취소
-          </button>
+          <button class="blue-btn small-btn" @click="fnSave(itmId)"> 선택 </button>
+          <button class="blue-border-btn small-btn" @click="fnCloseModal"> 취소 </button>
         </div>
       </div>
     </div>
   </div>
 </template>
-
 <script>
 import axios from "axios";
 import DataPostManagerMain from "../../../pages/data/datapost/DataPostManagerMain.vue";
@@ -156,6 +143,8 @@
 
   data() {
     return {
+      isLoading: false,
+
       isOpenModal: false,
 
       jobItm: this.jobItem,
@@ -175,7 +164,6 @@
   },
 
   created() {
-    console.log("아이템", this.item);
     if (this.$isEmpty(this.frontNode.dataTable.columnDatas)) {
       this.$showAlert(
         "경고",
@@ -223,6 +211,8 @@
     },
 
     fnSave(datasetPostId) {
+      this.isLoading = true;
+
       const vm = this;
       axios({
         url: "/dataset/getDataTableInfo.json",
@@ -235,10 +225,12 @@
           vm.jobItm.itm.item = datasetPostId;
           vm.jobItm.dataTable = response.data.resultData.dataTable;
           vm.fnSetTargetData();
+          vm.isLoading = false;
           // 모달 닫기
           vm.fnCloseModal();
         })
         .catch(function (error) {
+          vm.isLoading = false;
           vm.$showAlert(
             "에러 발생",
             "에러가 발생했습니다. 관리자에게 문의해 주세요."
@@ -280,7 +272,7 @@
             }
           }
         });
-        this.isCheck =false;
+        this.isCheck = false;
       }
     },
 
@@ -356,7 +348,6 @@
   },
 };
 </script>
-
 <style scoped>
 .columncontBox {
   background: #f5f5f5;
client/views/component/modal/SchedulePreviewModal.vue
--- client/views/component/modal/SchedulePreviewModal.vue
+++ client/views/component/modal/SchedulePreviewModal.vue
@@ -1,4 +1,15 @@
 <template>
+  <div class="container" :style="isLoading ? { cursor: 'wait' } : {}">
+    <!-- 로딩 시 화면을 덮는 반투명 오버레이 -->
+    <div v-if="isLoading" class="loading-overlay">
+      <div class="loading-div">
+        <span>LOADING </span>
+        <span class="anima">.</span>
+        <span class="anima">.</span>
+        <span class="anima">.</span>
+      </div>
+    </div>
+  </div>
   <div class="modal-wrapper">
     <div class="modal-container large-modal">
       <div class="modal-title flex justify-between align-center">
@@ -63,6 +74,8 @@
 
   data() {
     return {
+      isLoading: false,
+
       // icon용 svg path
       searchPath: mdiMagnify,
       closePath: mdiClose,
@@ -100,6 +113,8 @@
 
     // 스케줄 선택 삭제
     init() {
+      this.isLoading = true;
+
       const vm = this;
       axios({
         url: "/diagram/operatorNow/preview",
@@ -115,8 +130,10 @@
             if (this.diagram.schdulType == "DATA_NODE") {
               this.jobItms = response.data.resultData.list;
               this.activeTab = "TAB_0";
+              vm.isLoading = false;
             }
           } else {
+            vm.isLoading = false;
             vm.$showAlert(
               "에러 발생",
               "에러가 발생했습니다. 관리자에게 문의해 주세요."
@@ -124,6 +141,7 @@
           }
         })
         .catch((error) => {
+          vm.isLoading = false;
           vm.$showAlert(
             "에러 발생",
             "에러가 발생했습니다. 관리자에게 문의해 주세요."
client/views/component/scheduleComponent/nodes/ReadNode.vue
--- client/views/component/scheduleComponent/nodes/ReadNode.vue
+++ client/views/component/scheduleComponent/nodes/ReadNode.vue
@@ -53,7 +53,7 @@
   methods: {
     async nodeOnSetUp() {
       if (this.node.isSetup) {
-        let isCheck = await this.$showConfirm("경고", "READ 작업은 재설정이 필요합니다.");
+        let isCheck = await this.$showConfirm("경고", "읽기 노드 수정 시 재설정이 필요합니다.");
         if (!isCheck) {
           return
         }
client/views/pages/schedule/ScheduleManagement.vue
--- client/views/pages/schedule/ScheduleManagement.vue
+++ client/views/pages/schedule/ScheduleManagement.vue
@@ -1,5 +1,14 @@
 <template>
-  <div class="container">
+  <div class="container" :style="isLoading ? { cursor: 'wait' } : {}">
+    <!-- 로딩 시 화면을 덮는 반투명 오버레이 -->
+    <div v-if="isLoading" class="loading-overlay">
+      <div class="loading-div">
+        <span>LOADING </span>
+        <span class="anima">.</span>
+        <span class="anima">.</span>
+        <span class="anima">.</span>
+      </div>
+    </div>
     <div class="page-titleZone flex justify-between align-center">
       <p class="main-title flex80">스케줄 관리</p>
       <PageNavigation />
@@ -11,11 +20,9 @@
             <div class="content-titleZone flex justify-between align-center">
               <p class="box-title">스케줄 목록</p>
               <div class="search-bar flex justify-end align-center">
-                <input type="date" name="start-date" id="start-date" class="square-date"
-                  :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value" />
+                <input type="date" name="start-date" id="start-date" class="square-date" :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value" />
                 <span class="coupler">~</span>
-                <input type="date" name="end-date" id="end-date" class="square-date ml5"
-                  :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value2" />
+                <input type="date" name="end-date" id="end-date" class="square-date ml5" :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value2" />
                 <select class="square-select ml5" v-model="search_data1.value">
                   <option :value="null">상태</option>
                   <option :value="true">진행</option>
@@ -27,8 +34,7 @@
                   <option value="si.creat_id">작성자</option>
                 </select>
                 <div class="search-square">
-                  <input type="text" class="square-input" placeholder="Search" v-model="search_data2.value"
-                    v-on:keyup.enter="fnSelectScheduleList()" />
+                  <input type="text" class="square-input" placeholder="Search" v-model="search_data2.value" v-on:keyup.enter="fnSelectScheduleList()" />
                   <button class="square-button blue-btn" @click="fnSelectScheduleList()">
                     <svg-icon type="mdi" :path="this.$getIconPath()" class="square-icon"></svg-icon>
                   </button>
@@ -63,16 +69,9 @@
                   <template v-if="scheduleList.length > 0">
                     <tr v-for="(item, idx) in scheduleList" :key="item" @click="fnSelectSchedule(item.schdulId)">
                       <td>
-                        <input type="checkbox" :value="item" v-model="selectList" @click.stop=""
-                          @change="fnChangeCheckList" />
+                        <input type="checkbox" :value="item" v-model="selectList" @click.stop="" @change="fnChangeCheckList" />
                       </td>
-                      <td>
-                        {{
-                          search.totalRows -
-                          idx -
-                          (search.currentPage - 1) * search.perPage
-                        }}
-                      </td>
+                      <td> {{ search.totalRows - idx - (search.currentPage - 1) * search.perPage }} </td>
                       <td>{{ item.groupNm }}</td>
                       <td>{{ item.creatId }}</td>
                       <td>{{ item.cronChrctr }}</td>
@@ -94,19 +93,12 @@
                   </tr>
                 </tbody>
               </table>
-              <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage"
-                :totalCount="search.totalRows" :maxRange="5" :click="fnSelectScheduleList" />
+              <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows" :maxRange="5" :click="fnSelectScheduleList" />
             </div>
             <div class="flex justify-end">
-              <button class="blue-border-btn small-btn" @click="fnChkSttus(true)">
-                선택 실행
-              </button>
-              <button class="blue-border-btn small-btn" @click="fnChkSttus(false)">
-                선택 중단
-              </button>
-              <button class="red-border-btn small-btn" @click="fnChkDel">
-                선택 삭제
-              </button>
+              <button class="blue-border-btn small-btn" @click="fnChkSttus(true)"> 선택 실행 </button>
+              <button class="blue-border-btn small-btn" @click="fnChkSttus(false)"> 선택 중단 </button>
+              <button class="red-border-btn small-btn" @click="fnChkDel"> 선택 삭제 </button>
             </div>
           </div>
         </div>
@@ -124,9 +116,7 @@
                     <span v-else>수정</span>
                   </button>
                   <button class="blue-border-btn small-btn" id="resetButton" @click="fnInitSchedule">
-                    <span v-if="$isEmpty(currentSchedule.schdulId)">
-                      초기화
-                    </span>
+                    <span v-if="$isEmpty(currentSchedule.schdulId)"> 초기화 </span>
                     <span v-else>취소</span>
                   </button>
                 </div>
@@ -134,10 +124,8 @@
             </div>
             <div class="right-content flex70">
               <div class="content-box form-box">
-                <DiagramList v-if="editMode == 'vueFlow'" :currentDiagram="currentSchedule.diagram"
-                  @onUpdate="fnUpdateDiagram" @onChange="fnChangeEditMode" @initDiagram="fnInitDiagram" />
-                <DiagramLogList v-if="editMode == 'logList'" :logSearch="logSearch" :logList="logList"
-                  @onChange="fnChangeEditMode" @updateSearchVO="fnSelectScheduleLogList" />
+                <DiagramList v-if="editMode == 'vueFlow'" :currentDiagram="currentSchedule.diagram" @onUpdate="fnUpdateDiagram" @onChange="fnChangeEditMode" @initDiagram="fnInitDiagram" @onChangeLoad="fnChangeLoading" />
+                <DiagramLogList v-if="editMode == 'logList'" :logSearch="logSearch" :logList="logList" @onChange="fnChangeEditMode" @updateSearchVO="fnSelectScheduleLogList" />
               </div>
             </div>
           </div>
@@ -175,6 +163,8 @@
 
   data() {
     return {
+      isLoading: false,
+
       // svg
       searchPath: mdiMagnify,
       checkPath: mdiCheckCircle,
@@ -264,8 +254,8 @@
 
     // 스케줄 개별 조회
     fnSelectSchedule(scheduleId) {
-      console.log("이걸 선택을 했찌요", scheduleId);
       const vm = this;
+      this.isLoading = true;
       axios({
         url: "/schedule/getSchedule/" + scheduleId,
         method: "get",
@@ -279,7 +269,10 @@
             let schedule = response.data.resultData.scheduleVO;
             vm.originSchedule = _.cloneDeep(schedule);
             vm.currentSchedule = _.cloneDeep(schedule);
+
+            vm.isLoading = false;
           } else {
+            vm.isLoading = false;
             vm.$showAlert(
               "에러 발생",
               "요청을 제대로 처리하지 못했습니다. 관리자에게 문의해 주세요."
@@ -287,6 +280,7 @@
           }
         })
         .catch((error) => {
+          vm.isLoading = false;
           vm.$showAlert(
             "에러 발생",
             "에러가 발생했습니다. 관리자에게 문의해 주세요."
@@ -297,8 +291,8 @@
 
     // 스케줄 등록
     fnAddSchedule() {
-      
-      if(!this.insertValidation()){
+
+      if (!this.insertValidation()) {
         return
       }
       const vm = this;
@@ -601,5 +595,10 @@
       return errorNodes.length === 0; // 모든 노드가 올바르게 연결되어 있으면 true 반환
     },
   },
+
+  // 로더 상태 변경
+  fnChangeLoading(status) {
+    this.isLoading = status;
+  }
 };
 </script>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List