@dssp/project 1.0.0-alpha.5 → 1.0.0-alpha.8

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.
Files changed (32) hide show
  1. package/dist-client/pages/lib/waether.d.ts +2 -1
  2. package/dist-client/pages/lib/waether.js +7 -3
  3. package/dist-client/pages/lib/waether.js.map +1 -1
  4. package/dist-client/pages/project/popup/popup-plan-export.d.ts +10 -0
  5. package/dist-client/pages/project/popup/popup-plan-export.js +236 -0
  6. package/dist-client/pages/project/popup/popup-plan-export.js.map +1 -0
  7. package/dist-client/pages/project/popup/popup-plan-upload.d.ts +3 -0
  8. package/dist-client/pages/project/popup/popup-plan-upload.js +130 -4
  9. package/dist-client/pages/project/popup/popup-plan-upload.js.map +1 -1
  10. package/dist-client/pages/project/project-detail.d.ts +2 -1
  11. package/dist-client/pages/project/project-detail.js +269 -80
  12. package/dist-client/pages/project/project-detail.js.map +1 -1
  13. package/dist-client/pages/project/project-list.d.ts +12 -0
  14. package/dist-client/pages/project/project-list.js +6 -0
  15. package/dist-client/pages/project/project-list.js.map +1 -1
  16. package/dist-client/pages/project/project-plan-management.js +29 -13
  17. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  18. package/dist-client/pages/project/project-update.d.ts +1 -0
  19. package/dist-client/pages/project/project-update.js +128 -17
  20. package/dist-client/pages/project/project-update.js.map +1 -1
  21. package/dist-client/tsconfig.tsbuildinfo +1 -1
  22. package/dist-server/service/project/project-mutation.d.ts +1 -0
  23. package/dist-server/service/project/project-mutation.js +102 -3
  24. package/dist-server/service/project/project-mutation.js.map +1 -1
  25. package/dist-server/service/project/project-type.d.ts +1 -0
  26. package/dist-server/service/project/project-type.js +5 -1
  27. package/dist-server/service/project/project-type.js.map +1 -1
  28. package/dist-server/service/project/project.d.ts +3 -1
  29. package/dist-server/service/project/project.js +6 -0
  30. package/dist-server/service/project/project.js.map +1 -1
  31. package/dist-server/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +13 -12
@@ -41,7 +41,7 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
41
41
  };
42
42
  }
43
43
  render() {
44
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30;
44
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31;
45
45
  return html `
46
46
  <project-update-header .projectId=${this.project.id || ''} title="프로젝트 정보 관리" @custom-click=${this._saveProject}>
47
47
  </project-update-header>
@@ -326,7 +326,7 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
326
326
  <div warn>* 동/층의 정보를 수정하면 기존의 동/층 정보는 모두 제거됩니다.</div>
327
327
  <div separate-container>
328
328
  ${(_22 = (_21 = (_20 = this.project) === null || _20 === void 0 ? void 0 : _20.buildingComplex) === null || _21 === void 0 ? void 0 : _21.buildings) === null || _22 === void 0 ? void 0 : _22.map((building, idx) => {
329
- var _a;
329
+ var _a, _b;
330
330
  return html `
331
331
  <div>
332
332
  <span>
@@ -339,7 +339,7 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
339
339
  placeholder="ooo동"
340
340
  ></md-outlined-text-field>
341
341
  </span>
342
- <span>
342
+ <span floor-row>
343
343
  <span floor-title>층수</span>
344
344
  <md-outlined-text-field
345
345
  type="text"
@@ -351,6 +351,31 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
351
351
  placeholder="oo"
352
352
  ></md-outlined-text-field>
353
353
  </span>
354
+
355
+ <div basement-container>
356
+ <div
357
+ basement-checkbox
358
+ name="hasBasement"
359
+ ?checked=${(building === null || building === void 0 ? void 0 : building.hasBasement) || false}
360
+ @click=${() => this._toggleBasement(idx)}
361
+ >
362
+ <md-icon>format_bold</md-icon>
363
+ </div>
364
+ ${(building === null || building === void 0 ? void 0 : building.hasBasement)
365
+ ? html `
366
+ <md-outlined-text-field
367
+ basement-floor
368
+ type="text"
369
+ numeric
370
+ building
371
+ name="basementFloorCount"
372
+ .value=${((_b = building === null || building === void 0 ? void 0 : building.basementFloorCount) === null || _b === void 0 ? void 0 : _b.toString()) || ''}
373
+ @input=${e => this._onInputChange(e, idx)}
374
+ placeholder="지하층수"
375
+ ></md-outlined-text-field>
376
+ `
377
+ : ''}
378
+ </div>
354
379
  </div>
355
380
  `;
356
381
  })}
@@ -449,6 +474,22 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
449
474
  </span>
450
475
  </div>
451
476
  </div>
477
+
478
+ <div row separate-container>
479
+ <div>
480
+ <span>로봇 작업 대수</span>
481
+ <span
482
+ ><md-outlined-text-field
483
+ type="text"
484
+ numeric
485
+ project
486
+ name="robotCount"
487
+ .value=${((_29 = this.project.robotCount) === null || _29 === void 0 ? void 0 : _29.toString()) || ''}
488
+ @input=${this._onInputChange}
489
+ ></md-outlined-text-field>
490
+ </span>
491
+ </div>
492
+ </div>
452
493
  </div>
453
494
 
454
495
  <div>
@@ -460,7 +501,7 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
460
501
  type="textarea"
461
502
  name="notice"
462
503
  building-complex
463
- .value=${((_30 = (_29 = this.project) === null || _29 === void 0 ? void 0 : _29.buildingComplex) === null || _30 === void 0 ? void 0 : _30.notice) || ''}
504
+ .value=${((_31 = (_30 = this.project) === null || _30 === void 0 ? void 0 : _30.buildingComplex) === null || _31 === void 0 ? void 0 : _31.notice) || ''}
464
505
  @input=${this._onInputChange}
465
506
  ></md-outlined-text-field>
466
507
  </span>
@@ -496,6 +537,7 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
496
537
  inspPassRate
497
538
  robotProgressRate
498
539
  structuralSafetyRate
540
+ robotCount
499
541
  buildingComplex {
500
542
  id
501
543
  address
@@ -524,6 +566,8 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
524
566
  id
525
567
  name
526
568
  floorCount
569
+ hasBasement
570
+ basementFloorCount
527
571
  }
528
572
  }
529
573
  }
@@ -650,6 +694,16 @@ let ProjectUpdate = class ProjectUpdate extends ScopedElementsMixin(PageView) {
650
694
  const selectedValues = e.detail.selectedValues;
651
695
  this.project.buildingComplex[name] = selectedValues;
652
696
  }
697
+ _toggleBasement(idx) {
698
+ const building = this.project.buildingComplex.buildings[idx];
699
+ building.hasBasement = !building.hasBasement;
700
+ // 층 수가 0이거나 체크 해제시 지하층수 초기화 (플레이스 홀더 나오게 하기 위함)
701
+ if (building.basementFloorCount == 0 || !building.hasBasement) {
702
+ building.basementFloorCount = undefined;
703
+ }
704
+ this.project.buildingComplex.buildings[idx]['hasBasement'] = building.hasBasement;
705
+ this.requestUpdate();
706
+ }
653
707
  };
654
708
  ProjectUpdate.styles = [
655
709
  css `
@@ -670,7 +724,7 @@ ProjectUpdate.styles = [
670
724
  width: 100%;
671
725
 
672
726
  --md-outlined-text-field-container-shape: 5px;
673
- --md-outlined-text-field-outline-color: rgba(51,51,51,.20);
727
+ --md-outlined-text-field-outline-color: rgba(51, 51, 51, 0.2);
674
728
  --md-outlined-text-field-focus-outline-color: #1f7fd9;
675
729
  --md-outlined-text-field-focus-outline-width: 1px;
676
730
  --md-sys-color-primary: #586878;
@@ -681,11 +735,11 @@ ProjectUpdate.styles = [
681
735
  --md-outlined-field-trailing-space: var(--spacing-medium, 8px);
682
736
  }
683
737
  select2-component {
684
- width:100%;
738
+ width: 100%;
685
739
  }
686
- input[type="date"] {
687
- border:1px solid rgba(51,51,51,.20);
688
- padding:var(--spacing-small, 4px) var(--spacing-medium, 8px);
740
+ input[type='date'] {
741
+ border: 1px solid rgba(51, 51, 51, 0.2);
742
+ padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);
689
743
  border-radius: 5px;
690
744
  }
691
745
  md-outlined-text-field[type='textarea'] {
@@ -707,7 +761,7 @@ ProjectUpdate.styles = [
707
761
  div[body] {
708
762
  display: flex;
709
763
  margin: var(--spacing-large, 12px);
710
- margin-top:0;
764
+ margin-top: 0;
711
765
  gap: var(--spacing-medium, 8px);
712
766
 
713
767
  & > div {
@@ -780,7 +834,7 @@ ProjectUpdate.styles = [
780
834
  --md-elevated-button-label-text-size: 16px;
781
835
  }
782
836
  hr {
783
- border: 1px rgba(51,51,51,.1) dashed;
837
+ border: 1px rgba(51, 51, 51, 0.1) dashed;
784
838
  width: 100%;
785
839
  margin-bottom: var(--spacing-tiny, 2px);
786
840
  }
@@ -790,14 +844,14 @@ ProjectUpdate.styles = [
790
844
  margin-left: var(--spacing-small, 4px);
791
845
  margin-bottom: var(--spacing-small, 4px);
792
846
  }
793
-
847
+
794
848
  md-outlined-button {
795
849
  min-height: 30px;
796
850
  padding: 0 var(--spacing-large, 12px);
797
851
  box-shadow: 1px 1px 1px #0000001a;
798
852
  --md-outlined-button-label-text-color: #586878;
799
853
  --md-outlined-button-label-text-weight: bold;
800
- --md-sys-color-outline: rgba(51,51,51,.20);
854
+ --md-sys-color-outline: rgba(51, 51, 51, 0.2);
801
855
  }
802
856
 
803
857
  div[row] {
@@ -812,14 +866,22 @@ ProjectUpdate.styles = [
812
866
  div[separate-container] {
813
867
  display: grid;
814
868
  grid-template-columns: repeat(2, 1fr);
815
- gap: var(--spacing-medium, 8px);
869
+ gap: 8px 30px;
870
+ margin-left: 15px;
816
871
 
817
872
  md-outlined-text-field {
818
- width: 70px;
873
+ width: 80px;
819
874
  }
820
875
 
821
876
  & > div {
822
877
  display: flex;
878
+ gap: 15px;
879
+
880
+ span[floor-row] {
881
+ display: inline-flex;
882
+ align-items: center;
883
+ margin-left: 5px;
884
+ }
823
885
 
824
886
  span[floor-title] {
825
887
  min-width: 33px;
@@ -827,7 +889,7 @@ ProjectUpdate.styles = [
827
889
  }
828
890
  span:first-child {
829
891
  flex: 0.4;
830
- justify-content: end;
892
+ justify-content: flex-start;
831
893
  display: flex;
832
894
  }
833
895
  span:last-child {
@@ -837,13 +899,62 @@ ProjectUpdate.styles = [
837
899
  padding-left: var(--spacing-medium, 8px);
838
900
  }
839
901
  }
902
+
903
+ div[basement-container] {
904
+ display: flex;
905
+ align-items: center;
906
+ gap: 4px;
907
+
908
+ div[basement-checkbox] {
909
+ display: flex;
910
+ align-items: center;
911
+ cursor: pointer;
912
+
913
+ md-icon {
914
+ --md-icon-size: 25px;
915
+ color: #808080;
916
+ transition: opacity 0.2s ease;
917
+ }
918
+
919
+ &[disabled] {
920
+ cursor: not-allowed;
921
+ opacity: 0.4;
922
+
923
+ md-icon {
924
+ color: #cccccc;
925
+ }
926
+ }
927
+
928
+ &[checked] md-icon {
929
+ background-color: #2e79be;
930
+ color: white;
931
+ border-radius: 3px;
932
+ }
933
+ }
934
+
935
+ md-outlined-text-field[basement-floor] {
936
+ width: 70px;
937
+ margin-left: var(--spacing-small, 4px);
938
+ opacity: 1;
939
+ transition: opacity 0.2s ease;
940
+
941
+ &[disabled] {
942
+ opacity: 0.4;
943
+ pointer-events: none;
944
+ }
945
+ }
946
+ }
840
947
  }
841
948
 
842
949
  &[project] {
843
950
  div[separate-container] {
951
+ margin-left: 15px;
952
+
844
953
  & > div {
954
+ align-items: center;
955
+
845
956
  span:first-child {
846
- flex: 0.6;
957
+ flex: 0.4;
847
958
  min-width: 100px;
848
959
  }
849
960
  span:last-child {
@@ -1 +1 @@
1
- {"version":3,"file":"project-update.js","sourceRoot":"","sources":["../../../client/pages/project/project-update.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'\n\nimport { 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 { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { Project } from './project-list'\nimport '../lib/select2-component'\nimport './component/project-update-header'\n\n@customElement('project-update')\nexport class ProjectUpdate extends ScopedElementsMixin(PageView) {\n static styles = [\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-text-field {\n width: 100%;\n\n --md-outlined-text-field-container-shape: 5px;\n --md-outlined-text-field-outline-color: rgba(51,51,51,.20);\n --md-outlined-text-field-focus-outline-color: #1f7fd9;\n --md-outlined-text-field-focus-outline-width: 1px;\n --md-sys-color-primary: #586878;\n --md-outlined-text-field-input-text-size: 14px;\n --md-outlined-field-bottom-space: 3px;\n --md-outlined-field-top-space: 3px;\n --md-outlined-field-leading-space: var(--spacing-medium, 8px);\n --md-outlined-field-trailing-space: var(--spacing-medium, 8px);\n }\n select2-component {\n width:100%;\n }\n input[type=\"date\"] {\n border:1px solid rgba(51,51,51,.20);\n padding:var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-radius: 5px;\n }\n md-outlined-text-field[type='textarea'] {\n width: 100%;\n height: 120px;\n resize: none;\n }\n\n ox-input-image {\n width: 120px;\n height: 90px;\n }\n ox-input-file {\n width: 120px;\n height: 90px;\n padding: 0;\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 & > div {\n display: flex;\n height: fit-content;\n flex-direction: column;\n padding: var(--spacing-large, 12px);\n background-color: var(--md-sys-color-on-primary);\n border: 1px solid #cccccc80;\n border-radius: 5px;\n gap: var(--spacing-medium, 8px);\n\n h3 {\n color: #2e79be;\n font-size: 16px;\n margin: 0px;\n }\n\n div[row] {\n display: flex;\n align-items: center;\n\n span:first-child {\n flex: 0.3;\n text-align: right;\n font-size: 14px;\n }\n\n span:last-child {\n flex: 0.7;\n display: flex;\n gap: var(--spacing-medium, 8px);\n margin-left: var(--spacing-medium, 8px);\n align-items: center;\n\n &[align-end] {\n align-items: end;\n }\n }\n }\n }\n\n div[project-info] {\n flex: 0.55;\n }\n\n div[detail-info] {\n flex: 0.45;\n padding: 0px;\n gap: 10px;\n background-color: transparent;\n border: none;\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n border: 1px solid #cccccc80;\n border-radius: 5px;\n padding: var(--spacing-large, 12px);\n background-color: var(--md-sys-color-on-primary);\n\n md-outlined-text-field[type='text'] {\n width: 60%;\n }\n\n md-elevated-button {\n --md-elevated-button-container-height: 30px;\n --md-elevated-button-container-color: var(--md-sys-color-on-primary);\n --md-elevated-button-label-text-size: 16px;\n }\n hr {\n border: 1px rgba(51,51,51,.1) dashed;\n width: 100%;\n margin-bottom: var(--spacing-tiny, 2px);\n }\n div[warn] {\n font-size: 12px;\n color: red;\n margin-left: var(--spacing-small, 4px);\n margin-bottom: var(--spacing-small, 4px);\n }\n \n md-outlined-button {\n min-height: 30px;\n padding: 0 var(--spacing-large, 12px);\n box-shadow: 1px 1px 1px #0000001a;\n --md-outlined-button-label-text-color: #586878;\n --md-outlined-button-label-text-weight: bold;\n --md-sys-color-outline: rgba(51,51,51,.20);\n }\n\n div[row] {\n span:first-child {\n flex: 0.2;\n }\n span:last-child {\n flex: 0.8;\n }\n }\n\n div[separate-container] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: var(--spacing-medium, 8px);\n\n md-outlined-text-field {\n width: 70px;\n }\n\n & > div {\n display: flex;\n\n span[floor-title] {\n min-width: 33px;\n margin-right: var(--spacing-small, 4px);\n }\n span:first-child {\n flex: 0.4;\n justify-content: end;\n display: flex;\n }\n span:last-child {\n flex: 0.6;\n display: flex;\n align-items: center;\n padding-left: var(--spacing-medium, 8px);\n }\n }\n }\n\n &[project] {\n div[separate-container] {\n & > div {\n span:first-child {\n flex: 0.6;\n min-width: 100px;\n }\n span:last-child {\n flex: 0.4;\n margin-left: 0;\n }\n }\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 @state() projectId: string = ''\n @state() project: Project = { ...this.defaultProject }\n @state() selectedValues: string[] = []\n @state() overallConstructorList: Array<{ name: string; value: string }> = []\n @state() taskConstructorList: Array<{ name: string; value: string }> = []\n @state() taskSupervisoryList: Array<{ name: string; value: string }> = []\n @state() overallSupervisoryList: Array<{ name: string; value: string }> = []\n\n render() {\n return html`\n <project-update-header .projectId=${this.project.id || ''} title=\"프로젝트 정보 관리\" @custom-click=${this._saveProject}>\n </project-update-header>\n\n <div body>\n <div project-info>\n <h3>기본 정보</h3>\n <div row>\n <span>프로젝트명</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"name\"\n project\n .value=${this.project.name || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>프로젝트 주소</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n name=\"address\"\n building-complex\n .value=${this.project?.buildingComplex?.address || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>위도</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n name=\"latitude\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.latitude?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>경도</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n name=\"longitude\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.longitude?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>면적</span>\n <span align-end\n ><md-outlined-text-field\n type=\"text\"\n name=\"area\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.area?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n ㎡</span\n >\n </div>\n <div row>\n <span>착공일정 ~ 준공일정</span>\n <span\n ><input\n type=\"date\"\n name=\"startDate\"\n project\n .value=${this.project.startDate || ''}\n @input=${this._onInputChange}\n max=\"9999-12-31\"\n />\n ~\n <input\n type=\"date\"\n name=\"endDate\"\n project\n .value=${this.project.endDate || ''}\n @input=${this._onInputChange}\n max=\"9999-12-31\"\n />\n </span>\n </div>\n <div row>\n <span>발주처</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"clientCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.clientCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>건설사</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"constructionCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.constructionCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>설계사</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"designCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.designCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>감리사</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"supervisoryCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.supervisoryCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>건설구분</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"constructionType\"\n building-complex\n .value=${this.project?.buildingComplex?.constructionType || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>대표사진 업로드</span>\n <span>\n <ox-input-image\n name=\"mainPhoto\"\n value=${this.project?.mainPhoto?.fullpath || ''}\n @change=${this.onCreateAttachment.bind(this)}\n ></ox-input-image>\n </span>\n </div>\n <div row>\n <span>단지 BIM</span>\n <span>\n <ox-input-file\n name=\"drawing\"\n label=\" \"\n description=\"IFC 업로드\"\n .value=${this.project?.buildingComplex?.drawing || ''}\n @change=${this.onCreateAttachment.bind(this)}\n ></ox-input-file>\n </span>\n </div>\n <div row>\n <span>공사금액</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"constructionCost\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.constructionCost?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>기타사항</span>\n <span>\n <md-outlined-text-field\n type=\"textarea\"\n name=\"etc\"\n building-complex\n .value=${this.project?.buildingComplex?.etc || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>총괄 시공 관리자 리스트</span>\n <span>\n <select2-component\n placeholder=\"총괄 시공 관리자 리스트\"\n name=\"overallConstructorEmails\"\n .options=${this.overallConstructorList}\n .selectedValues=${this.project?.buildingComplex?.overallConstructorEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component>\n </span>\n </div>\n <div row>\n <span>공종별 시공 관리자 리스트</span>\n <span>\n <select2-component\n placeholder=\"공종별 시공 관리자 리스트\"\n name=\"taskConstructorEmails\"\n .options=${this.taskConstructorList}\n .selectedValues=${this.project?.buildingComplex?.taskConstructorEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component>\n </span>\n </div>\n <div row>\n <span>총괄 감리 책임자 리스트</span>\n <span>\n <select2-component\n placeholder=\"총괄 감리 책임자 리스트\"\n name=\"overallSupervisoryEmails\"\n .options=${this.overallSupervisoryList}\n .selectedValues=${this.project?.buildingComplex?.overallSupervisoryEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component>\n </span>\n </div>\n <div row>\n <span>공종별 감리 책임자 리스트</span>\n <span>\n <select2-component\n placeholder=\"공종별 감리 책임자 리스트\"\n name=\"taskSupervisoryEmails\"\n .options=${this.taskSupervisoryList}\n .selectedValues=${this.project?.buildingComplex?.taskSupervisoryEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component\n ></span>\n </div>\n </div>\n\n <div detail-info>\n <div>\n <h3>건설구분 상세 정보</h3>\n <div row>\n <span>세대수</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n building-complex\n name=\"householdCount\"\n .value=${this.project?.buildingComplex?.householdCount?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>동수</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n building-complex\n name=\"buildingCount\"\n value=${this.project?.buildingComplex?.buildingCount?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n <md-outlined-button @click=${this._setBuilding}>적용</md-outlined-button>\n </span>\n </div>\n <hr />\n <div warn>* 동/층의 정보를 수정하면 기존의 동/층 정보는 모두 제거됩니다.</div>\n <div separate-container>\n ${this.project?.buildingComplex?.buildings?.map(\n (building, idx) => html`\n <div>\n <span>\n <md-outlined-text-field\n type=\"text\"\n building\n name=\"name\"\n .value=${building?.name || ''}\n @input=${e => this._onInputChange(e, idx)}\n placeholder=\"ooo동\"\n ></md-outlined-text-field>\n </span>\n <span>\n <span floor-title>층수</span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n building\n name=\"floorCount\"\n .value=${building?.floorCount?.toString() || ''}\n @input=${e => this._onInputChange(e, idx)}\n placeholder=\"oo\"\n ></md-outlined-text-field>\n </span>\n </div>\n `\n )}\n </div>\n </div>\n\n <div project>\n <h3>프로젝트 현황</h3>\n <div row separate-container>\n <div>\n <span>전체 진행현황</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"totalProgress\"\n .value=${this.project.totalProgress?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n <div>\n <span>검측/통과비율</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"inspPassRate\"\n .value=${this.project.inspPassRate?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n <div row separate-container>\n <div>\n <span>주간 진행현황</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"weeklyProgress\"\n .value=${this.project.weeklyProgress?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n <div>\n <span>로봇작업진행율</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"robotProgressRate\"\n .value=${this.project.robotProgressRate?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n <div row separate-container>\n <div>\n <span>KPI</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"kpi\"\n .value=${this.project.kpi?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n <div>\n <span>구조안전도</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"structuralSafetyRate\"\n .value=${this.project.structuralSafetyRate?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n </div>\n\n <div>\n <h3>공지사항</h3>\n <div>\n <span></span>\n <span>\n <md-outlined-text-field\n type=\"textarea\"\n name=\"notice\"\n building-complex\n .value=${this.project?.buildingComplex?.notice || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\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(this.projectId)\n }\n }\n\n async initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!, $filters: [Filter!]) {\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 }\n constructionType\n constructionCost\n etc\n notice\n householdCount\n buildingCount\n overallConstructorEmails\n taskConstructorEmails\n overallSupervisoryEmails\n taskSupervisoryEmails\n buildings {\n id\n name\n floorCount\n }\n }\n }\n\n employees(filters: $filters) {\n items {\n id\n name\n jobResponsibility\n active\n user {\n id\n name\n email\n }\n }\n }\n }\n `,\n variables: {\n id: projectId,\n filters: [\n {\n name: 'active',\n operator: 'eq',\n value: true\n },\n {\n name: 'userId',\n operator: 'is_not_null',\n value: ''\n }\n ]\n }\n })\n\n this.project = response.data?.project\n\n const items = response.data?.employees?.items || []\n this.overallConstructorList = this._filterUserByPermission(items, 'OVERALL_CONSTRUCTOR')\n this.taskConstructorList = this._filterUserByPermission(items, 'TASK_CONSTRUCTOR')\n this.overallSupervisoryList = this._filterUserByPermission(items, 'OVERALL_SUPERVISORY')\n this.taskSupervisoryList = this._filterUserByPermission(items, 'TASK_SUPERVISORY')\n }\n\n private _filterUserByPermission(userList, permission: string) {\n return userList\n .filter(v => v.jobResponsibility == permission || v.jobResponsibility == 'ADMIN')\n .map(v => ({ name: v.name, value: v.user.email }))\n }\n\n private async _saveProject() {\n // 첨부 파일 필드 제거 (첨부 파일은 {filename}Upload 로 전송)\n delete this.project.mainPhoto\n delete this.project.buildingComplex.drawing\n\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateProject($project: ProjectPatch!) {\n updateProject(project: $project) {\n id\n }\n }\n `,\n variables: {\n project: this.project\n },\n context: {\n hasUpload: true\n }\n })\n\n if (!response.errors) {\n notify({ message: '저장에 성공하였습니다.' })\n }\n }\n\n // 동 적용 버튼을 누르면 입력한 수 만큼 해당 단지에 동 데이터 생성\n private _setBuilding() {\n const buildingCount: number = this.project?.buildingComplex?.buildingCount || 0\n const buildingInitData = { name: undefined, floorCount: undefined }\n\n // 빌딩 데이터가 없으면 빈 배열 넣어줌\n if (!this.project?.buildingComplex?.buildings?.length) {\n this.project.buildingComplex.buildings = []\n }\n\n if (this.project.buildingComplex.buildings.length >= buildingCount) {\n // 동 수가 더 작게 들어오면 기존 배열을 필요한 크기만큼 잘라내기\n this.project.buildingComplex.buildings = [...this.project.buildingComplex.buildings!.slice(0, buildingCount)]\n } else {\n // 동수가 더 크게 들어오면 기존 배열 + 빈 값을 채움\n const additionalCount = buildingCount - this.project.buildingComplex.buildings.length\n const additionalBuildings = Array.from({ length: additionalCount }, () => ({ ...buildingInitData }))\n this.project.buildingComplex.buildings = [...this.project.buildingComplex.buildings, ...additionalBuildings]\n }\n\n // 리렌더링\n this.project = { ...this.project }\n }\n\n // Input 요소의 값이 변경될 때 호출되는 콜백 함수\n private _onInputChange(event: InputEvent, idx: number) {\n const target = event.target as HTMLInputElement\n let inputVal: any = target.value\n\n // 숫자 타입은 다른 문자 입력 제거\n if (target.hasAttribute('numeric')) {\n inputVal = Number(inputVal.replace(/[^\\d.]/g, ''))\n }\n\n if (target.hasAttribute('project')) {\n this.project[target.name] = inputVal\n } else if (target.hasAttribute('building-complex')) {\n this.project.buildingComplex![target.name] = inputVal\n } else if (target.hasAttribute('building')) {\n this.project.buildingComplex.buildings![idx][target.name] = inputVal\n }\n }\n\n // 이미지 업로드\n async onCreateAttachment(e: CustomEvent) {\n const target = e.target as HTMLInputElement\n const file = (target.name === 'mainPhoto' ? e.detail : e.detail[0]) || null\n\n if (target.name === 'mainPhoto') {\n this.project.mainPhotoUpload = file\n } else {\n this.project.buildingComplex.drawingUpload = file\n }\n }\n\n private _handleSelectionChange(e) {\n const name = e.target.getAttribute('name')\n const selectedValues = e.detail.selectedValues\n\n this.project.buildingComplex[name] = selectedValues\n }\n}\n"]}
1
+ {"version":3,"file":"project-update.js","sourceRoot":"","sources":["../../../client/pages/project/project-update.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,yCAAyC,CAAA;AAChD,OAAO,gDAAgD,CAAA;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,OAAO,0BAA0B,CAAA;AACjC,OAAO,mCAAmC,CAAA;AAGnC,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,mBAAmB,CAAC,QAAQ,CAAC;IAAzD;;QAgRG,mBAAc,GAAG;YACvB,IAAI,EAAE,EAAE;YACR,eAAe,EAAE;gBACf,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,CAAC;gBACP,mBAAmB,EAAE,EAAE;gBACvB,aAAa,EAAE,EAAE;gBACjB,kBAAkB,EAAE,EAAE;gBACtB,aAAa,EAAE,EAAE;gBACjB,gBAAgB,EAAE,EAAE;gBACpB,SAAS,EAAE,EAAE;aACd;SACF,CAAA;QACQ,cAAS,GAAW,EAAE,CAAA;QACtB,YAAO,qBAAiB,IAAI,CAAC,cAAc,EAAE;QAC7C,mBAAc,GAAa,EAAE,CAAA;QAC7B,2BAAsB,GAA2C,EAAE,CAAA;QACnE,wBAAmB,GAA2C,EAAE,CAAA;QAChE,wBAAmB,GAA2C,EAAE,CAAA;QAChE,2BAAsB,GAA2C,EAAE,CAAA;IAyqB9E,CAAC;IAlsBC,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,YAAY;SACpB,CAAA;IACH,CAAC;IAuBD,MAAM;;QACJ,OAAO,IAAI,CAAA;0CAC2B,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,qCAAqC,IAAI,CAAC,YAAY;;;;;;;;;;;;;yBAa5F,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE;yBACvB,IAAI,CAAC,cAAc;;;;;;;;;;;yBAWnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,OAAO,KAAI,EAAE;yBAC5C,IAAI,CAAC,cAAc;;;;;;;;;;;;yBAYnB,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,QAAQ,0CAAE,QAAQ,EAAE,KAAI,EAAE;yBACzD,IAAI,CAAC,cAAc;;;;;;;;;;;;yBAYnB,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,SAAS,0CAAE,QAAQ,EAAE,KAAI,EAAE;yBAC1D,IAAI,CAAC,cAAc;;;;;;;;;;;;yBAYnB,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE;yBACrD,IAAI,CAAC,cAAc;;;;;;;;;;;;yBAYnB,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;yBAC5B,IAAI,CAAC,cAAc;;;;;;;;yBAQnB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;yBAC1B,IAAI,CAAC,cAAc;;;;;;;;;;;;yBAYnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,aAAa,KAAI,EAAE;yBAClD,IAAI,CAAC,cAAc;;;;;;;;;;;yBAWnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,mBAAmB,KAAI,EAAE;yBACxD,IAAI,CAAC,cAAc;;;;;;;;;;;yBAWnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,aAAa,KAAI,EAAE;yBAClD,IAAI,CAAC,cAAc;;;;;;;;;;;yBAWnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,kBAAkB,KAAI,EAAE;yBACvD,IAAI,CAAC,cAAc;;;;;;;;;;;yBAWnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,gBAAgB,KAAI,EAAE;yBACrD,IAAI,CAAC,cAAc;;;;;;;;;wBASpB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,SAAS,0CAAE,QAAQ,KAAI,EAAE;0BACrC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;yBAWnC,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,OAAO,KAAI,EAAE;0BAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;yBAYnC,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,gBAAgB,0CAAE,QAAQ,EAAE,KAAI,EAAE;yBACjE,IAAI,CAAC,cAAc;;;;;;;;;;;yBAWnB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,GAAG,KAAI,EAAE;yBACxC,IAAI,CAAC,cAAc;;;;;;;;;;2BAUjB,IAAI,CAAC,sBAAsB;kCACpB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,wBAAwB,KAAI,EAAE;qCAC1D,IAAI,CAAC,sBAAsB;;;;;;;;;;2BAUrC,IAAI,CAAC,mBAAmB;kCACjB,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,qBAAqB,KAAI,EAAE;qCACvD,IAAI,CAAC,sBAAsB;;;;;;;;;;2BAUrC,IAAI,CAAC,sBAAsB;kCACpB,CAAA,OAAA,OAAA,IAAI,CAAC,OAAO,4CAAE,eAAe,4CAAE,wBAAwB,KAAI,EAAE;qCAC1D,IAAI,CAAC,sBAAsB;;;;;;;;;;2BAUrC,IAAI,CAAC,mBAAmB;kCACjB,CAAA,OAAA,OAAA,IAAI,CAAC,OAAO,4CAAE,eAAe,4CAAE,qBAAqB,KAAI,EAAE;qCACvD,IAAI,CAAC,sBAAsB;;;;;;;;;;;;;;;;;2BAiBrC,CAAA,OAAA,OAAA,OAAA,IAAI,CAAC,OAAO,4CAAE,eAAe,4CAAE,cAAc,4CAAE,QAAQ,EAAE,KAAI,EAAE;2BAC/D,IAAI,CAAC,cAAc;;;;;;;;;;;;0BAYpB,CAAA,OAAA,OAAA,OAAA,IAAI,CAAC,OAAO,4CAAE,eAAe,4CAAE,aAAa,4CAAE,QAAQ,EAAE,KAAI,EAAE;2BAC7D,IAAI,CAAC,cAAc;;6CAED,IAAI,CAAC,YAAY;;;;;;gBAM9C,OAAA,OAAA,OAAA,IAAI,CAAC,OAAO,4CAAE,eAAe,4CAAE,SAAS,4CAAE,GAAG,CAC7C,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;;YAAC,OAAA,IAAI,CAAA;;;;;;;iCAON,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,KAAI,EAAE;iCACpB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC;;;;;;;;;;;iCAWhC,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,0CAAE,QAAQ,EAAE,KAAI,EAAE;iCACtC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC;;;;;;;;;mCAS9B,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,KAAI,KAAK;iCAChC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;;;;wBAIxC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW;gBACrB,CAAC,CAAC,IAAI,CAAA;;;;;;;uCAOS,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,kBAAkB,0CAAE,QAAQ,EAAE,KAAI,EAAE;uCAC9C,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC;;;2BAG5C;gBACH,CAAC,CAAC,EAAE;;;iBAGX,CAAA;SAAA,CACF;;;;;;;;;;;;;;;6BAec,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,aAAa,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BAC5C,IAAI,CAAC,cAAc;;;;;;;;;;;;;6BAanB,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,YAAY,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BAC3C,IAAI,CAAC,cAAc;;;;;;;;;;;;;;;6BAenB,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,cAAc,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BAC7C,IAAI,CAAC,cAAc;;;;;;;;;;;;;6BAanB,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BAChD,IAAI,CAAC,cAAc;;;;;;;;;;;;;;;6BAenB,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,GAAG,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BAClC,IAAI,CAAC,cAAc;;;;;;;;;;;;;6BAanB,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BACnD,IAAI,CAAC,cAAc;;;;;;;;;;;;;;;;6BAgBnB,CAAA,OAAA,IAAI,CAAC,OAAO,CAAC,UAAU,4CAAE,QAAQ,EAAE,KAAI,EAAE;6BACzC,IAAI,CAAC,cAAc;;;;;;;;;;;;;;;;2BAgBrB,CAAA,OAAA,OAAA,IAAI,CAAC,OAAO,4CAAE,eAAe,4CAAE,MAAM,KAAI,EAAE;2BAC3C,IAAI,CAAC,cAAc;;;;;;;KAOzC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAwB,IAAG,CAAC;IAElD,KAAK,CAAC,WAAW,CAAC,OAAY,EAAE,SAAwB;QACtD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,UAAU,IAAI,EAAE,CAAA;YAC3C,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE;;QACtC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiET;YACD,SAAS,EAAE;gBACT,EAAE,EAAE,SAAS;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,IAAI;qBACZ;oBACD;wBACE,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,aAAa;wBACvB,KAAK,EAAE,EAAE;qBACV;iBACF;aACF;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,MAAA,QAAQ,CAAC,IAAI,0CAAE,OAAO,CAAA;QAErC,MAAM,KAAK,GAAG,CAAA,MAAA,MAAA,QAAQ,CAAC,IAAI,0CAAE,SAAS,0CAAE,KAAK,KAAI,EAAE,CAAA;QACnD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAA;QACxF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;QAClF,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAA;QACxF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;IACpF,CAAC;IAEO,uBAAuB,CAAC,QAAQ,EAAE,UAAkB;QAC1D,OAAO,QAAQ;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,UAAU,IAAI,CAAC,CAAC,iBAAiB,IAAI,OAAO,CAAC;aAChF,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACtD,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,6CAA6C;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAA;QAE3C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;;;OAMZ;YACD,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB;YACD,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,wCAAwC;IAChC,YAAY;;QAClB,MAAM,aAAa,GAAW,CAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,aAAa,KAAI,CAAC,CAAA;QAC/E,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA;QAEnE,uBAAuB;QACvB,IAAI,CAAC,CAAA,MAAA,MAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,eAAe,0CAAE,SAAS,0CAAE,MAAM,CAAA,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,GAAG,EAAE,CAAA;QAC7C,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;YACnE,sCAAsC;YACtC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAU,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QAC/G,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,MAAM,eAAe,GAAG,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAA;YACrF,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,mBAAM,gBAAgB,EAAG,CAAC,CAAA;YACpG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,GAAG,mBAAmB,CAAC,CAAA;QAC9G,CAAC;QAED,OAAO;QACP,IAAI,CAAC,OAAO,qBAAQ,IAAI,CAAC,OAAO,CAAE,CAAA;IACpC,CAAC;IAED,gCAAgC;IACxB,cAAc,CAAC,KAAiB,EAAE,GAAW;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B,CAAA;QAC/C,IAAI,QAAQ,GAAQ,MAAM,CAAC,KAAK,CAAA;QAEhC,qBAAqB;QACrB,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;QACpD,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;QACtC,CAAC;aAAM,IAAI,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,eAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;QACvD,CAAC;aAAM,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA;QACtE,CAAC;IACH,CAAC;IAED,UAAU;IACV,KAAK,CAAC,kBAAkB,CAAC,CAAc;QACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAA0B,CAAA;QAC3C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAE3E,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAA;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa,GAAG,IAAI,CAAA;QACnD,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC1C,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,cAAc,CAAA;QAE9C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,cAAc,CAAA;IACrD,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAU,CAAC,GAAG,CAAC,CAAA;QAC7D,QAAQ,CAAC,WAAW,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAA;QAE5C,gDAAgD;QAChD,IAAI,QAAQ,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC9D,QAAQ,CAAC,kBAAkB,GAAG,SAAS,CAAA;QACzC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAU,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAA;QAClF,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;;AA18BM,oBAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqQF;CACF,AAvQY,CAuQZ;AAqBQ;IAAR,KAAK,EAAE;;gDAAuB;AACtB;IAAR,KAAK,EAAE;;8CAA8C;AAC7C;IAAR,KAAK,EAAE;;qDAA8B;AAC7B;IAAR,KAAK,EAAE;8BAAyB,KAAK;6DAAsC;AACnE;IAAR,KAAK,EAAE;8BAAsB,KAAK;0DAAsC;AAChE;IAAR,KAAK,EAAE;8BAAsB,KAAK;0DAAsC;AAChE;IAAR,KAAK,EAAE;8BAAyB,KAAK;6DAAsC;AAnSjE,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CA48BzB","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/textfield/outlined-text-field.js'\n\nimport { 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 { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport { Project } from './project-list'\nimport '../lib/select2-component'\nimport './component/project-update-header'\n\n@customElement('project-update')\nexport class ProjectUpdate extends ScopedElementsMixin(PageView) {\n static styles = [\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-text-field {\n width: 100%;\n\n --md-outlined-text-field-container-shape: 5px;\n --md-outlined-text-field-outline-color: rgba(51, 51, 51, 0.2);\n --md-outlined-text-field-focus-outline-color: #1f7fd9;\n --md-outlined-text-field-focus-outline-width: 1px;\n --md-sys-color-primary: #586878;\n --md-outlined-text-field-input-text-size: 14px;\n --md-outlined-field-bottom-space: 3px;\n --md-outlined-field-top-space: 3px;\n --md-outlined-field-leading-space: var(--spacing-medium, 8px);\n --md-outlined-field-trailing-space: var(--spacing-medium, 8px);\n }\n select2-component {\n width: 100%;\n }\n input[type='date'] {\n border: 1px solid rgba(51, 51, 51, 0.2);\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-radius: 5px;\n }\n md-outlined-text-field[type='textarea'] {\n width: 100%;\n height: 120px;\n resize: none;\n }\n\n ox-input-image {\n width: 120px;\n height: 90px;\n }\n ox-input-file {\n width: 120px;\n height: 90px;\n padding: 0;\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 & > div {\n display: flex;\n height: fit-content;\n flex-direction: column;\n padding: var(--spacing-large, 12px);\n background-color: var(--md-sys-color-on-primary);\n border: 1px solid #cccccc80;\n border-radius: 5px;\n gap: var(--spacing-medium, 8px);\n\n h3 {\n color: #2e79be;\n font-size: 16px;\n margin: 0px;\n }\n\n div[row] {\n display: flex;\n align-items: center;\n\n span:first-child {\n flex: 0.3;\n text-align: right;\n font-size: 14px;\n }\n\n span:last-child {\n flex: 0.7;\n display: flex;\n gap: var(--spacing-medium, 8px);\n margin-left: var(--spacing-medium, 8px);\n align-items: center;\n\n &[align-end] {\n align-items: end;\n }\n }\n }\n }\n\n div[project-info] {\n flex: 0.55;\n }\n\n div[detail-info] {\n flex: 0.45;\n padding: 0px;\n gap: 10px;\n background-color: transparent;\n border: none;\n\n & > div {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n border: 1px solid #cccccc80;\n border-radius: 5px;\n padding: var(--spacing-large, 12px);\n background-color: var(--md-sys-color-on-primary);\n\n md-outlined-text-field[type='text'] {\n width: 60%;\n }\n\n md-elevated-button {\n --md-elevated-button-container-height: 30px;\n --md-elevated-button-container-color: var(--md-sys-color-on-primary);\n --md-elevated-button-label-text-size: 16px;\n }\n hr {\n border: 1px rgba(51, 51, 51, 0.1) dashed;\n width: 100%;\n margin-bottom: var(--spacing-tiny, 2px);\n }\n div[warn] {\n font-size: 12px;\n color: red;\n margin-left: var(--spacing-small, 4px);\n margin-bottom: var(--spacing-small, 4px);\n }\n\n md-outlined-button {\n min-height: 30px;\n padding: 0 var(--spacing-large, 12px);\n box-shadow: 1px 1px 1px #0000001a;\n --md-outlined-button-label-text-color: #586878;\n --md-outlined-button-label-text-weight: bold;\n --md-sys-color-outline: rgba(51, 51, 51, 0.2);\n }\n\n div[row] {\n span:first-child {\n flex: 0.2;\n }\n span:last-child {\n flex: 0.8;\n }\n }\n\n div[separate-container] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 8px 30px;\n margin-left: 15px;\n\n md-outlined-text-field {\n width: 80px;\n }\n\n & > div {\n display: flex;\n gap: 15px;\n\n span[floor-row] {\n display: inline-flex;\n align-items: center;\n margin-left: 5px;\n }\n\n span[floor-title] {\n min-width: 33px;\n margin-right: var(--spacing-small, 4px);\n }\n span:first-child {\n flex: 0.4;\n justify-content: flex-start;\n display: flex;\n }\n span:last-child {\n flex: 0.6;\n display: flex;\n align-items: center;\n padding-left: var(--spacing-medium, 8px);\n }\n }\n\n div[basement-container] {\n display: flex;\n align-items: center;\n gap: 4px;\n\n div[basement-checkbox] {\n display: flex;\n align-items: center;\n cursor: pointer;\n\n md-icon {\n --md-icon-size: 25px;\n color: #808080;\n transition: opacity 0.2s ease;\n }\n\n &[disabled] {\n cursor: not-allowed;\n opacity: 0.4;\n\n md-icon {\n color: #cccccc;\n }\n }\n\n &[checked] md-icon {\n background-color: #2e79be;\n color: white;\n border-radius: 3px;\n }\n }\n\n md-outlined-text-field[basement-floor] {\n width: 70px;\n margin-left: var(--spacing-small, 4px);\n opacity: 1;\n transition: opacity 0.2s ease;\n\n &[disabled] {\n opacity: 0.4;\n pointer-events: none;\n }\n }\n }\n }\n\n &[project] {\n div[separate-container] {\n margin-left: 15px;\n\n & > div {\n align-items: center;\n\n span:first-child {\n flex: 0.4;\n min-width: 100px;\n }\n span:last-child {\n flex: 0.4;\n margin-left: 0;\n }\n }\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 @state() projectId: string = ''\n @state() project: Project = { ...this.defaultProject }\n @state() selectedValues: string[] = []\n @state() overallConstructorList: Array<{ name: string; value: string }> = []\n @state() taskConstructorList: Array<{ name: string; value: string }> = []\n @state() taskSupervisoryList: Array<{ name: string; value: string }> = []\n @state() overallSupervisoryList: Array<{ name: string; value: string }> = []\n\n render() {\n return html`\n <project-update-header .projectId=${this.project.id || ''} title=\"프로젝트 정보 관리\" @custom-click=${this._saveProject}>\n </project-update-header>\n\n <div body>\n <div project-info>\n <h3>기본 정보</h3>\n <div row>\n <span>프로젝트명</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"name\"\n project\n .value=${this.project.name || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>프로젝트 주소</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n name=\"address\"\n building-complex\n .value=${this.project?.buildingComplex?.address || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>위도</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n name=\"latitude\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.latitude?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>경도</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n name=\"longitude\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.longitude?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>면적</span>\n <span align-end\n ><md-outlined-text-field\n type=\"text\"\n name=\"area\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.area?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n ㎡</span\n >\n </div>\n <div row>\n <span>착공일정 ~ 준공일정</span>\n <span\n ><input\n type=\"date\"\n name=\"startDate\"\n project\n .value=${this.project.startDate || ''}\n @input=${this._onInputChange}\n max=\"9999-12-31\"\n />\n ~\n <input\n type=\"date\"\n name=\"endDate\"\n project\n .value=${this.project.endDate || ''}\n @input=${this._onInputChange}\n max=\"9999-12-31\"\n />\n </span>\n </div>\n <div row>\n <span>발주처</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"clientCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.clientCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>건설사</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"constructionCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.constructionCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>설계사</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"designCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.designCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>감리사</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"supervisoryCompany\"\n building-complex\n .value=${this.project?.buildingComplex?.supervisoryCompany || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>건설구분</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"constructionType\"\n building-complex\n .value=${this.project?.buildingComplex?.constructionType || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>대표사진 업로드</span>\n <span>\n <ox-input-image\n name=\"mainPhoto\"\n value=${this.project?.mainPhoto?.fullpath || ''}\n @change=${this.onCreateAttachment.bind(this)}\n ></ox-input-image>\n </span>\n </div>\n <div row>\n <span>단지 BIM</span>\n <span>\n <ox-input-file\n name=\"drawing\"\n label=\" \"\n description=\"IFC 업로드\"\n .value=${this.project?.buildingComplex?.drawing || ''}\n @change=${this.onCreateAttachment.bind(this)}\n ></ox-input-file>\n </span>\n </div>\n <div row>\n <span>공사금액</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n name=\"constructionCost\"\n numeric\n building-complex\n .value=${this.project?.buildingComplex?.constructionCost?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>기타사항</span>\n <span>\n <md-outlined-text-field\n type=\"textarea\"\n name=\"etc\"\n building-complex\n .value=${this.project?.buildingComplex?.etc || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>총괄 시공 관리자 리스트</span>\n <span>\n <select2-component\n placeholder=\"총괄 시공 관리자 리스트\"\n name=\"overallConstructorEmails\"\n .options=${this.overallConstructorList}\n .selectedValues=${this.project?.buildingComplex?.overallConstructorEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component>\n </span>\n </div>\n <div row>\n <span>공종별 시공 관리자 리스트</span>\n <span>\n <select2-component\n placeholder=\"공종별 시공 관리자 리스트\"\n name=\"taskConstructorEmails\"\n .options=${this.taskConstructorList}\n .selectedValues=${this.project?.buildingComplex?.taskConstructorEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component>\n </span>\n </div>\n <div row>\n <span>총괄 감리 책임자 리스트</span>\n <span>\n <select2-component\n placeholder=\"총괄 감리 책임자 리스트\"\n name=\"overallSupervisoryEmails\"\n .options=${this.overallSupervisoryList}\n .selectedValues=${this.project?.buildingComplex?.overallSupervisoryEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component>\n </span>\n </div>\n <div row>\n <span>공종별 감리 책임자 리스트</span>\n <span>\n <select2-component\n placeholder=\"공종별 감리 책임자 리스트\"\n name=\"taskSupervisoryEmails\"\n .options=${this.taskSupervisoryList}\n .selectedValues=${this.project?.buildingComplex?.taskSupervisoryEmails || []}\n @selection-changed=${this._handleSelectionChange}\n ></select2-component\n ></span>\n </div>\n </div>\n\n <div detail-info>\n <div>\n <h3>건설구분 상세 정보</h3>\n <div row>\n <span>세대수</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n building-complex\n name=\"householdCount\"\n .value=${this.project?.buildingComplex?.householdCount?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n <div row>\n <span>동수</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n building-complex\n name=\"buildingCount\"\n value=${this.project?.buildingComplex?.buildingCount?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n <md-outlined-button @click=${this._setBuilding}>적용</md-outlined-button>\n </span>\n </div>\n <hr />\n <div warn>* 동/층의 정보를 수정하면 기존의 동/층 정보는 모두 제거됩니다.</div>\n <div separate-container>\n ${this.project?.buildingComplex?.buildings?.map(\n (building, idx) => html`\n <div>\n <span>\n <md-outlined-text-field\n type=\"text\"\n building\n name=\"name\"\n .value=${building?.name || ''}\n @input=${e => this._onInputChange(e, idx)}\n placeholder=\"ooo동\"\n ></md-outlined-text-field>\n </span>\n <span floor-row>\n <span floor-title>층수</span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n building\n name=\"floorCount\"\n .value=${building?.floorCount?.toString() || ''}\n @input=${e => this._onInputChange(e, idx)}\n placeholder=\"oo\"\n ></md-outlined-text-field>\n </span>\n\n <div basement-container>\n <div\n basement-checkbox\n name=\"hasBasement\"\n ?checked=${building?.hasBasement || false}\n @click=${() => this._toggleBasement(idx)}\n >\n <md-icon>format_bold</md-icon>\n </div>\n ${building?.hasBasement\n ? html`\n <md-outlined-text-field\n basement-floor\n type=\"text\"\n numeric\n building\n name=\"basementFloorCount\"\n .value=${building?.basementFloorCount?.toString() || ''}\n @input=${e => this._onInputChange(e, idx)}\n placeholder=\"지하층수\"\n ></md-outlined-text-field>\n `\n : ''}\n </div>\n </div>\n `\n )}\n </div>\n </div>\n\n <div project>\n <h3>프로젝트 현황</h3>\n <div row separate-container>\n <div>\n <span>전체 진행현황</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"totalProgress\"\n .value=${this.project.totalProgress?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n <div>\n <span>검측/통과비율</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"inspPassRate\"\n .value=${this.project.inspPassRate?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n <div row separate-container>\n <div>\n <span>주간 진행현황</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"weeklyProgress\"\n .value=${this.project.weeklyProgress?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n <div>\n <span>로봇작업진행율</span>\n <span>\n <md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"robotProgressRate\"\n .value=${this.project.robotProgressRate?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n <div row separate-container>\n <div>\n <span>KPI</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"kpi\"\n .value=${this.project.kpi?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n <div>\n <span>구조안전도</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"structuralSafetyRate\"\n .value=${this.project.structuralSafetyRate?.toString() || ''}\n @input=${this._onInputChange}\n suffix-text=\"%\"\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n\n <div row separate-container>\n <div>\n <span>로봇 작업 대수</span>\n <span\n ><md-outlined-text-field\n type=\"text\"\n numeric\n project\n name=\"robotCount\"\n .value=${this.project.robotCount?.toString() || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\n </div>\n </div>\n </div>\n\n <div>\n <h3>공지사항</h3>\n <div>\n <span></span>\n <span>\n <md-outlined-text-field\n type=\"textarea\"\n name=\"notice\"\n building-complex\n .value=${this.project?.buildingComplex?.notice || ''}\n @input=${this._onInputChange}\n ></md-outlined-text-field>\n </span>\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(this.projectId)\n }\n }\n\n async initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!, $filters: [Filter!]) {\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 robotCount\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 }\n constructionType\n constructionCost\n etc\n notice\n householdCount\n buildingCount\n overallConstructorEmails\n taskConstructorEmails\n overallSupervisoryEmails\n taskSupervisoryEmails\n buildings {\n id\n name\n floorCount\n hasBasement\n basementFloorCount\n }\n }\n }\n\n employees(filters: $filters) {\n items {\n id\n name\n jobResponsibility\n active\n user {\n id\n name\n email\n }\n }\n }\n }\n `,\n variables: {\n id: projectId,\n filters: [\n {\n name: 'active',\n operator: 'eq',\n value: true\n },\n {\n name: 'userId',\n operator: 'is_not_null',\n value: ''\n }\n ]\n }\n })\n\n this.project = response.data?.project\n\n const items = response.data?.employees?.items || []\n this.overallConstructorList = this._filterUserByPermission(items, 'OVERALL_CONSTRUCTOR')\n this.taskConstructorList = this._filterUserByPermission(items, 'TASK_CONSTRUCTOR')\n this.overallSupervisoryList = this._filterUserByPermission(items, 'OVERALL_SUPERVISORY')\n this.taskSupervisoryList = this._filterUserByPermission(items, 'TASK_SUPERVISORY')\n }\n\n private _filterUserByPermission(userList, permission: string) {\n return userList\n .filter(v => v.jobResponsibility == permission || v.jobResponsibility == 'ADMIN')\n .map(v => ({ name: v.name, value: v.user.email }))\n }\n\n private async _saveProject() {\n // 첨부 파일 필드 제거 (첨부 파일은 {filename}Upload 로 전송)\n delete this.project.mainPhoto\n delete this.project.buildingComplex.drawing\n\n const response = await client.mutate({\n mutation: gql`\n mutation UpdateProject($project: ProjectPatch!) {\n updateProject(project: $project) {\n id\n }\n }\n `,\n variables: {\n project: this.project\n },\n context: {\n hasUpload: true\n }\n })\n\n if (!response.errors) {\n notify({ message: '저장에 성공하였습니다.' })\n }\n }\n\n // 동 적용 버튼을 누르면 입력한 수 만큼 해당 단지에 동 데이터 생성\n private _setBuilding() {\n const buildingCount: number = this.project?.buildingComplex?.buildingCount || 0\n const buildingInitData = { name: undefined, floorCount: undefined }\n\n // 빌딩 데이터가 없으면 빈 배열 넣어줌\n if (!this.project?.buildingComplex?.buildings?.length) {\n this.project.buildingComplex.buildings = []\n }\n\n if (this.project.buildingComplex.buildings.length >= buildingCount) {\n // 동 수가 더 작게 들어오면 기존 배열을 필요한 크기만큼 잘라내기\n this.project.buildingComplex.buildings = [...this.project.buildingComplex.buildings!.slice(0, buildingCount)]\n } else {\n // 동수가 더 크게 들어오면 기존 배열 + 빈 값을 채움\n const additionalCount = buildingCount - this.project.buildingComplex.buildings.length\n const additionalBuildings = Array.from({ length: additionalCount }, () => ({ ...buildingInitData }))\n this.project.buildingComplex.buildings = [...this.project.buildingComplex.buildings, ...additionalBuildings]\n }\n\n // 리렌더링\n this.project = { ...this.project }\n }\n\n // Input 요소의 값이 변경될 때 호출되는 콜백 함수\n private _onInputChange(event: InputEvent, idx: number) {\n const target = event.target as HTMLInputElement\n let inputVal: any = target.value\n\n // 숫자 타입은 다른 문자 입력 제거\n if (target.hasAttribute('numeric')) {\n inputVal = Number(inputVal.replace(/[^\\d.]/g, ''))\n }\n\n if (target.hasAttribute('project')) {\n this.project[target.name] = inputVal\n } else if (target.hasAttribute('building-complex')) {\n this.project.buildingComplex![target.name] = inputVal\n } else if (target.hasAttribute('building')) {\n this.project.buildingComplex.buildings![idx][target.name] = inputVal\n }\n }\n\n // 이미지 업로드\n async onCreateAttachment(e: CustomEvent) {\n const target = e.target as HTMLInputElement\n const file = (target.name === 'mainPhoto' ? e.detail : e.detail[0]) || null\n\n if (target.name === 'mainPhoto') {\n this.project.mainPhotoUpload = file\n } else {\n this.project.buildingComplex.drawingUpload = file\n }\n }\n\n private _handleSelectionChange(e) {\n const name = e.target.getAttribute('name')\n const selectedValues = e.detail.selectedValues\n\n this.project.buildingComplex[name] = selectedValues\n }\n\n private _toggleBasement(idx: number) {\n const building = this.project.buildingComplex.buildings![idx]\n building.hasBasement = !building.hasBasement\n\n // 층 수가 0이거나 체크 해제시 지하층수 초기화 (플레이스 홀더 나오게 하기 위함)\n if (building.basementFloorCount == 0 || !building.hasBasement) {\n building.basementFloorCount = undefined\n }\n\n this.project.buildingComplex.buildings![idx]['hasBasement'] = building.hasBasement\n this.requestUpdate()\n }\n}\n"]}