@dssp/project 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/pages/project/project-detail.ts +24 -9
- package/client/pages/project/project-plan-management.ts +7 -3
- package/client/pages/project/project-setting-list.ts +68 -1
- package/client/route.ts +0 -4
- package/dist-client/pages/project/project-detail.js +24 -9
- package/dist-client/pages/project/project-detail.js.map +1 -1
- package/dist-client/pages/project/project-plan-management.js +7 -3
- package/dist-client/pages/project/project-plan-management.js.map +1 -1
- package/dist-client/pages/project/project-setting-list.js +68 -1
- package/dist-client/pages/project/project-setting-list.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +0 -3
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/things-factory.config.js +0 -1
- package/client/pages/resource/manager-management.ts +0 -175
- package/dist-client/pages/resource/manager-management.d.ts +0 -31
- package/dist-client/pages/resource/manager-management.js +0 -169
- package/dist-client/pages/resource/manager-management.js.map +0 -1
|
@@ -151,10 +151,16 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
div[left-bottom] {
|
|
154
|
+
flex: 1;
|
|
155
|
+
|
|
156
|
+
display: flex;
|
|
157
|
+
flex-direction: column;
|
|
158
|
+
|
|
154
159
|
[building-complex-img] {
|
|
155
|
-
|
|
160
|
+
flex: 1;
|
|
156
161
|
aspect-ratio: 2 / 1;
|
|
157
162
|
}
|
|
163
|
+
|
|
158
164
|
img {
|
|
159
165
|
opacity: 0.5;
|
|
160
166
|
}
|
|
@@ -162,9 +168,9 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
162
168
|
div[subject] {
|
|
163
169
|
margin-bottom: 7px;
|
|
164
170
|
}
|
|
171
|
+
|
|
165
172
|
div[building-container] {
|
|
166
173
|
display: block;
|
|
167
|
-
height: 40px;
|
|
168
174
|
overflow-y: auto;
|
|
169
175
|
|
|
170
176
|
& > * {
|
|
@@ -228,6 +234,12 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
228
234
|
align-items: center;
|
|
229
235
|
justify-content: center;
|
|
230
236
|
|
|
237
|
+
div[wait] {
|
|
238
|
+
color: #4e5055;
|
|
239
|
+
}
|
|
240
|
+
div[request] {
|
|
241
|
+
color: #2e79be;
|
|
242
|
+
}
|
|
231
243
|
div[pass] {
|
|
232
244
|
color: #1bb401;
|
|
233
245
|
}
|
|
@@ -266,9 +278,14 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
266
278
|
}
|
|
267
279
|
|
|
268
280
|
div[right-bottom] {
|
|
281
|
+
flex: 1;
|
|
282
|
+
|
|
283
|
+
display: flex;
|
|
284
|
+
flex-direction: column;
|
|
285
|
+
|
|
269
286
|
div[table-container] {
|
|
270
|
-
|
|
271
|
-
|
|
287
|
+
flex: 1;
|
|
288
|
+
|
|
272
289
|
overflow-y: auto;
|
|
273
290
|
overflow-x: hidden;
|
|
274
291
|
position: relative;
|
|
@@ -276,14 +293,12 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
276
293
|
|
|
277
294
|
hr {
|
|
278
295
|
position: sticky;
|
|
279
|
-
width: 100%;
|
|
280
296
|
margin: 0;
|
|
281
297
|
top: 0px;
|
|
282
298
|
border: 1px solid #3295f1;
|
|
283
299
|
}
|
|
284
300
|
|
|
285
301
|
table {
|
|
286
|
-
width: 100%;
|
|
287
302
|
border-collapse: collapse;
|
|
288
303
|
table-layout: fixed;
|
|
289
304
|
}
|
|
@@ -404,7 +419,7 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
404
419
|
<div>
|
|
405
420
|
<div row>
|
|
406
421
|
<span>- 면적 : </span>
|
|
407
|
-
<span>${this.project.buildingComplex?.area?.toLocaleString()}
|
|
422
|
+
<span>${this.project.buildingComplex?.area?.toLocaleString()} ㎡</span>
|
|
408
423
|
</div>
|
|
409
424
|
<div row>
|
|
410
425
|
<span>- 착공 ~ 준공 : </span>
|
|
@@ -556,13 +571,13 @@ export class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
556
571
|
<table>
|
|
557
572
|
<thead>
|
|
558
573
|
<tr>
|
|
559
|
-
<th width="5%"
|
|
574
|
+
<th width="5%"></th>
|
|
560
575
|
<th width="10%">검측 위치</th>
|
|
561
576
|
<th width="10%">공종</th>
|
|
562
577
|
<th width="20%">내용</th>
|
|
563
578
|
<th width="15%">검측 요청일</th>
|
|
564
579
|
<th width="10%">검측 결과</th>
|
|
565
|
-
<th width="15%"
|
|
580
|
+
<th width="15%">결과 데이터</th>
|
|
566
581
|
</tr>
|
|
567
582
|
</thead>
|
|
568
583
|
<tbody>
|
|
@@ -26,8 +26,8 @@ export class ProjectPlanManagement extends ScopedElementsMixin(PageView) {
|
|
|
26
26
|
grid-template-rows: 75px auto;
|
|
27
27
|
color: #4e5055;
|
|
28
28
|
|
|
29
|
-
width: 100%;
|
|
30
29
|
background-color: #f7f7f7;
|
|
30
|
+
overflow: hidden;
|
|
31
31
|
overflow-y: auto;
|
|
32
32
|
|
|
33
33
|
--grid-record-emphasized-background-color: red;
|
|
@@ -93,7 +93,7 @@ export class ProjectPlanManagement extends ScopedElementsMixin(PageView) {
|
|
|
93
93
|
|
|
94
94
|
div[body] {
|
|
95
95
|
display: grid;
|
|
96
|
-
grid-template-rows: 240px
|
|
96
|
+
grid-template-rows: 240px 1fr 60px;
|
|
97
97
|
margin: 0px 25px 25px 25px;
|
|
98
98
|
gap: 8px;
|
|
99
99
|
|
|
@@ -110,6 +110,7 @@ export class ProjectPlanManagement extends ScopedElementsMixin(PageView) {
|
|
|
110
110
|
color: #2e79be;
|
|
111
111
|
font-size: 18px;
|
|
112
112
|
margin: 0px;
|
|
113
|
+
text-wrap: nowrap;
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
116
|
|
|
@@ -122,6 +123,7 @@ export class ProjectPlanManagement extends ScopedElementsMixin(PageView) {
|
|
|
122
123
|
ox-input-file {
|
|
123
124
|
height: 120px;
|
|
124
125
|
}
|
|
126
|
+
|
|
125
127
|
span[building] {
|
|
126
128
|
width: 125px;
|
|
127
129
|
text-align: center;
|
|
@@ -138,10 +140,12 @@ export class ProjectPlanManagement extends ScopedElementsMixin(PageView) {
|
|
|
138
140
|
display: flex;
|
|
139
141
|
justify-content: space-between;
|
|
140
142
|
height: fit-content;
|
|
143
|
+
gap: 50px;
|
|
144
|
+
overflow: hidden;
|
|
141
145
|
|
|
142
146
|
span[building-button] {
|
|
143
147
|
display: flex;
|
|
144
|
-
|
|
148
|
+
margin-left: auto;
|
|
145
149
|
gap: 10px;
|
|
146
150
|
overflow-x: auto;
|
|
147
151
|
overflow-y: hidden;
|
|
@@ -32,6 +32,45 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
|
|
|
32
32
|
--grid-record-emphasized-color: yellow;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
div[management-header-container] {
|
|
36
|
+
display: flex;
|
|
37
|
+
margin: 15px 23px 0px 23px;
|
|
38
|
+
gap: 13px;
|
|
39
|
+
overflow-x: auto;
|
|
40
|
+
|
|
41
|
+
a {
|
|
42
|
+
min-width: 140px;
|
|
43
|
+
text-align: center;
|
|
44
|
+
padding: 12px 15px;
|
|
45
|
+
background-color: #fff;
|
|
46
|
+
color: #586878;
|
|
47
|
+
font-weight: 700;
|
|
48
|
+
border-radius: 7px;
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
justify-content: center;
|
|
52
|
+
align-items: center;
|
|
53
|
+
gap: 5px;
|
|
54
|
+
border: solid 1px #0000004d;
|
|
55
|
+
text-decoration: none;
|
|
56
|
+
cursor: pointer;
|
|
57
|
+
|
|
58
|
+
md-icon {
|
|
59
|
+
font-size: 40px;
|
|
60
|
+
width: auto;
|
|
61
|
+
height: auto;
|
|
62
|
+
}
|
|
63
|
+
div[label] {
|
|
64
|
+
font-size: 15px;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
a[green] {
|
|
69
|
+
background-color: #24be7b;
|
|
70
|
+
color: #fff;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
35
74
|
div[header] {
|
|
36
75
|
display: flex;
|
|
37
76
|
height: 100px;
|
|
@@ -184,6 +223,35 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
|
|
|
184
223
|
|
|
185
224
|
render() {
|
|
186
225
|
return html`
|
|
226
|
+
<div management-header>
|
|
227
|
+
<div management-header-container>
|
|
228
|
+
<a @click=${this._openCreateProjectPopup} green>
|
|
229
|
+
<md-icon slot="leading-icon">add</md-icon>
|
|
230
|
+
<div label>신규 프로젝트 생성</div>
|
|
231
|
+
</a>
|
|
232
|
+
<a href="employee-list">
|
|
233
|
+
<md-icon slot="leading-icon">badge</md-icon>
|
|
234
|
+
<div label>인력 관리</div>
|
|
235
|
+
</a>
|
|
236
|
+
<a href="construction-type-management">
|
|
237
|
+
<md-icon slot="leading-icon">construction</md-icon>
|
|
238
|
+
<div label>공종 관리</div>
|
|
239
|
+
</a>
|
|
240
|
+
<a href="inspection-drawing-type-management">
|
|
241
|
+
<md-icon slot="leading-icon">stacks</md-icon>
|
|
242
|
+
<div label>도면타입/검측부위 관리</div>
|
|
243
|
+
</a>
|
|
244
|
+
<a href="checklist-type-management">
|
|
245
|
+
<md-icon slot="leading-icon">rule</md-icon>
|
|
246
|
+
<div label>체크리스트 구분 관리</div>
|
|
247
|
+
</a>
|
|
248
|
+
<a href="checklist-template-list">
|
|
249
|
+
<md-icon slot="leading-icon">fact_check</md-icon>
|
|
250
|
+
<div label>체크리스트 템플릿 관리</div>
|
|
251
|
+
</a>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
|
|
187
255
|
<div header>
|
|
188
256
|
<label>프로젝트 이름</label>
|
|
189
257
|
<md-filled-text-field
|
|
@@ -198,7 +266,6 @@ export class ProjectSettingList extends ScopedElementsMixin(PageView) {
|
|
|
198
266
|
</md-filled-text-field>
|
|
199
267
|
|
|
200
268
|
<strong>총 ${this.projectCount}개</strong>
|
|
201
|
-
<md-elevated-button add-project @click=${this._openCreateProjectPopup}>+ 신규 프로젝트 추가</md-elevated-button>
|
|
202
269
|
</div>
|
|
203
270
|
|
|
204
271
|
<div body>
|
package/client/route.ts
CHANGED
|
@@ -32,10 +32,6 @@ export default function route(page: string) {
|
|
|
32
32
|
import('./pages/project/project-plan-management')
|
|
33
33
|
return page
|
|
34
34
|
|
|
35
|
-
case 'manager-management':
|
|
36
|
-
import('./pages/resource/manager-management')
|
|
37
|
-
return page
|
|
38
|
-
|
|
39
35
|
case 'worker-type-management':
|
|
40
36
|
import('./pages/resource/worker-type-management')
|
|
41
37
|
return page
|
|
@@ -81,7 +81,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
81
81
|
<div>
|
|
82
82
|
<div row>
|
|
83
83
|
<span>- 면적 : </span>
|
|
84
|
-
<span>${(_d = (_c = this.project.buildingComplex) === null || _c === void 0 ? void 0 : _c.area) === null || _d === void 0 ? void 0 : _d.toLocaleString()}
|
|
84
|
+
<span>${(_d = (_c = this.project.buildingComplex) === null || _c === void 0 ? void 0 : _c.area) === null || _d === void 0 ? void 0 : _d.toLocaleString()} ㎡</span>
|
|
85
85
|
</div>
|
|
86
86
|
<div row>
|
|
87
87
|
<span>- 착공 ~ 준공 : </span>
|
|
@@ -233,13 +233,13 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
233
233
|
<table>
|
|
234
234
|
<thead>
|
|
235
235
|
<tr>
|
|
236
|
-
<th width="5%"
|
|
236
|
+
<th width="5%"></th>
|
|
237
237
|
<th width="10%">검측 위치</th>
|
|
238
238
|
<th width="10%">공종</th>
|
|
239
239
|
<th width="20%">내용</th>
|
|
240
240
|
<th width="15%">검측 요청일</th>
|
|
241
241
|
<th width="10%">검측 결과</th>
|
|
242
|
-
<th width="15%"
|
|
242
|
+
<th width="15%">결과 데이터</th>
|
|
243
243
|
</tr>
|
|
244
244
|
</thead>
|
|
245
245
|
<tbody>
|
|
@@ -499,10 +499,16 @@ ProjectDetail.styles = [
|
|
|
499
499
|
}
|
|
500
500
|
|
|
501
501
|
div[left-bottom] {
|
|
502
|
+
flex: 1;
|
|
503
|
+
|
|
504
|
+
display: flex;
|
|
505
|
+
flex-direction: column;
|
|
506
|
+
|
|
502
507
|
[building-complex-img] {
|
|
503
|
-
|
|
508
|
+
flex: 1;
|
|
504
509
|
aspect-ratio: 2 / 1;
|
|
505
510
|
}
|
|
511
|
+
|
|
506
512
|
img {
|
|
507
513
|
opacity: 0.5;
|
|
508
514
|
}
|
|
@@ -510,9 +516,9 @@ ProjectDetail.styles = [
|
|
|
510
516
|
div[subject] {
|
|
511
517
|
margin-bottom: 7px;
|
|
512
518
|
}
|
|
519
|
+
|
|
513
520
|
div[building-container] {
|
|
514
521
|
display: block;
|
|
515
|
-
height: 40px;
|
|
516
522
|
overflow-y: auto;
|
|
517
523
|
|
|
518
524
|
& > * {
|
|
@@ -576,6 +582,12 @@ ProjectDetail.styles = [
|
|
|
576
582
|
align-items: center;
|
|
577
583
|
justify-content: center;
|
|
578
584
|
|
|
585
|
+
div[wait] {
|
|
586
|
+
color: #4e5055;
|
|
587
|
+
}
|
|
588
|
+
div[request] {
|
|
589
|
+
color: #2e79be;
|
|
590
|
+
}
|
|
579
591
|
div[pass] {
|
|
580
592
|
color: #1bb401;
|
|
581
593
|
}
|
|
@@ -614,9 +626,14 @@ ProjectDetail.styles = [
|
|
|
614
626
|
}
|
|
615
627
|
|
|
616
628
|
div[right-bottom] {
|
|
629
|
+
flex: 1;
|
|
630
|
+
|
|
631
|
+
display: flex;
|
|
632
|
+
flex-direction: column;
|
|
633
|
+
|
|
617
634
|
div[table-container] {
|
|
618
|
-
|
|
619
|
-
|
|
635
|
+
flex: 1;
|
|
636
|
+
|
|
620
637
|
overflow-y: auto;
|
|
621
638
|
overflow-x: hidden;
|
|
622
639
|
position: relative;
|
|
@@ -624,14 +641,12 @@ ProjectDetail.styles = [
|
|
|
624
641
|
|
|
625
642
|
hr {
|
|
626
643
|
position: sticky;
|
|
627
|
-
width: 100%;
|
|
628
644
|
margin: 0;
|
|
629
645
|
top: 0px;
|
|
630
646
|
border: 1px solid #3295f1;
|
|
631
647
|
}
|
|
632
648
|
|
|
633
649
|
table {
|
|
634
|
-
width: 100%;
|
|
635
650
|
border-collapse: collapse;
|
|
636
651
|
table-layout: fixed;
|
|
637
652
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-detail.js","sourceRoot":"","sources":["../../../client/pages/project/project-detail.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/textfield/outlined-text-field.js'\nimport '@material/web/button/outlined-button.js'\n\nimport { navigate, PageView } from '@operato/shell'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport gql from 'graphql-tag'\nimport { BUILDING_INSPECTION_STATUS, BuildingInspection, BuildingInspectionStatus, Project } from './project-list'\nimport _getWeather from '../lib/waether'\nimport '@operato/chart/ox-progress-circle.js'\n\nexport interface InspectionSummary {\n wait: number\n request: number\n pass: number\n fail: number\n}\n\ninterface Weather {\n rain: number\n temperature: number\n humidity: number\n wind: string\n}\n\n@customElement('project-detail')\nexport class ProjectDetail extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: #f7f7f7;\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: 15px;\n --md-outlined-button-leading-space: 15px;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px 20px;\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n\n md-elevated-button {\n margin: 0px 3px;\n\n --md-elevated-button-container-height: 35px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: #fff;\n --md-elevated-button-hover-label-text-color: #fff;\n --md-elevated-button-pressed-label-text-color: #fff;\n --md-elevated-button-focus-label-text-color: #fff;\n --md-elevated-button-icon-color: #fff;\n --md-elevated-button-hover-icon-color: #fff;\n --md-elevated-button-pressed-icon-color: #fff;\n --md-elevated-button-focus-icon-color: #fff;\n }\n }\n }\n\n div[body] {\n display: flex;\n margin: 0px 25px 25px 25px;\n gap: 10px;\n\n h3 {\n color: #2e79be;\n font-size: 18px;\n margin: 0px;\n\n a {\n text-decoration: none;\n color: #2e79be;\n }\n }\n\n & > div {\n display: flex;\n flex: 1;\n gap: 10px;\n flex-direction: column;\n\n & > div {\n display: flex;\n flex-direction: column;\n background-color: #ffffff;\n border: 1px solid #cccccc80;\n gap: 10px;\n padding: 15px;\n border-radius: 5px;\n }\n\n div[left-top] {\n div[content-1] {\n display: flex;\n align-items: center;\n gap: 15px;\n\n img {\n width: 42%;\n height: auto;\n aspect-ratio: 1920 / 1080;\n }\n img[no-image] {\n object-fit: contain;\n opacity: 0.5;\n }\n\n div[row] {\n line-height: 25px;\n }\n }\n div[content-2] {\n height: 65px;\n overflow-y: auto;\n }\n }\n\n div[left-bottom] {\n [building-complex-img] {\n width: 100%;\n aspect-ratio: 2 / 1;\n }\n img {\n opacity: 0.5;\n }\n\n div[subject] {\n margin-bottom: 7px;\n }\n div[building-container] {\n display: block;\n height: 40px;\n overflow-y: auto;\n\n & > * {\n margin-right: 10px;\n margin-bottom: 7px;\n }\n }\n }\n\n div[right-top] {\n div[state] {\n display: grid;\n grid-template-columns: 0.95fr 0.95fr 1.1fr;\n gap: 15px;\n\n span[progress] {\n max-width: 170px;\n text-align: center;\n display: flex;\n justify-self: center;\n flex-direction: column;\n width: 100%;\n\n & > div {\n font-weight: bold;\n color: #2e79be;\n font-size: 12px;\n margin-top: 5px;\n }\n & > div[week] {\n color: #06b5af;\n }\n }\n span[weather] {\n display: flex;\n flex-direction: column;\n gap: 5px;\n margin-left: 10px;\n\n & > div {\n display: flex;\n justify-content: space-between;\n\n & > span {\n display: flex;\n }\n }\n }\n }\n div[inspection] {\n display: grid;\n grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;\n margin-top: 5px;\n background: #f6f6f6;\n border-radius: 7px;\n padding: 7px 0px;\n\n & > span {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n div[pass] {\n color: #1bb401;\n }\n div[fail] {\n color: #ff4444;\n }\n }\n & > span[name] {\n flex-direction: row;\n text-align: right;\n gap: 10px;\n\n md-icon {\n width: 40px;\n height: 40px;\n border-radius: 7px;\n color: #fff;\n background: #f16154;\n }\n }\n }\n div[notice] {\n margin-top: 7px;\n\n div[name] {\n margin-left: 4px;\n }\n div[content] {\n background-color: #ebc8321a;\n border-radius: 10px;\n padding: 10px;\n font-size: 14px;\n margin-top: 6px;\n }\n }\n }\n\n div[right-bottom] {\n div[table-container] {\n width: 100%;\n height: 15rem;\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n }\n\n hr {\n position: sticky;\n width: 100%;\n margin: 0;\n top: 0px;\n border: 1px solid #3295f1;\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n }\n\n thead {\n position: sticky;\n top: 2px;\n background-color: #464651;\n color: #fff;\n z-index: 1;\n }\n\n thead th {\n padding: 5px;\n font-size: 15px;\n text-wrap: pretty;\n }\n\n tbody td {\n border-bottom: 1px solid #cccccc;\n padding: 5px 3px;\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n font-size: 13px;\n }\n\n md-elevated-button {\n margin: 0px 3px;\n\n --md-elevated-button-container-height: 35px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: #fff;\n --md-elevated-button-hover-label-text-color: #fff;\n --md-elevated-button-pressed-label-text-color: #fff;\n --md-elevated-button-focus-label-text-color: #fff;\n --md-elevated-button-icon-color: #fff;\n --md-elevated-button-hover-icon-color: #fff;\n --md-elevated-button-pressed-icon-color: #fff;\n --md-elevated-button-focus-icon-color: #fff;\n\n &[red] {\n --md-elevated-button-container-color: #e15757;\n }\n }\n }\n }\n }\n `\n ]\n\n get context() {\n return {\n title: '진행 중 프로젝트 상세 정보'\n }\n }\n\n private defaultProject = {\n name: '',\n buildingComplex: {\n address: '',\n area: 0,\n constructionCompany: '',\n clientCompany: '',\n supervisoryCompany: '',\n designCompany: '',\n constructionType: '',\n buildings: []\n }\n }\n\n @state() projectId: string = ''\n @state() project: Project = { ...this.defaultProject }\n @state() buildingInspections: BuildingInspection[] = []\n @state() inspectionSummary: InspectionSummary = {\n wait: 0,\n request: 0,\n pass: 0,\n fail: 0\n }\n @state() weather: Weather = {\n rain: 0,\n temperature: 0,\n humidity: 0,\n wind: ''\n }\n\n render() {\n return html`\n <div header>\n <h2>${this.project.name}</h2>\n <div button-container>\n <md-elevated-button href=${`project-update/${this.project.id}`}>\n <md-icon slot=\"icon\">assignment</md-icon>프로젝트 정보 수정\n </md-elevated-button>\n <md-elevated-button href=${`project-plan-management/${this.project.id}`}>\n <md-icon slot=\"icon\">description</md-icon>도면 관리\n </md-elevated-button>\n <md-elevated-button href=${`project-task-update/${this.project.id}`}>\n <md-icon slot=\"icon\">event_note</md-icon>공정표 관리\n </md-elevated-button>\n </div>\n </div>\n\n <div body>\n <div>\n <div left-top>\n <h3>기본 정보</h3>\n <div content-1>\n <img\n ?no-image=${!this.project.mainPhoto?.fullpath}\n src=${this.project.mainPhoto?.fullpath || '/assets/images/no-image.png'}\n />\n\n <div>\n <div row>\n <span>- 면적 : </span>\n <span>${this.project.buildingComplex?.area?.toLocaleString()}</span>\n </div>\n <div row>\n <span>- 착공 ~ 준공 : </span>\n <span bold>${this.project.startDate} ~ ${this.project.endDate}</span>\n </div>\n <div row>\n <span>- 발주처 : </span>\n <span>${this.project.buildingComplex?.clientCompany}</span>\n </div>\n <div row>\n <span>- 건설사 : </span>\n <span>${this.project.buildingComplex?.constructionCompany}</span>\n </div>\n <div row>\n <span>- 감리사 : </span>\n <span>${this.project.buildingComplex?.supervisoryCompany}</span>\n </div>\n <div row>\n <span>- 설계사 : </span>\n <span>${this.project.buildingComplex?.designCompany}</span>\n </div>\n </div>\n </div>\n\n <div content-2>\n <div row>\n <span>- 건설구분 : </span>\n <span>${this.project.buildingComplex?.constructionType}</span>\n </div>\n <div row>\n <span>- 공사금액 : </span>\n <span>${this.project.buildingComplex?.constructionCost?.toLocaleString()} 원</span>\n </div>\n <div row>\n <span>- 세대수 : </span>\n <span>${this.project.buildingComplex?.householdCount?.toLocaleString()}</span>\n </div>\n <div row>\n <span>- 기타 : </span>\n <span>${this.project.buildingComplex?.etc}</span>\n </div>\n </div>\n </div>\n\n <div left-bottom>\n <h3>조감도(BIM도면)</h3>\n ${this.project.buildingComplex?.drawing?.fullpath\n ? html`<div building-complex-img></div>`\n : html`<img building-complex-img src=\"/assets/images/img-building-complex-default.jpg\" />`}\n <div>\n <div subject bold>개별 단지 상세정보 바로가기</div>\n <div building-container>\n ${this.project.buildingComplex?.buildings?.map(building => {\n return html`<md-outlined-button href=${`building-complex-detail/${this.project.id}?buildingId=${building.id}`}>\n ${building.name}\n </md-outlined-button>`\n })}\n </div>\n </div>\n </div>\n </div>\n\n <div>\n <div right-top>\n <h3>프로젝트 현황</h3>\n <div state>\n <span progress>\n <ox-progress-circle\n .value=${this.project.totalProgress}\n titleText=\"전체\"\n suffix=\"%\"\n fontSize=\"27px\"\n fontColor=\"#4E5055\"\n borderStyle=\"none\"\n innerCircleSize=\"28%\"\n circleColor=\"#0595E5\"\n shadow=\"#00000026 4px 4px 4px\"\n background=\"#eaf5fd\"\n ></ox-progress-circle>\n <div>전체공정율(%)</div>\n </span>\n <span progress>\n <ox-progress-circle\n .value=${this.project.weeklyProgress}\n titleText=\"주간\"\n suffix=\"%\"\n fontSize=\"27px\"\n fontColor=\"#4E5055\"\n borderStyle=\"none\"\n innerCircleSize=\"28%\"\n circleColor=\"#06B5AF\"\n shadow=\"#00000026 4px 4px 4px\"\n background=\"#eaf7f7\"\n ></ox-progress-circle>\n <div week>주간공정율(%)</div>\n </span>\n <span weather>\n <div bold>현장현황</div>\n <div>\n <span><md-icon slot=\"icon\">rainy</md-icon>강수확률</span>\n <span bold>${this.weather.rain}%</span>\n </div>\n <div>\n <span><md-icon slot=\"icon\">humidity_percentage</md-icon> 습도</span>\n <span bold>${this.weather.humidity}%</span>\n </div>\n <div>\n <span><md-icon slot=\"icon\">thermostat</md-icon> 온도</span>\n <span bold>${this.weather.temperature}°C</span>\n </div>\n <div>\n <span><md-icon slot=\"icon\">air</md-icon> 풍향</span>\n <span bold>${this.weather.wind}</span>\n </div>\n </span>\n </div>\n <div inspection>\n <span name bold>\n <md-icon slot=\"icon\">list_alt_add</md-icon>\n 시공검측<br />현황\n </span>\n <span>\n <div>검측요청</div>\n <div bold>${this.inspectionSummary.wait}</div>\n </span>\n <span>\n <div>검측대기</div>\n <div bold>${this.inspectionSummary.request}</div>\n </span>\n <span>\n <div>합격</div>\n <div bold pass>${this.inspectionSummary.pass}</div>\n </span>\n <span>\n <div>불합격</div>\n <div bold fail>${this.inspectionSummary.fail}</div>\n </span>\n </div>\n <div notice>\n <div name bold>공지사항</div>\n <div content>${this.project.buildingComplex.notice}</div>\n </div>\n </div>\n\n <div right-bottom>\n <h3>검측 현황</h3>\n <div table-container>\n <hr />\n <table>\n <thead>\n <tr>\n <th width=\"5%\">순번</th>\n <th width=\"10%\">검측 위치</th>\n <th width=\"10%\">공종</th>\n <th width=\"20%\">내용</th>\n <th width=\"15%\">검측 요청일</th>\n <th width=\"10%\">검측 결과</th>\n <th width=\"15%\">검측 결과 데이터</th>\n </tr>\n </thead>\n <tbody>\n ${this.buildingInspections.map((inspection, idx) => {\n return html` <tr @click=${() => this._onClickInspection(inspection.id || '')}>\n <td>${idx + 1}</td>\n <td>${inspection?.buildingLevel?.building?.name} ${inspection?.buildingLevel?.floor}층</td>\n <td bold>${inspection.checklist?.constructionType}</td>\n <td>${inspection.checklist?.inspectionParts?.join(', ') || ''}</td>\n <td>${this._formatDate(inspection.requestDate)}</td>\n <td bold>${inspection.status && BUILDING_INSPECTION_STATUS[inspection.status]}</td>\n <td></td>\n </tr>`\n })}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n `\n }\n\n async pageInitialized(lifecycle: PageLifecycle) {}\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.projectId = lifecycle.resourceId || ''\n await this.initProject(lifecycle.resourceId)\n }\n }\n\n async initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!, $projectId: String!, $params: BuildingInspectionsOfProject!) {\n project(id: $id) {\n id\n name\n startDate\n endDate\n mainPhoto {\n fullpath\n }\n totalProgress\n weeklyProgress\n kpi\n inspPassRate\n robotProgressRate\n structuralSafetyRate\n buildingComplex {\n id\n address\n latitude\n longitude\n area\n clientCompany\n constructionCompany\n supervisoryCompany\n designCompany\n drawing {\n id\n name\n fullpath\n }\n constructionType\n constructionCost\n etc\n notice\n householdCount\n buildingCount\n buildings {\n id\n name\n floorCount\n }\n }\n }\n\n inspectionSummary: buildingInspectionSummaryOfProject(projectId: $projectId) {\n wait\n request\n pass\n fail\n }\n\n buildingInspectionsOfProject(params: $params) {\n items {\n id\n status\n requestDate\n buildingLevel {\n floor\n building {\n name\n }\n }\n checklist {\n name\n constructionType\n constructionDetailType\n inspectionParts\n }\n }\n total\n }\n }\n `,\n variables: {\n id: projectId,\n projectId,\n params: {\n projectId,\n limit: 20\n }\n }\n })\n\n if (response.errors) return\n\n this.project = response.data?.project || {}\n this.inspectionSummary = response.data?.inspectionSummary || {}\n this.buildingInspections = response.data?.buildingInspectionsOfProject?.items || []\n\n const { latitude, longitude } = this.project?.buildingComplex\n if (latitude && longitude) {\n this.weather = await _getWeather(latitude, longitude)\n }\n }\n\n private _onClickInspection(buildingInspectionId: string) {\n navigate(`building-inspection-detail-drawing/${buildingInspectionId}`)\n }\n\n private _formatDate(date: Date | undefined) {\n return date\n ? new Intl.DateTimeFormat('en-CA', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(new Date(date))\n : ''\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"project-detail.js","sourceRoot":"","sources":["../../../client/pages/project/project-detail.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/textfield/outlined-text-field.js'\nimport '@material/web/button/outlined-button.js'\n\nimport { navigate, PageView } from '@operato/shell'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { css, html } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { client } from '@operato/graphql'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport gql from 'graphql-tag'\nimport { BUILDING_INSPECTION_STATUS, BuildingInspection, BuildingInspectionStatus, Project } from './project-list'\nimport _getWeather from '../lib/waether'\nimport '@operato/chart/ox-progress-circle.js'\n\nexport interface InspectionSummary {\n wait: number\n request: number\n pass: number\n fail: number\n}\n\ninterface Weather {\n rain: number\n temperature: number\n humidity: number\n wind: string\n}\n\n@customElement('project-detail')\nexport class ProjectDetail extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: #f7f7f7;\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: 15px;\n --md-outlined-button-leading-space: 15px;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px 20px;\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n\n md-elevated-button {\n margin: 0px 3px;\n\n --md-elevated-button-container-height: 35px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: #fff;\n --md-elevated-button-hover-label-text-color: #fff;\n --md-elevated-button-pressed-label-text-color: #fff;\n --md-elevated-button-focus-label-text-color: #fff;\n --md-elevated-button-icon-color: #fff;\n --md-elevated-button-hover-icon-color: #fff;\n --md-elevated-button-pressed-icon-color: #fff;\n --md-elevated-button-focus-icon-color: #fff;\n }\n }\n }\n\n div[body] {\n display: flex;\n margin: 0px 25px 25px 25px;\n gap: 10px;\n\n h3 {\n color: #2e79be;\n font-size: 18px;\n margin: 0px;\n\n a {\n text-decoration: none;\n color: #2e79be;\n }\n }\n\n & > div {\n display: flex;\n flex: 1;\n gap: 10px;\n flex-direction: column;\n\n & > div {\n display: flex;\n flex-direction: column;\n background-color: #ffffff;\n border: 1px solid #cccccc80;\n gap: 10px;\n padding: 15px;\n border-radius: 5px;\n }\n\n div[left-top] {\n div[content-1] {\n display: flex;\n align-items: center;\n gap: 15px;\n\n img {\n width: 42%;\n height: auto;\n aspect-ratio: 1920 / 1080;\n }\n img[no-image] {\n object-fit: contain;\n opacity: 0.5;\n }\n\n div[row] {\n line-height: 25px;\n }\n }\n div[content-2] {\n height: 65px;\n overflow-y: auto;\n }\n }\n\n div[left-bottom] {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n\n [building-complex-img] {\n flex: 1;\n aspect-ratio: 2 / 1;\n }\n\n img {\n opacity: 0.5;\n }\n\n div[subject] {\n margin-bottom: 7px;\n }\n\n div[building-container] {\n display: block;\n overflow-y: auto;\n\n & > * {\n margin-right: 10px;\n margin-bottom: 7px;\n }\n }\n }\n\n div[right-top] {\n div[state] {\n display: grid;\n grid-template-columns: 0.95fr 0.95fr 1.1fr;\n gap: 15px;\n\n span[progress] {\n max-width: 170px;\n text-align: center;\n display: flex;\n justify-self: center;\n flex-direction: column;\n width: 100%;\n\n & > div {\n font-weight: bold;\n color: #2e79be;\n font-size: 12px;\n margin-top: 5px;\n }\n & > div[week] {\n color: #06b5af;\n }\n }\n span[weather] {\n display: flex;\n flex-direction: column;\n gap: 5px;\n margin-left: 10px;\n\n & > div {\n display: flex;\n justify-content: space-between;\n\n & > span {\n display: flex;\n }\n }\n }\n }\n div[inspection] {\n display: grid;\n grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;\n margin-top: 5px;\n background: #f6f6f6;\n border-radius: 7px;\n padding: 7px 0px;\n\n & > span {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n div[wait] {\n color: #4e5055;\n }\n div[request] {\n color: #2e79be;\n }\n div[pass] {\n color: #1bb401;\n }\n div[fail] {\n color: #ff4444;\n }\n }\n & > span[name] {\n flex-direction: row;\n text-align: right;\n gap: 10px;\n\n md-icon {\n width: 40px;\n height: 40px;\n border-radius: 7px;\n color: #fff;\n background: #f16154;\n }\n }\n }\n div[notice] {\n margin-top: 7px;\n\n div[name] {\n margin-left: 4px;\n }\n div[content] {\n background-color: #ebc8321a;\n border-radius: 10px;\n padding: 10px;\n font-size: 14px;\n margin-top: 6px;\n }\n }\n }\n\n div[right-bottom] {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n\n div[table-container] {\n flex: 1;\n\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n }\n\n hr {\n position: sticky;\n margin: 0;\n top: 0px;\n border: 1px solid #3295f1;\n }\n\n table {\n border-collapse: collapse;\n table-layout: fixed;\n }\n\n thead {\n position: sticky;\n top: 2px;\n background-color: #464651;\n color: #fff;\n z-index: 1;\n }\n\n thead th {\n padding: 5px;\n font-size: 15px;\n text-wrap: pretty;\n }\n\n tbody td {\n border-bottom: 1px solid #cccccc;\n padding: 5px 3px;\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n font-size: 13px;\n }\n\n md-elevated-button {\n margin: 0px 3px;\n\n --md-elevated-button-container-height: 35px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: #fff;\n --md-elevated-button-hover-label-text-color: #fff;\n --md-elevated-button-pressed-label-text-color: #fff;\n --md-elevated-button-focus-label-text-color: #fff;\n --md-elevated-button-icon-color: #fff;\n --md-elevated-button-hover-icon-color: #fff;\n --md-elevated-button-pressed-icon-color: #fff;\n --md-elevated-button-focus-icon-color: #fff;\n\n &[red] {\n --md-elevated-button-container-color: #e15757;\n }\n }\n }\n }\n }\n `\n ]\n\n get context() {\n return {\n title: '진행 중 프로젝트 상세 정보'\n }\n }\n\n private defaultProject = {\n name: '',\n buildingComplex: {\n address: '',\n area: 0,\n constructionCompany: '',\n clientCompany: '',\n supervisoryCompany: '',\n designCompany: '',\n constructionType: '',\n buildings: []\n }\n }\n\n @state() projectId: string = ''\n @state() project: Project = { ...this.defaultProject }\n @state() buildingInspections: BuildingInspection[] = []\n @state() inspectionSummary: InspectionSummary = {\n wait: 0,\n request: 0,\n pass: 0,\n fail: 0\n }\n @state() weather: Weather = {\n rain: 0,\n temperature: 0,\n humidity: 0,\n wind: ''\n }\n\n render() {\n return html`\n <div header>\n <h2>${this.project.name}</h2>\n <div button-container>\n <md-elevated-button href=${`project-update/${this.project.id}`}>\n <md-icon slot=\"icon\">assignment</md-icon>프로젝트 정보 수정\n </md-elevated-button>\n <md-elevated-button href=${`project-plan-management/${this.project.id}`}>\n <md-icon slot=\"icon\">description</md-icon>도면 관리\n </md-elevated-button>\n <md-elevated-button href=${`project-task-update/${this.project.id}`}>\n <md-icon slot=\"icon\">event_note</md-icon>공정표 관리\n </md-elevated-button>\n </div>\n </div>\n\n <div body>\n <div>\n <div left-top>\n <h3>기본 정보</h3>\n <div content-1>\n <img\n ?no-image=${!this.project.mainPhoto?.fullpath}\n src=${this.project.mainPhoto?.fullpath || '/assets/images/no-image.png'}\n />\n\n <div>\n <div row>\n <span>- 면적 : </span>\n <span>${this.project.buildingComplex?.area?.toLocaleString()} ㎡</span>\n </div>\n <div row>\n <span>- 착공 ~ 준공 : </span>\n <span bold>${this.project.startDate} ~ ${this.project.endDate}</span>\n </div>\n <div row>\n <span>- 발주처 : </span>\n <span>${this.project.buildingComplex?.clientCompany}</span>\n </div>\n <div row>\n <span>- 건설사 : </span>\n <span>${this.project.buildingComplex?.constructionCompany}</span>\n </div>\n <div row>\n <span>- 감리사 : </span>\n <span>${this.project.buildingComplex?.supervisoryCompany}</span>\n </div>\n <div row>\n <span>- 설계사 : </span>\n <span>${this.project.buildingComplex?.designCompany}</span>\n </div>\n </div>\n </div>\n\n <div content-2>\n <div row>\n <span>- 건설구분 : </span>\n <span>${this.project.buildingComplex?.constructionType}</span>\n </div>\n <div row>\n <span>- 공사금액 : </span>\n <span>${this.project.buildingComplex?.constructionCost?.toLocaleString()} 원</span>\n </div>\n <div row>\n <span>- 세대수 : </span>\n <span>${this.project.buildingComplex?.householdCount?.toLocaleString()}</span>\n </div>\n <div row>\n <span>- 기타 : </span>\n <span>${this.project.buildingComplex?.etc}</span>\n </div>\n </div>\n </div>\n\n <div left-bottom>\n <h3>조감도(BIM도면)</h3>\n ${this.project.buildingComplex?.drawing?.fullpath\n ? html`<div building-complex-img></div>`\n : html`<img building-complex-img src=\"/assets/images/img-building-complex-default.jpg\" />`}\n <div>\n <div subject bold>개별 단지 상세정보 바로가기</div>\n <div building-container>\n ${this.project.buildingComplex?.buildings?.map(building => {\n return html`<md-outlined-button href=${`building-complex-detail/${this.project.id}?buildingId=${building.id}`}>\n ${building.name}\n </md-outlined-button>`\n })}\n </div>\n </div>\n </div>\n </div>\n\n <div>\n <div right-top>\n <h3>프로젝트 현황</h3>\n <div state>\n <span progress>\n <ox-progress-circle\n .value=${this.project.totalProgress}\n titleText=\"전체\"\n suffix=\"%\"\n fontSize=\"27px\"\n fontColor=\"#4E5055\"\n borderStyle=\"none\"\n innerCircleSize=\"28%\"\n circleColor=\"#0595E5\"\n shadow=\"#00000026 4px 4px 4px\"\n background=\"#eaf5fd\"\n ></ox-progress-circle>\n <div>전체공정율(%)</div>\n </span>\n <span progress>\n <ox-progress-circle\n .value=${this.project.weeklyProgress}\n titleText=\"주간\"\n suffix=\"%\"\n fontSize=\"27px\"\n fontColor=\"#4E5055\"\n borderStyle=\"none\"\n innerCircleSize=\"28%\"\n circleColor=\"#06B5AF\"\n shadow=\"#00000026 4px 4px 4px\"\n background=\"#eaf7f7\"\n ></ox-progress-circle>\n <div week>주간공정율(%)</div>\n </span>\n <span weather>\n <div bold>현장현황</div>\n <div>\n <span><md-icon slot=\"icon\">rainy</md-icon>강수확률</span>\n <span bold>${this.weather.rain}%</span>\n </div>\n <div>\n <span><md-icon slot=\"icon\">humidity_percentage</md-icon> 습도</span>\n <span bold>${this.weather.humidity}%</span>\n </div>\n <div>\n <span><md-icon slot=\"icon\">thermostat</md-icon> 온도</span>\n <span bold>${this.weather.temperature}°C</span>\n </div>\n <div>\n <span><md-icon slot=\"icon\">air</md-icon> 풍향</span>\n <span bold>${this.weather.wind}</span>\n </div>\n </span>\n </div>\n <div inspection>\n <span name bold>\n <md-icon slot=\"icon\">list_alt_add</md-icon>\n 시공검측<br />현황\n </span>\n <span>\n <div>검측요청</div>\n <div bold>${this.inspectionSummary.wait}</div>\n </span>\n <span>\n <div>검측대기</div>\n <div bold>${this.inspectionSummary.request}</div>\n </span>\n <span>\n <div>합격</div>\n <div bold pass>${this.inspectionSummary.pass}</div>\n </span>\n <span>\n <div>불합격</div>\n <div bold fail>${this.inspectionSummary.fail}</div>\n </span>\n </div>\n <div notice>\n <div name bold>공지사항</div>\n <div content>${this.project.buildingComplex.notice}</div>\n </div>\n </div>\n\n <div right-bottom>\n <h3>검측 현황</h3>\n <div table-container>\n <hr />\n <table>\n <thead>\n <tr>\n <th width=\"5%\"></th>\n <th width=\"10%\">검측 위치</th>\n <th width=\"10%\">공종</th>\n <th width=\"20%\">내용</th>\n <th width=\"15%\">검측 요청일</th>\n <th width=\"10%\">검측 결과</th>\n <th width=\"15%\">결과 데이터</th>\n </tr>\n </thead>\n <tbody>\n ${this.buildingInspections.map((inspection, idx) => {\n return html` <tr @click=${() => this._onClickInspection(inspection.id || '')}>\n <td>${idx + 1}</td>\n <td>${inspection?.buildingLevel?.building?.name} ${inspection?.buildingLevel?.floor}층</td>\n <td bold>${inspection.checklist?.constructionType}</td>\n <td>${inspection.checklist?.inspectionParts?.join(', ') || ''}</td>\n <td>${this._formatDate(inspection.requestDate)}</td>\n <td bold>${inspection.status && BUILDING_INSPECTION_STATUS[inspection.status]}</td>\n <td></td>\n </tr>`\n })}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n `\n }\n\n async pageInitialized(lifecycle: PageLifecycle) {}\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.projectId = lifecycle.resourceId || ''\n await this.initProject(lifecycle.resourceId)\n }\n }\n\n async initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!, $projectId: String!, $params: BuildingInspectionsOfProject!) {\n project(id: $id) {\n id\n name\n startDate\n endDate\n mainPhoto {\n fullpath\n }\n totalProgress\n weeklyProgress\n kpi\n inspPassRate\n robotProgressRate\n structuralSafetyRate\n buildingComplex {\n id\n address\n latitude\n longitude\n area\n clientCompany\n constructionCompany\n supervisoryCompany\n designCompany\n drawing {\n id\n name\n fullpath\n }\n constructionType\n constructionCost\n etc\n notice\n householdCount\n buildingCount\n buildings {\n id\n name\n floorCount\n }\n }\n }\n\n inspectionSummary: buildingInspectionSummaryOfProject(projectId: $projectId) {\n wait\n request\n pass\n fail\n }\n\n buildingInspectionsOfProject(params: $params) {\n items {\n id\n status\n requestDate\n buildingLevel {\n floor\n building {\n name\n }\n }\n checklist {\n name\n constructionType\n constructionDetailType\n inspectionParts\n }\n }\n total\n }\n }\n `,\n variables: {\n id: projectId,\n projectId,\n params: {\n projectId,\n limit: 20\n }\n }\n })\n\n if (response.errors) return\n\n this.project = response.data?.project || {}\n this.inspectionSummary = response.data?.inspectionSummary || {}\n this.buildingInspections = response.data?.buildingInspectionsOfProject?.items || []\n\n const { latitude, longitude } = this.project?.buildingComplex\n if (latitude && longitude) {\n this.weather = await _getWeather(latitude, longitude)\n }\n }\n\n private _onClickInspection(buildingInspectionId: string) {\n navigate(`building-inspection-detail-drawing/${buildingInspectionId}`)\n }\n\n private _formatDate(date: Date | undefined) {\n return date\n ? new Intl.DateTimeFormat('en-CA', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(new Date(date))\n : ''\n }\n}\n"]}
|
|
@@ -297,8 +297,8 @@ ProjectPlanManagement.styles = [
|
|
|
297
297
|
grid-template-rows: 75px auto;
|
|
298
298
|
color: #4e5055;
|
|
299
299
|
|
|
300
|
-
width: 100%;
|
|
301
300
|
background-color: #f7f7f7;
|
|
301
|
+
overflow: hidden;
|
|
302
302
|
overflow-y: auto;
|
|
303
303
|
|
|
304
304
|
--grid-record-emphasized-background-color: red;
|
|
@@ -364,7 +364,7 @@ ProjectPlanManagement.styles = [
|
|
|
364
364
|
|
|
365
365
|
div[body] {
|
|
366
366
|
display: grid;
|
|
367
|
-
grid-template-rows: 240px
|
|
367
|
+
grid-template-rows: 240px 1fr 60px;
|
|
368
368
|
margin: 0px 25px 25px 25px;
|
|
369
369
|
gap: 8px;
|
|
370
370
|
|
|
@@ -381,6 +381,7 @@ ProjectPlanManagement.styles = [
|
|
|
381
381
|
color: #2e79be;
|
|
382
382
|
font-size: 18px;
|
|
383
383
|
margin: 0px;
|
|
384
|
+
text-wrap: nowrap;
|
|
384
385
|
}
|
|
385
386
|
}
|
|
386
387
|
|
|
@@ -393,6 +394,7 @@ ProjectPlanManagement.styles = [
|
|
|
393
394
|
ox-input-file {
|
|
394
395
|
height: 120px;
|
|
395
396
|
}
|
|
397
|
+
|
|
396
398
|
span[building] {
|
|
397
399
|
width: 125px;
|
|
398
400
|
text-align: center;
|
|
@@ -409,10 +411,12 @@ ProjectPlanManagement.styles = [
|
|
|
409
411
|
display: flex;
|
|
410
412
|
justify-content: space-between;
|
|
411
413
|
height: fit-content;
|
|
414
|
+
gap: 50px;
|
|
415
|
+
overflow: hidden;
|
|
412
416
|
|
|
413
417
|
span[building-button] {
|
|
414
418
|
display: flex;
|
|
415
|
-
|
|
419
|
+
margin-left: auto;
|
|
416
420
|
gap: 10px;
|
|
417
421
|
overflow-x: auto;
|
|
418
422
|
overflow-y: hidden;
|