
--- client/views/component/connection/jobContainer.vue
+++ client/views/component/connection/jobContainer.vue
... | ... | @@ -24,7 +24,7 @@ |
24 | 24 |
<p>{{ indx + 1 + ". " + itm.type }}</p> |
25 | 25 |
<div> |
26 | 26 |
<button class="blue-border-btn set-btn" @click="showPopup(indx)">설정</button> |
27 |
- <button class="red-border-btn set-btn" @click="deleteConnect(indx)">삭제</button> |
|
27 |
+ <button v-if="!dataEdit" class="red-border-btn set-btn" @click="deleteConnect(indx)">삭제</button> |
|
28 | 28 |
</div> |
29 | 29 |
<FileSelect :openPopup="popupToggls[indx]" :jobItem="itm" :mode="itm.type" @closePopup="closePopup(indx)" v-if="itm.type == 'fileRead' || itm.type == 'fileWrite'" /> |
30 | 30 |
<DatabaseConnection :openPopup="popupToggls[indx]" :jobItem="itm" @closePopup="closePopup(indx)" v-if="itm.type == 'dbConnection'" /> |
... | ... | @@ -229,6 +229,8 @@ |
229 | 229 |
}, |
230 | 230 |
|
231 | 231 |
execModel: function () { |
232 |
+ console.log("보내는 데이터 ", this.crrentJobGroup); |
|
233 |
+ |
|
232 | 234 |
let vm = this; |
233 | 235 |
axios({ |
234 | 236 |
url: "/job/executeJob.json", |
--- client/views/pages/data/DataPostManagement.vue
+++ client/views/pages/data/DataPostManagement.vue
... | ... | @@ -5,215 +5,24 @@ |
5 | 5 |
<PageNavigation /> |
6 | 6 |
</div> |
7 | 7 |
<div class="content-wrap"> |
8 |
- <div class="content-box flex justify-between"> |
|
9 |
- <div class="flex20 content-box"> |
|
10 |
- <div class="left-content flex100 content-box"> |
|
11 |
- <div class="content-box"> |
|
12 |
- <div class="content-titleZone"> |
|
13 |
- <p class="box-title">카테고리 리스트</p> |
|
14 |
- </div> |
|
15 |
- <div class="content-zone"> |
|
16 |
- <CodeList :groupCode="'DATA_CTGRY'" @selectCode="selectCode" /> |
|
17 |
- </div> |
|
18 |
- </div> |
|
19 |
- </div> |
|
20 |
- </div> |
|
21 |
- <div class="flex80 content-box"> |
|
22 |
- <div class="right-content flex100"> |
|
23 |
- <div class="flex-column justify-between"> |
|
24 |
- <div class="flex justify-end"> |
|
25 |
- <div class="search-bar"> |
|
26 |
- <div class="flex justify-end align-center" style="gap: 5px"> |
|
27 |
- <input type="date" name="start-date" id="start-date" class="square-date" :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value" /> |
|
28 |
- <span>~</span> |
|
29 |
- <input type="date" name="end-date" id="end-date" class="square-date" :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" v-model="search_date.value2" /> |
|
30 |
- <select class="square-select" v-model="search_data1.value"> |
|
31 |
- <option :value="null">공개여부</option> |
|
32 |
- <option :value="true">공개</option> |
|
33 |
- <option :value="false">비공개</option> |
|
34 |
- </select> |
|
35 |
- <select class="square-select" v-model="search_data2.value"> |
|
36 |
- <option :value="null">카테고리</option> |
|
37 |
- <option v-for="(item, indx) in categoryList" :key="indx" :value="item.cmmnCode">{{ item.codeNm }}</option> |
|
38 |
- </select> |
|
39 |
- <select name="" id="searchItm1" class="square-select" v-model="search_data3.key"> |
|
40 |
- <option :value="null">검색조건</option> |
|
41 |
- <option value="post_sj">제목</option> |
|
42 |
- <option value="post_dc">내용</option> |
|
43 |
- </select> |
|
44 |
- <div class="flex justify-end align-center no-gutter"> |
|
45 |
- <input type="text" class="square-input flex90" placeholder="Search" v-model="search_data3.value" v-on:keyup.enter="searchData()" /> |
|
46 |
- <button class="square-button blue-btn flex10" @click="searchData()"> |
|
47 |
- <svg-icon type="mdi" :path="this.$getIconPath()" class="square-icon"></svg-icon> |
|
48 |
- </button> |
|
49 |
- </div> |
|
50 |
- </div> |
|
51 |
- </div> |
|
52 |
- </div> |
|
53 |
- <div class="content-zone" style="overflow: auto;"> |
|
54 |
- <div class="table-zone"> |
|
55 |
- <div class="list-info flex justify-between align-center"> |
|
56 |
- <div class="count-zone"> |
|
57 |
- <p>총<span>{{ search.totalRows }}</span>건</p> |
|
58 |
- </div> |
|
59 |
- <div class="cunt-selectZone"> |
|
60 |
- <select name="" id=""> |
|
61 |
- <option value="">10개 보기</option> |
|
62 |
- <option value="">20개 보기</option> |
|
63 |
- </select> |
|
64 |
- </div> |
|
65 |
- </div> |
|
66 |
- <table class="list-table"> |
|
67 |
- <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> |
|
68 |
- <colgroup> |
|
69 |
- <col style="width: 10%" /> |
|
70 |
- <col style="width: 40%" /> |
|
71 |
- <col style="width: 10%" /> |
|
72 |
- <col style="width: 10%" /> |
|
73 |
- <col style="width: 10%" /> |
|
74 |
- <col style="width: 30%" /> |
|
75 |
- </colgroup> |
|
76 |
- <thead> |
|
77 |
- <tr> |
|
78 |
- <th>No</th> |
|
79 |
- <th>제목</th> |
|
80 |
- <th>생성자</th> |
|
81 |
- <th>부서</th> |
|
82 |
- <th>카테고리</th> |
|
83 |
- <th>등록일시</th> |
|
84 |
- </tr> |
|
85 |
- </thead> |
|
86 |
- <tbody> |
|
87 |
- <template v-if="dataPostList.length > 0"> |
|
88 |
- <tr v-for="(item, indx) in dataPostList" :key="indx" @click="selectPost(item)"> |
|
89 |
- <td>{{ search.totalRows - indx - (search.currentPage - 1) * search.perPage }}</td> |
|
90 |
- <td>{{ item.post_sj }}</td> |
|
91 |
- <td>{{ item.user_nm }}</td> |
|
92 |
- <td>{{ item.dept_nm }}</td> |
|
93 |
- <td>{{ item.ctgry_id }}</td> |
|
94 |
- <td>{{ $getFullTime(item.creat_dt) }}</td> |
|
95 |
- </tr> |
|
96 |
- </template> |
|
97 |
- <tr v-else> |
|
98 |
- <td colspan="6">등록된 데이터가 없습니다.</td> |
|
99 |
- </tr> |
|
100 |
- </tbody> |
|
101 |
- </table> |
|
102 |
- <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows" :maxRange="5" :click="searchData" /> |
|
103 |
- </div> |
|
104 |
- </div> |
|
105 |
- <div class="flex justify-end"> |
|
106 |
- <button class="blue-btn small-btn" @click="createDataPost">데이터 등록</button> |
|
107 |
- </div> |
|
108 |
- </div> |
|
109 |
- </div> |
|
110 |
- </div> |
|
111 |
- </div> |
|
8 |
+ <DataPostManagerMain/> |
|
112 | 9 |
</div> |
113 | 10 |
</div> |
114 | 11 |
</template> |
115 | 12 |
<script> |
116 |
-import CodeList from "../../component/common/Component_CodeList.vue"; |
|
117 |
-import axios from "axios"; |
|
118 | 13 |
import PageNavigation from "../../component/PageNavigation.vue"; |
119 |
-import SvgIcon from "@jamescoyle/vue-icon"; |
|
120 |
-import PaginationButton from "../../component/PaginationButton.vue"; |
|
14 |
+import DataPostManagerMain from "./datapost/DataPostManagerMain.vue"; |
|
121 | 15 |
|
122 | 16 |
export default { |
123 | 17 |
data() { |
124 | 18 |
return { |
125 |
- dataPostList: [], |
|
126 |
- search: this.$getDefaultSerchVO(), |
|
127 |
- // 공개여부 |
|
128 |
- search_data1: this.$getDefaultSerchItem("public_at", "bool"), |
|
129 |
- // 카테고리 |
|
130 |
- search_data2: this.$getDefaultSerchItem("ctgry_id", "string"), |
|
131 |
- // 선택 |
|
132 |
- search_data3: this.$getDefaultSerchItem("post_sj", "string"), |
|
133 |
- // 날짜 |
|
134 |
- search_date: this.$getDefaultSerchItem("creat_dt", "dates"), |
|
135 |
- categoryList: [], |
|
136 | 19 |
}; |
137 | 20 |
}, |
138 | 21 |
methods: { |
139 |
- createDataPost: function () { |
|
140 |
- this.$router.push("/insertDataPost.page"); |
|
141 |
- }, |
|
142 |
- |
|
143 |
- selectCode: function (code) { |
|
144 |
- this.search_data2.value = code; |
|
145 |
- this.searchData(); |
|
146 |
- }, |
|
147 |
- |
|
148 |
- selectPost: function (item) { |
|
149 |
- this.$router.push({ |
|
150 |
- name: "DataPostDetail", |
|
151 |
- query: { datapost: item.dataset_post_id }, |
|
152 |
- }); |
|
153 |
- }, |
|
154 |
- searchData: function () { |
|
155 |
- const vm = this; |
|
156 |
- |
|
157 |
- let check = false; |
|
158 |
- let authList = vm.$store.state.loginUser.user_auth; |
|
159 |
- for (let auth of authList) { |
|
160 |
- if (auth == 'ROLE_ADMIN') { |
|
161 |
- check = true |
|
162 |
- break; |
|
163 |
- } |
|
164 |
- } |
|
165 |
- if (!check) { |
|
166 |
- vm.search.searchObjectList.push({ |
|
167 |
- key: "id", |
|
168 |
- key2: "dept_code", |
|
169 |
- type: "string", |
|
170 |
- value: check + "/" + vm.$store.state.loginUser.user_id, |
|
171 |
- value2: vm.$store.state.loginUser.dept_code, |
|
172 |
- }) |
|
173 |
- } |
|
174 |
- |
|
175 |
- axios({ |
|
176 |
- url: "/dataset/selectDataPostList.json", |
|
177 |
- method: "post", |
|
178 |
- headers: { |
|
179 |
- "Content-Type": "application/json; charset=UTF-8", |
|
180 |
- }, |
|
181 |
- data: JSON.stringify(vm.search), |
|
182 |
- }) |
|
183 |
- .then(function (response) { |
|
184 |
- if (response.data.checkMessage.success) { |
|
185 |
- vm.dataPostList = response.data.resultData.dataPostList; |
|
186 |
- vm.search.totalRows = response.data.resultData.totalRow; |
|
187 |
- } |
|
188 |
- }) |
|
189 |
- .catch(function (error) { |
|
190 |
- this.$showAlert( |
|
191 |
- "에러 발생", |
|
192 |
- "에러가 발생했습니다. 관리자에게 문의해 주세요." |
|
193 |
- ); |
|
194 |
- }); |
|
195 |
- }, |
|
196 |
- // 초기화 |
|
197 |
- init: async function () { |
|
198 |
- this.search.searchObjectList.push(this.search_date); |
|
199 |
- this.search.searchObjectList.push(this.search_data1); |
|
200 |
- this.search.searchObjectList.push(this.search_data2); |
|
201 |
- this.search.searchObjectList.push(this.search_data3); |
|
202 |
- this.categoryList = await this.$getCommonCode("DATA_CTGRY"); |
|
203 |
- }, |
|
204 |
- }, |
|
205 |
- computed: { |
|
206 |
- CodeList, |
|
207 | 22 |
}, |
208 | 23 |
components: { |
209 |
- CodeList: CodeList, |
|
210 | 24 |
PageNavigation: PageNavigation, |
211 |
- PaginationButton: PaginationButton, |
|
212 |
- SvgIcon: SvgIcon, |
|
213 |
- }, |
|
214 |
- mounted() { |
|
215 |
- this.init(); |
|
216 |
- this.searchData(); |
|
25 |
+ DataPostManagerMain: DataPostManagerMain |
|
217 | 26 |
}, |
218 | 27 |
}; |
219 | 28 |
</script>(파일 끝에 줄바꿈 문자 없음) |
+++ client/views/pages/data/datapost/DataPostManagerMain.vue
... | ... | @@ -0,0 +1,220 @@ |
1 | +<template> | |
2 | + <div class="content-box flex justify-between"> | |
3 | + <div class="flex20 content-box"> | |
4 | + <div class="left-content flex100 content-box"> | |
5 | + <div class="content-box"> | |
6 | + <div class="content-titleZone"> | |
7 | + <p class="box-title">카테고리 리스트</p> | |
8 | + </div> | |
9 | + <div class="content-zone"> | |
10 | + <CodeList :groupCode="'DATA_CTGRY'" @selectCode="selectCode" /> | |
11 | + </div> | |
12 | + </div> | |
13 | + </div> | |
14 | + </div> | |
15 | + <div class="flex80 content-box"> | |
16 | + <div class="right-content flex100"> | |
17 | + <div class="flex-column justify-between"> | |
18 | + <div class="flex justify-end"> | |
19 | + <div class="search-bar"> | |
20 | + <div class="flex justify-end align-center" style="gap: 5px"> | |
21 | + <input type="date" name="start-date" id="start-date" class="square-date" | |
22 | + :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" | |
23 | + v-model="search_date.value" /> | |
24 | + <span>~</span> | |
25 | + <input type="date" name="end-date" id="end-date" class="square-date" | |
26 | + :class="{ 'date-placeholder': false }" data-placeholder="날짜 선택" | |
27 | + v-model="search_date.value2" /> | |
28 | + <select class="square-select" v-model="search_data1.value"> | |
29 | + <option :value="null">공개여부</option> | |
30 | + <option :value="true">공개</option> | |
31 | + <option :value="false">비공개</option> | |
32 | + </select> | |
33 | + <select class="square-select" v-model="search_data2.value"> | |
34 | + <option :value="null">카테고리</option> | |
35 | + <option v-for="(item, indx) in categoryList" :key="indx" :value="item.cmmnCode">{{ | |
36 | + item.codeNm }}</option> | |
37 | + </select> | |
38 | + <select name="" id="searchItm1" class="square-select" v-model="search_data3.key"> | |
39 | + <option :value="null">검색조건</option> | |
40 | + <option value="post_sj">제목</option> | |
41 | + <option value="post_dc">내용</option> | |
42 | + </select> | |
43 | + <div class="flex justify-end align-center no-gutter"> | |
44 | + <input type="text" class="square-input flex90" placeholder="Search" | |
45 | + v-model="search_data3.value" v-on:keyup.enter="searchData()" /> | |
46 | + <button class="square-button blue-btn flex10" @click="searchData()"> | |
47 | + <svg-icon type="mdi" :path="this.$getIconPath()" class="square-icon"></svg-icon> | |
48 | + </button> | |
49 | + </div> | |
50 | + </div> | |
51 | + </div> | |
52 | + </div> | |
53 | + <div class="content-zone" style="overflow: auto;"> | |
54 | + <div class="table-zone"> | |
55 | + <div class="list-info flex justify-between align-center"> | |
56 | + <div class="count-zone"> | |
57 | + <p>총<span>{{ search.totalRows }}</span>건</p> | |
58 | + </div> | |
59 | + <div class="cunt-selectZone"> | |
60 | + <select name="" id=""> | |
61 | + <option value="">10개 보기</option> | |
62 | + <option value="">20개 보기</option> | |
63 | + </select> | |
64 | + </div> | |
65 | + </div> | |
66 | + <table class="list-table"> | |
67 | + <!-- col 꼭 너비 기재해야함! 그래야 100%로 차지함 --> | |
68 | + <colgroup> | |
69 | + <col style="width: 10%" /> | |
70 | + <col style="width: 40%" /> | |
71 | + <col style="width: 10%" /> | |
72 | + <col style="width: 10%" /> | |
73 | + <col style="width: 10%" /> | |
74 | + <col style="width: 30%" /> | |
75 | + </colgroup> | |
76 | + <thead> | |
77 | + <tr> | |
78 | + <th>No</th> | |
79 | + <th>제목</th> | |
80 | + <th>생성자</th> | |
81 | + <th>부서</th> | |
82 | + <th>카테고리</th> | |
83 | + <th>등록일시</th> | |
84 | + </tr> | |
85 | + </thead> | |
86 | + <tbody> | |
87 | + <template v-if="dataPostList.length > 0"> | |
88 | + <tr v-for="(item, indx) in dataPostList" :key="indx" @click="selectPost(item)"> | |
89 | + <td>{{ search.totalRows - indx - (search.currentPage - 1) * search.perPage | |
90 | + }}</td> | |
91 | + <td>{{ item.post_sj }}</td> | |
92 | + <td>{{ item.user_nm }}</td> | |
93 | + <td>{{ item.dept_nm }}</td> | |
94 | + <td>{{ item.ctgry_id }}</td> | |
95 | + <td>{{ $getFullTime(item.creat_dt) }}</td> | |
96 | + </tr> | |
97 | + </template> | |
98 | + <tr v-else> | |
99 | + <td colspan="6">등록된 데이터가 없습니다.</td> | |
100 | + </tr> | |
101 | + </tbody> | |
102 | + </table> | |
103 | + <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" | |
104 | + :totalCount="search.totalRows" :maxRange="5" :click="searchData" /> | |
105 | + </div> | |
106 | + </div> | |
107 | + <div class="flex justify-end"> | |
108 | + <button class="blue-btn small-btn" @click="createDataPost">데이터 등록</button> | |
109 | + </div> | |
110 | + </div> | |
111 | + </div> | |
112 | + </div> | |
113 | + </div> | |
114 | +</template> | |
115 | +<script> | |
116 | +import CodeList from "../../../component/common/Component_CodeList.vue"; | |
117 | +import axios from "axios"; | |
118 | +import PageNavigation from "../../../component/PageNavigation.vue"; | |
119 | +import SvgIcon from "@jamescoyle/vue-icon"; | |
120 | +import PaginationButton from "../../../component/PaginationButton.vue"; | |
121 | + | |
122 | +export default { | |
123 | + data() { | |
124 | + return { | |
125 | + dataPostList: [], | |
126 | + search: this.$getDefaultSerchVO(), | |
127 | + // 공개여부 | |
128 | + search_data1: this.$getDefaultSerchItem("public_at", "bool"), | |
129 | + // 카테고리 | |
130 | + search_data2: this.$getDefaultSerchItem("ctgry_id", "string"), | |
131 | + // 선택 | |
132 | + search_data3: this.$getDefaultSerchItem("post_sj", "string"), | |
133 | + // 날짜 | |
134 | + search_date: this.$getDefaultSerchItem("creat_dt", "dates"), | |
135 | + categoryList: [], | |
136 | + }; | |
137 | + }, | |
138 | + methods: { | |
139 | + createDataPost: function () { | |
140 | + this.$router.push("/insertDataPost.page"); | |
141 | + }, | |
142 | + | |
143 | + selectCode: function (code) { | |
144 | + this.search_data2.value = code; | |
145 | + this.searchData(); | |
146 | + }, | |
147 | + | |
148 | + selectPost: function (item) { | |
149 | + this.$router.push({ | |
150 | + name: "DataPostDetail", | |
151 | + query: { datapost: item.dataset_post_id }, | |
152 | + }); | |
153 | + }, | |
154 | + searchData: function () { | |
155 | + console.log("@@검색값",this.search); | |
156 | + const vm = this; | |
157 | + | |
158 | + let check = false; | |
159 | + let authList = vm.$store.state.loginUser.user_auth; | |
160 | + for (let auth of authList) { | |
161 | + if (auth == 'ROLE_ADMIN') { | |
162 | + check = true | |
163 | + break; | |
164 | + } | |
165 | + } | |
166 | + if (!check) { | |
167 | + vm.search.searchObjectList.push({ | |
168 | + key: "id", | |
169 | + key2: "dept_code", | |
170 | + type: "string", | |
171 | + value: check + "/" + vm.$store.state.loginUser.user_id, | |
172 | + value2: vm.$store.state.loginUser.dept_code, | |
173 | + }) | |
174 | + } | |
175 | + | |
176 | + axios({ | |
177 | + url: "/dataset/selectDataPostList.json", | |
178 | + method: "post", | |
179 | + headers: { | |
180 | + "Content-Type": "application/json; charset=UTF-8", | |
181 | + }, | |
182 | + data: JSON.stringify(vm.search), | |
183 | + }) | |
184 | + .then(function (response) { | |
185 | + if (response.data.checkMessage.success) { | |
186 | + vm.dataPostList = response.data.resultData.dataPostList; | |
187 | + vm.search.totalRows = response.data.resultData.totalRow; | |
188 | + } | |
189 | + }) | |
190 | + .catch(function (error) { | |
191 | + this.$showAlert( | |
192 | + "에러 발생", | |
193 | + "에러가 발생했습니다. 관리자에게 문의해 주세요." | |
194 | + ); | |
195 | + }); | |
196 | + }, | |
197 | + // 초기화 | |
198 | + init: async function () { | |
199 | + this.search.searchObjectList.push(this.search_date); | |
200 | + this.search.searchObjectList.push(this.search_data1); | |
201 | + this.search.searchObjectList.push(this.search_data2); | |
202 | + this.search.searchObjectList.push(this.search_data3); | |
203 | + this.categoryList = await this.$getCommonCode("DATA_CTGRY"); | |
204 | + }, | |
205 | + }, | |
206 | + computed: { | |
207 | + CodeList, | |
208 | + }, | |
209 | + components: { | |
210 | + CodeList: CodeList, | |
211 | + PageNavigation: PageNavigation, | |
212 | + PaginationButton: PaginationButton, | |
213 | + SvgIcon: SvgIcon, | |
214 | + }, | |
215 | + mounted() { | |
216 | + this.init(); | |
217 | + this.searchData(); | |
218 | + }, | |
219 | +}; | |
220 | +</script>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/integrated/DepartmentManagement.vue
+++ client/views/pages/integrated/DepartmentManagement.vue
... | ... | @@ -14,7 +14,8 @@ |
14 | 14 |
</div> |
15 | 15 |
<div class="content-zone overflow-y"> |
16 | 16 |
<ul class="tree-wrap" v-if="deptTreeList.length > 0"> |
17 |
- <TreeMenu v-for="(item, idx) in deptTreeList" :key="idx" :node="item" :currentDeptCode="selectedDept" @changeCurrent="fnSelectDept" /> |
|
17 |
+ <TreeMenu v-for="(item, idx) in deptTreeList" :key="idx" :node="item" :currentDeptCode="selectedDept" |
|
18 |
+ @changeCurrent="fnSelectDept" /> |
|
18 | 19 |
</ul> |
19 | 20 |
</div> |
20 | 21 |
</div> |
... | ... | @@ -38,8 +39,10 @@ |
38 | 39 |
<tr> |
39 | 40 |
<th>부서코드</th> |
40 | 41 |
<td style="display: flex"> |
41 |
- <input type="text" class="full-input" v-model="currentDept.dept_code" :disabled="editMode == 'update'" /> |
|
42 |
- <button style="flex-grow: 1" class="small-btn blue-border-btn" v-if="editMode == 'create'" @click="fnDeptCodeDupChk">중복확인</button> |
|
42 |
+ <input type="text" class="full-input" v-model="currentDept.dept_code" |
|
43 |
+ :disabled="editMode == 'update'" /> |
|
44 |
+ <button style="flex-grow: 1" class="small-btn blue-border-btn" v-if="editMode == 'create'" |
|
45 |
+ @click="fnDeptCodeDupChk">중복확인</button> |
|
43 | 46 |
</td> |
44 | 47 |
<th>부서명</th> |
45 | 48 |
<td> |
... | ... | @@ -54,7 +57,8 @@ |
54 | 57 |
<th>상위부서</th> |
55 | 58 |
<td style="display: flex"> |
56 | 59 |
<input type="text" class="full-input" v-model="currentDept.upper_dept_nm" readonly /> |
57 |
- <button style="flex-grow: 1" class="small-btn blue-border-btn" @click="fnOpenModalByDeptList">부서찾기</button> |
|
60 |
+ <button style="flex-grow: 1" class="small-btn blue-border-btn" |
|
61 |
+ @click="fnOpenModalByDeptList">부서찾기</button> |
|
58 | 62 |
</td> |
59 | 63 |
</tr> |
60 | 64 |
</tbody> |
... | ... | @@ -65,7 +69,8 @@ |
65 | 69 |
<button class="blue-btn small-btn" v-if="editMode == 'create'" @click="fnInsertDept">등록</button> |
66 | 70 |
<button class="blue-btn small-btn" v-else @click="fnUpdateDept">수정</button> |
67 | 71 |
<button class="red-border-btn small-btn" v-if="editMode == 'update'" @click="fnDeleteDept">삭제</button> |
68 |
- <button class="blue-border-btn small-btn" @click="fnCancelDept"><span v-if="editMode == 'create'">초기화</span><span v-else>취소</span></button> |
|
72 |
+ <button class="blue-border-btn small-btn" @click="fnCancelDept"><span |
|
73 |
+ v-if="editMode == 'create'">초기화</span><span v-else>취소</span></button> |
|
69 | 74 |
</div> |
70 | 75 |
<!-- 부서 내 사용자 목록 --> |
71 | 76 |
<DeptUserList :deptCode="selectedDept.id" /> |
... | ... | @@ -96,7 +101,8 @@ |
96 | 101 |
</select> |
97 | 102 |
</div> |
98 | 103 |
<div class="flex75 flex align-center no-gutter pr0"> |
99 |
- <input type="text" class="square-input flex90" placeholder="부서를 검색해주세요" v-model="searchDataByDept.value" @keyup.enter="fnSelectUpperDeptList" /> |
|
104 |
+ <input type="text" class="square-input flex90" placeholder="부서를 검색해주세요" v-model="searchDataByDept.value" |
|
105 |
+ @keyup.enter="fnSelectUpperDeptList" /> |
|
100 | 106 |
<button class="square-button blue-btn flex10" @click="fnSelectUpperDeptList"> |
101 | 107 |
<svg-icon type="mdi" :path="searchPath" class="square-icon"></svg-icon> |
102 | 108 |
</button> |
... | ... | @@ -123,7 +129,8 @@ |
123 | 129 |
<tr v-for="(item, idx) in selectDeptList" :key="idx" :class="{ red: item.isUsed == false }"> |
124 | 130 |
<td>{{ item.dept_code }}</td> |
125 | 131 |
<td>{{ item.dept_nm }}</td> |
126 |
- <td><button type="button" class="small-btn blue-border-btn" @click="fnSelectedUpperDept(item)">선택</button></td> |
|
132 |
+ <td><button type="button" class="small-btn blue-border-btn" |
|
133 |
+ @click="fnSelectedUpperDept(item)">선택</button></td> |
|
127 | 134 |
</tr> |
128 | 135 |
</template> |
129 | 136 |
<tr v-else> |
... | ... | @@ -385,16 +392,23 @@ |
385 | 392 |
|
386 | 393 |
// 부서 취소 |
387 | 394 |
fnCancelDept() { |
388 |
- this.editMode = 'create'; |
|
389 |
- this.currentDept = this.deptVO; |
|
390 |
- this.selectedDept = {}; |
|
391 |
- this.isDeptCodeDupChk = false; // 부서코드 중복확인 여부 |
|
395 |
+ if (this.$isEmpty(this.currentDept.dept_code) |
|
396 |
+ && this.$isEmpty(this.currentDept.dept_nm) |
|
397 |
+ && this.$isEmpty(this.currentDept.dept_dc) |
|
398 |
+ && this.$isEmpty(this.currentDept.upper_dept_nm)) { |
|
399 |
+ this.$showAlert("부서 정보", "입력한 정보가 없습니다."); |
|
400 |
+ } else{ |
|
401 |
+ this.editMode = 'create'; |
|
402 |
+ this.currentDept = this.deptVO; |
|
403 |
+ this.selectedDept = {}; |
|
404 |
+ this.isDeptCodeDupChk = false; // 부서코드 중복확인 여부 |
|
392 | 405 |
|
393 |
- // 사용자 목록 |
|
394 |
- this.userList = []; |
|
395 |
- this.userSelectList = []; |
|
396 |
- this.searchByUser = Object.assign({}, this.$getDefaultSerchVO()); |
|
397 |
- this.searchDataByUser = this.$getDefaultSerchItem(null, "string"); |
|
406 |
+ // 사용자 목록 |
|
407 |
+ this.userList = []; |
|
408 |
+ this.userSelectList = []; |
|
409 |
+ this.searchByUser = Object.assign({}, this.$getDefaultSerchVO()); |
|
410 |
+ this.searchDataByUser = this.$getDefaultSerchItem(null, "string"); |
|
411 |
+ }; |
|
398 | 412 |
}, |
399 | 413 |
|
400 | 414 |
// 부서 상세 조회 |
--- client/views/pages/integrated/department/DeptHostList.vue
+++ client/views/pages/integrated/department/DeptHostList.vue
... | ... | @@ -37,12 +37,13 @@ |
37 | 37 |
<template v-if="list.length > 0"> |
38 | 38 |
<tr v-for="(item, idx) of list" :key="idx"> |
39 | 39 |
<td> |
40 |
- <input type="checkbox" :value="item" v-model="selectList" @click.stop="" @change="fnChangeChk" /> |
|
40 |
+ <input type="checkbox" :value="item" v-model="selectList" @change="fnChangeChk" /> |
|
41 | 41 |
</td> |
42 | 42 |
<td>{{ search.totalRows - idx - (search.currentPage - 1) * search.perPage }}</td> |
43 | 43 |
<td>{{ item.hostNm }}</td> |
44 | 44 |
<td>{{ item.hostIp }}</td> |
45 |
- <td><button type="button" class="blue-border-btn small-btn" @click="fnOpenModal('addDrctry', item)">디렉토리관리</button></td> |
|
45 |
+ <td><button type="button" class="blue-border-btn small-btn" |
|
46 |
+ @click="fnOpenModal('addDrctry', item)">디렉토리관리</button></td> |
|
46 | 47 |
</tr> |
47 | 48 |
</template> |
48 | 49 |
<tr v-else> |
... | ... | @@ -50,7 +51,8 @@ |
50 | 51 |
</tr> |
51 | 52 |
</tbody> |
52 | 53 |
</table> |
53 |
- <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows" :maxRange="5" :click="selectDeptHost" /> |
|
54 |
+ <PaginationButton v-model:currentPage="search.currentPage" :perPage="search.perPage" :totalCount="search.totalRows" |
|
55 |
+ :maxRange="5" :click="selectDeptHost" /> |
|
54 | 56 |
</div> |
55 | 57 |
<div class="flex justify-end"> |
56 | 58 |
<button class="blue-btn small-btn" @click="fnOpenModal('addHost')">호스트추가</button> |
... | ... | @@ -78,7 +80,8 @@ |
78 | 80 |
</select> |
79 | 81 |
</div> |
80 | 82 |
<div class="flex75 flex align-center no-gutter pr0"> |
81 |
- <input type="text" class="square-input flex90" placeholder="검색어를 입력해주세요." v-model="modalSearchData.value" @keyup.enter="fnSelectHostList" /> |
|
83 |
+ <input type="text" class="square-input flex90" placeholder="검색어를 입력해주세요." v-model="modalSearchData.value" |
|
84 |
+ @keyup.enter="fnSelectHostList" /> |
|
82 | 85 |
<button class="square-button blue-btn flex10" @click="fnSelectHostList"> |
83 | 86 |
<svg-icon type="mdi" :path="searchPath" class="square-icon"></svg-icon> |
84 | 87 |
</button> |
... | ... | @@ -112,7 +115,8 @@ |
112 | 115 |
<td>{{ item.host_ip }}</td> |
113 | 116 |
<td>{{ item.host_id }}</td> |
114 | 117 |
<td>{{ item.host_port }}</td> |
115 |
- <td><button type="button" class="blue-border-btn set-btn" @click="fnAddHost(item.host_code)">선택</button></td> |
|
118 |
+ <td><button type="button" class="blue-border-btn set-btn" |
|
119 |
+ @click="fnAddHost(item.host_code)">선택</button></td> |
|
116 | 120 |
</tr> |
117 | 121 |
</template> |
118 | 122 |
<tr v-else> |
... | ... | @@ -120,7 +124,8 @@ |
120 | 124 |
</tr> |
121 | 125 |
</tbody> |
122 | 126 |
</table> |
123 |
- <PaginationButton v-model:currentPage="modalSearch.currentPage" :perPage="modalSearch.perPage" :totalCount="modalSearch.totalRows" :click="fnSelectHostList" /> |
|
127 |
+ <PaginationButton v-model:currentPage="modalSearch.currentPage" :perPage="modalSearch.perPage" |
|
128 |
+ :totalCount="modalSearch.totalRows" :click="fnSelectHostList" /> |
|
124 | 129 |
</div> |
125 | 130 |
</div> |
126 | 131 |
</div> |
... | ... | @@ -222,43 +227,51 @@ |
222 | 227 |
|
223 | 228 |
// 호스트 삭제 |
224 | 229 |
async fnDelete() { |
225 |
- const vm = this; |
|
226 |
- // 삭제 확인 |
|
227 |
- let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?"); |
|
228 |
- if (!isConfirmChk) { |
|
229 |
- return; |
|
230 |
- } |
|
231 |
- // 실행 |
|
232 |
- axios({ |
|
233 |
- url: "/deptHost", |
|
234 |
- method: "delete", |
|
235 |
- headers: { "Content-Type": "application/json; charset=UTF-8" }, |
|
236 |
- data: vm.selectList, |
|
237 |
- }) |
|
238 |
- .then(response => { |
|
239 |
- vm.$showAlert("작업 성공", "삭제에 성공했습니다."); |
|
240 |
- vm.fnSelectList(); // 목록 조회 |
|
230 |
+ if (this.deptCode !== null) { |
|
231 |
+ const vm = this; |
|
232 |
+ // 삭제 확인 |
|
233 |
+ let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?"); |
|
234 |
+ if (!isConfirmChk) { |
|
235 |
+ return; |
|
236 |
+ } |
|
237 |
+ // 실행 |
|
238 |
+ axios({ |
|
239 |
+ url: "/deptHost", |
|
240 |
+ method: "delete", |
|
241 |
+ headers: { "Content-Type": "application/json; charset=UTF-8" }, |
|
242 |
+ data: vm.selectList, |
|
241 | 243 |
}) |
242 |
- .catch(error => { |
|
243 |
- vm.$showAlert("작업 실패", "삭제에 실패했습니다.\n관리자에게 문의바랍니다."); |
|
244 |
- }); |
|
244 |
+ .then(response => { |
|
245 |
+ vm.$showAlert("작업 성공", "삭제에 성공했습니다."); |
|
246 |
+ vm.fnSelectList(); // 목록 조회 |
|
247 |
+ }) |
|
248 |
+ .catch(error => { |
|
249 |
+ vm.$showAlert("작업 실패", "삭제에 실패했습니다.\n관리자에게 문의바랍니다."); |
|
250 |
+ }); |
|
251 |
+ }else{ |
|
252 |
+ this.$showAlert("부서 선택", "부서를 선택해 주세요."); |
|
253 |
+ } |
|
245 | 254 |
}, |
246 | 255 |
|
247 | 256 |
/* 모달 */ |
248 | 257 |
// 모달 열기 |
249 | 258 |
fnOpenModal(type, data) { |
250 |
- switch (type) { |
|
251 |
- case "addHost": |
|
252 |
- // 목록 조회 |
|
253 |
- this.fnSelectHostList(); |
|
254 |
- // 모달 열기 |
|
255 |
- this.isModalOpen = true; |
|
256 |
- break; |
|
257 |
- case "addDrctry": |
|
258 |
- this.currentHost = data; |
|
259 |
- // 모달 열기 |
|
260 |
- this.isModalOpenForDrctry = true; |
|
261 |
- break; |
|
259 |
+ if (this.deptCode !== null) { |
|
260 |
+ switch (type) { |
|
261 |
+ case "addHost": |
|
262 |
+ // 목록 조회 |
|
263 |
+ this.fnSelectHostList(); |
|
264 |
+ // 모달 열기 |
|
265 |
+ this.isModalOpen = true; |
|
266 |
+ break; |
|
267 |
+ case "addDrctry": |
|
268 |
+ this.currentHost = data; |
|
269 |
+ // 모달 열기 |
|
270 |
+ this.isModalOpenForDrctry = true; |
|
271 |
+ break; |
|
272 |
+ } |
|
273 |
+ } else { |
|
274 |
+ this.$showAlert("부서 선택", "부서를 선택해 주세요."); |
|
262 | 275 |
} |
263 | 276 |
}, |
264 | 277 |
|
--- client/views/pages/integrated/department/DeptUserList.vue
+++ client/views/pages/integrated/department/DeptUserList.vue
... | ... | @@ -225,9 +225,9 @@ |
225 | 225 |
data: requestData, |
226 | 226 |
}) |
227 | 227 |
.then(response => { |
228 |
- if(response.data.resultData.moveCnt >= 1){ |
|
228 |
+ if (response.data.resultData.moveCnt >= 1) { |
|
229 | 229 |
vm.fnCloseModal(); |
230 |
- vm.$showAlert("부서 이동", "선택하신 사용자의 부서가 이동되었습니다."); |
|
230 |
+ vm.$showAlert("부서 이동", "선택하신 사용자의 부서가 이동되었습니다."); |
|
231 | 231 |
} |
232 | 232 |
}) |
233 | 233 |
.catch(error => { |
... | ... | @@ -315,38 +315,50 @@ |
315 | 315 |
|
316 | 316 |
// 사용자 삭제 |
317 | 317 |
async fnDelete() { |
318 |
- const vm = this; |
|
319 |
- // 삭제 확인 |
|
320 |
- let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?"); |
|
321 |
- if (!isConfirmChk) { |
|
322 |
- return; |
|
323 |
- } |
|
324 |
- // 실행 |
|
325 |
- axios({ |
|
326 |
- url: "/orgnztMember", |
|
327 |
- method: "delete", |
|
328 |
- headers: { "Content-Type": "application/json; charset=UTF-8" }, |
|
329 |
- data: vm.selectList, |
|
330 |
- }) |
|
331 |
- .then(function (response) { |
|
332 |
- vm.$showAlert("작업 성공", "사용자 삭제에 성공했습니다."); |
|
333 |
- vm.fnSelectList(); // 목록 조회 |
|
318 |
+ if (this.deptCode !== null) { |
|
319 |
+ const vm = this; |
|
320 |
+ // 삭제 확인 |
|
321 |
+ let isConfirmChk = await this.$showConfirm("경고", "선택한 데이터를 삭제하시겠습니까?"); |
|
322 |
+ if (!isConfirmChk) { |
|
323 |
+ return; |
|
324 |
+ } |
|
325 |
+ // 실행 |
|
326 |
+ axios({ |
|
327 |
+ url: "/orgnztMember", |
|
328 |
+ method: "delete", |
|
329 |
+ headers: { "Content-Type": "application/json; charset=UTF-8" }, |
|
330 |
+ data: vm.selectList, |
|
334 | 331 |
}) |
335 |
- .catch(function (error) { |
|
336 |
- vm.$showAlert("작업 실패", "사용자 삭제에 실패했습니다.\n관리자에게 문의바랍니다."); |
|
337 |
- }); |
|
332 |
+ .then(function (response) { |
|
333 |
+ vm.$showAlert("작업 성공", "사용자 삭제에 성공했습니다."); |
|
334 |
+ vm.fnSelectList(); // 목록 조회 |
|
335 |
+ }) |
|
336 |
+ .catch(function (error) { |
|
337 |
+ vm.$showAlert("작업 실패", "사용자 삭제에 실패했습니다.\n관리자에게 문의바랍니다."); |
|
338 |
+ }); |
|
339 |
+ }else{ |
|
340 |
+ this.$showAlert("부서 선택", "부서를 선택해 주세요."); |
|
341 |
+ } |
|
338 | 342 |
}, |
339 | 343 |
|
340 | 344 |
/* 모달 */ |
341 | 345 |
// 사용자 모달 열기 |
342 | 346 |
fnOpenModal() { |
343 |
- this.fnSelectModalList(); // 목록 조회 |
|
344 |
- this.isModalOpen = "user"; |
|
347 |
+ if (this.deptCode !== null) { |
|
348 |
+ this.fnSelectModalList(); // 목록 조회 |
|
349 |
+ this.isModalOpen = "user"; |
|
350 |
+ }else{ |
|
351 |
+ this.$showAlert("부서 선택", "부서를 선택해 주세요."); |
|
352 |
+ } |
|
345 | 353 |
}, |
346 | 354 |
// 부서 모달 열기 |
347 | 355 |
fnOpenModalDept() { |
348 |
- this.fnSelectDeptListForTree(); // 목록 조회 |
|
349 |
- this.isModalOpen = "dept"; |
|
356 |
+ if (this.deptCode !== null) { |
|
357 |
+ this.fnSelectDeptListForTree(); // 목록 조회 |
|
358 |
+ this.isModalOpen = "dept"; |
|
359 |
+ }else{ |
|
360 |
+ this.$showAlert("부서 선택", "부서를 선택해 주세요."); |
|
361 |
+ } |
|
350 | 362 |
}, |
351 | 363 |
|
352 | 364 |
// 모달 닫기 |
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?