@dssp/project 0.0.31 → 0.0.33
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/lib/select2-component.ts +21 -16
- package/client/pages/project/component/project-update-header.ts +16 -13
- package/client/pages/project/project-detail.ts +74 -60
- package/client/pages/project/project-plan-management.ts +39 -29
- package/client/pages/project/project-schedule.ts +4 -3
- package/client/pages/project/project-setting-list.ts +9 -9
- package/client/pages/project/project-update.ts +53 -29
- package/dist-client/pages/lib/select2-component.js +21 -16
- package/dist-client/pages/lib/select2-component.js.map +1 -1
- package/dist-client/pages/project/component/project-update-header.js +16 -13
- package/dist-client/pages/project/component/project-update-header.js.map +1 -1
- package/dist-client/pages/project/project-detail.js +74 -60
- package/dist-client/pages/project/project-detail.js.map +1 -1
- package/dist-client/pages/project/project-plan-management.js +39 -29
- package/dist-client/pages/project/project-plan-management.js.map +1 -1
- package/dist-client/pages/project/project-schedule.js +4 -3
- package/dist-client/pages/project/project-schedule.js.map +1 -1
- package/dist-client/pages/project/project-setting-list.js +9 -9
- package/dist-client/pages/project/project-setting-list.js.map +1 -1
- package/dist-client/pages/project/project-update.js +53 -29
- package/dist-client/pages/project/project-update.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/controllers/{project-to-excel.js → export-tasks.js} +1 -1
- package/dist-server/controllers/export-tasks.js.map +1 -0
- package/dist-server/controllers/import-task.d.ts +1 -17
- package/dist-server/controllers/import-task.js +24 -14
- package/dist-server/controllers/import-task.js.map +1 -1
- package/dist-server/controllers/parse-excel.d.ts +4 -0
- package/dist-server/controllers/parse-excel.js +75 -0
- package/dist-server/controllers/parse-excel.js.map +1 -0
- package/dist-server/controllers/types.d.ts +18 -0
- package/dist-server/controllers/types.js +3 -0
- package/dist-server/controllers/types.js.map +1 -0
- package/dist-server/routes.js +2 -2
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/project/project-mutation.d.ts +2 -1
- package/dist-server/service/project/project-mutation.js +52 -24
- package/dist-server/service/project/project-mutation.js.map +1 -1
- package/dist-server/service/task/task.d.ts +1 -0
- package/dist-server/service/task/task.js +5 -0
- package/dist-server/service/task/task.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/server/controllers/import-task.ts +25 -31
- package/server/controllers/parse-excel.ts +86 -0
- package/server/controllers/types.ts +20 -0
- package/server/routes.ts +1 -1
- package/server/service/project/project-mutation.ts +40 -24
- package/server/service/task/task.ts +4 -0
- package/dist-server/controllers/project-to-excel.js.map +0 -1
- /package/dist-server/controllers/{project-to-excel.d.ts → export-tasks.d.ts} +0 -0
- /package/server/controllers/{project-to-excel.ts → export-tasks.ts} +0 -0
|
@@ -84,8 +84,8 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
84
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
|
-
<span>-
|
|
88
|
-
<span bold>${this.project.startDate}
|
|
87
|
+
<span>- 착공~준공 : </span>
|
|
88
|
+
<span bold>${this.project.startDate}~${this.project.endDate}</span>
|
|
89
89
|
</div>
|
|
90
90
|
<div row>
|
|
91
91
|
<span>- 발주처 : </span>
|
|
@@ -233,10 +233,10 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
|
|
|
233
233
|
<table>
|
|
234
234
|
<thead>
|
|
235
235
|
<tr>
|
|
236
|
-
<th width="
|
|
236
|
+
<th width="3%"></th>
|
|
237
237
|
<th width="10%">검측 위치</th>
|
|
238
238
|
<th width="10%">공종</th>
|
|
239
|
-
<th width="
|
|
239
|
+
<th width="22%">내용</th>
|
|
240
240
|
<th width="15%">검측 요청일</th>
|
|
241
241
|
<th width="10%">검측 결과</th>
|
|
242
242
|
</tr>
|
|
@@ -383,11 +383,11 @@ ProjectDetail.styles = [
|
|
|
383
383
|
css `
|
|
384
384
|
:host {
|
|
385
385
|
display: grid;
|
|
386
|
-
grid-template-rows:
|
|
386
|
+
grid-template-rows: 55px auto;
|
|
387
387
|
color: #4e5055;
|
|
388
388
|
|
|
389
389
|
width: 100%;
|
|
390
|
-
background-color: #
|
|
390
|
+
background-color: var(--md-sys-color-background, #f6f6f6);
|
|
391
391
|
overflow-y: auto;
|
|
392
392
|
|
|
393
393
|
--grid-record-emphasized-background-color: red;
|
|
@@ -396,8 +396,9 @@ ProjectDetail.styles = [
|
|
|
396
396
|
|
|
397
397
|
md-outlined-button {
|
|
398
398
|
--md-outlined-button-container-height: 30px;
|
|
399
|
-
--md-outlined-button-trailing-space:
|
|
400
|
-
--md-outlined-button-leading-space:
|
|
399
|
+
--md-outlined-button-trailing-space: var(--spacing-medium, 8px);
|
|
400
|
+
--md-outlined-button-leading-space: var(--spacing-medium, 8px);
|
|
401
|
+
--md-sys-color-outline: rgba(51,51,51,.20);
|
|
401
402
|
}
|
|
402
403
|
|
|
403
404
|
*[bold] {
|
|
@@ -406,11 +407,12 @@ ProjectDetail.styles = [
|
|
|
406
407
|
|
|
407
408
|
div[header] {
|
|
408
409
|
display: flex;
|
|
409
|
-
margin: 0px
|
|
410
|
+
margin: 0px var(--spacing-large, 12px);
|
|
410
411
|
|
|
411
412
|
h2 {
|
|
412
413
|
flex: 0.5;
|
|
413
414
|
color: #3f71a0;
|
|
415
|
+
font-size:18px;
|
|
414
416
|
}
|
|
415
417
|
|
|
416
418
|
div[button-container] {
|
|
@@ -420,32 +422,33 @@ ProjectDetail.styles = [
|
|
|
420
422
|
flex: 0.5;
|
|
421
423
|
|
|
422
424
|
md-elevated-button {
|
|
423
|
-
margin:
|
|
425
|
+
margin: 0 var(--spacing-small, 4px);
|
|
424
426
|
|
|
425
|
-
--md-elevated-button-container-height:
|
|
427
|
+
--md-elevated-button-container-height: 32px;
|
|
426
428
|
--md-elevated-button-label-text-size: 16px;
|
|
427
429
|
--md-elevated-button-container-color: #0595e5;
|
|
428
430
|
|
|
429
|
-
--md-elevated-button-label-text-color:
|
|
430
|
-
--md-elevated-button-hover-label-text-color:
|
|
431
|
-
--md-elevated-button-pressed-label-text-color:
|
|
432
|
-
--md-elevated-button-focus-label-text-color:
|
|
433
|
-
--md-elevated-button-icon-color:
|
|
434
|
-
--md-elevated-button-hover-icon-color:
|
|
435
|
-
--md-elevated-button-pressed-icon-color:
|
|
436
|
-
--md-elevated-button-focus-icon-color:
|
|
431
|
+
--md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
|
|
432
|
+
--md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
|
|
433
|
+
--md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
|
|
434
|
+
--md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
|
|
435
|
+
--md-elevated-button-icon-color: var(--md-sys-color-on-primary);
|
|
436
|
+
--md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
|
|
437
|
+
--md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
|
|
438
|
+
--md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
|
|
437
439
|
}
|
|
438
440
|
}
|
|
439
441
|
}
|
|
440
442
|
|
|
441
443
|
div[body] {
|
|
442
444
|
display: flex;
|
|
443
|
-
margin:
|
|
444
|
-
|
|
445
|
+
margin: var(--spacing-large, 12px);
|
|
446
|
+
margin-top:0;
|
|
447
|
+
gap: var(--spacing-medium, 8px);
|
|
445
448
|
|
|
446
449
|
h3 {
|
|
447
450
|
color: #2e79be;
|
|
448
|
-
font-size:
|
|
451
|
+
font-size: 16px;
|
|
449
452
|
margin: 0px;
|
|
450
453
|
|
|
451
454
|
a {
|
|
@@ -457,16 +460,16 @@ ProjectDetail.styles = [
|
|
|
457
460
|
& > div {
|
|
458
461
|
display: flex;
|
|
459
462
|
flex: 1;
|
|
460
|
-
gap:
|
|
463
|
+
gap: var(--spacing-medium, 8px);
|
|
461
464
|
flex-direction: column;
|
|
462
465
|
|
|
463
466
|
& > div {
|
|
464
467
|
display: flex;
|
|
465
468
|
flex-direction: column;
|
|
466
|
-
background-color:
|
|
469
|
+
background-color: var(--md-sys-color-on-primary);
|
|
467
470
|
border: 1px solid #cccccc80;
|
|
468
|
-
gap:
|
|
469
|
-
padding:
|
|
471
|
+
gap: var(--spacing-medium, 8px);
|
|
472
|
+
padding: var(--spacing-large, 12px);
|
|
470
473
|
border-radius: 5px;
|
|
471
474
|
}
|
|
472
475
|
|
|
@@ -474,25 +477,24 @@ ProjectDetail.styles = [
|
|
|
474
477
|
div[content-1] {
|
|
475
478
|
display: flex;
|
|
476
479
|
align-items: center;
|
|
477
|
-
gap:
|
|
480
|
+
gap: var(--spacing-medium, 8px);
|
|
481
|
+
font-size: 14px;
|
|
478
482
|
|
|
479
483
|
img {
|
|
480
484
|
width: 42%;
|
|
481
485
|
height: auto;
|
|
482
486
|
aspect-ratio: 1920 / 1080;
|
|
487
|
+
border: 1px solid #cccccc80;
|
|
483
488
|
}
|
|
484
489
|
img[no-image] {
|
|
485
490
|
object-fit: contain;
|
|
486
491
|
opacity: 0.5;
|
|
487
492
|
}
|
|
488
|
-
|
|
489
|
-
div[row] {
|
|
490
|
-
line-height: 25px;
|
|
491
|
-
}
|
|
492
493
|
}
|
|
493
494
|
div[content-2] {
|
|
494
495
|
height: 65px;
|
|
495
496
|
overflow-y: auto;
|
|
497
|
+
font-size: 14px;
|
|
496
498
|
}
|
|
497
499
|
}
|
|
498
500
|
|
|
@@ -513,15 +515,21 @@ ProjectDetail.styles = [
|
|
|
513
515
|
}
|
|
514
516
|
|
|
515
517
|
div[subject] {
|
|
516
|
-
margin-bottom:
|
|
518
|
+
margin-bottom: var(--spacing-small, 4px);
|
|
517
519
|
}
|
|
518
520
|
|
|
519
521
|
div[building-container] {
|
|
520
522
|
display: block;
|
|
521
523
|
|
|
522
524
|
& > * {
|
|
523
|
-
margin-right:
|
|
524
|
-
margin-bottom:
|
|
525
|
+
margin-right: var(--spacing-medium, 8px);
|
|
526
|
+
margin-bottom: var(--spacing-medium, 8px);
|
|
527
|
+
}
|
|
528
|
+
md-outlined-button {
|
|
529
|
+
--md-outlined-button-container-height: 30px;
|
|
530
|
+
--md-outlined-button-trailing-space: var(--spacing-medium, 8px);
|
|
531
|
+
--md-outlined-button-leading-space: var(--spacing-medium, 8px);
|
|
532
|
+
--md-sys-color-outline: rgba(51,51,51,.20);
|
|
525
533
|
}
|
|
526
534
|
}
|
|
527
535
|
}
|
|
@@ -530,10 +538,10 @@ ProjectDetail.styles = [
|
|
|
530
538
|
div[state] {
|
|
531
539
|
display: grid;
|
|
532
540
|
grid-template-columns: 0.95fr 0.95fr 1.1fr;
|
|
533
|
-
gap:
|
|
541
|
+
gap: var(--spacing-large, 12px);
|
|
534
542
|
|
|
535
543
|
span[progress] {
|
|
536
|
-
max-width:
|
|
544
|
+
max-width: 150px;
|
|
537
545
|
text-align: center;
|
|
538
546
|
display: flex;
|
|
539
547
|
justify-self: center;
|
|
@@ -544,7 +552,7 @@ ProjectDetail.styles = [
|
|
|
544
552
|
font-weight: bold;
|
|
545
553
|
color: #2e79be;
|
|
546
554
|
font-size: 12px;
|
|
547
|
-
margin-top:
|
|
555
|
+
margin-top: var(--spacing-small, 4px);
|
|
548
556
|
}
|
|
549
557
|
& > div[week] {
|
|
550
558
|
color: #06b5af;
|
|
@@ -553,15 +561,20 @@ ProjectDetail.styles = [
|
|
|
553
561
|
span[weather] {
|
|
554
562
|
display: flex;
|
|
555
563
|
flex-direction: column;
|
|
556
|
-
gap:
|
|
557
|
-
margin-left:
|
|
564
|
+
gap: var(--spacing-small, 4px);
|
|
565
|
+
margin-left: var(--spacing-medium, 8px);
|
|
566
|
+
font-size:14px;
|
|
558
567
|
|
|
559
568
|
& > div {
|
|
560
569
|
display: flex;
|
|
561
570
|
justify-content: space-between;
|
|
571
|
+
--md-icon-size: 18px;
|
|
572
|
+
margin-right: var(--spacing-small, 4px);
|
|
562
573
|
|
|
563
574
|
& > span {
|
|
564
575
|
display: flex;
|
|
576
|
+
align-item:center;
|
|
577
|
+
var(--spacing-tiny, 2px);
|
|
565
578
|
}
|
|
566
579
|
}
|
|
567
580
|
}
|
|
@@ -569,10 +582,10 @@ ProjectDetail.styles = [
|
|
|
569
582
|
div[inspection] {
|
|
570
583
|
display: grid;
|
|
571
584
|
grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;
|
|
572
|
-
margin-top:
|
|
585
|
+
margin-top: var(--spacing-small, 4px);
|
|
573
586
|
background: #f6f6f6;
|
|
574
587
|
border-radius: 7px;
|
|
575
|
-
padding:
|
|
588
|
+
padding: var(--spacing-small, 4px) 0px;
|
|
576
589
|
|
|
577
590
|
& > span {
|
|
578
591
|
display: flex;
|
|
@@ -596,7 +609,8 @@ ProjectDetail.styles = [
|
|
|
596
609
|
& > span[name] {
|
|
597
610
|
flex-direction: row;
|
|
598
611
|
text-align: right;
|
|
599
|
-
gap:
|
|
612
|
+
gap: var(--spacing-medium, 8px);
|
|
613
|
+
line-height:1.3;
|
|
600
614
|
|
|
601
615
|
md-icon {
|
|
602
616
|
width: 40px;
|
|
@@ -608,7 +622,7 @@ ProjectDetail.styles = [
|
|
|
608
622
|
}
|
|
609
623
|
}
|
|
610
624
|
div[notice] {
|
|
611
|
-
margin-top:
|
|
625
|
+
margin-top: var(--spacing-medium, 8px);
|
|
612
626
|
|
|
613
627
|
div[name] {
|
|
614
628
|
margin-left: 4px;
|
|
@@ -616,9 +630,9 @@ ProjectDetail.styles = [
|
|
|
616
630
|
div[content] {
|
|
617
631
|
background-color: #ebc8321a;
|
|
618
632
|
border-radius: 10px;
|
|
619
|
-
padding:
|
|
633
|
+
padding: var(--spacing-medium, 8px);
|
|
620
634
|
font-size: 14px;
|
|
621
|
-
margin-top:
|
|
635
|
+
margin-top: var(--spacing-small, 4px);
|
|
622
636
|
}
|
|
623
637
|
}
|
|
624
638
|
}
|
|
@@ -652,21 +666,21 @@ ProjectDetail.styles = [
|
|
|
652
666
|
|
|
653
667
|
thead {
|
|
654
668
|
position: sticky;
|
|
655
|
-
top: 2px;
|
|
669
|
+
top: var(--spacing-tiny, 2px);
|
|
656
670
|
background-color: #464651;
|
|
657
|
-
color:
|
|
671
|
+
color: var(--md-sys-color-on-primary);
|
|
658
672
|
z-index: 1;
|
|
659
673
|
}
|
|
660
674
|
|
|
661
675
|
thead th {
|
|
662
|
-
padding:
|
|
676
|
+
padding: var(--spacing-tiny, 2px) var(--spacing-small, 4px);
|
|
663
677
|
font-size: 15px;
|
|
664
678
|
text-wrap: pretty;
|
|
665
679
|
}
|
|
666
680
|
|
|
667
681
|
tbody td {
|
|
668
|
-
border-bottom: 1px solid
|
|
669
|
-
padding:
|
|
682
|
+
border-bottom: 1px solid rgba(51,51,51,.20);
|
|
683
|
+
padding: var(--spacing-small, 4px);
|
|
670
684
|
text-align: center;
|
|
671
685
|
white-space: nowrap;
|
|
672
686
|
text-overflow: ellipsis;
|
|
@@ -675,20 +689,20 @@ ProjectDetail.styles = [
|
|
|
675
689
|
}
|
|
676
690
|
|
|
677
691
|
md-elevated-button {
|
|
678
|
-
margin:
|
|
692
|
+
margin: 0 var(--spacing-small, 4px);
|
|
679
693
|
|
|
680
|
-
--md-elevated-button-container-height:
|
|
694
|
+
--md-elevated-button-container-height: 32px;
|
|
681
695
|
--md-elevated-button-label-text-size: 16px;
|
|
682
696
|
--md-elevated-button-container-color: #0595e5;
|
|
683
697
|
|
|
684
|
-
--md-elevated-button-label-text-color:
|
|
685
|
-
--md-elevated-button-hover-label-text-color:
|
|
686
|
-
--md-elevated-button-pressed-label-text-color:
|
|
687
|
-
--md-elevated-button-focus-label-text-color:
|
|
688
|
-
--md-elevated-button-icon-color:
|
|
689
|
-
--md-elevated-button-hover-icon-color:
|
|
690
|
-
--md-elevated-button-pressed-icon-color:
|
|
691
|
-
--md-elevated-button-focus-icon-color:
|
|
698
|
+
--md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
|
|
699
|
+
--md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
|
|
700
|
+
--md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
|
|
701
|
+
--md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
|
|
702
|
+
--md-elevated-button-icon-color: var(--md-sys-color-on-primary);
|
|
703
|
+
--md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
|
|
704
|
+
--md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
|
|
705
|
+
--md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
|
|
692
706
|
|
|
693
707
|
&[red] {
|
|
694
708
|
--md-elevated-button-container-color: #e15757;
|
|
@@ -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 flex: 1;\n\n display: flex;\n flex-direction: column;\n\n [building-complex-img] {\n width: 100%;\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\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 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 </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 </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: 10\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: 55px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\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: var(--spacing-medium, 8px);\n --md-outlined-button-leading-space: var(--spacing-medium, 8px);\n --md-sys-color-outline: rgba(51,51,51,.20);\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px var(--spacing-large, 12px);\n\n h2 {\n flex: 0.5;\n color: #3f71a0;\n font-size:18px;\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: 0 var(--spacing-small, 4px);\n\n --md-elevated-button-container-height: 32px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);\n }\n }\n }\n\n div[body] {\n display: flex;\n margin: var(--spacing-large, 12px);\n margin-top:0;\n gap: var(--spacing-medium, 8px);\n\n h3 {\n color: #2e79be;\n font-size: 16px;\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: var(--spacing-medium, 8px);\n flex-direction: column;\n\n & > div {\n display: flex;\n flex-direction: column;\n background-color: var(--md-sys-color-on-primary);\n border: 1px solid #cccccc80;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-large, 12px);\n border-radius: 5px;\n }\n\n div[left-top] {\n div[content-1] {\n display: flex;\n align-items: center;\n gap: var(--spacing-medium, 8px);\n font-size: 14px;\n\n img {\n width: 42%;\n height: auto;\n aspect-ratio: 1920 / 1080;\n border: 1px solid #cccccc80;\n }\n img[no-image] {\n object-fit: contain;\n opacity: 0.5;\n }\n }\n div[content-2] {\n height: 65px;\n overflow-y: auto;\n font-size: 14px;\n }\n }\n\n div[left-bottom] {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n\n [building-complex-img] {\n width: 100%;\n flex: 1;\n aspect-ratio: 2 / 1;\n }\n\n img {\n opacity: 0.5;\n }\n\n div[subject] {\n margin-bottom: var(--spacing-small, 4px);\n }\n\n div[building-container] {\n display: block;\n\n & > * {\n margin-right: var(--spacing-medium, 8px);\n margin-bottom: var(--spacing-medium, 8px);\n }\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: var(--spacing-medium, 8px);\n --md-outlined-button-leading-space: var(--spacing-medium, 8px);\n --md-sys-color-outline: rgba(51,51,51,.20);\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: var(--spacing-large, 12px);\n\n span[progress] {\n max-width: 150px;\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: var(--spacing-small, 4px);\n }\n & > div[week] {\n color: #06b5af;\n }\n }\n span[weather] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n margin-left: var(--spacing-medium, 8px);\n font-size:14px;\n\n & > div {\n display: flex;\n justify-content: space-between;\n --md-icon-size: 18px;\n margin-right: var(--spacing-small, 4px);\n\n & > span {\n display: flex;\n align-item:center;\n var(--spacing-tiny, 2px);\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: var(--spacing-small, 4px);\n background: #f6f6f6;\n border-radius: 7px;\n padding: var(--spacing-small, 4px) 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: var(--spacing-medium, 8px);\n line-height:1.3;\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: var(--spacing-medium, 8px);\n\n div[name] {\n margin-left: 4px;\n }\n div[content] {\n background-color: #ebc8321a;\n border-radius: 10px;\n padding: var(--spacing-medium, 8px);\n font-size: 14px;\n margin-top: var(--spacing-small, 4px);\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 width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n }\n\n thead {\n position: sticky;\n top: var(--spacing-tiny, 2px);\n background-color: #464651;\n color: var(--md-sys-color-on-primary);\n z-index: 1;\n }\n\n thead th {\n padding: var(--spacing-tiny, 2px) var(--spacing-small, 4px);\n font-size: 15px;\n text-wrap: pretty;\n }\n\n tbody td {\n border-bottom: 1px solid rgba(51,51,51,.20);\n padding: var(--spacing-small, 4px);\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: 0 var(--spacing-small, 4px);\n\n --md-elevated-button-container-height: 32px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);\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=\"3%\"></th>\n <th width=\"10%\">검측 위치</th>\n <th width=\"10%\">공종</th>\n <th width=\"22%\">내용</th>\n <th width=\"15%\">검측 요청일</th>\n <th width=\"10%\">검측 결과</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 </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: 10\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"]}
|
|
@@ -282,10 +282,10 @@ ProjectPlanManagement.styles = [
|
|
|
282
282
|
css `
|
|
283
283
|
:host {
|
|
284
284
|
display: grid;
|
|
285
|
-
grid-template-rows:
|
|
285
|
+
grid-template-rows: 55px auto;
|
|
286
286
|
color: #4e5055;
|
|
287
287
|
|
|
288
|
-
background-color: #
|
|
288
|
+
background-color: var(--md-sys-color-background, #f6f6f6);
|
|
289
289
|
overflow: hidden;
|
|
290
290
|
overflow-y: auto;
|
|
291
291
|
|
|
@@ -297,10 +297,15 @@ ProjectPlanManagement.styles = [
|
|
|
297
297
|
width: 100%;
|
|
298
298
|
|
|
299
299
|
--md-outlined-text-field-container-shape: 5px;
|
|
300
|
+
--md-outlined-text-field-outline-color: rgba(51,51,51,.20);
|
|
301
|
+
--md-outlined-text-field-focus-outline-color: #1f7fd9;
|
|
302
|
+
--md-outlined-text-field-focus-outline-width: 1px;
|
|
300
303
|
--md-sys-color-primary: #586878;
|
|
301
304
|
--md-outlined-text-field-input-text-size: 14px;
|
|
302
|
-
--md-outlined-field-bottom-space:
|
|
303
|
-
--md-outlined-field-top-space:
|
|
305
|
+
--md-outlined-field-bottom-space: 3px;
|
|
306
|
+
--md-outlined-field-top-space: 3px;
|
|
307
|
+
--md-outlined-field-leading-space: var(--spacing-medium, 8px);
|
|
308
|
+
--md-outlined-field-trailing-space: var(--spacing-medium, 8px);
|
|
304
309
|
}
|
|
305
310
|
|
|
306
311
|
ox-input-image {
|
|
@@ -314,22 +319,23 @@ ProjectPlanManagement.styles = [
|
|
|
314
319
|
|
|
315
320
|
div[body] {
|
|
316
321
|
display: grid;
|
|
317
|
-
grid-template-rows:
|
|
318
|
-
margin:
|
|
319
|
-
|
|
322
|
+
grid-template-rows: 205px 1fr 60px;
|
|
323
|
+
margin: var(--spacing-large, 12px);
|
|
324
|
+
margin-top:0;
|
|
325
|
+
gap: var(--spacing-medium, 8px);
|
|
320
326
|
|
|
321
327
|
& > div {
|
|
322
328
|
display: grid;
|
|
323
329
|
grid-template-rows: 25px auto;
|
|
324
|
-
padding:
|
|
325
|
-
background-color:
|
|
330
|
+
padding: var(--spacing-large, 12px);
|
|
331
|
+
background-color: var(--md-sys-color-on-primary);
|
|
326
332
|
border: 1px solid #cccccc80;
|
|
327
333
|
border-radius: 5px;
|
|
328
|
-
gap:
|
|
334
|
+
gap: var(--spacing-medium, 8px);
|
|
329
335
|
|
|
330
336
|
h3 {
|
|
331
337
|
color: #2e79be;
|
|
332
|
-
font-size:
|
|
338
|
+
font-size: 16px;
|
|
333
339
|
margin: 0px;
|
|
334
340
|
text-wrap: nowrap;
|
|
335
341
|
}
|
|
@@ -337,12 +343,12 @@ ProjectPlanManagement.styles = [
|
|
|
337
343
|
|
|
338
344
|
& > div[building-container] > div {
|
|
339
345
|
display: flex;
|
|
340
|
-
gap:
|
|
346
|
+
gap: var(--spacing-medium, 8px);
|
|
341
347
|
overflow-x: auto;
|
|
342
348
|
overflow-y: hidden;
|
|
343
349
|
|
|
344
350
|
ox-input-file {
|
|
345
|
-
height:
|
|
351
|
+
height: 100px;
|
|
346
352
|
}
|
|
347
353
|
|
|
348
354
|
span[building] {
|
|
@@ -351,7 +357,8 @@ ProjectPlanManagement.styles = [
|
|
|
351
357
|
|
|
352
358
|
div {
|
|
353
359
|
color: #586878;
|
|
354
|
-
margin-top:
|
|
360
|
+
margin-top:var(--spacing-small, 4px);
|
|
361
|
+
font-size: 14px;
|
|
355
362
|
}
|
|
356
363
|
}
|
|
357
364
|
}
|
|
@@ -361,38 +368,40 @@ ProjectPlanManagement.styles = [
|
|
|
361
368
|
display: flex;
|
|
362
369
|
justify-content: space-between;
|
|
363
370
|
height: fit-content;
|
|
364
|
-
gap:
|
|
371
|
+
gap: var(--spacing-huge, 24px);
|
|
365
372
|
overflow: hidden;
|
|
366
373
|
|
|
367
374
|
span[building-button] {
|
|
368
375
|
display: flex;
|
|
369
376
|
margin-left: auto;
|
|
370
|
-
gap:
|
|
377
|
+
gap: var(--spacing-small, 4px);
|
|
371
378
|
overflow-x: auto;
|
|
372
379
|
overflow-y: hidden;
|
|
373
380
|
|
|
374
381
|
md-filled-button {
|
|
375
382
|
--md-filled-button-container-color: #0595e5;
|
|
376
383
|
--md-filled-button-container-height: 30px;
|
|
377
|
-
--md-filled-button-trailing-space:
|
|
378
|
-
--md-filled-button-leading-space:
|
|
384
|
+
--md-filled-button-trailing-space: var(--spacing-medium, 8px);
|
|
385
|
+
--md-filled-button-leading-space: var(--spacing-medium, 8px);
|
|
379
386
|
}
|
|
380
387
|
md-outlined-button {
|
|
381
388
|
--md-outlined-button-container-height: 30px;
|
|
382
|
-
--md-outlined-button-trailing-space:
|
|
383
|
-
--md-outlined-button-leading-space:
|
|
389
|
+
--md-outlined-button-trailing-space: var(--spacing-medium, 8px);
|
|
390
|
+
--md-outlined-button-leading-space: var(--spacing-medium, 8px);
|
|
391
|
+
--md-sys-color-outline: rgba(51,51,51,.20);
|
|
384
392
|
}
|
|
385
393
|
}
|
|
386
394
|
}
|
|
387
395
|
|
|
388
396
|
div[floor-plan] {
|
|
389
397
|
overflow-y: auto;
|
|
390
|
-
margin-top:
|
|
398
|
+
margin-top: var(--spacing-medium, 8px);
|
|
391
399
|
|
|
392
400
|
& > span {
|
|
393
401
|
display: inline-block;
|
|
394
402
|
text-align: center;
|
|
395
|
-
margin:
|
|
403
|
+
margin-right:var(--spacing-medium, 8px);
|
|
404
|
+
margin-bottom:var(--spacing-medium, 8px);
|
|
396
405
|
cursor: pointer;
|
|
397
406
|
|
|
398
407
|
& > [name='building-plan'] {
|
|
@@ -401,19 +410,20 @@ ProjectPlanManagement.styles = [
|
|
|
401
410
|
display: flex;
|
|
402
411
|
flex-direction: column;
|
|
403
412
|
justify-content: center;
|
|
404
|
-
border: 1px solid
|
|
405
|
-
box-shadow:
|
|
413
|
+
border: 1px solid rgba(51,51,51,.1);
|
|
414
|
+
box-shadow: 1px 1px 1px #0000001a;
|
|
406
415
|
align-items: center;
|
|
407
|
-
border-radius:
|
|
416
|
+
border-radius: 5px;
|
|
408
417
|
font-size: 13px;
|
|
409
418
|
|
|
410
419
|
md-icon {
|
|
411
|
-
margin-bottom:
|
|
420
|
+
margin-bottom: var(--spacing-small, 4px);
|
|
412
421
|
}
|
|
413
422
|
}
|
|
414
423
|
|
|
415
424
|
& > div[floor-name] {
|
|
416
|
-
margin-top:
|
|
425
|
+
margin-top: var(--spacing-small, 4px);
|
|
426
|
+
font-size:14px;
|
|
417
427
|
|
|
418
428
|
&[no-data] {
|
|
419
429
|
color: #f16154;
|
|
@@ -430,8 +440,8 @@ ProjectPlanManagement.styles = [
|
|
|
430
440
|
& > div {
|
|
431
441
|
display: flex;
|
|
432
442
|
align-items: center;
|
|
433
|
-
gap:
|
|
434
|
-
margin-left:
|
|
443
|
+
gap: var(--spacing-medium, 8px);
|
|
444
|
+
margin-left: var(--spacing-medium, 8px);
|
|
435
445
|
|
|
436
446
|
md-outlined-text-field {
|
|
437
447
|
width: 100px;
|