
--- client/resources/css/common.css
+++ client/resources/css/common.css
... | ... | @@ -107,6 +107,11 @@ |
107 | 107 |
grid-row: 4/6; |
108 | 108 |
} |
109 | 109 |
|
110 |
+.combine-right-government3 { |
|
111 |
+ grid-column: 4/5; |
|
112 |
+ grid-row: 2/span 4; |
|
113 |
+} |
|
114 |
+ |
|
110 | 115 |
.combine-top-government { |
111 | 116 |
grid-row: 1/3; |
112 | 117 |
} |
--- client/resources/css/main.css
+++ client/resources/css/main.css
... | ... | @@ -642,6 +642,22 @@ |
642 | 642 |
background: #e26f49; |
643 | 643 |
} |
644 | 644 |
|
645 |
+.calendar-data { |
|
646 |
+ margin-top: 1rem; |
|
647 |
+} |
|
648 |
+ |
|
649 |
+.calendar-data >div:first-child { |
|
650 |
+ margin-bottom: .5rem; |
|
651 |
+} |
|
652 |
+ |
|
653 |
+@media all and (min-width: 479px) { |
|
654 |
+ .calendar-data { |
|
655 |
+ display: flex; |
|
656 |
+ justify-content: space-between; |
|
657 |
+ padding: 0 1rem; |
|
658 |
+ } |
|
659 |
+} |
|
660 |
+ |
|
645 | 661 |
.weather-info |
646 | 662 |
|
647 | 663 |
/* 보호자 복약 */ |
--- client/views/component/Calendar.jsx
+++ client/views/component/Calendar.jsx
... | ... | @@ -17,152 +17,25 @@ |
17 | 17 |
const state = useSelector((state) => { return state }); |
18 | 18 |
const defaultUserId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['user_id']; |
19 | 19 |
|
20 |
- const [modalOpen, setModalOpen] = React.useState(false); |
|
21 |
- const openModal = () => { |
|
22 |
- setModalOpen(true); |
|
23 |
- }; |
|
24 |
- const closeModal = () => { |
|
25 |
- setModalOpen(false); |
|
26 |
- }; |
|
27 |
- |
|
28 |
- //방문 기록 정보 |
|
29 |
- const [visitRecordList, setVisitRecordList] = React.useState({}); |
|
30 |
- const visitRecordInit = { |
|
31 |
- 'senior_id': data['senior']['senior_id'], |
|
32 |
- 'visit_date': CommonUtil.getDate(), |
|
33 |
- 'visit_reason': null, |
|
34 |
- 'visit_content': null, |
|
35 |
- |
|
36 |
- 'agent_id': defaultUserId, |
|
37 |
- |
|
38 |
- isInsert: true, |
|
39 |
- }; |
|
40 |
- const [visitRecord, setVisitRecord] = React.useState({ ...visitRecordInit }); |
|
41 |
- const visitRecordRef = React.useRef({ ...visitRecordInit }); |
|
42 |
- |
|
43 |
- /****************** 방문 기록 (시작) ******************/ |
|
44 |
- //방문 기록 목록 조회 |
|
45 |
- const visitRecordSelectList = () => { |
|
46 |
- fetch("/welfare/visitRecordSelectList.json", { |
|
47 |
- method: "POST", |
|
48 |
- headers: { |
|
49 |
- 'Content-Type': 'application/json; charset=UTF-8' |
|
50 |
- }, |
|
51 |
- body: JSON.stringify(data['senior']), |
|
52 |
- }).then((response) => response.json()).then((data) => { |
|
53 |
- console.log("방문 기록 목록 조회 결과(건수) : ", data); |
|
54 |
- data.search = visitRecordList.search; |
|
55 |
- setVisitRecordList(data['visitRecordList']); |
|
56 |
- }).catch((error) => { |
|
57 |
- console.log('visitRecordSelectList() /user/visitRecordSelectList.json error : ', error); |
|
58 |
- }); |
|
59 |
- } |
|
60 |
- |
|
61 |
- //방문 기록 유효성 검사 |
|
62 |
- const visitRecordValidation = () => { |
|
63 |
- const target = visitRecord; |
|
64 |
- const targetRef = visitRecordRef; |
|
65 |
- |
|
66 |
- if (CommonUtil.isEmpty(target['visit_date']) == true) { |
|
67 |
- targetRef.current['visit_date'].focus(); |
|
68 |
- alert("방문 일자를 선택해 주세요."); |
|
69 |
- return false; |
|
70 |
- } |
|
71 |
- if (CommonUtil.isEmpty(target['visit_reason']) == true) { |
|
72 |
- targetRef.current['visit_reason'].focus(); |
|
73 |
- alert("방문 목적을 선택해 주세요."); |
|
74 |
- return false; |
|
75 |
- } |
|
76 |
- if (CommonUtil.isEmpty(target['visit_content']) == true) { |
|
77 |
- targetRef.current['visit_content'].focus(); |
|
78 |
- alert("방문 상세 사유를 입력해 주세요."); |
|
79 |
- return false; |
|
80 |
- } |
|
81 |
- |
|
82 |
- return true; |
|
83 |
- } |
|
84 |
- |
|
85 |
- //방문 기록 수정 |
|
86 |
- const visitRecordUpdate = () => { |
|
87 |
- if (visitRecordValidation() == false) { |
|
88 |
- return; |
|
89 |
- } |
|
90 |
- |
|
91 |
- visitRecord['senior_id'] = location.state['senior_id']; |
|
92 |
- visitRecord['agent_id'] = defaultUserId; |
|
93 |
- setVisitRecord({ ...visitRecord }); |
|
94 |
- |
|
95 |
- fetch("/welfare/visitRecordUpdate.json", { |
|
96 |
- method: "POST", |
|
97 |
- headers: { |
|
98 |
- 'Content-Type': 'application/json; charset=UTF-8' |
|
99 |
- }, |
|
100 |
- body: JSON.stringify(visitRecord), |
|
101 |
- }).then((response) => response.json()).then((data) => { |
|
102 |
- console.log("방문 기록 수정 결과(건수) : ", data); |
|
103 |
- if (data > 0) { |
|
104 |
- setVisitRecordInit(); |
|
105 |
- visitRecordSelectList(); |
|
106 |
- closeModal(); |
|
107 |
- alert("수정완료"); |
|
108 |
- } else { |
|
109 |
- alert("수정에 실패하였습니다. 관리자에게 문의바랍니다."); |
|
110 |
- } |
|
111 |
- }).catch((error) => { |
|
112 |
- console.log('visitRecordUpdate() /welfare/visitRecordUpdate.json error : ', error); |
|
113 |
- }); |
|
114 |
- } |
|
115 |
- |
|
116 |
- //방문 기록 삭제 |
|
117 |
- const visitRecordDelete = () => { |
|
118 |
- if (confirm('방문 기록 정보를 삭제하시겠습니까?') == false) { |
|
119 |
- return; |
|
120 |
- } |
|
121 |
- |
|
122 |
- fetch("/welfare/visitRecordDelete.json", { |
|
123 |
- method: "POST", |
|
124 |
- headers: { |
|
125 |
- 'Content-Type': 'application/json; charset=UTF-8' |
|
126 |
- }, |
|
127 |
- body: JSON.stringify(visitRecord), |
|
128 |
- }).then((response) => response.json()).then((data) => { |
|
129 |
- console.log("방문 기록 삭제 결과(건수) : ", data); |
|
130 |
- if (data > 0) { |
|
131 |
- setVisitRecordInit(); |
|
132 |
- visitRecordSelectList(); |
|
133 |
- closeModal(); |
|
134 |
- alert("삭제완료"); |
|
135 |
- } else { |
|
136 |
- alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다."); |
|
137 |
- } |
|
138 |
- }).catch((error) => { |
|
139 |
- console.log('visitRecordDelete() /welfare/visitRecordDelete.json error : ', error); |
|
140 |
- }); |
|
141 |
- } |
|
142 |
- |
|
143 |
- //초기화 취소 |
|
144 |
- const setVisitRecordInit = () => { |
|
145 |
- setVisitRecord({ ...visitRecordInit }); |
|
146 |
- } |
|
147 |
- |
|
148 |
- React.useEffect(() => { |
|
149 |
- visitRecordSelectList(); |
|
150 |
- }, []); |
|
151 |
- |
|
152 | 20 |
const [value, setValue] = useState(new Date()); |
153 | 21 |
//const mark = ["12-04-2023", "21-04-2023", "05-04-2023", "02-04-2023"]; |
154 | 22 |
//const mark = ["2023-04-12", "2023-06-12"]; |
155 | 23 |
|
24 |
+ const Temperature = (date) => { |
|
25 |
+ let todayTemperature = []; |
|
26 |
+ data['temperature'].map((item, idx) => { |
|
27 |
+ if (item['xName'] === date['date']) { |
|
28 |
+ todayTemperature.push(item['temperature']); |
|
29 |
+ } |
|
30 |
+ }) |
|
31 |
+ return ( |
|
32 |
+ <p>{todayTemperature[0]}</p> |
|
33 |
+ ) |
|
34 |
+ } |
|
35 |
+ |
|
156 | 36 |
const mark = []; |
157 |
- if (CommonUtil.isEmpty(state.loginUser) == false |
|
158 |
- && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN') { |
|
159 |
- for (let i = 0; i < visitRecordList.length; i++) { |
|
160 |
- mark.push(visitRecordList[i]['visit_date']); |
|
161 |
- } |
|
162 |
- } else { |
|
163 |
- for (let i = 0; i < data['visitRecordList'].length; i++) { |
|
164 |
- mark.push(data['visitRecordList'][i]['visit_date']); |
|
165 |
- } |
|
37 |
+ for (let i = 0; i < data.visitRecordList.length; i++) { |
|
38 |
+ mark.push(data.visitRecordList[i]['visit_date']); |
|
166 | 39 |
} |
167 | 40 |
|
168 | 41 |
return ( |
... | ... | @@ -176,27 +49,18 @@ |
176 | 49 |
} |
177 | 50 |
}} |
178 | 51 |
onClickDay={(date, event) => { |
179 |
- if (mark.find((x) => x === moment(date).format("YYYY-MM-DD"))) { |
|
180 |
- if (CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN') { |
|
181 |
- visitRecordList.map((item, idx) => { |
|
182 |
- if (item['visit_date'] === moment(date).format("YYYY-MM-DD")) { |
|
183 |
- setVisitRecord(item); openModal(); |
|
184 |
- } |
|
185 |
- }) |
|
52 |
+ data.visitRecordList.map((item, idx) => { |
|
53 |
+ if (item['visit_date'] === moment(date).format("YYYY-MM-DD")) { |
|
54 |
+ data.onClick(moment(date).format("YYYY-MM-DD"), item); |
|
186 | 55 |
} else { |
187 |
- data['visitRecordList'].map((item, idx) => { |
|
188 |
- if (item['visit_date'] === moment(date).format("YYYY-MM-DD")) { |
|
189 |
- setVisitRecord(item); openModal(); |
|
190 |
- } |
|
191 |
- } |
|
192 |
- ) |
|
56 |
+ data.onClick(moment(date).format("YYYY-MM-DD")); |
|
193 | 57 |
} |
194 |
- } |
|
58 |
+ }) |
|
195 | 59 |
}} |
196 | 60 |
tileContent={({ date, view }) => { |
197 | 61 |
return ( |
198 | 62 |
<> |
199 |
- <div className="flex justify-center items-center absoluteDiv"> |
|
63 |
+ <div className="calendar-data"> |
|
200 | 64 |
<div> |
201 | 65 |
<p><small>복약량</small></p> |
202 | 66 |
{data['medication'].map((item, idx) => { |
... | ... | @@ -206,98 +70,16 @@ |
206 | 70 |
})} |
207 | 71 |
</div> |
208 | 72 |
<div> |
209 |
- <p><small>온도(℃)</small></p> |
|
210 |
- {data['temperature'].map((item, idx) => { |
|
211 |
- return ( |
|
212 |
- item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '02:00' ? item['temperature'] + '/' : null |
|
213 |
- ) |
|
214 |
- })} |
|
215 |
- {data['temperature'].map((item, idx) => { |
|
216 |
- return ( |
|
217 |
- item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '10:00' ? item['temperature'] + '/' : null |
|
218 |
- ) |
|
219 |
- })} |
|
220 |
- {data['temperature'].map((item, idx) => { |
|
221 |
- return ( |
|
222 |
- item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '14:00' ? item['temperature'] + '/' : null |
|
223 |
- ) |
|
224 |
- })} |
|
225 |
- {data['temperature'].map((item, idx) => { |
|
226 |
- return ( |
|
227 |
- item['xName'] === moment(date).format("YYYY-MM-DD") && item['time'] == '23:00' ? item['temperature'] : null |
|
228 |
- ) |
|
229 |
- })} |
|
73 |
+ <div> |
|
74 |
+ <p><small>온도(℃)</small></p> |
|
75 |
+ <Temperature date={moment(date).format("YYYY-MM-DD")} /> |
|
76 |
+ </div> |
|
230 | 77 |
</div> |
231 | 78 |
</div> |
232 | 79 |
</> |
233 | 80 |
); |
234 | 81 |
}} |
235 | 82 |
/> |
236 |
- <Modal open={modalOpen} close={closeModal} header="방문 정보 관리"> |
|
237 |
- <div className="board-wrap"> |
|
238 |
- <table className="flex70 margin-bottom">{/* questionnaire-table */} |
|
239 |
- <tbody> |
|
240 |
- <tr> |
|
241 |
- <th>방문날짜</th> |
|
242 |
- <td colSpan={3}> |
|
243 |
- <input type="date" value={visitRecord['visit_date']} |
|
244 |
- onChange={(e) => { |
|
245 |
- visitRecord['visit_date'] = e.target.value; |
|
246 |
- setVisitRecord({ ...visitRecord }); |
|
247 |
- }} |
|
248 |
- ref={el => visitRecordRef.current['visit_date'] = el} |
|
249 |
- disabled={CommonUtil.isEmpty(state.loginUser) == false && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN' ? |
|
250 |
- false : true} |
|
251 |
- /> |
|
252 |
- </td> |
|
253 |
- </tr> |
|
254 |
- <tr> |
|
255 |
- <th>방문목적</th> |
|
256 |
- <td> |
|
257 |
- <select onChange={(e) => { |
|
258 |
- visitRecord['visit_reason'] = e.target.value; |
|
259 |
- setVisitRecord({ ...visitRecord }); |
|
260 |
- }} |
|
261 |
- ref={el => visitRecordRef.current['visit_reason'] = el} |
|
262 |
- disabled={CommonUtil.isEmpty(state.loginUser) == false |
|
263 |
- && state.loginUser['authority'] == 'ROLE_AGENCY' ? |
|
264 |
- false : true} |
|
265 |
- > |
|
266 |
- <option value="" selected={CommonUtil.isEmpty(visitRecord['visit_reason'])}>방문목적선택</option> |
|
267 |
- <option value="정기방문" selected={visitRecord['visit_reason'] == "정기방문"}>정기방문</option> |
|
268 |
- <option value="어르신케어" selected={visitRecord['visit_reason'] == "어르신케어"}>어르신케어</option> |
|
269 |
- <option value="장비점검" selected={visitRecord['visit_reason'] == "장비점검"}>장비점검</option> |
|
270 |
- <option value="정기방문" selected={visitRecord['visit_reason'] == "기타"}>기타</option> |
|
271 |
- </select> |
|
272 |
- </td> |
|
273 |
- </tr> |
|
274 |
- <tr> |
|
275 |
- <th>방문 상세 사유</th> |
|
276 |
- <td colSpan={3}> |
|
277 |
- <textarea className="medicine" style={{ height: "225px" }} name="" id="" cols="30" rows="10" |
|
278 |
- value={visitRecord['visit_content']} |
|
279 |
- onChange={(e) => { |
|
280 |
- visitRecord['visit_content'] = e.target.value; |
|
281 |
- setVisitRecord({ ...visitRecord }); |
|
282 |
- }} |
|
283 |
- ref={el => visitRecordRef.current['visit_content'] = el} |
|
284 |
- disabled={CommonUtil.isEmpty(state.loginUser) == false |
|
285 |
- && state.loginUser['authority'] == 'ROLE_AGENCY' ? |
|
286 |
- false : true} |
|
287 |
- ></textarea> |
|
288 |
- </td> |
|
289 |
- </tr> |
|
290 |
- </tbody> |
|
291 |
- </table> |
|
292 |
- {CommonUtil.isEmpty(state.loginUser) == false |
|
293 |
- && state.loginUser['authority'] == 'ROLE_AGENCY' || state.loginUser['authority'] == 'ROLE_AGENCYADMIN' ? ( |
|
294 |
- <div className="flex-center"> |
|
295 |
- <button className="btn-small red-btn" onClick={visitRecordUpdate}>수정</button> |
|
296 |
- <button className="btn-small red-btn" onClick={visitRecordDelete}>삭제</button> |
|
297 |
- </div> |
|
298 |
- ) : null} |
|
299 |
- </div> |
|
300 |
- </Modal> |
|
301 | 83 |
</> |
302 | 84 |
); |
303 | 85 |
} |
+++ client/views/component/chart/Chart5_agencyadmin.jsx
... | ... | @@ -0,0 +1,70 @@ |
1 | +import React, { Component } from "react"; | |
2 | +import * as am5 from "@amcharts/amcharts5"; | |
3 | +import * as am5percent from "@amcharts/amcharts5/percent"; | |
4 | +import am5themes_Animated from "@amcharts/amcharts5/themes/Animated"; | |
5 | +import CommonUtil from "../../../resources/js/CommonUtil"; | |
6 | + | |
7 | + | |
8 | +export default function Chart5({ data }) { | |
9 | + const createChart = () => { | |
10 | + console.log('createChart data : ', data); | |
11 | + let root = am5.Root.new("Chart5"); | |
12 | + | |
13 | + // Set themes | |
14 | + // https://www.amcharts.com/docs/v5/concepts/themes/ | |
15 | + root.setThemes([ | |
16 | + am5themes_Animated.new(root) | |
17 | + ]); | |
18 | + | |
19 | + | |
20 | + // Create chart | |
21 | + // https://www.amcharts.com/docs/v5/charts/percent-charts/sliced-chart/ | |
22 | + let chart = root.container.children.push(am5percent.SlicedChart.new(root, { | |
23 | + layout: root.verticalLayout | |
24 | + })); | |
25 | + | |
26 | + | |
27 | + // Create series | |
28 | + // https://www.amcharts.com/docs/v5/charts/percent-charts/sliced-chart/#Series | |
29 | + let series = chart.series.push(am5percent.PictorialStackedSeries.new(root, { | |
30 | + alignLabels: true, | |
31 | + orientation: "vertical", | |
32 | + valueField: "count", | |
33 | + categoryField: "agency_name", | |
34 | + svgPath: "M53.5,476c0,14,6.833,21,20.5,21s20.5-7,20.5-21V287h21v189c0,14,6.834,21,20.5,21 c13.667,0,20.5-7,20.5-21V154h10v116c0,7.334,2.5,12.667,7.5,16s10.167,3.333,15.5,0s8-8.667,8-16V145c0-13.334-4.5-23.667-13.5-31 s-21.5-11-37.5-11h-82c-15.333,0-27.833,3.333-37.5,10s-14.5,17-14.5,31v133c0,6,2.667,10.333,8,13s10.5,2.667,15.5,0s7.5-7,7.5-13 V154h10V476 M61.5,42.5c0,11.667,4.167,21.667,12.5,30S92.333,85,104,85s21.667-4.167,30-12.5S146.5,54,146.5,42 c0-11.335-4.167-21.168-12.5-29.5C125.667,4.167,115.667,0,104,0S82.333,4.167,74,12.5S61.5,30.833,61.5,42.5z" | |
35 | + })); | |
36 | + | |
37 | + series.labelsContainer.set("width", 100); | |
38 | + series.ticks.template.set("location", 0.6); | |
39 | + | |
40 | + | |
41 | + // Set data | |
42 | + // https://www.amcharts.com/docs/v5/charts/percent-charts/sliced-chart/#Setting_data | |
43 | + /*series.data.setAll([ | |
44 | + { value: 10, category: "A복지관" }, | |
45 | + { value: 9, category: "B복지관" }, | |
46 | + { value: 6, category: "C복지관" }, | |
47 | + { value: 5, category: "D복지관" }, | |
48 | + { value: 4, category: "E복지관" }, | |
49 | + ]);*/ | |
50 | + series.data.setAll(data); | |
51 | + | |
52 | + | |
53 | + // Play initial series animation | |
54 | + // https://www.amcharts.com/docs/v5/concepts/animations/#Animation_of_series | |
55 | + chart.appear(1000, 100); | |
56 | + // end am5.ready() | |
57 | + } | |
58 | + | |
59 | + React.useEffect(() => { | |
60 | + console.log('React.useEffect data : ', data); | |
61 | + if (CommonUtil.isEmpty(data) == false) { | |
62 | + createChart(); | |
63 | + } | |
64 | + }, [data]) | |
65 | + | |
66 | + return ( | |
67 | + <div id="Chart5" style={{ width: "100%", height: "80%" }}></div> | |
68 | + ) | |
69 | + | |
70 | +}(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/App.jsx
+++ client/views/pages/App.jsx
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 |
import { useLocation, /* useNavigate */ } from "react-router"; |
9 | 9 |
|
10 | 10 |
//Application의 전역 상태값(변수) 저장소(Store) 관리 Component |
11 |
-import { setLoginUser, setSeniorList } from "./AppStore.jsx"; |
|
11 |
+import { setLoginUser, setSeniorList, setCurrentSeniorIndex } from "./AppStore.jsx"; |
|
12 | 12 |
|
13 | 13 |
//Application의 Route 정보를 관리하는 Component |
14 | 14 |
import {AdminApp, GovernmentApp, AgencyApp, AgencyAdminApp, GuardianApp} from "./AppRoute.jsx"; |
... | ... | @@ -211,7 +211,7 @@ |
211 | 211 |
}).then((response) => response.json()).then((data) => { |
212 | 212 |
console.log("특정 보호자의 대상자(시니어) 목록 조회 : ", data); |
213 | 213 |
//로그인 사용자 정보 전역 변수에 저장 |
214 |
- dispatch(setSeniorList(data)); |
|
214 |
+ dispatch(setSeniorList({value: data})); |
|
215 | 215 |
}).catch((error) => { |
216 | 216 |
console.log('login() /user/seniorSelectListByGuardian.json error : ', error); |
217 | 217 |
}); |
... | ... | @@ -244,7 +244,7 @@ |
244 | 244 |
} else if (loginResultData['authority'] == 'ROLE_GUARDIAN' || loginResultData['authority'] == 'ROLE_SENIOR') { |
245 | 245 |
setMenuItems(GuardianApp.menuItems); |
246 | 246 |
setAppRoute(<GuardianApp.AppRoute/>); |
247 |
- if (CommonUtil.isEmpty(state.seniorList) == true) { |
|
247 |
+ if (loginResultData['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == true) { |
|
248 | 248 |
seniorSelectListByGuardian(loginResultData); |
249 | 249 |
} |
250 | 250 |
} else { |
... | ... | @@ -261,6 +261,9 @@ |
261 | 261 |
} else { |
262 | 262 |
setIsPush(null); |
263 | 263 |
setToken(null); |
264 |
+ dispatch(setLoginUser({})); |
|
265 |
+ dispatch(setSeniorList({value: []})); |
|
266 |
+ dispatch(setCurrentSeniorIndex({value: 0})); |
|
264 | 267 |
} |
265 | 268 |
}); |
266 | 269 |
}, [location]); |
--- client/views/pages/AppRoute.jsx
+++ client/views/pages/AppRoute.jsx
... | ... | @@ -471,11 +471,11 @@ |
471 | 471 |
path: "/", |
472 | 472 |
icon: <HouseIcon sx={{ fontSize: 20, marginRight: 1 }} />, |
473 | 473 |
}, |
474 |
- { |
|
475 |
- title: "그래프로 보기", |
|
476 |
- path: "/GuardianStatistics", |
|
477 |
- icon: <EqualizerIcon sx={{ fontSize: 20, marginRight: 1 }} />, |
|
478 |
- }, |
|
474 |
+ // { |
|
475 |
+ // title: "그래프로 보기", |
|
476 |
+ // path: "/GuardianStatistics", |
|
477 |
+ // icon: <EqualizerIcon sx={{ fontSize: 20, marginRight: 1 }} />, |
|
478 |
+ // }, |
|
479 | 479 |
{ |
480 | 480 |
title: "문의하기", |
481 | 481 |
path: "/QandASelect", |
--- client/views/pages/AppStore.jsx
+++ client/views/pages/AppStore.jsx
... | ... | @@ -19,12 +19,11 @@ |
19 | 19 |
//특정 로그인 유저의 대상자(시니어)목록 정보 |
20 | 20 |
const seniorList = createSlice({ |
21 | 21 |
name: 'createSlice', |
22 |
- initialState: [], |
|
22 |
+ initialState: {value: []}, |
|
23 | 23 |
reducers: { |
24 | 24 |
setSeniorList(stats, action) { |
25 |
- for (let key in action.payload) { |
|
26 |
- stats[key] = action.payload[key]; |
|
27 |
- } |
|
25 |
+ //console.log("seniorList createSlice stats.value : ", stats.value, ", action.payload.value : ", action.payload.value); |
|
26 |
+ stats.value = action.payload.value; |
|
28 | 27 |
} |
29 | 28 |
} |
30 | 29 |
}) |
... | ... | @@ -35,12 +34,14 @@ |
35 | 34 |
//특정 로그인 유저가 지정한 조회 할 대상자(시니어) Index |
36 | 35 |
const currentSeniorIndex = createSlice({ |
37 | 36 |
name: 'createSlice', |
38 |
- initialState: 0, |
|
37 |
+ initialState: {value: 0}, |
|
39 | 38 |
reducers: { |
40 | 39 |
setCurrentSeniorIndex(stats, action) { |
41 |
- for (let key in action.payload) { |
|
40 |
+ /* for (let key in action.payload) { |
|
42 | 41 |
stats[key] = action.payload[key]; |
43 |
- } |
|
42 |
+ } */ |
|
43 |
+ //console.log("stats : ", stats.value, ", action.payload : ", action.payload.value); |
|
44 |
+ stats.value = action.payload.value; |
|
44 | 45 |
} |
45 | 46 |
} |
46 | 47 |
}) |
--- client/views/pages/callcenter/QandAInsert.jsx
+++ client/views/pages/callcenter/QandAInsert.jsx
... | ... | @@ -10,23 +10,25 @@ |
10 | 10 |
import CommonUtil from "../../../resources/js/CommonUtil.js"; |
11 | 11 |
|
12 | 12 |
export default function QandAInsert() { |
13 |
- const navigate = useNavigate(); |
|
14 |
- const location = useLocation(); |
|
13 |
+ const navigate = useNavigate(); |
|
14 |
+ const location = useLocation(); |
|
15 | 15 |
|
16 |
- //전역 변수 저장 객체 |
|
17 |
- const state = useSelector((state) => {return state}); |
|
18 |
- const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id']; |
|
19 |
- const defaultAgencyId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id']; |
|
20 |
- let defaultSeniorId = null; |
|
21 |
- if (CommonUtil.isEmpty(state.loginUser) == false) { |
|
22 |
- if (state.loginUser['authority'] == 'ROLE_SENIOR') { |
|
23 |
- defaultSeniorId = state.loginUser['user_id']; |
|
24 |
- } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state.seniorList) == false) { |
|
25 |
- defaultSeniorId = state.seniorList[state.currentSeniorIndex]['user_id']; |
|
26 |
- } |
|
27 |
- } else { |
|
28 |
- defaultSeniorId = null; |
|
29 |
- } |
|
16 |
+ //전역 변수 저장 객체 |
|
17 |
+ const state = useSelector((state) => {return state}); |
|
18 |
+ const defaultGovernmentId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['government_id']; |
|
19 |
+ const defaultAgencyId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['agency_id']; |
|
20 |
+ let defaultSeniorId = null; |
|
21 |
+ if (CommonUtil.isEmpty(state.loginUser) == false) { |
|
22 |
+ if (state.loginUser['authority'] == 'ROLE_SENIOR') { |
|
23 |
+ defaultSeniorId = state.loginUser['user_id']; |
|
24 |
+ } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == false) { |
|
25 |
+ defaultSeniorId = state['seniorList'].value[state.currentSeniorIndex.value]['user_id']; |
|
26 |
+ } |
|
27 |
+ } else { |
|
28 |
+ defaultSeniorId = null; |
|
29 |
+ } |
|
30 |
+ |
|
31 |
+ console.log('defaultSeniorId : ', defaultSeniorId); |
|
30 | 32 |
|
31 | 33 |
// 시스템 코드 - 장비 상태 |
32 | 34 |
const [equipmentStates, setEquipmentStates] = React.useState({}); |
--- client/views/pages/callcenter/QandASelectOne.jsx
+++ client/views/pages/callcenter/QandASelectOne.jsx
... | ... | @@ -21,8 +21,8 @@ |
21 | 21 |
if (CommonUtil.isEmpty(state.loginUser) == false) { |
22 | 22 |
if (state.loginUser['authority'] == 'ROLE_SENIOR') { |
23 | 23 |
defaultSeniorId = state.loginUser['user_id']; |
24 |
- } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state.seniorList) == false) { |
|
25 |
- defaultSeniorId = state.seniorList[state.currentSeniorIndex]['user_id']; |
|
24 |
+ } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == false) { |
|
25 |
+ defaultSeniorId = state['seniorList'].value[state.currentSeniorIndex.value]['user_id']; |
|
26 | 26 |
} |
27 | 27 |
} else { |
28 | 28 |
defaultSeniorId = null; |
--- client/views/pages/callcenter/QandAUpdate.jsx
+++ client/views/pages/callcenter/QandAUpdate.jsx
... | ... | @@ -21,8 +21,8 @@ |
21 | 21 |
if (CommonUtil.isEmpty(state.loginUser) == false) { |
22 | 22 |
if (state.loginUser['authority'] == 'ROLE_SENIOR') { |
23 | 23 |
defaultSeniorId = state.loginUser['user_id']; |
24 |
- } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state.seniorList) == false) { |
|
25 |
- defaultSeniorId = state.seniorList[state.currentSeniorIndex]['user_id']; |
|
24 |
+ } else if (state.loginUser['authority'] == 'ROLE_GUARDIAN' && CommonUtil.isEmpty(state['seniorList'].value) == false) { |
|
25 |
+ defaultSeniorId = state['seniorList'].value[state.currentSeniorIndex.value]['user_id']; |
|
26 | 26 |
} |
27 | 27 |
} else { |
28 | 28 |
defaultSeniorId = null; |
--- client/views/pages/healthcare/Healthcare.jsx
+++ client/views/pages/healthcare/Healthcare.jsx
... | ... | @@ -171,9 +171,9 @@ |
171 | 171 |
chartData['time'] = data[i]['temperature_time']; |
172 | 172 |
|
173 | 173 |
if (data[i]['temperature_date'].substr(5, 2) >= 11 || data[i]['temperature_date'].substr(5, 2) <= 2) { |
174 |
- _stackTemperatureData.unshift(chartData); |
|
175 |
- } else { |
|
176 | 174 |
_stackTemperatureData.push(chartData); |
175 |
+ } else { |
|
176 |
+ _stackTemperatureData.unshift(chartData); |
|
177 | 177 |
} |
178 | 178 |
} |
179 | 179 |
|
--- client/views/pages/healthcare/HealthcareSelectOne.jsx
+++ client/views/pages/healthcare/HealthcareSelectOne.jsx
... | ... | @@ -176,6 +176,18 @@ |
176 | 176 |
|
177 | 177 |
//방문 기록 정보 |
178 | 178 |
const [visitRecordList, setVisitRecordList] = React.useState({}); |
179 |
+ const visitRecordInit = { |
|
180 |
+ 'senior_id': location.state['senior_id'], |
|
181 |
+ 'visit_date': CommonUtil.getDate(), |
|
182 |
+ 'visit_reason': null, |
|
183 |
+ 'visit_content': null, |
|
184 |
+ |
|
185 |
+ 'agent_id': defaultUserId, |
|
186 |
+ |
|
187 |
+ isInsert: true, |
|
188 |
+ }; |
|
189 |
+ |
|
190 |
+ |
|
179 | 191 |
//방문 기록 목록 조회 |
180 | 192 |
const visitRecordSelectList = (seniorNum) => { |
181 | 193 |
fetch("/welfare/visitRecordSelectList.json", { |
... | ... | @@ -195,16 +207,6 @@ |
195 | 207 |
|
196 | 208 |
|
197 | 209 |
/****************** 방문 기록 (시작) ******************/ |
198 |
- const visitRecordInit = { |
|
199 |
- 'senior_id': location.state['senior_id'], |
|
200 |
- 'visit_date': CommonUtil.getDate(), |
|
201 |
- 'visit_reason': null, |
|
202 |
- 'visit_content': null, |
|
203 |
- |
|
204 |
- 'agent_id': defaultUserId, |
|
205 |
- |
|
206 |
- isInsert: true, |
|
207 |
- }; |
|
208 | 210 |
//방문 기록 정보 |
209 | 211 |
const [visitRecord, setVisitRecord] = React.useState({ ...visitRecordInit }); |
210 | 212 |
const visitRecordRef = React.useRef({ ...visitRecordInit }); |
... | ... | @@ -267,9 +269,73 @@ |
267 | 269 |
}); |
268 | 270 |
} |
269 | 271 |
|
272 |
+ //방문 기록 수정 |
|
273 |
+ const visitRecordUpdate = () => { |
|
274 |
+ if (visitRecordValidation() == false) { |
|
275 |
+ return; |
|
276 |
+ } |
|
277 |
+ |
|
278 |
+ visitRecord['senior_id'] = location.state['senior_id']; |
|
279 |
+ visitRecord['agent_id'] = defaultUserId; |
|
280 |
+ setVisitRecord({ ...visitRecord }); |
|
281 |
+ |
|
282 |
+ fetch("/welfare/visitRecordUpdate.json", { |
|
283 |
+ method: "POST", |
|
284 |
+ headers: { |
|
285 |
+ 'Content-Type': 'application/json; charset=UTF-8' |
|
286 |
+ }, |
|
287 |
+ body: JSON.stringify(visitRecord), |
|
288 |
+ }).then((response) => response.json()).then((data) => { |
|
289 |
+ console.log("방문 기록 수정 결과(건수) : ", data); |
|
290 |
+ if (data > 0) { |
|
291 |
+ setVisitRecordInit(); |
|
292 |
+ visitRecordSelectList(); |
|
293 |
+ closeModal(); |
|
294 |
+ alert("수정완료"); |
|
295 |
+ } else { |
|
296 |
+ alert("수정에 실패하였습니다. 관리자에게 문의바랍니다."); |
|
297 |
+ } |
|
298 |
+ }).catch((error) => { |
|
299 |
+ console.log('visitRecordUpdate() /welfare/visitRecordUpdate.json error : ', error); |
|
300 |
+ }); |
|
301 |
+ } |
|
302 |
+ |
|
303 |
+ //방문 기록 삭제 |
|
304 |
+ const visitRecordDelete = () => { |
|
305 |
+ if (confirm('방문 기록 정보를 삭제하시겠습니까?') == false) { |
|
306 |
+ return; |
|
307 |
+ } |
|
308 |
+ |
|
309 |
+ fetch("/welfare/visitRecordDelete.json", { |
|
310 |
+ method: "POST", |
|
311 |
+ headers: { |
|
312 |
+ 'Content-Type': 'application/json; charset=UTF-8' |
|
313 |
+ }, |
|
314 |
+ body: JSON.stringify(visitRecord), |
|
315 |
+ }).then((response) => response.json()).then((data) => { |
|
316 |
+ console.log("방문 기록 삭제 결과(건수) : ", data); |
|
317 |
+ if (data > 0) { |
|
318 |
+ setVisitRecordInit(); |
|
319 |
+ visitRecordSelectList(); |
|
320 |
+ closeModal(); |
|
321 |
+ alert("삭제완료"); |
|
322 |
+ } else { |
|
323 |
+ alert("삭제에 실패하였습니다. 관리자에게 문의바랍니다."); |
|
324 |
+ } |
|
325 |
+ }).catch((error) => { |
|
326 |
+ console.log('visitRecordDelete() /welfare/visitRecordDelete.json error : ', error); |
|
327 |
+ }); |
|
328 |
+ } |
|
329 |
+ |
|
270 | 330 |
//초기화 취소 |
271 | 331 |
const setVisitRecordInit = () => { |
272 | 332 |
setVisitRecord({ ...visitRecordInit }); |
333 |
+ } |
|
334 |
+ |
|
335 |
+ const calerndarClick = (visitRecord) => { |
|
336 |
+ console.log("calerndarClick - visitRecord", visitRecord); |
|
337 |
+ setVisitRecord(visitRecord); |
|
338 |
+ openModal(); |
|
273 | 339 |
} |
274 | 340 |
|
275 | 341 |
React.useEffect(() => { |
... | ... | @@ -287,10 +353,10 @@ |
287 | 353 |
</div> |
288 | 354 |
|
289 | 355 |
<div className="btn-wrap flex-end margin-bottom"> |
290 |
- <button className="btn-small gray-btn" onClick={openModal}>방문등록</button> |
|
356 |
+ <button className="btn-small gray-btn" onClick={() => {setVisitRecordInit(); openModal();}}>방문등록</button> |
|
291 | 357 |
</div> |
292 | 358 |
|
293 |
- <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData }} /> |
|
359 |
+ <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData, visitRecordList: visitRecordList, onClick: calerndarClick}} /> |
|
294 | 360 |
|
295 | 361 |
<div className="btn-wrap flex-center"> |
296 | 362 |
<button className="btn-large gray-btn" onClick={() => { navigate(-1) }}>이전</button> |
... | ... | @@ -356,6 +422,7 @@ |
356 | 422 |
</div> |
357 | 423 |
</div> |
358 | 424 |
</Modal> |
425 |
+ |
|
359 | 426 |
</main> |
360 | 427 |
</> |
361 | 428 |
); |
--- client/views/pages/login/Login.jsx
+++ client/views/pages/login/Login.jsx
... | ... | @@ -39,7 +39,11 @@ |
39 | 39 |
}).then((response) => response.json()).then((data) => { |
40 | 40 |
console.log("로그인 결과 : ", data); |
41 | 41 |
if (data.isSuccess == true) { |
42 |
- navigate('/'); |
|
42 |
+ if(data.message == "비밀번호를 변경해주세요.") { |
|
43 |
+ |
|
44 |
+ } else { |
|
45 |
+ navigate('/'); |
|
46 |
+ } |
|
43 | 47 |
} else { |
44 | 48 |
alert(data.message); |
45 | 49 |
} |
--- client/views/pages/main/Main_agencyAdmin.jsx
+++ client/views/pages/main/Main_agencyAdmin.jsx
... | ... | @@ -10,6 +10,7 @@ |
10 | 10 |
import Title from "../../component/Title.jsx"; |
11 | 11 |
/* import Map from "../../component/chart/Map.jsx"; */ |
12 | 12 |
import Chart5 from "../../component/chart/Chart5.jsx"; |
13 |
+import Chart5_agencyadmin from "../../component/chart/Chart5_agencyadmin.jsx"; |
|
13 | 14 |
import Chart2_govern from "../../component/chart/Chart2_govern.jsx"; |
14 | 15 |
import Donut1_govern from "../../component/chart/Donut1_govern.jsx"; |
15 | 16 |
import RowChart_govern from "../../component/chart/RowChart_govern.jsx"; |
... | ... | @@ -282,17 +283,11 @@ |
282 | 283 |
</div> |
283 | 284 |
<Chart2_govern /> |
284 | 285 |
</div> |
285 |
- <div className="content-box combine-right-government2"> |
|
286 |
+ <div className="content-box combine-right-government3"> |
|
286 | 287 |
<div className="flex"> |
287 | 288 |
<Title title={`보호사별 대상자 등록 현황`} explanation={"약상자 사용자의 데이터 차트가 보여집니다."} /> |
288 | 289 |
</div> |
289 |
- <Chart5 data={seniorEnroll} /> |
|
290 |
- </div> |
|
291 |
- <div className="content-box combine-right-government"> |
|
292 |
- <div className="flex"> |
|
293 |
- <Title title={`보호사별 약상자 사용 현황`} explanation={""} /> |
|
294 |
- </div> |
|
295 |
- <Donut1_govern data={equipmentUsage} /> |
|
290 |
+ <Chart5_agencyadmin data={seniorEnroll} /> |
|
296 | 291 |
</div> |
297 | 292 |
</div> |
298 | 293 |
</main> |
--- client/views/pages/main/Main_guardian.jsx
+++ client/views/pages/main/Main_guardian.jsx
... | ... | @@ -9,6 +9,7 @@ |
9 | 9 |
import DateDay from "../../component/DateDay.jsx"; |
10 | 10 |
import DateMonth from "../../component/DateMonth.jsx"; |
11 | 11 |
import Chart6 from "../../component/chart/Chart6.jsx"; |
12 |
+import Modal from "../../component/Modal.jsx"; |
|
12 | 13 |
import ClearIcon from '@mui/icons-material/Clear'; |
13 | 14 |
import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; |
14 | 15 |
import ErrorIcon from '@mui/icons-material/Error'; |
... | ... | @@ -45,10 +46,18 @@ |
45 | 46 |
|
46 | 47 |
//전역 변수 저장 객체 |
47 | 48 |
const state = useSelector((state) => { return state }); |
49 |
+ const defaultUserId = CommonUtil.isEmpty(state.loginUser) ? null : state.loginUser['user_id']; |
|
50 |
+ |
|
51 |
+ const [modalOpen, setModalOpen] = React.useState(false); |
|
52 |
+ const openModal = () => { |
|
53 |
+ setModalOpen(true); |
|
54 |
+ }; |
|
55 |
+ const closeModal = () => { |
|
56 |
+ setModalOpen(false); |
|
57 |
+ }; |
|
48 | 58 |
|
49 | 59 |
//검색 |
50 | 60 |
const searching = () => { |
51 |
- |
|
52 | 61 |
if (CommonUtil.isEmpty(seniorSearch['senior_id']) == false) { |
53 | 62 |
seniorSelectOne(); |
54 | 63 |
seniorMedicationSelectList(); |
... | ... | @@ -63,7 +72,7 @@ |
63 | 72 |
const [senior, setSenior] = React.useState({ |
64 | 73 |
'user_id': null, |
65 | 74 |
'user_name': null, |
66 |
- 'senior_id':null, |
|
75 |
+ 'senior_id': null, |
|
67 | 76 |
}); |
68 | 77 |
|
69 | 78 |
const [seniorSearch, setSeniorSearch] = React.useState({ |
... | ... | @@ -74,6 +83,8 @@ |
74 | 83 |
|
75 | 84 |
//시니어 상세 조회 |
76 | 85 |
const seniorSelectOne = () => { |
86 |
+ console.log('seniorSelectOne - seniorSearch : ', seniorSearch); |
|
87 |
+ |
|
77 | 88 |
fetch("/user/seniorSelectOne.json", { |
78 | 89 |
method: "POST", |
79 | 90 |
headers: { |
... | ... | @@ -87,27 +98,6 @@ |
87 | 98 |
console.log('seniorSelectOne() /user/seniorSelectOne.json error : ', error); |
88 | 99 |
}); |
89 | 100 |
}; |
90 |
- |
|
91 |
- const handleChangeSelect = (e) => { |
|
92 |
- console.log('handleChangeSelect : ', e.target.value); |
|
93 |
- setSeniorSearch(e.target.value); |
|
94 |
- }; |
|
95 |
- |
|
96 |
- const SelectBox = () => { |
|
97 |
- if (CommonUtil.isEmpty(state.loginUser) == false |
|
98 |
- && state.loginUser['authority'] == 'ROLE_GUARDIAN' && state['seniorList'].length > 1) { |
|
99 |
- return ( |
|
100 |
- <select className="margin-bottom2" onChange={handleChangeSelect}> |
|
101 |
- {state['seniorList'].map((item, idx) => { |
|
102 |
- return ( |
|
103 |
- <option key={idx} value={item}>{item['user_name']}</option> |
|
104 |
- ) |
|
105 |
- })} |
|
106 |
- </select> |
|
107 |
- ) |
|
108 |
- } |
|
109 |
- } |
|
110 |
- |
|
111 | 101 |
|
112 | 102 |
//특정 대상자의 실제 복약 정보 |
113 | 103 |
const [seniorMedicationList, setSeniorMedicationList] = React.useState([]); |
... | ... | @@ -194,7 +184,12 @@ |
194 | 184 |
}; |
195 | 185 |
chartData['temperature'] = data[i]['temperature_data']; |
196 | 186 |
chartData['time'] = data[i]['temperature_time']; |
197 |
- _stackTemperatureData.push(chartData); |
|
187 |
+ |
|
188 |
+ if (data[i]['temperature_date'].substr(5, 2) >= 11 || data[i]['temperature_date'].substr(5, 2) <= 2) { |
|
189 |
+ _stackTemperatureData.push(chartData); |
|
190 |
+ } else { |
|
191 |
+ _stackTemperatureData.unshift(chartData); |
|
192 |
+ } |
|
198 | 193 |
} |
199 | 194 |
setStackTemperatureData(_stackTemperatureData); |
200 | 195 |
} |
... | ... | @@ -205,6 +200,18 @@ |
205 | 200 |
|
206 | 201 |
//방문 기록 정보 |
207 | 202 |
const [visitRecordList, setVisitRecordList] = React.useState({}); |
203 |
+ const visitRecordInit = { |
|
204 |
+ 'senior_id': senior['senior_id'], |
|
205 |
+ 'visit_date': CommonUtil.getDate(), |
|
206 |
+ 'visit_reason': null, |
|
207 |
+ 'visit_content': null, |
|
208 |
+ |
|
209 |
+ 'agent_id': defaultUserId, |
|
210 |
+ |
|
211 |
+ isInsert: true, |
|
212 |
+ }; |
|
213 |
+ |
|
214 |
+ |
|
208 | 215 |
//방문 기록 목록 조회 |
209 | 216 |
const visitRecordSelectList = () => { |
210 | 217 |
fetch("/welfare/visitRecordSelectList.json", { |
... | ... | @@ -215,49 +222,154 @@ |
215 | 222 |
body: JSON.stringify(seniorSearch), |
216 | 223 |
}).then((response) => response.json()).then((data) => { |
217 | 224 |
console.log("방문 기록 목록 조회 결과(건수) : ", data); |
225 |
+ data.search = visitRecordList.search; |
|
218 | 226 |
setVisitRecordList(data['visitRecordList']); |
219 | 227 |
}).catch((error) => { |
220 | 228 |
console.log('visitRecordSelectList() /user/visitRecordSelectList.json error : ', error); |
221 | 229 |
}); |
222 | 230 |
} |
223 | 231 |
|
232 |
+ //방문 기록 정보 |
|
233 |
+ const [visitDate, setVisitDate] = React.useState(null); |
|
234 |
+ const [visitRecord, setVisitRecord] = React.useState({ ...visitRecordInit }); |
|
235 |
+ const visitRecordRef = React.useRef({ ...visitRecordInit }); |
|
236 |
+ |
|
224 | 237 |
// React.useEffect(() => { |
225 | 238 |
// searching(); |
226 | 239 |
// }, []); |
227 | 240 |
|
241 |
+ const calerndarClick = (date, visitRecord) => { |
|
242 |
+ console.log("calerndarClick - date, visitRecord", date, visitRecord); |
|
243 |
+ setVisitDate(date); |
|
244 |
+ setVisitRecord(visitRecord); |
|
245 |
+ openModal(); |
|
246 |
+ } |
|
247 |
+ |
|
228 | 248 |
React.useEffect(() => { |
249 |
+ console.log(`React.useEffect - seniorSearch : `, seniorSearch); |
|
229 | 250 |
searching(); |
230 | 251 |
}, [seniorSearch]); |
231 | 252 |
|
232 | 253 |
React.useEffect(() => { |
233 |
- if (CommonUtil.isEmpty(state['seniorList']) == false) { |
|
234 |
- setSeniorSearch(state['seniorList'][0]); |
|
254 |
+ console.log(`React.useEffect - state['seniorList'].value : `, state['seniorList'].value); |
|
255 |
+ if (CommonUtil.isEmpty(state['seniorList'].value) == false) { |
|
256 |
+ setSeniorSearch(state['seniorList'].value[0]); |
|
235 | 257 |
} else { |
236 | 258 |
return; |
237 | 259 |
} |
238 |
- }, [state['seniorList']]) |
|
260 |
+ }, [state['seniorList'].value]); |
|
239 | 261 |
|
240 | 262 |
return ( |
241 | 263 |
<> |
242 | 264 |
<main className="pink"> |
243 |
- |
|
244 |
- { |
|
245 |
- CommonUtil.isEmpty(state.loginUser) == false |
|
246 |
- && state.loginUser['authority'] == 'ROLE_GUARDIAN' && state['seniorList'].length > 1 ? |
|
247 |
- <select className="margin-bottom2" onChange={handleChangeSelect}> |
|
248 |
- {state['seniorList'].map((item, idx) => { |
|
249 |
- return ( |
|
250 |
- <option key={idx} value={item}>{item['user_name']}</option> |
|
251 |
- ) |
|
252 |
- })} |
|
253 |
- </select> |
|
254 |
- : null |
|
255 |
- } |
|
256 |
- |
|
265 |
+ { |
|
266 |
+ CommonUtil.isEmpty(state.loginUser) == false |
|
267 |
+ && state.loginUser['authority'] == 'ROLE_GUARDIAN' && state['seniorList'].value.length > 1 ? |
|
268 |
+ <select className="margin-bottom2" onChange={(e) => { |
|
269 |
+ console.log('e.target.value : ', e.target.value); |
|
270 |
+ const index = Number(e.target.value); |
|
271 |
+ console.log('e.target.value index : ', index); |
|
272 |
+ setSeniorSearch(state['seniorList'].value[index]); |
|
273 |
+ //setSeniorSearch(e.target.value); |
|
274 |
+ }}> |
|
275 |
+ {state['seniorList'].value.map((item, idx) => { |
|
276 |
+ return ( |
|
277 |
+ <option key={idx} value={idx}>{item['user_name']}</option> |
|
278 |
+ ) |
|
279 |
+ })} |
|
280 |
+ </select> |
|
281 |
+ : null |
|
282 |
+ } |
|
283 |
+ |
|
257 | 284 |
<div className="flex-start main-guardian"><img src={Senior} alt="" /> |
258 | 285 |
<Title title={`${senior['user_name']} 어르신`} explanation={"방문, 복약, 온도, 배터리 현황을 확인하세요."} /> |
259 | 286 |
</div> |
260 |
- <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData, visitRecordList: visitRecordList }} /> |
|
287 |
+ <Calendar data={{ senior: senior, medication: stackChartData, temperature: stackTemperatureData, visitRecordList: visitRecordList, onClick: calerndarClick }} /> |
|
288 |
+ |
|
289 |
+ <Modal open={modalOpen} close={closeModal} header="시니어 정보 관리"> |
|
290 |
+ <div className="modal-visit board-wrap"> |
|
291 |
+ <table className="margin-bottom"> |
|
292 |
+ <tbody> |
|
293 |
+ <tr> |
|
294 |
+ <th></th> |
|
295 |
+ <th>02:00</th> |
|
296 |
+ <th>10:00</th> |
|
297 |
+ <th>12:00</th> |
|
298 |
+ <th>23:00</th> |
|
299 |
+ </tr> |
|
300 |
+ <tr> |
|
301 |
+ <th>복약량</th> |
|
302 |
+ <td>1</td> |
|
303 |
+ <td>1</td> |
|
304 |
+ <td>1</td> |
|
305 |
+ <td>1</td> |
|
306 |
+ </tr> |
|
307 |
+ <tr> |
|
308 |
+ <th>온도</th> |
|
309 |
+ <td>30</td> |
|
310 |
+ <td>29</td> |
|
311 |
+ <td>28</td> |
|
312 |
+ <td>27</td> |
|
313 |
+ </tr> |
|
314 |
+ <tr> |
|
315 |
+ <th>배터리</th> |
|
316 |
+ <td colSpan={4}>30%</td> |
|
317 |
+ </tr> |
|
318 |
+ </tbody> |
|
319 |
+ </table> |
|
320 |
+ {visitRecord != null ? ( |
|
321 |
+ <table className="flex70 margin-bottom">{/* questionnaire-table */} |
|
322 |
+ <tbody> |
|
323 |
+ <tr> |
|
324 |
+ <th>방문날짜</th> |
|
325 |
+ <td colSpan={3}> |
|
326 |
+ <input type="date" value={visitRecord['visit_date']} |
|
327 |
+ onChange={(e) => { |
|
328 |
+ visitRecord['visit_date'] = e.target.value; |
|
329 |
+ setVisitRecord({ ...visitRecord }); |
|
330 |
+ }} |
|
331 |
+ ref={el => visitRecordRef.current['visit_date'] = el} |
|
332 |
+ disabled={true} |
|
333 |
+ /> |
|
334 |
+ </td> |
|
335 |
+ </tr> |
|
336 |
+ <tr> |
|
337 |
+ <th>방문목적</th> |
|
338 |
+ <td colSpan={3}> |
|
339 |
+ <select onChange={(e) => { |
|
340 |
+ visitRecord['visit_reason'] = e.target.value; |
|
341 |
+ setVisitRecord({ ...visitRecord }); |
|
342 |
+ }} |
|
343 |
+ ref={el => visitRecordRef.current['visit_reason'] = el} |
|
344 |
+ disabled={true} |
|
345 |
+ > |
|
346 |
+ <option value="" selected={CommonUtil.isEmpty(visitRecord['visit_reason'])}>방문목적선택</option> |
|
347 |
+ <option value="정기방문" selected={visitRecord['visit_reason'] == "정기방문"}>정기방문</option> |
|
348 |
+ <option value="어르신케어" selected={visitRecord['visit_reason'] == "어르신케어"}>어르신케어</option> |
|
349 |
+ <option value="장비점검" selected={visitRecord['visit_reason'] == "장비점검"}>장비점검</option> |
|
350 |
+ <option value="정기방문" selected={visitRecord['visit_reason'] == "기타"}>기타</option> |
|
351 |
+ </select> |
|
352 |
+ </td> |
|
353 |
+ </tr> |
|
354 |
+ <tr> |
|
355 |
+ <th>방문 상세 사유</th> |
|
356 |
+ <td colSpan={3}> |
|
357 |
+ <textarea className="medicine" style={{ height: "225px" }} name="" id="" cols="30" rows="10" |
|
358 |
+ value={visitRecord['visit_content']} |
|
359 |
+ onChange={(e) => { |
|
360 |
+ visitRecord['visit_content'] = e.target.value; |
|
361 |
+ setVisitRecord({ ...visitRecord }); |
|
362 |
+ }} |
|
363 |
+ ref={el => visitRecordRef.current['visit_content'] = el} |
|
364 |
+ disabled={true} |
|
365 |
+ ></textarea> |
|
366 |
+ </td> |
|
367 |
+ </tr> |
|
368 |
+ </tbody> |
|
369 |
+ </table> |
|
370 |
+ ) : null} |
|
371 |
+ </div> |
|
372 |
+ </Modal> |
|
261 | 373 |
</main> |
262 | 374 |
</> |
263 | 375 |
); |
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?